1100 if (
Node->isMachineOpcode()) {
1102 Node->setNodeId(-1);
1108 unsigned Opcode =
Node->getOpcode();
1109 MVT XLenVT = Subtarget->getXLenVT();
1111 MVT VT =
Node->getSimpleValueType(0);
1113 bool HasBitTest = Subtarget->hasBEXTILike();
1117 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT");
1119 if (ConstNode->isZero()) {
1121 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1125 int64_t Imm = ConstNode->getSExtValue();
1140 if (Subtarget->hasStdExtP() && !
isInt<12>(Imm) &&
1161 Imm = ((
uint64_t)Imm << 32) | (Imm & 0xFFFFFFFF);
1171 bool Is64Bit = Subtarget->is64Bit();
1172 bool HasZdinx = Subtarget->hasStdExtZdinx();
1174 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1179 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1180 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1182 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1193 assert(Subtarget->hasStdExtZfbfmin());
1194 Opc = RISCV::FMV_H_X;
1197 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1200 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1205 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1209 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1214 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1216 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT, Imm).getNode();
1217 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1219 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT, Imm).getNode();
1220 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1221 Res =
CurDAG->getMachineNode(
1229 Opc = RISCV::FSGNJN_D;
1231 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1239 case RISCVISD::BuildGPRPair:
1240 case RISCVISD::BuildPairF64:
1241 case RISCVISD::BuildPairGPRVec: {
1242 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1245 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::BuildPairF64) &&
1246 "BuildPairF64 only handled here on rv32i_zdinx");
1253 case RISCVISD::SplitGPRPair:
1254 case RISCVISD::SplitF64:
1255 case RISCVISD::SplitGPRVec: {
1256 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1257 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::SplitF64) &&
1258 "SplitF64 only handled here on rv32i_zdinx");
1262 Node->getValueType(0),
1263 Node->getOperand(0));
1269 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1277 if (!Subtarget->hasStdExtZfa())
1279 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1280 "Unexpected subtarget");
1285 Node->getOperand(0));
1290 Node->getOperand(0));
1305 unsigned ShAmt = N1C->getZExtValue();
1309 unsigned XLen = Subtarget->getXLen();
1312 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1317 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1320 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1324 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1325 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1336 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1339 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1353 unsigned ShAmt = N1C->getZExtValue();
1359 unsigned XLen = Subtarget->getXLen();
1362 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1365 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1368 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1385 if (ShAmt >= TrailingOnes)
1388 if (TrailingOnes == 32) {
1390 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1401 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1403 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1409 const unsigned Msb = TrailingOnes - 1;
1410 const unsigned Lsb = ShAmt;
1414 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1417 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1420 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1445 unsigned ShAmt = N1C->getZExtValue();
1449 if (ExtSize >= 32 || ShAmt >= ExtSize)
1451 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1454 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1457 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1476 unsigned ShAmt = ShAmtC->getZExtValue();
1477 unsigned XLen = Subtarget->getXLen();
1480 if (ExtSize >= 32 || ShAmt >= XLen - ExtSize)
1483 unsigned LShAmt = XLen - ExtSize - ShAmt;
1486 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1489 CurDAG->getTargetConstant(XLen - ExtSize,
DL, VT));
1516 unsigned C2 =
C->getZExtValue();
1517 unsigned XLen = Subtarget->getXLen();
1518 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1526 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1538 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1548 if (C2 + 32 == Leading) {
1550 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1560 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1564 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1565 CurDAG->getTargetConstant(31,
DL, VT));
1567 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1568 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1581 const unsigned Lsb = C2;
1587 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1591 Skip |= HasBitTest && Leading == XLen - 1;
1592 if (OneUseOrZExtW && !Skip) {
1594 RISCV::SLLI,
DL, VT,
X,
1595 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1598 CurDAG->getTargetConstant(Leading,
DL, VT));
1610 if (C2 + Leading < XLen &&
1613 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1615 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1616 CurDAG->getTargetConstant(C2,
DL, VT));
1629 const unsigned Msb = XLen - Leading - 1;
1630 const unsigned Lsb = C2;
1634 if (OneUseOrZExtW && !IsCANDI) {
1636 if (Subtarget->hasStdExtZbkb() && C1 == 0xff00 && C2 == 8) {
1638 RISCV::PACKH,
DL, VT,
1639 CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT()),
X);
1645 RISCV::SLLI,
DL, VT,
X,
1646 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1649 CurDAG->getTargetConstant(Leading,
DL, VT));
1661 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1663 unsigned SrliOpc = RISCV::SRLI;
1667 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1668 SrliOpc = RISCV::SRLIW;
1669 X =
X.getOperand(0);
1673 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1676 CurDAG->getTargetConstant(Trailing,
DL, VT));
1681 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1682 OneUseOrZExtW && !IsCANDI) {
1684 RISCV::SRLIW,
DL, VT,
X,
1685 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1688 CurDAG->getTargetConstant(Trailing,
DL, VT));
1693 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1694 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1696 RISCV::SRLI,
DL, VT,
X,
1697 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1699 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1700 CurDAG->getTargetConstant(Trailing,
DL, VT));
1711 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1713 RISCV::SRLI,
DL, VT,
X,
1714 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1717 CurDAG->getTargetConstant(Trailing,
DL, VT));
1722 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1724 RISCV::SRLIW,
DL, VT,
X,
1725 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1728 CurDAG->getTargetConstant(Trailing,
DL, VT));
1734 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1735 Subtarget->hasStdExtZba()) {
1737 RISCV::SRLI,
DL, VT,
X,
1738 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1740 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1741 CurDAG->getTargetConstant(Trailing,
DL, VT));
1748 const uint64_t C1 = N1C->getZExtValue();
1753 unsigned XLen = Subtarget->getXLen();
1754 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1759 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1762 X.getConstantOperandVal(1) == 32;
1769 RISCV::SRAI,
DL, VT,
X,
1770 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1773 CurDAG->getTargetConstant(Leading,
DL, VT));
1785 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1788 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1791 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1794 CurDAG->getTargetConstant(Trailing,
DL, VT));
1807 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1808 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1828 if (!N1C || !N1C->hasOneUse())
1849 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1851 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1856 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1858 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1865 unsigned XLen = Subtarget->getXLen();
1871 unsigned ConstantShift = XLen - LeadingZeros;
1875 uint64_t ShiftedC1 = C1 << ConstantShift;
1884 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1892 case RISCVISD::WMULSU:
1893 case RISCVISD::WADDU:
1894 case RISCVISD::WSUBU: {
1895 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1896 "Unexpected opcode");
1899 switch (
Node->getOpcode()) {
1908 case RISCVISD::WMULSU:
1909 Opc = RISCV::WMULSU;
1911 case RISCVISD::WADDU:
1914 case RISCVISD::WSUBU:
1920 Opc,
DL, MVT::Untyped,
Node->getOperand(0),
Node->getOperand(1));
1928 case RISCVISD::WSLL:
1929 case RISCVISD::WSLA: {
1931 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1932 "Unexpected opcode");
1934 bool IsSigned =
Node->getOpcode() == RISCVISD::WSLA;
1941 if (ShAmtC && ShAmtC->getZExtValue() < 64) {
1942 Opc = IsSigned ? RISCV::WSLAI : RISCV::WSLLI;
1943 ShAmt =
CurDAG->getTargetConstant(ShAmtC->getZExtValue(),
DL, XLenVT);
1945 Opc = IsSigned ? RISCV::WSLA : RISCV::WSLL;
1949 Node->getOperand(0), ShAmt);
1961 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1971 bool Simm12 =
false;
1972 bool SignExtend = Load->getExtensionType() ==
ISD::SEXTLOAD;
1975 int ConstantVal = ConstantOffset->getSExtValue();
1982 unsigned Opcode = 0;
1983 switch (Load->getMemoryVT().getSimpleVT().SimpleTy) {
1985 if (Simm12 && SignExtend)
1986 Opcode = RISCV::CV_LB_ri_inc;
1987 else if (Simm12 && !SignExtend)
1988 Opcode = RISCV::CV_LBU_ri_inc;
1989 else if (!Simm12 && SignExtend)
1990 Opcode = RISCV::CV_LB_rr_inc;
1992 Opcode = RISCV::CV_LBU_rr_inc;
1995 if (Simm12 && SignExtend)
1996 Opcode = RISCV::CV_LH_ri_inc;
1997 else if (Simm12 && !SignExtend)
1998 Opcode = RISCV::CV_LHU_ri_inc;
1999 else if (!Simm12 && SignExtend)
2000 Opcode = RISCV::CV_LH_rr_inc;
2002 Opcode = RISCV::CV_LHU_rr_inc;
2006 Opcode = RISCV::CV_LW_ri_inc;
2008 Opcode = RISCV::CV_LW_rr_inc;
2023 case RISCVISD::LD_RV32: {
2024 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
2033 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
2042 case RISCVISD::SD_RV32: {
2054 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2066 case RISCVISD::ADDD:
2074 case RISCVISD::SUBD:
2075 case RISCVISD::PPAIRE_DB:
2076 case RISCVISD::WADDAU:
2077 case RISCVISD::WSUBAU: {
2078 assert(!Subtarget->is64Bit() &&
"Unexpected opcode");
2080 (
Node->getOpcode() != RISCVISD::PPAIRE_DB || Subtarget->hasStdExtP()) &&
2081 "Unexpected opcode");
2088 Op0 =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2097 if (Opcode == RISCVISD::WADDAU || Opcode == RISCVISD::WSUBAU) {
2100 unsigned Opc = Opcode == RISCVISD::WADDAU ? RISCV::WADDAU : RISCV::WSUBAU;
2101 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1Lo, Op1Hi);
2109 case RISCVISD::ADDD:
2112 case RISCVISD::SUBD:
2115 case RISCVISD::PPAIRE_DB:
2116 Opc = RISCV::PPAIRE_DB;
2119 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1);
2129 unsigned IntNo =
Node->getConstantOperandVal(0);
2134 case Intrinsic::riscv_vmsgeu:
2135 case Intrinsic::riscv_vmsge: {
2138 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
2139 bool IsCmpConstant =
false;
2140 bool IsCmpMinimum =
false;
2148 IsCmpConstant =
true;
2149 CVal =
C->getSExtValue();
2150 if (CVal >= -15 && CVal <= 16) {
2151 if (!IsUnsigned || CVal != 0)
2153 IsCmpMinimum =
true;
2157 IsCmpMinimum =
true;
2160 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
2164#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2165 case RISCVVType::lmulenum: \
2166 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2167 : RISCV::PseudoVMSLT_VX_##suffix; \
2168 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
2169 : RISCV::PseudoVMSGT_VX_##suffix; \
2178#undef CASE_VMSLT_OPCODES
2184#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
2185 case RISCVVType::lmulenum: \
2186 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
2187 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
2196#undef CASE_VMNAND_VMSET_OPCODES
2207 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
2211 if (IsCmpConstant) {
2216 {Src1, Imm, VL, SEW}));
2223 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2226 {Cmp, Cmp, VL, MaskSEW}));
2229 case Intrinsic::riscv_vmsgeu_mask:
2230 case Intrinsic::riscv_vmsge_mask: {
2233 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2234 bool IsCmpConstant =
false;
2235 bool IsCmpMinimum =
false;
2243 IsCmpConstant =
true;
2244 CVal =
C->getSExtValue();
2245 if (CVal >= -15 && CVal <= 16) {
2246 if (!IsUnsigned || CVal != 0)
2248 IsCmpMinimum =
true;
2252 IsCmpMinimum =
true;
2255 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2256 VMOROpcode, VMSGTMaskOpcode;
2260#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2261 case RISCVVType::lmulenum: \
2262 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2263 : RISCV::PseudoVMSLT_VX_##suffix; \
2264 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2265 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2266 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2267 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2276#undef CASE_VMSLT_OPCODES
2282#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2283 case RISCVVType::lmulenum: \
2284 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2285 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2286 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2295#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2309 if (Mask == MaskedOff) {
2314 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2315 {Mask, MaskedOff, VL, MaskSEW}));
2322 if (Mask == MaskedOff) {
2324 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2327 {Mask, Cmp, VL, MaskSEW}));
2334 if (IsCmpConstant) {
2339 VMSGTMaskOpcode,
DL, VT,
2340 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2350 {MaskedOff, Src1, Src2, Mask,
2351 VL, SEW, PolicyOp}),
2355 {Cmp, Mask, VL, MaskSEW}));
2358 case Intrinsic::riscv_vsetvli:
2359 case Intrinsic::riscv_vsetvlimax:
2361 case Intrinsic::riscv_sf_vsettnt:
2362 case Intrinsic::riscv_sf_vsettm:
2363 case Intrinsic::riscv_sf_vsettk:
2369 unsigned IntNo =
Node->getConstantOperandVal(1);
2374 case Intrinsic::riscv_vlseg2:
2375 case Intrinsic::riscv_vlseg3:
2376 case Intrinsic::riscv_vlseg4:
2377 case Intrinsic::riscv_vlseg5:
2378 case Intrinsic::riscv_vlseg6:
2379 case Intrinsic::riscv_vlseg7:
2380 case Intrinsic::riscv_vlseg8: {
2385 case Intrinsic::riscv_vlseg2_mask:
2386 case Intrinsic::riscv_vlseg3_mask:
2387 case Intrinsic::riscv_vlseg4_mask:
2388 case Intrinsic::riscv_vlseg5_mask:
2389 case Intrinsic::riscv_vlseg6_mask:
2390 case Intrinsic::riscv_vlseg7_mask:
2391 case Intrinsic::riscv_vlseg8_mask: {
2396 case Intrinsic::riscv_vlsseg2:
2397 case Intrinsic::riscv_vlsseg3:
2398 case Intrinsic::riscv_vlsseg4:
2399 case Intrinsic::riscv_vlsseg5:
2400 case Intrinsic::riscv_vlsseg6:
2401 case Intrinsic::riscv_vlsseg7:
2402 case Intrinsic::riscv_vlsseg8: {
2407 case Intrinsic::riscv_vlsseg2_mask:
2408 case Intrinsic::riscv_vlsseg3_mask:
2409 case Intrinsic::riscv_vlsseg4_mask:
2410 case Intrinsic::riscv_vlsseg5_mask:
2411 case Intrinsic::riscv_vlsseg6_mask:
2412 case Intrinsic::riscv_vlsseg7_mask:
2413 case Intrinsic::riscv_vlsseg8_mask: {
2418 case Intrinsic::riscv_vloxseg2:
2419 case Intrinsic::riscv_vloxseg3:
2420 case Intrinsic::riscv_vloxseg4:
2421 case Intrinsic::riscv_vloxseg5:
2422 case Intrinsic::riscv_vloxseg6:
2423 case Intrinsic::riscv_vloxseg7:
2424 case Intrinsic::riscv_vloxseg8:
2428 case Intrinsic::riscv_vluxseg2:
2429 case Intrinsic::riscv_vluxseg3:
2430 case Intrinsic::riscv_vluxseg4:
2431 case Intrinsic::riscv_vluxseg5:
2432 case Intrinsic::riscv_vluxseg6:
2433 case Intrinsic::riscv_vluxseg7:
2434 case Intrinsic::riscv_vluxseg8:
2438 case Intrinsic::riscv_vloxseg2_mask:
2439 case Intrinsic::riscv_vloxseg3_mask:
2440 case Intrinsic::riscv_vloxseg4_mask:
2441 case Intrinsic::riscv_vloxseg5_mask:
2442 case Intrinsic::riscv_vloxseg6_mask:
2443 case Intrinsic::riscv_vloxseg7_mask:
2444 case Intrinsic::riscv_vloxseg8_mask:
2448 case Intrinsic::riscv_vluxseg2_mask:
2449 case Intrinsic::riscv_vluxseg3_mask:
2450 case Intrinsic::riscv_vluxseg4_mask:
2451 case Intrinsic::riscv_vluxseg5_mask:
2452 case Intrinsic::riscv_vluxseg6_mask:
2453 case Intrinsic::riscv_vluxseg7_mask:
2454 case Intrinsic::riscv_vluxseg8_mask:
2458 case Intrinsic::riscv_vlseg8ff:
2459 case Intrinsic::riscv_vlseg7ff:
2460 case Intrinsic::riscv_vlseg6ff:
2461 case Intrinsic::riscv_vlseg5ff:
2462 case Intrinsic::riscv_vlseg4ff:
2463 case Intrinsic::riscv_vlseg3ff:
2464 case Intrinsic::riscv_vlseg2ff: {
2468 case Intrinsic::riscv_vlseg8ff_mask:
2469 case Intrinsic::riscv_vlseg7ff_mask:
2470 case Intrinsic::riscv_vlseg6ff_mask:
2471 case Intrinsic::riscv_vlseg5ff_mask:
2472 case Intrinsic::riscv_vlseg4ff_mask:
2473 case Intrinsic::riscv_vlseg3ff_mask:
2474 case Intrinsic::riscv_vlseg2ff_mask: {
2478 case Intrinsic::riscv_vloxei:
2479 case Intrinsic::riscv_vloxei_mask:
2480 case Intrinsic::riscv_vluxei:
2481 case Intrinsic::riscv_vluxei_mask: {
2482 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2483 IntNo == Intrinsic::riscv_vluxei_mask;
2484 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2485 IntNo == Intrinsic::riscv_vloxei_mask;
2487 MVT VT =
Node->getSimpleValueType(0);
2500 "Element count mismatch");
2505 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2507 "index values when XLEN=32");
2510 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2511 static_cast<unsigned>(IndexLMUL));
2513 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2520 case Intrinsic::riscv_vlm:
2521 case Intrinsic::riscv_vle:
2522 case Intrinsic::riscv_vle_mask:
2523 case Intrinsic::riscv_vlse:
2524 case Intrinsic::riscv_vlse_mask: {
2525 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2526 IntNo == Intrinsic::riscv_vlse_mask;
2528 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2530 MVT VT =
Node->getSimpleValueType(0);
2539 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2542 if (HasPassthruOperand)
2548 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2556 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2557 static_cast<unsigned>(LMUL));
2559 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2566 case Intrinsic::riscv_vleff:
2567 case Intrinsic::riscv_vleff_mask: {
2568 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2570 MVT VT =
Node->getSimpleValueType(0);
2582 RISCV::getVLEPseudo(IsMasked,
false,
true,
2583 Log2SEW,
static_cast<unsigned>(LMUL));
2585 P->Pseudo,
DL,
Node->getVTList(), Operands);
2591 case Intrinsic::riscv_nds_vln:
2592 case Intrinsic::riscv_nds_vln_mask:
2593 case Intrinsic::riscv_nds_vlnu:
2594 case Intrinsic::riscv_nds_vlnu_mask: {
2595 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2596 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2597 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2598 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2600 MVT VT =
Node->getSimpleValueType(0);
2612 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2614 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2617 CurDAG->setNodeMemRefs(Load, {
MemOp->getMemOperand()});
2626 unsigned IntNo =
Node->getConstantOperandVal(1);
2628 case Intrinsic::riscv_vsseg2:
2629 case Intrinsic::riscv_vsseg3:
2630 case Intrinsic::riscv_vsseg4:
2631 case Intrinsic::riscv_vsseg5:
2632 case Intrinsic::riscv_vsseg6:
2633 case Intrinsic::riscv_vsseg7:
2634 case Intrinsic::riscv_vsseg8: {
2639 case Intrinsic::riscv_vsseg2_mask:
2640 case Intrinsic::riscv_vsseg3_mask:
2641 case Intrinsic::riscv_vsseg4_mask:
2642 case Intrinsic::riscv_vsseg5_mask:
2643 case Intrinsic::riscv_vsseg6_mask:
2644 case Intrinsic::riscv_vsseg7_mask:
2645 case Intrinsic::riscv_vsseg8_mask: {
2650 case Intrinsic::riscv_vssseg2:
2651 case Intrinsic::riscv_vssseg3:
2652 case Intrinsic::riscv_vssseg4:
2653 case Intrinsic::riscv_vssseg5:
2654 case Intrinsic::riscv_vssseg6:
2655 case Intrinsic::riscv_vssseg7:
2656 case Intrinsic::riscv_vssseg8: {
2661 case Intrinsic::riscv_vssseg2_mask:
2662 case Intrinsic::riscv_vssseg3_mask:
2663 case Intrinsic::riscv_vssseg4_mask:
2664 case Intrinsic::riscv_vssseg5_mask:
2665 case Intrinsic::riscv_vssseg6_mask:
2666 case Intrinsic::riscv_vssseg7_mask:
2667 case Intrinsic::riscv_vssseg8_mask: {
2672 case Intrinsic::riscv_vsoxseg2:
2673 case Intrinsic::riscv_vsoxseg3:
2674 case Intrinsic::riscv_vsoxseg4:
2675 case Intrinsic::riscv_vsoxseg5:
2676 case Intrinsic::riscv_vsoxseg6:
2677 case Intrinsic::riscv_vsoxseg7:
2678 case Intrinsic::riscv_vsoxseg8:
2682 case Intrinsic::riscv_vsuxseg2:
2683 case Intrinsic::riscv_vsuxseg3:
2684 case Intrinsic::riscv_vsuxseg4:
2685 case Intrinsic::riscv_vsuxseg5:
2686 case Intrinsic::riscv_vsuxseg6:
2687 case Intrinsic::riscv_vsuxseg7:
2688 case Intrinsic::riscv_vsuxseg8:
2692 case Intrinsic::riscv_vsoxseg2_mask:
2693 case Intrinsic::riscv_vsoxseg3_mask:
2694 case Intrinsic::riscv_vsoxseg4_mask:
2695 case Intrinsic::riscv_vsoxseg5_mask:
2696 case Intrinsic::riscv_vsoxseg6_mask:
2697 case Intrinsic::riscv_vsoxseg7_mask:
2698 case Intrinsic::riscv_vsoxseg8_mask:
2702 case Intrinsic::riscv_vsuxseg2_mask:
2703 case Intrinsic::riscv_vsuxseg3_mask:
2704 case Intrinsic::riscv_vsuxseg4_mask:
2705 case Intrinsic::riscv_vsuxseg5_mask:
2706 case Intrinsic::riscv_vsuxseg6_mask:
2707 case Intrinsic::riscv_vsuxseg7_mask:
2708 case Intrinsic::riscv_vsuxseg8_mask:
2712 case Intrinsic::riscv_vsoxei:
2713 case Intrinsic::riscv_vsoxei_mask:
2714 case Intrinsic::riscv_vsuxei:
2715 case Intrinsic::riscv_vsuxei_mask: {
2716 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2717 IntNo == Intrinsic::riscv_vsuxei_mask;
2718 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2719 IntNo == Intrinsic::riscv_vsoxei_mask;
2721 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2734 "Element count mismatch");
2739 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2741 "index values when XLEN=32");
2744 IsMasked, IsOrdered, IndexLog2EEW,
2745 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2747 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2754 case Intrinsic::riscv_vsm:
2755 case Intrinsic::riscv_vse:
2756 case Intrinsic::riscv_vse_mask:
2757 case Intrinsic::riscv_vsse:
2758 case Intrinsic::riscv_vsse_mask: {
2759 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2760 IntNo == Intrinsic::riscv_vsse_mask;
2762 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2764 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2776 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2778 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2784 case Intrinsic::riscv_sf_vc_x_se:
2785 case Intrinsic::riscv_sf_vc_i_se:
2788 case Intrinsic::riscv_sf_vlte8:
2789 case Intrinsic::riscv_sf_vlte16:
2790 case Intrinsic::riscv_sf_vlte32:
2791 case Intrinsic::riscv_sf_vlte64: {
2793 unsigned PseudoInst;
2795 case Intrinsic::riscv_sf_vlte8:
2796 PseudoInst = RISCV::PseudoSF_VLTE8;
2799 case Intrinsic::riscv_sf_vlte16:
2800 PseudoInst = RISCV::PseudoSF_VLTE16;
2803 case Intrinsic::riscv_sf_vlte32:
2804 PseudoInst = RISCV::PseudoSF_VLTE32;
2807 case Intrinsic::riscv_sf_vlte64:
2808 PseudoInst = RISCV::PseudoSF_VLTE64;
2816 Node->getOperand(3),
2817 Node->getOperand(4),
2820 Node->getOperand(0)};
2823 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2824 CurDAG->setNodeMemRefs(TileLoad,
2830 case Intrinsic::riscv_sf_mm_s_s:
2831 case Intrinsic::riscv_sf_mm_s_u:
2832 case Intrinsic::riscv_sf_mm_u_s:
2833 case Intrinsic::riscv_sf_mm_u_u:
2834 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2835 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2836 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2837 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2838 case Intrinsic::riscv_sf_mm_f_f: {
2839 bool HasFRM =
false;
2840 unsigned PseudoInst;
2842 case Intrinsic::riscv_sf_mm_s_s:
2843 PseudoInst = RISCV::PseudoSF_MM_S_S;
2845 case Intrinsic::riscv_sf_mm_s_u:
2846 PseudoInst = RISCV::PseudoSF_MM_S_U;
2848 case Intrinsic::riscv_sf_mm_u_s:
2849 PseudoInst = RISCV::PseudoSF_MM_U_S;
2851 case Intrinsic::riscv_sf_mm_u_u:
2852 PseudoInst = RISCV::PseudoSF_MM_U_U;
2854 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2855 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
2858 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2859 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
2862 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2863 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
2866 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2867 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
2870 case Intrinsic::riscv_sf_mm_f_f:
2871 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
2872 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
2874 PseudoInst = RISCV::PseudoSF_MM_F_F;
2890 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
2899 Operands.append({TmOp, TnOp, TkOp,
2900 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
2904 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2909 case Intrinsic::riscv_sf_vtzero_t: {
2916 auto *NewNode =
CurDAG->getMachineNode(
2917 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
2918 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
2928 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2937 if (Subtarget->hasStdExtP()) {
2939 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
2940 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
2942 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
2943 SrcVT == MVT::v2i32)) ||
2944 (SrcVT == MVT::i64 &&
2945 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
2946 if (Is32BitCast || Is64BitCast) {
2955 if (!Subtarget->hasStdExtP())
2958 bool IsDoubleWide = Subtarget->isPExtPackedDoubleType(VT);
2960 if (ConstNode->isZero()) {
2961 MCPhysReg X0Reg = IsDoubleWide ? RISCV::X0_Pair : RISCV::X0;
2969 APInt Val = ConstNode->getAPIntValue().
trunc(EltSize);
2974 RISCV::ADDI,
DL, VT,
CurDAG->getRegister(RISCV::X0, VT),
2975 CurDAG->getAllOnesConstant(
DL, XLenVT,
true));
2982 Val = Val.
trunc(16);
2991 Opc = IsDoubleWide ? RISCV::PLI_DB : RISCV::PLI_B;
2992 }
else if (EltSize == 16 &&
isInt<10>(Imm)) {
2993 Opc = IsDoubleWide ? RISCV::PLI_DH : RISCV::PLI_H;
2994 }
else if (!IsDoubleWide && EltSize == 32 &&
isInt<10>(Imm)) {
2997 Opc = IsDoubleWide ? RISCV::PLUI_DH : RISCV::PLUI_H;
3000 Opc = RISCV::PLUI_W;
3006 Opc,
DL, VT,
CurDAG->getSignedTargetConstant(Imm,
DL, XLenVT));
3013 if (!Subtarget->is64Bit() && VT == MVT::v2i32) {
3015 Node->getOperand(0));
3023 if (Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::v2i32) {
3025 Node->getOperand(1));
3032 if (Subtarget->hasStdExtP() && !Subtarget->is64Bit() &&
3033 (VT == MVT::v4i16 || VT == MVT::v8i8)) {
3044 if (Subtarget->hasStdExtP() && !Subtarget->is64Bit()) {
3045 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3046 if (VT == MVT::i32 && SrcVT == MVT::v2i32) {
3050 unsigned Idx = IdxC->getZExtValue();
3054 unsigned SubRegIdx =
3055 Idx == 0 ? RISCV::sub_gpr_even : RISCV::sub_gpr_odd;
3058 CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, Src);
3066 if (Subtarget->hasStdExtP()) {
3067 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3068 if ((VT == MVT::v2i32 && SrcVT == MVT::i64) ||
3069 (VT == MVT::v4i8 && SrcVT == MVT::i32)) {
3077 case RISCVISD::TUPLE_INSERT: {
3081 auto Idx =
Node->getConstantOperandVal(2);
3085 MVT SubVecContainerVT = SubVecVT;
3088 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
3090 [[maybe_unused]]
bool ExactlyVecRegSized =
3092 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
3094 .getKnownMinValue()));
3095 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
3097 MVT ContainerVT = VT;
3099 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3101 const auto *
TRI = Subtarget->getRegisterInfo();
3103 std::tie(SubRegIdx, Idx) =
3105 ContainerVT, SubVecContainerVT, Idx,
TRI);
3115 [[maybe_unused]]
bool IsSubVecPartReg =
3119 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
3121 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
3122 "the subvector is smaller than a full-sized register");
3126 if (SubRegIdx == RISCV::NoSubRegister) {
3127 unsigned InRegClassID =
3131 "Unexpected subvector extraction");
3133 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
3139 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
3144 case RISCVISD::TUPLE_EXTRACT: {
3146 auto Idx =
Node->getConstantOperandVal(1);
3147 MVT InVT = V.getSimpleValueType();
3151 if (Subtarget->hasStdExtP() && !Subtarget->is64Bit() &&
3152 ((InVT == MVT::v4i16 && VT == MVT::v2i16) ||
3153 (InVT == MVT::v8i8 && VT == MVT::v4i8))) {
3155 if (Idx != 0 && Idx != NumElts)
3158 unsigned SubRegIdx = Idx == 0 ? RISCV::sub_gpr_even : RISCV::sub_gpr_odd;
3159 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
3167 MVT SubVecContainerVT = VT;
3171 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3174 InVT =
TLI.getContainerForFixedLengthVector(InVT);
3176 const auto *
TRI = Subtarget->getRegisterInfo();
3178 std::tie(SubRegIdx, Idx) =
3180 InVT, SubVecContainerVT, Idx,
TRI);
3190 if (SubRegIdx == RISCV::NoSubRegister) {
3194 "Unexpected subvector extraction");
3197 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
3202 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
3206 case RISCVISD::VMV_S_X_VL:
3207 case RISCVISD::VFMV_S_F_VL:
3208 case RISCVISD::VMV_V_X_VL:
3209 case RISCVISD::VFMV_V_F_VL: {
3211 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
3212 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
3213 if (!
Node->getOperand(0).isUndef())
3219 if (!Ld || Ld->isIndexed())
3221 EVT MemVT = Ld->getMemoryVT();
3247 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
3251 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
3257 Operands.
append({VL, SEW, PolicyOp, Ld->getChain()});
3261 false, IsStrided,
false,
3262 Log2SEW,
static_cast<unsigned>(LMUL));
3264 CurDAG->getMachineNode(
P->Pseudo,
DL, {VT, MVT::Other}, Operands);
3268 CurDAG->setNodeMemRefs(Load, {Ld->getMemOperand()});
3276 if (Subtarget->hasVendorXMIPSCBOP())
3279 unsigned Locality =
Node->getConstantOperandVal(3);
3287 int NontemporalLevel = 0;
3290 NontemporalLevel = 3;
3293 NontemporalLevel = 1;
3296 NontemporalLevel = 0;
3302 if (NontemporalLevel & 0b1)
3304 if (NontemporalLevel & 0b10)