xref: /llvm-project/llvm/test/CodeGen/X86/udiv_fix_sat.ll (revision a21abc782a8e1cb718a10c471a3b634f3102fc1c)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X64
3; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X86
4
5declare  i4  @llvm.udiv.fix.sat.i4   (i4,  i4,  i32)
6declare  i15 @llvm.udiv.fix.sat.i15  (i15, i15, i32)
7declare  i16 @llvm.udiv.fix.sat.i16  (i16, i16, i32)
8declare  i18 @llvm.udiv.fix.sat.i18  (i18, i18, i32)
9declare  i64 @llvm.udiv.fix.sat.i64  (i64, i64, i32)
10declare  <4 x i32> @llvm.udiv.fix.sat.v4i32(<4 x i32>, <4 x i32>, i32)
11
12define i16 @func(i16 %x, i16 %y) nounwind {
13; X64-LABEL: func:
14; X64:       # %bb.0:
15; X64-NEXT:    movzwl %si, %ecx
16; X64-NEXT:    movzwl %di, %eax
17; X64-NEXT:    shll $8, %eax
18; X64-NEXT:    xorl %edx, %edx
19; X64-NEXT:    divl %ecx
20; X64-NEXT:    cmpl $131071, %eax # imm = 0x1FFFF
21; X64-NEXT:    movl $131071, %ecx # imm = 0x1FFFF
22; X64-NEXT:    cmovael %ecx, %eax
23; X64-NEXT:    shrl %eax
24; X64-NEXT:    # kill: def $ax killed $ax killed $eax
25; X64-NEXT:    retq
26;
27; X86-LABEL: func:
28; X86:       # %bb.0:
29; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
30; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
31; X86-NEXT:    movzwl %ax, %eax
32; X86-NEXT:    shll $8, %eax
33; X86-NEXT:    xorl %edx, %edx
34; X86-NEXT:    divl %ecx
35; X86-NEXT:    cmpl $131071, %eax # imm = 0x1FFFF
36; X86-NEXT:    movl $131071, %ecx # imm = 0x1FFFF
37; X86-NEXT:    cmovael %ecx, %eax
38; X86-NEXT:    shrl %eax
39; X86-NEXT:    # kill: def $ax killed $ax killed $eax
40; X86-NEXT:    retl
41  %tmp = call i16 @llvm.udiv.fix.sat.i16(i16 %x, i16 %y, i32 7)
42  ret i16 %tmp
43}
44
45define i16 @func2(i8 %x, i8 %y) nounwind {
46; X64-LABEL: func2:
47; X64:       # %bb.0:
48; X64-NEXT:    movsbl %dil, %eax
49; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
50; X64-NEXT:    movsbl %sil, %ecx
51; X64-NEXT:    andl $32767, %ecx # imm = 0x7FFF
52; X64-NEXT:    shll $14, %eax
53; X64-NEXT:    xorl %edx, %edx
54; X64-NEXT:    divl %ecx
55; X64-NEXT:    cmpl $32767, %eax # imm = 0x7FFF
56; X64-NEXT:    movl $32767, %ecx # imm = 0x7FFF
57; X64-NEXT:    cmovbl %eax, %ecx
58; X64-NEXT:    addl %ecx, %ecx
59; X64-NEXT:    movswl %cx, %eax
60; X64-NEXT:    shrl %eax
61; X64-NEXT:    # kill: def $ax killed $ax killed $eax
62; X64-NEXT:    retq
63;
64; X86-LABEL: func2:
65; X86:       # %bb.0:
66; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx
67; X86-NEXT:    andl $32767, %ecx # imm = 0x7FFF
68; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
69; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
70; X86-NEXT:    shll $14, %eax
71; X86-NEXT:    xorl %edx, %edx
72; X86-NEXT:    divl %ecx
73; X86-NEXT:    cmpl $32767, %eax # imm = 0x7FFF
74; X86-NEXT:    movl $32767, %ecx # imm = 0x7FFF
75; X86-NEXT:    cmovbl %eax, %ecx
76; X86-NEXT:    addl %ecx, %ecx
77; X86-NEXT:    movswl %cx, %eax
78; X86-NEXT:    shrl %eax
79; X86-NEXT:    # kill: def $ax killed $ax killed $eax
80; X86-NEXT:    retl
81  %x2 = sext i8 %x to i15
82  %y2 = sext i8 %y to i15
83  %tmp = call i15 @llvm.udiv.fix.sat.i15(i15 %x2, i15 %y2, i32 14)
84  %tmp2 = sext i15 %tmp to i16
85  ret i16 %tmp2
86}
87
88define i16 @func3(i15 %x, i8 %y) nounwind {
89; X64-LABEL: func3:
90; X64:       # %bb.0:
91; X64-NEXT:    # kill: def $edi killed $edi def $rdi
92; X64-NEXT:    leal (%rdi,%rdi), %eax
93; X64-NEXT:    movzbl %sil, %ecx
94; X64-NEXT:    shll $4, %ecx
95; X64-NEXT:    # kill: def $ax killed $ax killed $eax
96; X64-NEXT:    xorl %edx, %edx
97; X64-NEXT:    divw %cx
98; X64-NEXT:    # kill: def $ax killed $ax def $eax
99; X64-NEXT:    movzwl %ax, %ecx
100; X64-NEXT:    cmpl $32767, %ecx # imm = 0x7FFF
101; X64-NEXT:    movl $32767, %ecx # imm = 0x7FFF
102; X64-NEXT:    cmovbl %eax, %ecx
103; X64-NEXT:    addl %ecx, %ecx
104; X64-NEXT:    movswl %cx, %eax
105; X64-NEXT:    shrl %eax
106; X64-NEXT:    # kill: def $ax killed $ax killed $eax
107; X64-NEXT:    retq
108;
109; X86-LABEL: func3:
110; X86:       # %bb.0:
111; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
112; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
113; X86-NEXT:    addl %eax, %eax
114; X86-NEXT:    movzbl %cl, %ecx
115; X86-NEXT:    shll $4, %ecx
116; X86-NEXT:    # kill: def $ax killed $ax killed $eax
117; X86-NEXT:    xorl %edx, %edx
118; X86-NEXT:    divw %cx
119; X86-NEXT:    # kill: def $ax killed $ax def $eax
120; X86-NEXT:    movzwl %ax, %ecx
121; X86-NEXT:    cmpl $32767, %ecx # imm = 0x7FFF
122; X86-NEXT:    movl $32767, %ecx # imm = 0x7FFF
123; X86-NEXT:    cmovbl %eax, %ecx
124; X86-NEXT:    addl %ecx, %ecx
125; X86-NEXT:    movswl %cx, %eax
126; X86-NEXT:    shrl %eax
127; X86-NEXT:    # kill: def $ax killed $ax killed $eax
128; X86-NEXT:    retl
129  %y2 = sext i8 %y to i15
130  %y3 = shl i15 %y2, 7
131  %tmp = call i15 @llvm.udiv.fix.sat.i15(i15 %x, i15 %y3, i32 4)
132  %tmp2 = sext i15 %tmp to i16
133  ret i16 %tmp2
134}
135
136define i4 @func4(i4 %x, i4 %y) nounwind {
137; X64-LABEL: func4:
138; X64:       # %bb.0:
139; X64-NEXT:    andb $15, %sil
140; X64-NEXT:    andb $15, %dil
141; X64-NEXT:    shlb $2, %dil
142; X64-NEXT:    movzbl %dil, %eax
143; X64-NEXT:    divb %sil
144; X64-NEXT:    movzbl %al, %ecx
145; X64-NEXT:    cmpb $15, %cl
146; X64-NEXT:    movl $15, %eax
147; X64-NEXT:    cmovbl %ecx, %eax
148; X64-NEXT:    # kill: def $al killed $al killed $eax
149; X64-NEXT:    retq
150;
151; X86-LABEL: func4:
152; X86:       # %bb.0:
153; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
154; X86-NEXT:    andb $15, %cl
155; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
156; X86-NEXT:    andb $15, %al
157; X86-NEXT:    shlb $2, %al
158; X86-NEXT:    movzbl %al, %eax
159; X86-NEXT:    divb %cl
160; X86-NEXT:    movzbl %al, %ecx
161; X86-NEXT:    cmpb $15, %al
162; X86-NEXT:    movl $15, %eax
163; X86-NEXT:    cmovbl %ecx, %eax
164; X86-NEXT:    # kill: def $al killed $al killed $eax
165; X86-NEXT:    retl
166  %tmp = call i4 @llvm.udiv.fix.sat.i4(i4 %x, i4 %y, i32 2)
167  ret i4 %tmp
168}
169
170define i64 @func5(i64 %x, i64 %y) nounwind {
171; X64-LABEL: func5:
172; X64:       # %bb.0:
173; X64-NEXT:    pushq %rax
174; X64-NEXT:    movq %rsi, %rdx
175; X64-NEXT:    leaq (%rdi,%rdi), %rax
176; X64-NEXT:    movq %rdi, %rsi
177; X64-NEXT:    shrq $63, %rsi
178; X64-NEXT:    shldq $31, %rax, %rsi
179; X64-NEXT:    shlq $32, %rdi
180; X64-NEXT:    xorl %ecx, %ecx
181; X64-NEXT:    callq __udivti3@PLT
182; X64-NEXT:    cmpq $2, %rdx
183; X64-NEXT:    movq $-1, %rcx
184; X64-NEXT:    cmovaeq %rcx, %rax
185; X64-NEXT:    movl $1, %ecx
186; X64-NEXT:    cmovbq %rdx, %rcx
187; X64-NEXT:    shrdq $1, %rcx, %rax
188; X64-NEXT:    popq %rcx
189; X64-NEXT:    retq
190;
191; X86-LABEL: func5:
192; X86:       # %bb.0:
193; X86-NEXT:    pushl %ebp
194; X86-NEXT:    movl %esp, %ebp
195; X86-NEXT:    pushl %esi
196; X86-NEXT:    andl $-16, %esp
197; X86-NEXT:    subl $32, %esp
198; X86-NEXT:    movl 8(%ebp), %eax
199; X86-NEXT:    movl 12(%ebp), %ecx
200; X86-NEXT:    movl %ecx, %edx
201; X86-NEXT:    shrl %edx
202; X86-NEXT:    shldl $31, %eax, %ecx
203; X86-NEXT:    shll $31, %eax
204; X86-NEXT:    movl %esp, %esi
205; X86-NEXT:    pushl $0
206; X86-NEXT:    pushl $0
207; X86-NEXT:    pushl 20(%ebp)
208; X86-NEXT:    pushl 16(%ebp)
209; X86-NEXT:    pushl $0
210; X86-NEXT:    pushl %edx
211; X86-NEXT:    pushl %ecx
212; X86-NEXT:    pushl %eax
213; X86-NEXT:    pushl %esi
214; X86-NEXT:    calll __udivti3
215; X86-NEXT:    addl $32, %esp
216; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
217; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
218; X86-NEXT:    movl $-1, %eax
219; X86-NEXT:    movl $-1, %edx
220; X86-NEXT:    jne .LBB4_2
221; X86-NEXT:  # %bb.1:
222; X86-NEXT:    movl (%esp), %eax
223; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
224; X86-NEXT:  .LBB4_2:
225; X86-NEXT:    leal -4(%ebp), %esp
226; X86-NEXT:    popl %esi
227; X86-NEXT:    popl %ebp
228; X86-NEXT:    retl
229  %tmp = call i64 @llvm.udiv.fix.sat.i64(i64 %x, i64 %y, i32 31)
230  ret i64 %tmp
231}
232
233define i18 @func6(i16 %x, i16 %y) nounwind {
234; X64-LABEL: func6:
235; X64:       # %bb.0:
236; X64-NEXT:    movswl %di, %eax
237; X64-NEXT:    andl $262143, %eax # imm = 0x3FFFF
238; X64-NEXT:    movswl %si, %ecx
239; X64-NEXT:    andl $262143, %ecx # imm = 0x3FFFF
240; X64-NEXT:    shll $7, %eax
241; X64-NEXT:    xorl %edx, %edx
242; X64-NEXT:    divl %ecx
243; X64-NEXT:    cmpl $262143, %eax # imm = 0x3FFFF
244; X64-NEXT:    movl $262143, %ecx # imm = 0x3FFFF
245; X64-NEXT:    cmovael %ecx, %eax
246; X64-NEXT:    retq
247;
248; X86-LABEL: func6:
249; X86:       # %bb.0:
250; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx
251; X86-NEXT:    andl $262143, %ecx # imm = 0x3FFFF
252; X86-NEXT:    movswl {{[0-9]+}}(%esp), %eax
253; X86-NEXT:    andl $262143, %eax # imm = 0x3FFFF
254; X86-NEXT:    shll $7, %eax
255; X86-NEXT:    xorl %edx, %edx
256; X86-NEXT:    divl %ecx
257; X86-NEXT:    cmpl $262143, %eax # imm = 0x3FFFF
258; X86-NEXT:    movl $262143, %ecx # imm = 0x3FFFF
259; X86-NEXT:    cmovael %ecx, %eax
260; X86-NEXT:    retl
261  %x2 = sext i16 %x to i18
262  %y2 = sext i16 %y to i18
263  %tmp = call i18 @llvm.udiv.fix.sat.i18(i18 %x2, i18 %y2, i32 7)
264  ret i18 %tmp
265}
266
267define i16 @func7(i16 %x, i16 %y) nounwind {
268; X64-LABEL: func7:
269; X64:       # %bb.0:
270; X64-NEXT:    movzwl %si, %ecx
271; X64-NEXT:    movzwl %di, %eax
272; X64-NEXT:    addl %eax, %eax
273; X64-NEXT:    shlq $16, %rax
274; X64-NEXT:    xorl %edx, %edx
275; X64-NEXT:    divq %rcx
276; X64-NEXT:    cmpq $131071, %rax # imm = 0x1FFFF
277; X64-NEXT:    movl $131071, %ecx # imm = 0x1FFFF
278; X64-NEXT:    cmovaeq %rcx, %rax
279; X64-NEXT:    shrl %eax
280; X64-NEXT:    # kill: def $ax killed $ax killed $rax
281; X64-NEXT:    retq
282;
283; X86-LABEL: func7:
284; X86:       # %bb.0:
285; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
286; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
287; X86-NEXT:    movl %ecx, %edx
288; X86-NEXT:    shll $17, %edx
289; X86-NEXT:    shrl $15, %ecx
290; X86-NEXT:    andl $1, %ecx
291; X86-NEXT:    pushl $0
292; X86-NEXT:    pushl %eax
293; X86-NEXT:    pushl %ecx
294; X86-NEXT:    pushl %edx
295; X86-NEXT:    calll __udivdi3
296; X86-NEXT:    addl $16, %esp
297; X86-NEXT:    cmpl $131071, %eax # imm = 0x1FFFF
298; X86-NEXT:    movl $131071, %ecx # imm = 0x1FFFF
299; X86-NEXT:    cmovael %ecx, %eax
300; X86-NEXT:    testl %edx, %edx
301; X86-NEXT:    cmovnel %ecx, %eax
302; X86-NEXT:    shrl %eax
303; X86-NEXT:    # kill: def $ax killed $ax killed $eax
304; X86-NEXT:    retl
305  %tmp = call i16 @llvm.udiv.fix.sat.i16(i16 %x, i16 %y, i32 16)
306  ret i16 %tmp
307}
308
309define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
310; X64-LABEL: vec:
311; X64:       # %bb.0:
312; X64-NEXT:    pxor %xmm2, %xmm2
313; X64-NEXT:    pxor %xmm3, %xmm3
314; X64-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm0[2],xmm3[3],xmm0[3]
315; X64-NEXT:    movq %xmm3, %rax
316; X64-NEXT:    movdqa %xmm1, %xmm4
317; X64-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm2[2],xmm4[3],xmm2[3]
318; X64-NEXT:    movq %xmm4, %rcx
319; X64-NEXT:    xorl %edx, %edx
320; X64-NEXT:    divq %rcx
321; X64-NEXT:    movq %rax, %xmm8
322; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
323; X64-NEXT:    movq %xmm3, %rax
324; X64-NEXT:    movdqa %xmm1, %xmm3
325; X64-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
326; X64-NEXT:    movq %xmm3, %rcx
327; X64-NEXT:    xorl %edx, %edx
328; X64-NEXT:    divq %rcx
329; X64-NEXT:    movq %rax, %xmm3
330; X64-NEXT:    punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm3[0]
331; X64-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
332; X64-NEXT:    movdqa %xmm8, %xmm3
333; X64-NEXT:    pxor %xmm4, %xmm3
334; X64-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
335; X64-NEXT:    movdqa {{.*#+}} xmm7 = [2147483649,2147483649,2147483649,2147483649]
336; X64-NEXT:    pcmpeqd %xmm7, %xmm6
337; X64-NEXT:    movdqa {{.*#+}} xmm5 = [9223372043297226751,9223372043297226751]
338; X64-NEXT:    movdqa %xmm5, %xmm9
339; X64-NEXT:    pcmpgtd %xmm3, %xmm9
340; X64-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
341; X64-NEXT:    pand %xmm6, %xmm10
342; X64-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[1,1,3,3]
343; X64-NEXT:    por %xmm10, %xmm3
344; X64-NEXT:    pcmpeqd %xmm6, %xmm6
345; X64-NEXT:    pand %xmm3, %xmm8
346; X64-NEXT:    pxor %xmm6, %xmm3
347; X64-NEXT:    por %xmm8, %xmm3
348; X64-NEXT:    psrlq $1, %xmm3
349; X64-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
350; X64-NEXT:    movq %xmm2, %rax
351; X64-NEXT:    movd %xmm1, %ecx
352; X64-NEXT:    xorl %edx, %edx
353; X64-NEXT:    divq %rcx
354; X64-NEXT:    movq %rax, %xmm8
355; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
356; X64-NEXT:    movq %xmm0, %rax
357; X64-NEXT:    psrlq $32, %xmm1
358; X64-NEXT:    movq %xmm1, %rcx
359; X64-NEXT:    xorl %edx, %edx
360; X64-NEXT:    divq %rcx
361; X64-NEXT:    movq %rax, %xmm0
362; X64-NEXT:    punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm0[0]
363; X64-NEXT:    pxor %xmm8, %xmm4
364; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
365; X64-NEXT:    pcmpeqd %xmm7, %xmm0
366; X64-NEXT:    pcmpgtd %xmm4, %xmm5
367; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
368; X64-NEXT:    pand %xmm0, %xmm1
369; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
370; X64-NEXT:    por %xmm1, %xmm0
371; X64-NEXT:    pxor %xmm0, %xmm6
372; X64-NEXT:    pand %xmm8, %xmm0
373; X64-NEXT:    por %xmm6, %xmm0
374; X64-NEXT:    psrlq $1, %xmm0
375; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
376; X64-NEXT:    retq
377;
378; X86-LABEL: vec:
379; X86:       # %bb.0:
380; X86-NEXT:    pushl %ebp
381; X86-NEXT:    pushl %ebx
382; X86-NEXT:    pushl %edi
383; X86-NEXT:    pushl %esi
384; X86-NEXT:    subl $8, %esp
385; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
386; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
387; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
388; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
389; X86-NEXT:    leal (%eax,%eax), %ecx
390; X86-NEXT:    shrl $31, %eax
391; X86-NEXT:    shldl $31, %ecx, %eax
392; X86-NEXT:    pushl $0
393; X86-NEXT:    pushl {{[0-9]+}}(%esp)
394; X86-NEXT:    pushl %eax
395; X86-NEXT:    pushl $0
396; X86-NEXT:    calll __udivdi3
397; X86-NEXT:    addl $16, %esp
398; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
399; X86-NEXT:    movl %edx, %edi
400; X86-NEXT:    leal (%ebx,%ebx), %eax
401; X86-NEXT:    shrl $31, %ebx
402; X86-NEXT:    shldl $31, %eax, %ebx
403; X86-NEXT:    pushl $0
404; X86-NEXT:    pushl %ebp
405; X86-NEXT:    pushl %ebx
406; X86-NEXT:    pushl $0
407; X86-NEXT:    calll __udivdi3
408; X86-NEXT:    addl $16, %esp
409; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
410; X86-NEXT:    movl %edx, %ebx
411; X86-NEXT:    leal (%esi,%esi), %eax
412; X86-NEXT:    shrl $31, %esi
413; X86-NEXT:    shldl $31, %eax, %esi
414; X86-NEXT:    pushl $0
415; X86-NEXT:    pushl {{[0-9]+}}(%esp)
416; X86-NEXT:    pushl %esi
417; X86-NEXT:    pushl $0
418; X86-NEXT:    calll __udivdi3
419; X86-NEXT:    addl $16, %esp
420; X86-NEXT:    movl %edx, %esi
421; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
422; X86-NEXT:    leal (%edx,%edx), %ecx
423; X86-NEXT:    shrl $31, %edx
424; X86-NEXT:    shldl $31, %ecx, %edx
425; X86-NEXT:    movl %edx, %ecx
426; X86-NEXT:    cmpl $2, %esi
427; X86-NEXT:    movl $-1, %edx
428; X86-NEXT:    cmovael %edx, %eax
429; X86-NEXT:    movl $1, %ebp
430; X86-NEXT:    cmovael %ebp, %esi
431; X86-NEXT:    shldl $31, %eax, %esi
432; X86-NEXT:    cmpl $2, %ebx
433; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
434; X86-NEXT:    cmovael %edx, %eax
435; X86-NEXT:    cmovael %ebp, %ebx
436; X86-NEXT:    shldl $31, %eax, %ebx
437; X86-NEXT:    cmpl $2, %edi
438; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
439; X86-NEXT:    cmovael %edx, %eax
440; X86-NEXT:    cmovael %ebp, %edi
441; X86-NEXT:    shldl $31, %eax, %edi
442; X86-NEXT:    pushl $0
443; X86-NEXT:    pushl {{[0-9]+}}(%esp)
444; X86-NEXT:    pushl %ecx
445; X86-NEXT:    pushl $0
446; X86-NEXT:    calll __udivdi3
447; X86-NEXT:    addl $16, %esp
448; X86-NEXT:    cmpl $2, %edx
449; X86-NEXT:    movl $-1, %ecx
450; X86-NEXT:    cmovael %ecx, %eax
451; X86-NEXT:    cmovbl %edx, %ebp
452; X86-NEXT:    shldl $31, %eax, %ebp
453; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
454; X86-NEXT:    movl %ebp, 12(%eax)
455; X86-NEXT:    movl %edi, 8(%eax)
456; X86-NEXT:    movl %ebx, 4(%eax)
457; X86-NEXT:    movl %esi, (%eax)
458; X86-NEXT:    addl $8, %esp
459; X86-NEXT:    popl %esi
460; X86-NEXT:    popl %edi
461; X86-NEXT:    popl %ebx
462; X86-NEXT:    popl %ebp
463; X86-NEXT:    retl $4
464  %tmp = call <4 x i32> @llvm.udiv.fix.sat.v4i32(<4 x i32> %x, <4 x i32> %y, i32 31)
465  ret <4 x i32> %tmp
466}
467