Lines Matching defs:DAG

1 //===- MipsSEISelLowering.cpp - MipsSE DAG Lowering Interface -------------===//
445 SDValue MipsSETargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
447 return MipsTargetLowering::LowerOperation(Op, DAG);
455 SDValue Tmp = DAG.getNode(MipsISD::MTC1_D64, DL, MVT::f64, Op->getOperand(0));
456 return DAG.getNode(MipsISD::FSELECT, DL, ResTy, Tmp, Op->getOperand(1),
488 SelectionDAG &DAG) const {
490 case ISD::LOAD: return lowerLOAD(Op, DAG);
491 case ISD::STORE: return lowerSTORE(Op, DAG);
492 case ISD::SMUL_LOHI: return lowerMulDiv(Op, MipsISD::Mult, true, true, DAG);
493 case ISD::UMUL_LOHI: return lowerMulDiv(Op, MipsISD::Multu, true, true, DAG);
494 case ISD::MULHS: return lowerMulDiv(Op, MipsISD::Mult, false, true, DAG);
495 case ISD::MULHU: return lowerMulDiv(Op, MipsISD::Multu, false, true, DAG);
496 case ISD::MUL: return lowerMulDiv(Op, MipsISD::Mult, true, false, DAG);
497 case ISD::SDIVREM: return lowerMulDiv(Op, MipsISD::DivRem, true, true, DAG);
499 DAG);
500 case ISD::INTRINSIC_WO_CHAIN: return lowerINTRINSIC_WO_CHAIN(Op, DAG);
501 case ISD::INTRINSIC_W_CHAIN: return lowerINTRINSIC_W_CHAIN(Op, DAG);
502 case ISD::INTRINSIC_VOID: return lowerINTRINSIC_VOID(Op, DAG);
503 case ISD::EXTRACT_VECTOR_ELT: return lowerEXTRACT_VECTOR_ELT(Op, DAG);
504 case ISD::BUILD_VECTOR: return lowerBUILD_VECTOR(Op, DAG);
505 case ISD::VECTOR_SHUFFLE: return lowerVECTOR_SHUFFLE(Op, DAG);
506 case ISD::SELECT: return lowerSELECT(Op, DAG);
507 case ISD::BITCAST: return lowerBITCAST(Op, DAG);
510 return MipsTargetLowering::LowerOperation(Op, DAG);
520 static SDValue performANDCombine(SDNode *N, SelectionDAG &DAG,
554 return DAG.getNode(MipsISD::VEXTRACT_ZEXT_ELT, SDLoc(Op0),
635 static SDValue performORCombine(SDNode *N, SelectionDAG &DAG,
748 // Transform the DAG into an equivalent VSELECT.
749 return DAG.getNode(ISD::VSELECT, SDLoc(N), Ty, Cond, IfSet, IfClr);
756 SelectionDAG &DAG,
821 unsigned RegisterSize = DAG.getTargetLoweringInfo()
822 .getRegisterType(*DAG.getContext(), VT)
832 EVT ShiftTy, SelectionDAG &DAG) {
835 return DAG.getConstant(0, DL, VT);
843 return DAG.getNode(ISD::SHL, DL, VT, X,
844 DAG.getConstant(C.logBase2(), DL, ShiftTy));
855 SDValue Op0 = genConstMult(X, Floor, DL, VT, ShiftTy, DAG);
856 SDValue Op1 = genConstMult(X, C - Floor, DL, VT, ShiftTy, DAG);
857 return DAG.getNode(ISD::ADD, DL, VT, Op0, Op1);
862 SDValue Op0 = genConstMult(X, Ceil, DL, VT, ShiftTy, DAG);
863 SDValue Op1 = genConstMult(X, Ceil - C, DL, VT, ShiftTy, DAG);
864 return DAG.getNode(ISD::SUB, DL, VT, Op0, Op1);
867 static SDValue performMULCombine(SDNode *N, SelectionDAG &DAG,
875 C->getAPIntValue(), VT, DAG, Subtarget))
877 TL->getScalarShiftAmountTy(DAG.getDataLayout(), VT),
878 DAG);
884 SelectionDAG &DAG,
904 return DAG.getNode(Opc, DL, Ty, N->getOperand(0),
905 DAG.getConstant(SplatValue.getZExtValue(), DL, MVT::i32));
908 static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG,
916 return performDSPShiftCombine(MipsISD::SHLL_DSP, N, Ty, DAG, Subtarget);
931 static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG,
963 return DAG.getNode(MipsISD::VEXTRACT_SEXT_ELT, SDLoc(Op0Op0),
973 return performDSPShiftCombine(MipsISD::SHRA_DSP, N, Ty, DAG, Subtarget);
977 static SDValue performSRLCombine(SDNode *N, SelectionDAG &DAG,
985 return performDSPShiftCombine(MipsISD::SHRL_DSP, N, Ty, DAG, Subtarget);
1006 static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG) {
1015 return DAG.getNode(MipsISD::SETCC_DSP, SDLoc(N), Ty, N->getOperand(0),
1019 static SDValue performVSELECTCombine(SDNode *N, SelectionDAG &DAG) {
1028 return DAG.getNode(MipsISD::SELECT_CC_DSP, SDLoc(N), Ty,
1036 static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG,
1056 return DAG.getNode(MipsISD::VNOR, SDLoc(N), Ty, NotOp->getOperand(0),
1065 SelectionDAG &DAG = DCI.DAG;
1070 Val = performANDCombine(N, DAG, DCI, Subtarget);
1073 Val = performORCombine(N, DAG, DCI, Subtarget);
1076 return performMULCombine(N, DAG, DCI, this, Subtarget);
1078 Val = performSHLCombine(N, DAG, DCI, Subtarget);
1081 return performSRACombine(N, DAG, DCI, Subtarget);
1083 return performSRLCombine(N, DAG, DCI, Subtarget);
1085 return performVSELECTCombine(N, DAG);
1087 Val = performXORCombine(N, DAG, Subtarget);
1090 Val = performSETCCCombine(N, DAG);
1095 LLVM_DEBUG(dbgs() << "\nMipsSE DAG Combine:\n";
1096 N->printrWithDepth(dbgs(), &DAG); dbgs() << "\n=> \n";
1097 Val.getNode()->printrWithDepth(dbgs(), &DAG); dbgs() << "\n");
1212 SDValue MipsSETargetLowering::lowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1216 return MipsTargetLowering::lowerLOAD(Op, DAG);
1224 SDValue Lo = DAG.getLoad(MVT::i32, DL, Chain, Ptr, MachinePointerInfo(),
1228 Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Ptr, DAG.getConstant(4, DL, PtrVT));
1229 SDValue Hi = DAG.getLoad(
1236 SDValue BP = DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
1238 return DAG.getMergeValues(Ops, DL);
1241 SDValue MipsSETargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1245 return MipsTargetLowering::lowerSTORE(Op, DAG);
1251 SDValue Lo = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1252 Val, DAG.getConstant(0, DL, MVT::i32));
1253 SDValue Hi = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1254 Val, DAG.getConstant(1, DL, MVT::i32));
1260 Chain = DAG.getStore(Chain, DL, Lo, Ptr, MachinePointerInfo(), Nd.getAlign(),
1264 Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Ptr, DAG.getConstant(4, DL, PtrVT));
1265 return DAG.getStore(Chain, DL, Hi, Ptr, MachinePointerInfo(),
1271 SelectionDAG &DAG) const {
1280 DAG.SplitScalar(Op.getOperand(0), DL, MVT::i32, MVT::i32);
1281 return DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
1288 if (getTypeAction(*DAG.getContext(), Op.getOperand(0).getValueType()) ==
1292 DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32, Op.getOperand(0),
1293 DAG.getConstant(0, DL, MVT::i32));
1295 DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32, Op.getOperand(0),
1296 DAG.getConstant(1, DL, MVT::i32));
1297 return DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, Lo, Hi);
1306 SelectionDAG &DAG) const {
1312 SDValue Mult = DAG.getNode(NewOpc, DL, MVT::Untyped,
1317 Lo = DAG.getNode(MipsISD::MFLO, DL, Ty, Mult);
1319 Hi = DAG.getNode(MipsISD::MFHI, DL, Ty, Mult);
1325 return DAG.getMergeValues(Vals, DL);
1328 static SDValue initAccumulator(SDValue In, const SDLoc &DL, SelectionDAG &DAG) {
1330 std::tie(InLo, InHi) = DAG.SplitScalar(In, DL, MVT::i32, MVT::i32);
1331 return DAG.getNode(MipsISD::MTLOHI, DL, MVT::Untyped, InLo, InHi);
1334 static SDValue extractLOHI(SDValue Op, const SDLoc &DL, SelectionDAG &DAG) {
1335 SDValue Lo = DAG.getNode(MipsISD::MFLO, DL, MVT::i32, Op);
1336 SDValue Hi = DAG.getNode(MipsISD::MFHI, DL, MVT::i32, Op);
1337 return DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, Lo, Hi);
1352 static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1369 In64 = initAccumulator(Opnd, DL, DAG);
1388 SDValue Val = DAG.getNode(Opc, DL, ResTys, Ops);
1389 SDValue Out = (ResTys[0] == MVT::Untyped) ? extractLOHI(Val, DL, DAG) : Val;
1396 return DAG.getMergeValues(Vals, DL);
1400 static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1407 SDValue Result = DAG.getNode(Opc, DL, ResTy, Vec, Idx,
1408 DAG.getValueType(EltTy));
1413 static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG) {
1416 bool BigEndian = !DAG.getSubtarget().getTargetTriple().isLittleEndian();
1429 LaneB = DAG.getConstant(0, DL, MVT::i32);
1445 SDValue Result = DAG.getBuildVector(
1449 SDValue One = DAG.getConstant(1, DL, ViaVecTy);
1450 Result = DAG.getNode(ISD::BITCAST, DL, ResVecTy,
1451 DAG.getNode(ISD::AND, DL, ViaVecTy, Result, One));
1457 static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG,
1460 return DAG.getConstant(
1467 bool BigEndian, SelectionDAG &DAG) {
1477 SplatValueA = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, SplatValue);
1478 SplatValueB = DAG.getNode(ISD::SRL, DL, MVT::i64, SplatValue,
1479 DAG.getConstant(32, DL, MVT::i32));
1480 SplatValueB = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, SplatValueB);
1493 SDValue Result = DAG.getBuildVector(
1497 Result = DAG.getNode(ISD::BITCAST, DL, VecTy, Result);
1502 static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG,
1509 // The DAG Combiner can't constant fold bitcasted vectors yet so we must do it
1515 SDValue BitImmHiOp = DAG.getConstant(BitImm.lshr(32).trunc(32), DL,
1517 SDValue BitImmLoOp = DAG.getConstant(BitImm.trunc(32), DL, MVT::i32);
1522 Exp2Imm = DAG.getNode(
1524 DAG.getBuildVector(MVT::v4i32, DL,
1535 Imm = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, Imm);
1537 Exp2Imm = getBuildVectorSplat(VecTy, Imm, BigEndian, DAG);
1539 Exp2Imm = DAG.getNode(ISD::SHL, DL, VecTy, DAG.getConstant(1, DL, VecTy),
1543 return DAG.getNode(Opc, DL, VecTy, Op->getOperand(1), Exp2Imm);
1546 static SDValue truncateVecElts(SDValue Op, SelectionDAG &DAG) {
1550 bool BigEndian = !DAG.getSubtarget().getTargetTriple().isLittleEndian();
1552 SDValue ConstValue = DAG.getConstant(Vec.getScalarValueSizeInBits() - 1,
1554 SDValue SplatVec = getBuildVectorSplat(ResTy, ConstValue, BigEndian, DAG);
1556 return DAG.getNode(ISD::AND, DL, ResTy, Vec, SplatVec);
1559 static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG) {
1562 SDValue One = DAG.getConstant(1, DL, ResTy);
1563 SDValue Bit = DAG.getNode(ISD::SHL, DL, ResTy, One, truncateVecElts(Op, DAG));
1565 return DAG.getNode(ISD::AND, DL, ResTy, Op->getOperand(1),
1566 DAG.getNOT(DL, Bit, ResTy));
1569 static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG) {
1574 SDValue BitMask = DAG.getConstant(~BitImm, DL, ResTy);
1576 return DAG.getNode(ISD::AND, DL, ResTy, Op->getOperand(1), BitMask);
1580 SelectionDAG &DAG) const {
1587 return lowerDSPIntr(Op, DAG, MipsISD::SHILO);
1589 return lowerDSPIntr(Op, DAG, MipsISD::DPAU_H_QBL);
1591 return lowerDSPIntr(Op, DAG, MipsISD::DPAU_H_QBR);
1593 return lowerDSPIntr(Op, DAG, MipsISD::DPSU_H_QBL);
1595 return lowerDSPIntr(Op, DAG, MipsISD::DPSU_H_QBR);
1597 return lowerDSPIntr(Op, DAG, MipsISD::DPA_W_PH);
1599 return lowerDSPIntr(Op, DAG, MipsISD::DPS_W_PH);
1601 return lowerDSPIntr(Op, DAG, MipsISD::DPAX_W_PH);
1603 return lowerDSPIntr(Op, DAG, MipsISD::DPSX_W_PH);
1605 return lowerDSPIntr(Op, DAG, MipsISD::MULSA_W_PH);
1607 return lowerDSPIntr(Op, DAG, MipsISD::Mult);
1609 return lowerDSPIntr(Op, DAG, MipsISD::Multu);
1611 return lowerDSPIntr(Op, DAG, MipsISD::MAdd);
1613 return lowerDSPIntr(Op, DAG, MipsISD::MAddu);
1615 return lowerDSPIntr(Op, DAG, MipsISD::MSub);
1617 return lowerDSPIntr(Op, DAG, MipsISD::MSubu);
1622 return DAG.getNode(ISD::ADD, DL, Op->getValueType(0), Op->getOperand(1),
1628 return DAG.getNode(ISD::ADD, DL, Op->getValueType(0), Op->getOperand(1),
1629 lowerMSASplatImm(Op, 2, DAG));
1631 return DAG.getNode(ISD::AND, DL, Op->getValueType(0), Op->getOperand(1),
1634 return DAG.getNode(ISD::AND, DL, Op->getValueType(0), Op->getOperand(1),
1635 lowerMSASplatImm(Op, 2, DAG));
1640 return lowerMSABitClear(Op, DAG);
1645 return lowerMSABitClearImm(Op, DAG);
1657 return DAG.getNode(ISD::VSELECT, DL, VecTy,
1658 DAG.getConstant(Mask, DL, VecTy, true),
1672 return DAG.getNode(ISD::VSELECT, DL, VecTy,
1673 DAG.getConstant(Mask, DL, VecTy, true),
1677 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0), Op->getOperand(3),
1680 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1681 lowerMSASplatImm(Op, 3, DAG), Op->getOperand(2),
1684 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0), Op->getOperand(3),
1687 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1688 lowerMSASplatImm(Op, 3, DAG), Op->getOperand(1),
1695 SDValue One = DAG.getConstant(1, DL, VecTy);
1697 return DAG.getNode(ISD::XOR, DL, VecTy, Op->getOperand(1),
1698 DAG.getNode(ISD::SHL, DL, VecTy, One,
1699 truncateVecElts(Op, DAG)));
1705 return lowerMSABinaryBitImmIntr(Op, DAG, ISD::XOR, Op->getOperand(2),
1711 return DAG.getNode(MipsISD::VALL_NONZERO, DL, Op->getValueType(0),
1714 return DAG.getNode(MipsISD::VANY_NONZERO, DL, Op->getValueType(0),
1718 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1723 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1724 Op->getOperand(1), lowerMSASplatImm(Op, 3, DAG),
1731 SDValue One = DAG.getConstant(1, DL, VecTy);
1733 return DAG.getNode(ISD::OR, DL, VecTy, Op->getOperand(1),
1734 DAG.getNode(ISD::SHL, DL, VecTy, One,
1735 truncateVecElts(Op, DAG)));
1741 return lowerMSABinaryBitImmIntr(Op, DAG, ISD::OR, Op->getOperand(2),
1747 return DAG.getNode(MipsISD::VALL_ZERO, DL, Op->getValueType(0),
1750 return DAG.getNode(MipsISD::VANY_ZERO, DL, Op->getValueType(0),
1756 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1762 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1763 lowerMSASplatImm(Op, 2, DAG, true), ISD::SETEQ);
1768 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1774 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1775 lowerMSASplatImm(Op, 2, DAG, true), ISD::SETLE);
1780 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1786 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1787 lowerMSASplatImm(Op, 2, DAG), ISD::SETULE);
1792 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1798 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1799 lowerMSASplatImm(Op, 2, DAG, true), ISD::SETLT);
1804 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1810 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1811 lowerMSASplatImm(Op, 2, DAG), ISD::SETULT);
1815 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
1819 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
1823 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
1830 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
1834 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
1841 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
1849 return DAG.getNode(ISD::SDIV, DL, Op->getValueType(0), Op->getOperand(1),
1855 return DAG.getNode(ISD::UDIV, DL, Op->getValueType(0), Op->getOperand(1),
1860 return DAG.getNode(ISD::FADD, DL, Op->getValueType(0), Op->getOperand(1),
1865 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1869 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1873 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1877 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1881 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1885 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1889 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1893 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1897 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1901 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1906 return DAG.getNode(ISD::FDIV, DL, Op->getValueType(0), Op->getOperand(1),
1910 return DAG.getNode(ISD::UINT_TO_FP, DL, Op->getValueType(0),
1914 return DAG.getNode(ISD::SINT_TO_FP, DL, Op->getValueType(0),
1926 return DAG.getBuildVector(ResTy, DL, Ops);
1932 return DAG.getNode(
1934 DAG.getNode(ISD::FEXP2, SDLoc(Op), ResTy, Op->getOperand(2)));
1938 return DAG.getNode(ISD::FLOG2, DL, Op->getValueType(0), Op->getOperand(1));
1941 return DAG.getNode(ISD::FMA, SDLoc(Op), Op->getValueType(0),
1946 return DAG.getNode(ISD::FMUL, DL, Op->getValueType(0), Op->getOperand(1),
1951 return DAG.getNode(MipsISD::FMS, SDLoc(Op), Op->getValueType(0),
1956 return DAG.getNode(ISD::FRINT, DL, Op->getValueType(0), Op->getOperand(1));
1959 return DAG.getNode(ISD::FSQRT, DL, Op->getValueType(0), Op->getOperand(1));
1963 return DAG.getNode(ISD::FSUB, DL, Op->getValueType(0), Op->getOperand(1),
1967 return DAG.getNode(ISD::FP_TO_UINT, DL, Op->getValueType(0),
1971 return DAG.getNode(ISD::FP_TO_SINT, DL, Op->getValueType(0),
1977 return DAG.getNode(MipsISD::ILVEV, DL, Op->getValueType(0),
1983 return DAG.getNode(MipsISD::ILVL, DL, Op->getValueType(0),
1989 return DAG.getNode(MipsISD::ILVOD, DL, Op->getValueType(0),
1995 return DAG.getNode(MipsISD::ILVR, DL, Op->getValueType(0),
2001 return DAG.getNode(ISD::INSERT_VECTOR_ELT, SDLoc(Op), Op->getValueType(0),
2019 return DAG.getNode(MipsISD::INSVE, DL, Op->getValueType(0),
2021 DAG.getConstant(0, DL, MVT::i32));
2027 return lowerMSASplatImm(Op, 1, DAG, true);
2031 return DAG.getNode(ISD::ADD, SDLoc(Op), ResTy, Op->getOperand(1),
2032 DAG.getNode(ISD::SHL, SDLoc(Op), ResTy,
2040 return DAG.getNode(ISD::ADD, SDLoc(Op), ResTy, Op->getOperand(1),
2041 DAG.getNode(ISD::MUL, SDLoc(Op), ResTy,
2048 return DAG.getNode(ISD::SMAX, DL, Op->getValueType(0),
2054 return DAG.getNode(ISD::UMAX, DL, Op->getValueType(0),
2060 return DAG.getNode(ISD::SMAX, DL, Op->getValueType(0),
2061 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG, true));
2066 return DAG.getNode(ISD::UMAX, DL, Op->getValueType(0),
2067 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2072 return DAG.getNode(ISD::SMIN, DL, Op->getValueType(0),
2078 return DAG.getNode(ISD::UMIN, DL, Op->getValueType(0),
2084 return DAG.getNode(ISD::SMIN, DL, Op->getValueType(0),
2085 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG, true));
2090 return DAG.getNode(ISD::UMIN, DL, Op->getValueType(0),
2091 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2096 return DAG.getNode(ISD::SREM, DL, Op->getValueType(0), Op->getOperand(1),
2102 return DAG.getNode(ISD::UREM, DL, Op->getValueType(0), Op->getOperand(1),
2108 return DAG.getNode(ISD::MUL, DL, Op->getValueType(0), Op->getOperand(1),
2115 return DAG.getNode(ISD::SUB, SDLoc(Op), ResTy, Op->getOperand(1),
2116 DAG.getNode(ISD::MUL, SDLoc(Op), ResTy,
2123 return DAG.getNode(ISD::CTLZ, DL, Op->getValueType(0), Op->getOperand(1));
2125 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2127 return DAG.getNOT(DL, Res, Res->getValueType(0));
2130 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2132 lowerMSASplatImm(Op, 2, DAG));
2133 return DAG.getNOT(DL, Res, Res->getValueType(0));
2136 return DAG.getNode(ISD::OR, DL, Op->getValueType(0), Op->getOperand(1),
2139 return DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2140 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2145 return DAG.getNode(MipsISD::PCKEV, DL, Op->getValueType(0),
2151 return DAG.getNode(MipsISD::PCKOD, DL, Op->getValueType(0),
2157 return DAG.getNode(ISD::CTPOP, DL, Op->getValueType(0), Op->getOperand(1));
2190 return DAG.getNode(MipsISD::SHF, DL, Op->getValueType(0),
2215 return DAG.getNode(ISD::SHL, DL, Op->getValueType(0), Op->getOperand(1),
2216 truncateVecElts(Op, DAG));
2221 return DAG.getNode(ISD::SHL, DL, Op->getValueType(0),
2222 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2231 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2232 lowerMSASplatZExt(Op, 2, DAG), Op->getOperand(1),
2238 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2239 lowerMSASplatImm(Op, 2, DAG), Op->getOperand(1),
2245 return DAG.getNode(ISD::SRA, DL, Op->getValueType(0), Op->getOperand(1),
2246 truncateVecElts(Op, DAG));
2251 return DAG.getNode(ISD::SRA, DL, Op->getValueType(0),
2252 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2275 return DAG.getNode(ISD::SRL, DL, Op->getValueType(0), Op->getOperand(1),
2276 truncateVecElts(Op, DAG));
2281 return DAG.getNode(ISD::SRL, DL, Op->getValueType(0),
2282 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2305 return DAG.getNode(ISD::SUB, DL, Op->getValueType(0), Op->getOperand(1),
2311 return DAG.getNode(ISD::SUB, DL, Op->getValueType(0),
2312 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2317 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2320 return DAG.getNode(ISD::XOR, DL, Op->getValueType(0), Op->getOperand(1),
2323 return DAG.getNode(ISD::XOR, DL, Op->getValueType(0),
2324 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2326 EVT PtrVT = getPointerTy(DAG.getDataLayout());
2327 return DAG.getNode(MipsISD::ThreadPointer, DL, PtrVT);
2332 static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2345 Offset = DAG.getNode(ISD::SIGN_EXTEND, DL, PtrTy, Offset);
2347 Address = DAG.getNode(ISD::ADD, DL, PtrTy, Address, Offset);
2348 return DAG.getLoad(ResTy, DL, ChainIn, Address, MachinePointerInfo(),
2353 SelectionDAG &DAG) const {
2359 return lowerDSPIntr(Op, DAG, MipsISD::EXTP);
2361 return lowerDSPIntr(Op, DAG, MipsISD::EXTPDP);
2363 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_W);
2365 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_R_W);
2367 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_RS_W);
2369 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_S_H);
2371 return lowerDSPIntr(Op, DAG, MipsISD::MTHLIP);
2373 return lowerDSPIntr(Op, DAG, MipsISD::MULSAQ_S_W_PH);
2375 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_S_W_PHL);
2377 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_S_W_PHR);
2379 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_SA_W_PHL);
2381 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_SA_W_PHR);
2383 return lowerDSPIntr(Op, DAG, MipsISD::DPAQ_S_W_PH);
2385 return lowerDSPIntr(Op, DAG, MipsISD::DPSQ_S_W_PH);
2387 return lowerDSPIntr(Op, DAG, MipsISD::DPAQ_SA_L_W);
2389 return lowerDSPIntr(Op, DAG, MipsISD::DPSQ_SA_L_W);
2391 return lowerDSPIntr(Op, DAG, MipsISD::DPAQX_S_W_PH);
2393 return lowerDSPIntr(Op, DAG, MipsISD::DPAQX_SA_W_PH);
2395 return lowerDSPIntr(Op, DAG, MipsISD::DPSQX_S_W_PH);
2397 return lowerDSPIntr(Op, DAG, MipsISD::DPSQX_SA_W_PH);
2402 return lowerMSALoadIntr(Op, DAG, Intr, Subtarget);
2406 static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2419 Offset = DAG.getNode(ISD::SIGN_EXTEND, DL, PtrTy, Offset);
2421 Address = DAG.getNode(ISD::ADD, DL, PtrTy, Address, Offset);
2423 return DAG.getStore(ChainIn, DL, Value, Address, MachinePointerInfo(),
2428 SelectionDAG &DAG) const {
2437 return lowerMSAStoreIntr(Op, DAG, Intr, Subtarget);
2449 lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const {
2461 return DAG.getNode(MipsISD::VEXTRACT_SEXT_ELT, DL, ResTy, Op0, Op1,
2462 DAG.getValueType(EltTy));
2499 SelectionDAG &DAG) const {
2544 SDValue Result = DAG.getConstant(SplatValue, DL, ViaVecTy);
2548 Result = DAG.getNode(ISD::BITCAST, SDLoc(Node), ResTy, Result);
2551 } else if (DAG.isSplatValue(Op, /* AllowUndefs */ false))
2562 SDValue Vector = DAG.getUNDEF(ResTy);
2564 Vector = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, ResTy, Vector,
2566 DAG.getConstant(i, DL, MVT::i32));
2594 SelectionDAG &DAG) {
2637 return DAG.getNode(MipsISD::SHF, DL, ResTy,
2638 DAG.getTargetConstant(Imm, DL, MVT::i32),
2675 SelectionDAG &DAG) {
2707 SelectionDAG &DAG) {
2733 return DAG.getNode(MipsISD::ILVEV, SDLoc(Op), ResTy, Ws, Wt);
2753 SelectionDAG &DAG) {
2779 return DAG.getNode(MipsISD::ILVOD, SDLoc(Op), ResTy, Ws, Wt);
2800 SelectionDAG &DAG) {
2826 return DAG.getNode(MipsISD::ILVR, SDLoc(Op), ResTy, Ws, Wt);
2847 SelectionDAG &DAG) {
2875 return DAG.getNode(MipsISD::ILVL, SDLoc(Op), ResTy, Ws, Wt);
2895 SelectionDAG &DAG) {
2918 return DAG.getNode(MipsISD::PCKEV, SDLoc(Op), ResTy, Ws, Wt);
2938 SelectionDAG &DAG) {
2961 return DAG.getNode(MipsISD::PCKOD, SDLoc(Op), ResTy, Ws, Wt);
2980 SelectionDAG &DAG) {
3012 Ops.push_back(DAG.getTargetConstant(Idx, DL, MaskEltTy));
3015 SDValue MaskVec = DAG.getBuildVector(MaskVecTy, DL, Ops);
3034 return DAG.getNode(MipsISD::VSHF, DL, ResTy, MaskVec, Op1, Op0);
3040 SelectionDAG &DAG) const {
3055 if (isVECTOR_SHUFFLE_SPLATI(Op, ResTy, Indices, DAG))
3056 return lowerVECTOR_SHUFFLE_VSHF(Op, ResTy, Indices, true, DAG);
3058 if ((Result = lowerVECTOR_SHUFFLE_ILVEV(Op, ResTy, Indices, DAG)))
3060 if ((Result = lowerVECTOR_SHUFFLE_ILVOD(Op, ResTy, Indices, DAG)))
3062 if ((Result = lowerVECTOR_SHUFFLE_ILVL(Op, ResTy, Indices, DAG)))
3064 if ((Result = lowerVECTOR_SHUFFLE_ILVR(Op, ResTy, Indices, DAG)))
3066 if ((Result = lowerVECTOR_SHUFFLE_PCKEV(Op, ResTy, Indices, DAG)))
3068 if ((Result = lowerVECTOR_SHUFFLE_PCKOD(Op, ResTy, Indices, DAG)))
3070 if ((Result = lowerVECTOR_SHUFFLE_SHF(Op, ResTy, Indices, DAG)))
3072 return lowerVECTOR_SHUFFLE_VSHF(Op, ResTy, Indices, false, DAG);