1101 if (
Node->isMachineOpcode()) {
1103 Node->setNodeId(-1);
1109 unsigned Opcode =
Node->getOpcode();
1110 MVT XLenVT = Subtarget->getXLenVT();
1112 MVT VT =
Node->getSimpleValueType(0);
1114 bool HasBitTest = Subtarget->hasBEXTILike();
1118 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT");
1120 if (ConstNode->isZero()) {
1122 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1126 int64_t
Imm = ConstNode->getSExtValue();
1162 Imm = ((uint64_t)
Imm << 32) | (
Imm & 0xFFFFFFFF);
1172 bool Is64Bit = Subtarget->is64Bit();
1173 bool HasZdinx = Subtarget->hasStdExtZdinx();
1175 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1180 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1181 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1183 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1194 assert(Subtarget->hasStdExtZfbfmin());
1195 Opc = RISCV::FMV_H_X;
1198 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1201 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1206 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1210 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1215 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1217 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT,
Imm).getNode();
1218 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1220 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT,
Imm).getNode();
1221 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1222 Res =
CurDAG->getMachineNode(
1230 Opc = RISCV::FSGNJN_D;
1232 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1240 case RISCVISD::BuildGPRPair:
1241 case RISCVISD::BuildPairF64:
1242 case RISCVISD::BuildPairGPRVec: {
1243 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1246 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::BuildPairF64) &&
1247 "BuildPairF64 only handled here on rv32i_zdinx");
1254 case RISCVISD::SplitGPRPair:
1255 case RISCVISD::SplitF64:
1256 case RISCVISD::SplitGPRVec: {
1257 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1258 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::SplitF64) &&
1259 "SplitF64 only handled here on rv32i_zdinx");
1263 Node->getValueType(0),
1264 Node->getOperand(0));
1270 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1278 if (!Subtarget->hasStdExtZfa())
1280 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1281 "Unexpected subtarget");
1286 Node->getOperand(0));
1291 Node->getOperand(0));
1306 unsigned ShAmt = N1C->getZExtValue();
1310 unsigned XLen = Subtarget->getXLen();
1313 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1318 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1321 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1325 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1326 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1337 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1340 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1354 unsigned ShAmt = N1C->getZExtValue();
1360 unsigned XLen = Subtarget->getXLen();
1363 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1366 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1369 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1386 if (ShAmt >= TrailingOnes)
1389 if (TrailingOnes == 32) {
1391 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1402 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1404 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1410 const unsigned Msb = TrailingOnes - 1;
1411 const unsigned Lsb = ShAmt;
1415 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1418 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1421 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1446 unsigned ShAmt = N1C->getZExtValue();
1450 if (ExtSize >= 32 || ShAmt >= ExtSize)
1452 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1455 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1458 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1477 unsigned ShAmt = ShAmtC->getZExtValue();
1478 unsigned XLen = Subtarget->getXLen();
1481 if (ExtSize >= 32 || ShAmt >= XLen - ExtSize)
1484 unsigned LShAmt = XLen - ExtSize - ShAmt;
1487 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1490 CurDAG->getTargetConstant(XLen - ExtSize,
DL, VT));
1517 unsigned C2 =
C->getZExtValue();
1518 unsigned XLen = Subtarget->getXLen();
1519 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1527 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1529 uint64_t C1 = N1C->getZExtValue();
1539 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1549 if (C2 + 32 == Leading) {
1551 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1561 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1565 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1566 CurDAG->getTargetConstant(31,
DL, VT));
1568 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1569 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1582 const unsigned Lsb = C2;
1588 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1592 Skip |= HasBitTest && Leading == XLen - 1;
1593 if (OneUseOrZExtW && !Skip) {
1595 RISCV::SLLI,
DL, VT,
X,
1596 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1599 CurDAG->getTargetConstant(Leading,
DL, VT));
1611 if (C2 + Leading < XLen &&
1614 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1616 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1617 CurDAG->getTargetConstant(C2,
DL, VT));
1630 const unsigned Msb = XLen - Leading - 1;
1631 const unsigned Lsb = C2;
1635 if (OneUseOrZExtW && !IsCANDI) {
1637 if (Subtarget->hasStdExtZbkb() && C1 == 0xff00 && C2 == 8) {
1639 RISCV::PACKH,
DL, VT,
1640 CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT()),
X);
1646 RISCV::SLLI,
DL, VT,
X,
1647 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1650 CurDAG->getTargetConstant(Leading,
DL, VT));
1662 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1664 unsigned SrliOpc = RISCV::SRLI;
1668 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1669 SrliOpc = RISCV::SRLIW;
1670 X =
X.getOperand(0);
1674 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1677 CurDAG->getTargetConstant(Trailing,
DL, VT));
1682 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1683 OneUseOrZExtW && !IsCANDI) {
1685 RISCV::SRLIW,
DL, VT,
X,
1686 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1689 CurDAG->getTargetConstant(Trailing,
DL, VT));
1694 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1695 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1697 RISCV::SRLI,
DL, VT,
X,
1698 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1700 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1701 CurDAG->getTargetConstant(Trailing,
DL, VT));
1712 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1714 RISCV::SRLI,
DL, VT,
X,
1715 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1718 CurDAG->getTargetConstant(Trailing,
DL, VT));
1723 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1725 RISCV::SRLIW,
DL, VT,
X,
1726 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1729 CurDAG->getTargetConstant(Trailing,
DL, VT));
1735 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1736 Subtarget->hasStdExtZba()) {
1738 RISCV::SRLI,
DL, VT,
X,
1739 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1741 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1742 CurDAG->getTargetConstant(Trailing,
DL, VT));
1749 const uint64_t C1 = N1C->getZExtValue();
1754 unsigned XLen = Subtarget->getXLen();
1755 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1760 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1763 X.getConstantOperandVal(1) == 32;
1770 RISCV::SRAI,
DL, VT,
X,
1771 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1774 CurDAG->getTargetConstant(Leading,
DL, VT));
1786 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1789 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1792 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1795 CurDAG->getTargetConstant(Trailing,
DL, VT));
1808 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1809 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1829 if (!N1C || !N1C->hasOneUse())
1850 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1852 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1857 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1859 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1866 unsigned XLen = Subtarget->getXLen();
1871 uint64_t C1 = N1C->getZExtValue();
1872 unsigned ConstantShift = XLen - LeadingZeros;
1876 uint64_t ShiftedC1 = C1 << ConstantShift;
1885 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1893 case RISCVISD::WMULSU:
1894 case RISCVISD::WADD:
1895 case RISCVISD::WSUB:
1896 case RISCVISD::WADDU:
1897 case RISCVISD::WSUBU: {
1898 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1899 "Unexpected opcode");
1902 switch (
Node->getOpcode()) {
1911 case RISCVISD::WMULSU:
1912 Opc = RISCV::WMULSU;
1914 case RISCVISD::WADD:
1917 case RISCVISD::WSUB:
1920 case RISCVISD::WADDU:
1923 case RISCVISD::WSUBU:
1929 Opc,
DL, MVT::Untyped,
Node->getOperand(0),
Node->getOperand(1));
1937 case RISCVISD::WSLL:
1938 case RISCVISD::WSLA: {
1940 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1941 "Unexpected opcode");
1943 bool IsSigned =
Node->getOpcode() == RISCVISD::WSLA;
1950 if (ShAmtC && ShAmtC->getZExtValue() < 64) {
1951 Opc = IsSigned ? RISCV::WSLAI : RISCV::WSLLI;
1952 ShAmt =
CurDAG->getTargetConstant(ShAmtC->getZExtValue(),
DL, XLenVT);
1954 Opc = IsSigned ? RISCV::WSLA : RISCV::WSLL;
1958 Node->getOperand(0), ShAmt);
1970 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1980 bool Simm12 =
false;
1984 int ConstantVal = ConstantOffset->getSExtValue();
1991 unsigned Opcode = 0;
1992 switch (
Load->getMemoryVT().getSimpleVT().SimpleTy) {
1994 if (Simm12 && SignExtend)
1995 Opcode = RISCV::CV_LB_ri_inc;
1996 else if (Simm12 && !SignExtend)
1997 Opcode = RISCV::CV_LBU_ri_inc;
1998 else if (!Simm12 && SignExtend)
1999 Opcode = RISCV::CV_LB_rr_inc;
2001 Opcode = RISCV::CV_LBU_rr_inc;
2004 if (Simm12 && SignExtend)
2005 Opcode = RISCV::CV_LH_ri_inc;
2006 else if (Simm12 && !SignExtend)
2007 Opcode = RISCV::CV_LHU_ri_inc;
2008 else if (!Simm12 && SignExtend)
2009 Opcode = RISCV::CV_LH_rr_inc;
2011 Opcode = RISCV::CV_LHU_rr_inc;
2015 Opcode = RISCV::CV_LW_ri_inc;
2017 Opcode = RISCV::CV_LW_rr_inc;
2032 case RISCVISD::LD_RV32: {
2033 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
2042 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
2051 case RISCVISD::SD_RV32: {
2063 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2075 case RISCVISD::MQWACC:
2076 case RISCVISD::MQRWACC:
2077 case RISCVISD::WMACC:
2078 case RISCVISD::WMACCU:
2079 case RISCVISD::WMACCSU: {
2080 assert(!Subtarget->is64Bit() && Subtarget->hasStdExtP() &&
2081 "Unexpected opcode");
2084 Node->getOperand(1));
2089 case RISCVISD::MQWACC:
2090 Opc = RISCV::MQWACC;
2092 case RISCVISD::MQRWACC:
2093 Opc = RISCV::MQRWACC;
2095 case RISCVISD::WMACC:
2098 case RISCVISD::WMACCU:
2099 Opc = RISCV::WMACCU;
2101 case RISCVISD::WMACCSU:
2102 Opc = RISCV::WMACCSU;
2106 Opc,
DL, MVT::Untyped, Op0,
Node->getOperand(2),
Node->getOperand(3));
2113 case RISCVISD::ADDD:
2121 case RISCVISD::SUBD:
2122 case RISCVISD::WADDAU:
2123 case RISCVISD::WSUBAU:
2124 case RISCVISD::WADDA:
2125 case RISCVISD::WSUBA: {
2126 assert(!Subtarget->is64Bit() && Subtarget->hasStdExtP() &&
2127 "Unexpected opcode");
2134 Op0 =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2143 if (Opcode == RISCVISD::WADDAU || Opcode == RISCVISD::WSUBAU ||
2144 Opcode == RISCVISD::WADDA || Opcode == RISCVISD::WSUBA) {
2151 case RISCVISD::WADDAU:
2152 Opc = RISCV::WADDAU;
2154 case RISCVISD::WSUBAU:
2155 Opc = RISCV::WSUBAU;
2157 case RISCVISD::WADDA:
2160 case RISCVISD::WSUBA:
2164 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1Lo, Op1Hi);
2172 case RISCVISD::ADDD:
2175 case RISCVISD::SUBD:
2179 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1);
2189 unsigned IntNo =
Node->getConstantOperandVal(0);
2194 case Intrinsic::riscv_vmsgeu:
2195 case Intrinsic::riscv_vmsge: {
2198 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
2199 bool IsCmpConstant =
false;
2200 bool IsCmpMinimum =
false;
2208 IsCmpConstant =
true;
2209 CVal =
C->getSExtValue();
2210 if (CVal >= -15 && CVal <= 16) {
2211 if (!IsUnsigned || CVal != 0)
2213 IsCmpMinimum =
true;
2217 IsCmpMinimum =
true;
2220 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
2224#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2225 case RISCVVType::lmulenum: \
2226 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2227 : RISCV::PseudoVMSLT_VX_##suffix; \
2228 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
2229 : RISCV::PseudoVMSGT_VX_##suffix; \
2238#undef CASE_VMSLT_OPCODES
2244#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
2245 case RISCVVType::lmulenum: \
2246 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
2247 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
2256#undef CASE_VMNAND_VMSET_OPCODES
2267 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
2271 if (IsCmpConstant) {
2276 {Src1, Imm, VL, SEW}));
2283 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2286 {Cmp, Cmp, VL, MaskSEW}));
2289 case Intrinsic::riscv_vmsgeu_mask:
2290 case Intrinsic::riscv_vmsge_mask: {
2293 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2294 bool IsCmpConstant =
false;
2295 bool IsCmpMinimum =
false;
2303 IsCmpConstant =
true;
2304 CVal =
C->getSExtValue();
2305 if (CVal >= -15 && CVal <= 16) {
2306 if (!IsUnsigned || CVal != 0)
2308 IsCmpMinimum =
true;
2312 IsCmpMinimum =
true;
2315 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2316 VMOROpcode, VMSGTMaskOpcode;
2320#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2321 case RISCVVType::lmulenum: \
2322 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2323 : RISCV::PseudoVMSLT_VX_##suffix; \
2324 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2325 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2326 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2327 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2336#undef CASE_VMSLT_OPCODES
2342#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2343 case RISCVVType::lmulenum: \
2344 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2345 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2346 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2355#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2369 if (Mask == MaskedOff) {
2374 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2375 {Mask, MaskedOff, VL, MaskSEW}));
2382 if (Mask == MaskedOff) {
2384 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2387 {Mask, Cmp, VL, MaskSEW}));
2394 if (IsCmpConstant) {
2399 VMSGTMaskOpcode,
DL, VT,
2400 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2410 {MaskedOff, Src1, Src2, Mask,
2411 VL, SEW, PolicyOp}),
2415 {Cmp, Mask, VL, MaskSEW}));
2418 case Intrinsic::riscv_vsetvli:
2419 case Intrinsic::riscv_vsetvlimax:
2421 case Intrinsic::riscv_sf_vsettnt:
2422 case Intrinsic::riscv_sf_vsettm:
2423 case Intrinsic::riscv_sf_vsettk:
2429 unsigned IntNo =
Node->getConstantOperandVal(1);
2434 case Intrinsic::riscv_vlseg2:
2435 case Intrinsic::riscv_vlseg3:
2436 case Intrinsic::riscv_vlseg4:
2437 case Intrinsic::riscv_vlseg5:
2438 case Intrinsic::riscv_vlseg6:
2439 case Intrinsic::riscv_vlseg7:
2440 case Intrinsic::riscv_vlseg8: {
2445 case Intrinsic::riscv_vlseg2_mask:
2446 case Intrinsic::riscv_vlseg3_mask:
2447 case Intrinsic::riscv_vlseg4_mask:
2448 case Intrinsic::riscv_vlseg5_mask:
2449 case Intrinsic::riscv_vlseg6_mask:
2450 case Intrinsic::riscv_vlseg7_mask:
2451 case Intrinsic::riscv_vlseg8_mask: {
2456 case Intrinsic::riscv_vlsseg2:
2457 case Intrinsic::riscv_vlsseg3:
2458 case Intrinsic::riscv_vlsseg4:
2459 case Intrinsic::riscv_vlsseg5:
2460 case Intrinsic::riscv_vlsseg6:
2461 case Intrinsic::riscv_vlsseg7:
2462 case Intrinsic::riscv_vlsseg8: {
2467 case Intrinsic::riscv_vlsseg2_mask:
2468 case Intrinsic::riscv_vlsseg3_mask:
2469 case Intrinsic::riscv_vlsseg4_mask:
2470 case Intrinsic::riscv_vlsseg5_mask:
2471 case Intrinsic::riscv_vlsseg6_mask:
2472 case Intrinsic::riscv_vlsseg7_mask:
2473 case Intrinsic::riscv_vlsseg8_mask: {
2478 case Intrinsic::riscv_vloxseg2:
2479 case Intrinsic::riscv_vloxseg3:
2480 case Intrinsic::riscv_vloxseg4:
2481 case Intrinsic::riscv_vloxseg5:
2482 case Intrinsic::riscv_vloxseg6:
2483 case Intrinsic::riscv_vloxseg7:
2484 case Intrinsic::riscv_vloxseg8:
2488 case Intrinsic::riscv_vluxseg2:
2489 case Intrinsic::riscv_vluxseg3:
2490 case Intrinsic::riscv_vluxseg4:
2491 case Intrinsic::riscv_vluxseg5:
2492 case Intrinsic::riscv_vluxseg6:
2493 case Intrinsic::riscv_vluxseg7:
2494 case Intrinsic::riscv_vluxseg8:
2498 case Intrinsic::riscv_vloxseg2_mask:
2499 case Intrinsic::riscv_vloxseg3_mask:
2500 case Intrinsic::riscv_vloxseg4_mask:
2501 case Intrinsic::riscv_vloxseg5_mask:
2502 case Intrinsic::riscv_vloxseg6_mask:
2503 case Intrinsic::riscv_vloxseg7_mask:
2504 case Intrinsic::riscv_vloxseg8_mask:
2508 case Intrinsic::riscv_vluxseg2_mask:
2509 case Intrinsic::riscv_vluxseg3_mask:
2510 case Intrinsic::riscv_vluxseg4_mask:
2511 case Intrinsic::riscv_vluxseg5_mask:
2512 case Intrinsic::riscv_vluxseg6_mask:
2513 case Intrinsic::riscv_vluxseg7_mask:
2514 case Intrinsic::riscv_vluxseg8_mask:
2518 case Intrinsic::riscv_vlseg8ff:
2519 case Intrinsic::riscv_vlseg7ff:
2520 case Intrinsic::riscv_vlseg6ff:
2521 case Intrinsic::riscv_vlseg5ff:
2522 case Intrinsic::riscv_vlseg4ff:
2523 case Intrinsic::riscv_vlseg3ff:
2524 case Intrinsic::riscv_vlseg2ff: {
2528 case Intrinsic::riscv_vlseg8ff_mask:
2529 case Intrinsic::riscv_vlseg7ff_mask:
2530 case Intrinsic::riscv_vlseg6ff_mask:
2531 case Intrinsic::riscv_vlseg5ff_mask:
2532 case Intrinsic::riscv_vlseg4ff_mask:
2533 case Intrinsic::riscv_vlseg3ff_mask:
2534 case Intrinsic::riscv_vlseg2ff_mask: {
2538 case Intrinsic::riscv_vloxei:
2539 case Intrinsic::riscv_vloxei_mask:
2540 case Intrinsic::riscv_vluxei:
2541 case Intrinsic::riscv_vluxei_mask: {
2542 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2543 IntNo == Intrinsic::riscv_vluxei_mask;
2544 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2545 IntNo == Intrinsic::riscv_vloxei_mask;
2547 MVT VT =
Node->getSimpleValueType(0);
2560 "Element count mismatch");
2565 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2567 "index values when XLEN=32");
2570 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2571 static_cast<unsigned>(IndexLMUL));
2580 case Intrinsic::riscv_vlm:
2581 case Intrinsic::riscv_vle:
2582 case Intrinsic::riscv_vle_mask:
2583 case Intrinsic::riscv_vlse:
2584 case Intrinsic::riscv_vlse_mask: {
2585 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2586 IntNo == Intrinsic::riscv_vlse_mask;
2588 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2590 MVT VT =
Node->getSimpleValueType(0);
2599 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2602 if (HasPassthruOperand)
2608 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2616 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2617 static_cast<unsigned>(LMUL));
2626 case Intrinsic::riscv_vleff:
2627 case Intrinsic::riscv_vleff_mask: {
2628 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2630 MVT VT =
Node->getSimpleValueType(0);
2642 RISCV::getVLEPseudo(IsMasked,
false,
true,
2643 Log2SEW,
static_cast<unsigned>(LMUL));
2651 case Intrinsic::riscv_nds_vln:
2652 case Intrinsic::riscv_nds_vln_mask:
2653 case Intrinsic::riscv_nds_vlnu:
2654 case Intrinsic::riscv_nds_vlnu_mask: {
2655 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2656 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2657 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2658 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2660 MVT VT =
Node->getSimpleValueType(0);
2672 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2686 unsigned IntNo =
Node->getConstantOperandVal(1);
2688 case Intrinsic::riscv_vsseg2:
2689 case Intrinsic::riscv_vsseg3:
2690 case Intrinsic::riscv_vsseg4:
2691 case Intrinsic::riscv_vsseg5:
2692 case Intrinsic::riscv_vsseg6:
2693 case Intrinsic::riscv_vsseg7:
2694 case Intrinsic::riscv_vsseg8: {
2699 case Intrinsic::riscv_vsseg2_mask:
2700 case Intrinsic::riscv_vsseg3_mask:
2701 case Intrinsic::riscv_vsseg4_mask:
2702 case Intrinsic::riscv_vsseg5_mask:
2703 case Intrinsic::riscv_vsseg6_mask:
2704 case Intrinsic::riscv_vsseg7_mask:
2705 case Intrinsic::riscv_vsseg8_mask: {
2710 case Intrinsic::riscv_vssseg2:
2711 case Intrinsic::riscv_vssseg3:
2712 case Intrinsic::riscv_vssseg4:
2713 case Intrinsic::riscv_vssseg5:
2714 case Intrinsic::riscv_vssseg6:
2715 case Intrinsic::riscv_vssseg7:
2716 case Intrinsic::riscv_vssseg8: {
2721 case Intrinsic::riscv_vssseg2_mask:
2722 case Intrinsic::riscv_vssseg3_mask:
2723 case Intrinsic::riscv_vssseg4_mask:
2724 case Intrinsic::riscv_vssseg5_mask:
2725 case Intrinsic::riscv_vssseg6_mask:
2726 case Intrinsic::riscv_vssseg7_mask:
2727 case Intrinsic::riscv_vssseg8_mask: {
2732 case Intrinsic::riscv_vsoxseg2:
2733 case Intrinsic::riscv_vsoxseg3:
2734 case Intrinsic::riscv_vsoxseg4:
2735 case Intrinsic::riscv_vsoxseg5:
2736 case Intrinsic::riscv_vsoxseg6:
2737 case Intrinsic::riscv_vsoxseg7:
2738 case Intrinsic::riscv_vsoxseg8:
2742 case Intrinsic::riscv_vsuxseg2:
2743 case Intrinsic::riscv_vsuxseg3:
2744 case Intrinsic::riscv_vsuxseg4:
2745 case Intrinsic::riscv_vsuxseg5:
2746 case Intrinsic::riscv_vsuxseg6:
2747 case Intrinsic::riscv_vsuxseg7:
2748 case Intrinsic::riscv_vsuxseg8:
2752 case Intrinsic::riscv_vsoxseg2_mask:
2753 case Intrinsic::riscv_vsoxseg3_mask:
2754 case Intrinsic::riscv_vsoxseg4_mask:
2755 case Intrinsic::riscv_vsoxseg5_mask:
2756 case Intrinsic::riscv_vsoxseg6_mask:
2757 case Intrinsic::riscv_vsoxseg7_mask:
2758 case Intrinsic::riscv_vsoxseg8_mask:
2762 case Intrinsic::riscv_vsuxseg2_mask:
2763 case Intrinsic::riscv_vsuxseg3_mask:
2764 case Intrinsic::riscv_vsuxseg4_mask:
2765 case Intrinsic::riscv_vsuxseg5_mask:
2766 case Intrinsic::riscv_vsuxseg6_mask:
2767 case Intrinsic::riscv_vsuxseg7_mask:
2768 case Intrinsic::riscv_vsuxseg8_mask:
2772 case Intrinsic::riscv_vsoxei:
2773 case Intrinsic::riscv_vsoxei_mask:
2774 case Intrinsic::riscv_vsuxei:
2775 case Intrinsic::riscv_vsuxei_mask: {
2776 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2777 IntNo == Intrinsic::riscv_vsuxei_mask;
2778 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2779 IntNo == Intrinsic::riscv_vsoxei_mask;
2781 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2794 "Element count mismatch");
2799 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2801 "index values when XLEN=32");
2804 IsMasked, IsOrdered, IndexLog2EEW,
2805 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2814 case Intrinsic::riscv_vsm:
2815 case Intrinsic::riscv_vse:
2816 case Intrinsic::riscv_vse_mask:
2817 case Intrinsic::riscv_vsse:
2818 case Intrinsic::riscv_vsse_mask: {
2819 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2820 IntNo == Intrinsic::riscv_vsse_mask;
2822 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2824 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2836 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2844 case Intrinsic::riscv_sf_vc_x_se:
2845 case Intrinsic::riscv_sf_vc_i_se:
2848 case Intrinsic::riscv_sf_vlte8:
2849 case Intrinsic::riscv_sf_vlte16:
2850 case Intrinsic::riscv_sf_vlte32:
2851 case Intrinsic::riscv_sf_vlte64: {
2853 unsigned PseudoInst;
2855 case Intrinsic::riscv_sf_vlte8:
2856 PseudoInst = RISCV::PseudoSF_VLTE8;
2859 case Intrinsic::riscv_sf_vlte16:
2860 PseudoInst = RISCV::PseudoSF_VLTE16;
2863 case Intrinsic::riscv_sf_vlte32:
2864 PseudoInst = RISCV::PseudoSF_VLTE32;
2867 case Intrinsic::riscv_sf_vlte64:
2868 PseudoInst = RISCV::PseudoSF_VLTE64;
2876 Node->getOperand(3),
2877 Node->getOperand(4),
2880 Node->getOperand(0)};
2884 CurDAG->setNodeMemRefs(TileLoad,
2890 case Intrinsic::riscv_sf_mm_s_s:
2891 case Intrinsic::riscv_sf_mm_s_u:
2892 case Intrinsic::riscv_sf_mm_u_s:
2893 case Intrinsic::riscv_sf_mm_u_u:
2894 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2895 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2896 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2897 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2898 case Intrinsic::riscv_sf_mm_f_f: {
2899 bool HasFRM =
false;
2900 unsigned PseudoInst;
2902 case Intrinsic::riscv_sf_mm_s_s:
2903 PseudoInst = RISCV::PseudoSF_MM_S_S;
2905 case Intrinsic::riscv_sf_mm_s_u:
2906 PseudoInst = RISCV::PseudoSF_MM_S_U;
2908 case Intrinsic::riscv_sf_mm_u_s:
2909 PseudoInst = RISCV::PseudoSF_MM_U_S;
2911 case Intrinsic::riscv_sf_mm_u_u:
2912 PseudoInst = RISCV::PseudoSF_MM_U_U;
2914 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2915 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
2918 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2919 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
2922 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2923 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
2926 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2927 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
2930 case Intrinsic::riscv_sf_mm_f_f:
2931 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
2932 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
2934 PseudoInst = RISCV::PseudoSF_MM_F_F;
2938 uint64_t TileNum =
Node->getConstantOperandVal(2);
2950 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
2960 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
2969 case Intrinsic::riscv_sf_vtzero_t: {
2970 uint64_t TileNum =
Node->getConstantOperandVal(2);
2976 auto *NewNode =
CurDAG->getMachineNode(
2977 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
2978 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
2988 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2997 if (Subtarget->hasStdExtP()) {
2999 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
3000 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
3002 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
3003 SrcVT == MVT::v2i32)) ||
3004 (SrcVT == MVT::i64 &&
3005 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
3006 if (Is32BitCast || Is64BitCast) {
3015 if (!Subtarget->hasStdExtP())
3018 bool IsDoubleWide = Subtarget->isPExtPackedDoubleType(VT);
3020 if (ConstNode->isZero()) {
3021 MCPhysReg X0Reg = IsDoubleWide ? RISCV::X0_Pair : RISCV::X0;
3029 APInt Val = ConstNode->getAPIntValue().
trunc(EltSize);
3034 RISCV::ADDI,
DL, VT,
CurDAG->getRegister(RISCV::X0, VT),
3035 CurDAG->getAllOnesConstant(
DL, XLenVT,
true));
3042 Val = Val.
trunc(16);
3051 Opc = IsDoubleWide ? RISCV::PLI_DB : RISCV::PLI_B;
3053 Opc = IsDoubleWide ? RISCV::PLI_DH : RISCV::PLI_H;
3054 }
else if (!IsDoubleWide && EltSize == 32 &&
isInt<10>(
Imm)) {
3057 Opc = IsDoubleWide ? RISCV::PLUI_DH : RISCV::PLUI_H;
3060 Opc = RISCV::PLUI_W;
3075 if (Subtarget->hasStdExtP()) {
3076 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3077 if ((VT == MVT::v2i32 && SrcVT == MVT::i64) ||
3078 (VT == MVT::v4i8 && SrcVT == MVT::i32)) {
3086 case RISCVISD::TUPLE_INSERT: {
3090 auto Idx =
Node->getConstantOperandVal(2);
3094 MVT SubVecContainerVT = SubVecVT;
3097 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
3099 [[maybe_unused]]
bool ExactlyVecRegSized =
3101 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
3103 .getKnownMinValue()));
3104 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
3106 MVT ContainerVT = VT;
3108 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3110 const auto *
TRI = Subtarget->getRegisterInfo();
3112 std::tie(SubRegIdx, Idx) =
3114 ContainerVT, SubVecContainerVT, Idx,
TRI);
3124 [[maybe_unused]]
bool IsSubVecPartReg =
3128 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
3130 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
3131 "the subvector is smaller than a full-sized register");
3135 if (SubRegIdx == RISCV::NoSubRegister) {
3136 unsigned InRegClassID =
3140 "Unexpected subvector extraction");
3142 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
3148 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
3153 case RISCVISD::TUPLE_EXTRACT: {
3154 if (Subtarget->hasStdExtP())
3158 auto Idx =
Node->getConstantOperandVal(1);
3159 MVT InVT = V.getSimpleValueType();
3164 MVT SubVecContainerVT = VT;
3168 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3171 InVT =
TLI.getContainerForFixedLengthVector(InVT);
3173 const auto *
TRI = Subtarget->getRegisterInfo();
3175 std::tie(SubRegIdx, Idx) =
3177 InVT, SubVecContainerVT, Idx,
TRI);
3187 if (SubRegIdx == RISCV::NoSubRegister) {
3191 "Unexpected subvector extraction");
3194 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
3199 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
3203 case RISCVISD::VMV_S_X_VL:
3204 case RISCVISD::VFMV_S_F_VL:
3205 case RISCVISD::VMV_V_X_VL:
3206 case RISCVISD::VFMV_V_F_VL: {
3208 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
3209 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
3210 if (!
Node->getOperand(0).isUndef())
3216 if (!Ld || Ld->isIndexed())
3218 EVT MemVT = Ld->getMemoryVT();
3244 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
3248 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
3254 Operands.append({VL, SEW, PolicyOp, Ld->getChain()});
3258 false, IsStrided,
false,
3259 Log2SEW,
static_cast<unsigned>(LMUL));
3265 CurDAG->setNodeMemRefs(
Load, {Ld->getMemOperand()});
3270 case RISCVISD::LPAD_CALL:
3271 case RISCVISD::LPAD_CALL_INDIRECT: {
3272 bool IsIndirect = Opcode == RISCVISD::LPAD_CALL_INDIRECT;
3273 unsigned PseudoOpc = IsIndirect ? RISCV::PseudoCALLIndirectLpadAlign
3274 : RISCV::PseudoCALLLpadAlign;
3280 "in unsigned 20-bits");
3288 Ops.push_back(
Node->getOperand(1));
3289 Ops.push_back(
CurDAG->getTargetConstant(LpadLabel,
DL, XLenVT));
3292 bool HasGlue =
Node->getGluedNode() !=
nullptr;
3293 unsigned RegOperandsEnd = HasGlue ?
NumOps - 1 :
NumOps;
3294 for (
unsigned I = 2;
I != RegOperandsEnd; ++
I)
3295 Ops.push_back(
Node->getOperand(
I));
3297 Ops.push_back(
Node->getOperand(0));
3308 if (Subtarget->hasVendorXMIPSCBOP())
3311 unsigned Locality =
Node->getConstantOperandVal(3);
3319 int NontemporalLevel = 0;
3322 NontemporalLevel = 3;
3325 NontemporalLevel = 1;
3328 NontemporalLevel = 0;
3334 if (NontemporalLevel & 0b1)
3336 if (NontemporalLevel & 0b10)