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.sdiv.fix.sat.i4   (i4,  i4,  i32)
6declare  i15 @llvm.sdiv.fix.sat.i15  (i15, i15, i32)
7declare  i16 @llvm.sdiv.fix.sat.i16  (i16, i16, i32)
8declare  i18 @llvm.sdiv.fix.sat.i18  (i18, i18, i32)
9declare  i64 @llvm.sdiv.fix.sat.i64  (i64, i64, i32)
10declare  <4 x i32> @llvm.sdiv.fix.sat.v4i32(<4 x i32>, <4 x i32>, i32)
11
12define i16 @func(i16 %x, i16 %y) nounwind {
13;
14; X64-LABEL: func:
15; X64:       # %bb.0:
16; X64-NEXT:    movswl %si, %esi
17; X64-NEXT:    movswl %di, %ecx
18; X64-NEXT:    shll $8, %ecx
19; X64-NEXT:    movl %ecx, %eax
20; X64-NEXT:    cltd
21; X64-NEXT:    idivl %esi
22; X64-NEXT:    # kill: def $eax killed $eax def $rax
23; X64-NEXT:    leal -1(%rax), %edi
24; X64-NEXT:    testl %esi, %esi
25; X64-NEXT:    sets %sil
26; X64-NEXT:    testl %ecx, %ecx
27; X64-NEXT:    sets %cl
28; X64-NEXT:    xorb %sil, %cl
29; X64-NEXT:    testl %edx, %edx
30; X64-NEXT:    setne %dl
31; X64-NEXT:    testb %cl, %dl
32; X64-NEXT:    cmovnel %edi, %eax
33; X64-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
34; X64-NEXT:    movl $65535, %ecx # imm = 0xFFFF
35; X64-NEXT:    cmovgel %ecx, %eax
36; X64-NEXT:    cmpl $-65535, %eax # imm = 0xFFFF0001
37; X64-NEXT:    movl $-65536, %ecx # imm = 0xFFFF0000
38; X64-NEXT:    cmovll %ecx, %eax
39; X64-NEXT:    shrl %eax
40; X64-NEXT:    # kill: def $ax killed $ax killed $rax
41; X64-NEXT:    retq
42;
43; X86-LABEL: func:
44; X86:       # %bb.0:
45; X86-NEXT:    pushl %ebx
46; X86-NEXT:    pushl %edi
47; X86-NEXT:    pushl %esi
48; X86-NEXT:    movswl {{[0-9]+}}(%esp), %esi
49; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx
50; X86-NEXT:    shll $8, %ecx
51; X86-NEXT:    movl %ecx, %eax
52; X86-NEXT:    cltd
53; X86-NEXT:    idivl %esi
54; X86-NEXT:    leal -1(%eax), %edi
55; X86-NEXT:    testl %esi, %esi
56; X86-NEXT:    sets %bl
57; X86-NEXT:    testl %ecx, %ecx
58; X86-NEXT:    sets %cl
59; X86-NEXT:    xorb %bl, %cl
60; X86-NEXT:    testl %edx, %edx
61; X86-NEXT:    setne %dl
62; X86-NEXT:    testb %cl, %dl
63; X86-NEXT:    cmovnel %edi, %eax
64; X86-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
65; X86-NEXT:    movl $65535, %ecx # imm = 0xFFFF
66; X86-NEXT:    cmovgel %ecx, %eax
67; X86-NEXT:    cmpl $-65535, %eax # imm = 0xFFFF0001
68; X86-NEXT:    movl $-65536, %ecx # imm = 0xFFFF0000
69; X86-NEXT:    cmovll %ecx, %eax
70; X86-NEXT:    shrl %eax
71; X86-NEXT:    # kill: def $ax killed $ax killed $eax
72; X86-NEXT:    popl %esi
73; X86-NEXT:    popl %edi
74; X86-NEXT:    popl %ebx
75; X86-NEXT:    retl
76  %tmp = call i16 @llvm.sdiv.fix.sat.i16(i16 %x, i16 %y, i32 7)
77  ret i16 %tmp
78}
79
80define i16 @func2(i8 %x, i8 %y) nounwind {
81;
82; X64-LABEL: func2:
83; X64:       # %bb.0:
84; X64-NEXT:    movsbl %dil, %eax
85; X64-NEXT:    movsbl %sil, %ecx
86; X64-NEXT:    movswl %cx, %esi
87; X64-NEXT:    movswl %ax, %ecx
88; X64-NEXT:    shll $14, %ecx
89; X64-NEXT:    movl %ecx, %eax
90; X64-NEXT:    cltd
91; X64-NEXT:    idivl %esi
92; X64-NEXT:    # kill: def $eax killed $eax def $rax
93; X64-NEXT:    leal -1(%rax), %edi
94; X64-NEXT:    testl %esi, %esi
95; X64-NEXT:    sets %sil
96; X64-NEXT:    testl %ecx, %ecx
97; X64-NEXT:    sets %cl
98; X64-NEXT:    xorb %sil, %cl
99; X64-NEXT:    testl %edx, %edx
100; X64-NEXT:    setne %dl
101; X64-NEXT:    testb %cl, %dl
102; X64-NEXT:    cmovnel %edi, %eax
103; X64-NEXT:    cmpl $16383, %eax # imm = 0x3FFF
104; X64-NEXT:    movl $16383, %ecx # imm = 0x3FFF
105; X64-NEXT:    cmovgel %ecx, %eax
106; X64-NEXT:    cmpl $-16383, %eax # imm = 0xC001
107; X64-NEXT:    movl $-16384, %ecx # imm = 0xC000
108; X64-NEXT:    cmovll %ecx, %eax
109; X64-NEXT:    # kill: def $ax killed $ax killed $rax
110; X64-NEXT:    retq
111;
112; X86-LABEL: func2:
113; X86:       # %bb.0:
114; X86-NEXT:    pushl %ebx
115; X86-NEXT:    pushl %edi
116; X86-NEXT:    pushl %esi
117; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %esi
118; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx
119; X86-NEXT:    shll $14, %ecx
120; X86-NEXT:    movl %ecx, %eax
121; X86-NEXT:    cltd
122; X86-NEXT:    idivl %esi
123; X86-NEXT:    leal -1(%eax), %edi
124; X86-NEXT:    testl %esi, %esi
125; X86-NEXT:    sets %bl
126; X86-NEXT:    testl %ecx, %ecx
127; X86-NEXT:    sets %cl
128; X86-NEXT:    xorb %bl, %cl
129; X86-NEXT:    testl %edx, %edx
130; X86-NEXT:    setne %dl
131; X86-NEXT:    testb %cl, %dl
132; X86-NEXT:    cmovnel %edi, %eax
133; X86-NEXT:    cmpl $16383, %eax # imm = 0x3FFF
134; X86-NEXT:    movl $16383, %ecx # imm = 0x3FFF
135; X86-NEXT:    cmovgel %ecx, %eax
136; X86-NEXT:    cmpl $-16383, %eax # imm = 0xC001
137; X86-NEXT:    movl $-16384, %ecx # imm = 0xC000
138; X86-NEXT:    cmovll %ecx, %eax
139; X86-NEXT:    # kill: def $ax killed $ax killed $eax
140; X86-NEXT:    popl %esi
141; X86-NEXT:    popl %edi
142; X86-NEXT:    popl %ebx
143; X86-NEXT:    retl
144  %x2 = sext i8 %x to i15
145  %y2 = sext i8 %y to i15
146  %tmp = call i15 @llvm.sdiv.fix.sat.i15(i15 %x2, i15 %y2, i32 14)
147  %tmp2 = sext i15 %tmp to i16
148  ret i16 %tmp2
149}
150
151define i16 @func3(i15 %x, i8 %y) nounwind {
152;
153; X64-LABEL: func3:
154; X64:       # %bb.0:
155; X64-NEXT:    shll $8, %esi
156; X64-NEXT:    movswl %si, %ecx
157; X64-NEXT:    addl %edi, %edi
158; X64-NEXT:    shrl $4, %ecx
159; X64-NEXT:    movl %edi, %eax
160; X64-NEXT:    cwtd
161; X64-NEXT:    idivw %cx
162; X64-NEXT:    # kill: def $ax killed $ax def $rax
163; X64-NEXT:    leal -1(%rax), %esi
164; X64-NEXT:    testw %di, %di
165; X64-NEXT:    sets %dil
166; X64-NEXT:    testw %cx, %cx
167; X64-NEXT:    sets %cl
168; X64-NEXT:    xorb %dil, %cl
169; X64-NEXT:    testw %dx, %dx
170; X64-NEXT:    setne %dl
171; X64-NEXT:    testb %cl, %dl
172; X64-NEXT:    cmovnel %esi, %eax
173; X64-NEXT:    movswl %ax, %ecx
174; X64-NEXT:    cmpl $16383, %ecx # imm = 0x3FFF
175; X64-NEXT:    movl $16383, %ecx # imm = 0x3FFF
176; X64-NEXT:    cmovgel %ecx, %eax
177; X64-NEXT:    movswl %ax, %ecx
178; X64-NEXT:    cmpl $-16383, %ecx # imm = 0xC001
179; X64-NEXT:    movl $49152, %ecx # imm = 0xC000
180; X64-NEXT:    cmovll %ecx, %eax
181; X64-NEXT:    # kill: def $ax killed $ax killed $rax
182; X64-NEXT:    retq
183;
184; X86-LABEL: func3:
185; X86:       # %bb.0:
186; X86-NEXT:    pushl %edi
187; X86-NEXT:    pushl %esi
188; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
189; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
190; X86-NEXT:    shll $8, %eax
191; X86-NEXT:    movswl %ax, %esi
192; X86-NEXT:    addl %ecx, %ecx
193; X86-NEXT:    shrl $4, %esi
194; X86-NEXT:    movl %ecx, %eax
195; X86-NEXT:    cwtd
196; X86-NEXT:    idivw %si
197; X86-NEXT:    # kill: def $ax killed $ax def $eax
198; X86-NEXT:    leal -1(%eax), %edi
199; X86-NEXT:    testw %cx, %cx
200; X86-NEXT:    sets %cl
201; X86-NEXT:    testw %si, %si
202; X86-NEXT:    sets %ch
203; X86-NEXT:    xorb %cl, %ch
204; X86-NEXT:    testw %dx, %dx
205; X86-NEXT:    setne %cl
206; X86-NEXT:    testb %ch, %cl
207; X86-NEXT:    cmovnel %edi, %eax
208; X86-NEXT:    movswl %ax, %ecx
209; X86-NEXT:    cmpl $16383, %ecx # imm = 0x3FFF
210; X86-NEXT:    movl $16383, %ecx # imm = 0x3FFF
211; X86-NEXT:    cmovgel %ecx, %eax
212; X86-NEXT:    movswl %ax, %ecx
213; X86-NEXT:    cmpl $-16383, %ecx # imm = 0xC001
214; X86-NEXT:    movl $49152, %ecx # imm = 0xC000
215; X86-NEXT:    cmovll %ecx, %eax
216; X86-NEXT:    # kill: def $ax killed $ax killed $eax
217; X86-NEXT:    popl %esi
218; X86-NEXT:    popl %edi
219; X86-NEXT:    retl
220  %y2 = sext i8 %y to i15
221  %y3 = shl i15 %y2, 7
222  %tmp = call i15 @llvm.sdiv.fix.sat.i15(i15 %x, i15 %y3, i32 4)
223  %tmp2 = sext i15 %tmp to i16
224  ret i16 %tmp2
225}
226
227define i4 @func4(i4 %x, i4 %y) nounwind {
228;
229; X64-LABEL: func4:
230; X64:       # %bb.0:
231; X64-NEXT:    pushq %rbx
232; X64-NEXT:    shlb $4, %sil
233; X64-NEXT:    sarb $4, %sil
234; X64-NEXT:    shlb $4, %dil
235; X64-NEXT:    sarb $4, %dil
236; X64-NEXT:    shlb $2, %dil
237; X64-NEXT:    movsbl %dil, %ecx
238; X64-NEXT:    movl %ecx, %eax
239; X64-NEXT:    idivb %sil
240; X64-NEXT:    movsbl %ah, %ebx
241; X64-NEXT:    movzbl %al, %eax
242; X64-NEXT:    leal -1(%rax), %edi
243; X64-NEXT:    movzbl %dil, %edi
244; X64-NEXT:    testb %sil, %sil
245; X64-NEXT:    sets %dl
246; X64-NEXT:    testb %cl, %cl
247; X64-NEXT:    sets %cl
248; X64-NEXT:    xorb %dl, %cl
249; X64-NEXT:    testb %bl, %bl
250; X64-NEXT:    setne %dl
251; X64-NEXT:    testb %cl, %dl
252; X64-NEXT:    cmovel %eax, %edi
253; X64-NEXT:    cmpb $7, %dil
254; X64-NEXT:    movl $7, %ecx
255; X64-NEXT:    cmovll %edi, %ecx
256; X64-NEXT:    cmpb $-7, %cl
257; X64-NEXT:    movl $248, %eax
258; X64-NEXT:    cmovgel %ecx, %eax
259; X64-NEXT:    # kill: def $al killed $al killed $eax
260; X64-NEXT:    popq %rbx
261; X64-NEXT:    retq
262;
263; X86-LABEL: func4:
264; X86:       # %bb.0:
265; X86-NEXT:    pushl %ebx
266; X86-NEXT:    pushl %esi
267; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
268; X86-NEXT:    shlb $4, %cl
269; X86-NEXT:    sarb $4, %cl
270; X86-NEXT:    movb {{[0-9]+}}(%esp), %dl
271; X86-NEXT:    shlb $4, %dl
272; X86-NEXT:    sarb $4, %dl
273; X86-NEXT:    shlb $2, %dl
274; X86-NEXT:    movsbl %dl, %eax
275; X86-NEXT:    idivb %cl
276; X86-NEXT:    movsbl %ah, %ebx
277; X86-NEXT:    movzbl %al, %esi
278; X86-NEXT:    decb %al
279; X86-NEXT:    movzbl %al, %eax
280; X86-NEXT:    testb %cl, %cl
281; X86-NEXT:    sets %cl
282; X86-NEXT:    testb %dl, %dl
283; X86-NEXT:    sets %dl
284; X86-NEXT:    xorb %cl, %dl
285; X86-NEXT:    testb %bl, %bl
286; X86-NEXT:    setne %cl
287; X86-NEXT:    testb %dl, %cl
288; X86-NEXT:    cmovel %esi, %eax
289; X86-NEXT:    cmpb $7, %al
290; X86-NEXT:    movl $7, %ecx
291; X86-NEXT:    cmovll %eax, %ecx
292; X86-NEXT:    cmpb $-7, %cl
293; X86-NEXT:    movl $248, %eax
294; X86-NEXT:    cmovgel %ecx, %eax
295; X86-NEXT:    # kill: def $al killed $al killed $eax
296; X86-NEXT:    popl %esi
297; X86-NEXT:    popl %ebx
298; X86-NEXT:    retl
299  %tmp = call i4 @llvm.sdiv.fix.sat.i4(i4 %x, i4 %y, i32 2)
300  ret i4 %tmp
301}
302
303define i64 @func5(i64 %x, i64 %y) nounwind {
304;
305; X64-LABEL: func5:
306; X64:       # %bb.0:
307; X64-NEXT:    pushq %rbp
308; X64-NEXT:    pushq %r15
309; X64-NEXT:    pushq %r14
310; X64-NEXT:    pushq %r13
311; X64-NEXT:    pushq %r12
312; X64-NEXT:    pushq %rbx
313; X64-NEXT:    subq $24, %rsp
314; X64-NEXT:    movq %rsi, %rdx
315; X64-NEXT:    movq %rsi, (%rsp) # 8-byte Spill
316; X64-NEXT:    movq %rdi, %r15
317; X64-NEXT:    leaq (%rdi,%rdi), %rax
318; X64-NEXT:    movq %rdi, %r12
319; X64-NEXT:    sarq $63, %r12
320; X64-NEXT:    shldq $31, %rax, %r12
321; X64-NEXT:    shlq $32, %r15
322; X64-NEXT:    movq %rsi, %r13
323; X64-NEXT:    sarq $63, %r13
324; X64-NEXT:    movq %r15, %rdi
325; X64-NEXT:    movq %r12, %rsi
326; X64-NEXT:    movq %r13, %rcx
327; X64-NEXT:    callq __divti3@PLT
328; X64-NEXT:    movq %rax, %rbx
329; X64-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
330; X64-NEXT:    movq %rdx, %rbp
331; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
332; X64-NEXT:    subq $1, %rbx
333; X64-NEXT:    sbbq $0, %rbp
334; X64-NEXT:    testq %r12, %r12
335; X64-NEXT:    sets %al
336; X64-NEXT:    testq %r13, %r13
337; X64-NEXT:    sets %r14b
338; X64-NEXT:    xorb %al, %r14b
339; X64-NEXT:    movq %r15, %rdi
340; X64-NEXT:    movq %r12, %rsi
341; X64-NEXT:    movq (%rsp), %rdx # 8-byte Reload
342; X64-NEXT:    movq %r13, %rcx
343; X64-NEXT:    callq __modti3@PLT
344; X64-NEXT:    orq %rax, %rdx
345; X64-NEXT:    setne %al
346; X64-NEXT:    testb %r14b, %al
347; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload
348; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload
349; X64-NEXT:    xorl %eax, %eax
350; X64-NEXT:    testq %rbp, %rbp
351; X64-NEXT:    cmovnsq %rax, %rbp
352; X64-NEXT:    movq $-1, %rcx
353; X64-NEXT:    cmovgq %rcx, %rbx
354; X64-NEXT:    testq %rbp, %rbp
355; X64-NEXT:    cmovnsq %rbp, %rcx
356; X64-NEXT:    cmpq $-1, %rbp
357; X64-NEXT:    cmovlq %rax, %rbx
358; X64-NEXT:    shrdq $1, %rcx, %rbx
359; X64-NEXT:    movq %rbx, %rax
360; X64-NEXT:    addq $24, %rsp
361; X64-NEXT:    popq %rbx
362; X64-NEXT:    popq %r12
363; X64-NEXT:    popq %r13
364; X64-NEXT:    popq %r14
365; X64-NEXT:    popq %r15
366; X64-NEXT:    popq %rbp
367; X64-NEXT:    retq
368;
369; X86-LABEL: func5:
370; X86:       # %bb.0:
371; X86-NEXT:    pushl %ebp
372; X86-NEXT:    movl %esp, %ebp
373; X86-NEXT:    pushl %ebx
374; X86-NEXT:    pushl %edi
375; X86-NEXT:    pushl %esi
376; X86-NEXT:    andl $-8, %esp
377; X86-NEXT:    subl $88, %esp
378; X86-NEXT:    movl 8(%ebp), %ecx
379; X86-NEXT:    movl 12(%ebp), %eax
380; X86-NEXT:    movl 20(%ebp), %edi
381; X86-NEXT:    sarl $31, %edi
382; X86-NEXT:    movl %eax, %ebx
383; X86-NEXT:    sarl $31, %ebx
384; X86-NEXT:    movl %ebx, %edx
385; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
386; X86-NEXT:    shldl $31, %eax, %edx
387; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
388; X86-NEXT:    shldl $31, %ecx, %eax
389; X86-NEXT:    movl %eax, %esi
390; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
391; X86-NEXT:    shll $31, %ecx
392; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
393; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
394; X86-NEXT:    pushl %edi
395; X86-NEXT:    pushl %edi
396; X86-NEXT:    pushl 20(%ebp)
397; X86-NEXT:    pushl 16(%ebp)
398; X86-NEXT:    pushl %ebx
399; X86-NEXT:    pushl %edx
400; X86-NEXT:    pushl %esi
401; X86-NEXT:    pushl %ecx
402; X86-NEXT:    pushl %eax
403; X86-NEXT:    calll __divti3
404; X86-NEXT:    addl $32, %esp
405; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
406; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
407; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
408; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
409; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
410; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
411; X86-NEXT:    subl $1, %esi
412; X86-NEXT:    movl %ecx, %eax
413; X86-NEXT:    sbbl $0, %eax
414; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
415; X86-NEXT:    movl %edx, %eax
416; X86-NEXT:    sbbl $0, %eax
417; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
418; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
419; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
420; X86-NEXT:    sbbl $0, %ebx
421; X86-NEXT:    testl %edi, %edi
422; X86-NEXT:    sets %al
423; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
424; X86-NEXT:    testl %ecx, %ecx
425; X86-NEXT:    sets %dl
426; X86-NEXT:    xorb %al, %dl
427; X86-NEXT:    movb %dl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
428; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
429; X86-NEXT:    pushl %edi
430; X86-NEXT:    pushl %edi
431; X86-NEXT:    pushl 20(%ebp)
432; X86-NEXT:    pushl 16(%ebp)
433; X86-NEXT:    pushl %ecx
434; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
435; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
436; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
437; X86-NEXT:    pushl %eax
438; X86-NEXT:    calll __modti3
439; X86-NEXT:    addl $32, %esp
440; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
441; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
442; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
443; X86-NEXT:    orl {{[0-9]+}}(%esp), %ecx
444; X86-NEXT:    orl %eax, %ecx
445; X86-NEXT:    setne %al
446; X86-NEXT:    testb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload
447; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
448; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
449; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
450; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
451; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
452; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
453; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
454; X86-NEXT:    testl %ebx, %ebx
455; X86-NEXT:    movl $0, %eax
456; X86-NEXT:    cmovsl %ebx, %eax
457; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
458; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
459; X86-NEXT:    cmovsl %edx, %eax
460; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
461; X86-NEXT:    movl $-1, %eax
462; X86-NEXT:    cmovsl %esi, %eax
463; X86-NEXT:    movl %ebx, %edi
464; X86-NEXT:    sarl $31, %edi
465; X86-NEXT:    andl %ecx, %edi
466; X86-NEXT:    testl %ebx, %ebx
467; X86-NEXT:    cmovel %ebx, %edi
468; X86-NEXT:    movl %edx, %ecx
469; X86-NEXT:    cmpl $2147483647, %edx # imm = 0x7FFFFFFF
470; X86-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
471; X86-NEXT:    cmovbl %ecx, %edx
472; X86-NEXT:    testl %ecx, %ecx
473; X86-NEXT:    movl $-1, %ecx
474; X86-NEXT:    cmovsl %ecx, %esi
475; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
476; X86-NEXT:    cmovnel %eax, %esi
477; X86-NEXT:    cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
478; X86-NEXT:    cmpl $-2147483647, %edx # imm = 0x80000001
479; X86-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
480; X86-NEXT:    cmovael %edx, %eax
481; X86-NEXT:    movl %edx, %ecx
482; X86-NEXT:    sarl $31, %ecx
483; X86-NEXT:    andl %esi, %ecx
484; X86-NEXT:    cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
485; X86-NEXT:    movl $-2147483648, %ebx # imm = 0x80000000
486; X86-NEXT:    cmovsl %ebx, %edx
487; X86-NEXT:    movl $0, %ebx
488; X86-NEXT:    cmovsl %ebx, %esi
489; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
490; X86-NEXT:    cmpl $-1, %edi
491; X86-NEXT:    cmovel %ecx, %esi
492; X86-NEXT:    cmovel %eax, %edx
493; X86-NEXT:    movl %esi, %eax
494; X86-NEXT:    leal -12(%ebp), %esp
495; X86-NEXT:    popl %esi
496; X86-NEXT:    popl %edi
497; X86-NEXT:    popl %ebx
498; X86-NEXT:    popl %ebp
499; X86-NEXT:    retl
500  %tmp = call i64 @llvm.sdiv.fix.sat.i64(i64 %x, i64 %y, i32 31)
501  ret i64 %tmp
502}
503
504define i18 @func6(i16 %x, i16 %y) nounwind {
505;
506; X64-LABEL: func6:
507; X64:       # %bb.0:
508; X64-NEXT:    movswl %di, %ecx
509; X64-NEXT:    movswl %si, %esi
510; X64-NEXT:    shll $7, %ecx
511; X64-NEXT:    movl %ecx, %eax
512; X64-NEXT:    cltd
513; X64-NEXT:    idivl %esi
514; X64-NEXT:    # kill: def $eax killed $eax def $rax
515; X64-NEXT:    leal -1(%rax), %edi
516; X64-NEXT:    testl %esi, %esi
517; X64-NEXT:    sets %sil
518; X64-NEXT:    testl %ecx, %ecx
519; X64-NEXT:    sets %cl
520; X64-NEXT:    xorb %sil, %cl
521; X64-NEXT:    testl %edx, %edx
522; X64-NEXT:    setne %dl
523; X64-NEXT:    testb %cl, %dl
524; X64-NEXT:    cmovnel %edi, %eax
525; X64-NEXT:    cmpl $131071, %eax # imm = 0x1FFFF
526; X64-NEXT:    movl $131071, %ecx # imm = 0x1FFFF
527; X64-NEXT:    cmovgel %ecx, %eax
528; X64-NEXT:    cmpl $-131071, %eax # imm = 0xFFFE0001
529; X64-NEXT:    movl $-131072, %ecx # imm = 0xFFFE0000
530; X64-NEXT:    cmovll %ecx, %eax
531; X64-NEXT:    # kill: def $eax killed $eax killed $rax
532; X64-NEXT:    retq
533;
534; X86-LABEL: func6:
535; X86:       # %bb.0:
536; X86-NEXT:    pushl %ebx
537; X86-NEXT:    pushl %edi
538; X86-NEXT:    pushl %esi
539; X86-NEXT:    movswl {{[0-9]+}}(%esp), %esi
540; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx
541; X86-NEXT:    shll $7, %ecx
542; X86-NEXT:    movl %ecx, %eax
543; X86-NEXT:    cltd
544; X86-NEXT:    idivl %esi
545; X86-NEXT:    leal -1(%eax), %edi
546; X86-NEXT:    testl %esi, %esi
547; X86-NEXT:    sets %bl
548; X86-NEXT:    testl %ecx, %ecx
549; X86-NEXT:    sets %cl
550; X86-NEXT:    xorb %bl, %cl
551; X86-NEXT:    testl %edx, %edx
552; X86-NEXT:    setne %dl
553; X86-NEXT:    testb %cl, %dl
554; X86-NEXT:    cmovnel %edi, %eax
555; X86-NEXT:    cmpl $131071, %eax # imm = 0x1FFFF
556; X86-NEXT:    movl $131071, %ecx # imm = 0x1FFFF
557; X86-NEXT:    cmovgel %ecx, %eax
558; X86-NEXT:    cmpl $-131071, %eax # imm = 0xFFFE0001
559; X86-NEXT:    movl $-131072, %ecx # imm = 0xFFFE0000
560; X86-NEXT:    cmovll %ecx, %eax
561; X86-NEXT:    popl %esi
562; X86-NEXT:    popl %edi
563; X86-NEXT:    popl %ebx
564; X86-NEXT:    retl
565  %x2 = sext i16 %x to i18
566  %y2 = sext i16 %y to i18
567  %tmp = call i18 @llvm.sdiv.fix.sat.i18(i18 %x2, i18 %y2, i32 7)
568  ret i18 %tmp
569}
570
571define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
572;
573; X64-LABEL: vec:
574; X64:       # %bb.0:
575; X64-NEXT:    pushq %rbp
576; X64-NEXT:    pushq %r15
577; X64-NEXT:    pushq %r14
578; X64-NEXT:    pushq %r13
579; X64-NEXT:    pushq %r12
580; X64-NEXT:    pushq %rbx
581; X64-NEXT:    subq $104, %rsp
582; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
583; X64-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
584; X64-NEXT:    pxor %xmm2, %xmm2
585; X64-NEXT:    pcmpgtd %xmm0, %xmm2
586; X64-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
587; X64-NEXT:    paddq %xmm0, %xmm0
588; X64-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
589; X64-NEXT:    movq %xmm0, %rbx
590; X64-NEXT:    movq %rbx, %rbp
591; X64-NEXT:    sarq $63, %rbp
592; X64-NEXT:    shldq $31, %rbx, %rbp
593; X64-NEXT:    pxor %xmm0, %xmm0
594; X64-NEXT:    pcmpgtd %xmm1, %xmm0
595; X64-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
596; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
597; X64-NEXT:    movq %xmm1, %rdx
598; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
599; X64-NEXT:    movq %rdx, %r15
600; X64-NEXT:    sarq $63, %r15
601; X64-NEXT:    movq %rbx, %r12
602; X64-NEXT:    shlq $31, %r12
603; X64-NEXT:    movq %r12, %rdi
604; X64-NEXT:    movq %rbp, %rsi
605; X64-NEXT:    movq %r15, %rcx
606; X64-NEXT:    callq __divti3@PLT
607; X64-NEXT:    movq %rax, %r13
608; X64-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
609; X64-NEXT:    movq %rdx, %r14
610; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
611; X64-NEXT:    subq $1, %r13
612; X64-NEXT:    sbbq $0, %r14
613; X64-NEXT:    shrq $63, %rbx
614; X64-NEXT:    xorl %r15d, %ebx
615; X64-NEXT:    movq %r12, %rdi
616; X64-NEXT:    movq %rbp, %rsi
617; X64-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
618; X64-NEXT:    movq %r15, %rcx
619; X64-NEXT:    callq __modti3@PLT
620; X64-NEXT:    orq %rax, %rdx
621; X64-NEXT:    setne %al
622; X64-NEXT:    testb %bl, %al
623; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload
624; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
625; X64-NEXT:    movl $4294967295, %edx # imm = 0xFFFFFFFF
626; X64-NEXT:    cmpq %rdx, %r13
627; X64-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
628; X64-NEXT:    cmovbq %r13, %rax
629; X64-NEXT:    xorl %ecx, %ecx
630; X64-NEXT:    testq %r14, %r14
631; X64-NEXT:    cmovnsq %rdx, %r13
632; X64-NEXT:    cmoveq %rax, %r13
633; X64-NEXT:    cmovnsq %rcx, %r14
634; X64-NEXT:    movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000
635; X64-NEXT:    cmpq %rcx, %r13
636; X64-NEXT:    movq %rcx, %rax
637; X64-NEXT:    cmovaq %r13, %rax
638; X64-NEXT:    testq %r14, %r14
639; X64-NEXT:    cmovsq %rcx, %r13
640; X64-NEXT:    cmpq $-1, %r14
641; X64-NEXT:    cmoveq %rax, %r13
642; X64-NEXT:    movq %r13, %xmm0
643; X64-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
644; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
645; X64-NEXT:    # xmm0 = mem[2,3,2,3]
646; X64-NEXT:    movq %xmm0, %rbx
647; X64-NEXT:    movq %rbx, %r13
648; X64-NEXT:    sarq $63, %r13
649; X64-NEXT:    shldq $31, %rbx, %r13
650; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
651; X64-NEXT:    # xmm0 = mem[2,3,2,3]
652; X64-NEXT:    movq %xmm0, %rdx
653; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
654; X64-NEXT:    movq %rdx, %rbp
655; X64-NEXT:    sarq $63, %rbp
656; X64-NEXT:    movq %rbx, %r15
657; X64-NEXT:    shlq $31, %r15
658; X64-NEXT:    movq %r15, %rdi
659; X64-NEXT:    movq %r13, %rsi
660; X64-NEXT:    movq %rbp, %rcx
661; X64-NEXT:    callq __divti3@PLT
662; X64-NEXT:    movq %rax, %r12
663; X64-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
664; X64-NEXT:    movq %rdx, %r14
665; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
666; X64-NEXT:    subq $1, %r12
667; X64-NEXT:    sbbq $0, %r14
668; X64-NEXT:    shrq $63, %rbx
669; X64-NEXT:    xorl %ebp, %ebx
670; X64-NEXT:    movq %r15, %rdi
671; X64-NEXT:    movq %r13, %rsi
672; X64-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
673; X64-NEXT:    movq %rbp, %rcx
674; X64-NEXT:    callq __modti3@PLT
675; X64-NEXT:    orq %rax, %rdx
676; X64-NEXT:    setne %al
677; X64-NEXT:    testb %bl, %al
678; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload
679; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Folded Reload
680; X64-NEXT:    movl $4294967295, %ecx # imm = 0xFFFFFFFF
681; X64-NEXT:    cmpq %rcx, %r12
682; X64-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
683; X64-NEXT:    cmovbq %r12, %rax
684; X64-NEXT:    testq %r14, %r14
685; X64-NEXT:    cmovnsq %rcx, %r12
686; X64-NEXT:    cmoveq %rax, %r12
687; X64-NEXT:    movl $0, %eax
688; X64-NEXT:    cmovnsq %rax, %r14
689; X64-NEXT:    movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000
690; X64-NEXT:    cmpq %rcx, %r12
691; X64-NEXT:    movq %rcx, %rax
692; X64-NEXT:    cmovaq %r12, %rax
693; X64-NEXT:    testq %r14, %r14
694; X64-NEXT:    cmovsq %rcx, %r12
695; X64-NEXT:    cmpq $-1, %r14
696; X64-NEXT:    cmoveq %rax, %r12
697; X64-NEXT:    movq %r12, %xmm0
698; X64-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
699; X64-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
700; X64-NEXT:    psrlq $1, %xmm1
701; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
702; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
703; X64-NEXT:    # xmm1 = mem[2,3,2,3]
704; X64-NEXT:    pxor %xmm0, %xmm0
705; X64-NEXT:    pcmpgtd %xmm1, %xmm0
706; X64-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
707; X64-NEXT:    paddq %xmm1, %xmm1
708; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
709; X64-NEXT:    movq %xmm1, %rbx
710; X64-NEXT:    movq %rbx, %r12
711; X64-NEXT:    sarq $63, %r12
712; X64-NEXT:    shldq $31, %rbx, %r12
713; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
714; X64-NEXT:    # xmm1 = mem[2,3,2,3]
715; X64-NEXT:    pxor %xmm0, %xmm0
716; X64-NEXT:    pcmpgtd %xmm1, %xmm0
717; X64-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
718; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
719; X64-NEXT:    movq %xmm1, %rdx
720; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
721; X64-NEXT:    movq %rdx, %rbp
722; X64-NEXT:    sarq $63, %rbp
723; X64-NEXT:    movq %rbx, %r15
724; X64-NEXT:    shlq $31, %r15
725; X64-NEXT:    movq %r15, %rdi
726; X64-NEXT:    movq %r12, %rsi
727; X64-NEXT:    movq %rbp, %rcx
728; X64-NEXT:    callq __divti3@PLT
729; X64-NEXT:    movq %rax, %r13
730; X64-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
731; X64-NEXT:    movq %rdx, %r14
732; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
733; X64-NEXT:    subq $1, %r13
734; X64-NEXT:    sbbq $0, %r14
735; X64-NEXT:    shrq $63, %rbx
736; X64-NEXT:    xorl %ebp, %ebx
737; X64-NEXT:    movq %r15, %rdi
738; X64-NEXT:    movq %r12, %rsi
739; X64-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
740; X64-NEXT:    movq %rbp, %rcx
741; X64-NEXT:    callq __modti3@PLT
742; X64-NEXT:    orq %rax, %rdx
743; X64-NEXT:    setne %al
744; X64-NEXT:    testb %bl, %al
745; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload
746; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload
747; X64-NEXT:    movl $4294967295, %ecx # imm = 0xFFFFFFFF
748; X64-NEXT:    cmpq %rcx, %r13
749; X64-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
750; X64-NEXT:    cmovbq %r13, %rax
751; X64-NEXT:    testq %r14, %r14
752; X64-NEXT:    cmovnsq %rcx, %r13
753; X64-NEXT:    cmoveq %rax, %r13
754; X64-NEXT:    movl $0, %eax
755; X64-NEXT:    cmovnsq %rax, %r14
756; X64-NEXT:    movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000
757; X64-NEXT:    cmpq %rcx, %r13
758; X64-NEXT:    movq %rcx, %rax
759; X64-NEXT:    cmovaq %r13, %rax
760; X64-NEXT:    testq %r14, %r14
761; X64-NEXT:    cmovsq %rcx, %r13
762; X64-NEXT:    cmpq $-1, %r14
763; X64-NEXT:    cmoveq %rax, %r13
764; X64-NEXT:    movq %r13, %xmm0
765; X64-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
766; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
767; X64-NEXT:    # xmm0 = mem[2,3,2,3]
768; X64-NEXT:    movq %xmm0, %rbx
769; X64-NEXT:    movq %rbx, %r13
770; X64-NEXT:    sarq $63, %r13
771; X64-NEXT:    shldq $31, %rbx, %r13
772; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
773; X64-NEXT:    # xmm0 = mem[2,3,2,3]
774; X64-NEXT:    movq %xmm0, %rdx
775; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
776; X64-NEXT:    movq %rdx, %rbp
777; X64-NEXT:    sarq $63, %rbp
778; X64-NEXT:    movq %rbx, %r15
779; X64-NEXT:    shlq $31, %r15
780; X64-NEXT:    movq %r15, %rdi
781; X64-NEXT:    movq %r13, %rsi
782; X64-NEXT:    movq %rbp, %rcx
783; X64-NEXT:    callq __divti3@PLT
784; X64-NEXT:    movq %rax, %r12
785; X64-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
786; X64-NEXT:    movq %rdx, %r14
787; X64-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
788; X64-NEXT:    subq $1, %r12
789; X64-NEXT:    sbbq $0, %r14
790; X64-NEXT:    shrq $63, %rbx
791; X64-NEXT:    xorl %ebp, %ebx
792; X64-NEXT:    movq %r15, %rdi
793; X64-NEXT:    movq %r13, %rsi
794; X64-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
795; X64-NEXT:    movq %rbp, %rcx
796; X64-NEXT:    callq __modti3@PLT
797; X64-NEXT:    orq %rax, %rdx
798; X64-NEXT:    setne %al
799; X64-NEXT:    testb %bl, %al
800; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload
801; X64-NEXT:    cmoveq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Folded Reload
802; X64-NEXT:    movl $4294967295, %ecx # imm = 0xFFFFFFFF
803; X64-NEXT:    cmpq %rcx, %r12
804; X64-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF
805; X64-NEXT:    cmovbq %r12, %rax
806; X64-NEXT:    testq %r14, %r14
807; X64-NEXT:    cmovnsq %rcx, %r12
808; X64-NEXT:    cmoveq %rax, %r12
809; X64-NEXT:    movl $0, %eax
810; X64-NEXT:    cmovnsq %rax, %r14
811; X64-NEXT:    movabsq $-4294967296, %rcx # imm = 0xFFFFFFFF00000000
812; X64-NEXT:    cmpq %rcx, %r12
813; X64-NEXT:    movq %rcx, %rax
814; X64-NEXT:    cmovaq %r12, %rax
815; X64-NEXT:    testq %r14, %r14
816; X64-NEXT:    cmovsq %rcx, %r12
817; X64-NEXT:    cmpq $-1, %r14
818; X64-NEXT:    cmoveq %rax, %r12
819; X64-NEXT:    movq %r12, %xmm0
820; X64-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
821; X64-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
822; X64-NEXT:    psrlq $1, %xmm1
823; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
824; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
825; X64-NEXT:    addq $104, %rsp
826; X64-NEXT:    popq %rbx
827; X64-NEXT:    popq %r12
828; X64-NEXT:    popq %r13
829; X64-NEXT:    popq %r14
830; X64-NEXT:    popq %r15
831; X64-NEXT:    popq %rbp
832; X64-NEXT:    retq
833;
834; X86-LABEL: vec:
835; X86:       # %bb.0:
836; X86-NEXT:    pushl %ebp
837; X86-NEXT:    movl %esp, %ebp
838; X86-NEXT:    pushl %ebx
839; X86-NEXT:    pushl %edi
840; X86-NEXT:    pushl %esi
841; X86-NEXT:    andl $-8, %esp
842; X86-NEXT:    subl $256, %esp # imm = 0x100
843; X86-NEXT:    movl 24(%ebp), %edx
844; X86-NEXT:    movl 40(%ebp), %edi
845; X86-NEXT:    leal {{[0-9]+}}(%esp), %ebx
846; X86-NEXT:    movl %edi, %esi
847; X86-NEXT:    sarl $31, %esi
848; X86-NEXT:    movl %edx, %eax
849; X86-NEXT:    sarl $31, %eax
850; X86-NEXT:    addl %edx, %edx
851; X86-NEXT:    adcl %eax, %eax
852; X86-NEXT:    movl %eax, %ecx
853; X86-NEXT:    shldl $31, %edx, %ecx
854; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
855; X86-NEXT:    shll $31, %edx
856; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
857; X86-NEXT:    andl $1, %eax
858; X86-NEXT:    negl %eax
859; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
860; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
861; X86-NEXT:    pushl %esi
862; X86-NEXT:    pushl %esi
863; X86-NEXT:    pushl %esi
864; X86-NEXT:    pushl %edi
865; X86-NEXT:    pushl %eax
866; X86-NEXT:    pushl %eax
867; X86-NEXT:    pushl %ecx
868; X86-NEXT:    pushl %edx
869; X86-NEXT:    pushl %ebx
870; X86-NEXT:    calll __modti3
871; X86-NEXT:    addl $32, %esp
872; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
873; X86-NEXT:    movl 36(%ebp), %esi
874; X86-NEXT:    movl %esi, %edi
875; X86-NEXT:    sarl $31, %edi
876; X86-NEXT:    movl 20(%ebp), %ecx
877; X86-NEXT:    movl %ecx, %edx
878; X86-NEXT:    sarl $31, %edx
879; X86-NEXT:    addl %ecx, %ecx
880; X86-NEXT:    adcl %edx, %edx
881; X86-NEXT:    movl %edx, %ebx
882; X86-NEXT:    shldl $31, %ecx, %ebx
883; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
884; X86-NEXT:    shll $31, %ecx
885; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
886; X86-NEXT:    andl $1, %edx
887; X86-NEXT:    negl %edx
888; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
889; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
890; X86-NEXT:    pushl %edi
891; X86-NEXT:    pushl %edi
892; X86-NEXT:    pushl %edi
893; X86-NEXT:    pushl %esi
894; X86-NEXT:    pushl %edx
895; X86-NEXT:    pushl %edx
896; X86-NEXT:    pushl %ebx
897; X86-NEXT:    pushl %ecx
898; X86-NEXT:    pushl %eax
899; X86-NEXT:    calll __modti3
900; X86-NEXT:    addl $32, %esp
901; X86-NEXT:    leal {{[0-9]+}}(%esp), %edi
902; X86-NEXT:    movl 28(%ebp), %ebx
903; X86-NEXT:    movl %ebx, %edx
904; X86-NEXT:    sarl $31, %edx
905; X86-NEXT:    movl 12(%ebp), %eax
906; X86-NEXT:    movl %eax, %esi
907; X86-NEXT:    sarl $31, %esi
908; X86-NEXT:    addl %eax, %eax
909; X86-NEXT:    adcl %esi, %esi
910; X86-NEXT:    movl %esi, %ecx
911; X86-NEXT:    shldl $31, %eax, %ecx
912; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
913; X86-NEXT:    shll $31, %eax
914; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
915; X86-NEXT:    andl $1, %esi
916; X86-NEXT:    negl %esi
917; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
918; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
919; X86-NEXT:    pushl %edx
920; X86-NEXT:    pushl %edx
921; X86-NEXT:    pushl %edx
922; X86-NEXT:    pushl %ebx
923; X86-NEXT:    pushl %esi
924; X86-NEXT:    pushl %esi
925; X86-NEXT:    pushl %ecx
926; X86-NEXT:    pushl %eax
927; X86-NEXT:    pushl %edi
928; X86-NEXT:    calll __divti3
929; X86-NEXT:    addl $32, %esp
930; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
931; X86-NEXT:    movl 32(%ebp), %edx
932; X86-NEXT:    movl %edx, %esi
933; X86-NEXT:    sarl $31, %esi
934; X86-NEXT:    movl 16(%ebp), %ecx
935; X86-NEXT:    movl %ecx, %ebx
936; X86-NEXT:    sarl $31, %ebx
937; X86-NEXT:    addl %ecx, %ecx
938; X86-NEXT:    adcl %ebx, %ebx
939; X86-NEXT:    movl %ebx, %edi
940; X86-NEXT:    shldl $31, %ecx, %edi
941; X86-NEXT:    shll $31, %ecx
942; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
943; X86-NEXT:    andl $1, %ebx
944; X86-NEXT:    negl %ebx
945; X86-NEXT:    pushl %esi
946; X86-NEXT:    pushl %esi
947; X86-NEXT:    pushl %esi
948; X86-NEXT:    pushl %edx
949; X86-NEXT:    pushl %ebx
950; X86-NEXT:    pushl %ebx
951; X86-NEXT:    pushl %edi
952; X86-NEXT:    pushl %ecx
953; X86-NEXT:    pushl %eax
954; X86-NEXT:    calll __modti3
955; X86-NEXT:    addl $32, %esp
956; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
957; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
958; X86-NEXT:    pushl %esi
959; X86-NEXT:    pushl %esi
960; X86-NEXT:    pushl %esi
961; X86-NEXT:    pushl 32(%ebp)
962; X86-NEXT:    pushl %ebx
963; X86-NEXT:    pushl %ebx
964; X86-NEXT:    pushl %edi
965; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
966; X86-NEXT:    pushl %eax
967; X86-NEXT:    calll __divti3
968; X86-NEXT:    addl $32, %esp
969; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
970; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
971; X86-NEXT:    pushl %ecx
972; X86-NEXT:    pushl %ecx
973; X86-NEXT:    pushl %ecx
974; X86-NEXT:    pushl 40(%ebp)
975; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
976; X86-NEXT:    pushl %ecx
977; X86-NEXT:    pushl %ecx
978; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
979; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
980; X86-NEXT:    pushl %eax
981; X86-NEXT:    calll __divti3
982; X86-NEXT:    addl $32, %esp
983; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
984; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
985; X86-NEXT:    pushl %ecx
986; X86-NEXT:    pushl %ecx
987; X86-NEXT:    pushl %ecx
988; X86-NEXT:    pushl 36(%ebp)
989; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
990; X86-NEXT:    pushl %edi
991; X86-NEXT:    pushl %edi
992; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
993; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
994; X86-NEXT:    pushl %eax
995; X86-NEXT:    calll __divti3
996; X86-NEXT:    addl $32, %esp
997; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
998; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
999; X86-NEXT:    subl $1, %eax
1000; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1001; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1002; X86-NEXT:    movl %esi, %edx
1003; X86-NEXT:    sbbl $0, %edx
1004; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1005; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1006; X86-NEXT:    sbbl $0, %eax
1007; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1008; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1009; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1010; X86-NEXT:    sbbl $0, %eax
1011; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1012; X86-NEXT:    testl %edi, %edi
1013; X86-NEXT:    sets %al
1014; X86-NEXT:    cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
1015; X86-NEXT:    sets %ah
1016; X86-NEXT:    xorb %al, %ah
1017; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
1018; X86-NEXT:    orl {{[0-9]+}}(%esp), %edi
1019; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1020; X86-NEXT:    orl {{[0-9]+}}(%esp), %ecx
1021; X86-NEXT:    orl %edi, %ecx
1022; X86-NEXT:    setne %al
1023; X86-NEXT:    testb %ah, %al
1024; X86-NEXT:    cmovel %esi, %edx
1025; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1026; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1027; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1028; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1029; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1030; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1031; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1032; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1033; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1034; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1035; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1036; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1037; X86-NEXT:    subl $1, %eax
1038; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1039; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1040; X86-NEXT:    movl %esi, %ecx
1041; X86-NEXT:    sbbl $0, %ecx
1042; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
1043; X86-NEXT:    movl %edx, %eax
1044; X86-NEXT:    sbbl $0, %eax
1045; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1046; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1047; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1048; X86-NEXT:    sbbl $0, %eax
1049; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1050; X86-NEXT:    testl %ebx, %ebx
1051; X86-NEXT:    sets %bl
1052; X86-NEXT:    cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
1053; X86-NEXT:    sets %bh
1054; X86-NEXT:    xorb %bl, %bh
1055; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
1056; X86-NEXT:    orl {{[0-9]+}}(%esp), %edi
1057; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1058; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
1059; X86-NEXT:    orl %edi, %eax
1060; X86-NEXT:    setne %al
1061; X86-NEXT:    testb %bh, %al
1062; X86-NEXT:    cmovel %esi, %ecx
1063; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1064; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1065; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1066; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1067; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1068; X86-NEXT:    cmovel %edx, %eax
1069; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1070; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1071; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1072; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1073; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1074; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1075; X86-NEXT:    subl $1, %eax
1076; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1077; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
1078; X86-NEXT:    movl %edi, %esi
1079; X86-NEXT:    sbbl $0, %esi
1080; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1081; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1082; X86-NEXT:    sbbl $0, %eax
1083; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1084; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1085; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1086; X86-NEXT:    sbbl $0, %eax
1087; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1088; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1089; X86-NEXT:    testl %ecx, %ecx
1090; X86-NEXT:    sets %al
1091; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
1092; X86-NEXT:    testl %edx, %edx
1093; X86-NEXT:    sets %bl
1094; X86-NEXT:    xorb %al, %bl
1095; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
1096; X86-NEXT:    pushl %edx
1097; X86-NEXT:    pushl %edx
1098; X86-NEXT:    pushl %edx
1099; X86-NEXT:    pushl 28(%ebp)
1100; X86-NEXT:    pushl %ecx
1101; X86-NEXT:    pushl %ecx
1102; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
1103; X86-NEXT:    pushl {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
1104; X86-NEXT:    pushl %eax
1105; X86-NEXT:    calll __modti3
1106; X86-NEXT:    addl $32, %esp
1107; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1108; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
1109; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1110; X86-NEXT:    orl {{[0-9]+}}(%esp), %ecx
1111; X86-NEXT:    orl %eax, %ecx
1112; X86-NEXT:    setne %al
1113; X86-NEXT:    testb %bl, %al
1114; X86-NEXT:    cmovel %edi, %esi
1115; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1116; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1117; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1118; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1119; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1120; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1121; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1122; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1123; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1124; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1125; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1126; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1127; X86-NEXT:    subl $1, %ecx
1128; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1129; X86-NEXT:    movl %esi, %eax
1130; X86-NEXT:    sbbl $0, %eax
1131; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1132; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1133; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1134; X86-NEXT:    sbbl $0, %eax
1135; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1136; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
1137; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1138; X86-NEXT:    sbbl $0, %edx
1139; X86-NEXT:    cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
1140; X86-NEXT:    sets %bl
1141; X86-NEXT:    cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
1142; X86-NEXT:    sets %bh
1143; X86-NEXT:    xorb %bl, %bh
1144; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
1145; X86-NEXT:    orl {{[0-9]+}}(%esp), %edi
1146; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1147; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
1148; X86-NEXT:    orl %edi, %eax
1149; X86-NEXT:    setne %al
1150; X86-NEXT:    testb %bh, %al
1151; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1152; X86-NEXT:    cmovel %esi, %eax
1153; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1154; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1155; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1156; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1157; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1158; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1159; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
1160; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1161; X86-NEXT:    testl %edx, %edx
1162; X86-NEXT:    movl $0, %eax
1163; X86-NEXT:    cmovsl %edx, %eax
1164; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1165; X86-NEXT:    movl $-1, %eax
1166; X86-NEXT:    cmovsl %ecx, %eax
1167; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1168; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1169; X86-NEXT:    movl %eax, %ecx
1170; X86-NEXT:    sarl $31, %ecx
1171; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1172; X86-NEXT:    movl %ecx, %edx
1173; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
1174; X86-NEXT:    testl %eax, %eax
1175; X86-NEXT:    cmovel %eax, %edx
1176; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1177; X86-NEXT:    movl $0, %ecx
1178; X86-NEXT:    cmovsl %eax, %ecx
1179; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1180; X86-NEXT:    movl $-1, %eax
1181; X86-NEXT:    cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1182; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1183; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1184; X86-NEXT:    movl %eax, %edi
1185; X86-NEXT:    sarl $31, %edi
1186; X86-NEXT:    movl %edi, %ecx
1187; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1188; X86-NEXT:    testl %eax, %eax
1189; X86-NEXT:    cmovel %eax, %ecx
1190; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1191; X86-NEXT:    movl $0, %ecx
1192; X86-NEXT:    cmovsl %eax, %ecx
1193; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1194; X86-NEXT:    movl $-1, %eax
1195; X86-NEXT:    cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1196; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1197; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1198; X86-NEXT:    movl %ecx, %ebx
1199; X86-NEXT:    sarl $31, %ebx
1200; X86-NEXT:    movl %ebx, %eax
1201; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1202; X86-NEXT:    testl %ecx, %ecx
1203; X86-NEXT:    cmovel %ecx, %eax
1204; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1205; X86-NEXT:    movl $0, %eax
1206; X86-NEXT:    cmovsl %ecx, %eax
1207; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1208; X86-NEXT:    movl %ecx, %edx
1209; X86-NEXT:    movl $-1, %esi
1210; X86-NEXT:    cmovsl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
1211; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1212; X86-NEXT:    movl %eax, %ecx
1213; X86-NEXT:    sarl $31, %ecx
1214; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1215; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1216; X86-NEXT:    testl %eax, %eax
1217; X86-NEXT:    cmovel %eax, %ecx
1218; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1219; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1220; X86-NEXT:    andl %eax, %ebx
1221; X86-NEXT:    negl %eax
1222; X86-NEXT:    movl $0, %ecx
1223; X86-NEXT:    sbbl %ecx, %ecx
1224; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1225; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
1226; X86-NEXT:    cmovnel %esi, %ecx
1227; X86-NEXT:    movl $0, %edx
1228; X86-NEXT:    cmovel %edx, %ebx
1229; X86-NEXT:    cmpl $-1, %ebx
1230; X86-NEXT:    movl $0, %esi
1231; X86-NEXT:    cmovel %ecx, %esi
1232; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1233; X86-NEXT:    testl %eax, %eax
1234; X86-NEXT:    cmovsl %edx, %ecx
1235; X86-NEXT:    movl $-1, %edx
1236; X86-NEXT:    cmovsl %edx, %ebx
1237; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1238; X86-NEXT:    cmpl $-1, %eax
1239; X86-NEXT:    cmovel %esi, %ecx
1240; X86-NEXT:    cmovnel %ebx, %eax
1241; X86-NEXT:    shldl $31, %ecx, %eax
1242; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1243; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1244; X86-NEXT:    andl %eax, %edi
1245; X86-NEXT:    negl %eax
1246; X86-NEXT:    movl $0, %eax
1247; X86-NEXT:    sbbl %eax, %eax
1248; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1249; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1250; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1251; X86-NEXT:    cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1252; X86-NEXT:    movl $0, %esi
1253; X86-NEXT:    cmovel %esi, %edi
1254; X86-NEXT:    cmpl $-1, %edi
1255; X86-NEXT:    movl $0, %edx
1256; X86-NEXT:    cmovel %eax, %edx
1257; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1258; X86-NEXT:    testl %ecx, %ecx
1259; X86-NEXT:    cmovsl %esi, %eax
1260; X86-NEXT:    movl $0, %esi
1261; X86-NEXT:    movl $-1, %ebx
1262; X86-NEXT:    cmovsl %ebx, %edi
1263; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1264; X86-NEXT:    cmpl $-1, %ecx
1265; X86-NEXT:    cmovel %edx, %eax
1266; X86-NEXT:    cmovnel %edi, %ecx
1267; X86-NEXT:    shldl $31, %eax, %ecx
1268; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1269; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1270; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
1271; X86-NEXT:    andl %eax, %edx
1272; X86-NEXT:    negl %eax
1273; X86-NEXT:    movl $0, %eax
1274; X86-NEXT:    sbbl %eax, %eax
1275; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1276; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1277; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1278; X86-NEXT:    cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1279; X86-NEXT:    cmovel %esi, %edx
1280; X86-NEXT:    cmpl $-1, %edx
1281; X86-NEXT:    movl $0, %ecx
1282; X86-NEXT:    cmovel %eax, %ecx
1283; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
1284; X86-NEXT:    testl %ebx, %ebx
1285; X86-NEXT:    cmovsl %esi, %eax
1286; X86-NEXT:    movl $-1, %edi
1287; X86-NEXT:    cmovsl %edi, %edx
1288; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
1289; X86-NEXT:    cmpl $-1, %ebx
1290; X86-NEXT:    cmovel %ecx, %eax
1291; X86-NEXT:    cmovnel %edx, %ebx
1292; X86-NEXT:    shldl $31, %eax, %ebx
1293; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1294; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
1295; X86-NEXT:    andl %eax, %edi
1296; X86-NEXT:    negl %eax
1297; X86-NEXT:    movl $0, %eax
1298; X86-NEXT:    sbbl %eax, %eax
1299; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1300; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1301; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
1302; X86-NEXT:    cmovnel {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
1303; X86-NEXT:    cmovel %esi, %edi
1304; X86-NEXT:    cmpl $-1, %edi
1305; X86-NEXT:    movl $0, %ecx
1306; X86-NEXT:    cmovel %eax, %ecx
1307; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
1308; X86-NEXT:    testl %edx, %edx
1309; X86-NEXT:    cmovsl %esi, %eax
1310; X86-NEXT:    movl $-1, %esi
1311; X86-NEXT:    cmovsl %esi, %edi
1312; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
1313; X86-NEXT:    andl %edx, %esi
1314; X86-NEXT:    cmpl $-1, %esi
1315; X86-NEXT:    cmovel %ecx, %eax
1316; X86-NEXT:    cmovnel %edi, %esi
1317; X86-NEXT:    shldl $31, %eax, %esi
1318; X86-NEXT:    movl 8(%ebp), %eax
1319; X86-NEXT:    movl %esi, 12(%eax)
1320; X86-NEXT:    movl %ebx, 8(%eax)
1321; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1322; X86-NEXT:    movl %ecx, 4(%eax)
1323; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
1324; X86-NEXT:    movl %ecx, (%eax)
1325; X86-NEXT:    leal -12(%ebp), %esp
1326; X86-NEXT:    popl %esi
1327; X86-NEXT:    popl %edi
1328; X86-NEXT:    popl %ebx
1329; X86-NEXT:    popl %ebp
1330; X86-NEXT:    retl $4
1331  %tmp = call <4 x i32> @llvm.sdiv.fix.sat.v4i32(<4 x i32> %x, <4 x i32> %y, i32 31)
1332  ret <4 x i32> %tmp
1333}
1334