@@ -200,8 +200,11 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
200
200
201
201
// On P10, the default lowering generates better code using the
202
202
// setbc instruction.
203
- if (!Subtarget.hasP10Vector())
203
+ if (!Subtarget.hasP10Vector()) {
204
204
setOperationAction(ISD::SSUBO, MVT::i32, Custom);
205
+ if (isPPC64)
206
+ setOperationAction(ISD::SSUBO, MVT::i64, Custom);
207
+ }
205
208
206
209
// Match BITREVERSE to customized fast code sequence in the td file.
207
210
setOperationAction(ISD::BITREVERSE, MVT::i32, Legal);
@@ -12051,16 +12054,19 @@ SDValue PPCTargetLowering::LowerSSUBO(SDValue Op, SelectionDAG &DAG) const {
12051
12054
SDLoc dl(Op);
12052
12055
SDValue LHS = Op.getOperand(0);
12053
12056
SDValue RHS = Op.getOperand(1);
12057
+ EVT VT = Op.getNode()->getValueType(0);
12058
+
12059
+ SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, LHS, RHS);
12054
12060
12055
- SDValue Sub = DAG.getNode(ISD::SUB, dl, MVT::i32, LHS, RHS);
12061
+ SDValue Xor1 = DAG.getNode(ISD::XOR, dl, VT, RHS, LHS);
12062
+ SDValue Xor2 = DAG.getNode(ISD::XOR, dl, VT, Sub, LHS);
12056
12063
12057
- SDValue Xor1 = DAG.getNode(ISD::XOR, dl, MVT::i32, RHS, LHS);
12058
- SDValue Xor2 = DAG.getNode(ISD::XOR, dl, MVT::i32, Sub, LHS);
12064
+ SDValue And = DAG.getNode(ISD::AND, dl, VT, Xor1, Xor2);
12059
12065
12060
- SDValue And = DAG.getNode(ISD::AND, dl, MVT::i32, Xor1, Xor2);
12066
+ SDValue Overflow =
12067
+ DAG.getNode(ISD::SRL, dl, VT, And,
12068
+ DAG.getConstant(VT.getSizeInBits() - 1, dl, MVT::i32));
12061
12069
12062
- SDValue Overflow = DAG.getNode(ISD::SRL, dl, MVT::i32, And,
12063
- DAG.getConstant(31, dl, MVT::i32));
12064
12070
SDValue OverflowTrunc =
12065
12071
DAG.getNode(ISD::TRUNCATE, dl, Op.getNode()->getValueType(1), Overflow);
12066
12072
0 commit comments