53 #define DEBUG_TYPE "mips-isel" 60 cl::desc(
"Expand double precision loads and " 61 "stores to their single precision " 306 return Subtarget.
hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
449 case ISD::LOAD:
return lowerLOAD(Op, DAG);
499 int32_t Log2IfPositive = (Mask->
getAPIntValue() + 1).exactLogBase2();
501 if (Log2IfPositive <= 0)
505 EVT ExtendTy = cast<VTSDNode>(Op0Op2)->getVT();
507 unsigned Log2 = Log2IfPositive;
510 Log2 == ExtendTySize) {
536 APInt SplatValue, SplatUndef;
537 unsigned SplatBitSize;
540 if (!Node->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
561 APInt SplatValue, SplatUndef;
562 unsigned SplatBitSize;
567 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
612 bool IsLittleEndian = !Subtarget.
isLittle();
615 bool IsConstantMask =
false;
622 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
626 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
629 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
633 IsConstantMask =
true;
643 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
646 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
650 IsConstantMask =
true;
699 if (IsConstantMask) {
724 while (!WorkStack.
empty()) {
727 if (Val == 0 || Val == 1)
739 if ((Val - Floor).ule(Ceil - Val)) {
807 if ((C - Floor).ule(Ceil - C)) {
840 APInt SplatValue, SplatUndef;
841 unsigned SplatBitSize;
850 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
852 (SplatBitSize != EltSize) ||
908 EVT ExtendTy = cast<VTSDNode>(Op0Op0->
getOperand(2))->getVT();
911 if (TotalBits == 32 ||
955 default:
return false;
1063 case Mips::BPOSGE32_PSEUDO:
1064 return emitBPOSGE32(MI, BB);
1065 case Mips::SNZ_B_PSEUDO:
1066 return emitMSACBranchPseudo(MI, BB, Mips::BNZ_B);
1067 case Mips::SNZ_H_PSEUDO:
1068 return emitMSACBranchPseudo(MI, BB, Mips::BNZ_H);
1069 case Mips::SNZ_W_PSEUDO:
1070 return emitMSACBranchPseudo(MI, BB, Mips::BNZ_W);
1071 case Mips::SNZ_D_PSEUDO:
1072 return emitMSACBranchPseudo(MI, BB, Mips::BNZ_D);
1073 case Mips::SNZ_V_PSEUDO:
1074 return emitMSACBranchPseudo(MI, BB, Mips::BNZ_V);
1075 case Mips::SZ_B_PSEUDO:
1076 return emitMSACBranchPseudo(MI, BB, Mips::BZ_B);
1077 case Mips::SZ_H_PSEUDO:
1078 return emitMSACBranchPseudo(MI, BB, Mips::BZ_H);
1079 case Mips::SZ_W_PSEUDO:
1080 return emitMSACBranchPseudo(MI, BB, Mips::BZ_W);
1081 case Mips::SZ_D_PSEUDO:
1082 return emitMSACBranchPseudo(MI, BB, Mips::BZ_D);
1083 case Mips::SZ_V_PSEUDO:
1084 return emitMSACBranchPseudo(MI, BB, Mips::BZ_V);
1085 case Mips::COPY_FW_PSEUDO:
1086 return emitCOPY_FW(MI, BB);
1087 case Mips::COPY_FD_PSEUDO:
1088 return emitCOPY_FD(MI, BB);
1089 case Mips::INSERT_FW_PSEUDO:
1090 return emitINSERT_FW(MI, BB);
1091 case Mips::INSERT_FD_PSEUDO:
1092 return emitINSERT_FD(MI, BB);
1093 case Mips::INSERT_B_VIDX_PSEUDO:
1094 case Mips::INSERT_B_VIDX64_PSEUDO:
1095 return emitINSERT_DF_VIDX(MI, BB, 1,
false);
1096 case Mips::INSERT_H_VIDX_PSEUDO:
1097 case Mips::INSERT_H_VIDX64_PSEUDO:
1098 return emitINSERT_DF_VIDX(MI, BB, 2,
false);
1099 case Mips::INSERT_W_VIDX_PSEUDO:
1100 case Mips::INSERT_W_VIDX64_PSEUDO:
1101 return emitINSERT_DF_VIDX(MI, BB, 4,
false);
1102 case Mips::INSERT_D_VIDX_PSEUDO:
1103 case Mips::INSERT_D_VIDX64_PSEUDO:
1104 return emitINSERT_DF_VIDX(MI, BB, 8,
false);
1105 case Mips::INSERT_FW_VIDX_PSEUDO:
1106 case Mips::INSERT_FW_VIDX64_PSEUDO:
1107 return emitINSERT_DF_VIDX(MI, BB, 4,
true);
1108 case Mips::INSERT_FD_VIDX_PSEUDO:
1109 case Mips::INSERT_FD_VIDX64_PSEUDO:
1110 return emitINSERT_DF_VIDX(MI, BB, 8,
true);
1111 case Mips::FILL_FW_PSEUDO:
1112 return emitFILL_FW(MI, BB);
1113 case Mips::FILL_FD_PSEUDO:
1114 return emitFILL_FD(MI, BB);
1115 case Mips::FEXP2_W_1_PSEUDO:
1116 return emitFEXP2_W_1(MI, BB);
1117 case Mips::FEXP2_D_1_PSEUDO:
1118 return emitFEXP2_D_1(MI, BB);
1120 return emitST_F16_PSEUDO(MI, BB);
1122 return emitLD_F16_PSEUDO(MI, BB);
1123 case Mips::MSA_FP_EXTEND_W_PSEUDO:
1124 return emitFPEXTEND_PSEUDO(MI, BB,
false);
1125 case Mips::MSA_FP_ROUND_W_PSEUDO:
1126 return emitFPROUND_PSEUDO(MI, BB,
false);
1127 case Mips::MSA_FP_EXTEND_D_PSEUDO:
1128 return emitFPEXTEND_PSEUDO(MI, BB,
true);
1129 case Mips::MSA_FP_ROUND_D_PSEUDO:
1130 return emitFPROUND_PSEUDO(MI, BB,
true);
1134 bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1135 const CCState &CCInfo,
unsigned NextStackOffset,
1153 void MipsSETargetLowering::
1155 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
1156 bool IsPICCall,
bool GlobalOrExternal,
bool InternalLinkage,
1161 InternalLinkage, IsCallReloc, CLI, Callee,
1203 EVT PtrVT = Ptr.getValueType();
1224 SDValue MipsSETargetLowering::lowerMulDiv(
SDValue Op,
unsigned NewOpc,
1225 bool HasLo,
bool HasHi,
1241 if (!HasLo || !HasHi)
1242 return HasLo ?
Lo :
Hi;
1290 if (Opnd.getValueType() ==
MVT::i64)
1338 EVT ViaVecTy = ResVecTy;
1351 if (isa<ConstantSDNode>(LaneA))
1365 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1366 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1371 if (ViaVecTy != ResVecTy) {
1381 bool IsSigned =
false) {
1390 EVT ViaVecTy = VecTy;
1391 SDValue SplatValueA = SplatValue;
1392 SDValue SplatValueB = SplatValue;
1393 SDLoc DL(SplatValue);
1410 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1411 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1412 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1413 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1418 if (VecTy != ViaVecTy)
1435 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1447 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1488 DAG.
getNOT(DL, Bit, ResTy));
1495 << cast<ConstantSDNode>(Op->
getOperand(2))->getAPIntValue();
1501 SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(
SDValue Op,
1504 unsigned Intrinsic = cast<ConstantSDNode>(Op->
getOperand(0))->getZExtValue();
1505 switch (Intrinsic) {
1931 switch (Intrinsic) {
1938 int64_t
Value = cast<ConstantSDNode>(Op->
getOperand(2))->getSExtValue();
2090 switch (Intrinsic) {
2101 int64_t
Value = cast<ConstantSDNode>(Op->
getOperand(2))->getSExtValue();
2109 int64_t
Value = cast<ConstantSDNode>(Op->
getOperand(2))->getSExtValue();
2121 switch (Intrinsic) {
2128 int64_t
Value = cast<ConstantSDNode>(Op->
getOperand(3))->getSExtValue();
2181 switch (Intrinsic) {
2188 int64_t
Value = cast<ConstantSDNode>(Op->
getOperand(2))->getSExtValue();
2211 switch (Intrinsic) {
2218 int64_t
Value = cast<ConstantSDNode>(Op->
getOperand(2))->getSExtValue();
2276 unsigned Intr = cast<ConstantSDNode>(Op->
getOperand(1))->getZExtValue();
2351 unsigned Intr = cast<ConstantSDNode>(Op->
getOperand(1))->getZExtValue();
2370 SDValue MipsSETargetLowering::
2393 if (isa<ConstantSDNode>(Op))
2395 if (isa<ConstantFPSDNode>(Op))
2425 APInt SplatValue, SplatUndef;
2426 unsigned SplatBitSize;
2436 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2443 if (ResTy.isInteger() && !HasAnyUndefs)
2448 switch (SplatBitSize) {
2469 if (ViaVecTy != ResTy)
2485 for (
unsigned i = 0; i < NumElts; ++i) {
2517 int SHFIndices[4] = { -1, -1, -1, -1 };
2519 if (Indices.
size() < 4)
2522 for (
unsigned i = 0; i < 4; ++i) {
2523 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2524 int Idx = Indices[j];
2530 if (Idx < 0 || Idx >= 4)
2536 if (SHFIndices[i] == -1)
2537 SHFIndices[i] = Idx;
2541 if (!(Idx == -1 || Idx == SHFIndices[i]))
2548 for (
int i = 3; i >= 0; --i) {
2549 int Idx = SHFIndices[i];
2565 template <
typename ValType>
2568 unsigned CheckStride,
2570 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2574 if (*
I != -1 && *
I != ExpectedIndex)
2576 ExpectedIndex += ExpectedIndexStride;
2580 for (
unsigned n = 0; n < CheckStride &&
I != End; ++n, ++
I)
2599 int SplatIndex = -1;
2600 for (
const auto &V : Indices) {
2607 return fitsRegularPattern<int>(Indices.begin(), 1, Indices.end(), SplatIndex,
2633 const auto &Begin = Indices.
begin();
2634 const auto &End = Indices.
end();
2638 if (fitsRegularPattern<int>(Begin, 2, End, 0, 2))
2640 else if (fitsRegularPattern<int>(Begin, 2, End, Indices.
size(), 2))
2647 if (fitsRegularPattern<int>(Begin + 1, 2, End, 0, 2))
2649 else if (fitsRegularPattern<int>(Begin + 1, 2, End, Indices.
size(), 2))
2679 const auto &Begin = Indices.
begin();
2680 const auto &End = Indices.
end();
2684 if (fitsRegularPattern<int>(Begin, 2, End, 1, 2))
2686 else if (fitsRegularPattern<int>(Begin, 2, End, Indices.
size() + 1, 2))
2693 if (fitsRegularPattern<int>(Begin + 1, 2, End, 1, 2))
2695 else if (fitsRegularPattern<int>(Begin + 1, 2, End, Indices.
size() + 1, 2))
2726 const auto &Begin = Indices.
begin();
2727 const auto &End = Indices.
end();
2731 if (fitsRegularPattern<int>(Begin, 2, End, 0, 1))
2733 else if (fitsRegularPattern<int>(Begin, 2, End, Indices.
size(), 1))
2740 if (fitsRegularPattern<int>(Begin + 1, 2, End, 0, 1))
2742 else if (fitsRegularPattern<int>(Begin + 1, 2, End, Indices.
size(), 1))
2771 unsigned HalfSize = Indices.
size() / 2;
2774 const auto &Begin = Indices.
begin();
2775 const auto &End = Indices.
end();
2779 if (fitsRegularPattern<int>(Begin, 2, End, HalfSize, 1))
2781 else if (fitsRegularPattern<int>(Begin, 2, End, Indices.
size() + HalfSize, 1))
2788 if (fitsRegularPattern<int>(Begin + 1, 2, End, HalfSize, 1))
2790 else if (fitsRegularPattern<int>(Begin + 1, 2, End, Indices.
size() + HalfSize,
2821 const auto &Begin = Indices.
begin();
2822 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
2823 const auto &End = Indices.
end();
2825 if (fitsRegularPattern<int>(Begin, 1, Mid, 0, 2))
2827 else if (fitsRegularPattern<int>(Begin, 1, Mid, Indices.
size(), 2))
2832 if (fitsRegularPattern<int>(Mid, 1, End, 0, 2))
2834 else if (fitsRegularPattern<int>(Mid, 1, End, Indices.
size(), 2))
2864 const auto &Begin = Indices.
begin();
2865 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
2866 const auto &End = Indices.
end();
2868 if (fitsRegularPattern<int>(Begin, 1, Mid, 1, 2))
2870 else if (fitsRegularPattern<int>(Begin, 1, Mid, Indices.
size() + 1, 2))
2875 if (fitsRegularPattern<int>(Mid, 1, End, 1, 2))
2877 else if (fitsRegularPattern<int>(Mid, 1, End, Indices.
size() + 1, 2))
2901 bool Using1stVec =
false;
2902 bool Using2ndVec =
false;
2906 for (
int i = 0; i < ResTyNumElts; ++i) {
2908 int Idx = Indices[i];
2910 if (0 <= Idx && Idx < ResTyNumElts)
2912 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
2922 if (Using1stVec && Using2ndVec) {
2925 }
else if (Using1stVec)
2927 else if (Using2ndVec)
2930 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
2949 if (!ResTy.is128BitVector())
2952 int ResTyNumElts = ResTy.getVectorNumElements();
2955 for (
int i = 0; i < ResTyNumElts; ++i)
3022 BuildMI(BB, DL, TII->
get(Mips::BPOSGE32)).addMBB(TBB);
3024 BuildMI(BB, DL, TII->
get(Mips::BPOSGE32C_MMR3)).addMBB(TBB);
3029 .addReg(Mips::ZERO).
addImm(0);
3035 .addReg(Mips::ZERO).
addImm(1);
3098 .addReg(Mips::ZERO).
addImm(0);
3104 .addReg(Mips::ZERO).
addImm(1);
3145 BuildMI(*BB, MI, DL, TII->
get(Mips::COPY), Wt).addReg(Ws);
3148 BuildMI(*BB, MI, DL, TII->
get(Mips::COPY), Fd).addReg(Wt, 0, Mips::sub_lo);
3152 &Mips::MSA128WEvensRegClass);
3154 BuildMI(*BB, MI, DL, TII->
get(Mips::SPLATI_W), Wt).addReg(Ws).
addImm(Lane);
3155 BuildMI(*BB, MI, DL, TII->
get(Mips::COPY), Fd).addReg(Wt, 0, Mips::sub_lo);
3185 BuildMI(*BB, MI, DL, TII->
get(Mips::COPY), Fd).addReg(Ws, 0, Mips::sub_64);
3190 BuildMI(*BB, MI, DL, TII->
get(Mips::COPY), Fd).addReg(Wt, 0, Mips::sub_64);
3215 &Mips::MSA128WEvensRegClass);
3217 BuildMI(*BB, MI, DL, TII->
get(Mips::SUBREG_TO_REG), Wt)
3221 BuildMI(*BB, MI, DL, TII->
get(Mips::INSVE_W), Wd)
3251 BuildMI(*BB, MI, DL, TII->
get(Mips::SUBREG_TO_REG), Wt)
3255 BuildMI(*BB, MI, DL, TII->
get(Mips::INSVE_D), Wd)
3302 unsigned EltLog2Size;
3303 unsigned InsertOp = 0;
3304 unsigned InsveOp = 0;
3305 switch (EltSizeInBytes) {
3310 InsertOp = Mips::INSERT_B;
3311 InsveOp = Mips::INSVE_B;
3312 VecRC = &Mips::MSA128BRegClass;
3316 InsertOp = Mips::INSERT_H;
3317 InsveOp = Mips::INSVE_H;
3318 VecRC = &Mips::MSA128HRegClass;
3322 InsertOp = Mips::INSERT_W;
3323 InsveOp = Mips::INSVE_W;
3324 VecRC = &Mips::MSA128WRegClass;
3328 InsertOp = Mips::INSERT_D;
3329 InsveOp = Mips::INSVE_D;
3330 VecRC = &Mips::MSA128DRegClass;
3336 BuildMI(*BB, MI, DL, TII->
get(Mips::SUBREG_TO_REG), Wt)
3339 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3344 if (EltSizeInBytes != 1) {
3346 BuildMI(*BB, MI, DL, TII->
get(ShiftOp), LaneTmp1)
3354 BuildMI(*BB, MI, DL, TII->
get(Mips::SLD_B), WdTmp1)
3357 .
addReg(LaneReg, 0, SubRegIdx);
3362 BuildMI(*BB, MI, DL, TII->
get(InsveOp), WdTmp2)
3369 BuildMI(*BB, MI, DL, TII->
get(InsertOp), WdTmp2)
3383 BuildMI(*BB, MI, DL, TII->
get(Mips::SLD_B), Wd)
3386 .
addReg(LaneTmp2, 0, SubRegIdx);
3409 : &Mips::MSA128WEvensRegClass);
3412 : &Mips::MSA128WEvensRegClass);
3414 BuildMI(*BB, MI, DL, TII->
get(Mips::IMPLICIT_DEF), Wt1);
3415 BuildMI(*BB, MI, DL, TII->
get(Mips::INSERT_SUBREG), Wt2)
3445 BuildMI(*BB, MI, DL, TII->
get(Mips::IMPLICIT_DEF), Wt1);
3446 BuildMI(*BB, MI, DL, TII->
get(Mips::INSERT_SUBREG), Wt2)
3468 MipsSETargetLowering::emitST_F16_PSEUDO(
MachineInstr &MI,
3485 : &Mips::GPR64RegClass);
3486 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3492 BuildMI(*BB, MI, DL, TII->
get(Mips::SUBREG_TO_REG), Tmp)
3498 BuildMI(*BB, MI, DL, TII->
get(UsingMips32 ? Mips::SH : Mips::SH64))
3523 MipsSETargetLowering::emitLD_F16_PSEUDO(
MachineInstr &MI,
3537 : &Mips::GPR64RegClass);
3539 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3543 BuildMI(*BB, MI, DL, TII->
get(UsingMips32 ? Mips::LH : Mips::LH64), Rt);
3549 BuildMI(*BB, MI, DL, TII->
get(Mips::COPY), Tmp).addReg(Rt, 0, Mips::sub_32);
3553 BuildMI(*BB, MI, DL, TII->
get(Mips::FILL_H), Wd).addReg(Rt);
3609 MipsSETargetLowering::emitFPROUND_PSEUDO(
MachineInstr &MI,
3611 bool IsFGR64)
const {
3629 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3630 unsigned MFC1Opc = IsFGR64onMips64
3632 : (IsFGR64onMips32 ? Mips::MFC1_D64 : Mips::MFC1);
3633 unsigned FILLOpc = IsFGR64onMips64 ? Mips::FILL_D : Mips::FILL_W;
3637 BuildMI(*BB, MI, DL, TII->
get(MFC1Opc), Rtemp).addReg(Fs);
3638 BuildMI(*BB, MI, DL, TII->
get(FILLOpc), Wtemp).addReg(Rtemp);
3639 unsigned WPHI = Wtemp;
3641 if (IsFGR64onMips32) {
3643 BuildMI(*BB, MI, DL, TII->
get(Mips::MFHC1_D64), Rtemp2).addReg(Fs);
3646 BuildMI(*BB, MI, DL, TII->
get(Mips::INSERT_W), Wtemp2)
3650 BuildMI(*BB, MI, DL, TII->
get(Mips::INSERT_W), Wtemp3)
3659 BuildMI(*BB, MI, DL, TII->
get(Mips::FEXDO_W), Wtemp2)
3665 BuildMI(*BB, MI, DL, TII->
get(Mips::FEXDO_H), Wd).addReg(WPHI).
addReg(WPHI);
3714 MipsSETargetLowering::emitFPEXTEND_PSEUDO(
MachineInstr &MI,
3716 bool IsFGR64)
const {
3733 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3734 unsigned MTC1Opc = IsFGR64onMips64
3737 unsigned COPYOpc = IsFGR64onMips64 ? Mips::COPY_S_D : Mips::COPY_S_W;
3740 unsigned WPHI = Wtemp;
3742 BuildMI(*BB, MI, DL, TII->
get(Mips::FEXUPR_W), Wtemp).addReg(Ws);
3745 BuildMI(*BB, MI, DL, TII->
get(Mips::FEXUPR_D), WPHI).addReg(Wtemp);
3750 unsigned FPRPHI = IsFGR64onMips32
3754 BuildMI(*BB, MI, DL, TII->
get(MTC1Opc), FPRPHI).addReg(Rtemp);
3756 if (IsFGR64onMips32) {
3758 BuildMI(*BB, MI, DL, TII->
get(Mips::COPY_S_W), Rtemp2)
3761 BuildMI(*BB, MI, DL, TII->
get(Mips::MTHC1_D64), Fd)
3787 BuildMI(*BB, MI, DL, TII->
get(Mips::LDI_W), Ws1).addImm(1);
3788 BuildMI(*BB, MI, DL, TII->
get(Mips::FFINT_U_W), Ws2).addReg(Ws1);
3816 BuildMI(*BB, MI, DL, TII->
get(Mips::LDI_D), Ws1).addImm(1);
3817 BuildMI(*BB, MI, DL, TII->
get(Mips::FFINT_U_D), Ws2).addReg(Ws1);
SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, unsigned Alignment=0, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
const MipsTargetLowering * createMipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
static SDValue genConstMult(SDValue X, APInt C, const SDLoc &DL, EVT VT, EVT ShiftTy, SelectionDAG &DAG)
const MachineInstrBuilder & add(const MachineOperand &MO) const
BUILTIN_OP_END - This must be the last enum value in this list.
FMINNUM/FMAXNUM - Perform floating-point minimum or maximum on two values.
EVT getValueType() const
Return the ValueType of the referenced return value.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified load with extension does not work with the specified type and indicate wh...
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant, which is required to be operand #1) half of the integer or float value specified as operand #0.
uint64_t getZExtValue() const
Get zero extended value.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond)
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
typename SuperClass::const_iterator const_iterator
const TargetRegisterClass * getRegClass(unsigned Reg) const
Return the register class of the specified virtual register.
const MipsSubtarget & Subtarget
bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector...
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
BR_CC - Conditional branch.
This class represents lattice values for constants.
value_iterator value_end() const
static SDValue initAccumulator(SDValue In, const SDLoc &DL, SelectionDAG &DAG)
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS=0, unsigned Align=1, bool *Fast=nullptr) const override
Determine if the target supports unaligned memory accesses.
static SDValue performVSELECTCombine(SDNode *N, SelectionDAG &DAG)
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0...
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
virtual const TargetRegisterClass * getRepRegClassFor(MVT VT) const
Return the 'representative' register class for the specified value type.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
const SDValue & getBasePtr() const
Carry-setting nodes for multiple precision addition and subtraction.
void push_back(const T &Elt)
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
static SDValue performANDCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
unsigned getReg() const
getReg - Returns the register number.
const SDValue & getValue() const
void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
SDVTList getVTList() const
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Get a value with low bits set.
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
const MipsInstrInfo * getInstrInfo() const override
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
const SDValue & getChain() const
uint64_t getSize() const
Return the size in bytes of the memory reference.
unsigned getAlignment() const
APInt trunc(unsigned width) const
Truncate to new width.
bool isInteger() const
Return true if this is an integer or a vector integer type.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
[US]{MIN/MAX} - Binary minimum or maximum or signed or unsigned integers.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
MachineMemOperand * getMemOperand() const
Return a MachineMemOperand object describing the memory reference performed by operation.
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
unsigned getBitWidth() const
Return the number of bits in the APInt.
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
void printrWithDepth(raw_ostream &O, const SelectionDAG *G=nullptr, unsigned depth=100) const
Print a SelectionDAG node and children up to depth "depth." The given SelectionDAG allows target-spec...
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
const Triple & getTargetTriple() const
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
LowerOperation - Provide custom lowering hooks for some operations.
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr, const MipsSubtarget &Subtarget)
A description of a memory reference used in the backend.
const HexagonInstrInfo * TII
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
Shift and rotation operations.
unsigned getNumOperands() const
Retuns the total number of operands.
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
unsigned getScalarValueSizeInBits() const
void setCondCodeAction(ISD::CondCode CC, MVT VT, LegalizeAction Action)
Indicate that the specified condition code is or isn't supported on the target and indicate what to d...
static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG)
static bool isConstantOrUndefBUILD_VECTOR(const BuildVectorSDNode *Op)
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
const DataLayout & getDataLayout() const
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, uint64_t s, unsigned base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
This file implements a class to represent arbitrary precision integral constant values and operations...
static SDValue lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
Fast - This calling convention attempts to make calls as fast as possible (e.g.
unsigned getScalarSizeInBits() const
unsigned getSizeInBits() const
Return the size of the specified value type in bits.
static bool isVSplat(SDValue N, APInt &Imm, bool IsLittleEndian)
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose...
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
static bool isVECTOR_SHUFFLE_SPLATI(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
Simple integer binary arithmetic operators.
static bool isConstantOrUndef(const SDValue Op)
unsigned getIncomingArgSize() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out...
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification, or lowering of the constant.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
static SDValue lowerVECTOR_SHUFFLE_ILVR(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
amdgpu Simplify well known AMD library false Value * Callee
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *bb=nullptr)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
This class is used to represent ISD::STORE nodes.
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a vector with the specified, possibly variable...
TargetInstrInfo - Interface to description of machine instruction set.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Get a value with high bits set.
static SDValue performORCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG, bool IsSigned=false)
virtual void getOpndList(SmallVectorImpl< SDValue > &Ops, std::deque< std::pair< unsigned, SDValue >> &RegsToPass, bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage, bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const
This function fills Ops, which is the list of operands that will later be used when a function call n...
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata *> MDs)
bool isNegative() const
Determine sign of this APInt.
const SDValue & getBasePtr() const
initializer< Ty > init(const Ty &Val)
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
bool isAllOnesValue() const
Determine if all bits are set.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static SDValue lowerVECTOR_SHUFFLE_ILVEV(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc)
bool isLittleEndian() const
Tests whether the target triple is little endian.
LLVM Basic Block Representation.
static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr, const MipsSubtarget &Subtarget)
static SDValue getBuildVectorSplat(EVT VecTy, SDValue SplatValue, bool BigEndian, SelectionDAG &DAG)
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Add the specified register class as an available regclass for the specified value type...
Simple binary floating point operators.
void setTargetDAGCombine(ISD::NodeType NT)
Targets should invoke this method for each target independent node that they want to provide a custom...
static bool isLegalDSPCondCode(EVT Ty, ISD::CondCode CC)
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator begin()
const SDValue & getOperand(unsigned Num) const
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL...
Carry-using nodes for multiple precision addition and subtraction.
static bool isVectorAllOnes(SDValue N)
static SDValue lowerVECTOR_SHUFFLE_PCKEV(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
const APInt & getAPIntValue() const
static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
static mvt_range vector_valuetypes()
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const
static SDValue performMULCombine(SDNode *N, SelectionDAG &DAG, const TargetLowering::DAGCombinerInfo &DCI, const MipsSETargetLowering *TL, const MipsSubtarget &Subtarget)
static bool fitsRegularPattern(typename SmallVectorImpl< ValType >::const_iterator Begin, unsigned CheckStride, typename SmallVectorImpl< ValType >::const_iterator End, ValType ExpectedIndex, unsigned ExpectedIndexStride)
Determine whether a range fits a regular pattern of values.
bool isSingleFloat() const
unsigned ceilLogBase2() const
This structure contains all information that is necessary for lowering calls.
This class contains a discriminated union of information about pointers in memory operands...
unsigned getNumOperands() const
Return the number of values used by this operation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, unsigned Alignment=0, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands...
bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef...
const TargetLowering & getTargetLoweringInfo() const
Iterator for intrusive lists based on ilist_node.
CCState - This class holds information needed while lowering arguments and return values...
void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
static SDValue truncateVecElts(SDValue Op, SelectionDAG &DAG)
static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
mmo_iterator memoperands_begin() const
Access to memory operands of the instruction.
const MipsRegisterInfo * getRegisterInfo() const override
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
EVT getVectorElementType() const
Given a vector type, return the type of each element.
double Log2(double Value)
Return the log base 2 of the specified value.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
value_iterator value_begin() const
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG)
constexpr size_t array_lengthof(T(&)[N])
Find the length of an array.
EVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
BRCOND - Conditional branch.
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
LLVM_NODISCARD T pop_back_val()
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc)
Represents one node in the SelectionDAG.
SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
LowerOperation - Provide custom lowering hooks for some operations.
unsigned logBase2() const
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG)
EVT getMemoryVT() const
Return the type of the in-memory value.
Class for arbitrary precision integers.
A "pseudo-class" with methods for operating on BUILD_VECTORs.
Select(COND, TRUEVAL, FALSEVAL).
static SDValue performDSPShiftCombine(unsigned Opc, SDNode *N, EVT Ty, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
ZERO_EXTEND - Used for integer types, zeroing the new bits.
static cl::opt< bool > NoDPLoadStore("mno-ldc1-sdc1", cl::init(false), cl::desc("Expand double precision loads and " "stores to their single precision " "counterparts"))
static SDValue lowerVECTOR_SHUFFLE_ILVOD(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG)
static SDValue performSRLCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
int getMaskElt(unsigned Idx) const
static bool isBitwiseInverse(SDValue N, SDValue OfNode)
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
Representation of each machine instruction.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator end()
bool isVector() const
Return true if this is a vector value type.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Bitwise operators - logical and, logical or, logical xor.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
LLVM_NODISCARD bool empty() const
bool is128BitVector() const
Return true if this is a 128-bit vector type.
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode...
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
const TargetRegisterClass * getRepRegClassFor(MVT VT) const override
Return the 'representative' register class for the specified value type.
const TargetSubtargetInfo & getSubtarget() const
Flags getFlags() const
Return the raw flags of the source value,.
SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc, SDValue Imm, bool BigEndian)
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
static bool shouldTransformMulToShiftsAddsSubs(APInt C, EVT VT, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
unsigned getOpcode() const
FSINCOS - Compute both fsin and fcos as a single operation.
SDValue getValue(unsigned R) const
unsigned getInRegsParamsCount() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts)
Test whether V has a splatted value for all the demanded elements.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
void insert(iterator MBBI, MachineBasicBlock *MBB)
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
LLVM Value Representation.
uint64_t getConstantOperandVal(unsigned Num) const
Helper method returns the integer value of a ConstantSDNode operand.
FMA - Perform a * b + c with no intermediate rounding step.
unsigned getSizeInBits(unsigned Reg, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI) const
Get the size in bits of Reg.
SDValue getValueType(EVT)
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
bool isUndef() const
Return true if the type of the node type undefined.
static SDValue lowerVECTOR_SHUFFLE_SHF(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue lowerVECTOR_SHUFFLE_ILVL(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
bool useSoftFloat() const
MipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
static SDValue extractLOHI(SDValue Op, const SDLoc &DL, SelectionDAG &DAG)
static cl::opt< bool > UseMipsTailCalls("mips-tail-calls", cl::Hidden, cl::desc("MIPS: permit tail calls."), cl::init(false))
SetCC operator - This evaluates to a true value iff the condition is true.
const SDValue & getOperand(unsigned i) const
bool systemSupportsUnalignedAccess() const
Does the system support unaligned memory access.
void addMSAIntType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC)
Enable MSA support for the given integer type and Register class.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned char TargetFlags=0) const
uint64_t getZExtValue() const
TRUNCATE - Completely drop the high bits.
const MachineOperand & getOperand(unsigned i) const
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation...
Perform various unary floating-point operations inspired by libm.
LLVMContext * getContext() const
static SDValue lowerVECTOR_SHUFFLE_PCKOD(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
void addMSAFloatType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC)
Enable MSA support for the given floating-point type and Register class.
unsigned createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
EVT is not used in-tree, but is used by out-of-tree target.
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
This class is used to represent ISD::LOAD nodes.