37#include "llvm/IR/IntrinsicsMips.h"
53#define DEBUG_TYPE "mips-isel"
60 cl::desc(
"Expand double precision loads and "
61 "stores to their single precision "
127 for (
const auto &VecTy : VecTys) {
357 if (VT == MVT::Untyped)
358 return Subtarget.hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
402 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
433 if (Ty != MVT::v8f16) {
460 EVT ResTy =
Op->getValueType(0);
475 if (
Subtarget.systemSupportsUnalignedAccess()) {
500 switch(
Op.getOpcode()) {
501 case ISD::LOAD:
return lowerLOAD(
Op, DAG);
502 case ISD::STORE:
return lowerSTORE(
Op, DAG);
518 case ISD::BITCAST:
return lowerBITCAST(
Op, DAG);
552 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
554 if (Log2IfPositive <= 0)
560 unsigned Log2 = Log2IfPositive;
563 Log2 == ExtendTySize) {
589 APInt SplatValue, SplatUndef;
590 unsigned SplatBitSize;
593 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
606 if (
N->getOpcode() == ISD::BITCAST)
607 N =
N->getOperand(0);
614 APInt SplatValue, SplatUndef;
615 unsigned SplatBitSize;
620 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
632 return N->getOperand(1) == OfNode;
635 return N->getOperand(0) == OfNode;
652 EVT Ty =
N->getValueType(0);
654 if (!Ty.is128BitVector())
665 bool IsLittleEndian = !Subtarget.
isLittle();
668 bool IsConstantMask =
false;
675 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
679 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
680 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
682 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
683 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
686 IsConstantMask =
true;
696 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
697 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
699 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
700 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
703 IsConstantMask =
true;
752 if (IsConstantMask) {
753 if (Mask.isAllOnes())
800 while (!WorkStack.
empty()) {
803 if (Val == 0 || Val == 1)
817 if ((Val - Floor).ule(Ceil - Val)) {
865 if ((
C - Floor).ule(Ceil -
C)) {
882 EVT VT =
N->getValueType(0);
886 C->getAPIntValue(), VT, DAG, Subtarget))
898 APInt SplatValue, SplatUndef;
899 unsigned SplatBitSize;
901 unsigned EltSize = Ty.getScalarSizeInBits();
908 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
910 (SplatBitSize != EltSize) ||
922 EVT Ty =
N->getValueType(0);
924 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
945 EVT Ty =
N->getValueType(0);
969 if (TotalBits == 32 ||
981 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
991 EVT Ty =
N->getValueType(0);
993 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
1000 bool IsV216 = (Ty == MVT::v2i16);
1013 default:
return false;
1018 EVT Ty =
N->getValueType(0);
1020 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1027 N->getOperand(1),
N->getOperand(2));
1031 EVT Ty =
N->getValueType(0);
1033 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
1041 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
1049 EVT Ty =
N->getValueType(0);
1051 if (Subtarget.
hasMSA() && Ty.is128BitVector() && Ty.isInteger()) {
1079 switch (
N->getOpcode()) {
1107 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1118 switch (
MI.getOpcode()) {
1121 case Mips::BPOSGE32_PSEUDO:
1122 return emitBPOSGE32(
MI, BB);
1123 case Mips::SNZ_B_PSEUDO:
1124 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1125 case Mips::SNZ_H_PSEUDO:
1126 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1127 case Mips::SNZ_W_PSEUDO:
1128 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1129 case Mips::SNZ_D_PSEUDO:
1130 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1131 case Mips::SNZ_V_PSEUDO:
1132 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1133 case Mips::SZ_B_PSEUDO:
1134 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1135 case Mips::SZ_H_PSEUDO:
1136 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1137 case Mips::SZ_W_PSEUDO:
1138 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1139 case Mips::SZ_D_PSEUDO:
1140 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1141 case Mips::SZ_V_PSEUDO:
1142 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1143 case Mips::COPY_FW_PSEUDO:
1144 return emitCOPY_FW(
MI, BB);
1145 case Mips::COPY_FD_PSEUDO:
1146 return emitCOPY_FD(
MI, BB);
1147 case Mips::INSERT_FW_PSEUDO:
1148 return emitINSERT_FW(
MI, BB);
1149 case Mips::INSERT_FD_PSEUDO:
1150 return emitINSERT_FD(
MI, BB);
1151 case Mips::INSERT_B_VIDX_PSEUDO:
1152 case Mips::INSERT_B_VIDX64_PSEUDO:
1153 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1154 case Mips::INSERT_H_VIDX_PSEUDO:
1155 case Mips::INSERT_H_VIDX64_PSEUDO:
1156 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1157 case Mips::INSERT_W_VIDX_PSEUDO:
1158 case Mips::INSERT_W_VIDX64_PSEUDO:
1159 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1160 case Mips::INSERT_D_VIDX_PSEUDO:
1161 case Mips::INSERT_D_VIDX64_PSEUDO:
1162 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1163 case Mips::INSERT_FW_VIDX_PSEUDO:
1164 case Mips::INSERT_FW_VIDX64_PSEUDO:
1165 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1166 case Mips::INSERT_FD_VIDX_PSEUDO:
1167 case Mips::INSERT_FD_VIDX64_PSEUDO:
1168 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1169 case Mips::FILL_FW_PSEUDO:
1170 return emitFILL_FW(
MI, BB);
1171 case Mips::FILL_FD_PSEUDO:
1172 return emitFILL_FD(
MI, BB);
1173 case Mips::FEXP2_W_1_PSEUDO:
1174 return emitFEXP2_W_1(
MI, BB);
1175 case Mips::FEXP2_D_1_PSEUDO:
1176 return emitFEXP2_D_1(
MI, BB);
1178 return emitST_F16_PSEUDO(
MI, BB);
1180 return emitLD_F16_PSEUDO(
MI, BB);
1181 case Mips::MSA_FP_EXTEND_W_PSEUDO:
1182 return emitFPEXTEND_PSEUDO(
MI, BB,
false);
1183 case Mips::MSA_FP_ROUND_W_PSEUDO:
1184 return emitFPROUND_PSEUDO(
MI, BB,
false);
1185 case Mips::MSA_FP_EXTEND_D_PSEUDO:
1186 return emitFPEXTEND_PSEUDO(
MI, BB,
true);
1187 case Mips::MSA_FP_ROUND_D_PSEUDO:
1188 return emitFPROUND_PSEUDO(
MI, BB,
true);
1192bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1193 const CCState &CCInfo,
unsigned NextStackOffset,
1211void MipsSETargetLowering::
1213 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
1214 bool IsPICCall,
bool GlobalOrExternal,
bool InternalLinkage,
1215 bool IsCallReloc, CallLoweringInfo &CLI,
SDValue Callee,
1217 Ops.push_back(Callee);
1219 InternalLinkage, IsCallReloc, CLI, Callee,
1241 MVT::i32,
DL,
Lo.getValue(1),
Ptr, MachinePointerInfo(),
1261 EVT PtrVT =
Ptr.getValueType();
1284 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1285 MVT Dest =
Op.getValueType().getSimpleVT();
1288 if (Src == MVT::i64 && Dest == MVT::f64) {
1296 if (Src == MVT::f64 && Dest == MVT::i64) {
1316 bool HasLo,
bool HasHi,
1321 EVT Ty =
Op.getOperand(0).getValueType();
1324 Op.getOperand(0),
Op.getOperand(1));
1332 if (!HasLo || !HasHi)
1333 return HasLo ?
Lo :
Hi;
1341 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1365 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1371 Ops.push_back(
Op->getOperand(OpNo++));
1377 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1382 Ops.push_back(Opnd);
1385 for (++OpNo ; OpNo <
Op->getNumOperands(); ++OpNo)
1386 Ops.push_back(
Op->getOperand(OpNo));
1390 Ops.push_back(In64);
1395 for (
EVT Ty :
Op->values())
1396 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1415 EVT ResTy =
Op->getValueType(0);
1425 EVT ResVecTy =
Op->getValueType(0);
1426 EVT ViaVecTy = ResVecTy;
1436 if (ResVecTy == MVT::v2i64) {
1447 ViaVecTy = MVT::v4i32;
1453 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1454 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1459 if (ViaVecTy != ResVecTy) {
1461 Result = DAG.
getNode(ISD::BITCAST,
DL, ResVecTy,
1469 bool IsSigned =
false) {
1472 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1473 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1479 EVT ViaVecTy = VecTy;
1480 SDValue SplatValueA = SplatValue;
1481 SDValue SplatValueB = SplatValue;
1484 if (VecTy == MVT::v2i64) {
1486 ViaVecTy = MVT::v4i32;
1499 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1500 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1501 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1502 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1507 if (VecTy != ViaVecTy)
1508 Result = DAG.
getNode(ISD::BITCAST,
DL, VecTy, Result);
1516 EVT VecTy =
Op->getValueType(0);
1522 if (VecTy == MVT::v2i64) {
1524 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1534 ISD::BITCAST,
DL, MVT::v2i64,
1536 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1545 if (VecTy == MVT::v2i64)
1559 EVT ResTy =
Op->getValueType(0);
1562 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1571 EVT ResTy =
Op->getValueType(0);
1582 EVT ResTy =
Op->getValueType(0);
1584 <<
Op->getConstantOperandAPInt(2);
1593 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1594 switch (Intrinsic) {
1597 case Intrinsic::mips_shilo:
1599 case Intrinsic::mips_dpau_h_qbl:
1601 case Intrinsic::mips_dpau_h_qbr:
1603 case Intrinsic::mips_dpsu_h_qbl:
1605 case Intrinsic::mips_dpsu_h_qbr:
1607 case Intrinsic::mips_dpa_w_ph:
1609 case Intrinsic::mips_dps_w_ph:
1611 case Intrinsic::mips_dpax_w_ph:
1613 case Intrinsic::mips_dpsx_w_ph:
1615 case Intrinsic::mips_mulsa_w_ph:
1617 case Intrinsic::mips_mult:
1619 case Intrinsic::mips_multu:
1621 case Intrinsic::mips_madd:
1623 case Intrinsic::mips_maddu:
1625 case Intrinsic::mips_msub:
1627 case Intrinsic::mips_msubu:
1629 case Intrinsic::mips_addv_b:
1630 case Intrinsic::mips_addv_h:
1631 case Intrinsic::mips_addv_w:
1632 case Intrinsic::mips_addv_d:
1635 case Intrinsic::mips_addvi_b:
1636 case Intrinsic::mips_addvi_h:
1637 case Intrinsic::mips_addvi_w:
1638 case Intrinsic::mips_addvi_d:
1641 case Intrinsic::mips_and_v:
1644 case Intrinsic::mips_andi_b:
1647 case Intrinsic::mips_bclr_b:
1648 case Intrinsic::mips_bclr_h:
1649 case Intrinsic::mips_bclr_w:
1650 case Intrinsic::mips_bclr_d:
1652 case Intrinsic::mips_bclri_b:
1653 case Intrinsic::mips_bclri_h:
1654 case Intrinsic::mips_bclri_w:
1655 case Intrinsic::mips_bclri_d:
1657 case Intrinsic::mips_binsli_b:
1658 case Intrinsic::mips_binsli_h:
1659 case Intrinsic::mips_binsli_w:
1660 case Intrinsic::mips_binsli_d: {
1662 EVT VecTy =
Op->getValueType(0);
1667 Op->getConstantOperandVal(3) + 1);
1670 Op->getOperand(2),
Op->getOperand(1));
1672 case Intrinsic::mips_binsri_b:
1673 case Intrinsic::mips_binsri_h:
1674 case Intrinsic::mips_binsri_w:
1675 case Intrinsic::mips_binsri_d: {
1677 EVT VecTy =
Op->getValueType(0);
1682 Op->getConstantOperandVal(3) + 1);
1685 Op->getOperand(2),
Op->getOperand(1));
1687 case Intrinsic::mips_bmnz_v:
1689 Op->getOperand(2),
Op->getOperand(1));
1690 case Intrinsic::mips_bmnzi_b:
1694 case Intrinsic::mips_bmz_v:
1696 Op->getOperand(1),
Op->getOperand(2));
1697 case Intrinsic::mips_bmzi_b:
1701 case Intrinsic::mips_bneg_b:
1702 case Intrinsic::mips_bneg_h:
1703 case Intrinsic::mips_bneg_w:
1704 case Intrinsic::mips_bneg_d: {
1705 EVT VecTy =
Op->getValueType(0);
1712 case Intrinsic::mips_bnegi_b:
1713 case Intrinsic::mips_bnegi_h:
1714 case Intrinsic::mips_bnegi_w:
1715 case Intrinsic::mips_bnegi_d:
1718 case Intrinsic::mips_bnz_b:
1719 case Intrinsic::mips_bnz_h:
1720 case Intrinsic::mips_bnz_w:
1721 case Intrinsic::mips_bnz_d:
1724 case Intrinsic::mips_bnz_v:
1727 case Intrinsic::mips_bsel_v:
1730 Op->getOperand(1),
Op->getOperand(3),
1732 case Intrinsic::mips_bseli_b:
1737 case Intrinsic::mips_bset_b:
1738 case Intrinsic::mips_bset_h:
1739 case Intrinsic::mips_bset_w:
1740 case Intrinsic::mips_bset_d: {
1741 EVT VecTy =
Op->getValueType(0);
1748 case Intrinsic::mips_bseti_b:
1749 case Intrinsic::mips_bseti_h:
1750 case Intrinsic::mips_bseti_w:
1751 case Intrinsic::mips_bseti_d:
1754 case Intrinsic::mips_bz_b:
1755 case Intrinsic::mips_bz_h:
1756 case Intrinsic::mips_bz_w:
1757 case Intrinsic::mips_bz_d:
1760 case Intrinsic::mips_bz_v:
1763 case Intrinsic::mips_ceq_b:
1764 case Intrinsic::mips_ceq_h:
1765 case Intrinsic::mips_ceq_w:
1766 case Intrinsic::mips_ceq_d:
1769 case Intrinsic::mips_ceqi_b:
1770 case Intrinsic::mips_ceqi_h:
1771 case Intrinsic::mips_ceqi_w:
1772 case Intrinsic::mips_ceqi_d:
1775 case Intrinsic::mips_cle_s_b:
1776 case Intrinsic::mips_cle_s_h:
1777 case Intrinsic::mips_cle_s_w:
1778 case Intrinsic::mips_cle_s_d:
1781 case Intrinsic::mips_clei_s_b:
1782 case Intrinsic::mips_clei_s_h:
1783 case Intrinsic::mips_clei_s_w:
1784 case Intrinsic::mips_clei_s_d:
1787 case Intrinsic::mips_cle_u_b:
1788 case Intrinsic::mips_cle_u_h:
1789 case Intrinsic::mips_cle_u_w:
1790 case Intrinsic::mips_cle_u_d:
1793 case Intrinsic::mips_clei_u_b:
1794 case Intrinsic::mips_clei_u_h:
1795 case Intrinsic::mips_clei_u_w:
1796 case Intrinsic::mips_clei_u_d:
1799 case Intrinsic::mips_clt_s_b:
1800 case Intrinsic::mips_clt_s_h:
1801 case Intrinsic::mips_clt_s_w:
1802 case Intrinsic::mips_clt_s_d:
1805 case Intrinsic::mips_clti_s_b:
1806 case Intrinsic::mips_clti_s_h:
1807 case Intrinsic::mips_clti_s_w:
1808 case Intrinsic::mips_clti_s_d:
1811 case Intrinsic::mips_clt_u_b:
1812 case Intrinsic::mips_clt_u_h:
1813 case Intrinsic::mips_clt_u_w:
1814 case Intrinsic::mips_clt_u_d:
1817 case Intrinsic::mips_clti_u_b:
1818 case Intrinsic::mips_clti_u_h:
1819 case Intrinsic::mips_clti_u_w:
1820 case Intrinsic::mips_clti_u_d:
1823 case Intrinsic::mips_copy_s_b:
1824 case Intrinsic::mips_copy_s_h:
1825 case Intrinsic::mips_copy_s_w:
1827 case Intrinsic::mips_copy_s_d:
1835 Op->getValueType(0),
Op->getOperand(1),
1838 case Intrinsic::mips_copy_u_b:
1839 case Intrinsic::mips_copy_u_h:
1840 case Intrinsic::mips_copy_u_w:
1842 case Intrinsic::mips_copy_u_d:
1853 Op->getValueType(0),
Op->getOperand(1),
1856 case Intrinsic::mips_div_s_b:
1857 case Intrinsic::mips_div_s_h:
1858 case Intrinsic::mips_div_s_w:
1859 case Intrinsic::mips_div_s_d:
1862 case Intrinsic::mips_div_u_b:
1863 case Intrinsic::mips_div_u_h:
1864 case Intrinsic::mips_div_u_w:
1865 case Intrinsic::mips_div_u_d:
1868 case Intrinsic::mips_fadd_w:
1869 case Intrinsic::mips_fadd_d:
1874 case Intrinsic::mips_fceq_w:
1875 case Intrinsic::mips_fceq_d:
1878 case Intrinsic::mips_fcle_w:
1879 case Intrinsic::mips_fcle_d:
1882 case Intrinsic::mips_fclt_w:
1883 case Intrinsic::mips_fclt_d:
1886 case Intrinsic::mips_fcne_w:
1887 case Intrinsic::mips_fcne_d:
1890 case Intrinsic::mips_fcor_w:
1891 case Intrinsic::mips_fcor_d:
1894 case Intrinsic::mips_fcueq_w:
1895 case Intrinsic::mips_fcueq_d:
1898 case Intrinsic::mips_fcule_w:
1899 case Intrinsic::mips_fcule_d:
1902 case Intrinsic::mips_fcult_w:
1903 case Intrinsic::mips_fcult_d:
1906 case Intrinsic::mips_fcun_w:
1907 case Intrinsic::mips_fcun_d:
1910 case Intrinsic::mips_fcune_w:
1911 case Intrinsic::mips_fcune_d:
1914 case Intrinsic::mips_fdiv_w:
1915 case Intrinsic::mips_fdiv_d:
1919 case Intrinsic::mips_ffint_u_w:
1920 case Intrinsic::mips_ffint_u_d:
1923 case Intrinsic::mips_ffint_s_w:
1924 case Intrinsic::mips_ffint_s_d:
1927 case Intrinsic::mips_fill_b:
1928 case Intrinsic::mips_fill_h:
1929 case Intrinsic::mips_fill_w:
1930 case Intrinsic::mips_fill_d: {
1931 EVT ResTy =
Op->getValueType(0);
1939 case Intrinsic::mips_fexp2_w:
1940 case Intrinsic::mips_fexp2_d: {
1942 EVT ResTy =
Op->getValueType(0);
1945 DAG.
getNode(ISD::FEXP2, SDLoc(
Op), ResTy,
Op->getOperand(2)));
1947 case Intrinsic::mips_flog2_w:
1948 case Intrinsic::mips_flog2_d:
1949 return DAG.
getNode(ISD::FLOG2,
DL,
Op->getValueType(0),
Op->getOperand(1));
1950 case Intrinsic::mips_fmadd_w:
1951 case Intrinsic::mips_fmadd_d:
1953 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
1954 case Intrinsic::mips_fmul_w:
1955 case Intrinsic::mips_fmul_d:
1959 case Intrinsic::mips_fmsub_w:
1960 case Intrinsic::mips_fmsub_d: {
1963 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
1965 case Intrinsic::mips_frint_w:
1966 case Intrinsic::mips_frint_d:
1967 return DAG.
getNode(ISD::FRINT,
DL,
Op->getValueType(0),
Op->getOperand(1));
1968 case Intrinsic::mips_fsqrt_w:
1969 case Intrinsic::mips_fsqrt_d:
1970 return DAG.
getNode(ISD::FSQRT,
DL,
Op->getValueType(0),
Op->getOperand(1));
1971 case Intrinsic::mips_fsub_w:
1972 case Intrinsic::mips_fsub_d:
1976 case Intrinsic::mips_ftrunc_u_w:
1977 case Intrinsic::mips_ftrunc_u_d:
1980 case Intrinsic::mips_ftrunc_s_w:
1981 case Intrinsic::mips_ftrunc_s_d:
1984 case Intrinsic::mips_ilvev_b:
1985 case Intrinsic::mips_ilvev_h:
1986 case Intrinsic::mips_ilvev_w:
1987 case Intrinsic::mips_ilvev_d:
1989 Op->getOperand(1),
Op->getOperand(2));
1990 case Intrinsic::mips_ilvl_b:
1991 case Intrinsic::mips_ilvl_h:
1992 case Intrinsic::mips_ilvl_w:
1993 case Intrinsic::mips_ilvl_d:
1995 Op->getOperand(1),
Op->getOperand(2));
1996 case Intrinsic::mips_ilvod_b:
1997 case Intrinsic::mips_ilvod_h:
1998 case Intrinsic::mips_ilvod_w:
1999 case Intrinsic::mips_ilvod_d:
2001 Op->getOperand(1),
Op->getOperand(2));
2002 case Intrinsic::mips_ilvr_b:
2003 case Intrinsic::mips_ilvr_h:
2004 case Intrinsic::mips_ilvr_w:
2005 case Intrinsic::mips_ilvr_d:
2007 Op->getOperand(1),
Op->getOperand(2));
2008 case Intrinsic::mips_insert_b:
2009 case Intrinsic::mips_insert_h:
2010 case Intrinsic::mips_insert_w:
2011 case Intrinsic::mips_insert_d:
2013 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
2014 case Intrinsic::mips_insve_b:
2015 case Intrinsic::mips_insve_h:
2016 case Intrinsic::mips_insve_w:
2017 case Intrinsic::mips_insve_d: {
2020 switch (Intrinsic) {
2021 case Intrinsic::mips_insve_b:
Max = 15;
break;
2022 case Intrinsic::mips_insve_h:
Max = 7;
break;
2023 case Intrinsic::mips_insve_w:
Max = 3;
break;
2024 case Intrinsic::mips_insve_d:
Max = 1;
break;
2031 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
2034 case Intrinsic::mips_ldi_b:
2035 case Intrinsic::mips_ldi_h:
2036 case Intrinsic::mips_ldi_w:
2037 case Intrinsic::mips_ldi_d:
2039 case Intrinsic::mips_lsa:
2040 case Intrinsic::mips_dlsa: {
2041 EVT ResTy =
Op->getValueType(0);
2044 Op->getOperand(2),
Op->getOperand(3)));
2046 case Intrinsic::mips_maddv_b:
2047 case Intrinsic::mips_maddv_h:
2048 case Intrinsic::mips_maddv_w:
2049 case Intrinsic::mips_maddv_d: {
2050 EVT ResTy =
Op->getValueType(0);
2053 Op->getOperand(2),
Op->getOperand(3)));
2055 case Intrinsic::mips_max_s_b:
2056 case Intrinsic::mips_max_s_h:
2057 case Intrinsic::mips_max_s_w:
2058 case Intrinsic::mips_max_s_d:
2060 Op->getOperand(1),
Op->getOperand(2));
2061 case Intrinsic::mips_max_u_b:
2062 case Intrinsic::mips_max_u_h:
2063 case Intrinsic::mips_max_u_w:
2064 case Intrinsic::mips_max_u_d:
2066 Op->getOperand(1),
Op->getOperand(2));
2067 case Intrinsic::mips_maxi_s_b:
2068 case Intrinsic::mips_maxi_s_h:
2069 case Intrinsic::mips_maxi_s_w:
2070 case Intrinsic::mips_maxi_s_d:
2073 case Intrinsic::mips_maxi_u_b:
2074 case Intrinsic::mips_maxi_u_h:
2075 case Intrinsic::mips_maxi_u_w:
2076 case Intrinsic::mips_maxi_u_d:
2079 case Intrinsic::mips_min_s_b:
2080 case Intrinsic::mips_min_s_h:
2081 case Intrinsic::mips_min_s_w:
2082 case Intrinsic::mips_min_s_d:
2084 Op->getOperand(1),
Op->getOperand(2));
2085 case Intrinsic::mips_min_u_b:
2086 case Intrinsic::mips_min_u_h:
2087 case Intrinsic::mips_min_u_w:
2088 case Intrinsic::mips_min_u_d:
2090 Op->getOperand(1),
Op->getOperand(2));
2091 case Intrinsic::mips_mini_s_b:
2092 case Intrinsic::mips_mini_s_h:
2093 case Intrinsic::mips_mini_s_w:
2094 case Intrinsic::mips_mini_s_d:
2097 case Intrinsic::mips_mini_u_b:
2098 case Intrinsic::mips_mini_u_h:
2099 case Intrinsic::mips_mini_u_w:
2100 case Intrinsic::mips_mini_u_d:
2103 case Intrinsic::mips_mod_s_b:
2104 case Intrinsic::mips_mod_s_h:
2105 case Intrinsic::mips_mod_s_w:
2106 case Intrinsic::mips_mod_s_d:
2109 case Intrinsic::mips_mod_u_b:
2110 case Intrinsic::mips_mod_u_h:
2111 case Intrinsic::mips_mod_u_w:
2112 case Intrinsic::mips_mod_u_d:
2115 case Intrinsic::mips_mulv_b:
2116 case Intrinsic::mips_mulv_h:
2117 case Intrinsic::mips_mulv_w:
2118 case Intrinsic::mips_mulv_d:
2121 case Intrinsic::mips_msubv_b:
2122 case Intrinsic::mips_msubv_h:
2123 case Intrinsic::mips_msubv_w:
2124 case Intrinsic::mips_msubv_d: {
2125 EVT ResTy =
Op->getValueType(0);
2128 Op->getOperand(2),
Op->getOperand(3)));
2130 case Intrinsic::mips_nlzc_b:
2131 case Intrinsic::mips_nlzc_h:
2132 case Intrinsic::mips_nlzc_w:
2133 case Intrinsic::mips_nlzc_d:
2135 case Intrinsic::mips_nor_v: {
2137 Op->getOperand(1),
Op->getOperand(2));
2140 case Intrinsic::mips_nori_b: {
2146 case Intrinsic::mips_or_v:
2149 case Intrinsic::mips_ori_b:
2152 case Intrinsic::mips_pckev_b:
2153 case Intrinsic::mips_pckev_h:
2154 case Intrinsic::mips_pckev_w:
2155 case Intrinsic::mips_pckev_d:
2157 Op->getOperand(1),
Op->getOperand(2));
2158 case Intrinsic::mips_pckod_b:
2159 case Intrinsic::mips_pckod_h:
2160 case Intrinsic::mips_pckod_w:
2161 case Intrinsic::mips_pckod_d:
2163 Op->getOperand(1),
Op->getOperand(2));
2164 case Intrinsic::mips_pcnt_b:
2165 case Intrinsic::mips_pcnt_h:
2166 case Intrinsic::mips_pcnt_w:
2167 case Intrinsic::mips_pcnt_d:
2169 case Intrinsic::mips_sat_s_b:
2170 case Intrinsic::mips_sat_s_h:
2171 case Intrinsic::mips_sat_s_w:
2172 case Intrinsic::mips_sat_s_d:
2173 case Intrinsic::mips_sat_u_b:
2174 case Intrinsic::mips_sat_u_h:
2175 case Intrinsic::mips_sat_u_w:
2176 case Intrinsic::mips_sat_u_d: {
2179 switch (Intrinsic) {
2180 case Intrinsic::mips_sat_s_b:
2181 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2182 case Intrinsic::mips_sat_s_h:
2183 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2184 case Intrinsic::mips_sat_s_w:
2185 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2186 case Intrinsic::mips_sat_s_d:
2187 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2195 case Intrinsic::mips_shf_b:
2196 case Intrinsic::mips_shf_h:
2197 case Intrinsic::mips_shf_w: {
2202 Op->getOperand(2),
Op->getOperand(1));
2204 case Intrinsic::mips_sldi_b:
2205 case Intrinsic::mips_sldi_h:
2206 case Intrinsic::mips_sldi_w:
2207 case Intrinsic::mips_sldi_d: {
2210 switch (Intrinsic) {
2211 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2212 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2213 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2214 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2222 case Intrinsic::mips_sll_b:
2223 case Intrinsic::mips_sll_h:
2224 case Intrinsic::mips_sll_w:
2225 case Intrinsic::mips_sll_d:
2228 case Intrinsic::mips_slli_b:
2229 case Intrinsic::mips_slli_h:
2230 case Intrinsic::mips_slli_w:
2231 case Intrinsic::mips_slli_d:
2234 case Intrinsic::mips_splat_b:
2235 case Intrinsic::mips_splat_h:
2236 case Intrinsic::mips_splat_w:
2237 case Intrinsic::mips_splat_d:
2245 case Intrinsic::mips_splati_b:
2246 case Intrinsic::mips_splati_h:
2247 case Intrinsic::mips_splati_w:
2248 case Intrinsic::mips_splati_d:
2252 case Intrinsic::mips_sra_b:
2253 case Intrinsic::mips_sra_h:
2254 case Intrinsic::mips_sra_w:
2255 case Intrinsic::mips_sra_d:
2258 case Intrinsic::mips_srai_b:
2259 case Intrinsic::mips_srai_h:
2260 case Intrinsic::mips_srai_w:
2261 case Intrinsic::mips_srai_d:
2264 case Intrinsic::mips_srari_b:
2265 case Intrinsic::mips_srari_h:
2266 case Intrinsic::mips_srari_w:
2267 case Intrinsic::mips_srari_d: {
2270 switch (Intrinsic) {
2271 case Intrinsic::mips_srari_b:
Max = 7;
break;
2272 case Intrinsic::mips_srari_h:
Max = 15;
break;
2273 case Intrinsic::mips_srari_w:
Max = 31;
break;
2274 case Intrinsic::mips_srari_d:
Max = 63;
break;
2282 case Intrinsic::mips_srl_b:
2283 case Intrinsic::mips_srl_h:
2284 case Intrinsic::mips_srl_w:
2285 case Intrinsic::mips_srl_d:
2288 case Intrinsic::mips_srli_b:
2289 case Intrinsic::mips_srli_h:
2290 case Intrinsic::mips_srli_w:
2291 case Intrinsic::mips_srli_d:
2294 case Intrinsic::mips_srlri_b:
2295 case Intrinsic::mips_srlri_h:
2296 case Intrinsic::mips_srlri_w:
2297 case Intrinsic::mips_srlri_d: {
2300 switch (Intrinsic) {
2301 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2302 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2303 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2304 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2312 case Intrinsic::mips_subv_b:
2313 case Intrinsic::mips_subv_h:
2314 case Intrinsic::mips_subv_w:
2315 case Intrinsic::mips_subv_d:
2318 case Intrinsic::mips_subvi_b:
2319 case Intrinsic::mips_subvi_h:
2320 case Intrinsic::mips_subvi_w:
2321 case Intrinsic::mips_subvi_d:
2324 case Intrinsic::mips_vshf_b:
2325 case Intrinsic::mips_vshf_h:
2326 case Intrinsic::mips_vshf_w:
2327 case Intrinsic::mips_vshf_d:
2329 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2330 case Intrinsic::mips_xor_v:
2333 case Intrinsic::mips_xori_b:
2336 case Intrinsic::thread_pointer: {
2349 EVT ResTy =
Op->getValueType(0);
2350 EVT PtrTy = Address->getValueType(0);
2365 unsigned Intr =
Op->getConstantOperandVal(1);
2369 case Intrinsic::mips_extp:
2371 case Intrinsic::mips_extpdp:
2373 case Intrinsic::mips_extr_w:
2375 case Intrinsic::mips_extr_r_w:
2377 case Intrinsic::mips_extr_rs_w:
2379 case Intrinsic::mips_extr_s_h:
2381 case Intrinsic::mips_mthlip:
2383 case Intrinsic::mips_mulsaq_s_w_ph:
2385 case Intrinsic::mips_maq_s_w_phl:
2387 case Intrinsic::mips_maq_s_w_phr:
2389 case Intrinsic::mips_maq_sa_w_phl:
2391 case Intrinsic::mips_maq_sa_w_phr:
2393 case Intrinsic::mips_dpaq_s_w_ph:
2395 case Intrinsic::mips_dpsq_s_w_ph:
2397 case Intrinsic::mips_dpaq_sa_l_w:
2399 case Intrinsic::mips_dpsq_sa_l_w:
2401 case Intrinsic::mips_dpaqx_s_w_ph:
2403 case Intrinsic::mips_dpaqx_sa_w_ph:
2405 case Intrinsic::mips_dpsqx_s_w_ph:
2407 case Intrinsic::mips_dpsqx_sa_w_ph:
2409 case Intrinsic::mips_ld_b:
2410 case Intrinsic::mips_ld_h:
2411 case Intrinsic::mips_ld_w:
2412 case Intrinsic::mips_ld_d:
2424 EVT PtrTy = Address->getValueType(0);
2440 unsigned Intr =
Op->getConstantOperandVal(1);
2444 case Intrinsic::mips_st_b:
2445 case Intrinsic::mips_st_h:
2446 case Intrinsic::mips_st_w:
2447 case Intrinsic::mips_st_d:
2462 EVT ResTy =
Op->getValueType(0);
2490 for (
unsigned i = 0; i <
Op->getNumOperands(); ++i)
2512 EVT ResTy =
Op->getValueType(0);
2514 APInt SplatValue, SplatUndef;
2515 unsigned SplatBitSize;
2521 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2523 !
Subtarget.isLittle()) && SplatBitSize <= 64) {
2525 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2537 switch (SplatBitSize) {
2541 ViaVecTy = MVT::v16i8;
2544 ViaVecTy = MVT::v8i16;
2547 ViaVecTy = MVT::v4i32;
2558 if (ViaVecTy != ResTy)
2559 Result = DAG.
getNode(ISD::BITCAST, SDLoc(Node), ResTy, Result);
2568 EVT ResTy =
Node->getValueType(0);
2574 for (
unsigned i = 0; i < NumElts; ++i) {
2576 Node->getOperand(i),
2606 int SHFIndices[4] = { -1, -1, -1, -1 };
2608 if (Indices.
size() < 4)
2611 for (
unsigned i = 0; i < 4; ++i) {
2612 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2613 int Idx = Indices[j];
2619 if (Idx < 0 || Idx >= 4)
2625 if (SHFIndices[i] == -1)
2626 SHFIndices[i] = Idx;
2630 if (!(Idx == -1 || Idx == SHFIndices[i]))
2637 for (
int i = 3; i >= 0; --i) {
2638 int Idx = SHFIndices[i];
2655template <
typename ValType>
2658 unsigned CheckStride,
2660 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2664 if (*
I != -1 && *
I != ExpectedIndex)
2666 ExpectedIndex += ExpectedIndexStride;
2670 for (
unsigned n = 0; n < CheckStride &&
I != End; ++n, ++
I)
2689 int SplatIndex = -1;
2690 for (
const auto &V : Indices) {
2723 const auto &Begin = Indices.
begin();
2724 const auto &End = Indices.
end();
2729 Wt =
Op->getOperand(0);
2731 Wt =
Op->getOperand(1);
2738 Ws =
Op->getOperand(0);
2740 Ws =
Op->getOperand(1);
2769 const auto &Begin = Indices.
begin();
2770 const auto &End = Indices.
end();
2775 Wt =
Op->getOperand(0);
2777 Wt =
Op->getOperand(1);
2784 Ws =
Op->getOperand(0);
2786 Ws =
Op->getOperand(1);
2816 const auto &Begin = Indices.
begin();
2817 const auto &End = Indices.
end();
2822 Wt =
Op->getOperand(0);
2824 Wt =
Op->getOperand(1);
2831 Ws =
Op->getOperand(0);
2833 Ws =
Op->getOperand(1);
2861 unsigned HalfSize = Indices.
size() / 2;
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);
2882 Ws =
Op->getOperand(1);
2911 const auto &Begin = Indices.
begin();
2912 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
2913 const auto &End = Indices.
end();
2916 Wt =
Op->getOperand(0);
2918 Wt =
Op->getOperand(1);
2923 Ws =
Op->getOperand(0);
2925 Ws =
Op->getOperand(1);
2954 const auto &Begin = Indices.
begin();
2955 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
2956 const auto &End = Indices.
end();
2959 Wt =
Op->getOperand(0);
2961 Wt =
Op->getOperand(1);
2966 Ws =
Op->getOperand(0);
2968 Ws =
Op->getOperand(1);
2990 const bool isSPLATI,
2997 bool Using1stVec =
false;
2998 bool Using2ndVec =
false;
3002 assert(Indices[0] >= 0 &&
3003 "shuffle mask starts with an UNDEF, which is not expected");
3005 for (
int i = 0; i < ResTyNumElts; ++i) {
3007 int Idx = Indices[i];
3009 if (0 <= Idx && Idx < ResTyNumElts)
3011 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
3014 int LastValidIndex = 0;
3015 for (
size_t i = 0; i < Indices.
size(); i++) {
3016 int Idx = Indices[i];
3019 Idx = isSPLATI ? Indices[0] : LastValidIndex;
3021 LastValidIndex = Idx;
3028 if (Using1stVec && Using2ndVec) {
3029 Op0 =
Op->getOperand(0);
3030 Op1 =
Op->getOperand(1);
3031 }
else if (Using1stVec)
3032 Op0 = Op1 =
Op->getOperand(0);
3033 else if (Using2ndVec)
3034 Op0 = Op1 =
Op->getOperand(1);
3036 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
3053 EVT ResTy =
Op->getValueType(0);
3059 SmallVector<int, 16> Indices;
3061 for (
int i = 0; i < ResTyNumElts; ++i)
3104 const TargetRegisterClass *RC = &Mips::GPR32RegClass;
3110 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3111 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3114 F->insert(It, Sink);
3119 Sink->transferSuccessorsAndUpdatePHIs(BB);
3145 MI.getOperand(0).getReg())
3151 MI.eraseFromParent();
3173 const TargetRegisterClass *RC = &Mips::GPR32RegClass;
3178 MachineBasicBlock *FBB =
F->CreateMachineBasicBlock(LLVM_BB);
3179 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3180 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3183 F->insert(It, Sink);
3188 Sink->transferSuccessorsAndUpdatePHIs(BB);
3214 MI.getOperand(0).getReg())
3220 MI.eraseFromParent();
3242 unsigned Lane =
MI.getOperand(2).getImm();
3257 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3258 : &Mips::MSA128WEvensRegClass);
3264 MI.eraseFromParent();
3287 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3299 MI.eraseFromParent();
3317 unsigned Lane =
MI.getOperand(2).getImm();
3320 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3321 : &Mips::MSA128WEvensRegClass);
3333 MI.eraseFromParent();
3353 unsigned Lane =
MI.getOperand(2).getImm();
3367 MI.eraseFromParent();
3398 Register SrcVecReg =
MI.getOperand(1).getReg();
3399 Register LaneReg =
MI.getOperand(2).getReg();
3400 Register SrcValReg =
MI.getOperand(3).getReg();
3402 const TargetRegisterClass *VecRC =
nullptr;
3404 const TargetRegisterClass *GPRRC =
3405 Subtarget.isABI_N64() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3406 unsigned SubRegIdx =
Subtarget.isABI_N64() ? Mips::sub_32 : 0;
3407 unsigned ShiftOp =
Subtarget.isABI_N64() ? Mips::DSLL : Mips::SLL;
3408 unsigned EltLog2Size;
3409 unsigned InsertOp = 0;
3410 unsigned InsveOp = 0;
3411 switch (EltSizeInBytes) {
3416 InsertOp = Mips::INSERT_B;
3417 InsveOp = Mips::INSVE_B;
3418 VecRC = &Mips::MSA128BRegClass;
3422 InsertOp = Mips::INSERT_H;
3423 InsveOp = Mips::INSVE_H;
3424 VecRC = &Mips::MSA128HRegClass;
3428 InsertOp = Mips::INSERT_W;
3429 InsveOp = Mips::INSVE_W;
3430 VecRC = &Mips::MSA128WRegClass;
3434 InsertOp = Mips::INSERT_D;
3435 InsveOp = Mips::INSVE_D;
3436 VecRC = &Mips::MSA128DRegClass;
3445 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3450 if (EltSizeInBytes != 1) {
3463 .
addReg(LaneReg, 0, SubRegIdx);
3492 .
addReg(LaneTmp2, 0, SubRegIdx);
3494 MI.eraseFromParent();
3514 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3515 : &Mips::MSA128WEvensRegClass);
3517 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3518 : &Mips::MSA128WEvensRegClass);
3527 MI.eraseFromParent();
3558 MI.eraseFromParent();
3582 const MachineMemOperand &MMO = **
MI.memoperands_begin();
3588 const TargetRegisterClass *RC =
3589 MI.getOperand(1).isReg() ? RegInfo.
getRegClass(
MI.getOperand(1).getReg())
3590 : (
Subtarget.isABI_O32() ? &Mips::GPR32RegClass
3591 : &Mips::GPR64RegClass);
3592 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3604 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::SH : Mips::SH64))
3611 MI.eraseFromParent();
3640 const TargetRegisterClass *RC =
3641 MI.getOperand(1).isReg() ? RegInfo.
getRegClass(
MI.getOperand(1).getReg())
3642 : (
Subtarget.isABI_O32() ? &Mips::GPR32RegClass
3643 : &Mips::GPR64RegClass);
3645 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3648 MachineInstrBuilder MIB =
3649 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::LH : Mips::LH64), Rt);
3661 MI.eraseFromParent();
3717 bool IsFGR64)
const {
3724 bool IsFGR64onMips64 =
Subtarget.hasMips64() && IsFGR64;
3725 bool IsFGR64onMips32 = !
Subtarget.hasMips64() && IsFGR64;
3734 const TargetRegisterClass *GPRRC =
3735 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3736 unsigned MFC1Opc = IsFGR64onMips64
3738 : (IsFGR64onMips32 ? Mips::MFC1_D64 : Mips::MFC1);
3739 unsigned FILLOpc = IsFGR64onMips64 ? Mips::FILL_D : Mips::FILL_W;
3745 unsigned WPHI = Wtemp;
3747 if (IsFGR64onMips32) {
3773 MI.eraseFromParent();
3822 bool IsFGR64)
const {
3829 bool IsFGR64onMips64 =
Subtarget.hasMips64() && IsFGR64;
3830 bool IsFGR64onMips32 = !
Subtarget.hasMips64() && IsFGR64;
3838 const TargetRegisterClass *GPRRC =
3839 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3840 unsigned MTC1Opc = IsFGR64onMips64
3842 : (IsFGR64onMips32 ? Mips::MTC1_D64 : Mips::MTC1);
3843 Register COPYOpc = IsFGR64onMips64 ? Mips::COPY_S_D : Mips::COPY_S_W;
3862 if (IsFGR64onMips32) {
3872 MI.eraseFromParent();
3887 const TargetRegisterClass *RC = &Mips::MSA128WRegClass;
3899 .
addReg(
MI.getOperand(1).getReg());
3901 MI.eraseFromParent();
3916 const TargetRegisterClass *RC = &Mips::MSA128DRegClass;
3928 .
addReg(
MI.getOperand(1).getReg());
3930 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, const AArch64Subtarget *Subtarget, const AArch64TargetLowering &TLI)
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 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 SDValue performVSELECTCombine(SDNode *N, 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 cl::opt< bool > UseMipsTailCalls("mips-tail-calls", cl::Hidden, cl::desc("MIPS: permit tail calls."), cl::init(false))
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.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton 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.
ArrayRef - 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 & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
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 a 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)
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
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,...
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.
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.
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.
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.
@ 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.
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
@ 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.
@ 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.
@ 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.
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,...