[llvm] [X86] Fold flag-setting shifts (SHL, SRL, SRA) (PR #218026)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 21 13:48:55 PDT 2026
https://github.com/AZero13 updated https://github.com/llvm/llvm-project/pull/218026
>From 943a0778908cdc6db398545def278bc71919e0c6 Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Fri, 21 Aug 2026 16:05:04 -0400
Subject: [PATCH 1/2] Pre-commit test (NFC)
---
llvm/test/CodeGen/X86/shift-rmw-flags.ll | 50 ++++++++++++++++++++++++
1 file changed, 50 insertions(+)
create mode 100644 llvm/test/CodeGen/X86/shift-rmw-flags.ll
diff --git a/llvm/test/CodeGen/X86/shift-rmw-flags.ll b/llvm/test/CodeGen/X86/shift-rmw-flags.ll
new file mode 100644
index 0000000000000..631afab38f078
--- /dev/null
+++ b/llvm/test/CodeGen/X86/shift-rmw-flags.ll
@@ -0,0 +1,50 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
+
+define i8 @test_lshr_rmw(ptr %p) {
+; CHECK-LABEL: test_lshr_rmw:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movl (%rdi), %eax
+; CHECK-NEXT: shrl %eax
+; CHECK-NEXT: movl %eax, (%rdi)
+; CHECK-NEXT: setne %al
+; CHECK-NEXT: retq
+ %v = load i32, ptr %p
+ %shr = lshr i32 %v, 1
+ store i32 %shr, ptr %p
+ %cmp = icmp ne i32 %shr, 0
+ %zext = zext i1 %cmp to i8
+ ret i8 %zext
+}
+
+define i8 @test_shl_rmw(ptr %p) {
+; CHECK-LABEL: test_shl_rmw:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movl (%rdi), %eax
+; CHECK-NEXT: addl %eax, %eax
+; CHECK-NEXT: movl %eax, (%rdi)
+; CHECK-NEXT: setne %al
+; CHECK-NEXT: retq
+ %v = load i32, ptr %p
+ %shl = shl i32 %v, 1
+ store i32 %shl, ptr %p
+ %cmp = icmp ne i32 %shl, 0
+ %zext = zext i1 %cmp to i8
+ ret i8 %zext
+}
+
+define i8 @test_ashr_rmw(ptr %p) {
+; CHECK-LABEL: test_ashr_rmw:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movl (%rdi), %eax
+; CHECK-NEXT: sarl %eax
+; CHECK-NEXT: movl %eax, (%rdi)
+; CHECK-NEXT: setne %al
+; CHECK-NEXT: retq
+ %v = load i32, ptr %p
+ %ashr = ashr i32 %v, 1
+ store i32 %ashr, ptr %p
+ %cmp = icmp ne i32 %ashr, 0
+ %zext = zext i1 %cmp to i8
+ ret i8 %zext
+}
>From cc8bd580eb699177cce7e78bebc84848a482732c Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Fri, 21 Aug 2026 16:36:50 -0400
Subject: [PATCH 2/2] [X86] Fold flag-setting shifts (SHL, SRL, SRA)
X86 is the gift that keeps on giving. Shifts set flags if they are not 0 on x86, so take advantage of that.
---
llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 22 +-
llvm/lib/Target/X86/X86ISelLowering.cpp | 18 +-
llvm/lib/Target/X86/X86InstrFragments.td | 7 +
llvm/lib/Target/X86/X86InstrShiftRotate.td | 40 ++
llvm/test/CodeGen/X86/pr49028.ll | 5 +-
llvm/test/CodeGen/X86/sdiv_fix.ll | 299 +++++----
llvm/test/CodeGen/X86/sdiv_fix_sat.ll | 684 ++++++++++-----------
llvm/test/CodeGen/X86/shift-rmw-flags.ll | 12 +-
llvm/test/CodeGen/X86/xor.ll | 9 +-
9 files changed, 562 insertions(+), 534 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index c3fc43c2bc6db..b889de9c1f6ba 100644
--- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -3890,6 +3890,10 @@ bool X86DAGToDAGISel::foldLoadStoreIntoMemOperand(SDNode *Node) {
case X86ISD::XOR:
IsCommutable = true;
break;
+ case X86ISD::SHL:
+ case X86ISD::SRL:
+ case X86ISD::SRA:
+ break;
}
unsigned LoadOpNo = IsNegate ? 1 : 0;
@@ -3963,7 +3967,10 @@ bool X86DAGToDAGISel::foldLoadStoreIntoMemOperand(SDNode *Node) {
case X86ISD::SBB:
case X86ISD::AND:
case X86ISD::OR:
- case X86ISD::XOR: {
+ case X86ISD::XOR:
+ case X86ISD::SHL:
+ case X86ISD::SRL:
+ case X86ISD::SRA: {
auto SelectRegOpcode = [SelectOpcode](unsigned Opc) {
switch (Opc) {
case X86ISD::ADD:
@@ -3986,6 +3993,10 @@ bool X86DAGToDAGISel::foldLoadStoreIntoMemOperand(SDNode *Node) {
case X86ISD::XOR:
return SelectOpcode(X86::XOR64mr, X86::XOR32mr, X86::XOR16mr,
X86::XOR8mr);
+ case X86ISD::SHL:
+ case X86ISD::SRL:
+ case X86ISD::SRA:
+ return 0U; // Only immediate shifts are supported.
default:
llvm_unreachable("Invalid opcode!");
}
@@ -4013,6 +4024,15 @@ bool X86DAGToDAGISel::foldLoadStoreIntoMemOperand(SDNode *Node) {
case X86ISD::XOR:
return SelectOpcode(X86::XOR64mi32, X86::XOR32mi, X86::XOR16mi,
X86::XOR8mi);
+ case X86ISD::SHL:
+ return SelectOpcode(X86::SHL64mi, X86::SHL32mi, X86::SHL16mi,
+ X86::SHL8mi);
+ case X86ISD::SRL:
+ return SelectOpcode(X86::SHR64mi, X86::SHR32mi, X86::SHR16mi,
+ X86::SHR8mi);
+ case X86ISD::SRA:
+ return SelectOpcode(X86::SAR64mi, X86::SAR32mi, X86::SAR16mi,
+ X86::SAR8mi);
default:
llvm_unreachable("Invalid opcode!");
}
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index bf435b0c2f849..6dcbe62ecf9da 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -23923,11 +23923,20 @@ static SDValue EmitTest(SDValue Op, X86::CondCode X86CC, const SDLoc &dl,
// non-casted variable when we check for possible users.
switch (ArithOp.getOpcode()) {
case ISD::AND:
- // If the primary 'and' result isn't used, don't bother using X86ISD::AND,
- // because a TEST instruction will be better.
+ case ISD::SHL:
+ case ISD::SRL:
+ case ISD::SRA:
+ // If the primary result isn't used, don't bother using the X86-specific
+ // instruction, because a TEST instruction will be better.
if (!hasNonFlagsUse(Op))
break;
+ // Intel shift instructions only set EFLAGS if the shift count is not 0.
+ if (ArithOp.getOpcode() != ISD::AND &&
+ (!isa<ConstantSDNode>(Op.getOperand(1)) ||
+ isNullConstant(Op.getOperand(1))))
+ break;
+
[[fallthrough]];
case ISD::ADD:
case ISD::SUB:
@@ -23945,7 +23954,10 @@ static SDValue EmitTest(SDValue Op, X86::CondCode X86CC, const SDLoc &dl,
case ISD::XOR: Opcode = X86ISD::XOR; break;
case ISD::AND: Opcode = X86ISD::AND; break;
case ISD::OR: Opcode = X86ISD::OR; break;
- // clang-format on
+ case ISD::SHL: Opcode = X86ISD::SHL; break;
+ case ISD::SRL: Opcode = X86ISD::SRL; break;
+ case ISD::SRA: Opcode = X86ISD::SRA; break;
+ // clang-format on
}
NumOperands = 2;
diff --git a/llvm/lib/Target/X86/X86InstrFragments.td b/llvm/lib/Target/X86/X86InstrFragments.td
index c183849d4f575..539672bad3f1e 100644
--- a/llvm/lib/Target/X86/X86InstrFragments.td
+++ b/llvm/lib/Target/X86/X86InstrFragments.td
@@ -38,6 +38,10 @@ def SDTBinaryArithWithFlags : SDTypeProfile<2, 2,
SDTCisSameAs<0, 3>,
SDTCisInt<0>, SDTCisVT<1, i32>]>;
+def SDTIntShiftOpWithFlags : SDTypeProfile<2, 2,
+ [SDTCisInt<0>, SDTCisVT<1, i32>,
+ SDTCisSameAs<0, 2>, SDTCisInt<3>]>;
+
// SDTBinaryArithWithFlagsInOut - RES1, EFLAGS = op LHS, RHS, EFLAGS
def SDTBinaryArithWithFlagsInOut : SDTypeProfile<2, 3,
[SDTCisSameAs<0, 2>,
@@ -385,6 +389,9 @@ def X86tcret_globaladdr : SDNode<"X86ISD::TC_RETURN_GLOBALADDR", SDT_X86TCRET,
def X86add_flag : SDNode<"X86ISD::ADD", SDTBinaryArithWithFlags,
[SDNPCommutative]>;
def X86sub_flag : SDNode<"X86ISD::SUB", SDTBinaryArithWithFlags>;
+def X86shl_flag : SDNode<"X86ISD::SHL", SDTIntShiftOpWithFlags>;
+def X86srl_flag : SDNode<"X86ISD::SRL", SDTIntShiftOpWithFlags>;
+def X86sra_flag : SDNode<"X86ISD::SRA", SDTIntShiftOpWithFlags>;
def X86smul_flag : SDNode<"X86ISD::SMUL", SDTBinaryArithWithFlags,
[SDNPCommutative]>;
def X86umul_flag : SDNode<"X86ISD::UMUL", SDTBinaryArithWithFlags,
diff --git a/llvm/lib/Target/X86/X86InstrShiftRotate.td b/llvm/lib/Target/X86/X86InstrShiftRotate.td
index 7e7c2f97c5793..a9a00920375e3 100644
--- a/llvm/lib/Target/X86/X86InstrShiftRotate.td
+++ b/llvm/lib/Target/X86/X86InstrShiftRotate.td
@@ -239,6 +239,46 @@ defm SAR: ShiftRotate_NF<"sar", MRM7r, MRM7m, WriteShiftCL, WriteShift, WriteShi
defm ROL: ShiftRotate_NF<"rol", MRM0r, MRM0m, WriteRotateCL, WriteRotate, WriteRotateCLLd, WriteRotateLd>;
defm ROR: ShiftRotate_NF<"ror", MRM1r, MRM1m, WriteRotateCL, WriteRotate, WriteRotateCLLd, WriteRotateLd>;
+multiclass ShiftFlag_Pats<SDNode node, string inst, string suffix = ""> {
+ def : Pat<(node GR8:$src, (i8 1)), (!cast<Instruction>(inst#"8r1"#suffix) GR8:$src)>;
+ def : Pat<(node GR8:$src, (i8 imm:$amt)), (!cast<Instruction>(inst#"8ri"#suffix) GR8:$src, imm:$amt)>;
+ def : Pat<(node GR16:$src, (i8 1)), (!cast<Instruction>(inst#"16r1"#suffix) GR16:$src)>;
+ def : Pat<(node GR16:$src, (i8 imm:$amt)), (!cast<Instruction>(inst#"16ri"#suffix) GR16:$src, imm:$amt)>;
+ def : Pat<(node GR32:$src, (i8 1)), (!cast<Instruction>(inst#"32r1"#suffix) GR32:$src)>;
+ def : Pat<(node GR32:$src, (i8 imm:$amt)), (!cast<Instruction>(inst#"32ri"#suffix) GR32:$src, imm:$amt)>;
+ def : Pat<(node GR64:$src, (i8 1)), (!cast<Instruction>(inst#"64r1"#suffix) GR64:$src)>;
+ def : Pat<(node GR64:$src, (i8 imm:$amt)), (!cast<Instruction>(inst#"64ri"#suffix) GR64:$src, imm:$amt)>;
+}
+
+multiclass ShlFlag_Pats<SDNode node, string suffix = ""> {
+ def : Pat<(node GR8:$src, (i8 1)), (!cast<Instruction>("ADD8rr"#suffix) GR8:$src, GR8:$src)>;
+ def : Pat<(node GR8:$src, (i8 imm:$amt)), (!cast<Instruction>("SHL8ri"#suffix) GR8:$src, imm:$amt)>;
+ def : Pat<(node GR16:$src, (i8 1)), (!cast<Instruction>("ADD16rr"#suffix) GR16:$src, GR16:$src)>;
+ def : Pat<(node GR16:$src, (i8 imm:$amt)), (!cast<Instruction>("SHL16ri"#suffix) GR16:$src, imm:$amt)>;
+ def : Pat<(node GR32:$src, (i8 1)), (!cast<Instruction>("ADD32rr"#suffix) GR32:$src, GR32:$src)>;
+ def : Pat<(node GR32:$src, (i8 imm:$amt)), (!cast<Instruction>("SHL32ri"#suffix) GR32:$src, imm:$amt)>;
+ def : Pat<(node GR64:$src, (i8 1)), (!cast<Instruction>("ADD64rr"#suffix) GR64:$src, GR64:$src)>;
+ def : Pat<(node GR64:$src, (i8 imm:$amt)), (!cast<Instruction>("SHL64ri"#suffix) GR64:$src, imm:$amt)>;
+}
+
+let Predicates = [NoNDD, NoEGPR] in {
+ defm : ShiftFlag_Pats<X86srl_flag, "SHR">;
+ defm : ShiftFlag_Pats<X86sra_flag, "SAR">;
+ defm : ShlFlag_Pats<X86shl_flag>;
+}
+
+let Predicates = [HasEGPR] in {
+ defm : ShiftFlag_Pats<X86srl_flag, "SHR", "_EVEX">;
+ defm : ShiftFlag_Pats<X86sra_flag, "SAR", "_EVEX">;
+ defm : ShlFlag_Pats<X86shl_flag, "_EVEX">;
+}
+
+let Predicates = [HasNDD] in {
+ defm : ShiftFlag_Pats<X86srl_flag, "SHR", "_ND">;
+ defm : ShiftFlag_Pats<X86sra_flag, "SAR", "_ND">;
+ defm : ShlFlag_Pats<X86shl_flag, "_ND">;
+}
+
// Use the opposite rotate if allows us to use the rotate by 1 instruction.
let Predicates = [NoNDD] in {
def : Pat<(rotl GR8:$src1, (i8 7)), (ROR8r1 GR8:$src1)>;
diff --git a/llvm/test/CodeGen/X86/pr49028.ll b/llvm/test/CodeGen/X86/pr49028.ll
index 8df070356bb89..8badde68b01cc 100644
--- a/llvm/test/CodeGen/X86/pr49028.ll
+++ b/llvm/test/CodeGen/X86/pr49028.ll
@@ -7,15 +7,14 @@ define zeroext i16 @PR49028(i16 zeroext %0, ptr %1) {
; X86: # %bb.0:
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: shrl %eax
+; X86-NEXT: shrw %ax
; X86-NEXT: sete (%ecx)
-; X86-NEXT: # kill: def $ax killed $ax killed $eax
; X86-NEXT: retl
;
; X64-LABEL: PR49028:
; X64: # %bb.0:
; X64-NEXT: movl %edi, %eax
-; X64-NEXT: shrl %eax
+; X64-NEXT: shrw %ax
; X64-NEXT: sete (%rsi)
; X64-NEXT: # kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
diff --git a/llvm/test/CodeGen/X86/sdiv_fix.ll b/llvm/test/CodeGen/X86/sdiv_fix.ll
index 392bc83d9d5d8..4e7cb5e322377 100644
--- a/llvm/test/CodeGen/X86/sdiv_fix.ll
+++ b/llvm/test/CodeGen/X86/sdiv_fix.ll
@@ -259,27 +259,26 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X64-NEXT: pushq %r13
; X64-NEXT: pushq %r12
; X64-NEXT: pushq %rbx
-; X64-NEXT: pushq %rax
+; X64-NEXT: subq $24, %rsp
; X64-NEXT: movq %rsi, %rbx
; X64-NEXT: movq %rdi, %r14
; X64-NEXT: movq %rdi, %r15
; X64-NEXT: sarq $63, %r15
; X64-NEXT: shldq $31, %rdi, %r15
-; X64-NEXT: shlq $31, %r14
; X64-NEXT: movq %rsi, %r12
; X64-NEXT: sarq $63, %r12
+; X64-NEXT: sets {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Folded Spill
+; X64-NEXT: shlq $31, %r14
; X64-NEXT: movq %r14, %rdi
; X64-NEXT: movq %r15, %rsi
; X64-NEXT: movq %rbx, %rdx
; X64-NEXT: movq %r12, %rcx
; X64-NEXT: callq __divti3 at PLT
-; X64-NEXT: movq %rax, (%rsp) # 8-byte Spill
+; X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; X64-NEXT: leaq -1(%rax), %rbp
; X64-NEXT: testq %r15, %r15
-; X64-NEXT: sets %al
-; X64-NEXT: testq %r12, %r12
; X64-NEXT: sets %r13b
-; X64-NEXT: xorb %al, %r13b
+; X64-NEXT: xorb {{[-0-9]+}}(%r{{[sb]}}p), %r13b # 1-byte Folded Reload
; X64-NEXT: movq %r14, %rdi
; X64-NEXT: movq %r15, %rsi
; X64-NEXT: movq %rbx, %rdx
@@ -288,9 +287,9 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X64-NEXT: orq %rax, %rdx
; X64-NEXT: setne %al
; X64-NEXT: testb %r13b, %al
-; X64-NEXT: cmoveq (%rsp), %rbp # 8-byte Folded Reload
+; X64-NEXT: cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload
; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: addq $8, %rsp
+; X64-NEXT: addq $24, %rsp
; X64-NEXT: popq %rbx
; X64-NEXT: popq %r12
; X64-NEXT: popq %r13
@@ -308,69 +307,67 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X86-NEXT: pushl %esi
; X86-NEXT: andl $-16, %esp
; X86-NEXT: subl $112, %esp
-; X86-NEXT: movl 8(%ebp), %ecx
-; X86-NEXT: movl 12(%ebp), %edi
-; X86-NEXT: movl 16(%ebp), %eax
-; X86-NEXT: movl 20(%ebp), %edx
-; X86-NEXT: movl %edx, %ebx
-; X86-NEXT: sarl $31, %ebx
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edi, %esi
-; X86-NEXT: sarl $31, %esi
-; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 20(%ebp), %edi
+; X86-NEXT: movl 12(%ebp), %esi
+; X86-NEXT: movl %esi, %edx
+; X86-NEXT: sarl $31, %edx
+; X86-NEXT: movl %edx, %ecx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: shldl $31, %esi, %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 8(%ebp), %ebx
+; X86-NEXT: shldl $31, %ebx, %esi
+; X86-NEXT: shll $31, %ebx
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
-; X86-NEXT: shldl $31, %edi, %esi
-; X86-NEXT: shldl $31, %ecx, %edi
+; X86-NEXT: movl %edi, %eax
+; X86-NEXT: sarl $31, %edi
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
-; X86-NEXT: shll $31, %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: calll __divti3
-; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl 20(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
; X86-NEXT: movl 16(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: calll __modti3
+; X86-NEXT: subl $4, %esp
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl 16(%ebp), %eax
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl 20(%ebp), %eax
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: calll __divti3
+; X86-NEXT: subl $4, %esp
; 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), %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: subl $1, %esi
-; X86-NEXT: sbbl $0, %edi
-; X86-NEXT: testl %ebx, %ebx
-; X86-NEXT: sets %al
-; X86-NEXT: testl %ecx, %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %esi, %eax
+; X86-NEXT: subl $1, %eax
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: testl %edi, %edi
; X86-NEXT: sets %bl
-; X86-NEXT: xorb %al, %bl
-; X86-NEXT: calll __modti3
-; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %bl # 1-byte Folded Reload
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: orl {{[0-9]+}}(%esp), %edi
; 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 {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
-; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
-; X86-NEXT: movl %esi, %eax
-; X86-NEXT: movl %edi, %edx
+; X86-NEXT: orl %edi, %ecx
+; X86-NEXT: setne %cl
+; X86-NEXT: testb %bl, %cl
+; X86-NEXT: cmovel %esi, %eax
+; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
; X86-NEXT: leal -12(%ebp), %esp
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
@@ -535,168 +532,156 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %edi
; X86-NEXT: pushl %esi
-; X86-NEXT: subl $60, %esp
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: subl $56, %esp
; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
+; X86-NEXT: movl %ebp, %eax
+; X86-NEXT: shrl $31, %eax
+; X86-NEXT: shldl $31, %ebp, %eax
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; X86-NEXT: movl %esi, %ebp
-; X86-NEXT: sarl $31, %ebp
-; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ecx, %edx
-; X86-NEXT: shll $31, %edx
+; X86-NEXT: sarl $31, %esi
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: sarl $31, %edx
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: shrl $31, %eax
-; X86-NEXT: shldl $31, %ecx, %eax
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: sarl $31, %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: sets (%esp) # 1-byte Folded Spill
+; X86-NEXT: shll $31, %ebp
+; X86-NEXT: movl %edi, %ebx
+; X86-NEXT: sarl $31, %ebx
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: pushl %ebx
+; X86-NEXT: pushl %edi
+; X86-NEXT: pushl %eax
+; X86-NEXT: movl %eax, %edi
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: pushl %ebp
-; X86-NEXT: pushl %esi
-; X86-NEXT: pushl %eax
-; X86-NEXT: pushl %edx
+; X86-NEXT: calll __moddi3
+; X86-NEXT: addl $16, %esp
+; 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: pushl %ebx
+; X86-NEXT: pushl {{[0-9]+}}(%esp)
+; X86-NEXT: pushl %edi
+; X86-NEXT: pushl %ebp
; X86-NEXT: calll __divdi3
; X86-NEXT: addl $16, %esp
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %edi, %eax
-; X86-NEXT: sarl $31, %eax
-; X86-NEXT: movl %ebx, %ebp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, %ebp
; X86-NEXT: shll $31, %ebp
-; X86-NEXT: movl %ebx, %ecx
-; X86-NEXT: shrl $31, %ecx
-; X86-NEXT: shldl $31, %ebx, %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: shrl $31, %eax
+; X86-NEXT: shldl $31, %ecx, %eax
+; X86-NEXT: pushl %esi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %eax
-; X86-NEXT: movl %eax, %esi
+; X86-NEXT: movl %eax, %edi
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: pushl %edi
-; X86-NEXT: pushl %ecx
-; X86-NEXT: movl %ecx, %ebx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: pushl %ebp
; X86-NEXT: calll __moddi3
; X86-NEXT: addl $16, %esp
; 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: pushl %esi
-; X86-NEXT: pushl %edi
; X86-NEXT: pushl %ebx
+; X86-NEXT: pushl %edi
; X86-NEXT: pushl %ebp
; X86-NEXT: calll __divdi3
; X86-NEXT: addl $16, %esp
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sarl $31, %ecx
-; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
-; X86-NEXT: movl %edx, %ebx
-; X86-NEXT: shll $31, %ebx
-; X86-NEXT: movl %edx, %edi
-; X86-NEXT: shrl $31, %edi
-; X86-NEXT: shldl $31, %edx, %edi
-; X86-NEXT: pushl %ecx
-; X86-NEXT: movl %ecx, %ebp
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: pushl %eax
+; X86-NEXT: movl %eax, %ebp
+; X86-NEXT: shll $31, %ebp
; X86-NEXT: movl %eax, %esi
-; X86-NEXT: pushl %edi
+; X86-NEXT: shrl $31, %esi
+; X86-NEXT: shldl $31, %eax, %esi
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
; X86-NEXT: pushl %ebx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: pushl %edi
+; X86-NEXT: pushl %esi
+; X86-NEXT: pushl %ebp
; X86-NEXT: calll __moddi3
; X86-NEXT: addl $16, %esp
; 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: pushl %ebp
-; X86-NEXT: pushl %esi
-; X86-NEXT: pushl %edi
; X86-NEXT: pushl %ebx
+; X86-NEXT: pushl %edi
+; X86-NEXT: pushl %esi
+; X86-NEXT: pushl %ebp
; X86-NEXT: calll __divdi3
; X86-NEXT: addl $16, %esp
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, %ebp
+; X86-NEXT: shll $31, %ebp
; X86-NEXT: movl %eax, %ebx
-; X86-NEXT: sarl $31, %ebx
-; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl %ecx, %esi
-; X86-NEXT: shll $31, %esi
-; X86-NEXT: movl %ecx, %ebp
-; X86-NEXT: shrl $31, %ebp
-; X86-NEXT: shldl $31, %ecx, %ebp
+; X86-NEXT: shrl $31, %ebx
+; X86-NEXT: shldl $31, %eax, %ebx
+; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; X86-NEXT: pushl {{[0-9]+}}(%esp)
; X86-NEXT: pushl %ebx
-; X86-NEXT: pushl %eax
; X86-NEXT: pushl %ebp
-; X86-NEXT: pushl %esi
; X86-NEXT: calll __moddi3
; X86-NEXT: addl $16, %esp
-; X86-NEXT: movl %eax, (%esp) # 4-byte Spill
-; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: pushl %ebx
+; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %edx, %edi
+; X86-NEXT: testl %ebx, %ebx
+; X86-NEXT: sets %al
+; X86-NEXT: xorb (%esp), %al # 1-byte Folded Reload
+; X86-NEXT: movb %al, (%esp) # 1-byte Spill
+; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
; X86-NEXT: pushl {{[0-9]+}}(%esp)
+; X86-NEXT: pushl %ebx
; X86-NEXT: pushl %ebp
-; X86-NEXT: pushl %esi
; X86-NEXT: calll __divdi3
; X86-NEXT: addl $16, %esp
-; X86-NEXT: testl %ebp, %ebp
-; X86-NEXT: sets %cl
-; X86-NEXT: testl %ebx, %ebx
-; X86-NEXT: sets %dl
-; X86-NEXT: xorb %cl, %dl
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: orl (%esp), %ecx # 4-byte Folded Reload
+; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
; X86-NEXT: setne %cl
-; X86-NEXT: testb %dl, %cl
+; X86-NEXT: testb %cl, (%esp) # 1-byte Folded Reload
; X86-NEXT: leal -1(%eax), %ecx
; X86-NEXT: cmovel %eax, %ecx
-; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill
-; X86-NEXT: testl %edi, %edi
+; X86-NEXT: testl %esi, %esi
; X86-NEXT: sets %al
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Folded Reload
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; X86-NEXT: setne %dl
+; X86-NEXT: testb %al, %dl
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: leal -1(%eax), %edi
+; X86-NEXT: cmovel %eax, %edi
; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
-; X86-NEXT: sets %cl
-; X86-NEXT: xorb %al, %cl
+; X86-NEXT: sets %dl
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %dl # 1-byte Folded Reload
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: setne %al
-; X86-NEXT: testb %cl, %al
+; X86-NEXT: setne %dh
+; X86-NEXT: testb %dl, %dh
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: leal -1(%eax), %ecx
-; X86-NEXT: cmovel %eax, %ecx
-; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
-; X86-NEXT: sets %al
+; X86-NEXT: leal -1(%eax), %edx
+; X86-NEXT: cmovel %eax, %edx
; X86-NEXT: cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
-; X86-NEXT: sets %cl
-; X86-NEXT: xorb %al, %cl
+; X86-NEXT: sets %bl
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %bl # 1-byte Folded Reload
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: setne %al
-; X86-NEXT: testb %cl, %al
+; X86-NEXT: setne %bh
+; X86-NEXT: testb %bl, %bh
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: leal -1(%eax), %ebp
-; X86-NEXT: cmovel %eax, %ebp
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
-; X86-NEXT: testl %edx, %edx
-; X86-NEXT: sets %al
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: testl %ecx, %ecx
-; X86-NEXT: sets %bl
-; X86-NEXT: xorb %al, %bl
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: leal -1(%edi), %esi
-; X86-NEXT: pushl %ecx
-; X86-NEXT: pushl {{[0-9]+}}(%esp)
-; X86-NEXT: pushl %edx
-; X86-NEXT: pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
-; X86-NEXT: calll __moddi3
-; X86-NEXT: addl $16, %esp
-; X86-NEXT: orl %eax, %edx
-; X86-NEXT: setne %al
-; X86-NEXT: testb %bl, %al
-; X86-NEXT: cmovel %edi, %esi
+; X86-NEXT: leal -1(%eax), %esi
+; X86-NEXT: cmovel %eax, %esi
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %esi, 12(%eax)
-; X86-NEXT: movl %ebp, 8(%eax)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, 4(%eax)
-; X86-NEXT: movl (%esp), %ecx # 4-byte Reload
+; X86-NEXT: movl %edx, 8(%eax)
+; X86-NEXT: movl %edi, 4(%eax)
; X86-NEXT: movl %ecx, (%eax)
-; X86-NEXT: addl $60, %esp
+; X86-NEXT: addl $56, %esp
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
; X86-NEXT: popl %ebx
diff --git a/llvm/test/CodeGen/X86/sdiv_fix_sat.ll b/llvm/test/CodeGen/X86/sdiv_fix_sat.ll
index e7d41d5bebc8a..7ca45b081f666 100644
--- a/llvm/test/CodeGen/X86/sdiv_fix_sat.ll
+++ b/llvm/test/CodeGen/X86/sdiv_fix_sat.ll
@@ -306,17 +306,18 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X64-NEXT: pushq %r13
; X64-NEXT: pushq %r12
; X64-NEXT: pushq %rbx
-; X64-NEXT: subq $24, %rsp
+; X64-NEXT: subq $40, %rsp
; X64-NEXT: movq %rsi, %rdx
-; X64-NEXT: movq %rsi, (%rsp) # 8-byte Spill
+; X64-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; X64-NEXT: movq %rdi, %r14
; X64-NEXT: leaq (%rdi,%rdi), %rax
; X64-NEXT: movq %rdi, %r15
; X64-NEXT: sarq $63, %r15
; X64-NEXT: shldq $31, %rax, %r15
-; X64-NEXT: shlq $32, %r14
; X64-NEXT: movq %rsi, %r12
; X64-NEXT: sarq $63, %r12
+; X64-NEXT: sets {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Folded Spill
+; X64-NEXT: shlq $32, %r14
; X64-NEXT: movq %r14, %rdi
; X64-NEXT: movq %r15, %rsi
; X64-NEXT: movq %r12, %rcx
@@ -328,13 +329,11 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X64-NEXT: subq $1, %r13
; X64-NEXT: sbbq $0, %rbp
; X64-NEXT: testq %r15, %r15
-; X64-NEXT: sets %al
-; X64-NEXT: testq %r12, %r12
; X64-NEXT: sets %bl
-; X64-NEXT: xorb %al, %bl
+; X64-NEXT: xorb {{[-0-9]+}}(%r{{[sb]}}p), %bl # 1-byte Folded Reload
; X64-NEXT: movq %r14, %rdi
; X64-NEXT: movq %r15, %rsi
-; X64-NEXT: movq (%rsp), %rdx # 8-byte Reload
+; X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
; X64-NEXT: movq %r12, %rcx
; X64-NEXT: callq __modti3 at PLT
; X64-NEXT: orq %rax, %rdx
@@ -353,7 +352,7 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X64-NEXT: cmovlq %rdx, %rcx
; X64-NEXT: cmovgeq %r13, %rax
; X64-NEXT: shrdq $1, %rcx, %rax
-; X64-NEXT: addq $24, %rsp
+; X64-NEXT: addq $40, %rsp
; X64-NEXT: popq %rbx
; X64-NEXT: popq %r12
; X64-NEXT: popq %r13
@@ -371,106 +370,103 @@ define i64 @func5(i64 %x, i64 %y) nounwind {
; X86-NEXT: pushl %esi
; X86-NEXT: andl $-16, %esp
; X86-NEXT: subl $128, %esp
-; X86-NEXT: movl 8(%ebp), %esi
-; X86-NEXT: movl 12(%ebp), %edi
-; X86-NEXT: movl 16(%ebp), %ecx
-; X86-NEXT: movl 20(%ebp), %edx
-; X86-NEXT: movl %edx, %eax
-; X86-NEXT: sarl $31, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edi, %ebx
-; X86-NEXT: sarl $31, %ebx
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 20(%ebp), %ebx
+; X86-NEXT: movl 12(%ebp), %esi
+; X86-NEXT: movl %esi, %edx
+; X86-NEXT: sarl $31, %edx
+; X86-NEXT: movl %edx, %ecx
+; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: shldl $31, %esi, %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 8(%ebp), %edi
+; X86-NEXT: shldl $31, %edi, %esi
+; X86-NEXT: shll $31, %edi
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
-; X86-NEXT: shldl $31, %edi, %ebx
-; X86-NEXT: shldl $31, %esi, %edi
-; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
-; X86-NEXT: shll $31, %esi
-; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ebx, %eax
+; X86-NEXT: sarl $31, %ebx
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: calll __divti3
-; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl 20(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
; X86-NEXT: movl 16(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: calll __modti3
+; X86-NEXT: subl $4, %esp
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl 16(%ebp), %eax
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl 20(%ebp), %eax
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
-; X86-NEXT: movl %edi, {{[-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, %edi
-; X86-NEXT: sbbl $0, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: calll __divti3
+; X86-NEXT: subl $4, %esp
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT: movl %ecx, {{[-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, %ecx
; X86-NEXT: sbbl $0, %eax
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; X86-NEXT: movl %esi, %ebx
+; 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 %ecx, %ecx
+; 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: testl %esi, %esi
; X86-NEXT: sets %al
-; 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: calll __modti3
-; X86-NEXT: subl $4, %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: cmovel %esi, %ebx
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %al # 1-byte Folded Reload
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: orl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-NEXT: orl {{[0-9]+}}(%esp), %esi
+; X86-NEXT: orl %edx, %esi
+; X86-NEXT: setne %dl
+; X86-NEXT: testb %al, %dl
+; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
; 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 {{[-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), %edi # 4-byte Folded Reload
-; X86-NEXT: cmpl $-1, %edi
-; X86-NEXT: sbbl $2147483647, %ecx # imm = 0x7FFFFFFF
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sbbl $0, %ecx
-; X86-NEXT: movl %ebx, %ecx
-; X86-NEXT: sbbl $0, %ecx
+; X86-NEXT: cmpl $-1, %ecx
+; X86-NEXT: movl %eax, %edx
+; X86-NEXT: sbbl $2147483647, %edx # imm = 0x7FFFFFFF
+; X86-NEXT: movl %ebx, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl %edi, %edx
+; X86-NEXT: sbbl $0, %edx
; X86-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF
-; X86-NEXT: cmovll {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: movl $0, %ecx
-; X86-NEXT: cmovgel %ecx, %ebx
-; X86-NEXT: cmovgel %ecx, %eax
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: cmovgel %ecx, %edi
-; X86-NEXT: movl %edi, %esi
-; X86-NEXT: negl %esi
-; X86-NEXT: movl $-2147483648, %esi # imm = 0x80000000
-; X86-NEXT: sbbl %edx, %esi
-; X86-NEXT: movl $-1, %esi
-; X86-NEXT: sbbl %eax, %esi
-; X86-NEXT: sbbl %ebx, %ecx
+; X86-NEXT: cmovll %eax, %edx
; X86-NEXT: movl $0, %eax
; X86-NEXT: cmovgel %eax, %edi
+; X86-NEXT: cmovgel %eax, %ebx
+; X86-NEXT: movl $-1, %esi
+; X86-NEXT: cmovgel %esi, %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: negl %eax
+; X86-NEXT: movl $-2147483648, %eax # imm = 0x80000000
+; X86-NEXT: sbbl %edx, %eax
+; X86-NEXT: movl $-1, %eax
+; X86-NEXT: sbbl %ebx, %eax
+; X86-NEXT: sbbl %edi, %esi
+; X86-NEXT: movl $0, %eax
+; X86-NEXT: cmovgel %eax, %ecx
; X86-NEXT: movl $-2147483648, %eax # imm = 0x80000000
; X86-NEXT: cmovgel %eax, %edx
-; X86-NEXT: movl %edi, %eax
+; X86-NEXT: movl %ecx, %eax
; X86-NEXT: leal -12(%ebp), %esp
; X86-NEXT: popl %esi
; X86-NEXT: popl %edi
@@ -800,371 +796,349 @@ define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; X86-NEXT: pushl %esi
; X86-NEXT: andl $-16, %esp
; X86-NEXT: subl $240, %esp
-; X86-NEXT: movl 20(%ebp), %esi
-; X86-NEXT: movl 36(%ebp), %ebx
-; X86-NEXT: movl 16(%ebp), %ecx
-; X86-NEXT: movl 32(%ebp), %edx
-; X86-NEXT: movl %edx, %edi
+; X86-NEXT: movl 40(%ebp), %ecx
+; X86-NEXT: movl 24(%ebp), %esi
+; X86-NEXT: movl %esi, %edi
; X86-NEXT: sarl $31, %edi
-; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %edx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sarl $31, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %ecx, %ebx
+; X86-NEXT: sarl $31, %ebx
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
; X86-NEXT: calll __modti3
; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl %ebx, %ecx
-; X86-NEXT: movl %ebx, %eax
-; X86-NEXT: sarl $31, %eax
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, %ebx
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %esi, %ecx
-; X86-NEXT: sarl $31, %esi
-; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl 40(%ebp), %eax
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: calll __divti3
; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: movl 20(%ebp), %ebx
+; X86-NEXT: movl %ebx, %esi
+; X86-NEXT: sarl $31, %esi
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl 36(%ebp), %eax
+; X86-NEXT: movl %eax, %edi
+; X86-NEXT: sarl $31, %edi
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 32(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 16(%ebp), %eax
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: calll __divti3
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: calll __modti3
; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, (%esp)
; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 36(%ebp), %eax
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 20(%ebp), %eax
+; X86-NEXT: movl 36(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: calll __modti3
+; X86-NEXT: calll __divti3
; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl 28(%ebp), %eax
+; X86-NEXT: movl 16(%ebp), %ebx
+; X86-NEXT: movl %ebx, %esi
+; X86-NEXT: sarl $31, %esi
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl 32(%ebp), %eax
; X86-NEXT: movl %eax, %edi
; X86-NEXT: sarl $31, %edi
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 12(%ebp), %eax
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: sarl $31, %esi
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
; X86-NEXT: calll __modti3
; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl 40(%ebp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sarl $31, %eax
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, %ebx
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 24(%ebp), %ecx
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sarl $31, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl 32(%ebp), %eax
+; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
; X86-NEXT: calll __divti3
; X86-NEXT: subl $4, %esp
+; X86-NEXT: movl 12(%ebp), %ecx
+; X86-NEXT: movl %ecx, %esi
+; X86-NEXT: sarl $31, %esi
+; X86-NEXT: sets {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl 28(%ebp), %eax
+; X86-NEXT: movl %eax, %edi
+; X86-NEXT: sarl $31, %edi
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 28(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 12(%ebp), %eax
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
-; X86-NEXT: calll __divti3
+; X86-NEXT: sets %bl
+; X86-NEXT: calll __modti3
; X86-NEXT: subl $4, %esp
-; X86-NEXT: movl 40(%ebp), %eax
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
-; X86-NEXT: movl 24(%ebp), %eax
-; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
; X86-NEXT: leal {{[0-9]+}}(%esp), %eax
; X86-NEXT: movl %eax, (%esp)
-; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; X86-NEXT: movl 12(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl 28(%ebp), %eax
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
; X86-NEXT: movl $0, {{[0-9]+}}(%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), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: sbbl $0, %eax
+; X86-NEXT: calll __divti3
+; X86-NEXT: subl $4, %esp
; 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: subl $1, %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), %edx
; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: sbbl $0, %edx
-; X86-NEXT: testl %edi, %edi
-; X86-NEXT: sets %bl
-; 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), %edi
-; X86-NEXT: orl {{[0-9]+}}(%esp), %edi
-; X86-NEXT: orl %esi, %edi
-; X86-NEXT: setne %bl
-; X86-NEXT: testb %bh, %bl
+; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: sbbl $0, %edi
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %bl # 1-byte Folded Reload
+; X86-NEXT: movb %bl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: orl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: orl %eax, %ebx
+; X86-NEXT: setne %al
+; X86-NEXT: testb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload
+; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 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: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
-; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
; X86-NEXT: xorl %ebx, %ebx
-; X86-NEXT: cmpl $-1, %edi
-; X86-NEXT: movl %eax, %esi
-; X86-NEXT: sbbl $0, %esi
-; X86-NEXT: movl %ecx, %esi
-; X86-NEXT: sbbl $0, %esi
-; X86-NEXT: movl %edx, %esi
-; X86-NEXT: sbbl $0, %esi
+; X86-NEXT: cmpl $-1, %ecx
+; X86-NEXT: movl %esi, %eax
+; X86-NEXT: sbbl $0, %eax
+; X86-NEXT: movl %edx, %eax
+; X86-NEXT: sbbl $0, %eax
+; X86-NEXT: movl %edi, %eax
+; X86-NEXT: sbbl $0, %eax
+; X86-NEXT: cmovgel %ebx, %edi
; X86-NEXT: cmovgel %ebx, %edx
+; X86-NEXT: cmovgel %ebx, %esi
+; X86-NEXT: movl $-1, %eax
+; X86-NEXT: cmovgel %eax, %ecx
+; X86-NEXT: movl %ecx, %eax
+; X86-NEXT: negl %eax
+; X86-NEXT: movl $-1, %eax
+; X86-NEXT: sbbl %esi, %eax
+; X86-NEXT: movl $-1, %eax
+; X86-NEXT: sbbl %edx, %eax
+; X86-NEXT: movl $-1, %eax
+; X86-NEXT: sbbl %edi, %eax
+; X86-NEXT: movl $-1, %eax
+; X86-NEXT: cmovgel %eax, %esi
; X86-NEXT: cmovgel %ebx, %ecx
-; X86-NEXT: cmovgel %ebx, %eax
-; X86-NEXT: movl $-1, %esi
-; X86-NEXT: cmovgel %esi, %edi
-; X86-NEXT: movl %edi, %esi
-; X86-NEXT: negl %esi
-; X86-NEXT: movl $-1, %esi
-; X86-NEXT: sbbl %eax, %esi
-; X86-NEXT: movl $-1, %esi
-; X86-NEXT: sbbl %ecx, %esi
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: sbbl %edx, %ecx
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: cmovgel %ecx, %eax
-; X86-NEXT: cmovgel %ebx, %edi
-; X86-NEXT: shrdl $1, %eax, %edi
-; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: shrdl $1, %esi, %ecx
+; X86-NEXT: movl %ecx, {{[-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), %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
-; X86-NEXT: sbbl $0, %eax
-; 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), %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: 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), %ecx
-; X86-NEXT: orl {{[0-9]+}}(%esp), %ecx
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; X86-NEXT: orl {{[0-9]+}}(%esp), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: setne %cl
-; X86-NEXT: testb %bh, %cl
-; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 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), %eax # 4-byte Folded Reload
-; 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: cmpl $-1, %esi
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sbbl $0, %ecx
-; X86-NEXT: movl %edi, %ecx
-; X86-NEXT: sbbl $0, %ecx
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: sbbl $0, %ecx
-; X86-NEXT: movl $0, %ecx
-; X86-NEXT: cmovgel %ecx, %edx
-; X86-NEXT: cmovgel %ecx, %edi
-; X86-NEXT: cmovgel %ecx, %eax
-; X86-NEXT: movl $-1, %ebx
-; X86-NEXT: cmovgel %ebx, %esi
-; X86-NEXT: movl %esi, %ecx
-; X86-NEXT: negl %ecx
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: sbbl %eax, %ecx
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: sbbl %edi, %ecx
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: sbbl %edx, %ecx
-; X86-NEXT: cmovgel %ebx, %eax
-; X86-NEXT: movl $0, %ecx
-; X86-NEXT: cmovgel %ecx, %esi
-; X86-NEXT: shrdl $1, %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: subl $1, %eax
-; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; 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 {{[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), %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: 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), %ecx
-; X86-NEXT: orl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; X86-NEXT: orl {{[0-9]+}}(%esp), %esi
-; X86-NEXT: orl %ecx, %esi
-; X86-NEXT: setne %cl
-; X86-NEXT: testb %bh, %cl
-; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
-; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: sbbl $0, %ecx
+; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 1-byte Folded Reload
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %dl # 1-byte Folded Reload
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: orl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: orl {{[0-9]+}}(%esp), %ebx
+; X86-NEXT: orl %edi, %ebx
+; X86-NEXT: setne %bl
+; X86-NEXT: testb %dl, %bl
+; 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: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
; X86-NEXT: cmpl $-1, %ebx
-; X86-NEXT: movl %eax, %ecx
-; X86-NEXT: sbbl $0, %ecx
-; X86-NEXT: movl %edi, %ecx
-; X86-NEXT: sbbl $0, %ecx
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: sbbl $0, %ecx
-; X86-NEXT: movl $0, %ecx
-; X86-NEXT: cmovgel %ecx, %edx
-; X86-NEXT: cmovgel %ecx, %edi
-; X86-NEXT: cmovgel %ecx, %eax
-; X86-NEXT: movl $-1, %esi
-; X86-NEXT: cmovgel %esi, %ebx
-; X86-NEXT: movl %ebx, %ecx
-; X86-NEXT: negl %ecx
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: sbbl %eax, %ecx
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: sbbl %edi, %ecx
-; X86-NEXT: movl $-1, %ecx
-; X86-NEXT: sbbl %edx, %ecx
-; X86-NEXT: cmovgel %esi, %eax
-; X86-NEXT: movl $0, %ecx
-; X86-NEXT: cmovgel %ecx, %ebx
-; X86-NEXT: shrdl $1, %eax, %ebx
+; X86-NEXT: movl %esi, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl %eax, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl $0, %edx
+; X86-NEXT: cmovgel %edx, %ecx
+; X86-NEXT: cmovgel %edx, %eax
+; X86-NEXT: cmovgel %edx, %esi
+; X86-NEXT: movl $-1, %edi
+; X86-NEXT: cmovgel %edi, %ebx
+; X86-NEXT: movl %ebx, %edx
+; X86-NEXT: negl %edx
+; X86-NEXT: movl $-1, %edx
+; X86-NEXT: sbbl %esi, %edx
+; X86-NEXT: movl $-1, %edx
+; X86-NEXT: sbbl %eax, %edx
+; X86-NEXT: movl $-1, %eax
+; X86-NEXT: sbbl %ecx, %eax
+; X86-NEXT: cmovgel %edi, %esi
+; X86-NEXT: movl $0, %eax
+; X86-NEXT: cmovgel %eax, %ebx
+; X86-NEXT: shrdl $1, %esi, %ebx
; X86-NEXT: movl %ebx, {{[-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: subl $1, %edi
; 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: subl $1, %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), %ebx
; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; X86-NEXT: sbbl $0, %ebx
-; 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 %cl
-; X86-NEXT: xorb %al, %cl
-; X86-NEXT: movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
-; X86-NEXT: calll __modti3
-; X86-NEXT: subl $4, %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: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
-; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: sbbl $0, %ecx
+; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 1-byte Folded Reload
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %dl # 1-byte Folded Reload
+; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
+; 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 %dl
+; X86-NEXT: testb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 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), %ebx # 4-byte Folded Reload
+; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; X86-NEXT: movl %esi, %edi
; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
; X86-NEXT: cmpl $-1, %edi
-; X86-NEXT: movl %esi, %eax
-; X86-NEXT: sbbl $0, %eax
-; X86-NEXT: movl %ecx, %eax
-; X86-NEXT: sbbl $0, %eax
-; X86-NEXT: movl %ebx, %eax
-; X86-NEXT: sbbl $0, %eax
-; X86-NEXT: movl $0, %eax
-; X86-NEXT: cmovgel %eax, %ebx
-; X86-NEXT: cmovgel %eax, %ecx
-; X86-NEXT: cmovgel %eax, %esi
+; X86-NEXT: movl %eax, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl %ebx, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl $0, %edx
+; X86-NEXT: cmovgel %edx, %ecx
+; X86-NEXT: cmovgel %edx, %ebx
+; X86-NEXT: cmovgel %edx, %eax
+; X86-NEXT: movl $-1, %esi
+; X86-NEXT: cmovgel %esi, %edi
+; X86-NEXT: movl %edi, %edx
+; X86-NEXT: negl %edx
; X86-NEXT: movl $-1, %edx
-; X86-NEXT: cmovgel %edx, %edi
-; X86-NEXT: movl %edi, %eax
-; X86-NEXT: negl %eax
-; X86-NEXT: movl $-1, %eax
-; X86-NEXT: sbbl %esi, %eax
-; X86-NEXT: movl $-1, %eax
-; X86-NEXT: sbbl %ecx, %eax
-; X86-NEXT: movl $-1, %eax
-; X86-NEXT: sbbl %ebx, %eax
+; X86-NEXT: sbbl %eax, %edx
+; X86-NEXT: movl $-1, %edx
+; X86-NEXT: sbbl %ebx, %edx
+; X86-NEXT: movl $-1, %edx
+; X86-NEXT: sbbl %ecx, %edx
+; X86-NEXT: cmovgel %esi, %eax
+; X86-NEXT: movl $0, %ecx
+; X86-NEXT: cmovgel %ecx, %edi
+; X86-NEXT: shrdl $1, %eax, %edi
+; X86-NEXT: movl %edi, {{[-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: subl $1, %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 {{[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), %ecx
+; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; X86-NEXT: sbbl $0, %ecx
+; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 1-byte Folded Reload
+; X86-NEXT: xorb {{[-0-9]+}}(%e{{[sb]}}p), %dl # 1-byte Folded Reload
+; X86-NEXT: movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: orl {{[0-9]+}}(%esp), %edx
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: orl {{[0-9]+}}(%esp), %edi
+; X86-NEXT: orl %edx, %edi
+; X86-NEXT: setne %dl
+; X86-NEXT: testb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload
+; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 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), %eax # 4-byte Folded Reload
+; X86-NEXT: cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
+; X86-NEXT: cmpl $-1, %ebx
+; X86-NEXT: movl %eax, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl %esi, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl %ecx, %edx
+; X86-NEXT: sbbl $0, %edx
+; X86-NEXT: movl $0, %edx
+; X86-NEXT: cmovgel %edx, %ecx
; X86-NEXT: cmovgel %edx, %esi
-; X86-NEXT: movl $0, %eax
-; X86-NEXT: cmovgel %eax, %edi
-; X86-NEXT: shrdl $1, %esi, %edi
+; X86-NEXT: cmovgel %edx, %eax
+; X86-NEXT: movl $-1, %edi
+; X86-NEXT: cmovgel %edi, %ebx
+; X86-NEXT: movl %ebx, %edx
+; X86-NEXT: negl %edx
+; X86-NEXT: movl $-1, %edx
+; X86-NEXT: sbbl %eax, %edx
+; X86-NEXT: movl $-1, %edx
+; X86-NEXT: sbbl %esi, %edx
+; X86-NEXT: movl $-1, %edx
+; X86-NEXT: sbbl %ecx, %edx
+; X86-NEXT: cmovgel %edi, %eax
+; X86-NEXT: movl $0, %ecx
+; X86-NEXT: cmovgel %ecx, %ebx
+; X86-NEXT: shrdl $1, %eax, %ebx
; X86-NEXT: movl 8(%ebp), %eax
-; X86-NEXT: movl %edi, 12(%eax)
+; X86-NEXT: movl %ebx, 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
diff --git a/llvm/test/CodeGen/X86/shift-rmw-flags.ll b/llvm/test/CodeGen/X86/shift-rmw-flags.ll
index 631afab38f078..b82b82c031f62 100644
--- a/llvm/test/CodeGen/X86/shift-rmw-flags.ll
+++ b/llvm/test/CodeGen/X86/shift-rmw-flags.ll
@@ -4,9 +4,7 @@
define i8 @test_lshr_rmw(ptr %p) {
; CHECK-LABEL: test_lshr_rmw:
; CHECK: # %bb.0:
-; CHECK-NEXT: movl (%rdi), %eax
-; CHECK-NEXT: shrl %eax
-; CHECK-NEXT: movl %eax, (%rdi)
+; CHECK-NEXT: shrl (%rdi)
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%v = load i32, ptr %p
@@ -20,9 +18,7 @@ define i8 @test_lshr_rmw(ptr %p) {
define i8 @test_shl_rmw(ptr %p) {
; CHECK-LABEL: test_shl_rmw:
; CHECK: # %bb.0:
-; CHECK-NEXT: movl (%rdi), %eax
-; CHECK-NEXT: addl %eax, %eax
-; CHECK-NEXT: movl %eax, (%rdi)
+; CHECK-NEXT: shll (%rdi)
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%v = load i32, ptr %p
@@ -36,9 +32,7 @@ define i8 @test_shl_rmw(ptr %p) {
define i8 @test_ashr_rmw(ptr %p) {
; CHECK-LABEL: test_ashr_rmw:
; CHECK: # %bb.0:
-; CHECK-NEXT: movl (%rdi), %eax
-; CHECK-NEXT: sarl %eax
-; CHECK-NEXT: movl %eax, (%rdi)
+; CHECK-NEXT: sarl (%rdi)
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%v = load i32, ptr %p
diff --git a/llvm/test/CodeGen/X86/xor.ll b/llvm/test/CodeGen/X86/xor.ll
index 2bef66825d8c0..eefb4c6c3cd7b 100644
--- a/llvm/test/CodeGen/X86/xor.ll
+++ b/llvm/test/CodeGen/X86/xor.ll
@@ -130,8 +130,7 @@ define i16 @test5(i16 %a, i16 %b) nounwind {
; X86-NEXT: movl %eax, %edx
; X86-NEXT: notl %edx
; X86-NEXT: andl %ecx, %edx
-; X86-NEXT: addl %edx, %edx
-; X86-NEXT: testw %dx, %dx
+; X86-NEXT: addw %dx, %dx
; X86-NEXT: movl %edx, %ecx
; X86-NEXT: jne .LBB4_1
; X86-NEXT: # %bb.2: # %bb12
@@ -148,8 +147,7 @@ define i16 @test5(i16 %a, i16 %b) nounwind {
; X64-LIN-NEXT: movl %eax, %ecx
; X64-LIN-NEXT: notl %ecx
; X64-LIN-NEXT: andl %esi, %ecx
-; X64-LIN-NEXT: addl %ecx, %ecx
-; X64-LIN-NEXT: testw %cx, %cx
+; X64-LIN-NEXT: addw %cx, %cx
; X64-LIN-NEXT: movl %ecx, %esi
; X64-LIN-NEXT: jne .LBB4_1
; X64-LIN-NEXT: # %bb.2: # %bb12
@@ -167,8 +165,7 @@ define i16 @test5(i16 %a, i16 %b) nounwind {
; X64-WIN-NEXT: movl %eax, %ecx
; X64-WIN-NEXT: notl %ecx
; X64-WIN-NEXT: andl %edx, %ecx
-; X64-WIN-NEXT: addl %ecx, %ecx
-; X64-WIN-NEXT: testw %cx, %cx
+; X64-WIN-NEXT: addw %cx, %cx
; X64-WIN-NEXT: movl %ecx, %edx
; X64-WIN-NEXT: jne .LBB4_1
; X64-WIN-NEXT: # %bb.2: # %bb12
More information about the llvm-commits
mailing list