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
}
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);
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) {
; 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
; 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:
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
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
; 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:
; 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
; 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
; 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
; 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))
; 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
; 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
; 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
; 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:
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
;
; 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);
; 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
;
; 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
; 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
; 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
; 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
;
; 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
; 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
;
; 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
; 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
; 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
; 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
; 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
; 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:
; 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
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
;
; 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)
; 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
;
; 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:
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
; 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
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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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
;
; 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
; 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:
; 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
; 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:
; 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
; 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:
; 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
; 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
;
; 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)
; 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
;
; 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
; 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:
; 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
; 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:
; 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
; 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
; 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
; 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
; 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
; 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]
; 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)
; 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:
; 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
; 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
; 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:
; 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
;
; 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
; 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
; 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
; 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:
; 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
; 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
; 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
; 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
; 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
; 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
; 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
; 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