1099 if (
Node->isMachineOpcode()) {
1101 Node->setNodeId(-1);
1107 unsigned Opcode =
Node->getOpcode();
1108 MVT XLenVT = Subtarget->getXLenVT();
1110 MVT VT =
Node->getSimpleValueType(0);
1112 bool HasBitTest = Subtarget->hasBEXTILike();
1116 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT");
1118 if (ConstNode->isZero()) {
1120 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1124 int64_t Imm = ConstNode->getSExtValue();
1146 Imm = ((
uint64_t)Imm << 32) | (Imm & 0xFFFFFFFF);
1155 bool Is64Bit = Subtarget->is64Bit();
1156 bool HasZdinx = Subtarget->hasStdExtZdinx();
1158 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1163 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1164 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1166 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1177 assert(Subtarget->hasStdExtZfbfmin());
1178 Opc = RISCV::FMV_H_X;
1181 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1184 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1189 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1193 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1198 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1200 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT, Imm).getNode();
1201 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1203 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT, Imm).getNode();
1204 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1205 Res =
CurDAG->getMachineNode(
1213 Opc = RISCV::FSGNJN_D;
1215 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1223 case RISCVISD::BuildGPRPair:
1224 case RISCVISD::BuildPairF64: {
1225 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1228 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::BuildGPRPair) &&
1229 "BuildPairF64 only handled here on rv32i_zdinx");
1236 case RISCVISD::SplitGPRPair:
1237 case RISCVISD::SplitF64: {
1238 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1239 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::SplitGPRPair) &&
1240 "SplitF64 only handled here on rv32i_zdinx");
1244 Node->getValueType(0),
1245 Node->getOperand(0));
1251 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1259 assert(Opcode != RISCVISD::SplitGPRPair &&
1260 "SplitGPRPair should already be handled");
1262 if (!Subtarget->hasStdExtZfa())
1264 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1265 "Unexpected subtarget");
1270 Node->getOperand(0));
1275 Node->getOperand(0));
1290 unsigned ShAmt = N1C->getZExtValue();
1294 unsigned XLen = Subtarget->getXLen();
1297 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1302 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1305 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1309 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1310 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1321 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1324 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1338 unsigned ShAmt = N1C->getZExtValue();
1344 unsigned XLen = Subtarget->getXLen();
1347 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1350 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1353 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1370 if (ShAmt >= TrailingOnes)
1373 if (TrailingOnes == 32) {
1375 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1386 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1388 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1394 const unsigned Msb = TrailingOnes - 1;
1395 const unsigned Lsb = ShAmt;
1399 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1402 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1405 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1430 unsigned ShAmt = N1C->getZExtValue();
1434 if (ExtSize >= 32 || ShAmt >= ExtSize)
1436 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1439 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1442 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1461 unsigned ShAmt = ShAmtC->getZExtValue();
1462 unsigned XLen = Subtarget->getXLen();
1465 if (ExtSize >= 32 || ShAmt >= XLen - ExtSize)
1468 unsigned LShAmt = XLen - ExtSize - ShAmt;
1471 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1474 CurDAG->getTargetConstant(XLen - ExtSize,
DL, VT));
1501 unsigned C2 =
C->getZExtValue();
1502 unsigned XLen = Subtarget->getXLen();
1503 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1511 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1523 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1533 if (C2 + 32 == Leading) {
1535 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1545 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1549 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1550 CurDAG->getTargetConstant(31,
DL, VT));
1552 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1553 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1566 const unsigned Lsb = C2;
1572 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1576 Skip |= HasBitTest && Leading == XLen - 1;
1577 if (OneUseOrZExtW && !Skip) {
1579 RISCV::SLLI,
DL, VT,
X,
1580 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1583 CurDAG->getTargetConstant(Leading,
DL, VT));
1595 if (C2 + Leading < XLen &&
1598 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1600 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1601 CurDAG->getTargetConstant(C2,
DL, VT));
1614 const unsigned Msb = XLen - Leading - 1;
1615 const unsigned Lsb = C2;
1619 if (OneUseOrZExtW && !IsCANDI) {
1621 if (Subtarget->hasStdExtZbkb() && C1 == 0xff00 && C2 == 8) {
1623 RISCV::PACKH,
DL, VT,
1624 CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT()),
X);
1630 RISCV::SLLI,
DL, VT,
X,
1631 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1634 CurDAG->getTargetConstant(Leading,
DL, VT));
1646 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1648 unsigned SrliOpc = RISCV::SRLI;
1652 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1653 SrliOpc = RISCV::SRLIW;
1654 X =
X.getOperand(0);
1658 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1661 CurDAG->getTargetConstant(Trailing,
DL, VT));
1666 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1667 OneUseOrZExtW && !IsCANDI) {
1669 RISCV::SRLIW,
DL, VT,
X,
1670 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1673 CurDAG->getTargetConstant(Trailing,
DL, VT));
1678 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1679 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1681 RISCV::SRLI,
DL, VT,
X,
1682 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1684 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1685 CurDAG->getTargetConstant(Trailing,
DL, VT));
1696 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1698 RISCV::SRLI,
DL, VT,
X,
1699 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1702 CurDAG->getTargetConstant(Trailing,
DL, VT));
1707 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1709 RISCV::SRLIW,
DL, VT,
X,
1710 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1713 CurDAG->getTargetConstant(Trailing,
DL, VT));
1719 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1720 Subtarget->hasStdExtZba()) {
1722 RISCV::SRLI,
DL, VT,
X,
1723 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1725 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1726 CurDAG->getTargetConstant(Trailing,
DL, VT));
1733 const uint64_t C1 = N1C->getZExtValue();
1738 unsigned XLen = Subtarget->getXLen();
1739 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1744 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1747 X.getConstantOperandVal(1) == 32;
1754 RISCV::SRAI,
DL, VT,
X,
1755 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1758 CurDAG->getTargetConstant(Leading,
DL, VT));
1770 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1773 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1776 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1779 CurDAG->getTargetConstant(Trailing,
DL, VT));
1792 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1793 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1813 if (!N1C || !N1C->hasOneUse())
1834 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1836 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1841 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1843 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1850 unsigned XLen = Subtarget->getXLen();
1856 unsigned ConstantShift = XLen - LeadingZeros;
1860 uint64_t ShiftedC1 = C1 << ConstantShift;
1869 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1877 case RISCVISD::WMULSU:
1878 case RISCVISD::WADDU:
1879 case RISCVISD::WSUBU: {
1880 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1881 "Unexpected opcode");
1884 switch (
Node->getOpcode()) {
1893 case RISCVISD::WMULSU:
1894 Opc = RISCV::WMULSU;
1896 case RISCVISD::WADDU:
1899 case RISCVISD::WSUBU:
1905 Opc,
DL, MVT::Untyped,
Node->getOperand(0),
Node->getOperand(1));
1913 case RISCVISD::WSLL:
1914 case RISCVISD::WSLA: {
1916 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1917 "Unexpected opcode");
1919 bool IsSigned =
Node->getOpcode() == RISCVISD::WSLA;
1926 if (ShAmtC && ShAmtC->getZExtValue() < 64) {
1927 Opc = IsSigned ? RISCV::WSLAI : RISCV::WSLLI;
1928 ShAmt =
CurDAG->getTargetConstant(ShAmtC->getZExtValue(),
DL, XLenVT);
1930 Opc = IsSigned ? RISCV::WSLA : RISCV::WSLL;
1934 Node->getOperand(0), ShAmt);
1946 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1956 bool Simm12 =
false;
1957 bool SignExtend = Load->getExtensionType() ==
ISD::SEXTLOAD;
1960 int ConstantVal = ConstantOffset->getSExtValue();
1967 unsigned Opcode = 0;
1968 switch (Load->getMemoryVT().getSimpleVT().SimpleTy) {
1970 if (Simm12 && SignExtend)
1971 Opcode = RISCV::CV_LB_ri_inc;
1972 else if (Simm12 && !SignExtend)
1973 Opcode = RISCV::CV_LBU_ri_inc;
1974 else if (!Simm12 && SignExtend)
1975 Opcode = RISCV::CV_LB_rr_inc;
1977 Opcode = RISCV::CV_LBU_rr_inc;
1980 if (Simm12 && SignExtend)
1981 Opcode = RISCV::CV_LH_ri_inc;
1982 else if (Simm12 && !SignExtend)
1983 Opcode = RISCV::CV_LHU_ri_inc;
1984 else if (!Simm12 && SignExtend)
1985 Opcode = RISCV::CV_LH_rr_inc;
1987 Opcode = RISCV::CV_LHU_rr_inc;
1991 Opcode = RISCV::CV_LW_ri_inc;
1993 Opcode = RISCV::CV_LW_rr_inc;
2008 case RISCVISD::LD_RV32: {
2009 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
2018 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
2027 case RISCVISD::SD_RV32: {
2039 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2051 case RISCVISD::ADDD:
2059 case RISCVISD::SUBD:
2060 case RISCVISD::PPAIRE_DB:
2061 case RISCVISD::WADDAU:
2062 case RISCVISD::WSUBAU: {
2063 assert(!Subtarget->is64Bit() &&
"Unexpected opcode");
2065 (
Node->getOpcode() != RISCVISD::PPAIRE_DB || Subtarget->hasStdExtP()) &&
2066 "Unexpected opcode");
2073 Op0 =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2082 if (Opcode == RISCVISD::WADDAU || Opcode == RISCVISD::WSUBAU) {
2085 unsigned Opc = Opcode == RISCVISD::WADDAU ? RISCV::WADDAU : RISCV::WSUBAU;
2086 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1Lo, Op1Hi);
2094 case RISCVISD::ADDD:
2097 case RISCVISD::SUBD:
2100 case RISCVISD::PPAIRE_DB:
2101 Opc = RISCV::PPAIRE_DB;
2104 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1);
2114 unsigned IntNo =
Node->getConstantOperandVal(0);
2119 case Intrinsic::riscv_vmsgeu:
2120 case Intrinsic::riscv_vmsge: {
2123 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
2124 bool IsCmpConstant =
false;
2125 bool IsCmpMinimum =
false;
2133 IsCmpConstant =
true;
2134 CVal =
C->getSExtValue();
2135 if (CVal >= -15 && CVal <= 16) {
2136 if (!IsUnsigned || CVal != 0)
2138 IsCmpMinimum =
true;
2142 IsCmpMinimum =
true;
2145 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
2149#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2150 case RISCVVType::lmulenum: \
2151 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2152 : RISCV::PseudoVMSLT_VX_##suffix; \
2153 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
2154 : RISCV::PseudoVMSGT_VX_##suffix; \
2163#undef CASE_VMSLT_OPCODES
2169#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
2170 case RISCVVType::lmulenum: \
2171 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
2172 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
2181#undef CASE_VMNAND_VMSET_OPCODES
2192 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
2196 if (IsCmpConstant) {
2201 {Src1, Imm, VL, SEW}));
2208 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2211 {Cmp, Cmp, VL, MaskSEW}));
2214 case Intrinsic::riscv_vmsgeu_mask:
2215 case Intrinsic::riscv_vmsge_mask: {
2218 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2219 bool IsCmpConstant =
false;
2220 bool IsCmpMinimum =
false;
2228 IsCmpConstant =
true;
2229 CVal =
C->getSExtValue();
2230 if (CVal >= -15 && CVal <= 16) {
2231 if (!IsUnsigned || CVal != 0)
2233 IsCmpMinimum =
true;
2237 IsCmpMinimum =
true;
2240 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2241 VMOROpcode, VMSGTMaskOpcode;
2245#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2246 case RISCVVType::lmulenum: \
2247 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2248 : RISCV::PseudoVMSLT_VX_##suffix; \
2249 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2250 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2251 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2252 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2261#undef CASE_VMSLT_OPCODES
2267#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2268 case RISCVVType::lmulenum: \
2269 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2270 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2271 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2280#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2294 if (Mask == MaskedOff) {
2299 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2300 {Mask, MaskedOff, VL, MaskSEW}));
2307 if (Mask == MaskedOff) {
2309 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2312 {Mask, Cmp, VL, MaskSEW}));
2319 if (IsCmpConstant) {
2324 VMSGTMaskOpcode,
DL, VT,
2325 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2335 {MaskedOff, Src1, Src2, Mask,
2336 VL, SEW, PolicyOp}),
2340 {Cmp, Mask, VL, MaskSEW}));
2343 case Intrinsic::riscv_vsetvli:
2344 case Intrinsic::riscv_vsetvlimax:
2346 case Intrinsic::riscv_sf_vsettnt:
2347 case Intrinsic::riscv_sf_vsettm:
2348 case Intrinsic::riscv_sf_vsettk:
2354 unsigned IntNo =
Node->getConstantOperandVal(1);
2359 case Intrinsic::riscv_vlseg2:
2360 case Intrinsic::riscv_vlseg3:
2361 case Intrinsic::riscv_vlseg4:
2362 case Intrinsic::riscv_vlseg5:
2363 case Intrinsic::riscv_vlseg6:
2364 case Intrinsic::riscv_vlseg7:
2365 case Intrinsic::riscv_vlseg8: {
2370 case Intrinsic::riscv_vlseg2_mask:
2371 case Intrinsic::riscv_vlseg3_mask:
2372 case Intrinsic::riscv_vlseg4_mask:
2373 case Intrinsic::riscv_vlseg5_mask:
2374 case Intrinsic::riscv_vlseg6_mask:
2375 case Intrinsic::riscv_vlseg7_mask:
2376 case Intrinsic::riscv_vlseg8_mask: {
2381 case Intrinsic::riscv_vlsseg2:
2382 case Intrinsic::riscv_vlsseg3:
2383 case Intrinsic::riscv_vlsseg4:
2384 case Intrinsic::riscv_vlsseg5:
2385 case Intrinsic::riscv_vlsseg6:
2386 case Intrinsic::riscv_vlsseg7:
2387 case Intrinsic::riscv_vlsseg8: {
2392 case Intrinsic::riscv_vlsseg2_mask:
2393 case Intrinsic::riscv_vlsseg3_mask:
2394 case Intrinsic::riscv_vlsseg4_mask:
2395 case Intrinsic::riscv_vlsseg5_mask:
2396 case Intrinsic::riscv_vlsseg6_mask:
2397 case Intrinsic::riscv_vlsseg7_mask:
2398 case Intrinsic::riscv_vlsseg8_mask: {
2403 case Intrinsic::riscv_vloxseg2:
2404 case Intrinsic::riscv_vloxseg3:
2405 case Intrinsic::riscv_vloxseg4:
2406 case Intrinsic::riscv_vloxseg5:
2407 case Intrinsic::riscv_vloxseg6:
2408 case Intrinsic::riscv_vloxseg7:
2409 case Intrinsic::riscv_vloxseg8:
2413 case Intrinsic::riscv_vluxseg2:
2414 case Intrinsic::riscv_vluxseg3:
2415 case Intrinsic::riscv_vluxseg4:
2416 case Intrinsic::riscv_vluxseg5:
2417 case Intrinsic::riscv_vluxseg6:
2418 case Intrinsic::riscv_vluxseg7:
2419 case Intrinsic::riscv_vluxseg8:
2423 case Intrinsic::riscv_vloxseg2_mask:
2424 case Intrinsic::riscv_vloxseg3_mask:
2425 case Intrinsic::riscv_vloxseg4_mask:
2426 case Intrinsic::riscv_vloxseg5_mask:
2427 case Intrinsic::riscv_vloxseg6_mask:
2428 case Intrinsic::riscv_vloxseg7_mask:
2429 case Intrinsic::riscv_vloxseg8_mask:
2433 case Intrinsic::riscv_vluxseg2_mask:
2434 case Intrinsic::riscv_vluxseg3_mask:
2435 case Intrinsic::riscv_vluxseg4_mask:
2436 case Intrinsic::riscv_vluxseg5_mask:
2437 case Intrinsic::riscv_vluxseg6_mask:
2438 case Intrinsic::riscv_vluxseg7_mask:
2439 case Intrinsic::riscv_vluxseg8_mask:
2443 case Intrinsic::riscv_vlseg8ff:
2444 case Intrinsic::riscv_vlseg7ff:
2445 case Intrinsic::riscv_vlseg6ff:
2446 case Intrinsic::riscv_vlseg5ff:
2447 case Intrinsic::riscv_vlseg4ff:
2448 case Intrinsic::riscv_vlseg3ff:
2449 case Intrinsic::riscv_vlseg2ff: {
2453 case Intrinsic::riscv_vlseg8ff_mask:
2454 case Intrinsic::riscv_vlseg7ff_mask:
2455 case Intrinsic::riscv_vlseg6ff_mask:
2456 case Intrinsic::riscv_vlseg5ff_mask:
2457 case Intrinsic::riscv_vlseg4ff_mask:
2458 case Intrinsic::riscv_vlseg3ff_mask:
2459 case Intrinsic::riscv_vlseg2ff_mask: {
2463 case Intrinsic::riscv_vloxei:
2464 case Intrinsic::riscv_vloxei_mask:
2465 case Intrinsic::riscv_vluxei:
2466 case Intrinsic::riscv_vluxei_mask: {
2467 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2468 IntNo == Intrinsic::riscv_vluxei_mask;
2469 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2470 IntNo == Intrinsic::riscv_vloxei_mask;
2472 MVT VT =
Node->getSimpleValueType(0);
2485 "Element count mismatch");
2490 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2492 "index values when XLEN=32");
2495 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2496 static_cast<unsigned>(IndexLMUL));
2498 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2505 case Intrinsic::riscv_vlm:
2506 case Intrinsic::riscv_vle:
2507 case Intrinsic::riscv_vle_mask:
2508 case Intrinsic::riscv_vlse:
2509 case Intrinsic::riscv_vlse_mask: {
2510 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2511 IntNo == Intrinsic::riscv_vlse_mask;
2513 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2515 MVT VT =
Node->getSimpleValueType(0);
2524 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2527 if (HasPassthruOperand)
2533 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2541 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2542 static_cast<unsigned>(LMUL));
2544 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2551 case Intrinsic::riscv_vleff:
2552 case Intrinsic::riscv_vleff_mask: {
2553 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2555 MVT VT =
Node->getSimpleValueType(0);
2567 RISCV::getVLEPseudo(IsMasked,
false,
true,
2568 Log2SEW,
static_cast<unsigned>(LMUL));
2570 P->Pseudo,
DL,
Node->getVTList(), Operands);
2576 case Intrinsic::riscv_nds_vln:
2577 case Intrinsic::riscv_nds_vln_mask:
2578 case Intrinsic::riscv_nds_vlnu:
2579 case Intrinsic::riscv_nds_vlnu_mask: {
2580 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2581 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2582 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2583 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2585 MVT VT =
Node->getSimpleValueType(0);
2597 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2599 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2602 CurDAG->setNodeMemRefs(Load, {
MemOp->getMemOperand()});
2611 unsigned IntNo =
Node->getConstantOperandVal(1);
2613 case Intrinsic::riscv_vsseg2:
2614 case Intrinsic::riscv_vsseg3:
2615 case Intrinsic::riscv_vsseg4:
2616 case Intrinsic::riscv_vsseg5:
2617 case Intrinsic::riscv_vsseg6:
2618 case Intrinsic::riscv_vsseg7:
2619 case Intrinsic::riscv_vsseg8: {
2624 case Intrinsic::riscv_vsseg2_mask:
2625 case Intrinsic::riscv_vsseg3_mask:
2626 case Intrinsic::riscv_vsseg4_mask:
2627 case Intrinsic::riscv_vsseg5_mask:
2628 case Intrinsic::riscv_vsseg6_mask:
2629 case Intrinsic::riscv_vsseg7_mask:
2630 case Intrinsic::riscv_vsseg8_mask: {
2635 case Intrinsic::riscv_vssseg2:
2636 case Intrinsic::riscv_vssseg3:
2637 case Intrinsic::riscv_vssseg4:
2638 case Intrinsic::riscv_vssseg5:
2639 case Intrinsic::riscv_vssseg6:
2640 case Intrinsic::riscv_vssseg7:
2641 case Intrinsic::riscv_vssseg8: {
2646 case Intrinsic::riscv_vssseg2_mask:
2647 case Intrinsic::riscv_vssseg3_mask:
2648 case Intrinsic::riscv_vssseg4_mask:
2649 case Intrinsic::riscv_vssseg5_mask:
2650 case Intrinsic::riscv_vssseg6_mask:
2651 case Intrinsic::riscv_vssseg7_mask:
2652 case Intrinsic::riscv_vssseg8_mask: {
2657 case Intrinsic::riscv_vsoxseg2:
2658 case Intrinsic::riscv_vsoxseg3:
2659 case Intrinsic::riscv_vsoxseg4:
2660 case Intrinsic::riscv_vsoxseg5:
2661 case Intrinsic::riscv_vsoxseg6:
2662 case Intrinsic::riscv_vsoxseg7:
2663 case Intrinsic::riscv_vsoxseg8:
2667 case Intrinsic::riscv_vsuxseg2:
2668 case Intrinsic::riscv_vsuxseg3:
2669 case Intrinsic::riscv_vsuxseg4:
2670 case Intrinsic::riscv_vsuxseg5:
2671 case Intrinsic::riscv_vsuxseg6:
2672 case Intrinsic::riscv_vsuxseg7:
2673 case Intrinsic::riscv_vsuxseg8:
2677 case Intrinsic::riscv_vsoxseg2_mask:
2678 case Intrinsic::riscv_vsoxseg3_mask:
2679 case Intrinsic::riscv_vsoxseg4_mask:
2680 case Intrinsic::riscv_vsoxseg5_mask:
2681 case Intrinsic::riscv_vsoxseg6_mask:
2682 case Intrinsic::riscv_vsoxseg7_mask:
2683 case Intrinsic::riscv_vsoxseg8_mask:
2687 case Intrinsic::riscv_vsuxseg2_mask:
2688 case Intrinsic::riscv_vsuxseg3_mask:
2689 case Intrinsic::riscv_vsuxseg4_mask:
2690 case Intrinsic::riscv_vsuxseg5_mask:
2691 case Intrinsic::riscv_vsuxseg6_mask:
2692 case Intrinsic::riscv_vsuxseg7_mask:
2693 case Intrinsic::riscv_vsuxseg8_mask:
2697 case Intrinsic::riscv_vsoxei:
2698 case Intrinsic::riscv_vsoxei_mask:
2699 case Intrinsic::riscv_vsuxei:
2700 case Intrinsic::riscv_vsuxei_mask: {
2701 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2702 IntNo == Intrinsic::riscv_vsuxei_mask;
2703 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2704 IntNo == Intrinsic::riscv_vsoxei_mask;
2706 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2719 "Element count mismatch");
2724 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2726 "index values when XLEN=32");
2729 IsMasked, IsOrdered, IndexLog2EEW,
2730 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2732 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2739 case Intrinsic::riscv_vsm:
2740 case Intrinsic::riscv_vse:
2741 case Intrinsic::riscv_vse_mask:
2742 case Intrinsic::riscv_vsse:
2743 case Intrinsic::riscv_vsse_mask: {
2744 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2745 IntNo == Intrinsic::riscv_vsse_mask;
2747 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2749 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2761 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2763 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2769 case Intrinsic::riscv_sf_vc_x_se:
2770 case Intrinsic::riscv_sf_vc_i_se:
2773 case Intrinsic::riscv_sf_vlte8:
2774 case Intrinsic::riscv_sf_vlte16:
2775 case Intrinsic::riscv_sf_vlte32:
2776 case Intrinsic::riscv_sf_vlte64: {
2778 unsigned PseudoInst;
2780 case Intrinsic::riscv_sf_vlte8:
2781 PseudoInst = RISCV::PseudoSF_VLTE8;
2784 case Intrinsic::riscv_sf_vlte16:
2785 PseudoInst = RISCV::PseudoSF_VLTE16;
2788 case Intrinsic::riscv_sf_vlte32:
2789 PseudoInst = RISCV::PseudoSF_VLTE32;
2792 case Intrinsic::riscv_sf_vlte64:
2793 PseudoInst = RISCV::PseudoSF_VLTE64;
2801 Node->getOperand(3),
2802 Node->getOperand(4),
2805 Node->getOperand(0)};
2808 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2809 CurDAG->setNodeMemRefs(TileLoad,
2815 case Intrinsic::riscv_sf_mm_s_s:
2816 case Intrinsic::riscv_sf_mm_s_u:
2817 case Intrinsic::riscv_sf_mm_u_s:
2818 case Intrinsic::riscv_sf_mm_u_u:
2819 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2820 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2821 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2822 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2823 case Intrinsic::riscv_sf_mm_f_f: {
2824 bool HasFRM =
false;
2825 unsigned PseudoInst;
2827 case Intrinsic::riscv_sf_mm_s_s:
2828 PseudoInst = RISCV::PseudoSF_MM_S_S;
2830 case Intrinsic::riscv_sf_mm_s_u:
2831 PseudoInst = RISCV::PseudoSF_MM_S_U;
2833 case Intrinsic::riscv_sf_mm_u_s:
2834 PseudoInst = RISCV::PseudoSF_MM_U_S;
2836 case Intrinsic::riscv_sf_mm_u_u:
2837 PseudoInst = RISCV::PseudoSF_MM_U_U;
2839 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2840 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
2843 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2844 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
2847 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2848 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
2851 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2852 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
2855 case Intrinsic::riscv_sf_mm_f_f:
2856 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
2857 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
2859 PseudoInst = RISCV::PseudoSF_MM_F_F;
2875 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
2884 Operands.append({TmOp, TnOp, TkOp,
2885 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
2889 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2894 case Intrinsic::riscv_sf_vtzero_t: {
2901 auto *NewNode =
CurDAG->getMachineNode(
2902 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
2903 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
2913 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2922 if (Subtarget->hasStdExtP()) {
2924 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
2925 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
2927 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
2928 SrcVT == MVT::v2i32)) ||
2929 (SrcVT == MVT::i64 &&
2930 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
2931 if (Is32BitCast || Is64BitCast) {
2940 if (!Subtarget->hasStdExtP())
2946 if (ConstNode->isZero()) {
2948 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
2954 APInt Val = ConstNode->getAPIntValue().
trunc(EltSize);
2958 Val = Val.
trunc(16);
2969 Opc = EltSize == 32 ? RISCV::PLI_W : RISCV::PLI_H;
2971 Opc = RISCV::PLUI_H;
2974 Opc = RISCV::PLUI_W;
2980 Opc,
DL, VT,
CurDAG->getSignedTargetConstant(Imm,
DL, XLenVT));
2988 if (Subtarget->hasStdExtP()) {
2989 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2990 if ((VT == MVT::v2i32 && SrcVT == MVT::i64) ||
2991 (VT == MVT::v4i8 && SrcVT == MVT::i32)) {
2999 case RISCVISD::TUPLE_INSERT: {
3003 auto Idx =
Node->getConstantOperandVal(2);
3007 MVT SubVecContainerVT = SubVecVT;
3010 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
3012 [[maybe_unused]]
bool ExactlyVecRegSized =
3014 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
3016 .getKnownMinValue()));
3017 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
3019 MVT ContainerVT = VT;
3021 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3023 const auto *
TRI = Subtarget->getRegisterInfo();
3025 std::tie(SubRegIdx, Idx) =
3027 ContainerVT, SubVecContainerVT, Idx,
TRI);
3037 [[maybe_unused]]
bool IsSubVecPartReg =
3041 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
3043 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
3044 "the subvector is smaller than a full-sized register");
3048 if (SubRegIdx == RISCV::NoSubRegister) {
3049 unsigned InRegClassID =
3053 "Unexpected subvector extraction");
3055 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
3061 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
3066 case RISCVISD::TUPLE_EXTRACT: {
3068 auto Idx =
Node->getConstantOperandVal(1);
3069 MVT InVT = V.getSimpleValueType();
3073 MVT SubVecContainerVT = VT;
3077 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3080 InVT =
TLI.getContainerForFixedLengthVector(InVT);
3082 const auto *
TRI = Subtarget->getRegisterInfo();
3084 std::tie(SubRegIdx, Idx) =
3086 InVT, SubVecContainerVT, Idx,
TRI);
3096 if (SubRegIdx == RISCV::NoSubRegister) {
3100 "Unexpected subvector extraction");
3103 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
3108 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
3112 case RISCVISD::VMV_S_X_VL:
3113 case RISCVISD::VFMV_S_F_VL:
3114 case RISCVISD::VMV_V_X_VL:
3115 case RISCVISD::VFMV_V_F_VL: {
3117 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
3118 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
3119 if (!
Node->getOperand(0).isUndef())
3125 if (!Ld || Ld->isIndexed())
3127 EVT MemVT = Ld->getMemoryVT();
3153 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
3157 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
3163 Operands.
append({VL, SEW, PolicyOp, Ld->getChain()});
3167 false, IsStrided,
false,
3168 Log2SEW,
static_cast<unsigned>(LMUL));
3170 CurDAG->getMachineNode(
P->Pseudo,
DL, {VT, MVT::Other}, Operands);
3174 CurDAG->setNodeMemRefs(Load, {Ld->getMemOperand()});
3182 if (Subtarget->hasVendorXMIPSCBOP())
3185 unsigned Locality =
Node->getConstantOperandVal(3);
3193 int NontemporalLevel = 0;
3196 NontemporalLevel = 3;
3199 NontemporalLevel = 1;
3202 NontemporalLevel = 0;
3208 if (NontemporalLevel & 0b1)
3210 if (NontemporalLevel & 0b10)