@@ -2057,6 +2057,15 @@ void AArch64TargetLowering::addTypeForNEON(MVT VT) {
2057
2057
setOperationAction(ISD::READ_REGISTER, MVT::i128, Custom);
2058
2058
setOperationAction(ISD::WRITE_REGISTER, MVT::i128, Custom);
2059
2059
}
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
+ }
2060
2069
}
2061
2070
2062
2071
bool AArch64TargetLowering::shouldExpandGetActiveLaneMask(EVT ResVT,
@@ -2581,31 +2590,21 @@ unsigned AArch64TargetLowering::ComputeNumSignBitsForTargetNode(
2581
2590
unsigned VTBits = VT.getScalarSizeInBits();
2582
2591
unsigned Opcode = Op.getOpcode();
2583
2592
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
+ }
2609
2608
}
2610
2609
2611
2610
return 1;
@@ -2812,19 +2811,9 @@ const char *AArch64TargetLowering::getTargetNodeName(unsigned Opcode) const {
2812
2811
MAKE_CASE(AArch64ISD::VASHR)
2813
2812
MAKE_CASE(AArch64ISD::VSLI)
2814
2813
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)
2820
2814
MAKE_CASE(AArch64ISD::FCMEQ)
2821
2815
MAKE_CASE(AArch64ISD::FCMGE)
2822
2816
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)
2828
2817
MAKE_CASE(AArch64ISD::FCMEQz)
2829
2818
MAKE_CASE(AArch64ISD::FCMGEz)
2830
2819
MAKE_CASE(AArch64ISD::FCMGTz)
@@ -15840,9 +15829,6 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
15840
15829
SplatBitSize, HasAnyUndefs);
15841
15830
15842
15831
bool IsZero = IsCnst && SplatValue == 0;
15843
- bool IsOne =
15844
- IsCnst && SrcVT.getScalarSizeInBits() == SplatBitSize && SplatValue == 1;
15845
- bool IsMinusOne = IsCnst && SplatValue.isAllOnes();
15846
15832
15847
15833
if (SrcVT.getVectorElementType().isFloatingPoint()) {
15848
15834
switch (CC) {
@@ -15889,50 +15875,7 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
15889
15875
}
15890
15876
}
15891
15877
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();
15936
15879
}
15937
15880
15938
15881
SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
@@ -15950,13 +15893,8 @@ SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
15950
15893
EVT CmpVT = LHS.getValueType().changeVectorElementTypeToInteger();
15951
15894
SDLoc dl(Op);
15952
15895
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;
15960
15898
15961
15899
// Lower isnan(x) | isnan(never-nan) to x != x.
15962
15900
// Lower !isnan(x) & !isnan(never-nan) to x == x.
@@ -18152,7 +18090,9 @@ static SDValue foldVectorXorShiftIntoCmp(SDNode *N, SelectionDAG &DAG,
18152
18090
if (!ShiftAmt || ShiftAmt->getZExtValue() != ShiftEltTy.getSizeInBits() - 1)
18153
18091
return SDValue();
18154
18092
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);
18156
18096
}
18157
18097
18158
18098
// 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) {
18763
18703
18764
18704
SDLoc DL(N);
18765
18705
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);
18767
18708
return DAG.getNode(AArch64ISD::NVCAST, DL, VT, CM);
18768
18709
}
18769
18710
@@ -25292,6 +25233,16 @@ static SDValue performSETCCCombine(SDNode *N,
25292
25233
if (SDValue V = performOrXorChainCombine(N, DAG))
25293
25234
return V;
25294
25235
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
+
25295
25246
return SDValue();
25296
25247
}
25297
25248
0 commit comments