@@ -2057,6 +2057,15 @@ void AArch64TargetLowering::addTypeForNEON(MVT VT) {
20572057 setOperationAction(ISD::READ_REGISTER, MVT::i128, Custom);
20582058 setOperationAction(ISD::WRITE_REGISTER, MVT::i128, Custom);
20592059 }
2060+
2061+ if (VT.isInteger()) {
2062+ // Let common code emit inverted variants of compares we do support.
2063+ setCondCodeAction(ISD::SETNE, VT, Expand);
2064+ setCondCodeAction(ISD::SETLE, VT, Expand);
2065+ setCondCodeAction(ISD::SETLT, VT, Expand);
2066+ setCondCodeAction(ISD::SETULE, VT, Expand);
2067+ setCondCodeAction(ISD::SETULT, VT, Expand);
2068+ }
20602069}
20612070
20622071bool AArch64TargetLowering::shouldExpandGetActiveLaneMask(EVT ResVT,
@@ -2581,31 +2590,21 @@ unsigned AArch64TargetLowering::ComputeNumSignBitsForTargetNode(
25812590 unsigned VTBits = VT.getScalarSizeInBits();
25822591 unsigned Opcode = Op.getOpcode();
25832592 switch (Opcode) {
2584- case AArch64ISD::CMEQ:
2585- case AArch64ISD::CMGE:
2586- case AArch64ISD::CMGT:
2587- case AArch64ISD::CMHI:
2588- case AArch64ISD::CMHS:
2589- case AArch64ISD::FCMEQ:
2590- case AArch64ISD::FCMGE:
2591- case AArch64ISD::FCMGT:
2592- case AArch64ISD::CMEQz:
2593- case AArch64ISD::CMGEz:
2594- case AArch64ISD::CMGTz:
2595- case AArch64ISD::CMLEz:
2596- case AArch64ISD::CMLTz:
2597- case AArch64ISD::FCMEQz:
2598- case AArch64ISD::FCMGEz:
2599- case AArch64ISD::FCMGTz:
2600- case AArch64ISD::FCMLEz:
2601- case AArch64ISD::FCMLTz:
2602- // Compares return either 0 or all-ones
2603- return VTBits;
2604- case AArch64ISD::VASHR: {
2605- unsigned Tmp =
2606- DAG.ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
2607- return std::min<uint64_t>(Tmp + Op.getConstantOperandVal(1), VTBits);
2608- }
2593+ case AArch64ISD::FCMEQ:
2594+ case AArch64ISD::FCMGE:
2595+ case AArch64ISD::FCMGT:
2596+ case AArch64ISD::FCMEQz:
2597+ case AArch64ISD::FCMGEz:
2598+ case AArch64ISD::FCMGTz:
2599+ case AArch64ISD::FCMLEz:
2600+ case AArch64ISD::FCMLTz:
2601+ // Compares return either 0 or all-ones
2602+ return VTBits;
2603+ case AArch64ISD::VASHR: {
2604+ unsigned Tmp =
2605+ DAG.ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
2606+ return std::min<uint64_t>(Tmp + Op.getConstantOperandVal(1), VTBits);
2607+ }
26092608 }
26102609
26112610 return 1;
@@ -2812,19 +2811,9 @@ const char *AArch64TargetLowering::getTargetNodeName(unsigned Opcode) const {
28122811 MAKE_CASE(AArch64ISD::VASHR)
28132812 MAKE_CASE(AArch64ISD::VSLI)
28142813 MAKE_CASE(AArch64ISD::VSRI)
2815- MAKE_CASE(AArch64ISD::CMEQ)
2816- MAKE_CASE(AArch64ISD::CMGE)
2817- MAKE_CASE(AArch64ISD::CMGT)
2818- MAKE_CASE(AArch64ISD::CMHI)
2819- MAKE_CASE(AArch64ISD::CMHS)
28202814 MAKE_CASE(AArch64ISD::FCMEQ)
28212815 MAKE_CASE(AArch64ISD::FCMGE)
28222816 MAKE_CASE(AArch64ISD::FCMGT)
2823- MAKE_CASE(AArch64ISD::CMEQz)
2824- MAKE_CASE(AArch64ISD::CMGEz)
2825- MAKE_CASE(AArch64ISD::CMGTz)
2826- MAKE_CASE(AArch64ISD::CMLEz)
2827- MAKE_CASE(AArch64ISD::CMLTz)
28282817 MAKE_CASE(AArch64ISD::FCMEQz)
28292818 MAKE_CASE(AArch64ISD::FCMGEz)
28302819 MAKE_CASE(AArch64ISD::FCMGTz)
@@ -15840,9 +15829,6 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
1584015829 SplatBitSize, HasAnyUndefs);
1584115830
1584215831 bool IsZero = IsCnst && SplatValue == 0;
15843- bool IsOne =
15844- IsCnst && SrcVT.getScalarSizeInBits() == SplatBitSize && SplatValue == 1;
15845- bool IsMinusOne = IsCnst && SplatValue.isAllOnes();
1584615832
1584715833 if (SrcVT.getVectorElementType().isFloatingPoint()) {
1584815834 switch (CC) {
@@ -15889,50 +15875,7 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
1588915875 }
1589015876 }
1589115877
15892- switch (CC) {
15893- default:
15894- return SDValue();
15895- case AArch64CC::NE: {
15896- SDValue Cmeq;
15897- if (IsZero)
15898- Cmeq = DAG.getNode(AArch64ISD::CMEQz, dl, VT, LHS);
15899- else
15900- Cmeq = DAG.getNode(AArch64ISD::CMEQ, dl, VT, LHS, RHS);
15901- return DAG.getNOT(dl, Cmeq, VT);
15902- }
15903- case AArch64CC::EQ:
15904- if (IsZero)
15905- return DAG.getNode(AArch64ISD::CMEQz, dl, VT, LHS);
15906- return DAG.getNode(AArch64ISD::CMEQ, dl, VT, LHS, RHS);
15907- case AArch64CC::GE:
15908- if (IsZero)
15909- return DAG.getNode(AArch64ISD::CMGEz, dl, VT, LHS);
15910- return DAG.getNode(AArch64ISD::CMGE, dl, VT, LHS, RHS);
15911- case AArch64CC::GT:
15912- if (IsZero)
15913- return DAG.getNode(AArch64ISD::CMGTz, dl, VT, LHS);
15914- if (IsMinusOne)
15915- return DAG.getNode(AArch64ISD::CMGEz, dl, VT, LHS);
15916- return DAG.getNode(AArch64ISD::CMGT, dl, VT, LHS, RHS);
15917- case AArch64CC::LE:
15918- if (IsZero)
15919- return DAG.getNode(AArch64ISD::CMLEz, dl, VT, LHS);
15920- return DAG.getNode(AArch64ISD::CMGE, dl, VT, RHS, LHS);
15921- case AArch64CC::LS:
15922- return DAG.getNode(AArch64ISD::CMHS, dl, VT, RHS, LHS);
15923- case AArch64CC::LO:
15924- return DAG.getNode(AArch64ISD::CMHI, dl, VT, RHS, LHS);
15925- case AArch64CC::LT:
15926- if (IsZero)
15927- return DAG.getNode(AArch64ISD::CMLTz, dl, VT, LHS);
15928- if (IsOne)
15929- return DAG.getNode(AArch64ISD::CMLEz, dl, VT, LHS);
15930- return DAG.getNode(AArch64ISD::CMGT, dl, VT, RHS, LHS);
15931- case AArch64CC::HI:
15932- return DAG.getNode(AArch64ISD::CMHI, dl, VT, LHS, RHS);
15933- case AArch64CC::HS:
15934- return DAG.getNode(AArch64ISD::CMHS, dl, VT, LHS, RHS);
15935- }
15878+ return SDValue();
1593615879}
1593715880
1593815881SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
@@ -15950,13 +15893,8 @@ SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
1595015893 EVT CmpVT = LHS.getValueType().changeVectorElementTypeToInteger();
1595115894 SDLoc dl(Op);
1595215895
15953- if (LHS.getValueType().getVectorElementType().isInteger()) {
15954- assert(LHS.getValueType() == RHS.getValueType());
15955- AArch64CC::CondCode AArch64CC = changeIntCCToAArch64CC(CC);
15956- SDValue Cmp =
15957- EmitVectorComparison(LHS, RHS, AArch64CC, false, CmpVT, dl, DAG);
15958- return DAG.getSExtOrTrunc(Cmp, dl, Op.getValueType());
15959- }
15896+ if (LHS.getValueType().getVectorElementType().isInteger())
15897+ return Op;
1596015898
1596115899 // Lower isnan(x) | isnan(never-nan) to x != x.
1596215900 // Lower !isnan(x) & !isnan(never-nan) to x == x.
@@ -18152,7 +18090,9 @@ static SDValue foldVectorXorShiftIntoCmp(SDNode *N, SelectionDAG &DAG,
1815218090 if (!ShiftAmt || ShiftAmt->getZExtValue() != ShiftEltTy.getSizeInBits() - 1)
1815318091 return SDValue();
1815418092
18155- return DAG.getNode(AArch64ISD::CMGEz, SDLoc(N), VT, Shift.getOperand(0));
18093+ SDLoc DL(N);
18094+ SDValue Zero = DAG.getConstant(0, DL, Shift.getValueType());
18095+ return DAG.getSetCC(DL, VT, Shift.getOperand(0), Zero, ISD::SETGE);
1815618096}
1815718097
1815818098// Given a vecreduce_add node, detect the below pattern and convert it to the
@@ -18763,7 +18703,8 @@ static SDValue performMulVectorCmpZeroCombine(SDNode *N, SelectionDAG &DAG) {
1876318703
1876418704 SDLoc DL(N);
1876518705 SDValue In = DAG.getNode(AArch64ISD::NVCAST, DL, HalfVT, Srl.getOperand(0));
18766- SDValue CM = DAG.getNode(AArch64ISD::CMLTz, DL, HalfVT, In);
18706+ SDValue Zero = DAG.getConstant(0, DL, In.getValueType());
18707+ SDValue CM = DAG.getSetCC(DL, HalfVT, Zero, In, ISD::SETGT);
1876718708 return DAG.getNode(AArch64ISD::NVCAST, DL, VT, CM);
1876818709}
1876918710
@@ -25292,6 +25233,16 @@ static SDValue performSETCCCombine(SDNode *N,
2529225233 if (SDValue V = performOrXorChainCombine(N, DAG))
2529325234 return V;
2529425235
25236+ EVT CmpVT = LHS.getValueType();
25237+
25238+ // NOTE: This exists as a combine only because it proved too awkward to match
25239+ // splat(1) across all the NEON types during isel.
25240+ APInt SplatLHSVal;
25241+ if (CmpVT.isInteger() && Cond == ISD::SETGT &&
25242+ ISD::isConstantSplatVector(LHS.getNode(), SplatLHSVal) &&
25243+ SplatLHSVal.isOne())
25244+ return DAG.getSetCC(DL, VT, DAG.getConstant(0, DL, CmpVT), RHS, ISD::SETGE);
25245+
2529525246 return SDValue();
2529625247}
2529725248
0 commit comments