[llvm] b98aa6f - [X86] LowerABD - lower i8/i16 cases directly to CMOV(SUB(X,Y),SUB(Y,X)) pattern
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 9 02:30:12 PDT 2024
Author: Simon Pilgrim
Date: 2024-09-09T10:29:21+01:00
New Revision: b98aa6fb1d5f5fa904ce6d789a8fa4a245a90ee6
URL: https://github.com/llvm/llvm-project/commit/b98aa6fb1d5f5fa904ce6d789a8fa4a245a90ee6
DIFF: https://github.com/llvm/llvm-project/commit/b98aa6fb1d5f5fa904ce6d789a8fa4a245a90ee6.diff
LOG: [X86] LowerABD - lower i8/i16 cases directly to CMOV(SUB(X,Y),SUB(Y,X)) pattern
Better codegen (shorter dependency chain for better ILP) than via the TRUNC(ABS(SUB(EXT(LHS),EXT(RHS)))) expansion
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/abds-neg.ll
llvm/test/CodeGen/X86/abds.ll
llvm/test/CodeGen/X86/abdu-neg.ll
llvm/test/CodeGen/X86/abdu.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 8c5d082024640e..99477d76f50bce 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -28541,12 +28541,14 @@ static SDValue LowerABD(SDValue Op, const X86Subtarget &Subtarget,
bool IsSigned = Op.getOpcode() == ISD::ABDS;
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
- if (VT.isScalarInteger()) {
+ if (Subtarget.canUseCMOV() && VT.isScalarInteger()) {
+ X86::CondCode CC = IsSigned ? X86::COND_L : X86::COND_B;
+ unsigned ExtOpc = IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
+
// abds(lhs, rhs) -> select(slt(lhs,rhs),sub(rhs,lhs),sub(lhs,rhs))
// abdu(lhs, rhs) -> select(ult(lhs,rhs),sub(rhs,lhs),sub(lhs,rhs))
- if (Subtarget.canUseCMOV() && VT.bitsGE(MVT::i32)) {
+ if (VT.bitsGE(MVT::i32)) {
SDVTList VTs = DAG.getVTList(VT, MVT::i32);
- X86::CondCode CC = IsSigned ? X86::COND_L : X86::COND_B;
SDValue LHS = DAG.getFreeze(Op.getOperand(0));
SDValue RHS = DAG.getFreeze(Op.getOperand(1));
SDValue Diff0 = DAG.getNode(X86ISD::SUB, dl, VTs, LHS, RHS);
@@ -28556,17 +28558,19 @@ static SDValue LowerABD(SDValue Op, const X86Subtarget &Subtarget,
Diff1.getValue(1));
}
- // TODO: Move to TargetLowering expandABD() once we have ABD promotion.
// 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)) {
- unsigned ExtOpc = IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
+ 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 Diff = DAG.getNode(ISD::SUB, dl, WideVT, LHS, RHS);
- SDValue AbsDiff = DAG.getNode(ISD::ABS, dl, WideVT, Diff);
+ 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);
}
}
@@ -55526,8 +55530,13 @@ static SDValue combineX86AddSub(SDNode *N, SelectionDAG &DAG,
SDVTList VTs = DAG.getVTList(N->getValueType(0));
if (SDNode *GenericAddSub = DAG.getNodeIfExists(GenericOpc, VTs, Ops)) {
SDValue Op(N, 0);
- if (Negate)
+ if (Negate) {
+ // Bail if this is only used by a user of the x86 add/sub.
+ if (GenericAddSub->hasOneUse() &&
+ GenericAddSub->use_begin()->isOnlyUserOf(N))
+ return;
Op = DAG.getNegative(Op, DL, VT);
+ }
DCI.CombineTo(GenericAddSub, Op);
}
};
diff --git a/llvm/test/CodeGen/X86/abds-neg.ll b/llvm/test/CodeGen/X86/abds-neg.ll
index b22c8c54e89a64..b9b3436dd1ed9f 100644
--- a/llvm/test/CodeGen/X86/abds-neg.ll
+++ b/llvm/test/CodeGen/X86/abds-neg.ll
@@ -11,10 +11,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -23,10 +23,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -44,22 +44,21 @@ define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i8_i16:
; X64: # %bb.0:
-; X64-NEXT: movswl %si, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movswl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edi, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -77,10 +76,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -89,10 +88,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -110,21 +109,22 @@ define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i16:
; X64: # %bb.0:
-; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movswl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = sext i16 %a to i64
@@ -173,21 +173,22 @@ define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i16_undef:
; X64: # %bb.0:
-; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movswl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = sext i16 %a to i64
@@ -524,10 +525,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -536,10 +537,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -554,21 +555,22 @@ define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_minmax_i16:
; X64: # %bb.0:
-; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movswl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%min = call i16 @llvm.smin.i16(i16 %a, i16 %b)
@@ -740,10 +742,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -752,10 +754,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -771,21 +773,22 @@ define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_cmp_i16:
; X64: # %bb.0:
-; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movswl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%cmp = icmp slt i16 %a, %b
diff --git a/llvm/test/CodeGen/X86/abds.ll b/llvm/test/CodeGen/X86/abds.ll
index 9476fd14306fe5..9c4c059a3b9bf1 100644
--- a/llvm/test/CodeGen/X86/abds.ll
+++ b/llvm/test/CodeGen/X86/abds.ll
@@ -11,10 +11,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -22,10 +22,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%aext = sext i8 %a to i64
@@ -41,21 +41,20 @@ define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i8_i16:
; X64: # %bb.0:
-; X64-NEXT: movswl %si, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movswl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edi, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%aext = sext i8 %a to i64
@@ -71,10 +70,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -82,10 +81,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%aext = sext i8 %a to i64
@@ -101,10 +100,10 @@ define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -112,10 +111,10 @@ define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = sext i16 %a to i64
@@ -160,10 +159,10 @@ define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -171,10 +170,10 @@ define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = sext i16 %a to i64
@@ -471,10 +470,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -482,10 +481,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%min = call i8 @llvm.smin.i8(i8 %a, i8 %b)
@@ -499,10 +498,10 @@ define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -510,10 +509,10 @@ define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%min = call i16 @llvm.smin.i16(i16 %a, i16 %b)
@@ -650,10 +649,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -661,10 +660,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movsbl %sil, %eax
; X64-NEXT: movsbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%cmp = icmp sgt i8 %a, %b
@@ -679,10 +678,10 @@ define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovll %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -690,10 +689,10 @@ define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movswl %si, %eax
; X64-NEXT: movswl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovll %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%cmp = icmp sge i16 %a, %b
diff --git a/llvm/test/CodeGen/X86/abdu-neg.ll b/llvm/test/CodeGen/X86/abdu-neg.ll
index f9da1a9e04530f..1ded7e79e2510c 100644
--- a/llvm/test/CodeGen/X86/abdu-neg.ll
+++ b/llvm/test/CodeGen/X86/abdu-neg.ll
@@ -11,10 +11,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -23,10 +23,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %sil, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -44,22 +44,21 @@ define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i8_i16:
; X64: # %bb.0:
-; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movzwl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edi, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -77,10 +76,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -89,10 +88,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %sil, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -110,21 +109,22 @@ define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i16:
; X64: # %bb.0:
-; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movzwl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = zext i16 %a to i64
@@ -173,21 +173,22 @@ define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i16_undef:
; X64: # %bb.0:
-; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movzwl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = zext i16 %a to i64
@@ -506,10 +507,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -518,10 +519,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %sil, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -536,21 +537,22 @@ define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_minmax_i16:
; X64: # %bb.0:
-; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movzwl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%min = call i16 @llvm.umin.i16(i16 %a, i16 %b)
@@ -722,10 +724,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negb %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@@ -734,10 +736,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %sil, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: negb %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@@ -753,21 +755,22 @@ define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: negl %eax
-; X86-NEXT: cmovnsl %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_cmp_i16:
; X64: # %bb.0:
-; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movzwl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edi, %eax
; X64-NEXT: negl %eax
-; X64-NEXT: cmovnsl %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%cmp = icmp ult i16 %a, %b
diff --git a/llvm/test/CodeGen/X86/abdu.ll b/llvm/test/CodeGen/X86/abdu.ll
index 3bee81b61b98a3..335fa8c156f8e4 100644
--- a/llvm/test/CodeGen/X86/abdu.ll
+++ b/llvm/test/CodeGen/X86/abdu.ll
@@ -11,10 +11,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -22,10 +22,10 @@ define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %sil, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%aext = zext i8 %a to i64
@@ -41,21 +41,20 @@ define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
; X64-LABEL: abd_ext_i8_i16:
; X64: # %bb.0:
-; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: subl %esi, %edi
+; X64-NEXT: movzwl %si, %eax
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edi, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%aext = zext i8 %a to i64
@@ -71,10 +70,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -82,10 +81,10 @@ define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %sil, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%aext = zext i8 %a to i64
@@ -101,10 +100,10 @@ define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -112,10 +111,10 @@ define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = zext i16 %a to i64
@@ -160,10 +159,10 @@ define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -171,10 +170,10 @@ define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%aext = zext i16 %a to i64
@@ -443,10 +442,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -454,10 +453,10 @@ define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %sil, %eax
; X64-NEXT: movzbl %dil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%min = call i8 @llvm.umin.i8(i8 %a, i8 %b)
@@ -471,10 +470,10 @@ define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -482,10 +481,10 @@ define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%min = call i16 @llvm.umin.i16(i16 %a, i16 %b)
@@ -608,10 +607,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
;
@@ -619,10 +618,10 @@ define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: movzbl %sil, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
%cmp = icmp ugt i8 %a, %b
@@ -637,10 +636,10 @@ define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
; X86: # %bb.0:
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: subl %eax, %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: cmovsl %ecx, %eax
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: subl %eax, %edx
+; X86-NEXT: subl %ecx, %eax
+; X86-NEXT: cmovbl %edx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@@ -648,10 +647,10 @@ define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
; X64: # %bb.0:
; X64-NEXT: movzwl %si, %eax
; X64-NEXT: movzwl %di, %ecx
-; X64-NEXT: subl %eax, %ecx
-; X64-NEXT: movl %ecx, %eax
-; X64-NEXT: negl %eax
-; X64-NEXT: cmovsl %ecx, %eax
+; X64-NEXT: movl %ecx, %edx
+; X64-NEXT: subl %eax, %edx
+; X64-NEXT: subl %ecx, %eax
+; X64-NEXT: cmovbl %edx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%cmp = icmp uge i16 %a, %b
More information about the llvm-commits
mailing list