1008 if (
Node->isMachineOpcode()) {
1010 Node->setNodeId(-1);
1016 unsigned Opcode =
Node->getOpcode();
1017 MVT XLenVT = Subtarget->getXLenVT();
1019 MVT VT =
Node->getSimpleValueType(0);
1021 bool HasBitTest = Subtarget->hasBEXTILike();
1025 assert((VT == Subtarget->getXLenVT() || VT == MVT::i32) &&
"Unexpected VT");
1027 if (ConstNode->isZero()) {
1029 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1033 int64_t Imm = ConstNode->getSExtValue();
1054 Imm = ((
uint64_t)Imm << 32) | (Imm & 0xFFFFFFFF);
1063 bool Is64Bit = Subtarget->is64Bit();
1064 bool HasZdinx = Subtarget->hasStdExtZdinx();
1066 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1071 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1072 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1074 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1085 assert(Subtarget->hasStdExtZfbfmin());
1086 Opc = RISCV::FMV_H_X;
1089 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1092 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1097 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1101 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1106 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1108 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT, Imm).getNode();
1109 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1111 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT, Imm).getNode();
1112 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1113 Res =
CurDAG->getMachineNode(
1121 Opc = RISCV::FSGNJN_D;
1123 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1131 case RISCVISD::BuildGPRPair:
1132 case RISCVISD::BuildPairF64: {
1133 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1136 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::BuildGPRPair) &&
1137 "BuildPairF64 only handled here on rv32i_zdinx");
1140 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
1141 Node->getOperand(0),
1142 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
1143 Node->getOperand(1),
1144 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1150 case RISCVISD::SplitGPRPair:
1151 case RISCVISD::SplitF64: {
1152 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1153 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::SplitGPRPair) &&
1154 "SplitF64 only handled here on rv32i_zdinx");
1158 Node->getValueType(0),
1159 Node->getOperand(0));
1165 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1173 assert(Opcode != RISCVISD::SplitGPRPair &&
1174 "SplitGPRPair should already be handled");
1176 if (!Subtarget->hasStdExtZfa())
1178 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1179 "Unexpected subtarget");
1184 Node->getOperand(0));
1189 Node->getOperand(0));
1204 unsigned ShAmt = N1C->getZExtValue();
1208 unsigned XLen = Subtarget->getXLen();
1211 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1216 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1219 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1223 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1224 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1235 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1238 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1252 unsigned ShAmt = N1C->getZExtValue();
1258 unsigned XLen = Subtarget->getXLen();
1261 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1264 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1267 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1284 if (ShAmt >= TrailingOnes)
1287 if (TrailingOnes == 32) {
1289 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1300 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1302 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1308 const unsigned Msb = TrailingOnes - 1;
1309 const unsigned Lsb = ShAmt;
1313 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1316 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1319 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1344 unsigned ShAmt = N1C->getZExtValue();
1348 if (ExtSize >= 32 || ShAmt >= ExtSize)
1350 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1353 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1356 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1383 unsigned C2 =
C->getZExtValue();
1384 unsigned XLen = Subtarget->getXLen();
1385 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1393 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1405 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1415 if (C2 + 32 == Leading) {
1417 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1427 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1431 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1432 CurDAG->getTargetConstant(31,
DL, VT));
1434 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1435 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1448 const unsigned Lsb = C2;
1454 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1458 Skip |= HasBitTest && Leading == XLen - 1;
1459 if (OneUseOrZExtW && !Skip) {
1461 RISCV::SLLI,
DL, VT,
X,
1462 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1465 CurDAG->getTargetConstant(Leading,
DL, VT));
1477 if (C2 + Leading < XLen &&
1480 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1482 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1483 CurDAG->getTargetConstant(C2,
DL, VT));
1496 const unsigned Msb = XLen - Leading - 1;
1497 const unsigned Lsb = C2;
1502 if (OneUseOrZExtW && !IsCANDI) {
1504 RISCV::SLLI,
DL, VT,
X,
1505 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1508 CurDAG->getTargetConstant(Leading,
DL, VT));
1520 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1522 unsigned SrliOpc = RISCV::SRLI;
1526 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1527 SrliOpc = RISCV::SRLIW;
1528 X =
X.getOperand(0);
1532 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1535 CurDAG->getTargetConstant(Trailing,
DL, VT));
1540 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1541 OneUseOrZExtW && !IsCANDI) {
1543 RISCV::SRLIW,
DL, VT,
X,
1544 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1547 CurDAG->getTargetConstant(Trailing,
DL, VT));
1552 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1553 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1555 RISCV::SRLI,
DL, VT,
X,
1556 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1558 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1559 CurDAG->getTargetConstant(Trailing,
DL, VT));
1570 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1572 RISCV::SRLI,
DL, VT,
X,
1573 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1576 CurDAG->getTargetConstant(Trailing,
DL, VT));
1581 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1583 RISCV::SRLIW,
DL, VT,
X,
1584 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1587 CurDAG->getTargetConstant(Trailing,
DL, VT));
1593 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1594 Subtarget->hasStdExtZba()) {
1596 RISCV::SRLI,
DL, VT,
X,
1597 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1599 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1600 CurDAG->getTargetConstant(Trailing,
DL, VT));
1607 const uint64_t C1 = N1C->getZExtValue();
1612 unsigned XLen = Subtarget->getXLen();
1613 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1618 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1621 X.getConstantOperandVal(1) == 32;
1628 RISCV::SRAI,
DL, VT,
X,
1629 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1632 CurDAG->getTargetConstant(Leading,
DL, VT));
1644 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1647 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1650 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1653 CurDAG->getTargetConstant(Trailing,
DL, VT));
1666 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1667 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1687 if (!N1C || !N1C->hasOneUse())
1708 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1710 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1715 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1717 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1724 unsigned XLen = Subtarget->getXLen();
1730 unsigned ConstantShift = XLen - LeadingZeros;
1734 uint64_t ShiftedC1 = C1 << ConstantShift;
1743 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1753 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1763 bool Simm12 =
false;
1764 bool SignExtend = Load->getExtensionType() ==
ISD::SEXTLOAD;
1767 int ConstantVal = ConstantOffset->getSExtValue();
1774 unsigned Opcode = 0;
1775 switch (Load->getMemoryVT().getSimpleVT().SimpleTy) {
1777 if (Simm12 && SignExtend)
1778 Opcode = RISCV::CV_LB_ri_inc;
1779 else if (Simm12 && !SignExtend)
1780 Opcode = RISCV::CV_LBU_ri_inc;
1781 else if (!Simm12 && SignExtend)
1782 Opcode = RISCV::CV_LB_rr_inc;
1784 Opcode = RISCV::CV_LBU_rr_inc;
1787 if (Simm12 && SignExtend)
1788 Opcode = RISCV::CV_LH_ri_inc;
1789 else if (Simm12 && !SignExtend)
1790 Opcode = RISCV::CV_LHU_ri_inc;
1791 else if (!Simm12 && SignExtend)
1792 Opcode = RISCV::CV_LH_rr_inc;
1794 Opcode = RISCV::CV_LHU_rr_inc;
1798 Opcode = RISCV::CV_LW_ri_inc;
1800 Opcode = RISCV::CV_LW_rr_inc;
1815 case RISCVISD::LD_RV32: {
1816 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
1825 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
1837 case RISCVISD::SD_RV32: {
1849 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
1852 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
Lo,
1853 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
Hi,
1854 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1856 RegPair =
SDValue(
CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE,
DL,
1869 unsigned IntNo =
Node->getConstantOperandVal(0);
1874 case Intrinsic::riscv_vmsgeu:
1875 case Intrinsic::riscv_vmsge: {
1878 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
1879 bool IsCmpConstant =
false;
1880 bool IsCmpMinimum =
false;
1888 IsCmpConstant =
true;
1889 CVal =
C->getSExtValue();
1890 if (CVal >= -15 && CVal <= 16) {
1891 if (!IsUnsigned || CVal != 0)
1893 IsCmpMinimum =
true;
1897 IsCmpMinimum =
true;
1900 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
1904#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
1905 case RISCVVType::lmulenum: \
1906 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
1907 : RISCV::PseudoVMSLT_VX_##suffix; \
1908 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
1909 : RISCV::PseudoVMSGT_VX_##suffix; \
1918#undef CASE_VMSLT_OPCODES
1924#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
1925 case RISCVVType::lmulenum: \
1926 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
1927 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
1936#undef CASE_VMNAND_VMSET_OPCODES
1947 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
1951 if (IsCmpConstant) {
1956 {Src1, Imm, VL, SEW}));
1963 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
1966 {Cmp, Cmp, VL, MaskSEW}));
1969 case Intrinsic::riscv_vmsgeu_mask:
1970 case Intrinsic::riscv_vmsge_mask: {
1973 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
1974 bool IsCmpConstant =
false;
1975 bool IsCmpMinimum =
false;
1983 IsCmpConstant =
true;
1984 CVal =
C->getSExtValue();
1985 if (CVal >= -15 && CVal <= 16) {
1986 if (!IsUnsigned || CVal != 0)
1988 IsCmpMinimum =
true;
1992 IsCmpMinimum =
true;
1995 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
1996 VMOROpcode, VMSGTMaskOpcode;
2000#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2001 case RISCVVType::lmulenum: \
2002 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2003 : RISCV::PseudoVMSLT_VX_##suffix; \
2004 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2005 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2006 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2007 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2016#undef CASE_VMSLT_OPCODES
2022#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2023 case RISCVVType::lmulenum: \
2024 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2025 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2026 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2035#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2049 if (Mask == MaskedOff) {
2054 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2055 {Mask, MaskedOff, VL, MaskSEW}));
2062 if (Mask == MaskedOff) {
2064 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2067 {Mask, Cmp, VL, MaskSEW}));
2074 if (IsCmpConstant) {
2079 VMSGTMaskOpcode,
DL, VT,
2080 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2090 {MaskedOff, Src1, Src2, Mask,
2091 VL, SEW, PolicyOp}),
2095 {Cmp, Mask, VL, MaskSEW}));
2098 case Intrinsic::riscv_vsetvli:
2099 case Intrinsic::riscv_vsetvlimax:
2101 case Intrinsic::riscv_sf_vsettnt:
2102 case Intrinsic::riscv_sf_vsettm:
2103 case Intrinsic::riscv_sf_vsettk:
2109 unsigned IntNo =
Node->getConstantOperandVal(1);
2114 case Intrinsic::riscv_vlseg2:
2115 case Intrinsic::riscv_vlseg3:
2116 case Intrinsic::riscv_vlseg4:
2117 case Intrinsic::riscv_vlseg5:
2118 case Intrinsic::riscv_vlseg6:
2119 case Intrinsic::riscv_vlseg7:
2120 case Intrinsic::riscv_vlseg8: {
2125 case Intrinsic::riscv_vlseg2_mask:
2126 case Intrinsic::riscv_vlseg3_mask:
2127 case Intrinsic::riscv_vlseg4_mask:
2128 case Intrinsic::riscv_vlseg5_mask:
2129 case Intrinsic::riscv_vlseg6_mask:
2130 case Intrinsic::riscv_vlseg7_mask:
2131 case Intrinsic::riscv_vlseg8_mask: {
2136 case Intrinsic::riscv_vlsseg2:
2137 case Intrinsic::riscv_vlsseg3:
2138 case Intrinsic::riscv_vlsseg4:
2139 case Intrinsic::riscv_vlsseg5:
2140 case Intrinsic::riscv_vlsseg6:
2141 case Intrinsic::riscv_vlsseg7:
2142 case Intrinsic::riscv_vlsseg8: {
2147 case Intrinsic::riscv_vlsseg2_mask:
2148 case Intrinsic::riscv_vlsseg3_mask:
2149 case Intrinsic::riscv_vlsseg4_mask:
2150 case Intrinsic::riscv_vlsseg5_mask:
2151 case Intrinsic::riscv_vlsseg6_mask:
2152 case Intrinsic::riscv_vlsseg7_mask:
2153 case Intrinsic::riscv_vlsseg8_mask: {
2158 case Intrinsic::riscv_vloxseg2:
2159 case Intrinsic::riscv_vloxseg3:
2160 case Intrinsic::riscv_vloxseg4:
2161 case Intrinsic::riscv_vloxseg5:
2162 case Intrinsic::riscv_vloxseg6:
2163 case Intrinsic::riscv_vloxseg7:
2164 case Intrinsic::riscv_vloxseg8:
2168 case Intrinsic::riscv_vluxseg2:
2169 case Intrinsic::riscv_vluxseg3:
2170 case Intrinsic::riscv_vluxseg4:
2171 case Intrinsic::riscv_vluxseg5:
2172 case Intrinsic::riscv_vluxseg6:
2173 case Intrinsic::riscv_vluxseg7:
2174 case Intrinsic::riscv_vluxseg8:
2178 case Intrinsic::riscv_vloxseg2_mask:
2179 case Intrinsic::riscv_vloxseg3_mask:
2180 case Intrinsic::riscv_vloxseg4_mask:
2181 case Intrinsic::riscv_vloxseg5_mask:
2182 case Intrinsic::riscv_vloxseg6_mask:
2183 case Intrinsic::riscv_vloxseg7_mask:
2184 case Intrinsic::riscv_vloxseg8_mask:
2188 case Intrinsic::riscv_vluxseg2_mask:
2189 case Intrinsic::riscv_vluxseg3_mask:
2190 case Intrinsic::riscv_vluxseg4_mask:
2191 case Intrinsic::riscv_vluxseg5_mask:
2192 case Intrinsic::riscv_vluxseg6_mask:
2193 case Intrinsic::riscv_vluxseg7_mask:
2194 case Intrinsic::riscv_vluxseg8_mask:
2198 case Intrinsic::riscv_vlseg8ff:
2199 case Intrinsic::riscv_vlseg7ff:
2200 case Intrinsic::riscv_vlseg6ff:
2201 case Intrinsic::riscv_vlseg5ff:
2202 case Intrinsic::riscv_vlseg4ff:
2203 case Intrinsic::riscv_vlseg3ff:
2204 case Intrinsic::riscv_vlseg2ff: {
2208 case Intrinsic::riscv_vlseg8ff_mask:
2209 case Intrinsic::riscv_vlseg7ff_mask:
2210 case Intrinsic::riscv_vlseg6ff_mask:
2211 case Intrinsic::riscv_vlseg5ff_mask:
2212 case Intrinsic::riscv_vlseg4ff_mask:
2213 case Intrinsic::riscv_vlseg3ff_mask:
2214 case Intrinsic::riscv_vlseg2ff_mask: {
2218 case Intrinsic::riscv_vloxei:
2219 case Intrinsic::riscv_vloxei_mask:
2220 case Intrinsic::riscv_vluxei:
2221 case Intrinsic::riscv_vluxei_mask: {
2222 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2223 IntNo == Intrinsic::riscv_vluxei_mask;
2224 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2225 IntNo == Intrinsic::riscv_vloxei_mask;
2227 MVT VT =
Node->getSimpleValueType(0);
2240 "Element count mismatch");
2245 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2247 "index values when XLEN=32");
2250 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2251 static_cast<unsigned>(IndexLMUL));
2253 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2260 case Intrinsic::riscv_vlm:
2261 case Intrinsic::riscv_vle:
2262 case Intrinsic::riscv_vle_mask:
2263 case Intrinsic::riscv_vlse:
2264 case Intrinsic::riscv_vlse_mask: {
2265 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2266 IntNo == Intrinsic::riscv_vlse_mask;
2268 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2270 MVT VT =
Node->getSimpleValueType(0);
2279 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2282 if (HasPassthruOperand)
2288 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2296 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2297 static_cast<unsigned>(LMUL));
2299 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2306 case Intrinsic::riscv_vleff:
2307 case Intrinsic::riscv_vleff_mask: {
2308 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2310 MVT VT =
Node->getSimpleValueType(0);
2322 RISCV::getVLEPseudo(IsMasked,
false,
true,
2323 Log2SEW,
static_cast<unsigned>(LMUL));
2325 P->Pseudo,
DL,
Node->getVTList(), Operands);
2331 case Intrinsic::riscv_nds_vln:
2332 case Intrinsic::riscv_nds_vln_mask:
2333 case Intrinsic::riscv_nds_vlnu:
2334 case Intrinsic::riscv_nds_vlnu_mask: {
2335 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2336 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2337 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2338 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2340 MVT VT =
Node->getSimpleValueType(0);
2352 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2354 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2357 CurDAG->setNodeMemRefs(Load, {
MemOp->getMemOperand()});
2366 unsigned IntNo =
Node->getConstantOperandVal(1);
2368 case Intrinsic::riscv_vsseg2:
2369 case Intrinsic::riscv_vsseg3:
2370 case Intrinsic::riscv_vsseg4:
2371 case Intrinsic::riscv_vsseg5:
2372 case Intrinsic::riscv_vsseg6:
2373 case Intrinsic::riscv_vsseg7:
2374 case Intrinsic::riscv_vsseg8: {
2379 case Intrinsic::riscv_vsseg2_mask:
2380 case Intrinsic::riscv_vsseg3_mask:
2381 case Intrinsic::riscv_vsseg4_mask:
2382 case Intrinsic::riscv_vsseg5_mask:
2383 case Intrinsic::riscv_vsseg6_mask:
2384 case Intrinsic::riscv_vsseg7_mask:
2385 case Intrinsic::riscv_vsseg8_mask: {
2390 case Intrinsic::riscv_vssseg2:
2391 case Intrinsic::riscv_vssseg3:
2392 case Intrinsic::riscv_vssseg4:
2393 case Intrinsic::riscv_vssseg5:
2394 case Intrinsic::riscv_vssseg6:
2395 case Intrinsic::riscv_vssseg7:
2396 case Intrinsic::riscv_vssseg8: {
2401 case Intrinsic::riscv_vssseg2_mask:
2402 case Intrinsic::riscv_vssseg3_mask:
2403 case Intrinsic::riscv_vssseg4_mask:
2404 case Intrinsic::riscv_vssseg5_mask:
2405 case Intrinsic::riscv_vssseg6_mask:
2406 case Intrinsic::riscv_vssseg7_mask:
2407 case Intrinsic::riscv_vssseg8_mask: {
2412 case Intrinsic::riscv_vsoxseg2:
2413 case Intrinsic::riscv_vsoxseg3:
2414 case Intrinsic::riscv_vsoxseg4:
2415 case Intrinsic::riscv_vsoxseg5:
2416 case Intrinsic::riscv_vsoxseg6:
2417 case Intrinsic::riscv_vsoxseg7:
2418 case Intrinsic::riscv_vsoxseg8:
2422 case Intrinsic::riscv_vsuxseg2:
2423 case Intrinsic::riscv_vsuxseg3:
2424 case Intrinsic::riscv_vsuxseg4:
2425 case Intrinsic::riscv_vsuxseg5:
2426 case Intrinsic::riscv_vsuxseg6:
2427 case Intrinsic::riscv_vsuxseg7:
2428 case Intrinsic::riscv_vsuxseg8:
2432 case Intrinsic::riscv_vsoxseg2_mask:
2433 case Intrinsic::riscv_vsoxseg3_mask:
2434 case Intrinsic::riscv_vsoxseg4_mask:
2435 case Intrinsic::riscv_vsoxseg5_mask:
2436 case Intrinsic::riscv_vsoxseg6_mask:
2437 case Intrinsic::riscv_vsoxseg7_mask:
2438 case Intrinsic::riscv_vsoxseg8_mask:
2442 case Intrinsic::riscv_vsuxseg2_mask:
2443 case Intrinsic::riscv_vsuxseg3_mask:
2444 case Intrinsic::riscv_vsuxseg4_mask:
2445 case Intrinsic::riscv_vsuxseg5_mask:
2446 case Intrinsic::riscv_vsuxseg6_mask:
2447 case Intrinsic::riscv_vsuxseg7_mask:
2448 case Intrinsic::riscv_vsuxseg8_mask:
2452 case Intrinsic::riscv_vsoxei:
2453 case Intrinsic::riscv_vsoxei_mask:
2454 case Intrinsic::riscv_vsuxei:
2455 case Intrinsic::riscv_vsuxei_mask: {
2456 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2457 IntNo == Intrinsic::riscv_vsuxei_mask;
2458 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2459 IntNo == Intrinsic::riscv_vsoxei_mask;
2461 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2474 "Element count mismatch");
2479 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2481 "index values when XLEN=32");
2484 IsMasked, IsOrdered, IndexLog2EEW,
2485 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2487 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2494 case Intrinsic::riscv_vsm:
2495 case Intrinsic::riscv_vse:
2496 case Intrinsic::riscv_vse_mask:
2497 case Intrinsic::riscv_vsse:
2498 case Intrinsic::riscv_vsse_mask: {
2499 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2500 IntNo == Intrinsic::riscv_vsse_mask;
2502 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2504 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2516 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2518 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2524 case Intrinsic::riscv_sf_vc_x_se:
2525 case Intrinsic::riscv_sf_vc_i_se:
2528 case Intrinsic::riscv_sf_vlte8:
2529 case Intrinsic::riscv_sf_vlte16:
2530 case Intrinsic::riscv_sf_vlte32:
2531 case Intrinsic::riscv_sf_vlte64: {
2533 unsigned PseudoInst;
2535 case Intrinsic::riscv_sf_vlte8:
2536 PseudoInst = RISCV::PseudoSF_VLTE8;
2539 case Intrinsic::riscv_sf_vlte16:
2540 PseudoInst = RISCV::PseudoSF_VLTE16;
2543 case Intrinsic::riscv_sf_vlte32:
2544 PseudoInst = RISCV::PseudoSF_VLTE32;
2547 case Intrinsic::riscv_sf_vlte64:
2548 PseudoInst = RISCV::PseudoSF_VLTE64;
2556 Node->getOperand(3),
2557 Node->getOperand(4),
2560 Node->getOperand(0)};
2563 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2565 CurDAG->setNodeMemRefs(TileLoad, {
MemOp->getMemOperand()});
2570 case Intrinsic::riscv_sf_mm_s_s:
2571 case Intrinsic::riscv_sf_mm_s_u:
2572 case Intrinsic::riscv_sf_mm_u_s:
2573 case Intrinsic::riscv_sf_mm_u_u:
2574 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2575 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2576 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2577 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2578 case Intrinsic::riscv_sf_mm_f_f: {
2579 bool HasFRM =
false;
2580 unsigned PseudoInst;
2582 case Intrinsic::riscv_sf_mm_s_s:
2583 PseudoInst = RISCV::PseudoSF_MM_S_S;
2585 case Intrinsic::riscv_sf_mm_s_u:
2586 PseudoInst = RISCV::PseudoSF_MM_S_U;
2588 case Intrinsic::riscv_sf_mm_u_s:
2589 PseudoInst = RISCV::PseudoSF_MM_U_S;
2591 case Intrinsic::riscv_sf_mm_u_u:
2592 PseudoInst = RISCV::PseudoSF_MM_U_U;
2594 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2595 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
2598 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2599 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
2602 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2603 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
2606 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2607 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
2610 case Intrinsic::riscv_sf_mm_f_f:
2611 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
2612 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
2614 PseudoInst = RISCV::PseudoSF_MM_F_F;
2630 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
2639 Operands.append({TmOp, TnOp, TkOp,
2640 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
2644 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2649 case Intrinsic::riscv_sf_vtzero_t: {
2656 auto *NewNode =
CurDAG->getMachineNode(
2657 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
2658 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
2667 case ISD::BITCAST: {
2668 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2677 if (Subtarget->enablePExtCodeGen()) {
2679 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
2680 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
2682 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
2683 SrcVT == MVT::v2i32)) ||
2684 (SrcVT == MVT::i64 &&
2685 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
2686 if (Is32BitCast || Is64BitCast) {
2695 case RISCVISD::TUPLE_INSERT: {
2699 auto Idx =
Node->getConstantOperandVal(2);
2703 MVT SubVecContainerVT = SubVecVT;
2706 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
2708 [[maybe_unused]]
bool ExactlyVecRegSized =
2710 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
2712 .getKnownMinValue()));
2713 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
2715 MVT ContainerVT = VT;
2717 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2719 const auto *
TRI = Subtarget->getRegisterInfo();
2721 std::tie(SubRegIdx, Idx) =
2723 ContainerVT, SubVecContainerVT, Idx,
TRI);
2733 [[maybe_unused]]
bool IsSubVecPartReg =
2737 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
2739 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
2740 "the subvector is smaller than a full-sized register");
2744 if (SubRegIdx == RISCV::NoSubRegister) {
2745 unsigned InRegClassID =
2749 "Unexpected subvector extraction");
2751 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
2757 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
2762 case RISCVISD::TUPLE_EXTRACT: {
2764 auto Idx =
Node->getConstantOperandVal(1);
2765 MVT InVT = V.getSimpleValueType();
2769 MVT SubVecContainerVT = VT;
2773 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2776 InVT =
TLI.getContainerForFixedLengthVector(InVT);
2778 const auto *
TRI = Subtarget->getRegisterInfo();
2780 std::tie(SubRegIdx, Idx) =
2782 InVT, SubVecContainerVT, Idx,
TRI);
2792 if (SubRegIdx == RISCV::NoSubRegister) {
2796 "Unexpected subvector extraction");
2799 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
2804 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
2808 case RISCVISD::VMV_S_X_VL:
2809 case RISCVISD::VFMV_S_F_VL:
2810 case RISCVISD::VMV_V_X_VL:
2811 case RISCVISD::VFMV_V_F_VL: {
2813 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
2814 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
2815 if (!
Node->getOperand(0).isUndef())
2821 if (!Ld || Ld->isIndexed())
2823 EVT MemVT = Ld->getMemoryVT();
2849 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
2853 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
2859 Operands.
append({VL, SEW, PolicyOp, Ld->getChain()});
2863 false, IsStrided,
false,
2864 Log2SEW,
static_cast<unsigned>(LMUL));
2866 CurDAG->getMachineNode(
P->Pseudo,
DL, {VT, MVT::Other}, Operands);
2870 CurDAG->setNodeMemRefs(Load, {Ld->getMemOperand()});
2876 unsigned Locality =
Node->getConstantOperandVal(3);
2884 int NontemporalLevel = 0;
2887 NontemporalLevel = 3;
2890 NontemporalLevel = 1;
2893 NontemporalLevel = 0;
2899 if (NontemporalLevel & 0b1)
2901 if (NontemporalLevel & 0b10)