36#include "llvm/IR/IntrinsicsMips.h"
51#define DEBUG_TYPE "mips-isel"
116 for (
const auto &VecTy : VecTys) {
158 for (
MVT VT : {MVT::f32, MVT::f64}) {
248 if (
Subtarget.getCLOpts().mno_ldc1_sdc1 ||
373 if (VT == MVT::Untyped)
374 return Subtarget.hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
418 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
450 if (Ty != MVT::v8f16) {
478 EVT ResTy =
Op.getValueType();
479 assert((ResTy == MVT::f32 || ResTy == MVT::f64) &&
"Unexpected FP16_TO_FP");
483 assert(In.getValueType() == MVT::i32 &&
"Unexpected FP16_TO_FP operand type");
494 DAG.
getConstant(Intrinsic::mips_fexupr_w,
DL, MVT::i32), HVec);
496 if (ResTy == MVT::f32) {
504 DAG.
getConstant(Intrinsic::mips_fexupr_d,
DL, MVT::i32), F32Vec);
518 EVT ResTy =
Op.getValueType();
519 SDValue
In =
Op.getOperand(0);
520 assert((
In.getValueType() == MVT::f32 ||
In.getValueType() == MVT::f64) &&
521 "Unexpected FP_TO_FP16");
524 if (
In.getValueType() == MVT::f64) {
538 DAG.
getConstant(Intrinsic::mips_fexdo_h,
DL, MVT::i32), F32Vec, F32Vec);
552 if (
Subtarget.systemSupportsUnalignedAccess()) {
577 switch(
Op.getOpcode()) {
580 case ISD::SMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
true, DAG);
581 case ISD::UMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Multu,
true,
true, DAG);
582 case ISD::MULHS:
return lowerMulDiv(
Op, MipsISD::Mult,
false,
true, DAG);
583 case ISD::MULHU:
return lowerMulDiv(
Op, MipsISD::Multu,
false,
true, DAG);
584 case ISD::MUL:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
false, DAG);
585 case ISD::SDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRem,
true,
true, DAG);
586 case ISD::UDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRemU,
true,
true,
594 return lowerVECTOR_SHUFFLE(
Op, DAG);
597 return lowerFP16_TO_FP(
Op, DAG);
600 return lowerFP_TO_FP16(
Op, DAG);
603 return lowerR5900FPOp(
Op, DAG, RTLIB::ADD_F32);
605 return lowerR5900FPOp(
Op, DAG, RTLIB::SUB_F32);
607 return lowerR5900FPOp(
Op, DAG, RTLIB::MUL_F32);
609 return lowerR5900FPOp(
Op, DAG, RTLIB::DIV_F32);
611 return lowerR5900FPOp(
Op, DAG, RTLIB::SQRT_F32);
618 RTLIB::Libcall LC)
const {
622 if (Flags.hasNoNaNs() && Flags.hasNoInfs()) {
630 MVT VT =
Op.getSimpleValueType();
658 if (Op0Opcode == MipsISD::VEXTRACT_SEXT_ELT ||
659 Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT) {
665 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
667 if (Log2IfPositive <= 0)
673 unsigned Log2 = Log2IfPositive;
675 if ((Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT &&
Log2 >= ExtendTySize) ||
676 Log2 == ExtendTySize) {
678 return DAG.
getNode(MipsISD::VEXTRACT_ZEXT_ELT,
SDLoc(Op0),
702 APInt SplatValue, SplatUndef;
703 unsigned SplatBitSize;
706 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
720 N =
N->getOperand(0);
727 APInt SplatValue, SplatUndef;
728 unsigned SplatBitSize;
733 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
745 return N->getOperand(1) == OfNode;
748 return N->getOperand(0) == OfNode;
765 EVT Ty =
N->getValueType(0);
767 if (!Ty.is128BitVector())
778 bool IsLittleEndian = !Subtarget.
isLittle();
781 bool IsConstantMask =
false;
788 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
792 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
793 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
795 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
796 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
799 IsConstantMask =
true;
809 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
810 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
812 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
813 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
816 IsConstantMask =
true;
865 if (IsConstantMask) {
866 if (Mask.isAllOnes())
913 while (!WorkStack.
empty()) {
916 if (Val == 0 || Val == 1)
930 if ((Val - Floor).ule(Ceil - Val)) {
978 if ((
C - Floor).ule(Ceil -
C)) {
995 EVT VT =
N->getValueType(0);
999 C->getAPIntValue(), VT, DAG, Subtarget))
1011 APInt SplatValue, SplatUndef;
1012 unsigned SplatBitSize;
1014 unsigned EltSize = Ty.getScalarSizeInBits();
1021 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
1023 (SplatBitSize != EltSize) ||
1035 EVT Ty =
N->getValueType(0);
1037 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1058 EVT Ty =
N->getValueType(0);
1060 if (Subtarget.
hasMSA()) {
1075 if (Op0Op0->
getOpcode() != MipsISD::VEXTRACT_SEXT_ELT &&
1076 Op0Op0->
getOpcode() != MipsISD::VEXTRACT_ZEXT_ELT)
1082 if (TotalBits == 32 ||
1083 (Op0Op0->
getOpcode() == MipsISD::VEXTRACT_SEXT_ELT &&
1087 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
SDLoc(Op0Op0),
1094 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
1104 EVT Ty =
N->getValueType(0);
1106 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
1113 bool IsV216 = (Ty == MVT::v2i16);
1126 default:
return false;
1131 EVT Ty =
N->getValueType(0);
1133 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1139 return DAG.
getNode(MipsISD::SETCC_DSP,
SDLoc(
N), Ty,
N->getOperand(0),
1140 N->getOperand(1),
N->getOperand(2));
1144 EVT Ty =
N->getValueType(0);
1146 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
1149 if (SetCC.
getOpcode() != MipsISD::SETCC_DSP)
1154 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
1162 EVT Ty =
N->getValueType(0);
1164 if (Subtarget.
hasMSA() && Ty.is128BitVector() && Ty.isInteger()) {
1190 EVT VT =
N->getValueType(0);
1209 switch (
N->getOpcode()) {
1240 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1251 switch (
MI.getOpcode()) {
1254 case Mips::BPOSGE32_PSEUDO:
1255 return emitBPOSGE32(
MI, BB);
1256 case Mips::SNZ_B_PSEUDO:
1257 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1258 case Mips::SNZ_H_PSEUDO:
1259 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1260 case Mips::SNZ_W_PSEUDO:
1261 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1262 case Mips::SNZ_D_PSEUDO:
1263 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1264 case Mips::SNZ_V_PSEUDO:
1265 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1266 case Mips::SZ_B_PSEUDO:
1267 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1268 case Mips::SZ_H_PSEUDO:
1269 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1270 case Mips::SZ_W_PSEUDO:
1271 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1272 case Mips::SZ_D_PSEUDO:
1273 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1274 case Mips::SZ_V_PSEUDO:
1275 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1276 case Mips::COPY_FW_PSEUDO:
1277 return emitCOPY_FW(
MI, BB);
1278 case Mips::COPY_FD_PSEUDO:
1279 return emitCOPY_FD(
MI, BB);
1280 case Mips::INSERT_FW_PSEUDO:
1281 return emitINSERT_FW(
MI, BB);
1282 case Mips::INSERT_FD_PSEUDO:
1283 return emitINSERT_FD(
MI, BB);
1284 case Mips::INSERT_B_VIDX_PSEUDO:
1285 case Mips::INSERT_B_VIDX64_PSEUDO:
1286 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1287 case Mips::INSERT_H_VIDX_PSEUDO:
1288 case Mips::INSERT_H_VIDX64_PSEUDO:
1289 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1290 case Mips::INSERT_W_VIDX_PSEUDO:
1291 case Mips::INSERT_W_VIDX64_PSEUDO:
1292 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1293 case Mips::INSERT_D_VIDX_PSEUDO:
1294 case Mips::INSERT_D_VIDX64_PSEUDO:
1295 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1296 case Mips::INSERT_FW_VIDX_PSEUDO:
1297 case Mips::INSERT_FW_VIDX64_PSEUDO:
1298 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1299 case Mips::INSERT_FD_VIDX_PSEUDO:
1300 case Mips::INSERT_FD_VIDX64_PSEUDO:
1301 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1302 case Mips::FILL_FW_PSEUDO:
1303 return emitFILL_FW(
MI, BB);
1304 case Mips::FILL_FD_PSEUDO:
1305 return emitFILL_FD(
MI, BB);
1306 case Mips::FEXP2_W_1_PSEUDO:
1307 return emitFEXP2_W_1(
MI, BB);
1308 case Mips::FEXP2_D_1_PSEUDO:
1309 return emitFEXP2_D_1(
MI, BB);
1313bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1314 const CCState &CCInfo,
unsigned NextStackOffset,
1328void MipsSETargetLowering::getOpndList(
1330 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
bool IsPICCall,
1331 bool GlobalOrExternal,
bool LocalLinkage,
bool IsCallReloc,
1333 Ops.push_back(Callee);
1335 LocalLinkage, IsCallReloc, CLI, Callee,
1350 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1353 SDValue
Lo = DAG.
getLoad(VT,
DL, Chain, Ptr, MachinePointerInfo(),
1358 SDValue
Hi = DAG.
getLoad(VT,
DL,
Lo.getValue(1), Ptr, MachinePointerInfo(),
1367 BP = DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1369 BP = DAG.
getNode(MipsISD::BuildPairF64_FPR,
DL, MVT::f64,
Hi,
Lo);
1386 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1388 unsigned ExtractOp =
Subtarget.hasMips2() ? MipsISD::ExtractElementF64
1389 : MipsISD::ExtractElementF64_FPR;
1404 return DAG.
getStore(Chain,
DL,
Hi, Ptr, MachinePointerInfo(),
1412 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1413 MVT Dest =
Op.getValueType().getSimpleVT();
1416 if (Src == MVT::i64 && Dest == MVT::f64) {
1420 return DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1424 if (Src == MVT::f64 && Dest == MVT::i64) {
1431 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1434 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1444 bool HasLo,
bool HasHi,
1449 EVT Ty =
Op.getOperand(0).getValueType();
1451 SDValue Mult = DAG.
getNode(NewOpc,
DL, MVT::Untyped,
1452 Op.getOperand(0),
Op.getOperand(1));
1460 if (!HasLo || !HasHi)
1461 return HasLo ?
Lo :
Hi;
1463 SDValue Vals[] = {
Lo,
Hi };
1469 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1470 return DAG.
getNode(MipsISD::MTLOHI,
DL, MVT::Untyped, InLo, InHi);
1493 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1499 Ops.push_back(
Op->getOperand(OpNo++));
1505 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1510 Ops.push_back(Opnd);
1513 for (++OpNo ; OpNo <
Op->getNumOperands(); ++OpNo)
1514 Ops.push_back(
Op->getOperand(OpNo));
1518 Ops.push_back(In64);
1523 for (
EVT Ty :
Op->values())
1524 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1545 EVT ResTy =
Op->getValueType(0);
1555 EVT ResVecTy =
Op->getValueType(0);
1556 EVT ViaVecTy = ResVecTy;
1566 if (ResVecTy == MVT::v2i64) {
1577 ViaVecTy = MVT::v4i32;
1583 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1584 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1589 if (ViaVecTy != ResVecTy) {
1599 bool IsSigned =
false) {
1602 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1603 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1609 EVT ViaVecTy = VecTy;
1610 SDValue SplatValueA = SplatValue;
1611 SDValue SplatValueB = SplatValue;
1614 if (VecTy == MVT::v2i64) {
1616 ViaVecTy = MVT::v4i32;
1629 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1630 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1631 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1632 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1637 if (VecTy != ViaVecTy)
1646 EVT VecTy =
Op->getValueType(0);
1652 if (VecTy == MVT::v2i64) {
1654 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1666 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1675 if (VecTy == MVT::v2i64)
1689 EVT ResTy =
Op->getValueType(0);
1692 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1701 EVT ResTy =
Op->getValueType(0);
1712 EVT ResTy =
Op->getValueType(0);
1714 <<
Op->getConstantOperandAPInt(2);
1723 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1724 switch (Intrinsic) {
1727 case Intrinsic::mips_shilo:
1729 case Intrinsic::mips_dpau_h_qbl:
1731 case Intrinsic::mips_dpau_h_qbr:
1733 case Intrinsic::mips_dpsu_h_qbl:
1735 case Intrinsic::mips_dpsu_h_qbr:
1737 case Intrinsic::mips_dpa_w_ph:
1739 case Intrinsic::mips_dps_w_ph:
1741 case Intrinsic::mips_dpax_w_ph:
1743 case Intrinsic::mips_dpsx_w_ph:
1745 case Intrinsic::mips_mulsa_w_ph:
1747 case Intrinsic::mips_mult:
1749 case Intrinsic::mips_multu:
1751 case Intrinsic::mips_madd:
1753 case Intrinsic::mips_maddu:
1755 case Intrinsic::mips_msub:
1757 case Intrinsic::mips_msubu:
1759 case Intrinsic::mips_addv_b:
1760 case Intrinsic::mips_addv_h:
1761 case Intrinsic::mips_addv_w:
1762 case Intrinsic::mips_addv_d:
1765 case Intrinsic::mips_addvi_b:
1766 case Intrinsic::mips_addvi_h:
1767 case Intrinsic::mips_addvi_w:
1768 case Intrinsic::mips_addvi_d:
1771 case Intrinsic::mips_and_v:
1774 case Intrinsic::mips_andi_b:
1777 case Intrinsic::mips_bclr_b:
1778 case Intrinsic::mips_bclr_h:
1779 case Intrinsic::mips_bclr_w:
1780 case Intrinsic::mips_bclr_d:
1782 case Intrinsic::mips_bclri_b:
1783 case Intrinsic::mips_bclri_h:
1784 case Intrinsic::mips_bclri_w:
1785 case Intrinsic::mips_bclri_d:
1787 case Intrinsic::mips_binsli_b:
1788 case Intrinsic::mips_binsli_h:
1789 case Intrinsic::mips_binsli_w:
1790 case Intrinsic::mips_binsli_d: {
1792 EVT VecTy =
Op->getValueType(0);
1797 Op->getConstantOperandVal(3) + 1);
1800 Op->getOperand(2),
Op->getOperand(1));
1802 case Intrinsic::mips_binsri_b:
1803 case Intrinsic::mips_binsri_h:
1804 case Intrinsic::mips_binsri_w:
1805 case Intrinsic::mips_binsri_d: {
1807 EVT VecTy =
Op->getValueType(0);
1812 Op->getConstantOperandVal(3) + 1);
1815 Op->getOperand(2),
Op->getOperand(1));
1817 case Intrinsic::mips_bmnz_v:
1819 Op->getOperand(2),
Op->getOperand(1));
1820 case Intrinsic::mips_bmnzi_b:
1824 case Intrinsic::mips_bmz_v:
1826 Op->getOperand(1),
Op->getOperand(2));
1827 case Intrinsic::mips_bmzi_b:
1831 case Intrinsic::mips_bneg_b:
1832 case Intrinsic::mips_bneg_h:
1833 case Intrinsic::mips_bneg_w:
1834 case Intrinsic::mips_bneg_d: {
1835 EVT VecTy =
Op->getValueType(0);
1842 case Intrinsic::mips_bnegi_b:
1843 case Intrinsic::mips_bnegi_h:
1844 case Intrinsic::mips_bnegi_w:
1845 case Intrinsic::mips_bnegi_d:
1848 case Intrinsic::mips_bnz_b:
1849 case Intrinsic::mips_bnz_h:
1850 case Intrinsic::mips_bnz_w:
1851 case Intrinsic::mips_bnz_d:
1852 return DAG.
getNode(MipsISD::VALL_NONZERO,
DL,
Op->getValueType(0),
1854 case Intrinsic::mips_bnz_v:
1855 return DAG.
getNode(MipsISD::VANY_NONZERO,
DL,
Op->getValueType(0),
1857 case Intrinsic::mips_bsel_v:
1860 Op->getOperand(1),
Op->getOperand(3),
1862 case Intrinsic::mips_bseli_b:
1867 case Intrinsic::mips_bset_b:
1868 case Intrinsic::mips_bset_h:
1869 case Intrinsic::mips_bset_w:
1870 case Intrinsic::mips_bset_d: {
1871 EVT VecTy =
Op->getValueType(0);
1878 case Intrinsic::mips_bseti_b:
1879 case Intrinsic::mips_bseti_h:
1880 case Intrinsic::mips_bseti_w:
1881 case Intrinsic::mips_bseti_d:
1884 case Intrinsic::mips_bz_b:
1885 case Intrinsic::mips_bz_h:
1886 case Intrinsic::mips_bz_w:
1887 case Intrinsic::mips_bz_d:
1888 return DAG.
getNode(MipsISD::VALL_ZERO,
DL,
Op->getValueType(0),
1890 case Intrinsic::mips_bz_v:
1891 return DAG.
getNode(MipsISD::VANY_ZERO,
DL,
Op->getValueType(0),
1893 case Intrinsic::mips_ceq_b:
1894 case Intrinsic::mips_ceq_h:
1895 case Intrinsic::mips_ceq_w:
1896 case Intrinsic::mips_ceq_d:
1899 case Intrinsic::mips_ceqi_b:
1900 case Intrinsic::mips_ceqi_h:
1901 case Intrinsic::mips_ceqi_w:
1902 case Intrinsic::mips_ceqi_d:
1905 case Intrinsic::mips_cle_s_b:
1906 case Intrinsic::mips_cle_s_h:
1907 case Intrinsic::mips_cle_s_w:
1908 case Intrinsic::mips_cle_s_d:
1911 case Intrinsic::mips_clei_s_b:
1912 case Intrinsic::mips_clei_s_h:
1913 case Intrinsic::mips_clei_s_w:
1914 case Intrinsic::mips_clei_s_d:
1917 case Intrinsic::mips_cle_u_b:
1918 case Intrinsic::mips_cle_u_h:
1919 case Intrinsic::mips_cle_u_w:
1920 case Intrinsic::mips_cle_u_d:
1923 case Intrinsic::mips_clei_u_b:
1924 case Intrinsic::mips_clei_u_h:
1925 case Intrinsic::mips_clei_u_w:
1926 case Intrinsic::mips_clei_u_d:
1929 case Intrinsic::mips_clt_s_b:
1930 case Intrinsic::mips_clt_s_h:
1931 case Intrinsic::mips_clt_s_w:
1932 case Intrinsic::mips_clt_s_d:
1935 case Intrinsic::mips_clti_s_b:
1936 case Intrinsic::mips_clti_s_h:
1937 case Intrinsic::mips_clti_s_w:
1938 case Intrinsic::mips_clti_s_d:
1941 case Intrinsic::mips_clt_u_b:
1942 case Intrinsic::mips_clt_u_h:
1943 case Intrinsic::mips_clt_u_w:
1944 case Intrinsic::mips_clt_u_d:
1947 case Intrinsic::mips_clti_u_b:
1948 case Intrinsic::mips_clti_u_h:
1949 case Intrinsic::mips_clti_u_w:
1950 case Intrinsic::mips_clti_u_d:
1953 case Intrinsic::mips_copy_s_b:
1954 case Intrinsic::mips_copy_s_h:
1955 case Intrinsic::mips_copy_s_w:
1957 case Intrinsic::mips_copy_s_d:
1965 Op->getValueType(0),
Op->getOperand(1),
1968 case Intrinsic::mips_copy_u_b:
1969 case Intrinsic::mips_copy_u_h:
1970 case Intrinsic::mips_copy_u_w:
1972 case Intrinsic::mips_copy_u_d:
1983 Op->getValueType(0),
Op->getOperand(1),
1986 case Intrinsic::mips_div_s_b:
1987 case Intrinsic::mips_div_s_h:
1988 case Intrinsic::mips_div_s_w:
1989 case Intrinsic::mips_div_s_d:
1992 case Intrinsic::mips_div_u_b:
1993 case Intrinsic::mips_div_u_h:
1994 case Intrinsic::mips_div_u_w:
1995 case Intrinsic::mips_div_u_d:
1998 case Intrinsic::mips_fadd_w:
1999 case Intrinsic::mips_fadd_d:
2001 Op->getOperand(2),
Op->getFlags());
2003 case Intrinsic::mips_fceq_w:
2004 case Intrinsic::mips_fceq_d:
2007 case Intrinsic::mips_fcle_w:
2008 case Intrinsic::mips_fcle_d:
2011 case Intrinsic::mips_fclt_w:
2012 case Intrinsic::mips_fclt_d:
2015 case Intrinsic::mips_fcne_w:
2016 case Intrinsic::mips_fcne_d:
2019 case Intrinsic::mips_fcor_w:
2020 case Intrinsic::mips_fcor_d:
2023 case Intrinsic::mips_fcueq_w:
2024 case Intrinsic::mips_fcueq_d:
2027 case Intrinsic::mips_fcule_w:
2028 case Intrinsic::mips_fcule_d:
2031 case Intrinsic::mips_fcult_w:
2032 case Intrinsic::mips_fcult_d:
2035 case Intrinsic::mips_fcun_w:
2036 case Intrinsic::mips_fcun_d:
2039 case Intrinsic::mips_fcune_w:
2040 case Intrinsic::mips_fcune_d:
2043 case Intrinsic::mips_fdiv_w:
2044 case Intrinsic::mips_fdiv_d:
2048 case Intrinsic::mips_ffint_u_w:
2049 case Intrinsic::mips_ffint_u_d:
2052 case Intrinsic::mips_ffint_s_w:
2053 case Intrinsic::mips_ffint_s_d:
2056 case Intrinsic::mips_fill_b:
2057 case Intrinsic::mips_fill_h:
2058 case Intrinsic::mips_fill_w:
2059 case Intrinsic::mips_fill_d: {
2060 EVT ResTy =
Op->getValueType(0);
2068 case Intrinsic::mips_fexp2_w:
2069 case Intrinsic::mips_fexp2_d: {
2071 EVT ResTy =
Op->getValueType(0);
2076 case Intrinsic::mips_flog2_w:
2077 case Intrinsic::mips_flog2_d:
2079 case Intrinsic::mips_fmadd_w:
2080 case Intrinsic::mips_fmadd_d:
2082 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2083 case Intrinsic::mips_fmul_w:
2084 case Intrinsic::mips_fmul_d:
2086 Op->getOperand(2),
Op->getFlags());
2087 case Intrinsic::mips_fmsub_w:
2088 case Intrinsic::mips_fmsub_d: {
2090 return DAG.
getNode(MipsISD::FMS, SDLoc(
Op),
Op->getValueType(0),
2091 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2093 case Intrinsic::mips_frint_w:
2094 case Intrinsic::mips_frint_d:
2096 case Intrinsic::mips_fsqrt_w:
2097 case Intrinsic::mips_fsqrt_d:
2099 case Intrinsic::mips_fsub_w:
2100 case Intrinsic::mips_fsub_d:
2102 Op->getOperand(2),
Op->getFlags());
2103 case Intrinsic::mips_ftrunc_u_w:
2104 case Intrinsic::mips_ftrunc_u_d:
2107 case Intrinsic::mips_ftrunc_s_w:
2108 case Intrinsic::mips_ftrunc_s_d:
2111 case Intrinsic::mips_ilvev_b:
2112 case Intrinsic::mips_ilvev_h:
2113 case Intrinsic::mips_ilvev_w:
2114 case Intrinsic::mips_ilvev_d:
2115 return DAG.
getNode(MipsISD::ILVEV,
DL,
Op->getValueType(0),
2116 Op->getOperand(1),
Op->getOperand(2));
2117 case Intrinsic::mips_ilvl_b:
2118 case Intrinsic::mips_ilvl_h:
2119 case Intrinsic::mips_ilvl_w:
2120 case Intrinsic::mips_ilvl_d:
2121 return DAG.
getNode(MipsISD::ILVL,
DL,
Op->getValueType(0),
2122 Op->getOperand(1),
Op->getOperand(2));
2123 case Intrinsic::mips_ilvod_b:
2124 case Intrinsic::mips_ilvod_h:
2125 case Intrinsic::mips_ilvod_w:
2126 case Intrinsic::mips_ilvod_d:
2127 return DAG.
getNode(MipsISD::ILVOD,
DL,
Op->getValueType(0),
2128 Op->getOperand(1),
Op->getOperand(2));
2129 case Intrinsic::mips_ilvr_b:
2130 case Intrinsic::mips_ilvr_h:
2131 case Intrinsic::mips_ilvr_w:
2132 case Intrinsic::mips_ilvr_d:
2133 return DAG.
getNode(MipsISD::ILVR,
DL,
Op->getValueType(0),
2134 Op->getOperand(1),
Op->getOperand(2));
2135 case Intrinsic::mips_insert_b:
2136 case Intrinsic::mips_insert_h:
2137 case Intrinsic::mips_insert_w:
2138 case Intrinsic::mips_insert_d:
2140 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
2141 case Intrinsic::mips_insve_b:
2142 case Intrinsic::mips_insve_h:
2143 case Intrinsic::mips_insve_w:
2144 case Intrinsic::mips_insve_d: {
2147 switch (Intrinsic) {
2148 case Intrinsic::mips_insve_b:
Max = 15;
break;
2149 case Intrinsic::mips_insve_h:
Max = 7;
break;
2150 case Intrinsic::mips_insve_w:
Max = 3;
break;
2151 case Intrinsic::mips_insve_d:
Max = 1;
break;
2157 return DAG.
getNode(MipsISD::INSVE,
DL,
Op->getValueType(0),
2158 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
2161 case Intrinsic::mips_ldi_b:
2162 case Intrinsic::mips_ldi_h:
2163 case Intrinsic::mips_ldi_w:
2164 case Intrinsic::mips_ldi_d:
2166 case Intrinsic::mips_lsa:
2167 case Intrinsic::mips_dlsa: {
2168 EVT ResTy =
Op->getValueType(0);
2171 Op->getOperand(2),
Op->getOperand(3)));
2173 case Intrinsic::mips_maddv_b:
2174 case Intrinsic::mips_maddv_h:
2175 case Intrinsic::mips_maddv_w:
2176 case Intrinsic::mips_maddv_d: {
2177 EVT ResTy =
Op->getValueType(0);
2180 Op->getOperand(2),
Op->getOperand(3)));
2182 case Intrinsic::mips_max_s_b:
2183 case Intrinsic::mips_max_s_h:
2184 case Intrinsic::mips_max_s_w:
2185 case Intrinsic::mips_max_s_d:
2187 Op->getOperand(1),
Op->getOperand(2));
2188 case Intrinsic::mips_max_u_b:
2189 case Intrinsic::mips_max_u_h:
2190 case Intrinsic::mips_max_u_w:
2191 case Intrinsic::mips_max_u_d:
2193 Op->getOperand(1),
Op->getOperand(2));
2194 case Intrinsic::mips_maxi_s_b:
2195 case Intrinsic::mips_maxi_s_h:
2196 case Intrinsic::mips_maxi_s_w:
2197 case Intrinsic::mips_maxi_s_d:
2200 case Intrinsic::mips_maxi_u_b:
2201 case Intrinsic::mips_maxi_u_h:
2202 case Intrinsic::mips_maxi_u_w:
2203 case Intrinsic::mips_maxi_u_d:
2206 case Intrinsic::mips_min_s_b:
2207 case Intrinsic::mips_min_s_h:
2208 case Intrinsic::mips_min_s_w:
2209 case Intrinsic::mips_min_s_d:
2211 Op->getOperand(1),
Op->getOperand(2));
2212 case Intrinsic::mips_min_u_b:
2213 case Intrinsic::mips_min_u_h:
2214 case Intrinsic::mips_min_u_w:
2215 case Intrinsic::mips_min_u_d:
2217 Op->getOperand(1),
Op->getOperand(2));
2218 case Intrinsic::mips_mini_s_b:
2219 case Intrinsic::mips_mini_s_h:
2220 case Intrinsic::mips_mini_s_w:
2221 case Intrinsic::mips_mini_s_d:
2224 case Intrinsic::mips_mini_u_b:
2225 case Intrinsic::mips_mini_u_h:
2226 case Intrinsic::mips_mini_u_w:
2227 case Intrinsic::mips_mini_u_d:
2230 case Intrinsic::mips_mod_s_b:
2231 case Intrinsic::mips_mod_s_h:
2232 case Intrinsic::mips_mod_s_w:
2233 case Intrinsic::mips_mod_s_d:
2236 case Intrinsic::mips_mod_u_b:
2237 case Intrinsic::mips_mod_u_h:
2238 case Intrinsic::mips_mod_u_w:
2239 case Intrinsic::mips_mod_u_d:
2242 case Intrinsic::mips_mulv_b:
2243 case Intrinsic::mips_mulv_h:
2244 case Intrinsic::mips_mulv_w:
2245 case Intrinsic::mips_mulv_d:
2248 case Intrinsic::mips_msubv_b:
2249 case Intrinsic::mips_msubv_h:
2250 case Intrinsic::mips_msubv_w:
2251 case Intrinsic::mips_msubv_d: {
2252 EVT ResTy =
Op->getValueType(0);
2255 Op->getOperand(2),
Op->getOperand(3)));
2257 case Intrinsic::mips_nlzc_b:
2258 case Intrinsic::mips_nlzc_h:
2259 case Intrinsic::mips_nlzc_w:
2260 case Intrinsic::mips_nlzc_d:
2262 case Intrinsic::mips_nor_v: {
2264 Op->getOperand(1),
Op->getOperand(2));
2267 case Intrinsic::mips_nori_b: {
2273 case Intrinsic::mips_or_v:
2276 case Intrinsic::mips_ori_b:
2279 case Intrinsic::mips_pckev_b:
2280 case Intrinsic::mips_pckev_h:
2281 case Intrinsic::mips_pckev_w:
2282 case Intrinsic::mips_pckev_d:
2283 return DAG.
getNode(MipsISD::PCKEV,
DL,
Op->getValueType(0),
2284 Op->getOperand(1),
Op->getOperand(2));
2285 case Intrinsic::mips_pckod_b:
2286 case Intrinsic::mips_pckod_h:
2287 case Intrinsic::mips_pckod_w:
2288 case Intrinsic::mips_pckod_d:
2289 return DAG.
getNode(MipsISD::PCKOD,
DL,
Op->getValueType(0),
2290 Op->getOperand(1),
Op->getOperand(2));
2291 case Intrinsic::mips_pcnt_b:
2292 case Intrinsic::mips_pcnt_h:
2293 case Intrinsic::mips_pcnt_w:
2294 case Intrinsic::mips_pcnt_d:
2296 case Intrinsic::mips_sat_s_b:
2297 case Intrinsic::mips_sat_s_h:
2298 case Intrinsic::mips_sat_s_w:
2299 case Intrinsic::mips_sat_s_d:
2300 case Intrinsic::mips_sat_u_b:
2301 case Intrinsic::mips_sat_u_h:
2302 case Intrinsic::mips_sat_u_w:
2303 case Intrinsic::mips_sat_u_d: {
2306 switch (Intrinsic) {
2307 case Intrinsic::mips_sat_s_b:
2308 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2309 case Intrinsic::mips_sat_s_h:
2310 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2311 case Intrinsic::mips_sat_s_w:
2312 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2313 case Intrinsic::mips_sat_s_d:
2314 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2322 case Intrinsic::mips_shf_b:
2323 case Intrinsic::mips_shf_h:
2324 case Intrinsic::mips_shf_w: {
2328 return DAG.
getNode(MipsISD::SHF,
DL,
Op->getValueType(0),
2329 Op->getOperand(2),
Op->getOperand(1));
2331 case Intrinsic::mips_sldi_b:
2332 case Intrinsic::mips_sldi_h:
2333 case Intrinsic::mips_sldi_w:
2334 case Intrinsic::mips_sldi_d: {
2337 switch (Intrinsic) {
2338 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2339 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2340 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2341 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2349 case Intrinsic::mips_sll_b:
2350 case Intrinsic::mips_sll_h:
2351 case Intrinsic::mips_sll_w:
2352 case Intrinsic::mips_sll_d:
2355 case Intrinsic::mips_slli_b:
2356 case Intrinsic::mips_slli_h:
2357 case Intrinsic::mips_slli_w:
2358 case Intrinsic::mips_slli_d:
2361 case Intrinsic::mips_splat_b:
2362 case Intrinsic::mips_splat_h:
2363 case Intrinsic::mips_splat_w:
2364 case Intrinsic::mips_splat_d:
2369 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2372 case Intrinsic::mips_splati_b:
2373 case Intrinsic::mips_splati_h:
2374 case Intrinsic::mips_splati_w:
2375 case Intrinsic::mips_splati_d:
2376 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2379 case Intrinsic::mips_sra_b:
2380 case Intrinsic::mips_sra_h:
2381 case Intrinsic::mips_sra_w:
2382 case Intrinsic::mips_sra_d:
2385 case Intrinsic::mips_srai_b:
2386 case Intrinsic::mips_srai_h:
2387 case Intrinsic::mips_srai_w:
2388 case Intrinsic::mips_srai_d:
2391 case Intrinsic::mips_srari_b:
2392 case Intrinsic::mips_srari_h:
2393 case Intrinsic::mips_srari_w:
2394 case Intrinsic::mips_srari_d: {
2397 switch (Intrinsic) {
2398 case Intrinsic::mips_srari_b:
Max = 7;
break;
2399 case Intrinsic::mips_srari_h:
Max = 15;
break;
2400 case Intrinsic::mips_srari_w:
Max = 31;
break;
2401 case Intrinsic::mips_srari_d:
Max = 63;
break;
2409 case Intrinsic::mips_srl_b:
2410 case Intrinsic::mips_srl_h:
2411 case Intrinsic::mips_srl_w:
2412 case Intrinsic::mips_srl_d:
2415 case Intrinsic::mips_srli_b:
2416 case Intrinsic::mips_srli_h:
2417 case Intrinsic::mips_srli_w:
2418 case Intrinsic::mips_srli_d:
2421 case Intrinsic::mips_srlri_b:
2422 case Intrinsic::mips_srlri_h:
2423 case Intrinsic::mips_srlri_w:
2424 case Intrinsic::mips_srlri_d: {
2427 switch (Intrinsic) {
2428 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2429 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2430 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2431 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2439 case Intrinsic::mips_subv_b:
2440 case Intrinsic::mips_subv_h:
2441 case Intrinsic::mips_subv_w:
2442 case Intrinsic::mips_subv_d:
2445 case Intrinsic::mips_subvi_b:
2446 case Intrinsic::mips_subvi_h:
2447 case Intrinsic::mips_subvi_w:
2448 case Intrinsic::mips_subvi_d:
2451 case Intrinsic::mips_vshf_b:
2452 case Intrinsic::mips_vshf_h:
2453 case Intrinsic::mips_vshf_w:
2454 case Intrinsic::mips_vshf_d:
2455 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2456 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2457 case Intrinsic::mips_xor_v:
2460 case Intrinsic::mips_xori_b:
2463 case Intrinsic::thread_pointer: {
2465 return DAG.
getNode(MipsISD::ThreadPointer,
DL, PtrVT);
2476 EVT ResTy =
Op->getValueType(0);
2477 EVT PtrTy = Address->getValueType(0);
2492 unsigned Intr =
Op->getConstantOperandVal(1);
2496 case Intrinsic::mips_extp:
2498 case Intrinsic::mips_extpdp:
2500 case Intrinsic::mips_extr_w:
2502 case Intrinsic::mips_extr_r_w:
2504 case Intrinsic::mips_extr_rs_w:
2506 case Intrinsic::mips_extr_s_h:
2508 case Intrinsic::mips_mthlip:
2510 case Intrinsic::mips_mulsaq_s_w_ph:
2512 case Intrinsic::mips_maq_s_w_phl:
2514 case Intrinsic::mips_maq_s_w_phr:
2516 case Intrinsic::mips_maq_sa_w_phl:
2518 case Intrinsic::mips_maq_sa_w_phr:
2520 case Intrinsic::mips_dpaq_s_w_ph:
2522 case Intrinsic::mips_dpsq_s_w_ph:
2524 case Intrinsic::mips_dpaq_sa_l_w:
2526 case Intrinsic::mips_dpsq_sa_l_w:
2528 case Intrinsic::mips_dpaqx_s_w_ph:
2530 case Intrinsic::mips_dpaqx_sa_w_ph:
2532 case Intrinsic::mips_dpsqx_s_w_ph:
2534 case Intrinsic::mips_dpsqx_sa_w_ph:
2536 case Intrinsic::mips_ld_b:
2537 case Intrinsic::mips_ld_h:
2538 case Intrinsic::mips_ld_w:
2539 case Intrinsic::mips_ld_d:
2551 EVT PtrTy = Address->getValueType(0);
2567 unsigned Intr =
Op->getConstantOperandVal(1);
2571 case Intrinsic::mips_st_b:
2572 case Intrinsic::mips_st_h:
2573 case Intrinsic::mips_st_w:
2574 case Intrinsic::mips_st_d:
2589 EVT ResTy =
Op->getValueType(0);
2590 SDValue Op0 =
Op->getOperand(0);
2597 SDValue Op1 =
Op->getOperand(1);
2599 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
DL, ResTy, Op0, Op1,
2617 for (
unsigned i = 0; i <
Op->getNumOperands(); ++i)
2639 EVT ResTy =
Op->getValueType(0);
2641 APInt SplatValue, SplatUndef;
2642 unsigned SplatBitSize;
2648 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2650 !
Subtarget.isLittle()) && SplatBitSize <= 64) {
2652 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2664 switch (SplatBitSize) {
2668 ViaVecTy = MVT::v16i8;
2671 ViaVecTy = MVT::v8i16;
2674 ViaVecTy = MVT::v4i32;
2685 if (ViaVecTy != ResTy)
2695 EVT ResTy =
Node->getValueType(0);
2701 for (
unsigned i = 0; i < NumElts; ++i) {
2703 Node->getOperand(i),
2733 int SHFIndices[4] = { -1, -1, -1, -1 };
2735 if (Indices.
size() < 4)
2738 for (
unsigned i = 0; i < 4; ++i) {
2739 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2740 int Idx = Indices[j];
2746 if (Idx < 0 || Idx >= 4)
2752 if (SHFIndices[i] == -1)
2753 SHFIndices[i] = Idx;
2757 if (!(Idx == -1 || Idx == SHFIndices[i]))
2764 for (
int i = 3; i >= 0; --i) {
2765 int Idx = SHFIndices[i];
2775 return DAG.
getNode(MipsISD::SHF,
DL, ResTy,
2782template <
typename ValType>
2785 unsigned CheckStride,
2787 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2791 if (*
I != -1 && *
I != ExpectedIndex)
2793 ExpectedIndex += ExpectedIndexStride;
2797 for (
unsigned n = 0; n < CheckStride &&
I !=
End; ++n, ++
I)
2816 int SplatIndex = -1;
2817 for (
const auto &V : Indices) {
2850 const auto &Begin = Indices.
begin();
2851 const auto &
End = Indices.
end();
2856 Wt =
Op->getOperand(0);
2858 Wt =
Op->getOperand(1);
2865 Ws =
Op->getOperand(0);
2867 Ws =
Op->getOperand(1);
2896 const auto &Begin = Indices.
begin();
2897 const auto &
End = Indices.
end();
2902 Wt =
Op->getOperand(0);
2904 Wt =
Op->getOperand(1);
2911 Ws =
Op->getOperand(0);
2913 Ws =
Op->getOperand(1);
2943 const auto &Begin = Indices.
begin();
2944 const auto &
End = Indices.
end();
2949 Wt =
Op->getOperand(0);
2951 Wt =
Op->getOperand(1);
2958 Ws =
Op->getOperand(0);
2960 Ws =
Op->getOperand(1);
2988 unsigned HalfSize = Indices.
size() / 2;
2991 const auto &Begin = Indices.
begin();
2992 const auto &
End = Indices.
end();
2997 Wt =
Op->getOperand(0);
2999 Wt =
Op->getOperand(1);
3006 Ws =
Op->getOperand(0);
3009 Ws =
Op->getOperand(1);
3038 const auto &Begin = Indices.
begin();
3039 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3040 const auto &
End = Indices.
end();
3043 Wt =
Op->getOperand(0);
3045 Wt =
Op->getOperand(1);
3050 Ws =
Op->getOperand(0);
3052 Ws =
Op->getOperand(1);
3081 const auto &Begin = Indices.
begin();
3082 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3083 const auto &
End = Indices.
end();
3086 Wt =
Op->getOperand(0);
3088 Wt =
Op->getOperand(1);
3093 Ws =
Op->getOperand(0);
3095 Ws =
Op->getOperand(1);
3117 const bool isSPLATI,
3124 bool Using1stVec =
false;
3125 bool Using2ndVec =
false;
3129 for (
int i = 0; i < ResTyNumElts; ++i) {
3131 int Idx = Indices[i];
3133 if (0 <= Idx && Idx < ResTyNumElts)
3135 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
3142 for (
int Idx : Indices)
3148 int LastValidIndex = SplatIndex;
3149 for (
size_t i = 0; i < Indices.
size(); i++) {
3150 int Idx = Indices[i];
3153 Idx = isSPLATI ? SplatIndex : LastValidIndex;
3155 LastValidIndex = Idx;
3162 if (Using1stVec && Using2ndVec) {
3163 Op0 =
Op->getOperand(0);
3164 Op1 =
Op->getOperand(1);
3165 }
else if (Using1stVec)
3166 Op0 = Op1 =
Op->getOperand(0);
3167 else if (Using2ndVec)
3168 Op0 = Op1 =
Op->getOperand(1);
3170 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
3179 return DAG.
getNode(MipsISD::VSHF,
DL, ResTy, MaskVec, Op1, Op0);
3187 EVT ResTy =
Op->getValueType(0);
3193 SmallVector<int, 16> Indices;
3195 for (
int i = 0; i < ResTyNumElts; ++i)
3244 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3245 MachineBasicBlock *Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3248 F->insert(It, Sink);
3259 TBB->addSuccessor(Sink);
3279 MI.getOperand(0).getReg())
3285 MI.eraseFromParent();
3312 MachineBasicBlock *FBB =
F->CreateMachineBasicBlock(LLVM_BB);
3313 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3314 MachineBasicBlock *Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3317 F->insert(It, Sink);
3328 TBB->addSuccessor(Sink);
3348 MI.getOperand(0).getReg())
3354 MI.eraseFromParent();
3376 unsigned Lane =
MI.getOperand(2).getImm();
3391 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3392 : &Mips::MSA128WEvensRegClass);
3398 MI.eraseFromParent();
3421 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3433 MI.eraseFromParent();
3451 unsigned Lane =
MI.getOperand(2).getImm();
3454 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3455 : &Mips::MSA128WEvensRegClass);
3466 MI.eraseFromParent();
3486 unsigned Lane =
MI.getOperand(2).getImm();
3499 MI.eraseFromParent();
3530 Register SrcVecReg =
MI.getOperand(1).getReg();
3531 Register LaneReg =
MI.getOperand(2).getReg();
3532 Register SrcValReg =
MI.getOperand(3).getReg();
3537 Subtarget.isABI_N64() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3538 unsigned SubRegIdx =
Subtarget.isABI_N64() ? Mips::sub_32 : 0;
3539 unsigned ShiftOp =
Subtarget.isABI_N64() ? Mips::DSLL : Mips::SLL;
3540 unsigned EltLog2Size;
3541 unsigned InsertOp = 0;
3542 unsigned InsveOp = 0;
3543 switch (EltSizeInBytes) {
3548 InsertOp = Mips::INSERT_B;
3549 InsveOp = Mips::INSVE_B;
3550 VecRC = &Mips::MSA128BRegClass;
3554 InsertOp = Mips::INSERT_H;
3555 InsveOp = Mips::INSVE_H;
3556 VecRC = &Mips::MSA128HRegClass;
3560 InsertOp = Mips::INSERT_W;
3561 InsveOp = Mips::INSVE_W;
3562 VecRC = &Mips::MSA128WRegClass;
3566 InsertOp = Mips::INSERT_D;
3567 InsveOp = Mips::INSVE_D;
3568 VecRC = &Mips::MSA128DRegClass;
3576 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3581 if (EltSizeInBytes != 1) {
3594 .
addReg(LaneReg, {}, SubRegIdx);
3623 .
addReg(LaneTmp2, {}, SubRegIdx);
3625 MI.eraseFromParent();
3645 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3646 : &Mips::MSA128WEvensRegClass);
3648 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3649 : &Mips::MSA128WEvensRegClass);
3658 MI.eraseFromParent();
3689 MI.eraseFromParent();
3716 .
addReg(
MI.getOperand(1).getReg());
3718 MI.eraseFromParent();
3745 .
addReg(
MI.getOperand(1).getReg());
3747 MI.eraseFromParent();
static SDValue performSHLCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, SelectionDAG &DAG)
If the operand is a bitwise AND with a constant RHS, and the shift has a constant RHS and is the only...
static SDValue performORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue performANDCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue performSETCCCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, SelectionDAG &DAG)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
const HexagonInstrInfo * TII
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
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.
static SDValue performVSELECTCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const LoongArchSubtarget &Subtarget)
static SDValue performSRLCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const LoongArchSubtarget &Subtarget)
static SDValue truncateVecElts(SDNode *Node, SelectionDAG &DAG)
Promote Memory to Register
static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc, SDValue Imm, bool BigEndian)
static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG)
static SDValue performMULCombine(SDNode *N, SelectionDAG &DAG, const TargetLowering::DAGCombinerInfo &DCI, const MipsSETargetLowering *TL, const MipsSubtarget &Subtarget)
static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc)
static SDValue performDSPShiftCombine(unsigned Opc, SDNode *N, EVT Ty, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc)
static SDValue lowerVECTOR_SHUFFLE_ILVR(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue getBuildVectorSplat(EVT VecTy, SDValue SplatValue, bool BigEndian, SelectionDAG &DAG)
static bool isVSplat(SDValue N, APInt &Imm, bool IsLittleEndian)
static SDValue initAccumulator(SDValue In, const SDLoc &DL, SelectionDAG &DAG)
static bool isBitwiseInverse(SDValue N, SDValue OfNode)
static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr, const MipsSubtarget &Subtarget)
static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
static bool isVectorAllOnes(SDValue N)
static SDValue lowerVECTOR_SHUFFLE_PCKOD(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue performFP_TO_UINTCombine(SDNode *N, SelectionDAG &DAG)
static bool isLegalDSPCondCode(EVT Ty, ISD::CondCode CC)
static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG)
static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG)
static SDValue lowerVECTOR_SHUFFLE_PCKEV(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue genConstMult(SDValue X, APInt C, const SDLoc &DL, EVT VT, EVT ShiftTy, SelectionDAG &DAG)
static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG, bool IsSigned=false)
static SDValue lowerVECTOR_SHUFFLE_ILVOD(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static bool isConstantOrUndef(const SDValue Op)
static SDValue lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy, const SmallVector< int, 16 > &Indices, const bool isSPLATI, SelectionDAG &DAG)
static SDValue lowerVECTOR_SHUFFLE_SHF(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue extractLOHI(SDValue Op, const SDLoc &DL, SelectionDAG &DAG)
static bool shouldTransformMulToShiftsAddsSubs(APInt C, EVT VT, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
static SDValue lowerVECTOR_SHUFFLE_ILVEV(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static bool isVECTOR_SHUFFLE_SPLATI(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static bool isConstantOrUndefBUILD_VECTOR(const BuildVectorSDNode *Op)
static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr, const MipsSubtarget &Subtarget)
static SDValue lowerVECTOR_SHUFFLE_ILVL(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool isNegative() const
Determine sign of this APInt.
unsigned logBase2() const
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI 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.
CCState - This class holds information needed while lowering arguments and return values.
unsigned getInRegsParamsCount() const
uint64_t getZExtValue() const
const SDValue & getBasePtr() const
const Triple & getTargetTriple() const
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static auto fixedlen_vector_valuetypes()
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
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 '...
MachineInstrBundleIterator< MachineInstr > iterator
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
BasicBlockListType::iterator iterator
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
Flags getFlags() const
Return the raw flags of the source value,.
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const SDValue & getChain() const
EVT getMemoryVT() const
Return the type of the in-memory value.
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
unsigned getIncomingArgSize() const
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...
TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
void addMSAFloatType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC)
Enable MSA support for the given floating-point type and Register class.
void addMSAIntType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC)
Enable MSA support for the given integer type and Register class.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
const TargetRegisterClass * getRepRegClassFor(MVT VT) const override
Return the 'representative' register class for the specified value type.
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const override
Determine if the target supports unaligned memory accesses.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
This callback is invoked for operations that are unsupported by the target, which are registered to u...
MipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
MipsTargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
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...
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
virtual void getOpndList(SmallVectorImpl< SDValue > &Ops, std::deque< std::pair< unsigned, SDValue > > &RegsToPass, bool IsPICCall, bool GlobalOrExternal, bool LocalLinkage, 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...
SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
LowerOperation - Provide custom lowering hooks for some operations.
const MipsSubtarget & Subtarget
SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
unsigned getNumOperands() const
Return the number of values used by this operation.
SDVTList getVTList() const
const SDValue & getOperand(unsigned Num) const
LLVM_ABI 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...
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
const SDValue & getOperand(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getOpcode() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
const TargetLowering & getTargetLoweringInfo() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename SuperClass::const_iterator const_iterator
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
const SDValue & getBasePtr() const
const SDValue & getValue() const
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...
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
void setOperationPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT)
Convenience method to set an operation to Promote and specify the type in a single call.
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
virtual TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const
Return the preferred vector type legalization action.
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose.
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Add the specified register class as an available regclass for the specified value type.
virtual 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...
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
virtual const TargetRegisterClass * getRepRegClassFor(MVT VT) const
Return the 'representative' register class for the specified value type.
void setCondCodeAction(ArrayRef< ISD::CondCode > CCs, MVT VT, LegalizeAction Action)
Indicate that the specified condition code is or isn't supported on the target and indicate what to d...
void setTargetDAGCombine(ArrayRef< ISD::NodeType > NTs)
Targets should invoke this method for each target independent node that they want to provide a custom...
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...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
LLVM_ABI bool isLittleEndian() const
Tests whether the target triple is little endian.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
@ POISON
POISON - A poison node.
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
@ ADD
Simple integer binary arithmetic operators.
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
@ FADD
Simple binary floating point operators.
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
@ STRICT_FSQRT
Constrained versions of libm-equivalent floating point intrinsics.
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ SIGN_EXTEND
Conversion operators.
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
@ UNDEF
UNDEF - An undefined node.
@ BasicBlock
Various leaf nodes.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
@ SHL
Shift and rotation operations.
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
@ AND
Bitwise operators - logical and, logical or, logical xor.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
@ STRICT_FADD
Constrained versions of the binary floating point operators.
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
@ BRCOND
BRCOND - Conditional branch.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
NodeAddr< NodeBase * > Node
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ Fast
Assign the register banks as fast as possible (default).
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
const MipsTargetLowering * createMipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
unsigned Log2(Align A)
Returns the log2 of the alignment.
@ End
Run the machine verifier once, at the end of the pipeline.
@ Custom
The result value requires a custom uniformity check.
MCRegisterClass TargetRegisterClass
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This struct is a compact representation of a valid (non-zero power of two) alignment.
EVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
uint64_t getScalarSizeInBits() const
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
bool is128BitVector() const
Return true if this is a 128-bit vector type.
bool isVector() const
Return true if this is a vector value type.
EVT getVectorElementType() const
Given a vector type, return the type of each element.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
bool isInteger() const
Return true if this is an integer or a vector integer type.
This class contains a discriminated union of information about pointers in memory operands,...
These are IR-level optimization flags that may be propagated to SDNodes.
This structure is used to pass arguments to makeLibCall function.