996  if (
Node->isMachineOpcode()) {
 
 1004  unsigned Opcode = 
Node->getOpcode();
 
 1005  MVT XLenVT = Subtarget->getXLenVT();
 
 1007  MVT VT = 
Node->getSimpleValueType(0);
 
 1009  bool HasBitTest = Subtarget->hasBEXTILike();
 
 1013    assert((VT == Subtarget->getXLenVT() || VT == MVT::i32) && 
"Unexpected VT");
 
 1015    if (ConstNode->isZero()) {
 
 1017          CurDAG->getCopyFromReg(
CurDAG->getEntryNode(), 
DL, RISCV::X0, VT);
 
 1021    int64_t Imm = ConstNode->getSExtValue();
 
 1043    bool Is64Bit = Subtarget->is64Bit();
 
 1044    bool HasZdinx = Subtarget->hasStdExtZdinx();
 
 1046    bool NegZeroF64 = APF.
isNegZero() && VT == MVT::f64;
 
 1051      if (VT == MVT::f64 && HasZdinx && !Is64Bit)
 
 1052        Imm = 
CurDAG->getRegister(RISCV::X0_Pair, MVT::f64);
 
 1054        Imm = 
CurDAG->getRegister(RISCV::X0, XLenVT);
 
 1065      assert(Subtarget->hasStdExtZfbfmin());
 
 1066      Opc = RISCV::FMV_H_X;
 
 1069      Opc = Subtarget->hasStdExtZhinxmin() ? RISCV::COPY : RISCV::FMV_H_X;
 
 1072      Opc = Subtarget->hasStdExtZfinx() ? RISCV::COPY : RISCV::FMV_W_X;
 
 1077      assert((Subtarget->is64Bit() || APF.
isZero()) && 
"Unexpected constant");
 
 1081        Opc = Is64Bit ? RISCV::FMV_D_X : RISCV::FCVT_D_W;
 
 1086    if (VT.
SimpleTy == MVT::f16 && 
Opc == RISCV::COPY) {
 
 1088          CurDAG->getTargetExtractSubreg(RISCV::sub_16, 
DL, VT, Imm).getNode();
 
 1089    } 
else if (VT.
SimpleTy == MVT::f32 && 
Opc == RISCV::COPY) {
 
 1091          CurDAG->getTargetExtractSubreg(RISCV::sub_32, 
DL, VT, Imm).getNode();
 
 1092    } 
else if (
Opc == RISCV::FCVT_D_W_IN32X || 
Opc == RISCV::FCVT_D_W)
 
 1093      Res = 
CurDAG->getMachineNode(
 
 1101      Opc = RISCV::FSGNJN_D;
 
 1103        Opc = Is64Bit ? RISCV::FSGNJN_D_INX : RISCV::FSGNJN_D_IN32X;
 
 1111  case RISCVISD::BuildGPRPair:
 
 1112  case RISCVISD::BuildPairF64: {
 
 1113    if (Opcode == RISCVISD::BuildPairF64 && !Subtarget->hasStdExtZdinx())
 
 1116    assert((!Subtarget->is64Bit() || Opcode == RISCVISD::BuildGPRPair) &&
 
 1117           "BuildPairF64 only handled here on rv32i_zdinx");
 
 1120        CurDAG->getTargetConstant(RISCV::GPRPairRegClassID, 
DL, MVT::i32),
 
 1121        Node->getOperand(0),
 
 1122        CurDAG->getTargetConstant(RISCV::sub_gpr_even, 
DL, MVT::i32),
 
 1123        Node->getOperand(1),
 
 1124        CurDAG->getTargetConstant(RISCV::sub_gpr_odd, 
DL, MVT::i32)};
 
 1130  case RISCVISD::SplitGPRPair:
 
 1131  case RISCVISD::SplitF64: {
 
 1132    if (Subtarget->hasStdExtZdinx() || Opcode != RISCVISD::SplitF64) {
 
 1133      assert((!Subtarget->is64Bit() || Opcode == RISCVISD::SplitGPRPair) &&
 
 1134             "SplitF64 only handled here on rv32i_zdinx");
 
 1138                                                    Node->getValueType(0),
 
 1139                                                    Node->getOperand(0));
 
 1145            RISCV::sub_gpr_odd, 
DL, 
Node->getValueType(1), 
Node->getOperand(0));
 
 1153    assert(Opcode != RISCVISD::SplitGPRPair &&
 
 1154           "SplitGPRPair should already be handled");
 
 1156    if (!Subtarget->hasStdExtZfa())
 
 1158    assert(Subtarget->hasStdExtD() && !Subtarget->is64Bit() &&
 
 1159           "Unexpected subtarget");
 
 1164                                          Node->getOperand(0));
 
 1169                                          Node->getOperand(0));
 
 1184    unsigned ShAmt = N1C->getZExtValue();
 
 1188      unsigned XLen = Subtarget->getXLen();
 
 1191      if (ShAmt <= 32 && TrailingZeros > 0 && LeadingZeros == 32) {
 
 1196            CurDAG->getTargetConstant(TrailingZeros, 
DL, VT));
 
 1199            CurDAG->getTargetConstant(TrailingZeros + ShAmt, 
DL, VT));
 
 1203      if (TrailingZeros == 0 && LeadingZeros > ShAmt &&
 
 1204          XLen - LeadingZeros > 11 && LeadingZeros != 32) {
 
 1215            CurDAG->getTargetConstant(LeadingZeros, 
DL, VT));
 
 1218            CurDAG->getTargetConstant(LeadingZeros - ShAmt, 
DL, VT));
 
 1232    unsigned ShAmt = N1C->getZExtValue();
 
 1238      unsigned XLen = Subtarget->getXLen();
 
 1241      if (LeadingZeros == 32 && TrailingZeros > ShAmt) {
 
 1244            CurDAG->getTargetConstant(TrailingZeros, 
DL, VT));
 
 1247            CurDAG->getTargetConstant(TrailingZeros - ShAmt, 
DL, VT));
 
 1264    if (ShAmt >= TrailingOnes)
 
 1267    if (TrailingOnes == 32) {
 
 1269          Subtarget->is64Bit() ? RISCV::SRLIW : RISCV::SRLI, 
DL, VT,
 
 1280    if (HasBitTest && ShAmt + 1 == TrailingOnes) {
 
 1282          Subtarget->hasStdExtZbs() ? RISCV::BEXTI : RISCV::TH_TST, 
DL, VT,
 
 1288    const unsigned Msb = TrailingOnes - 1;
 
 1289    const unsigned Lsb = ShAmt;
 
 1293    unsigned LShAmt = Subtarget->getXLen() - TrailingOnes;
 
 1296                               CurDAG->getTargetConstant(LShAmt, 
DL, VT));
 
 1299        CurDAG->getTargetConstant(LShAmt + ShAmt, 
DL, VT));
 
 1324    unsigned ShAmt = N1C->getZExtValue();
 
 1328    if (ExtSize >= 32 || ShAmt >= ExtSize)
 
 1330    unsigned LShAmt = Subtarget->getXLen() - ExtSize;
 
 1333                               CurDAG->getTargetConstant(LShAmt, 
DL, VT));
 
 1336        CurDAG->getTargetConstant(LShAmt + ShAmt, 
DL, VT));
 
 1363      unsigned C2 = 
