36#include "llvm/IR/IntrinsicsMips.h"
51#define DEBUG_TYPE "mips-isel"
116 for (
const auto &VecTy : VecTys) {
158 for (
MVT VT : {MVT::f32, MVT::f64}) {
258 if (
Subtarget.getCLOpts().mno_ldc1_sdc1 ||
383 if (VT == MVT::Untyped)
384 return Subtarget.hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
428 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
460 if (Ty != MVT::v8f16) {
488 EVT ResTy =
Op.getValueType();
489 assert((ResTy == MVT::f32 || ResTy == MVT::f64) &&
"Unexpected FP16_TO_FP");
493 assert(In.getValueType() == MVT::i32 &&
"Unexpected FP16_TO_FP operand type");
504 DAG.
getConstant(Intrinsic::mips_fexupr_w,
DL, MVT::i32), HVec);
506 if (ResTy == MVT::f32) {
514 DAG.
getConstant(Intrinsic::mips_fexupr_d,
DL, MVT::i32), F32Vec);
528 EVT ResTy =
Op.getValueType();
529 SDValue
In =
Op.getOperand(0);
530 assert((
In.getValueType() == MVT::f32 ||
In.getValueType() == MVT::f64) &&
531 "Unexpected FP_TO_FP16");
534 if (
In.getValueType() == MVT::f64) {
548 DAG.
getConstant(Intrinsic::mips_fexdo_h,
DL, MVT::i32), F32Vec, F32Vec);
562 if (
Subtarget.systemSupportsUnalignedAccess()) {
587 switch(
Op.getOpcode()) {
590 case ISD::SMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
true, DAG);
591 case ISD::UMUL_LOHI:
return lowerMulDiv(
Op, MipsISD::Multu,
true,
true, DAG);
592 case ISD::MULHS:
return lowerMulDiv(
Op, MipsISD::Mult,
false,
true, DAG);
593 case ISD::MULHU:
return lowerMulDiv(
Op, MipsISD::Multu,
false,
true, DAG);
594 case ISD::MUL:
return lowerMulDiv(
Op, MipsISD::Mult,
true,
false, DAG);
595 case ISD::SDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRem,
true,
true, DAG);
596 case ISD::UDIVREM:
return lowerMulDiv(
Op, MipsISD::DivRemU,
true,
true,
604 return lowerVECTOR_SHUFFLE(
Op, DAG);
607 return lowerFP16_TO_FP(
Op, DAG);
610 return lowerFP_TO_FP16(
Op, DAG);
613 return lowerR5900FPOp(
Op, DAG, RTLIB::ADD_F32);
615 return lowerR5900FPOp(
Op, DAG, RTLIB::SUB_F32);
617 return lowerR5900FPOp(
Op, DAG, RTLIB::MUL_F32);
619 return lowerR5900FPOp(
Op, DAG, RTLIB::DIV_F32);
621 return lowerR5900FPOp(
Op, DAG, RTLIB::SQRT_F32);
628 RTLIB::Libcall LC)
const {
632 if (Flags.hasNoNaNs() && Flags.hasNoInfs()) {
640 MVT VT =
Op.getSimpleValueType();
668 if (Op0Opcode == MipsISD::VEXTRACT_SEXT_ELT ||
669 Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT) {
675 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
677 if (Log2IfPositive <= 0)
683 unsigned Log2 = Log2IfPositive;
685 if ((Op0Opcode == MipsISD::VEXTRACT_ZEXT_ELT &&
Log2 >= ExtendTySize) ||
686 Log2 == ExtendTySize) {
688 return DAG.
getNode(MipsISD::VEXTRACT_ZEXT_ELT,
SDLoc(Op0),
712 APInt SplatValue, SplatUndef;
713 unsigned SplatBitSize;
716 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
730 N =
N->getOperand(0);
737 APInt SplatValue, SplatUndef;
738 unsigned SplatBitSize;
743 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
755 return N->getOperand(1) == OfNode;
758 return N->getOperand(0) == OfNode;
775 EVT Ty =
N->getValueType(0);
777 if (!Ty.is128BitVector())
788 bool IsLittleEndian = !Subtarget.
isLittle();
791 bool IsConstantMask =
false;
798 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
802 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
803 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
805 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
806 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
809 IsConstantMask =
true;
819 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
820 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
822 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
823 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
826 IsConstantMask =
true;
875 if (IsConstantMask) {
876 if (Mask.isAllOnes())
923 while (!WorkStack.
empty()) {
926 if (Val == 0 || Val == 1)
940 if ((Val - Floor).ule(Ceil - Val)) {
988 if ((
C - Floor).ule(Ceil -
C)) {
1005 EVT VT =
N->getValueType(0);
1009 C->getAPIntValue(), VT, DAG, Subtarget))
1021 APInt SplatValue, SplatUndef;
1022 unsigned SplatBitSize;
1024 unsigned EltSize = Ty.getScalarSizeInBits();
1031 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
1033 (SplatBitSize != EltSize) ||
1045 EVT Ty =
N->getValueType(0);
1047 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1068 EVT Ty =
N->getValueType(0);
1070 if (Subtarget.
hasMSA()) {
1085 if (Op0Op0->
getOpcode() != MipsISD::VEXTRACT_SEXT_ELT &&
1086 Op0Op0->
getOpcode() != MipsISD::VEXTRACT_ZEXT_ELT)
1092 if (TotalBits == 32 ||
1093 (Op0Op0->
getOpcode() == MipsISD::VEXTRACT_SEXT_ELT &&
1097 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
SDLoc(Op0Op0),
1104 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
1114 EVT Ty =
N->getValueType(0);
1116 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
1123 bool IsV216 = (Ty == MVT::v2i16);
1136 default:
return false;
1141 EVT Ty =
N->getValueType(0);
1143 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
1149 return DAG.
getNode(MipsISD::SETCC_DSP,
SDLoc(
N), Ty,
N->getOperand(0),
1150 N->getOperand(1),
N->getOperand(2));
1154 EVT Ty =
N->getValueType(0);
1156 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
1159 if (SetCC.
getOpcode() != MipsISD::SETCC_DSP)
1164 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
1172 EVT Ty =
N->getValueType(0);
1174 if (Subtarget.
hasMSA() && Ty.is128BitVector() && Ty.isInteger()) {
1200 EVT VT =
N->getValueType(0);
1219 switch (
N->getOpcode()) {
1250 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1261 switch (
MI.getOpcode()) {
1264 case Mips::BPOSGE32_PSEUDO:
1265 return emitBPOSGE32(
MI, BB);
1266 case Mips::SNZ_B_PSEUDO:
1267 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1268 case Mips::SNZ_H_PSEUDO:
1269 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1270 case Mips::SNZ_W_PSEUDO:
1271 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1272 case Mips::SNZ_D_PSEUDO:
1273 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1274 case Mips::SNZ_V_PSEUDO:
1275 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1276 case Mips::SZ_B_PSEUDO:
1277 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1278 case Mips::SZ_H_PSEUDO:
1279 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1280 case Mips::SZ_W_PSEUDO:
1281 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1282 case Mips::SZ_D_PSEUDO:
1283 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1284 case Mips::SZ_V_PSEUDO:
1285 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1286 case Mips::COPY_FW_PSEUDO:
1287 return emitCOPY_FW(
MI, BB);
1288 case Mips::COPY_FD_PSEUDO:
1289 return emitCOPY_FD(
MI, BB);
1290 case Mips::INSERT_FW_PSEUDO:
1291 return emitINSERT_FW(
MI, BB);
1292 case Mips::INSERT_FD_PSEUDO:
1293 return emitINSERT_FD(
MI, BB);
1294 case Mips::INSERT_B_VIDX_PSEUDO:
1295 case Mips::INSERT_B_VIDX64_PSEUDO:
1296 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1297 case Mips::INSERT_H_VIDX_PSEUDO:
1298 case Mips::INSERT_H_VIDX64_PSEUDO:
1299 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1300 case Mips::INSERT_W_VIDX_PSEUDO:
1301 case Mips::INSERT_W_VIDX64_PSEUDO:
1302 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1303 case Mips::INSERT_D_VIDX_PSEUDO:
1304 case Mips::INSERT_D_VIDX64_PSEUDO:
1305 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1306 case Mips::INSERT_FW_VIDX_PSEUDO:
1307 case Mips::INSERT_FW_VIDX64_PSEUDO:
1308 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1309 case Mips::INSERT_FD_VIDX_PSEUDO:
1310 case Mips::INSERT_FD_VIDX64_PSEUDO:
1311 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1312 case Mips::FILL_FW_PSEUDO:
1313 return emitFILL_FW(
MI, BB);
1314 case Mips::FILL_FD_PSEUDO:
1315 return emitFILL_FD(
MI, BB);
1316 case Mips::FEXP2_W_1_PSEUDO:
1317 return emitFEXP2_W_1(
MI, BB);
1318 case Mips::FEXP2_D_1_PSEUDO:
1319 return emitFEXP2_D_1(
MI, BB);
1323bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1324 const CCState &CCInfo,
unsigned NextStackOffset,
1338void MipsSETargetLowering::getOpndList(
1340 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
bool IsPICCall,
1341 bool GlobalOrExternal,
bool LocalLinkage,
bool IsCallReloc,
1343 Ops.push_back(Callee);
1345 LocalLinkage, IsCallReloc, CLI, Callee,
1360 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1363 SDValue
Lo = DAG.
getLoad(VT,
DL, Chain, Ptr, MachinePointerInfo(),
1368 SDValue
Hi = DAG.
getLoad(VT,
DL,
Lo.getValue(1), Ptr, MachinePointerInfo(),
1377 BP = DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1379 BP = DAG.
getNode(MipsISD::BuildPairF64_FPR,
DL, MVT::f64,
Hi,
Lo);
1396 EVT VT =
Subtarget.hasMips2() ? MVT::i32 : MVT::f32;
1398 unsigned ExtractOp =
Subtarget.hasMips2() ? MipsISD::ExtractElementF64
1399 : MipsISD::ExtractElementF64_FPR;
1414 return DAG.
getStore(Chain,
DL,
Hi, Ptr, MachinePointerInfo(),
1422 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1423 MVT Dest =
Op.getValueType().getSimpleVT();
1426 if (Src == MVT::i64 && Dest == MVT::f64) {
1430 return DAG.
getNode(MipsISD::BuildPairF64,
DL, MVT::f64,
Lo,
Hi);
1434 if (Src == MVT::f64 && Dest == MVT::i64) {
1441 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1444 DAG.
getNode(MipsISD::ExtractElementF64,
DL, MVT::i32,
Op.getOperand(0),
1454 bool HasLo,
bool HasHi,
1459 EVT Ty =
Op.getOperand(0).getValueType();
1461 SDValue Mult = DAG.
getNode(NewOpc,
DL, MVT::Untyped,
1462 Op.getOperand(0),
Op.getOperand(1));
1470 if (!HasLo || !HasHi)
1471 return HasLo ?
Lo :
Hi;
1473 SDValue Vals[] = {
Lo,
Hi };
1479 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1480 return DAG.
getNode(MipsISD::MTLOHI,
DL, MVT::Untyped, InLo, InHi);
1503 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1509 Ops.push_back(
Op->getOperand(OpNo++));
1515 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1520 Ops.push_back(Opnd);
1523 for (++OpNo ; OpNo <
Op->getNumOperands(); ++OpNo)
1524 Ops.push_back(
Op->getOperand(OpNo));
1528 Ops.push_back(In64);
1533 for (
EVT Ty :
Op->values())
1534 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1555 EVT ResTy =
Op->getValueType(0);
1565 EVT ResVecTy =
Op->getValueType(0);
1566 EVT ViaVecTy = ResVecTy;
1576 if (ResVecTy == MVT::v2i64) {
1587 ViaVecTy = MVT::v4i32;
1593 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1594 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1599 if (ViaVecTy != ResVecTy) {
1609 bool IsSigned =
false) {
1612 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1613 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1619 EVT ViaVecTy = VecTy;
1620 SDValue SplatValueA = SplatValue;
1621 SDValue SplatValueB = SplatValue;
1624 if (VecTy == MVT::v2i64) {
1626 ViaVecTy = MVT::v4i32;
1639 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1640 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1641 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1642 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1647 if (VecTy != ViaVecTy)
1656 EVT VecTy =
Op->getValueType(0);
1662 if (VecTy == MVT::v2i64) {
1664 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1676 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1685 if (VecTy == MVT::v2i64)
1699 EVT ResTy =
Op->getValueType(0);
1702 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1711 EVT ResTy =
Op->getValueType(0);
1722 EVT ResTy =
Op->getValueType(0);
1724 <<
Op->getConstantOperandAPInt(2);
1733 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1734 switch (Intrinsic) {
1737 case Intrinsic::mips_shilo:
1739 case Intrinsic::mips_dpau_h_qbl:
1741 case Intrinsic::mips_dpau_h_qbr:
1743 case Intrinsic::mips_dpsu_h_qbl:
1745 case Intrinsic::mips_dpsu_h_qbr:
1747 case Intrinsic::mips_dpa_w_ph:
1749 case Intrinsic::mips_dps_w_ph:
1751 case Intrinsic::mips_dpax_w_ph:
1753 case Intrinsic::mips_dpsx_w_ph:
1755 case Intrinsic::mips_mulsa_w_ph:
1757 case Intrinsic::mips_mult:
1759 case Intrinsic::mips_multu:
1761 case Intrinsic::mips_madd:
1763 case Intrinsic::mips_maddu:
1765 case Intrinsic::mips_msub:
1767 case Intrinsic::mips_msubu:
1769 case Intrinsic::mips_addv_b:
1770 case Intrinsic::mips_addv_h:
1771 case Intrinsic::mips_addv_w:
1772 case Intrinsic::mips_addv_d:
1775 case Intrinsic::mips_addvi_b:
1776 case Intrinsic::mips_addvi_h:
1777 case Intrinsic::mips_addvi_w:
1778 case Intrinsic::mips_addvi_d:
1781 case Intrinsic::mips_and_v:
1784 case Intrinsic::mips_andi_b:
1787 case Intrinsic::mips_bclr_b:
1788 case Intrinsic::mips_bclr_h:
1789 case Intrinsic::mips_bclr_w:
1790 case Intrinsic::mips_bclr_d:
1792 case Intrinsic::mips_bclri_b:
1793 case Intrinsic::mips_bclri_h:
1794 case Intrinsic::mips_bclri_w:
1795 case Intrinsic::mips_bclri_d:
1797 case Intrinsic::mips_binsli_b:
1798 case Intrinsic::mips_binsli_h:
1799 case Intrinsic::mips_binsli_w:
1800 case Intrinsic::mips_binsli_d: {
1802 EVT VecTy =
Op->getValueType(0);
1807 Op->getConstantOperandVal(3) + 1);
1810 Op->getOperand(2),
Op->getOperand(1));
1812 case Intrinsic::mips_binsri_b:
1813 case Intrinsic::mips_binsri_h:
1814 case Intrinsic::mips_binsri_w:
1815 case Intrinsic::mips_binsri_d: {
1817 EVT VecTy =
Op->getValueType(0);
1822 Op->getConstantOperandVal(3) + 1);
1825 Op->getOperand(2),
Op->getOperand(1));
1827 case Intrinsic::mips_bmnz_v:
1829 Op->getOperand(2),
Op->getOperand(1));
1830 case Intrinsic::mips_bmnzi_b:
1834 case Intrinsic::mips_bmz_v:
1836 Op->getOperand(1),
Op->getOperand(2));
1837 case Intrinsic::mips_bmzi_b:
1841 case Intrinsic::mips_bneg_b:
1842 case Intrinsic::mips_bneg_h:
1843 case Intrinsic::mips_bneg_w:
1844 case Intrinsic::mips_bneg_d: {
1845 EVT VecTy =
Op->getValueType(0);
1852 case Intrinsic::mips_bnegi_b:
1853 case Intrinsic::mips_bnegi_h:
1854 case Intrinsic::mips_bnegi_w:
1855 case Intrinsic::mips_bnegi_d:
1858 case Intrinsic::mips_bnz_b:
1859 case Intrinsic::mips_bnz_h:
1860 case Intrinsic::mips_bnz_w:
1861 case Intrinsic::mips_bnz_d:
1862 return DAG.
getNode(MipsISD::VALL_NONZERO,
DL,
Op->getValueType(0),
1864 case Intrinsic::mips_bnz_v:
1865 return DAG.
getNode(MipsISD::VANY_NONZERO,
DL,
Op->getValueType(0),
1867 case Intrinsic::mips_bsel_v:
1870 Op->getOperand(1),
Op->getOperand(3),
1872 case Intrinsic::mips_bseli_b:
1877 case Intrinsic::mips_bset_b:
1878 case Intrinsic::mips_bset_h:
1879 case Intrinsic::mips_bset_w:
1880 case Intrinsic::mips_bset_d: {
1881 EVT VecTy =
Op->getValueType(0);
1888 case Intrinsic::mips_bseti_b:
1889 case Intrinsic::mips_bseti_h:
1890 case Intrinsic::mips_bseti_w:
1891 case Intrinsic::mips_bseti_d:
1894 case Intrinsic::mips_bz_b:
1895 case Intrinsic::mips_bz_h:
1896 case Intrinsic::mips_bz_w:
1897 case Intrinsic::mips_bz_d:
1898 return DAG.
getNode(MipsISD::VALL_ZERO,
DL,
Op->getValueType(0),
1900 case Intrinsic::mips_bz_v:
1901 return DAG.
getNode(MipsISD::VANY_ZERO,
DL,
Op->getValueType(0),
1903 case Intrinsic::mips_ceq_b:
1904 case Intrinsic::mips_ceq_h:
1905 case Intrinsic::mips_ceq_w:
1906 case Intrinsic::mips_ceq_d:
1909 case Intrinsic::mips_ceqi_b:
1910 case Intrinsic::mips_ceqi_h:
1911 case Intrinsic::mips_ceqi_w:
1912 case Intrinsic::mips_ceqi_d:
1915 case Intrinsic::mips_cle_s_b:
1916 case Intrinsic::mips_cle_s_h:
1917 case Intrinsic::mips_cle_s_w:
1918 case Intrinsic::mips_cle_s_d:
1921 case Intrinsic::mips_clei_s_b:
1922 case Intrinsic::mips_clei_s_h:
1923 case Intrinsic::mips_clei_s_w:
1924 case Intrinsic::mips_clei_s_d:
1927 case Intrinsic::mips_cle_u_b:
1928 case Intrinsic::mips_cle_u_h:
1929 case Intrinsic::mips_cle_u_w:
1930 case Intrinsic::mips_cle_u_d:
1933 case Intrinsic::mips_clei_u_b:
1934 case Intrinsic::mips_clei_u_h:
1935 case Intrinsic::mips_clei_u_w:
1936 case Intrinsic::mips_clei_u_d:
1939 case Intrinsic::mips_clt_s_b:
1940 case Intrinsic::mips_clt_s_h:
1941 case Intrinsic::mips_clt_s_w:
1942 case Intrinsic::mips_clt_s_d:
1945 case Intrinsic::mips_clti_s_b:
1946 case Intrinsic::mips_clti_s_h:
1947 case Intrinsic::mips_clti_s_w:
1948 case Intrinsic::mips_clti_s_d:
1951 case Intrinsic::mips_clt_u_b:
1952 case Intrinsic::mips_clt_u_h:
1953 case Intrinsic::mips_clt_u_w:
1954 case Intrinsic::mips_clt_u_d:
1957 case Intrinsic::mips_clti_u_b:
1958 case Intrinsic::mips_clti_u_h:
1959 case Intrinsic::mips_clti_u_w:
1960 case Intrinsic::mips_clti_u_d:
1963 case Intrinsic::mips_copy_s_b:
1964 case Intrinsic::mips_copy_s_h:
1965 case Intrinsic::mips_copy_s_w:
1967 case Intrinsic::mips_copy_s_d:
1975 Op->getValueType(0),
Op->getOperand(1),
1978 case Intrinsic::mips_copy_u_b:
1979 case Intrinsic::mips_copy_u_h:
1980 case Intrinsic::mips_copy_u_w:
1982 case Intrinsic::mips_copy_u_d:
1993 Op->getValueType(0),
Op->getOperand(1),
1996 case Intrinsic::mips_div_s_b:
1997 case Intrinsic::mips_div_s_h:
1998 case Intrinsic::mips_div_s_w:
1999 case Intrinsic::mips_div_s_d:
2002 case Intrinsic::mips_div_u_b:
2003 case Intrinsic::mips_div_u_h:
2004 case Intrinsic::mips_div_u_w:
2005 case Intrinsic::mips_div_u_d:
2008 case Intrinsic::mips_fadd_w:
2009 case Intrinsic::mips_fadd_d:
2011 Op->getOperand(2),
Op->getFlags());
2013 case Intrinsic::mips_fceq_w:
2014 case Intrinsic::mips_fceq_d:
2017 case Intrinsic::mips_fcle_w:
2018 case Intrinsic::mips_fcle_d:
2021 case Intrinsic::mips_fclt_w:
2022 case Intrinsic::mips_fclt_d:
2025 case Intrinsic::mips_fcne_w:
2026 case Intrinsic::mips_fcne_d:
2029 case Intrinsic::mips_fcor_w:
2030 case Intrinsic::mips_fcor_d:
2033 case Intrinsic::mips_fcueq_w:
2034 case Intrinsic::mips_fcueq_d:
2037 case Intrinsic::mips_fcule_w:
2038 case Intrinsic::mips_fcule_d:
2041 case Intrinsic::mips_fcult_w:
2042 case Intrinsic::mips_fcult_d:
2045 case Intrinsic::mips_fcun_w:
2046 case Intrinsic::mips_fcun_d:
2049 case Intrinsic::mips_fcune_w:
2050 case Intrinsic::mips_fcune_d:
2053 case Intrinsic::mips_fdiv_w:
2054 case Intrinsic::mips_fdiv_d:
2058 case Intrinsic::mips_ffint_u_w:
2059 case Intrinsic::mips_ffint_u_d:
2062 case Intrinsic::mips_ffint_s_w:
2063 case Intrinsic::mips_ffint_s_d:
2066 case Intrinsic::mips_fill_b:
2067 case Intrinsic::mips_fill_h:
2068 case Intrinsic::mips_fill_w:
2069 case Intrinsic::mips_fill_d: {
2070 EVT ResTy =
Op->getValueType(0);
2078 case Intrinsic::mips_fexp2_w:
2079 case Intrinsic::mips_fexp2_d: {
2081 EVT ResTy =
Op->getValueType(0);
2086 case Intrinsic::mips_flog2_w:
2087 case Intrinsic::mips_flog2_d:
2089 case Intrinsic::mips_fmadd_w:
2090 case Intrinsic::mips_fmadd_d:
2092 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2093 case Intrinsic::mips_fmul_w:
2094 case Intrinsic::mips_fmul_d:
2096 Op->getOperand(2),
Op->getFlags());
2097 case Intrinsic::mips_fmsub_w:
2098 case Intrinsic::mips_fmsub_d: {
2100 return DAG.
getNode(MipsISD::FMS, SDLoc(
Op),
Op->getValueType(0),
2101 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2103 case Intrinsic::mips_frint_w:
2104 case Intrinsic::mips_frint_d:
2106 case Intrinsic::mips_fsqrt_w:
2107 case Intrinsic::mips_fsqrt_d:
2109 case Intrinsic::mips_fsub_w:
2110 case Intrinsic::mips_fsub_d:
2112 Op->getOperand(2),
Op->getFlags());
2113 case Intrinsic::mips_ftrunc_u_w:
2114 case Intrinsic::mips_ftrunc_u_d:
2117 case Intrinsic::mips_ftrunc_s_w:
2118 case Intrinsic::mips_ftrunc_s_d:
2121 case Intrinsic::mips_ilvev_b:
2122 case Intrinsic::mips_ilvev_h:
2123 case Intrinsic::mips_ilvev_w:
2124 case Intrinsic::mips_ilvev_d:
2125 return DAG.
getNode(MipsISD::ILVEV,
DL,
Op->getValueType(0),
2126 Op->getOperand(1),
Op->getOperand(2));
2127 case Intrinsic::mips_ilvl_b:
2128 case Intrinsic::mips_ilvl_h:
2129 case Intrinsic::mips_ilvl_w:
2130 case Intrinsic::mips_ilvl_d:
2131 return DAG.
getNode(MipsISD::ILVL,
DL,
Op->getValueType(0),
2132 Op->getOperand(1),
Op->getOperand(2));
2133 case Intrinsic::mips_ilvod_b:
2134 case Intrinsic::mips_ilvod_h:
2135 case Intrinsic::mips_ilvod_w:
2136 case Intrinsic::mips_ilvod_d:
2137 return DAG.
getNode(MipsISD::ILVOD,
DL,
Op->getValueType(0),
2138 Op->getOperand(1),
Op->getOperand(2));
2139 case Intrinsic::mips_ilvr_b:
2140 case Intrinsic::mips_ilvr_h:
2141 case Intrinsic::mips_ilvr_w:
2142 case Intrinsic::mips_ilvr_d:
2143 return DAG.
getNode(MipsISD::ILVR,
DL,
Op->getValueType(0),
2144 Op->getOperand(1),
Op->getOperand(2));
2145 case Intrinsic::mips_insert_b:
2146 case Intrinsic::mips_insert_h:
2147 case Intrinsic::mips_insert_w:
2148 case Intrinsic::mips_insert_d:
2150 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
2151 case Intrinsic::mips_insve_b:
2152 case Intrinsic::mips_insve_h:
2153 case Intrinsic::mips_insve_w:
2154 case Intrinsic::mips_insve_d: {
2157 switch (Intrinsic) {
2158 case Intrinsic::mips_insve_b:
Max = 15;
break;
2159 case Intrinsic::mips_insve_h:
Max = 7;
break;
2160 case Intrinsic::mips_insve_w:
Max = 3;
break;
2161 case Intrinsic::mips_insve_d:
Max = 1;
break;
2167 return DAG.
getNode(MipsISD::INSVE,
DL,
Op->getValueType(0),
2168 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
2171 case Intrinsic::mips_ldi_b:
2172 case Intrinsic::mips_ldi_h:
2173 case Intrinsic::mips_ldi_w:
2174 case Intrinsic::mips_ldi_d:
2176 case Intrinsic::mips_lsa:
2177 case Intrinsic::mips_dlsa: {
2178 EVT ResTy =
Op->getValueType(0);
2181 Op->getOperand(2),
Op->getOperand(3)));
2183 case Intrinsic::mips_maddv_b:
2184 case Intrinsic::mips_maddv_h:
2185 case Intrinsic::mips_maddv_w:
2186 case Intrinsic::mips_maddv_d: {
2187 EVT ResTy =
Op->getValueType(0);
2190 Op->getOperand(2),
Op->getOperand(3)));
2192 case Intrinsic::mips_max_s_b:
2193 case Intrinsic::mips_max_s_h:
2194 case Intrinsic::mips_max_s_w:
2195 case Intrinsic::mips_max_s_d:
2197 Op->getOperand(1),
Op->getOperand(2));
2198 case Intrinsic::mips_max_u_b:
2199 case Intrinsic::mips_max_u_h:
2200 case Intrinsic::mips_max_u_w:
2201 case Intrinsic::mips_max_u_d:
2203 Op->getOperand(1),
Op->getOperand(2));
2204 case Intrinsic::mips_maxi_s_b:
2205 case Intrinsic::mips_maxi_s_h:
2206 case Intrinsic::mips_maxi_s_w:
2207 case Intrinsic::mips_maxi_s_d:
2210 case Intrinsic::mips_maxi_u_b:
2211 case Intrinsic::mips_maxi_u_h:
2212 case Intrinsic::mips_maxi_u_w:
2213 case Intrinsic::mips_maxi_u_d:
2216 case Intrinsic::mips_min_s_b:
2217 case Intrinsic::mips_min_s_h:
2218 case Intrinsic::mips_min_s_w:
2219 case Intrinsic::mips_min_s_d:
2221 Op->getOperand(1),
Op->getOperand(2));
2222 case Intrinsic::mips_min_u_b:
2223 case Intrinsic::mips_min_u_h:
2224 case Intrinsic::mips_min_u_w:
2225 case Intrinsic::mips_min_u_d:
2227 Op->getOperand(1),
Op->getOperand(2));
2228 case Intrinsic::mips_mini_s_b:
2229 case Intrinsic::mips_mini_s_h:
2230 case Intrinsic::mips_mini_s_w:
2231 case Intrinsic::mips_mini_s_d:
2234 case Intrinsic::mips_mini_u_b:
2235 case Intrinsic::mips_mini_u_h:
2236 case Intrinsic::mips_mini_u_w:
2237 case Intrinsic::mips_mini_u_d:
2240 case Intrinsic::mips_mod_s_b:
2241 case Intrinsic::mips_mod_s_h:
2242 case Intrinsic::mips_mod_s_w:
2243 case Intrinsic::mips_mod_s_d:
2246 case Intrinsic::mips_mod_u_b:
2247 case Intrinsic::mips_mod_u_h:
2248 case Intrinsic::mips_mod_u_w:
2249 case Intrinsic::mips_mod_u_d:
2252 case Intrinsic::mips_mulv_b:
2253 case Intrinsic::mips_mulv_h:
2254 case Intrinsic::mips_mulv_w:
2255 case Intrinsic::mips_mulv_d:
2258 case Intrinsic::mips_msubv_b:
2259 case Intrinsic::mips_msubv_h:
2260 case Intrinsic::mips_msubv_w:
2261 case Intrinsic::mips_msubv_d: {
2262 EVT ResTy =
Op->getValueType(0);
2265 Op->getOperand(2),
Op->getOperand(3)));
2267 case Intrinsic::mips_nlzc_b:
2268 case Intrinsic::mips_nlzc_h:
2269 case Intrinsic::mips_nlzc_w:
2270 case Intrinsic::mips_nlzc_d:
2272 case Intrinsic::mips_nor_v: {
2274 Op->getOperand(1),
Op->getOperand(2));
2277 case Intrinsic::mips_nori_b: {
2283 case Intrinsic::mips_or_v:
2286 case Intrinsic::mips_ori_b:
2289 case Intrinsic::mips_pckev_b:
2290 case Intrinsic::mips_pckev_h:
2291 case Intrinsic::mips_pckev_w:
2292 case Intrinsic::mips_pckev_d:
2293 return DAG.
getNode(MipsISD::PCKEV,
DL,
Op->getValueType(0),
2294 Op->getOperand(1),
Op->getOperand(2));
2295 case Intrinsic::mips_pckod_b:
2296 case Intrinsic::mips_pckod_h:
2297 case Intrinsic::mips_pckod_w:
2298 case Intrinsic::mips_pckod_d:
2299 return DAG.
getNode(MipsISD::PCKOD,
DL,
Op->getValueType(0),
2300 Op->getOperand(1),
Op->getOperand(2));
2301 case Intrinsic::mips_pcnt_b:
2302 case Intrinsic::mips_pcnt_h:
2303 case Intrinsic::mips_pcnt_w:
2304 case Intrinsic::mips_pcnt_d:
2306 case Intrinsic::mips_sat_s_b:
2307 case Intrinsic::mips_sat_s_h:
2308 case Intrinsic::mips_sat_s_w:
2309 case Intrinsic::mips_sat_s_d:
2310 case Intrinsic::mips_sat_u_b:
2311 case Intrinsic::mips_sat_u_h:
2312 case Intrinsic::mips_sat_u_w:
2313 case Intrinsic::mips_sat_u_d: {
2316 switch (Intrinsic) {
2317 case Intrinsic::mips_sat_s_b:
2318 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2319 case Intrinsic::mips_sat_s_h:
2320 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2321 case Intrinsic::mips_sat_s_w:
2322 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2323 case Intrinsic::mips_sat_s_d:
2324 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2332 case Intrinsic::mips_shf_b:
2333 case Intrinsic::mips_shf_h:
2334 case Intrinsic::mips_shf_w: {
2338 return DAG.
getNode(MipsISD::SHF,
DL,
Op->getValueType(0),
2339 Op->getOperand(2),
Op->getOperand(1));
2341 case Intrinsic::mips_sldi_b:
2342 case Intrinsic::mips_sldi_h:
2343 case Intrinsic::mips_sldi_w:
2344 case Intrinsic::mips_sldi_d: {
2347 switch (Intrinsic) {
2348 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2349 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2350 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2351 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2359 case Intrinsic::mips_sll_b:
2360 case Intrinsic::mips_sll_h:
2361 case Intrinsic::mips_sll_w:
2362 case Intrinsic::mips_sll_d:
2365 case Intrinsic::mips_slli_b:
2366 case Intrinsic::mips_slli_h:
2367 case Intrinsic::mips_slli_w:
2368 case Intrinsic::mips_slli_d:
2371 case Intrinsic::mips_splat_b:
2372 case Intrinsic::mips_splat_h:
2373 case Intrinsic::mips_splat_w:
2374 case Intrinsic::mips_splat_d:
2379 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2382 case Intrinsic::mips_splati_b:
2383 case Intrinsic::mips_splati_h:
2384 case Intrinsic::mips_splati_w:
2385 case Intrinsic::mips_splati_d:
2386 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2389 case Intrinsic::mips_sra_b:
2390 case Intrinsic::mips_sra_h:
2391 case Intrinsic::mips_sra_w:
2392 case Intrinsic::mips_sra_d:
2395 case Intrinsic::mips_srai_b:
2396 case Intrinsic::mips_srai_h:
2397 case Intrinsic::mips_srai_w:
2398 case Intrinsic::mips_srai_d:
2401 case Intrinsic::mips_srari_b:
2402 case Intrinsic::mips_srari_h:
2403 case Intrinsic::mips_srari_w:
2404 case Intrinsic::mips_srari_d: {
2407 switch (Intrinsic) {
2408 case Intrinsic::mips_srari_b:
Max = 7;
break;
2409 case Intrinsic::mips_srari_h:
Max = 15;
break;
2410 case Intrinsic::mips_srari_w:
Max = 31;
break;
2411 case Intrinsic::mips_srari_d:
Max = 63;
break;
2419 case Intrinsic::mips_srl_b:
2420 case Intrinsic::mips_srl_h:
2421 case Intrinsic::mips_srl_w:
2422 case Intrinsic::mips_srl_d:
2425 case Intrinsic::mips_srli_b:
2426 case Intrinsic::mips_srli_h:
2427 case Intrinsic::mips_srli_w:
2428 case Intrinsic::mips_srli_d:
2431 case Intrinsic::mips_srlri_b:
2432 case Intrinsic::mips_srlri_h:
2433 case Intrinsic::mips_srlri_w:
2434 case Intrinsic::mips_srlri_d: {
2437 switch (Intrinsic) {
2438 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2439 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2440 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2441 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2449 case Intrinsic::mips_subv_b:
2450 case Intrinsic::mips_subv_h:
2451 case Intrinsic::mips_subv_w:
2452 case Intrinsic::mips_subv_d:
2455 case Intrinsic::mips_subvi_b:
2456 case Intrinsic::mips_subvi_h:
2457 case Intrinsic::mips_subvi_w:
2458 case Intrinsic::mips_subvi_d:
2461 case Intrinsic::mips_vshf_b:
2462 case Intrinsic::mips_vshf_h:
2463 case Intrinsic::mips_vshf_w:
2464 case Intrinsic::mips_vshf_d:
2465 return DAG.
getNode(MipsISD::VSHF,
DL,
Op->getValueType(0),
2466 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2467 case Intrinsic::mips_xor_v:
2470 case Intrinsic::mips_xori_b:
2473 case Intrinsic::thread_pointer: {
2475 return DAG.
getNode(MipsISD::ThreadPointer,
DL, PtrVT);
2486 EVT ResTy =
Op->getValueType(0);
2487 EVT PtrTy = Address->getValueType(0);
2502 unsigned Intr =
Op->getConstantOperandVal(1);
2506 case Intrinsic::mips_extp:
2508 case Intrinsic::mips_extpdp:
2510 case Intrinsic::mips_extr_w:
2512 case Intrinsic::mips_extr_r_w:
2514 case Intrinsic::mips_extr_rs_w:
2516 case Intrinsic::mips_extr_s_h:
2518 case Intrinsic::mips_mthlip:
2520 case Intrinsic::mips_mulsaq_s_w_ph:
2522 case Intrinsic::mips_maq_s_w_phl:
2524 case Intrinsic::mips_maq_s_w_phr:
2526 case Intrinsic::mips_maq_sa_w_phl:
2528 case Intrinsic::mips_maq_sa_w_phr:
2530 case Intrinsic::mips_dpaq_s_w_ph:
2532 case Intrinsic::mips_dpsq_s_w_ph:
2534 case Intrinsic::mips_dpaq_sa_l_w:
2536 case Intrinsic::mips_dpsq_sa_l_w:
2538 case Intrinsic::mips_dpaqx_s_w_ph:
2540 case Intrinsic::mips_dpaqx_sa_w_ph:
2542 case Intrinsic::mips_dpsqx_s_w_ph:
2544 case Intrinsic::mips_dpsqx_sa_w_ph:
2546 case Intrinsic::mips_ld_b:
2547 case Intrinsic::mips_ld_h:
2548 case Intrinsic::mips_ld_w:
2549 case Intrinsic::mips_ld_d:
2561 EVT PtrTy = Address->getValueType(0);
2577 unsigned Intr =
Op->getConstantOperandVal(1);
2581 case Intrinsic::mips_st_b:
2582 case Intrinsic::mips_st_h:
2583 case Intrinsic::mips_st_w:
2584 case Intrinsic::mips_st_d:
2599 EVT ResTy =
Op->getValueType(0);
2600 SDValue Op0 =
Op->getOperand(0);
2607 SDValue Op1 =
Op->getOperand(1);
2609 return DAG.
getNode(MipsISD::VEXTRACT_SEXT_ELT,
DL, ResTy, Op0, Op1,
2627 for (
unsigned i = 0; i <
Op->getNumOperands(); ++i)
2649 EVT ResTy =
Op->getValueType(0);
2651 APInt SplatValue, SplatUndef;
2652 unsigned SplatBitSize;
2658 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2660 !
Subtarget.isLittle()) && SplatBitSize <= 64) {
2662 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2674 switch (SplatBitSize) {
2678 ViaVecTy = MVT::v16i8;
2681 ViaVecTy = MVT::v8i16;
2684 ViaVecTy = MVT::v4i32;
2695 if (ViaVecTy != ResTy)
2705 EVT ResTy =
Node->getValueType(0);
2711 for (
unsigned i = 0; i < NumElts; ++i) {
2713 Node->getOperand(i),
2743 int SHFIndices[4] = { -1, -1, -1, -1 };
2745 if (Indices.
size() < 4)
2748 for (
unsigned i = 0; i < 4; ++i) {
2749 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2750 int Idx = Indices[j];
2756 if (Idx < 0 || Idx >= 4)
2762 if (SHFIndices[i] == -1)
2763 SHFIndices[i] = Idx;
2767 if (!(Idx == -1 || Idx == SHFIndices[i]))
2774 for (
int i = 3; i >= 0; --i) {
2775 int Idx = SHFIndices[i];
2785 return DAG.
getNode(MipsISD::SHF,
DL, ResTy,
2792template <
typename ValType>
2795 unsigned CheckStride,
2797 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2801 if (*
I != -1 && *
I != ExpectedIndex)
2803 ExpectedIndex += ExpectedIndexStride;
2807 for (
unsigned n = 0; n < CheckStride &&
I !=
End; ++n, ++
I)
2826 int SplatIndex = -1;
2827 for (
const auto &V : Indices) {
2860 const auto &Begin = Indices.
begin();
2861 const auto &
End = Indices.
end();
2866 Wt =
Op->getOperand(0);
2868 Wt =
Op->getOperand(1);
2875 Ws =
Op->getOperand(0);
2877 Ws =
Op->getOperand(1);
2906 const auto &Begin = Indices.
begin();
2907 const auto &
End = Indices.
end();
2912 Wt =
Op->getOperand(0);
2914 Wt =
Op->getOperand(1);
2921 Ws =
Op->getOperand(0);
2923 Ws =
Op->getOperand(1);
2953 const auto &Begin = Indices.
begin();
2954 const auto &
End = Indices.
end();
2959 Wt =
Op->getOperand(0);
2961 Wt =
Op->getOperand(1);
2968 Ws =
Op->getOperand(0);
2970 Ws =
Op->getOperand(1);
2998 unsigned HalfSize = Indices.
size() / 2;
3001 const auto &Begin = Indices.
begin();
3002 const auto &
End = Indices.
end();
3007 Wt =
Op->getOperand(0);
3009 Wt =
Op->getOperand(1);
3016 Ws =
Op->getOperand(0);
3019 Ws =
Op->getOperand(1);
3048 const auto &Begin = Indices.
begin();
3049 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3050 const auto &
End = Indices.
end();
3053 Wt =
Op->getOperand(0);
3055 Wt =
Op->getOperand(1);
3060 Ws =
Op->getOperand(0);
3062 Ws =
Op->getOperand(1);
3091 const auto &Begin = Indices.
begin();
3092 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
3093 const auto &
End = Indices.
end();
3096 Wt =
Op->getOperand(0);
3098 Wt =
Op->getOperand(1);
3103 Ws =
Op->getOperand(0);
3105 Ws =
Op->getOperand(1);
3127 const bool isSPLATI,
3134 bool Using1stVec =
false;
3135 bool Using2ndVec =
false;
3139 for (
int i = 0; i < ResTyNumElts; ++i) {
3141 int Idx = Indices[i];
3143 if (0 <= Idx && Idx < ResTyNumElts)
3145 if (ResTyNumElts <= Idx && Idx < ResTyNumElts * 2)
3152 for (
int Idx : Indices)
3158 int LastValidIndex = SplatIndex;
3159 for (
size_t i = 0; i < Indices.
size(); i++) {
3160 int Idx = Indices[i];
3163 Idx = isSPLATI ? SplatIndex : LastValidIndex;
3165 LastValidIndex = Idx;
3172 if (Using1stVec && Using2ndVec) {
3173 Op0 =
Op->getOperand(0);
3174 Op1 =
Op->getOperand(1);
3175 }
else if (Using1stVec)
3176 Op0 = Op1 =
Op->getOperand(0);
3177 else if (Using2ndVec)
3178 Op0 = Op1 =
Op->getOperand(1);
3180 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
3189 return DAG.
getNode(MipsISD::VSHF,
DL, ResTy, MaskVec, Op1, Op0);
3197 EVT ResTy =
Op->getValueType(0);
3203 SmallVector<int, 16> Indices;
3205 for (
int i = 0; i < ResTyNumElts; ++i)
3254 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3255 MachineBasicBlock *Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3258 F->insert(It, Sink);
3269 TBB->addSuccessor(Sink);
3291 MI.getOperand(0).getReg())
3297 MI.eraseFromParent();
3324 MachineBasicBlock *FBB =
F->CreateMachineBasicBlock(LLVM_BB);
3325 MachineBasicBlock *
TBB =
F->CreateMachineBasicBlock(LLVM_BB);
3326 MachineBasicBlock *Sink =
F->CreateMachineBasicBlock(LLVM_BB);
3329 F->insert(It, Sink);
3340 TBB->addSuccessor(Sink);
3362 MI.getOperand(0).getReg())
3368 MI.eraseFromParent();
3390 unsigned Lane =
MI.getOperand(2).getImm();
3405 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3406 : &Mips::MSA128WEvensRegClass);
3412 MI.eraseFromParent();
3435 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3447 MI.eraseFromParent();
3465 unsigned Lane =
MI.getOperand(2).getImm();
3468 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3469 : &Mips::MSA128WEvensRegClass);
3480 MI.eraseFromParent();
3500 unsigned Lane =
MI.getOperand(2).getImm();
3513 MI.eraseFromParent();
3544 Register SrcVecReg =
MI.getOperand(1).getReg();
3545 Register LaneReg =
MI.getOperand(2).getReg();
3546 Register SrcValReg =
MI.getOperand(3).getReg();
3551 Subtarget.isABI_N64() ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3552 unsigned SubRegIdx =
Subtarget.isABI_N64() ? Mips::sub_32 : 0;
3553 unsigned ShiftOp =
Subtarget.isABI_N64() ? Mips::DSLL : Mips::SLL;
3554 unsigned EltLog2Size;
3555 unsigned InsertOp = 0;
3556 unsigned InsveOp = 0;
3557 switch (EltSizeInBytes) {
3562 InsertOp = Mips::INSERT_B;
3563 InsveOp = Mips::INSVE_B;
3564 VecRC = &Mips::MSA128BRegClass;
3568 InsertOp = Mips::INSERT_H;
3569 InsveOp = Mips::INSVE_H;
3570 VecRC = &Mips::MSA128HRegClass;
3574 InsertOp = Mips::INSERT_W;
3575 InsveOp = Mips::INSVE_W;
3576 VecRC = &Mips::MSA128WRegClass;
3580 InsertOp = Mips::INSERT_D;
3581 InsveOp = Mips::INSVE_D;
3582 VecRC = &Mips::MSA128DRegClass;
3590 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3595 if (EltSizeInBytes != 1) {
3608 .
addReg(LaneReg, {}, SubRegIdx);
3637 .
addReg(LaneTmp2, {}, SubRegIdx);
3639 MI.eraseFromParent();
3659 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3660 : &Mips::MSA128WEvensRegClass);
3662 Subtarget.useOddSPReg() ? &Mips::MSA128WRegClass
3663 : &Mips::MSA128WEvensRegClass);
3672 MI.eraseFromParent();
3703 MI.eraseFromParent();
3730 .
addReg(
MI.getOperand(1).getReg());
3732 MI.eraseFromParent();
3759 .
addReg(
MI.getOperand(1).getReg());
3761 MI.eraseFromParent();
static SDValue performSHLCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, SelectionDAG &DAG)
If the operand is a bitwise AND with a constant RHS, and the shift has a constant RHS and is the only...
static SDValue performORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue performANDCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue performSETCCCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, SelectionDAG &DAG)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
const HexagonInstrInfo * TII
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool fitsRegularPattern(typename SmallVectorImpl< ValType >::const_iterator Begin, unsigned CheckStride, typename SmallVectorImpl< ValType >::const_iterator End, ValType ExpectedIndex, unsigned ExpectedIndexStride)
Determine whether a range fits a regular pattern of values.
static SDValue performVSELECTCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const LoongArchSubtarget &Subtarget)
static SDValue performSRLCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const LoongArchSubtarget &Subtarget)
static SDValue truncateVecElts(SDNode *Node, SelectionDAG &DAG)
Promote Memory to Register
static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc, SDValue Imm, bool BigEndian)
static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG)
static SDValue performMULCombine(SDNode *N, SelectionDAG &DAG, const TargetLowering::DAGCombinerInfo &DCI, const MipsSETargetLowering *TL, const MipsSubtarget &Subtarget)
static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc)
static SDValue performDSPShiftCombine(unsigned Opc, SDNode *N, EVT Ty, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc)
static SDValue lowerVECTOR_SHUFFLE_ILVR(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue getBuildVectorSplat(EVT VecTy, SDValue SplatValue, bool BigEndian, SelectionDAG &DAG)
static bool isVSplat(SDValue N, APInt &Imm, bool IsLittleEndian)
static SDValue initAccumulator(SDValue In, const SDLoc &DL, SelectionDAG &DAG)
static bool isBitwiseInverse(SDValue N, SDValue OfNode)
static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr, const MipsSubtarget &Subtarget)
static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
static bool isVectorAllOnes(SDValue N)
static SDValue lowerVECTOR_SHUFFLE_PCKOD(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue performFP_TO_UINTCombine(SDNode *N, SelectionDAG &DAG)
static bool isLegalDSPCondCode(EVT Ty, ISD::CondCode CC)
static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG)
static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG)
static SDValue lowerVECTOR_SHUFFLE_PCKEV(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue genConstMult(SDValue X, APInt C, const SDLoc &DL, EVT VT, EVT ShiftTy, SelectionDAG &DAG)
static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG, bool IsSigned=false)
static SDValue lowerVECTOR_SHUFFLE_ILVOD(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static bool isConstantOrUndef(const SDValue Op)
static SDValue lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy, const SmallVector< int, 16 > &Indices, const bool isSPLATI, SelectionDAG &DAG)
static SDValue lowerVECTOR_SHUFFLE_SHF(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static SDValue extractLOHI(SDValue Op, const SDLoc &DL, SelectionDAG &DAG)
static bool shouldTransformMulToShiftsAddsSubs(APInt C, EVT VT, SelectionDAG &DAG, const MipsSubtarget &Subtarget)
static SDValue lowerVECTOR_SHUFFLE_ILVEV(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static bool isVECTOR_SHUFFLE_SPLATI(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
static bool isConstantOrUndefBUILD_VECTOR(const BuildVectorSDNode *Op)
static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr, const MipsSubtarget &Subtarget)
static SDValue lowerVECTOR_SHUFFLE_ILVL(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool isNegative() const
Determine sign of this APInt.
unsigned logBase2() const
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
CCState - This class holds information needed while lowering arguments and return values.
unsigned getInRegsParamsCount() const
uint64_t getZExtValue() const
const SDValue & getBasePtr() const
const Triple & getTargetTriple() const
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static auto fixedlen_vector_valuetypes()
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
BasicBlockListType::iterator iterator
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
Flags getFlags() const
Return the raw flags of the source value,.
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const SDValue & getChain() const
EVT getMemoryVT() const
Return the type of the in-memory value.
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
unsigned getIncomingArgSize() const
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
void addMSAFloatType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC)
Enable MSA support for the given floating-point type and Register class.
void addMSAIntType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC)
Enable MSA support for the given integer type and Register class.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
const TargetRegisterClass * getRepRegClassFor(MVT VT) const override
Return the 'representative' register class for the specified value type.
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const override
Determine if the target supports unaligned memory accesses.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
This callback is invoked for operations that are unsupported by the target, which are registered to u...
MipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
MipsTargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
virtual void getOpndList(SmallVectorImpl< SDValue > &Ops, std::deque< std::pair< unsigned, SDValue > > &RegsToPass, bool IsPICCall, bool GlobalOrExternal, bool LocalLinkage, bool IsCallReloc, CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const
This function fills Ops, which is the list of operands that will later be used when a function call n...
SDValue lowerSTORE(SDValue Op, SelectionDAG &DAG) const
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
LowerOperation - Provide custom lowering hooks for some operations.
const MipsSubtarget & Subtarget
SDValue lowerLOAD(SDValue Op, SelectionDAG &DAG) const
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
unsigned getNumOperands() const
Return the number of values used by this operation.
SDVTList getVTList() const
const SDValue & getOperand(unsigned Num) const
LLVM_ABI void printrWithDepth(raw_ostream &O, const SelectionDAG *G=nullptr, unsigned depth=100) const
Print a SelectionDAG node and children up to depth "depth." The given SelectionDAG allows target-spec...
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
const SDValue & getOperand(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getOpcode() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
const TargetLowering & getTargetLoweringInfo() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
typename SuperClass::const_iterator const_iterator
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
const SDValue & getBasePtr() const
const SDValue & getValue() const
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
void setOperationPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT)
Convenience method to set an operation to Promote and specify the type in a single call.
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
virtual TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const
Return the preferred vector type legalization action.
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose.
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Add the specified register class as an available regclass for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
virtual const TargetRegisterClass * getRepRegClassFor(MVT VT) const
Return the 'representative' register class for the specified value type.
void setCondCodeAction(ArrayRef< ISD::CondCode > CCs, MVT VT, LegalizeAction Action)
Indicate that the specified condition code is or isn't supported on the target and indicate what to d...
void setTargetDAGCombine(ArrayRef< ISD::NodeType > NTs)
Targets should invoke this method for each target independent node that they want to provide a custom...
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified load with extension does not work with the specified type and indicate wh...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
LLVM_ABI bool isLittleEndian() const
Tests whether the target triple is little endian.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
@ POISON
POISON - A poison node.
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
@ ADD
Simple integer binary arithmetic operators.
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
@ FADD
Simple binary floating point operators.
@ ATOMIC_FENCE
OUTCHAIN = ATOMIC_FENCE(INCHAIN, ordering, scope) This corresponds to the fence instruction.
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
@ STRICT_FSQRT
Constrained versions of libm-equivalent floating point intrinsics.
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ SIGN_EXTEND
Conversion operators.
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
@ UNDEF
UNDEF - An undefined node.
@ BasicBlock
Various leaf nodes.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
@ SHL
Shift and rotation operations.
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
@ AND
Bitwise operators - logical and, logical or, logical xor.
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
@ STRICT_FADD
Constrained versions of the binary floating point operators.
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
@ BRCOND
BRCOND - Conditional branch.
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
NodeAddr< NodeBase * > Node
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ Fast
Assign the register banks as fast as possible (default).
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
const MipsTargetLowering * createMipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
unsigned Log2(Align A)
Returns the log2 of the alignment.
@ End
Run the machine verifier once, at the end of the pipeline.
@ Custom
The result value requires a custom uniformity check.
MCRegisterClass TargetRegisterClass
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
This struct is a compact representation of a valid (non-zero power of two) alignment.
EVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
uint64_t getScalarSizeInBits() const
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
bool is128BitVector() const
Return true if this is a 128-bit vector type.
bool isVector() const
Return true if this is a vector value type.
EVT getVectorElementType() const
Given a vector type, return the type of each element.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
bool isInteger() const
Return true if this is an integer or a vector integer type.
This class contains a discriminated union of information about pointers in memory operands,...
These are IR-level optimization flags that may be propagated to SDNodes.
This structure is used to pass arguments to makeLibCall function.