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) {
160 for (
MVT VT : {MVT::f32, MVT::f64}) {
374 if (VT == MVT::Untyped)
375 return Subtarget.hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
419 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
451 if (Ty != MVT::v8f16) {
478 EVT ResTy =
Op->getValueType(0);
485 return DAG.
getNode(MipsISD::FSELECT,
DL, ResTy, Tmp,
Op->getOperand(1),
494 EVT ResTy =
Op.getValueType();
495 assert((ResTy == MVT::f32 || ResTy == MVT::f64) &&
"Unexpected FP16_TO_FP");
499 assert(In.getValueType() == MVT::i32 &&
"Unexpected FP16_TO_FP operand type");
510 DAG.
getConstant(Intrinsic::mips_fexupr_w,
DL, MVT::i32), HVec);
512 if (ResTy == MVT::f32) {
520 DAG.
getConstant(Intrinsic::mips_fexupr_d,
DL, MVT::i32), F32Vec);
534 EVT ResTy =
Op.getValueType();
536 assert((
In.getValueType() == MVT::f32 ||
In.getValueType() == MVT::f64) &&
537 "Unexpected FP_TO_FP16");
540 if (
In.getValueType() == MVT::f64) {
554 DAG.
getConstant(Intrinsic::mips_fexdo_h,
DL, MVT::i32), F32Vec, F32Vec);
568 if (
Subtarget.systemSupportsUnalignedAccess()) {
593 switch(
Op.getOpcode()) {
596 case ISD::SMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
true, DAG);
597 case ISD::UMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Multu,
true,
true, DAG);
598 case ISD::MULHS:
return lowerMulDiv(
Op, MipsISD::Mult,
false,
true, DAG);
599 case ISD::MULHU:
return lowerMulDiv(
Op, MipsISD::Multu,
false,
true, DAG);
600 case ISD::MUL:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
false, DAG);
601 case ISD::SDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRem,
true,
true, DAG);
602 case ISD::UDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRemU,
true,
true,
611 return lowerSELECT(
Op, DAG);
614 return lowerFP16_TO_FP(
Op, DAG);
617 return lowerFP_TO_FP16(
Op, DAG);
620 return lowerR5900FPOp(
Op, DAG, RTLIB::ADD_F32);
622 return lowerR5900FPOp(
Op, DAG, RTLIB::SUB_F32);
624 return lowerR5900FPOp(
Op, DAG, RTLIB::MUL_F32);
626 return lowerR5900FPOp(
Op, DAG, RTLIB::DIV_F32);
628 return lowerR5900FPOp(
Op, DAG, RTLIB::SQRT_F32);
635 RTLIB::Libcall LC)
const {
639 if (Flags.hasNoNaNs() && Flags.hasNoInfs()) {
647 MVT VT =
Op.getSimpleValueType();
675 if (Op0Opcode == MipsISD::VEXTRACT_SEXT_ELT ||
676 Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT) {
682 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
684 if (Log2IfPositive <= 0)
690 unsigned Log2 = Log2IfPositive;
692 if ((Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT &&
Log2 >= ExtendTySize) ||
693 Log2 == ExtendTySize) {
695 return DAG.
getNode(MipsISD::VEXTRACT_ZEXT_ELT,
SDLoc(Op0),
719 APInt SplatValue, SplatUndef;
720 unsigned SplatBitSize;
723 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
737 N =
N->getOperand(0);
744 APInt SplatValue, SplatUndef;
745 unsigned SplatBitSize;
750 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
762 return N->getOperand(1) == OfNode;
765 return N->getOperand(0) == OfNode;
782 EVT Ty =
N->getValueType(0);
784 if (!Ty.is128BitVector())
795 bool IsLittleEndian = !Subtarget.
isLittle();
798 bool IsConstantMask =
false;
805 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
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;
826 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
827 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
829 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
830 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
833 IsConstantMask =
true;
882 if (IsConstantMask) {
883 if (Mask.isAllOnes())
930 while (!WorkStack.
empty()) {
933 if (Val == 0 || Val == 1)
947 if ((Val - Floor).ule(Ceil - Val)) {
995 if ((
C - Floor).ule(Ceil -
C)) {
1012 EVT VT =
N->getValueType(0);
1016 C->getAPIntValue(), VT, DAG, Subtarget))
1028 APInt SplatValue, SplatUndef;
1029 unsigned SplatBitSize;
1031 unsigned EltSize = Ty.getScalarSizeInBits();
1038 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
1040 (SplatBitSize != EltSize) ||
1052 EVT Ty =
N->getValueType(0);
1054 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1075 EVT Ty =
N->getValueType(0);
1077 if (Subtarget.
hasMSA()) {
1092 if (Op0Op0->
getOpcode() != MipsISD::VEXTRACT_SEXT_ELT &&
1093 Op0Op0->
getOpcode() != MipsISD::VEXTRACT_ZEXT_ELT)
1099 if (TotalBits == 32 ||
1100 (Op0Op0->
getOpcode() == MipsISD::VEXTRACT_SEXT_ELT &&
1104 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
SDLoc(Op0Op0),
1111 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
1121 EVT Ty =
N->getValueType(0);
1123 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
1130 bool IsV216 = (Ty == MVT::v2i16);
1143 default:
return false;
1148 EVT Ty =
N->getValueType(0);
1150 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1156 return DAG.
getNode(MipsISD::SETCC_DSP,
SDLoc(
N), Ty,
N->getOperand(0),
1157 N->getOperand(1),
N->getOperand(2));
1161 EVT Ty =
N->getValueType(0);
1163 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
1166 if (SetCC.
getOpcode() != MipsISD::SETCC_DSP)
1171 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
1179 EVT Ty =
N->getValueType(0);
1181 if (Subtarget.
hasMSA() && Ty.is128BitVector() && Ty.isInteger()) {
1207 EVT VT =
N->getValueType(0);
1226 switch (
N->getOpcode()) {
1257 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1268 switch (
MI.getOpcode()) {
1271 case Mips::BPOSGE32_PSEUDO:
1272 return emitBPOSGE32(
MI, BB);
1273 case Mips::SNZ_B_PSEUDO:
1274 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1275 case Mips::SNZ_H_PSEUDO:
1276 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1277 case Mips::SNZ_W_PSEUDO:
1278 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1279 case Mips::SNZ_D_PSEUDO:
1280 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1281 case Mips::SNZ_V_PSEUDO:
1282 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1283 case Mips::SZ_B_PSEUDO:
1284 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1285 case Mips::SZ_H_PSEUDO:
1286 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1287 case Mips::SZ_W_PSEUDO:
1288 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1289 case Mips::SZ_D_PSEUDO:
1290 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1291 case Mips::SZ_V_PSEUDO:
1292 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1293 case Mips::COPY_FW_PSEUDO:
1294 return emitCOPY_FW(
MI, BB);
1295 case Mips::COPY_FD_PSEUDO:
1296 return emitCOPY_FD(
MI, BB);
1297 case Mips::INSERT_FW_PSEUDO:
1298 return emitINSERT_FW(
MI, BB);
1299 case Mips::INSERT_FD_PSEUDO:
1300 return emitINSERT_FD(
MI, BB);
1301 case Mips::INSERT_B_VIDX_PSEUDO:
1302 case Mips::INSERT_B_VIDX64_PSEUDO:
1303 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1304 case Mips::INSERT_H_VIDX_PSEUDO:
1305 case Mips::INSERT_H_VIDX64_PSEUDO:
1306 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1307 case Mips::INSERT_W_VIDX_PSEUDO:
1308 case Mips::INSERT_W_VIDX64_PSEUDO:
1309 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1310 case Mips::INSERT_D_VIDX_PSEUDO:
1311 case Mips::INSERT_D_VIDX64_PSEUDO:
1312 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1313 case Mips::INSERT_FW_VIDX_PSEUDO:
1314 case Mips::INSERT_FW_VIDX64_PSEUDO:
1315 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1316 case Mips::INSERT_FD_VIDX_PSEUDO:
1317 case Mips::INSERT_FD_VIDX64_PSEUDO:
1318 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1319 case Mips::FILL_FW_PSEUDO:
1320 return emitFILL_FW(
MI, BB);
1321 case Mips::FILL_FD_PSEUDO:
1322 return emitFILL_FD(
MI, BB);
1323 case Mips::FEXP2_W_1_PSEUDO:
1324 return emitFEXP2_W_1(
MI, BB);
1325 case Mips::FEXP2_D_1_PSEUDO:
1326 return emitFEXP2_D_1(
MI, BB);
1330bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1331 const CCState &CCInfo,
unsigned NextStackOffset,
1345void MipsSETargetLowering::
1347 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
1348 bool IsPICCall,
bool GlobalOrExternal,
bool InternalLinkage,
1349 bool IsCallReloc, CallLoweringInfo &CLI,
SDValue Callee,
1351 Ops.push_back(Callee);
1353 InternalLinkage, IsCallReloc, CLI, Callee,
1367 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1384 BP = DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1386 BP = DAG.
getNode(MipsISD::BuildPairF64_FPR,
DL, MVT::f64,
Hi,
Lo);
1402 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1404 unsigned ExtractOp =
Subtarget.hasMips2() ? MipsISD::ExtractElementF64
1405 : MipsISD::ExtractElementF64_FPR;
1420 return DAG.
getStore(Chain,
DL,
Hi, Ptr, MachinePointerInfo(),
1428 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1429 MVT Dest =
Op.getValueType().getSimpleVT();
1432 if (Src == MVT::i64 && Dest == MVT::f64) {
1436 return DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1440 if (Src == MVT::f64 && Dest == MVT::i64) {
1447 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1450 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1460 bool HasLo,
bool HasHi,
1465 EVT Ty =
Op.getOperand(0).getValueType();
1468 Op.getOperand(0),
Op.getOperand(1));
1476 if (!HasLo || !HasHi)
1477 return HasLo ?
Lo :
Hi;
1485 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1486 return DAG.
getNode(MipsISD::MTLOHI,
DL, MVT::Untyped, InLo, InHi);
1509 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1515 Ops.push_back(
Op->getOperand(OpNo++));
1521 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1526 Ops.push_back(Opnd);
1529 for (++OpNo ; OpNo <
Op->getNumOperands(); ++OpNo)
1530 Ops.push_back(
Op->getOperand(OpNo));
1534 Ops.push_back(In64);
1539 for (
EVT Ty :
Op->values())
1540 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1559 EVT ResTy =
Op->getValueType(0);
1569 EVT ResVecTy =
Op->getValueType(0);
1570 EVT ViaVecTy = ResVecTy;
1580 if (ResVecTy == MVT::v2i64) {
1591 ViaVecTy = MVT::v4i32;
1597 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1598 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1603 if (ViaVecTy != ResVecTy) {
1613 bool IsSigned =
false) {
1616 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1617 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1623 EVT ViaVecTy = VecTy;
1624 SDValue SplatValueA = SplatValue;
1625 SDValue SplatValueB = SplatValue;
1628 if (VecTy == MVT::v2i64) {
1630 ViaVecTy = MVT::v4i32;
1643 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1644 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1645 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1646 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1651 if (VecTy != ViaVecTy)
1660 EVT VecTy =
Op->getValueType(0);
1666 if (VecTy == MVT::v2i64) {
1668 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1680 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1689 if (VecTy == MVT::v2i64)
1703 EVT ResTy =
Op->getValueType(0);
1706 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1715 EVT ResTy =
Op->getValueType(0);
1726 EVT ResTy =
Op->getValueType(0);
1728 <<
Op->getConstantOperandAPInt(2);
1737 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1738 switch (Intrinsic) {
1741 case Intrinsic::mips_shilo:
1743 case Intrinsic::mips_dpau_h_qbl:
1745 case Intrinsic::mips_dpau_h_qbr:
1747 case Intrinsic::mips_dpsu_h_qbl:
1749 case Intrinsic::mips_dpsu_h_qbr:
1751 case Intrinsic::mips_dpa_w_ph:
1753 case Intrinsic::mips_dps_w_ph:
1755 case Intrinsic::mips_dpax_w_ph:
1757 case Intrinsic::mips_dpsx_w_ph:
1759 case Intrinsic::mips_mulsa_w_ph:
1761 case Intrinsic::mips_mult:
1763 case Intrinsic::mips_multu:
1765 case Intrinsic::mips_madd:
1767 case Intrinsic::mips_maddu:
1769 case Intrinsic::mips_msub:
1771 case Intrinsic::mips_msubu:
1773 case Intrinsic::mips_addv_b:
1774 case Intrinsic::mips_addv_h:
1775 case Intrinsic::mips_addv_w:
1776 case Intrinsic::mips_addv_d:
1779 case Intrinsic::mips_addvi_b:
1780 case Intrinsic::mips_addvi_h:
1781 case Intrinsic::mips_addvi_w:
1782 case Intrinsic::mips_addvi_d:
1785 case Intrinsic::mips_and_v:
1788 case Intrinsic::mips_andi_b:
1791 case Intrinsic::mips_bclr_b:
1792 case Intrinsic::mips_bclr_h:
1793 case Intrinsic::mips_bclr_w:
1794 case Intrinsic::mips_bclr_d:
1796 case Intrinsic::mips_bclri_b:
1797 case Intrinsic::mips_bclri_h:
1798 case Intrinsic::mips_bclri_w:
1799 case Intrinsic::mips_bclri_d:
1801 case Intrinsic::mips_binsli_b:
1802 case Intrinsic::mips_binsli_h:
1803 case Intrinsic::mips_binsli_w:
1804 case Intrinsic::mips_binsli_d: {
1806 EVT VecTy =
Op->getValueType(0);
1811 Op->getConstantOperandVal(3) + 1);
1814 Op->getOperand(2),
Op->getOperand(1));
1816 case Intrinsic::mips_binsri_b:
1817 case Intrinsic::mips_binsri_h:
1818 case Intrinsic::mips_binsri_w:
1819 case Intrinsic::mips_binsri_d: {
1821 EVT VecTy =
Op->getValueType(0);
1826 Op->getConstantOperandVal(3) + 1);
1829 Op->getOperand(2),
Op->getOperand(1));
1831 case Intrinsic::mips_bmnz_v:
1833 Op->getOperand(2),
Op->getOperand(1));
1834 case Intrinsic::mips_bmnzi_b:
1838 case Intrinsic::mips_bmz_v:
1840 Op->getOperand(1),
Op->getOperand(2));
1841 case Intrinsic::mips_bmzi_b:
1845 case Intrinsic::mips_bneg_b:
1846 case Intrinsic::mips_bneg_h:
1847 case Intrinsic::mips_bneg_w:
1848 case Intrinsic::mips_bneg_d: {
1849 EVT VecTy =
Op->getValueType(0);
1856 case Intrinsic::mips_bnegi_b:
1857 case Intrinsic::mips_bnegi_h:
1858 case Intrinsic::mips_bnegi_w:
1859 case Intrinsic::mips_bnegi_d:
1862 case Intrinsic::mips_bnz_b:
1863 case Intrinsic::mips_bnz_h:
1864 case Intrinsic::mips_bnz_w:
1865 case Intrinsic::mips_bnz_d:
1866 return DAG.
getNode(MipsISD::VALL_NONZERO,
DL,
Op->getValueType(0),
1868 case Intrinsic::mips_bnz_v:
1869 return DAG.
getNode(MipsISD::VANY_NONZERO,
DL,
Op->getValueType(0),
1871 case Intrinsic::mips_bsel_v:
1874 Op->getOperand(1),
Op->getOperand(3),
1876 case Intrinsic::mips_bseli_b:
1881 case Intrinsic::mips_bset_b:
1882 case Intrinsic::mips_bset_h:
1883 case Intrinsic::mips_bset_w:
1884 case Intrinsic::mips_bset_d: {
1885 EVT VecTy =
Op->getValueType(0);
1892 case Intrinsic::mips_bseti_b:
1893 case Intrinsic::mips_bseti_h:
1894 case Intrinsic::mips_bseti_w:
1895 case Intrinsic::mips_bseti_d:
1898 case Intrinsic::mips_bz_b:
1899 case Intrinsic::mips_bz_h:
1900 case Intrinsic::mips_bz_w:
1901 case Intrinsic::mips_bz_d:
1902 return DAG.
getNode(MipsISD::VALL_ZERO,
DL,
Op->getValueType(0),
1904 case Intrinsic::mips_bz_v:
1905 return DAG.
getNode(MipsISD::VANY_ZERO,
DL,
Op->getValueType(0),
1907 case Intrinsic::mips_ceq_b:
1908 case Intrinsic::mips_ceq_h:
1909 case Intrinsic::mips_ceq_w:
1910 case Intrinsic::mips_ceq_d:
1913 case Intrinsic::mips_ceqi_b:
1914 case Intrinsic::mips_ceqi_h:
1915 case Intrinsic::mips_ceqi_w:
1916 case Intrinsic::mips_ceqi_d:
1919 case Intrinsic::mips_cle_s_b:
1920 case Intrinsic::mips_cle_s_h:
1921 case Intrinsic::mips_cle_s_w:
1922 case Intrinsic::mips_cle_s_d:
1925 case Intrinsic::mips_clei_s_b:
1926 case Intrinsic::mips_clei_s_h:
1927 case Intrinsic::mips_clei_s_w:
1928 case Intrinsic::mips_clei_s_d:
1931 case Intrinsic::mips_cle_u_b:
1932 case Intrinsic::mips_cle_u_h:
1933 case Intrinsic::mips_cle_u_w:
1934 case Intrinsic::mips_cle_u_d:
1937 case Intrinsic::mips_clei_u_b:
1938 case Intrinsic::mips_clei_u_h:
1939 case Intrinsic::mips_clei_u_w:
1940 case Intrinsic::mips_clei_u_d:
1943 case Intrinsic::mips_clt_s_b:
1944 case Intrinsic::mips_clt_s_h:
1945 case Intrinsic::mips_clt_s_w:
1946 case Intrinsic::mips_clt_s_d:
1949 case Intrinsic::mips_clti_s_b:
1950 case Intrinsic::mips_clti_s_h:
1951 case Intrinsic::mips_clti_s_w:
1952 case Intrinsic::mips_clti_s_d:
1955 case Intrinsic::mips_clt_u_b:
1956 case Intrinsic::mips_clt_u_h:
1957 case Intrinsic::mips_clt_u_w:
1958 case Intrinsic::mips_clt_u_d:
1961 case Intrinsic::mips_clti_u_b:
1962 case Intrinsic::mips_clti_u_h:
1963 case Intrinsic::mips_clti_u_w:
1964 case Intrinsic::mips_clti_u_d:
1967 case Intrinsic::mips_copy_s_b:
1968 case Intrinsic::mips_copy_s_h:
1969 case Intrinsic::mips_copy_s_w:
1971 case Intrinsic::mips_copy_s_d:
1979 Op->getValueType(0),
Op->getOperand(1),
1982 case Intrinsic::mips_copy_u_b:
1983 case Intrinsic::mips_copy_u_h:
1984 case Intrinsic::mips_copy_u_w:
1986 case Intrinsic::mips_copy_u_d:
1997 Op->getValueType(0),
Op->getOperand(1),
2000 case Intrinsic::mips_div_s_b:
2001 case Intrinsic::mips_div_s_h:
2002 case Intrinsic::mips_div_s_w:
2003 case Intrinsic::mips_div_s_d:
2006 case Intrinsic::mips_div_u_b:
2007 case Intrinsic::mips_div_u_h:
2008 case Intrinsic::mips_div_u_w:
2009 case Intrinsic::mips_div_u_d:
2012 case Intrinsic::mips_fadd_w:
2013 case Intrinsic::mips_fadd_d:
2015 Op->getOperand(2),
Op->getFlags());
2017 case Intrinsic::mips_fceq_w:
2018 case Intrinsic::mips_fceq_d:
2021 case Intrinsic::mips_fcle_w:
2022 case Intrinsic::mips_fcle_d:
2025 case Intrinsic::mips_fclt_w:
2026 case Intrinsic::mips_fclt_d:
2029 case Intrinsic::mips_fcne_w:
2030 case Intrinsic::mips_fcne_d:
2033 case Intrinsic::mips_fcor_w:
2034 case Intrinsic::mips_fcor_d:
2037 case Intrinsic::mips_fcueq_w:
2038 case Intrinsic::mips_fcueq_d:
2041 case Intrinsic::mips_fcule_w:
2042 case Intrinsic::mips_fcule_d:
2045 case Intrinsic::mips_fcult_w:
2046 case Intrinsic::mips_fcult_d:
2049 case Intrinsic::mips_fcun_w:
2050 case Intrinsic::mips_fcun_d:
2053 case Intrinsic::mips_fcune_w:
2054 case Intrinsic::mips_fcune_d:
2057 case Intrinsic::mips_fdiv_w:
2058 case Intrinsic::mips_fdiv_d:
2062 case Intrinsic::mips_ffint_u_w:
2063 case Intrinsic::mips_ffint_u_d:
2066 case Intrinsic::mips_ffint_s_w:
2067 case Intrinsic::mips_ffint_s_d:
2070 case Intrinsic::mips_fill_b:
2071 case Intrinsic::mips_fill_h:
2072 case Intrinsic::mips_fill_w:
2073 case Intrinsic::mips_fill_d: {
2074 EVT ResTy =
Op->getValueType(0);
2082 case Intrinsic::mips_fexp2_w:
2083 case Intrinsic::mips_fexp2_d: {
2085 EVT ResTy =
Op->getValueType(0);
2090 case Intrinsic::mips_flog2_w:
2091 case Intrinsic::mips_flog2_d:
2093 case Intrinsic::mips_fmadd_w:
2094 case Intrinsic::mips_fmadd_d:
2096 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2097 case Intrinsic::mips_fmul_w:
2098 case Intrinsic::mips_fmul_d:
2100 Op->getOperand(2),
Op->getFlags());
2101 case Intrinsic::mips_fmsub_w:
2102 case Intrinsic::mips_fmsub_d: {
2104 return DAG.
getNode(MipsISD::FMS, SDLoc(
Op),
Op->getValueType(0),
2105 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2107 case Intrinsic::mips_frint_w:
2108 case Intrinsic::mips_frint_d:
2110 case Intrinsic::mips_fsqrt_w:
2111 case Intrinsic::mips_fsqrt_d:
2113 case Intrinsic::mips_fsub_w:
2114 case Intrinsic::mips_fsub_d:
2116 Op->getOperand(2),
Op->getFlags());
2117 case Intrinsic::mips_ftrunc_u_w:
2118 case Intrinsic::mips_ftrunc_u_d:
2121 case Intrinsic::mips_ftrunc_s_w:
2122 case Intrinsic::mips_ftrunc_s_d:
2125 case Intrinsic::mips_ilvev_b:
2126 case Intrinsic::mips_ilvev_h:
2127 case Intrinsic::mips_ilvev_w:
2128 case Intrinsic::mips_ilvev_d:
2129 return DAG.
getNode(MipsISD::ILVEV,
DL,
Op->getValueType(0),
2130 Op->getOperand(1),
Op->getOperand(2));
2131 case Intrinsic::mips_ilvl_b:
2132 case Intrinsic::mips_ilvl_h:
2133 case Intrinsic::mips_ilvl_w:
2134 case Intrinsic::mips_ilvl_d:
2135 return DAG.
getNode(MipsISD::ILVL,
DL,
Op->getValueType(0),
2136 Op->getOperand(1),
Op->getOperand(2));
2137 case Intrinsic::mips_ilvod_b:
2138 case Intrinsic::mips_ilvod_h:
2139 case Intrinsic::mips_ilvod_w:
2140 case Intrinsic::mips_ilvod_d:
2141 return DAG.
getNode(MipsISD::ILVOD,
DL,
Op->getValueType(0),
2142 Op->getOperand(1),
Op->getOperand(2));
2143 case Intrinsic::mips_ilvr_b:
2144 case Intrinsic::mips_ilvr_h:
2145 case Intrinsic::mips_ilvr_w:
2146 case Intrinsic::mips_ilvr_d:
2147 return DAG.
getNode(MipsISD::ILVR,
DL,
Op->getValueType(0),
2148 Op->getOperand(1),
Op->getOperand(2));
2149 case Intrinsic::mips_insert_b:
2150 case Intrinsic::mips_insert_h:
2151 case Intrinsic::mips_insert_w:
2152 case Intrinsic::mips_insert_d:
2154 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
2155 case Intrinsic::mips_insve_b:
2156 case Intrinsic::mips_insve_h:
2157 case Intrinsic::mips_insve_w:
2158 case Intrinsic::mips_insve_d: {
2161 switch (Intrinsic) {
2162 case Intrinsic::mips_insve_b:
Max = 15;
break;
2163 case Intrinsic::mips_insve_h:
Max = 7;
break;
2164 case Intrinsic::mips_insve_w:
Max = 3;
break;
2165 case Intrinsic::mips_insve_d:
Max = 1;
break;
2171 return DAG.
getNode(MipsISD::INSVE,
DL,
Op->getValueType(0),
2172 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
2175 case Intrinsic::mips_ldi_b:
2176 case Intrinsic::mips_ldi_h:
2177 case Intrinsic::mips_ldi_w:
2178 case Intrinsic::mips_ldi_d:
2180 case Intrinsic::mips_lsa:
2181 case Intrinsic::mips_dlsa: {
2182 EVT ResTy =
Op->getValueType(0);
2185 Op->getOperand(2),
Op->getOperand(3)));
2187 case Intrinsic::mips_maddv_b:
2188 case Intrinsic::mips_maddv_h:
2189 case Intrinsic::mips_maddv_w:
2190 case Intrinsic::mips_maddv_d: {
2191 EVT ResTy =
Op->getValueType(0);
2194 Op->getOperand(2),
Op->getOperand(3)));
2196 case Intrinsic::mips_max_s_b:
2197 case Intrinsic::mips_max_s_h:
2198 case Intrinsic::mips_max_s_w:
2199 case Intrinsic::mips_max_s_d:
2201 Op->getOperand(1),
Op->getOperand(2));
2202 case Intrinsic::mips_max_u_b:
2203 case Intrinsic::mips_max_u_h:
2204 case Intrinsic::mips_max_u_w:
2205 case Intrinsic::mips_max_u_d:
2207 Op->getOperand(1),
Op->getOperand(2));
2208 case Intrinsic::mips_maxi_s_b:
2209 case Intrinsic::mips_maxi_s_h:
2210 case Intrinsic::mips_maxi_s_w:
2211 case Intrinsic::mips_maxi_s_d:
2214 case Intrinsic::mips_maxi_u_b:
2215 case Intrinsic::mips_maxi_u_h:
2216 case Intrinsic::mips_maxi_u_w:
2217 case Intrinsic::mips_maxi_u_d:
2220 case Intrinsic::mips_min_s_b:
2221 case Intrinsic::mips_min_s_h:
2222 case Intrinsic::mips_min_s_w:
2223 case Intrinsic::mips_min_s_d:
2225 Op->getOperand(1),
Op->getOperand(2));
2226 case Intrinsic::mips_min_u_b:
2227 case Intrinsic::mips_min_u_h:
2228 case Intrinsic::mips_min_u_w:
2229 case Intrinsic::mips_min_u_d:
2231 Op->getOperand(1),
Op->getOperand(2));
2232 case Intrinsic::mips_mini_s_b:
2233 case Intrinsic::mips_mini_s_h:
2234 case Intrinsic::mips_mini_s_w:
2235 case Intrinsic::mips_mini_s_d:
2238 case Intrinsic::mips_mini_u_b:
2239 case Intrinsic::mips_mini_u_h:
2240 case Intrinsic::mips_mini_u_w:
2241 case Intrinsic::mips_mini_u_d:
2244 case Intrinsic::mips_mod_s_b:
2245 case Intrinsic::mips_mod_s_h:
2246 case Intrinsic::mips_mod_s_w:
2247 case Intrinsic::mips_mod_s_d:
2250 case Intrinsic::mips_mod_u_b:
2251 case Intrinsic::mips_mod_u_h:
2252 case Intrinsic::mips_mod_u_w:
2253 case Intrinsic::mips_mod_u_d:
2256 case Intrinsic::mips_mulv_b:
2257 case Intrinsic::mips_mulv_h:
2258 case Intrinsic::mips_mulv_w:
2259 case Intrinsic::mips_mulv_d:
2262 case Intrinsic::mips_msubv_b:
2263 case Intrinsic::mips_msubv_h:
2264 case Intrinsic::mips_msubv_w:
2265 case Intrinsic::mips_msubv_d: {
2266 EVT ResTy =
Op->getValueType(0);
2269 Op->getOperand(2),
Op->getOperand(3)));
2271 case Intrinsic::mips_nlzc_b:
2272 case Intrinsic::mips_nlzc_h:
2273 case Intrinsic::mips_nlzc_w:
2274 case Intrinsic::mips_nlzc_d:
2276 case Intrinsic::mips_nor_v: {
2278 Op->getOperand(1),
Op->getOperand(2));
2281 case Intrinsic::mips_nori_b: {
2287 case Intrinsic::mips_or_v:
2290 case Intrinsic::mips_ori_b:
2293 case Intrinsic::mips_pckev_b:
2294 case Intrinsic::mips_pckev_h:
2295 case Intrinsic::mips_pckev_w:
2296 case Intrinsic::mips_pckev_d:
2297 return DAG.
getNode(MipsISD::PCKEV,
DL,
Op->getValueType(0),
2298 Op->getOperand(1),
Op->getOperand(2));
2299 case Intrinsic::mips_pckod_b:
2300 case Intrinsic::mips_pckod_h:
2301 case Intrinsic::mips_pckod_w:
2302 case Intrinsic::mips_pckod_d:
2303 return DAG.
getNode(MipsISD::PCKOD,
DL,
Op->getValueType(0),
2304 Op->getOperand(1),
Op->getOperand(2));
2305 case Intrinsic::mips_pcnt_b:
2306 case Intrinsic::mips_pcnt_h:
2307 case Intrinsic::mips_pcnt_w:
2308 case Intrinsic::mips_pcnt_d:
2310 case Intrinsic::mips_sat_s_b:
2311 case Intrinsic::mips_sat_s_h:
2312 case Intrinsic::mips_sat_s_w:
2313 case Intrinsic::mips_sat_s_d:
2314 case Intrinsic::mips_sat_u_b:
2315 case Intrinsic::mips_sat_u_h:
2316 case Intrinsic::mips_sat_u_w:
2317 case Intrinsic::mips_sat_u_d: {
2320 switch (Intrinsic) {
2321 case Intrinsic::mips_sat_s_b:
2322 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2323 case Intrinsic::mips_sat_s_h:
2324 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2325 case Intrinsic::mips_sat_s_w:
2326 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2327 case Intrinsic::mips_sat_s_d:
2328 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2336 case Intrinsic::mips_shf_b:
2337 case Intrinsic::mips_shf_h:
2338 case Intrinsic::mips_shf_w: {
2342 return DAG.
getNode(MipsISD::SHF,
DL,
Op->getValueType(0),
2343 Op->getOperand(2),
Op->getOperand(1));
2345 case Intrinsic::mips_sldi_b:
2346 case Intrinsic::mips_sldi_h:
2347 case Intrinsic::mips_sldi_w:
2348 case Intrinsic::mips_sldi_d: {
2351 switch (Intrinsic) {
2352 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2353 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2354 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2355 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2363 case Intrinsic::mips_sll_b:
2364 case Intrinsic::mips_sll_h:
2365 case Intrinsic::mips_sll_w:
2366 case Intrinsic::mips_sll_d:
2369 case Intrinsic::mips_slli_b:
2370 case Intrinsic::mips_slli_h:
2371 case Intrinsic::mips_slli_w:
2372 case Intrinsic::mips_slli_d:
2375 case Intrinsic::mips_splat_b:
2376 case Intrinsic::mips_splat_h:
2377 case Intrinsic::mips_splat_w:
2378 case Intrinsic::mips_splat_d:
2383 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2386 case Intrinsic::mips_splati_b:
2387 case Intrinsic::mips_splati_h:
2388 case Intrinsic::mips_splati_w:
2389 case Intrinsic::mips_splati_d:
2390 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2393 case Intrinsic::mips_sra_b:
2394 case Intrinsic::mips_sra_h:
2395 case Intrinsic::mips_sra_w:
2396 case Intrinsic::mips_sra_d:
2399 case Intrinsic::mips_srai_b:
2400 case Intrinsic::mips_srai_h:
2401 case Intrinsic::mips_srai_w:
2402 case Intrinsic::mips_srai_d:
2405 case Intrinsic::mips_srari_b:
2406 case Intrinsic::mips_srari_h:
2407 case Intrinsic::mips_srari_w:
2408 case Intrinsic::mips_srari_d: {
2411 switch (Intrinsic) {
2412 case Intrinsic::mips_srari_b:
Max = 7;
break;
2413 case Intrinsic::mips_srari_h:
Max = 15;
break;
2414 case Intrinsic::mips_srari_w:
Max = 31;
break;
2415 case Intrinsic::mips_srari_d:
Max = 63;
break;
2423 case Intrinsic::mips_srl_b:
2424 case Intrinsic::mips_srl_h:
2425 case Intrinsic::mips_srl_w:
2426 case Intrinsic::mips_srl_d:
2429 case Intrinsic::mips_srli_b:
2430 case Intrinsic::mips_srli_h:
2431 case Intrinsic::mips_srli_w:
2432 case Intrinsic::mips_srli_d:
2435 case Intrinsic::mips_srlri_b:
2436 case Intrinsic::mips_srlri_h:
2437 case Intrinsic::mips_srlri_w:
2438 case Intrinsic::mips_srlri_d: {
2441 switch (Intrinsic) {
2442 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2443 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2444 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2445 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2453 case Intrinsic::mips_subv_b:
2454 case Intrinsic::mips_subv_h:
2455 case Intrinsic::mips_subv_w:
2456 case Intrinsic::mips_subv_d:
2459 case Intrinsic::mips_subvi_b:
2460 case Intrinsic::mips_subvi_h:
2461 case Intrinsic::mips_subvi_w:
2462 case Intrinsic::mips_subvi_d:
2465 case Intrinsic::mips_vshf_b:
2466 case Intrinsic::mips_vshf_h:
2467 case Intrinsic::mips_vshf_w:
2468 case Intrinsic::mips_vshf_d:
2469 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2470 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2471 case Intrinsic::mips_xor_v:
2474 case Intrinsic::mips_xori_b:
2477 case Intrinsic::thread_pointer: {
2479 return DAG.
getNode(MipsISD::ThreadPointer,
DL, PtrVT);
2490 EVT ResTy =
Op->getValueType(0);
2491 EVT PtrTy = Address->getValueType(0);
2506 unsigned Intr =
Op->getConstantOperandVal(1);
2510 case Intrinsic::mips_extp:
2512 case Intrinsic::mips_extpdp:
2514 case Intrinsic::mips_extr_w:
2516 case Intrinsic::mips_extr_r_w:
2518 case Intrinsic::mips_extr_rs_w:
2520 case Intrinsic::mips_extr_s_h:
2522 case Intrinsic::mips_mthlip:
2524 case Intrinsic::mips_mulsaq_s_w_ph:
2526 case Intrinsic::mips_maq_s_w_phl:
2528 case Intrinsic::mips_maq_s_w_phr:
2530 case Intrinsic::mips_maq_sa_w_phl:
2532 case Intrinsic::mips_maq_sa_w_phr:
2534 case Intrinsic::mips_dpaq_s_w_ph:
2536 case Intrinsic::mips_dpsq_s_w_ph:
2538 case Intrinsic::mips_dpaq_sa_l_w:
2540 case Intrinsic::mips_dpsq_sa_l_w:
2542 case Intrinsic::mips_dpaqx_s_w_ph:
2544 case Intrinsic::mips_dpaqx_sa_w_ph:
2546 case Intrinsic::mips_dpsqx_s_w_ph:
2548 case Intrinsic::mips_dpsqx_sa_w_ph:
2550 case Intrinsic::mips_ld_b:
2551 case Intrinsic::mips_ld_h:
2552 case Intrinsic::mips_ld_w:
2553 case Intrinsic::mips_ld_d:
2565 EVT PtrTy = Address->getValueType(0);
2581 unsigned Intr =
Op->getConstantOperandVal(1);
2585 case Intrinsic::mips_st_b:
2586 case Intrinsic::mips_st_h:
2587 case Intrinsic::mips_st_w:
2588 case Intrinsic::mips_st_d:
2603 EVT ResTy =
Op->getValueType(0);
2613 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
DL, ResTy, Op0, Op1,
2631 for (
unsigned i = 0; i <
Op->getNumOperands(); ++i)
2653 EVT ResTy =
Op->getValueType(0);
2655 APInt SplatValue, SplatUndef;
2656 unsigned SplatBitSize;
2662 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2664 !
Subtarget.isLittle()) && SplatBitSize <= 64) {
2666 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2678 switch (SplatBitSize) {
2682 ViaVecTy = MVT::v16i8;
2685 ViaVecTy = MVT::v8i16;
2688 ViaVecTy = MVT::v4i32;
2699 if (ViaVecTy != ResTy)
2709 EVT ResTy =
Node->getValueType(0);
2715 for (
unsigned i = 0; i < NumElts; ++i) {
2717 Node->getOperand(i),
2747 int SHFIndices[4] = { -1, -1, -1, -1 };
2749 if (Indices.
size() < 4)
2752 for (
unsigned i = 0; i < 4; ++i) {
2753 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2754 int Idx = Indices[j];
2760 if (Idx < 0 || Idx >= 4)
2766 if (SHFIndices[i] == -1)
2767 SHFIndices[i] = Idx;
2771 if (!(Idx == -1 || Idx == SHFIndices[i]))
2778 for (
int i = 3; i >= 0; --i) {
2779 int Idx = SHFIndices[i];
2789 return DAG.
getNode(MipsISD::SHF,
DL, ResTy,
2796template <
typename ValType>
2799 unsigned CheckStride,
2801 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2805 if (*
I != -1 && *
I != ExpectedIndex)
2807 ExpectedIndex += ExpectedIndexStride;
2811 for (
unsigned n = 0; n < CheckStride &&
I != End; ++n, ++
I)
2830 int SplatIndex = -1;
2831 for (
const auto &V : Indices) {
2864 const auto &Begin = Indices.
begin();
2865 const auto &End = Indices.
end();
2870 Wt =
Op->getOperand(0);
2872 Wt =
Op->getOperand(1);
2879 Ws =
Op->getOperand(0);
2881 Ws =
Op->getOperand(1);
2910 const auto &Begin = Indices.
begin();
2911 const auto &End = Indices.
end();
2916 Wt =
Op->getOperand(0);
2918 Wt =
Op->getOperand(1);
2925 Ws =
Op->getOperand(0);
2927 Ws =
Op->getOperand(1);
2957 const auto &Begin = Indices.
begin();
2958 const auto &End = Indices.
end();
2963 Wt =
Op->getOperand(0);
2965 Wt =
Op->getOperand(1);
2972 Ws =
Op->getOperand(0);
2974 Ws =
Op->getOperand(1);
3002 unsigned HalfSize = Indices.
size() / 2;
3005 const auto &Begin = Indices.
begin();
3006 const auto &End = Indices.
end();
3011 Wt =
Op->getOperand(0);
3013 Wt =
Op->getOperand(1);
3020 Ws =
Op->getOperand(0);
3023 Ws =
Op->getOperand(1);
3052 const auto &Begin = Indices.
begin();
3053 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3054 const auto &End = Indices.
end();
3057 Wt =
Op->getOperand(0);
3059 Wt =
Op->getOperand(1);
3064 Ws =
Op->getOperand(0);
3066 Ws =
Op->getOperand(1);
3095 const auto &Begin = Indices.
begin();
3096 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3097 const auto &End = Indices.
end();
3100 Wt =
Op->getOperand(0);
3102 Wt =
Op->getOperand(1);
3107 Ws =
Op->getOperand(0);
3109 Ws =
Op->getOperand(1);
3131 const bool isSPLATI,
3138 bool Using1stVec =
false;
3139 bool Using2ndVec =
false;
3143 for (
int i = 0; i < ResTyNumElts; ++i) {
3145 int Idx = Indices[i];
3147 if (0 <= Idx && Idx < ResTyNumElts)
3149 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
3156 for (
int Idx : Indices)
3162 int LastValidIndex = SplatIndex;
3163 for (
size_t i = 0; i < Indices.
size(); i++) {
3164 int Idx = Indices[i];
3167 Idx = isSPLATI ? SplatIndex : LastValidIndex;
3169 LastValidIndex = Idx;
3176 if (Using1stVec && Using2ndVec) {
3177 Op0 =
Op->getOperand(0);
3178 Op1 =
Op->getOperand(1);
3179 }
else if (Using1stVec)
3180 Op0 = Op1 =
Op->getOperand(0);
3181 else if (Using2ndVec)
3182 Op0 = Op1 =
Op->getOperand(1);
3184 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
3193 return DAG.
getNode(MipsISD::VSHF,
DL, ResTy, MaskVec, Op1, Op0);
3201 EVT ResTy =
Op->getValueType(0);
3207 SmallVector<int, 16> Indices;
3209 for (
int i = 0; i < ResTyNumElts; ++i)
3258 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3259 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3262 F->insert(It, Sink);
3267 Sink->transferSuccessorsAndUpdatePHIs(BB);
3293 MI.getOperand(0).getReg())
3299 MI.eraseFromParent();
3326 MachineBasicBlock *FBB =
F->CreateMachineBasicBlock(LLVM_BB);
3327 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3328 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3331 F->insert(It, Sink);
3336 Sink->transferSuccessorsAndUpdatePHIs(BB);
3362 MI.getOperand(0).getReg())
3368 MI.eraseFromParent();
3390 unsigned Lane =
MI.getOperand(2).getImm();
3405 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3406 : &Mips::MSA128WEvensRegClass);
3412 MI.eraseFromParent();
3435 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3447 MI.eraseFromParent();
3465 unsigned Lane =
MI.getOperand(2).getImm();
3468 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3469 : &Mips::MSA128WEvensRegClass);
3480 MI.eraseFromParent();
3500 unsigned Lane =
MI.getOperand(2).getImm();
3513 MI.eraseFromParent();
3544 Register SrcVecReg =
MI.getOperand(1).getReg();
3545 Register LaneReg =
MI.getOperand(2).getReg();
3546 Register SrcValReg =
MI.getOperand(3).getReg();
3551 Subtarget.isABI_N64() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3552 unsigned SubRegIdx =
Subtarget.isABI_N64() ? Mips::sub_32 : 0;
3553 unsigned ShiftOp =
Subtarget.isABI_N64() ? Mips::DSLL : Mips::SLL;
3554 unsigned EltLog2Size;
3555 unsigned InsertOp = 0;
3556 unsigned InsveOp = 0;
3557 switch (EltSizeInBytes) {
3562 InsertOp = Mips::INSERT_B;
3563 InsveOp = Mips::INSVE_B;
3564 VecRC = &Mips::MSA128BRegClass;
3568 InsertOp = Mips::INSERT_H;
3569 InsveOp = Mips::INSVE_H;
3570 VecRC = &Mips::MSA128HRegClass;
3574 InsertOp = Mips::INSERT_W;
3575 InsveOp = Mips::INSVE_W;
3576 VecRC = &Mips::MSA128WRegClass;
3580 InsertOp = Mips::INSERT_D;
3581 InsveOp = Mips::INSVE_D;
3582 VecRC = &Mips::MSA128DRegClass;
3590 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3595 if (EltSizeInBytes != 1) {
3608 .
addReg(LaneReg, {}, SubRegIdx);
3637 .
addReg(LaneTmp2, {}, SubRegIdx);
3639 MI.eraseFromParent();
3659 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3660 : &Mips::MSA128WEvensRegClass);
3662 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3663 : &Mips::MSA128WEvensRegClass);
3672 MI.eraseFromParent();
3703 MI.eraseFromParent();
3730 .
addReg(
MI.getOperand(1).getReg());
3732 MI.eraseFromParent();
3759 .
addReg(
MI.getOperand(1).getReg());
3761 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()
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.
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...
SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const
virtual void getOpndList(SmallVectorImpl< SDValue > &Ops, std::deque< std::pair< unsigned, SDValue > > &RegsToPass, bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage, bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const
This function fills Ops, which is the list of operands that will later be used when a function call n...
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.
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
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...
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 ...
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.