@@ -4832,59 +4832,47 @@ SDValue ARMTargetLowering::getVFPCmp(SDValue LHS, SDValue RHS,
4832
4832
}
4833
4833
4834
4834
// This function returns three things: the arithmetic computation itself
4835
- // (Value), a comparison (OverflowCmp ), and a condition code (ARMcc). The
4835
+ // (Value), a comparison (Overflow ), and a condition code (ARMcc). The
4836
4836
// comparison and the condition code define the case in which the arithmetic
4837
4837
// computation *does not* overflow.
4838
4838
std::pair<SDValue, SDValue>
4839
4839
ARMTargetLowering::getARMXALUOOp(SDValue Op, SelectionDAG &DAG,
4840
4840
SDValue &ARMcc) const {
4841
4841
assert(Op.getValueType() == MVT::i32 && "Unsupported value type");
4842
4842
4843
- SDValue Value, OverflowCmp ;
4843
+ SDValue Value, Overflow ;
4844
4844
SDValue LHS = Op.getOperand(0);
4845
4845
SDValue RHS = Op.getOperand(1);
4846
4846
SDLoc dl(Op);
4847
-
4848
- // FIXME: We are currently always generating CMPs because we don't support
4849
- // generating CMN through the backend. This is not as good as the natural
4850
- // CMP case because it causes a register dependency and cannot be folded
4851
- // later.
4847
+ unsigned Opc = 0;
4852
4848
4853
4849
switch (Op.getOpcode()) {
4854
4850
default:
4855
4851
llvm_unreachable("Unknown overflow instruction!");
4856
4852
case ISD::SADDO:
4853
+ Opc = ARMISD::ADDC;
4857
4854
ARMcc = DAG.getConstant(ARMCC::VC, dl, MVT::i32);
4858
- Value = DAG.getNode(ISD::ADD, dl, Op.getValueType(), LHS, RHS);
4859
- OverflowCmp = DAG.getNode(ARMISD::CMP, dl, FlagsVT, Value, LHS);
4860
4855
break;
4861
4856
case ISD::UADDO:
4862
- ARMcc = DAG.getConstant(ARMCC::HS, dl, MVT::i32);
4863
- // We use ADDC here to correspond to its use in LowerUnsignedALUO.
4864
- // We do not use it in the USUBO case as Value may not be used.
4865
- Value = DAG.getNode(ARMISD::ADDC, dl,
4866
- DAG.getVTList(Op.getValueType(), MVT::i32), LHS, RHS)
4867
- .getValue(0);
4868
- OverflowCmp = DAG.getNode(ARMISD::CMP, dl, FlagsVT, Value, LHS);
4857
+ Opc = ARMISD::ADDC;
4858
+ ARMcc = DAG.getConstant(ARMCC::LO, dl, MVT::i32);
4869
4859
break;
4870
4860
case ISD::SSUBO:
4861
+ Opc = ARMISD::SUBC;
4871
4862
ARMcc = DAG.getConstant(ARMCC::VC, dl, MVT::i32);
4872
- Value = DAG.getNode(ISD::SUB, dl, Op.getValueType(), LHS, RHS);
4873
- OverflowCmp = DAG.getNode(ARMISD::CMP, dl, FlagsVT, LHS, RHS);
4874
4863
break;
4875
4864
case ISD::USUBO:
4865
+ Opc = ARMISD::SUBC;
4876
4866
ARMcc = DAG.getConstant(ARMCC::HS, dl, MVT::i32);
4877
- Value = DAG.getNode(ISD::SUB, dl, Op.getValueType(), LHS, RHS);
4878
- OverflowCmp = DAG.getNode(ARMISD::CMP, dl, FlagsVT, LHS, RHS);
4879
4867
break;
4880
4868
case ISD::UMULO:
4881
4869
// We generate a UMUL_LOHI and then check if the high word is 0.
4882
4870
ARMcc = DAG.getConstant(ARMCC::EQ, dl, MVT::i32);
4883
4871
Value = DAG.getNode(ISD::UMUL_LOHI, dl,
4884
4872
DAG.getVTList(Op.getValueType(), Op.getValueType()),
4885
4873
LHS, RHS);
4886
- OverflowCmp = DAG.getNode(ARMISD::CMP, dl, FlagsVT, Value.getValue(1),
4887
- DAG.getConstant(0, dl, MVT::i32));
4874
+ Overflow = DAG.getNode(ARMISD::CMP, dl, FlagsVT, Value.getValue(1),
4875
+ DAG.getConstant(0, dl, MVT::i32));
4888
4876
Value = Value.getValue(0); // We only want the low 32 bits for the result.
4889
4877
break;
4890
4878
case ISD::SMULO:
@@ -4894,15 +4882,20 @@ ARMTargetLowering::getARMXALUOOp(SDValue Op, SelectionDAG &DAG,
4894
4882
Value = DAG.getNode(ISD::SMUL_LOHI, dl,
4895
4883
DAG.getVTList(Op.getValueType(), Op.getValueType()),
4896
4884
LHS, RHS);
4897
- OverflowCmp = DAG.getNode(ARMISD::CMP, dl, FlagsVT, Value.getValue(1),
4898
- DAG.getNode(ISD::SRA, dl, Op.getValueType(),
4899
- Value.getValue(0),
4900
- DAG.getConstant(31, dl, MVT::i32)));
4885
+ Overflow = DAG.getNode(ARMISD::CMP, dl, FlagsVT, Value.getValue(1),
4886
+ DAG.getNode(ISD::SRA, dl, Op.getValueType(),
4887
+ Value.getValue(0),
4888
+ DAG.getConstant(31, dl, MVT::i32)));
4901
4889
Value = Value.getValue(0); // We only want the low 32 bits for the result.
4902
4890
break;
4903
4891
} // switch (...)
4892
+ if (Opc) {
4893
+ SDVTList VTs = DAG.getVTList(Op.getValueType(), FlagsVT);
4894
+ Value = DAG.getNode(Opc, dl, VTs, LHS, RHS);
4895
+ Overflow = Value.getValue(1);
4896
+ }
4904
4897
4905
- return std::make_pair(Value, OverflowCmp );
4898
+ return std::make_pair(Value, Overflow );
4906
4899
}
4907
4900
4908
4901
SDValue
@@ -4911,20 +4904,18 @@ ARMTargetLowering::LowerSignedALUO(SDValue Op, SelectionDAG &DAG) const {
4911
4904
if (!isTypeLegal(Op.getValueType()))
4912
4905
return SDValue();
4913
4906
4914
- SDValue Value, OverflowCmp;
4915
- SDValue ARMcc;
4916
- std::tie(Value, OverflowCmp) = getARMXALUOOp(Op, DAG, ARMcc);
4917
4907
SDLoc dl(Op);
4908
+ SDValue Value, Overflow;
4909
+ SDValue ARMcc;
4910
+ std::tie(Value, Overflow) = getARMXALUOOp(Op, DAG, ARMcc);
4918
4911
// We use 0 and 1 as false and true values.
4919
4912
SDValue TVal = DAG.getConstant(1, dl, MVT::i32);
4920
4913
SDValue FVal = DAG.getConstant(0, dl, MVT::i32);
4921
- EVT VT = Op.getValueType();
4922
4914
4923
- SDValue Overflow =
4924
- DAG.getNode(ARMISD::CMOV, dl, VT , TVal, FVal, ARMcc, OverflowCmp );
4915
+ Overflow =
4916
+ DAG.getNode(ARMISD::CMOV, dl, MVT::i32 , TVal, FVal, ARMcc, Overflow );
4925
4917
4926
- SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::i32);
4927
- return DAG.getNode(ISD::MERGE_VALUES, dl, VTs, Value, Overflow);
4918
+ return DAG.getMergeValues({Value, Overflow}, dl);
4928
4919
}
4929
4920
4930
4921
static SDValue ConvertBooleanCarryToCarryFlag(SDValue BoolCarry,
@@ -5055,12 +5046,12 @@ SDValue ARMTargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
5055
5046
if (!isTypeLegal(Cond->getValueType(0)))
5056
5047
return SDValue();
5057
5048
5058
- SDValue Value, OverflowCmp ;
5049
+ SDValue Value, Overflow ;
5059
5050
SDValue ARMcc;
5060
- std::tie(Value, OverflowCmp ) = getARMXALUOOp(Cond, DAG, ARMcc);
5051
+ std::tie(Value, Overflow ) = getARMXALUOOp(Cond, DAG, ARMcc);
5061
5052
EVT VT = Op.getValueType();
5062
5053
5063
- return getCMOV(dl, VT, SelectTrue, SelectFalse, ARMcc, OverflowCmp , DAG);
5054
+ return getCMOV(dl, VT, SelectTrue, SelectFalse, ARMcc, Overflow , DAG);
5064
5055
}
5065
5056
5066
5057
// Convert:
@@ -5657,9 +5648,9 @@ SDValue ARMTargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
5657
5648
return SDValue();
5658
5649
5659
5650
// The actual operation with overflow check.
5660
- SDValue Value, OverflowCmp ;
5651
+ SDValue Value, Overflow ;
5661
5652
SDValue ARMcc;
5662
- std::tie(Value, OverflowCmp ) = getARMXALUOOp(Cond, DAG, ARMcc);
5653
+ std::tie(Value, Overflow ) = getARMXALUOOp(Cond, DAG, ARMcc);
5663
5654
5664
5655
// Reverse the condition code.
5665
5656
ARMCC::CondCodes CondCode =
@@ -5668,7 +5659,7 @@ SDValue ARMTargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
5668
5659
ARMcc = DAG.getConstant(CondCode, SDLoc(ARMcc), MVT::i32);
5669
5660
5670
5661
return DAG.getNode(ARMISD::BRCOND, dl, MVT::Other, Chain, Dest, ARMcc,
5671
- OverflowCmp );
5662
+ Overflow );
5672
5663
}
5673
5664
5674
5665
return SDValue();
@@ -5707,9 +5698,9 @@ SDValue ARMTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
5707
5698
return SDValue();
5708
5699
5709
5700
// The actual operation with overflow check.
5710
- SDValue Value, OverflowCmp ;
5701
+ SDValue Value, Overflow ;
5711
5702
SDValue ARMcc;
5712
- std::tie(Value, OverflowCmp ) = getARMXALUOOp(LHS.getValue(0), DAG, ARMcc);
5703
+ std::tie(Value, Overflow ) = getARMXALUOOp(LHS.getValue(0), DAG, ARMcc);
5713
5704
5714
5705
if ((CC == ISD::SETNE) != isOneConstant(RHS)) {
5715
5706
// Reverse the condition code.
@@ -5720,7 +5711,7 @@ SDValue ARMTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
5720
5711
}
5721
5712
5722
5713
return DAG.getNode(ARMISD::BRCOND, dl, MVT::Other, Chain, Dest, ARMcc,
5723
- OverflowCmp );
5714
+ Overflow );
5724
5715
}
5725
5716
5726
5717
if (LHS.getValueType() == MVT::i32) {
0 commit comments