@@ -198,6 +198,10 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
198
198
}
199
199
}
200
200
201
+ if (!Subtarget.hasP10Vector() && isPPC64) {
202
+ setOperationAction(ISD::SSUBO, MVT::i32, Custom);
203
+ }
204
+
201
205
// Match BITREVERSE to customized fast code sequence in the td file.
202
206
setOperationAction(ISD::BITREVERSE, MVT::i32, Legal);
203
207
setOperationAction(ISD::BITREVERSE, MVT::i64, Legal);
@@ -11967,6 +11971,36 @@ SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
11967
11971
llvm_unreachable("ERROR:Should return for all cases within swtich.");
11968
11972
}
11969
11973
11974
+ SDValue PPCTargetLowering::LowerSSUBO(SDValue Op, SelectionDAG &DAG) const {
11975
+
11976
+ SDLoc dl(Op);
11977
+
11978
+ SDValue LHS64 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i64, Op.getOperand(0));
11979
+ SDValue RHS64 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i64, Op.getOperand(1));
11980
+
11981
+ SDValue Sub = DAG.getNode(ISD::SUB, dl, MVT::i64, LHS64, RHS64);
11982
+
11983
+ SDValue Extsw = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, MVT::i64, Sub,
11984
+ DAG.getValueType(MVT::i32));
11985
+
11986
+ SDValue Xor = DAG.getNode(ISD::XOR, dl, MVT::i64, Extsw, Sub);
11987
+
11988
+ SDValue Addic = DAG.getNode(ISD::ADDC, dl, DAG.getVTList(MVT::i64, MVT::Glue),
11989
+ Xor, DAG.getConstant(-1, dl, MVT::i64));
11990
+
11991
+ SDValue Overflow =
11992
+ DAG.getNode(ISD::SUBE, dl, DAG.getVTList(MVT::i64, MVT::Glue), Xor, Addic,
11993
+ Addic.getValue(1));
11994
+
11995
+ SDValue OverflowTrunc =
11996
+ DAG.getNode(ISD::TRUNCATE, dl, Op.getNode()->getValueType(1), Overflow);
11997
+ SDValue SubTrunc =
11998
+ (Sub->getValueType(0) != Op.getNode()->getValueType(0))
11999
+ ? DAG.getNode(ISD::TRUNCATE, dl, Op.getNode()->getValueType(0), Sub)
12000
+ : Sub;
12001
+ return DAG.getMergeValues({SubTrunc, OverflowTrunc}, dl);
12002
+ }
12003
+
11970
12004
/// LowerOperation - Provide custom lowering hooks for some operations.
11971
12005
///
11972
12006
SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
@@ -11988,6 +12022,8 @@ SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
11988
12022
case ISD::SETCC: return LowerSETCC(Op, DAG);
11989
12023
case ISD::INIT_TRAMPOLINE: return LowerINIT_TRAMPOLINE(Op, DAG);
11990
12024
case ISD::ADJUST_TRAMPOLINE: return LowerADJUST_TRAMPOLINE(Op, DAG);
12025
+ case ISD::SSUBO:
12026
+ return LowerSSUBO(Op, DAG);
11991
12027
11992
12028
case ISD::INLINEASM:
11993
12029
case ISD::INLINEASM_BR: return LowerINLINEASM(Op, DAG);
0 commit comments