Lines Matching refs:DAG

1 //===- MipsSEISelLowering.cpp - MipsSE DAG Lowering Interface -------------===//
409 SDValue MipsSETargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
411 return MipsTargetLowering::LowerOperation(Op, DAG);
419 SDValue Tmp = DAG.getNode(MipsISD::MTC1_D64, DL, MVT::f64, Op->getOperand(0));
420 return DAG.getNode(MipsISD::FSELECT, DL, ResTy, Tmp, Op->getOperand(1),
450 SelectionDAG &DAG) const {
452 case ISD::LOAD: return lowerLOAD(Op, DAG);
453 case ISD::STORE: return lowerSTORE(Op, DAG);
454 case ISD::SMUL_LOHI: return lowerMulDiv(Op, MipsISD::Mult, true, true, DAG);
455 case ISD::UMUL_LOHI: return lowerMulDiv(Op, MipsISD::Multu, true, true, DAG);
456 case ISD::MULHS: return lowerMulDiv(Op, MipsISD::Mult, false, true, DAG);
457 case ISD::MULHU: return lowerMulDiv(Op, MipsISD::Multu, false, true, DAG);
458 case ISD::MUL: return lowerMulDiv(Op, MipsISD::Mult, true, false, DAG);
459 case ISD::SDIVREM: return lowerMulDiv(Op, MipsISD::DivRem, true, true, DAG);
461 DAG);
462 case ISD::INTRINSIC_WO_CHAIN: return lowerINTRINSIC_WO_CHAIN(Op, DAG);
463 case ISD::INTRINSIC_W_CHAIN: return lowerINTRINSIC_W_CHAIN(Op, DAG);
464 case ISD::INTRINSIC_VOID: return lowerINTRINSIC_VOID(Op, DAG);
465 case ISD::EXTRACT_VECTOR_ELT: return lowerEXTRACT_VECTOR_ELT(Op, DAG);
466 case ISD::BUILD_VECTOR: return lowerBUILD_VECTOR(Op, DAG);
467 case ISD::VECTOR_SHUFFLE: return lowerVECTOR_SHUFFLE(Op, DAG);
468 case ISD::SELECT: return lowerSELECT(Op, DAG);
469 case ISD::BITCAST: return lowerBITCAST(Op, DAG);
472 return MipsTargetLowering::LowerOperation(Op, DAG);
482 static SDValue performANDCombine(SDNode *N, SelectionDAG &DAG,
516 return DAG.getNode(MipsISD::VEXTRACT_ZEXT_ELT, SDLoc(Op0),
597 static SDValue performORCombine(SDNode *N, SelectionDAG &DAG,
710 // Transform the DAG into an equivalent VSELECT.
711 return DAG.getNode(ISD::VSELECT, SDLoc(N), Ty, Cond, IfSet, IfClr);
718 SelectionDAG &DAG,
783 unsigned RegisterSize = DAG.getTargetLoweringInfo()
784 .getRegisterType(*DAG.getContext(), VT)
794 EVT ShiftTy, SelectionDAG &DAG) {
797 return DAG.getConstant(0, DL, VT);
805 return DAG.getNode(ISD::SHL, DL, VT, X,
806 DAG.getConstant(C.logBase2(), DL, ShiftTy));
817 SDValue Op0 = genConstMult(X, Floor, DL, VT, ShiftTy, DAG);
818 SDValue Op1 = genConstMult(X, C - Floor, DL, VT, ShiftTy, DAG);
819 return DAG.getNode(ISD::ADD, DL, VT, Op0, Op1);
824 SDValue Op0 = genConstMult(X, Ceil, DL, VT, ShiftTy, DAG);
825 SDValue Op1 = genConstMult(X, Ceil - C, DL, VT, ShiftTy, DAG);
826 return DAG.getNode(ISD::SUB, DL, VT, Op0, Op1);
829 static SDValue performMULCombine(SDNode *N, SelectionDAG &DAG,
837 C->getAPIntValue(), VT, DAG, Subtarget))
839 TL->getScalarShiftAmountTy(DAG.getDataLayout(), VT),
840 DAG);
846 SelectionDAG &DAG,
866 return DAG.getNode(Opc, DL, Ty, N->getOperand(0),
867 DAG.getConstant(SplatValue.getZExtValue(), DL, MVT::i32));
870 static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG,
878 return performDSPShiftCombine(MipsISD::SHLL_DSP, N, Ty, DAG, Subtarget);
893 static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG,
925 return DAG.getNode(MipsISD::VEXTRACT_SEXT_ELT, SDLoc(Op0Op0),
935 return performDSPShiftCombine(MipsISD::SHRA_DSP, N, Ty, DAG, Subtarget);
939 static SDValue performSRLCombine(SDNode *N, SelectionDAG &DAG,
947 return performDSPShiftCombine(MipsISD::SHRL_DSP, N, Ty, DAG, Subtarget);
968 static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG) {
977 return DAG.getNode(MipsISD::SETCC_DSP, SDLoc(N), Ty, N->getOperand(0),
981 static SDValue performVSELECTCombine(SDNode *N, SelectionDAG &DAG) {
990 return DAG.getNode(MipsISD::SELECT_CC_DSP, SDLoc(N), Ty,
998 static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG,
1018 return DAG.getNode(MipsISD::VNOR, SDLoc(N), Ty, NotOp->getOperand(0),
1027 SelectionDAG &DAG = DCI.DAG;
1032 Val = performANDCombine(N, DAG, DCI, Subtarget);
1035 Val = performORCombine(N, DAG, DCI, Subtarget);
1038 return performMULCombine(N, DAG, DCI, this, Subtarget);
1040 Val = performSHLCombine(N, DAG, DCI, Subtarget);
1043 return performSRACombine(N, DAG, DCI, Subtarget);
1045 return performSRLCombine(N, DAG, DCI, Subtarget);
1047 return performVSELECTCombine(N, DAG);
1049 Val = performXORCombine(N, DAG, Subtarget);
1052 Val = performSETCCCombine(N, DAG);
1057 LLVM_DEBUG(dbgs() << "\nMipsSE DAG Combine:\n";
1058 N->printrWithDepth(dbgs(), &DAG); dbgs() << "\n=> \n";
1059 Val.getNode()->printrWithDepth(dbgs(), &DAG); dbgs() << "\n");
1174 SDValue MipsSETargetLowering::lowerLOAD(SDValue Op, SelectionDAG &DAG) const {
1178 return MipsTargetLowering::lowerLOAD(Op, DAG);
1186 SDValue Lo = DAG.getLoad(MVT::i32, DL, Chain, Ptr, MachinePointerInfo(),
1190 Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Ptr, DAG.getConstant(4, DL, PtrVT));
1191 SDValue Hi = DAG.getLoad(
1198 SDValue BP = DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
1200 return DAG.getMergeValues(Ops, DL);
1203 SDValue MipsSETargetLowering::lowerSTORE(SDValue Op, SelectionDAG &DAG) const {
1207 return MipsTargetLowering::lowerSTORE(Op, DAG);
1213 SDValue Lo = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1214 Val, DAG.getConstant(0, DL, MVT::i32));
1215 SDValue Hi = DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32,
1216 Val, DAG.getConstant(1, DL, MVT::i32));
1223 DAG.getStore(Chain, DL, Lo, Ptr, MachinePointerInfo(), Nd.getAlignment(),
1227 Ptr = DAG.getNode(ISD::ADD, DL, PtrVT, Ptr, DAG.getConstant(4, DL, PtrVT));
1228 return DAG.getStore(Chain, DL, Hi, Ptr, MachinePointerInfo(),
1234 SelectionDAG &DAG) const {
1241 SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32,
1242 Op.getOperand(0), DAG.getIntPtrConstant(0, DL));
1243 SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32,
1244 Op.getOperand(0), DAG.getIntPtrConstant(1, DL));
1245 return DAG.getNode(MipsISD::BuildPairF64, DL, MVT::f64, Lo, Hi);
1251 DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32, Op.getOperand(0),
1252 DAG.getConstant(0, DL, MVT::i32));
1254 DAG.getNode(MipsISD::ExtractElementF64, DL, MVT::i32, Op.getOperand(0),
1255 DAG.getConstant(1, DL, MVT::i32));
1256 return DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, Lo, Hi);
1265 SelectionDAG &DAG) const {
1271 SDValue Mult = DAG.getNode(NewOpc, DL, MVT::Untyped,
1276 Lo = DAG.getNode(MipsISD::MFLO, DL, Ty, Mult);
1278 Hi = DAG.getNode(MipsISD::MFHI, DL, Ty, Mult);
1284 return DAG.getMergeValues(Vals, DL);
1287 static SDValue initAccumulator(SDValue In, const SDLoc &DL, SelectionDAG &DAG) {
1288 SDValue InLo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, In,
1289 DAG.getConstant(0, DL, MVT::i32));
1290 SDValue InHi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, In,
1291 DAG.getConstant(1, DL, MVT::i32));
1292 return DAG.getNode(MipsISD::MTLOHI, DL, MVT::Untyped, InLo, InHi);
1295 static SDValue extractLOHI(SDValue Op, const SDLoc &DL, SelectionDAG &DAG) {
1296 SDValue Lo = DAG.getNode(MipsISD::MFLO, DL, MVT::i32, Op);
1297 SDValue Hi = DAG.getNode(MipsISD::MFHI, DL, MVT::i32, Op);
1298 return DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i64, Lo, Hi);
1313 static SDValue lowerDSPIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1330 In64 = initAccumulator(Opnd, DL, DAG);
1350 SDValue Val = DAG.getNode(Opc, DL, ResTys, Ops);
1351 SDValue Out = (ResTys[0] == MVT::Untyped) ? extractLOHI(Val, DL, DAG) : Val;
1358 return DAG.getMergeValues(Vals, DL);
1362 static SDValue lowerMSACopyIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) {
1369 SDValue Result = DAG.getNode(Opc, DL, ResTy, Vec, Idx,
1370 DAG.getValueType(EltTy));
1375 static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG) {
1378 bool BigEndian = !DAG.getSubtarget().getTargetTriple().isLittleEndian();
1391 LaneB = DAG.getConstant(0, DL, MVT::i32);
1407 SDValue Result = DAG.getBuildVector(
1411 SDValue One = DAG.getConstant(1, DL, ViaVecTy);
1412 Result = DAG.getNode(ISD::BITCAST, DL, ResVecTy,
1413 DAG.getNode(ISD::AND, DL, ViaVecTy, Result, One));
1419 static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG,
1422 return DAG.getConstant(
1429 bool BigEndian, SelectionDAG &DAG) {
1439 SplatValueA = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, SplatValue);
1440 SplatValueB = DAG.getNode(ISD::SRL, DL, MVT::i64, SplatValue,
1441 DAG.getConstant(32, DL, MVT::i32));
1442 SplatValueB = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, SplatValueB);
1455 SDValue Result = DAG.getBuildVector(
1459 Result = DAG.getNode(ISD::BITCAST, DL, VecTy, Result);
1464 static SDValue lowerMSABinaryBitImmIntr(SDValue Op, SelectionDAG &DAG,
1471 // The DAG Combiner can't constant fold bitcasted vectors yet so we must do it
1477 SDValue BitImmHiOp = DAG.getConstant(BitImm.lshr(32).trunc(32), DL,
1479 SDValue BitImmLoOp = DAG.getConstant(BitImm.trunc(32), DL, MVT::i32);
1484 Exp2Imm = DAG.getNode(
1486 DAG.getBuildVector(MVT::v4i32, DL,
1497 Imm = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, Imm);
1499 Exp2Imm = getBuildVectorSplat(VecTy, Imm, BigEndian, DAG);
1501 Exp2Imm = DAG.getNode(ISD::SHL, DL, VecTy, DAG.getConstant(1, DL, VecTy),
1505 return DAG.getNode(Opc, DL, VecTy, Op->getOperand(1), Exp2Imm);
1508 static SDValue truncateVecElts(SDValue Op, SelectionDAG &DAG) {
1512 bool BigEndian = !DAG.getSubtarget().getTargetTriple().isLittleEndian();
1514 SDValue ConstValue = DAG.getConstant(Vec.getScalarValueSizeInBits() - 1,
1516 SDValue SplatVec = getBuildVectorSplat(ResTy, ConstValue, BigEndian, DAG);
1518 return DAG.getNode(ISD::AND, DL, ResTy, Vec, SplatVec);
1521 static SDValue lowerMSABitClear(SDValue Op, SelectionDAG &DAG) {
1524 SDValue One = DAG.getConstant(1, DL, ResTy);
1525 SDValue Bit = DAG.getNode(ISD::SHL, DL, ResTy, One, truncateVecElts(Op, DAG));
1527 return DAG.getNode(ISD::AND, DL, ResTy, Op->getOperand(1),
1528 DAG.getNOT(DL, Bit, ResTy));
1531 static SDValue lowerMSABitClearImm(SDValue Op, SelectionDAG &DAG) {
1536 SDValue BitMask = DAG.getConstant(~BitImm, DL, ResTy);
1538 return DAG.getNode(ISD::AND, DL, ResTy, Op->getOperand(1), BitMask);
1542 SelectionDAG &DAG) const {
1549 return lowerDSPIntr(Op, DAG, MipsISD::SHILO);
1551 return lowerDSPIntr(Op, DAG, MipsISD::DPAU_H_QBL);
1553 return lowerDSPIntr(Op, DAG, MipsISD::DPAU_H_QBR);
1555 return lowerDSPIntr(Op, DAG, MipsISD::DPSU_H_QBL);
1557 return lowerDSPIntr(Op, DAG, MipsISD::DPSU_H_QBR);
1559 return lowerDSPIntr(Op, DAG, MipsISD::DPA_W_PH);
1561 return lowerDSPIntr(Op, DAG, MipsISD::DPS_W_PH);
1563 return lowerDSPIntr(Op, DAG, MipsISD::DPAX_W_PH);
1565 return lowerDSPIntr(Op, DAG, MipsISD::DPSX_W_PH);
1567 return lowerDSPIntr(Op, DAG, MipsISD::MULSA_W_PH);
1569 return lowerDSPIntr(Op, DAG, MipsISD::Mult);
1571 return lowerDSPIntr(Op, DAG, MipsISD::Multu);
1573 return lowerDSPIntr(Op, DAG, MipsISD::MAdd);
1575 return lowerDSPIntr(Op, DAG, MipsISD::MAddu);
1577 return lowerDSPIntr(Op, DAG, MipsISD::MSub);
1579 return lowerDSPIntr(Op, DAG, MipsISD::MSubu);
1584 return DAG.getNode(ISD::ADD, DL, Op->getValueType(0), Op->getOperand(1),
1590 return DAG.getNode(ISD::ADD, DL, Op->getValueType(0), Op->getOperand(1),
1591 lowerMSASplatImm(Op, 2, DAG));
1593 return DAG.getNode(ISD::AND, DL, Op->getValueType(0), Op->getOperand(1),
1596 return DAG.getNode(ISD::AND, DL, Op->getValueType(0), Op->getOperand(1),
1597 lowerMSASplatImm(Op, 2, DAG));
1602 return lowerMSABitClear(Op, DAG);
1607 return lowerMSABitClearImm(Op, DAG);
1619 return DAG.getNode(ISD::VSELECT, DL, VecTy,
1620 DAG.getConstant(Mask, DL, VecTy, true),
1634 return DAG.getNode(ISD::VSELECT, DL, VecTy,
1635 DAG.getConstant(Mask, DL, VecTy, true),
1639 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0), Op->getOperand(3),
1642 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1643 lowerMSASplatImm(Op, 3, DAG), Op->getOperand(2),
1646 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0), Op->getOperand(3),
1649 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1650 lowerMSASplatImm(Op, 3, DAG), Op->getOperand(1),
1657 SDValue One = DAG.getConstant(1, DL, VecTy);
1659 return DAG.getNode(ISD::XOR, DL, VecTy, Op->getOperand(1),
1660 DAG.getNode(ISD::SHL, DL, VecTy, One,
1661 truncateVecElts(Op, DAG)));
1667 return lowerMSABinaryBitImmIntr(Op, DAG, ISD::XOR, Op->getOperand(2),
1673 return DAG.getNode(MipsISD::VALL_NONZERO, DL, Op->getValueType(0),
1676 return DAG.getNode(MipsISD::VANY_NONZERO, DL, Op->getValueType(0),
1680 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1685 return DAG.getNode(ISD::VSELECT, DL, Op->getValueType(0),
1686 Op->getOperand(1), lowerMSASplatImm(Op, 3, DAG),
1693 SDValue One = DAG.getConstant(1, DL, VecTy);
1695 return DAG.getNode(ISD::OR, DL, VecTy, Op->getOperand(1),
1696 DAG.getNode(ISD::SHL, DL, VecTy, One,
1697 truncateVecElts(Op, DAG)));
1703 return lowerMSABinaryBitImmIntr(Op, DAG, ISD::OR, Op->getOperand(2),
1709 return DAG.getNode(MipsISD::VALL_ZERO, DL, Op->getValueType(0),
1712 return DAG.getNode(MipsISD::VANY_ZERO, DL, Op->getValueType(0),
1718 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1724 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1725 lowerMSASplatImm(Op, 2, DAG, true), ISD::SETEQ);
1730 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1736 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1737 lowerMSASplatImm(Op, 2, DAG, true), ISD::SETLE);
1742 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1748 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1749 lowerMSASplatImm(Op, 2, DAG), ISD::SETULE);
1754 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1760 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1761 lowerMSASplatImm(Op, 2, DAG, true), ISD::SETLT);
1766 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1772 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1773 lowerMSASplatImm(Op, 2, DAG), ISD::SETULT);
1777 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
1781 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
1785 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
1792 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
1796 return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
1803 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
1811 return DAG.getNode(ISD::SDIV, DL, Op->getValueType(0), Op->getOperand(1),
1817 return DAG.getNode(ISD::UDIV, DL, Op->getValueType(0), Op->getOperand(1),
1822 return DAG.getNode(ISD::FADD, DL, Op->getValueType(0), Op->getOperand(1),
1827 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1831 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1835 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1839 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1843 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1847 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1851 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1855 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1859 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1863 return DAG.getSetCC(DL, Op->getValueType(0), Op->getOperand(1),
1868 return DAG.getNode(ISD::FDIV, DL, Op->getValueType(0), Op->getOperand(1),
1872 return DAG.getNode(ISD::UINT_TO_FP, DL, Op->getValueType(0),
1876 return DAG.getNode(ISD::SINT_TO_FP, DL, Op->getValueType(0),
1888 return DAG.getBuildVector(ResTy, DL, Ops);
1894 return DAG.getNode(
1896 DAG.getNode(ISD::FEXP2, SDLoc(Op), ResTy, Op->getOperand(2)));
1900 return DAG.getNode(ISD::FLOG2, DL, Op->getValueType(0), Op->getOperand(1));
1903 return DAG.getNode(ISD::FMA, SDLoc(Op), Op->getValueType(0),
1908 return DAG.getNode(ISD::FMUL, DL, Op->getValueType(0), Op->getOperand(1),
1913 return DAG.getNode(MipsISD::FMS, SDLoc(Op), Op->getValueType(0),
1918 return DAG.getNode(ISD::FRINT, DL, Op->getValueType(0), Op->getOperand(1));
1921 return DAG.getNode(ISD::FSQRT, DL, Op->getValueType(0), Op->getOperand(1));
1925 return DAG.getNode(ISD::FSUB, DL, Op->getValueType(0), Op->getOperand(1),
1929 return DAG.getNode(ISD::FP_TO_UINT, DL, Op->getValueType(0),
1933 return DAG.getNode(ISD::FP_TO_SINT, DL, Op->getValueType(0),
1939 return DAG.getNode(MipsISD::ILVEV, DL, Op->getValueType(0),
1945 return DAG.getNode(MipsISD::ILVL, DL, Op->getValueType(0),
1951 return DAG.getNode(MipsISD::ILVOD, DL, Op->getValueType(0),
1957 return DAG.getNode(MipsISD::ILVR, DL, Op->getValueType(0),
1963 return DAG.getNode(ISD::INSERT_VECTOR_ELT, SDLoc(Op), Op->getValueType(0),
1981 return DAG.getNode(MipsISD::INSVE, DL, Op->getValueType(0),
1983 DAG.getConstant(0, DL, MVT::i32));
1989 return lowerMSASplatImm(Op, 1, DAG, true);
1993 return DAG.getNode(ISD::ADD, SDLoc(Op), ResTy, Op->getOperand(1),
1994 DAG.getNode(ISD::SHL, SDLoc(Op), ResTy,
2002 return DAG.getNode(ISD::ADD, SDLoc(Op), ResTy, Op->getOperand(1),
2003 DAG.getNode(ISD::MUL, SDLoc(Op), ResTy,
2010 return DAG.getNode(ISD::SMAX, DL, Op->getValueType(0),
2016 return DAG.getNode(ISD::UMAX, DL, Op->getValueType(0),
2022 return DAG.getNode(ISD::SMAX, DL, Op->getValueType(0),
2023 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG, true));
2028 return DAG.getNode(ISD::UMAX, DL, Op->getValueType(0),
2029 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2034 return DAG.getNode(ISD::SMIN, DL, Op->getValueType(0),
2040 return DAG.getNode(ISD::UMIN, DL, Op->getValueType(0),
2046 return DAG.getNode(ISD::SMIN, DL, Op->getValueType(0),
2047 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG, true));
2052 return DAG.getNode(ISD::UMIN, DL, Op->getValueType(0),
2053 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2058 return DAG.getNode(ISD::SREM, DL, Op->getValueType(0), Op->getOperand(1),
2064 return DAG.getNode(ISD::UREM, DL, Op->getValueType(0), Op->getOperand(1),
2070 return DAG.getNode(ISD::MUL, DL, Op->getValueType(0), Op->getOperand(1),
2077 return DAG.getNode(ISD::SUB, SDLoc(Op), ResTy, Op->getOperand(1),
2078 DAG.getNode(ISD::MUL, SDLoc(Op), ResTy,
2085 return DAG.getNode(ISD::CTLZ, DL, Op->getValueType(0), Op->getOperand(1));
2087 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2089 return DAG.getNOT(DL, Res, Res->getValueType(0));
2092 SDValue Res = DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2094 lowerMSASplatImm(Op, 2, DAG));
2095 return DAG.getNOT(DL, Res, Res->getValueType(0));
2098 return DAG.getNode(ISD::OR, DL, Op->getValueType(0), Op->getOperand(1),
2101 return DAG.getNode(ISD::OR, DL, Op->getValueType(0),
2102 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2107 return DAG.getNode(MipsISD::PCKEV, DL, Op->getValueType(0),
2113 return DAG.getNode(MipsISD::PCKOD, DL, Op->getValueType(0),
2119 return DAG.getNode(ISD::CTPOP, DL, Op->getValueType(0), Op->getOperand(1));
2152 return DAG.getNode(MipsISD::SHF, DL, Op->getValueType(0),
2177 return DAG.getNode(ISD::SHL, DL, Op->getValueType(0), Op->getOperand(1),
2178 truncateVecElts(Op, DAG));
2183 return DAG.getNode(ISD::SHL, DL, Op->getValueType(0),
2184 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2193 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2194 lowerMSASplatZExt(Op, 2, DAG), Op->getOperand(1),
2200 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2201 lowerMSASplatImm(Op, 2, DAG), Op->getOperand(1),
2207 return DAG.getNode(ISD::SRA, DL, Op->getValueType(0), Op->getOperand(1),
2208 truncateVecElts(Op, DAG));
2213 return DAG.getNode(ISD::SRA, DL, Op->getValueType(0),
2214 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2237 return DAG.getNode(ISD::SRL, DL, Op->getValueType(0), Op->getOperand(1),
2238 truncateVecElts(Op, DAG));
2243 return DAG.getNode(ISD::SRL, DL, Op->getValueType(0),
2244 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2267 return DAG.getNode(ISD::SUB, DL, Op->getValueType(0), Op->getOperand(1),
2273 return DAG.getNode(ISD::SUB, DL, Op->getValueType(0),
2274 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2279 return DAG.getNode(MipsISD::VSHF, DL, Op->getValueType(0),
2282 return DAG.getNode(ISD::XOR, DL, Op->getValueType(0), Op->getOperand(1),
2285 return DAG.getNode(ISD::XOR, DL, Op->getValueType(0),
2286 Op->getOperand(1), lowerMSASplatImm(Op, 2, DAG));
2288 EVT PtrVT = getPointerTy(DAG.getDataLayout());
2289 return DAG.getNode(MipsISD::ThreadPointer, DL, PtrVT);
2294 static SDValue lowerMSALoadIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2307 Offset = DAG.getNode(ISD::SIGN_EXTEND, DL, PtrTy, Offset);
2309 Address = DAG.getNode(ISD::ADD, DL, PtrTy, Address, Offset);
2310 return DAG.getLoad(ResTy, DL, ChainIn, Address, MachinePointerInfo(),
2315 SelectionDAG &DAG) const {
2321 return lowerDSPIntr(Op, DAG, MipsISD::EXTP);
2323 return lowerDSPIntr(Op, DAG, MipsISD::EXTPDP);
2325 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_W);
2327 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_R_W);
2329 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_RS_W);
2331 return lowerDSPIntr(Op, DAG, MipsISD::EXTR_S_H);
2333 return lowerDSPIntr(Op, DAG, MipsISD::MTHLIP);
2335 return lowerDSPIntr(Op, DAG, MipsISD::MULSAQ_S_W_PH);
2337 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_S_W_PHL);
2339 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_S_W_PHR);
2341 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_SA_W_PHL);
2343 return lowerDSPIntr(Op, DAG, MipsISD::MAQ_SA_W_PHR);
2345 return lowerDSPIntr(Op, DAG, MipsISD::DPAQ_S_W_PH);
2347 return lowerDSPIntr(Op, DAG, MipsISD::DPSQ_S_W_PH);
2349 return lowerDSPIntr(Op, DAG, MipsISD::DPAQ_SA_L_W);
2351 return lowerDSPIntr(Op, DAG, MipsISD::DPSQ_SA_L_W);
2353 return lowerDSPIntr(Op, DAG, MipsISD::DPAQX_S_W_PH);
2355 return lowerDSPIntr(Op, DAG, MipsISD::DPAQX_SA_W_PH);
2357 return lowerDSPIntr(Op, DAG, MipsISD::DPSQX_S_W_PH);
2359 return lowerDSPIntr(Op, DAG, MipsISD::DPSQX_SA_W_PH);
2364 return lowerMSALoadIntr(Op, DAG, Intr, Subtarget);
2368 static SDValue lowerMSAStoreIntr(SDValue Op, SelectionDAG &DAG, unsigned Intr,
2381 Offset = DAG.getNode(ISD::SIGN_EXTEND, DL, PtrTy, Offset);
2383 Address = DAG.getNode(ISD::ADD, DL, PtrTy, Address, Offset);
2385 return DAG.getStore(ChainIn, DL, Value, Address, MachinePointerInfo(),
2390 SelectionDAG &DAG) const {
2399 return lowerMSAStoreIntr(Op, DAG, Intr, Subtarget);
2411 lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const {
2423 return DAG.getNode(MipsISD::VEXTRACT_SEXT_ELT, DL, ResTy, Op0, Op1,
2424 DAG.getValueType(EltTy));
2461 SelectionDAG &DAG) const {
2506 SDValue Result = DAG.getConstant(SplatValue, DL, ViaVecTy);
2510 Result = DAG.getNode(ISD::BITCAST, SDLoc(Node), ResTy, Result);
2513 } else if (DAG.isSplatValue(Op, /* AllowUndefs */ false))
2524 SDValue Vector = DAG.getUNDEF(ResTy);
2526 Vector = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, ResTy, Vector,
2528 DAG.getConstant(i, DL, MVT::i32));
2556 SelectionDAG &DAG) {
2599 return DAG.getNode(MipsISD::SHF, DL, ResTy,
2600 DAG.getTargetConstant(Imm, DL, MVT::i32),
2637 SelectionDAG &DAG) {
2669 SelectionDAG &DAG) {
2695 return DAG.getNode(MipsISD::ILVEV, SDLoc(Op), ResTy, Ws, Wt);
2715 SelectionDAG &DAG) {
2741 return DAG.getNode(MipsISD::ILVOD, SDLoc(Op), ResTy, Wt, Ws);
2762 SelectionDAG &DAG) {
2788 return DAG.getNode(MipsISD::ILVR, SDLoc(Op), ResTy, Ws, Wt);
2809 SelectionDAG &DAG) {
2837 return DAG.getNode(MipsISD::ILVL, SDLoc(Op), ResTy, Ws, Wt);
2857 SelectionDAG &DAG) {
2880 return DAG.getNode(MipsISD::PCKEV, SDLoc(Op), ResTy, Ws, Wt);
2900 SelectionDAG &DAG) {
2923 return DAG.getNode(MipsISD::PCKOD, SDLoc(Op), ResTy, Ws, Wt);
2936 SelectionDAG &DAG) {
2959 Ops.push_back(DAG.getTargetConstant(*I, DL, MaskEltTy));
2961 SDValue MaskVec = DAG.getBuildVector(MaskVecTy, DL, Ops);
2980 return DAG.getNode(MipsISD::VSHF, DL, ResTy, MaskVec, Op1, Op0);
2986 SelectionDAG &DAG) const {
3001 if (isVECTOR_SHUFFLE_SPLATI(Op, ResTy, Indices, DAG))
3002 return lowerVECTOR_SHUFFLE_VSHF(Op, ResTy, Indices, DAG);
3004 if ((Result = lowerVECTOR_SHUFFLE_ILVEV(Op, ResTy, Indices, DAG)))
3006 if ((Result = lowerVECTOR_SHUFFLE_ILVOD(Op, ResTy, Indices, DAG)))
3008 if ((Result = lowerVECTOR_SHUFFLE_ILVL(Op, ResTy, Indices, DAG)))
3010 if ((Result = lowerVECTOR_SHUFFLE_ILVR(Op, ResTy, Indices, DAG)))
3012 if ((Result = lowerVECTOR_SHUFFLE_PCKEV(Op, ResTy, Indices, DAG)))
3014 if ((Result = lowerVECTOR_SHUFFLE_PCKOD(Op, ResTy, Indices, DAG)))
3016 if ((Result = lowerVECTOR_SHUFFLE_SHF(Op, ResTy, Indices, DAG)))
3018 return lowerVECTOR_SHUFFLE_VSHF(Op, ResTy, Indices, DAG);