37#include "llvm/IR/IntrinsicsMips.h"
53#define DEBUG_TYPE "mips-isel"
56 cl::desc(
"Expand double precision loads and "
57 "stores to their single precision "
123 for (
const auto &VecTy : VecTys) {
418 if (VT == MVT::Untyped)
419 return Subtarget.hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
463 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
494 if (Ty != MVT::v8f16) {
521 EVT ResTy =
Op->getValueType(0);
528 return DAG.
getNode(MipsISD::FSELECT,
DL, ResTy, Tmp,
Op->getOperand(1),
535 if (
Op.getValueType() != MVT::f16)
550 EVT VT =
Op.getValueType();
552 assert((VT == MVT::i32 || VT == MVT::i64 || VT == MVT::i128) &&
553 "Unexpected result type for f16 -> integer conversion");
577 if (
Subtarget.systemSupportsUnalignedAccess()) {
602 switch(
Op.getOpcode()) {
605 case ISD::SMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
true, DAG);
606 case ISD::UMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Multu,
true,
true, DAG);
607 case ISD::MULHS:
return lowerMulDiv(
Op, MipsISD::Mult,
false,
true, DAG);
608 case ISD::MULHU:
return lowerMulDiv(
Op, MipsISD::Multu,
false,
true, DAG);
609 case ISD::MUL:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
false, DAG);
610 case ISD::SDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRem,
true,
true, DAG);
611 case ISD::UDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRemU,
true,
true,
621 return lowerINT_TO_FP(
Op, DAG);
624 return lowerFP_TO_INT(
Op, DAG);
627 return lowerR5900FPOp(
Op, DAG, RTLIB::ADD_F32);
629 return lowerR5900FPOp(
Op, DAG, RTLIB::SUB_F32);
631 return lowerR5900FPOp(
Op, DAG, RTLIB::MUL_F32);
633 return lowerR5900FPOp(
Op, DAG, RTLIB::DIV_F32);
635 return lowerR5900FPOp(
Op, DAG, RTLIB::SQRT_F32);
642 RTLIB::Libcall LC)
const {
646 if (Flags.hasNoNaNs() && Flags.hasNoInfs()) {
654 MVT VT =
Op.getSimpleValueType();
682 if (Op0Opcode == MipsISD::VEXTRACT_SEXT_ELT ||
683 Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT) {
689 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
691 if (Log2IfPositive <= 0)
697 unsigned Log2 = Log2IfPositive;
699 if ((Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT &&
Log2 >= ExtendTySize) ||
700 Log2 == ExtendTySize) {
702 return DAG.
getNode(MipsISD::VEXTRACT_ZEXT_ELT,
SDLoc(Op0),
726 APInt SplatValue, SplatUndef;
727 unsigned SplatBitSize;
730 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
744 N =
N->getOperand(0);
751 APInt SplatValue, SplatUndef;
752 unsigned SplatBitSize;
757 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
769 return N->getOperand(1) == OfNode;
772 return N->getOperand(0) == OfNode;
789 EVT Ty =
N->getValueType(0);
791 if (!Ty.is128BitVector())
802 bool IsLittleEndian = !Subtarget.
isLittle();
805 bool IsConstantMask =
false;
812 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
816 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
817 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
819 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
820 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
823 IsConstantMask =
true;
833 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
834 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
836 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
837 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
840 IsConstantMask =
true;
889 if (IsConstantMask) {
890 if (Mask.isAllOnes())
937 while (!WorkStack.
empty()) {
940 if (Val == 0 || Val == 1)
954 if ((Val - Floor).ule(Ceil - Val)) {
1002 if ((
C - Floor).ule(Ceil -
C)) {
1019 EVT VT =
N->getValueType(0);
1023 C->getAPIntValue(), VT, DAG, Subtarget))
1035 APInt SplatValue, SplatUndef;
1036 unsigned SplatBitSize;
1038 unsigned EltSize = Ty.getScalarSizeInBits();
1045 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
1047 (SplatBitSize != EltSize) ||
1059 EVT Ty =
N->getValueType(0);
1061 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1082 EVT Ty =
N->getValueType(0);
1084 if (Subtarget.
hasMSA()) {
1099 if (Op0Op0->
getOpcode() != MipsISD::VEXTRACT_SEXT_ELT &&
1100 Op0Op0->
getOpcode() != MipsISD::VEXTRACT_ZEXT_ELT)
1106 if (TotalBits == 32 ||
1107 (Op0Op0->
getOpcode() == MipsISD::VEXTRACT_SEXT_ELT &&
1111 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
SDLoc(Op0Op0),
1118 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
1128 EVT Ty =
N->getValueType(0);
1130 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
1137 bool IsV216 = (Ty == MVT::v2i16);
1150 default:
return false;
1155 EVT Ty =
N->getValueType(0);
1157 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1163 return DAG.
getNode(MipsISD::SETCC_DSP,
SDLoc(
N), Ty,
N->getOperand(0),
1164 N->getOperand(1),
N->getOperand(2));
1168 EVT Ty =
N->getValueType(0);
1170 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
1173 if (SetCC.
getOpcode() != MipsISD::SETCC_DSP)
1178 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
1186 EVT Ty =
N->getValueType(0);
1188 if (Subtarget.
hasMSA() && Ty.is128BitVector() && Ty.isInteger()) {
1216 switch (
N->getOpcode()) {
1244 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1255 switch (
MI.getOpcode()) {
1258 case Mips::BPOSGE32_PSEUDO:
1259 return emitBPOSGE32(
MI, BB);
1260 case Mips::SNZ_B_PSEUDO:
1261 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1262 case Mips::SNZ_H_PSEUDO:
1263 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1264 case Mips::SNZ_W_PSEUDO:
1265 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1266 case Mips::SNZ_D_PSEUDO:
1267 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1268 case Mips::SNZ_V_PSEUDO:
1269 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1270 case Mips::SZ_B_PSEUDO:
1271 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1272 case Mips::SZ_H_PSEUDO:
1273 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1274 case Mips::SZ_W_PSEUDO:
1275 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1276 case Mips::SZ_D_PSEUDO:
1277 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1278 case Mips::SZ_V_PSEUDO:
1279 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1280 case Mips::COPY_FW_PSEUDO:
1281 return emitCOPY_FW(
MI, BB);
1282 case Mips::COPY_FD_PSEUDO:
1283 return emitCOPY_FD(
MI, BB);
1284 case Mips::INSERT_FW_PSEUDO:
1285 return emitINSERT_FW(
MI, BB);
1286 case Mips::INSERT_FD_PSEUDO:
1287 return emitINSERT_FD(
MI, BB);
1288 case Mips::INSERT_B_VIDX_PSEUDO:
1289 case Mips::INSERT_B_VIDX64_PSEUDO:
1290 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1291 case Mips::INSERT_H_VIDX_PSEUDO:
1292 case Mips::INSERT_H_VIDX64_PSEUDO:
1293 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1294 case Mips::INSERT_W_VIDX_PSEUDO:
1295 case Mips::INSERT_W_VIDX64_PSEUDO:
1296 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1297 case Mips::INSERT_D_VIDX_PSEUDO:
1298 case Mips::INSERT_D_VIDX64_PSEUDO:
1299 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1300 case Mips::INSERT_FW_VIDX_PSEUDO:
1301 case Mips::INSERT_FW_VIDX64_PSEUDO:
1302 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1303 case Mips::INSERT_FD_VIDX_PSEUDO:
1304 case Mips::INSERT_FD_VIDX64_PSEUDO:
1305 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1306 case Mips::FILL_FW_PSEUDO:
1307 return emitFILL_FW(
MI, BB);
1308 case Mips::FILL_FD_PSEUDO:
1309 return emitFILL_FD(
MI, BB);
1310 case Mips::FEXP2_W_1_PSEUDO:
1311 return emitFEXP2_W_1(
MI, BB);
1312 case Mips::FEXP2_D_1_PSEUDO:
1313 return emitFEXP2_D_1(
MI, BB);
1315 return emitST_F16_PSEUDO(
MI, BB);
1317 return emitLD_F16_PSEUDO(
MI, BB);
1318 case Mips::MSA_FP_EXTEND_W_PSEUDO:
1319 return emitFPEXTEND_PSEUDO(
MI, BB,
false);
1320 case Mips::MSA_FP_ROUND_W_PSEUDO:
1321 return emitFPROUND_PSEUDO(
MI, BB,
false);
1322 case Mips::MSA_FP_EXTEND_D_PSEUDO:
1323 return emitFPEXTEND_PSEUDO(
MI, BB,
true);
1324 case Mips::MSA_FP_ROUND_D_PSEUDO:
1325 return emitFPROUND_PSEUDO(
MI, BB,
true);
1329bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1330 const CCState &CCInfo,
unsigned NextStackOffset,
1344void MipsSETargetLowering::
1346 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
1347 bool IsPICCall,
bool GlobalOrExternal,
bool InternalLinkage,
1348 bool IsCallReloc, CallLoweringInfo &CLI,
SDValue Callee,
1350 Ops.push_back(Callee);
1352 InternalLinkage, IsCallReloc, CLI, Callee,
1374 MVT::i32,
DL,
Lo.getValue(1), Ptr, MachinePointerInfo(),
1409 return DAG.
getStore(Chain,
DL,
Hi, Ptr, MachinePointerInfo(),
1417 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1418 MVT Dest =
Op.getValueType().getSimpleVT();
1421 if (Src == MVT::i64 && Dest == MVT::f64) {
1425 return DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1429 if (Src == MVT::f64 && Dest == MVT::i64) {
1436 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1439 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1449 bool HasLo,
bool HasHi,
1454 EVT Ty =
Op.getOperand(0).getValueType();
1457 Op.getOperand(0),
Op.getOperand(1));
1465 if (!HasLo || !HasHi)
1466 return HasLo ?
Lo :
Hi;
1474 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1475 return DAG.
getNode(MipsISD::MTLOHI,
DL, MVT::Untyped, InLo, InHi);
1498 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1504 Ops.push_back(
Op->getOperand(OpNo++));
1510 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1515 Ops.push_back(Opnd);
1518 for (++OpNo ; OpNo <
Op->getNumOperands(); ++OpNo)
1519 Ops.push_back(
Op->getOperand(OpNo));
1523 Ops.push_back(In64);
1528 for (
EVT Ty :
Op->values())
1529 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1548 EVT ResTy =
Op->getValueType(0);
1558 EVT ResVecTy =
Op->getValueType(0);
1559 EVT ViaVecTy = ResVecTy;
1569 if (ResVecTy == MVT::v2i64) {
1580 ViaVecTy = MVT::v4i32;
1586 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1587 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1592 if (ViaVecTy != ResVecTy) {
1602 bool IsSigned =
false) {
1605 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1606 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1612 EVT ViaVecTy = VecTy;
1613 SDValue SplatValueA = SplatValue;
1614 SDValue SplatValueB = SplatValue;
1617 if (VecTy == MVT::v2i64) {
1619 ViaVecTy = MVT::v4i32;
1632 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1633 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1634 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1635 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1640 if (VecTy != ViaVecTy)
1649 EVT VecTy =
Op->getValueType(0);
1655 if (VecTy == MVT::v2i64) {
1657 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1669 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1678 if (VecTy == MVT::v2i64)
1692 EVT ResTy =
Op->getValueType(0);
1695 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1704 EVT ResTy =
Op->getValueType(0);
1715 EVT ResTy =
Op->getValueType(0);
1717 <<
Op->getConstantOperandAPInt(2);
1726 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1727 switch (Intrinsic) {
1730 case Intrinsic::mips_shilo:
1732 case Intrinsic::mips_dpau_h_qbl:
1734 case Intrinsic::mips_dpau_h_qbr:
1736 case Intrinsic::mips_dpsu_h_qbl:
1738 case Intrinsic::mips_dpsu_h_qbr:
1740 case Intrinsic::mips_dpa_w_ph:
1742 case Intrinsic::mips_dps_w_ph:
1744 case Intrinsic::mips_dpax_w_ph:
1746 case Intrinsic::mips_dpsx_w_ph:
1748 case Intrinsic::mips_mulsa_w_ph:
1750 case Intrinsic::mips_mult:
1752 case Intrinsic::mips_multu:
1754 case Intrinsic::mips_madd:
1756 case Intrinsic::mips_maddu:
1758 case Intrinsic::mips_msub:
1760 case Intrinsic::mips_msubu:
1762 case Intrinsic::mips_addv_b:
1763 case Intrinsic::mips_addv_h:
1764 case Intrinsic::mips_addv_w:
1765 case Intrinsic::mips_addv_d:
1768 case Intrinsic::mips_addvi_b:
1769 case Intrinsic::mips_addvi_h:
1770 case Intrinsic::mips_addvi_w:
1771 case Intrinsic::mips_addvi_d:
1774 case Intrinsic::mips_and_v:
1777 case Intrinsic::mips_andi_b:
1780 case Intrinsic::mips_bclr_b:
1781 case Intrinsic::mips_bclr_h:
1782 case Intrinsic::mips_bclr_w:
1783 case Intrinsic::mips_bclr_d:
1785 case Intrinsic::mips_bclri_b:
1786 case Intrinsic::mips_bclri_h:
1787 case Intrinsic::mips_bclri_w:
1788 case Intrinsic::mips_bclri_d:
1790 case Intrinsic::mips_binsli_b:
1791 case Intrinsic::mips_binsli_h:
1792 case Intrinsic::mips_binsli_w:
1793 case Intrinsic::mips_binsli_d: {
1795 EVT VecTy =
Op->getValueType(0);
1800 Op->getConstantOperandVal(3) + 1);
1803 Op->getOperand(2),
Op->getOperand(1));
1805 case Intrinsic::mips_binsri_b:
1806 case Intrinsic::mips_binsri_h:
1807 case Intrinsic::mips_binsri_w:
1808 case Intrinsic::mips_binsri_d: {
1810 EVT VecTy =
Op->getValueType(0);
1815 Op->getConstantOperandVal(3) + 1);
1818 Op->getOperand(2),
Op->getOperand(1));
1820 case Intrinsic::mips_bmnz_v:
1822 Op->getOperand(2),
Op->getOperand(1));
1823 case Intrinsic::mips_bmnzi_b:
1827 case Intrinsic::mips_bmz_v:
1829 Op->getOperand(1),
Op->getOperand(2));
1830 case Intrinsic::mips_bmzi_b:
1834 case Intrinsic::mips_bneg_b:
1835 case Intrinsic::mips_bneg_h:
1836 case Intrinsic::mips_bneg_w:
1837 case Intrinsic::mips_bneg_d: {
1838 EVT VecTy =
Op->getValueType(0);
1845 case Intrinsic::mips_bnegi_b:
1846 case Intrinsic::mips_bnegi_h:
1847 case Intrinsic::mips_bnegi_w:
1848 case Intrinsic::mips_bnegi_d:
1851 case Intrinsic::mips_bnz_b:
1852 case Intrinsic::mips_bnz_h:
1853 case Intrinsic::mips_bnz_w:
1854 case Intrinsic::mips_bnz_d:
1855 return DAG.
getNode(MipsISD::VALL_NONZERO,
DL,
Op->getValueType(0),
1857 case Intrinsic::mips_bnz_v:
1858 return DAG.
getNode(MipsISD::VANY_NONZERO,
DL,
Op->getValueType(0),
1860 case Intrinsic::mips_bsel_v:
1863 Op->getOperand(1),
Op->getOperand(3),
1865 case Intrinsic::mips_bseli_b:
1870 case Intrinsic::mips_bset_b:
1871 case Intrinsic::mips_bset_h:
1872 case Intrinsic::mips_bset_w:
1873 case Intrinsic::mips_bset_d: {
1874 EVT VecTy =
Op->getValueType(0);
1881 case Intrinsic::mips_bseti_b:
1882 case Intrinsic::mips_bseti_h:
1883 case Intrinsic::mips_bseti_w:
1884 case Intrinsic::mips_bseti_d:
1887 case Intrinsic::mips_bz_b:
1888 case Intrinsic::mips_bz_h:
1889 case Intrinsic::mips_bz_w:
1890 case Intrinsic::mips_bz_d:
1891 return DAG.
getNode(MipsISD::VALL_ZERO,
DL,
Op->getValueType(0),
1893 case Intrinsic::mips_bz_v:
1894 return DAG.
getNode(MipsISD::VANY_ZERO,
DL,
Op->getValueType(0),
1896 case Intrinsic::mips_ceq_b:
1897 case Intrinsic::mips_ceq_h:
1898 case Intrinsic::mips_ceq_w:
1899 case Intrinsic::mips_ceq_d:
1902 case Intrinsic::mips_ceqi_b:
1903 case Intrinsic::mips_ceqi_h:
1904 case Intrinsic::mips_ceqi_w:
1905 case Intrinsic::mips_ceqi_d:
1908 case Intrinsic::mips_cle_s_b:
1909 case Intrinsic::mips_cle_s_h:
1910 case Intrinsic::mips_cle_s_w:
1911 case Intrinsic::mips_cle_s_d:
1914 case Intrinsic::mips_clei_s_b:
1915 case Intrinsic::mips_clei_s_h:
1916 case Intrinsic::mips_clei_s_w:
1917 case Intrinsic::mips_clei_s_d:
1920 case Intrinsic::mips_cle_u_b:
1921 case Intrinsic::mips_cle_u_h:
1922 case Intrinsic::mips_cle_u_w:
1923 case Intrinsic::mips_cle_u_d:
1926 case Intrinsic::mips_clei_u_b:
1927 case Intrinsic::mips_clei_u_h:
1928 case Intrinsic::mips_clei_u_w:
1929 case Intrinsic::mips_clei_u_d:
1932 case Intrinsic::mips_clt_s_b:
1933 case Intrinsic::mips_clt_s_h:
1934 case Intrinsic::mips_clt_s_w:
1935 case Intrinsic::mips_clt_s_d:
1938 case Intrinsic::mips_clti_s_b:
1939 case Intrinsic::mips_clti_s_h:
1940 case Intrinsic::mips_clti_s_w:
1941 case Intrinsic::mips_clti_s_d:
1944 case Intrinsic::mips_clt_u_b:
1945 case Intrinsic::mips_clt_u_h:
1946 case Intrinsic::mips_clt_u_w:
1947 case Intrinsic::mips_clt_u_d:
1950 case Intrinsic::mips_clti_u_b:
1951 case Intrinsic::mips_clti_u_h:
1952 case Intrinsic::mips_clti_u_w:
1953 case Intrinsic::mips_clti_u_d:
1956 case Intrinsic::mips_copy_s_b:
1957 case Intrinsic::mips_copy_s_h:
1958 case Intrinsic::mips_copy_s_w:
1960 case Intrinsic::mips_copy_s_d:
1968 Op->getValueType(0),
Op->getOperand(1),
1971 case Intrinsic::mips_copy_u_b:
1972 case Intrinsic::mips_copy_u_h:
1973 case Intrinsic::mips_copy_u_w:
1975 case Intrinsic::mips_copy_u_d:
1986 Op->getValueType(0),
Op->getOperand(1),
1989 case Intrinsic::mips_div_s_b:
1990 case Intrinsic::mips_div_s_h:
1991 case Intrinsic::mips_div_s_w:
1992 case Intrinsic::mips_div_s_d:
1995 case Intrinsic::mips_div_u_b:
1996 case Intrinsic::mips_div_u_h:
1997 case Intrinsic::mips_div_u_w:
1998 case Intrinsic::mips_div_u_d:
2001 case Intrinsic::mips_fadd_w:
2002 case Intrinsic::mips_fadd_d:
2007 case Intrinsic::mips_fceq_w:
2008 case Intrinsic::mips_fceq_d:
2011 case Intrinsic::mips_fcle_w:
2012 case Intrinsic::mips_fcle_d:
2015 case Intrinsic::mips_fclt_w:
2016 case Intrinsic::mips_fclt_d:
2019 case Intrinsic::mips_fcne_w:
2020 case Intrinsic::mips_fcne_d:
2023 case Intrinsic::mips_fcor_w:
2024 case Intrinsic::mips_fcor_d:
2027 case Intrinsic::mips_fcueq_w:
2028 case Intrinsic::mips_fcueq_d:
2031 case Intrinsic::mips_fcule_w:
2032 case Intrinsic::mips_fcule_d:
2035 case Intrinsic::mips_fcult_w:
2036 case Intrinsic::mips_fcult_d:
2039 case Intrinsic::mips_fcun_w:
2040 case Intrinsic::mips_fcun_d:
2043 case Intrinsic::mips_fcune_w:
2044 case Intrinsic::mips_fcune_d:
2047 case Intrinsic::mips_fdiv_w:
2048 case Intrinsic::mips_fdiv_d:
2052 case Intrinsic::mips_ffint_u_w:
2053 case Intrinsic::mips_ffint_u_d:
2056 case Intrinsic::mips_ffint_s_w:
2057 case Intrinsic::mips_ffint_s_d:
2060 case Intrinsic::mips_fill_b:
2061 case Intrinsic::mips_fill_h:
2062 case Intrinsic::mips_fill_w:
2063 case Intrinsic::mips_fill_d: {
2064 EVT ResTy =
Op->getValueType(0);
2072 case Intrinsic::mips_fexp2_w:
2073 case Intrinsic::mips_fexp2_d: {
2075 EVT ResTy =
Op->getValueType(0);
2080 case Intrinsic::mips_flog2_w:
2081 case Intrinsic::mips_flog2_d:
2083 case Intrinsic::mips_fmadd_w:
2084 case Intrinsic::mips_fmadd_d:
2086 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2087 case Intrinsic::mips_fmul_w:
2088 case Intrinsic::mips_fmul_d:
2092 case Intrinsic::mips_fmsub_w:
2093 case Intrinsic::mips_fmsub_d: {
2095 return DAG.
getNode(MipsISD::FMS, SDLoc(
Op),
Op->getValueType(0),
2096 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2098 case Intrinsic::mips_frint_w:
2099 case Intrinsic::mips_frint_d:
2101 case Intrinsic::mips_fsqrt_w:
2102 case Intrinsic::mips_fsqrt_d:
2104 case Intrinsic::mips_fsub_w:
2105 case Intrinsic::mips_fsub_d:
2109 case Intrinsic::mips_ftrunc_u_w:
2110 case Intrinsic::mips_ftrunc_u_d:
2113 case Intrinsic::mips_ftrunc_s_w:
2114 case Intrinsic::mips_ftrunc_s_d:
2117 case Intrinsic::mips_ilvev_b:
2118 case Intrinsic::mips_ilvev_h:
2119 case Intrinsic::mips_ilvev_w:
2120 case Intrinsic::mips_ilvev_d:
2121 return DAG.
getNode(MipsISD::ILVEV,
DL,
Op->getValueType(0),
2122 Op->getOperand(1),
Op->getOperand(2));
2123 case Intrinsic::mips_ilvl_b:
2124 case Intrinsic::mips_ilvl_h:
2125 case Intrinsic::mips_ilvl_w:
2126 case Intrinsic::mips_ilvl_d:
2127 return DAG.
getNode(MipsISD::ILVL,
DL,
Op->getValueType(0),
2128 Op->getOperand(1),
Op->getOperand(2));
2129 case Intrinsic::mips_ilvod_b:
2130 case Intrinsic::mips_ilvod_h:
2131 case Intrinsic::mips_ilvod_w:
2132 case Intrinsic::mips_ilvod_d:
2133 return DAG.
getNode(MipsISD::ILVOD,
DL,
Op->getValueType(0),
2134 Op->getOperand(1),
Op->getOperand(2));
2135 case Intrinsic::mips_ilvr_b:
2136 case Intrinsic::mips_ilvr_h:
2137 case Intrinsic::mips_ilvr_w:
2138 case Intrinsic::mips_ilvr_d:
2139 return DAG.
getNode(MipsISD::ILVR,
DL,
Op->getValueType(0),
2140 Op->getOperand(1),
Op->getOperand(2));
2141 case Intrinsic::mips_insert_b:
2142 case Intrinsic::mips_insert_h:
2143 case Intrinsic::mips_insert_w:
2144 case Intrinsic::mips_insert_d:
2146 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
2147 case Intrinsic::mips_insve_b:
2148 case Intrinsic::mips_insve_h:
2149 case Intrinsic::mips_insve_w:
2150 case Intrinsic::mips_insve_d: {
2153 switch (Intrinsic) {
2154 case Intrinsic::mips_insve_b:
Max = 15;
break;
2155 case Intrinsic::mips_insve_h:
Max = 7;
break;
2156 case Intrinsic::mips_insve_w:
Max = 3;
break;
2157 case Intrinsic::mips_insve_d:
Max = 1;
break;
2163 return DAG.
getNode(MipsISD::INSVE,
DL,
Op->getValueType(0),
2164 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
2167 case Intrinsic::mips_ldi_b:
2168 case Intrinsic::mips_ldi_h:
2169 case Intrinsic::mips_ldi_w:
2170 case Intrinsic::mips_ldi_d:
2172 case Intrinsic::mips_lsa:
2173 case Intrinsic::mips_dlsa: {
2174 EVT ResTy =
Op->getValueType(0);
2177 Op->getOperand(2),
Op->getOperand(3)));
2179 case Intrinsic::mips_maddv_b:
2180 case Intrinsic::mips_maddv_h:
2181 case Intrinsic::mips_maddv_w:
2182 case Intrinsic::mips_maddv_d: {
2183 EVT ResTy =
Op->getValueType(0);
2186 Op->getOperand(2),
Op->getOperand(3)));
2188 case Intrinsic::mips_max_s_b:
2189 case Intrinsic::mips_max_s_h:
2190 case Intrinsic::mips_max_s_w:
2191 case Intrinsic::mips_max_s_d:
2193 Op->getOperand(1),
Op->getOperand(2));
2194 case Intrinsic::mips_max_u_b:
2195 case Intrinsic::mips_max_u_h:
2196 case Intrinsic::mips_max_u_w:
2197 case Intrinsic::mips_max_u_d:
2199 Op->getOperand(1),
Op->getOperand(2));
2200 case Intrinsic::mips_maxi_s_b:
2201 case Intrinsic::mips_maxi_s_h:
2202 case Intrinsic::mips_maxi_s_w:
2203 case Intrinsic::mips_maxi_s_d:
2206 case Intrinsic::mips_maxi_u_b:
2207 case Intrinsic::mips_maxi_u_h:
2208 case Intrinsic::mips_maxi_u_w:
2209 case Intrinsic::mips_maxi_u_d:
2212 case Intrinsic::mips_min_s_b:
2213 case Intrinsic::mips_min_s_h:
2214 case Intrinsic::mips_min_s_w:
2215 case Intrinsic::mips_min_s_d:
2217 Op->getOperand(1),
Op->getOperand(2));
2218 case Intrinsic::mips_min_u_b:
2219 case Intrinsic::mips_min_u_h:
2220 case Intrinsic::mips_min_u_w:
2221 case Intrinsic::mips_min_u_d:
2223 Op->getOperand(1),
Op->getOperand(2));
2224 case Intrinsic::mips_mini_s_b:
2225 case Intrinsic::mips_mini_s_h:
2226 case Intrinsic::mips_mini_s_w:
2227 case Intrinsic::mips_mini_s_d:
2230 case Intrinsic::mips_mini_u_b:
2231 case Intrinsic::mips_mini_u_h:
2232 case Intrinsic::mips_mini_u_w:
2233 case Intrinsic::mips_mini_u_d:
2236 case Intrinsic::mips_mod_s_b:
2237 case Intrinsic::mips_mod_s_h:
2238 case Intrinsic::mips_mod_s_w:
2239 case Intrinsic::mips_mod_s_d:
2242 case Intrinsic::mips_mod_u_b:
2243 case Intrinsic::mips_mod_u_h:
2244 case Intrinsic::mips_mod_u_w:
2245 case Intrinsic::mips_mod_u_d:
2248 case Intrinsic::mips_mulv_b:
2249 case Intrinsic::mips_mulv_h:
2250 case Intrinsic::mips_mulv_w:
2251 case Intrinsic::mips_mulv_d:
2254 case Intrinsic::mips_msubv_b:
2255 case Intrinsic::mips_msubv_h:
2256 case Intrinsic::mips_msubv_w:
2257 case Intrinsic::mips_msubv_d: {
2258 EVT ResTy =
Op->getValueType(0);
2261 Op->getOperand(2),
Op->getOperand(3)));
2263 case Intrinsic::mips_nlzc_b:
2264 case Intrinsic::mips_nlzc_h:
2265 case Intrinsic::mips_nlzc_w:
2266 case Intrinsic::mips_nlzc_d:
2268 case Intrinsic::mips_nor_v: {
2270 Op->getOperand(1),
Op->getOperand(2));
2273 case Intrinsic::mips_nori_b: {
2279 case Intrinsic::mips_or_v:
2282 case Intrinsic::mips_ori_b:
2285 case Intrinsic::mips_pckev_b:
2286 case Intrinsic::mips_pckev_h:
2287 case Intrinsic::mips_pckev_w:
2288 case Intrinsic::mips_pckev_d:
2289 return DAG.
getNode(MipsISD::PCKEV,
DL,
Op->getValueType(0),
2290 Op->getOperand(1),
Op->getOperand(2));
2291 case Intrinsic::mips_pckod_b:
2292 case Intrinsic::mips_pckod_h:
2293 case Intrinsic::mips_pckod_w:
2294 case Intrinsic::mips_pckod_d:
2295 return DAG.
getNode(MipsISD::PCKOD,
DL,
Op->getValueType(0),
2296 Op->getOperand(1),
Op->getOperand(2));
2297 case Intrinsic::mips_pcnt_b:
2298 case Intrinsic::mips_pcnt_h:
2299 case Intrinsic::mips_pcnt_w:
2300 case Intrinsic::mips_pcnt_d:
2302 case Intrinsic::mips_sat_s_b:
2303 case Intrinsic::mips_sat_s_h:
2304 case Intrinsic::mips_sat_s_w:
2305 case Intrinsic::mips_sat_s_d:
2306 case Intrinsic::mips_sat_u_b:
2307 case Intrinsic::mips_sat_u_h:
2308 case Intrinsic::mips_sat_u_w:
2309 case Intrinsic::mips_sat_u_d: {
2312 switch (Intrinsic) {
2313 case Intrinsic::mips_sat_s_b:
2314 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2315 case Intrinsic::mips_sat_s_h:
2316 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2317 case Intrinsic::mips_sat_s_w:
2318 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2319 case Intrinsic::mips_sat_s_d:
2320 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2328 case Intrinsic::mips_shf_b:
2329 case Intrinsic::mips_shf_h:
2330 case Intrinsic::mips_shf_w: {
2334 return DAG.
getNode(MipsISD::SHF,
DL,
Op->getValueType(0),
2335 Op->getOperand(2),
Op->getOperand(1));
2337 case Intrinsic::mips_sldi_b:
2338 case Intrinsic::mips_sldi_h:
2339 case Intrinsic::mips_sldi_w:
2340 case Intrinsic::mips_sldi_d: {
2343 switch (Intrinsic) {
2344 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2345 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2346 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2347 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2355 case Intrinsic::mips_sll_b:
2356 case Intrinsic::mips_sll_h:
2357 case Intrinsic::mips_sll_w:
2358 case Intrinsic::mips_sll_d:
2361 case Intrinsic::mips_slli_b:
2362 case Intrinsic::mips_slli_h:
2363 case Intrinsic::mips_slli_w:
2364 case Intrinsic::mips_slli_d:
2367 case Intrinsic::mips_splat_b:
2368 case Intrinsic::mips_splat_h:
2369 case Intrinsic::mips_splat_w:
2370 case Intrinsic::mips_splat_d:
2375 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2378 case Intrinsic::mips_splati_b:
2379 case Intrinsic::mips_splati_h:
2380 case Intrinsic::mips_splati_w:
2381 case Intrinsic::mips_splati_d:
2382 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2385 case Intrinsic::mips_sra_b:
2386 case Intrinsic::mips_sra_h:
2387 case Intrinsic::mips_sra_w:
2388 case Intrinsic::mips_sra_d:
2391 case Intrinsic::mips_srai_b:
2392 case Intrinsic::mips_srai_h:
2393 case Intrinsic::mips_srai_w:
2394 case Intrinsic::mips_srai_d:
2397 case Intrinsic::mips_srari_b:
2398 case Intrinsic::mips_srari_h:
2399 case Intrinsic::mips_srari_w:
2400 case Intrinsic::mips_srari_d: {
2403 switch (Intrinsic) {
2404 case Intrinsic::mips_srari_b:
Max = 7;
break;
2405 case Intrinsic::mips_srari_h:
Max = 15;
break;
2406 case Intrinsic::mips_srari_w:
Max = 31;
break;
2407 case Intrinsic::mips_srari_d:
Max = 63;
break;
2415 case Intrinsic::mips_srl_b:
2416 case Intrinsic::mips_srl_h:
2417 case Intrinsic::mips_srl_w:
2418 case Intrinsic::mips_srl_d:
2421 case Intrinsic::mips_srli_b:
2422 case Intrinsic::mips_srli_h:
2423 case Intrinsic::mips_srli_w:
2424 case Intrinsic::mips_srli_d:
2427 case Intrinsic::mips_srlri_b:
2428 case Intrinsic::mips_srlri_h:
2429 case Intrinsic::mips_srlri_w:
2430 case Intrinsic::mips_srlri_d: {
2433 switch (Intrinsic) {
2434 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2435 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2436 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2437 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2445 case Intrinsic::mips_subv_b:
2446 case Intrinsic::mips_subv_h:
2447 case Intrinsic::mips_subv_w:
2448 case Intrinsic::mips_subv_d:
2451 case Intrinsic::mips_subvi_b:
2452 case Intrinsic::mips_subvi_h:
2453 case Intrinsic::mips_subvi_w:
2454 case Intrinsic::mips_subvi_d:
2457 case Intrinsic::mips_vshf_b:
2458 case Intrinsic::mips_vshf_h:
2459 case Intrinsic::mips_vshf_w:
2460 case Intrinsic::mips_vshf_d:
2461 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2462 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2463 case Intrinsic::mips_xor_v:
2466 case Intrinsic::mips_xori_b:
2469 case Intrinsic::thread_pointer: {
2471 return DAG.
getNode(MipsISD::ThreadPointer,
DL, PtrVT);
2482 EVT ResTy =
Op->getValueType(0);
2483 EVT PtrTy = Address->getValueType(0);
2498 unsigned Intr =
Op->getConstantOperandVal(1);
2502 case Intrinsic::mips_extp:
2504 case Intrinsic::mips_extpdp:
2506 case Intrinsic::mips_extr_w:
2508 case Intrinsic::mips_extr_r_w:
2510 case Intrinsic::mips_extr_rs_w:
2512 case Intrinsic::mips_extr_s_h:
2514 case Intrinsic::mips_mthlip:
2516 case Intrinsic::mips_mulsaq_s_w_ph:
2518 case Intrinsic::mips_maq_s_w_phl:
2520 case Intrinsic::mips_maq_s_w_phr:
2522 case Intrinsic::mips_maq_sa_w_phl:
2524 case Intrinsic::mips_maq_sa_w_phr:
2526 case Intrinsic::mips_dpaq_s_w_ph:
2528 case Intrinsic::mips_dpsq_s_w_ph:
2530 case Intrinsic::mips_dpaq_sa_l_w:
2532 case Intrinsic::mips_dpsq_sa_l_w:
2534 case Intrinsic::mips_dpaqx_s_w_ph:
2536 case Intrinsic::mips_dpaqx_sa_w_ph:
2538 case Intrinsic::mips_dpsqx_s_w_ph:
2540 case Intrinsic::mips_dpsqx_sa_w_ph:
2542 case Intrinsic::mips_ld_b:
2543 case Intrinsic::mips_ld_h:
2544 case Intrinsic::mips_ld_w:
2545 case Intrinsic::mips_ld_d:
2557 EVT PtrTy = Address->getValueType(0);
2573 unsigned Intr =
Op->getConstantOperandVal(1);
2577 case Intrinsic::mips_st_b:
2578 case Intrinsic::mips_st_h:
2579 case Intrinsic::mips_st_w:
2580 case Intrinsic::mips_st_d:
2595 EVT ResTy =
Op->getValueType(0);
2605 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
DL, ResTy, Op0, Op1,
2623 for (
unsigned i = 0; i <
Op->getNumOperands(); ++i)
2645 EVT ResTy =
Op->getValueType(0);
2647 APInt SplatValue, SplatUndef;
2648 unsigned SplatBitSize;
2654 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2656 !
Subtarget.isLittle()) && SplatBitSize <= 64) {
2658 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2670 switch (SplatBitSize) {
2674 ViaVecTy = MVT::v16i8;
2677 ViaVecTy = MVT::v8i16;
2680 ViaVecTy = MVT::v4i32;
2691 if (ViaVecTy != ResTy)
2701 EVT ResTy =
Node->getValueType(0);
2707 for (
unsigned i = 0; i < NumElts; ++i) {
2709 Node->getOperand(i),
2739 int SHFIndices[4] = { -1, -1, -1, -1 };
2741 if (Indices.
size() < 4)
2744 for (
unsigned i = 0; i < 4; ++i) {
2745 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2746 int Idx = Indices[j];
2752 if (Idx < 0 || Idx >= 4)
2758 if (SHFIndices[i] == -1)
2759 SHFIndices[i] = Idx;
2763 if (!(Idx == -1 || Idx == SHFIndices[i]))
2770 for (
int i = 3; i >= 0; --i) {
2771 int Idx = SHFIndices[i];
2781 return DAG.
getNode(MipsISD::SHF,
DL, ResTy,
2788template <
typename ValType>
2791 unsigned CheckStride,
2793 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2797 if (*
I != -1 && *
I != ExpectedIndex)
2799 ExpectedIndex += ExpectedIndexStride;
2803 for (
unsigned n = 0; n < CheckStride &&
I != End; ++n, ++
I)
2822 int SplatIndex = -1;
2823 for (
const auto &V : Indices) {
2856 const auto &Begin = Indices.
begin();
2857 const auto &End = Indices.
end();
2862 Wt =
Op->getOperand(0);
2864 Wt =
Op->getOperand(1);
2871 Ws =
Op->getOperand(0);
2873 Ws =
Op->getOperand(1);
2902 const auto &Begin = Indices.
begin();
2903 const auto &End = Indices.
end();
2908 Wt =
Op->getOperand(0);
2910 Wt =
Op->getOperand(1);
2917 Ws =
Op->getOperand(0);
2919 Ws =
Op->getOperand(1);
2949 const auto &Begin = Indices.
begin();
2950 const auto &End = Indices.
end();
2955 Wt =
Op->getOperand(0);
2957 Wt =
Op->getOperand(1);
2964 Ws =
Op->getOperand(0);
2966 Ws =
Op->getOperand(1);
2994 unsigned HalfSize = Indices.
size() / 2;
2997 const auto &Begin = Indices.
begin();
2998 const auto &End = Indices.
end();
3003 Wt =
Op->getOperand(0);
3005 Wt =
Op->getOperand(1);
3012 Ws =
Op->getOperand(0);
3015 Ws =
Op->getOperand(1);
3044 const auto &Begin = Indices.
begin();
3045 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3046 const auto &End = Indices.
end();
3049 Wt =
Op->getOperand(0);
3051 Wt =
Op->getOperand(1);
3056 Ws =
Op->getOperand(0);
3058 Ws =
Op->getOperand(1);
3087 const auto &Begin = Indices.
begin();
3088 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3089 const auto &End = Indices.
end();
3092 Wt =
Op->getOperand(0);
3094 Wt =
Op->getOperand(1);
3099 Ws =
Op->getOperand(0);
3101 Ws =
Op->getOperand(1);
3123 const bool isSPLATI,
3130 bool Using1stVec =
false;
3131 bool Using2ndVec =
false;
3135 assert(Indices[0] >= 0 &&
3136 "shuffle mask starts with an UNDEF, which is not expected");
3138 for (
int i = 0; i < ResTyNumElts; ++i) {
3140 int Idx = Indices[i];
3142 if (0 <= Idx && Idx < ResTyNumElts)
3144 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
3147 int LastValidIndex = 0;
3148 for (
size_t i = 0; i < Indices.
size(); i++) {
3149 int Idx = Indices[i];
3152 Idx = isSPLATI ? Indices[0] : LastValidIndex;
3154 LastValidIndex = Idx;
3161 if (Using1stVec && Using2ndVec) {
3162 Op0 =
Op->getOperand(0);
3163 Op1 =
Op->getOperand(1);
3164 }
else if (Using1stVec)
3165 Op0 = Op1 =
Op->getOperand(0);
3166 else if (Using2ndVec)
3167 Op0 = Op1 =
Op->getOperand(1);
3169 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
3178 return DAG.
getNode(MipsISD::VSHF,
DL, ResTy, MaskVec, Op1, Op0);
3186 EVT ResTy =
Op->getValueType(0);
3192 SmallVector<int, 16> Indices;
3194 for (
int i = 0; i < ResTyNumElts; ++i)
3237 const TargetRegisterClass *RC = &Mips::GPR32RegClass;
3243 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3244 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3247 F->insert(It, Sink);
3252 Sink->transferSuccessorsAndUpdatePHIs(BB);
3278 MI.getOperand(0).getReg())
3284 MI.eraseFromParent();
3306 const TargetRegisterClass *RC = &Mips::GPR32RegClass;
3311 MachineBasicBlock *FBB =
F->CreateMachineBasicBlock(LLVM_BB);
3312 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3313 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3316 F->insert(It, Sink);
3321 Sink->transferSuccessorsAndUpdatePHIs(BB);
3347 MI.getOperand(0).getReg())
3353 MI.eraseFromParent();
3375 unsigned Lane =
MI.getOperand(2).getImm();
3390 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3391 : &Mips::MSA128WEvensRegClass);
3397 MI.eraseFromParent();
3420 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3432 MI.eraseFromParent();
3450 unsigned Lane =
MI.getOperand(2).getImm();
3453 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3454 : &Mips::MSA128WEvensRegClass);
3465 MI.eraseFromParent();
3485 unsigned Lane =
MI.getOperand(2).getImm();
3498 MI.eraseFromParent();
3529 Register SrcVecReg =
MI.getOperand(1).getReg();
3530 Register LaneReg =
MI.getOperand(2).getReg();
3531 Register SrcValReg =
MI.getOperand(3).getReg();
3533 const TargetRegisterClass *VecRC =
nullptr;
3535 const TargetRegisterClass *GPRRC =
3536 Subtarget.isABI_N64() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3537 unsigned SubRegIdx =
Subtarget.isABI_N64() ? Mips::sub_32 : 0;
3538 unsigned ShiftOp =
Subtarget.isABI_N64() ? Mips::DSLL : Mips::SLL;
3539 unsigned EltLog2Size;
3540 unsigned InsertOp = 0;
3541 unsigned InsveOp = 0;
3542 switch (EltSizeInBytes) {
3547 InsertOp = Mips::INSERT_B;
3548 InsveOp = Mips::INSVE_B;
3549 VecRC = &Mips::MSA128BRegClass;
3553 InsertOp = Mips::INSERT_H;
3554 InsveOp = Mips::INSVE_H;
3555 VecRC = &Mips::MSA128HRegClass;
3559 InsertOp = Mips::INSERT_W;
3560 InsveOp = Mips::INSVE_W;
3561 VecRC = &Mips::MSA128WRegClass;
3565 InsertOp = Mips::INSERT_D;
3566 InsveOp = Mips::INSVE_D;
3567 VecRC = &Mips::MSA128DRegClass;
3575 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3580 if (EltSizeInBytes != 1) {
3593 .
addReg(LaneReg, {}, SubRegIdx);
3622 .
addReg(LaneTmp2, {}, SubRegIdx);
3624 MI.eraseFromParent();
3644 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3645 : &Mips::MSA128WEvensRegClass);
3647 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3648 : &Mips::MSA128WEvensRegClass);
3657 MI.eraseFromParent();
3688 MI.eraseFromParent();
3712 const MachineMemOperand &MMO = **
MI.memoperands_begin();
3718 const TargetRegisterClass *RC =
3719 MI.getOperand(1).isReg() ? RegInfo.
getRegClass(
MI.getOperand(1).getReg())
3720 : (
Subtarget.isABI_O32() ? &Mips::GPR32RegClass
3721 : &Mips::GPR64RegClass);
3722 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3733 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::SH : Mips::SH64))
3740 MI.eraseFromParent();
3769 const TargetRegisterClass *RC =
3770 MI.getOperand(1).isReg() ? RegInfo.
getRegClass(
MI.getOperand(1).getReg())
3771 : (
Subtarget.isABI_O32() ? &Mips::GPR32RegClass
3772 : &Mips::GPR64RegClass);
3774 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3777 MachineInstrBuilder MIB =
3778 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::LH : Mips::LH64), Rt);
3785 .
addReg(Rt, {}, Mips::sub_32);
3791 MI.eraseFromParent();
3847 bool IsFGR64)
const {
3854 bool IsFGR64onMips64 =
Subtarget.hasMips64() && IsFGR64;
3855 bool IsFGR64onMips32 = !
Subtarget.hasMips64() && IsFGR64;
3864 const TargetRegisterClass *GPRRC =
3865 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3866 unsigned MFC1Opc = IsFGR64onMips64
3868 : (IsFGR64onMips32 ? Mips::MFC1_D64 : Mips::MFC1);
3869 unsigned FILLOpc = IsFGR64onMips64 ? Mips::FILL_D : Mips::FILL_W;
3875 unsigned WPHI = Wtemp;
3877 if (IsFGR64onMips32) {
3903 MI.eraseFromParent();
3952 bool IsFGR64)
const {
3959 bool IsFGR64onMips64 =
Subtarget.hasMips64() && IsFGR64;
3960 bool IsFGR64onMips32 = !
Subtarget.hasMips64() && IsFGR64;
3968 const TargetRegisterClass *GPRRC =
3969 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3970 unsigned MTC1Opc = IsFGR64onMips64
3972 : (IsFGR64onMips32 ? Mips::MTC1_D64 : Mips::MTC1);
3973 Register COPYOpc = IsFGR64onMips64 ? Mips::COPY_S_D : Mips::COPY_S_W;
3992 if (IsFGR64onMips32) {
4002 MI.eraseFromParent();
4017 const TargetRegisterClass *RC = &Mips::MSA128WRegClass;
4029 .
addReg(
MI.getOperand(1).getReg());
4031 MI.eraseFromParent();
4046 const TargetRegisterClass *RC = &Mips::MSA128DRegClass;
4058 .
addReg(
MI.getOperand(1).getReg());
4060 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
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 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
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
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 & add(const MachineOperand &MO) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
LocationSize getSize() const
Return the size in bytes of the memory reference.
Flags
Flags values. These may be or'd together.
Flags getFlags() const
Return the raw flags of the source value,.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
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.
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
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 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 getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
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.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
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...
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.
bool isTypeLegal(EVT VT) const
Return true if the target has native support 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 ...
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
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.
@ Fast
Attempts to make calls as fast as possible (e.g.
@ C
The default llvm calling convention, compatible with C.
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
@ 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.
@ 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.
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ 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) ...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ 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.
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
@ 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.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
FunctionAddr VTableAddr Value
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.
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...
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.
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.