1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefixes=X64,SSE
3; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx | FileCheck %s --check-prefixes=X64,AVX,AVX1
4; RUN: llc < %s -mtriple=x86_64-linux -mattr=avx2 | FileCheck %s --check-prefixes=X64,AVX,AVX2
5; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X86
6
7declare i8 @llvm.umin.i8(i8, i8)
8declare i16 @llvm.umin.i16(i16, i16)
9declare i24 @llvm.umin.i24(i24, i24)
10declare i32 @llvm.umin.i32(i32, i32)
11declare i64 @llvm.umin.i64(i64, i64)
12declare i128 @llvm.umin.i128(i128, i128)
13
14declare <1 x i32> @llvm.umin.v1i32(<1 x i32>, <1 x i32>)
15declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>)
16declare <3 x i32> @llvm.umin.v3i32(<3 x i32>, <3 x i32>)
17declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>)
18declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)
19
20declare <8 x i16> @llvm.umin.v8i16(<8 x i16>, <8 x i16>)
21declare <16 x i8> @llvm.umin.v16i8(<16 x i8>, <16 x i8>)
22
23define i8 @test_i8(i8 %a, i8 %b) nounwind {
24; X64-LABEL: test_i8:
25; X64:       # %bb.0:
26; X64-NEXT:    movl %esi, %eax
27; X64-NEXT:    cmpb %al, %dil
28; X64-NEXT:    cmovbl %edi, %eax
29; X64-NEXT:    # kill: def $al killed $al killed $eax
30; X64-NEXT:    retq
31;
32; X86-LABEL: test_i8:
33; X86:       # %bb.0:
34; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
35; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
36; X86-NEXT:    cmpb %al, %cl
37; X86-NEXT:    cmovbl %ecx, %eax
38; X86-NEXT:    # kill: def $al killed $al killed $eax
39; X86-NEXT:    retl
40  %r = call i8 @llvm.umin.i8(i8 %a, i8 %b)
41  ret i8 %r
42}
43
44define i16 @test_i16(i16 %a, i16 %b) nounwind {
45; X64-LABEL: test_i16:
46; X64:       # %bb.0:
47; X64-NEXT:    movl %esi, %eax
48; X64-NEXT:    cmpw %ax, %di
49; X64-NEXT:    cmovbl %edi, %eax
50; X64-NEXT:    # kill: def $ax killed $ax killed $eax
51; X64-NEXT:    retq
52;
53; X86-LABEL: test_i16:
54; X86:       # %bb.0:
55; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
56; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
57; X86-NEXT:    cmpw %ax, %cx
58; X86-NEXT:    cmovbl %ecx, %eax
59; X86-NEXT:    # kill: def $ax killed $ax killed $eax
60; X86-NEXT:    retl
61  %r = call i16 @llvm.umin.i16(i16 %a, i16 %b)
62  ret i16 %r
63}
64
65define i24 @test_i24(i24 %a, i24 %b) nounwind {
66; X64-LABEL: test_i24:
67; X64:       # %bb.0:
68; X64-NEXT:    movl %edi, %eax
69; X64-NEXT:    andl $16777215, %esi # imm = 0xFFFFFF
70; X64-NEXT:    andl $16777215, %eax # imm = 0xFFFFFF
71; X64-NEXT:    cmpl %esi, %eax
72; X64-NEXT:    cmovael %esi, %eax
73; X64-NEXT:    retq
74;
75; X86-LABEL: test_i24:
76; X86:       # %bb.0:
77; X86-NEXT:    movl $16777215, %eax # imm = 0xFFFFFF
78; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
79; X86-NEXT:    andl %eax, %ecx
80; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
81; X86-NEXT:    cmpl %ecx, %eax
82; X86-NEXT:    cmovael %ecx, %eax
83; X86-NEXT:    retl
84  %r = call i24 @llvm.umin.i24(i24 %a, i24 %b)
85  ret i24 %r
86}
87
88define i32 @test_i32(i32 %a, i32 %b) nounwind {
89; X64-LABEL: test_i32:
90; X64:       # %bb.0:
91; X64-NEXT:    movl %esi, %eax
92; X64-NEXT:    cmpl %esi, %edi
93; X64-NEXT:    cmovbl %edi, %eax
94; X64-NEXT:    retq
95;
96; X86-LABEL: test_i32:
97; X86:       # %bb.0:
98; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
99; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
100; X86-NEXT:    cmpl %eax, %ecx
101; X86-NEXT:    cmovbl %ecx, %eax
102; X86-NEXT:    retl
103  %r = call i32 @llvm.umin.i32(i32 %a, i32 %b)
104  ret i32 %r
105}
106
107define i64 @test_i64(i64 %a, i64 %b) nounwind {
108; X64-LABEL: test_i64:
109; X64:       # %bb.0:
110; X64-NEXT:    movq %rsi, %rax
111; X64-NEXT:    cmpq %rsi, %rdi
112; X64-NEXT:    cmovbq %rdi, %rax
113; X64-NEXT:    retq
114;
115; X86-LABEL: test_i64:
116; X86:       # %bb.0:
117; X86-NEXT:    pushl %edi
118; X86-NEXT:    pushl %esi
119; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
120; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
121; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
122; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
123; X86-NEXT:    cmpl %eax, %ecx
124; X86-NEXT:    movl %eax, %edi
125; X86-NEXT:    cmovbl %ecx, %edi
126; X86-NEXT:    cmpl %edx, %esi
127; X86-NEXT:    cmovbl %ecx, %eax
128; X86-NEXT:    cmovel %edi, %eax
129; X86-NEXT:    cmovbl %esi, %edx
130; X86-NEXT:    popl %esi
131; X86-NEXT:    popl %edi
132; X86-NEXT:    retl
133  %r = call i64 @llvm.umin.i64(i64 %a, i64 %b)
134  ret i64 %r
135}
136
137define i128 @test_i128(i128 %a, i128 %b) nounwind {
138; X64-LABEL: test_i128:
139; X64:       # %bb.0:
140; X64-NEXT:    cmpq %rdx, %rdi
141; X64-NEXT:    movq %rdx, %rax
142; X64-NEXT:    cmovbq %rdi, %rax
143; X64-NEXT:    cmpq %rcx, %rsi
144; X64-NEXT:    cmovbq %rdi, %rdx
145; X64-NEXT:    cmovneq %rdx, %rax
146; X64-NEXT:    cmovbq %rsi, %rcx
147; X64-NEXT:    movq %rcx, %rdx
148; X64-NEXT:    retq
149;
150; X86-LABEL: test_i128:
151; X86:       # %bb.0:
152; X86-NEXT:    pushl %ebp
153; X86-NEXT:    pushl %ebx
154; X86-NEXT:    pushl %edi
155; X86-NEXT:    pushl %esi
156; X86-NEXT:    subl $8, %esp
157; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
158; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
159; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
160; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
161; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
162; X86-NEXT:    cmpl %ecx, %edi
163; X86-NEXT:    movl %ecx, %eax
164; X86-NEXT:    cmovbl %edi, %eax
165; X86-NEXT:    cmpl %esi, %ebp
166; X86-NEXT:    movl %ecx, %ebx
167; X86-NEXT:    cmovbl %edi, %ebx
168; X86-NEXT:    cmovel %eax, %ebx
169; X86-NEXT:    movl %esi, %eax
170; X86-NEXT:    cmovbl %ebp, %eax
171; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
172; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
173; X86-NEXT:    cmpl %edx, %edi
174; X86-NEXT:    movl %edx, %eax
175; X86-NEXT:    cmovbl %edi, %eax
176; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
177; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
178; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
179; X86-NEXT:    movl %eax, %ebp
180; X86-NEXT:    sbbl %edi, %ebp
181; X86-NEXT:    cmovbl {{[0-9]+}}(%esp), %esi
182; X86-NEXT:    cmovbl {{[0-9]+}}(%esp), %ecx
183; X86-NEXT:    movl %eax, %ebp
184; X86-NEXT:    xorl %edi, %ebp
185; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
186; X86-NEXT:    xorl %edx, %eax
187; X86-NEXT:    orl %ebp, %eax
188; X86-NEXT:    cmovel %ebx, %ecx
189; X86-NEXT:    cmovel (%esp), %esi # 4-byte Folded Reload
190; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
191; X86-NEXT:    cmpl %edi, %eax
192; X86-NEXT:    cmovbl {{[0-9]+}}(%esp), %edx
193; X86-NEXT:    cmovel {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
194; X86-NEXT:    cmovbl %eax, %edi
195; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
196; X86-NEXT:    movl %edi, 12(%eax)
197; X86-NEXT:    movl %edx, 8(%eax)
198; X86-NEXT:    movl %esi, 4(%eax)
199; X86-NEXT:    movl %ecx, (%eax)
200; X86-NEXT:    addl $8, %esp
201; X86-NEXT:    popl %esi
202; X86-NEXT:    popl %edi
203; X86-NEXT:    popl %ebx
204; X86-NEXT:    popl %ebp
205; X86-NEXT:    retl $4
206  %r = call i128 @llvm.umin.i128(i128 %a, i128 %b)
207  ret i128 %r
208}
209
210define <1 x i32> @test_v1i32(<1 x i32> %a, <1 x i32> %b) nounwind {
211; X64-LABEL: test_v1i32:
212; X64:       # %bb.0:
213; X64-NEXT:    movl %esi, %eax
214; X64-NEXT:    cmpl %esi, %edi
215; X64-NEXT:    cmovbl %edi, %eax
216; X64-NEXT:    retq
217;
218; X86-LABEL: test_v1i32:
219; X86:       # %bb.0:
220; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
221; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
222; X86-NEXT:    cmpl %eax, %ecx
223; X86-NEXT:    cmovbl %ecx, %eax
224; X86-NEXT:    retl
225  %r = call <1 x i32> @llvm.umin.v1i32(<1 x i32> %a, <1 x i32> %b)
226  ret <1 x i32> %r
227}
228
229define <2 x i32> @test_v2i32(<2 x i32> %a, <2 x i32> %b) nounwind {
230; SSE-LABEL: test_v2i32:
231; SSE:       # %bb.0:
232; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
233; SSE-NEXT:    movdqa %xmm0, %xmm3
234; SSE-NEXT:    pxor %xmm2, %xmm3
235; SSE-NEXT:    pxor %xmm1, %xmm2
236; SSE-NEXT:    pcmpgtd %xmm3, %xmm2
237; SSE-NEXT:    pand %xmm2, %xmm0
238; SSE-NEXT:    pandn %xmm1, %xmm2
239; SSE-NEXT:    por %xmm2, %xmm0
240; SSE-NEXT:    retq
241;
242; AVX-LABEL: test_v2i32:
243; AVX:       # %bb.0:
244; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
245; AVX-NEXT:    retq
246;
247; X86-LABEL: test_v2i32:
248; X86:       # %bb.0:
249; X86-NEXT:    pushl %esi
250; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
251; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
252; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
253; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
254; X86-NEXT:    cmpl %eax, %esi
255; X86-NEXT:    cmovbl %esi, %eax
256; X86-NEXT:    cmpl %edx, %ecx
257; X86-NEXT:    cmovbl %ecx, %edx
258; X86-NEXT:    popl %esi
259; X86-NEXT:    retl
260  %r = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %a, <2 x i32> %b)
261  ret <2 x i32> %r
262}
263
264define <3 x i32> @test_v3i32(<3 x i32> %a, <3 x i32> %b) nounwind {
265; SSE-LABEL: test_v3i32:
266; SSE:       # %bb.0:
267; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
268; SSE-NEXT:    movdqa %xmm0, %xmm3
269; SSE-NEXT:    pxor %xmm2, %xmm3
270; SSE-NEXT:    pxor %xmm1, %xmm2
271; SSE-NEXT:    pcmpgtd %xmm3, %xmm2
272; SSE-NEXT:    pand %xmm2, %xmm0
273; SSE-NEXT:    pandn %xmm1, %xmm2
274; SSE-NEXT:    por %xmm2, %xmm0
275; SSE-NEXT:    retq
276;
277; AVX-LABEL: test_v3i32:
278; AVX:       # %bb.0:
279; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
280; AVX-NEXT:    retq
281;
282; X86-LABEL: test_v3i32:
283; X86:       # %bb.0:
284; X86-NEXT:    pushl %ebx
285; X86-NEXT:    pushl %edi
286; X86-NEXT:    pushl %esi
287; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
288; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
289; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
290; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
291; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
292; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
293; X86-NEXT:    cmpl %eax, %ebx
294; X86-NEXT:    cmovbl %ebx, %eax
295; X86-NEXT:    cmpl %edx, %edi
296; X86-NEXT:    cmovbl %edi, %edx
297; X86-NEXT:    cmpl %ecx, %esi
298; X86-NEXT:    cmovbl %esi, %ecx
299; X86-NEXT:    popl %esi
300; X86-NEXT:    popl %edi
301; X86-NEXT:    popl %ebx
302; X86-NEXT:    retl
303  %r = call <3 x i32> @llvm.umin.v3i32(<3 x i32> %a, <3 x i32> %b)
304  ret <3 x i32> %r
305}
306
307define <4 x i32> @test_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
308; SSE-LABEL: test_v4i32:
309; SSE:       # %bb.0:
310; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
311; SSE-NEXT:    movdqa %xmm0, %xmm3
312; SSE-NEXT:    pxor %xmm2, %xmm3
313; SSE-NEXT:    pxor %xmm1, %xmm2
314; SSE-NEXT:    pcmpgtd %xmm3, %xmm2
315; SSE-NEXT:    pand %xmm2, %xmm0
316; SSE-NEXT:    pandn %xmm1, %xmm2
317; SSE-NEXT:    por %xmm2, %xmm0
318; SSE-NEXT:    retq
319;
320; AVX-LABEL: test_v4i32:
321; AVX:       # %bb.0:
322; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
323; AVX-NEXT:    retq
324;
325; X86-LABEL: test_v4i32:
326; X86:       # %bb.0:
327; X86-NEXT:    pushl %edi
328; X86-NEXT:    pushl %esi
329; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
330; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
331; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
332; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
333; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
334; X86-NEXT:    cmpl %edi, %eax
335; X86-NEXT:    cmovbl %eax, %edi
336; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
337; X86-NEXT:    cmpl %esi, %eax
338; X86-NEXT:    cmovbl %eax, %esi
339; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
340; X86-NEXT:    cmpl %edx, %eax
341; X86-NEXT:    cmovbl %eax, %edx
342; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
343; X86-NEXT:    cmpl %ecx, %eax
344; X86-NEXT:    cmovbl %eax, %ecx
345; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
346; X86-NEXT:    movl %ecx, 12(%eax)
347; X86-NEXT:    movl %edx, 8(%eax)
348; X86-NEXT:    movl %esi, 4(%eax)
349; X86-NEXT:    movl %edi, (%eax)
350; X86-NEXT:    popl %esi
351; X86-NEXT:    popl %edi
352; X86-NEXT:    retl $4
353  %r = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %a, <4 x i32> %b)
354  ret <4 x i32> %r
355}
356
357define <8 x i32> @test_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
358; SSE-LABEL: test_v8i32:
359; SSE:       # %bb.0:
360; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
361; SSE-NEXT:    movdqa %xmm0, %xmm5
362; SSE-NEXT:    pxor %xmm4, %xmm5
363; SSE-NEXT:    movdqa %xmm2, %xmm6
364; SSE-NEXT:    pxor %xmm4, %xmm6
365; SSE-NEXT:    pcmpgtd %xmm5, %xmm6
366; SSE-NEXT:    pand %xmm6, %xmm0
367; SSE-NEXT:    pandn %xmm2, %xmm6
368; SSE-NEXT:    por %xmm6, %xmm0
369; SSE-NEXT:    movdqa %xmm1, %xmm2
370; SSE-NEXT:    pxor %xmm4, %xmm2
371; SSE-NEXT:    pxor %xmm3, %xmm4
372; SSE-NEXT:    pcmpgtd %xmm2, %xmm4
373; SSE-NEXT:    pand %xmm4, %xmm1
374; SSE-NEXT:    pandn %xmm3, %xmm4
375; SSE-NEXT:    por %xmm4, %xmm1
376; SSE-NEXT:    retq
377;
378; AVX1-LABEL: test_v8i32:
379; AVX1:       # %bb.0:
380; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
381; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
382; AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
383; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
384; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
385; AVX1-NEXT:    retq
386;
387; AVX2-LABEL: test_v8i32:
388; AVX2:       # %bb.0:
389; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
390; AVX2-NEXT:    retq
391;
392; X86-LABEL: test_v8i32:
393; X86:       # %bb.0:
394; X86-NEXT:    pushl %ebp
395; X86-NEXT:    pushl %ebx
396; X86-NEXT:    pushl %edi
397; X86-NEXT:    pushl %esi
398; X86-NEXT:    subl $8, %esp
399; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
400; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
401; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
402; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
403; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
404; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
405; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
406; X86-NEXT:    cmpl %ebp, %eax
407; X86-NEXT:    cmovbl %eax, %ebp
408; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
409; X86-NEXT:    cmpl %ebx, %eax
410; X86-NEXT:    cmovbl %eax, %ebx
411; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
412; X86-NEXT:    cmpl %edi, %eax
413; X86-NEXT:    cmovbl %eax, %edi
414; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
415; X86-NEXT:    cmpl %esi, %eax
416; X86-NEXT:    cmovbl %eax, %esi
417; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
418; X86-NEXT:    cmpl %edx, %eax
419; X86-NEXT:    cmovbl %eax, %edx
420; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
421; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
422; X86-NEXT:    cmpl %ecx, %eax
423; X86-NEXT:    cmovbl %eax, %ecx
424; X86-NEXT:    movl %ecx, (%esp) # 4-byte Spill
425; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
426; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
427; X86-NEXT:    cmpl %ecx, %eax
428; X86-NEXT:    cmovbl %eax, %ecx
429; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
430; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
431; X86-NEXT:    cmpl %eax, %edx
432; X86-NEXT:    cmovbl %edx, %eax
433; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
434; X86-NEXT:    movl %eax, 28(%edx)
435; X86-NEXT:    movl %ecx, 24(%edx)
436; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
437; X86-NEXT:    movl %eax, 20(%edx)
438; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
439; X86-NEXT:    movl %eax, 16(%edx)
440; X86-NEXT:    movl %esi, 12(%edx)
441; X86-NEXT:    movl %edi, 8(%edx)
442; X86-NEXT:    movl %ebx, 4(%edx)
443; X86-NEXT:    movl %ebp, (%edx)
444; X86-NEXT:    movl %edx, %eax
445; X86-NEXT:    addl $8, %esp
446; X86-NEXT:    popl %esi
447; X86-NEXT:    popl %edi
448; X86-NEXT:    popl %ebx
449; X86-NEXT:    popl %ebp
450; X86-NEXT:    retl $4
451  %r = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %a, <8 x i32> %b)
452  ret <8 x i32> %r
453}
454
455define <8 x i16> @test_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
456; SSE-LABEL: test_v8i16:
457; SSE:       # %bb.0:
458; SSE-NEXT:    movdqa %xmm0, %xmm2
459; SSE-NEXT:    psubusw %xmm1, %xmm2
460; SSE-NEXT:    psubw %xmm2, %xmm0
461; SSE-NEXT:    retq
462;
463; AVX-LABEL: test_v8i16:
464; AVX:       # %bb.0:
465; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
466; AVX-NEXT:    retq
467;
468; X86-LABEL: test_v8i16:
469; X86:       # %bb.0:
470; X86-NEXT:    pushl %ebp
471; X86-NEXT:    pushl %ebx
472; X86-NEXT:    pushl %edi
473; X86-NEXT:    pushl %esi
474; X86-NEXT:    subl $8, %esp
475; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
476; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
477; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
478; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
479; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
480; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
481; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
482; X86-NEXT:    cmpw %bp, %ax
483; X86-NEXT:    cmovbl %eax, %ebp
484; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
485; X86-NEXT:    cmpw %bx, %ax
486; X86-NEXT:    cmovbl %eax, %ebx
487; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
488; X86-NEXT:    cmpw %di, %ax
489; X86-NEXT:    cmovbl %eax, %edi
490; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
491; X86-NEXT:    cmpw %si, %ax
492; X86-NEXT:    cmovbl %eax, %esi
493; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
494; X86-NEXT:    cmpw %dx, %ax
495; X86-NEXT:    cmovbl %eax, %edx
496; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
497; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
498; X86-NEXT:    cmpw %cx, %ax
499; X86-NEXT:    cmovbl %eax, %ecx
500; X86-NEXT:    movl %ecx, (%esp) # 4-byte Spill
501; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
502; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
503; X86-NEXT:    cmpw %dx, %ax
504; X86-NEXT:    cmovbl %eax, %edx
505; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
506; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
507; X86-NEXT:    cmpw %ax, %cx
508; X86-NEXT:    cmovbl %ecx, %eax
509; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
510; X86-NEXT:    movw %ax, 14(%ecx)
511; X86-NEXT:    movw %dx, 12(%ecx)
512; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
513; X86-NEXT:    movw %ax, 10(%ecx)
514; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
515; X86-NEXT:    movw %ax, 8(%ecx)
516; X86-NEXT:    movw %si, 6(%ecx)
517; X86-NEXT:    movw %di, 4(%ecx)
518; X86-NEXT:    movw %bx, 2(%ecx)
519; X86-NEXT:    movw %bp, (%ecx)
520; X86-NEXT:    movl %ecx, %eax
521; X86-NEXT:    addl $8, %esp
522; X86-NEXT:    popl %esi
523; X86-NEXT:    popl %edi
524; X86-NEXT:    popl %ebx
525; X86-NEXT:    popl %ebp
526; X86-NEXT:    retl $4
527  %r = call <8 x i16> @llvm.umin.v8i16(<8 x i16> %a, <8 x i16> %b)
528  ret <8 x i16> %r
529}
530
531define <16 x i8> @test_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
532; SSE-LABEL: test_v16i8:
533; SSE:       # %bb.0:
534; SSE-NEXT:    pminub %xmm1, %xmm0
535; SSE-NEXT:    retq
536;
537; AVX-LABEL: test_v16i8:
538; AVX:       # %bb.0:
539; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
540; AVX-NEXT:    retq
541;
542; X86-LABEL: test_v16i8:
543; X86:       # %bb.0:
544; X86-NEXT:    pushl %ebp
545; X86-NEXT:    pushl %ebx
546; X86-NEXT:    pushl %edi
547; X86-NEXT:    pushl %esi
548; X86-NEXT:    subl $40, %esp
549; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
550; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
551; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
552; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
553; X86-NEXT:    cmpb %bl, %al
554; X86-NEXT:    cmovbl %eax, %ebx
555; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
556; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
557; X86-NEXT:    cmpb %dl, %al
558; X86-NEXT:    cmovbl %eax, %edx
559; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
560; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
561; X86-NEXT:    cmpb %cl, %al
562; X86-NEXT:    cmovbl %eax, %ecx
563; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
564; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
565; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
566; X86-NEXT:    cmpb %cl, %al
567; X86-NEXT:    cmovbl %eax, %ecx
568; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
569; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
570; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
571; X86-NEXT:    cmpb %cl, %al
572; X86-NEXT:    cmovbl %eax, %ecx
573; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
574; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
575; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
576; X86-NEXT:    cmpb %cl, %al
577; X86-NEXT:    cmovbl %eax, %ecx
578; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
579; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
580; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
581; X86-NEXT:    cmpb %cl, %al
582; X86-NEXT:    cmovbl %eax, %ecx
583; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
584; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
585; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
586; X86-NEXT:    cmpb %cl, %al
587; X86-NEXT:    cmovbl %eax, %ecx
588; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
589; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
590; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
591; X86-NEXT:    cmpb %cl, %al
592; X86-NEXT:    cmovbl %eax, %ecx
593; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
594; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
595; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
596; X86-NEXT:    cmpb %cl, %al
597; X86-NEXT:    cmovbl %eax, %ecx
598; X86-NEXT:    movl %ecx, (%esp) # 4-byte Spill
599; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
600; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
601; X86-NEXT:    cmpb %cl, %al
602; X86-NEXT:    cmovbl %eax, %ecx
603; X86-NEXT:    movl %ecx, %ebp
604; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
605; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
606; X86-NEXT:    cmpb %cl, %al
607; X86-NEXT:    cmovbl %eax, %ecx
608; X86-NEXT:    movl %ecx, %edi
609; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
610; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
611; X86-NEXT:    cmpb %cl, %al
612; X86-NEXT:    cmovbl %eax, %ecx
613; X86-NEXT:    movl %ecx, %esi
614; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
615; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
616; X86-NEXT:    cmpb %bl, %al
617; X86-NEXT:    cmovbl %eax, %ebx
618; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
619; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
620; X86-NEXT:    cmpb %dl, %al
621; X86-NEXT:    cmovbl %eax, %edx
622; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
623; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
624; X86-NEXT:    cmpb %cl, %al
625; X86-NEXT:    cmovbl %eax, %ecx
626; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
627; X86-NEXT:    movb %cl, 15(%eax)
628; X86-NEXT:    movb %dl, 14(%eax)
629; X86-NEXT:    movb %bl, 13(%eax)
630; X86-NEXT:    movl %esi, %ecx
631; X86-NEXT:    movb %cl, 12(%eax)
632; X86-NEXT:    movl %edi, %ecx
633; X86-NEXT:    movb %cl, 11(%eax)
634; X86-NEXT:    movl %ebp, %ecx
635; X86-NEXT:    movb %cl, 10(%eax)
636; X86-NEXT:    movl (%esp), %ecx # 4-byte Reload
637; X86-NEXT:    movb %cl, 9(%eax)
638; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
639; X86-NEXT:    movb %cl, 8(%eax)
640; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
641; X86-NEXT:    movb %cl, 7(%eax)
642; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
643; X86-NEXT:    movb %cl, 6(%eax)
644; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
645; X86-NEXT:    movb %cl, 5(%eax)
646; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
647; X86-NEXT:    movb %cl, 4(%eax)
648; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
649; X86-NEXT:    movb %cl, 3(%eax)
650; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
651; X86-NEXT:    movb %cl, 2(%eax)
652; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
653; X86-NEXT:    movb %cl, 1(%eax)
654; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
655; X86-NEXT:    movb %cl, (%eax)
656; X86-NEXT:    addl $40, %esp
657; X86-NEXT:    popl %esi
658; X86-NEXT:    popl %edi
659; X86-NEXT:    popl %ebx
660; X86-NEXT:    popl %ebp
661; X86-NEXT:    retl $4
662  %r = call <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b)
663  ret <16 x i8> %r
664}
665