[X86] Canonicalize SGT/UGT compares with constants to use SGE/UGE to reduce the number of EFLAGs reads. (PR48760)

This demonstrates a possible fix for PR48760 - for compares with constants, canonicalize the SGT/UGT condition code to use SGE/UGE which should reduce the number of EFLAGs bits we need to read.

As discussed on PR48760, some EFLAG bits are treated independently which can require additional uops to merge together for certain CMOVcc/SETcc/etc. modes.

I've limited this to cases where the constant increment doesn't result in a larger encoding or additional i64 constant materializations.

Differential Revision: https://reviews.llvm.org/D101074
This commit is contained in:
Simon Pilgrim 2021-06-30 16:22:53 +01:00
parent c7b658aeb5
commit 59fa435ea6
26 changed files with 295 additions and 246 deletions

View File

@ -23469,6 +23469,33 @@ SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
}
if (Op0.getSimpleValueType().isInteger()) {
// Attempt to canonicalize SGT/UGT -> SGE/UGE compares with constant which
// reduces the number of EFLAGs bit reads (the GE conditions don't read ZF),
// this may translate to less uops depending on uarch implementation. The
// equivalent for SLE/ULE -> SLT/ULT isn't likely to happen as we already
// canonicalize to that CondCode.
// NOTE: Only do this if incrementing the constant doesn't increase the bit
// encoding size - so it must either already be a i8 or i32 immediate, or it
// shrinks down to that. We don't do this for any i64's to avoid additional
// constant materializations.
// TODO: Can we move this to TranslateX86CC to handle jumps/branches too?
if (auto *Op1C = dyn_cast<ConstantSDNode>(Op1)) {
const APInt &Op1Val = Op1C->getAPIntValue();
if (!Op1Val.isNullValue()) {
// Ensure the constant+1 doesn't overflow.
if ((CC == ISD::CondCode::SETGT && !Op1Val.isMaxSignedValue()) ||
(CC == ISD::CondCode::SETUGT && !Op1Val.isMaxValue())) {
APInt Op1ValPlusOne = Op1Val + 1;
if (Op1ValPlusOne.isSignedIntN(32) &&
(!Op1Val.isSignedIntN(8) || Op1ValPlusOne.isSignedIntN(8))) {
Op1 = DAG.getConstant(Op1ValPlusOne, dl, Op0.getValueType());
CC = CC == ISD::CondCode::SETGT ? ISD::CondCode::SETGE
: ISD::CondCode::SETUGE;
}
}
}
}
SDValue X86CC;
SDValue EFLAGS = emitFlagsForSetcc(Op0, Op1, CC, dl, DAG, X86CC);
SDValue Res = DAG.getNode(X86ISD::SETCC, dl, MVT::i8, X86CC, EFLAGS);
@ -42054,6 +42081,31 @@ static SDValue combineSetCCAtomicArith(SDValue Cmp, X86::CondCode &CC,
APInt Comparison = CmpRHSC->getAPIntValue();
APInt NegAddend = -Addend;
// See if we can adjust the CC to make the comparison match the negated
// addend.
if (Comparison != NegAddend) {
APInt IncComparison = Comparison + 1;
if (IncComparison == NegAddend) {
if (CC == X86::COND_A && !Comparison.isMaxValue()) {
Comparison = IncComparison;
CC = X86::COND_AE;
} else if (CC == X86::COND_LE && !Comparison.isMaxSignedValue()) {
Comparison = IncComparison;
CC = X86::COND_L;
}
}
APInt DecComparison = Comparison - 1;
if (DecComparison == NegAddend) {
if (CC == X86::COND_AE && !Comparison.isMinValue()) {
Comparison = DecComparison;
CC = X86::COND_A;
} else if (CC == X86::COND_L && !Comparison.isMinSignedValue()) {
Comparison = DecComparison;
CC = X86::COND_LE;
}
}
}
// If the addend is the negation of the comparison value, then we can do
// a full comparison by emitting the atomic arithmetic as a locked sub.
if (Comparison == NegAddend) {

View File

@ -13,8 +13,8 @@ define i32 @func_44(i16 signext %p_46) nounwind {
; SOURCE-SCHED-NEXT: movl g_5, %eax
; SOURCE-SCHED-NEXT: sarl %eax
; SOURCE-SCHED-NEXT: xorl %ecx, %ecx
; SOURCE-SCHED-NEXT: cmpl $1, %eax
; SOURCE-SCHED-NEXT: setg %cl
; SOURCE-SCHED-NEXT: cmpl $2, %eax
; SOURCE-SCHED-NEXT: setge %cl
; SOURCE-SCHED-NEXT: movb g_73, %dl
; SOURCE-SCHED-NEXT: xorl %eax, %eax
; SOURCE-SCHED-NEXT: subb {{[0-9]+}}(%esp), %al

View File

@ -55,7 +55,7 @@ define i32 @test_sub_1_cmov_sle(i64* %p, i32 %a0, i32 %a1) #0 {
; SLOWINCDEC-LABEL: test_sub_1_cmov_sle:
; SLOWINCDEC: # %bb.0: # %entry
; SLOWINCDEC-NEXT: movl %esi, %eax
; SLOWINCDEC-NEXT: lock addq $-1, (%rdi)
; SLOWINCDEC-NEXT: lock subq $1, (%rdi)
; SLOWINCDEC-NEXT: cmovgel %edx, %eax
; SLOWINCDEC-NEXT: retq
entry:
@ -298,16 +298,18 @@ entry:
ret i8 %tmp2
}
; FIXME: This test canonicalizes in a way that hides the fact that the
; comparison can be folded into the atomic subtract.
define i8 @test_sub_1_cmp_1_setcc_sle(i64* %p) #0 {
; CHECK-LABEL: test_sub_1_cmp_1_setcc_sle:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq $-1, %rax
; CHECK-NEXT: lock xaddq %rax, (%rdi)
; CHECK-NEXT: cmpq $2, %rax
; CHECK-NEXT: setl %al
; CHECK-NEXT: retq
; FASTINCDEC-LABEL: test_sub_1_cmp_1_setcc_sle:
; FASTINCDEC: # %bb.0: # %entry
; FASTINCDEC-NEXT: lock decq (%rdi)
; FASTINCDEC-NEXT: setle %al
; FASTINCDEC-NEXT: retq
;
; SLOWINCDEC-LABEL: test_sub_1_cmp_1_setcc_sle:
; SLOWINCDEC: # %bb.0: # %entry
; SLOWINCDEC-NEXT: lock subq $1, (%rdi)
; SLOWINCDEC-NEXT: setle %al
; SLOWINCDEC-NEXT: retq
entry:
%tmp0 = atomicrmw sub i64* %p, i64 1 seq_cst
%tmp1 = icmp sle i64 %tmp0, 1
@ -328,15 +330,11 @@ entry:
ret i8 %tmp2
}
; FIXME: This test canonicalizes in a way that hides the fact that the
; comparison can be folded into the atomic subtract.
define i8 @test_sub_3_cmp_3_setcc_uge(i64* %p) #0 {
; CHECK-LABEL: test_sub_3_cmp_3_setcc_uge:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq $-3, %rax
; CHECK-NEXT: lock xaddq %rax, (%rdi)
; CHECK-NEXT: cmpq $2, %rax
; CHECK-NEXT: seta %al
; CHECK-NEXT: lock subq $3, (%rdi)
; CHECK-NEXT: setae %al
; CHECK-NEXT: retq
entry:
%tmp0 = atomicrmw sub i64* %p, i64 3 seq_cst

View File

@ -159,8 +159,8 @@ define i32 @test5(i32* nocapture %P) nounwind readonly {
; CHECK-LABEL: test5:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: cmpl $41, (%rdi)
; CHECK-NEXT: setg %al
; CHECK-NEXT: cmpl $42, (%rdi)
; CHECK-NEXT: setge %al
; CHECK-NEXT: orl $-2, %eax
; CHECK-NEXT: retq
entry:
@ -202,9 +202,8 @@ define i64 @test8(i64 %0, i64 %1, i64 %2) {
; CHECK-LABEL: test8:
; CHECK: # %bb.0:
; CHECK-NEXT: movq %rsi, %rax
; CHECK-NEXT: movabsq $-2147483649, %rcx # imm = 0xFFFFFFFF7FFFFFFF
; CHECK-NEXT: cmpq %rcx, %rdi
; CHECK-NEXT: cmovleq %rdx, %rax
; CHECK-NEXT: cmpq $-2147483648, %rdi # imm = 0x80000000
; CHECK-NEXT: cmovlq %rdx, %rax
; CHECK-NEXT: retq
%4 = icmp sgt i64 %0, -2147483649
%5 = select i1 %4, i64 %1, i64 %2

View File

@ -465,16 +465,16 @@ define i1 @add_ugecmp_bad_i16_i8_add(i16 %x, i16 %y) nounwind {
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X86-NEXT: addw {{[0-9]+}}(%esp), %ax
; X86-NEXT: movzwl %ax, %eax
; X86-NEXT: cmpl $255, %eax
; X86-NEXT: seta %al
; X86-NEXT: cmpl $256, %eax # imm = 0x100
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: add_ugecmp_bad_i16_i8_add:
; X64: # %bb.0:
; X64-NEXT: addl %esi, %edi
; X64-NEXT: movzwl %di, %eax
; X64-NEXT: cmpl $255, %eax
; X64-NEXT: seta %al
; X64-NEXT: cmpl $256, %eax # imm = 0x100
; X64-NEXT: setae %al
; X64-NEXT: retq
%tmp0 = add i16 %x, %y
%tmp1 = icmp uge i16 %tmp0, 256 ; 1U << 8
@ -530,16 +530,16 @@ define i1 @add_ugecmp_bad_i16_i8_c0notpoweroftwo(i16 %x) nounwind {
; X86-NEXT: movl $192, %eax
; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movzwl %ax, %eax
; X86-NEXT: cmpl $255, %eax
; X86-NEXT: seta %al
; X86-NEXT: cmpl $256, %eax # imm = 0x100
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: add_ugecmp_bad_i16_i8_c0notpoweroftwo:
; X64: # %bb.0:
; X64-NEXT: addl $192, %edi
; X64-NEXT: movzwl %di, %eax
; X64-NEXT: cmpl $255, %eax
; X64-NEXT: seta %al
; X64-NEXT: cmpl $256, %eax # imm = 0x100
; X64-NEXT: setae %al
; X64-NEXT: retq
%tmp0 = add i16 %x, 192 ; (1U << (8-1)) + (1U << (8-1-1))
%tmp1 = icmp uge i16 %tmp0, 256 ; 1U << 8
@ -553,16 +553,16 @@ define i1 @add_ugecmp_bad_i16_i8_c1notpoweroftwo(i16 %x) nounwind {
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: subl $-128, %eax
; X86-NEXT: movzwl %ax, %eax
; X86-NEXT: cmpl $767, %eax # imm = 0x2FF
; X86-NEXT: seta %al
; X86-NEXT: cmpl $768, %eax # imm = 0x300
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: add_ugecmp_bad_i16_i8_c1notpoweroftwo:
; X64: # %bb.0:
; X64-NEXT: subl $-128, %edi
; X64-NEXT: movzwl %di, %eax
; X64-NEXT: cmpl $767, %eax # imm = 0x2FF
; X64-NEXT: seta %al
; X64-NEXT: cmpl $768, %eax # imm = 0x300
; X64-NEXT: setae %al
; X64-NEXT: retq
%tmp0 = add i16 %x, 128 ; 1U << (8-1)
%tmp1 = icmp uge i16 %tmp0, 768 ; (1U << 8)) + (1U << (8+1))
@ -576,16 +576,16 @@ define i1 @add_ugecmp_bad_i16_i8_magic(i16 %x) nounwind {
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: addl $64, %eax
; X86-NEXT: movzwl %ax, %eax
; X86-NEXT: cmpl $255, %eax
; X86-NEXT: seta %al
; X86-NEXT: cmpl $256, %eax # imm = 0x100
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: add_ugecmp_bad_i16_i8_magic:
; X64: # %bb.0:
; X64-NEXT: addl $64, %edi
; X64-NEXT: movzwl %di, %eax
; X64-NEXT: cmpl $255, %eax
; X64-NEXT: seta %al
; X64-NEXT: cmpl $256, %eax # imm = 0x100
; X64-NEXT: setae %al
; X64-NEXT: retq
%tmp0 = add i16 %x, 64 ; 1U << (8-1-1)
%tmp1 = icmp uge i16 %tmp0, 256 ; 1U << 8
@ -598,15 +598,15 @@ define i1 @add_ugecmp_bad_i16_i4(i16 %x) nounwind {
; X86: # %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: addl $8, %eax
; X86-NEXT: cmpw $15, %ax
; X86-NEXT: seta %al
; X86-NEXT: cmpw $16, %ax
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: add_ugecmp_bad_i16_i4:
; X64: # %bb.0:
; X64-NEXT: addl $8, %edi
; X64-NEXT: cmpw $15, %di
; X64-NEXT: seta %al
; X64-NEXT: cmpw $16, %di
; X64-NEXT: setae %al
; X64-NEXT: retq
%tmp0 = add i16 %x, 8 ; 1U << (4-1)
%tmp1 = icmp uge i16 %tmp0, 16 ; 1U << 4
@ -620,16 +620,16 @@ define i1 @add_ugecmp_bad_i24_i8(i24 %x) nounwind {
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: subl $-128, %eax
; X86-NEXT: andl $16777215, %eax # imm = 0xFFFFFF
; X86-NEXT: cmpl $255, %eax
; X86-NEXT: seta %al
; X86-NEXT: cmpl $256, %eax # imm = 0x100
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: add_ugecmp_bad_i24_i8:
; X64: # %bb.0:
; X64-NEXT: subl $-128, %edi
; X64-NEXT: andl $16777215, %edi # imm = 0xFFFFFF
; X64-NEXT: cmpl $255, %edi
; X64-NEXT: seta %al
; X64-NEXT: cmpl $256, %edi # imm = 0x100
; X64-NEXT: setae %al
; X64-NEXT: retq
%tmp0 = add i24 %x, 128 ; 1U << (8-1)
%tmp1 = icmp uge i24 %tmp0, 256 ; 1U << 8

View File

@ -13,10 +13,10 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
; X86-NEXT: .cfi_def_cfa_offset 8
; X86-NEXT: .cfi_offset %esi, -8
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
; X86-NEXT: cmpl $1, %edx
; X86-NEXT: cmpl $2, %edx
; X86-NEXT: movl $1, %eax
; X86-NEXT: movl $1, %esi
; X86-NEXT: jg .LBB0_2
; X86-NEXT: jge .LBB0_2
; X86-NEXT: # %bb.1:
; X86-NEXT: movl %edx, %esi
; X86-NEXT: .LBB0_2:
@ -188,10 +188,10 @@ define i32 @mult(i32, i32) local_unnamed_addr #0 {
; X64-HSW-LABEL: mult:
; X64-HSW: # %bb.0:
; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi
; X64-HSW-NEXT: cmpl $1, %esi
; X64-HSW-NEXT: cmpl $2, %esi
; X64-HSW-NEXT: movl $1, %ecx
; X64-HSW-NEXT: movl %esi, %eax
; X64-HSW-NEXT: cmovgl %ecx, %eax
; X64-HSW-NEXT: cmovgel %ecx, %eax
; X64-HSW-NEXT: testl %esi, %esi
; X64-HSW-NEXT: cmovel %ecx, %eax
; X64-HSW-NEXT: decl %edi

View File

@ -19,8 +19,8 @@ define void @foo(i32 %X, i32 %Y, i32 %Z) nounwind {
; JUMP1: # %bb.0: # %entry
; JUMP1-NEXT: cmpl $0, {{[0-9]+}}(%esp)
; JUMP1-NEXT: setne %al
; JUMP1-NEXT: cmpl $4, {{[0-9]+}}(%esp)
; JUMP1-NEXT: setg %cl
; JUMP1-NEXT: cmpl $5, {{[0-9]+}}(%esp)
; JUMP1-NEXT: setge %cl
; JUMP1-NEXT: testb %al, %cl
; JUMP1-NEXT: jne .LBB0_1
; JUMP1-NEXT: # %bb.2: # %cond_true
@ -49,8 +49,8 @@ define void @unpredictable(i32 %X, i32 %Y, i32 %Z) nounwind {
; JUMP2: # %bb.0: # %entry
; JUMP2-NEXT: cmpl $0, {{[0-9]+}}(%esp)
; JUMP2-NEXT: setne %al
; JUMP2-NEXT: cmpl $4, {{[0-9]+}}(%esp)
; JUMP2-NEXT: setg %cl
; JUMP2-NEXT: cmpl $5, {{[0-9]+}}(%esp)
; JUMP2-NEXT: setge %cl
; JUMP2-NEXT: testb %al, %cl
; JUMP2-NEXT: jne .LBB1_1
; JUMP2-NEXT: # %bb.2: # %cond_true
@ -62,8 +62,8 @@ define void @unpredictable(i32 %X, i32 %Y, i32 %Z) nounwind {
; JUMP1: # %bb.0: # %entry
; JUMP1-NEXT: cmpl $0, {{[0-9]+}}(%esp)
; JUMP1-NEXT: setne %al
; JUMP1-NEXT: cmpl $4, {{[0-9]+}}(%esp)
; JUMP1-NEXT: setg %cl
; JUMP1-NEXT: cmpl $5, {{[0-9]+}}(%esp)
; JUMP1-NEXT: setge %cl
; JUMP1-NEXT: testb %al, %cl
; JUMP1-NEXT: jne .LBB1_1
; JUMP1-NEXT: # %bb.2: # %cond_true

View File

@ -5,8 +5,8 @@ define <4 x i1> @selecter(i64 %0) {
; CHECK-LABEL: selecter:
; CHECK: # %bb.0:
; CHECK-NEXT: xor eax, eax
; CHECK-NEXT: cmp rdi, 1
; CHECK-NEXT: setg al
; CHECK-NEXT: cmp rdi, 2
; CHECK-NEXT: setge al
; CHECK-NEXT: lea eax, [rax + 2*rax]
; CHECK-NEXT: kmovd k0, eax
; CHECK-NEXT: vpmovm2d xmm0, k0

View File

@ -9,10 +9,10 @@ define void @atomic_maxmin_i8() {
; CHECK-NEXT: .p2align 4, 0x90
; CHECK-NEXT: .LBB0_1: # %atomicrmw.start
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
; CHECK-NEXT: cmpb $5, %al
; CHECK-NEXT: cmpb $6, %al
; CHECK-NEXT: movzbl %al, %eax
; CHECK-NEXT: movl $5, %ecx
; CHECK-NEXT: cmovgl %eax, %ecx
; CHECK-NEXT: cmovgel %eax, %ecx
; CHECK-NEXT: # kill: def $al killed $al killed $eax
; CHECK-NEXT: lock cmpxchgb %cl, sc8(%rip)
; CHECK-NEXT: jne .LBB0_1
@ -33,10 +33,10 @@ define void @atomic_maxmin_i8() {
; CHECK-NEXT: .p2align 4, 0x90
; CHECK-NEXT: .LBB0_5: # %atomicrmw.start8
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
; CHECK-NEXT: cmpb $7, %al
; CHECK-NEXT: cmpb $8, %al
; CHECK-NEXT: movzbl %al, %eax
; CHECK-NEXT: movl $7, %ecx
; CHECK-NEXT: cmoval %eax, %ecx
; CHECK-NEXT: cmovael %eax, %ecx
; CHECK-NEXT: # kill: def $al killed $al killed $eax
; CHECK-NEXT: lock cmpxchgb %cl, sc8(%rip)
; CHECK-NEXT: jne .LBB0_5

View File

@ -151,9 +151,9 @@ define signext i4 @func3(i4 signext %x, i4 signext %y) nounwind {
; X86-NEXT: cmpb $7, %al
; X86-NEXT: movl $7, %eax
; X86-NEXT: cmovll %ecx, %eax
; X86-NEXT: cmpb $-8, %al
; X86-NEXT: cmpb $-7, %al
; X86-NEXT: movl $248, %ecx
; X86-NEXT: cmovgl %eax, %ecx
; X86-NEXT: cmovgel %eax, %ecx
; X86-NEXT: movsbl %cl, %eax
; X86-NEXT: retl
;
@ -164,9 +164,9 @@ define signext i4 @func3(i4 signext %x, i4 signext %y) nounwind {
; X64-NEXT: cmpb $7, %al
; X64-NEXT: movl $7, %ecx
; X64-NEXT: cmovll %eax, %ecx
; X64-NEXT: cmpb $-8, %cl
; X64-NEXT: cmpb $-7, %cl
; X64-NEXT: movl $248, %eax
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: movsbl %al, %eax
; X64-NEXT: retq
%tmp = call i4 @llvm.sadd.sat.i4(i4 %x, i4 %y);

View File

@ -165,9 +165,9 @@ define signext i4 @func4(i4 signext %x, i4 signext %y, i4 signext %z) nounwind {
; X86-NEXT: cmpb $7, %al
; X86-NEXT: movl $7, %eax
; X86-NEXT: cmovll %ecx, %eax
; X86-NEXT: cmpb $-8, %al
; X86-NEXT: cmpb $-7, %al
; X86-NEXT: movl $248, %ecx
; X86-NEXT: cmovgl %eax, %ecx
; X86-NEXT: cmovgel %eax, %ecx
; X86-NEXT: movsbl %cl, %eax
; X86-NEXT: retl
;
@ -183,9 +183,9 @@ define signext i4 @func4(i4 signext %x, i4 signext %y, i4 signext %z) nounwind {
; X64-NEXT: cmpb $7, %al
; X64-NEXT: movl $7, %ecx
; X64-NEXT: cmovll %eax, %ecx
; X64-NEXT: cmpb $-8, %cl
; X64-NEXT: cmpb $-7, %cl
; X64-NEXT: movl $248, %eax
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: movsbl %al, %eax
; X64-NEXT: retq
%a = mul i4 %y, %z

View File

@ -33,9 +33,9 @@ define i16 @func(i16 %x, i16 %y) nounwind {
; X64-NEXT: cmpl $65535, %edi # imm = 0xFFFF
; X64-NEXT: movl $65535, %ecx # imm = 0xFFFF
; X64-NEXT: cmovll %edi, %ecx
; X64-NEXT: cmpl $-65536, %ecx # imm = 0xFFFF0000
; X64-NEXT: cmpl $-65535, %ecx # imm = 0xFFFF0001
; X64-NEXT: movl $-65536, %eax # imm = 0xFFFF0000
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: shrl %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
@ -64,9 +64,9 @@ define i16 @func(i16 %x, i16 %y) nounwind {
; X86-NEXT: cmpl $65535, %edi # imm = 0xFFFF
; X86-NEXT: movl $65535, %ecx # imm = 0xFFFF
; X86-NEXT: cmovll %edi, %ecx
; X86-NEXT: cmpl $-65536, %ecx # imm = 0xFFFF0000
; X86-NEXT: cmpl $-65535, %ecx # imm = 0xFFFF0001
; X86-NEXT: movl $-65536, %eax # imm = 0xFFFF0000
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: shrl %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: popl %esi
@ -103,9 +103,9 @@ define i16 @func2(i8 %x, i8 %y) nounwind {
; X64-NEXT: cmpl $16383, %edi # imm = 0x3FFF
; X64-NEXT: movl $16383, %ecx # imm = 0x3FFF
; X64-NEXT: cmovll %edi, %ecx
; X64-NEXT: cmpl $-16384, %ecx # imm = 0xC000
; X64-NEXT: cmpl $-16383, %ecx # imm = 0xC001
; X64-NEXT: movl $-16384, %eax # imm = 0xC000
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
;
@ -133,9 +133,9 @@ define i16 @func2(i8 %x, i8 %y) nounwind {
; X86-NEXT: cmpl $16383, %edi # imm = 0x3FFF
; X86-NEXT: movl $16383, %ecx # imm = 0x3FFF
; X86-NEXT: cmovll %edi, %ecx
; X86-NEXT: cmpl $-16384, %ecx # imm = 0xC000
; X86-NEXT: cmpl $-16383, %ecx # imm = 0xC001
; X86-NEXT: movl $-16384, %eax # imm = 0xC000
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
@ -175,9 +175,9 @@ define i16 @func3(i15 %x, i8 %y) nounwind {
; X64-NEXT: movl $16383, %ecx # imm = 0x3FFF
; X64-NEXT: cmovll %esi, %ecx
; X64-NEXT: movswl %cx, %eax
; X64-NEXT: cmpl $-16384, %eax # imm = 0xC000
; X64-NEXT: cmpl $-16383, %eax # imm = 0xC001
; X64-NEXT: movl $49152, %eax # imm = 0xC000
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
;
@ -210,9 +210,9 @@ define i16 @func3(i15 %x, i8 %y) nounwind {
; X86-NEXT: movl $16383, %ecx # imm = 0x3FFF
; X86-NEXT: cmovll %edi, %ecx
; X86-NEXT: movswl %cx, %eax
; X86-NEXT: cmpl $-16384, %eax # imm = 0xC000
; X86-NEXT: cmpl $-16383, %eax # imm = 0xC001
; X86-NEXT: movl $49152, %eax # imm = 0xC000
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
@ -253,9 +253,9 @@ define i4 @func4(i4 %x, i4 %y) nounwind {
; X64-NEXT: cmpb $7, %dil
; X64-NEXT: movl $7, %ecx
; X64-NEXT: cmovll %edi, %ecx
; X64-NEXT: cmpb $-8, %cl
; X64-NEXT: cmpb $-7, %cl
; X64-NEXT: movl $248, %eax
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: popq %rbx
; X64-NEXT: retq
@ -288,9 +288,9 @@ define i4 @func4(i4 %x, i4 %y) nounwind {
; X86-NEXT: cmpb $7, %al
; X86-NEXT: movl $7, %ecx
; X86-NEXT: cmovll %eax, %ecx
; X86-NEXT: cmpb $-8, %cl
; X86-NEXT: cmpb $-7, %cl
; X86-NEXT: movl $248, %eax
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: popl %esi
; X86-NEXT: retl
@ -351,8 +351,8 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X64-NEXT: cmovgq %rcx, %rbx
; X64-NEXT: testq %rbp, %rbp
; X64-NEXT: cmovnsq %rbp, %rcx
; X64-NEXT: cmpq $-2, %rbp
; X64-NEXT: cmovleq %rax, %rbx
; X64-NEXT: cmpq $-1, %rbp
; X64-NEXT: cmovlq %rax, %rbx
; X64-NEXT: shrdq $1, %rcx, %rbx
; X64-NEXT: movq %rbx, %rax
; X64-NEXT: addq $24, %rsp
@ -473,9 +473,9 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
; X86-NEXT: cmovnel %eax, %esi
; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
; X86-NEXT: cmpl $-2147483648, %edx # imm = 0x80000000
; X86-NEXT: cmpl $-2147483647, %edx # imm = 0x80000001
; X86-NEXT: movl $-2147483648, %eax # imm = 0x80000000
; X86-NEXT: cmoval %edx, %eax
; X86-NEXT: cmovael %edx, %eax
; X86-NEXT: movl %edx, %ecx
; X86-NEXT: sarl $31, %ecx
; X86-NEXT: andl %esi, %ecx
@ -523,9 +523,9 @@ define i18 @func6(i16 %x, i16 %y) nounwind {
; X64-NEXT: cmpl $131071, %edi # imm = 0x1FFFF
; X64-NEXT: movl $131071, %ecx # imm = 0x1FFFF
; X64-NEXT: cmovll %edi, %ecx
; X64-NEXT: cmpl $-131072, %ecx # imm = 0xFFFE0000
; X64-NEXT: cmpl $-131071, %ecx # imm = 0xFFFE0001
; X64-NEXT: movl $-131072, %eax # imm = 0xFFFE0000
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: retq
;
; X86-LABEL: func6:
@ -552,9 +552,9 @@ define i18 @func6(i16 %x, i16 %y) nounwind {
; X86-NEXT: cmpl $131071, %edi # imm = 0x1FFFF
; X86-NEXT: movl $131071, %ecx # imm = 0x1FFFF
; X86-NEXT: cmovll %edi, %ecx
; X86-NEXT: cmpl $-131072, %ecx # imm = 0xFFFE0000
; X86-NEXT: cmpl $-131071, %ecx # imm = 0xFFFE0001
; X86-NEXT: movl $-131072, %eax # imm = 0xFFFE0000
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
; X86-NEXT: popl %ebx

View File

@ -1202,9 +1202,9 @@ define void @clamp_i8(i32 %src, i8* %dst) {
define void @clamp(i32 %src, i16* %dst) {
; GENERIC-LABEL: clamp:
; GENERIC: ## %bb.0:
; GENERIC-NEXT: cmpl $32767, %edi ## imm = 0x7FFF
; GENERIC-NEXT: cmpl $32768, %edi ## imm = 0x8000
; GENERIC-NEXT: movl $32767, %eax ## imm = 0x7FFF
; GENERIC-NEXT: cmovlel %edi, %eax
; GENERIC-NEXT: cmovll %edi, %eax
; GENERIC-NEXT: cmpl $-32768, %eax ## imm = 0x8000
; GENERIC-NEXT: movl $32768, %ecx ## imm = 0x8000
; GENERIC-NEXT: cmovgel %eax, %ecx
@ -1213,10 +1213,10 @@ define void @clamp(i32 %src, i16* %dst) {
;
; ATOM-LABEL: clamp:
; ATOM: ## %bb.0:
; ATOM-NEXT: cmpl $32767, %edi ## imm = 0x7FFF
; ATOM-NEXT: cmpl $32768, %edi ## imm = 0x8000
; ATOM-NEXT: movl $32767, %eax ## imm = 0x7FFF
; ATOM-NEXT: movl $32768, %ecx ## imm = 0x8000
; ATOM-NEXT: cmovlel %edi, %eax
; ATOM-NEXT: cmovll %edi, %eax
; ATOM-NEXT: cmpl $-32768, %eax ## imm = 0x8000
; ATOM-NEXT: cmovgel %eax, %ecx
; ATOM-NEXT: movw %cx, (%rsi)
@ -1226,9 +1226,9 @@ define void @clamp(i32 %src, i16* %dst) {
; ATHLON: ## %bb.0:
; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %eax
; ATHLON-NEXT: movl {{[0-9]+}}(%esp), %ecx
; ATHLON-NEXT: cmpl $32767, %ecx ## imm = 0x7FFF
; ATHLON-NEXT: cmpl $32768, %ecx ## imm = 0x8000
; ATHLON-NEXT: movl $32767, %edx ## imm = 0x7FFF
; ATHLON-NEXT: cmovlel %ecx, %edx
; ATHLON-NEXT: cmovll %ecx, %edx
; ATHLON-NEXT: cmpl $-32768, %edx ## imm = 0x8000
; ATHLON-NEXT: movl $32768, %ecx ## imm = 0x8000
; ATHLON-NEXT: cmovgel %edx, %ecx
@ -1237,9 +1237,9 @@ define void @clamp(i32 %src, i16* %dst) {
;
; MCU-LABEL: clamp:
; MCU: # %bb.0:
; MCU-NEXT: cmpl $32767, %eax # imm = 0x7FFF
; MCU-NEXT: cmpl $32768, %eax # imm = 0x8000
; MCU-NEXT: movl $32767, %ecx # imm = 0x7FFF
; MCU-NEXT: jg .LBB22_2
; MCU-NEXT: jge .LBB22_2
; MCU-NEXT: # %bb.1:
; MCU-NEXT: movl %eax, %ecx
; MCU-NEXT: .LBB22_2:

View File

@ -267,8 +267,8 @@ define i64 @sel_1_2(i64 %x, i64 %y) {
define i8 @sel_1_neg1(i32 %x) {
; CHECK-LABEL: sel_1_neg1:
; CHECK: # %bb.0:
; CHECK-NEXT: cmpl $42, %edi
; CHECK-NEXT: setg %al
; CHECK-NEXT: cmpl $43, %edi
; CHECK-NEXT: setge %al
; CHECK-NEXT: shlb $2, %al
; CHECK-NEXT: decb %al
; CHECK-NEXT: retq
@ -299,8 +299,8 @@ define i32 @sel_1_neg1_32(i32 %x) {
; CHECK-LABEL: sel_1_neg1_32:
; CHECK: # %bb.0:
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: cmpl $42, %edi
; CHECK-NEXT: setg %al
; CHECK-NEXT: cmpl $43, %edi
; CHECK-NEXT: setge %al
; CHECK-NEXT: leal -1(%rax,%rax,8), %eax
; CHECK-NEXT: retq
%cmp = icmp sgt i32 %x, 42
@ -378,10 +378,10 @@ define i64 @select_pow2_diff_neg_invert(i1 zeroext %cond) {
define i8 @sel_67_neg125(i32 %x) {
; CHECK-LABEL: sel_67_neg125:
; CHECK: # %bb.0:
; CHECK-NEXT: cmpl $42, %edi
; CHECK-NEXT: cmpl $43, %edi
; CHECK-NEXT: movl $67, %ecx
; CHECK-NEXT: movl $131, %eax
; CHECK-NEXT: cmovgl %ecx, %eax
; CHECK-NEXT: cmovgel %ecx, %eax
; CHECK-NEXT: # kill: def $al killed $al killed $eax
; CHECK-NEXT: retq
%cmp = icmp sgt i32 %x, 42

View File

@ -456,8 +456,8 @@ define zeroext i1 @ne_neg1_and_ne_zero(i64 %x) nounwind {
; CHECK-LABEL: ne_neg1_and_ne_zero:
; CHECK: # %bb.0:
; CHECK-NEXT: incq %rdi
; CHECK-NEXT: cmpq $1, %rdi
; CHECK-NEXT: seta %al
; CHECK-NEXT: cmpq $2, %rdi
; CHECK-NEXT: setae %al
; CHECK-NEXT: retq
%cmp1 = icmp ne i64 %x, -1
%cmp2 = icmp ne i64 %x, 0

View File

@ -6,8 +6,8 @@ define zeroext i16 @t1(i16 zeroext %x) nounwind readnone ssp {
; CHECK-LABEL: t1:
; CHECK: ## %bb.0:
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: cmpw $26, %di
; CHECK-NEXT: seta %al
; CHECK-NEXT: cmpw $27, %di
; CHECK-NEXT: setae %al
; CHECK-NEXT: shll $5, %eax
; CHECK-NEXT: retq
%t0 = icmp ugt i16 %x, 26

View File

@ -16,9 +16,9 @@ define i32 @func(i32 %x, i32 %y) nounwind {
; X64-NEXT: movq %rcx, %rax
; X64-NEXT: shrq $32, %rax
; X64-NEXT: shrdl $2, %eax, %ecx
; X64-NEXT: cmpl $1, %eax
; X64-NEXT: cmpl $2, %eax
; X64-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF
; X64-NEXT: cmovlel %ecx, %edx
; X64-NEXT: cmovll %ecx, %edx
; X64-NEXT: cmpl $-2, %eax
; X64-NEXT: movl $-2147483648, %eax # imm = 0x80000000
; X64-NEXT: cmovgel %edx, %eax
@ -29,9 +29,9 @@ define i32 @func(i32 %x, i32 %y) nounwind {
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: imull {{[0-9]+}}(%esp)
; X86-NEXT: shrdl $2, %edx, %eax
; X86-NEXT: cmpl $1, %edx
; X86-NEXT: cmpl $2, %edx
; X86-NEXT: movl $2147483647, %ecx # imm = 0x7FFFFFFF
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: cmpl $-2, %edx
; X86-NEXT: movl $-2147483648, %ecx # imm = 0x80000000
; X86-NEXT: cmovll %ecx, %eax
@ -46,9 +46,9 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
; X64-NEXT: movq %rdi, %rax
; X64-NEXT: imulq %rsi
; X64-NEXT: shrdq $2, %rdx, %rax
; X64-NEXT: cmpq $1, %rdx
; X64-NEXT: cmpq $2, %rdx
; X64-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
; X64-NEXT: cmovgq %rcx, %rax
; X64-NEXT: cmovgeq %rcx, %rax
; X64-NEXT: cmpq $-2, %rdx
; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
; X64-NEXT: cmovlq %rcx, %rax
@ -100,8 +100,8 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
; X86-NEXT: testl %esi, %esi
; X86-NEXT: setg %bl
; X86-NEXT: sete %bh
; X86-NEXT: cmpl $1, %ebp
; X86-NEXT: seta %dl
; X86-NEXT: cmpl $2, %ebp
; X86-NEXT: setae %dl
; X86-NEXT: andb %bh, %dl
; X86-NEXT: orb %bl, %dl
; X86-NEXT: shrdl $2, %eax, %ecx
@ -148,9 +148,9 @@ define i4 @func3(i4 %x, i4 %y) nounwind {
; X64-NEXT: shlb $6, %dl
; X64-NEXT: orb %al, %dl
; X64-NEXT: movzbl %dl, %eax
; X64-NEXT: cmpb $1, %cl
; X64-NEXT: cmpb $2, %cl
; X64-NEXT: movl $127, %edx
; X64-NEXT: cmovlel %eax, %edx
; X64-NEXT: cmovll %eax, %edx
; X64-NEXT: cmpb $-2, %cl
; X64-NEXT: movl $128, %eax
; X64-NEXT: cmovgel %edx, %eax
@ -173,9 +173,9 @@ define i4 @func3(i4 %x, i4 %y) nounwind {
; X86-NEXT: shrb $2, %al
; X86-NEXT: orb %cl, %al
; X86-NEXT: movzbl %al, %ecx
; X86-NEXT: cmpb $1, %ah
; X86-NEXT: cmpb $2, %ah
; X86-NEXT: movl $127, %edx
; X86-NEXT: cmovlel %ecx, %edx
; X86-NEXT: cmovll %ecx, %edx
; X86-NEXT: cmpb $-2, %ah
; X86-NEXT: movl $128, %eax
; X86-NEXT: cmovgel %edx, %eax
@ -199,9 +199,9 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: shrq $32, %rcx
; X64-NEXT: shrdl $2, %ecx, %edx
; X64-NEXT: cmpl $1, %ecx
; X64-NEXT: cmpl $2, %ecx
; X64-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF
; X64-NEXT: cmovgl %eax, %edx
; X64-NEXT: cmovgel %eax, %edx
; X64-NEXT: cmpl $-2, %ecx
; X64-NEXT: movl $-2147483648, %ecx # imm = 0x80000000
; X64-NEXT: cmovll %ecx, %edx
@ -216,8 +216,8 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rsi, %rdx
; X64-NEXT: shrq $32, %rdx
; X64-NEXT: shrdl $2, %edx, %esi
; X64-NEXT: cmpl $1, %edx
; X64-NEXT: cmovgl %eax, %esi
; X64-NEXT: cmpl $2, %edx
; X64-NEXT: cmovgel %eax, %esi
; X64-NEXT: cmpl $-2, %edx
; X64-NEXT: cmovll %ecx, %esi
; X64-NEXT: movd %esi, %xmm3
@ -230,8 +230,8 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rsi, %rdx
; X64-NEXT: shrq $32, %rdx
; X64-NEXT: shrdl $2, %edx, %esi
; X64-NEXT: cmpl $1, %edx
; X64-NEXT: cmovgl %eax, %esi
; X64-NEXT: cmpl $2, %edx
; X64-NEXT: cmovgel %eax, %esi
; X64-NEXT: cmpl $-2, %edx
; X64-NEXT: cmovll %ecx, %esi
; X64-NEXT: movd %esi, %xmm2
@ -245,8 +245,8 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rsi, %rdx
; X64-NEXT: shrq $32, %rdx
; X64-NEXT: shrdl $2, %edx, %esi
; X64-NEXT: cmpl $1, %edx
; X64-NEXT: cmovgl %eax, %esi
; X64-NEXT: cmpl $2, %edx
; X64-NEXT: cmovgel %eax, %esi
; X64-NEXT: cmpl $-2, %edx
; X64-NEXT: cmovll %ecx, %esi
; X64-NEXT: movd %esi, %xmm0
@ -267,9 +267,9 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X86-NEXT: imull {{[0-9]+}}(%esp)
; X86-NEXT: movl %eax, %ecx
; X86-NEXT: shrdl $2, %edx, %ecx
; X86-NEXT: cmpl $1, %edx
; X86-NEXT: cmpl $2, %edx
; X86-NEXT: movl $2147483647, %ebp # imm = 0x7FFFFFFF
; X86-NEXT: cmovgl %ebp, %ecx
; X86-NEXT: cmovgel %ebp, %ecx
; X86-NEXT: cmpl $-2, %edx
; X86-NEXT: movl $-2147483648, %esi # imm = 0x80000000
; X86-NEXT: cmovll %esi, %ecx
@ -277,23 +277,23 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X86-NEXT: imull {{[0-9]+}}(%esp)
; X86-NEXT: movl %eax, %edi
; X86-NEXT: shrdl $2, %edx, %edi
; X86-NEXT: cmpl $1, %edx
; X86-NEXT: cmovgl %ebp, %edi
; X86-NEXT: cmpl $2, %edx
; X86-NEXT: cmovgel %ebp, %edi
; X86-NEXT: cmpl $-2, %edx
; X86-NEXT: cmovll %esi, %edi
; X86-NEXT: movl %ebx, %eax
; X86-NEXT: imull {{[0-9]+}}(%esp)
; X86-NEXT: movl %eax, %ebx
; X86-NEXT: shrdl $2, %edx, %ebx
; X86-NEXT: cmpl $1, %edx
; X86-NEXT: cmovgl %ebp, %ebx
; X86-NEXT: cmpl $2, %edx
; X86-NEXT: cmovgel %ebp, %ebx
; X86-NEXT: cmpl $-2, %edx
; X86-NEXT: cmovll %esi, %ebx
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: imull {{[0-9]+}}(%esp)
; X86-NEXT: shrdl $2, %edx, %eax
; X86-NEXT: cmpl $1, %edx
; X86-NEXT: cmovgl %ebp, %eax
; X86-NEXT: cmpl $2, %edx
; X86-NEXT: cmovgel %ebp, %eax
; X86-NEXT: cmpl $-2, %edx
; X86-NEXT: cmovll %esi, %eax
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
@ -713,11 +713,11 @@ define i64 @func8(i64 %x, i64 %y) nounwind {
; X86-NEXT: cmovnsl %ecx, %edx
; X86-NEXT: shrdl $31, %edx, %eax
; X86-NEXT: shrdl $31, %edi, %edx
; X86-NEXT: cmpl $1073741823, %edi # imm = 0x3FFFFFFF
; X86-NEXT: cmpl $1073741824, %edi # imm = 0x40000000
; X86-NEXT: movl $2147483647, %ecx # imm = 0x7FFFFFFF
; X86-NEXT: cmovgl %ecx, %edx
; X86-NEXT: cmovgel %ecx, %edx
; X86-NEXT: movl $-1, %ecx
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: xorl %ecx, %ecx
; X86-NEXT: cmpl $-1073741824, %edi # imm = 0xC0000000
; X86-NEXT: cmovll %ecx, %eax

View File

@ -15,10 +15,10 @@ define i64 @func() nounwind {
; X64-NEXT: movl $2, %ecx
; X64-NEXT: movl $3, %eax
; X64-NEXT: imulq %rcx
; X64-NEXT: cmpq $1, %rdx
; X64-NEXT: cmpq $2, %rdx
; X64-NEXT: movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF
; X64-NEXT: movl $1, %ecx
; X64-NEXT: cmovgq %rax, %rcx
; X64-NEXT: cmovgeq %rax, %rcx
; X64-NEXT: cmpq $-2, %rdx
; X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
; X64-NEXT: cmovgeq %rcx, %rax
@ -51,9 +51,9 @@ define i64 @func3() nounwind {
; X64-NEXT: movl $2, %edx
; X64-NEXT: movq %rcx, %rax
; X64-NEXT: imulq %rdx
; X64-NEXT: cmpq $1, %rdx
; X64-NEXT: cmpq $2, %rdx
; X64-NEXT: movabsq $4611686018427387903, %rsi # imm = 0x3FFFFFFFFFFFFFFF
; X64-NEXT: cmovgq %rcx, %rsi
; X64-NEXT: cmovgeq %rcx, %rsi
; X64-NEXT: cmpq $-2, %rdx
; X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
; X64-NEXT: cmovgeq %rsi, %rax

View File

@ -116,8 +116,8 @@ define i16 @test_srem_even(i16 %X) nounwind {
; X86-NEXT: rorw %ax
; X86-NEXT: movzwl %ax, %ecx
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $4680, %ecx # imm = 0x1248
; X86-NEXT: seta %al
; X86-NEXT: cmpl $4681, %ecx # imm = 0x1249
; X86-NEXT: setae %al
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@ -128,8 +128,8 @@ define i16 @test_srem_even(i16 %X) nounwind {
; X64-NEXT: rorw %ax
; X64-NEXT: movzwl %ax, %ecx
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $4680, %ecx # imm = 0x1248
; X64-NEXT: seta %al
; X64-NEXT: cmpl $4681, %ecx # imm = 0x1249
; X64-NEXT: setae %al
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%srem = srem i16 %X, 14
@ -229,8 +229,8 @@ define i32 @test_srem_odd_setne(i32 %X) nounwind {
; X86-NEXT: imull $-858993459, {{[0-9]+}}(%esp), %ecx # imm = 0xCCCCCCCD
; X86-NEXT: addl $429496729, %ecx # imm = 0x19999999
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $858993458, %ecx # imm = 0x33333332
; X86-NEXT: seta %al
; X86-NEXT: cmpl $858993459, %ecx # imm = 0x33333333
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_srem_odd_setne:
@ -238,8 +238,8 @@ define i32 @test_srem_odd_setne(i32 %X) nounwind {
; X64-NEXT: imull $-858993459, %edi, %ecx # imm = 0xCCCCCCCD
; X64-NEXT: addl $429496729, %ecx # imm = 0x19999999
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $858993458, %ecx # imm = 0x33333332
; X64-NEXT: seta %al
; X64-NEXT: cmpl $858993459, %ecx # imm = 0x33333333
; X64-NEXT: setae %al
; X64-NEXT: retq
%srem = srem i32 %X, 5
%cmp = icmp ne i32 %srem, 0
@ -254,8 +254,8 @@ define i32 @test_srem_negative_odd(i32 %X) nounwind {
; X86-NEXT: imull $-858993459, {{[0-9]+}}(%esp), %ecx # imm = 0xCCCCCCCD
; X86-NEXT: addl $429496729, %ecx # imm = 0x19999999
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $858993458, %ecx # imm = 0x33333332
; X86-NEXT: seta %al
; X86-NEXT: cmpl $858993459, %ecx # imm = 0x33333333
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_srem_negative_odd:
@ -263,8 +263,8 @@ define i32 @test_srem_negative_odd(i32 %X) nounwind {
; X64-NEXT: imull $-858993459, %edi, %ecx # imm = 0xCCCCCCCD
; X64-NEXT: addl $429496729, %ecx # imm = 0x19999999
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $858993458, %ecx # imm = 0x33333332
; X64-NEXT: seta %al
; X64-NEXT: cmpl $858993459, %ecx # imm = 0x33333333
; X64-NEXT: setae %al
; X64-NEXT: retq
%srem = srem i32 %X, -5
%cmp = icmp ne i32 %srem, 0
@ -278,8 +278,8 @@ define i32 @test_srem_negative_even(i32 %X) nounwind {
; X86-NEXT: addl $306783378, %ecx # imm = 0x12492492
; X86-NEXT: rorl %ecx
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $306783378, %ecx # imm = 0x12492492
; X86-NEXT: seta %al
; X86-NEXT: cmpl $306783379, %ecx # imm = 0x12492493
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_srem_negative_even:
@ -288,8 +288,8 @@ define i32 @test_srem_negative_even(i32 %X) nounwind {
; X64-NEXT: addl $306783378, %ecx # imm = 0x12492492
; X64-NEXT: rorl %ecx
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $306783378, %ecx # imm = 0x12492492
; X64-NEXT: seta %al
; X64-NEXT: cmpl $306783379, %ecx # imm = 0x12492493
; X64-NEXT: setae %al
; X64-NEXT: retq
%srem = srem i32 %X, -14
%cmp = icmp ne i32 %srem, 0

View File

@ -140,9 +140,9 @@ define signext i4 @func3(i4 signext %x, i4 signext %y) nounwind {
; X86-NEXT: cmpb $7, %al
; X86-NEXT: movl $7, %eax
; X86-NEXT: cmovll %ecx, %eax
; X86-NEXT: cmpb $-8, %al
; X86-NEXT: cmpb $-7, %al
; X86-NEXT: movl $248, %ecx
; X86-NEXT: cmovgl %eax, %ecx
; X86-NEXT: cmovgel %eax, %ecx
; X86-NEXT: movsbl %cl, %eax
; X86-NEXT: retl
;
@ -153,9 +153,9 @@ define signext i4 @func3(i4 signext %x, i4 signext %y) nounwind {
; X64-NEXT: cmpb $7, %al
; X64-NEXT: movl $7, %ecx
; X64-NEXT: cmovll %eax, %ecx
; X64-NEXT: cmpb $-8, %cl
; X64-NEXT: cmpb $-7, %cl
; X64-NEXT: movl $248, %eax
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: movsbl %al, %eax
; X64-NEXT: retq
%tmp = call i4 @llvm.ssub.sat.i4(i4 %x, i4 %y)

View File

@ -155,9 +155,9 @@ define signext i4 @func4(i4 signext %x, i4 signext %y, i4 signext %z) nounwind {
; X86-NEXT: cmpb $7, %cl
; X86-NEXT: movl $7, %ecx
; X86-NEXT: cmovll %eax, %ecx
; X86-NEXT: cmpb $-8, %cl
; X86-NEXT: cmpb $-7, %cl
; X86-NEXT: movl $248, %eax
; X86-NEXT: cmovgl %ecx, %eax
; X86-NEXT: cmovgel %ecx, %eax
; X86-NEXT: movsbl %al, %eax
; X86-NEXT: retl
;
@ -173,9 +173,9 @@ define signext i4 @func4(i4 signext %x, i4 signext %y, i4 signext %z) nounwind {
; X64-NEXT: cmpb $7, %al
; X64-NEXT: movl $7, %ecx
; X64-NEXT: cmovll %eax, %ecx
; X64-NEXT: cmpb $-8, %cl
; X64-NEXT: cmpb $-7, %cl
; X64-NEXT: movl $248, %eax
; X64-NEXT: cmovgl %ecx, %eax
; X64-NEXT: cmovgel %ecx, %eax
; X64-NEXT: movsbl %al, %eax
; X64-NEXT: retq
%a = mul i4 %y, %z

View File

@ -16,9 +16,9 @@ define i32 @func(i32 %x, i32 %y) nounwind {
; X64-NEXT: movq %rcx, %rax
; X64-NEXT: shrq $32, %rax
; X64-NEXT: shrdl $2, %eax, %ecx
; X64-NEXT: cmpl $3, %eax
; X64-NEXT: cmpl $4, %eax
; X64-NEXT: movl $-1, %eax
; X64-NEXT: cmovbel %ecx, %eax
; X64-NEXT: cmovbl %ecx, %eax
; X64-NEXT: retq
;
; X86-LABEL: func:
@ -26,9 +26,9 @@ define i32 @func(i32 %x, i32 %y) nounwind {
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: shrdl $2, %edx, %eax
; X86-NEXT: cmpl $3, %edx
; X86-NEXT: cmpl $4, %edx
; X86-NEXT: movl $-1, %ecx
; X86-NEXT: cmoval %ecx, %eax
; X86-NEXT: cmovael %ecx, %eax
; X86-NEXT: retl
%tmp = call i32 @llvm.umul.fix.sat.i32(i32 %x, i32 %y, i32 2)
ret i32 %tmp
@ -40,9 +40,9 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
; X64-NEXT: movq %rdi, %rax
; X64-NEXT: mulq %rsi
; X64-NEXT: shrdq $2, %rdx, %rax
; X64-NEXT: cmpq $3, %rdx
; X64-NEXT: cmpq $4, %rdx
; X64-NEXT: movq $-1, %rcx
; X64-NEXT: cmovaq %rcx, %rax
; X64-NEXT: cmovaeq %rcx, %rax
; X64-NEXT: retq
;
; X86-LABEL: func2:
@ -105,9 +105,9 @@ define i4 @func3(i4 %x, i4 %y) nounwind {
; X64-NEXT: shlb $6, %dl
; X64-NEXT: orb %cl, %dl
; X64-NEXT: movzbl %dl, %ecx
; X64-NEXT: cmpb $3, %al
; X64-NEXT: cmpb $4, %al
; X64-NEXT: movl $255, %eax
; X64-NEXT: cmovbel %ecx, %eax
; X64-NEXT: cmovbl %ecx, %eax
; X64-NEXT: shrb $4, %al
; X64-NEXT: # kill: def $al killed $al killed $eax
; X64-NEXT: retq
@ -126,9 +126,9 @@ define i4 @func3(i4 %x, i4 %y) nounwind {
; X86-NEXT: shrb $2, %al
; X86-NEXT: orb %cl, %al
; X86-NEXT: movzbl %al, %ecx
; X86-NEXT: cmpb $3, %ah
; X86-NEXT: cmpb $4, %ah
; X86-NEXT: movl $255, %eax
; X86-NEXT: cmovbel %ecx, %eax
; X86-NEXT: cmovbl %ecx, %eax
; X86-NEXT: shrb $4, %al
; X86-NEXT: # kill: def $al killed $al killed $eax
; X86-NEXT: retl
@ -147,9 +147,9 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rcx, %rax
; X64-NEXT: shrq $32, %rax
; X64-NEXT: shrdl $2, %eax, %ecx
; X64-NEXT: cmpl $3, %eax
; X64-NEXT: cmpl $4, %eax
; X64-NEXT: movl $-1, %eax
; X64-NEXT: cmoval %eax, %ecx
; X64-NEXT: cmovael %eax, %ecx
; X64-NEXT: movd %ecx, %xmm2
; X64-NEXT: pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]
; X64-NEXT: movd %xmm3, %ecx
@ -159,8 +159,8 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: shrq $32, %rcx
; X64-NEXT: shrdl $2, %ecx, %edx
; X64-NEXT: cmpl $3, %ecx
; X64-NEXT: cmoval %eax, %edx
; X64-NEXT: cmpl $4, %ecx
; X64-NEXT: cmovael %eax, %edx
; X64-NEXT: movd %edx, %xmm3
; X64-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
; X64-NEXT: movd %xmm1, %ecx
@ -169,8 +169,8 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: shrq $32, %rcx
; X64-NEXT: shrdl $2, %ecx, %edx
; X64-NEXT: cmpl $3, %ecx
; X64-NEXT: cmoval %eax, %edx
; X64-NEXT: cmpl $4, %ecx
; X64-NEXT: cmovael %eax, %edx
; X64-NEXT: movd %edx, %xmm2
; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
; X64-NEXT: movd %xmm1, %ecx
@ -180,8 +180,8 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: shrq $32, %rcx
; X64-NEXT: shrdl $2, %ecx, %edx
; X64-NEXT: cmpl $3, %ecx
; X64-NEXT: cmoval %eax, %edx
; X64-NEXT: cmpl $4, %ecx
; X64-NEXT: cmovael %eax, %edx
; X64-NEXT: movd %edx, %xmm0
; X64-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
; X64-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
@ -201,26 +201,26 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: movl %eax, %esi
; X86-NEXT: shrdl $2, %edx, %esi
; X86-NEXT: cmpl $3, %edx
; X86-NEXT: cmpl $4, %edx
; X86-NEXT: movl $-1, %ecx
; X86-NEXT: cmoval %ecx, %esi
; X86-NEXT: cmovael %ecx, %esi
; X86-NEXT: movl %ebp, %eax
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: movl %eax, %ebp
; X86-NEXT: shrdl $2, %edx, %ebp
; X86-NEXT: cmpl $3, %edx
; X86-NEXT: cmoval %ecx, %ebp
; X86-NEXT: cmpl $4, %edx
; X86-NEXT: cmovael %ecx, %ebp
; X86-NEXT: movl %ebx, %eax
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: movl %eax, %ebx
; X86-NEXT: shrdl $2, %edx, %ebx
; X86-NEXT: cmpl $3, %edx
; X86-NEXT: cmoval %ecx, %ebx
; X86-NEXT: cmpl $4, %edx
; X86-NEXT: cmovael %ecx, %ebx
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: mull {{[0-9]+}}(%esp)
; X86-NEXT: shrdl $2, %edx, %eax
; X86-NEXT: cmpl $3, %edx
; X86-NEXT: cmoval %ecx, %eax
; X86-NEXT: cmpl $4, %edx
; X86-NEXT: cmovael %ecx, %eax
; X86-NEXT: movl %eax, 12(%edi)
; X86-NEXT: movl %ebx, 8(%edi)
; X86-NEXT: movl %ebp, 4(%edi)

View File

@ -66,8 +66,8 @@ define i1 @test_urem_odd_setne(i4 %X) nounwind {
; X86-NEXT: leal (%eax,%eax,2), %ecx
; X86-NEXT: leal (%eax,%ecx,4), %eax
; X86-NEXT: andb $15, %al
; X86-NEXT: cmpb $3, %al
; X86-NEXT: seta %al
; X86-NEXT: cmpb $4, %al
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_odd_setne:
@ -76,8 +76,8 @@ define i1 @test_urem_odd_setne(i4 %X) nounwind {
; X64-NEXT: leal (%rdi,%rdi,2), %eax
; X64-NEXT: leal (%rdi,%rax,4), %eax
; X64-NEXT: andb $15, %al
; X64-NEXT: cmpb $3, %al
; X64-NEXT: seta %al
; X64-NEXT: cmpb $4, %al
; X64-NEXT: setae %al
; X64-NEXT: retq
%urem = urem i4 %X, 5
%cmp = icmp ne i4 %urem, 0
@ -89,16 +89,16 @@ define i1 @test_urem_negative_odd(i9 %X) nounwind {
; X86: # %bb.0:
; X86-NEXT: imull $307, {{[0-9]+}}(%esp), %eax # imm = 0x133
; X86-NEXT: andl $511, %eax # imm = 0x1FF
; X86-NEXT: cmpw $1, %ax
; X86-NEXT: seta %al
; X86-NEXT: cmpw $2, %ax
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_negative_odd:
; X64: # %bb.0:
; X64-NEXT: imull $307, %edi, %eax # imm = 0x133
; X64-NEXT: andl $511, %eax # imm = 0x1FF
; X64-NEXT: cmpw $1, %ax
; X64-NEXT: seta %al
; X64-NEXT: cmpw $2, %ax
; X64-NEXT: setae %al
; X64-NEXT: retq
%urem = urem i9 %X, -5
%cmp = icmp ne i9 %urem, 0
@ -115,18 +115,18 @@ define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
; X86-NEXT: shrl %eax
; X86-NEXT: orl %ecx, %eax
; X86-NEXT: andl $2047, %eax # imm = 0x7FF
; X86-NEXT: cmpl $341, %eax # imm = 0x155
; X86-NEXT: seta %al
; X86-NEXT: cmpl $342, %eax # imm = 0x156
; X86-NEXT: setae %al
; X86-NEXT: imull $1463, {{[0-9]+}}(%esp), %ecx # imm = 0x5B7
; X86-NEXT: addl $-1463, %ecx # imm = 0xFA49
; X86-NEXT: andl $2047, %ecx # imm = 0x7FF
; X86-NEXT: cmpl $292, %ecx # imm = 0x124
; X86-NEXT: seta %dl
; X86-NEXT: cmpl $293, %ecx # imm = 0x125
; X86-NEXT: setae %dl
; X86-NEXT: imull $819, {{[0-9]+}}(%esp), %ecx # imm = 0x333
; X86-NEXT: addl $-1638, %ecx # imm = 0xF99A
; X86-NEXT: andl $2047, %ecx # imm = 0x7FF
; X86-NEXT: cmpw $1, %cx
; X86-NEXT: seta %cl
; X86-NEXT: cmpw $2, %cx
; X86-NEXT: setae %cl
; X86-NEXT: retl
;
; SSE2-LABEL: test_urem_vec:

View File

@ -107,8 +107,8 @@ define i16 @test_urem_even(i16 %X) nounwind {
; X86-NEXT: rorw %ax
; X86-NEXT: movzwl %ax, %ecx
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $4681, %ecx # imm = 0x1249
; X86-NEXT: seta %al
; X86-NEXT: cmpl $4682, %ecx # imm = 0x124A
; X86-NEXT: setae %al
; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
@ -118,8 +118,8 @@ define i16 @test_urem_even(i16 %X) nounwind {
; X64-NEXT: rorw %ax
; X64-NEXT: movzwl %ax, %ecx
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $4681, %ecx # imm = 0x1249
; X64-NEXT: seta %al
; X64-NEXT: cmpl $4682, %ecx # imm = 0x124A
; X64-NEXT: setae %al
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
%urem = urem i16 %X, 14
@ -212,16 +212,16 @@ define i32 @test_urem_odd_setne(i32 %X) nounwind {
; X86: # %bb.0:
; X86-NEXT: imull $-858993459, {{[0-9]+}}(%esp), %ecx # imm = 0xCCCCCCCD
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $858993459, %ecx # imm = 0x33333333
; X86-NEXT: seta %al
; X86-NEXT: cmpl $858993460, %ecx # imm = 0x33333334
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_odd_setne:
; X64: # %bb.0:
; X64-NEXT: imull $-858993459, %edi, %ecx # imm = 0xCCCCCCCD
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $858993459, %ecx # imm = 0x33333333
; X64-NEXT: seta %al
; X64-NEXT: cmpl $858993460, %ecx # imm = 0x33333334
; X64-NEXT: setae %al
; X64-NEXT: retq
%urem = urem i32 %X, 5
%cmp = icmp ne i32 %urem, 0
@ -235,16 +235,16 @@ define i32 @test_urem_negative_odd(i32 %X) nounwind {
; X86: # %bb.0:
; X86-NEXT: imull $858993459, {{[0-9]+}}(%esp), %ecx # imm = 0x33333333
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $1, %ecx
; X86-NEXT: seta %al
; X86-NEXT: cmpl $2, %ecx
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_negative_odd:
; X64: # %bb.0:
; X64-NEXT: imull $858993459, %edi, %ecx # imm = 0x33333333
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $1, %ecx
; X64-NEXT: seta %al
; X64-NEXT: cmpl $2, %ecx
; X64-NEXT: setae %al
; X64-NEXT: retq
%urem = urem i32 %X, -5
%cmp = icmp ne i32 %urem, 0
@ -257,8 +257,8 @@ define i32 @test_urem_negative_even(i32 %X) nounwind {
; X86-NEXT: imull $-920350135, {{[0-9]+}}(%esp), %ecx # imm = 0xC9249249
; X86-NEXT: rorl %ecx
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: cmpl $1, %ecx
; X86-NEXT: seta %al
; X86-NEXT: cmpl $2, %ecx
; X86-NEXT: setae %al
; X86-NEXT: retl
;
; X64-LABEL: test_urem_negative_even:
@ -266,8 +266,8 @@ define i32 @test_urem_negative_even(i32 %X) nounwind {
; X64-NEXT: imull $-920350135, %edi, %ecx # imm = 0xC9249249
; X64-NEXT: rorl %ecx
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: cmpl $1, %ecx
; X64-NEXT: seta %al
; X64-NEXT: cmpl $2, %ecx
; X64-NEXT: setae %al
; X64-NEXT: retq
%urem = urem i32 %X, -14
%cmp = icmp ne i32 %urem, 0

View File

@ -50,9 +50,9 @@ define <4 x i16> @smulfixsat(<4 x i16> %a) {
; CHECK-NEXT: shrl $16, %edx
; CHECK-NEXT: shldw $1, %cx, %dx
; CHECK-NEXT: sarl $16, %ecx
; CHECK-NEXT: cmpl $16383, %ecx # imm = 0x3FFF
; CHECK-NEXT: cmpl $16384, %ecx # imm = 0x4000
; CHECK-NEXT: movl $32767, %r8d # imm = 0x7FFF
; CHECK-NEXT: cmovgl %r8d, %edx
; CHECK-NEXT: cmovgel %r8d, %edx
; CHECK-NEXT: cmpl $-16384, %ecx # imm = 0xC000
; CHECK-NEXT: movl $32768, %ecx # imm = 0x8000
; CHECK-NEXT: cmovll %ecx, %edx
@ -63,8 +63,8 @@ define <4 x i16> @smulfixsat(<4 x i16> %a) {
; CHECK-NEXT: leal (%rdi,%rdi), %esi
; CHECK-NEXT: shrdw $15, %ax, %si
; CHECK-NEXT: sarl $15, %edi
; CHECK-NEXT: cmpl $16383, %edi # imm = 0x3FFF
; CHECK-NEXT: cmovgl %r8d, %esi
; CHECK-NEXT: cmpl $16384, %edi # imm = 0x4000
; CHECK-NEXT: cmovgel %r8d, %esi
; CHECK-NEXT: cmpl $-16384, %edi # imm = 0xC000
; CHECK-NEXT: cmovll %ecx, %esi
; CHECK-NEXT: movd %xmm0, %eax
@ -73,8 +73,8 @@ define <4 x i16> @smulfixsat(<4 x i16> %a) {
; CHECK-NEXT: shrl $16, %edi
; CHECK-NEXT: shldw $1, %ax, %di
; CHECK-NEXT: sarl $16, %eax
; CHECK-NEXT: cmpl $16383, %eax # imm = 0x3FFF
; CHECK-NEXT: cmovgl %r8d, %edi
; CHECK-NEXT: cmpl $16384, %eax # imm = 0x4000
; CHECK-NEXT: cmovgel %r8d, %edi
; CHECK-NEXT: cmpl $-16384, %eax # imm = 0xC000
; CHECK-NEXT: cmovll %ecx, %edi
; CHECK-NEXT: movzwl %di, %eax
@ -88,8 +88,8 @@ define <4 x i16> @smulfixsat(<4 x i16> %a) {
; CHECK-NEXT: leal (,%rax,4), %esi
; CHECK-NEXT: shrdw $15, %dx, %si
; CHECK-NEXT: sarl $14, %eax
; CHECK-NEXT: cmpl $16383, %eax # imm = 0x3FFF
; CHECK-NEXT: cmovgl %r8d, %esi
; CHECK-NEXT: cmpl $16384, %eax # imm = 0x4000
; CHECK-NEXT: cmovgel %r8d, %esi
; CHECK-NEXT: cmpl $-16384, %eax # imm = 0xC000
; CHECK-NEXT: cmovll %ecx, %esi
; CHECK-NEXT: pinsrw $3, %esi, %xmm1
@ -109,23 +109,23 @@ define <4 x i16> @umulfixsat(<4 x i16> %a) {
; CHECK-NEXT: shrl $16, %edx
; CHECK-NEXT: movl %edx, %ecx
; CHECK-NEXT: shldw $1, %ax, %cx
; CHECK-NEXT: cmpl $32767, %edx # imm = 0x7FFF
; CHECK-NEXT: cmpl $32768, %edx # imm = 0x8000
; CHECK-NEXT: movl $65535, %eax # imm = 0xFFFF
; CHECK-NEXT: cmoval %eax, %ecx
; CHECK-NEXT: cmovael %eax, %ecx
; CHECK-NEXT: pextrw $1, %xmm0, %edx
; CHECK-NEXT: addl %edx, %edx
; CHECK-NEXT: movl %edx, %esi
; CHECK-NEXT: shrl $16, %esi
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: shldw $1, %dx, %di
; CHECK-NEXT: cmpl $32767, %esi # imm = 0x7FFF
; CHECK-NEXT: cmoval %eax, %edi
; CHECK-NEXT: cmpl $32768, %esi # imm = 0x8000
; CHECK-NEXT: cmovael %eax, %edi
; CHECK-NEXT: movd %xmm0, %edx
; CHECK-NEXT: xorl %esi, %esi
; CHECK-NEXT: shldw $1, %dx, %si
; CHECK-NEXT: movl $32767, %edx # imm = 0x7FFF
; CHECK-NEXT: movl $32768, %edx # imm = 0x8000
; CHECK-NEXT: negl %edx
; CHECK-NEXT: cmoval %eax, %esi
; CHECK-NEXT: cmovael %eax, %esi
; CHECK-NEXT: movzwl %si, %edx
; CHECK-NEXT: movd %edx, %xmm1
; CHECK-NEXT: pinsrw $1, %edi, %xmm1
@ -136,8 +136,8 @@ define <4 x i16> @umulfixsat(<4 x i16> %a) {
; CHECK-NEXT: shrl $16, %edx
; CHECK-NEXT: movl %edx, %esi
; CHECK-NEXT: shldw $1, %cx, %si
; CHECK-NEXT: cmpl $32767, %edx # imm = 0x7FFF
; CHECK-NEXT: cmoval %eax, %esi
; CHECK-NEXT: cmpl $32768, %edx # imm = 0x8000
; CHECK-NEXT: cmovael %eax, %esi
; CHECK-NEXT: pinsrw $3, %esi, %xmm1
; CHECK-NEXT: movdqa %xmm1, %xmm0
; CHECK-NEXT: retq

View File

@ -23,10 +23,10 @@ define void @func([40 x i16]* %a, i32* %b, i16** %c, i64* %d) nounwind {
; CHECK-NEXT: cmpl $-8608074, %eax # imm = 0xFF7CA6B6
; CHECK-NEXT: movslq %eax, %rdi
; CHECK-NEXT: setl %dl
; CHECK-NEXT: cmpl $2138875573, %eax # imm = 0x7F7CA6B5
; CHECK-NEXT: cmpl $2138875574, %eax # imm = 0x7F7CA6B6
; CHECK-NEXT: movq %rdi, %r8
; CHECK-NEXT: leal -1(%rdx,%rdx), %edx
; CHECK-NEXT: cmovlel %edx, %esi
; CHECK-NEXT: cmovll %edx, %esi
; CHECK-NEXT: subq %rax, %r8
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: cmpl $1, %esi