C->getZExtValue();
 
 1364      unsigned XLen = Subtarget->getXLen();
 
 1365      assert((C2 > 0 && C2 < XLen) && 
"Unexpected shift amount!");
 
 1373      bool IsCANDI = 
isInt<6>(N1C->getSExtValue());
 
 1385      bool OneUseOrZExtW = N0.
hasOneUse() || C1 == UINT64_C(0xFFFFFFFF);
 
 1395          if (C2 + 32 == Leading) {
 
 1397                RISCV::SRLIW, 
DL, VT, 
X, 
CurDAG->getTargetConstant(C2, 
DL, VT));
 
 1407          if (C2 >= 32 && (Leading - C2) == 1 && N0.
hasOneUse() &&
 
 1411                CurDAG->getMachineNode(RISCV::SRAIW, 
DL, VT, 
X.getOperand(0),
 
 1412                                       CurDAG->getTargetConstant(31, 
DL, VT));
 
 1414                RISCV::SRLIW, 
DL, VT, 
SDValue(SRAIW, 0),
 
 1415                CurDAG->getTargetConstant(Leading - 32, 
DL, VT));
 
 1428          const unsigned Lsb = C2;
 
 1434          bool Skip = Subtarget->hasStdExtZba() && Leading == 32 &&
 
 1438          Skip |= HasBitTest && Leading == XLen - 1;
 
 1439          if (OneUseOrZExtW && !Skip) {
 
 1441                RISCV::SLLI, 
DL, VT, 
X,
 
 1442                CurDAG->getTargetConstant(Leading - C2, 
DL, VT));
 
 1445                CurDAG->getTargetConstant(Leading, 
DL, VT));
 
 1457        if (C2 + Leading < XLen &&
 
 1460          if ((XLen - (C2 + Leading)) == 32 && Subtarget->hasStdExtZba()) {
 
 1462                CurDAG->getMachineNode(RISCV::SLLI_UW, 
DL, VT, 
X,
 
 1463                                       CurDAG->getTargetConstant(C2, 
DL, VT));
 
 1476          const unsigned Msb = XLen - Leading - 1;
 
 1477          const unsigned Lsb = C2;
 
 1482          if (OneUseOrZExtW && !IsCANDI) {
 
 1484                RISCV::SLLI, 
DL, VT, 
X,
 
 1485                CurDAG->getTargetConstant(C2 + Leading, 
DL, VT));
 
 1488                CurDAG->getTargetConstant(Leading, 
DL, VT));
 
 1500        if (Leading == C2 && C2 + Trailing < XLen && OneUseOrZExtW &&
 
 1502          unsigned SrliOpc = RISCV::SRLI;
 
 1506              X.getConstantOperandVal(1) == UINT64_C(0xFFFFFFFF)) {
 
 1507            SrliOpc = RISCV::SRLIW;
 
 1508            X = 
X.getOperand(0);
 
 1512              CurDAG->getTargetConstant(C2 + Trailing, 
DL, VT));
 
 1515              CurDAG->getTargetConstant(Trailing, 
DL, VT));
 
 1520        if (Leading > 32 && (Leading - 32) == C2 && C2 + Trailing < 32 &&
 
 1521            OneUseOrZExtW && !IsCANDI) {
 
 1523              RISCV::SRLIW, 
DL, VT, 
X,
 
 1524              CurDAG->getTargetConstant(C2 + Trailing, 
DL, VT));
 
 1527              CurDAG->getTargetConstant(Trailing, 
DL, VT));
 
 1532        if (Trailing > 0 && Leading + Trailing == 32 && C2 + Trailing < XLen &&
 
 1533            OneUseOrZExtW && Subtarget->hasStdExtZba()) {
 
 1535              RISCV::SRLI, 
DL, VT, 
X,
 
 1536              CurDAG->getTargetConstant(C2 + Trailing, 
DL, VT));
 
 1538              RISCV::SLLI_UW, 
