36#include "llvm/IR/IntrinsicsMips.h"
51#define DEBUG_TYPE "mips-isel"
58 cl::desc(
"Expand double precision loads and "
59 "stores to their single precision "
86 for (
const auto &VecTy : VecTys) {
306 if (VT == MVT::Untyped)
307 return Subtarget.
hasDSP() ? &Mips::ACC64DSPRegClass : &Mips::ACC64RegClass;
351 if (Ty == MVT::v4i32 || Ty == MVT::v2i64) {
382 if (Ty != MVT::v8f16) {
409 EVT ResTy =
Op->getValueType(0);
449 switch(
Op.getOpcode()) {
501 int32_t Log2IfPositive = (Mask->getAPIntValue() + 1).exactLogBase2();
503 if (Log2IfPositive <= 0)
507 EVT ExtendTy = cast<VTSDNode>(Op0Op2)->getVT();
509 unsigned Log2 = Log2IfPositive;
512 Log2 == ExtendTySize) {
538 APInt SplatValue, SplatUndef;
539 unsigned SplatBitSize;
542 if (!
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
556 N =
N->getOperand(0);
563 APInt SplatValue, SplatUndef;
564 unsigned SplatBitSize;
569 if (BVN->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs))
581 return N->getOperand(1) == OfNode;
584 return N->getOperand(0) == OfNode;
601 EVT Ty =
N->getValueType(0);
614 bool IsLittleEndian = !Subtarget.
isLittle();
617 bool IsConstantMask =
false;
624 if (
isVSplat(Op0Op0, Mask, IsLittleEndian)) {
628 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
629 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
631 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
632 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
635 IsConstantMask =
true;
645 if (
isVSplat(Op1Op0, InvMask, IsLittleEndian) &&
646 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
648 else if (
isVSplat(Op1Op1, InvMask, IsLittleEndian) &&
649 Mask.getBitWidth() == InvMask.
getBitWidth() && Mask == ~InvMask)
652 IsConstantMask =
true;
701 if (IsConstantMask) {
702 if (Mask.isAllOnes())
749 while (!WorkStack.
empty()) {
752 if (Val == 0 || Val == 1)
766 if ((Val - Floor).ule(Ceil - Val)) {
814 if ((
C - Floor).ule(Ceil -
C)) {
831 EVT VT =
N->getValueType(0);
835 C->getAPIntValue(), VT, DAG, Subtarget))
847 APInt SplatValue, SplatUndef;
848 unsigned SplatBitSize;
857 !BV->
isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
859 (SplatBitSize != EltSize) ||
864 return DAG.
getNode(Opc,
DL, Ty,
N->getOperand(0),
871 EVT Ty =
N->getValueType(0);
873 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
894 EVT Ty =
N->getValueType(0);
915 EVT ExtendTy = cast<VTSDNode>(Op0Op0->
getOperand(2))->getVT();
918 if (TotalBits == 32 ||
930 if ((Ty != MVT::v2i16) && ((Ty != MVT::v4i8) || !Subtarget.
hasDSPR2()))
940 EVT Ty =
N->getValueType(0);
942 if (((Ty != MVT::v2i16) || !Subtarget.
hasDSPR2()) && (Ty != MVT::v4i8))
949 bool IsV216 = (Ty == MVT::v2i16);
962 default:
return false;
967 EVT Ty =
N->getValueType(0);
969 if ((Ty != MVT::v2i16) && (Ty != MVT::v4i8))
976 N->getOperand(1),
N->getOperand(2));
980 EVT Ty =
N->getValueType(0);
982 if (Ty == MVT::v2i16 || Ty == MVT::v4i8) {
990 N->getOperand(1),
N->getOperand(2), SetCC.
getOperand(2));
998 EVT Ty =
N->getValueType(0);
1028 switch (
N->getOpcode()) {
1056 N->printrWithDepth(
dbgs(), &DAG);
dbgs() <<
"\n=> \n";
1067 switch (
MI.getOpcode()) {
1070 case Mips::BPOSGE32_PSEUDO:
1071 return emitBPOSGE32(
MI, BB);
1072 case Mips::SNZ_B_PSEUDO:
1073 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_B);
1074 case Mips::SNZ_H_PSEUDO:
1075 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_H);
1076 case Mips::SNZ_W_PSEUDO:
1077 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_W);
1078 case Mips::SNZ_D_PSEUDO:
1079 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_D);
1080 case Mips::SNZ_V_PSEUDO:
1081 return emitMSACBranchPseudo(
MI, BB, Mips::BNZ_V);
1082 case Mips::SZ_B_PSEUDO:
1083 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_B);
1084 case Mips::SZ_H_PSEUDO:
1085 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_H);
1086 case Mips::SZ_W_PSEUDO:
1087 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_W);
1088 case Mips::SZ_D_PSEUDO:
1089 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_D);
1090 case Mips::SZ_V_PSEUDO:
1091 return emitMSACBranchPseudo(
MI, BB, Mips::BZ_V);
1092 case Mips::COPY_FW_PSEUDO:
1093 return emitCOPY_FW(
MI, BB);
1094 case Mips::COPY_FD_PSEUDO:
1095 return emitCOPY_FD(
MI, BB);
1096 case Mips::INSERT_FW_PSEUDO:
1097 return emitINSERT_FW(
MI, BB);
1098 case Mips::INSERT_FD_PSEUDO:
1099 return emitINSERT_FD(
MI, BB);
1100 case Mips::INSERT_B_VIDX_PSEUDO:
1101 case Mips::INSERT_B_VIDX64_PSEUDO:
1102 return emitINSERT_DF_VIDX(
MI, BB, 1,
false);
1103 case Mips::INSERT_H_VIDX_PSEUDO:
1104 case Mips::INSERT_H_VIDX64_PSEUDO:
1105 return emitINSERT_DF_VIDX(
MI, BB, 2,
false);
1106 case Mips::INSERT_W_VIDX_PSEUDO:
1107 case Mips::INSERT_W_VIDX64_PSEUDO:
1108 return emitINSERT_DF_VIDX(
MI, BB, 4,
false);
1109 case Mips::INSERT_D_VIDX_PSEUDO:
1110 case Mips::INSERT_D_VIDX64_PSEUDO:
1111 return emitINSERT_DF_VIDX(
MI, BB, 8,
false);
1112 case Mips::INSERT_FW_VIDX_PSEUDO:
1113 case Mips::INSERT_FW_VIDX64_PSEUDO:
1114 return emitINSERT_DF_VIDX(
MI, BB, 4,
true);
1115 case Mips::INSERT_FD_VIDX_PSEUDO:
1116 case Mips::INSERT_FD_VIDX64_PSEUDO:
1117 return emitINSERT_DF_VIDX(
MI, BB, 8,
true);
1118 case Mips::FILL_FW_PSEUDO:
1119 return emitFILL_FW(
MI, BB);
1120 case Mips::FILL_FD_PSEUDO:
1121 return emitFILL_FD(
MI, BB);
1122 case Mips::FEXP2_W_1_PSEUDO:
1123 return emitFEXP2_W_1(
MI, BB);
1124 case Mips::FEXP2_D_1_PSEUDO:
1125 return emitFEXP2_D_1(
MI, BB);
1127 return emitST_F16_PSEUDO(
MI, BB);
1129 return emitLD_F16_PSEUDO(
MI, BB);
1130 case Mips::MSA_FP_EXTEND_W_PSEUDO:
1131 return emitFPEXTEND_PSEUDO(
MI, BB,
false);
1132 case Mips::MSA_FP_ROUND_W_PSEUDO:
1133 return emitFPROUND_PSEUDO(
MI, BB,
false);
1134 case Mips::MSA_FP_EXTEND_D_PSEUDO:
1135 return emitFPEXTEND_PSEUDO(
MI, BB,
true);
1136 case Mips::MSA_FP_ROUND_D_PSEUDO:
1137 return emitFPROUND_PSEUDO(
MI, BB,
true);
1141bool MipsSETargetLowering::isEligibleForTailCallOptimization(
1142 const CCState &CCInfo,
unsigned NextStackOffset,
1160void MipsSETargetLowering::
1162 std::deque<std::pair<unsigned, SDValue>> &RegsToPass,
1163 bool IsPICCall,
bool GlobalOrExternal,
bool InternalLinkage,
1164 bool IsCallReloc, CallLoweringInfo &CLI,
SDValue Callee,
1168 InternalLinkage, IsCallReloc, CLI, Callee,
1181 EVT PtrVT =
Ptr.getValueType();
1210 EVT PtrVT =
Ptr.getValueType();
1233 MVT Src =
Op.getOperand(0).getValueType().getSimpleVT();
1234 MVT Dest =
Op.getValueType().getSimpleVT();
1237 if (Src == MVT::i64 && Dest == MVT::f64) {
1245 if (Src == MVT::f64 && Dest == MVT::i64) {
1265 bool HasLo,
bool HasHi,
1270 EVT Ty =
Op.getOperand(0).getValueType();
1273 Op.getOperand(0),
Op.getOperand(1));
1281 if (!HasLo || !HasHi)
1282 return HasLo ?
Lo :
Hi;
1290 std::tie(InLo, InHi) = DAG.
SplitScalar(In,
DL, MVT::i32, MVT::i32);
1314 bool HasChainIn =
Op->getOperand(0).getValueType() == MVT::Other;
1326 SDValue Opnd =
Op->getOperand(++OpNo), In64;
1344 for (
EVT Ty :
Op->values())
1345 ResTys.
push_back((Ty == MVT::i64) ? MVT::Untyped : Ty);
1364 EVT ResTy =
Op->getValueType(0);
1374 EVT ResVecTy =
Op->getValueType(0);
1375 EVT ViaVecTy = ResVecTy;
1385 if (ResVecTy == MVT::v2i64) {
1388 if (isa<ConstantSDNode>(LaneA))
1396 ViaVecTy = MVT::v4i32;
1402 SDValue Ops[16] = { LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB,
1403 LaneA, LaneB, LaneA, LaneB, LaneA, LaneB, LaneA, LaneB };
1408 if (ViaVecTy != ResVecTy) {
1418 bool IsSigned =
false) {
1419 auto *CImm = cast<ConstantSDNode>(
Op->getOperand(ImmOp));
1421 APInt(
Op->getValueType(0).getScalarType().getSizeInBits(),
1422 IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned),
1428 EVT ViaVecTy = VecTy;
1429 SDValue SplatValueA = SplatValue;
1430 SDValue SplatValueB = SplatValue;
1433 if (VecTy == MVT::v2i64) {
1435 ViaVecTy = MVT::v4i32;
1448 SDValue Ops[16] = { SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1449 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1450 SplatValueA, SplatValueB, SplatValueA, SplatValueB,
1451 SplatValueA, SplatValueB, SplatValueA, SplatValueB };
1456 if (VecTy != ViaVecTy)
1465 EVT VecTy =
Op->getValueType(0);
1471 if (VecTy == MVT::v2i64) {
1473 APInt BitImm =
APInt(64, 1) << CImm->getAPIntValue();
1485 {BitImmLoOp, BitImmHiOp, BitImmLoOp, BitImmHiOp}));
1494 if (VecTy == MVT::v2i64)
1503 return DAG.
getNode(Opc,
DL, VecTy,
Op->getOperand(1), Exp2Imm);
1508 EVT ResTy =
Op->getValueType(0);
1511 MVT ResEltTy = ResTy == MVT::v2i64 ? MVT::i64 : MVT::i32;
1520 EVT ResTy =
Op->getValueType(0);
1531 EVT ResTy =
Op->getValueType(0);
1533 <<
Op->getConstantOperandAPInt(2);
1542 unsigned Intrinsic =
Op->getConstantOperandVal(0);
1543 switch (Intrinsic) {
1546 case Intrinsic::mips_shilo:
1548 case Intrinsic::mips_dpau_h_qbl:
1550 case Intrinsic::mips_dpau_h_qbr:
1552 case Intrinsic::mips_dpsu_h_qbl:
1554 case Intrinsic::mips_dpsu_h_qbr:
1556 case Intrinsic::mips_dpa_w_ph:
1558 case Intrinsic::mips_dps_w_ph:
1560 case Intrinsic::mips_dpax_w_ph:
1562 case Intrinsic::mips_dpsx_w_ph:
1564 case Intrinsic::mips_mulsa_w_ph:
1566 case Intrinsic::mips_mult:
1568 case Intrinsic::mips_multu:
1570 case Intrinsic::mips_madd:
1572 case Intrinsic::mips_maddu:
1574 case Intrinsic::mips_msub:
1576 case Intrinsic::mips_msubu:
1578 case Intrinsic::mips_addv_b:
1579 case Intrinsic::mips_addv_h:
1580 case Intrinsic::mips_addv_w:
1581 case Intrinsic::mips_addv_d:
1584 case Intrinsic::mips_addvi_b:
1585 case Intrinsic::mips_addvi_h:
1586 case Intrinsic::mips_addvi_w:
1587 case Intrinsic::mips_addvi_d:
1590 case Intrinsic::mips_and_v:
1593 case Intrinsic::mips_andi_b:
1596 case Intrinsic::mips_bclr_b:
1597 case Intrinsic::mips_bclr_h:
1598 case Intrinsic::mips_bclr_w:
1599 case Intrinsic::mips_bclr_d:
1601 case Intrinsic::mips_bclri_b:
1602 case Intrinsic::mips_bclri_h:
1603 case Intrinsic::mips_bclri_w:
1604 case Intrinsic::mips_bclri_d:
1606 case Intrinsic::mips_binsli_b:
1607 case Intrinsic::mips_binsli_h:
1608 case Intrinsic::mips_binsli_w:
1609 case Intrinsic::mips_binsli_d: {
1611 EVT VecTy =
Op->getValueType(0);
1616 Op->getConstantOperandVal(3) + 1);
1619 Op->getOperand(2),
Op->getOperand(1));
1621 case Intrinsic::mips_binsri_b:
1622 case Intrinsic::mips_binsri_h:
1623 case Intrinsic::mips_binsri_w:
1624 case Intrinsic::mips_binsri_d: {
1626 EVT VecTy =
Op->getValueType(0);
1631 Op->getConstantOperandVal(3) + 1);
1634 Op->getOperand(2),
Op->getOperand(1));
1636 case Intrinsic::mips_bmnz_v:
1638 Op->getOperand(2),
Op->getOperand(1));
1639 case Intrinsic::mips_bmnzi_b:
1643 case Intrinsic::mips_bmz_v:
1645 Op->getOperand(1),
Op->getOperand(2));
1646 case Intrinsic::mips_bmzi_b:
1650 case Intrinsic::mips_bneg_b:
1651 case Intrinsic::mips_bneg_h:
1652 case Intrinsic::mips_bneg_w:
1653 case Intrinsic::mips_bneg_d: {
1654 EVT VecTy =
Op->getValueType(0);
1661 case Intrinsic::mips_bnegi_b:
1662 case Intrinsic::mips_bnegi_h:
1663 case Intrinsic::mips_bnegi_w:
1664 case Intrinsic::mips_bnegi_d:
1667 case Intrinsic::mips_bnz_b:
1668 case Intrinsic::mips_bnz_h:
1669 case Intrinsic::mips_bnz_w:
1670 case Intrinsic::mips_bnz_d:
1673 case Intrinsic::mips_bnz_v:
1676 case Intrinsic::mips_bsel_v:
1679 Op->getOperand(1),
Op->getOperand(3),
1681 case Intrinsic::mips_bseli_b:
1686 case Intrinsic::mips_bset_b:
1687 case Intrinsic::mips_bset_h:
1688 case Intrinsic::mips_bset_w:
1689 case Intrinsic::mips_bset_d: {
1690 EVT VecTy =
Op->getValueType(0);
1697 case Intrinsic::mips_bseti_b:
1698 case Intrinsic::mips_bseti_h:
1699 case Intrinsic::mips_bseti_w:
1700 case Intrinsic::mips_bseti_d:
1703 case Intrinsic::mips_bz_b:
1704 case Intrinsic::mips_bz_h:
1705 case Intrinsic::mips_bz_w:
1706 case Intrinsic::mips_bz_d:
1709 case Intrinsic::mips_bz_v:
1712 case Intrinsic::mips_ceq_b:
1713 case Intrinsic::mips_ceq_h:
1714 case Intrinsic::mips_ceq_w:
1715 case Intrinsic::mips_ceq_d:
1718 case Intrinsic::mips_ceqi_b:
1719 case Intrinsic::mips_ceqi_h:
1720 case Intrinsic::mips_ceqi_w:
1721 case Intrinsic::mips_ceqi_d:
1724 case Intrinsic::mips_cle_s_b:
1725 case Intrinsic::mips_cle_s_h:
1726 case Intrinsic::mips_cle_s_w:
1727 case Intrinsic::mips_cle_s_d:
1730 case Intrinsic::mips_clei_s_b:
1731 case Intrinsic::mips_clei_s_h:
1732 case Intrinsic::mips_clei_s_w:
1733 case Intrinsic::mips_clei_s_d:
1736 case Intrinsic::mips_cle_u_b:
1737 case Intrinsic::mips_cle_u_h:
1738 case Intrinsic::mips_cle_u_w:
1739 case Intrinsic::mips_cle_u_d:
1742 case Intrinsic::mips_clei_u_b:
1743 case Intrinsic::mips_clei_u_h:
1744 case Intrinsic::mips_clei_u_w:
1745 case Intrinsic::mips_clei_u_d:
1748 case Intrinsic::mips_clt_s_b:
1749 case Intrinsic::mips_clt_s_h:
1750 case Intrinsic::mips_clt_s_w:
1751 case Intrinsic::mips_clt_s_d:
1754 case Intrinsic::mips_clti_s_b:
1755 case Intrinsic::mips_clti_s_h:
1756 case Intrinsic::mips_clti_s_w:
1757 case Intrinsic::mips_clti_s_d:
1760 case Intrinsic::mips_clt_u_b:
1761 case Intrinsic::mips_clt_u_h:
1762 case Intrinsic::mips_clt_u_w:
1763 case Intrinsic::mips_clt_u_d:
1766 case Intrinsic::mips_clti_u_b:
1767 case Intrinsic::mips_clti_u_h:
1768 case Intrinsic::mips_clti_u_w:
1769 case Intrinsic::mips_clti_u_d:
1772 case Intrinsic::mips_copy_s_b:
1773 case Intrinsic::mips_copy_s_h:
1774 case Intrinsic::mips_copy_s_w:
1776 case Intrinsic::mips_copy_s_d:
1784 Op->getValueType(0),
Op->getOperand(1),
1787 case Intrinsic::mips_copy_u_b:
1788 case Intrinsic::mips_copy_u_h:
1789 case Intrinsic::mips_copy_u_w:
1791 case Intrinsic::mips_copy_u_d:
1802 Op->getValueType(0),
Op->getOperand(1),
1805 case Intrinsic::mips_div_s_b:
1806 case Intrinsic::mips_div_s_h:
1807 case Intrinsic::mips_div_s_w:
1808 case Intrinsic::mips_div_s_d:
1811 case Intrinsic::mips_div_u_b:
1812 case Intrinsic::mips_div_u_h:
1813 case Intrinsic::mips_div_u_w:
1814 case Intrinsic::mips_div_u_d:
1817 case Intrinsic::mips_fadd_w:
1818 case Intrinsic::mips_fadd_d:
1823 case Intrinsic::mips_fceq_w:
1824 case Intrinsic::mips_fceq_d:
1827 case Intrinsic::mips_fcle_w:
1828 case Intrinsic::mips_fcle_d:
1831 case Intrinsic::mips_fclt_w:
1832 case Intrinsic::mips_fclt_d:
1835 case Intrinsic::mips_fcne_w:
1836 case Intrinsic::mips_fcne_d:
1839 case Intrinsic::mips_fcor_w:
1840 case Intrinsic::mips_fcor_d:
1843 case Intrinsic::mips_fcueq_w:
1844 case Intrinsic::mips_fcueq_d:
1847 case Intrinsic::mips_fcule_w:
1848 case Intrinsic::mips_fcule_d:
1851 case Intrinsic::mips_fcult_w:
1852 case Intrinsic::mips_fcult_d:
1855 case Intrinsic::mips_fcun_w:
1856 case Intrinsic::mips_fcun_d:
1859 case Intrinsic::mips_fcune_w:
1860 case Intrinsic::mips_fcune_d:
1863 case Intrinsic::mips_fdiv_w:
1864 case Intrinsic::mips_fdiv_d:
1868 case Intrinsic::mips_ffint_u_w:
1869 case Intrinsic::mips_ffint_u_d:
1872 case Intrinsic::mips_ffint_s_w:
1873 case Intrinsic::mips_ffint_s_d:
1876 case Intrinsic::mips_fill_b:
1877 case Intrinsic::mips_fill_h:
1878 case Intrinsic::mips_fill_w:
1879 case Intrinsic::mips_fill_d: {
1880 EVT ResTy =
Op->getValueType(0);
1888 case Intrinsic::mips_fexp2_w:
1889 case Intrinsic::mips_fexp2_d: {
1891 EVT ResTy =
Op->getValueType(0);
1896 case Intrinsic::mips_flog2_w:
1897 case Intrinsic::mips_flog2_d:
1899 case Intrinsic::mips_fmadd_w:
1900 case Intrinsic::mips_fmadd_d:
1902 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
1903 case Intrinsic::mips_fmul_w:
1904 case Intrinsic::mips_fmul_d:
1908 case Intrinsic::mips_fmsub_w:
1909 case Intrinsic::mips_fmsub_d: {
1912 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
1914 case Intrinsic::mips_frint_w:
1915 case Intrinsic::mips_frint_d:
1917 case Intrinsic::mips_fsqrt_w:
1918 case Intrinsic::mips_fsqrt_d:
1920 case Intrinsic::mips_fsub_w:
1921 case Intrinsic::mips_fsub_d:
1925 case Intrinsic::mips_ftrunc_u_w:
1926 case Intrinsic::mips_ftrunc_u_d:
1929 case Intrinsic::mips_ftrunc_s_w:
1930 case Intrinsic::mips_ftrunc_s_d:
1933 case Intrinsic::mips_ilvev_b:
1934 case Intrinsic::mips_ilvev_h:
1935 case Intrinsic::mips_ilvev_w:
1936 case Intrinsic::mips_ilvev_d:
1938 Op->getOperand(1),
Op->getOperand(2));
1939 case Intrinsic::mips_ilvl_b:
1940 case Intrinsic::mips_ilvl_h:
1941 case Intrinsic::mips_ilvl_w:
1942 case Intrinsic::mips_ilvl_d:
1944 Op->getOperand(1),
Op->getOperand(2));
1945 case Intrinsic::mips_ilvod_b:
1946 case Intrinsic::mips_ilvod_h:
1947 case Intrinsic::mips_ilvod_w:
1948 case Intrinsic::mips_ilvod_d:
1950 Op->getOperand(1),
Op->getOperand(2));
1951 case Intrinsic::mips_ilvr_b:
1952 case Intrinsic::mips_ilvr_h:
1953 case Intrinsic::mips_ilvr_w:
1954 case Intrinsic::mips_ilvr_d:
1956 Op->getOperand(1),
Op->getOperand(2));
1957 case Intrinsic::mips_insert_b:
1958 case Intrinsic::mips_insert_h:
1959 case Intrinsic::mips_insert_w:
1960 case Intrinsic::mips_insert_d:
1962 Op->getOperand(1),
Op->getOperand(3),
Op->getOperand(2));
1963 case Intrinsic::mips_insve_b:
1964 case Intrinsic::mips_insve_h:
1965 case Intrinsic::mips_insve_w:
1966 case Intrinsic::mips_insve_d: {
1969 switch (Intrinsic) {
1970 case Intrinsic::mips_insve_b:
Max = 15;
break;
1971 case Intrinsic::mips_insve_h:
Max = 7;
break;
1972 case Intrinsic::mips_insve_w:
Max = 3;
break;
1973 case Intrinsic::mips_insve_d:
Max = 1;
break;
1976 int64_t
Value = cast<ConstantSDNode>(
Op->getOperand(2))->getSExtValue();
1977 if (Value < 0 || Value > Max)
1980 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3),
1983 case Intrinsic::mips_ldi_b:
1984 case Intrinsic::mips_ldi_h:
1985 case Intrinsic::mips_ldi_w:
1986 case Intrinsic::mips_ldi_d:
1988 case Intrinsic::mips_lsa:
1989 case Intrinsic::mips_dlsa: {
1990 EVT ResTy =
Op->getValueType(0);
1993 Op->getOperand(2),
Op->getOperand(3)));
1995 case Intrinsic::mips_maddv_b:
1996 case Intrinsic::mips_maddv_h:
1997 case Intrinsic::mips_maddv_w:
1998 case Intrinsic::mips_maddv_d: {
1999 EVT ResTy =
Op->getValueType(0);
2002 Op->getOperand(2),
Op->getOperand(3)));
2004 case Intrinsic::mips_max_s_b:
2005 case Intrinsic::mips_max_s_h:
2006 case Intrinsic::mips_max_s_w:
2007 case Intrinsic::mips_max_s_d:
2009 Op->getOperand(1),
Op->getOperand(2));
2010 case Intrinsic::mips_max_u_b:
2011 case Intrinsic::mips_max_u_h:
2012 case Intrinsic::mips_max_u_w:
2013 case Intrinsic::mips_max_u_d:
2015 Op->getOperand(1),
Op->getOperand(2));
2016 case Intrinsic::mips_maxi_s_b:
2017 case Intrinsic::mips_maxi_s_h:
2018 case Intrinsic::mips_maxi_s_w:
2019 case Intrinsic::mips_maxi_s_d:
2022 case Intrinsic::mips_maxi_u_b:
2023 case Intrinsic::mips_maxi_u_h:
2024 case Intrinsic::mips_maxi_u_w:
2025 case Intrinsic::mips_maxi_u_d:
2028 case Intrinsic::mips_min_s_b:
2029 case Intrinsic::mips_min_s_h:
2030 case Intrinsic::mips_min_s_w:
2031 case Intrinsic::mips_min_s_d:
2033 Op->getOperand(1),
Op->getOperand(2));
2034 case Intrinsic::mips_min_u_b:
2035 case Intrinsic::mips_min_u_h:
2036 case Intrinsic::mips_min_u_w:
2037 case Intrinsic::mips_min_u_d:
2039 Op->getOperand(1),
Op->getOperand(2));
2040 case Intrinsic::mips_mini_s_b:
2041 case Intrinsic::mips_mini_s_h:
2042 case Intrinsic::mips_mini_s_w:
2043 case Intrinsic::mips_mini_s_d:
2046 case Intrinsic::mips_mini_u_b:
2047 case Intrinsic::mips_mini_u_h:
2048 case Intrinsic::mips_mini_u_w:
2049 case Intrinsic::mips_mini_u_d:
2052 case Intrinsic::mips_mod_s_b:
2053 case Intrinsic::mips_mod_s_h:
2054 case Intrinsic::mips_mod_s_w:
2055 case Intrinsic::mips_mod_s_d:
2058 case Intrinsic::mips_mod_u_b:
2059 case Intrinsic::mips_mod_u_h:
2060 case Intrinsic::mips_mod_u_w:
2061 case Intrinsic::mips_mod_u_d:
2064 case Intrinsic::mips_mulv_b:
2065 case Intrinsic::mips_mulv_h:
2066 case Intrinsic::mips_mulv_w:
2067 case Intrinsic::mips_mulv_d:
2070 case Intrinsic::mips_msubv_b:
2071 case Intrinsic::mips_msubv_h:
2072 case Intrinsic::mips_msubv_w:
2073 case Intrinsic::mips_msubv_d: {
2074 EVT ResTy =
Op->getValueType(0);
2077 Op->getOperand(2),
Op->getOperand(3)));
2079 case Intrinsic::mips_nlzc_b:
2080 case Intrinsic::mips_nlzc_h:
2081 case Intrinsic::mips_nlzc_w:
2082 case Intrinsic::mips_nlzc_d:
2084 case Intrinsic::mips_nor_v: {
2086 Op->getOperand(1),
Op->getOperand(2));
2089 case Intrinsic::mips_nori_b: {
2095 case Intrinsic::mips_or_v:
2098 case Intrinsic::mips_ori_b:
2101 case Intrinsic::mips_pckev_b:
2102 case Intrinsic::mips_pckev_h:
2103 case Intrinsic::mips_pckev_w:
2104 case Intrinsic::mips_pckev_d:
2106 Op->getOperand(1),
Op->getOperand(2));
2107 case Intrinsic::mips_pckod_b:
2108 case Intrinsic::mips_pckod_h:
2109 case Intrinsic::mips_pckod_w:
2110 case Intrinsic::mips_pckod_d:
2112 Op->getOperand(1),
Op->getOperand(2));
2113 case Intrinsic::mips_pcnt_b:
2114 case Intrinsic::mips_pcnt_h:
2115 case Intrinsic::mips_pcnt_w:
2116 case Intrinsic::mips_pcnt_d:
2118 case Intrinsic::mips_sat_s_b:
2119 case Intrinsic::mips_sat_s_h:
2120 case Intrinsic::mips_sat_s_w:
2121 case Intrinsic::mips_sat_s_d:
2122 case Intrinsic::mips_sat_u_b:
2123 case Intrinsic::mips_sat_u_h:
2124 case Intrinsic::mips_sat_u_w:
2125 case Intrinsic::mips_sat_u_d: {
2128 switch (Intrinsic) {
2129 case Intrinsic::mips_sat_s_b:
2130 case Intrinsic::mips_sat_u_b:
Max = 7;
break;
2131 case Intrinsic::mips_sat_s_h:
2132 case Intrinsic::mips_sat_u_h:
Max = 15;
break;
2133 case Intrinsic::mips_sat_s_w:
2134 case Intrinsic::mips_sat_u_w:
Max = 31;
break;
2135 case Intrinsic::mips_sat_s_d:
2136 case Intrinsic::mips_sat_u_d:
Max = 63;
break;
2139 int64_t
Value = cast<ConstantSDNode>(
Op->getOperand(2))->getSExtValue();
2140 if (Value < 0 || Value > Max)
2144 case Intrinsic::mips_shf_b:
2145 case Intrinsic::mips_shf_h:
2146 case Intrinsic::mips_shf_w: {
2147 int64_t
Value = cast<ConstantSDNode>(
Op->getOperand(2))->getSExtValue();
2148 if (Value < 0 || Value > 255)
2151 Op->getOperand(2),
Op->getOperand(1));
2153 case Intrinsic::mips_sldi_b:
2154 case Intrinsic::mips_sldi_h:
2155 case Intrinsic::mips_sldi_w:
2156 case Intrinsic::mips_sldi_d: {
2159 switch (Intrinsic) {
2160 case Intrinsic::mips_sldi_b:
Max = 15;
break;
2161 case Intrinsic::mips_sldi_h:
Max = 7;
break;
2162 case Intrinsic::mips_sldi_w:
Max = 3;
break;
2163 case Intrinsic::mips_sldi_d:
Max = 1;
break;
2166 int64_t
Value = cast<ConstantSDNode>(
Op->getOperand(3))->getSExtValue();
2167 if (Value < 0 || Value > Max)
2171 case Intrinsic::mips_sll_b:
2172 case Intrinsic::mips_sll_h:
2173 case Intrinsic::mips_sll_w:
2174 case Intrinsic::mips_sll_d:
2177 case Intrinsic::mips_slli_b:
2178 case Intrinsic::mips_slli_h:
2179 case Intrinsic::mips_slli_w:
2180 case Intrinsic::mips_slli_d:
2183 case Intrinsic::mips_splat_b:
2184 case Intrinsic::mips_splat_h:
2185 case Intrinsic::mips_splat_w:
2186 case Intrinsic::mips_splat_d:
2194 case Intrinsic::mips_splati_b:
2195 case Intrinsic::mips_splati_h:
2196 case Intrinsic::mips_splati_w:
2197 case Intrinsic::mips_splati_d:
2201 case Intrinsic::mips_sra_b:
2202 case Intrinsic::mips_sra_h:
2203 case Intrinsic::mips_sra_w:
2204 case Intrinsic::mips_sra_d:
2207 case Intrinsic::mips_srai_b:
2208 case Intrinsic::mips_srai_h:
2209 case Intrinsic::mips_srai_w:
2210 case Intrinsic::mips_srai_d:
2213 case Intrinsic::mips_srari_b:
2214 case Intrinsic::mips_srari_h:
2215 case Intrinsic::mips_srari_w:
2216 case Intrinsic::mips_srari_d: {
2219 switch (Intrinsic) {
2220 case Intrinsic::mips_srari_b:
Max = 7;
break;
2221 case Intrinsic::mips_srari_h:
Max = 15;
break;
2222 case Intrinsic::mips_srari_w:
Max = 31;
break;
2223 case Intrinsic::mips_srari_d:
Max = 63;
break;
2226 int64_t
Value = cast<ConstantSDNode>(
Op->getOperand(2))->getSExtValue();
2227 if (Value < 0 || Value > Max)
2231 case Intrinsic::mips_srl_b:
2232 case Intrinsic::mips_srl_h:
2233 case Intrinsic::mips_srl_w:
2234 case Intrinsic::mips_srl_d:
2237 case Intrinsic::mips_srli_b:
2238 case Intrinsic::mips_srli_h:
2239 case Intrinsic::mips_srli_w:
2240 case Intrinsic::mips_srli_d:
2243 case Intrinsic::mips_srlri_b:
2244 case Intrinsic::mips_srlri_h:
2245 case Intrinsic::mips_srlri_w:
2246 case Intrinsic::mips_srlri_d: {
2249 switch (Intrinsic) {
2250 case Intrinsic::mips_srlri_b:
Max = 7;
break;
2251 case Intrinsic::mips_srlri_h:
Max = 15;
break;
2252 case Intrinsic::mips_srlri_w:
Max = 31;
break;
2253 case Intrinsic::mips_srlri_d:
Max = 63;
break;
2256 int64_t
Value = cast<ConstantSDNode>(
Op->getOperand(2))->getSExtValue();
2257 if (Value < 0 || Value > Max)
2261 case Intrinsic::mips_subv_b:
2262 case Intrinsic::mips_subv_h:
2263 case Intrinsic::mips_subv_w:
2264 case Intrinsic::mips_subv_d:
2267 case Intrinsic::mips_subvi_b:
2268 case Intrinsic::mips_subvi_h:
2269 case Intrinsic::mips_subvi_w:
2270 case Intrinsic::mips_subvi_d:
2273 case Intrinsic::mips_vshf_b:
2274 case Intrinsic::mips_vshf_h:
2275 case Intrinsic::mips_vshf_w:
2276 case Intrinsic::mips_vshf_d:
2278 Op->getOperand(1),
Op->getOperand(2),
Op->getOperand(3));
2279 case Intrinsic::mips_xor_v:
2282 case Intrinsic::mips_xori_b:
2285 case Intrinsic::thread_pointer: {
2298 EVT ResTy =
Op->getValueType(0);
2314 unsigned Intr =
Op->getConstantOperandVal(1);
2318 case Intrinsic::mips_extp:
2320 case Intrinsic::mips_extpdp:
2322 case Intrinsic::mips_extr_w:
2324 case Intrinsic::mips_extr_r_w:
2326 case Intrinsic::mips_extr_rs_w:
2328 case Intrinsic::mips_extr_s_h:
2330 case Intrinsic::mips_mthlip:
2332 case Intrinsic::mips_mulsaq_s_w_ph:
2334 case Intrinsic::mips_maq_s_w_phl:
2336 case Intrinsic::mips_maq_s_w_phr:
2338 case Intrinsic::mips_maq_sa_w_phl:
2340 case Intrinsic::mips_maq_sa_w_phr:
2342 case Intrinsic::mips_dpaq_s_w_ph:
2344 case Intrinsic::mips_dpsq_s_w_ph:
2346 case Intrinsic::mips_dpaq_sa_l_w:
2348 case Intrinsic::mips_dpsq_sa_l_w:
2350 case Intrinsic::mips_dpaqx_s_w_ph:
2352 case Intrinsic::mips_dpaqx_sa_w_ph:
2354 case Intrinsic::mips_dpsqx_s_w_ph:
2356 case Intrinsic::mips_dpsqx_sa_w_ph:
2358 case Intrinsic::mips_ld_b:
2359 case Intrinsic::mips_ld_h:
2360 case Intrinsic::mips_ld_w:
2361 case Intrinsic::mips_ld_d:
2389 unsigned Intr =
Op->getConstantOperandVal(1);
2393 case Intrinsic::mips_st_b:
2394 case Intrinsic::mips_st_h:
2395 case Intrinsic::mips_st_w:
2396 case Intrinsic::mips_st_d:
2411 EVT ResTy =
Op->getValueType(0);
2431 if (isa<ConstantSDNode>(
Op))
2433 if (isa<ConstantFPSDNode>(
Op))
2461 EVT ResTy =
Op->getValueType(0);
2463 APInt SplatValue, SplatUndef;
2464 unsigned SplatBitSize;
2470 if (
Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
2474 if (SplatBitSize != 8 && SplatBitSize != 16 && SplatBitSize != 32 &&
2486 switch (SplatBitSize) {
2490 ViaVecTy = MVT::v16i8;
2493 ViaVecTy = MVT::v8i16;
2496 ViaVecTy = MVT::v4i32;
2507 if (ViaVecTy != ResTy)
2517 EVT ResTy =
Node->getValueType(0);
2523 for (
unsigned i = 0; i < NumElts; ++i) {
2525 Node->getOperand(i),
2555 int SHFIndices[4] = { -1, -1, -1, -1 };
2557 if (Indices.
size() < 4)
2560 for (
unsigned i = 0; i < 4; ++i) {
2561 for (
unsigned j = i; j < Indices.
size(); j += 4) {
2562 int Idx = Indices[j];
2568 if (Idx < 0 || Idx >= 4)
2574 if (SHFIndices[i] == -1)
2575 SHFIndices[i] =
Idx;
2579 if (!(
Idx == -1 ||
Idx == SHFIndices[i]))
2586 for (
int i = 3; i >= 0; --i) {
2587 int Idx = SHFIndices[i];
2604template <
typename ValType>
2607 unsigned CheckStride,
2609 ValType ExpectedIndex,
unsigned ExpectedIndexStride) {
2613 if (*
I != -1 && *
I != ExpectedIndex)
2615 ExpectedIndex += ExpectedIndexStride;
2619 for (
unsigned n = 0; n < CheckStride &&
I !=
End; ++n, ++
I)
2638 int SplatIndex = -1;
2639 for (
const auto &V : Indices) {
2646 return fitsRegularPattern<int>(Indices.
begin(), 1, Indices.
end(), SplatIndex,
2672 const auto &Begin = Indices.
begin();
2673 const auto &
End = Indices.
end();
2677 if (fitsRegularPattern<int>(Begin, 2,
End, 0, 2))
2678 Wt =
Op->getOperand(0);
2679 else if (fitsRegularPattern<int>(Begin, 2,
End, Indices.
size(), 2))
2680 Wt =
Op->getOperand(1);
2686 if (fitsRegularPattern<int>(Begin + 1, 2,
End, 0, 2))
2687 Ws =
Op->getOperand(0);
2688 else if (fitsRegularPattern<int>(Begin + 1, 2,
End, Indices.
size(), 2))
2689 Ws =
Op->getOperand(1);
2718 const auto &Begin = Indices.
begin();
2719 const auto &
End = Indices.
end();
2723 if (fitsRegularPattern<int>(Begin, 2,
End, 1, 2))
2724 Wt =
Op->getOperand(0);
2725 else if (fitsRegularPattern<int>(Begin, 2,
End, Indices.
size() + 1, 2))
2726 Wt =
Op->getOperand(1);
2732 if (fitsRegularPattern<int>(Begin + 1, 2,
End, 1, 2))
2733 Ws =
Op->getOperand(0);
2734 else if (fitsRegularPattern<int>(Begin + 1, 2,
End, Indices.
size() + 1, 2))
2735 Ws =
Op->getOperand(1);
2765 const auto &Begin = Indices.
begin();
2766 const auto &
End = Indices.
end();
2770 if (fitsRegularPattern<int>(Begin, 2,
End, 0, 1))
2771 Wt =
Op->getOperand(0);
2772 else if (fitsRegularPattern<int>(Begin, 2,
End, Indices.
size(), 1))
2773 Wt =
Op->getOperand(1);
2779 if (fitsRegularPattern<int>(Begin + 1, 2,
End, 0, 1))
2780 Ws =
Op->getOperand(0);
2781 else if (fitsRegularPattern<int>(Begin + 1, 2,
End, Indices.
size(), 1))
2782 Ws =
Op->getOperand(1);
2810 unsigned HalfSize = Indices.
size() / 2;
2813 const auto &Begin = Indices.
begin();
2814 const auto &
End = Indices.
end();
2818 if (fitsRegularPattern<int>(Begin, 2,
End, HalfSize, 1))
2819 Wt =
Op->getOperand(0);
2820 else if (fitsRegularPattern<int>(Begin, 2,
End, Indices.
size() + HalfSize, 1))
2821 Wt =
Op->getOperand(1);
2827 if (fitsRegularPattern<int>(Begin + 1, 2,
End, HalfSize, 1))
2828 Ws =
Op->getOperand(0);
2829 else if (fitsRegularPattern<int>(Begin + 1, 2,
End, Indices.
size() + HalfSize,
2831 Ws =
Op->getOperand(1);
2860 const auto &Begin = Indices.
begin();
2861 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
2862 const auto &
End = Indices.
end();
2864 if (fitsRegularPattern<int>(Begin, 1, Mid, 0, 2))
2865 Wt =
Op->getOperand(0);
2866 else if (fitsRegularPattern<int>(Begin, 1, Mid, Indices.
size(), 2))
2867 Wt =
Op->getOperand(1);
2871 if (fitsRegularPattern<int>(Mid, 1,
End, 0, 2))
2872 Ws =
Op->getOperand(0);
2873 else if (fitsRegularPattern<int>(Mid, 1,
End, Indices.
size(), 2))
2874 Ws =
Op->getOperand(1);
2903 const auto &Begin = Indices.
begin();
2904 const auto &Mid = Indices.
begin() + Indices.
size() / 2;
2905 const auto &
End = Indices.
end();
2907 if (fitsRegularPattern<int>(Begin, 1, Mid, 1, 2))
2908 Wt =
Op->getOperand(0);
2909 else if (fitsRegularPattern<int>(Begin, 1, Mid, Indices.
size() + 1, 2))
2910 Wt =
Op->getOperand(1);
2914 if (fitsRegularPattern<int>(Mid, 1,
End, 1, 2))
2915 Ws =
Op->getOperand(0);
2916 else if (fitsRegularPattern<int>(Mid, 1,
End, Indices.
size() + 1, 2))
2917 Ws =
Op->getOperand(1);
2940 bool Using1stVec =
false;
2941 bool Using2ndVec =
false;
2945 for (
int i = 0; i < ResTyNumElts; ++i) {
2947 int Idx = Indices[i];
2949 if (0 <=
Idx &&
Idx < ResTyNumElts)
2951 if (ResTyNumElts <=
Idx &&
Idx < ResTyNumElts * 2)
2955 for (
int Idx : Indices)
2960 if (Using1stVec && Using2ndVec) {
2961 Op0 =
Op->getOperand(0);
2962 Op1 =
Op->getOperand(1);
2963 }
else if (Using1stVec)
2964 Op0 = Op1 =
Op->getOperand(0);
2965 else if (Using2ndVec)
2966 Op0 = Op1 =
Op->getOperand(1);
2968 llvm_unreachable(
"shuffle vector mask references neither vector operand?");
2985 EVT ResTy =
Op->getValueType(0);
2993 for (
int i = 0; i < ResTyNumElts; ++i)
3046 F->insert(It, Sink);
3051 Sink->transferSuccessorsAndUpdatePHIs(BB);
3077 MI.getOperand(0).getReg())
3083 MI.eraseFromParent();
3115 F->insert(It, Sink);
3120 Sink->transferSuccessorsAndUpdatePHIs(BB);
3146 MI.getOperand(0).getReg())
3152 MI.eraseFromParent();
3174 unsigned Lane =
MI.getOperand(2).getImm();
3181 Wt =
RegInfo.createVirtualRegister(&Mips::MSA128WEvensRegClass);
3190 : &Mips::MSA128WEvensRegClass);
3196 MI.eraseFromParent();
3219 unsigned Lane =
MI.getOperand(2).getImm() * 2;
3231 MI.eraseFromParent();
3249 unsigned Lane =
MI.getOperand(2).getImm();
3253 : &Mips::MSA128WEvensRegClass);
3265 MI.eraseFromParent();
3285 unsigned Lane =
MI.getOperand(2).getImm();
3299 MI.eraseFromParent();
3330 Register SrcVecReg =
MI.getOperand(1).getReg();
3331 Register LaneReg =
MI.getOperand(2).getReg();
3332 Register SrcValReg =
MI.getOperand(3).getReg();
3340 unsigned EltLog2Size;
3341 unsigned InsertOp = 0;
3342 unsigned InsveOp = 0;
3343 switch (EltSizeInBytes) {
3348 InsertOp = Mips::INSERT_B;
3349 InsveOp = Mips::INSVE_B;
3350 VecRC = &Mips::MSA128BRegClass;
3354 InsertOp = Mips::INSERT_H;
3355 InsveOp = Mips::INSVE_H;
3356 VecRC = &Mips::MSA128HRegClass;
3360 InsertOp = Mips::INSERT_W;
3361 InsveOp = Mips::INSVE_W;
3362 VecRC = &Mips::MSA128WRegClass;
3366 InsertOp = Mips::INSERT_D;
3367 InsveOp = Mips::INSVE_D;
3368 VecRC = &Mips::MSA128DRegClass;
3377 .
addImm(EltSizeInBytes == 8 ? Mips::sub_64 : Mips::sub_lo);
3382 if (EltSizeInBytes != 1) {
3395 .
addReg(LaneReg, 0, SubRegIdx);
3424 .
addReg(LaneTmp2, 0, SubRegIdx);
3426 MI.eraseFromParent();
3447 : &Mips::MSA128WEvensRegClass);
3450 : &Mips::MSA128WEvensRegClass);
3459 MI.eraseFromParent();
3490 MI.eraseFromParent();
3521 MI.getOperand(1).isReg() ?
RegInfo.getRegClass(
MI.getOperand(1).getReg())
3523 : &Mips::GPR64RegClass);
3524 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3536 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::SH : Mips::SH64))
3543 MI.eraseFromParent();
3573 MI.getOperand(1).isReg() ?
RegInfo.getRegClass(
MI.getOperand(1).getReg())
3575 : &Mips::GPR64RegClass);
3577 const bool UsingMips32 = RC == &Mips::GPR32RegClass;
3581 BuildMI(*BB,
MI,
DL,
TII->get(UsingMips32 ? Mips::LH : Mips::LH64), Rt);
3593 MI.eraseFromParent();
3649 bool IsFGR64)
const {
3665 Register Wtemp =
RegInfo.createVirtualRegister(&Mips::MSA128WRegClass);
3667 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3668 unsigned MFC1Opc = IsFGR64onMips64
3670 : (IsFGR64onMips32 ? Mips::MFC1_D64 : Mips::MFC1);
3671 unsigned FILLOpc = IsFGR64onMips64 ? Mips::FILL_D : Mips::FILL_W;
3677 unsigned WPHI = Wtemp;
3679 if (IsFGR64onMips32) {
3682 Register Wtemp2 =
RegInfo.createVirtualRegister(&Mips::MSA128WRegClass);
3683 Register Wtemp3 =
RegInfo.createVirtualRegister(&Mips::MSA128WRegClass);
3696 Register Wtemp2 =
RegInfo.createVirtualRegister(&Mips::MSA128WRegClass);
3705 MI.eraseFromParent();
3754 bool IsFGR64)
const {
3771 IsFGR64onMips64 ? &Mips::GPR64RegClass : &Mips::GPR32RegClass;
3772 unsigned MTC1Opc = IsFGR64onMips64
3774 : (IsFGR64onMips32 ? Mips::MTC1_D64 : Mips::MTC1);
3775 Register COPYOpc = IsFGR64onMips64 ? Mips::COPY_S_D : Mips::COPY_S_W;
3777 Register Wtemp =
RegInfo.createVirtualRegister(&Mips::MSA128WRegClass);
3782 WPHI =
RegInfo.createVirtualRegister(&Mips::MSA128DRegClass);
3789 ?
RegInfo.createVirtualRegister(&Mips::FGR64RegClass)
3794 if (IsFGR64onMips32) {
3804 MI.eraseFromParent();
3831 .
addReg(
MI.getOperand(1).getReg());
3833 MI.eraseFromParent();
3860 .
addReg(
MI.getOperand(1).getReg());
3862 MI.eraseFromParent();
static SDValue performORCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const AArch64Subtarget *Subtarget, const AArch64TargetLowering &TLI)
static SDValue performANDCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI)
static SDValue performSETCCCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, SelectionDAG &DAG)
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
const HexagonInstrInfo * TII
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)
static bool isConstantOrUndef(const SDValue Op)
static bool isConstantOrUndefBUILD_VECTOR(const BuildVectorSDNode *Op)
static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const MipsSubtarget &Subtarget)
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 lowerVECTOR_SHUFFLE_VSHF(SDValue Op, EVT ResTy, const SmallVector< int, 16 > &Indices, SelectionDAG &DAG)
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 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 SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr, const MipsSubtarget &Subtarget)
static cl::opt< bool > UseMipsTailCalls("mips-tail-calls", cl::Hidden, cl::desc("MIPS: permit tail calls."), cl::init(false))
static SDValue lowerVECTOR_SHUFFLE_ILVL(SDValue Op, EVT ResTy, SmallVector< int, 16 > Indices, SelectionDAG &DAG)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
support::ulittle32_t & Wd
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
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),...
LLVM Basic Block Representation.
A "pseudo-class" with methods for operating on BUILD_VECTORs.
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
This class represents an Operation in the Expression.
uint64_t getNumOperands() const
This class is used to represent ISD::LOAD nodes.
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.
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.
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.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
A description of a memory reference used in the backend.
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.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
MachineMemOperand * getMemOperand() const
Return a MachineMemOperand object describing the memory reference performed by operation.
const SDValue & getChain() const
EVT getMemoryVT() const
Return the type of the in-memory value.
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
unsigned getIncomingArgSize() const
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
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
LowerOperation - Provide custom lowering hooks for some operations.
MipsSETargetLowering(const MipsTargetMachine &TM, const MipsSubtarget &STI)
bool useSoftFloat() const
const MipsInstrInfo * getInstrInfo() const override
const MipsRegisterInfo * getRegisterInfo() const override
bool systemSupportsUnalignedAccess() const
Does the system support unaligned memory access.
bool isSingleFloat() const
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
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 representing virtual and physical registers.
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
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
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
SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false)
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
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 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.
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
SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
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.
SDValue getValueType(EVT)
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
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 SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
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.
This class is used to represent ISD::STORE nodes.
const SDValue & getBasePtr() const
const SDValue & getValue() const
TargetInstrInfo - Interface to description of machine instruction set.
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...
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.
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.
@ 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.
@ 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 or maximum on two values.
@ 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.
@ 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,...
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)
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.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
DWARFExpression::Operation Op
constexpr unsigned BitWidth
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,...