[llvm] [X86] Prefer branchless code with sbb for abdu (PR #187783)
Phoebe Wang via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 21 03:19:46 PDT 2026
================
@@ -30091,20 +30106,23 @@ static SDValue LowerABD(SDValue Op, const X86Subtarget &Subtarget,
Diff1.getValue(1));
}
- // abds(lhs, rhs) -> trunc(abs(sub(sext(lhs), sext(rhs))))
- // abdu(lhs, rhs) -> trunc(abs(sub(zext(lhs), zext(rhs))))
- unsigned WideBits = std::max<unsigned>(2 * VT.getScalarSizeInBits(), 32u);
- MVT WideVT = MVT::getIntegerVT(WideBits);
- if (TLI.isTypeLegal(WideVT)) {
- SDVTList WideVTs = DAG.getVTList(WideVT, MVT::i32);
- SDValue LHS = DAG.getNode(ExtOpc, dl, WideVT, Op.getOperand(0));
- SDValue RHS = DAG.getNode(ExtOpc, dl, WideVT, Op.getOperand(1));
- SDValue Diff0 = DAG.getNode(X86ISD::SUB, dl, WideVTs, LHS, RHS);
- SDValue Diff1 = DAG.getNode(X86ISD::SUB, dl, WideVTs, RHS, LHS);
- SDValue AbsDiff = DAG.getNode(X86ISD::CMOV, dl, WideVT, Diff1, Diff0,
- DAG.getTargetConstant(CC, dl, MVT::i8),
- Diff1.getValue(1));
- return DAG.getNode(ISD::TRUNCATE, dl, VT, AbsDiff);
+ // abds i8/i16 with CMOV: sign-extend to wider type, CMOV, truncate.
+ if (IsSigned && Subtarget.canUseCMOV()) {
----------------
phoebewang wrote:
Do we have unsigned cases fall here? Using assert is better if not.
https://github.com/llvm/llvm-project/pull/187783
More information about the llvm-commits
mailing list