DL, VT, 
SDValue(SRLI, 0),
 
 1539              CurDAG->getTargetConstant(Trailing, 
DL, VT));
 
 1550        if (Leading == 0 && C2 < Trailing && OneUseOrZExtW && !IsCANDI) {
 
 1552              RISCV::SRLI, 
DL, VT, 
X,
 
 1553              CurDAG->getTargetConstant(Trailing - C2, 
DL, VT));
 
 1556              CurDAG->getTargetConstant(Trailing, 
DL, VT));
 
 1561        if (C2 < Trailing && Leading + C2 == 32 && OneUseOrZExtW && !IsCANDI) {
 
 1563              RISCV::SRLIW, 
DL, VT, 
X,
 
 1564              CurDAG->getTargetConstant(Trailing - C2, 
DL, VT));
 
 1567              CurDAG->getTargetConstant(Trailing, 
DL, VT));
 
 1573        if (C2 < Trailing && Leading + Trailing == 32 && OneUseOrZExtW &&
 
 1574            Subtarget->hasStdExtZba()) {
 
 1576              RISCV::SRLI, 
DL, VT, 
X,
 
 1577              CurDAG->getTargetConstant(Trailing - C2, 
DL, VT));
 
 1579              RISCV::SLLI_UW, 
DL, VT, 
SDValue(SRLI, 0),
 
 1580              CurDAG->getTargetConstant(Trailing, 
DL, VT));
 
 1587    const uint64_t C1 = N1C->getZExtValue();
 
 1592      unsigned XLen = Subtarget->getXLen();
 
 1593      assert((C2 > 0 && C2 < XLen) && 
"Unexpected shift amount!");
 
 1598      bool Skip = C2 > 32 && 
isInt<12>(N1C->getSExtValue()) &&
 
 1601                  X.getConstantOperandVal(1) == 32;
 
 1608              RISCV::SRAI, 
