Home | History | Annotate | Download | only in Mips

Lines Matching defs:DAG

1 //===-- MipsSEISelLowering.cpp - MipsSE DAG Lowering Interface --*- C++ -*-===//
357 SelectionDAG &DAG) const {
359 case ISD::LOAD: return lowerLOAD(Op, DAG);
360 case ISD::STORE: return lowerSTORE(Op, DAG);
361 case ISD::SMUL_LOHI: return lowerMulDiv(Op, MipsISD::Mult, true, true, DAG);
362 case ISD::UMUL_LOHI: return lowerMulDiv(Op, MipsISD::Multu, true, true, DAG);
363 case ISD::MULHS: return lowerMulDiv(Op, MipsISD::Mult, false, true, DAG);
364 case ISD::MULHU: return lowerMulDiv(Op, MipsISD::Multu, false, true, DAG);
365 case ISD::MUL: return lowerMulDiv(Op, MipsISD::Mult, true, false, DAG);
366 case ISD::SDIVREM: return lowerMulDiv(Op, MipsISD::DivRem, true, true, DAG);
368 DAG);
369 case ISD::INTRINSIC_WO_CHAIN: return lowerINTRINSIC_WO_CHAIN(Op, DAG);
370 case ISD::INTRINSIC_W_CHAIN: return lowerINTRINSIC_W_CHAIN(Op, DAG);
371 case ISD::INTRINSIC_VOID: return lowerINTRINSIC_VOID(Op, DAG);
372 case ISD::EXTRACT_VECTOR_ELT: return lowerEXTRACT_VECTOR_ELT(Op, DAG);
373 case ISD::BUILD_VECTOR: return lowerBUILD_VECTOR(Op, DAG);
374 case ISD::VECTOR_SHUFFLE: return lowerVECTOR_SHUFFLE(Op, DAG);
377 return MipsTargetLowering::LowerOperation(Op, DAG);
524 static SDValue performADDECombine(SDNode *N, SelectionDAG &DAG,
531 N->getValueType(0) == MVT::i32 && selectMADD(N, &DAG))
544 static SDValue performANDCombine(SDNode *N, SelectionDAG &DAG,
578 DAG.MorphNodeTo(Op0.getNode(), MipsISD::VEXTRACT_ZEXT_ELT,
660 static SDValue performORCombine(SDNode *N, SelectionDAG &DAG,
773 // Transform the DAG into an equivalent VSELECT.
774 return DAG.getNode(ISD::VSELECT, SDLoc(N), Ty, Cond, IfSet, IfClr);
780 static SDValue performSUBECombine(SDNode *N, SelectionDAG &DAG,
787 selectMSUB(N, &DAG))
794 EVT ShiftTy, SelectionDAG &DAG) {
800 return DAG.getConstant(0, VT);
808 return DAG.getNode(ISD::SHL, DL, VT, X,
809 DAG.getConstant(Log2_64(C), ShiftTy));
819 SDValue Op0 = genConstMult(X, Floor, DL, VT, ShiftTy, DAG);
820 SDValue Op1 = genConstMult(X, C - Floor, DL, VT, ShiftTy, DAG);
821 return DAG.getNode(ISD::ADD, DL, VT, Op0, Op1);
826 SDValue Op0 = genConstMult(X, Ceil, DL, VT, ShiftTy, DAG);
827 SDValue Op1 = genConstMult(X, Ceil - C, DL, VT, ShiftTy, DAG);
828 return DAG.getNode(ISD::SUB, DL, VT, Op0, Op1);
831 static SDValue performMULCombine(SDNode *N, SelectionDAG &DAG,
839 VT, TL->getScalarShiftAmountTy(VT), DAG);
845 SelectionDAG &DAG,
864 return DAG.getNode(Opc, SDLoc(N), Ty, N->getOperand(0),
865 DAG.getConstant(SplatValue.getZExtValue(), MVT::i32));
868 static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG,
876 return performDSPShiftCombine(MipsISD::SHLL_DSP, N, Ty, DAG, Subtarget);
891 static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG,
923 DAG.MorphNodeTo(Op0Op0.getNode(), MipsISD::VEXTRACT_SEXT_ELT,
934 return performDSPShiftCombine(MipsISD::SHRA_DSP, N, Ty, DAG, Subtarget);
938 static SDValue performSRLCombine(SDNode *N, SelectionDAG &DAG,
946 return performDSPShiftCombine(MipsISD::SHRL_DSP, N, Ty, DAG, Subtarget);
967 static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG) {
976 return DAG.getNode(MipsISD::SETCC_DSP, SDLoc(N), Ty, N->getOperand(0),
980 static SDValue performVSELECTCombine(SDNode *N, SelectionDAG &DAG) {
1017 return DAG.getNode(Signed ? MipsISD::VSMIN : MipsISD::VUMIN, SDLoc(N),
1020 return DAG.getNode(Signed ? MipsISD::VSMAX : MipsISD::VUMAX, SDLoc(N),
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 return performADDECombine(N, DAG, DCI, Subtarget);
1072 Val = performANDCombine(N, DAG, DCI, Subtarget);
1075 Val = performORCombine(N, DAG, DCI, Subtarget);
1078 return performSUBECombine(N, DAG, DCI, Subtarget);
1080 return performMULCombine(N, DAG, DCI, this);
1082 return performSHLCombine(N, DAG, DCI, Subtarget);
1084 return performSRACombine(N, DAG, DCI, Subtarget);
1086 return performSRLCombine(N, DAG, DCI, Subtarget);
1088 return performVSELECTCombine(N, DAG);
1090 Val = performXORCombine(N, DAG, Subtarget);
1093 Val = performSETCCCombine(N, DAG);
1098 DEBUG(dbgs() << "\nMipsSE DAG Combine:\n";
1099 N->printrWithDepth(dbgs(), &DAG);
1101 Val.getNode()->printrWithDepth(dbgs(), &DAG);
1194 SDValue MipsSETargetLowering::lowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1198 return MipsTargetLowering::lowerLOAD(Op, DAG);
1206 SDValue Lo = DAG.getLoad(MVT::i32, DL, Chain, Ptr,
1212 Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Ptr, DAG.getConstant(4, PtrVT));
1213 SDValue Hi = DAG.getLoad(MVT::i32, DL, Lo.getValue(1), Ptr,
1221 SDValue BP = DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
1223 return DAG.getMergeValues(Ops, DL);
1226 SDValue MipsSETargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1230 return MipsTargetLowering::lowerSTORE(Op, DAG);
1236 SDValue Lo = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1237 Val, DAG.getConstant(0, MVT::i32));
1238 SDValue Hi = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1239 Val, DAG.getConstant(1, MVT::i32));
1245 Chain = DAG.getStore(Chain, DL, Lo, Ptr, MachinePointerInfo(),
1250 Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Ptr, DAG.getConstant(4, PtrVT));
1251 return DAG.getStore(Chain, DL, Hi, Ptr, MachinePointerInfo(),
1258 SelectionDAG &DAG) const {
1264 SDValue Mult = DAG.getNode(NewOpc, DL, MVT::Untyped,
1269 Lo = DAG.getNode(MipsISD::MFLO, DL, Ty, Mult);
1271 Hi = DAG.getNode(MipsISD::MFHI, DL, Ty, Mult);
1277 return DAG.getMergeValues(Vals, DL);
1281 static SDValue initAccumulator(SDValue In, SDLoc DL, SelectionDAG &DAG) {
1282 SDValue InLo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, In,
1283 DAG.getConstant(0, MVT::i32));
1284 SDValue InHi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, In,
1285 DAG.getConstant(1, MVT::i32));
1286 return DAG.getNode(MipsISD::MTLOHI, DL, MVT::Untyped, InLo, InHi);
1289 static SDValue extractLOHI(SDValue Op, SDLoc DL, SelectionDAG &DAG) {
1290 SDValue Lo = DAG.getNode(MipsISD::MFLO, DL, MVT::i32, Op);
1291 SDValue Hi = DAG.getNode(MipsISD::MFHI, DL, MVT::i32, Op);
1292 return DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, Lo, Hi);
1307 static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1324 In64 = initAccumulator(Opnd, DL, DAG);
1344 SDValue Val = DAG.getNode(Opc, DL, ResTys, Ops);
1345 SDValue Out = (ResTys[0] == MVT::Untyped) ? extractLOHI(Val, DL, DAG) : Val;
1352 return DAG.getMergeValues(Vals, DL);
1356 static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1363 SDValue Result = DAG.getNode(Opc, DL, ResTy, Vec, Idx,
1364 DAG.getValueType(EltTy));
1369 static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG) {
1381 LaneA = DAG.getConstant(0, MVT::i32);
1389 SDValue Result = DAG.getNode(ISD::BUILD_VECTOR, DL, ViaVecTy,
1393 Result = DAG.getNode(ISD::BITCAST, DL, ResVecTy, Result);
1398 static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG) {
1399 return DAG.getConstant(Op->getConstantOperandVal(ImmOp), Op->getValueType(0));
1403 bool BigEndian, SelectionDAG &DAG) {
1413 SplatValueA = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, SplatValue);
1414 SplatValueB = DAG.getNode(ISD::SRL, DL, MVT::i64, SplatValue,
1415 DAG.getConstant(32, MVT::i32));
1416 SplatValueB = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, SplatValueB);
1429 SDValue Result = DAG.getNode(ISD::BUILD_VECTOR, DL, ViaVecTy,
1433 Result = DAG.getNode(ISD::BITCAST, DL, VecTy, Result);
1438 static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG,
1445 // The DAG Combiner can't constant fold bitcasted vectors yet so we must do it
1451 SDValue BitImmHiOp = DAG.getConstant(BitImm.lshr(32).trunc(32), MVT::i32);
1452 SDValue BitImmLoOp = DAG.getConstant(BitImm.trunc(32), MVT::i32);
1458 DAG.getNode(ISD::BITCAST, DL, MVT::v2i64,
1459 DAG.getNode(ISD::BUILD_VECTOR, DL, MVT::v4i32, BitImmLoOp,
1470 Imm = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, Imm);
1472 Exp2Imm = getBuildVectorSplat(VecTy, Imm, BigEndian, DAG);
1475 DAG.getNode(ISD::SHL, DL, VecTy, DAG.getConstant(1, VecTy), Exp2Imm);
1478 return DAG.getNode(Opc, DL, VecTy, Op->getOperand(1), Exp2Imm);
1481 static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG) {
1484 SDValue One = DAG.getConstant(1, ResTy);
1485 SDValue Bit = DAG.getNode(ISD::SHL, DL, ResTy, One, Op->getOperand(2));
1487 return DAG.getNode(ISD::AND, DL, ResTy, Op->getOperand(1),
1488 DAG.getNOT(DL, Bit, ResTy));
1491 static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG) {
1496 SDValue BitMask = DAG.getConstant(~BitImm, ResTy);
1498 return DAG.getNode(ISD::AND, DL, ResTy, Op->getOperand(1), BitMask);
1502 SelectionDAG &DAG) const {
1509 return lowerDSPIntr(Op, DAG, MipsISD::SHILO);
1511 return lowerDSPIntr(Op, DAG, MipsISD::DPAU_H_QBL);
1513 return lowerDSPIntr(Op, DAG, MipsISD::DPAU_H_QBR);
1515 return lowerDSPIntr(Op, DAG, MipsISD::DPSU_H_QBL);
1517 return lowerDSPIntr(Op, DAG, MipsISD::DPSU_H_QBR);
1519 return lowerDSPIntr(Op, DAG, MipsISD::DPA_W_PH);
1521 return lowerDSPIntr(Op, DAG, MipsISD::DPS_W_PH);
1523 return lowerDSPIntr(Op, DAG, MipsISD::DPAX_W_PH);
1525 return lowerDSPIntr(Op, DAG, MipsISD::DPSX_W_PH);
1527 return lowerDSPIntr(Op, DAG, MipsISD::MULSA_W_PH);
1529 return lowerDSPIntr(Op, DAG, MipsISD::Mult);
1531 return lowerDSPIntr(Op, DAG, MipsISD::Multu);
1533 return lowerDSPIntr(Op, DAG, MipsISD::MAdd);
1535 return lowerDSPIntr(Op, DAG, MipsISD::MAddu);
1537 return lowerDSPIntr(Op, DAG, MipsISD::MSub);
1539 return lowerDSPIntr(Op, DAG, MipsISD::MSubu);
1544 return DAG.getNode(ISD::ADD, DL, Op->getValueType(0), Op->getOperand(1),
1550 return DAG.getNode(ISD::ADD, DL, Op->getValueType(0), Op->getOperand(1),
1551 lowerMSASplatImm(Op, 2, DAG));
1553 return DAG.getNode(ISD::AND, DL, Op->getValueType(0), Op->getOperand(1),
1556 return DAG.getNode(ISD::AND, DL, Op->getValueType(0), Op->getOperand(1),
1557 lowerMSASplatImm(Op, 2, DAG));
1562 return lowerMSABitClear(Op, DAG);
1567 return lowerMSABitClearImm(Op, DAG);
1577 return DAG.getNode(ISD::VSELECT, DL, VecTy,
1578 DAG.getConstant(Mask, VecTy, true), Op->getOperand(2),
1590 return DAG.getNode(ISD::VSELECT, DL, VecTy,
1591 DAG.getConstant(Mask, VecTy, true), Op->getOperand(2),
1595 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0), Op->getOperand(3),
1598 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1599 lowerMSASplatImm(Op, 3, DAG), Op->getOperand(2),
1602 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0), Op->getOperand(3),
1605 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1606 lowerMSASplatImm(Op, 3, DAG), Op->getOperand(1),
1613 SDValue One = DAG.getConstant(1, VecTy);
1615 return DAG.getNode(ISD::XOR, DL, VecTy, Op->getOperand(1),
1616 DAG.getNode(ISD::SHL, DL, VecTy, One,
1623 return lowerMSABinaryBitImmIntr(Op, DAG, ISD::XOR, Op->getOperand(2),
1629 return DAG.getNode(MipsISD::VALL_NONZERO, DL, Op->getValueType(0),
1632 return DAG.getNode(MipsISD::VANY_NONZERO, DL, Op->getValueType(0),
1636 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1641 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1642 Op->getOperand(1), lowerMSASplatImm(Op, 3, DAG),
1649 SDValue One = DAG.getConstant(1, VecTy);
1651 return DAG.getNode(ISD::OR, DL, VecTy, Op->getOperand(1),
1652 DAG.getNode(ISD::SHL, DL, VecTy, One,
1659 return lowerMSABinaryBitImmIntr(Op, DAG, ISD::OR, Op->getOperand(2),
1665 return DAG.getNode(MipsISD::VALL_ZERO, DL, Op->getValueType(0),
1668 return DAG.getNode(MipsISD::VANY_ZERO, DL, Op->getValueType(0),
1674 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1680 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1681 lowerMSASplatImm(Op, 2, DAG), ISD::SETEQ);
1686 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1692 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1693 lowerMSASplatImm(Op, 2, DAG), ISD::SETLE);
1698 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1704 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1705 lowerMSASplatImm(Op, 2, DAG), ISD::SETULE);
1710 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1716 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1717 lowerMSASplatImm(Op, 2, DAG), ISD::SETLT);
1722 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1728 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1729 lowerMSASplatImm(Op, 2, DAG), ISD::SETULT);
1733 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
1737 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
1741 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
1748 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
1752 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
1759 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
1767 return DAG.getNode(ISD::SDIV, DL, Op->getValueType(0), Op->getOperand(1),
1773 return DAG.getNode(ISD::UDIV, DL, Op->getValueType(0), Op->getOperand(1),
1777 return DAG.getNode(ISD::FADD, DL, Op->getValueType(0), Op->getOperand(1),
1782 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1786 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1790 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1794 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1798 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1802 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1806 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1810 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1814 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1818 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1822 return DAG.getNode(ISD::FDIV, DL, Op->getValueType(0), Op->getOperand(1),
1826 return DAG.getNode(ISD::UINT_TO_FP, DL, Op->getValueType(0),
1830 return DAG.getNode(ISD::SINT_TO_FP, DL, Op->getValueType(0),
1844 return DAG.getNode(ISD::BUILD_VECTOR, DL, ResTy, Ops);
1849 return DAG.getNode(
1851 DAG.getNode(ISD::FEXP2, SDLoc(Op), ResTy, Op->getOperand(2)));
1855 return DAG.getNode(ISD::FLOG2, DL, Op->getValueType(0), Op->getOperand(1));
1858 return DAG.getNode(ISD::FMA, SDLoc(Op), Op->getValueType(0),
1862 return DAG.getNode(ISD::FMUL, DL, Op->getValueType(0), Op->getOperand(1),
1867 return DAG.getNode(ISD::FSUB, SDLoc(Op), ResTy, Op->getOperand(1),
1868 DAG.getNode(ISD::FMUL, SDLoc(Op), ResTy,
1873 return DAG.getNode(ISD::FRINT, DL, Op->getValueType(0), Op->getOperand(1));
1876 return DAG.getNode(ISD::FSQRT, DL, Op->getValueType(0), Op->getOperand(1));
1879 return DAG.getNode(ISD::FSUB, DL, Op->getValueType(0), Op->getOperand(1),
1883 return DAG.getNode(ISD::FP_TO_UINT, DL, Op->getValueType(0),
1887 return DAG.getNode(ISD::FP_TO_SINT, DL, Op->getValueType(0),
1893 return DAG.getNode(MipsISD::ILVEV, DL, Op->getValueType(0),
1899 return DAG.getNode(MipsISD::ILVL, DL, Op->getValueType(0),
1905 return DAG.getNode(MipsISD::ILVOD, DL, Op->getValueType(0),
1911 return DAG.getNode(MipsISD::ILVR, DL, Op->getValueType(0),
1917 return DAG.getNode(ISD::INSERT_VECTOR_ELT, SDLoc(Op), Op->getValueType(0),
1923 return DAG.getNode(MipsISD::INSVE, DL, Op->getValueType(0),
1925 DAG.getConstant(0, MVT::i32));
1930 return lowerMSASplatImm(Op, 1, DAG);
1934 return DAG.getNode(ISD::ADD, SDLoc(Op), ResTy, Op->getOperand(1),
1935 DAG.getNode(ISD::SHL, SDLoc(Op), ResTy,
1943 return DAG.getNode(ISD::ADD, SDLoc(Op), ResTy, Op->getOperand(1),
1944 DAG.getNode(ISD::MUL, SDLoc(Op), ResTy,
1951 return DAG.getNode(MipsISD::VSMAX, DL, Op->getValueType(0),
1957 return DAG.getNode(MipsISD::VUMAX, DL, Op->getValueType(0),
1963 return DAG.getNode(MipsISD::VSMAX, DL, Op->getValueType(0),
1964 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
1969 return DAG.getNode(MipsISD::VUMAX, DL, Op->getValueType(0),
1970 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
1975 return DAG.getNode(MipsISD::VSMIN, DL, Op->getValueType(0),
1981 return DAG.getNode(MipsISD::VUMIN, DL, Op->getValueType(0),
1987 return DAG.getNode(MipsISD::VSMIN, DL, Op->getValueType(0),
1988 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
1993 return DAG.getNode(MipsISD::VUMIN, DL, Op->getValueType(0),
1994 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
1999 return DAG.getNode(ISD::SREM, DL, Op->getValueType(0), Op->getOperand(1),
2005 return DAG.getNode(ISD::UREM, DL, Op->getValueType(0), Op->getOperand(1),
2011 return DAG.getNode(ISD::MUL, DL, Op->getValueType(0), Op->getOperand(1),
2018 return DAG.getNode(ISD::SUB, SDLoc(Op), ResTy, Op->getOperand(1),
2019 DAG.getNode(ISD::MUL, SDLoc(Op), ResTy,
2026 return DAG.getNode(ISD::CTLZ, DL, Op->getValueType(0), Op->getOperand(1));
2028 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2030 return DAG.getNOT(DL, Res, Res->getValueType(0));
2033 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2035 lowerMSASplatImm(Op, 2, DAG));
2036 return DAG.getNOT(DL, Res, Res->getValueType(0));
2039 return DAG.getNode(ISD::OR, DL, Op->getValueType(0), Op->getOperand(1),
2042 return DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2043 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2048 return DAG.getNode(MipsISD::PCKEV, DL, Op->getValueType(0),
2054 return DAG.getNode(MipsISD::PCKOD, DL, Op->getValueType(0),
2060 return DAG.getNode(ISD::CTPOP, DL, Op->getValueType(0), Op->getOperand(1));
2064 return DAG.getNode(MipsISD::SHF, DL, Op->getValueType(0),
2070 return DAG.getNode(ISD::SHL, DL, Op->getValueType(0), Op->getOperand(1),
2076 return DAG.getNode(ISD::SHL, DL, Op->getValueType(0),
2077 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2086 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2087 lowerMSASplatZExt(Op, 2, DAG), Op->getOperand(1),
2093 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2094 lowerMSASplatImm(Op, 2, DAG), Op->getOperand(1),
2100 return DAG.getNode(ISD::SRA, DL, Op->getValueType(0), Op->getOperand(1),
2106 return DAG.getNode(ISD::SRA, DL, Op->getValueType(0),
2107 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2112 return DAG.getNode(ISD::SRL, DL, Op->getValueType(0), Op->getOperand(1),
2118 return DAG.getNode(ISD::SRL, DL, Op->getValueType(0),
2119 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2124 return DAG.getNode(ISD::SUB, DL, Op->getValueType(0), Op->getOperand(1),
2130 return DAG.getNode(ISD::SUB, DL, Op->getValueType(0),
2131 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2136 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2139 return DAG.getNode(ISD::XOR, DL, Op->getValueType(0), Op->getOperand(1),
2142 return DAG.getNode(ISD::XOR, DL, Op->getValueType(0),
2143 DAG));
2147 static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr) {
2155 Address = DAG.getNode(ISD::ADD, DL, PtrTy, Address, Offset);
2157 return DAG.getLoad(ResTy, DL, ChainIn, Address, MachinePointerInfo(), false,
2162 SelectionDAG &DAG) const {
2168 return lowerDSPIntr(Op, DAG, MipsISD::EXTP);
2170 return lowerDSPIntr(Op, DAG, MipsISD::EXTPDP);
2172 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_W);
2174 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_R_W);
2176 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_RS_W);
2178 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_S_H);
2180 return lowerDSPIntr(Op, DAG, MipsISD::MTHLIP);
2182 return lowerDSPIntr(Op, DAG, MipsISD::MULSAQ_S_W_PH);
2184 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_S_W_PHL);
2186 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_S_W_PHR);
2188 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_SA_W_PHL);
2190 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_SA_W_PHR);
2192 return lowerDSPIntr(Op, DAG, MipsISD::DPAQ_S_W_PH);
2194 return lowerDSPIntr(Op, DAG, MipsISD::DPSQ_S_W_PH);
2196 return lowerDSPIntr(Op, DAG, MipsISD::DPAQ_SA_L_W);
2198 return lowerDSPIntr(Op, DAG, MipsISD::DPSQ_SA_L_W);
2200 return lowerDSPIntr(Op, DAG, MipsISD::DPAQX_S_W_PH);
2202 return lowerDSPIntr(Op, DAG, MipsISD::DPAQX_SA_W_PH);
2204 return lowerDSPIntr(Op, DAG, MipsISD::DPSQX_S_W_PH);
2206 return lowerDSPIntr(Op, DAG, MipsISD::DPSQX_SA_W_PH);
2211 return lowerMSALoadIntr(Op, DAG, Intr);
2215 static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr) {
2223 Address = DAG.getNode(ISD::ADD, DL, PtrTy, Address, Offset);
2225 return DAG.getStore(ChainIn, DL, Value, Address, MachinePointerInfo(), false,
2230 SelectionDAG &DAG) const {
2239 return lowerMSAStoreIntr(Op, DAG, Intr);
2244 /// This method currently relies on DAG nodes being reused when equivalent,
2269 lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const {
2281 return DAG.getNode(MipsISD::VEXTRACT_SEXT_ELT, DL, ResTy, Op0, Op1,
2282 DAG.getValueType(EltTy));
2319 SelectionDAG &DAG) const {
2365 SDValue Result = DAG.getConstant(SplatValue, ViaVecTy);
2369 Result = DAG.getNode(ISD::BITCAST, SDLoc(Node), ResTy, Result);
2383 SDValue Vector = DAG.getUNDEF(ResTy);
2385 Vector = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, ResTy, Vector,
2387 DAG.getConstant(i, MVT::i32));
2415 SelectionDAG &DAG) {
2457 return DAG.getNode(MipsISD::SHF, SDLoc(Op), ResTy,
2458 DAG.getConstant(Imm, MVT::i32), Op->getOperand(0));
2473 SelectionDAG &DAG) {
2487 return DAG.getNode(MipsISD::ILVEV, SDLoc(Op), ResTy, Op->getOperand(0),
2503 SelectionDAG &DAG) {
2517 return DAG.getNode(MipsISD::ILVOD, SDLoc(Op), ResTy, Op->getOperand(0),
2533 SelectionDAG &DAG) {
2547 return DAG.getNode(MipsISD::ILVL, SDLoc(Op), ResTy, Op->getOperand(0),
2563 SelectionDAG &DAG) {
2578 return DAG.getNode(MipsISD::ILVR, SDLoc(Op), ResTy, Op->getOperand(0),
2594 SelectionDAG &DAG) {
2604 return DAG.getNode(MipsISD::PCKEV, SDLoc(Op), ResTy, Op->getOperand(0),
2620 SelectionDAG &DAG) {
2630 return DAG.getNode(MipsISD::PCKOD, SDLoc(Op), ResTy, Op->getOperand(0),
2644 SelectionDAG &DAG) {
2667 Ops.push_back(DAG.getTargetConstant(*I, MaskEltTy));
2669 SDValue MaskVec = DAG.getNode(ISD::BUILD_VECTOR, DL, MaskVecTy, Ops);
2688 return DAG.getNode(MipsISD::VSHF, DL, ResTy, MaskVec, Op1, Op0);
2694 SelectionDAG &DAG) const {
2707 SDValue Result = lowerVECTOR_SHUFFLE_SHF(Op, ResTy, Indices, DAG);
2710 Result = lowerVECTOR_SHUFFLE_ILVEV(Op, ResTy, Indices, DAG);
2713 Result = lowerVECTOR_SHUFFLE_ILVOD(Op, ResTy, Indices, DAG);
2716 Result = lowerVECTOR_SHUFFLE_ILVL(Op, ResTy, Indices, DAG);
2719 Result = lowerVECTOR_SHUFFLE_ILVR(Op, ResTy, Indices, DAG);
2722 Result = lowerVECTOR_SHUFFLE_PCKEV(Op, ResTy, Indices, DAG);
2725 Result = lowerVECTOR_SHUFFLE_PCKOD(Op, ResTy, Indices, DAG);
2728 return lowerVECTOR_SHUFFLE_VSHF(Op, ResTy, Indices, DAG);