36#include "llvm/IR/IntrinsicsMips.h"
52#define DEBUG_TYPE "mips-isel"
55 cl::desc(
"Expand double precision loads and "
56 "stores to their single precision "
122 for (
const auto &VecTy : VecTys) {
164 for (
MVT VT : {MVT::f32, MVT::f64}) {
378 if (VT == MVT::Untyped)
379 return Subtarget.hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
423 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
455 if (Ty != MVT::v8f16) {
482 EVT ResTy =
Op->getValueType(0);
489 return DAG.
getNode(MipsISD::FSELECT,
DL, ResTy, Tmp,
Op->getOperand(1),
498 EVT ResTy =
Op.getValueType();
499 assert((ResTy == MVT::f32 || ResTy == MVT::f64) &&
"Unexpected FP16_TO_FP");
503 assert(In.getValueType() == MVT::i32 &&
"Unexpected FP16_TO_FP operand type");
514 DAG.
getConstant(Intrinsic::mips_fexupr_w,
DL, MVT::i32), HVec);
516 if (ResTy == MVT::f32) {
524 DAG.
getConstant(Intrinsic::mips_fexupr_d,
DL, MVT::i32), F32Vec);
538 EVT ResTy =
Op.getValueType();
539 SDValue
In =
Op.getOperand(0);
540 assert((
In.getValueType() == MVT::f32 ||
In.getValueType() == MVT::f64) &&
541 "Unexpected FP_TO_FP16");
544 if (
In.getValueType() == MVT::f64) {
558 DAG.
getConstant(Intrinsic::mips_fexdo_h,
DL, MVT::i32), F32Vec, F32Vec);
572 if (
Subtarget.systemSupportsUnalignedAccess()) {
597 switch(
Op.getOpcode()) {
600 case ISD::SMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
true, DAG);
601 case ISD::UMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Multu,
true,
true, DAG);
602 case ISD::MULHS:
return lowerMulDiv(
Op, MipsISD::Mult,
false,
true, DAG);
603 case ISD::MULHU:
return lowerMulDiv(
Op, MipsISD::Multu,
false,
true, DAG);
604 case ISD::MUL:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
false, DAG);
605 case ISD::SDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRem,
true,
true, DAG);
606 case ISD::UDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRemU,
true,
true,
615 return lowerSELECT(
Op, DAG);
618 return lowerFP16_TO_FP(
Op, DAG);
621 return lowerFP_TO_FP16(
Op, DAG);
624 return lowerR5900FPOp(
Op, DAG, RTLIB::ADD_F32);
626 return lowerR5900FPOp(
Op, DAG, RTLIB::SUB_F32);
628 return lowerR5900FPOp(
Op, DAG, RTLIB::MUL_F32);
630 return lowerR5900FPOp(
Op, DAG, RTLIB::DIV_F32);
632 return lowerR5900FPOp(
Op, DAG, RTLIB::SQRT_F32);
639 RTLIB::Libcall LC)
const {
643 if (Flags.hasNoNaNs() && Flags.hasNoInfs()) {
651 MVT VT =
Op.getSimpleValueType();
679 if (Op0Opcode == MipsISD::VEXTRACT_SEXT_ELT ||
680 Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT) {
686 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
688 if (Log2IfPositive <= 0)
694 unsigned Log2 = Log2IfPositive;
696 if ((Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT &&
Log2 >= ExtendTySize) ||
697 Log2 == ExtendTySize) {
699 return DAG.
getNode(MipsISD::VEXTRACT_ZEXT_ELT,
SDLoc(Op0),
723 APInt SplatValue, SplatUndef;
724 unsigned SplatBitSize;
727 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
741 N =
N->getOperand(0);
748 APInt SplatValue, SplatUndef;
749 unsigned SplatBitSize;
754 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
766 return N->getOperand(1) == OfNode;
769 return N->getOperand(0) == OfNode;
786 EVT Ty =
N->getValueType(0);
788 if (!Ty.is128BitVector())
799 bool IsLittleEndian = !Subtarget.
isLittle();
802 bool IsConstantMask =
false;
809 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
813 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
814 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
816 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
817 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
820 IsConstantMask =
true;
830 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
831 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
833 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
834 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
837 IsConstantMask =
true;
886 if (IsConstantMask) {
887 if (Mask.isAllOnes())
934 while (!WorkStack.
empty()) {
937 if (Val == 0 || Val == 1)
951 if ((Val - Floor).ule(Ceil - Val)) {
999 if ((
C - Floor).ule(Ceil -
C)) {
1016 EVT VT =
N->getValueType(0);
1020 C->getAPIntValue(), VT, DAG, Subtarget))
1032 APInt SplatValue, SplatUndef;
1033 unsigned SplatBitSize;
1035 unsigned EltSize = Ty.getScalarSizeInBits();
1042 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
1044 (SplatBitSize != EltSize) ||
1056 EVT Ty =
N->getValueType(0);
1058 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1079 EVT Ty =
N->getValueType(0);
1081 if (Subtarget.
hasMSA()) {
1096 if (Op0Op0->
getOpcode() != MipsISD::VEXTRACT_SEXT_ELT &&
1097 Op0Op0->
getOpcode() != MipsISD::VEXTRACT_ZEXT_ELT)
1103 if (TotalBits == 32 ||
1104 (Op0Op0->
getOpcode() == MipsISD::VEXTRACT_SEXT_ELT &&
1108 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
SDLoc(Op0Op0),
1115 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
1125 EVT Ty =
N->getValueType(0);
1127 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
1134 bool IsV216 = (Ty == MVT::v2i16);
1147 default:
return false;
1152 EVT Ty =
N->getValueType(0);
1154 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1160 return DAG.
getNode(MipsISD::SETCC_DSP,
SDLoc(
N), Ty,
N->getOperand(0),
1161 N->getOperand(1),
N->getOperand(2));
1165 EVT Ty =
N->getValueType(0);
1167 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
1170 if (SetCC.
getOpcode() != MipsISD::SETCC_DSP)
1175 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
1183 EVT Ty =
N->getValueType(0);
1185 if (Subtarget.
hasMSA() && Ty.is128BitVector() && Ty.isInteger()) {
1211 EVT VT =
N->getValueType(0);
1230 switch (
N->getOpcode()) {
1261 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1272 switch (
MI.getOpcode()) {
1275 case Mips::BPOSGE32_PSEUDO:
1276 return emitBPOSGE32(
MI, BB);
1277 case Mips::SNZ_B_PSEUDO:
1278 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1279 case Mips::SNZ_H_PSEUDO:
1280 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1281 case Mips::SNZ_W_PSEUDO:
1282 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1283 case Mips::SNZ_D_PSEUDO:
1284 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1285 case Mips::SNZ_V_PSEUDO:
1286 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1287 case Mips::SZ_B_PSEUDO:
1288 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1289 case Mips::SZ_H_PSEUDO:
1290 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1291 case Mips::SZ_W_PSEUDO:
1292 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1293 case Mips::SZ_D_PSEUDO:
1294 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1295 case Mips::SZ_V_PSEUDO:
1296 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1297 case Mips::COPY_FW_PSEUDO:
1298 return emitCOPY_FW(
MI, BB);
1299 case Mips::COPY_FD_PSEUDO:
1300 return emitCOPY_FD(
MI, BB);
1301 case Mips::INSERT_FW_PSEUDO:
1302 return emitINSERT_FW(
MI, BB);
1303 case Mips::INSERT_FD_PSEUDO:
1304 return emitINSERT_FD(
MI, BB);
1305 case Mips::INSERT_B_VIDX_PSEUDO:
1306 case Mips::INSERT_B_VIDX64_PSEUDO:
1307 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1308 case Mips::INSERT_H_VIDX_PSEUDO:
1309 case Mips::INSERT_H_VIDX64_PSEUDO:
1310 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1311 case Mips::INSERT_W_VIDX_PSEUDO:
1312 case Mips::INSERT_W_VIDX64_PSEUDO:
1313 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1314 case Mips::INSERT_D_VIDX_PSEUDO:
1315 case Mips::INSERT_D_VIDX64_PSEUDO:
1316 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1317 case Mips::INSERT_FW_VIDX_PSEUDO:
1318 case Mips::INSERT_FW_VIDX64_PSEUDO:
1319 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1320 case Mips::INSERT_FD_VIDX_PSEUDO:
1321 case Mips::INSERT_FD_VIDX64_PSEUDO:
1322 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1323 case Mips::FILL_FW_PSEUDO:
1324 return emitFILL_FW(
MI, BB);
1325 case Mips::FILL_FD_PSEUDO:
1326 return emitFILL_FD(
MI, BB);
1327 case Mips::FEXP2_W_1_PSEUDO:
1328 return emitFEXP2_W_1(
MI, BB);
1329 case Mips::FEXP2_D_1_PSEUDO:
1330 return emitFEXP2_D_1(
MI, BB);
1334bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1335 const CCState &CCInfo,
unsigned NextStackOffset,
1349void MipsSETargetLowering::getOpndList(
1351 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
bool IsPICCall,
1352 bool GlobalOrExternal,
bool LocalLinkage,
bool IsCallReloc,
1354 Ops.push_back(Callee);
1356 LocalLinkage, IsCallReloc, CLI, Callee,
1370 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1373 SDValue
Lo = DAG.
getLoad(VT,
DL, Chain, Ptr, MachinePointerInfo(),
1378 SDValue
Hi = DAG.
getLoad(VT,
DL,
Lo.getValue(1), Ptr, MachinePointerInfo(),
1387 BP = DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1389 BP = DAG.
getNode(MipsISD::BuildPairF64_FPR,
DL, MVT::f64,
Hi,
Lo);
1405 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1407 unsigned ExtractOp =
Subtarget.hasMips2() ? MipsISD::ExtractElementF64
1408 : MipsISD::ExtractElementF64_FPR;
1423 return DAG.
getStore(Chain,
DL,
Hi, Ptr, MachinePointerInfo(),
1431 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1432 MVT Dest =
Op.getValueType().getSimpleVT();
1435 if (Src == MVT::i64 && Dest == MVT::f64) {
1439 return DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1443 if (Src == MVT::f64 && Dest == MVT::i64) {
1450 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1453 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1463 bool HasLo,
bool HasHi,
1468 EVT Ty =
Op.getOperand(0).getValueType();
1470 SDValue Mult = DAG.
getNode(NewOpc,
DL, MVT::Untyped,
1471 Op.getOperand(0),
Op.getOperand(1));
1479 if (!HasLo || !HasHi)
1480 return HasLo ?
Lo :
Hi;
1482 SDValue Vals[] = {
Lo,
Hi };
1488 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1489 return DAG.
getNode(MipsISD::MTLOHI,
DL, MVT::Untyped, InLo, InHi);
1512 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1518 Ops.push_back(
Op->getOperand(OpNo++));
1524 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1529 Ops.push_back(Opnd);
1532 for (++OpNo ; OpNo <
Op->getNumOperands(); ++OpNo)
1533 Ops.push_back(
Op->getOperand(OpNo));
1537 Ops.push_back(In64);
1542 for (
EVT Ty :
Op->values())
1543 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1564 EVT ResTy =
Op->getValueType(0);
1574 EVT ResVecTy =
Op->getValueType(0);
1575 EVT ViaVecTy = ResVecTy;
1585 if (ResVecTy == MVT::v2i64) {
1596 ViaVecTy = MVT::v4i32;
1602 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1603 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1608 if (ViaVecTy != ResVecTy) {
1618 bool IsSigned =
false) {
1621 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1622 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1628 EVT ViaVecTy = VecTy;
1629 SDValue SplatValueA = SplatValue;
1630 SDValue SplatValueB = SplatValue;
1633 if (VecTy == MVT::v2i64) {
1635 ViaVecTy = MVT::v4i32;
1648 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1649 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1650 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1651 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1656 if (VecTy != ViaVecTy)
1665 EVT VecTy =
Op->getValueType(0);
1671 if (VecTy == MVT::v2i64) {
1673 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1685 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1694 if (VecTy == MVT::v2i64)
1708 EVT ResTy =
Op->getValueType(0);
1711 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1720 EVT ResTy =
Op->getValueType(0);
1731 EVT ResTy =
Op->getValueType(0);
1733 <<
Op->getConstantOperandAPInt(2);
1742 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1743 switch (Intrinsic) {
1746 case Intrinsic::mips_shilo:
1748 case Intrinsic::mips_dpau_h_qbl:
1750 case Intrinsic::mips_dpau_h_qbr:
1752 case Intrinsic::mips_dpsu_h_qbl:
1754 case Intrinsic::mips_dpsu_h_qbr:
1756 case Intrinsic::mips_dpa_w_ph:
1758 case Intrinsic::mips_dps_w_ph:
1760 case Intrinsic::mips_dpax_w_ph:
1762 case Intrinsic::mips_dpsx_w_ph:
1764 case Intrinsic::mips_mulsa_w_ph:
1766 case Intrinsic::mips_mult:
1768 case Intrinsic::mips_multu:
1770 case Intrinsic::mips_madd:
1772 case Intrinsic::mips_maddu:
1774 case Intrinsic::mips_msub:
1776 case Intrinsic::mips_msubu:
1778 case Intrinsic::mips_addv_b:
1779 case Intrinsic::mips_addv_h:
1780 case Intrinsic::mips_addv_w:
1781 case Intrinsic::mips_addv_d:
1784 case Intrinsic::mips_addvi_b:
1785 case Intrinsic::mips_addvi_h:
1786 case Intrinsic::mips_addvi_w:
1787 case Intrinsic::mips_addvi_d:
1790 case Intrinsic::mips_and_v:
1793 case Intrinsic::mips_andi_b:
1796 case Intrinsic::mips_bclr_b:
1797 case Intrinsic::mips_bclr_h:
1798 case Intrinsic::mips_bclr_w:
1799 case Intrinsic::mips_bclr_d:
1801 case Intrinsic::mips_bclri_b:
1802 case Intrinsic::mips_bclri_h:
1803 case Intrinsic::mips_bclri_w:
1804 case Intrinsic::mips_bclri_d:
1806 case Intrinsic::mips_binsli_b:
1807 case Intrinsic::mips_binsli_h:
1808 case Intrinsic::mips_binsli_w:
1809 case Intrinsic::mips_binsli_d: {
1811 EVT VecTy =
Op->getValueType(0);
1816 Op->getConstantOperandVal(3) + 1);
1819 Op->getOperand(2),
Op->getOperand(1));
1821 case Intrinsic::mips_binsri_b:
1822 case Intrinsic::mips_binsri_h:
1823 case Intrinsic::mips_binsri_w:
1824 case Intrinsic::mips_binsri_d: {
1826 EVT VecTy =
Op->getValueType(0);
1831 Op->getConstantOperandVal(3) + 1);
1834 Op->getOperand(2),
Op->getOperand(1));
1836 case Intrinsic::mips_bmnz_v:
1838 Op->getOperand(2),
Op->getOperand(1));
1839 case Intrinsic::mips_bmnzi_b:
1843 case Intrinsic::mips_bmz_v:
1845 Op->getOperand(1),
Op->getOperand(2));
1846 case Intrinsic::mips_bmzi_b:
1850 case Intrinsic::mips_bneg_b:
1851 case Intrinsic::mips_bneg_h:
1852 case Intrinsic::mips_bneg_w:
1853 case Intrinsic::mips_bneg_d: {
1854 EVT VecTy =
Op->getValueType(0);
1861 case Intrinsic::mips_bnegi_b:
1862 case Intrinsic::mips_bnegi_h:
1863 case Intrinsic::mips_bnegi_w:
1864 case Intrinsic::mips_bnegi_d:
1867 case Intrinsic::mips_bnz_b:
1868 case Intrinsic::mips_bnz_h:
1869 case Intrinsic::mips_bnz_w:
1870 case Intrinsic::mips_bnz_d:
1871 return DAG.
getNode(MipsISD::VALL_NONZERO,
DL,
Op->getValueType(0),
1873 case Intrinsic::mips_bnz_v:
1874 return DAG.
getNode(MipsISD::VANY_NONZERO,
DL,
Op->getValueType(0),
1876 case Intrinsic::mips_bsel_v:
1879 Op->getOperand(1),
Op->getOperand(3),
1881 case Intrinsic::mips_bseli_b:
1886 case Intrinsic::mips_bset_b:
1887 case Intrinsic::mips_bset_h:
1888 case Intrinsic::mips_bset_w:
1889 case Intrinsic::mips_bset_d: {
1890 EVT VecTy =
Op->getValueType(0);
1897 case Intrinsic::mips_bseti_b:
1898 case Intrinsic::mips_bseti_h:
1899 case Intrinsic::mips_bseti_w:
1900 case Intrinsic::mips_bseti_d:
1903 case Intrinsic::mips_bz_b:
1904 case Intrinsic::mips_bz_h:
1905 case Intrinsic::mips_bz_w:
1906 case Intrinsic::mips_bz_d:
1907 return DAG.
getNode(MipsISD::VALL_ZERO,
DL,
Op->getValueType(0),
1909 case Intrinsic::mips_bz_v:
1910 return DAG.
getNode(MipsISD::VANY_ZERO,
DL,
Op->getValueType(0),
1912 case Intrinsic::mips_ceq_b:
1913 case Intrinsic::mips_ceq_h:
1914 case Intrinsic::mips_ceq_w:
1915 case Intrinsic::mips_ceq_d:
1918 case Intrinsic::mips_ceqi_b:
1919 case Intrinsic::mips_ceqi_h:
1920 case Intrinsic::mips_ceqi_w:
1921 case Intrinsic::mips_ceqi_d:
1924 case Intrinsic::mips_cle_s_b:
1925 case Intrinsic::mips_cle_s_h:
1926 case Intrinsic::mips_cle_s_w:
1927 case Intrinsic::mips_cle_s_d:
1930 case Intrinsic::mips_clei_s_b:
1931 case Intrinsic::mips_clei_s_h:
1932 case Intrinsic::mips_clei_s_w:
1933 case Intrinsic::mips_clei_s_d:
1936 case Intrinsic::mips_cle_u_b:
1937 case Intrinsic::mips_cle_u_h:
1938 case Intrinsic::mips_cle_u_w:
1939 case Intrinsic::mips_cle_u_d:
1942 case Intrinsic::mips_clei_u_b:
1943 case Intrinsic::mips_clei_u_h:
1944 case Intrinsic::mips_clei_u_w:
1945 case Intrinsic::mips_clei_u_d:
1948 case Intrinsic::mips_clt_s_b:
1949 case Intrinsic::mips_clt_s_h:
1950 case Intrinsic::mips_clt_s_w:
1951 case Intrinsic::mips_clt_s_d:
1954 case Intrinsic::mips_clti_s_b:
1955 case Intrinsic::mips_clti_s_h:
1956 case Intrinsic::mips_clti_s_w:
1957 case Intrinsic::mips_clti_s_d:
1960 case Intrinsic::mips_clt_u_b:
1961 case Intrinsic::mips_clt_u_h:
1962 case Intrinsic::mips_clt_u_w:
1963 case Intrinsic::mips_clt_u_d:
1966 case Intrinsic::mips_clti_u_b:
1967 case Intrinsic::mips_clti_u_h:
1968 case Intrinsic::mips_clti_u_w:
1969 case Intrinsic::mips_clti_u_d:
1972 case Intrinsic::mips_copy_s_b:
1973 case Intrinsic::mips_copy_s_h:
1974 case Intrinsic::mips_copy_s_w:
1976 case Intrinsic::mips_copy_s_d:
1984 Op->getValueType(0),
Op->getOperand(1),
1987 case Intrinsic::mips_copy_u_b:
1988 case Intrinsic::mips_copy_u_h:
1989 case Intrinsic::mips_copy_u_w:
1991 case Intrinsic::mips_copy_u_d:
2002 Op->getValueType(0),
Op->getOperand(1),
2005 case Intrinsic::mips_div_s_b:
2006 case Intrinsic::mips_div_s_h:
2007 case Intrinsic::mips_div_s_w:
2008 case Intrinsic::mips_div_s_d:
2011 case Intrinsic::mips_div_u_b:
2012 case Intrinsic::mips_div_u_h:
2013 case Intrinsic::mips_div_u_w:
2014 case Intrinsic::mips_div_u_d:
2017 case Intrinsic::mips_fadd_w:
2018 case Intrinsic::mips_fadd_d:
2020 Op->getOperand(2),
Op->getFlags());
2022 case Intrinsic::mips_fceq_w:
2023 case Intrinsic::mips_fceq_d:
2026 case Intrinsic::mips_fcle_w:
2027 case Intrinsic::mips_fcle_d:
2030 case Intrinsic::mips_fclt_w:
2031 case Intrinsic::mips_fclt_d:
2034 case Intrinsic::mips_fcne_w:
2035 case Intrinsic::mips_fcne_d:
2038 case Intrinsic::mips_fcor_w:
2039 case Intrinsic::mips_fcor_d:
2042 case Intrinsic::mips_fcueq_w:
2043 case Intrinsic::mips_fcueq_d:
2046 case Intrinsic::mips_fcule_w:
2047 case Intrinsic::mips_fcule_d:
2050 case Intrinsic::mips_fcult_w:
2051 case Intrinsic::mips_fcult_d:
2054 case Intrinsic::mips_fcun_w:
2055 case Intrinsic::mips_fcun_d:
2058 case Intrinsic::mips_fcune_w:
2059 case Intrinsic::mips_fcune_d:
2062 case Intrinsic::mips_fdiv_w:
2063 case Intrinsic::mips_fdiv_d:
2067 case Intrinsic::mips_ffint_u_w:
2068 case Intrinsic::mips_ffint_u_d:
2071 case Intrinsic::mips_ffint_s_w:
2072 case Intrinsic::mips_ffint_s_d:
2075 case Intrinsic::mips_fill_b:
2076 case Intrinsic::mips_fill_h:
2077 case Intrinsic::mips_fill_w:
2078 case Intrinsic::mips_fill_d: {
2079 EVT ResTy =
Op->getValueType(0);
2087 case Intrinsic::mips_fexp2_w:
2088 case Intrinsic::mips_fexp2_d: {
2090 EVT ResTy =
Op->getValueType(0);
2095 case Intrinsic::mips_flog2_w:
2096 case Intrinsic::mips_flog2_d:
2098 case Intrinsic::mips_fmadd_w:
2099 case Intrinsic::mips_fmadd_d:
2101 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2102 case Intrinsic::mips_fmul_w:
2103 case Intrinsic::mips_fmul_d:
2105 Op->getOperand(2),
Op->getFlags());
2106 case Intrinsic::mips_fmsub_w:
2107 case Intrinsic::mips_fmsub_d: {
2109 return DAG.
getNode(MipsISD::FMS, SDLoc(
Op),
Op->getValueType(0),
2110 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2112 case Intrinsic::mips_frint_w:
2113 case Intrinsic::mips_frint_d:
2115 case Intrinsic::mips_fsqrt_w:
2116 case Intrinsic::mips_fsqrt_d:
2118 case Intrinsic::mips_fsub_w:
2119 case Intrinsic::mips_fsub_d:
2121 Op->getOperand(2),
Op->getFlags());
2122 case Intrinsic::mips_ftrunc_u_w:
2123 case Intrinsic::mips_ftrunc_u_d:
2126 case Intrinsic::mips_ftrunc_s_w:
2127 case Intrinsic::mips_ftrunc_s_d:
2130 case Intrinsic::mips_ilvev_b:
2131 case Intrinsic::mips_ilvev_h:
2132 case Intrinsic::mips_ilvev_w:
2133 case Intrinsic::mips_ilvev_d:
2134 return DAG.
getNode(MipsISD::ILVEV,
DL,
Op->getValueType(0),
2135 Op->getOperand(1),
Op->getOperand(2));
2136 case Intrinsic::mips_ilvl_b:
2137 case Intrinsic::mips_ilvl_h:
2138 case Intrinsic::mips_ilvl_w:
2139 case Intrinsic::mips_ilvl_d:
2140 return DAG.
getNode(MipsISD::ILVL,
DL,
Op->getValueType(0),
2141 Op->getOperand(1),
Op->getOperand(2));
2142 case Intrinsic::mips_ilvod_b:
2143 case Intrinsic::mips_ilvod_h:
2144 case Intrinsic::mips_ilvod_w:
2145 case Intrinsic::mips_ilvod_d:
2146 return DAG.
getNode(MipsISD::ILVOD,
DL,
Op->getValueType(0),
2147 Op->getOperand(1),
Op->getOperand(2));
2148 case Intrinsic::mips_ilvr_b:
2149 case Intrinsic::mips_ilvr_h:
2150 case Intrinsic::mips_ilvr_w:
2151 case Intrinsic::mips_ilvr_d:
2152 return DAG.
getNode(MipsISD::ILVR,
DL,
Op->getValueType(0),
2153 Op->getOperand(1),
Op->getOperand(2));
2154 case Intrinsic::mips_insert_b:
2155 case Intrinsic::mips_insert_h:
2156 case Intrinsic::mips_insert_w:
2157 case Intrinsic::mips_insert_d:
2159 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
2160 case Intrinsic::mips_insve_b:
2161 case Intrinsic::mips_insve_h:
2162 case Intrinsic::mips_insve_w:
2163 case Intrinsic::mips_insve_d: {
2166 switch (Intrinsic) {
2167 case Intrinsic::mips_insve_b:
Max = 15;
break;
2168 case Intrinsic::mips_insve_h:
Max = 7;
break;
2169 case Intrinsic::mips_insve_w:
Max = 3;
break;
2170 case Intrinsic::mips_insve_d:
Max = 1;
break;
2176 return DAG.
getNode(MipsISD::INSVE,
DL,
Op->getValueType(0),
2177 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
2180 case Intrinsic::mips_ldi_b:
2181 case Intrinsic::mips_ldi_h:
2182 case Intrinsic::mips_ldi_w:
2183 case Intrinsic::mips_ldi_d:
2185 case Intrinsic::mips_lsa:
2186 case Intrinsic::mips_dlsa: {
2187 EVT ResTy =
Op->getValueType(0);
2190 Op->getOperand(2),
Op->getOperand(3)));
2192 case Intrinsic::mips_maddv_b:
2193 case Intrinsic::mips_maddv_h:
2194 case Intrinsic::mips_maddv_w:
2195 case Intrinsic::mips_maddv_d: {
2196 EVT ResTy =
Op->getValueType(0);
2199 Op->getOperand(2),
Op->getOperand(3)));
2201 case Intrinsic::mips_max_s_b:
2202 case Intrinsic::mips_max_s_h:
2203 case Intrinsic::mips_max_s_w:
2204 case Intrinsic::mips_max_s_d:
2206 Op->getOperand(1),
Op->getOperand(2));
2207 case Intrinsic::mips_max_u_b:
2208 case Intrinsic::mips_max_u_h:
2209 case Intrinsic::mips_max_u_w:
2210 case Intrinsic::mips_max_u_d:
2212 Op->getOperand(1),
Op->getOperand(2));
2213 case Intrinsic::mips_maxi_s_b:
2214 case Intrinsic::mips_maxi_s_h:
2215 case Intrinsic::mips_maxi_s_w:
2216 case Intrinsic::mips_maxi_s_d:
2219 case Intrinsic::mips_maxi_u_b:
2220 case Intrinsic::mips_maxi_u_h:
2221 case Intrinsic::mips_maxi_u_w:
2222 case Intrinsic::mips_maxi_u_d:
2225 case Intrinsic::mips_min_s_b:
2226 case Intrinsic::mips_min_s_h:
2227 case Intrinsic::mips_min_s_w:
2228 case Intrinsic::mips_min_s_d:
2230 Op->getOperand(1),
Op->getOperand(2));
2231 case Intrinsic::mips_min_u_b:
2232 case Intrinsic::mips_min_u_h:
2233 case Intrinsic::mips_min_u_w:
2234 case Intrinsic::mips_min_u_d:
2236 Op->getOperand(1),
Op->getOperand(2));
2237 case Intrinsic::mips_mini_s_b:
2238 case Intrinsic::mips_mini_s_h:
2239 case Intrinsic::mips_mini_s_w:
2240 case Intrinsic::mips_mini_s_d:
2243 case Intrinsic::mips_mini_u_b:
2244 case Intrinsic::mips_mini_u_h:
2245 case Intrinsic::mips_mini_u_w:
2246 case Intrinsic::mips_mini_u_d:
2249 case Intrinsic::mips_mod_s_b:
2250 case Intrinsic::mips_mod_s_h:
2251 case Intrinsic::mips_mod_s_w:
2252 case Intrinsic::mips_mod_s_d:
2255 case Intrinsic::mips_mod_u_b:
2256 case Intrinsic::mips_mod_u_h:
2257 case Intrinsic::mips_mod_u_w:
2258 case Intrinsic::mips_mod_u_d:
2261 case Intrinsic::mips_mulv_b:
2262 case Intrinsic::mips_mulv_h:
2263 case Intrinsic::mips_mulv_w:
2264 case Intrinsic::mips_mulv_d:
2267 case Intrinsic::mips_msubv_b:
2268 case Intrinsic::mips_msubv_h:
2269 case Intrinsic::mips_msubv_w:
2270 case Intrinsic::mips_msubv_d: {
2271 EVT ResTy =
Op->getValueType(0);
2274 Op->getOperand(2),
Op->getOperand(3)));
2276 case Intrinsic::mips_nlzc_b:
2277 case Intrinsic::mips_nlzc_h:
2278 case Intrinsic::mips_nlzc_w:
2279 case Intrinsic::mips_nlzc_d:
2281 case Intrinsic::mips_nor_v: {
2283 Op->getOperand(1),
Op->getOperand(2));
2286 case Intrinsic::mips_nori_b: {
2292 case Intrinsic::mips_or_v:
2295 case Intrinsic::mips_ori_b:
2298 case Intrinsic::mips_pckev_b:
2299 case Intrinsic::mips_pckev_h:
2300 case Intrinsic::mips_pckev_w:
2301 case Intrinsic::mips_pckev_d:
2302 return DAG.
getNode(MipsISD::PCKEV,
DL,
Op->getValueType(0),
2303 Op->getOperand(1),
Op->getOperand(2));
2304 case Intrinsic::mips_pckod_b:
2305 case Intrinsic::mips_pckod_h:
2306 case Intrinsic::mips_pckod_w:
2307 case Intrinsic::mips_pckod_d:
2308 return DAG.
getNode(MipsISD::PCKOD,
DL,
Op->getValueType(0),
2309 Op->getOperand(1),
Op->getOperand(2));
2310 case Intrinsic::mips_pcnt_b:
2311 case Intrinsic::mips_pcnt_h:
2312 case Intrinsic::mips_pcnt_w:
2313 case Intrinsic::mips_pcnt_d:
2315 case Intrinsic::mips_sat_s_b:
2316 case Intrinsic::mips_sat_s_h:
2317 case Intrinsic::mips_sat_s_w:
2318 case Intrinsic::mips_sat_s_d:
2319 case Intrinsic::mips_sat_u_b:
2320 case Intrinsic::mips_sat_u_h:
2321 case Intrinsic::mips_sat_u_w:
2322 case Intrinsic::mips_sat_u_d: {
2325 switch (Intrinsic) {
2326 case Intrinsic::mips_sat_s_b:
2327 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2328 case Intrinsic::mips_sat_s_h:
2329 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2330 case Intrinsic::mips_sat_s_w:
2331 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2332 case Intrinsic::mips_sat_s_d:
2333 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2341 case Intrinsic::mips_shf_b:
2342 case Intrinsic::mips_shf_h:
2343 case Intrinsic::mips_shf_w: {
2347 return DAG.
getNode(MipsISD::SHF,
DL,
Op->getValueType(0),
2348 Op->getOperand(2),
Op->getOperand(1));
2350 case Intrinsic::mips_sldi_b:
2351 case Intrinsic::mips_sldi_h:
2352 case Intrinsic::mips_sldi_w:
2353 case Intrinsic::mips_sldi_d: {
2356 switch (Intrinsic) {
2357 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2358 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2359 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2360 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2368 case Intrinsic::mips_sll_b:
2369 case Intrinsic::mips_sll_h:
2370 case Intrinsic::mips_sll_w:
2371 case Intrinsic::mips_sll_d:
2374 case Intrinsic::mips_slli_b:
2375 case Intrinsic::mips_slli_h:
2376 case Intrinsic::mips_slli_w:
2377 case Intrinsic::mips_slli_d:
2380 case Intrinsic::mips_splat_b:
2381 case Intrinsic::mips_splat_h:
2382 case Intrinsic::mips_splat_w:
2383 case Intrinsic::mips_splat_d:
2388 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2391 case Intrinsic::mips_splati_b:
2392 case Intrinsic::mips_splati_h:
2393 case Intrinsic::mips_splati_w:
2394 case Intrinsic::mips_splati_d:
2395 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2398 case Intrinsic::mips_sra_b:
2399 case Intrinsic::mips_sra_h:
2400 case Intrinsic::mips_sra_w:
2401 case Intrinsic::mips_sra_d:
2404 case Intrinsic::mips_srai_b:
2405 case Intrinsic::mips_srai_h:
2406 case Intrinsic::mips_srai_w:
2407 case Intrinsic::mips_srai_d:
2410 case Intrinsic::mips_srari_b:
2411 case Intrinsic::mips_srari_h:
2412 case Intrinsic::mips_srari_w:
2413 case Intrinsic::mips_srari_d: {
2416 switch (Intrinsic) {
2417 case Intrinsic::mips_srari_b:
Max = 7;
break;
2418 case Intrinsic::mips_srari_h:
Max = 15;
break;
2419 case Intrinsic::mips_srari_w:
Max = 31;
break;
2420 case Intrinsic::mips_srari_d:
Max = 63;
break;
2428 case Intrinsic::mips_srl_b:
2429 case Intrinsic::mips_srl_h:
2430 case Intrinsic::mips_srl_w:
2431 case Intrinsic::mips_srl_d:
2434 case Intrinsic::mips_srli_b:
2435 case Intrinsic::mips_srli_h:
2436 case Intrinsic::mips_srli_w:
2437 case Intrinsic::mips_srli_d:
2440 case Intrinsic::mips_srlri_b:
2441 case Intrinsic::mips_srlri_h:
2442 case Intrinsic::mips_srlri_w:
2443 case Intrinsic::mips_srlri_d: {
2446 switch (Intrinsic) {
2447 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2448 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2449 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2450 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2458 case Intrinsic::mips_subv_b:
2459 case Intrinsic::mips_subv_h:
2460 case Intrinsic::mips_subv_w:
2461 case Intrinsic::mips_subv_d:
2464 case Intrinsic::mips_subvi_b:
2465 case Intrinsic::mips_subvi_h:
2466 case Intrinsic::mips_subvi_w:
2467 case Intrinsic::mips_subvi_d:
2470 case Intrinsic::mips_vshf_b:
2471 case Intrinsic::mips_vshf_h:
2472 case Intrinsic::mips_vshf_w:
2473 case Intrinsic::mips_vshf_d:
2474 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2475 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2476 case Intrinsic::mips_xor_v:
2479 case Intrinsic::mips_xori_b:
2482 case Intrinsic::thread_pointer: {
2484 return DAG.
getNode(MipsISD::ThreadPointer,
DL, PtrVT);
2495 EVT ResTy =
Op->getValueType(0);
2496 EVT PtrTy = Address->getValueType(0);
2511 unsigned Intr =
Op->getConstantOperandVal(1);
2515 case Intrinsic::mips_extp:
2517 case Intrinsic::mips_extpdp:
2519 case Intrinsic::mips_extr_w:
2521 case Intrinsic::mips_extr_r_w:
2523 case Intrinsic::mips_extr_rs_w:
2525 case Intrinsic::mips_extr_s_h:
2527 case Intrinsic::mips_mthlip:
2529 case Intrinsic::mips_mulsaq_s_w_ph:
2531 case Intrinsic::mips_maq_s_w_phl:
2533 case Intrinsic::mips_maq_s_w_phr:
2535 case Intrinsic::mips_maq_sa_w_phl:
2537 case Intrinsic::mips_maq_sa_w_phr:
2539 case Intrinsic::mips_dpaq_s_w_ph:
2541 case Intrinsic::mips_dpsq_s_w_ph:
2543 case Intrinsic::mips_dpaq_sa_l_w:
2545 case Intrinsic::mips_dpsq_sa_l_w:
2547 case Intrinsic::mips_dpaqx_s_w_ph:
2549 case Intrinsic::mips_dpaqx_sa_w_ph:
2551 case Intrinsic::mips_dpsqx_s_w_ph:
2553 case Intrinsic::mips_dpsqx_sa_w_ph:
2555 case Intrinsic::mips_ld_b:
2556 case Intrinsic::mips_ld_h:
2557 case Intrinsic::mips_ld_w:
2558 case Intrinsic::mips_ld_d:
2570 EVT PtrTy = Address->getValueType(0);
2586 unsigned Intr =
Op->getConstantOperandVal(1);
2590 case Intrinsic::mips_st_b:
2591 case Intrinsic::mips_st_h:
2592 case Intrinsic::mips_st_w:
2593 case Intrinsic::mips_st_d:
2608 EVT ResTy =
Op->getValueType(0);
2609 SDValue Op0 =
Op->getOperand(0);
2616 SDValue Op1 =
Op->getOperand(1);
2618 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
DL, ResTy, Op0, Op1,
2636 for (
unsigned i = 0; i <
Op->getNumOperands(); ++i)
2658 EVT ResTy =
Op->getValueType(0);
2660 APInt SplatValue, SplatUndef;
2661 unsigned SplatBitSize;
2667 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2669 !
Subtarget.isLittle()) && SplatBitSize <= 64) {
2671 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2683 switch (SplatBitSize) {
2687 ViaVecTy = MVT::v16i8;
2690 ViaVecTy = MVT::v8i16;
2693 ViaVecTy = MVT::v4i32;
2704 if (ViaVecTy != ResTy)
2714 EVT ResTy =
Node->getValueType(0);
2720 for (
unsigned i = 0; i < NumElts; ++i) {
2722 Node->getOperand(i),
2752 int SHFIndices[4] = { -1, -1, -1, -1 };
2754 if (Indices.
size() < 4)
2757 for (
unsigned i = 0; i < 4; ++i) {
2758 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2759 int Idx = Indices[j];
2765 if (Idx < 0 || Idx >= 4)
2771 if (SHFIndices[i] == -1)
2772 SHFIndices[i] = Idx;
2776 if (!(Idx == -1 || Idx == SHFIndices[i]))
2783 for (
int i = 3; i >= 0; --i) {
2784 int Idx = SHFIndices[i];
2794 return DAG.
getNode(MipsISD::SHF,
DL, ResTy,
2801template <
typename ValType>
2804 unsigned CheckStride,
2806 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2810 if (*
I != -1 && *
I != ExpectedIndex)
2812 ExpectedIndex += ExpectedIndexStride;
2816 for (
unsigned n = 0; n < CheckStride &&
I != End; ++n, ++
I)
2835 int SplatIndex = -1;
2836 for (
const auto &V : Indices) {
2869 const auto &Begin = Indices.
begin();
2870 const auto &End = Indices.
end();
2875 Wt =
Op->getOperand(0);
2877 Wt =
Op->getOperand(1);
2884 Ws =
Op->getOperand(0);
2886 Ws =
Op->getOperand(1);
2915 const auto &Begin = Indices.
begin();
2916 const auto &End = Indices.
end();
2921 Wt =
Op->getOperand(0);
2923 Wt =
Op->getOperand(1);
2930 Ws =
Op->getOperand(0);
2932 Ws =
Op->getOperand(1);
2962 const auto &Begin = Indices.
begin();
2963 const auto &End = Indices.
end();
2968 Wt =
Op->getOperand(0);
2970 Wt =
Op->getOperand(1);
2977 Ws =
Op->getOperand(0);
2979 Ws =
Op->getOperand(1);
3007 unsigned HalfSize = Indices.
size() / 2;
3010 const auto &Begin = Indices.
begin();
3011 const auto &End = Indices.
end();
3016 Wt =
Op->getOperand(0);
3018 Wt =
Op->getOperand(1);
3025 Ws =
Op->getOperand(0);
3028 Ws =
Op->getOperand(1);
3057 const auto &Begin = Indices.
begin();
3058 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3059 const auto &End = Indices.
end();
3062 Wt =
Op->getOperand(0);
3064 Wt =
Op->getOperand(1);
3069 Ws =
Op->getOperand(0);
3071 Ws =
Op->getOperand(1);
3100 const auto &Begin = Indices.
begin();
3101 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3102 const auto &End = Indices.
end();
3105 Wt =
Op->getOperand(0);
3107 Wt =
Op->getOperand(1);
3112 Ws =
Op->getOperand(0);
3114 Ws =
Op->getOperand(1);
3136 const bool isSPLATI,
3143 bool Using1stVec =
false;
3144 bool Using2ndVec =
false;
3148 for (
int i = 0; i < ResTyNumElts; ++i) {
3150 int Idx = Indices[i];
3152 if (0 <= Idx && Idx < ResTyNumElts)
3154 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
3161 for (
int Idx : Indices)
3167 int LastValidIndex = SplatIndex;
3168 for (
size_t i = 0; i < Indices.
size(); i++) {
3169 int Idx = Indices[i];
3172 Idx = isSPLATI ? SplatIndex : LastValidIndex;
3174 LastValidIndex = Idx;
3181 if (Using1stVec && Using2ndVec) {
3182 Op0 =
Op->getOperand(0);
3183 Op1 =
Op->getOperand(1);
3184 }
else if (Using1stVec)
3185 Op0 = Op1 =
Op->getOperand(0);
3186 else if (Using2ndVec)
3187 Op0 = Op1 =
Op->getOperand(1);
3189 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
3198 return DAG.
getNode(MipsISD::VSHF,
DL, ResTy, MaskVec, Op1, Op0);
3206 EVT ResTy =
Op->getValueType(0);
3212 SmallVector<int, 16> Indices;
3214 for (
int i = 0; i < ResTyNumElts; ++i)
3263 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3264 MachineBasicBlock *Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3267 F->insert(It, Sink);
3278 TBB->addSuccessor(Sink);
3298 MI.getOperand(0).getReg())
3304 MI.eraseFromParent();
3331 MachineBasicBlock *FBB =
F->CreateMachineBasicBlock(LLVM_BB);
3332 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3333 MachineBasicBlock *Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3336 F->insert(It, Sink);
3347 TBB->addSuccessor(Sink);
3367 MI.getOperand(0).getReg())
3373 MI.eraseFromParent();
3395 unsigned Lane =
MI.getOperand(2).getImm();
3410 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3411 : &Mips::MSA128WEvensRegClass);
3417 MI.eraseFromParent();
3440 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3452 MI.eraseFromParent();
3470 unsigned Lane =
MI.getOperand(2).getImm();
3473 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3474 : &Mips::MSA128WEvensRegClass);
3485 MI.eraseFromParent();
3505 unsigned Lane =
MI.getOperand(2).getImm();
3518 MI.eraseFromParent();
3549 Register SrcVecReg =
MI.getOperand(1).getReg();
3550 Register LaneReg =
MI.getOperand(2).getReg();
3551 Register SrcValReg =
MI.getOperand(3).getReg();
3556 Subtarget.isABI_N64() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3557 unsigned SubRegIdx =
Subtarget.isABI_N64() ? Mips::sub_32 : 0;
3558 unsigned ShiftOp =
Subtarget.isABI_N64() ? Mips::DSLL : Mips::SLL;
3559 unsigned EltLog2Size;
3560 unsigned InsertOp = 0;
3561 unsigned InsveOp = 0;
3562 switch (EltSizeInBytes) {
3567 InsertOp = Mips::INSERT_B;
3568 InsveOp = Mips::INSVE_B;
3569 VecRC = &Mips::MSA128BRegClass;
3573 InsertOp = Mips::INSERT_H;
3574 InsveOp = Mips::INSVE_H;
3575 VecRC = &Mips::MSA128HRegClass;
3579 InsertOp = Mips::INSERT_W;
3580 InsveOp = Mips::INSVE_W;
3581 VecRC = &Mips::MSA128WRegClass;
3585 InsertOp = Mips::INSERT_D;
3586 InsveOp = Mips::INSVE_D;
3587 VecRC = &Mips::MSA128DRegClass;
3595 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3600 if (EltSizeInBytes != 1) {
3613 .
addReg(LaneReg, {}, SubRegIdx);
3642 .
addReg(LaneTmp2, {}, SubRegIdx);
3644 MI.eraseFromParent();
3664 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3665 : &Mips::MSA128WEvensRegClass);
3667 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3668 : &Mips::MSA128WEvensRegClass);
3677 MI.eraseFromParent();
3708 MI.eraseFromParent();
3735 .
addReg(
MI.getOperand(1).getReg());
3737 MI.eraseFromParent();
3764 .
addReg(
MI.getOperand(1).getReg());
3766 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 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_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.
initializer< Ty > init(const Ty &Val)
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.
@ 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.