@@ -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)
@@ -15814,9 +15803,6 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
1581415803 SplatBitSize, HasAnyUndefs);
1581515804
1581615805 bool IsZero = IsCnst && SplatValue == 0;
15817- bool IsOne =
15818- IsCnst && SrcVT.getScalarSizeInBits() == SplatBitSize && SplatValue == 1;
15819- bool IsMinusOne = IsCnst && SplatValue.isAllOnes();
1582015806
1582115807 if (SrcVT.getVectorElementType().isFloatingPoint()) {
1582215808 switch (CC) {
@@ -15863,50 +15849,7 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
1586315849 }
1586415850 }
1586515851
15866- switch (CC) {
15867- default:
15868- return SDValue();
15869- case AArch64CC::NE: {
15870- SDValue Cmeq;
15871- if (IsZero)
15872- Cmeq = DAG.getNode(AArch64ISD::CMEQz, dl, VT, LHS);
15873- else
15874- Cmeq = DAG.getNode(AArch64ISD::CMEQ, dl, VT, LHS, RHS);
15875- return DAG.getNOT(dl, Cmeq, VT);
15876- }
15877- case AArch64CC::EQ:
15878- if (IsZero)
15879- return DAG.getNode(AArch64ISD::CMEQz, dl, VT, LHS);
15880- return DAG.getNode(AArch64ISD::CMEQ, dl, VT, LHS, RHS);
15881- case AArch64CC::GE:
15882- if (IsZero)
15883- return DAG.getNode(AArch64ISD::CMGEz, dl, VT, LHS);
15884- return DAG.getNode(AArch64ISD::CMGE, dl, VT, LHS, RHS);
15885- case AArch64CC::GT:
15886- if (IsZero)
15887- return DAG.getNode(AArch64ISD::CMGTz, dl, VT, LHS);
15888- if (IsMinusOne)
15889- return DAG.getNode(AArch64ISD::CMGEz, dl, VT, LHS);
15890- return DAG.getNode(AArch64ISD::CMGT, dl, VT, LHS, RHS);
15891- case AArch64CC::LE:
15892- if (IsZero)
15893- return DAG.getNode(AArch64ISD::CMLEz, dl, VT, LHS);
15894- return DAG.getNode(AArch64ISD::CMGE, dl, VT, RHS, LHS);
15895- case AArch64CC::LS:
15896- return DAG.getNode(AArch64ISD::CMHS, dl, VT, RHS, LHS);
15897- case AArch64CC::LO:
15898- return DAG.getNode(AArch64ISD::CMHI, dl, VT, RHS, LHS);
15899- case AArch64CC::LT:
15900- if (IsZero)
15901- return DAG.getNode(AArch64ISD::CMLTz, dl, VT, LHS);
15902- if (IsOne)
15903- return DAG.getNode(AArch64ISD::CMLEz, dl, VT, LHS);
15904- return DAG.getNode(AArch64ISD::CMGT, dl, VT, RHS, LHS);
15905- case AArch64CC::HI:
15906- return DAG.getNode(AArch64ISD::CMHI, dl, VT, LHS, RHS);
15907- case AArch64CC::HS:
15908- return DAG.getNode(AArch64ISD::CMHS, dl, VT, LHS, RHS);
15909- }
15852+ return SDValue();
1591015853}
1591115854
1591215855SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
@@ -15927,9 +15870,11 @@ SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
1592715870 if (LHS.getValueType().getVectorElementType().isInteger()) {
1592815871 assert(LHS.getValueType() == RHS.getValueType());
1592915872 AArch64CC::CondCode AArch64CC = changeIntCCToAArch64CC(CC);
15930- SDValue Cmp =
15931- EmitVectorComparison(LHS, RHS, AArch64CC, false, CmpVT, dl, DAG);
15932- return DAG.getSExtOrTrunc(Cmp, dl, Op.getValueType());
15873+ if (SDValue Cmp =
15874+ EmitVectorComparison(LHS, RHS, AArch64CC, false, CmpVT, dl, DAG))
15875+ return DAG.getSExtOrTrunc(Cmp, dl, Op.getValueType());
15876+
15877+ return Op;
1593315878 }
1593415879
1593515880 // Lower isnan(x) | isnan(never-nan) to x != x.
@@ -18128,7 +18073,9 @@ static SDValue foldVectorXorShiftIntoCmp(SDNode *N, SelectionDAG &DAG,
1812818073 if (!ShiftAmt || ShiftAmt->getZExtValue() != ShiftEltTy.getSizeInBits() - 1)
1812918074 return SDValue();
1813018075
18131- return DAG.getNode(AArch64ISD::CMGEz, SDLoc(N), VT, Shift.getOperand(0));
18076+ SDLoc DL(N);
18077+ SDValue Zero = DAG.getConstant(0, DL, Shift.getValueType());
18078+ return DAG.getSetCC(DL, VT, Shift.getOperand(0), Zero, ISD::SETGE);
1813218079}
1813318080
1813418081// Given a vecreduce_add node, detect the below pattern and convert it to the
@@ -18739,7 +18686,8 @@ static SDValue performMulVectorCmpZeroCombine(SDNode *N, SelectionDAG &DAG) {
1873918686
1874018687 SDLoc DL(N);
1874118688 SDValue In = DAG.getNode(AArch64ISD::NVCAST, DL, HalfVT, Srl.getOperand(0));
18742- SDValue CM = DAG.getNode(AArch64ISD::CMLTz, DL, HalfVT, In);
18689+ SDValue Zero = DAG.getConstant(0, DL, In.getValueType());
18690+ SDValue CM = DAG.getSetCC(DL, HalfVT, Zero, In, ISD::SETGT);
1874318691 return DAG.getNode(AArch64ISD::NVCAST, DL, VT, CM);
1874418692}
1874518693
@@ -25268,6 +25216,14 @@ static SDValue performSETCCCombine(SDNode *N,
2526825216 if (SDValue V = performOrXorChainCombine(N, DAG))
2526925217 return V;
2527025218
25219+ EVT CmpVT = LHS.getValueType();
25220+
25221+ APInt SplatLHSVal;
25222+ if (CmpVT.isInteger() && Cond == ISD::SETGT &&
25223+ ISD::isConstantSplatVector(LHS.getNode(), SplatLHSVal) &&
25224+ SplatLHSVal.isOne())
25225+ return DAG.getSetCC(DL, VT, DAG.getConstant(0, DL, CmpVT), RHS, ISD::SETGE);
25226+
2527125227 return SDValue();
2527225228}
2527325229
0 commit comments