1102 if (
Node->isMachineOpcode()) {
1104 Node->setNodeId(-1);
1110 unsigned Opcode =
Node->getOpcode();
1111 MVT XLenVT = Subtarget->getXLenVT();
1113 MVT VT =
Node->getSimpleValueType(0);
1115 bool HasBitTest = Subtarget->hasBEXTILike();
1119 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT");
1121 if (ConstNode->isZero()) {
1123 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1127 int64_t Imm = ConstNode->getSExtValue();
1142 if (Subtarget->hasStdExtP() && !
isInt<12>(Imm) &&
1163 Imm = ((
uint64_t)Imm << 32) | (Imm & 0xFFFFFFFF);
1173 bool Is64Bit = Subtarget->is64Bit();
1174 bool HasZdinx = Subtarget->hasStdExtZdinx();
1176 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1181 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1182 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1184 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1195 assert(Subtarget->hasStdExtZfbfmin());
1196 Opc = RISCV::FMV_H_X;
1199 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1202 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1207 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1211 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1216 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1218 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT, Imm).getNode();
1219 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1221 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT, Imm).getNode();
1222 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1223 Res =
CurDAG->getMachineNode(
1231 Opc = RISCV::FSGNJN_D;
1233 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1241 case RISCVISD::BuildGPRPair:
1242 case RISCVISD::BuildPairF64:
1243 case RISCVISD::BuildPairGPRVec: {
1244 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1247 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::BuildPairF64) &&
1248 "BuildPairF64 only handled here on rv32i_zdinx");
1255 case RISCVISD::SplitGPRPair:
1256 case RISCVISD::SplitF64:
1257 case RISCVISD::SplitGPRVec: {
1258 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1259 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::SplitF64) &&
1260 "SplitF64 only handled here on rv32i_zdinx");
1264 Node->getValueType(0),
1265 Node->getOperand(0));
1271 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1279 if (!Subtarget->hasStdExtZfa())
1281 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1282 "Unexpected subtarget");
1287 Node->getOperand(0));
1292 Node->getOperand(0));
1307 unsigned ShAmt = N1C->getZExtValue();
1311 unsigned XLen = Subtarget->getXLen();
1314 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1319 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1322 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1326 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1327 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1338 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1341 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1355 unsigned ShAmt = N1C->getZExtValue();
1361 unsigned XLen = Subtarget->getXLen();
1364 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1367 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1370 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1387 if (ShAmt >= TrailingOnes)
1390 if (TrailingOnes == 32) {
1392 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1403 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1405 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1411 const unsigned Msb = TrailingOnes - 1;
1412 const unsigned Lsb = ShAmt;
1416 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1419 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1422 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1447 unsigned ShAmt = N1C->getZExtValue();
1451 if (ExtSize >= 32 || ShAmt >= ExtSize)
1453 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1456 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1459 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1478 unsigned ShAmt = ShAmtC->getZExtValue();
1479 unsigned XLen = Subtarget->getXLen();
1482 if (ExtSize >= 32 || ShAmt >= XLen - ExtSize)
1485 unsigned LShAmt = XLen - ExtSize - ShAmt;
1488 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1491 CurDAG->getTargetConstant(XLen - ExtSize,
DL, VT));
1518 unsigned C2 =
C->getZExtValue();
1519 unsigned XLen = Subtarget->getXLen();
1520 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1528 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1540 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1550 if (C2 + 32 == Leading) {
1552 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1562 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1566 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1567 CurDAG->getTargetConstant(31,
DL, VT));
1569 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1570 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1583 const unsigned Lsb = C2;
1589 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1593 Skip |= HasBitTest && Leading == XLen - 1;
1594 if (OneUseOrZExtW && !Skip) {
1596 RISCV::SLLI,
DL, VT,
X,
1597 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1600 CurDAG->getTargetConstant(Leading,
DL, VT));
1612 if (C2 + Leading < XLen &&
1615 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1617 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1618 CurDAG->getTargetConstant(C2,
DL, VT));
1631 const unsigned Msb = XLen - Leading - 1;
1632 const unsigned Lsb = C2;
1636 if (OneUseOrZExtW && !IsCANDI) {
1638 if (Subtarget->hasStdExtZbkb() && C1 == 0xff00 && C2 == 8) {
1640 RISCV::PACKH,
DL, VT,
1641 CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT()),
X);
1647 RISCV::SLLI,
DL, VT,
X,
1648 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1651 CurDAG->getTargetConstant(Leading,
DL, VT));
1663 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1665 unsigned SrliOpc = RISCV::SRLI;
1669 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1670 SrliOpc = RISCV::SRLIW;
1671 X =
X.getOperand(0);
1675 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1678 CurDAG->getTargetConstant(Trailing,
DL, VT));
1683 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1684 OneUseOrZExtW && !IsCANDI) {
1686 RISCV::SRLIW,
DL, VT,
X,
1687 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1690 CurDAG->getTargetConstant(Trailing,
DL, VT));
1695 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1696 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1698 RISCV::SRLI,
DL, VT,
X,
1699 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1701 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1702 CurDAG->getTargetConstant(Trailing,
DL, VT));
1713 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1715 RISCV::SRLI,
DL, VT,
X,
1716 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1719 CurDAG->getTargetConstant(Trailing,
DL, VT));
1724 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1726 RISCV::SRLIW,
DL, VT,
X,
1727 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1730 CurDAG->getTargetConstant(Trailing,
DL, VT));
1736 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1737 Subtarget->hasStdExtZba()) {
1739 RISCV::SRLI,
DL, VT,
X,
1740 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1742 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1743 CurDAG->getTargetConstant(Trailing,
DL, VT));
1750 const uint64_t C1 = N1C->getZExtValue();
1755 unsigned XLen = Subtarget->getXLen();
1756 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1761 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1764 X.getConstantOperandVal(1) == 32;
1771 RISCV::SRAI,
DL, VT,
X,
1772 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1775 CurDAG->getTargetConstant(Leading,
DL, VT));
1787 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1790 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1793 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1796 CurDAG->getTargetConstant(Trailing,
DL, VT));
1809 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1810 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1830 if (!N1C || !N1C->hasOneUse())
1851 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1853 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1858 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1860 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1867 unsigned XLen = Subtarget->getXLen();
1873 unsigned ConstantShift = XLen - LeadingZeros;
1877 uint64_t ShiftedC1 = C1 << ConstantShift;
1886 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1894 case RISCVISD::WMULSU:
1895 case RISCVISD::WADD:
1896 case RISCVISD::WSUB:
1897 case RISCVISD::WADDU:
1898 case RISCVISD::WSUBU: {
1899 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1900 "Unexpected opcode");
1903 switch (
Node->getOpcode()) {
1912 case RISCVISD::WMULSU:
1913 Opc = RISCV::WMULSU;
1915 case RISCVISD::WADD:
1918 case RISCVISD::WSUB:
1921 case RISCVISD::WADDU:
1924 case RISCVISD::WSUBU:
1930 Opc,
DL, MVT::Untyped,
Node->getOperand(0),
Node->getOperand(1));
1938 case RISCVISD::WSLL:
1939 case RISCVISD::WSLA: {
1941 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1942 "Unexpected opcode");
1944 bool IsSigned =
Node->getOpcode() == RISCVISD::WSLA;
1951 if (ShAmtC && ShAmtC->getZExtValue() < 64) {
1952 Opc = IsSigned ? RISCV::WSLAI : RISCV::WSLLI;
1953 ShAmt =
CurDAG->getTargetConstant(ShAmtC->getZExtValue(),
DL, XLenVT);
1955 Opc = IsSigned ? RISCV::WSLA : RISCV::WSLL;
1959 Node->getOperand(0), ShAmt);
1971 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1981 bool Simm12 =
false;
1985 int ConstantVal = ConstantOffset->getSExtValue();
1992 unsigned Opcode = 0;
1993 switch (
Load->getMemoryVT().getSimpleVT().SimpleTy) {
1995 if (Simm12 && SignExtend)
1996 Opcode = RISCV::CV_LB_ri_inc;
1997 else if (Simm12 && !SignExtend)
1998 Opcode = RISCV::CV_LBU_ri_inc;
1999 else if (!Simm12 && SignExtend)
2000 Opcode = RISCV::CV_LB_rr_inc;
2002 Opcode = RISCV::CV_LBU_rr_inc;
2005 if (Simm12 && SignExtend)
2006 Opcode = RISCV::CV_LH_ri_inc;
2007 else if (Simm12 && !SignExtend)
2008 Opcode = RISCV::CV_LHU_ri_inc;
2009 else if (!Simm12 && SignExtend)
2010 Opcode = RISCV::CV_LH_rr_inc;
2012 Opcode = RISCV::CV_LHU_rr_inc;
2016 Opcode = RISCV::CV_LW_ri_inc;
2018 Opcode = RISCV::CV_LW_rr_inc;
2033 case RISCVISD::LD_RV32: {
2034 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
2043 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
2052 case RISCVISD::SD_RV32: {
2064 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2076 case RISCVISD::ADDD:
2084 case RISCVISD::SUBD:
2085 case RISCVISD::WADDAU:
2086 case RISCVISD::WSUBAU:
2087 case RISCVISD::WADDA:
2088 case RISCVISD::WSUBA: {
2089 assert(!Subtarget->is64Bit() && Subtarget->hasStdExtP() &&
2090 "Unexpected opcode");
2097 Op0 =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2106 if (Opcode == RISCVISD::WADDAU || Opcode == RISCVISD::WSUBAU ||
2107 Opcode == RISCVISD::WADDA || Opcode == RISCVISD::WSUBA) {
2114 case RISCVISD::WADDAU:
2115 Opc = RISCV::WADDAU;
2117 case RISCVISD::WSUBAU:
2118 Opc = RISCV::WSUBAU;
2120 case RISCVISD::WADDA:
2123 case RISCVISD::WSUBA:
2127 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1Lo, Op1Hi);
2135 case RISCVISD::ADDD:
2138 case RISCVISD::SUBD:
2142 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1);
2152 unsigned IntNo =
Node->getConstantOperandVal(0);
2157 case Intrinsic::riscv_vmsgeu:
2158 case Intrinsic::riscv_vmsge: {
2161 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
2162 bool IsCmpConstant =
false;
2163 bool IsCmpMinimum =
false;
2171 IsCmpConstant =
true;
2172 CVal =
C->getSExtValue();
2173 if (CVal >= -15 && CVal <= 16) {
2174 if (!IsUnsigned || CVal != 0)
2176 IsCmpMinimum =
true;
2180 IsCmpMinimum =
true;
2183 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
2187#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2188 case RISCVVType::lmulenum: \
2189 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2190 : RISCV::PseudoVMSLT_VX_##suffix; \
2191 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
2192 : RISCV::PseudoVMSGT_VX_##suffix; \
2201#undef CASE_VMSLT_OPCODES
2207#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
2208 case RISCVVType::lmulenum: \
2209 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
2210 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
2219#undef CASE_VMNAND_VMSET_OPCODES
2230 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
2234 if (IsCmpConstant) {
2239 {Src1, Imm, VL, SEW}));
2246 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2249 {Cmp, Cmp, VL, MaskSEW}));
2252 case Intrinsic::riscv_vmsgeu_mask:
2253 case Intrinsic::riscv_vmsge_mask: {
2256 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2257 bool IsCmpConstant =
false;
2258 bool IsCmpMinimum =
false;
2266 IsCmpConstant =
true;
2267 CVal =
C->getSExtValue();
2268 if (CVal >= -15 && CVal <= 16) {
2269 if (!IsUnsigned || CVal != 0)
2271 IsCmpMinimum =
true;
2275 IsCmpMinimum =
true;
2278 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2279 VMOROpcode, VMSGTMaskOpcode;
2283#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2284 case RISCVVType::lmulenum: \
2285 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2286 : RISCV::PseudoVMSLT_VX_##suffix; \
2287 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2288 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2289 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2290 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2299#undef CASE_VMSLT_OPCODES
2305#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2306 case RISCVVType::lmulenum: \
2307 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2308 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2309 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2318#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2332 if (Mask == MaskedOff) {
2337 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2338 {Mask, MaskedOff, VL, MaskSEW}));
2345 if (Mask == MaskedOff) {
2347 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2350 {Mask, Cmp, VL, MaskSEW}));
2357 if (IsCmpConstant) {
2362 VMSGTMaskOpcode,
DL, VT,
2363 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2373 {MaskedOff, Src1, Src2, Mask,
2374 VL, SEW, PolicyOp}),
2378 {Cmp, Mask, VL, MaskSEW}));
2381 case Intrinsic::riscv_vsetvli:
2382 case Intrinsic::riscv_vsetvlimax:
2384 case Intrinsic::riscv_sf_vsettnt:
2385 case Intrinsic::riscv_sf_vsettm:
2386 case Intrinsic::riscv_sf_vsettk:
2392 unsigned IntNo =
Node->getConstantOperandVal(1);
2397 case Intrinsic::riscv_vlseg2:
2398 case Intrinsic::riscv_vlseg3:
2399 case Intrinsic::riscv_vlseg4:
2400 case Intrinsic::riscv_vlseg5:
2401 case Intrinsic::riscv_vlseg6:
2402 case Intrinsic::riscv_vlseg7:
2403 case Intrinsic::riscv_vlseg8: {
2408 case Intrinsic::riscv_vlseg2_mask:
2409 case Intrinsic::riscv_vlseg3_mask:
2410 case Intrinsic::riscv_vlseg4_mask:
2411 case Intrinsic::riscv_vlseg5_mask:
2412 case Intrinsic::riscv_vlseg6_mask:
2413 case Intrinsic::riscv_vlseg7_mask:
2414 case Intrinsic::riscv_vlseg8_mask: {
2419 case Intrinsic::riscv_vlsseg2:
2420 case Intrinsic::riscv_vlsseg3:
2421 case Intrinsic::riscv_vlsseg4:
2422 case Intrinsic::riscv_vlsseg5:
2423 case Intrinsic::riscv_vlsseg6:
2424 case Intrinsic::riscv_vlsseg7:
2425 case Intrinsic::riscv_vlsseg8: {
2430 case Intrinsic::riscv_vlsseg2_mask:
2431 case Intrinsic::riscv_vlsseg3_mask:
2432 case Intrinsic::riscv_vlsseg4_mask:
2433 case Intrinsic::riscv_vlsseg5_mask:
2434 case Intrinsic::riscv_vlsseg6_mask:
2435 case Intrinsic::riscv_vlsseg7_mask:
2436 case Intrinsic::riscv_vlsseg8_mask: {
2441 case Intrinsic::riscv_vloxseg2:
2442 case Intrinsic::riscv_vloxseg3:
2443 case Intrinsic::riscv_vloxseg4:
2444 case Intrinsic::riscv_vloxseg5:
2445 case Intrinsic::riscv_vloxseg6:
2446 case Intrinsic::riscv_vloxseg7:
2447 case Intrinsic::riscv_vloxseg8:
2451 case Intrinsic::riscv_vluxseg2:
2452 case Intrinsic::riscv_vluxseg3:
2453 case Intrinsic::riscv_vluxseg4:
2454 case Intrinsic::riscv_vluxseg5:
2455 case Intrinsic::riscv_vluxseg6:
2456 case Intrinsic::riscv_vluxseg7:
2457 case Intrinsic::riscv_vluxseg8:
2461 case Intrinsic::riscv_vloxseg2_mask:
2462 case Intrinsic::riscv_vloxseg3_mask:
2463 case Intrinsic::riscv_vloxseg4_mask:
2464 case Intrinsic::riscv_vloxseg5_mask:
2465 case Intrinsic::riscv_vloxseg6_mask:
2466 case Intrinsic::riscv_vloxseg7_mask:
2467 case Intrinsic::riscv_vloxseg8_mask:
2471 case Intrinsic::riscv_vluxseg2_mask:
2472 case Intrinsic::riscv_vluxseg3_mask:
2473 case Intrinsic::riscv_vluxseg4_mask:
2474 case Intrinsic::riscv_vluxseg5_mask:
2475 case Intrinsic::riscv_vluxseg6_mask:
2476 case Intrinsic::riscv_vluxseg7_mask:
2477 case Intrinsic::riscv_vluxseg8_mask:
2481 case Intrinsic::riscv_vlseg8ff:
2482 case Intrinsic::riscv_vlseg7ff:
2483 case Intrinsic::riscv_vlseg6ff:
2484 case Intrinsic::riscv_vlseg5ff:
2485 case Intrinsic::riscv_vlseg4ff:
2486 case Intrinsic::riscv_vlseg3ff:
2487 case Intrinsic::riscv_vlseg2ff: {
2491 case Intrinsic::riscv_vlseg8ff_mask:
2492 case Intrinsic::riscv_vlseg7ff_mask:
2493 case Intrinsic::riscv_vlseg6ff_mask:
2494 case Intrinsic::riscv_vlseg5ff_mask:
2495 case Intrinsic::riscv_vlseg4ff_mask:
2496 case Intrinsic::riscv_vlseg3ff_mask:
2497 case Intrinsic::riscv_vlseg2ff_mask: {
2501 case Intrinsic::riscv_vloxei:
2502 case Intrinsic::riscv_vloxei_mask:
2503 case Intrinsic::riscv_vluxei:
2504 case Intrinsic::riscv_vluxei_mask: {
2505 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2506 IntNo == Intrinsic::riscv_vluxei_mask;
2507 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2508 IntNo == Intrinsic::riscv_vloxei_mask;
2510 MVT VT =
Node->getSimpleValueType(0);
2523 "Element count mismatch");
2528 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2530 "index values when XLEN=32");
2533 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2534 static_cast<unsigned>(IndexLMUL));
2536 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2543 case Intrinsic::riscv_vlm:
2544 case Intrinsic::riscv_vle:
2545 case Intrinsic::riscv_vle_mask:
2546 case Intrinsic::riscv_vlse:
2547 case Intrinsic::riscv_vlse_mask: {
2548 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2549 IntNo == Intrinsic::riscv_vlse_mask;
2551 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2553 MVT VT =
Node->getSimpleValueType(0);
2562 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2565 if (HasPassthruOperand)
2571 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2579 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2580 static_cast<unsigned>(LMUL));
2582 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2589 case Intrinsic::riscv_vleff:
2590 case Intrinsic::riscv_vleff_mask: {
2591 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2593 MVT VT =
Node->getSimpleValueType(0);
2605 RISCV::getVLEPseudo(IsMasked,
false,
true,
2606 Log2SEW,
static_cast<unsigned>(LMUL));
2608 P->Pseudo,
DL,
Node->getVTList(), Operands);
2614 case Intrinsic::riscv_nds_vln:
2615 case Intrinsic::riscv_nds_vln_mask:
2616 case Intrinsic::riscv_nds_vlnu:
2617 case Intrinsic::riscv_nds_vlnu_mask: {
2618 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2619 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2620 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2621 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2623 MVT VT =
Node->getSimpleValueType(0);
2635 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2637 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2649 unsigned IntNo =
Node->getConstantOperandVal(1);
2651 case Intrinsic::riscv_vsseg2:
2652 case Intrinsic::riscv_vsseg3:
2653 case Intrinsic::riscv_vsseg4:
2654 case Intrinsic::riscv_vsseg5:
2655 case Intrinsic::riscv_vsseg6:
2656 case Intrinsic::riscv_vsseg7:
2657 case Intrinsic::riscv_vsseg8: {
2662 case Intrinsic::riscv_vsseg2_mask:
2663 case Intrinsic::riscv_vsseg3_mask:
2664 case Intrinsic::riscv_vsseg4_mask:
2665 case Intrinsic::riscv_vsseg5_mask:
2666 case Intrinsic::riscv_vsseg6_mask:
2667 case Intrinsic::riscv_vsseg7_mask:
2668 case Intrinsic::riscv_vsseg8_mask: {
2673 case Intrinsic::riscv_vssseg2:
2674 case Intrinsic::riscv_vssseg3:
2675 case Intrinsic::riscv_vssseg4:
2676 case Intrinsic::riscv_vssseg5:
2677 case Intrinsic::riscv_vssseg6:
2678 case Intrinsic::riscv_vssseg7:
2679 case Intrinsic::riscv_vssseg8: {
2684 case Intrinsic::riscv_vssseg2_mask:
2685 case Intrinsic::riscv_vssseg3_mask:
2686 case Intrinsic::riscv_vssseg4_mask:
2687 case Intrinsic::riscv_vssseg5_mask:
2688 case Intrinsic::riscv_vssseg6_mask:
2689 case Intrinsic::riscv_vssseg7_mask:
2690 case Intrinsic::riscv_vssseg8_mask: {
2695 case Intrinsic::riscv_vsoxseg2:
2696 case Intrinsic::riscv_vsoxseg3:
2697 case Intrinsic::riscv_vsoxseg4:
2698 case Intrinsic::riscv_vsoxseg5:
2699 case Intrinsic::riscv_vsoxseg6:
2700 case Intrinsic::riscv_vsoxseg7:
2701 case Intrinsic::riscv_vsoxseg8:
2705 case Intrinsic::riscv_vsuxseg2:
2706 case Intrinsic::riscv_vsuxseg3:
2707 case Intrinsic::riscv_vsuxseg4:
2708 case Intrinsic::riscv_vsuxseg5:
2709 case Intrinsic::riscv_vsuxseg6:
2710 case Intrinsic::riscv_vsuxseg7:
2711 case Intrinsic::riscv_vsuxseg8:
2715 case Intrinsic::riscv_vsoxseg2_mask:
2716 case Intrinsic::riscv_vsoxseg3_mask:
2717 case Intrinsic::riscv_vsoxseg4_mask:
2718 case Intrinsic::riscv_vsoxseg5_mask:
2719 case Intrinsic::riscv_vsoxseg6_mask:
2720 case Intrinsic::riscv_vsoxseg7_mask:
2721 case Intrinsic::riscv_vsoxseg8_mask:
2725 case Intrinsic::riscv_vsuxseg2_mask:
2726 case Intrinsic::riscv_vsuxseg3_mask:
2727 case Intrinsic::riscv_vsuxseg4_mask:
2728 case Intrinsic::riscv_vsuxseg5_mask:
2729 case Intrinsic::riscv_vsuxseg6_mask:
2730 case Intrinsic::riscv_vsuxseg7_mask:
2731 case Intrinsic::riscv_vsuxseg8_mask:
2735 case Intrinsic::riscv_vsoxei:
2736 case Intrinsic::riscv_vsoxei_mask:
2737 case Intrinsic::riscv_vsuxei:
2738 case Intrinsic::riscv_vsuxei_mask: {
2739 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2740 IntNo == Intrinsic::riscv_vsuxei_mask;
2741 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2742 IntNo == Intrinsic::riscv_vsoxei_mask;
2744 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2757 "Element count mismatch");
2762 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2764 "index values when XLEN=32");
2767 IsMasked, IsOrdered, IndexLog2EEW,
2768 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2770 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2777 case Intrinsic::riscv_vsm:
2778 case Intrinsic::riscv_vse:
2779 case Intrinsic::riscv_vse_mask:
2780 case Intrinsic::riscv_vsse:
2781 case Intrinsic::riscv_vsse_mask: {
2782 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2783 IntNo == Intrinsic::riscv_vsse_mask;
2785 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2787 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2799 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2801 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2807 case Intrinsic::riscv_sf_vc_x_se:
2808 case Intrinsic::riscv_sf_vc_i_se:
2811 case Intrinsic::riscv_sf_vlte8:
2812 case Intrinsic::riscv_sf_vlte16:
2813 case Intrinsic::riscv_sf_vlte32:
2814 case Intrinsic::riscv_sf_vlte64: {
2816 unsigned PseudoInst;
2818 case Intrinsic::riscv_sf_vlte8:
2819 PseudoInst = RISCV::PseudoSF_VLTE8;
2822 case Intrinsic::riscv_sf_vlte16:
2823 PseudoInst = RISCV::PseudoSF_VLTE16;
2826 case Intrinsic::riscv_sf_vlte32:
2827 PseudoInst = RISCV::PseudoSF_VLTE32;
2830 case Intrinsic::riscv_sf_vlte64:
2831 PseudoInst = RISCV::PseudoSF_VLTE64;
2839 Node->getOperand(3),
2840 Node->getOperand(4),
2843 Node->getOperand(0)};
2846 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2847 CurDAG->setNodeMemRefs(TileLoad,
2853 case Intrinsic::riscv_sf_mm_s_s:
2854 case Intrinsic::riscv_sf_mm_s_u:
2855 case Intrinsic::riscv_sf_mm_u_s:
2856 case Intrinsic::riscv_sf_mm_u_u:
2857 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2858 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2859 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2860 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2861 case Intrinsic::riscv_sf_mm_f_f: {
2862 bool HasFRM =
false;
2863 unsigned PseudoInst;
2865 case Intrinsic::riscv_sf_mm_s_s:
2866 PseudoInst = RISCV::PseudoSF_MM_S_S;
2868 case Intrinsic::riscv_sf_mm_s_u:
2869 PseudoInst = RISCV::PseudoSF_MM_S_U;
2871 case Intrinsic::riscv_sf_mm_u_s:
2872 PseudoInst = RISCV::PseudoSF_MM_U_S;
2874 case Intrinsic::riscv_sf_mm_u_u:
2875 PseudoInst = RISCV::PseudoSF_MM_U_U;
2877 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2878 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
2881 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2882 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
2885 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2886 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
2889 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2890 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
2893 case Intrinsic::riscv_sf_mm_f_f:
2894 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
2895 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
2897 PseudoInst = RISCV::PseudoSF_MM_F_F;
2913 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
2922 Operands.append({TmOp, TnOp, TkOp,
2923 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
2927 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2932 case Intrinsic::riscv_sf_vtzero_t: {
2939 auto *NewNode =
CurDAG->getMachineNode(
2940 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
2941 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
2951 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2960 if (Subtarget->hasStdExtP()) {
2962 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
2963 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
2965 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
2966 SrcVT == MVT::v2i32)) ||
2967 (SrcVT == MVT::i64 &&
2968 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
2969 if (Is32BitCast || Is64BitCast) {
2978 if (!Subtarget->hasStdExtP())
2981 bool IsDoubleWide = Subtarget->isPExtPackedDoubleType(VT);
2983 if (ConstNode->isZero()) {
2984 MCPhysReg X0Reg = IsDoubleWide ? RISCV::X0_Pair : RISCV::X0;
2992 APInt Val = ConstNode->getAPIntValue().
trunc(EltSize);
2997 RISCV::ADDI,
DL, VT,
CurDAG->getRegister(RISCV::X0, VT),
2998 CurDAG->getAllOnesConstant(
DL, XLenVT,
true));
3005 Val = Val.
trunc(16);
3014 Opc = IsDoubleWide ? RISCV::PLI_DB : RISCV::PLI_B;
3015 }
else if (EltSize == 16 &&
isInt<10>(Imm)) {
3016 Opc = IsDoubleWide ? RISCV::PLI_DH : RISCV::PLI_H;
3017 }
else if (!IsDoubleWide && EltSize == 32 &&
isInt<10>(Imm)) {
3020 Opc = IsDoubleWide ? RISCV::PLUI_DH : RISCV::PLUI_H;
3023 Opc = RISCV::PLUI_W;
3029 Opc,
DL, VT,
CurDAG->getSignedTargetConstant(Imm,
DL, XLenVT));
3038 if (Subtarget->hasStdExtP()) {
3039 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3040 if ((VT == MVT::v2i32 && SrcVT == MVT::i64) ||
3041 (VT == MVT::v4i8 && SrcVT == MVT::i32)) {
3049 case RISCVISD::TUPLE_INSERT: {
3053 auto Idx =
Node->getConstantOperandVal(2);
3057 MVT SubVecContainerVT = SubVecVT;
3060 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
3062 [[maybe_unused]]
bool ExactlyVecRegSized =
3064 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
3066 .getKnownMinValue()));
3067 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
3069 MVT ContainerVT = VT;
3071 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3073 const auto *
TRI = Subtarget->getRegisterInfo();
3075 std::tie(SubRegIdx, Idx) =
3077 ContainerVT, SubVecContainerVT, Idx,
TRI);
3087 [[maybe_unused]]
bool IsSubVecPartReg =
3091 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
3093 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
3094 "the subvector is smaller than a full-sized register");
3098 if (SubRegIdx == RISCV::NoSubRegister) {
3099 unsigned InRegClassID =
3103 "Unexpected subvector extraction");
3105 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
3111 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
3116 case RISCVISD::TUPLE_EXTRACT: {
3117 if (Subtarget->hasStdExtP())
3121 auto Idx =
Node->getConstantOperandVal(1);
3122 MVT InVT = V.getSimpleValueType();
3127 MVT SubVecContainerVT = VT;
3131 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3134 InVT =
TLI.getContainerForFixedLengthVector(InVT);
3136 const auto *
TRI = Subtarget->getRegisterInfo();
3138 std::tie(SubRegIdx, Idx) =
3140 InVT, SubVecContainerVT, Idx,
TRI);
3150 if (SubRegIdx == RISCV::NoSubRegister) {
3154 "Unexpected subvector extraction");
3157 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
3162 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
3166 case RISCVISD::VMV_S_X_VL:
3167 case RISCVISD::VFMV_S_F_VL:
3168 case RISCVISD::VMV_V_X_VL:
3169 case RISCVISD::VFMV_V_F_VL: {
3171 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
3172 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
3173 if (!
Node->getOperand(0).isUndef())
3179 if (!Ld || Ld->isIndexed())
3181 EVT MemVT = Ld->getMemoryVT();
3207 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
3211 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
3217 Operands.
append({VL, SEW, PolicyOp, Ld->getChain()});
3221 false, IsStrided,
false,
3222 Log2SEW,
static_cast<unsigned>(LMUL));
3224 CurDAG->getMachineNode(
P->Pseudo,
DL, {VT, MVT::Other}, Operands);
3228 CurDAG->setNodeMemRefs(
Load, {Ld->getMemOperand()});
3233 case RISCVISD::LPAD_CALL:
3234 case RISCVISD::LPAD_CALL_INDIRECT: {
3235 bool IsIndirect = Opcode == RISCVISD::LPAD_CALL_INDIRECT;
3236 unsigned PseudoOpc = IsIndirect ? RISCV::PseudoCALLIndirectLpadAlign
3237 : RISCV::PseudoCALLLpadAlign;
3243 "in unsigned 20-bits");
3248 Ops.push_back(
Node->getOperand(1));
3249 Ops.push_back(
CurDAG->getTargetConstant(LpadLabel,
DL, XLenVT));
3250 Ops.push_back(
Node->getOperand(0));
3251 if (
Node->getGluedNode())
3252 Ops.push_back(
Node->getOperand(
Node->getNumOperands() - 1));
3261 if (Subtarget->hasVendorXMIPSCBOP())
3264 unsigned Locality =
Node->getConstantOperandVal(3);
3272 int NontemporalLevel = 0;
3275 NontemporalLevel = 3;
3278 NontemporalLevel = 1;
3281 NontemporalLevel = 0;
3287 if (NontemporalLevel & 0b1)
3289 if (NontemporalLevel & 0b10)