DL, VT, 
X,
 
 1609              CurDAG->getTargetConstant(C2 - Leading, 
DL, VT));
 
 1612              CurDAG->getTargetConstant(Leading, 
DL, VT));
 
 1624        if (C2 > Leading && Leading > 0 && Trailing > 0) {
 
 1627              CurDAG->getTargetConstant(C2 - Leading, 
DL, VT));
 
 1630              CurDAG->getTargetConstant(Leading + Trailing, 
DL, VT));
 
 1633              CurDAG->getTargetConstant(Trailing, 
DL, VT));
 
 1646        !(C1 == 0xffff && Subtarget->hasStdExtZbb()) &&
 
 1647        !(C1 == 0xffffffff && Subtarget->hasStdExtZba())) {
 
 1667    if (!N1C || !N1C->hasOneUse())
 
 1688        (C2 == UINT64_C(0xFFFF) && Subtarget->hasStdExtZbb());
 
 1690    IsANDIOrZExt |= C2 == UINT64_C(0xFFFF) && Subtarget->hasVendorXTHeadBb();
 
 1695    bool IsZExtW = C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasStdExtZba();
 
 1697    IsZExtW |= C2 == UINT64_C(0xFFFFFFFF) && Subtarget->hasVendorXTHeadBb();
 
 1704    unsigned XLen = Subtarget->getXLen();
 
 1710    unsigned ConstantShift = XLen - LeadingZeros;
 
 1714    uint64_t ShiftedC1 = C1 << ConstantShift;
 
 1723                               CurDAG->getTargetConstant(LeadingZeros, 
DL, VT));
 
 1733    if (Subtarget->hasVendorXCVmem() && !Subtarget->is64Bit()) {
 
 1743      bool Simm12 = 
false;
 
 1744      bool SignExtend = Load->getExtensionType() == 
ISD::SEXTLOAD;
 
 1747        int ConstantVal = ConstantOffset->getSExtValue();
 
 1754      unsigned Opcode = 0;
 
 1755      switch (Load->getMemoryVT().getSimpleVT().SimpleTy) {
 
 1757        if (Simm12 && SignExtend)
 
 1758          Opcode = RISCV::CV_LB_ri_inc;
 
 1759        else if (Simm12 && !SignExtend)
 
 1760          Opcode = RISCV::CV_LBU_ri_inc;
 
 1761        else if (!Simm12 && SignExtend)
 
 1762          Opcode = RISCV::CV_LB_rr_inc;
 
 1764          Opcode = RISCV::CV_LBU_rr_inc;
 
 1767        if (Simm12 && SignExtend)
 
 1768          Opcode = RISCV::CV_LH_ri_inc;
 
 1769        else if (Simm12 && !SignExtend)
 
 1770          Opcode = RISCV::CV_LHU_ri_inc;
 
 1771        else if (!Simm12 && SignExtend)
 
 1772          Opcode = RISCV::CV_LH_rr_inc;
 
 1774          Opcode = RISCV::CV_LHU_rr_inc;
 
 1778          Opcode = RISCV::CV_LW_ri_inc;
 
 1780          Opcode = RISCV::CV_LW_rr_inc;
 
 1795  case RISCVISD::LD_RV32: {
 
 1796    assert(Subtarget->hasStdExtZilsd() && 
"LD_RV32 is only used with Zilsd");
 
 1805        RISCV::LD_RV32, 
DL, {MVT::Untyped, MVT::Other}, 
Ops);
 
 1817  case RISCVISD::SD_RV32: {
 
 1829      RegPair = 
CurDAG->getRegister(RISCV::X0_Pair, MVT::Untyped);
 
 1832          CurDAG->getTargetConstant(RISCV::GPRPairRegClassID, 
DL, MVT::i32), 
Lo,
 
 1833          CurDAG->getTargetConstant(RISCV::sub_gpr_even, 
DL, MVT::i32), 
Hi,
 
 1834          CurDAG->getTargetConstant(RISCV::sub_gpr_odd, 
DL, MVT::i32)};
 
 1836      RegPair = 
SDValue(
CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE, 
DL,
 
 1849    unsigned IntNo = 
Node->getConstantOperandVal(0);
 
 1854    case Intrinsic::riscv_vmsgeu:
 
 1855    case Intrinsic::riscv_vmsge: {
 
 1858      bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu;
 
 1859      bool IsCmpConstant = 
false;
 
 1860      bool IsCmpMinimum = 
false;
 
 1868        IsCmpConstant = 
true;
 
 1869        CVal = 
C->getSExtValue();
 
 1870        if (CVal >= -15 && CVal <= 16) {
 
 1871          if (!IsUnsigned || CVal != 0)
 
 1873          IsCmpMinimum = 
true;
 
 1877          IsCmpMinimum = 
true;
 
 1880      unsigned VMSLTOpcode, VMNANDOpcode, VMSetOpcode, VMSGTOpcode;
 
 1884#define CASE_VMSLT_OPCODES(lmulenum, suffix)                                   \ 
 1885  case RISCVVType::lmulenum:                                                   \ 
 1886    VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix                 \ 
 1887                             : RISCV::PseudoVMSLT_VX_##suffix;                 \ 
 1888    VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix                 \ 
 1889                             : RISCV::PseudoVMSGT_VX_##suffix;                 \ 
 1898#undef CASE_VMSLT_OPCODES 
 1904#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix)                            \ 
 1905  case RISCVVType::lmulenum:                                                   \ 
 1906    VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix;                            \ 
 1907    VMSetOpcode = RISCV::PseudoVMSET_M_##suffix;                               \ 
 1916#undef CASE_VMNAND_VMSET_OPCODES 
 1927                    CurDAG->getMachineNode(VMSetOpcode, 
DL, VT, VL, MaskSEW));
 
 1931      if (IsCmpConstant) {
 
 1936                                                 {Src1, Imm, VL, SEW}));
 
 1943          CurDAG->getMachineNode(VMSLTOpcode, 
DL, VT, {Src1, Src2, VL, SEW}),
 
 1946                                               {Cmp, Cmp, VL, MaskSEW}));
 
 1949    case Intrinsic::riscv_vmsgeu_mask:
 
 1950    case Intrinsic::riscv_vmsge_mask: {
 
 1953      bool IsUnsigned = IntNo == Intrinsic::riscv_vmsgeu_mask;
 
 1954      bool IsCmpConstant = 
false;
 
 1955      bool IsCmpMinimum = 
false;
 
 1963        IsCmpConstant = 
true;
 
 1964        CVal = 
C->getSExtValue();
 
 1965        if (CVal >= -15 && CVal <= 16) {
 
 1966          if (!IsUnsigned || CVal != 0)
 
 1968          IsCmpMinimum = 
true;
 
 1972          IsCmpMinimum = 
true;
 
 1975      unsigned VMSLTOpcode, VMSLTMaskOpcode, VMXOROpcode, VMANDNOpcode,
 
 1976          VMOROpcode, VMSGTMaskOpcode;
 
 1980#define CASE_VMSLT_OPCODES(lmulenum, suffix)                                   \ 
 1981  case RISCVVType::lmulenum:                                                   \ 
 1982    VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix                 \ 
 1983                             : RISCV::PseudoVMSLT_VX_##suffix;                 \ 
 1984    VMSLTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix##_MASK      \ 
 1985                                 : RISCV::PseudoVMSLT_VX_##suffix##_MASK;      \ 
 1986    VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK      \ 
 1987                                 : RISCV::PseudoVMSGT_VX_##suffix##_MASK;      \ 
 1996#undef CASE_VMSLT_OPCODES 
 2002#define CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix)                       \ 
 2003  case RISCVVType::lmulenum:                                                   \ 
 2004    VMXOROpcode = RISCV::PseudoVMXOR_MM_##suffix;                              \ 
 2005    VMANDNOpcode = RISCV::PseudoVMANDN_MM_##suffix;                            \ 
 2006    VMOROpcode = RISCV::PseudoVMOR_MM_##suffix;                                \ 
 2015#undef CASE_VMXOR_VMANDN_VMOR_OPCODES 
 2029        if (Mask == MaskedOff) {
 
 2034                    CurDAG->getMachineNode(VMOROpcode, 
DL, VT,
 
 2035                                           {Mask, MaskedOff, VL, MaskSEW}));
 
 2042      if (Mask == MaskedOff) {
 
 2044            CurDAG->getMachineNode(VMSLTOpcode, 
DL, VT, {Src1, Src2, VL, SEW}),
 
 2047                                                 {Mask, Cmp, VL, MaskSEW}));
 
 2054      if (IsCmpConstant) {
 
 2059                              VMSGTMaskOpcode, 
DL, VT,
 
 2060                              {MaskedOff, Src1, Imm, Mask, VL, SEW, PolicyOp}));
 
 2070                                                   {MaskedOff, Src1, Src2, Mask,
 
 2071                                                    VL, SEW, PolicyOp}),
 
 2075                                               {Cmp, Mask, VL, MaskSEW}));
 
 2078    case Intrinsic::riscv_vsetvli:
 
 2079    case Intrinsic::riscv_vsetvlimax:
 
 2081    case Intrinsic::riscv_sf_vsettnt:
 
 2082    case Intrinsic::riscv_sf_vsettm:
 
 2083    case Intrinsic::riscv_sf_vsettk:
 
 2089    unsigned IntNo = 
