1010 if (
Node->isMachineOpcode()) {
1012 Node->setNodeId(-1);
1018 unsigned Opcode =
Node->getOpcode();
1019 MVT XLenVT = Subtarget->getXLenVT();
1021 MVT VT =
Node->getSimpleValueType(0);
1023 bool HasBitTest = Subtarget->hasBEXTILike();
1027 assert((VT == Subtarget->getXLenVT() || VT == MVT::i32) &&
"Unexpected VT");
1029 if (ConstNode->isZero()) {
1031 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1035 int64_t Imm = ConstNode->getSExtValue();
1057 Imm = ((
uint64_t)Imm << 32) | (Imm & 0xFFFFFFFF);
1066 bool Is64Bit = Subtarget->is64Bit();
1067 bool HasZdinx = Subtarget->hasStdExtZdinx();
1069 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1074 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1075 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1077 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1088 assert(Subtarget->hasStdExtZfbfmin());
1089 Opc = RISCV::FMV_H_X;
1092 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1095 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1100 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1104 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1109 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1111 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT, Imm).getNode();
1112 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1114 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT, Imm).getNode();
1115 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1116 Res =
CurDAG->getMachineNode(
1124 Opc = RISCV::FSGNJN_D;
1126 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1134 case RISCVISD::BuildGPRPair:
1135 case RISCVISD::BuildPairF64: {
1136 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1139 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::BuildGPRPair) &&
1140 "BuildPairF64 only handled here on rv32i_zdinx");
1143 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
1144 Node->getOperand(0),
1145 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
1146 Node->getOperand(1),
1147 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1153 case RISCVISD::SplitGPRPair:
1154 case RISCVISD::SplitF64: {
1155 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1156 assert((!Subtarget->is64Bit() || Opcode == RISCVISD::SplitGPRPair) &&
1157 "SplitF64 only handled here on rv32i_zdinx");
1161 Node->getValueType(0),
1162 Node->getOperand(0));
1168 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1176 assert(Opcode != RISCVISD::SplitGPRPair &&
1177 "SplitGPRPair should already be handled");
1179 if (!Subtarget->hasStdExtZfa())
1181 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1182 "Unexpected subtarget");
1187 Node->getOperand(0));
1192 Node->getOperand(0));
1207 unsigned ShAmt = N1C->getZExtValue();
1211 unsigned XLen = Subtarget->getXLen();
1214 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1219 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1222 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1226 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1227 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1238 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1241 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1255 unsigned ShAmt = N1C->getZExtValue();
1261 unsigned XLen = Subtarget->getXLen();
1264 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1267 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1270 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1287 if (ShAmt >= TrailingOnes)
1290 if (TrailingOnes == 32) {
1292 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1303 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1305 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1311 const unsigned Msb = TrailingOnes - 1;
1312 const unsigned Lsb = ShAmt;
1316 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1319 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1322 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1347 unsigned ShAmt = N1C->getZExtValue();
1351 if (ExtSize >= 32 || ShAmt >= ExtSize)
1353 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1356 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1359 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1386 unsigned C2 =
C->getZExtValue();
1387 unsigned XLen = Subtarget->getXLen();
1388 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1396 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1408 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1418 if (C2 + 32 == Leading) {
1420 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1430 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1434 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1435 CurDAG->getTargetConstant(31,
DL, VT));
1437 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1438 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1451 const unsigned Lsb = C2;
1457 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1461 Skip |= HasBitTest && Leading == XLen - 1;
1462 if (OneUseOrZExtW && !Skip) {
1464 RISCV::SLLI,
DL, VT,
X,
1465 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1468 CurDAG->getTargetConstant(Leading,
DL, VT));
1480 if (C2 + Leading < XLen &&
1483 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1485 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1486 CurDAG->getTargetConstant(C2,
DL, VT));
1499 const unsigned Msb = XLen - Leading - 1;
1500 const unsigned Lsb = C2;
1504 if (OneUseOrZExtW && !IsCANDI) {
1506 if (Subtarget->hasStdExtZbkb() && C1 == 0xff00 && C2 == 8) {
1508 RISCV::PACKH,
DL, VT,
1509 CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT()),
X);
1515 RISCV::SLLI,
DL, VT,
X,
1516 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1519 CurDAG->getTargetConstant(Leading,
DL, VT));
1531 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1533 unsigned SrliOpc = RISCV::SRLI;
1537 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1538 SrliOpc = RISCV::SRLIW;
1539 X =
X.getOperand(0);
1543 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1546 CurDAG->getTargetConstant(Trailing,
DL, VT));
1551 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1552 OneUseOrZExtW && !IsCANDI) {
1554 RISCV::SRLIW,
DL, VT,
X,
1555 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1558 CurDAG->getTargetConstant(Trailing,
DL, VT));
1563 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1564 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1566 RISCV::SRLI,
DL, VT,
X,
1567 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1569 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1570 CurDAG->getTargetConstant(Trailing,
DL, VT));
1581 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1583 RISCV::SRLI,
DL, VT,
X,
1584 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1587 CurDAG->getTargetConstant(Trailing,
DL, VT));
1592 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1594 RISCV::SRLIW,
DL, VT,
X,
1595 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1598 CurDAG->getTargetConstant(Trailing,
DL, VT));
1604 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1605 Subtarget->hasStdExtZba()) {
1607 RISCV::SRLI,
DL, VT,
X,
1608 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1610 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1611 CurDAG->getTargetConstant(Trailing,
DL, VT));
1618 const uint64_t C1 = N1C->getZExtValue();
1623 unsigned XLen = Subtarget->getXLen();
1624 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1629 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1632 X.getConstantOperandVal(1) == 32;
1639 RISCV::SRAI,
DL, VT,
X,
1640 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1643 CurDAG->getTargetConstant(Leading,
DL, VT));
1655 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1658 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1661 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1664 CurDAG->getTargetConstant(Trailing,
DL, VT));
1677 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1678 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1698 if (!N1C || !N1C->hasOneUse())
1719 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1721 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1726 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1728 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1735 unsigned XLen = Subtarget->getXLen();
1741 unsigned ConstantShift = XLen - LeadingZeros;
1745 uint64_t ShiftedC1 = C1 << ConstantShift;
1754 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1764 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
1774 bool Simm12 =
false;
1775 bool SignExtend = Load->getExtensionType() ==
ISD::SEXTLOAD;
1778 int ConstantVal = ConstantOffset->getSExtValue();
1785 unsigned Opcode = 0;
1786 switch (Load->getMemoryVT().getSimpleVT().SimpleTy) {
1788 if (Simm12 && SignExtend)
1789 Opcode = RISCV::CV_LB_ri_inc;
1790 else if (Simm12 && !SignExtend)
1791 Opcode = RISCV::CV_LBU_ri_inc;
1792 else if (!Simm12 && SignExtend)
1793 Opcode = RISCV::CV_LB_rr_inc;
1795 Opcode = RISCV::CV_LBU_rr_inc;
1798 if (Simm12 && SignExtend)
1799 Opcode = RISCV::CV_LH_ri_inc;
1800 else if (Simm12 && !SignExtend)
1801 Opcode = RISCV::CV_LHU_ri_inc;
1802 else if (!Simm12 && SignExtend)
1803 Opcode = RISCV::CV_LH_rr_inc;
1805 Opcode = RISCV::CV_LHU_rr_inc;
1809 Opcode = RISCV::CV_LW_ri_inc;
1811 Opcode = RISCV::CV_LW_rr_inc;
1826 case RISCVISD::LD_RV32: {
1827 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
1836 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
1848 case RISCVISD::SD_RV32: {
1860 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
1863 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32),
Lo,
1864 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32),
Hi,
1865 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1867 RegPair =
SDValue(
CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE,
DL,
1879 case RISCVISD::PPACK_DH: {
1880 assert(Subtarget->enablePExtCodeGen() && Subtarget->isRV32());
1888 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32), Val0,
1889 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32), Val2,
1890 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1896 CurDAG->getTargetConstant(RISCV::GPRPairRegClassID,
DL, MVT::i32), Val1,
1897 CurDAG->getTargetConstant(RISCV::sub_gpr_even,
DL, MVT::i32), Val3,
1898 CurDAG->getTargetConstant(RISCV::sub_gpr_odd,
DL, MVT::i32)};
1901 MVT::Untyped, Ops1),
1905 RISCV::PPAIRE_DB,
DL, MVT::Untyped, {RegPair0, RegPair1});
1908 MVT::i32,
SDValue(PackDH, 0));
1910 MVT::i32,
SDValue(PackDH, 0));
1917 unsigned IntNo =
Node->getConstantOperandVal(0);
1922 case Intrinsic::riscv_vmsgeu:
1923 case Intrinsic::riscv_vmsge: {
1926 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
1927 bool IsCmpConstant =
false;
1928 bool IsCmpMinimum =
false;
1936 IsCmpConstant =
true;
1937 CVal =
C->getSExtValue();
1938 if (CVal >= -15 && CVal <= 16) {
1939 if (!IsUnsigned || CVal != 0)
1941 IsCmpMinimum =
true;
1945 IsCmpMinimum =
true;
1948 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
1952#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
1953 case RISCVVType::lmulenum: \
1954 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
1955 : RISCV::PseudoVMSLT_VX_##suffix; \
1956 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
1957 : RISCV::PseudoVMSGT_VX_##suffix; \
1966#undef CASE_VMSLT_OPCODES
1972#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
1973 case RISCVVType::lmulenum: \
1974 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
1975 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
1984#undef CASE_VMNAND_VMSET_OPCODES
1995 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
1999 if (IsCmpConstant) {
2004 {Src1, Imm, VL, SEW}));
2011 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2014 {Cmp, Cmp, VL, MaskSEW}));
2017 case Intrinsic::riscv_vmsgeu_mask:
2018 case Intrinsic::riscv_vmsge_mask: {
2021 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2022 bool IsCmpConstant =
false;
2023 bool IsCmpMinimum =
false;
2031 IsCmpConstant =
true;
2032 CVal =
C->getSExtValue();
2033 if (CVal >= -15 && CVal <= 16) {
2034 if (!IsUnsigned || CVal != 0)
2036 IsCmpMinimum =
true;
2040 IsCmpMinimum =
true;
2043 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2044 VMOROpcode, VMSGTMaskOpcode;
2048#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2049 case RISCVVType::lmulenum: \
2050 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2051 : RISCV::PseudoVMSLT_VX_##suffix; \
2052 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2053 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2054 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2055 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2064#undef CASE_VMSLT_OPCODES
2070#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2071 case RISCVVType::lmulenum: \
2072 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2073 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2074 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2083#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2097 if (Mask == MaskedOff) {
2102 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2103 {Mask, MaskedOff, VL, MaskSEW}));
2110 if (Mask == MaskedOff) {
2112 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2115 {Mask, Cmp, VL, MaskSEW}));
2122 if (IsCmpConstant) {
2127 VMSGTMaskOpcode,
DL, VT,
2128 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2138 {MaskedOff, Src1, Src2, Mask,
2139 VL, SEW, PolicyOp}),
2143 {Cmp, Mask, VL, MaskSEW}));
2146 case Intrinsic::riscv_vsetvli:
2147 case Intrinsic::riscv_vsetvlimax:
2149 case Intrinsic::riscv_sf_vsettnt:
2150 case Intrinsic::riscv_sf_vsettm:
2151 case Intrinsic::riscv_sf_vsettk:
2157 unsigned IntNo =
Node->getConstantOperandVal(1);
2162 case Intrinsic::riscv_vlseg2:
2163 case Intrinsic::riscv_vlseg3:
2164 case Intrinsic::riscv_vlseg4:
2165 case Intrinsic::riscv_vlseg5:
2166 case Intrinsic::riscv_vlseg6:
2167 case Intrinsic::riscv_vlseg7:
2168 case Intrinsic::riscv_vlseg8: {
2173 case Intrinsic::riscv_vlseg2_mask:
2174 case Intrinsic::riscv_vlseg3_mask:
2175 case Intrinsic::riscv_vlseg4_mask:
2176 case Intrinsic::riscv_vlseg5_mask:
2177 case Intrinsic::riscv_vlseg6_mask:
2178 case Intrinsic::riscv_vlseg7_mask:
2179 case Intrinsic::riscv_vlseg8_mask: {
2184 case Intrinsic::riscv_vlsseg2:
2185 case Intrinsic::riscv_vlsseg3:
2186 case Intrinsic::riscv_vlsseg4:
2187 case Intrinsic::riscv_vlsseg5:
2188 case Intrinsic::riscv_vlsseg6:
2189 case Intrinsic::riscv_vlsseg7:
2190 case Intrinsic::riscv_vlsseg8: {
2195 case Intrinsic::riscv_vlsseg2_mask:
2196 case Intrinsic::riscv_vlsseg3_mask:
2197 case Intrinsic::riscv_vlsseg4_mask:
2198 case Intrinsic::riscv_vlsseg5_mask:
2199 case Intrinsic::riscv_vlsseg6_mask:
2200 case Intrinsic::riscv_vlsseg7_mask:
2201 case Intrinsic::riscv_vlsseg8_mask: {
2206 case Intrinsic::riscv_vloxseg2:
2207 case Intrinsic::riscv_vloxseg3:
2208 case Intrinsic::riscv_vloxseg4:
2209 case Intrinsic::riscv_vloxseg5:
2210 case Intrinsic::riscv_vloxseg6:
2211 case Intrinsic::riscv_vloxseg7:
2212 case Intrinsic::riscv_vloxseg8:
2216 case Intrinsic::riscv_vluxseg2:
2217 case Intrinsic::riscv_vluxseg3:
2218 case Intrinsic::riscv_vluxseg4:
2219 case Intrinsic::riscv_vluxseg5:
2220 case Intrinsic::riscv_vluxseg6:
2221 case Intrinsic::riscv_vluxseg7:
2222 case Intrinsic::riscv_vluxseg8:
2226 case Intrinsic::riscv_vloxseg2_mask:
2227 case Intrinsic::riscv_vloxseg3_mask:
2228 case Intrinsic::riscv_vloxseg4_mask:
2229 case Intrinsic::riscv_vloxseg5_mask:
2230 case Intrinsic::riscv_vloxseg6_mask:
2231 case Intrinsic::riscv_vloxseg7_mask:
2232 case Intrinsic::riscv_vloxseg8_mask:
2236 case Intrinsic::riscv_vluxseg2_mask:
2237 case Intrinsic::riscv_vluxseg3_mask:
2238 case Intrinsic::riscv_vluxseg4_mask:
2239 case Intrinsic::riscv_vluxseg5_mask:
2240 case Intrinsic::riscv_vluxseg6_mask:
2241 case Intrinsic::riscv_vluxseg7_mask:
2242 case Intrinsic::riscv_vluxseg8_mask:
2246 case Intrinsic::riscv_vlseg8ff:
2247 case Intrinsic::riscv_vlseg7ff:
2248 case Intrinsic::riscv_vlseg6ff:
2249 case Intrinsic::riscv_vlseg5ff:
2250 case Intrinsic::riscv_vlseg4ff:
2251 case Intrinsic::riscv_vlseg3ff:
2252 case Intrinsic::riscv_vlseg2ff: {
2256 case Intrinsic::riscv_vlseg8ff_mask:
2257 case Intrinsic::riscv_vlseg7ff_mask:
2258 case Intrinsic::riscv_vlseg6ff_mask:
2259 case Intrinsic::riscv_vlseg5ff_mask:
2260 case Intrinsic::riscv_vlseg4ff_mask:
2261 case Intrinsic::riscv_vlseg3ff_mask:
2262 case Intrinsic::riscv_vlseg2ff_mask: {
2266 case Intrinsic::riscv_vloxei:
2267 case Intrinsic::riscv_vloxei_mask:
2268 case Intrinsic::riscv_vluxei:
2269 case Intrinsic::riscv_vluxei_mask: {
2270 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2271 IntNo == Intrinsic::riscv_vluxei_mask;
2272 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2273 IntNo == Intrinsic::riscv_vloxei_mask;
2275 MVT VT =
Node->getSimpleValueType(0);
2288 "Element count mismatch");
2293 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2295 "index values when XLEN=32");
2298 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2299 static_cast<unsigned>(IndexLMUL));
2301 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2308 case Intrinsic::riscv_vlm:
2309 case Intrinsic::riscv_vle:
2310 case Intrinsic::riscv_vle_mask:
2311 case Intrinsic::riscv_vlse:
2312 case Intrinsic::riscv_vlse_mask: {
2313 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2314 IntNo == Intrinsic::riscv_vlse_mask;
2316 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2318 MVT VT =
Node->getSimpleValueType(0);
2327 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2330 if (HasPassthruOperand)
2336 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2344 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2345 static_cast<unsigned>(LMUL));
2347 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2354 case Intrinsic::riscv_vleff:
2355 case Intrinsic::riscv_vleff_mask: {
2356 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2358 MVT VT =
Node->getSimpleValueType(0);
2370 RISCV::getVLEPseudo(IsMasked,
false,
true,
2371 Log2SEW,
static_cast<unsigned>(LMUL));
2373 P->Pseudo,
DL,
Node->getVTList(), Operands);
2379 case Intrinsic::riscv_nds_vln:
2380 case Intrinsic::riscv_nds_vln_mask:
2381 case Intrinsic::riscv_nds_vlnu:
2382 case Intrinsic::riscv_nds_vlnu_mask: {
2383 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2384 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2385 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2386 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2388 MVT VT =
Node->getSimpleValueType(0);
2400 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2402 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2405 CurDAG->setNodeMemRefs(Load, {
MemOp->getMemOperand()});
2414 unsigned IntNo =
Node->getConstantOperandVal(1);
2416 case Intrinsic::riscv_vsseg2:
2417 case Intrinsic::riscv_vsseg3:
2418 case Intrinsic::riscv_vsseg4:
2419 case Intrinsic::riscv_vsseg5:
2420 case Intrinsic::riscv_vsseg6:
2421 case Intrinsic::riscv_vsseg7:
2422 case Intrinsic::riscv_vsseg8: {
2427 case Intrinsic::riscv_vsseg2_mask:
2428 case Intrinsic::riscv_vsseg3_mask:
2429 case Intrinsic::riscv_vsseg4_mask:
2430 case Intrinsic::riscv_vsseg5_mask:
2431 case Intrinsic::riscv_vsseg6_mask:
2432 case Intrinsic::riscv_vsseg7_mask:
2433 case Intrinsic::riscv_vsseg8_mask: {
2438 case Intrinsic::riscv_vssseg2:
2439 case Intrinsic::riscv_vssseg3:
2440 case Intrinsic::riscv_vssseg4:
2441 case Intrinsic::riscv_vssseg5:
2442 case Intrinsic::riscv_vssseg6:
2443 case Intrinsic::riscv_vssseg7:
2444 case Intrinsic::riscv_vssseg8: {
2449 case Intrinsic::riscv_vssseg2_mask:
2450 case Intrinsic::riscv_vssseg3_mask:
2451 case Intrinsic::riscv_vssseg4_mask:
2452 case Intrinsic::riscv_vssseg5_mask:
2453 case Intrinsic::riscv_vssseg6_mask:
2454 case Intrinsic::riscv_vssseg7_mask:
2455 case Intrinsic::riscv_vssseg8_mask: {
2460 case Intrinsic::riscv_vsoxseg2:
2461 case Intrinsic::riscv_vsoxseg3:
2462 case Intrinsic::riscv_vsoxseg4:
2463 case Intrinsic::riscv_vsoxseg5:
2464 case Intrinsic::riscv_vsoxseg6:
2465 case Intrinsic::riscv_vsoxseg7:
2466 case Intrinsic::riscv_vsoxseg8:
2470 case Intrinsic::riscv_vsuxseg2:
2471 case Intrinsic::riscv_vsuxseg3:
2472 case Intrinsic::riscv_vsuxseg4:
2473 case Intrinsic::riscv_vsuxseg5:
2474 case Intrinsic::riscv_vsuxseg6:
2475 case Intrinsic::riscv_vsuxseg7:
2476 case Intrinsic::riscv_vsuxseg8:
2480 case Intrinsic::riscv_vsoxseg2_mask:
2481 case Intrinsic::riscv_vsoxseg3_mask:
2482 case Intrinsic::riscv_vsoxseg4_mask:
2483 case Intrinsic::riscv_vsoxseg5_mask:
2484 case Intrinsic::riscv_vsoxseg6_mask:
2485 case Intrinsic::riscv_vsoxseg7_mask:
2486 case Intrinsic::riscv_vsoxseg8_mask:
2490 case Intrinsic::riscv_vsuxseg2_mask:
2491 case Intrinsic::riscv_vsuxseg3_mask:
2492 case Intrinsic::riscv_vsuxseg4_mask:
2493 case Intrinsic::riscv_vsuxseg5_mask:
2494 case Intrinsic::riscv_vsuxseg6_mask:
2495 case Intrinsic::riscv_vsuxseg7_mask:
2496 case Intrinsic::riscv_vsuxseg8_mask:
2500 case Intrinsic::riscv_vsoxei:
2501 case Intrinsic::riscv_vsoxei_mask:
2502 case Intrinsic::riscv_vsuxei:
2503 case Intrinsic::riscv_vsuxei_mask: {
2504 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2505 IntNo == Intrinsic::riscv_vsuxei_mask;
2506 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2507 IntNo == Intrinsic::riscv_vsoxei_mask;
2509 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2522 "Element count mismatch");
2527 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2529 "index values when XLEN=32");
2532 IsMasked, IsOrdered, IndexLog2EEW,
2533 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2535 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2542 case Intrinsic::riscv_vsm:
2543 case Intrinsic::riscv_vse:
2544 case Intrinsic::riscv_vse_mask:
2545 case Intrinsic::riscv_vsse:
2546 case Intrinsic::riscv_vsse_mask: {
2547 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2548 IntNo == Intrinsic::riscv_vsse_mask;
2550 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2552 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2564 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2566 CurDAG->getMachineNode(
P->Pseudo,
DL,
Node->getVTList(), Operands);
2572 case Intrinsic::riscv_sf_vc_x_se:
2573 case Intrinsic::riscv_sf_vc_i_se:
2576 case Intrinsic::riscv_sf_vlte8:
2577 case Intrinsic::riscv_sf_vlte16:
2578 case Intrinsic::riscv_sf_vlte32:
2579 case Intrinsic::riscv_sf_vlte64: {
2581 unsigned PseudoInst;
2583 case Intrinsic::riscv_sf_vlte8:
2584 PseudoInst = RISCV::PseudoSF_VLTE8;
2587 case Intrinsic::riscv_sf_vlte16:
2588 PseudoInst = RISCV::PseudoSF_VLTE16;
2591 case Intrinsic::riscv_sf_vlte32:
2592 PseudoInst = RISCV::PseudoSF_VLTE32;
2595 case Intrinsic::riscv_sf_vlte64:
2596 PseudoInst = RISCV::PseudoSF_VLTE64;
2604 Node->getOperand(3),
2605 Node->getOperand(4),
2608 Node->getOperand(0)};
2611 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2612 CurDAG->setNodeMemRefs(TileLoad,
2618 case Intrinsic::riscv_sf_mm_s_s:
2619 case Intrinsic::riscv_sf_mm_s_u:
2620 case Intrinsic::riscv_sf_mm_u_s:
2621 case Intrinsic::riscv_sf_mm_u_u:
2622 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2623 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2624 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2625 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2626 case Intrinsic::riscv_sf_mm_f_f: {
2627 bool HasFRM =
false;
2628 unsigned PseudoInst;
2630 case Intrinsic::riscv_sf_mm_s_s:
2631 PseudoInst = RISCV::PseudoSF_MM_S_S;
2633 case Intrinsic::riscv_sf_mm_s_u:
2634 PseudoInst = RISCV::PseudoSF_MM_S_U;
2636 case Intrinsic::riscv_sf_mm_u_s:
2637 PseudoInst = RISCV::PseudoSF_MM_U_S;
2639 case Intrinsic::riscv_sf_mm_u_u:
2640 PseudoInst = RISCV::PseudoSF_MM_U_U;
2642 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2643 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
2646 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2647 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
2650 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2651 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
2654 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2655 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
2658 case Intrinsic::riscv_sf_mm_f_f:
2659 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
2660 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
2662 PseudoInst = RISCV::PseudoSF_MM_F_F;
2678 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
2687 Operands.append({TmOp, TnOp, TkOp,
2688 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
2692 CurDAG->getMachineNode(PseudoInst,
DL,
Node->getVTList(), Operands);
2697 case Intrinsic::riscv_sf_vtzero_t: {
2704 auto *NewNode =
CurDAG->getMachineNode(
2705 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
2706 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
2716 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2725 if (Subtarget->enablePExtCodeGen()) {
2727 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
2728 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
2730 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
2731 SrcVT == MVT::v2i32)) ||
2732 (SrcVT == MVT::i64 &&
2733 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
2734 if (Is32BitCast || Is64BitCast) {
2743 if (Subtarget->enablePExtCodeGen()) {
2744 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
2745 if ((VT == MVT::v2i32 && SrcVT == MVT::i64) ||
2746 (VT == MVT::v4i8 && SrcVT == MVT::i32)) {
2754 case RISCVISD::TUPLE_INSERT: {
2758 auto Idx =
Node->getConstantOperandVal(2);
2762 MVT SubVecContainerVT = SubVecVT;
2765 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
2767 [[maybe_unused]]
bool ExactlyVecRegSized =
2769 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
2771 .getKnownMinValue()));
2772 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
2774 MVT ContainerVT = VT;
2776 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2778 const auto *
TRI = Subtarget->getRegisterInfo();
2780 std::tie(SubRegIdx, Idx) =
2782 ContainerVT, SubVecContainerVT, Idx,
TRI);
2792 [[maybe_unused]]
bool IsSubVecPartReg =
2796 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
2798 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
2799 "the subvector is smaller than a full-sized register");
2803 if (SubRegIdx == RISCV::NoSubRegister) {
2804 unsigned InRegClassID =
2808 "Unexpected subvector extraction");
2810 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
2816 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
2821 case RISCVISD::TUPLE_EXTRACT: {
2823 auto Idx =
Node->getConstantOperandVal(1);
2824 MVT InVT = V.getSimpleValueType();
2828 MVT SubVecContainerVT = VT;
2832 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
2835 InVT =
TLI.getContainerForFixedLengthVector(InVT);
2837 const auto *
TRI = Subtarget->getRegisterInfo();
2839 std::tie(SubRegIdx, Idx) =
2841 InVT, SubVecContainerVT, Idx,
TRI);
2851 if (SubRegIdx == RISCV::NoSubRegister) {
2855 "Unexpected subvector extraction");
2858 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
2863 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
2867 case RISCVISD::VMV_S_X_VL:
2868 case RISCVISD::VFMV_S_F_VL:
2869 case RISCVISD::VMV_V_X_VL:
2870 case RISCVISD::VFMV_V_F_VL: {
2872 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
2873 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
2874 if (!
Node->getOperand(0).isUndef())
2880 if (!Ld || Ld->isIndexed())
2882 EVT MemVT = Ld->getMemoryVT();
2908 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
2912 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
2918 Operands.
append({VL, SEW, PolicyOp, Ld->getChain()});
2922 false, IsStrided,
false,
2923 Log2SEW,
static_cast<unsigned>(LMUL));
2925 CurDAG->getMachineNode(
P->Pseudo,
DL, {VT, MVT::Other}, Operands);
2929 CurDAG->setNodeMemRefs(Load, {Ld->getMemOperand()});
2935 unsigned Locality =
Node->getConstantOperandVal(3);
2943 int NontemporalLevel = 0;
2946 NontemporalLevel = 3;
2949 NontemporalLevel = 1;
2952 NontemporalLevel = 0;
2958 if (NontemporalLevel & 0b1)
2960 if (NontemporalLevel & 0b10)