1042 if (
Node->isMachineOpcode()) {
1044 Node->setNodeId(-1);
1050 unsigned Opcode =
Node->getOpcode();
1051 MVT XLenVT = Subtarget->getXLenVT();
1053 MVT VT =
Node->getSimpleValueType(0);
1055 bool HasBitTest = Subtarget->hasBEXTILike();
1059 assert((VT == Subtarget->getXLenVT() || VT == MVT::i32) &&
"Unexpected VT");
1061 if (ConstNode->isZero()) {
1063 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1067 int64_t Imm = ConstNode->getSExtValue();
1089 bool Is64Bit = Subtarget->is64Bit();
1090 bool HasZdinx = Subtarget->hasStdExtZdinx();
1092 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1097 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1098 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1100 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1111 assert(Subtarget->hasStdExtZfbfmin());
1112 Opc = RISCV::FMV_H_X;
1115 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1118 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1123 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1127 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1132 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1134 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT, Imm).getNode();
1135 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1137 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT, Imm).getNode();
1138 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1139 Res =
CurDAG->getMachineNode(
1147 Opc = RISCV::FSGNJN_D;
1149 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1157 case RISCVISD::BuildGPRPair:
1158 case RISCVISD::BuildPairF64: {
1159 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1162 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::BuildGPRPair) &&
1163 "BuildPairF64 only handled here on rv32i_zdinx");
1166 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
1167 Node->getOperand(0),
1168 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
1169 Node->getOperand(1),
1170 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1176 case RISCVISD::SplitGPRPair:
1177 case RISCVISD::SplitF64: {
1178 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1179 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::SplitGPRPair) &&
1180 "SplitF64 only handled here on rv32i_zdinx");
1184 Node->getValueType(0),
1185 Node->getOperand(0));
1191 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1199 assert(Opcode != RISCVISD::SplitGPRPair &&
1200 "SplitGPRPair should already be handled");
1202 if (!Subtarget->hasStdExtZfa())
1204 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1205 "Unexpected subtarget");
1210 Node->getOperand(0));
1215 Node->getOperand(0));
1230 unsigned ShAmt = N1C->getZExtValue();
1234 unsigned XLen = Subtarget->getXLen();
1237 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1242 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1245 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1249 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1250 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1261 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1264 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1278 unsigned ShAmt = N1C->getZExtValue();
1284 unsigned XLen = Subtarget->getXLen();
1287 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1290 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1293 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1310 if (ShAmt >= TrailingOnes)
1313 if (TrailingOnes == 32) {
1315 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1326 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1328 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1334 const unsigned Msb = TrailingOnes - 1;
1335 const unsigned Lsb = ShAmt;
1339 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1342 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1345 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1370 unsigned ShAmt = N1C->getZExtValue();
1374 if (ExtSize >= 32 || ShAmt >= ExtSize)
1376 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1379 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1382 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1415 unsigned C2 =
C->getZExtValue();
1416 unsigned XLen = Subtarget->getXLen();
1417 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1425 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1437 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1447 if (C2 + 32 == Leading) {
1449 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1459 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1463 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1464 CurDAG->getTargetConstant(31,
DL, VT));
1466 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1467 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1480 const unsigned Lsb = C2;
1486 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1490 Skip |= HasBitTest && Leading == XLen - 1;
1491 if (OneUseOrZExtW && !Skip) {
1493 RISCV::SLLI,
DL, VT,
X,
1494 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1497 CurDAG->getTargetConstant(Leading,
DL, VT));
1509 if (C2 + Leading < XLen &&
1512 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1514 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1515 CurDAG->getTargetConstant(C2,
DL, VT));
1528 const unsigned Msb = XLen - Leading - 1;
1529 const unsigned Lsb = C2;
1534 if (OneUseOrZExtW && !IsCANDI) {
1536 RISCV::SLLI,
DL, VT,
X,
1537 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1540 CurDAG->getTargetConstant(Leading,
DL, VT));
1552 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1554 unsigned SrliOpc = RISCV::SRLI;
1558 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1559 SrliOpc = RISCV::SRLIW;
1560 X =
X.getOperand(0);
1564 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1567 CurDAG->getTargetConstant(Trailing,
DL, VT));
1572 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1573 OneUseOrZExtW && !IsCANDI) {
1575 RISCV::SRLIW,
DL, VT,
X,
1576 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1579 CurDAG->getTargetConstant(Trailing,
DL, VT));
1584 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1585 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1587 RISCV::SRLI,
DL, VT,
X,
1588 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1590 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1591 CurDAG->getTargetConstant(Trailing,
DL, VT));
1602 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1604 RISCV::SRLI,
DL, VT,
X,
1605 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1608 CurDAG->getTargetConstant(Trailing,
DL, VT));
1613 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1615 RISCV::SRLIW,
DL, VT,
X,
1616 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1619 CurDAG->getTargetConstant(Trailing,
DL, VT));
1625 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1626 Subtarget->hasStdExtZba()) {
1628 RISCV::SRLI,
DL, VT,
X,
1629 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1631 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1632 CurDAG->getTargetConstant(Trailing,
DL, VT));
1639 const uint64_t C1 = N1C->getZExtValue();
1644 unsigned XLen = Subtarget->getXLen();
1645 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1650 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1653 X.getConstantOperandVal(1) == 32;
1660 RISCV::SRAI,
DL, VT,
X,
1661 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1664 CurDAG->getTargetConstant(Leading,
DL, VT));
1676 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1679 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1682 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1685 CurDAG->getTargetConstant(Trailing,
DL, VT));
1698 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1699 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1719 if (!N1C || !N1C->hasOneUse())
1740 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1742 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1747 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1749 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1756 unsigned XLen = Subtarget->getXLen();
1762 unsigned ConstantShift = XLen - LeadingZeros;
1766 uint64_t ShiftedC1 = C1 << ConstantShift;
1775 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1785 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1795 bool Simm12 =
false;
1796 bool SignExtend = Load->getExtensionType() ==
ISD::SEXTLOAD;
1799 int ConstantVal = ConstantOffset->getSExtValue();
1806 unsigned Opcode = 0;
1807 switch (Load->getMemoryVT().getSimpleVT().SimpleTy) {
1809 if (Simm12 && SignExtend)
1810 Opcode = RISCV::CV_LB_ri_inc;
1811 else if (Simm12 && !SignExtend)
1812 Opcode = RISCV::CV_LBU_ri_inc;
1813 else if (!Simm12 && SignExtend)
1814 Opcode = RISCV::CV_LB_rr_inc;
1816 Opcode = RISCV::CV_LBU_rr_inc;
1819 if (Simm12 && SignExtend)
1820 Opcode = RISCV::CV_LH_ri_inc;
1821 else if (Simm12 && !SignExtend)
1822 Opcode = RISCV::CV_LHU_ri_inc;
1823 else if (!Simm12 && SignExtend)
1824 Opcode = RISCV::CV_LH_rr_inc;
1826 Opcode = RISCV::CV_LHU_rr_inc;
1830 Opcode = RISCV::CV_LW_ri_inc;
1832 Opcode = RISCV::CV_LW_rr_inc;
1847 case RISCVISD::LD_RV32: {
1848 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
1857 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
1869 case RISCVISD::SD_RV32: {
1881 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
1884 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
Lo,
1885 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
Hi,
1886 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1888 RegPair =
SDValue(
CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE,
DL,
1901 unsigned IntNo =
Node->getConstantOperandVal(0);
1906 case Intrinsic::riscv_vmsgeu:
1907 case Intrinsic::riscv_vmsge: {
1910 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
1911 bool IsCmpConstant =
false;
1912 bool IsCmpMinimum =
false;
1920 IsCmpConstant =
true;
1921 CVal =
C->getSExtValue();
1922 if (CVal >= -15 && CVal <= 16) {
1923 if (!IsUnsigned || CVal != 0)
1925 IsCmpMinimum =
true;
1929 IsCmpMinimum =
true;
1932 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
1936#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
1937 case RISCVVType::lmulenum: \
1938 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
1939 : RISCV::PseudoVMSLT_VX_##suffix; \
1940 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
1941 : RISCV::PseudoVMSGT_VX_##suffix; \
1950#undef CASE_VMSLT_OPCODES
1956#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
1957 case RISCVVType::lmulenum: \
1958 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
1959 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
1968#undef CASE_VMNAND_VMSET_OPCODES
1979 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
1983 if (IsCmpConstant) {
1988 {Src1, Imm, VL, SEW}));
1995 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
1998 {Cmp, Cmp, VL, MaskSEW}));
2001 case Intrinsic::riscv_vmsgeu_mask:
2002 case Intrinsic::riscv_vmsge_mask: {
2005 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2006 bool IsCmpConstant =
false;
2007 bool IsCmpMinimum =
false;
2015 IsCmpConstant =
true;
2016 CVal =
C->getSExtValue();
2017 if (CVal >= -15 && CVal <= 16) {
2018 if (!IsUnsigned || CVal != 0)
2020 IsCmpMinimum =
true;
2024 IsCmpMinimum =
true;
2027 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2028 VMOROpcode, VMSGTMaskOpcode;
2032#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2033 case RISCVVType::lmulenum: \
2034 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2035 : RISCV::PseudoVMSLT_VX_##suffix; \
2036 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2037 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2038 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2039 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2048#undef CASE_VMSLT_OPCODES
2054#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2055 case RISCVVType::lmulenum: \
2056 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2057 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2058 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2067#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2081 if (Mask == MaskedOff) {
2086 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2087 {Mask, MaskedOff, VL, MaskSEW}));
2094 if (Mask == MaskedOff) {
2096 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2099 {Mask, Cmp, VL, MaskSEW}));
2106 if (IsCmpConstant) {
2111 VMSGTMaskOpcode,
DL, VT,
2112 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2122 {MaskedOff, Src1, Src2, Mask,
2123 VL, SEW, PolicyOp}),
2127 {Cmp, Mask, VL, MaskSEW}));
2130 case Intrinsic::riscv_vsetvli:
2131 case Intrinsic::riscv_vsetvlimax:
2137 unsigned IntNo =
Node->getConstantOperandVal(1);
2142 case Intrinsic::riscv_vlseg2:
2143 case Intrinsic::riscv_vlseg3:
2144 case Intrinsic::riscv_vlseg4:
2145 case Intrinsic::riscv_vlseg5:
2146 case Intrinsic::riscv_vlseg6:
2147 case Intrinsic::riscv_vlseg7:
2148 case Intrinsic::riscv_vlseg8: {
2153 case Intrinsic::riscv_vlseg2_mask:
2154 case Intrinsic::riscv_vlseg3_mask:
2155 case Intrinsic::riscv_vlseg4_mask:
2156 case Intrinsic::riscv_vlseg5_mask:
2157 case Intrinsic::riscv_vlseg6_mask:
2158 case Intrinsic::riscv_vlseg7_mask:
2159 case Intrinsic::riscv_vlseg8_mask: {
2164 case Intrinsic::riscv_vlsseg2:
2165 case Intrinsic::riscv_vlsseg3:
2166 case Intrinsic::riscv_vlsseg4:
2167 case Intrinsic::riscv_vlsseg5:
2168 case Intrinsic::riscv_vlsseg6:
2169 case Intrinsic::riscv_vlsseg7:
2170 case Intrinsic::riscv_vlsseg8: {
2175 case Intrinsic::riscv_vlsseg2_mask:
2176 case Intrinsic::riscv_vlsseg3_mask:
2177 case Intrinsic::riscv_vlsseg4_mask:
2178 case Intrinsic::riscv_vlsseg5_mask:
2179 case Intrinsic::riscv_vlsseg6_mask:
2180 case Intrinsic::riscv_vlsseg7_mask:
2181 case Intrinsic::riscv_vlsseg8_mask: {
2186 case Intrinsic::riscv_vloxseg2:
2187 case Intrinsic::riscv_vloxseg3:
2188 case Intrinsic::riscv_vloxseg4:
2189 case Intrinsic::riscv_vloxseg5:
2190 case Intrinsic::riscv_vloxseg6:
2191 case Intrinsic::riscv_vloxseg7:
2192 case Intrinsic::riscv_vloxseg8:
2196 case Intrinsic::riscv_vluxseg2:
2197 case Intrinsic::riscv_vluxseg3:
2198 case Intrinsic::riscv_vluxseg4:
2199 case Intrinsic::riscv_vluxseg5:
2200 case Intrinsic::riscv_vluxseg6:
2201 case Intrinsic::riscv_vluxseg7:
2202 case Intrinsic::riscv_vluxseg8:
2206 case Intrinsic::riscv_vloxseg2_mask:
2207 case Intrinsic::riscv_vloxseg3_mask:
2208 case Intrinsic::riscv_vloxseg4_mask:
2209 case Intrinsic::riscv_vloxseg5_mask:
2210 case Intrinsic::riscv_vloxseg6_mask:
2211 case Intrinsic::riscv_vloxseg7_mask:
2212 case Intrinsic::riscv_vloxseg8_mask:
2216 case Intrinsic::riscv_vluxseg2_mask:
2217 case Intrinsic::riscv_vluxseg3_mask:
2218 case Intrinsic::riscv_vluxseg4_mask:
2219 case Intrinsic::riscv_vluxseg5_mask:
2220 case Intrinsic::riscv_vluxseg6_mask:
2221 case Intrinsic::riscv_vluxseg7_mask:
2222 case Intrinsic::riscv_vluxseg8_mask:
2226 case Intrinsic::riscv_vlseg8ff:
2227 case Intrinsic::riscv_vlseg7ff:
2228 case Intrinsic::riscv_vlseg6ff:
2229 case Intrinsic::riscv_vlseg5ff:
2230 case Intrinsic::riscv_vlseg4ff:
2231 case Intrinsic::riscv_vlseg3ff:
2232 case Intrinsic::riscv_vlseg2ff: {
2236 case Intrinsic::riscv_vlseg8ff_mask:
2237 case Intrinsic::riscv_vlseg7ff_mask:
2238 case Intrinsic::riscv_vlseg6ff_mask:
2239 case Intrinsic::riscv_vlseg5ff_mask:
2240 case Intrinsic::riscv_vlseg4ff_mask:
2241 case Intrinsic::riscv_vlseg3ff_mask:
2242 case Intrinsic::riscv_vlseg2ff_mask: {
2246 case Intrinsic::riscv_vloxei:
2247 case Intrinsic::riscv_vloxei_mask:
2248 case Intrinsic::riscv_vluxei:
2249 case Intrinsic::riscv_vluxei_mask: {
2250 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2251 IntNo == Intrinsic::riscv_vluxei_mask;
2252 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2253 IntNo == Intrinsic::riscv_vloxei_mask;
2255 MVT VT =
Node->getSimpleValueType(0);
2268 "Element count mismatch");
2273 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2275 "values when XLEN=32");
2278 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2279 static_cast<unsigned>(IndexLMUL));
2288 case Intrinsic::riscv_vlm:
2289 case Intrinsic::riscv_vle:
2290 case Intrinsic::riscv_vle_mask:
2291 case Intrinsic::riscv_vlse:
2292 case Intrinsic::riscv_vlse_mask: {
2293 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2294 IntNo == Intrinsic::riscv_vlse_mask;
2296 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2298 MVT VT =
Node->getSimpleValueType(0);
2307 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2310 if (HasPassthruOperand)
2316 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2324 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2325 static_cast<unsigned>(LMUL));
2334 case Intrinsic::riscv_vleff:
2335 case Intrinsic::riscv_vleff_mask: {
2336 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2338 MVT VT =
Node->getSimpleValueType(0);
2350 RISCV::getVLEPseudo(IsMasked,
false,
true,
2351 Log2SEW,
static_cast<unsigned>(LMUL));
2359 case Intrinsic::riscv_nds_vln:
2360 case Intrinsic::riscv_nds_vln_mask:
2361 case Intrinsic::riscv_nds_vlnu:
2362 case Intrinsic::riscv_nds_vlnu_mask: {
2363 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2364 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2365 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2366 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2368 MVT VT =
Node->getSimpleValueType(0);
2380 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2385 CurDAG->setNodeMemRefs(Load, {
MemOp->getMemOperand()});
2394 unsigned IntNo =
Node->getConstantOperandVal(1);
2396 case Intrinsic::riscv_vsseg2:
2397 case Intrinsic::riscv_vsseg3:
2398 case Intrinsic::riscv_vsseg4:
2399 case Intrinsic::riscv_vsseg5:
2400 case Intrinsic::riscv_vsseg6:
2401 case Intrinsic::riscv_vsseg7:
2402 case Intrinsic::riscv_vsseg8: {
2407 case Intrinsic::riscv_vsseg2_mask:
2408 case Intrinsic::riscv_vsseg3_mask:
2409 case Intrinsic::riscv_vsseg4_mask:
2410 case Intrinsic::riscv_vsseg5_mask:
2411 case Intrinsic::riscv_vsseg6_mask:
2412 case Intrinsic::riscv_vsseg7_mask:
2413 case Intrinsic::riscv_vsseg8_mask: {
2418 case Intrinsic::riscv_vssseg2:
2419 case Intrinsic::riscv_vssseg3:
2420 case Intrinsic::riscv_vssseg4:
2421 case Intrinsic::riscv_vssseg5:
2422 case Intrinsic::riscv_vssseg6:
2423 case Intrinsic::riscv_vssseg7:
2424 case Intrinsic::riscv_vssseg8: {
2429 case Intrinsic::riscv_vssseg2_mask:
2430 case Intrinsic::riscv_vssseg3_mask:
2431 case Intrinsic::riscv_vssseg4_mask:
2432 case Intrinsic::riscv_vssseg5_mask:
2433 case Intrinsic::riscv_vssseg6_mask:
2434 case Intrinsic::riscv_vssseg7_mask:
2435 case Intrinsic::riscv_vssseg8_mask: {
2440 case Intrinsic::riscv_vsoxseg2:
2441 case Intrinsic::riscv_vsoxseg3:
2442 case Intrinsic::riscv_vsoxseg4:
2443 case Intrinsic::riscv_vsoxseg5:
2444 case Intrinsic::riscv_vsoxseg6:
2445 case Intrinsic::riscv_vsoxseg7:
2446 case Intrinsic::riscv_vsoxseg8:
2450 case Intrinsic::riscv_vsuxseg2:
2451 case Intrinsic::riscv_vsuxseg3:
2452 case Intrinsic::riscv_vsuxseg4:
2453 case Intrinsic::riscv_vsuxseg5:
2454 case Intrinsic::riscv_vsuxseg6:
2455 case Intrinsic::riscv_vsuxseg7:
2456 case Intrinsic::riscv_vsuxseg8:
2460 case Intrinsic::riscv_vsoxseg2_mask:
2461 case Intrinsic::riscv_vsoxseg3_mask:
2462 case Intrinsic::riscv_vsoxseg4_mask:
2463 case Intrinsic::riscv_vsoxseg5_mask:
2464 case Intrinsic::riscv_vsoxseg6_mask:
2465 case Intrinsic::riscv_vsoxseg7_mask:
2466 case Intrinsic::riscv_vsoxseg8_mask:
2470 case Intrinsic::riscv_vsuxseg2_mask:
2471 case Intrinsic::riscv_vsuxseg3_mask:
2472 case Intrinsic::riscv_vsuxseg4_mask:
2473 case Intrinsic::riscv_vsuxseg5_mask:
2474 case Intrinsic::riscv_vsuxseg6_mask:
2475 case Intrinsic::riscv_vsuxseg7_mask:
2476 case Intrinsic::riscv_vsuxseg8_mask:
2480 case Intrinsic::riscv_vsoxei:
2481 case Intrinsic::riscv_vsoxei_mask:
2482 case Intrinsic::riscv_vsuxei:
2483 case Intrinsic::riscv_vsuxei_mask: {
2484 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2485 IntNo == Intrinsic::riscv_vsuxei_mask;
2486 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2487 IntNo == Intrinsic::riscv_vsoxei_mask;
2489 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2502 "Element count mismatch");
2507 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2509 "values when XLEN=32");
2512 IsMasked, IsOrdered, IndexLog2EEW,
2513 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2522 case Intrinsic::riscv_vsm:
2523 case Intrinsic::riscv_vse:
2524 case Intrinsic::riscv_vse_mask:
2525 case Intrinsic::riscv_vsse:
2526 case Intrinsic::riscv_vsse_mask: {
2527 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2528 IntNo == Intrinsic::riscv_vsse_mask;
2530 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2532 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2544 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2552 case Intrinsic::riscv_sf_vc_x_se:
2553 case Intrinsic::riscv_sf_vc_i_se:
2559 case ISD::BITCAST: {
2560 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2572 case RISCVISD::TUPLE_INSERT: {
2576 auto Idx =
Node->getConstantOperandVal(2);
2580 MVT SubVecContainerVT = SubVecVT;
2583 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
2585 [[maybe_unused]]
bool ExactlyVecRegSized =
2587 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
2589 .getKnownMinValue()));
2590 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
2592 MVT ContainerVT = VT;
2594 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2596 const auto *
TRI = Subtarget->getRegisterInfo();
2598 std::tie(SubRegIdx, Idx) =
2600 ContainerVT, SubVecContainerVT, Idx,
TRI);
2610 [[maybe_unused]]
bool IsSubVecPartReg =
2614 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
2616 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
2617 "the subvector is smaller than a full-sized register");
2621 if (SubRegIdx == RISCV::NoSubRegister) {
2622 unsigned InRegClassID =
2626 "Unexpected subvector extraction");
2628 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
2634 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
2639 case RISCVISD::TUPLE_EXTRACT: {
2641 auto Idx =
Node->getConstantOperandVal(1);
2642 MVT InVT = V.getSimpleValueType();
2646 MVT SubVecContainerVT = VT;
2650 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2653 InVT =
TLI.getContainerForFixedLengthVector(InVT);
2655 const auto *
TRI = Subtarget->getRegisterInfo();
2657 std::tie(SubRegIdx, Idx) =
2659 InVT, SubVecContainerVT, Idx,
TRI);
2669 if (SubRegIdx == RISCV::NoSubRegister) {
2673 "Unexpected subvector extraction");
2676 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
2681 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
2685 case RISCVISD::VMV_S_X_VL:
2686 case RISCVISD::VFMV_S_F_VL:
2687 case RISCVISD::VMV_V_X_VL:
2688 case RISCVISD::VFMV_V_F_VL: {
2690 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
2691 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
2692 if (!
Node->getOperand(0).isUndef())
2698 if (!Ld || Ld->isIndexed())
2700 EVT MemVT = Ld->getMemoryVT();
2726 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
2730 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
2736 Operands.append({VL, SEW, PolicyOp, Ld->getChain()});
2740 false, IsStrided,
false,
2741 Log2SEW,
static_cast<unsigned>(LMUL));
2747 CurDAG->setNodeMemRefs(Load, {Ld->getMemOperand()});
2753 unsigned Locality =
Node->getConstantOperandVal(3);
2761 int NontemporalLevel = 0;
2764 NontemporalLevel = 3;
2767 NontemporalLevel = 1;
2770 NontemporalLevel = 0;
2776 if (NontemporalLevel & 0b1)
2778 if (NontemporalLevel & 0b10)