Node->getConstantOperandVal(1);
 
 2094    case Intrinsic::riscv_vlseg2:
 
 2095    case Intrinsic::riscv_vlseg3:
 
 2096    case Intrinsic::riscv_vlseg4:
 
 2097    case Intrinsic::riscv_vlseg5:
 
 2098    case Intrinsic::riscv_vlseg6:
 
 2099    case Intrinsic::riscv_vlseg7:
 
 2100    case Intrinsic::riscv_vlseg8: {
 
 2105    case Intrinsic::riscv_vlseg2_mask:
 
 2106    case Intrinsic::riscv_vlseg3_mask:
 
 2107    case Intrinsic::riscv_vlseg4_mask:
 
 2108    case Intrinsic::riscv_vlseg5_mask:
 
 2109    case Intrinsic::riscv_vlseg6_mask:
 
 2110    case Intrinsic::riscv_vlseg7_mask:
 
 2111    case Intrinsic::riscv_vlseg8_mask: {
 
 2116    case Intrinsic::riscv_vlsseg2:
 
 2117    case Intrinsic::riscv_vlsseg3:
 
 2118    case Intrinsic::riscv_vlsseg4:
 
 2119    case Intrinsic::riscv_vlsseg5:
 
 2120    case Intrinsic::riscv_vlsseg6:
 
 2121    case Intrinsic::riscv_vlsseg7:
 
 2122    case Intrinsic::riscv_vlsseg8: {
 
 2127    case Intrinsic::riscv_vlsseg2_mask:
 
 2128    case Intrinsic::riscv_vlsseg3_mask:
 
 2129    case Intrinsic::riscv_vlsseg4_mask:
 
 2130    case Intrinsic::riscv_vlsseg5_mask:
 
 2131    case Intrinsic::riscv_vlsseg6_mask:
 
 2132    case Intrinsic::riscv_vlsseg7_mask:
 
 2133    case Intrinsic::riscv_vlsseg8_mask: {
 
 2138    case Intrinsic::riscv_vloxseg2:
 
 2139    case Intrinsic::riscv_vloxseg3:
 
 2140    case Intrinsic::riscv_vloxseg4:
 
 2141    case Intrinsic::riscv_vloxseg5:
 
 2142    case Intrinsic::riscv_vloxseg6:
 
 2143    case Intrinsic::riscv_vloxseg7:
 
 2144    case Intrinsic::riscv_vloxseg8:
 
 2148    case Intrinsic::riscv_vluxseg2:
 
 2149    case Intrinsic::riscv_vluxseg3:
 
 2150    case Intrinsic::riscv_vluxseg4:
 
 2151    case Intrinsic::riscv_vluxseg5:
 
 2152    case Intrinsic::riscv_vluxseg6:
 
 2153    case Intrinsic::riscv_vluxseg7:
 
 2154    case Intrinsic::riscv_vluxseg8:
 
 2158    case Intrinsic::riscv_vloxseg2_mask:
 
 2159    case Intrinsic::riscv_vloxseg3_mask:
 
 2160    case Intrinsic::riscv_vloxseg4_mask:
 
 2161    case Intrinsic::riscv_vloxseg5_mask:
 
 2162    case Intrinsic::riscv_vloxseg6_mask:
 
 2163    case Intrinsic::riscv_vloxseg7_mask:
 
 2164    case Intrinsic::riscv_vloxseg8_mask:
 
 2168    case Intrinsic::riscv_vluxseg2_mask:
 
 2169    case Intrinsic::riscv_vluxseg3_mask:
 
 2170    case Intrinsic::riscv_vluxseg4_mask:
 
 2171    case Intrinsic::riscv_vluxseg5_mask:
 
 2172    case Intrinsic::riscv_vluxseg6_mask:
 
 2173    case Intrinsic::riscv_vluxseg7_mask:
 
 2174    case Intrinsic::riscv_vluxseg8_mask:
 
 2178    case Intrinsic::riscv_vlseg8ff:
 
 2179    case Intrinsic::riscv_vlseg7ff:
 
 2180    case Intrinsic::riscv_vlseg6ff:
 
 2181    case Intrinsic::riscv_vlseg5ff:
 
 2182    case Intrinsic::riscv_vlseg4ff:
 
 2183    case Intrinsic::riscv_vlseg3ff:
 
 2184    case Intrinsic::riscv_vlseg2ff: {
 
 2188    case Intrinsic::riscv_vlseg8ff_mask:
 
 2189    case Intrinsic::riscv_vlseg7ff_mask:
 
 2190    case Intrinsic::riscv_vlseg6ff_mask:
 
 2191    case Intrinsic::riscv_vlseg5ff_mask:
 
 2192    case Intrinsic::riscv_vlseg4ff_mask:
 
 2193    case Intrinsic::riscv_vlseg3ff_mask:
 
 2194    case Intrinsic::riscv_vlseg2ff_mask: {
 
 2198    case Intrinsic::riscv_vloxei:
 
 2199    case Intrinsic::riscv_vloxei_mask:
 
 2200    case Intrinsic::riscv_vluxei:
 
 2201    case Intrinsic::riscv_vluxei_mask: {
 
 2202      bool IsMasked = IntNo == Intrinsic::riscv_vloxei_mask ||
 
 2203                      IntNo == Intrinsic::riscv_vluxei_mask;
 
 2204      bool IsOrdered = IntNo == Intrinsic::riscv_vloxei ||
 
 2205                       IntNo == Intrinsic::riscv_vloxei_mask;
 
 2207      MVT VT = 
Node->getSimpleValueType(0);
 
 2220             "Element count mismatch");
 
 2225      if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
 
 2227                              "index values when XLEN=32");
 
 2230          IsMasked, IsOrdered, IndexLog2EEW, 
static_cast<unsigned>(LMUL),
 
 2231          static_cast<unsigned>(IndexLMUL));
 
 2233          CurDAG->getMachineNode(
P->Pseudo, 
DL, 
Node->getVTList(), Operands);
 
 2240    case Intrinsic::riscv_vlm:
 
 2241    case Intrinsic::riscv_vle:
 
 2242    case Intrinsic::riscv_vle_mask:
 
 2243    case Intrinsic::riscv_vlse:
 
 2244    case Intrinsic::riscv_vlse_mask: {
 
 2245      bool IsMasked = IntNo == Intrinsic::riscv_vle_mask ||
 
 2246                      IntNo == Intrinsic::riscv_vlse_mask;
 
 2248          IntNo == Intrinsic::riscv_vlse || IntNo == Intrinsic::riscv_vlse_mask;
 
 2250      MVT VT = 
Node->getSimpleValueType(0);
 
 2259      bool HasPassthruOperand = IntNo != Intrinsic::riscv_vlm;
 
 2262      if (HasPassthruOperand)
 
 2268          CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, 
DL, VT);
 
 2276          RISCV::getVLEPseudo(IsMasked, IsStrided,  
false, Log2SEW,
 
 2277                              static_cast<unsigned>(LMUL));
 
 2279          CurDAG->getMachineNode(
P->Pseudo, 
DL, 
Node->getVTList(), Operands);
 
 2286    case Intrinsic::riscv_vleff:
 
 2287    case Intrinsic::riscv_vleff_mask: {
 
 2288      bool IsMasked = IntNo == Intrinsic::riscv_vleff_mask;
 
 2290      MVT VT = 
Node->getSimpleValueType(0);
 
 2302          RISCV::getVLEPseudo(IsMasked,  
false,  
true,
 
 2303                              Log2SEW, 
static_cast<unsigned>(LMUL));
 
 2305          P->Pseudo, 
DL, 
Node->getVTList(), Operands);
 
 2311    case Intrinsic::riscv_nds_vln:
 
 2312    case Intrinsic::riscv_nds_vln_mask:
 
 2313    case Intrinsic::riscv_nds_vlnu:
 
 2314    case Intrinsic::riscv_nds_vlnu_mask: {
 
 2315      bool IsMasked = IntNo == Intrinsic::riscv_nds_vln_mask ||
 
 2316                      IntNo == Intrinsic::riscv_nds_vlnu_mask;
 
 2317      bool IsUnsigned = IntNo == Intrinsic::riscv_nds_vlnu ||
 
 2318                        IntNo == Intrinsic::riscv_nds_vlnu_mask;
 
 2320      MVT VT = 
Node->getSimpleValueType(0);
 
 2332          IsMasked, IsUnsigned, Log2SEW, 
static_cast<unsigned>(LMUL));
 
 2334          CurDAG->getMachineNode(
P->Pseudo, 
DL, 
Node->getVTList(), Operands);
 
 2337        CurDAG->setNodeMemRefs(Load, {
MemOp->getMemOperand()});
 
 2346    unsigned IntNo = 
Node->getConstantOperandVal(1);
 
 2348    case Intrinsic::riscv_vsseg2:
 
 2349    case Intrinsic::riscv_vsseg3:
 
 2350    case Intrinsic::riscv_vsseg4:
 
 2351    case Intrinsic::riscv_vsseg5:
 
 2352    case Intrinsic::riscv_vsseg6:
 
 2353    case Intrinsic::riscv_vsseg7:
 
 2354    case Intrinsic::riscv_vsseg8: {
 
 2359    case Intrinsic::riscv_vsseg2_mask:
 
 2360    case Intrinsic::riscv_vsseg3_mask:
 
 2361    case Intrinsic::riscv_vsseg4_mask:
 
 2362    case Intrinsic::riscv_vsseg5_mask:
 
 2363    case Intrinsic::riscv_vsseg6_mask:
 
 2364    case Intrinsic::riscv_vsseg7_mask:
 
 2365    case Intrinsic::riscv_vsseg8_mask: {
 
 2370    case Intrinsic::riscv_vssseg2:
 
 2371    case Intrinsic::riscv_vssseg3:
 
 2372    case Intrinsic::riscv_vssseg4:
 
 2373    case Intrinsic::riscv_vssseg5:
 
 2374    case Intrinsic::riscv_vssseg6:
 
 2375    case Intrinsic::riscv_vssseg7:
 
 2376    case Intrinsic::riscv_vssseg8: {
 
 2381    case Intrinsic::riscv_vssseg2_mask:
 
 2382    case Intrinsic::riscv_vssseg3_mask:
 
 2383    case Intrinsic::riscv_vssseg4_mask:
 
 2384    case Intrinsic::riscv_vssseg5_mask:
 
 2385    case Intrinsic::riscv_vssseg6_mask:
 
 2386    case Intrinsic::riscv_vssseg7_mask:
 
 2387    case Intrinsic::riscv_vssseg8_mask: {
 
 2392    case Intrinsic::riscv_vsoxseg2:
 
 2393    case Intrinsic::riscv_vsoxseg3:
 
 2394    case Intrinsic::riscv_vsoxseg4:
 
 2395    case Intrinsic::riscv_vsoxseg5:
 
 2396    case Intrinsic::riscv_vsoxseg6:
 
 2397    case Intrinsic::riscv_vsoxseg7:
 
 2398    case Intrinsic::riscv_vsoxseg8:
 
 2402    case Intrinsic::riscv_vsuxseg2:
 
 2403    case Intrinsic::riscv_vsuxseg3:
 
 2404    case Intrinsic::riscv_vsuxseg4:
 
 2405    case Intrinsic::riscv_vsuxseg5:
 
 2406    case Intrinsic::riscv_vsuxseg6:
 
 2407    case Intrinsic::riscv_vsuxseg7:
 
 2408    case Intrinsic::riscv_vsuxseg8:
 
 2412    case Intrinsic::riscv_vsoxseg2_mask:
 
 2413    case Intrinsic::riscv_vsoxseg3_mask:
 
 2414    case Intrinsic::riscv_vsoxseg4_mask:
 
 2415    case Intrinsic::riscv_vsoxseg5_mask:
 
 2416    case Intrinsic::riscv_vsoxseg6_mask:
 
 2417    case Intrinsic::riscv_vsoxseg7_mask:
 
 2418    case Intrinsic::riscv_vsoxseg8_mask:
 
 2422    case Intrinsic::riscv_vsuxseg2_mask:
 
 2423    case Intrinsic::riscv_vsuxseg3_mask:
 
 2424    case Intrinsic::riscv_vsuxseg4_mask:
 
 2425    case Intrinsic::riscv_vsuxseg5_mask:
 
 2426    case Intrinsic::riscv_vsuxseg6_mask:
 
 2427    case Intrinsic::riscv_vsuxseg7_mask:
 
 2428    case Intrinsic::riscv_vsuxseg8_mask:
 
 2432    case Intrinsic::riscv_vsoxei:
 
 2433    case Intrinsic::riscv_vsoxei_mask:
 
 2434    case Intrinsic::riscv_vsuxei:
 
 2435    case Intrinsic::riscv_vsuxei_mask: {
 
 2436      bool IsMasked = IntNo == Intrinsic::riscv_vsoxei_mask ||
 
 2437                      IntNo == Intrinsic::riscv_vsuxei_mask;
 
 2438      bool IsOrdered = IntNo == Intrinsic::riscv_vsoxei ||
 
 2439                       IntNo == Intrinsic::riscv_vsoxei_mask;
 
 2441      MVT VT = 
Node->getOperand(2)->getSimpleValueType(0);
 
 2454             "Element count mismatch");
 
 2459      if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) {
 
 2461                              "index values when XLEN=32");
 
 2464          IsMasked, IsOrdered, IndexLog2EEW,
 
 2465          static_cast<unsigned>(LMUL), 
static_cast<unsigned>(IndexLMUL));
 
 2467          CurDAG->getMachineNode(
P->Pseudo, 
DL, 
Node->getVTList(), Operands);
 
 2474    case Intrinsic::riscv_vsm:
 
 2475    case Intrinsic::riscv_vse:
 
 2476    case Intrinsic::riscv_vse_mask:
 
 2477    case Intrinsic::riscv_vsse:
 
 2478    case Intrinsic::riscv_vsse_mask: {
 
 2479      bool IsMasked = IntNo == Intrinsic::riscv_vse_mask ||
 
 2480                      IntNo == Intrinsic::riscv_vsse_mask;
 
 2482          IntNo == Intrinsic::riscv_vsse || IntNo == Intrinsic::riscv_vsse_mask;
 
 2484      MVT VT = 
Node->getOperand(2)->getSimpleValueType(0);
 
 2496          IsMasked, IsStrided, Log2SEW, 
static_cast<unsigned>(LMUL));
 
 2498          CurDAG->getMachineNode(
P->Pseudo, 
DL, 
Node->getVTList(), Operands);
 
 2504    case Intrinsic::riscv_sf_vc_x_se:
 
 2505    case Intrinsic::riscv_sf_vc_i_se:
 
 2508    case Intrinsic::riscv_sf_vlte8:
 
 2509    case Intrinsic::riscv_sf_vlte16:
 
 2510    case Intrinsic::riscv_sf_vlte32:
 
 2511    case Intrinsic::riscv_sf_vlte64: {
 
 2513      unsigned PseudoInst;
 
 2515      case Intrinsic::riscv_sf_vlte8:
 
 2516        PseudoInst = RISCV::PseudoSF_VLTE8;
 
 2519      case Intrinsic::riscv_sf_vlte16:
 
 2520        PseudoInst = RISCV::PseudoSF_VLTE16;
 
 2523      case Intrinsic::riscv_sf_vlte32:
 
 2524        PseudoInst = RISCV::PseudoSF_VLTE32;
 
 2527      case Intrinsic::riscv_sf_vlte64:
 
 2528        PseudoInst = RISCV::PseudoSF_VLTE64;
 
 2536                            Node->getOperand(3),
 
 2537                            Node->getOperand(4),
 
 2540                            Node->getOperand(0)};
 
 2543          CurDAG->getMachineNode(PseudoInst, 
DL, 
Node->getVTList(), Operands);
 
 2545        CurDAG->setNodeMemRefs(TileLoad, {
MemOp->getMemOperand()});
 
 2550    case Intrinsic::riscv_sf_mm_s_s:
 
 2551    case Intrinsic::riscv_sf_mm_s_u:
 
 2552    case Intrinsic::riscv_sf_mm_u_s:
 
 2553    case Intrinsic::riscv_sf_mm_u_u:
 
 2554    case Intrinsic::riscv_sf_mm_e5m2_e5m2:
 
 2555    case Intrinsic::riscv_sf_mm_e5m2_e4m3:
 
 2556    case Intrinsic::riscv_sf_mm_e4m3_e5m2:
 
 2557    case Intrinsic::riscv_sf_mm_e4m3_e4m3:
 
 2558    case Intrinsic::riscv_sf_mm_f_f: {
 
 2559      bool HasFRM = 
false;
 
 2560      unsigned PseudoInst;
 
 2562      case Intrinsic::riscv_sf_mm_s_s:
 
 2563        PseudoInst = RISCV::PseudoSF_MM_S_S;
 
 2565      case Intrinsic::riscv_sf_mm_s_u:
 
 2566        PseudoInst = RISCV::PseudoSF_MM_S_U;
 
 2568      case Intrinsic::riscv_sf_mm_u_s:
 
 2569        PseudoInst = RISCV::PseudoSF_MM_U_S;
 
 2571      case Intrinsic::riscv_sf_mm_u_u:
 
 2572        PseudoInst = RISCV::PseudoSF_MM_U_U;
 
 2574      case Intrinsic::riscv_sf_mm_e5m2_e5m2:
 
 2575        PseudoInst = RISCV::PseudoSF_MM_E5M2_E5M2;
 
 2578      case Intrinsic::riscv_sf_mm_e5m2_e4m3:
 
 2579        PseudoInst = RISCV::PseudoSF_MM_E5M2_E4M3;
 
 2582      case Intrinsic::riscv_sf_mm_e4m3_e5m2:
 
 2583        PseudoInst = RISCV::PseudoSF_MM_E4M3_E5M2;
 
 2586      case Intrinsic::riscv_sf_mm_e4m3_e4m3:
 
 2587        PseudoInst = RISCV::PseudoSF_MM_E4M3_E4M3;
 
 2590      case Intrinsic::riscv_sf_mm_f_f:
 
 2591        if (
Node->getOperand(3).getValueType().getScalarType() == MVT::bf16)
 
 2592          PseudoInst = RISCV::PseudoSF_MM_F_F_ALT;
 
 2594          PseudoInst = RISCV::PseudoSF_MM_F_F;
 
 2610      if (IntNo == Intrinsic::riscv_sf_mm_f_f && Log2SEW == 5 &&
 
 2619      Operands.append({TmOp, TnOp, TkOp,
 
 2620                       CurDAG->getTargetConstant(Log2SEW, 
DL, XLenVT), TWidenOp,
 
 2624          CurDAG->getMachineNode(PseudoInst, 
DL, 
Node->getVTList(), Operands);
 
 2629    case Intrinsic::riscv_sf_vtzero_t: {
 
 2636      auto *NewNode = 
CurDAG->getMachineNode(
 
 2637          RISCV::PseudoSF_VTZERO_T, 
DL, 
Node->getVTList(),
 
 2638          {CurDAG->getRegister(getTileReg(TileNum), XLenVT), Tm, Tn, Log2SEW,
 
 2647  case ISD::BITCAST: {
 
 2648    MVT SrcVT = 
Node->getOperand(0).getSimpleValueType();
 
 2660  case RISCVISD::TUPLE_INSERT: {
 
 2664    auto Idx = 
Node->getConstantOperandVal(2);
 
 2668    MVT SubVecContainerVT = SubVecVT;
 
 2671      SubVecContainerVT = 
TLI.getContainerForFixedLengthVector(SubVecVT);
 
 2673      [[maybe_unused]] 
bool ExactlyVecRegSized =
 
 2675              .isKnownMultipleOf(Subtarget->expandVScale(VecRegSize));
 
 2677                               .getKnownMinValue()));
 
 2678      assert(Idx == 0 && (ExactlyVecRegSized || V.isUndef()));
 
 2680    MVT ContainerVT = VT;
 
 2682      ContainerVT = 
TLI.getContainerForFixedLengthVector(VT);
 
 2684    const auto *
TRI = Subtarget->getRegisterInfo();
 
 2686    std::tie(SubRegIdx, Idx) =
 
 2688            ContainerVT, SubVecContainerVT, Idx, 
TRI);
 
 2698    [[maybe_unused]] 
bool IsSubVecPartReg =
 
 2702    assert((V.getValueType().isRISCVVectorTuple() || !IsSubVecPartReg ||
 
 2704           "Expecting lowering to have created legal INSERT_SUBVECTORs when " 
 2705           "the subvector is smaller than a full-sized register");
 
 2709    if (SubRegIdx == RISCV::NoSubRegister) {
 
 2710      unsigned InRegClassID =
 
 2714             "Unexpected subvector extraction");
 
 2716      SDNode *NewNode = 
CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS,
 
 2722    SDValue Insert = 
CurDAG->getTargetInsertSubreg(SubRegIdx, 
DL, VT, V, SubV);
 
 2727  case RISCVISD::TUPLE_EXTRACT: {
 
 2729    auto Idx = 
Node->getConstantOperandVal(1);
 
 2730    MVT InVT = V.getSimpleValueType();
 
 2734    MVT SubVecContainerVT = VT;
 
 2738      SubVecContainerVT = 
TLI.getContainerForFixedLengthVector(VT);
 
 2741      InVT = 
TLI.getContainerForFixedLengthVector(InVT);
 
 2743    const auto *
TRI = Subtarget->getRegisterInfo();
 
 2745    std::tie(SubRegIdx, Idx) =
 
 2747            InVT, SubVecContainerVT, Idx, 
TRI);
 
 2757    if (SubRegIdx == RISCV::NoSubRegister) {
 
 2761             "Unexpected subvector extraction");
 
 2764          CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS, 
DL, VT, V, RC);
 
 2769    SDValue Extract = 
CurDAG->getTargetExtractSubreg(SubRegIdx, 
DL, VT, V);
 
 2773  case RISCVISD::VMV_S_X_VL:
 
 2774  case RISCVISD::VFMV_S_F_VL:
 
 2775  case RISCVISD::VMV_V_X_VL:
 
 2776  case RISCVISD::VFMV_V_F_VL: {
 
 2778    bool IsScalarMove = 
Node->getOpcode() == RISCVISD::VMV_S_X_VL ||
 
 2779                        Node->getOpcode() == RISCVISD::VFMV_S_F_VL;
 
 2780    if (!
Node->getOperand(0).isUndef())
 
 2786    if (!Ld || Ld->isIndexed())
 
 2788    EVT MemVT = Ld->getMemoryVT();
 
 2814    if (IsStrided && !Subtarget->hasOptimizedZeroStrideLoad())
 
 2818        SDValue(
CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, 
DL, VT), 0),
 
 2824    Operands.
append({VL, SEW, PolicyOp, Ld->getChain()});
 
 2828         false, IsStrided,  
false,
 
 2829        Log2SEW, 
static_cast<unsigned>(LMUL));
 
 2831        CurDAG->getMachineNode(
P->Pseudo, 
DL, {VT, MVT::Other}, Operands);
 
 2835    CurDAG->setNodeMemRefs(Load, {Ld->getMemOperand()});
 
 2841    unsigned Locality = 
Node->getConstantOperandVal(3);
 
 2849    int NontemporalLevel = 0;
 
 2852      NontemporalLevel = 3; 
 
 2855      NontemporalLevel = 1; 
 
 2858      NontemporalLevel = 0; 
 
 2864    if (NontemporalLevel & 0b1)
 
 2866    if (NontemporalLevel & 0b10)