[llvm] [PowerPC] Add custom lowering for ssubo (PR #111748)
Amy Kwan via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 28 19:48:03 PDT 2024
================
@@ -11967,6 +11971,36 @@ SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
llvm_unreachable("ERROR:Should return for all cases within swtich.");
}
+SDValue PPCTargetLowering::LowerSSUBO(SDValue Op, SelectionDAG &DAG) const {
+
+ SDLoc dl(Op);
+
+ SDValue LHS64 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i64, Op.getOperand(0));
+ SDValue RHS64 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i64, Op.getOperand(1));
+
+ SDValue Sub = DAG.getNode(ISD::SUB, dl, MVT::i64, LHS64, RHS64);
+
+ SDValue Extsw = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, MVT::i64, Sub,
+ DAG.getValueType(MVT::i32));
+
+ SDValue Xor = DAG.getNode(ISD::XOR, dl, MVT::i64, Extsw, Sub);
+
+ SDValue Addic = DAG.getNode(ISD::ADDC, dl, DAG.getVTList(MVT::i64, MVT::Glue),
+ Xor, DAG.getConstant(-1, dl, MVT::i64));
+
+ SDValue Overflow =
+ DAG.getNode(ISD::SUBE, dl, DAG.getVTList(MVT::i64, MVT::Glue), Xor, Addic,
+ Addic.getValue(1));
+
+ SDValue OverflowTrunc =
+ DAG.getNode(ISD::TRUNCATE, dl, Op.getNode()->getValueType(1), Overflow);
+ SDValue SubTrunc =
+ (Sub->getValueType(0) != Op.getNode()->getValueType(0))
----------------
amy-kwan wrote:
Nit: Can probably pull out `Op.getNode()->getValueType(0)`.
https://github.com/llvm/llvm-project/pull/111748
More information about the llvm-commits
mailing list