953 if (
Node->isMachineOpcode()) {
961 unsigned Opcode =
Node->getOpcode();
962 MVT XLenVT = Subtarget->getXLenVT();
964 MVT VT =
Node->getSimpleValueType(0);
966 bool HasBitTest = Subtarget->hasBEXTILike();
970 assert((VT == Subtarget->getXLenVT() || VT == MVT::i32) &&
"Unexpected VT");
972 if (ConstNode->isZero()) {
974 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
978 int64_t Imm = ConstNode->getSExtValue();
1000 bool Is64Bit = Subtarget->is64Bit();
1001 bool HasZdinx = Subtarget->hasStdExtZdinx();
1003 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1008 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1009 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1011 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1022 assert(Subtarget->hasStdExtZfbfmin());
1023 Opc = RISCV::FMV_H_X;
1026 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1029 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1034 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1038 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1043 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1045 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT, Imm).getNode();
1046 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1048 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT, Imm).getNode();
1049 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1050 Res =
CurDAG->getMachineNode(
1058 Opc = RISCV::FSGNJN_D;
1060 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1068 case RISCVISD::BuildGPRPair:
1069 case RISCVISD::BuildPairF64: {
1070 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1073 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::BuildGPRPair) &&
1074 "BuildPairF64 only handled here on rv32i_zdinx");
1077 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
1078 Node->getOperand(0),
1079 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
1080 Node->getOperand(1),
1081 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1087 case RISCVISD::SplitGPRPair:
1088 case RISCVISD::SplitF64: {
1089 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1090 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::SplitGPRPair) &&
1091 "SplitF64 only handled here on rv32i_zdinx");
1095 Node->getValueType(0),
1096 Node->getOperand(0));
1102 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1110 assert(Opcode != RISCVISD::SplitGPRPair &&
1111 "SplitGPRPair should already be handled");
1113 if (!Subtarget->hasStdExtZfa())
1115 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1116 "Unexpected subtarget");
1121 Node->getOperand(0));
1126 Node->getOperand(0));
1141 unsigned ShAmt = N1C->getZExtValue();
1145 unsigned XLen = Subtarget->getXLen();
1148 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1153 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1156 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1160 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1161 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1172 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1175 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1189 unsigned ShAmt = N1C->getZExtValue();
1195 unsigned XLen = Subtarget->getXLen();
1198 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1201 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1204 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1221 if (ShAmt >= TrailingOnes)
1224 if (TrailingOnes == 32) {
1226 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1237 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1239 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1245 const unsigned Msb = TrailingOnes - 1;
1246 const unsigned Lsb = ShAmt;
1250 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1253 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1256 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1281 unsigned ShAmt = N1C->getZExtValue();
1285 if (ExtSize >= 32 || ShAmt >= ExtSize)
1287 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1290 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1293 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1320 unsigned C2 =
C->getZExtValue();
1321 unsigned XLen = Subtarget->getXLen();
1322 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1330 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1342 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1352 if (C2 + 32 == Leading) {
1354 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1364 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1368 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1369 CurDAG->getTargetConstant(31,
DL, VT));
1371 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1372 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1385 const unsigned Lsb = C2;
1391 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1395 Skip |= HasBitTest && Leading == XLen - 1;
1396 if (OneUseOrZExtW && !Skip) {
1398 RISCV::SLLI,
DL, VT,
X,
1399 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1402 CurDAG->getTargetConstant(Leading,
DL, VT));
1414 if (C2 + Leading < XLen &&
1417 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1419 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1420 CurDAG->getTargetConstant(C2,
DL, VT));
1433 const unsigned Msb = XLen - Leading - 1;
1434 const unsigned Lsb = C2;
1439 if (OneUseOrZExtW && !IsCANDI) {
1441 RISCV::SLLI,
DL, VT,
X,
1442 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1445 CurDAG->getTargetConstant(Leading,
DL, VT));
1457 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1459 unsigned SrliOpc = RISCV::SRLI;
1463 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1464 SrliOpc = RISCV::SRLIW;
1465 X =
X.getOperand(0);
1469 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1472 CurDAG->getTargetConstant(Trailing,
DL, VT));
1477 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1478 OneUseOrZExtW && !IsCANDI) {
1480 RISCV::SRLIW,
DL, VT,
X,
1481 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1484 CurDAG->getTargetConstant(Trailing,
DL, VT));
1489 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1490 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1492 RISCV::SRLI,
DL, VT,
X,
1493 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1495 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1496 CurDAG->getTargetConstant(Trailing,
DL, VT));
1507 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1509 RISCV::SRLI,
DL, VT,
X,
1510 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1513 CurDAG->getTargetConstant(Trailing,
DL, VT));
1518 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1520 RISCV::SRLIW,
DL, VT,
X,
1521 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1524 CurDAG->getTargetConstant(Trailing,
DL, VT));
1530 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1531 Subtarget->hasStdExtZba()) {
1533 RISCV::SRLI,
DL, VT,
X,
1534 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1536 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1537 CurDAG->getTargetConstant(Trailing,
DL, VT));
1544 const uint64_t C1 = N1C->getZExtValue();
1549 unsigned XLen = Subtarget->getXLen();
1550 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1555 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1558 X.getConstantOperandVal(1) == 32;
1565 RISCV::SRAI,
DL, VT,
X,
1566 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1569 CurDAG->getTargetConstant(Leading,
DL, VT));
1581 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1584 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1587 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1590 CurDAG->getTargetConstant(Trailing,
DL, VT));
1603 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1604 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1624 if (!N1C || !N1C->hasOneUse())
1645 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1647 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1652 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1654 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1661 unsigned XLen = Subtarget->getXLen();
1667 unsigned ConstantShift = XLen - LeadingZeros;
1671 uint64_t ShiftedC1 = C1 << ConstantShift;
1680 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1690 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1700 bool Simm12 =
false;
1701 bool SignExtend = Load->getExtensionType() ==
ISD::SEXTLOAD;
1704 int ConstantVal = ConstantOffset->getSExtValue();
1711 unsigned Opcode = 0;
1712 switch (Load->getMemoryVT().getSimpleVT().SimpleTy) {
1714 if (Simm12 && SignExtend)
1715 Opcode = RISCV::CV_LB_ri_inc;
1716 else if (Simm12 && !SignExtend)
1717 Opcode = RISCV::CV_LBU_ri_inc;
1718 else if (!Simm12 && SignExtend)
1719 Opcode = RISCV::CV_LB_rr_inc;
1721 Opcode = RISCV::CV_LBU_rr_inc;
1724 if (Simm12 && SignExtend)
1725 Opcode = RISCV::CV_LH_ri_inc;
1726 else if (Simm12 && !SignExtend)
1727 Opcode = RISCV::CV_LHU_ri_inc;
1728 else if (!Simm12 && SignExtend)
1729 Opcode = RISCV::CV_LH_rr_inc;
1731 Opcode = RISCV::CV_LHU_rr_inc;
1735 Opcode = RISCV::CV_LW_ri_inc;
1737 Opcode = RISCV::CV_LW_rr_inc;
1752 case RISCVISD::LD_RV32: {
1753 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
1762 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
1774 case RISCVISD::SD_RV32: {
1786 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
1789 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
Lo,
1790 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
Hi,
1791 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1793 RegPair =
SDValue(
CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE,
DL,
1806 unsigned IntNo =
Node->getConstantOperandVal(0);
1811 case Intrinsic::riscv_vmsgeu:
1812 case Intrinsic::riscv_vmsge: {
1815 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
1816 bool IsCmpConstant =
false;
1817 bool IsCmpMinimum =
false;
1825 IsCmpConstant =
true;
1826 CVal =
C->getSExtValue();
1827 if (CVal >= -15 && CVal <= 16) {
1828 if (!IsUnsigned || CVal != 0)
1830 IsCmpMinimum =
true;
1834 IsCmpMinimum =
true;
1837 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
1841#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
1842 case RISCVVType::lmulenum: \
1843 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
1844 : RISCV::PseudoVMSLT_VX_##suffix; \
1845 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
1846 : RISCV::PseudoVMSGT_VX_##suffix; \
1855#undef CASE_VMSLT_OPCODES
1861#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
1862 case RISCVVType::lmulenum: \
1863 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
1864 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
1873#undef CASE_VMNAND_VMSET_OPCODES
1884 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
1888 if (IsCmpConstant) {
1893 {Src1, Imm, VL, SEW}));
1900 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
1903 {Cmp, Cmp, VL, MaskSEW}));
1906 case Intrinsic::riscv_vmsgeu_mask:
1907 case Intrinsic::riscv_vmsge_mask: {
1910 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
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, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
1933 VMOROpcode, VMSGTMaskOpcode;
1937#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
1938 case RISCVVType::lmulenum: \
1939 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
1940 : RISCV::PseudoVMSLT_VX_##suffix; \
1941 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
1942 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
1943 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
1944 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
1953#undef CASE_VMSLT_OPCODES
1959#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
1960 case RISCVVType::lmulenum: \
1961 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
1962 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
1963 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
1972#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
1986 if (Mask == MaskedOff) {
1991 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
1992 {Mask, MaskedOff, VL, MaskSEW}));
1999 if (Mask == MaskedOff) {
2001 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2004 {Mask, Cmp, VL, MaskSEW}));
2011 if (IsCmpConstant) {
2016 VMSGTMaskOpcode,
DL, VT,
2017 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2027 {MaskedOff, Src1, Src2, Mask,
2028 VL, SEW, PolicyOp}),
2032 {Cmp, Mask, VL, MaskSEW}));
2035 case Intrinsic::riscv_vsetvli:
2036 case Intrinsic::riscv_vsetvlimax:
2042 unsigned IntNo =
Node->getConstantOperandVal(1);
2047 case Intrinsic::riscv_vlseg2:
2048 case Intrinsic::riscv_vlseg3:
2049 case Intrinsic::riscv_vlseg4:
2050 case Intrinsic::riscv_vlseg5:
2051 case Intrinsic::riscv_vlseg6:
2052 case Intrinsic::riscv_vlseg7:
2053 case Intrinsic::riscv_vlseg8: {
2058 case Intrinsic::riscv_vlseg2_mask:
2059 case Intrinsic::riscv_vlseg3_mask:
2060 case Intrinsic::riscv_vlseg4_mask:
2061 case Intrinsic::riscv_vlseg5_mask:
2062 case Intrinsic::riscv_vlseg6_mask:
2063 case Intrinsic::riscv_vlseg7_mask:
2064 case Intrinsic::riscv_vlseg8_mask: {
2069 case Intrinsic::riscv_vlsseg2:
2070 case Intrinsic::riscv_vlsseg3:
2071 case Intrinsic::riscv_vlsseg4:
2072 case Intrinsic::riscv_vlsseg5:
2073 case Intrinsic::riscv_vlsseg6:
2074 case Intrinsic::riscv_vlsseg7:
2075 case Intrinsic::riscv_vlsseg8: {
2080 case Intrinsic::riscv_vlsseg2_mask:
2081 case Intrinsic::riscv_vlsseg3_mask:
2082 case Intrinsic::riscv_vlsseg4_mask:
2083 case Intrinsic::riscv_vlsseg5_mask:
2084 case Intrinsic::riscv_vlsseg6_mask:
2085 case Intrinsic::riscv_vlsseg7_mask:
2086 case Intrinsic::riscv_vlsseg8_mask: {
2091 case Intrinsic::riscv_vloxseg2:
2092 case Intrinsic::riscv_vloxseg3:
2093 case Intrinsic::riscv_vloxseg4:
2094 case Intrinsic::riscv_vloxseg5:
2095 case Intrinsic::riscv_vloxseg6:
2096 case Intrinsic::riscv_vloxseg7:
2097 case Intrinsic::riscv_vloxseg8:
2101 case Intrinsic::riscv_vluxseg2:
2102 case Intrinsic::riscv_vluxseg3:
2103 case Intrinsic::riscv_vluxseg4:
2104 case Intrinsic::riscv_vluxseg5:
2105 case Intrinsic::riscv_vluxseg6:
2106 case Intrinsic::riscv_vluxseg7:
2107 case Intrinsic::riscv_vluxseg8:
2111 case Intrinsic::riscv_vloxseg2_mask:
2112 case Intrinsic::riscv_vloxseg3_mask:
2113 case Intrinsic::riscv_vloxseg4_mask:
2114 case Intrinsic::riscv_vloxseg5_mask:
2115 case Intrinsic::riscv_vloxseg6_mask:
2116 case Intrinsic::riscv_vloxseg7_mask:
2117 case Intrinsic::riscv_vloxseg8_mask:
2121 case Intrinsic::riscv_vluxseg2_mask:
2122 case Intrinsic::riscv_vluxseg3_mask:
2123 case Intrinsic::riscv_vluxseg4_mask:
2124 case Intrinsic::riscv_vluxseg5_mask:
2125 case Intrinsic::riscv_vluxseg6_mask:
2126 case Intrinsic::riscv_vluxseg7_mask:
2127 case Intrinsic::riscv_vluxseg8_mask:
2131 case Intrinsic::riscv_vlseg8ff:
2132 case Intrinsic::riscv_vlseg7ff:
2133 case Intrinsic::riscv_vlseg6ff:
2134 case Intrinsic::riscv_vlseg5ff:
2135 case Intrinsic::riscv_vlseg4ff:
2136 case Intrinsic::riscv_vlseg3ff:
2137 case Intrinsic::riscv_vlseg2ff: {
2141 case Intrinsic::riscv_vlseg8ff_mask:
2142 case Intrinsic::riscv_vlseg7ff_mask:
2143 case Intrinsic::riscv_vlseg6ff_mask:
2144 case Intrinsic::riscv_vlseg5ff_mask:
2145 case Intrinsic::riscv_vlseg4ff_mask:
2146 case Intrinsic::riscv_vlseg3ff_mask:
2147 case Intrinsic::riscv_vlseg2ff_mask: {
2151 case Intrinsic::riscv_vloxei:
2152 case Intrinsic::riscv_vloxei_mask:
2153 case Intrinsic::riscv_vluxei:
2154 case Intrinsic::riscv_vluxei_mask: {
2155 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2156 IntNo == Intrinsic::riscv_vluxei_mask;
2157 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2158 IntNo == Intrinsic::riscv_vloxei_mask;
2160 MVT VT =
Node->getSimpleValueType(0);
2173 "Element count mismatch");
2178 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2180 "values when XLEN=32");
2183 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2184 static_cast<unsigned>(IndexLMUL));
2193 case Intrinsic::riscv_vlm:
2194 case Intrinsic::riscv_vle:
2195 case Intrinsic::riscv_vle_mask:
2196 case Intrinsic::riscv_vlse:
2197 case Intrinsic::riscv_vlse_mask: {
2198 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2199 IntNo == Intrinsic::riscv_vlse_mask;
2201 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2203 MVT VT =
Node->getSimpleValueType(0);
2212 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2215 if (HasPassthruOperand)
2221 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2229 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2230 static_cast<unsigned>(LMUL));
2239 case Intrinsic::riscv_vleff:
2240 case Intrinsic::riscv_vleff_mask: {
2241 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2243 MVT VT =
Node->getSimpleValueType(0);
2255 RISCV::getVLEPseudo(IsMasked,
false,
true,
2256 Log2SEW,
static_cast<unsigned>(LMUL));
2264 case Intrinsic::riscv_nds_vln:
2265 case Intrinsic::riscv_nds_vln_mask:
2266 case Intrinsic::riscv_nds_vlnu:
2267 case Intrinsic::riscv_nds_vlnu_mask: {
2268 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2269 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2270 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2271 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2273 MVT VT =
Node->getSimpleValueType(0);
2285 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2290 CurDAG->setNodeMemRefs(Load, {
MemOp->getMemOperand()});
2299 unsigned IntNo =
Node->getConstantOperandVal(1);
2301 case Intrinsic::riscv_vsseg2:
2302 case Intrinsic::riscv_vsseg3:
2303 case Intrinsic::riscv_vsseg4:
2304 case Intrinsic::riscv_vsseg5:
2305 case Intrinsic::riscv_vsseg6:
2306 case Intrinsic::riscv_vsseg7:
2307 case Intrinsic::riscv_vsseg8: {
2312 case Intrinsic::riscv_vsseg2_mask:
2313 case Intrinsic::riscv_vsseg3_mask:
2314 case Intrinsic::riscv_vsseg4_mask:
2315 case Intrinsic::riscv_vsseg5_mask:
2316 case Intrinsic::riscv_vsseg6_mask:
2317 case Intrinsic::riscv_vsseg7_mask:
2318 case Intrinsic::riscv_vsseg8_mask: {
2323 case Intrinsic::riscv_vssseg2:
2324 case Intrinsic::riscv_vssseg3:
2325 case Intrinsic::riscv_vssseg4:
2326 case Intrinsic::riscv_vssseg5:
2327 case Intrinsic::riscv_vssseg6:
2328 case Intrinsic::riscv_vssseg7:
2329 case Intrinsic::riscv_vssseg8: {
2334 case Intrinsic::riscv_vssseg2_mask:
2335 case Intrinsic::riscv_vssseg3_mask:
2336 case Intrinsic::riscv_vssseg4_mask:
2337 case Intrinsic::riscv_vssseg5_mask:
2338 case Intrinsic::riscv_vssseg6_mask:
2339 case Intrinsic::riscv_vssseg7_mask:
2340 case Intrinsic::riscv_vssseg8_mask: {
2345 case Intrinsic::riscv_vsoxseg2:
2346 case Intrinsic::riscv_vsoxseg3:
2347 case Intrinsic::riscv_vsoxseg4:
2348 case Intrinsic::riscv_vsoxseg5:
2349 case Intrinsic::riscv_vsoxseg6:
2350 case Intrinsic::riscv_vsoxseg7:
2351 case Intrinsic::riscv_vsoxseg8:
2355 case Intrinsic::riscv_vsuxseg2:
2356 case Intrinsic::riscv_vsuxseg3:
2357 case Intrinsic::riscv_vsuxseg4:
2358 case Intrinsic::riscv_vsuxseg5:
2359 case Intrinsic::riscv_vsuxseg6:
2360 case Intrinsic::riscv_vsuxseg7:
2361 case Intrinsic::riscv_vsuxseg8:
2365 case Intrinsic::riscv_vsoxseg2_mask:
2366 case Intrinsic::riscv_vsoxseg3_mask:
2367 case Intrinsic::riscv_vsoxseg4_mask:
2368 case Intrinsic::riscv_vsoxseg5_mask:
2369 case Intrinsic::riscv_vsoxseg6_mask:
2370 case Intrinsic::riscv_vsoxseg7_mask:
2371 case Intrinsic::riscv_vsoxseg8_mask:
2375 case Intrinsic::riscv_vsuxseg2_mask:
2376 case Intrinsic::riscv_vsuxseg3_mask:
2377 case Intrinsic::riscv_vsuxseg4_mask:
2378 case Intrinsic::riscv_vsuxseg5_mask:
2379 case Intrinsic::riscv_vsuxseg6_mask:
2380 case Intrinsic::riscv_vsuxseg7_mask:
2381 case Intrinsic::riscv_vsuxseg8_mask:
2385 case Intrinsic::riscv_vsoxei:
2386 case Intrinsic::riscv_vsoxei_mask:
2387 case Intrinsic::riscv_vsuxei:
2388 case Intrinsic::riscv_vsuxei_mask: {
2389 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2390 IntNo == Intrinsic::riscv_vsuxei_mask;
2391 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2392 IntNo == Intrinsic::riscv_vsoxei_mask;
2394 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2407 "Element count mismatch");
2412 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2414 "values when XLEN=32");
2417 IsMasked, IsOrdered, IndexLog2EEW,
2418 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2427 case Intrinsic::riscv_vsm:
2428 case Intrinsic::riscv_vse:
2429 case Intrinsic::riscv_vse_mask:
2430 case Intrinsic::riscv_vsse:
2431 case Intrinsic::riscv_vsse_mask: {
2432 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2433 IntNo == Intrinsic::riscv_vsse_mask;
2435 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2437 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2449 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2457 case Intrinsic::riscv_sf_vc_x_se:
2458 case Intrinsic::riscv_sf_vc_i_se:
2464 case ISD::BITCAST: {
2465 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2477 case RISCVISD::TUPLE_INSERT: {
2481 auto Idx =
Node->getConstantOperandVal(2);
2485 MVT SubVecContainerVT = SubVecVT;
2488 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
2490 [[maybe_unused]]
bool ExactlyVecRegSized =
2492 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
2494 .getKnownMinValue()));
2495 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
2497 MVT ContainerVT = VT;
2499 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2501 const auto *
TRI = Subtarget->getRegisterInfo();
2503 std::tie(SubRegIdx, Idx) =
2505 ContainerVT, SubVecContainerVT, Idx,
TRI);
2515 [[maybe_unused]]
bool IsSubVecPartReg =
2519 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
2521 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
2522 "the subvector is smaller than a full-sized register");
2526 if (SubRegIdx == RISCV::NoSubRegister) {
2527 unsigned InRegClassID =
2531 "Unexpected subvector extraction");
2533 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
2539 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
2544 case RISCVISD::TUPLE_EXTRACT: {
2546 auto Idx =
Node->getConstantOperandVal(1);
2547 MVT InVT = V.getSimpleValueType();
2551 MVT SubVecContainerVT = VT;
2555 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2558 InVT =
TLI.getContainerForFixedLengthVector(InVT);
2560 const auto *
TRI = Subtarget->getRegisterInfo();
2562 std::tie(SubRegIdx, Idx) =
2564 InVT, SubVecContainerVT, Idx,
TRI);
2574 if (SubRegIdx == RISCV::NoSubRegister) {
2578 "Unexpected subvector extraction");
2581 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
2586 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
2590 case RISCVISD::VMV_S_X_VL:
2591 case RISCVISD::VFMV_S_F_VL:
2592 case RISCVISD::VMV_V_X_VL:
2593 case RISCVISD::VFMV_V_F_VL: {
2595 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
2596 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
2597 if (!
Node->getOperand(0).isUndef())
2603 if (!Ld || Ld->isIndexed())
2605 EVT MemVT = Ld->getMemoryVT();
2631 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
2635 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
2641 Operands.append({VL, SEW, PolicyOp, Ld->getChain()});
2645 false, IsStrided,
false,
2646 Log2SEW,
static_cast<unsigned>(LMUL));
2652 CurDAG->setNodeMemRefs(Load, {Ld->getMemOperand()});
2658 unsigned Locality =
Node->getConstantOperandVal(3);
2666 int NontemporalLevel = 0;
2669 NontemporalLevel = 3;
2672 NontemporalLevel = 1;
2675 NontemporalLevel = 0;
2681 if (NontemporalLevel & 0b1)
2683 if (NontemporalLevel & 0b10)