1180 if (
Node->isMachineOpcode()) {
1182 Node->setNodeId(-1);
1188 unsigned Opcode =
Node->getOpcode();
1189 MVT XLenVT = Subtarget->getXLenVT();
1191 MVT VT =
Node->getSimpleValueType(0);
1193 bool HasBitTest = Subtarget->hasBEXTILike();
1197 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT!");
1199 if (ConstNode->isZero()) {
1201 CurDAG->getCopyFromReg(
CurDAG->getEntryNode(),
DL, RISCV::X0, VT);
1205 int64_t
Imm = ConstNode->getSExtValue();
1241 Imm = ((uint64_t)
Imm << 32) | (
Imm & 0xFFFFFFFF);
1251 bool Is64Bit = Subtarget->is64Bit();
1252 bool HasZdinx = Subtarget->hasStdExtZdinx();
1254 bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
1259 if (VT == MVT::f64 && HasZdinx && !Is64Bit)
1260 Imm =
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
1262 Imm =
CurDAG->getRegister(RISCV::X0, XLenVT);
1273 assert(Subtarget->hasStdExtZfbfmin());
1274 Opc = RISCV::FMV_H_X;
1277 Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
1280 Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
1285 assert((Subtarget->is64Bit() || APF.
isZero()) &&
"Unexpected constant");
1289 Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
1294 if (VT.
SimpleTy == MVT::f16 &&
Opc == RISCV::COPY) {
1296 CurDAG->getTargetExtractSubreg(RISCV::sub_16,
DL, VT,
Imm).getNode();
1297 }
else if (VT.
SimpleTy == MVT::f32 &&
Opc == RISCV::COPY) {
1299 CurDAG->getTargetExtractSubreg(RISCV::sub_32,
DL, VT,
Imm).getNode();
1300 }
else if (
Opc == RISCV::FCVT_D_W_IN32X ||
Opc == RISCV::FCVT_D_W)
1301 Res =
CurDAG->getMachineNode(
1309 Opc = RISCV::FSGNJN_D;
1311 Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
1319 case RISCVISD::BuildGPRPair:
1320 case RISCVISD::BuildPairF64:
1321 case RISCVISD::BuildPairGPRVec: {
1322 if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
1325 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::BuildPairF64) &&
1326 "BuildPairF64 only handled here on rv32i_zdinx");
1333 case RISCVISD::SplitGPRPair:
1334 case RISCVISD::SplitF64:
1335 case RISCVISD::SplitGPRVec: {
1336 if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
1337 assert((!Subtarget->is64Bit() || Opcode != RISCVISD::SplitF64) &&
1338 "SplitF64 only handled here on rv32i_zdinx");
1342 Node->getValueType(0),
1343 Node->getOperand(0));
1349 RISCV::sub_gpr_odd,
DL,
Node->getValueType(1),
Node->getOperand(0));
1357 if (!Subtarget->hasStdExtZfa())
1359 assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
1360 "Unexpected subtarget");
1365 Node->getOperand(0));
1370 Node->getOperand(0));
1385 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT!");
1386 unsigned ShAmt = N1C->getZExtValue();
1387 assert(ShAmt > 0 && ShAmt < Subtarget->getXLen() &&
1388 "Unexpected shift amount!");
1392 unsigned XLen = Subtarget->getXLen();
1395 if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
1400 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1403 CurDAG->getTargetConstant(TrailingZeros + ShAmt,
DL, VT));
1407 if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
1408 XLen - LeadingZeros > 11 && LeadingZeros != 32) {
1419 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1422 CurDAG->getTargetConstant(LeadingZeros - ShAmt,
DL, VT));
1436 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT!");
1437 unsigned ShAmt = N1C->getZExtValue();
1438 assert(ShAmt > 0 && ShAmt < Subtarget->getXLen() &&
1439 "Unexpected shift amount!");
1445 unsigned XLen = Subtarget->getXLen();
1448 if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
1451 CurDAG->getTargetConstant(TrailingZeros,
DL, VT));
1454 CurDAG->getTargetConstant(TrailingZeros - ShAmt,
DL, VT));
1471 if (ShAmt >= TrailingOnes)
1474 if (TrailingOnes == 32) {
1476 Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI,
DL, VT,
1487 if (HasBitTest && ShAmt + 1 == TrailingOnes) {
1489 Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST,
DL, VT,
1495 const unsigned Msb = TrailingOnes - 1;
1496 const unsigned Lsb = ShAmt;
1500 unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
1503 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1506 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1531 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT!");
1532 unsigned ShAmt = N1C->getZExtValue();
1533 assert(ShAmt > 0 && ShAmt < Subtarget->getXLen() &&
1534 "Unexpected shift amount!");
1538 if (ExtSize >= 32 || ShAmt >= ExtSize)
1540 unsigned LShAmt = Subtarget->getXLen() - ExtSize;
1543 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1546 CurDAG->getTargetConstant(LShAmt + ShAmt,
DL, VT));
1565 unsigned ShAmt = ShAmtC->getZExtValue();
1566 unsigned XLen = Subtarget->getXLen();
1569 if (ExtSize >= 32 || ShAmt >= XLen - ExtSize)
1572 unsigned LShAmt = XLen - ExtSize - ShAmt;
1575 CurDAG->getTargetConstant(LShAmt,
DL, VT));
1578 CurDAG->getTargetConstant(XLen - ExtSize,
DL, VT));
1597 assert(VT == Subtarget->getXLenVT() &&
"Unexpected VT!");
1606 unsigned C2 =
C->getZExtValue();
1607 unsigned XLen = Subtarget->getXLen();
1608 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1616 bool IsCANDI =
isInt<6>(N1C->getSExtValue());
1618 uint64_t C1 = N1C->getZExtValue();
1628 bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
1638 if (C2 + 32 == Leading) {
1640 RISCV::SRLIW,
DL, VT,
X,
CurDAG->getTargetConstant(C2,
DL, VT));
1650 if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
1654 CurDAG->getMachineNode(RISCV::SRAIW,
DL, VT,
X.getOperand(0),
1655 CurDAG->getTargetConstant(31,
DL, VT));
1657 RISCV::SRLIW,
DL, VT,
SDValue(SRAIW, 0),
1658 CurDAG->getTargetConstant(Leading - 32,
DL, VT));
1671 const unsigned Lsb = C2;
1677 bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
1681 Skip |= HasBitTest && Leading == XLen - 1;
1682 if (OneUseOrZExtW && !Skip) {
1684 RISCV::SLLI,
DL, VT,
X,
1685 CurDAG->getTargetConstant(Leading - C2,
DL, VT));
1688 CurDAG->getTargetConstant(Leading,
DL, VT));
1700 if (C2 + Leading < XLen &&
1703 if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
1705 CurDAG->getMachineNode(RISCV::SLLI_UW,
DL, VT,
X,
1706 CurDAG->getTargetConstant(C2,
DL, VT));
1719 const unsigned Msb = XLen - Leading - 1;
1720 const unsigned Lsb = C2;
1724 if (OneUseOrZExtW && !IsCANDI) {
1726 if (Subtarget->hasStdExtZbkb() && C1 == 0xff00 && C2 == 8) {
1728 RISCV::PACKH,
DL, VT,
1729 CurDAG->getRegister(RISCV::X0, Subtarget->getXLenVT()),
X);
1735 RISCV::SLLI,
DL, VT,
X,
1736 CurDAG->getTargetConstant(C2 + Leading,
DL, VT));
1739 CurDAG->getTargetConstant(Leading,
DL, VT));
1751 if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
1753 unsigned SrliOpc = RISCV::SRLI;
1757 X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
1758 SrliOpc = RISCV::SRLIW;
1759 X =
X.getOperand(0);
1763 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1766 CurDAG->getTargetConstant(Trailing,
DL, VT));
1771 if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
1772 OneUseOrZExtW && !IsCANDI) {
1774 RISCV::SRLIW,
DL, VT,
X,
1775 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1778 CurDAG->getTargetConstant(Trailing,
DL, VT));
1783 if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
1784 OneUseOrZExtW && Subtarget->hasStdExtZba()) {
1786 RISCV::SRLI,
DL, VT,
X,
1787 CurDAG->getTargetConstant(C2 + Trailing,
DL, VT));
1789 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1790 CurDAG->getTargetConstant(Trailing,
DL, VT));
1801 if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
1803 RISCV::SRLI,
DL, VT,
X,
1804 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1807 CurDAG->getTargetConstant(Trailing,
DL, VT));
1812 if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
1814 RISCV::SRLIW,
DL, VT,
X,
1815 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1818 CurDAG->getTargetConstant(Trailing,
DL, VT));
1824 if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
1825 Subtarget->hasStdExtZba()) {
1827 RISCV::SRLI,
DL, VT,
X,
1828 CurDAG->getTargetConstant(Trailing - C2,
DL, VT));
1830 RISCV::SLLI_UW,
DL, VT,
SDValue(SRLI, 0),
1831 CurDAG->getTargetConstant(Trailing,
DL, VT));
1838 const uint64_t C1 = N1C->getZExtValue();
1843 unsigned XLen = Subtarget->getXLen();
1844 assert((C2 > 0 && C2 < XLen) &&
"Unexpected shift amount!");
1849 bool Skip = C2 > 32 &&
isInt<12>(N1C->getSExtValue()) &&
1852 X.getConstantOperandVal(1) == 32;
1859 RISCV::SRAI,
DL, VT,
X,
1860 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1863 CurDAG->getTargetConstant(Leading,
DL, VT));
1875 if (C2 > Leading && Leading > 0 && Trailing > 0) {
1878 CurDAG->getTargetConstant(C2 - Leading,
DL, VT));
1881 CurDAG->getTargetConstant(Leading + Trailing,
DL, VT));
1884 CurDAG->getTargetConstant(Trailing,
DL, VT));
1897 !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
1898 !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
1918 if (!N1C || !N1C->hasOneUse())
1939 (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
1941 IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
1946 bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
1948 IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
1955 unsigned XLen = Subtarget->getXLen();
1960 uint64_t C1 = N1C->getZExtValue();
1961 unsigned ConstantShift = XLen - LeadingZeros;
1965 uint64_t ShiftedC1 = C1 << ConstantShift;
1974 CurDAG->getTargetConstant(LeadingZeros,
DL, VT));
1982 case RISCVISD::WMULSU:
1983 case RISCVISD::WADD:
1984 case RISCVISD::WSUB:
1985 case RISCVISD::WADDU:
1986 case RISCVISD::WSUBU: {
1987 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
1988 "Unexpected opcode");
1991 switch (
Node->getOpcode()) {
2000 case RISCVISD::WMULSU:
2001 Opc = RISCV::WMULSU;
2003 case RISCVISD::WADD:
2006 case RISCVISD::WSUB:
2009 case RISCVISD::WADDU:
2012 case RISCVISD::WSUBU:
2018 Opc,
DL, MVT::Untyped,
Node->getOperand(0),
Node->getOperand(1));
2026 case RISCVISD::WSLL:
2027 case RISCVISD::WSLA: {
2029 assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
2030 "Unexpected opcode");
2032 bool IsSigned =
Node->getOpcode() == RISCVISD::WSLA;
2039 if (ShAmtC && ShAmtC->getZExtValue() < 64) {
2040 Opc = IsSigned ? RISCV::WSLAI : RISCV::WSLLI;
2041 ShAmt =
CurDAG->getTargetConstant(ShAmtC->getZExtValue(),
DL, XLenVT);
2043 Opc = IsSigned ? RISCV::WSLA : RISCV::WSLL;
2047 Node->getOperand(0), ShAmt);
2059 if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
2069 bool Simm12 =
false;
2073 int ConstantVal = ConstantOffset->getSExtValue();
2080 unsigned Opcode = 0;
2081 switch (
Load->getMemoryVT().getSimpleVT().SimpleTy) {
2083 if (Simm12 && SignExtend)
2084 Opcode = RISCV::CV_LB_ri_inc;
2085 else if (Simm12 && !SignExtend)
2086 Opcode = RISCV::CV_LBU_ri_inc;
2087 else if (!Simm12 && SignExtend)
2088 Opcode = RISCV::CV_LB_rr_inc;
2090 Opcode = RISCV::CV_LBU_rr_inc;
2093 if (Simm12 && SignExtend)
2094 Opcode = RISCV::CV_LH_ri_inc;
2095 else if (Simm12 && !SignExtend)
2096 Opcode = RISCV::CV_LHU_ri_inc;
2097 else if (!Simm12 && SignExtend)
2098 Opcode = RISCV::CV_LH_rr_inc;
2100 Opcode = RISCV::CV_LHU_rr_inc;
2104 Opcode = RISCV::CV_LW_ri_inc;
2106 Opcode = RISCV::CV_LW_rr_inc;
2121 case RISCVISD::LD_RV32: {
2122 assert(Subtarget->hasStdExtZilsd() &&
"LD_RV32 is only used with Zilsd");
2131 RISCV::LD_RV32,
DL, {MVT::Untyped, MVT::Other},
Ops);
2140 case RISCVISD::SD_RV32: {
2152 RegPair =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2164 case RISCVISD::MQWACC:
2165 case RISCVISD::MQRWACC:
2166 case RISCVISD::WMACC:
2167 case RISCVISD::WMACCU:
2168 case RISCVISD::WMACCSU: {
2169 assert(!Subtarget->is64Bit() && Subtarget->hasStdExtP() &&
2170 "Unexpected opcode");
2173 Node->getOperand(1));
2178 case RISCVISD::MQWACC:
2179 Opc = RISCV::MQWACC;
2181 case RISCVISD::MQRWACC:
2182 Opc = RISCV::MQRWACC;
2184 case RISCVISD::WMACC:
2187 case RISCVISD::WMACCU:
2188 Opc = RISCV::WMACCU;
2190 case RISCVISD::WMACCSU:
2191 Opc = RISCV::WMACCSU;
2195 Opc,
DL, MVT::Untyped, Op0,
Node->getOperand(2),
Node->getOperand(3));
2202 case RISCVISD::ADDD:
2210 case RISCVISD::SUBD:
2211 case RISCVISD::WADDAU:
2212 case RISCVISD::WSUBAU:
2213 case RISCVISD::WADDA:
2214 case RISCVISD::WSUBA: {
2215 assert(!Subtarget->is64Bit() && Subtarget->hasStdExtP() &&
2216 "Unexpected opcode");
2223 Op0 =
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
2232 if (Opcode == RISCVISD::WADDAU || Opcode == RISCVISD::WSUBAU ||
2233 Opcode == RISCVISD::WADDA || Opcode == RISCVISD::WSUBA) {
2240 case RISCVISD::WADDAU:
2241 Opc = RISCV::WADDAU;
2243 case RISCVISD::WSUBAU:
2244 Opc = RISCV::WSUBAU;
2246 case RISCVISD::WADDA:
2249 case RISCVISD::WSUBA:
2253 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1Lo, Op1Hi);
2261 case RISCVISD::ADDD:
2264 case RISCVISD::SUBD:
2268 New =
CurDAG->getMachineNode(
Opc,
DL, MVT::Untyped, Op0, Op1);
2278 unsigned IntNo =
Node->getConstantOperandVal(0);
2283 case Intrinsic::riscv_vmsgeu:
2284 case Intrinsic::riscv_vmsge: {
2287 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
2288 bool IsCmpConstant =
false;
2289 bool IsCmpMinimum =
false;
2291 if (Src2.getValueType() != XLenVT)
2295 MVT Src1VT = Src1.getSimpleValueType();
2297 IsCmpConstant =
true;
2298 CVal =
C->getSExtValue();
2299 if (CVal >= -15 && CVal <= 16) {
2300 if (!IsUnsigned || CVal != 0)
2302 IsCmpMinimum =
true;
2306 IsCmpMinimum =
true;
2309 unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
2313#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2314 case RISCVVType::lmulenum: \
2315 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2316 : RISCV::PseudoVMSLT_VX_##suffix; \
2317 VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \
2318 : RISCV::PseudoVMSGT_VX_##suffix; \
2327#undef CASE_VMSLT_OPCODES
2333#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \
2334 case RISCVVType::lmulenum: \
2335 VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \
2336 VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \
2345#undef CASE_VMNAND_VMSET_OPCODES
2356 CurDAG->getMachineNode(VMSetOpcode,
DL, VT, VL, MaskSEW));
2360 if (IsCmpConstant) {
2365 {Src1, Imm, VL, SEW}));
2372 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2375 {Cmp, Cmp, VL, MaskSEW}));
2378 case Intrinsic::riscv_vmsgeu_mask:
2379 case Intrinsic::riscv_vmsge_mask: {
2382 bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
2383 bool IsCmpConstant =
false;
2384 bool IsCmpMinimum =
false;
2386 if (Src2.getValueType() != XLenVT)
2389 MVT Src1VT = Src1.getSimpleValueType();
2392 IsCmpConstant =
true;
2393 CVal =
C->getSExtValue();
2394 if (CVal >= -15 && CVal <= 16) {
2395 if (!IsUnsigned || CVal != 0)
2397 IsCmpMinimum =
true;
2401 IsCmpMinimum =
true;
2404 unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
2405 VMOROpcode, VMSGTMaskOpcode;
2409#define CASE_VMSLT_OPCODES(lmulenum, suffix) \
2410 case RISCVVType::lmulenum: \
2411 VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \
2412 : RISCV::PseudoVMSLT_VX_##suffix; \
2413 VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK \
2414 : RISCV::PseudoVMSLT_VX_##suffix##_MASK; \
2415 VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \
2416 : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \
2425#undef CASE_VMSLT_OPCODES
2431#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) \
2432 case RISCVVType::lmulenum: \
2433 VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix; \
2434 VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix; \
2435 VMOROpcode = RISCV::PseudoVMOR_MM_##suffix; \
2444#undef CASE_VMXOR_VMANDN_VMOR_OPCODES
2458 if (Mask == MaskedOff) {
2463 CurDAG->getMachineNode(VMOROpcode,
DL, VT,
2464 {Mask, MaskedOff, VL, MaskSEW}));
2471 if (Mask == MaskedOff) {
2473 CurDAG->getMachineNode(VMSLTOpcode,
DL, VT, {Src1, Src2, VL, SEW}),
2476 {Mask, Cmp, VL, MaskSEW}));
2483 if (IsCmpConstant) {
2488 VMSGTMaskOpcode,
DL, VT,
2489 {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
2499 {MaskedOff, Src1, Src2, Mask,
2500 VL, SEW, PolicyOp}),
2504 {Cmp, Mask, VL, MaskSEW}));
2507 case Intrinsic::riscv_vsetvli:
2508 case Intrinsic::riscv_vsetvlimax:
2510 case Intrinsic::riscv_sf_vsettnt:
2511 case Intrinsic::riscv_sf_vsettm:
2512 case Intrinsic::riscv_sf_vsettk:
2518 unsigned IntNo =
Node->getConstantOperandVal(1);
2523 case Intrinsic::riscv_vlseg2:
2524 case Intrinsic::riscv_vlseg3:
2525 case Intrinsic::riscv_vlseg4:
2526 case Intrinsic::riscv_vlseg5:
2527 case Intrinsic::riscv_vlseg6:
2528 case Intrinsic::riscv_vlseg7:
2529 case Intrinsic::riscv_vlseg8: {
2534 case Intrinsic::riscv_vlseg2_mask:
2535 case Intrinsic::riscv_vlseg3_mask:
2536 case Intrinsic::riscv_vlseg4_mask:
2537 case Intrinsic::riscv_vlseg5_mask:
2538 case Intrinsic::riscv_vlseg6_mask:
2539 case Intrinsic::riscv_vlseg7_mask:
2540 case Intrinsic::riscv_vlseg8_mask: {
2545 case Intrinsic::riscv_vlsseg2:
2546 case Intrinsic::riscv_vlsseg3:
2547 case Intrinsic::riscv_vlsseg4:
2548 case Intrinsic::riscv_vlsseg5:
2549 case Intrinsic::riscv_vlsseg6:
2550 case Intrinsic::riscv_vlsseg7:
2551 case Intrinsic::riscv_vlsseg8: {
2556 case Intrinsic::riscv_vlsseg2_mask:
2557 case Intrinsic::riscv_vlsseg3_mask:
2558 case Intrinsic::riscv_vlsseg4_mask:
2559 case Intrinsic::riscv_vlsseg5_mask:
2560 case Intrinsic::riscv_vlsseg6_mask:
2561 case Intrinsic::riscv_vlsseg7_mask:
2562 case Intrinsic::riscv_vlsseg8_mask: {
2567 case Intrinsic::riscv_vloxseg2:
2568 case Intrinsic::riscv_vloxseg3:
2569 case Intrinsic::riscv_vloxseg4:
2570 case Intrinsic::riscv_vloxseg5:
2571 case Intrinsic::riscv_vloxseg6:
2572 case Intrinsic::riscv_vloxseg7:
2573 case Intrinsic::riscv_vloxseg8:
2577 case Intrinsic::riscv_vluxseg2:
2578 case Intrinsic::riscv_vluxseg3:
2579 case Intrinsic::riscv_vluxseg4:
2580 case Intrinsic::riscv_vluxseg5:
2581 case Intrinsic::riscv_vluxseg6:
2582 case Intrinsic::riscv_vluxseg7:
2583 case Intrinsic::riscv_vluxseg8:
2587 case Intrinsic::riscv_vloxseg2_mask:
2588 case Intrinsic::riscv_vloxseg3_mask:
2589 case Intrinsic::riscv_vloxseg4_mask:
2590 case Intrinsic::riscv_vloxseg5_mask:
2591 case Intrinsic::riscv_vloxseg6_mask:
2592 case Intrinsic::riscv_vloxseg7_mask:
2593 case Intrinsic::riscv_vloxseg8_mask:
2597 case Intrinsic::riscv_vluxseg2_mask:
2598 case Intrinsic::riscv_vluxseg3_mask:
2599 case Intrinsic::riscv_vluxseg4_mask:
2600 case Intrinsic::riscv_vluxseg5_mask:
2601 case Intrinsic::riscv_vluxseg6_mask:
2602 case Intrinsic::riscv_vluxseg7_mask:
2603 case Intrinsic::riscv_vluxseg8_mask:
2607 case Intrinsic::riscv_vlseg8ff:
2608 case Intrinsic::riscv_vlseg7ff:
2609 case Intrinsic::riscv_vlseg6ff:
2610 case Intrinsic::riscv_vlseg5ff:
2611 case Intrinsic::riscv_vlseg4ff:
2612 case Intrinsic::riscv_vlseg3ff:
2613 case Intrinsic::riscv_vlseg2ff: {
2617 case Intrinsic::riscv_vlseg8ff_mask:
2618 case Intrinsic::riscv_vlseg7ff_mask:
2619 case Intrinsic::riscv_vlseg6ff_mask:
2620 case Intrinsic::riscv_vlseg5ff_mask:
2621 case Intrinsic::riscv_vlseg4ff_mask:
2622 case Intrinsic::riscv_vlseg3ff_mask:
2623 case Intrinsic::riscv_vlseg2ff_mask: {
2627 case Intrinsic::riscv_vloxei:
2628 case Intrinsic::riscv_vloxei_mask:
2629 case Intrinsic::riscv_vluxei:
2630 case Intrinsic::riscv_vluxei_mask: {
2631 bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
2632 IntNo == Intrinsic::riscv_vluxei_mask;
2633 bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
2634 IntNo == Intrinsic::riscv_vloxei_mask;
2636 MVT VT =
Node->getSimpleValueType(0);
2649 "Element count mismatch");
2654 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2656 "index values when XLEN=32");
2659 IsMasked, IsOrdered, IndexLog2EEW,
static_cast<unsigned>(LMUL),
2660 static_cast<unsigned>(IndexLMUL));
2669 case Intrinsic::riscv_vlm:
2670 case Intrinsic::riscv_vle:
2671 case Intrinsic::riscv_vle_mask:
2672 case Intrinsic::riscv_vlse:
2673 case Intrinsic::riscv_vlse_mask: {
2674 bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
2675 IntNo == Intrinsic::riscv_vlse_mask;
2677 IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
2679 MVT VT =
Node->getSimpleValueType(0);
2688 bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
2691 if (HasPassthruOperand)
2697 CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT);
2705 RISCV::getVLEPseudo(IsMasked, IsStrided,
false, Log2SEW,
2706 static_cast<unsigned>(LMUL));
2715 case Intrinsic::riscv_vleff:
2716 case Intrinsic::riscv_vleff_mask: {
2717 bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
2719 MVT VT =
Node->getSimpleValueType(0);
2731 RISCV::getVLEPseudo(IsMasked,
false,
true,
2732 Log2SEW,
static_cast<unsigned>(LMUL));
2740 case Intrinsic::riscv_nds_vln:
2741 case Intrinsic::riscv_nds_vln_mask:
2742 case Intrinsic::riscv_nds_vlnu:
2743 case Intrinsic::riscv_nds_vlnu_mask: {
2744 bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
2745 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2746 bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
2747 IntNo == Intrinsic::riscv_nds_vlnu_mask;
2749 MVT VT =
Node->getSimpleValueType(0);
2761 IsMasked, IsUnsigned, Log2SEW,
static_cast<unsigned>(LMUL));
2775 unsigned IntNo =
Node->getConstantOperandVal(1);
2777 case Intrinsic::riscv_vsseg2:
2778 case Intrinsic::riscv_vsseg3:
2779 case Intrinsic::riscv_vsseg4:
2780 case Intrinsic::riscv_vsseg5:
2781 case Intrinsic::riscv_vsseg6:
2782 case Intrinsic::riscv_vsseg7:
2783 case Intrinsic::riscv_vsseg8: {
2788 case Intrinsic::riscv_vsseg2_mask:
2789 case Intrinsic::riscv_vsseg3_mask:
2790 case Intrinsic::riscv_vsseg4_mask:
2791 case Intrinsic::riscv_vsseg5_mask:
2792 case Intrinsic::riscv_vsseg6_mask:
2793 case Intrinsic::riscv_vsseg7_mask:
2794 case Intrinsic::riscv_vsseg8_mask: {
2799 case Intrinsic::riscv_vssseg2:
2800 case Intrinsic::riscv_vssseg3:
2801 case Intrinsic::riscv_vssseg4:
2802 case Intrinsic::riscv_vssseg5:
2803 case Intrinsic::riscv_vssseg6:
2804 case Intrinsic::riscv_vssseg7:
2805 case Intrinsic::riscv_vssseg8: {
2810 case Intrinsic::riscv_vssseg2_mask:
2811 case Intrinsic::riscv_vssseg3_mask:
2812 case Intrinsic::riscv_vssseg4_mask:
2813 case Intrinsic::riscv_vssseg5_mask:
2814 case Intrinsic::riscv_vssseg6_mask:
2815 case Intrinsic::riscv_vssseg7_mask:
2816 case Intrinsic::riscv_vssseg8_mask: {
2821 case Intrinsic::riscv_vsoxseg2:
2822 case Intrinsic::riscv_vsoxseg3:
2823 case Intrinsic::riscv_vsoxseg4:
2824 case Intrinsic::riscv_vsoxseg5:
2825 case Intrinsic::riscv_vsoxseg6:
2826 case Intrinsic::riscv_vsoxseg7:
2827 case Intrinsic::riscv_vsoxseg8:
2831 case Intrinsic::riscv_vsuxseg2:
2832 case Intrinsic::riscv_vsuxseg3:
2833 case Intrinsic::riscv_vsuxseg4:
2834 case Intrinsic::riscv_vsuxseg5:
2835 case Intrinsic::riscv_vsuxseg6:
2836 case Intrinsic::riscv_vsuxseg7:
2837 case Intrinsic::riscv_vsuxseg8:
2841 case Intrinsic::riscv_vsoxseg2_mask:
2842 case Intrinsic::riscv_vsoxseg3_mask:
2843 case Intrinsic::riscv_vsoxseg4_mask:
2844 case Intrinsic::riscv_vsoxseg5_mask:
2845 case Intrinsic::riscv_vsoxseg6_mask:
2846 case Intrinsic::riscv_vsoxseg7_mask:
2847 case Intrinsic::riscv_vsoxseg8_mask:
2851 case Intrinsic::riscv_vsuxseg2_mask:
2852 case Intrinsic::riscv_vsuxseg3_mask:
2853 case Intrinsic::riscv_vsuxseg4_mask:
2854 case Intrinsic::riscv_vsuxseg5_mask:
2855 case Intrinsic::riscv_vsuxseg6_mask:
2856 case Intrinsic::riscv_vsuxseg7_mask:
2857 case Intrinsic::riscv_vsuxseg8_mask:
2861 case Intrinsic::riscv_vsoxei:
2862 case Intrinsic::riscv_vsoxei_mask:
2863 case Intrinsic::riscv_vsuxei:
2864 case Intrinsic::riscv_vsuxei_mask: {
2865 bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
2866 IntNo == Intrinsic::riscv_vsuxei_mask;
2867 bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
2868 IntNo == Intrinsic::riscv_vsoxei_mask;
2870 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2883 "Element count mismatch");
2888 if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
2890 "index values when XLEN=32");
2893 IsMasked, IsOrdered, IndexLog2EEW,
2894 static_cast<unsigned>(LMUL),
static_cast<unsigned>(IndexLMUL));
2903 case Intrinsic::riscv_vsm:
2904 case Intrinsic::riscv_vse:
2905 case Intrinsic::riscv_vse_mask:
2906 case Intrinsic::riscv_vsse:
2907 case Intrinsic::riscv_vsse_mask: {
2908 bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
2909 IntNo == Intrinsic::riscv_vsse_mask;
2911 IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
2913 MVT VT =
Node->getOperand(2)->getSimpleValueType(0);
2925 IsMasked, IsStrided, Log2SEW,
static_cast<unsigned>(LMUL));
2933 case Intrinsic::riscv_sf_vc_x_se:
2934 case Intrinsic::riscv_sf_vc_i_se:
2937 case Intrinsic::riscv_sf_vlte8:
2938 case Intrinsic::riscv_sf_vlte16:
2939 case Intrinsic::riscv_sf_vlte32:
2940 case Intrinsic::riscv_sf_vlte64: {
2942 unsigned PseudoInst;
2944 case Intrinsic::riscv_sf_vlte8:
2945 PseudoInst = RISCV::PseudoSF_VLTE8;
2948 case Intrinsic::riscv_sf_vlte16:
2949 PseudoInst = RISCV::PseudoSF_VLTE16;
2952 case Intrinsic::riscv_sf_vlte32:
2953 PseudoInst = RISCV::PseudoSF_VLTE32;
2956 case Intrinsic::riscv_sf_vlte64:
2957 PseudoInst = RISCV::PseudoSF_VLTE64;
2965 Node->getOperand(3),
2966 Node->getOperand(4),
2969 Node->getOperand(0)};
2973 CurDAG->setNodeMemRefs(TileLoad,
2979 case Intrinsic::riscv_sf_mm_s_s:
2980 case Intrinsic::riscv_sf_mm_s_u:
2981 case Intrinsic::riscv_sf_mm_u_s:
2982 case Intrinsic::riscv_sf_mm_u_u:
2983 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
2984 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
2985 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
2986 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
2987 case Intrinsic::riscv_sf_mm_f_f: {
2988 bool HasFRM =
false;
2989 unsigned PseudoInst;
2991 case Intrinsic::riscv_sf_mm_s_s:
2992 PseudoInst = RISCV::PseudoSF_MM_S_S;
2994 case Intrinsic::riscv_sf_mm_s_u:
2995 PseudoInst = RISCV::PseudoSF_MM_S_U;
2997 case Intrinsic::riscv_sf_mm_u_s:
2998 PseudoInst = RISCV::PseudoSF_MM_U_S;
3000 case Intrinsic::riscv_sf_mm_u_u:
3001 PseudoInst = RISCV::PseudoSF_MM_U_U;
3003 case Intrinsic::riscv_sf_mm_e5m2_e5m2:
3004 PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
3007 case Intrinsic::riscv_sf_mm_e5m2_e4m3:
3008 PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
3011 case Intrinsic::riscv_sf_mm_e4m3_e5m2:
3012 PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
3015 case Intrinsic::riscv_sf_mm_e4m3_e4m3:
3016 PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
3019 case Intrinsic::riscv_sf_mm_f_f:
3020 if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
3021 PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
3023 PseudoInst = RISCV::PseudoSF_MM_F_F;
3027 uint64_t TileNum =
Node->getConstantOperandVal(2);
3039 if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
3049 CurDAG->getTargetConstant(Log2SEW,
DL, XLenVT), TWidenOp,
3058 case Intrinsic::riscv_sf_vtzero_t: {
3059 uint64_t TileNum =
Node->getConstantOperandVal(2);
3065 auto *NewNode =
CurDAG->getMachineNode(
3066 RISCV::PseudoSF_VTZERO_T,
DL,
Node->getVTList(),
3067 {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
3077 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3086 if (Subtarget->hasStdExtP()) {
3088 (VT == MVT::i32 && (SrcVT == MVT::v4i8 || SrcVT == MVT::v2i16)) ||
3089 (SrcVT == MVT::i32 && (VT == MVT::v4i8 || VT == MVT::v2i16));
3091 (VT == MVT::i64 && (SrcVT == MVT::v8i8 || SrcVT == MVT::v4i16 ||
3092 SrcVT == MVT::v2i32)) ||
3093 (SrcVT == MVT::i64 &&
3094 (VT == MVT::v8i8 || VT == MVT::v4i16 || VT == MVT::v2i32));
3095 if (Is32BitCast || Is64BitCast) {
3104 if (!Subtarget->hasStdExtP())
3107 bool IsDoubleWide = Subtarget->isPExtPackedDoubleType(VT);
3109 if (ConstNode->isZero()) {
3110 MCPhysReg X0Reg = IsDoubleWide ? RISCV::X0_Pair : RISCV::X0;
3118 APInt Val = ConstNode->getAPIntValue().
trunc(EltSize);
3123 RISCV::ADDI,
DL, VT,
CurDAG->getRegister(RISCV::X0, VT),
3124 CurDAG->getAllOnesConstant(
DL, XLenVT,
true));
3131 Val = Val.
trunc(16);
3140 Opc = IsDoubleWide ? RISCV::PLI_DB : RISCV::PLI_B;
3142 Opc = IsDoubleWide ? RISCV::PLI_DH : RISCV::PLI_H;
3143 }
else if (!IsDoubleWide && EltSize == 32 &&
isInt<10>(
Imm)) {
3146 Opc = IsDoubleWide ? RISCV::PLUI_DH : RISCV::PLUI_H;
3149 Opc = RISCV::PLUI_W;
3164 if (Subtarget->hasStdExtP()) {
3165 MVT SrcVT =
Node->getOperand(0).getSimpleValueType();
3166 if ((VT == MVT::v2i32 && SrcVT == MVT::i64) ||
3167 (VT == MVT::v4i8 && SrcVT == MVT::i32)) {
3175 case RISCVISD::TUPLE_INSERT: {
3179 auto Idx =
Node->getConstantOperandVal(2);
3183 MVT SubVecContainerVT = SubVecVT;
3186 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(SubVecVT);
3188 [[maybe_unused]]
bool ExactlyVecRegSized =
3190 .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
3192 .getKnownMinValue()));
3193 assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
3195 MVT ContainerVT = VT;
3197 ContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3199 const auto *
TRI = Subtarget->getRegisterInfo();
3201 std::tie(SubRegIdx, Idx) =
3203 ContainerVT, SubVecContainerVT, Idx,
TRI);
3213 [[maybe_unused]]
bool IsSubVecPartReg =
3217 assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
3219 "Expecting lowering to have created legal INSERT_SUBVECTORs when "
3220 "the subvector is smaller than a full-sized register");
3224 if (SubRegIdx == RISCV::NoSubRegister) {
3225 unsigned InRegClassID =
3229 "Unexpected subvector extraction");
3231 SDNode *NewNode =
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
3237 SDValue Insert =
CurDAG->getTargetInsertSubreg(SubRegIdx,
DL, VT, V, SubV);
3241 case RISCVISD::TUPLE_CAST: {
3249 Node->getOperand(0).getSimpleValueType()) &&
3250 "Expected input and output of TUPLE_CAST to use the same "
3257 case RISCVISD::TUPLE_EXTRACT: {
3258 if (Subtarget->hasStdExtP())
3262 auto Idx =
Node->getConstantOperandVal(1);
3263 MVT InVT = V.getSimpleValueType();
3268 MVT SubVecContainerVT = VT;
3272 SubVecContainerVT =
TLI.getContainerForFixedLengthVector(VT);
3275 InVT =
TLI.getContainerForFixedLengthVector(InVT);
3277 const auto *
TRI = Subtarget->getRegisterInfo();
3279 std::tie(SubRegIdx, Idx) =
3281 InVT, SubVecContainerVT, Idx,
TRI);
3291 if (SubRegIdx == RISCV::NoSubRegister) {
3295 "Unexpected subvector extraction");
3298 CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
DL, VT, V, RC);
3303 SDValue Extract =
CurDAG->getTargetExtractSubreg(SubRegIdx,
DL, VT, V);
3307 case RISCVISD::VMV_S_X_VL:
3308 case RISCVISD::VFMV_S_F_VL:
3309 case RISCVISD::VMV_V_X_VL:
3310 case RISCVISD::VFMV_V_F_VL: {
3312 bool IsScalarMove =
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
3313 Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
3314 if (!
Node->getOperand(0).isUndef())
3320 if (!Ld || Ld->isIndexed())
3322 EVT MemVT = Ld->getMemoryVT();
3348 if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
3352 SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
DL, VT), 0),
3358 Operands.append({VL, SEW, PolicyOp, Ld->getChain()});
3362 false, IsStrided,
false,
3363 Log2SEW,
static_cast<unsigned>(LMUL));
3369 CurDAG->setNodeMemRefs(
Load, {Ld->getMemOperand()});
3374 case RISCVISD::LPAD_CALL:
3375 case RISCVISD::LPAD_CALL_INDIRECT: {
3376 bool IsIndirect = Opcode == RISCVISD::LPAD_CALL_INDIRECT;
3377 unsigned PseudoOpc = IsIndirect ? RISCV::PseudoCALLIndirectLpadAlign
3378 : RISCV::PseudoCALLLpadAlign;
3381 if (std::optional<uint32_t> Label =
3382 Subtarget->getCLOpts().landing_pad_label) {
3385 "in unsigned 20-bits");
3393 Ops.push_back(
Node->getOperand(1));
3394 Ops.push_back(
CurDAG->getTargetConstant(LpadLabel,
DL, XLenVT));
3397 bool HasGlue =
Node->getGluedNode() !=
nullptr;
3398 unsigned RegOperandsEnd = HasGlue ?
NumOps - 1 :
NumOps;
3399 for (
unsigned I = 2;
I != RegOperandsEnd; ++
I)
3400 Ops.push_back(
Node->getOperand(
I));
3402 Ops.push_back(
Node->getOperand(0));
3413 if (Subtarget->hasVendorXMIPSCBOP())
3416 unsigned Locality =
Node->getConstantOperandVal(3);
3424 int NontemporalLevel = 0;
3427 NontemporalLevel = 3;
3430 NontemporalLevel = 1;
3433 NontemporalLevel = 0;
3439 if (NontemporalLevel & 0b1)
3441 if (NontemporalLevel & 0b10)