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) {
404 if (VT == MVT::Untyped)
405 return Subtarget.hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
449 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
480 if (Ty != MVT::v8f16) {
507 EVT ResTy =
Op->getValueType(0);
514 return DAG.
getNode(MipsISD::FSELECT,
DL, ResTy, Tmp,
Op->getOperand(1),
522 if (
Subtarget.systemSupportsUnalignedAccess()) {
547 switch(
Op.getOpcode()) {
550 case ISD::SMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
true, DAG);
551 case ISD::UMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Multu,
true,
true, DAG);
552 case ISD::MULHS:
return lowerMulDiv(
Op, MipsISD::Mult,
false,
true, DAG);
553 case ISD::MULHU:
return lowerMulDiv(
Op, MipsISD::Multu,
false,
true, DAG);
554 case ISD::MUL:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
false, DAG);
555 case ISD::SDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRem,
true,
true, DAG);
556 case ISD::UDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRemU,
true,
true,
567 return lowerR5900FPOp(
Op, DAG, RTLIB::ADD_F32);
569 return lowerR5900FPOp(
Op, DAG, RTLIB::SUB_F32);
571 return lowerR5900FPOp(
Op, DAG, RTLIB::MUL_F32);
573 return lowerR5900FPOp(
Op, DAG, RTLIB::DIV_F32);
575 return lowerR5900FPOp(
Op, DAG, RTLIB::SQRT_F32);
582 RTLIB::Libcall LC)
const {
586 if (Flags.hasNoNaNs() && Flags.hasNoInfs()) {
594 MVT VT =
Op.getSimpleValueType();
622 if (Op0Opcode == MipsISD::VEXTRACT_SEXT_ELT ||
623 Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT) {
629 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
631 if (Log2IfPositive <= 0)
637 unsigned Log2 = Log2IfPositive;
639 if ((Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT &&
Log2 >= ExtendTySize) ||
640 Log2 == ExtendTySize) {
642 return DAG.
getNode(MipsISD::VEXTRACT_ZEXT_ELT,
SDLoc(Op0),
666 APInt SplatValue, SplatUndef;
667 unsigned SplatBitSize;
670 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
684 N =
N->getOperand(0);
691 APInt SplatValue, SplatUndef;
692 unsigned SplatBitSize;
697 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
709 return N->getOperand(1) == OfNode;
712 return N->getOperand(0) == OfNode;
729 EVT Ty =
N->getValueType(0);
731 if (!Ty.is128BitVector())
742 bool IsLittleEndian = !Subtarget.
isLittle();
745 bool IsConstantMask =
false;
752 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
756 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
757 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
759 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
760 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
763 IsConstantMask =
true;
773 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
774 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
776 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
777 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
780 IsConstantMask =
true;
829 if (IsConstantMask) {
830 if (Mask.isAllOnes())
877 while (!WorkStack.
empty()) {
880 if (Val == 0 || Val == 1)
894 if ((Val - Floor).ule(Ceil - Val)) {
942 if ((
C - Floor).ule(Ceil -
C)) {
959 EVT VT =
N->getValueType(0);
963 C->getAPIntValue(), VT, DAG, Subtarget))
975 APInt SplatValue, SplatUndef;
976 unsigned SplatBitSize;
978 unsigned EltSize = Ty.getScalarSizeInBits();
985 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
987 (SplatBitSize != EltSize) ||
999 EVT Ty =
N->getValueType(0);
1001 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1022 EVT Ty =
N->getValueType(0);
1024 if (Subtarget.
hasMSA()) {
1039 if (Op0Op0->
getOpcode() != MipsISD::VEXTRACT_SEXT_ELT &&
1040 Op0Op0->
getOpcode() != MipsISD::VEXTRACT_ZEXT_ELT)
1046 if (TotalBits == 32 ||
1047 (Op0Op0->
getOpcode() == MipsISD::VEXTRACT_SEXT_ELT &&
1051 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
SDLoc(Op0Op0),
1058 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
1068 EVT Ty =
N->getValueType(0);
1070 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
1077 bool IsV216 = (Ty == MVT::v2i16);
1090 default:
return false;
1095 EVT Ty =
N->getValueType(0);
1097 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1103 return DAG.
getNode(MipsISD::SETCC_DSP,
SDLoc(
N), Ty,
N->getOperand(0),
1104 N->getOperand(1),
N->getOperand(2));
1108 EVT Ty =
N->getValueType(0);
1110 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
1113 if (SetCC.
getOpcode() != MipsISD::SETCC_DSP)
1118 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
1126 EVT Ty =
N->getValueType(0);
1128 if (Subtarget.
hasMSA() && Ty.is128BitVector() && Ty.isInteger()) {
1156 switch (
N->getOpcode()) {
1184 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1195 switch (
MI.getOpcode()) {
1198 case Mips::BPOSGE32_PSEUDO:
1199 return emitBPOSGE32(
MI, BB);
1200 case Mips::SNZ_B_PSEUDO:
1201 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1202 case Mips::SNZ_H_PSEUDO:
1203 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1204 case Mips::SNZ_W_PSEUDO:
1205 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1206 case Mips::SNZ_D_PSEUDO:
1207 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1208 case Mips::SNZ_V_PSEUDO:
1209 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1210 case Mips::SZ_B_PSEUDO:
1211 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1212 case Mips::SZ_H_PSEUDO:
1213 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1214 case Mips::SZ_W_PSEUDO:
1215 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1216 case Mips::SZ_D_PSEUDO:
1217 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1218 case Mips::SZ_V_PSEUDO:
1219 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1220 case Mips::COPY_FW_PSEUDO:
1221 return emitCOPY_FW(
MI, BB);
1222 case Mips::COPY_FD_PSEUDO:
1223 return emitCOPY_FD(
MI, BB);
1224 case Mips::INSERT_FW_PSEUDO:
1225 return emitINSERT_FW(
MI, BB);
1226 case Mips::INSERT_FD_PSEUDO:
1227 return emitINSERT_FD(
MI, BB);
1228 case Mips::INSERT_B_VIDX_PSEUDO:
1229 case Mips::INSERT_B_VIDX64_PSEUDO:
1230 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1231 case Mips::INSERT_H_VIDX_PSEUDO:
1232 case Mips::INSERT_H_VIDX64_PSEUDO:
1233 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1234 case Mips::INSERT_W_VIDX_PSEUDO:
1235 case Mips::INSERT_W_VIDX64_PSEUDO:
1236 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1237 case Mips::INSERT_D_VIDX_PSEUDO:
1238 case Mips::INSERT_D_VIDX64_PSEUDO:
1239 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1240 case Mips::INSERT_FW_VIDX_PSEUDO:
1241 case Mips::INSERT_FW_VIDX64_PSEUDO:
1242 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1243 case Mips::INSERT_FD_VIDX_PSEUDO:
1244 case Mips::INSERT_FD_VIDX64_PSEUDO:
1245 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1246 case Mips::FILL_FW_PSEUDO:
1247 return emitFILL_FW(
MI, BB);
1248 case Mips::FILL_FD_PSEUDO:
1249 return emitFILL_FD(
MI, BB);
1250 case Mips::FEXP2_W_1_PSEUDO:
1251 return emitFEXP2_W_1(
MI, BB);
1252 case Mips::FEXP2_D_1_PSEUDO:
1253 return emitFEXP2_D_1(
MI, BB);
1255 return emitST_F16_PSEUDO(
MI, BB);
1257 return emitLD_F16_PSEUDO(
MI, BB);
1258 case Mips::MSA_FP_EXTEND_W_PSEUDO:
1259 return emitFPEXTEND_PSEUDO(
MI, BB,
false);
1260 case Mips::MSA_FP_ROUND_W_PSEUDO:
1261 return emitFPROUND_PSEUDO(
MI, BB,
false);
1262 case Mips::MSA_FP_EXTEND_D_PSEUDO:
1263 return emitFPEXTEND_PSEUDO(
MI, BB,
true);
1264 case Mips::MSA_FP_ROUND_D_PSEUDO:
1265 return emitFPROUND_PSEUDO(
MI, BB,
true);
1269bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1270 const CCState &CCInfo,
unsigned NextStackOffset,
1284void MipsSETargetLowering::
1286 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
1287 bool IsPICCall,
bool GlobalOrExternal,
bool InternalLinkage,
1288 bool IsCallReloc, CallLoweringInfo &CLI,
SDValue Callee,
1290 Ops.push_back(Callee);
1292 InternalLinkage, IsCallReloc, CLI, Callee,
1314 MVT::i32,
DL,
Lo.getValue(1), Ptr, MachinePointerInfo(),
1349 return DAG.
getStore(Chain,
DL,
Hi, Ptr, MachinePointerInfo(),
1357 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1358 MVT Dest =
Op.getValueType().getSimpleVT();
1361 if (Src == MVT::i64 && Dest == MVT::f64) {
1365 return DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1369 if (Src == MVT::f64 && Dest == MVT::i64) {
1376 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1379 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1389 bool HasLo,
bool HasHi,
1394 EVT Ty =
Op.getOperand(0).getValueType();
1397 Op.getOperand(0),
Op.getOperand(1));
1405 if (!HasLo || !HasHi)
1406 return HasLo ?
Lo :
Hi;
1414 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1415 return DAG.
getNode(MipsISD::MTLOHI,
DL, MVT::Untyped, InLo, InHi);
1438 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1444 Ops.push_back(
Op->getOperand(OpNo++));
1450 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1455 Ops.push_back(Opnd);
1458 for (++OpNo ; OpNo <
Op->getNumOperands(); ++OpNo)
1459 Ops.push_back(
Op->getOperand(OpNo));
1463 Ops.push_back(In64);
1468 for (
EVT Ty :
Op->values())
1469 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1488 EVT ResTy =
Op->getValueType(0);
1498 EVT ResVecTy =
Op->getValueType(0);
1499 EVT ViaVecTy = ResVecTy;
1509 if (ResVecTy == MVT::v2i64) {
1520 ViaVecTy = MVT::v4i32;
1526 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1527 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1532 if (ViaVecTy != ResVecTy) {
1542 bool IsSigned =
false) {
1545 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1546 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1552 EVT ViaVecTy = VecTy;
1553 SDValue SplatValueA = SplatValue;
1554 SDValue SplatValueB = SplatValue;
1557 if (VecTy == MVT::v2i64) {
1559 ViaVecTy = MVT::v4i32;
1572 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1573 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1574 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1575 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1580 if (VecTy != ViaVecTy)
1589 EVT VecTy =
Op->getValueType(0);
1595 if (VecTy == MVT::v2i64) {
1597 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1609 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1618 if (VecTy == MVT::v2i64)
1632 EVT ResTy =
Op->getValueType(0);
1635 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1644 EVT ResTy =
Op->getValueType(0);
1655 EVT ResTy =
Op->getValueType(0);
1657 <<
Op->getConstantOperandAPInt(2);
1666 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1667 switch (Intrinsic) {
1670 case Intrinsic::mips_shilo:
1672 case Intrinsic::mips_dpau_h_qbl:
1674 case Intrinsic::mips_dpau_h_qbr:
1676 case Intrinsic::mips_dpsu_h_qbl:
1678 case Intrinsic::mips_dpsu_h_qbr:
1680 case Intrinsic::mips_dpa_w_ph:
1682 case Intrinsic::mips_dps_w_ph:
1684 case Intrinsic::mips_dpax_w_ph:
1686 case Intrinsic::mips_dpsx_w_ph:
1688 case Intrinsic::mips_mulsa_w_ph:
1690 case Intrinsic::mips_mult:
1692 case Intrinsic::mips_multu:
1694 case Intrinsic::mips_madd:
1696 case Intrinsic::mips_maddu:
1698 case Intrinsic::mips_msub:
1700 case Intrinsic::mips_msubu:
1702 case Intrinsic::mips_addv_b:
1703 case Intrinsic::mips_addv_h:
1704 case Intrinsic::mips_addv_w:
1705 case Intrinsic::mips_addv_d:
1708 case Intrinsic::mips_addvi_b:
1709 case Intrinsic::mips_addvi_h:
1710 case Intrinsic::mips_addvi_w:
1711 case Intrinsic::mips_addvi_d:
1714 case Intrinsic::mips_and_v:
1717 case Intrinsic::mips_andi_b:
1720 case Intrinsic::mips_bclr_b:
1721 case Intrinsic::mips_bclr_h:
1722 case Intrinsic::mips_bclr_w:
1723 case Intrinsic::mips_bclr_d:
1725 case Intrinsic::mips_bclri_b:
1726 case Intrinsic::mips_bclri_h:
1727 case Intrinsic::mips_bclri_w:
1728 case Intrinsic::mips_bclri_d:
1730 case Intrinsic::mips_binsli_b:
1731 case Intrinsic::mips_binsli_h:
1732 case Intrinsic::mips_binsli_w:
1733 case Intrinsic::mips_binsli_d: {
1735 EVT VecTy =
Op->getValueType(0);
1740 Op->getConstantOperandVal(3) + 1);
1743 Op->getOperand(2),
Op->getOperand(1));
1745 case Intrinsic::mips_binsri_b:
1746 case Intrinsic::mips_binsri_h:
1747 case Intrinsic::mips_binsri_w:
1748 case Intrinsic::mips_binsri_d: {
1750 EVT VecTy =
Op->getValueType(0);
1755 Op->getConstantOperandVal(3) + 1);
1758 Op->getOperand(2),
Op->getOperand(1));
1760 case Intrinsic::mips_bmnz_v:
1762 Op->getOperand(2),
Op->getOperand(1));
1763 case Intrinsic::mips_bmnzi_b:
1767 case Intrinsic::mips_bmz_v:
1769 Op->getOperand(1),
Op->getOperand(2));
1770 case Intrinsic::mips_bmzi_b:
1774 case Intrinsic::mips_bneg_b:
1775 case Intrinsic::mips_bneg_h:
1776 case Intrinsic::mips_bneg_w:
1777 case Intrinsic::mips_bneg_d: {
1778 EVT VecTy =
Op->getValueType(0);
1785 case Intrinsic::mips_bnegi_b:
1786 case Intrinsic::mips_bnegi_h:
1787 case Intrinsic::mips_bnegi_w:
1788 case Intrinsic::mips_bnegi_d:
1791 case Intrinsic::mips_bnz_b:
1792 case Intrinsic::mips_bnz_h:
1793 case Intrinsic::mips_bnz_w:
1794 case Intrinsic::mips_bnz_d:
1795 return DAG.
getNode(MipsISD::VALL_NONZERO,
DL,
Op->getValueType(0),
1797 case Intrinsic::mips_bnz_v:
1798 return DAG.
getNode(MipsISD::VANY_NONZERO,
DL,
Op->getValueType(0),
1800 case Intrinsic::mips_bsel_v:
1803 Op->getOperand(1),
Op->getOperand(3),
1805 case Intrinsic::mips_bseli_b:
1810 case Intrinsic::mips_bset_b:
1811 case Intrinsic::mips_bset_h:
1812 case Intrinsic::mips_bset_w:
1813 case Intrinsic::mips_bset_d: {
1814 EVT VecTy =
Op->getValueType(0);
1821 case Intrinsic::mips_bseti_b:
1822 case Intrinsic::mips_bseti_h:
1823 case Intrinsic::mips_bseti_w:
1824 case Intrinsic::mips_bseti_d:
1827 case Intrinsic::mips_bz_b:
1828 case Intrinsic::mips_bz_h:
1829 case Intrinsic::mips_bz_w:
1830 case Intrinsic::mips_bz_d:
1831 return DAG.
getNode(MipsISD::VALL_ZERO,
DL,
Op->getValueType(0),
1833 case Intrinsic::mips_bz_v:
1834 return DAG.
getNode(MipsISD::VANY_ZERO,
DL,
Op->getValueType(0),
1836 case Intrinsic::mips_ceq_b:
1837 case Intrinsic::mips_ceq_h:
1838 case Intrinsic::mips_ceq_w:
1839 case Intrinsic::mips_ceq_d:
1842 case Intrinsic::mips_ceqi_b:
1843 case Intrinsic::mips_ceqi_h:
1844 case Intrinsic::mips_ceqi_w:
1845 case Intrinsic::mips_ceqi_d:
1848 case Intrinsic::mips_cle_s_b:
1849 case Intrinsic::mips_cle_s_h:
1850 case Intrinsic::mips_cle_s_w:
1851 case Intrinsic::mips_cle_s_d:
1854 case Intrinsic::mips_clei_s_b:
1855 case Intrinsic::mips_clei_s_h:
1856 case Intrinsic::mips_clei_s_w:
1857 case Intrinsic::mips_clei_s_d:
1860 case Intrinsic::mips_cle_u_b:
1861 case Intrinsic::mips_cle_u_h:
1862 case Intrinsic::mips_cle_u_w:
1863 case Intrinsic::mips_cle_u_d:
1866 case Intrinsic::mips_clei_u_b:
1867 case Intrinsic::mips_clei_u_h:
1868 case Intrinsic::mips_clei_u_w:
1869 case Intrinsic::mips_clei_u_d:
1872 case Intrinsic::mips_clt_s_b:
1873 case Intrinsic::mips_clt_s_h:
1874 case Intrinsic::mips_clt_s_w:
1875 case Intrinsic::mips_clt_s_d:
1878 case Intrinsic::mips_clti_s_b:
1879 case Intrinsic::mips_clti_s_h:
1880 case Intrinsic::mips_clti_s_w:
1881 case Intrinsic::mips_clti_s_d:
1884 case Intrinsic::mips_clt_u_b:
1885 case Intrinsic::mips_clt_u_h:
1886 case Intrinsic::mips_clt_u_w:
1887 case Intrinsic::mips_clt_u_d:
1890 case Intrinsic::mips_clti_u_b:
1891 case Intrinsic::mips_clti_u_h:
1892 case Intrinsic::mips_clti_u_w:
1893 case Intrinsic::mips_clti_u_d:
1896 case Intrinsic::mips_copy_s_b:
1897 case Intrinsic::mips_copy_s_h:
1898 case Intrinsic::mips_copy_s_w:
1900 case Intrinsic::mips_copy_s_d:
1908 Op->getValueType(0),
Op->getOperand(1),
1911 case Intrinsic::mips_copy_u_b:
1912 case Intrinsic::mips_copy_u_h:
1913 case Intrinsic::mips_copy_u_w:
1915 case Intrinsic::mips_copy_u_d:
1926 Op->getValueType(0),
Op->getOperand(1),
1929 case Intrinsic::mips_div_s_b:
1930 case Intrinsic::mips_div_s_h:
1931 case Intrinsic::mips_div_s_w:
1932 case Intrinsic::mips_div_s_d:
1935 case Intrinsic::mips_div_u_b:
1936 case Intrinsic::mips_div_u_h:
1937 case Intrinsic::mips_div_u_w:
1938 case Intrinsic::mips_div_u_d:
1941 case Intrinsic::mips_fadd_w:
1942 case Intrinsic::mips_fadd_d:
1947 case Intrinsic::mips_fceq_w:
1948 case Intrinsic::mips_fceq_d:
1951 case Intrinsic::mips_fcle_w:
1952 case Intrinsic::mips_fcle_d:
1955 case Intrinsic::mips_fclt_w:
1956 case Intrinsic::mips_fclt_d:
1959 case Intrinsic::mips_fcne_w:
1960 case Intrinsic::mips_fcne_d:
1963 case Intrinsic::mips_fcor_w:
1964 case Intrinsic::mips_fcor_d:
1967 case Intrinsic::mips_fcueq_w:
1968 case Intrinsic::mips_fcueq_d:
1971 case Intrinsic::mips_fcule_w:
1972 case Intrinsic::mips_fcule_d:
1975 case Intrinsic::mips_fcult_w:
1976 case Intrinsic::mips_fcult_d:
1979 case Intrinsic::mips_fcun_w:
1980 case Intrinsic::mips_fcun_d:
1983 case Intrinsic::mips_fcune_w:
1984 case Intrinsic::mips_fcune_d:
1987 case Intrinsic::mips_fdiv_w:
1988 case Intrinsic::mips_fdiv_d:
1992 case Intrinsic::mips_ffint_u_w:
1993 case Intrinsic::mips_ffint_u_d:
1996 case Intrinsic::mips_ffint_s_w:
1997 case Intrinsic::mips_ffint_s_d:
2000 case Intrinsic::mips_fill_b:
2001 case Intrinsic::mips_fill_h:
2002 case Intrinsic::mips_fill_w:
2003 case Intrinsic::mips_fill_d: {
2004 EVT ResTy =
Op->getValueType(0);
2012 case Intrinsic::mips_fexp2_w:
2013 case Intrinsic::mips_fexp2_d: {
2015 EVT ResTy =
Op->getValueType(0);
2020 case Intrinsic::mips_flog2_w:
2021 case Intrinsic::mips_flog2_d:
2023 case Intrinsic::mips_fmadd_w:
2024 case Intrinsic::mips_fmadd_d:
2026 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2027 case Intrinsic::mips_fmul_w:
2028 case Intrinsic::mips_fmul_d:
2032 case Intrinsic::mips_fmsub_w:
2033 case Intrinsic::mips_fmsub_d: {
2035 return DAG.
getNode(MipsISD::FMS, SDLoc(
Op),
Op->getValueType(0),
2036 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2038 case Intrinsic::mips_frint_w:
2039 case Intrinsic::mips_frint_d:
2041 case Intrinsic::mips_fsqrt_w:
2042 case Intrinsic::mips_fsqrt_d:
2044 case Intrinsic::mips_fsub_w:
2045 case Intrinsic::mips_fsub_d:
2049 case Intrinsic::mips_ftrunc_u_w:
2050 case Intrinsic::mips_ftrunc_u_d:
2053 case Intrinsic::mips_ftrunc_s_w:
2054 case Intrinsic::mips_ftrunc_s_d:
2057 case Intrinsic::mips_ilvev_b:
2058 case Intrinsic::mips_ilvev_h:
2059 case Intrinsic::mips_ilvev_w:
2060 case Intrinsic::mips_ilvev_d:
2061 return DAG.
getNode(MipsISD::ILVEV,
DL,
Op->getValueType(0),
2062 Op->getOperand(1),
Op->getOperand(2));
2063 case Intrinsic::mips_ilvl_b:
2064 case Intrinsic::mips_ilvl_h:
2065 case Intrinsic::mips_ilvl_w:
2066 case Intrinsic::mips_ilvl_d:
2067 return DAG.
getNode(MipsISD::ILVL,
DL,
Op->getValueType(0),
2068 Op->getOperand(1),
Op->getOperand(2));
2069 case Intrinsic::mips_ilvod_b:
2070 case Intrinsic::mips_ilvod_h:
2071 case Intrinsic::mips_ilvod_w:
2072 case Intrinsic::mips_ilvod_d:
2073 return DAG.
getNode(MipsISD::ILVOD,
DL,
Op->getValueType(0),
2074 Op->getOperand(1),
Op->getOperand(2));
2075 case Intrinsic::mips_ilvr_b:
2076 case Intrinsic::mips_ilvr_h:
2077 case Intrinsic::mips_ilvr_w:
2078 case Intrinsic::mips_ilvr_d:
2079 return DAG.
getNode(MipsISD::ILVR,
DL,
Op->getValueType(0),
2080 Op->getOperand(1),
Op->getOperand(2));
2081 case Intrinsic::mips_insert_b:
2082 case Intrinsic::mips_insert_h:
2083 case Intrinsic::mips_insert_w:
2084 case Intrinsic::mips_insert_d:
2086 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
2087 case Intrinsic::mips_insve_b:
2088 case Intrinsic::mips_insve_h:
2089 case Intrinsic::mips_insve_w:
2090 case Intrinsic::mips_insve_d: {
2093 switch (Intrinsic) {
2094 case Intrinsic::mips_insve_b:
Max = 15;
break;
2095 case Intrinsic::mips_insve_h:
Max = 7;
break;
2096 case Intrinsic::mips_insve_w:
Max = 3;
break;
2097 case Intrinsic::mips_insve_d:
Max = 1;
break;
2103 return DAG.
getNode(MipsISD::INSVE,
DL,
Op->getValueType(0),
2104 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
2107 case Intrinsic::mips_ldi_b:
2108 case Intrinsic::mips_ldi_h:
2109 case Intrinsic::mips_ldi_w:
2110 case Intrinsic::mips_ldi_d:
2112 case Intrinsic::mips_lsa:
2113 case Intrinsic::mips_dlsa: {
2114 EVT ResTy =
Op->getValueType(0);
2117 Op->getOperand(2),
Op->getOperand(3)));
2119 case Intrinsic::mips_maddv_b:
2120 case Intrinsic::mips_maddv_h:
2121 case Intrinsic::mips_maddv_w:
2122 case Intrinsic::mips_maddv_d: {
2123 EVT ResTy =
Op->getValueType(0);
2126 Op->getOperand(2),
Op->getOperand(3)));
2128 case Intrinsic::mips_max_s_b:
2129 case Intrinsic::mips_max_s_h:
2130 case Intrinsic::mips_max_s_w:
2131 case Intrinsic::mips_max_s_d:
2133 Op->getOperand(1),
Op->getOperand(2));
2134 case Intrinsic::mips_max_u_b:
2135 case Intrinsic::mips_max_u_h:
2136 case Intrinsic::mips_max_u_w:
2137 case Intrinsic::mips_max_u_d:
2139 Op->getOperand(1),
Op->getOperand(2));
2140 case Intrinsic::mips_maxi_s_b:
2141 case Intrinsic::mips_maxi_s_h:
2142 case Intrinsic::mips_maxi_s_w:
2143 case Intrinsic::mips_maxi_s_d:
2146 case Intrinsic::mips_maxi_u_b:
2147 case Intrinsic::mips_maxi_u_h:
2148 case Intrinsic::mips_maxi_u_w:
2149 case Intrinsic::mips_maxi_u_d:
2152 case Intrinsic::mips_min_s_b:
2153 case Intrinsic::mips_min_s_h:
2154 case Intrinsic::mips_min_s_w:
2155 case Intrinsic::mips_min_s_d:
2157 Op->getOperand(1),
Op->getOperand(2));
2158 case Intrinsic::mips_min_u_b:
2159 case Intrinsic::mips_min_u_h:
2160 case Intrinsic::mips_min_u_w:
2161 case Intrinsic::mips_min_u_d:
2163 Op->getOperand(1),
Op->getOperand(2));
2164 case Intrinsic::mips_mini_s_b:
2165 case Intrinsic::mips_mini_s_h:
2166 case Intrinsic::mips_mini_s_w:
2167 case Intrinsic::mips_mini_s_d:
2170 case Intrinsic::mips_mini_u_b:
2171 case Intrinsic::mips_mini_u_h:
2172 case Intrinsic::mips_mini_u_w:
2173 case Intrinsic::mips_mini_u_d:
2176 case Intrinsic::mips_mod_s_b:
2177 case Intrinsic::mips_mod_s_h:
2178 case Intrinsic::mips_mod_s_w:
2179 case Intrinsic::mips_mod_s_d:
2182 case Intrinsic::mips_mod_u_b:
2183 case Intrinsic::mips_mod_u_h:
2184 case Intrinsic::mips_mod_u_w:
2185 case Intrinsic::mips_mod_u_d:
2188 case Intrinsic::mips_mulv_b:
2189 case Intrinsic::mips_mulv_h:
2190 case Intrinsic::mips_mulv_w:
2191 case Intrinsic::mips_mulv_d:
2194 case Intrinsic::mips_msubv_b:
2195 case Intrinsic::mips_msubv_h:
2196 case Intrinsic::mips_msubv_w:
2197 case Intrinsic::mips_msubv_d: {
2198 EVT ResTy =
Op->getValueType(0);
2201 Op->getOperand(2),
Op->getOperand(3)));
2203 case Intrinsic::mips_nlzc_b:
2204 case Intrinsic::mips_nlzc_h:
2205 case Intrinsic::mips_nlzc_w:
2206 case Intrinsic::mips_nlzc_d:
2208 case Intrinsic::mips_nor_v: {
2210 Op->getOperand(1),
Op->getOperand(2));
2213 case Intrinsic::mips_nori_b: {
2219 case Intrinsic::mips_or_v:
2222 case Intrinsic::mips_ori_b:
2225 case Intrinsic::mips_pckev_b:
2226 case Intrinsic::mips_pckev_h:
2227 case Intrinsic::mips_pckev_w:
2228 case Intrinsic::mips_pckev_d:
2229 return DAG.
getNode(MipsISD::PCKEV,
DL,
Op->getValueType(0),
2230 Op->getOperand(1),
Op->getOperand(2));
2231 case Intrinsic::mips_pckod_b:
2232 case Intrinsic::mips_pckod_h:
2233 case Intrinsic::mips_pckod_w:
2234 case Intrinsic::mips_pckod_d:
2235 return DAG.
getNode(MipsISD::PCKOD,
DL,
Op->getValueType(0),
2236 Op->getOperand(1),
Op->getOperand(2));
2237 case Intrinsic::mips_pcnt_b:
2238 case Intrinsic::mips_pcnt_h:
2239 case Intrinsic::mips_pcnt_w:
2240 case Intrinsic::mips_pcnt_d:
2242 case Intrinsic::mips_sat_s_b:
2243 case Intrinsic::mips_sat_s_h:
2244 case Intrinsic::mips_sat_s_w:
2245 case Intrinsic::mips_sat_s_d:
2246 case Intrinsic::mips_sat_u_b:
2247 case Intrinsic::mips_sat_u_h:
2248 case Intrinsic::mips_sat_u_w:
2249 case Intrinsic::mips_sat_u_d: {
2252 switch (Intrinsic) {
2253 case Intrinsic::mips_sat_s_b:
2254 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2255 case Intrinsic::mips_sat_s_h:
2256 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2257 case Intrinsic::mips_sat_s_w:
2258 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2259 case Intrinsic::mips_sat_s_d:
2260 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2268 case Intrinsic::mips_shf_b:
2269 case Intrinsic::mips_shf_h:
2270 case Intrinsic::mips_shf_w: {
2274 return DAG.
getNode(MipsISD::SHF,
DL,
Op->getValueType(0),
2275 Op->getOperand(2),
Op->getOperand(1));
2277 case Intrinsic::mips_sldi_b:
2278 case Intrinsic::mips_sldi_h:
2279 case Intrinsic::mips_sldi_w:
2280 case Intrinsic::mips_sldi_d: {
2283 switch (Intrinsic) {
2284 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2285 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2286 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2287 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2295 case Intrinsic::mips_sll_b:
2296 case Intrinsic::mips_sll_h:
2297 case Intrinsic::mips_sll_w:
2298 case Intrinsic::mips_sll_d:
2301 case Intrinsic::mips_slli_b:
2302 case Intrinsic::mips_slli_h:
2303 case Intrinsic::mips_slli_w:
2304 case Intrinsic::mips_slli_d:
2307 case Intrinsic::mips_splat_b:
2308 case Intrinsic::mips_splat_h:
2309 case Intrinsic::mips_splat_w:
2310 case Intrinsic::mips_splat_d:
2315 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2318 case Intrinsic::mips_splati_b:
2319 case Intrinsic::mips_splati_h:
2320 case Intrinsic::mips_splati_w:
2321 case Intrinsic::mips_splati_d:
2322 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2325 case Intrinsic::mips_sra_b:
2326 case Intrinsic::mips_sra_h:
2327 case Intrinsic::mips_sra_w:
2328 case Intrinsic::mips_sra_d:
2331 case Intrinsic::mips_srai_b:
2332 case Intrinsic::mips_srai_h:
2333 case Intrinsic::mips_srai_w:
2334 case Intrinsic::mips_srai_d:
2337 case Intrinsic::mips_srari_b:
2338 case Intrinsic::mips_srari_h:
2339 case Intrinsic::mips_srari_w:
2340 case Intrinsic::mips_srari_d: {
2343 switch (Intrinsic) {
2344 case Intrinsic::mips_srari_b:
Max = 7;
break;
2345 case Intrinsic::mips_srari_h:
Max = 15;
break;
2346 case Intrinsic::mips_srari_w:
Max = 31;
break;
2347 case Intrinsic::mips_srari_d:
Max = 63;
break;
2355 case Intrinsic::mips_srl_b:
2356 case Intrinsic::mips_srl_h:
2357 case Intrinsic::mips_srl_w:
2358 case Intrinsic::mips_srl_d:
2361 case Intrinsic::mips_srli_b:
2362 case Intrinsic::mips_srli_h:
2363 case Intrinsic::mips_srli_w:
2364 case Intrinsic::mips_srli_d:
2367 case Intrinsic::mips_srlri_b:
2368 case Intrinsic::mips_srlri_h:
2369 case Intrinsic::mips_srlri_w:
2370 case Intrinsic::mips_srlri_d: {
2373 switch (Intrinsic) {
2374 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2375 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2376 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2377 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2385 case Intrinsic::mips_subv_b:
2386 case Intrinsic::mips_subv_h:
2387 case Intrinsic::mips_subv_w:
2388 case Intrinsic::mips_subv_d:
2391 case Intrinsic::mips_subvi_b:
2392 case Intrinsic::mips_subvi_h:
2393 case Intrinsic::mips_subvi_w:
2394 case Intrinsic::mips_subvi_d:
2397 case Intrinsic::mips_vshf_b:
2398 case Intrinsic::mips_vshf_h:
2399 case Intrinsic::mips_vshf_w:
2400 case Intrinsic::mips_vshf_d:
2401 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2402 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2403 case Intrinsic::mips_xor_v:
2406 case Intrinsic::mips_xori_b:
2409 case Intrinsic::thread_pointer: {
2411 return DAG.
getNode(MipsISD::ThreadPointer,
DL, PtrVT);
2422 EVT ResTy =
Op->getValueType(0);
2423 EVT PtrTy = Address->getValueType(0);
2438 unsigned Intr =
Op->getConstantOperandVal(1);
2442 case Intrinsic::mips_extp:
2444 case Intrinsic::mips_extpdp:
2446 case Intrinsic::mips_extr_w:
2448 case Intrinsic::mips_extr_r_w:
2450 case Intrinsic::mips_extr_rs_w:
2452 case Intrinsic::mips_extr_s_h:
2454 case Intrinsic::mips_mthlip:
2456 case Intrinsic::mips_mulsaq_s_w_ph:
2458 case Intrinsic::mips_maq_s_w_phl:
2460 case Intrinsic::mips_maq_s_w_phr:
2462 case Intrinsic::mips_maq_sa_w_phl:
2464 case Intrinsic::mips_maq_sa_w_phr:
2466 case Intrinsic::mips_dpaq_s_w_ph:
2468 case Intrinsic::mips_dpsq_s_w_ph:
2470 case Intrinsic::mips_dpaq_sa_l_w:
2472 case Intrinsic::mips_dpsq_sa_l_w:
2474 case Intrinsic::mips_dpaqx_s_w_ph:
2476 case Intrinsic::mips_dpaqx_sa_w_ph:
2478 case Intrinsic::mips_dpsqx_s_w_ph:
2480 case Intrinsic::mips_dpsqx_sa_w_ph:
2482 case Intrinsic::mips_ld_b:
2483 case Intrinsic::mips_ld_h:
2484 case Intrinsic::mips_ld_w:
2485 case Intrinsic::mips_ld_d:
2497 EVT PtrTy = Address->getValueType(0);
2513 unsigned Intr =
Op->getConstantOperandVal(1);
2517 case Intrinsic::mips_st_b:
2518 case Intrinsic::mips_st_h:
2519 case Intrinsic::mips_st_w:
2520 case Intrinsic::mips_st_d:
2535 EVT ResTy =
Op->getValueType(0);
2545 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
DL, ResTy, Op0, Op1,
2563 for (
unsigned i = 0; i <
Op->getNumOperands(); ++i)
2585 EVT ResTy =
Op->getValueType(0);
2587 APInt SplatValue, SplatUndef;
2588 unsigned SplatBitSize;
2594 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2596 !
Subtarget.isLittle()) && SplatBitSize <= 64) {
2598 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2610 switch (SplatBitSize) {
2614 ViaVecTy = MVT::v16i8;
2617 ViaVecTy = MVT::v8i16;
2620 ViaVecTy = MVT::v4i32;
2631 if (ViaVecTy != ResTy)
2641 EVT ResTy =
Node->getValueType(0);
2647 for (
unsigned i = 0; i < NumElts; ++i) {
2649 Node->getOperand(i),
2679 int SHFIndices[4] = { -1, -1, -1, -1 };
2681 if (Indices.
size() < 4)
2684 for (
unsigned i = 0; i < 4; ++i) {
2685 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2686 int Idx = Indices[j];
2692 if (Idx < 0 || Idx >= 4)
2698 if (SHFIndices[i] == -1)
2699 SHFIndices[i] = Idx;
2703 if (!(Idx == -1 || Idx == SHFIndices[i]))
2710 for (
int i = 3; i >= 0; --i) {
2711 int Idx = SHFIndices[i];
2721 return DAG.
getNode(MipsISD::SHF,
DL, ResTy,
2728template <
typename ValType>
2731 unsigned CheckStride,
2733 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2737 if (*
I != -1 && *
I != ExpectedIndex)
2739 ExpectedIndex += ExpectedIndexStride;
2743 for (
unsigned n = 0; n < CheckStride &&
I != End; ++n, ++
I)
2762 int SplatIndex = -1;
2763 for (
const auto &V : Indices) {
2796 const auto &Begin = Indices.
begin();
2797 const auto &End = Indices.
end();
2802 Wt =
Op->getOperand(0);
2804 Wt =
Op->getOperand(1);
2811 Ws =
Op->getOperand(0);
2813 Ws =
Op->getOperand(1);
2842 const auto &Begin = Indices.
begin();
2843 const auto &End = Indices.
end();
2848 Wt =
Op->getOperand(0);
2850 Wt =
Op->getOperand(1);
2857 Ws =
Op->getOperand(0);
2859 Ws =
Op->getOperand(1);
2889 const auto &Begin = Indices.
begin();
2890 const auto &End = Indices.
end();
2895 Wt =
Op->getOperand(0);
2897 Wt =
Op->getOperand(1);
2904 Ws =
Op->getOperand(0);
2906 Ws =
Op->getOperand(1);
2934 unsigned HalfSize = Indices.
size() / 2;
2937 const auto &Begin = Indices.
begin();
2938 const auto &End = Indices.
end();
2943 Wt =
Op->getOperand(0);
2945 Wt =
Op->getOperand(1);
2952 Ws =
Op->getOperand(0);
2955 Ws =
Op->getOperand(1);
2984 const auto &Begin = Indices.
begin();
2985 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
2986 const auto &End = Indices.
end();
2989 Wt =
Op->getOperand(0);
2991 Wt =
Op->getOperand(1);
2996 Ws =
Op->getOperand(0);
2998 Ws =
Op->getOperand(1);
3027 const auto &Begin = Indices.
begin();
3028 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3029 const auto &End = Indices.
end();
3032 Wt =
Op->getOperand(0);
3034 Wt =
Op->getOperand(1);
3039 Ws =
Op->getOperand(0);
3041 Ws =
Op->getOperand(1);
3063 const bool isSPLATI,
3070 bool Using1stVec =
false;
3071 bool Using2ndVec =
false;
3075 assert(Indices[0] >= 0 &&
3076 "shuffle mask starts with an UNDEF, which is not expected");
3078 for (
int i = 0; i < ResTyNumElts; ++i) {
3080 int Idx = Indices[i];
3082 if (0 <= Idx && Idx < ResTyNumElts)
3084 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
3087 int LastValidIndex = 0;
3088 for (
size_t i = 0; i < Indices.
size(); i++) {
3089 int Idx = Indices[i];
3092 Idx = isSPLATI ? Indices[0] : LastValidIndex;
3094 LastValidIndex = Idx;
3101 if (Using1stVec && Using2ndVec) {
3102 Op0 =
Op->getOperand(0);
3103 Op1 =
Op->getOperand(1);
3104 }
else if (Using1stVec)
3105 Op0 = Op1 =
Op->getOperand(0);
3106 else if (Using2ndVec)
3107 Op0 = Op1 =
Op->getOperand(1);
3109 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
3118 return DAG.
getNode(MipsISD::VSHF,
DL, ResTy, MaskVec, Op1, Op0);
3126 EVT ResTy =
Op->getValueType(0);
3132 SmallVector<int, 16> Indices;
3134 for (
int i = 0; i < ResTyNumElts; ++i)
3177 const TargetRegisterClass *RC = &Mips::GPR32RegClass;
3183 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3184 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3187 F->insert(It, Sink);
3192 Sink->transferSuccessorsAndUpdatePHIs(BB);
3218 MI.getOperand(0).getReg())
3224 MI.eraseFromParent();
3246 const TargetRegisterClass *RC = &Mips::GPR32RegClass;
3251 MachineBasicBlock *FBB =
F->CreateMachineBasicBlock(LLVM_BB);
3252 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3253 MachineBasicBlock *
Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3256 F->insert(It, Sink);
3261 Sink->transferSuccessorsAndUpdatePHIs(BB);
3287 MI.getOperand(0).getReg())
3293 MI.eraseFromParent();
3315 unsigned Lane =
MI.getOperand(2).getImm();
3330 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3331 : &Mips::MSA128WEvensRegClass);
3337 MI.eraseFromParent();
3360 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3372 MI.eraseFromParent();
3390 unsigned Lane =
MI.getOperand(2).getImm();
3393 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3394 : &Mips::MSA128WEvensRegClass);
3405 MI.eraseFromParent();
3425 unsigned Lane =
MI.getOperand(2).getImm();
3438 MI.eraseFromParent();
3469 Register SrcVecReg =
MI.getOperand(1).getReg();
3470 Register LaneReg =
MI.getOperand(2).getReg();
3471 Register SrcValReg =
MI.getOperand(3).getReg();
3473 const TargetRegisterClass *VecRC =
nullptr;
3475 const TargetRegisterClass *GPRRC =
3476 Subtarget.isABI_N64() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3477 unsigned SubRegIdx =
Subtarget.isABI_N64() ? Mips::sub_32 : 0;
3478 unsigned ShiftOp =
Subtarget.isABI_N64() ? Mips::DSLL : Mips::SLL;
3479 unsigned EltLog2Size;
3480 unsigned InsertOp = 0;
3481 unsigned InsveOp = 0;
3482 switch (EltSizeInBytes) {
3487 InsertOp = Mips::INSERT_B;
3488 InsveOp = Mips::INSVE_B;
3489 VecRC = &Mips::MSA128BRegClass;
3493 InsertOp = Mips::INSERT_H;
3494 InsveOp = Mips::INSVE_H;
3495 VecRC = &Mips::MSA128HRegClass;
3499 InsertOp = Mips::INSERT_W;
3500 InsveOp = Mips::INSVE_W;
3501 VecRC = &Mips::MSA128WRegClass;
3505 InsertOp = Mips::INSERT_D;
3506 InsveOp = Mips::INSVE_D;
3507 VecRC = &Mips::MSA128DRegClass;
3515 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3520 if (EltSizeInBytes != 1) {
3533 .
addReg(LaneReg, {}, SubRegIdx);
3562 .
addReg(LaneTmp2, {}, SubRegIdx);
3564 MI.eraseFromParent();
3584 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3585 : &Mips::MSA128WEvensRegClass);
3587 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3588 : &Mips::MSA128WEvensRegClass);
3597 MI.eraseFromParent();
3628 MI.eraseFromParent();
3652 const MachineMemOperand &MMO = **
MI.memoperands_begin();
3658 const TargetRegisterClass *RC =
3659 MI.getOperand(1).isReg() ? RegInfo.
getRegClass(
MI.getOperand(1).getReg())
3660 : (
Subtarget.isABI_O32() ? &Mips::GPR32RegClass
3661 : &Mips::GPR64RegClass);
3662 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3673 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::SH : Mips::SH64))
3680 MI.eraseFromParent();
3709 const TargetRegisterClass *RC =
3710 MI.getOperand(1).isReg() ? RegInfo.
getRegClass(
MI.getOperand(1).getReg())
3711 : (
Subtarget.isABI_O32() ? &Mips::GPR32RegClass
3712 : &Mips::GPR64RegClass);
3714 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3717 MachineInstrBuilder MIB =
3718 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::LH : Mips::LH64), Rt);
3725 .
addReg(Rt, {}, Mips::sub_32);
3731 MI.eraseFromParent();
3787 bool IsFGR64)
const {
3794 bool IsFGR64onMips64 =
Subtarget.hasMips64() && IsFGR64;
3795 bool IsFGR64onMips32 = !
Subtarget.hasMips64() && IsFGR64;
3804 const TargetRegisterClass *GPRRC =
3805 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3806 unsigned MFC1Opc = IsFGR64onMips64
3808 : (IsFGR64onMips32 ? Mips::MFC1_D64 : Mips::MFC1);
3809 unsigned FILLOpc = IsFGR64onMips64 ? Mips::FILL_D : Mips::FILL_W;
3815 unsigned WPHI = Wtemp;
3817 if (IsFGR64onMips32) {
3843 MI.eraseFromParent();
3892 bool IsFGR64)
const {
3899 bool IsFGR64onMips64 =
Subtarget.hasMips64() && IsFGR64;
3900 bool IsFGR64onMips32 = !
Subtarget.hasMips64() && IsFGR64;
3908 const TargetRegisterClass *GPRRC =
3909 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3910 unsigned MTC1Opc = IsFGR64onMips64
3912 : (IsFGR64onMips32 ? Mips::MTC1_D64 : Mips::MTC1);
3913 Register COPYOpc = IsFGR64onMips64 ? Mips::COPY_S_D : Mips::COPY_S_W;
3932 if (IsFGR64onMips32) {
3942 MI.eraseFromParent();
3957 const TargetRegisterClass *RC = &Mips::MSA128WRegClass;
3969 .
addReg(
MI.getOperand(1).getReg());
3971 MI.eraseFromParent();
3986 const TargetRegisterClass *RC = &Mips::MSA128DRegClass;
3998 .
addReg(
MI.getOperand(1).getReg());
4000 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 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 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.
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 & 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.
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.
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.
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.