1176 if (
Node->isMachineOpcode()) {
1178 Node->setNodeId(-1);
1184 unsigned Opcode =
Node->getOpcode();
1185 MVT XLenVT = Subtarget->getXLenVT();
1187 MVT VT =
Node->getSimpleValueType(0);
1189 bool HasBitTest = Subtarget->hasBEXTILike();
1193 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT");
1195 if (ConstNode->isZero()) {
1197 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1201 int64_t
Imm = ConstNode->getSExtValue();
1237 Imm = ((uint64_t)
Imm << 32) | (
Imm & 0xFFFFFFFF);
1247 bool Is64Bit = Subtarget->is64Bit();
1248 bool HasZdinx = Subtarget->hasStdExtZdinx();
1250 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1255 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1256 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1258 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1269 assert(Subtarget->hasStdExtZfbfmin());
1270 Opc = RISCV::FMV_H_X;
1273 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1276 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1281 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1285 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1290 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1292 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT,
Imm).getNode();
1293 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1295 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT,
Imm).getNode();
1296 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1297 Res =
CurDAG->getMachineNode(
1305 Opc = RISCV::FSGNJN_D;
1307 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1315 case RISCVISD::BuildGPRPair:
1316 case RISCVISD::BuildPairF64:
1317 case RISCVISD::BuildPairGPRVec: {
1318 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1321 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::BuildPairF64) &&
1322 "BuildPairF64 only handled here on rv32i_zdinx");
1329 case RISCVISD::SplitGPRPair:
1330 case RISCVISD::SplitF64:
1331 case RISCVISD::SplitGPRVec: {
1332 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1333 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::SplitF64) &&
1334 "SplitF64 only handled here on rv32i_zdinx");
1338 Node->getValueType(0),
1339 Node->getOperand(0));
1345 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1353 if (!Subtarget->hasStdExtZfa())
1355 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1356 "Unexpected subtarget");
1361 Node->getOperand(0));
1366 Node->getOperand(0));
1381 unsigned ShAmt = N1C->getZExtValue();
1385 unsigned XLen = Subtarget->getXLen();
1388 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1393 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1396 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1400 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1401 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1412 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1415 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1429 unsigned ShAmt = N1C->getZExtValue();
1435 unsigned XLen = Subtarget->getXLen();
1438 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1441 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1444 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1461 if (ShAmt >= TrailingOnes)
1464 if (TrailingOnes == 32) {
1466 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1477 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1479 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1485 const unsigned Msb = TrailingOnes - 1;
1486 const unsigned Lsb = ShAmt;
1490 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1493 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1496 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1521 unsigned ShAmt = N1C->getZExtValue();
1525 if (ExtSize >= 32 || ShAmt >= ExtSize)
1527 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1530 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1533 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1552 unsigned ShAmt = ShAmtC->getZExtValue();
1553 unsigned XLen = Subtarget->getXLen();
1556 if (ExtSize >= 32 || ShAmt >= XLen - ExtSize)
1559 unsigned LShAmt = XLen - ExtSize - ShAmt;
1562 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1565 CurDAG->getTargetConstant(XLen - ExtSize,
DL, VT));
1592 unsigned C2 =
C->getZExtValue();
1593 unsigned XLen = Subtarget->getXLen();
1594 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1602 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1604 uint64_t C1 = N1C->getZExtValue();
1614 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1624 if (C2 + 32 == Leading) {
1626 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1636 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1640 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1641 CurDAG->getTargetConstant(31,
DL, VT));
1643 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1644 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1657 const unsigned Lsb = C2;
1663 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1667 Skip |= HasBitTest && Leading == XLen - 1;
1668 if (OneUseOrZExtW && !Skip) {
1670 RISCV::SLLI,
DL, VT,
X,
1671 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1674 CurDAG->getTargetConstant(Leading,
DL, VT));
1686 if (C2 + Leading < XLen &&
1689 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1691 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1692 CurDAG->getTargetConstant(C2,
DL, VT));
1705 const unsigned Msb = XLen - Leading - 1;
1706 const unsigned Lsb = C2;
1710 if (OneUseOrZExtW && !IsCANDI) {
1712 if (Subtarget->hasStdExtZbkb() && C1 == 0xff00 && C2 == 8) {
1714 RISCV::PACKH,
DL, VT,
1715 CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT()),
X);
1721 RISCV::SLLI,
DL, VT,
X,
1722 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1725 CurDAG->getTargetConstant(Leading,
DL, VT));
1737 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1739 unsigned SrliOpc = RISCV::SRLI;
1743 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1744 SrliOpc = RISCV::SRLIW;
1745 X =
X.getOperand(0);
1749 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1752 CurDAG->getTargetConstant(Trailing,
DL, VT));
1757 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1758 OneUseOrZExtW && !IsCANDI) {
1760 RISCV::SRLIW,
DL, VT,
X,
1761 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1764 CurDAG->getTargetConstant(Trailing,
DL, VT));
1769 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1770 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1772 RISCV::SRLI,
DL, VT,
X,
1773 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1775 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1776 CurDAG->getTargetConstant(Trailing,
DL, VT));
1787 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1789 RISCV::SRLI,
DL, VT,
X,
1790 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1793 CurDAG->getTargetConstant(Trailing,
DL, VT));
1798 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1800 RISCV::SRLIW,
DL, VT,
X,
1801 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1804 CurDAG->getTargetConstant(Trailing,
DL, VT));
1810 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1811 Subtarget->hasStdExtZba()) {
1813 RISCV::SRLI,
DL, VT,
X,
1814 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1816 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1817 CurDAG->getTargetConstant(Trailing,
DL, VT));
1824 const uint64_t C1 = N1C->getZExtValue();
1829 unsigned XLen = Subtarget->getXLen();
1830 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1835 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1838 X.getConstantOperandVal(1) == 32;
1845 RISCV::SRAI,
DL, VT,
X,
1846 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1849 CurDAG->getTargetConstant(Leading,
DL, VT));
1861 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1864 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1867 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1870 CurDAG->getTargetConstant(Trailing,
DL, VT));
1883 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1884 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1904 if (!N1C || !N1C->hasOneUse())
1925 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1927 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1932 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1934 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1941 unsigned XLen = Subtarget->getXLen();
1946 uint64_t C1 = N1C->getZExtValue();
1947 unsigned ConstantShift = XLen - LeadingZeros;
1951 uint64_t ShiftedC1 = C1 << ConstantShift;
1960 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1968 case RISCVISD::WMULSU:
1969 case RISCVISD::WADD:
1970 case RISCVISD::WSUB:
1971 case RISCVISD::WADDU:
1972 case RISCVISD::WSUBU: {
1973 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1974 "Unexpected opcode");
1977 switch (
Node->getOpcode()) {
1986 case RISCVISD::WMULSU:
1987 Opc = RISCV::WMULSU;
1989 case RISCVISD::WADD:
1992 case RISCVISD::WSUB:
1995 case RISCVISD::WADDU:
1998 case RISCVISD::WSUBU:
2004 Opc,
DL, MVT::Untyped,
Node->getOperand(0),
Node->getOperand(1));
2012 case RISCVISD::WSLL:
2013 case RISCVISD::WSLA: {
2015 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
2016 "Unexpected opcode");
2018 bool IsSigned =
Node->getOpcode() == RISCVISD::WSLA;
2025 if (ShAmtC && ShAmtC->getZExtValue() < 64) {
2026 Opc = IsSigned ? RISCV::WSLAI : RISCV::WSLLI;
2027 ShAmt =
CurDAG->getTargetConstant(ShAmtC->getZExtValue(),
DL, XLenVT);
2029 Opc = IsSigned ? RISCV::WSLA : RISCV::WSLL;
2033 Node->getOperand(0), ShAmt);
2045 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
2055 bool Simm12 =
false;
2059 int ConstantVal = ConstantOffset->getSExtValue();
2066 unsigned Opcode = 0;
2067 switch (
Load->getMemoryVT().getSimpleVT().SimpleTy) {
2069 if (Simm12 && SignExtend)
2070 Opcode = RISCV::CV_LB_ri_inc;
2071 else if (Simm12 && !SignExtend)
2072 Opcode = RISCV::CV_LBU_ri_inc;
2073 else if (!Simm12 && SignExtend)
2074 Opcode = RISCV::CV_LB_rr_inc;
2076 Opcode = RISCV::CV_LBU_rr_inc;
2079 if (Simm12 && SignExtend)
2080 Opcode = RISCV::CV_LH_ri_inc;
2081 else if (Simm12 && !SignExtend)
2082 Opcode = RISCV::CV_LHU_ri_inc;
2083 else if (!Simm12 && SignExtend)
2084 Opcode = RISCV::CV_LH_rr_inc;
2086 Opcode = RISCV::CV_LHU_rr_inc;
2090 Opcode = RISCV::CV_LW_ri_inc;
2092 Opcode = RISCV::CV_LW_rr_inc;
2107 case RISCVISD::LD_RV32: {
2108 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
2117 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
2126 case RISCVISD::SD_RV32: {
2138 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2150 case RISCVISD::MQWACC:
2151 case RISCVISD::MQRWACC:
2152 case RISCVISD::WMACC:
2153 case RISCVISD::WMACCU:
2154 case RISCVISD::WMACCSU: {
2155 assert(!Subtarget->is64Bit() && Subtarget->hasStdExtP() &&
2156 "Unexpected opcode");
2159 Node->getOperand(1));
2164 case RISCVISD::MQWACC:
2165 Opc = RISCV::MQWACC;
2167 case RISCVISD::MQRWACC:
2168 Opc = RISCV::MQRWACC;
2170 case RISCVISD::WMACC:
2173 case RISCVISD::WMACCU:
2174 Opc = RISCV::WMACCU;
2176 case RISCVISD::WMACCSU:
2177 Opc = RISCV::WMACCSU;
2181 Opc,
DL, MVT::Untyped, Op0,
Node->getOperand(2),
Node->getOperand(3));
2188 case RISCVISD::ADDD:
2196 case RISCVISD::SUBD:
2197 case RISCVISD::WADDAU:
2198 case RISCVISD::WSUBAU:
2199 case RISCVISD::WADDA:
2200 case RISCVISD::WSUBA: {
2201 assert(!Subtarget->is64Bit() && Subtarget->hasStdExtP() &&
2202 "Unexpected opcode");
2209 Op0 =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2218 if (Opcode == RISCVISD::WADDAU || Opcode == RISCVISD::WSUBAU ||
2219 Opcode == RISCVISD::WADDA || Opcode == RISCVISD::WSUBA) {
2226 case RISCVISD::WADDAU:
2227 Opc = RISCV::WADDAU;
2229 case RISCVISD::WSUBAU:
2230 Opc = RISCV::WSUBAU;
2232 case RISCVISD::WADDA:
2235 case RISCVISD::WSUBA:
2239 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1Lo, Op1Hi);
2247 case RISCVISD::ADDD:
2250 case RISCVISD::SUBD:
2254 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1);
2264 unsigned IntNo =
Node->getConstantOperandVal(0);
2269 case Intrinsic::riscv_vmsgeu:
2270 case Intrinsic::riscv_vmsge: {
2273 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
2274 bool IsCmpConstant =
false;
2275 bool IsCmpMinimum =
false;
2283 IsCmpConstant =
true;
2284 CVal =
C->getSExtValue();
2285 if (CVal >= -15 && CVal <= 16) {
2286 if (!IsUnsigned || CVal != 0)
2288 IsCmpMinimum =
true;
2292 IsCmpMinimum =
true;
2295 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
2299#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2300 case RISCVVType::lmulenum: \
2301 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2302 : RISCV::PseudoVMSLT_VX_##suffix; \
2303 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
2304 : RISCV::PseudoVMSGT_VX_##suffix; \
2313#undef CASE_VMSLT_OPCODES
2319#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
2320 case RISCVVType::lmulenum: \
2321 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
2322 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
2331#undef CASE_VMNAND_VMSET_OPCODES
2342 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
2346 if (IsCmpConstant) {
2351 {Src1, Imm, VL, SEW}));
2358 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2361 {Cmp, Cmp, VL, MaskSEW}));
2364 case Intrinsic::riscv_vmsgeu_mask:
2365 case Intrinsic::riscv_vmsge_mask: {
2368 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2369 bool IsCmpConstant =
false;
2370 bool IsCmpMinimum =
false;
2378 IsCmpConstant =
true;
2379 CVal =
C->getSExtValue();
2380 if (CVal >= -15 && CVal <= 16) {
2381 if (!IsUnsigned || CVal != 0)
2383 IsCmpMinimum =
true;
2387 IsCmpMinimum =
true;
2390 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2391 VMOROpcode, VMSGTMaskOpcode;
2395#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2396 case RISCVVType::lmulenum: \
2397 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2398 : RISCV::PseudoVMSLT_VX_##suffix; \
2399 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2400 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2401 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2402 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2411#undef CASE_VMSLT_OPCODES
2417#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2418 case RISCVVType::lmulenum: \
2419 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2420 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2421 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2430#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2444 if (Mask == MaskedOff) {
2449 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2450 {Mask, MaskedOff, VL, MaskSEW}));
2457 if (Mask == MaskedOff) {
2459 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2462 {Mask, Cmp, VL, MaskSEW}));
2469 if (IsCmpConstant) {
2474 VMSGTMaskOpcode,
DL, VT,
2475 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2485 {MaskedOff, Src1, Src2, Mask,
2486 VL, SEW, PolicyOp}),
2490 {Cmp, Mask, VL, MaskSEW}));
2493 case Intrinsic::riscv_vsetvli:
2494 case Intrinsic::riscv_vsetvlimax:
2496 case Intrinsic::riscv_sf_vsettnt:
2497 case Intrinsic::riscv_sf_vsettm:
2498 case Intrinsic::riscv_sf_vsettk:
2504 unsigned IntNo =
Node->getConstantOperandVal(1);
2509 case Intrinsic::riscv_vlseg2:
2510 case Intrinsic::riscv_vlseg3:
2511 case Intrinsic::riscv_vlseg4:
2512 case Intrinsic::riscv_vlseg5:
2513 case Intrinsic::riscv_vlseg6:
2514 case Intrinsic::riscv_vlseg7:
2515 case Intrinsic::riscv_vlseg8: {
2520 case Intrinsic::riscv_vlseg2_mask:
2521 case Intrinsic::riscv_vlseg3_mask:
2522 case Intrinsic::riscv_vlseg4_mask:
2523 case Intrinsic::riscv_vlseg5_mask:
2524 case Intrinsic::riscv_vlseg6_mask:
2525 case Intrinsic::riscv_vlseg7_mask:
2526 case Intrinsic::riscv_vlseg8_mask: {
2531 case Intrinsic::riscv_vlsseg2:
2532 case Intrinsic::riscv_vlsseg3:
2533 case Intrinsic::riscv_vlsseg4:
2534 case Intrinsic::riscv_vlsseg5:
2535 case Intrinsic::riscv_vlsseg6:
2536 case Intrinsic::riscv_vlsseg7:
2537 case Intrinsic::riscv_vlsseg8: {
2542 case Intrinsic::riscv_vlsseg2_mask:
2543 case Intrinsic::riscv_vlsseg3_mask:
2544 case Intrinsic::riscv_vlsseg4_mask:
2545 case Intrinsic::riscv_vlsseg5_mask:
2546 case Intrinsic::riscv_vlsseg6_mask:
2547 case Intrinsic::riscv_vlsseg7_mask:
2548 case Intrinsic::riscv_vlsseg8_mask: {
2553 case Intrinsic::riscv_vloxseg2:
2554 case Intrinsic::riscv_vloxseg3:
2555 case Intrinsic::riscv_vloxseg4:
2556 case Intrinsic::riscv_vloxseg5:
2557 case Intrinsic::riscv_vloxseg6:
2558 case Intrinsic::riscv_vloxseg7:
2559 case Intrinsic::riscv_vloxseg8:
2563 case Intrinsic::riscv_vluxseg2:
2564 case Intrinsic::riscv_vluxseg3:
2565 case Intrinsic::riscv_vluxseg4:
2566 case Intrinsic::riscv_vluxseg5:
2567 case Intrinsic::riscv_vluxseg6:
2568 case Intrinsic::riscv_vluxseg7:
2569 case Intrinsic::riscv_vluxseg8:
2573 case Intrinsic::riscv_vloxseg2_mask:
2574 case Intrinsic::riscv_vloxseg3_mask:
2575 case Intrinsic::riscv_vloxseg4_mask:
2576 case Intrinsic::riscv_vloxseg5_mask:
2577 case Intrinsic::riscv_vloxseg6_mask:
2578 case Intrinsic::riscv_vloxseg7_mask:
2579 case Intrinsic::riscv_vloxseg8_mask:
2583 case Intrinsic::riscv_vluxseg2_mask:
2584 case Intrinsic::riscv_vluxseg3_mask:
2585 case Intrinsic::riscv_vluxseg4_mask:
2586 case Intrinsic::riscv_vluxseg5_mask:
2587 case Intrinsic::riscv_vluxseg6_mask:
2588 case Intrinsic::riscv_vluxseg7_mask:
2589 case Intrinsic::riscv_vluxseg8_mask:
2593 case Intrinsic::riscv_vlseg8ff:
2594 case Intrinsic::riscv_vlseg7ff:
2595 case Intrinsic::riscv_vlseg6ff:
2596 case Intrinsic::riscv_vlseg5ff:
2597 case Intrinsic::riscv_vlseg4ff:
2598 case Intrinsic::riscv_vlseg3ff:
2599 case Intrinsic::riscv_vlseg2ff: {
2603 case Intrinsic::riscv_vlseg8ff_mask:
2604 case Intrinsic::riscv_vlseg7ff_mask:
2605 case Intrinsic::riscv_vlseg6ff_mask:
2606 case Intrinsic::riscv_vlseg5ff_mask:
2607 case Intrinsic::riscv_vlseg4ff_mask:
2608 case Intrinsic::riscv_vlseg3ff_mask:
2609 case Intrinsic::riscv_vlseg2ff_mask: {
2613 case Intrinsic::riscv_vloxei:
2614 case Intrinsic::riscv_vloxei_mask:
2615 case Intrinsic::riscv_vluxei:
2616 case Intrinsic::riscv_vluxei_mask: {
2617 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2618 IntNo == Intrinsic::riscv_vluxei_mask;
2619 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2620 IntNo == Intrinsic::riscv_vloxei_mask;
2622 MVT VT =
Node->getSimpleValueType(0);
2635 "Element count mismatch");
2640 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2642 "index values when XLEN=32");
2645 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2646 static_cast<unsigned>(IndexLMUL));
2655 case Intrinsic::riscv_vlm:
2656 case Intrinsic::riscv_vle:
2657 case Intrinsic::riscv_vle_mask:
2658 case Intrinsic::riscv_vlse:
2659 case Intrinsic::riscv_vlse_mask: {
2660 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2661 IntNo == Intrinsic::riscv_vlse_mask;
2663 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2665 MVT VT =
Node->getSimpleValueType(0);
2674 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2677 if (HasPassthruOperand)
2683 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2691 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2692 static_cast<unsigned>(LMUL));
2701 case Intrinsic::riscv_vleff:
2702 case Intrinsic::riscv_vleff_mask: {
2703 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2705 MVT VT =
Node->getSimpleValueType(0);
2717 RISCV::getVLEPseudo(IsMasked,
false,
true,
2718 Log2SEW,
static_cast<unsigned>(LMUL));
2726 case Intrinsic::riscv_nds_vln:
2727 case Intrinsic::riscv_nds_vln_mask:
2728 case Intrinsic::riscv_nds_vlnu:
2729 case Intrinsic::riscv_nds_vlnu_mask: {
2730 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2731 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2732 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2733 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2735 MVT VT =
Node->getSimpleValueType(0);
2747 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2761 unsigned IntNo =
Node->getConstantOperandVal(1);
2763 case Intrinsic::riscv_vsseg2:
2764 case Intrinsic::riscv_vsseg3:
2765 case Intrinsic::riscv_vsseg4:
2766 case Intrinsic::riscv_vsseg5:
2767 case Intrinsic::riscv_vsseg6:
2768 case Intrinsic::riscv_vsseg7:
2769 case Intrinsic::riscv_vsseg8: {
2774 case Intrinsic::riscv_vsseg2_mask:
2775 case Intrinsic::riscv_vsseg3_mask:
2776 case Intrinsic::riscv_vsseg4_mask:
2777 case Intrinsic::riscv_vsseg5_mask:
2778 case Intrinsic::riscv_vsseg6_mask:
2779 case Intrinsic::riscv_vsseg7_mask:
2780 case Intrinsic::riscv_vsseg8_mask: {
2785 case Intrinsic::riscv_vssseg2:
2786 case Intrinsic::riscv_vssseg3:
2787 case Intrinsic::riscv_vssseg4:
2788 case Intrinsic::riscv_vssseg5:
2789 case Intrinsic::riscv_vssseg6:
2790 case Intrinsic::riscv_vssseg7:
2791 case Intrinsic::riscv_vssseg8: {
2796 case Intrinsic::riscv_vssseg2_mask:
2797 case Intrinsic::riscv_vssseg3_mask:
2798 case Intrinsic::riscv_vssseg4_mask:
2799 case Intrinsic::riscv_vssseg5_mask:
2800 case Intrinsic::riscv_vssseg6_mask:
2801 case Intrinsic::riscv_vssseg7_mask:
2802 case Intrinsic::riscv_vssseg8_mask: {
2807 case Intrinsic::riscv_vsoxseg2:
2808 case Intrinsic::riscv_vsoxseg3:
2809 case Intrinsic::riscv_vsoxseg4:
2810 case Intrinsic::riscv_vsoxseg5:
2811 case Intrinsic::riscv_vsoxseg6:
2812 case Intrinsic::riscv_vsoxseg7:
2813 case Intrinsic::riscv_vsoxseg8:
2817 case Intrinsic::riscv_vsuxseg2:
2818 case Intrinsic::riscv_vsuxseg3:
2819 case Intrinsic::riscv_vsuxseg4:
2820 case Intrinsic::riscv_vsuxseg5:
2821 case Intrinsic::riscv_vsuxseg6:
2822 case Intrinsic::riscv_vsuxseg7:
2823 case Intrinsic::riscv_vsuxseg8:
2827 case Intrinsic::riscv_vsoxseg2_mask:
2828 case Intrinsic::riscv_vsoxseg3_mask:
2829 case Intrinsic::riscv_vsoxseg4_mask:
2830 case Intrinsic::riscv_vsoxseg5_mask:
2831 case Intrinsic::riscv_vsoxseg6_mask:
2832 case Intrinsic::riscv_vsoxseg7_mask:
2833 case Intrinsic::riscv_vsoxseg8_mask:
2837 case Intrinsic::riscv_vsuxseg2_mask:
2838 case Intrinsic::riscv_vsuxseg3_mask:
2839 case Intrinsic::riscv_vsuxseg4_mask:
2840 case Intrinsic::riscv_vsuxseg5_mask:
2841 case Intrinsic::riscv_vsuxseg6_mask:
2842 case Intrinsic::riscv_vsuxseg7_mask:
2843 case Intrinsic::riscv_vsuxseg8_mask:
2847 case Intrinsic::riscv_vsoxei:
2848 case Intrinsic::riscv_vsoxei_mask:
2849 case Intrinsic::riscv_vsuxei:
2850 case Intrinsic::riscv_vsuxei_mask: {
2851 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2852 IntNo == Intrinsic::riscv_vsuxei_mask;
2853 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2854 IntNo == Intrinsic::riscv_vsoxei_mask;
2856 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2869 "Element count mismatch");
2874 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2876 "index values when XLEN=32");
2879 IsMasked, IsOrdered, IndexLog2EEW,
2880 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2889 case Intrinsic::riscv_vsm:
2890 case Intrinsic::riscv_vse:
2891 case Intrinsic::riscv_vse_mask:
2892 case Intrinsic::riscv_vsse:
2893 case Intrinsic::riscv_vsse_mask: {
2894 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2895 IntNo == Intrinsic::riscv_vsse_mask;
2897 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2899 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2911 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2919 case Intrinsic::riscv_sf_vc_x_se:
2920 case Intrinsic::riscv_sf_vc_i_se:
2923 case Intrinsic::riscv_sf_vlte8:
2924 case Intrinsic::riscv_sf_vlte16:
2925 case Intrinsic::riscv_sf_vlte32:
2926 case Intrinsic::riscv_sf_vlte64: {
2928 unsigned PseudoInst;
2930 case Intrinsic::riscv_sf_vlte8:
2931 PseudoInst = RISCV::PseudoSF_VLTE8;
2934 case Intrinsic::riscv_sf_vlte16:
2935 PseudoInst = RISCV::PseudoSF_VLTE16;
2938 case Intrinsic::riscv_sf_vlte32:
2939 PseudoInst = RISCV::PseudoSF_VLTE32;
2942 case Intrinsic::riscv_sf_vlte64:
2943 PseudoInst = RISCV::PseudoSF_VLTE64;
2951 Node->getOperand(3),
2952 Node->getOperand(4),
2955 Node->getOperand(0)};
2959 CurDAG->setNodeMemRefs(TileLoad,
2965 case Intrinsic::riscv_sf_mm_s_s:
2966 case Intrinsic::riscv_sf_mm_s_u:
2967 case Intrinsic::riscv_sf_mm_u_s:
2968 case Intrinsic::riscv_sf_mm_u_u:
2969 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2970 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2971 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2972 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2973 case Intrinsic::riscv_sf_mm_f_f: {
2974 bool HasFRM =
false;
2975 unsigned PseudoInst;
2977 case Intrinsic::riscv_sf_mm_s_s:
2978 PseudoInst = RISCV::PseudoSF_MM_S_S;
2980 case Intrinsic::riscv_sf_mm_s_u:
2981 PseudoInst = RISCV::PseudoSF_MM_S_U;
2983 case Intrinsic::riscv_sf_mm_u_s:
2984 PseudoInst = RISCV::PseudoSF_MM_U_S;
2986 case Intrinsic::riscv_sf_mm_u_u:
2987 PseudoInst = RISCV::PseudoSF_MM_U_U;
2989 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2990 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
2993 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2994 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
2997 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2998 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
3001 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
3002 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
3005 case Intrinsic::riscv_sf_mm_f_f:
3006 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
3007 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
3009 PseudoInst = RISCV::PseudoSF_MM_F_F;
3013 uint64_t TileNum =
Node->getConstantOperandVal(2);
3025 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
3035 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
3044 case Intrinsic::riscv_sf_vtzero_t: {
3045 uint64_t TileNum =
Node->getConstantOperandVal(2);
3051 auto *NewNode =
CurDAG->getMachineNode(
3052 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
3053 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
3063 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3072 if (Subtarget->hasStdExtP()) {
3074 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
3075 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
3077 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
3078 SrcVT == MVT::v2i32)) ||
3079 (SrcVT == MVT::i64 &&
3080 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
3081 if (Is32BitCast || Is64BitCast) {
3090 if (!Subtarget->hasStdExtP())
3093 bool IsDoubleWide = Subtarget->isPExtPackedDoubleType(VT);
3095 if (ConstNode->isZero()) {
3096 MCPhysReg X0Reg = IsDoubleWide ? RISCV::X0_Pair : RISCV::X0;
3104 APInt Val = ConstNode->getAPIntValue().
trunc(EltSize);
3109 RISCV::ADDI,
DL, VT,
CurDAG->getRegister(RISCV::X0, VT),
3110 CurDAG->getAllOnesConstant(
DL, XLenVT,
true));
3117 Val = Val.
trunc(16);
3126 Opc = IsDoubleWide ? RISCV::PLI_DB : RISCV::PLI_B;
3128 Opc = IsDoubleWide ? RISCV::PLI_DH : RISCV::PLI_H;
3129 }
else if (!IsDoubleWide && EltSize == 32 &&
isInt<10>(
Imm)) {
3132 Opc = IsDoubleWide ? RISCV::PLUI_DH : RISCV::PLUI_H;
3135 Opc = RISCV::PLUI_W;
3150 if (Subtarget->hasStdExtP()) {
3151 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3152 if ((VT == MVT::v2i32 && SrcVT == MVT::i64) ||
3153 (VT == MVT::v4i8 && SrcVT == MVT::i32)) {
3161 case RISCVISD::TUPLE_INSERT: {
3165 auto Idx =
Node->getConstantOperandVal(2);
3169 MVT SubVecContainerVT = SubVecVT;
3172 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
3174 [[maybe_unused]]
bool ExactlyVecRegSized =
3176 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
3178 .getKnownMinValue()));
3179 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
3181 MVT ContainerVT = VT;
3183 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3185 const auto *
TRI = Subtarget->getRegisterInfo();
3187 std::tie(SubRegIdx, Idx) =
3189 ContainerVT, SubVecContainerVT, Idx,
TRI);
3199 [[maybe_unused]]
bool IsSubVecPartReg =
3203 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
3205 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
3206 "the subvector is smaller than a full-sized register");
3210 if (SubRegIdx == RISCV::NoSubRegister) {
3211 unsigned InRegClassID =
3215 "Unexpected subvector extraction");
3217 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
3223 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
3228 case RISCVISD::TUPLE_EXTRACT: {
3229 if (Subtarget->hasStdExtP())
3233 auto Idx =
Node->getConstantOperandVal(1);
3234 MVT InVT = V.getSimpleValueType();
3239 MVT SubVecContainerVT = VT;
3243 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3246 InVT =
TLI.getContainerForFixedLengthVector(InVT);
3248 const auto *
TRI = Subtarget->getRegisterInfo();
3250 std::tie(SubRegIdx, Idx) =
3252 InVT, SubVecContainerVT, Idx,
TRI);
3262 if (SubRegIdx == RISCV::NoSubRegister) {
3266 "Unexpected subvector extraction");
3269 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
3274 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
3278 case RISCVISD::VMV_S_X_VL:
3279 case RISCVISD::VFMV_S_F_VL:
3280 case RISCVISD::VMV_V_X_VL:
3281 case RISCVISD::VFMV_V_F_VL: {
3283 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
3284 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
3285 if (!
Node->getOperand(0).isUndef())
3291 if (!Ld || Ld->isIndexed())
3293 EVT MemVT = Ld->getMemoryVT();
3319 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
3323 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
3329 Operands.append({VL, SEW, PolicyOp, Ld->getChain()});
3333 false, IsStrided,
false,
3334 Log2SEW,
static_cast<unsigned>(LMUL));
3340 CurDAG->setNodeMemRefs(
Load, {Ld->getMemOperand()});
3345 case RISCVISD::LPAD_CALL:
3346 case RISCVISD::LPAD_CALL_INDIRECT: {
3347 bool IsIndirect = Opcode == RISCVISD::LPAD_CALL_INDIRECT;
3348 unsigned PseudoOpc = IsIndirect ? RISCV::PseudoCALLIndirectLpadAlign
3349 : RISCV::PseudoCALLLpadAlign;
3355 "in unsigned 20-bits");
3363 Ops.push_back(
Node->getOperand(1));
3364 Ops.push_back(
CurDAG->getTargetConstant(LpadLabel,
DL, XLenVT));
3367 bool HasGlue =
Node->getGluedNode() !=
nullptr;
3368 unsigned RegOperandsEnd = HasGlue ?
NumOps - 1 :
NumOps;
3369 for (
unsigned I = 2;
I != RegOperandsEnd; ++
I)
3370 Ops.push_back(
Node->getOperand(
I));
3372 Ops.push_back(
Node->getOperand(0));
3383 if (Subtarget->hasVendorXMIPSCBOP())
3386 unsigned Locality =
Node->getConstantOperandVal(3);
3394 int NontemporalLevel = 0;
3397 NontemporalLevel = 3;
3400 NontemporalLevel = 1;
3403 NontemporalLevel = 0;
3409 if (NontemporalLevel & 0b1)
3411 if (NontemporalLevel & 0b10)