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