diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -24698,6 +24698,8 @@ // (select (x != 0), -1, y) -> ~(sign_bit (x - 1)) | y // (select (and (x , 0x1) == 0), y, (z ^ y) ) -> (-(and (x , 0x1)) & z ) ^ y // (select (and (x , 0x1) == 0), y, (z | y) ) -> (-(and (x , 0x1)) & z ) | y + // (select (x > 0), x, 0) -> (~(x << (size_in_bits(x)-1))) & x + // (select (x < 0), x, 0) -> ((x << (size_in_bits(x)-1))) & x if (Cond.getOpcode() == X86ISD::SETCC && Cond.getOperand(1).getOpcode() == X86ISD::CMP && isNullConstant(Cond.getOperand(1).getOperand(1))) { @@ -24778,6 +24780,21 @@ SDValue And = DAG.getNode(ISD::AND, DL, VT, Mask, Src1); // Mask & z return DAG.getNode(Op2.getOpcode(), DL, VT, And, Src2); // And Op y } + } else if ((VT == MVT::i32 || VT == MVT::i64) && isNullConstant(Op2) && + (CmpOp0 == Op1) && ((CondCode == X86::COND_S) || // smin(x, 0) + (CondCode == X86::COND_G && hasAndNot(Op1)))) { // smax(x, 0) + // (select (x < 0), x, 0) -> ((x << (size_in_bits(x)-1))) & x + // + // If the comparison is testing for a positive value, we have to invert + // the sign bit mask, so only do that transform if the target has a + // bitwise 'and not' instruction (the invert is free). + // (select (x > 0), x, 0) -> (~(x << (size_in_bits(x)-1))) & x + unsigned ShCt = VT.getSizeInBits() - 1; + SDValue ShiftAmt = DAG.getConstant(ShCt, DL, VT); + SDValue Shift = DAG.getNode(ISD::SRA, DL, VT, Op1, ShiftAmt); + if (CondCode == X86::COND_G) + Shift = DAG.getNOT(DL, Shift, VT); + return DAG.getNode(ISD::AND, DL, VT, Shift, Op1); } } diff --git a/llvm/test/CodeGen/X86/fpclamptosat_vec.ll b/llvm/test/CodeGen/X86/fpclamptosat_vec.ll --- a/llvm/test/CodeGen/X86/fpclamptosat_vec.ll +++ b/llvm/test/CodeGen/X86/fpclamptosat_vec.ll @@ -2974,33 +2974,36 @@ ; CHECK-NEXT: cmpq %rcx, %rax ; CHECK-NEXT: movq %rcx, %rsi ; CHECK-NEXT: cmovbq %rax, %rsi -; CHECK-NEXT: xorl %edi, %edi ; CHECK-NEXT: testq %rdx, %rdx ; CHECK-NEXT: cmovnsq %rcx, %rax ; CHECK-NEXT: cmoveq %rsi, %rax -; CHECK-NEXT: cmovnsq %rdi, %rdx ; CHECK-NEXT: cmpq %rcx, %rbx ; CHECK-NEXT: movq %rcx, %rsi ; CHECK-NEXT: cmovbq %rbx, %rsi ; CHECK-NEXT: testq %r14, %r14 ; CHECK-NEXT: cmovsq %rbx, %rcx ; CHECK-NEXT: cmoveq %rsi, %rcx -; CHECK-NEXT: cmovsq %r14, %rdi -; CHECK-NEXT: testq %rdi, %rdi +; CHECK-NEXT: movq %rdx, %rsi +; CHECK-NEXT: sarq $63, %rsi +; CHECK-NEXT: andq %rdx, %rsi +; CHECK-NEXT: movq %r14, %rdx +; CHECK-NEXT: sarq $63, %rdx +; CHECK-NEXT: andq %r14, %rdx ; CHECK-NEXT: movabsq $-9223372036854775808, %rbx # imm = 0x8000000000000000 -; CHECK-NEXT: movq %rbx, %rsi -; CHECK-NEXT: cmovnsq %rcx, %rsi ; CHECK-NEXT: cmpq %rbx, %rcx -; CHECK-NEXT: cmovbeq %rbx, %rcx -; CHECK-NEXT: cmpq $-1, %rdi -; CHECK-NEXT: cmovneq %rsi, %rcx +; CHECK-NEXT: movq %rbx, %rdi +; CHECK-NEXT: cmovaq %rcx, %rdi ; CHECK-NEXT: testq %rdx, %rdx -; CHECK-NEXT: movq %rbx, %rsi -; CHECK-NEXT: cmovnsq %rax, %rsi -; CHECK-NEXT: cmpq %rbx, %rax -; CHECK-NEXT: cmovbeq %rbx, %rax +; CHECK-NEXT: cmovsq %rbx, %rcx ; CHECK-NEXT: cmpq $-1, %rdx -; CHECK-NEXT: cmovneq %rsi, %rax +; CHECK-NEXT: cmoveq %rdi, %rcx +; CHECK-NEXT: cmpq %rbx, %rax +; CHECK-NEXT: movq %rbx, %rdx +; CHECK-NEXT: cmovaq %rax, %rdx +; CHECK-NEXT: testq %rsi, %rsi +; CHECK-NEXT: cmovsq %rbx, %rax +; CHECK-NEXT: cmpq $-1, %rsi +; CHECK-NEXT: cmoveq %rdx, %rax ; CHECK-NEXT: movq %rax, %xmm0 ; CHECK-NEXT: movq %rcx, %xmm1 ; CHECK-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] @@ -3138,33 +3141,36 @@ ; CHECK-NEXT: cmpq %rcx, %rax ; CHECK-NEXT: movq %rcx, %rsi ; CHECK-NEXT: cmovbq %rax, %rsi -; CHECK-NEXT: xorl %edi, %edi ; CHECK-NEXT: testq %rdx, %rdx ; CHECK-NEXT: cmovnsq %rcx, %rax ; CHECK-NEXT: cmoveq %rsi, %rax -; CHECK-NEXT: cmovnsq %rdi, %rdx ; CHECK-NEXT: cmpq %rcx, %rbx ; CHECK-NEXT: movq %rcx, %rsi ; CHECK-NEXT: cmovbq %rbx, %rsi ; CHECK-NEXT: testq %r14, %r14 ; CHECK-NEXT: cmovsq %rbx, %rcx ; CHECK-NEXT: cmoveq %rsi, %rcx -; CHECK-NEXT: cmovsq %r14, %rdi -; CHECK-NEXT: testq %rdi, %rdi +; CHECK-NEXT: movq %rdx, %rsi +; CHECK-NEXT: sarq $63, %rsi +; CHECK-NEXT: andq %rdx, %rsi +; CHECK-NEXT: movq %r14, %rdx +; CHECK-NEXT: sarq $63, %rdx +; CHECK-NEXT: andq %r14, %rdx ; CHECK-NEXT: movabsq $-9223372036854775808, %rbx # imm = 0x8000000000000000 -; CHECK-NEXT: movq %rbx, %rsi -; CHECK-NEXT: cmovnsq %rcx, %rsi ; CHECK-NEXT: cmpq %rbx, %rcx -; CHECK-NEXT: cmovbeq %rbx, %rcx -; CHECK-NEXT: cmpq $-1, %rdi -; CHECK-NEXT: cmovneq %rsi, %rcx +; CHECK-NEXT: movq %rbx, %rdi +; CHECK-NEXT: cmovaq %rcx, %rdi ; CHECK-NEXT: testq %rdx, %rdx -; CHECK-NEXT: movq %rbx, %rsi -; CHECK-NEXT: cmovnsq %rax, %rsi -; CHECK-NEXT: cmpq %rbx, %rax -; CHECK-NEXT: cmovbeq %rbx, %rax +; CHECK-NEXT: cmovsq %rbx, %rcx ; CHECK-NEXT: cmpq $-1, %rdx -; CHECK-NEXT: cmovneq %rsi, %rax +; CHECK-NEXT: cmoveq %rdi, %rcx +; CHECK-NEXT: cmpq %rbx, %rax +; CHECK-NEXT: movq %rbx, %rdx +; CHECK-NEXT: cmovaq %rax, %rdx +; CHECK-NEXT: testq %rsi, %rsi +; CHECK-NEXT: cmovsq %rbx, %rax +; CHECK-NEXT: cmpq $-1, %rsi +; CHECK-NEXT: cmoveq %rdx, %rax ; CHECK-NEXT: movq %rax, %xmm0 ; CHECK-NEXT: movq %rcx, %xmm1 ; CHECK-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] @@ -3292,46 +3298,49 @@ ; CHECK-NEXT: .cfi_offset %rbx, -32 ; CHECK-NEXT: .cfi_offset %r14, -24 ; CHECK-NEXT: .cfi_offset %rbp, -16 -; CHECK-NEXT: movl %esi, %ebp +; CHECK-NEXT: movl %esi, %r14d ; CHECK-NEXT: movzwl %di, %edi ; CHECK-NEXT: callq __gnu_h2f_ieee@PLT ; CHECK-NEXT: callq __fixsfti@PLT -; CHECK-NEXT: movq %rax, %rbx -; CHECK-NEXT: movq %rdx, %r14 -; CHECK-NEXT: movzwl %bp, %edi +; CHECK-NEXT: movq %rax, %rbp +; CHECK-NEXT: movq %rdx, %rbx +; CHECK-NEXT: movzwl %r14w, %edi ; CHECK-NEXT: callq __gnu_h2f_ieee@PLT ; CHECK-NEXT: callq __fixsfti@PLT ; CHECK-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF ; CHECK-NEXT: cmpq %rcx, %rax ; CHECK-NEXT: movq %rcx, %rsi ; CHECK-NEXT: cmovbq %rax, %rsi -; CHECK-NEXT: xorl %edi, %edi ; CHECK-NEXT: testq %rdx, %rdx ; CHECK-NEXT: cmovnsq %rcx, %rax ; CHECK-NEXT: cmoveq %rsi, %rax -; CHECK-NEXT: cmovnsq %rdi, %rdx -; CHECK-NEXT: cmpq %rcx, %rbx +; CHECK-NEXT: cmpq %rcx, %rbp ; CHECK-NEXT: movq %rcx, %rsi -; CHECK-NEXT: cmovbq %rbx, %rsi -; CHECK-NEXT: testq %r14, %r14 -; CHECK-NEXT: cmovsq %rbx, %rcx +; CHECK-NEXT: cmovbq %rbp, %rsi +; CHECK-NEXT: testq %rbx, %rbx +; CHECK-NEXT: cmovsq %rbp, %rcx ; CHECK-NEXT: cmoveq %rsi, %rcx -; CHECK-NEXT: cmovsq %r14, %rdi -; CHECK-NEXT: testq %rdi, %rdi +; CHECK-NEXT: movq %rdx, %rsi +; CHECK-NEXT: sarq $63, %rsi +; CHECK-NEXT: andq %rdx, %rsi +; CHECK-NEXT: movq %rbx, %rdx +; CHECK-NEXT: sarq $63, %rdx +; CHECK-NEXT: andq %rbx, %rdx ; CHECK-NEXT: movabsq $-9223372036854775808, %rbp # imm = 0x8000000000000000 -; CHECK-NEXT: movq %rbp, %rsi -; CHECK-NEXT: cmovnsq %rcx, %rsi ; CHECK-NEXT: cmpq %rbp, %rcx -; CHECK-NEXT: cmovbeq %rbp, %rcx -; CHECK-NEXT: cmpq $-1, %rdi -; CHECK-NEXT: cmovneq %rsi, %rcx +; CHECK-NEXT: movq %rbp, %rdi +; CHECK-NEXT: cmovaq %rcx, %rdi ; CHECK-NEXT: testq %rdx, %rdx -; CHECK-NEXT: movq %rbp, %rsi -; CHECK-NEXT: cmovnsq %rax, %rsi -; CHECK-NEXT: cmpq %rbp, %rax -; CHECK-NEXT: cmovbeq %rbp, %rax +; CHECK-NEXT: cmovsq %rbp, %rcx ; CHECK-NEXT: cmpq $-1, %rdx -; CHECK-NEXT: cmovneq %rsi, %rax +; CHECK-NEXT: cmoveq %rdi, %rcx +; CHECK-NEXT: cmpq %rbp, %rax +; CHECK-NEXT: movq %rbp, %rdx +; CHECK-NEXT: cmovaq %rax, %rdx +; CHECK-NEXT: testq %rsi, %rsi +; CHECK-NEXT: cmovsq %rbp, %rax +; CHECK-NEXT: cmpq $-1, %rsi +; CHECK-NEXT: cmoveq %rdx, %rax ; CHECK-NEXT: movq %rax, %xmm1 ; CHECK-NEXT: movq %rcx, %xmm0 ; CHECK-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] diff --git a/llvm/test/CodeGen/X86/sdiv_fix_sat.ll b/llvm/test/CodeGen/X86/sdiv_fix_sat.ll --- a/llvm/test/CodeGen/X86/sdiv_fix_sat.ll +++ b/llvm/test/CodeGen/X86/sdiv_fix_sat.ll @@ -315,48 +315,49 @@ ; X64-NEXT: movq %rsi, (%rsp) # 8-byte Spill ; X64-NEXT: movq %rdi, %r15 ; X64-NEXT: leaq (%rdi,%rdi), %rax -; X64-NEXT: movq %rdi, %r12 -; X64-NEXT: sarq $63, %r12 -; X64-NEXT: shldq $31, %rax, %r12 +; X64-NEXT: movq %rdi, %rbx +; X64-NEXT: sarq $63, %rbx +; X64-NEXT: shldq $31, %rax, %rbx ; X64-NEXT: shlq $32, %r15 -; X64-NEXT: movq %rsi, %r13 -; X64-NEXT: sarq $63, %r13 +; X64-NEXT: movq %rsi, %r12 +; X64-NEXT: sarq $63, %r12 ; X64-NEXT: movq %r15, %rdi -; X64-NEXT: movq %r12, %rsi -; X64-NEXT: movq %r13, %rcx +; X64-NEXT: movq %rbx, %rsi +; X64-NEXT: movq %r12, %rcx ; X64-NEXT: callq __divti3@PLT -; X64-NEXT: movq %rax, %rbx +; X64-NEXT: movq %rax, %r13 ; X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; X64-NEXT: movq %rdx, %rbp ; X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; X64-NEXT: subq $1, %rbx +; X64-NEXT: subq $1, %r13 ; X64-NEXT: sbbq $0, %rbp -; X64-NEXT: testq %r12, %r12 +; X64-NEXT: testq %rbx, %rbx ; X64-NEXT: sets %al -; X64-NEXT: testq %r13, %r13 +; X64-NEXT: testq %r12, %r12 ; X64-NEXT: sets %r14b ; X64-NEXT: xorb %al, %r14b ; X64-NEXT: movq %r15, %rdi -; X64-NEXT: movq %r12, %rsi +; X64-NEXT: movq %rbx, %rsi ; X64-NEXT: movq (%rsp), %rdx # 8-byte Reload -; X64-NEXT: movq %r13, %rcx +; X64-NEXT: movq %r12, %rcx ; X64-NEXT: callq __modti3@PLT ; X64-NEXT: orq %rax, %rdx ; X64-NEXT: setne %al ; X64-NEXT: testb %r14b, %al ; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload -; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: testq %rbp, %rbp -; X64-NEXT: cmovnsq %rax, %rbp -; X64-NEXT: movq $-1, %rcx -; X64-NEXT: cmovgq %rcx, %rbx +; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload +; X64-NEXT: movq %rbp, %rcx +; X64-NEXT: sarq $63, %rcx +; X64-NEXT: andq %rbp, %rcx +; X64-NEXT: movq $-1, %rax +; X64-NEXT: movq $-1, %rdx +; X64-NEXT: cmovnsq %rcx, %rdx ; X64-NEXT: testq %rbp, %rbp -; X64-NEXT: cmovnsq %rbp, %rcx -; X64-NEXT: cmpq $-1, %rbp -; X64-NEXT: cmovlq %rax, %rbx -; X64-NEXT: shrdq $1, %rcx, %rbx -; X64-NEXT: movq %rbx, %rax +; X64-NEXT: cmovgq %rax, %r13 +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: cmpq $-1, %rcx +; X64-NEXT: cmovgeq %r13, %rax +; X64-NEXT: shrdq $1, %rdx, %rax ; X64-NEXT: addq $24, %rsp ; X64-NEXT: popq %rbx ; X64-NEXT: popq %r12 @@ -374,123 +375,119 @@ ; X86-NEXT: pushl %edi ; X86-NEXT: pushl %esi ; X86-NEXT: andl $-8, %esp -; X86-NEXT: subl $88, %esp +; X86-NEXT: subl $56, %esp ; X86-NEXT: movl 8(%ebp), %ecx -; X86-NEXT: movl 12(%ebp), %eax -; X86-NEXT: movl 20(%ebp), %edi -; X86-NEXT: sarl $31, %edi -; X86-NEXT: movl %eax, %ebx -; X86-NEXT: sarl $31, %ebx -; X86-NEXT: movl %ebx, %edx -; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: shldl $31, %eax, %edx -; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: shldl $31, %ecx, %eax -; X86-NEXT: movl %eax, %esi +; X86-NEXT: movl 12(%ebp), %ebx +; X86-NEXT: movl 20(%ebp), %edx +; X86-NEXT: movl %edx, %esi +; X86-NEXT: sarl $31, %esi +; X86-NEXT: movl %ebx, %eax +; X86-NEXT: sarl $31, %eax +; X86-NEXT: movl %eax, %edi ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: shldl $31, %ebx, %edi +; X86-NEXT: shldl $31, %ecx, %ebx ; X86-NEXT: shll $31, %ecx ; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: pushl %edi -; X86-NEXT: pushl %edi -; X86-NEXT: pushl 20(%ebp) +; X86-NEXT: pushl %esi +; X86-NEXT: pushl %esi +; X86-NEXT: pushl %edx ; X86-NEXT: pushl 16(%ebp) +; X86-NEXT: pushl %eax +; X86-NEXT: pushl %edi ; X86-NEXT: pushl %ebx -; X86-NEXT: pushl %edx -; X86-NEXT: pushl %esi ; X86-NEXT: pushl %ecx +; X86-NEXT: leal {{[0-9]+}}(%esp), %eax ; X86-NEXT: pushl %eax -; X86-NEXT: calll __divti3 +; X86-NEXT: calll __modti3 ; X86-NEXT: addl $32, %esp -; X86-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %esi -; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: subl $1, %esi -; X86-NEXT: movl %ecx, %eax -; X86-NEXT: sbbl $0, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl %edx, %eax -; X86-NEXT: sbbl $0, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx -; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: sbbl $0, %ebx -; X86-NEXT: testl %edi, %edi +; X86-NEXT: testl %esi, %esi ; X86-NEXT: sets %al -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: testl %ecx, %ecx -; X86-NEXT: sets %dl -; X86-NEXT: xorb %al, %dl -; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT: testl %edx, %edx +; X86-NEXT: sets %cl +; X86-NEXT: xorb %al, %cl +; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT: orl {{[0-9]+}}(%esp), %ecx +; X86-NEXT: orl {{[0-9]+}}(%esp), %eax +; X86-NEXT: orl %ecx, %eax ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: pushl %edi -; X86-NEXT: pushl %edi +; X86-NEXT: setne (%esp) # 1-byte Folded Spill +; X86-NEXT: pushl %esi +; X86-NEXT: pushl %esi ; X86-NEXT: pushl 20(%ebp) ; X86-NEXT: pushl 16(%ebp) -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT: pushl %edx +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %ebx ; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload ; X86-NEXT: pushl %eax -; X86-NEXT: calll __modti3 +; X86-NEXT: calll __divti3 ; X86-NEXT: addl $32, %esp ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: orl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: orl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: orl %eax, %ecx -; X86-NEXT: setne %al -; X86-NEXT: testb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT: testl %ebx, %ebx -; X86-NEXT: movl $0, %eax -; X86-NEXT: cmovsl %ebx, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF -; X86-NEXT: cmovsl %edx, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %esi +; X86-NEXT: movl %eax, %ebx +; X86-NEXT: subl $1, %ebx +; X86-NEXT: movl %esi, %edx +; X86-NEXT: sbbl $0, %edx +; X86-NEXT: setb %cl +; X86-NEXT: movb (%esp), %ch # 1-byte Reload +; X86-NEXT: testb %ch, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload +; X86-NEXT: cmovel %eax, %ebx +; X86-NEXT: cmovel %esi, %edx +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $-1, %eax -; X86-NEXT: cmovsl %esi, %eax -; X86-NEXT: movl %ebx, %edi -; X86-NEXT: sarl $31, %edi -; X86-NEXT: andl %ecx, %edi -; X86-NEXT: testl %ebx, %ebx -; X86-NEXT: cmovel %ebx, %edi -; X86-NEXT: movl %edx, %ecx +; X86-NEXT: addb $255, %cl +; X86-NEXT: sbbl $0, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-NEXT: movl %edi, %esi +; X86-NEXT: sbbl $0, %esi +; X86-NEXT: movb (%esp), %cl # 1-byte Reload +; X86-NEXT: testb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload +; X86-NEXT: cmovel %edi, %esi ; X86-NEXT: cmpl $2147483647, %edx # imm = 0x7FFFFFFF -; X86-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF -; X86-NEXT: cmovbl %ecx, %edx -; X86-NEXT: testl %ecx, %ecx +; X86-NEXT: movl $2147483647, %ecx # imm = 0x7FFFFFFF +; X86-NEXT: cmovbl %edx, %ecx +; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill +; X86-NEXT: testl %edx, %edx ; X86-NEXT: movl $-1, %ecx -; X86-NEXT: cmovsl %ecx, %esi -; 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: cmovnsl %ebx, %ecx +; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl %esi, %edi +; X86-NEXT: sarl $31, %edi +; X86-NEXT: movl %edi, %ecx +; X86-NEXT: andl %eax, %ecx +; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: testl %esi, %esi +; X86-NEXT: movl $2147483647, %ecx # imm = 0x7FFFFFFF +; X86-NEXT: cmovnsl %ecx, %edx +; X86-NEXT: movl $-1, %ecx +; X86-NEXT: cmovnsl %ecx, %ebx +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT: cmovel %esi, %ecx +; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: orl %esi, %eax +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload +; X86-NEXT: cmovel (%esp), %edx # 4-byte Folded Reload ; X86-NEXT: cmpl $-2147483647, %edx # imm = 0x80000001 ; X86-NEXT: movl $-2147483648, %eax # imm = 0x80000000 ; X86-NEXT: cmovael %edx, %eax +; X86-NEXT: movl %eax, (%esp) # 4-byte Spill ; X86-NEXT: movl %edx, %ecx ; X86-NEXT: sarl $31, %ecx -; X86-NEXT: andl %esi, %ecx -; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: movl $-2147483648, %ebx # imm = 0x80000000 -; X86-NEXT: cmovsl %ebx, %edx -; X86-NEXT: movl $0, %ebx -; X86-NEXT: cmovsl %ebx, %esi +; X86-NEXT: andl %ebx, %ecx +; X86-NEXT: xorl %eax, %eax +; X86-NEXT: andl %esi, %edi +; X86-NEXT: movl $-2147483648, %esi # imm = 0x80000000 +; X86-NEXT: cmovsl %esi, %edx +; X86-NEXT: cmovnsl %ebx, %eax ; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload ; X86-NEXT: cmpl $-1, %edi -; X86-NEXT: cmovel %ecx, %esi -; X86-NEXT: cmovel %eax, %edx -; X86-NEXT: movl %esi, %eax +; X86-NEXT: cmovel %ecx, %eax +; X86-NEXT: cmovel (%esp), %edx # 4-byte Folded Reload ; X86-NEXT: leal -12(%ebp), %esp ; X86-NEXT: popl %esi ; X86-NEXT: popl %edi @@ -622,22 +619,22 @@ ; X64-NEXT: testb %bl, %al ; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload ; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload -; X64-NEXT: movl $4294967295, %edx # imm = 0xFFFFFFFF -; X64-NEXT: cmpq %rdx, %r13 +; X64-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF +; X64-NEXT: cmpq %rcx, %r13 ; X64-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF ; X64-NEXT: cmovbq %r13, %rax -; X64-NEXT: xorl %ecx, %ecx ; X64-NEXT: testq %r14, %r14 -; X64-NEXT: cmovnsq %rdx, %r13 +; X64-NEXT: cmovnsq %rcx, %r13 ; X64-NEXT: cmoveq %rax, %r13 -; X64-NEXT: cmovnsq %rcx, %r14 -; X64-NEXT: movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000 -; X64-NEXT: cmpq %rcx, %r13 -; X64-NEXT: movq %rcx, %rax +; X64-NEXT: movabsq $-4294967296, %rdx # imm = 0xFFFFFFFF00000000 +; X64-NEXT: cmpq %rdx, %r13 +; X64-NEXT: movq %rdx, %rax ; X64-NEXT: cmovaq %r13, %rax -; X64-NEXT: testq %r14, %r14 -; X64-NEXT: cmovsq %rcx, %r13 -; X64-NEXT: cmpq $-1, %r14 +; X64-NEXT: movq %r14, %rcx +; X64-NEXT: sarq $63, %rcx +; X64-NEXT: andq %r14, %rcx +; X64-NEXT: cmovsq %rdx, %r13 +; X64-NEXT: cmpq $-1, %rcx ; X64-NEXT: cmoveq %rax, %r13 ; X64-NEXT: movq %r13, %xmm0 ; X64-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill @@ -684,15 +681,15 @@ ; X64-NEXT: testq %r14, %r14 ; X64-NEXT: cmovnsq %rcx, %r12 ; X64-NEXT: cmoveq %rax, %r12 -; X64-NEXT: movl $0, %eax -; X64-NEXT: cmovnsq %rax, %r14 -; X64-NEXT: movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000 -; X64-NEXT: cmpq %rcx, %r12 -; X64-NEXT: movq %rcx, %rax +; X64-NEXT: movabsq $-4294967296, %rdx # imm = 0xFFFFFFFF00000000 +; X64-NEXT: cmpq %rdx, %r12 +; X64-NEXT: movq %rdx, %rax ; X64-NEXT: cmovaq %r12, %rax -; X64-NEXT: testq %r14, %r14 -; X64-NEXT: cmovsq %rcx, %r12 -; X64-NEXT: cmpq $-1, %r14 +; X64-NEXT: movq %r14, %rcx +; X64-NEXT: sarq $63, %rcx +; X64-NEXT: andq %r14, %rcx +; X64-NEXT: cmovsq %rdx, %r12 +; X64-NEXT: cmpq $-1, %rcx ; X64-NEXT: cmoveq %rax, %r12 ; X64-NEXT: movq %r12, %xmm0 ; X64-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload @@ -707,9 +704,9 @@ ; X64-NEXT: paddq %xmm1, %xmm1 ; X64-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill ; X64-NEXT: movq %xmm1, %rbx -; X64-NEXT: movq %rbx, %r12 -; X64-NEXT: sarq $63, %r12 -; X64-NEXT: shldq $31, %rbx, %r12 +; X64-NEXT: movq %rbx, %r13 +; X64-NEXT: sarq $63, %r13 +; X64-NEXT: shldq $31, %rbx, %r13 ; X64-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload ; X64-NEXT: # xmm1 = mem[2,3,2,3] ; X64-NEXT: pxor %xmm0, %xmm0 @@ -723,19 +720,19 @@ ; X64-NEXT: movq %rbx, %r15 ; X64-NEXT: shlq $31, %r15 ; X64-NEXT: movq %r15, %rdi -; X64-NEXT: movq %r12, %rsi +; X64-NEXT: movq %r13, %rsi ; X64-NEXT: movq %rbp, %rcx ; X64-NEXT: callq __divti3@PLT -; X64-NEXT: movq %rax, %r13 +; X64-NEXT: movq %rax, %r12 ; X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; X64-NEXT: movq %rdx, %r14 ; X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; X64-NEXT: subq $1, %r13 +; X64-NEXT: subq $1, %r12 ; X64-NEXT: sbbq $0, %r14 ; X64-NEXT: shrq $63, %rbx ; X64-NEXT: xorl %ebp, %ebx ; X64-NEXT: movq %r15, %rdi -; X64-NEXT: movq %r12, %rsi +; X64-NEXT: movq %r13, %rsi ; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; X64-NEXT: movq %rbp, %rcx ; X64-NEXT: callq __modti3@PLT @@ -743,25 +740,25 @@ ; X64-NEXT: setne %al ; X64-NEXT: testb %bl, %al ; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload -; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload +; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Folded Reload ; X64-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF -; X64-NEXT: cmpq %rcx, %r13 +; X64-NEXT: cmpq %rcx, %r12 ; X64-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF -; X64-NEXT: cmovbq %r13, %rax -; X64-NEXT: testq %r14, %r14 -; X64-NEXT: cmovnsq %rcx, %r13 -; X64-NEXT: cmoveq %rax, %r13 -; X64-NEXT: movl $0, %eax -; X64-NEXT: cmovnsq %rax, %r14 -; X64-NEXT: movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000 -; X64-NEXT: cmpq %rcx, %r13 -; X64-NEXT: movq %rcx, %rax -; X64-NEXT: cmovaq %r13, %rax +; X64-NEXT: cmovbq %r12, %rax ; X64-NEXT: testq %r14, %r14 -; X64-NEXT: cmovsq %rcx, %r13 -; X64-NEXT: cmpq $-1, %r14 -; X64-NEXT: cmoveq %rax, %r13 -; X64-NEXT: movq %r13, %xmm0 +; X64-NEXT: cmovnsq %rcx, %r12 +; X64-NEXT: cmoveq %rax, %r12 +; X64-NEXT: movabsq $-4294967296, %rdx # imm = 0xFFFFFFFF00000000 +; X64-NEXT: cmpq %rdx, %r12 +; X64-NEXT: movq %rdx, %rax +; X64-NEXT: cmovaq %r12, %rax +; X64-NEXT: movq %r14, %rcx +; X64-NEXT: sarq $63, %rcx +; X64-NEXT: andq %r14, %rcx +; X64-NEXT: cmovsq %rdx, %r12 +; X64-NEXT: cmpq $-1, %rcx +; X64-NEXT: cmoveq %rax, %r12 +; X64-NEXT: movq %r12, %xmm0 ; X64-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill ; X64-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload ; X64-NEXT: # xmm0 = mem[2,3,2,3] @@ -806,15 +803,16 @@ ; X64-NEXT: testq %r14, %r14 ; X64-NEXT: cmovnsq %rcx, %r12 ; X64-NEXT: cmoveq %rax, %r12 -; X64-NEXT: movl $0, %eax -; X64-NEXT: cmovnsq %rax, %r14 ; X64-NEXT: movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000 ; X64-NEXT: cmpq %rcx, %r12 ; X64-NEXT: movq %rcx, %rax +; X64-NEXT: movq %rcx, %rdx ; X64-NEXT: cmovaq %r12, %rax -; X64-NEXT: testq %r14, %r14 -; X64-NEXT: cmovsq %rcx, %r12 -; X64-NEXT: cmpq $-1, %r14 +; X64-NEXT: movq %r14, %rcx +; X64-NEXT: sarq $63, %rcx +; X64-NEXT: andq %r14, %rcx +; X64-NEXT: cmovsq %rdx, %r12 +; X64-NEXT: cmpq $-1, %rcx ; X64-NEXT: cmoveq %rax, %r12 ; X64-NEXT: movq %r12, %xmm0 ; X64-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload @@ -839,41 +837,94 @@ ; X86-NEXT: pushl %edi ; X86-NEXT: pushl %esi ; X86-NEXT: andl $-8, %esp -; X86-NEXT: subl $256, %esp # imm = 0x100 -; X86-NEXT: movl 24(%ebp), %edx -; X86-NEXT: movl 40(%ebp), %edi -; X86-NEXT: leal {{[0-9]+}}(%esp), %ebx -; X86-NEXT: movl %edi, %eax -; X86-NEXT: sarl $31, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: subl $192, %esp +; X86-NEXT: movl 24(%ebp), %esi +; X86-NEXT: movl 40(%ebp), %ecx +; X86-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-NEXT: movl %ecx, %edi +; X86-NEXT: movl %ecx, %edx +; X86-NEXT: sarl $31, %edi +; X86-NEXT: movl %esi, %ecx +; X86-NEXT: sarl $31, %ecx +; X86-NEXT: addl %esi, %esi +; X86-NEXT: adcl %ecx, %ecx +; X86-NEXT: andl $1, %ecx +; X86-NEXT: negl %ecx +; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl %ecx, %ebx +; X86-NEXT: shldl $31, %esi, %ebx +; X86-NEXT: shll $31, %esi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edx +; X86-NEXT: pushl %ecx +; X86-NEXT: pushl %ecx +; X86-NEXT: pushl %ebx +; X86-NEXT: pushl %esi +; X86-NEXT: pushl %eax +; X86-NEXT: calll __modti3 +; X86-NEXT: addl $32, %esp +; X86-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl 40(%ebp) +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT: pushl %ecx +; X86-NEXT: pushl %ecx +; X86-NEXT: pushl %ebx +; X86-NEXT: pushl %esi +; X86-NEXT: pushl %eax +; X86-NEXT: calll __divti3 +; X86-NEXT: addl $32, %esp +; X86-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-NEXT: movl 36(%ebp), %ebx +; X86-NEXT: movl %ebx, %edi +; X86-NEXT: sarl $31, %edi +; X86-NEXT: movl 20(%ebp), %edx ; X86-NEXT: movl %edx, %ecx ; X86-NEXT: sarl $31, %ecx ; X86-NEXT: addl %edx, %edx ; X86-NEXT: adcl %ecx, %ecx ; X86-NEXT: andl $1, %ecx ; X86-NEXT: negl %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: movl %ecx, %esi ; X86-NEXT: shldl $31, %edx, %esi -; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: shll $31, %edx ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: pushl %eax -; X86-NEXT: pushl %eax -; X86-NEXT: pushl %eax ; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %ebx ; X86-NEXT: pushl %ecx ; X86-NEXT: pushl %ecx +; X86-NEXT: movl %ecx, %ebx ; X86-NEXT: pushl %esi ; X86-NEXT: pushl %edx -; X86-NEXT: pushl %ebx +; X86-NEXT: pushl %eax ; X86-NEXT: calll __modti3 ; X86-NEXT: addl $32, %esp ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl 36(%ebp), %edx +; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl %edi +; X86-NEXT: pushl 36(%ebp) +; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: pushl %ebx +; X86-NEXT: pushl %ebx +; X86-NEXT: pushl %esi +; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT: pushl %eax +; X86-NEXT: calll __divti3 +; X86-NEXT: addl $32, %esp +; X86-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-NEXT: movl 32(%ebp), %edx ; X86-NEXT: movl %edx, %edi ; X86-NEXT: sarl $31, %edi -; X86-NEXT: movl 20(%ebp), %ecx +; X86-NEXT: movl 16(%ebp), %ecx ; X86-NEXT: movl %ecx, %esi ; X86-NEXT: sarl $31, %esi ; X86-NEXT: addl %ecx, %ecx @@ -898,40 +949,11 @@ ; X86-NEXT: pushl %eax ; X86-NEXT: calll __modti3 ; X86-NEXT: addl $32, %esp -; X86-NEXT: leal {{[0-9]+}}(%esp), %edi -; X86-NEXT: movl 28(%ebp), %ebx -; X86-NEXT: movl %ebx, %edx -; X86-NEXT: sarl $31, %edx -; X86-NEXT: movl 12(%ebp), %esi -; X86-NEXT: movl %esi, %ecx -; X86-NEXT: sarl $31, %ecx -; X86-NEXT: addl %esi, %esi -; X86-NEXT: adcl %ecx, %ecx -; X86-NEXT: andl $1, %ecx -; X86-NEXT: negl %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl %ecx, %eax -; X86-NEXT: shldl $31, %esi, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: shll $31, %esi -; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: pushl %edx -; X86-NEXT: pushl %edx -; X86-NEXT: pushl %edx -; X86-NEXT: pushl %ebx -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl %eax -; X86-NEXT: pushl %esi -; X86-NEXT: pushl %edi -; X86-NEXT: calll __divti3 -; X86-NEXT: addl $32, %esp ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl 32(%ebp), %edx +; X86-NEXT: movl 28(%ebp), %edx ; X86-NEXT: movl %edx, %esi ; X86-NEXT: sarl $31, %esi -; X86-NEXT: movl 16(%ebp), %ecx +; X86-NEXT: movl 12(%ebp), %ecx ; X86-NEXT: movl %ecx, %ebx ; X86-NEXT: sarl $31, %ebx ; X86-NEXT: addl %ecx, %ecx @@ -954,11 +976,10 @@ ; X86-NEXT: calll __modti3 ; X86-NEXT: addl $32, %esp ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: pushl %esi ; X86-NEXT: pushl %esi ; X86-NEXT: pushl %esi -; X86-NEXT: pushl 32(%ebp) +; X86-NEXT: pushl 28(%ebp) ; X86-NEXT: pushl %ebx ; X86-NEXT: pushl %ebx ; X86-NEXT: pushl %edi @@ -966,358 +987,283 @@ ; X86-NEXT: pushl %eax ; X86-NEXT: calll __divti3 ; X86-NEXT: addl $32, %esp -; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl 40(%ebp) -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: pushl %eax -; X86-NEXT: calll __divti3 -; X86-NEXT: addl $32, %esp -; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl %ecx -; X86-NEXT: pushl 36(%ebp) -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT: pushl %edi -; X86-NEXT: pushl %edi -; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: pushl %eax -; X86-NEXT: calll __divti3 -; X86-NEXT: addl $32, %esp ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: subl $1, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %esi -; X86-NEXT: movl %esi, %eax -; X86-NEXT: sbbl $0, %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: sbbl $0, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: sbbl $0, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: testl %edi, %edi -; X86-NEXT: sets %cl -; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: sets %ch -; X86-NEXT: xorb %cl, %ch -; X86-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-NEXT: orl {{[0-9]+}}(%esp), %edi -; X86-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-NEXT: orl {{[0-9]+}}(%esp), %edx -; X86-NEXT: orl %edi, %edx -; X86-NEXT: setne %cl -; X86-NEXT: testb %ch, %cl -; X86-NEXT: cmovel %esi, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: subl $1, %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-NEXT: movl %edi, %ecx ; X86-NEXT: sbbl $0, %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-NEXT: movl %edx, %eax -; X86-NEXT: sbbl $0, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: sbbl $0, %edx ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: sbbl $0, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: testl %ebx, %ebx ; X86-NEXT: sets %bl -; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT: testl %esi, %esi ; X86-NEXT: sets %bh ; X86-NEXT: xorb %bl, %bh ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi ; X86-NEXT: orl {{[0-9]+}}(%esp), %esi -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: orl {{[0-9]+}}(%esp), %eax -; X86-NEXT: orl %esi, %eax -; X86-NEXT: setne %al -; X86-NEXT: testb %bh, %al -; X86-NEXT: cmovel %edi, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel %edx, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: subl $1, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-NEXT: movl %edi, %esi -; X86-NEXT: sbbl $0, %esi -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: sbbl $0, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: sbbl $0, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: testl %ecx, %ecx -; X86-NEXT: sets %al -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT: testl %edx, %edx -; X86-NEXT: sets %bl -; X86-NEXT: xorb %al, %bl +; X86-NEXT: orl {{[0-9]+}}(%esp), %edi +; X86-NEXT: orl %esi, %edi +; X86-NEXT: setne %bl +; X86-NEXT: testb %bh, %bl +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload +; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload +; X86-NEXT: movl %eax, %ebx +; X86-NEXT: sarl $31, %ebx +; X86-NEXT: movl %ebx, %esi +; X86-NEXT: andl %ecx, %esi +; X86-NEXT: movl %ebx, %edi +; X86-NEXT: andl %edx, %edi +; X86-NEXT: testl %eax, %eax +; X86-NEXT: cmovel %eax, %edi +; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl $-1, %edi +; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload +; X86-NEXT: negl %ecx +; X86-NEXT: movl $0, %ecx +; X86-NEXT: sbbl %ecx, %ecx +; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload +; X86-NEXT: orl %eax, %edx +; X86-NEXT: cmovnel %edi, %ecx +; X86-NEXT: movl $0, %edi +; X86-NEXT: cmovel %edi, %esi +; X86-NEXT: cmpl $-1, %esi +; X86-NEXT: movl $0, %edx +; X86-NEXT: cmovel %ecx, %edx +; X86-NEXT: andl %eax, %ebx +; X86-NEXT: cmovsl %edi, %ecx +; X86-NEXT: movl $-1, %eax +; X86-NEXT: cmovsl %eax, %esi +; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload +; X86-NEXT: cmpl $-1, %ebx +; X86-NEXT: cmovel %edx, %ecx +; X86-NEXT: cmovnel %esi, %ebx +; X86-NEXT: shldl $31, %ecx, %ebx +; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-NEXT: pushl %edx -; X86-NEXT: pushl %edx -; X86-NEXT: pushl %edx -; X86-NEXT: pushl 28(%ebp) +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT: pushl %ecx ; X86-NEXT: pushl %ecx ; X86-NEXT: pushl %ecx +; X86-NEXT: pushl 32(%ebp) +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload +; X86-NEXT: pushl %esi +; X86-NEXT: pushl %esi ; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload ; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload ; X86-NEXT: pushl %eax -; X86-NEXT: calll __modti3 +; X86-NEXT: calll __divti3 ; X86-NEXT: addl $32, %esp ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: orl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: orl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: orl %eax, %ecx -; X86-NEXT: setne %al -; X86-NEXT: testb %bl, %al -; X86-NEXT: cmovel %edi, %esi -; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload +; X86-NEXT: subl $1, %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: sbbl $0, %edi +; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx +; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: sbbl $0, %ebx ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: subl $1, %ecx +; X86-NEXT: sbbl $0, %ecx +; X86-NEXT: testl %esi, %esi +; X86-NEXT: sets %al +; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT: sets %dl +; X86-NEXT: xorb %al, %dl +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: orl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi +; X86-NEXT: orl {{[0-9]+}}(%esp), %esi +; X86-NEXT: orl %eax, %esi +; X86-NEXT: setne %al +; X86-NEXT: testb %dl, %al +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload +; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload +; X86-NEXT: movl %ecx, %esi +; X86-NEXT: sarl $31, %esi ; X86-NEXT: movl %esi, %eax -; X86-NEXT: sbbl $0, %eax +; X86-NEXT: andl %edi, %eax +; X86-NEXT: movl %esi, %edx +; X86-NEXT: andl %ebx, %edx +; X86-NEXT: testl %ecx, %ecx +; X86-NEXT: cmovel %ecx, %edx +; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload +; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload +; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: negl %edi +; X86-NEXT: movl $0, %edi +; X86-NEXT: sbbl %edi, %edi +; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload +; X86-NEXT: orl %ecx, %ebx +; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload +; X86-NEXT: movl $0, %ebx +; X86-NEXT: cmovel %ebx, %eax +; X86-NEXT: cmpl $-1, %eax +; X86-NEXT: movl $0, %ebx +; X86-NEXT: cmovel %edi, %ebx +; X86-NEXT: andl %ecx, %esi +; X86-NEXT: movl $0, %ecx +; X86-NEXT: cmovsl %ecx, %edi +; X86-NEXT: movl $-1, %ecx +; X86-NEXT: cmovsl %ecx, %eax +; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload +; X86-NEXT: cmpl $-1, %esi +; X86-NEXT: cmovel %ebx, %edi +; X86-NEXT: cmovnel %eax, %esi +; X86-NEXT: shldl $31, %edi, %esi +; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: subl $1, %eax +; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx +; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: sbbl $0, %ebx ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: sbbl $0, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl %eax, %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-NEXT: sbbl $0, %edx ; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: sets %bl +; X86-NEXT: sets %cl ; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-NEXT: sets %bh -; X86-NEXT: xorb %bl, %bh -; X86-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-NEXT: orl {{[0-9]+}}(%esp), %edi +; X86-NEXT: sets %ch +; X86-NEXT: xorb %cl, %ch ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax -; X86-NEXT: orl %edi, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-NEXT: orl {{[0-9]+}}(%esp), %edi +; X86-NEXT: orl %eax, %edi ; X86-NEXT: setne %al -; X86-NEXT: testb %bh, %al -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: cmovel %esi, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: testb %ch, %al ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload ; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload +; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload ; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl %edx, %esi +; X86-NEXT: sarl $31, %esi +; X86-NEXT: movl %esi, %ecx +; X86-NEXT: andl %ebx, %ecx +; X86-NEXT: movl %esi, %edi +; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload ; X86-NEXT: testl %edx, %edx +; X86-NEXT: cmovel %edx, %edi +; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl $-1, %edi +; X86-NEXT: cmovsl %eax, %edi +; X86-NEXT: negl %ebx ; X86-NEXT: movl $0, %eax -; X86-NEXT: cmovsl %edx, %eax +; X86-NEXT: sbbl %eax, %eax +; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload +; X86-NEXT: orl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-NEXT: cmovnel %edi, %eax +; X86-NEXT: movl $0, %edi +; X86-NEXT: cmovel %edi, %ecx +; X86-NEXT: cmpl $-1, %ecx +; X86-NEXT: movl $0, %ebx +; X86-NEXT: cmovel %eax, %ebx +; X86-NEXT: andl %edx, %esi +; X86-NEXT: cmovsl %edi, %eax +; X86-NEXT: movl $-1, %edx +; X86-NEXT: cmovsl %edx, %ecx +; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload +; X86-NEXT: cmpl $-1, %esi +; X86-NEXT: cmovel %ebx, %eax +; X86-NEXT: cmovnel %ecx, %esi +; X86-NEXT: shldl $31, %eax, %esi +; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $-1, %eax -; X86-NEXT: cmovsl %ecx, %eax +; X86-NEXT: subl $1, %eax ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: movl %eax, %ecx -; X86-NEXT: sarl $31, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl %ecx, %edx -; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT: testl %eax, %eax -; X86-NEXT: cmovel %eax, %edx -; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $0, %ecx -; X86-NEXT: cmovsl %eax, %ecx +; X86-NEXT: movl {{[0-9]+}}(%esp), %esi +; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: sbbl $0, %esi +; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx +; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: sbbl $0, %ebx +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $-1, %eax -; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: sbbl $0, %ecx +; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT: sets %al +; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-NEXT: sets %dl +; X86-NEXT: xorb %al, %dl +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: orl {{[0-9]+}}(%esp), %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-NEXT: orl {{[0-9]+}}(%esp), %edi +; X86-NEXT: orl %eax, %edi +; X86-NEXT: setne %al +; X86-NEXT: testb %dl, %al ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: movl %eax, %edi -; X86-NEXT: sarl $31, %edi -; X86-NEXT: movl %edi, %ecx -; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: testl %eax, %eax -; X86-NEXT: cmovel %eax, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $0, %ecx -; X86-NEXT: cmovsl %eax, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $-1, %eax -; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: movl %ecx, %ebx -; X86-NEXT: sarl $31, %ebx -; X86-NEXT: movl %ebx, %eax -; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: testl %ecx, %ecx -; X86-NEXT: cmovel %ecx, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl $0, %eax -; X86-NEXT: cmovsl %ecx, %eax +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload +; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload ; X86-NEXT: movl %ecx, %edx -; X86-NEXT: movl $-1, %esi -; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: movl %eax, %ecx -; X86-NEXT: sarl $31, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: testl %eax, %eax -; X86-NEXT: cmovel %eax, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: andl %eax, %ebx -; X86-NEXT: negl %eax -; X86-NEXT: movl $0, %ecx -; X86-NEXT: sbbl %ecx, %ecx -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT: cmovnel %esi, %ecx -; X86-NEXT: movl $0, %edx -; X86-NEXT: cmovel %edx, %ebx -; X86-NEXT: cmpl $-1, %ebx -; X86-NEXT: movl $0, %esi -; X86-NEXT: cmovel %ecx, %esi -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: testl %eax, %eax -; X86-NEXT: cmovsl %edx, %ecx -; X86-NEXT: movl $-1, %edx -; X86-NEXT: cmovsl %edx, %ebx -; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: cmpl $-1, %eax -; X86-NEXT: cmovel %esi, %ecx -; X86-NEXT: cmovnel %ebx, %eax -; X86-NEXT: shldl $31, %ecx, %eax -; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: andl %eax, %edi -; X86-NEXT: negl %eax -; X86-NEXT: movl $0, %eax -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl $0, %esi -; X86-NEXT: cmovel %esi, %edi -; X86-NEXT: cmpl $-1, %edi -; X86-NEXT: movl $0, %edx -; X86-NEXT: cmovel %eax, %edx -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT: sarl $31, %edx +; X86-NEXT: movl %edx, %eax +; X86-NEXT: andl %esi, %eax +; X86-NEXT: movl %edx, %edi +; X86-NEXT: andl %ebx, %edi ; X86-NEXT: testl %ecx, %ecx -; X86-NEXT: cmovsl %esi, %eax -; X86-NEXT: movl $0, %esi -; X86-NEXT: movl $-1, %ebx -; X86-NEXT: cmovsl %ebx, %edi -; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: cmpl $-1, %ecx -; X86-NEXT: cmovel %edx, %eax -; X86-NEXT: cmovnel %edi, %ecx -; X86-NEXT: shldl $31, %eax, %ecx -; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT: andl %eax, %edx -; X86-NEXT: negl %eax -; X86-NEXT: movl $0, %eax -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: cmovel %esi, %edx -; X86-NEXT: cmpl $-1, %edx -; X86-NEXT: movl $0, %ecx -; X86-NEXT: cmovel %eax, %ecx -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT: testl %ebx, %ebx -; X86-NEXT: cmovsl %esi, %eax -; X86-NEXT: movl $-1, %edi -; X86-NEXT: cmovsl %edi, %edx -; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT: cmpl $-1, %ebx -; X86-NEXT: cmovel %ecx, %eax -; X86-NEXT: cmovnel %edx, %ebx -; X86-NEXT: shldl $31, %eax, %ebx -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT: cmovel %ecx, %edi +; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT: andl %eax, %edi -; X86-NEXT: negl %eax -; X86-NEXT: movl $0, %eax -; X86-NEXT: sbbl %eax, %eax -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT: cmovel %esi, %edi -; X86-NEXT: cmpl $-1, %edi +; X86-NEXT: cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload +; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT: negl %esi +; X86-NEXT: movl $0, %esi +; X86-NEXT: sbbl %esi, %esi +; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload +; X86-NEXT: orl %ecx, %ebx +; X86-NEXT: cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload +; X86-NEXT: movl $0, %ebx +; X86-NEXT: cmovel %ebx, %eax +; X86-NEXT: cmpl $-1, %eax +; X86-NEXT: movl $0, %ebx +; X86-NEXT: cmovel %esi, %ebx +; X86-NEXT: andl %ecx, %edx ; X86-NEXT: movl $0, %ecx -; X86-NEXT: cmovel %eax, %ecx -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT: testl %edx, %edx -; X86-NEXT: cmovsl %esi, %eax -; X86-NEXT: movl $-1, %esi -; X86-NEXT: cmovsl %esi, %edi -; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT: andl %edx, %esi -; X86-NEXT: cmpl $-1, %esi -; X86-NEXT: cmovel %ecx, %eax -; X86-NEXT: cmovnel %edi, %esi -; X86-NEXT: shldl $31, %eax, %esi +; X86-NEXT: cmovsl %ecx, %esi +; X86-NEXT: movl $-1, %ecx +; X86-NEXT: cmovsl %ecx, %eax +; X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload +; X86-NEXT: cmpl $-1, %edx +; X86-NEXT: cmovel %ebx, %esi +; X86-NEXT: cmovnel %eax, %edx +; X86-NEXT: shldl $31, %esi, %edx ; X86-NEXT: movl 8(%ebp), %eax -; X86-NEXT: movl %esi, 12(%eax) -; X86-NEXT: movl %ebx, 8(%eax) +; X86-NEXT: movl %edx, 12(%eax) +; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT: movl %ecx, 8(%eax) ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload ; X86-NEXT: movl %ecx, 4(%eax) ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload