xref: /llvm-project/llvm/test/CodeGen/X86/vector-reduce-umax.ll (revision 44f316811016e677ca3e6c6237619e71bae28986)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE4,SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE4,SSE42
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
9
10;
11; vXi64
12;
13
14define i64 @test_v2i64(<2 x i64> %a0) {
15; SSE2-LABEL: test_v2i64:
16; SSE2:       # %bb.0:
17; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
18; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
19; SSE2-NEXT:    movdqa %xmm0, %xmm3
20; SSE2-NEXT:    pxor %xmm2, %xmm3
21; SSE2-NEXT:    pxor %xmm1, %xmm2
22; SSE2-NEXT:    movdqa %xmm3, %xmm4
23; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
24; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
25; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
26; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
27; SSE2-NEXT:    pand %xmm5, %xmm2
28; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
29; SSE2-NEXT:    por %xmm2, %xmm3
30; SSE2-NEXT:    pand %xmm3, %xmm0
31; SSE2-NEXT:    pandn %xmm1, %xmm3
32; SSE2-NEXT:    por %xmm0, %xmm3
33; SSE2-NEXT:    movq %xmm3, %rax
34; SSE2-NEXT:    retq
35;
36; SSE41-LABEL: test_v2i64:
37; SSE41:       # %bb.0:
38; SSE41-NEXT:    movdqa %xmm0, %xmm1
39; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
40; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
41; SSE41-NEXT:    movdqa %xmm1, %xmm3
42; SSE41-NEXT:    pxor %xmm0, %xmm3
43; SSE41-NEXT:    pxor %xmm2, %xmm0
44; SSE41-NEXT:    movdqa %xmm3, %xmm4
45; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
46; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
47; SSE41-NEXT:    pmovsxdq %xmm3, %xmm0
48; SSE41-NEXT:    pand %xmm4, %xmm0
49; SSE41-NEXT:    por %xmm3, %xmm0
50; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
51; SSE41-NEXT:    movq %xmm2, %rax
52; SSE41-NEXT:    retq
53;
54; SSE42-LABEL: test_v2i64:
55; SSE42:       # %bb.0:
56; SSE42-NEXT:    movdqa %xmm0, %xmm1
57; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
58; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
59; SSE42-NEXT:    pxor %xmm3, %xmm0
60; SSE42-NEXT:    pxor %xmm2, %xmm3
61; SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
62; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
63; SSE42-NEXT:    movq %xmm2, %rax
64; SSE42-NEXT:    retq
65;
66; AVX1-LABEL: test_v2i64:
67; AVX1:       # %bb.0:
68; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
69; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
70; AVX1-NEXT:    # xmm2 = mem[0,0]
71; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
72; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
73; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
74; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
75; AVX1-NEXT:    vmovq %xmm0, %rax
76; AVX1-NEXT:    retq
77;
78; AVX2-LABEL: test_v2i64:
79; AVX2:       # %bb.0:
80; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
81; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
82; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
83; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
84; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
85; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
86; AVX2-NEXT:    vmovq %xmm0, %rax
87; AVX2-NEXT:    retq
88;
89; AVX512BW-LABEL: test_v2i64:
90; AVX512BW:       # %bb.0:
91; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
92; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
93; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
94; AVX512BW-NEXT:    vmovq %xmm0, %rax
95; AVX512BW-NEXT:    vzeroupper
96; AVX512BW-NEXT:    retq
97;
98; AVX512VL-LABEL: test_v2i64:
99; AVX512VL:       # %bb.0:
100; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
101; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
102; AVX512VL-NEXT:    vmovq %xmm0, %rax
103; AVX512VL-NEXT:    retq
104  %1 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> %a0)
105  ret i64 %1
106}
107
108define i64 @test_v4i64(<4 x i64> %a0) {
109; SSE2-LABEL: test_v4i64:
110; SSE2:       # %bb.0:
111; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
112; SSE2-NEXT:    movdqa %xmm1, %xmm3
113; SSE2-NEXT:    pxor %xmm2, %xmm3
114; SSE2-NEXT:    movdqa %xmm0, %xmm4
115; SSE2-NEXT:    pxor %xmm2, %xmm4
116; SSE2-NEXT:    movdqa %xmm4, %xmm5
117; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
118; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
119; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
120; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
121; SSE2-NEXT:    pand %xmm6, %xmm3
122; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
123; SSE2-NEXT:    por %xmm3, %xmm4
124; SSE2-NEXT:    pand %xmm4, %xmm0
125; SSE2-NEXT:    pandn %xmm1, %xmm4
126; SSE2-NEXT:    por %xmm0, %xmm4
127; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
128; SSE2-NEXT:    movdqa %xmm4, %xmm1
129; SSE2-NEXT:    pxor %xmm2, %xmm1
130; SSE2-NEXT:    pxor %xmm0, %xmm2
131; SSE2-NEXT:    movdqa %xmm1, %xmm3
132; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
133; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
134; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
135; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
136; SSE2-NEXT:    pand %xmm5, %xmm1
137; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
138; SSE2-NEXT:    por %xmm1, %xmm2
139; SSE2-NEXT:    pand %xmm2, %xmm4
140; SSE2-NEXT:    pandn %xmm0, %xmm2
141; SSE2-NEXT:    por %xmm4, %xmm2
142; SSE2-NEXT:    movq %xmm2, %rax
143; SSE2-NEXT:    retq
144;
145; SSE41-LABEL: test_v4i64:
146; SSE41:       # %bb.0:
147; SSE41-NEXT:    movdqa %xmm0, %xmm2
148; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
149; SSE41-NEXT:    movdqa %xmm1, %xmm0
150; SSE41-NEXT:    pxor %xmm3, %xmm0
151; SSE41-NEXT:    movdqa %xmm2, %xmm4
152; SSE41-NEXT:    pxor %xmm3, %xmm4
153; SSE41-NEXT:    movdqa %xmm4, %xmm5
154; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
155; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
156; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
157; SSE41-NEXT:    pand %xmm5, %xmm0
158; SSE41-NEXT:    por %xmm4, %xmm0
159; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
160; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
161; SSE41-NEXT:    movdqa %xmm1, %xmm4
162; SSE41-NEXT:    pxor %xmm3, %xmm4
163; SSE41-NEXT:    pxor %xmm2, %xmm3
164; SSE41-NEXT:    movdqa %xmm4, %xmm5
165; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
166; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
167; SSE41-NEXT:    pmovsxdq %xmm4, %xmm0
168; SSE41-NEXT:    pand %xmm5, %xmm0
169; SSE41-NEXT:    por %xmm4, %xmm0
170; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
171; SSE41-NEXT:    movq %xmm2, %rax
172; SSE41-NEXT:    retq
173;
174; SSE42-LABEL: test_v4i64:
175; SSE42:       # %bb.0:
176; SSE42-NEXT:    movdqa %xmm0, %xmm2
177; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
178; SSE42-NEXT:    movdqa %xmm1, %xmm4
179; SSE42-NEXT:    pxor %xmm3, %xmm4
180; SSE42-NEXT:    pxor %xmm3, %xmm0
181; SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
182; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
183; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
184; SSE42-NEXT:    movdqa %xmm1, %xmm0
185; SSE42-NEXT:    pxor %xmm3, %xmm0
186; SSE42-NEXT:    pxor %xmm2, %xmm3
187; SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
188; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
189; SSE42-NEXT:    movq %xmm2, %rax
190; SSE42-NEXT:    retq
191;
192; AVX1-LABEL: test_v4i64:
193; AVX1:       # %bb.0:
194; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
195; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
196; AVX1-NEXT:    # xmm2 = mem[0,0]
197; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
198; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm4
199; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
200; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
201; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
202; AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
203; AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
204; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
205; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
206; AVX1-NEXT:    vmovq %xmm0, %rax
207; AVX1-NEXT:    vzeroupper
208; AVX1-NEXT:    retq
209;
210; AVX2-LABEL: test_v4i64:
211; AVX2:       # %bb.0:
212; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
213; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
214; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
215; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm4
216; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
217; AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
218; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
219; AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
220; AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
221; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
222; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
223; AVX2-NEXT:    vmovq %xmm0, %rax
224; AVX2-NEXT:    vzeroupper
225; AVX2-NEXT:    retq
226;
227; AVX512BW-LABEL: test_v4i64:
228; AVX512BW:       # %bb.0:
229; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
230; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
231; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
232; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
233; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
234; AVX512BW-NEXT:    vmovq %xmm0, %rax
235; AVX512BW-NEXT:    vzeroupper
236; AVX512BW-NEXT:    retq
237;
238; AVX512VL-LABEL: test_v4i64:
239; AVX512VL:       # %bb.0:
240; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
241; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
242; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
243; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
244; AVX512VL-NEXT:    vmovq %xmm0, %rax
245; AVX512VL-NEXT:    vzeroupper
246; AVX512VL-NEXT:    retq
247  %1 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> %a0)
248  ret i64 %1
249}
250
251define i64 @test_v8i64(<8 x i64> %a0) {
252; SSE2-LABEL: test_v8i64:
253; SSE2:       # %bb.0:
254; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
255; SSE2-NEXT:    movdqa %xmm2, %xmm5
256; SSE2-NEXT:    pxor %xmm4, %xmm5
257; SSE2-NEXT:    movdqa %xmm0, %xmm6
258; SSE2-NEXT:    pxor %xmm4, %xmm6
259; SSE2-NEXT:    movdqa %xmm6, %xmm7
260; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
261; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
262; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
263; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
264; SSE2-NEXT:    pand %xmm8, %xmm6
265; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
266; SSE2-NEXT:    por %xmm6, %xmm5
267; SSE2-NEXT:    pand %xmm5, %xmm0
268; SSE2-NEXT:    pandn %xmm2, %xmm5
269; SSE2-NEXT:    por %xmm0, %xmm5
270; SSE2-NEXT:    movdqa %xmm3, %xmm0
271; SSE2-NEXT:    pxor %xmm4, %xmm0
272; SSE2-NEXT:    movdqa %xmm1, %xmm2
273; SSE2-NEXT:    pxor %xmm4, %xmm2
274; SSE2-NEXT:    movdqa %xmm2, %xmm6
275; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
276; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
277; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
278; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
279; SSE2-NEXT:    pand %xmm7, %xmm0
280; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
281; SSE2-NEXT:    por %xmm0, %xmm2
282; SSE2-NEXT:    pand %xmm2, %xmm1
283; SSE2-NEXT:    pandn %xmm3, %xmm2
284; SSE2-NEXT:    por %xmm1, %xmm2
285; SSE2-NEXT:    movdqa %xmm2, %xmm0
286; SSE2-NEXT:    pxor %xmm4, %xmm0
287; SSE2-NEXT:    movdqa %xmm5, %xmm1
288; SSE2-NEXT:    pxor %xmm4, %xmm1
289; SSE2-NEXT:    movdqa %xmm1, %xmm3
290; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
291; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
292; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
293; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
294; SSE2-NEXT:    pand %xmm6, %xmm0
295; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
296; SSE2-NEXT:    por %xmm0, %xmm1
297; SSE2-NEXT:    pand %xmm1, %xmm5
298; SSE2-NEXT:    pandn %xmm2, %xmm1
299; SSE2-NEXT:    por %xmm5, %xmm1
300; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
301; SSE2-NEXT:    movdqa %xmm1, %xmm2
302; SSE2-NEXT:    pxor %xmm4, %xmm2
303; SSE2-NEXT:    pxor %xmm0, %xmm4
304; SSE2-NEXT:    movdqa %xmm2, %xmm3
305; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
306; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
307; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
308; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
309; SSE2-NEXT:    pand %xmm5, %xmm2
310; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
311; SSE2-NEXT:    por %xmm2, %xmm3
312; SSE2-NEXT:    pand %xmm3, %xmm1
313; SSE2-NEXT:    pandn %xmm0, %xmm3
314; SSE2-NEXT:    por %xmm1, %xmm3
315; SSE2-NEXT:    movq %xmm3, %rax
316; SSE2-NEXT:    retq
317;
318; SSE41-LABEL: test_v8i64:
319; SSE41:       # %bb.0:
320; SSE41-NEXT:    movdqa %xmm0, %xmm4
321; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
322; SSE41-NEXT:    movdqa %xmm2, %xmm0
323; SSE41-NEXT:    pxor %xmm5, %xmm0
324; SSE41-NEXT:    movdqa %xmm4, %xmm6
325; SSE41-NEXT:    pxor %xmm5, %xmm6
326; SSE41-NEXT:    movdqa %xmm6, %xmm7
327; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
328; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
329; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
330; SSE41-NEXT:    pand %xmm7, %xmm0
331; SSE41-NEXT:    por %xmm6, %xmm0
332; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
333; SSE41-NEXT:    movdqa %xmm3, %xmm0
334; SSE41-NEXT:    pxor %xmm5, %xmm0
335; SSE41-NEXT:    movdqa %xmm1, %xmm4
336; SSE41-NEXT:    pxor %xmm5, %xmm4
337; SSE41-NEXT:    movdqa %xmm4, %xmm6
338; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
339; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
340; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
341; SSE41-NEXT:    pand %xmm6, %xmm0
342; SSE41-NEXT:    por %xmm4, %xmm0
343; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
344; SSE41-NEXT:    movapd %xmm3, %xmm0
345; SSE41-NEXT:    xorpd %xmm5, %xmm0
346; SSE41-NEXT:    movapd %xmm2, %xmm1
347; SSE41-NEXT:    xorpd %xmm5, %xmm1
348; SSE41-NEXT:    movapd %xmm1, %xmm4
349; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
350; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
351; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
352; SSE41-NEXT:    pand %xmm4, %xmm0
353; SSE41-NEXT:    por %xmm1, %xmm0
354; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
355; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
356; SSE41-NEXT:    movdqa %xmm3, %xmm2
357; SSE41-NEXT:    pxor %xmm5, %xmm2
358; SSE41-NEXT:    pxor %xmm1, %xmm5
359; SSE41-NEXT:    movdqa %xmm2, %xmm4
360; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
361; SSE41-NEXT:    pcmpgtd %xmm5, %xmm2
362; SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
363; SSE41-NEXT:    pand %xmm4, %xmm0
364; SSE41-NEXT:    por %xmm2, %xmm0
365; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
366; SSE41-NEXT:    movq %xmm1, %rax
367; SSE41-NEXT:    retq
368;
369; SSE42-LABEL: test_v8i64:
370; SSE42:       # %bb.0:
371; SSE42-NEXT:    movdqa %xmm0, %xmm4
372; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
373; SSE42-NEXT:    movdqa %xmm2, %xmm6
374; SSE42-NEXT:    pxor %xmm5, %xmm6
375; SSE42-NEXT:    pxor %xmm5, %xmm0
376; SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
377; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
378; SSE42-NEXT:    movdqa %xmm3, %xmm4
379; SSE42-NEXT:    pxor %xmm5, %xmm4
380; SSE42-NEXT:    movdqa %xmm1, %xmm0
381; SSE42-NEXT:    pxor %xmm5, %xmm0
382; SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
383; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
384; SSE42-NEXT:    movapd %xmm3, %xmm1
385; SSE42-NEXT:    xorpd %xmm5, %xmm1
386; SSE42-NEXT:    movapd %xmm2, %xmm0
387; SSE42-NEXT:    xorpd %xmm5, %xmm0
388; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
389; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
390; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
391; SSE42-NEXT:    movdqa %xmm3, %xmm0
392; SSE42-NEXT:    pxor %xmm5, %xmm0
393; SSE42-NEXT:    pxor %xmm1, %xmm5
394; SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
395; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
396; SSE42-NEXT:    movq %xmm1, %rax
397; SSE42-NEXT:    retq
398;
399; AVX1-LABEL: test_v8i64:
400; AVX1:       # %bb.0:
401; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
402; AVX1-NEXT:    # xmm2 = mem[0,0]
403; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
404; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm4
405; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
406; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm3
407; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
408; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm4
409; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
410; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm5
411; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
412; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm0
413; AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
414; AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm4
415; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
416; AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
417; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
418; AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
419; AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
420; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
421; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
422; AVX1-NEXT:    vmovq %xmm0, %rax
423; AVX1-NEXT:    vzeroupper
424; AVX1-NEXT:    retq
425;
426; AVX2-LABEL: test_v8i64:
427; AVX2:       # %bb.0:
428; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
429; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
430; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm4
431; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
432; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
433; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
434; AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm3
435; AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm4
436; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
437; AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
438; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
439; AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
440; AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
441; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
442; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
443; AVX2-NEXT:    vmovq %xmm0, %rax
444; AVX2-NEXT:    vzeroupper
445; AVX2-NEXT:    retq
446;
447; AVX512BW-LABEL: test_v8i64:
448; AVX512BW:       # %bb.0:
449; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
450; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
451; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
452; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
453; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
454; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
455; AVX512BW-NEXT:    vmovq %xmm0, %rax
456; AVX512BW-NEXT:    vzeroupper
457; AVX512BW-NEXT:    retq
458;
459; AVX512VL-LABEL: test_v8i64:
460; AVX512VL:       # %bb.0:
461; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
462; AVX512VL-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
463; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
464; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
465; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
466; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
467; AVX512VL-NEXT:    vmovq %xmm0, %rax
468; AVX512VL-NEXT:    vzeroupper
469; AVX512VL-NEXT:    retq
470  %1 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> %a0)
471  ret i64 %1
472}
473
474define i64 @test_v16i64(<16 x i64> %a0) {
475; SSE2-LABEL: test_v16i64:
476; SSE2:       # %bb.0:
477; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
478; SSE2-NEXT:    movdqa %xmm5, %xmm9
479; SSE2-NEXT:    pxor %xmm8, %xmm9
480; SSE2-NEXT:    movdqa %xmm1, %xmm10
481; SSE2-NEXT:    pxor %xmm8, %xmm10
482; SSE2-NEXT:    movdqa %xmm10, %xmm11
483; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
484; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
485; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
486; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
487; SSE2-NEXT:    pand %xmm12, %xmm10
488; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
489; SSE2-NEXT:    por %xmm10, %xmm9
490; SSE2-NEXT:    pand %xmm9, %xmm1
491; SSE2-NEXT:    pandn %xmm5, %xmm9
492; SSE2-NEXT:    por %xmm1, %xmm9
493; SSE2-NEXT:    movdqa %xmm7, %xmm1
494; SSE2-NEXT:    pxor %xmm8, %xmm1
495; SSE2-NEXT:    movdqa %xmm3, %xmm5
496; SSE2-NEXT:    pxor %xmm8, %xmm5
497; SSE2-NEXT:    movdqa %xmm5, %xmm10
498; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
499; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
500; SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
501; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
502; SSE2-NEXT:    pand %xmm11, %xmm5
503; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
504; SSE2-NEXT:    por %xmm5, %xmm1
505; SSE2-NEXT:    pand %xmm1, %xmm3
506; SSE2-NEXT:    pandn %xmm7, %xmm1
507; SSE2-NEXT:    por %xmm3, %xmm1
508; SSE2-NEXT:    movdqa %xmm4, %xmm3
509; SSE2-NEXT:    pxor %xmm8, %xmm3
510; SSE2-NEXT:    movdqa %xmm0, %xmm5
511; SSE2-NEXT:    pxor %xmm8, %xmm5
512; SSE2-NEXT:    movdqa %xmm5, %xmm7
513; SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
514; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
515; SSE2-NEXT:    pcmpeqd %xmm3, %xmm5
516; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
517; SSE2-NEXT:    pand %xmm10, %xmm5
518; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
519; SSE2-NEXT:    por %xmm5, %xmm3
520; SSE2-NEXT:    pand %xmm3, %xmm0
521; SSE2-NEXT:    pandn %xmm4, %xmm3
522; SSE2-NEXT:    por %xmm0, %xmm3
523; SSE2-NEXT:    movdqa %xmm6, %xmm0
524; SSE2-NEXT:    pxor %xmm8, %xmm0
525; SSE2-NEXT:    movdqa %xmm2, %xmm4
526; SSE2-NEXT:    pxor %xmm8, %xmm4
527; SSE2-NEXT:    movdqa %xmm4, %xmm5
528; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
529; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
530; SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
531; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
532; SSE2-NEXT:    pand %xmm7, %xmm0
533; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
534; SSE2-NEXT:    por %xmm0, %xmm4
535; SSE2-NEXT:    pand %xmm4, %xmm2
536; SSE2-NEXT:    pandn %xmm6, %xmm4
537; SSE2-NEXT:    por %xmm2, %xmm4
538; SSE2-NEXT:    movdqa %xmm4, %xmm0
539; SSE2-NEXT:    pxor %xmm8, %xmm0
540; SSE2-NEXT:    movdqa %xmm3, %xmm2
541; SSE2-NEXT:    pxor %xmm8, %xmm2
542; SSE2-NEXT:    movdqa %xmm2, %xmm5
543; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
544; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
545; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
546; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
547; SSE2-NEXT:    pand %xmm6, %xmm2
548; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
549; SSE2-NEXT:    por %xmm2, %xmm0
550; SSE2-NEXT:    pand %xmm0, %xmm3
551; SSE2-NEXT:    pandn %xmm4, %xmm0
552; SSE2-NEXT:    por %xmm3, %xmm0
553; SSE2-NEXT:    movdqa %xmm1, %xmm2
554; SSE2-NEXT:    pxor %xmm8, %xmm2
555; SSE2-NEXT:    movdqa %xmm9, %xmm3
556; SSE2-NEXT:    pxor %xmm8, %xmm3
557; SSE2-NEXT:    movdqa %xmm3, %xmm4
558; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
559; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
560; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
561; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
562; SSE2-NEXT:    pand %xmm5, %xmm2
563; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
564; SSE2-NEXT:    por %xmm2, %xmm3
565; SSE2-NEXT:    pand %xmm3, %xmm9
566; SSE2-NEXT:    pandn %xmm1, %xmm3
567; SSE2-NEXT:    por %xmm9, %xmm3
568; SSE2-NEXT:    movdqa %xmm3, %xmm1
569; SSE2-NEXT:    pxor %xmm8, %xmm1
570; SSE2-NEXT:    movdqa %xmm0, %xmm2
571; SSE2-NEXT:    pxor %xmm8, %xmm2
572; SSE2-NEXT:    movdqa %xmm2, %xmm4
573; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
574; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
575; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
576; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
577; SSE2-NEXT:    pand %xmm5, %xmm1
578; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
579; SSE2-NEXT:    por %xmm1, %xmm2
580; SSE2-NEXT:    pand %xmm2, %xmm0
581; SSE2-NEXT:    pandn %xmm3, %xmm2
582; SSE2-NEXT:    por %xmm0, %xmm2
583; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
584; SSE2-NEXT:    movdqa %xmm2, %xmm1
585; SSE2-NEXT:    pxor %xmm8, %xmm1
586; SSE2-NEXT:    pxor %xmm0, %xmm8
587; SSE2-NEXT:    movdqa %xmm1, %xmm3
588; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
589; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
590; SSE2-NEXT:    pcmpeqd %xmm1, %xmm8
591; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
592; SSE2-NEXT:    pand %xmm4, %xmm1
593; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
594; SSE2-NEXT:    por %xmm1, %xmm3
595; SSE2-NEXT:    pand %xmm3, %xmm2
596; SSE2-NEXT:    pandn %xmm0, %xmm3
597; SSE2-NEXT:    por %xmm2, %xmm3
598; SSE2-NEXT:    movq %xmm3, %rax
599; SSE2-NEXT:    retq
600;
601; SSE41-LABEL: test_v16i64:
602; SSE41:       # %bb.0:
603; SSE41-NEXT:    movdqa %xmm0, %xmm8
604; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
605; SSE41-NEXT:    movdqa %xmm5, %xmm0
606; SSE41-NEXT:    pxor %xmm9, %xmm0
607; SSE41-NEXT:    movdqa %xmm1, %xmm10
608; SSE41-NEXT:    pxor %xmm9, %xmm10
609; SSE41-NEXT:    movdqa %xmm10, %xmm11
610; SSE41-NEXT:    pcmpeqd %xmm0, %xmm11
611; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
612; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]
613; SSE41-NEXT:    pand %xmm11, %xmm0
614; SSE41-NEXT:    por %xmm10, %xmm0
615; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
616; SSE41-NEXT:    movdqa %xmm7, %xmm0
617; SSE41-NEXT:    pxor %xmm9, %xmm0
618; SSE41-NEXT:    movdqa %xmm3, %xmm1
619; SSE41-NEXT:    pxor %xmm9, %xmm1
620; SSE41-NEXT:    movdqa %xmm1, %xmm10
621; SSE41-NEXT:    pcmpeqd %xmm0, %xmm10
622; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
623; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
624; SSE41-NEXT:    pand %xmm10, %xmm0
625; SSE41-NEXT:    por %xmm1, %xmm0
626; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
627; SSE41-NEXT:    movdqa %xmm4, %xmm0
628; SSE41-NEXT:    pxor %xmm9, %xmm0
629; SSE41-NEXT:    movdqa %xmm8, %xmm1
630; SSE41-NEXT:    pxor %xmm9, %xmm1
631; SSE41-NEXT:    movdqa %xmm1, %xmm3
632; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
633; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
634; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
635; SSE41-NEXT:    pand %xmm3, %xmm0
636; SSE41-NEXT:    por %xmm1, %xmm0
637; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
638; SSE41-NEXT:    movdqa %xmm6, %xmm0
639; SSE41-NEXT:    pxor %xmm9, %xmm0
640; SSE41-NEXT:    movdqa %xmm2, %xmm1
641; SSE41-NEXT:    pxor %xmm9, %xmm1
642; SSE41-NEXT:    movdqa %xmm1, %xmm3
643; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
644; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
645; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
646; SSE41-NEXT:    pand %xmm3, %xmm0
647; SSE41-NEXT:    por %xmm1, %xmm0
648; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
649; SSE41-NEXT:    movapd %xmm6, %xmm0
650; SSE41-NEXT:    xorpd %xmm9, %xmm0
651; SSE41-NEXT:    movapd %xmm4, %xmm1
652; SSE41-NEXT:    xorpd %xmm9, %xmm1
653; SSE41-NEXT:    movapd %xmm1, %xmm2
654; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
655; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
656; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
657; SSE41-NEXT:    pand %xmm2, %xmm0
658; SSE41-NEXT:    por %xmm1, %xmm0
659; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
660; SSE41-NEXT:    movapd %xmm7, %xmm0
661; SSE41-NEXT:    xorpd %xmm9, %xmm0
662; SSE41-NEXT:    movapd %xmm5, %xmm1
663; SSE41-NEXT:    xorpd %xmm9, %xmm1
664; SSE41-NEXT:    movapd %xmm1, %xmm2
665; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
666; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
667; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
668; SSE41-NEXT:    pand %xmm2, %xmm0
669; SSE41-NEXT:    por %xmm1, %xmm0
670; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
671; SSE41-NEXT:    movapd %xmm7, %xmm0
672; SSE41-NEXT:    xorpd %xmm9, %xmm0
673; SSE41-NEXT:    movapd %xmm6, %xmm1
674; SSE41-NEXT:    xorpd %xmm9, %xmm1
675; SSE41-NEXT:    movapd %xmm1, %xmm2
676; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
677; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
678; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
679; SSE41-NEXT:    pand %xmm2, %xmm0
680; SSE41-NEXT:    por %xmm1, %xmm0
681; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
682; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
683; SSE41-NEXT:    movdqa %xmm7, %xmm2
684; SSE41-NEXT:    pxor %xmm9, %xmm2
685; SSE41-NEXT:    pxor %xmm1, %xmm9
686; SSE41-NEXT:    movdqa %xmm2, %xmm3
687; SSE41-NEXT:    pcmpeqd %xmm9, %xmm3
688; SSE41-NEXT:    pcmpgtd %xmm9, %xmm2
689; SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
690; SSE41-NEXT:    pand %xmm3, %xmm0
691; SSE41-NEXT:    por %xmm2, %xmm0
692; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
693; SSE41-NEXT:    movq %xmm1, %rax
694; SSE41-NEXT:    retq
695;
696; SSE42-LABEL: test_v16i64:
697; SSE42:       # %bb.0:
698; SSE42-NEXT:    movdqa %xmm0, %xmm8
699; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [9223372036854775808,9223372036854775808]
700; SSE42-NEXT:    movdqa %xmm5, %xmm10
701; SSE42-NEXT:    pxor %xmm9, %xmm10
702; SSE42-NEXT:    movdqa %xmm1, %xmm0
703; SSE42-NEXT:    pxor %xmm9, %xmm0
704; SSE42-NEXT:    pcmpgtq %xmm10, %xmm0
705; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
706; SSE42-NEXT:    movdqa %xmm7, %xmm1
707; SSE42-NEXT:    pxor %xmm9, %xmm1
708; SSE42-NEXT:    movdqa %xmm3, %xmm0
709; SSE42-NEXT:    pxor %xmm9, %xmm0
710; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
711; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
712; SSE42-NEXT:    movdqa %xmm4, %xmm1
713; SSE42-NEXT:    pxor %xmm9, %xmm1
714; SSE42-NEXT:    movdqa %xmm8, %xmm0
715; SSE42-NEXT:    pxor %xmm9, %xmm0
716; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
717; SSE42-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
718; SSE42-NEXT:    movdqa %xmm6, %xmm1
719; SSE42-NEXT:    pxor %xmm9, %xmm1
720; SSE42-NEXT:    movdqa %xmm2, %xmm0
721; SSE42-NEXT:    pxor %xmm9, %xmm0
722; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
723; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
724; SSE42-NEXT:    movapd %xmm6, %xmm1
725; SSE42-NEXT:    xorpd %xmm9, %xmm1
726; SSE42-NEXT:    movapd %xmm4, %xmm0
727; SSE42-NEXT:    xorpd %xmm9, %xmm0
728; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
729; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
730; SSE42-NEXT:    movapd %xmm7, %xmm1
731; SSE42-NEXT:    xorpd %xmm9, %xmm1
732; SSE42-NEXT:    movapd %xmm5, %xmm0
733; SSE42-NEXT:    xorpd %xmm9, %xmm0
734; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
735; SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
736; SSE42-NEXT:    movapd %xmm7, %xmm1
737; SSE42-NEXT:    xorpd %xmm9, %xmm1
738; SSE42-NEXT:    movapd %xmm6, %xmm0
739; SSE42-NEXT:    xorpd %xmm9, %xmm0
740; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
741; SSE42-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
742; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
743; SSE42-NEXT:    movdqa %xmm7, %xmm0
744; SSE42-NEXT:    pxor %xmm9, %xmm0
745; SSE42-NEXT:    pxor %xmm1, %xmm9
746; SSE42-NEXT:    pcmpgtq %xmm9, %xmm0
747; SSE42-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
748; SSE42-NEXT:    movq %xmm1, %rax
749; SSE42-NEXT:    retq
750;
751; AVX1-LABEL: test_v16i64:
752; AVX1:       # %bb.0:
753; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
754; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
755; AVX1-NEXT:    # xmm4 = mem[0,0]
756; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm6
757; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
758; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm8
759; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm8, %xmm6
760; AVX1-NEXT:    vblendvpd %xmm6, %xmm7, %xmm5, %xmm5
761; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm6
762; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm7
763; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm8
764; AVX1-NEXT:    vpxor %xmm4, %xmm8, %xmm9
765; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm9, %xmm7
766; AVX1-NEXT:    vblendvpd %xmm7, %xmm8, %xmm6, %xmm6
767; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm7
768; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm8
769; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm8, %xmm7
770; AVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm2, %xmm0
771; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm2
772; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
773; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm2
774; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm3, %xmm1
775; AVX1-NEXT:    vxorpd %xmm4, %xmm1, %xmm2
776; AVX1-NEXT:    vxorpd %xmm4, %xmm0, %xmm3
777; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
778; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
779; AVX1-NEXT:    vxorpd %xmm4, %xmm6, %xmm1
780; AVX1-NEXT:    vxorpd %xmm4, %xmm5, %xmm2
781; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
782; AVX1-NEXT:    vblendvpd %xmm1, %xmm5, %xmm6, %xmm1
783; AVX1-NEXT:    vxorpd %xmm4, %xmm1, %xmm2
784; AVX1-NEXT:    vxorpd %xmm4, %xmm0, %xmm3
785; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
786; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
787; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
788; AVX1-NEXT:    vxorpd %xmm4, %xmm0, %xmm2
789; AVX1-NEXT:    vxorpd %xmm4, %xmm1, %xmm3
790; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
791; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
792; AVX1-NEXT:    vmovq %xmm0, %rax
793; AVX1-NEXT:    vzeroupper
794; AVX1-NEXT:    retq
795;
796; AVX2-LABEL: test_v16i64:
797; AVX2:       # %bb.0:
798; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
799; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
800; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm6
801; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
802; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
803; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
804; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm5
805; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm5, %ymm2
806; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm3, %ymm1
807; AVX2-NEXT:    vxorpd %ymm4, %ymm1, %ymm2
808; AVX2-NEXT:    vxorpd %ymm4, %ymm0, %ymm3
809; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
810; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
811; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
812; AVX2-NEXT:    vxorpd %xmm4, %xmm1, %xmm2
813; AVX2-NEXT:    vxorpd %xmm4, %xmm0, %xmm3
814; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
815; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
816; AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
817; AVX2-NEXT:    vxorpd %xmm4, %xmm0, %xmm2
818; AVX2-NEXT:    vxorpd %xmm4, %xmm1, %xmm3
819; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
820; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
821; AVX2-NEXT:    vmovq %xmm0, %rax
822; AVX2-NEXT:    vzeroupper
823; AVX2-NEXT:    retq
824;
825; AVX512BW-LABEL: test_v16i64:
826; AVX512BW:       # %bb.0:
827; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
828; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
829; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
830; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
831; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
832; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
833; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
834; AVX512BW-NEXT:    vmovq %xmm0, %rax
835; AVX512BW-NEXT:    vzeroupper
836; AVX512BW-NEXT:    retq
837;
838; AVX512VL-LABEL: test_v16i64:
839; AVX512VL:       # %bb.0:
840; AVX512VL-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
841; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
842; AVX512VL-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
843; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
844; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
845; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
846; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
847; AVX512VL-NEXT:    vmovq %xmm0, %rax
848; AVX512VL-NEXT:    vzeroupper
849; AVX512VL-NEXT:    retq
850  %1 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> %a0)
851  ret i64 %1
852}
853
854;
855; vXi32
856;
857
858define i32 @test_v2i32(<2 x i32> %a0) {
859; SSE2-LABEL: test_v2i32:
860; SSE2:       # %bb.0:
861; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
862; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
863; SSE2-NEXT:    movdqa %xmm0, %xmm3
864; SSE2-NEXT:    pxor %xmm2, %xmm3
865; SSE2-NEXT:    pxor %xmm1, %xmm2
866; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
867; SSE2-NEXT:    pand %xmm3, %xmm0
868; SSE2-NEXT:    pandn %xmm1, %xmm3
869; SSE2-NEXT:    por %xmm0, %xmm3
870; SSE2-NEXT:    movd %xmm3, %eax
871; SSE2-NEXT:    retq
872;
873; SSE4-LABEL: test_v2i32:
874; SSE4:       # %bb.0:
875; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
876; SSE4-NEXT:    pmaxud %xmm0, %xmm1
877; SSE4-NEXT:    movd %xmm1, %eax
878; SSE4-NEXT:    retq
879;
880; AVX-LABEL: test_v2i32:
881; AVX:       # %bb.0:
882; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
883; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
884; AVX-NEXT:    vmovd %xmm0, %eax
885; AVX-NEXT:    retq
886;
887; AVX512-LABEL: test_v2i32:
888; AVX512:       # %bb.0:
889; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
890; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
891; AVX512-NEXT:    vmovd %xmm0, %eax
892; AVX512-NEXT:    retq
893  %1 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> %a0)
894  ret i32 %1
895}
896
897define i32 @test_v4i32(<4 x i32> %a0) {
898; SSE2-LABEL: test_v4i32:
899; SSE2:       # %bb.0:
900; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
901; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
902; SSE2-NEXT:    movdqa %xmm0, %xmm3
903; SSE2-NEXT:    pxor %xmm2, %xmm3
904; SSE2-NEXT:    movdqa %xmm1, %xmm4
905; SSE2-NEXT:    pxor %xmm2, %xmm4
906; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
907; SSE2-NEXT:    pand %xmm3, %xmm0
908; SSE2-NEXT:    pandn %xmm1, %xmm3
909; SSE2-NEXT:    por %xmm0, %xmm3
910; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
911; SSE2-NEXT:    movdqa %xmm3, %xmm1
912; SSE2-NEXT:    pxor %xmm2, %xmm1
913; SSE2-NEXT:    pxor %xmm0, %xmm2
914; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
915; SSE2-NEXT:    pand %xmm1, %xmm3
916; SSE2-NEXT:    pandn %xmm0, %xmm1
917; SSE2-NEXT:    por %xmm3, %xmm1
918; SSE2-NEXT:    movd %xmm1, %eax
919; SSE2-NEXT:    retq
920;
921; SSE4-LABEL: test_v4i32:
922; SSE4:       # %bb.0:
923; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
924; SSE4-NEXT:    pmaxud %xmm0, %xmm1
925; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
926; SSE4-NEXT:    pmaxud %xmm1, %xmm0
927; SSE4-NEXT:    movd %xmm0, %eax
928; SSE4-NEXT:    retq
929;
930; AVX-LABEL: test_v4i32:
931; AVX:       # %bb.0:
932; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
933; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
934; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
935; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
936; AVX-NEXT:    vmovd %xmm0, %eax
937; AVX-NEXT:    retq
938;
939; AVX512-LABEL: test_v4i32:
940; AVX512:       # %bb.0:
941; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
942; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
943; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
944; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
945; AVX512-NEXT:    vmovd %xmm0, %eax
946; AVX512-NEXT:    retq
947  %1 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %a0)
948  ret i32 %1
949}
950
951define i32 @test_v8i32(<8 x i32> %a0) {
952; SSE2-LABEL: test_v8i32:
953; SSE2:       # %bb.0:
954; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
955; SSE2-NEXT:    movdqa %xmm1, %xmm3
956; SSE2-NEXT:    pxor %xmm2, %xmm3
957; SSE2-NEXT:    movdqa %xmm0, %xmm4
958; SSE2-NEXT:    pxor %xmm2, %xmm4
959; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
960; SSE2-NEXT:    pand %xmm4, %xmm0
961; SSE2-NEXT:    pandn %xmm1, %xmm4
962; SSE2-NEXT:    por %xmm0, %xmm4
963; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
964; SSE2-NEXT:    movdqa %xmm4, %xmm1
965; SSE2-NEXT:    pxor %xmm2, %xmm1
966; SSE2-NEXT:    movdqa %xmm0, %xmm3
967; SSE2-NEXT:    pxor %xmm2, %xmm3
968; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
969; SSE2-NEXT:    pand %xmm1, %xmm4
970; SSE2-NEXT:    pandn %xmm0, %xmm1
971; SSE2-NEXT:    por %xmm4, %xmm1
972; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
973; SSE2-NEXT:    movdqa %xmm1, %xmm3
974; SSE2-NEXT:    pxor %xmm2, %xmm3
975; SSE2-NEXT:    pxor %xmm0, %xmm2
976; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
977; SSE2-NEXT:    pand %xmm3, %xmm1
978; SSE2-NEXT:    pandn %xmm0, %xmm3
979; SSE2-NEXT:    por %xmm1, %xmm3
980; SSE2-NEXT:    movd %xmm3, %eax
981; SSE2-NEXT:    retq
982;
983; SSE4-LABEL: test_v8i32:
984; SSE4:       # %bb.0:
985; SSE4-NEXT:    pmaxud %xmm1, %xmm0
986; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
987; SSE4-NEXT:    pmaxud %xmm0, %xmm1
988; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
989; SSE4-NEXT:    pmaxud %xmm1, %xmm0
990; SSE4-NEXT:    movd %xmm0, %eax
991; SSE4-NEXT:    retq
992;
993; AVX1-LABEL: test_v8i32:
994; AVX1:       # %bb.0:
995; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
996; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
997; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
998; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
999; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1000; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1001; AVX1-NEXT:    vmovd %xmm0, %eax
1002; AVX1-NEXT:    vzeroupper
1003; AVX1-NEXT:    retq
1004;
1005; AVX2-LABEL: test_v8i32:
1006; AVX2:       # %bb.0:
1007; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1008; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1009; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1010; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1011; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1012; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1013; AVX2-NEXT:    vmovd %xmm0, %eax
1014; AVX2-NEXT:    vzeroupper
1015; AVX2-NEXT:    retq
1016;
1017; AVX512-LABEL: test_v8i32:
1018; AVX512:       # %bb.0:
1019; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1020; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1021; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1022; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1023; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1024; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1025; AVX512-NEXT:    vmovd %xmm0, %eax
1026; AVX512-NEXT:    vzeroupper
1027; AVX512-NEXT:    retq
1028  %1 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> %a0)
1029  ret i32 %1
1030}
1031
1032define i32 @test_v16i32(<16 x i32> %a0) {
1033; SSE2-LABEL: test_v16i32:
1034; SSE2:       # %bb.0:
1035; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1036; SSE2-NEXT:    movdqa %xmm2, %xmm6
1037; SSE2-NEXT:    pxor %xmm4, %xmm6
1038; SSE2-NEXT:    movdqa %xmm0, %xmm5
1039; SSE2-NEXT:    pxor %xmm4, %xmm5
1040; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
1041; SSE2-NEXT:    pand %xmm5, %xmm0
1042; SSE2-NEXT:    pandn %xmm2, %xmm5
1043; SSE2-NEXT:    por %xmm0, %xmm5
1044; SSE2-NEXT:    movdqa %xmm3, %xmm0
1045; SSE2-NEXT:    pxor %xmm4, %xmm0
1046; SSE2-NEXT:    movdqa %xmm1, %xmm2
1047; SSE2-NEXT:    pxor %xmm4, %xmm2
1048; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1049; SSE2-NEXT:    pand %xmm2, %xmm1
1050; SSE2-NEXT:    pandn %xmm3, %xmm2
1051; SSE2-NEXT:    por %xmm1, %xmm2
1052; SSE2-NEXT:    movdqa %xmm2, %xmm0
1053; SSE2-NEXT:    pxor %xmm4, %xmm0
1054; SSE2-NEXT:    movdqa %xmm5, %xmm1
1055; SSE2-NEXT:    pxor %xmm4, %xmm1
1056; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1057; SSE2-NEXT:    pand %xmm1, %xmm5
1058; SSE2-NEXT:    pandn %xmm2, %xmm1
1059; SSE2-NEXT:    por %xmm5, %xmm1
1060; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1061; SSE2-NEXT:    movdqa %xmm1, %xmm2
1062; SSE2-NEXT:    pxor %xmm4, %xmm2
1063; SSE2-NEXT:    movdqa %xmm0, %xmm3
1064; SSE2-NEXT:    pxor %xmm4, %xmm3
1065; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
1066; SSE2-NEXT:    pand %xmm2, %xmm1
1067; SSE2-NEXT:    pandn %xmm0, %xmm2
1068; SSE2-NEXT:    por %xmm1, %xmm2
1069; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
1070; SSE2-NEXT:    movdqa %xmm2, %xmm1
1071; SSE2-NEXT:    pxor %xmm4, %xmm1
1072; SSE2-NEXT:    pxor %xmm0, %xmm4
1073; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
1074; SSE2-NEXT:    pand %xmm1, %xmm2
1075; SSE2-NEXT:    pandn %xmm0, %xmm1
1076; SSE2-NEXT:    por %xmm2, %xmm1
1077; SSE2-NEXT:    movd %xmm1, %eax
1078; SSE2-NEXT:    retq
1079;
1080; SSE4-LABEL: test_v16i32:
1081; SSE4:       # %bb.0:
1082; SSE4-NEXT:    pmaxud %xmm3, %xmm1
1083; SSE4-NEXT:    pmaxud %xmm2, %xmm0
1084; SSE4-NEXT:    pmaxud %xmm1, %xmm0
1085; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1086; SSE4-NEXT:    pmaxud %xmm0, %xmm1
1087; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1088; SSE4-NEXT:    pmaxud %xmm1, %xmm0
1089; SSE4-NEXT:    movd %xmm0, %eax
1090; SSE4-NEXT:    retq
1091;
1092; AVX1-LABEL: test_v16i32:
1093; AVX1:       # %bb.0:
1094; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1095; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1096; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm2
1097; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1098; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
1099; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1100; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1101; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1102; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1103; AVX1-NEXT:    vmovd %xmm0, %eax
1104; AVX1-NEXT:    vzeroupper
1105; AVX1-NEXT:    retq
1106;
1107; AVX2-LABEL: test_v16i32:
1108; AVX2:       # %bb.0:
1109; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1110; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1111; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1112; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1113; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1114; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1115; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1116; AVX2-NEXT:    vmovd %xmm0, %eax
1117; AVX2-NEXT:    vzeroupper
1118; AVX2-NEXT:    retq
1119;
1120; AVX512-LABEL: test_v16i32:
1121; AVX512:       # %bb.0:
1122; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1123; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
1124; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1125; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1126; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1127; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1128; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1129; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1130; AVX512-NEXT:    vmovd %xmm0, %eax
1131; AVX512-NEXT:    vzeroupper
1132; AVX512-NEXT:    retq
1133  %1 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> %a0)
1134  ret i32 %1
1135}
1136
1137define i32 @test_v32i32(<32 x i32> %a0) {
1138; SSE2-LABEL: test_v32i32:
1139; SSE2:       # %bb.0:
1140; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
1141; SSE2-NEXT:    movdqa %xmm5, %xmm10
1142; SSE2-NEXT:    pxor %xmm8, %xmm10
1143; SSE2-NEXT:    movdqa %xmm1, %xmm9
1144; SSE2-NEXT:    pxor %xmm8, %xmm9
1145; SSE2-NEXT:    pcmpgtd %xmm10, %xmm9
1146; SSE2-NEXT:    pand %xmm9, %xmm1
1147; SSE2-NEXT:    pandn %xmm5, %xmm9
1148; SSE2-NEXT:    por %xmm1, %xmm9
1149; SSE2-NEXT:    movdqa %xmm7, %xmm5
1150; SSE2-NEXT:    pxor %xmm8, %xmm5
1151; SSE2-NEXT:    movdqa %xmm3, %xmm1
1152; SSE2-NEXT:    pxor %xmm8, %xmm1
1153; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
1154; SSE2-NEXT:    pand %xmm1, %xmm3
1155; SSE2-NEXT:    pandn %xmm7, %xmm1
1156; SSE2-NEXT:    por %xmm3, %xmm1
1157; SSE2-NEXT:    movdqa %xmm4, %xmm5
1158; SSE2-NEXT:    pxor %xmm8, %xmm5
1159; SSE2-NEXT:    movdqa %xmm0, %xmm3
1160; SSE2-NEXT:    pxor %xmm8, %xmm3
1161; SSE2-NEXT:    pcmpgtd %xmm5, %xmm3
1162; SSE2-NEXT:    pand %xmm3, %xmm0
1163; SSE2-NEXT:    pandn %xmm4, %xmm3
1164; SSE2-NEXT:    por %xmm0, %xmm3
1165; SSE2-NEXT:    movdqa %xmm6, %xmm0
1166; SSE2-NEXT:    pxor %xmm8, %xmm0
1167; SSE2-NEXT:    movdqa %xmm2, %xmm4
1168; SSE2-NEXT:    pxor %xmm8, %xmm4
1169; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1170; SSE2-NEXT:    pand %xmm4, %xmm2
1171; SSE2-NEXT:    pandn %xmm6, %xmm4
1172; SSE2-NEXT:    por %xmm2, %xmm4
1173; SSE2-NEXT:    movdqa %xmm4, %xmm2
1174; SSE2-NEXT:    pxor %xmm8, %xmm2
1175; SSE2-NEXT:    movdqa %xmm3, %xmm0
1176; SSE2-NEXT:    pxor %xmm8, %xmm0
1177; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
1178; SSE2-NEXT:    pand %xmm0, %xmm3
1179; SSE2-NEXT:    pandn %xmm4, %xmm0
1180; SSE2-NEXT:    por %xmm3, %xmm0
1181; SSE2-NEXT:    movdqa %xmm1, %xmm2
1182; SSE2-NEXT:    pxor %xmm8, %xmm2
1183; SSE2-NEXT:    movdqa %xmm9, %xmm3
1184; SSE2-NEXT:    pxor %xmm8, %xmm3
1185; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1186; SSE2-NEXT:    pand %xmm3, %xmm9
1187; SSE2-NEXT:    pandn %xmm1, %xmm3
1188; SSE2-NEXT:    por %xmm9, %xmm3
1189; SSE2-NEXT:    movdqa %xmm3, %xmm1
1190; SSE2-NEXT:    pxor %xmm8, %xmm1
1191; SSE2-NEXT:    movdqa %xmm0, %xmm2
1192; SSE2-NEXT:    pxor %xmm8, %xmm2
1193; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1194; SSE2-NEXT:    pand %xmm2, %xmm0
1195; SSE2-NEXT:    pandn %xmm3, %xmm2
1196; SSE2-NEXT:    por %xmm0, %xmm2
1197; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1198; SSE2-NEXT:    movdqa %xmm2, %xmm1
1199; SSE2-NEXT:    pxor %xmm8, %xmm1
1200; SSE2-NEXT:    movdqa %xmm0, %xmm3
1201; SSE2-NEXT:    pxor %xmm8, %xmm3
1202; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
1203; SSE2-NEXT:    pand %xmm1, %xmm2
1204; SSE2-NEXT:    pandn %xmm0, %xmm1
1205; SSE2-NEXT:    por %xmm2, %xmm1
1206; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1207; SSE2-NEXT:    movdqa %xmm1, %xmm2
1208; SSE2-NEXT:    pxor %xmm8, %xmm2
1209; SSE2-NEXT:    pxor %xmm0, %xmm8
1210; SSE2-NEXT:    pcmpgtd %xmm8, %xmm2
1211; SSE2-NEXT:    pand %xmm2, %xmm1
1212; SSE2-NEXT:    pandn %xmm0, %xmm2
1213; SSE2-NEXT:    por %xmm1, %xmm2
1214; SSE2-NEXT:    movd %xmm2, %eax
1215; SSE2-NEXT:    retq
1216;
1217; SSE4-LABEL: test_v32i32:
1218; SSE4:       # %bb.0:
1219; SSE4-NEXT:    pmaxud %xmm6, %xmm2
1220; SSE4-NEXT:    pmaxud %xmm4, %xmm0
1221; SSE4-NEXT:    pmaxud %xmm2, %xmm0
1222; SSE4-NEXT:    pmaxud %xmm7, %xmm3
1223; SSE4-NEXT:    pmaxud %xmm5, %xmm1
1224; SSE4-NEXT:    pmaxud %xmm3, %xmm1
1225; SSE4-NEXT:    pmaxud %xmm0, %xmm1
1226; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1227; SSE4-NEXT:    pmaxud %xmm1, %xmm0
1228; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1229; SSE4-NEXT:    pmaxud %xmm0, %xmm1
1230; SSE4-NEXT:    movd %xmm1, %eax
1231; SSE4-NEXT:    retq
1232;
1233; AVX1-LABEL: test_v32i32:
1234; AVX1:       # %bb.0:
1235; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm4
1236; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm5
1237; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm4
1238; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1239; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1240; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
1241; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
1242; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1243; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
1244; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1245; AVX1-NEXT:    vpmaxud %xmm0, %xmm4, %xmm0
1246; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1247; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1248; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1249; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1250; AVX1-NEXT:    vmovd %xmm0, %eax
1251; AVX1-NEXT:    vzeroupper
1252; AVX1-NEXT:    retq
1253;
1254; AVX2-LABEL: test_v32i32:
1255; AVX2:       # %bb.0:
1256; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
1257; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
1258; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
1259; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1260; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1261; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1262; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1263; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1264; AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1265; AVX2-NEXT:    vmovd %xmm0, %eax
1266; AVX2-NEXT:    vzeroupper
1267; AVX2-NEXT:    retq
1268;
1269; AVX512-LABEL: test_v32i32:
1270; AVX512:       # %bb.0:
1271; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
1272; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1273; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
1274; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1275; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1276; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1277; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1278; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1279; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
1280; AVX512-NEXT:    vmovd %xmm0, %eax
1281; AVX512-NEXT:    vzeroupper
1282; AVX512-NEXT:    retq
1283  %1 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> %a0)
1284  ret i32 %1
1285}
1286
1287;
1288; vXi16
1289;
1290
1291define i16 @test_v2i16(<2 x i16> %a0) {
1292; SSE2-LABEL: test_v2i16:
1293; SSE2:       # %bb.0:
1294; SSE2-NEXT:    movdqa %xmm0, %xmm1
1295; SSE2-NEXT:    psrld $16, %xmm1
1296; SSE2-NEXT:    psubusw %xmm0, %xmm1
1297; SSE2-NEXT:    paddw %xmm0, %xmm1
1298; SSE2-NEXT:    movd %xmm1, %eax
1299; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1300; SSE2-NEXT:    retq
1301;
1302; SSE4-LABEL: test_v2i16:
1303; SSE4:       # %bb.0:
1304; SSE4-NEXT:    movdqa %xmm0, %xmm1
1305; SSE4-NEXT:    psrld $16, %xmm1
1306; SSE4-NEXT:    pmaxuw %xmm0, %xmm1
1307; SSE4-NEXT:    movd %xmm1, %eax
1308; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1309; SSE4-NEXT:    retq
1310;
1311; AVX-LABEL: test_v2i16:
1312; AVX:       # %bb.0:
1313; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1314; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1315; AVX-NEXT:    vmovd %xmm0, %eax
1316; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1317; AVX-NEXT:    retq
1318;
1319; AVX512-LABEL: test_v2i16:
1320; AVX512:       # %bb.0:
1321; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1322; AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1323; AVX512-NEXT:    vmovd %xmm0, %eax
1324; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1325; AVX512-NEXT:    retq
1326  %1 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> %a0)
1327  ret i16 %1
1328}
1329
1330define i16 @test_v4i16(<4 x i16> %a0) {
1331; SSE2-LABEL: test_v4i16:
1332; SSE2:       # %bb.0:
1333; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1334; SSE2-NEXT:    psubusw %xmm0, %xmm1
1335; SSE2-NEXT:    paddw %xmm0, %xmm1
1336; SSE2-NEXT:    movdqa %xmm1, %xmm0
1337; SSE2-NEXT:    psrld $16, %xmm0
1338; SSE2-NEXT:    psubusw %xmm1, %xmm0
1339; SSE2-NEXT:    paddw %xmm1, %xmm0
1340; SSE2-NEXT:    movd %xmm0, %eax
1341; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1342; SSE2-NEXT:    retq
1343;
1344; SSE4-LABEL: test_v4i16:
1345; SSE4:       # %bb.0:
1346; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1347; SSE4-NEXT:    pmaxuw %xmm0, %xmm1
1348; SSE4-NEXT:    movdqa %xmm1, %xmm0
1349; SSE4-NEXT:    psrld $16, %xmm0
1350; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1351; SSE4-NEXT:    movd %xmm0, %eax
1352; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1353; SSE4-NEXT:    retq
1354;
1355; AVX-LABEL: test_v4i16:
1356; AVX:       # %bb.0:
1357; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1358; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1359; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1360; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1361; AVX-NEXT:    vmovd %xmm0, %eax
1362; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1363; AVX-NEXT:    retq
1364;
1365; AVX512-LABEL: test_v4i16:
1366; AVX512:       # %bb.0:
1367; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1368; AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1369; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1370; AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1371; AVX512-NEXT:    vmovd %xmm0, %eax
1372; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1373; AVX512-NEXT:    retq
1374  %1 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> %a0)
1375  ret i16 %1
1376}
1377
1378define i16 @test_v8i16(<8 x i16> %a0) {
1379; SSE2-LABEL: test_v8i16:
1380; SSE2:       # %bb.0:
1381; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1382; SSE2-NEXT:    psubusw %xmm0, %xmm1
1383; SSE2-NEXT:    paddw %xmm0, %xmm1
1384; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1385; SSE2-NEXT:    psubusw %xmm1, %xmm0
1386; SSE2-NEXT:    paddw %xmm1, %xmm0
1387; SSE2-NEXT:    movdqa %xmm0, %xmm1
1388; SSE2-NEXT:    psrld $16, %xmm1
1389; SSE2-NEXT:    psubusw %xmm0, %xmm1
1390; SSE2-NEXT:    paddw %xmm0, %xmm1
1391; SSE2-NEXT:    movd %xmm1, %eax
1392; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1393; SSE2-NEXT:    retq
1394;
1395; SSE4-LABEL: test_v8i16:
1396; SSE4:       # %bb.0:
1397; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1398; SSE4-NEXT:    pxor %xmm0, %xmm1
1399; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1400; SSE4-NEXT:    movd %xmm0, %eax
1401; SSE4-NEXT:    notl %eax
1402; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1403; SSE4-NEXT:    retq
1404;
1405; AVX-LABEL: test_v8i16:
1406; AVX:       # %bb.0:
1407; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1408; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1409; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1410; AVX-NEXT:    vmovd %xmm0, %eax
1411; AVX-NEXT:    notl %eax
1412; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1413; AVX-NEXT:    retq
1414;
1415; AVX512BW-LABEL: test_v8i16:
1416; AVX512BW:       # %bb.0:
1417; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1418; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
1419; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1420; AVX512BW-NEXT:    vmovd %xmm0, %eax
1421; AVX512BW-NEXT:    notl %eax
1422; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1423; AVX512BW-NEXT:    vzeroupper
1424; AVX512BW-NEXT:    retq
1425;
1426; AVX512VL-LABEL: test_v8i16:
1427; AVX512VL:       # %bb.0:
1428; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
1429; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1430; AVX512VL-NEXT:    vmovd %xmm0, %eax
1431; AVX512VL-NEXT:    notl %eax
1432; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1433; AVX512VL-NEXT:    retq
1434  %1 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> %a0)
1435  ret i16 %1
1436}
1437
1438define i16 @test_v16i16(<16 x i16> %a0) {
1439; SSE2-LABEL: test_v16i16:
1440; SSE2:       # %bb.0:
1441; SSE2-NEXT:    psubusw %xmm0, %xmm1
1442; SSE2-NEXT:    paddw %xmm0, %xmm1
1443; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1444; SSE2-NEXT:    psubusw %xmm1, %xmm0
1445; SSE2-NEXT:    paddw %xmm1, %xmm0
1446; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1447; SSE2-NEXT:    psubusw %xmm0, %xmm1
1448; SSE2-NEXT:    paddw %xmm0, %xmm1
1449; SSE2-NEXT:    movdqa %xmm1, %xmm0
1450; SSE2-NEXT:    psrld $16, %xmm0
1451; SSE2-NEXT:    psubusw %xmm1, %xmm0
1452; SSE2-NEXT:    paddw %xmm1, %xmm0
1453; SSE2-NEXT:    movd %xmm0, %eax
1454; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1455; SSE2-NEXT:    retq
1456;
1457; SSE4-LABEL: test_v16i16:
1458; SSE4:       # %bb.0:
1459; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1460; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1461; SSE4-NEXT:    pxor %xmm0, %xmm1
1462; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1463; SSE4-NEXT:    movd %xmm0, %eax
1464; SSE4-NEXT:    notl %eax
1465; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1466; SSE4-NEXT:    retq
1467;
1468; AVX1-LABEL: test_v16i16:
1469; AVX1:       # %bb.0:
1470; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1471; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1472; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1473; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1474; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1475; AVX1-NEXT:    vmovd %xmm0, %eax
1476; AVX1-NEXT:    notl %eax
1477; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1478; AVX1-NEXT:    vzeroupper
1479; AVX1-NEXT:    retq
1480;
1481; AVX2-LABEL: test_v16i16:
1482; AVX2:       # %bb.0:
1483; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1484; AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1485; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1486; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1487; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1488; AVX2-NEXT:    vmovd %xmm0, %eax
1489; AVX2-NEXT:    notl %eax
1490; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1491; AVX2-NEXT:    vzeroupper
1492; AVX2-NEXT:    retq
1493;
1494; AVX512BW-LABEL: test_v16i16:
1495; AVX512BW:       # %bb.0:
1496; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1497; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1498; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
1499; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1500; AVX512BW-NEXT:    vmovd %xmm0, %eax
1501; AVX512BW-NEXT:    notl %eax
1502; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1503; AVX512BW-NEXT:    vzeroupper
1504; AVX512BW-NEXT:    retq
1505;
1506; AVX512VL-LABEL: test_v16i16:
1507; AVX512VL:       # %bb.0:
1508; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1509; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1510; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
1511; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1512; AVX512VL-NEXT:    vmovd %xmm0, %eax
1513; AVX512VL-NEXT:    notl %eax
1514; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1515; AVX512VL-NEXT:    vzeroupper
1516; AVX512VL-NEXT:    retq
1517  %1 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> %a0)
1518  ret i16 %1
1519}
1520
1521define i16 @test_v32i16(<32 x i16> %a0) {
1522; SSE2-LABEL: test_v32i16:
1523; SSE2:       # %bb.0:
1524; SSE2-NEXT:    psubusw %xmm0, %xmm2
1525; SSE2-NEXT:    paddw %xmm0, %xmm2
1526; SSE2-NEXT:    psubusw %xmm1, %xmm3
1527; SSE2-NEXT:    paddw %xmm1, %xmm3
1528; SSE2-NEXT:    psubusw %xmm2, %xmm3
1529; SSE2-NEXT:    paddw %xmm2, %xmm3
1530; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
1531; SSE2-NEXT:    psubusw %xmm3, %xmm0
1532; SSE2-NEXT:    paddw %xmm3, %xmm0
1533; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1534; SSE2-NEXT:    psubusw %xmm0, %xmm1
1535; SSE2-NEXT:    paddw %xmm0, %xmm1
1536; SSE2-NEXT:    movdqa %xmm1, %xmm0
1537; SSE2-NEXT:    psrld $16, %xmm0
1538; SSE2-NEXT:    psubusw %xmm1, %xmm0
1539; SSE2-NEXT:    paddw %xmm1, %xmm0
1540; SSE2-NEXT:    movd %xmm0, %eax
1541; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1542; SSE2-NEXT:    retq
1543;
1544; SSE4-LABEL: test_v32i16:
1545; SSE4:       # %bb.0:
1546; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
1547; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
1548; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1549; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1550; SSE4-NEXT:    pxor %xmm0, %xmm1
1551; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1552; SSE4-NEXT:    movd %xmm0, %eax
1553; SSE4-NEXT:    notl %eax
1554; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1555; SSE4-NEXT:    retq
1556;
1557; AVX1-LABEL: test_v32i16:
1558; AVX1:       # %bb.0:
1559; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1560; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1561; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1562; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1563; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
1564; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1565; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1566; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1567; AVX1-NEXT:    vmovd %xmm0, %eax
1568; AVX1-NEXT:    notl %eax
1569; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1570; AVX1-NEXT:    vzeroupper
1571; AVX1-NEXT:    retq
1572;
1573; AVX2-LABEL: test_v32i16:
1574; AVX2:       # %bb.0:
1575; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1576; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1577; AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1578; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1579; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1580; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1581; AVX2-NEXT:    vmovd %xmm0, %eax
1582; AVX2-NEXT:    notl %eax
1583; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1584; AVX2-NEXT:    vzeroupper
1585; AVX2-NEXT:    retq
1586;
1587; AVX512BW-LABEL: test_v32i16:
1588; AVX512BW:       # %bb.0:
1589; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1590; AVX512BW-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1591; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1592; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1593; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
1594; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1595; AVX512BW-NEXT:    vmovd %xmm0, %eax
1596; AVX512BW-NEXT:    notl %eax
1597; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1598; AVX512BW-NEXT:    vzeroupper
1599; AVX512BW-NEXT:    retq
1600;
1601; AVX512VL-LABEL: test_v32i16:
1602; AVX512VL:       # %bb.0:
1603; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1604; AVX512VL-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1605; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1606; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1607; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
1608; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1609; AVX512VL-NEXT:    vmovd %xmm0, %eax
1610; AVX512VL-NEXT:    notl %eax
1611; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1612; AVX512VL-NEXT:    vzeroupper
1613; AVX512VL-NEXT:    retq
1614  %1 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> %a0)
1615  ret i16 %1
1616}
1617
1618define i16 @test_v64i16(<64 x i16> %a0) {
1619; SSE2-LABEL: test_v64i16:
1620; SSE2:       # %bb.0:
1621; SSE2-NEXT:    psubusw %xmm1, %xmm5
1622; SSE2-NEXT:    paddw %xmm1, %xmm5
1623; SSE2-NEXT:    psubusw %xmm3, %xmm7
1624; SSE2-NEXT:    paddw %xmm3, %xmm7
1625; SSE2-NEXT:    psubusw %xmm0, %xmm4
1626; SSE2-NEXT:    paddw %xmm0, %xmm4
1627; SSE2-NEXT:    psubusw %xmm2, %xmm6
1628; SSE2-NEXT:    paddw %xmm2, %xmm6
1629; SSE2-NEXT:    psubusw %xmm4, %xmm6
1630; SSE2-NEXT:    paddw %xmm4, %xmm6
1631; SSE2-NEXT:    psubusw %xmm5, %xmm7
1632; SSE2-NEXT:    paddw %xmm5, %xmm7
1633; SSE2-NEXT:    psubusw %xmm6, %xmm7
1634; SSE2-NEXT:    paddw %xmm6, %xmm7
1635; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3]
1636; SSE2-NEXT:    psubusw %xmm7, %xmm0
1637; SSE2-NEXT:    paddw %xmm7, %xmm0
1638; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1639; SSE2-NEXT:    psubusw %xmm0, %xmm1
1640; SSE2-NEXT:    paddw %xmm0, %xmm1
1641; SSE2-NEXT:    movdqa %xmm1, %xmm0
1642; SSE2-NEXT:    psrld $16, %xmm0
1643; SSE2-NEXT:    psubusw %xmm1, %xmm0
1644; SSE2-NEXT:    paddw %xmm1, %xmm0
1645; SSE2-NEXT:    movd %xmm0, %eax
1646; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1647; SSE2-NEXT:    retq
1648;
1649; SSE4-LABEL: test_v64i16:
1650; SSE4:       # %bb.0:
1651; SSE4-NEXT:    pmaxuw %xmm7, %xmm3
1652; SSE4-NEXT:    pmaxuw %xmm5, %xmm1
1653; SSE4-NEXT:    pmaxuw %xmm3, %xmm1
1654; SSE4-NEXT:    pmaxuw %xmm6, %xmm2
1655; SSE4-NEXT:    pmaxuw %xmm4, %xmm0
1656; SSE4-NEXT:    pmaxuw %xmm2, %xmm0
1657; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
1658; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1659; SSE4-NEXT:    pxor %xmm0, %xmm1
1660; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1661; SSE4-NEXT:    movd %xmm0, %eax
1662; SSE4-NEXT:    notl %eax
1663; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1664; SSE4-NEXT:    retq
1665;
1666; AVX1-LABEL: test_v64i16:
1667; AVX1:       # %bb.0:
1668; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1669; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1670; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
1671; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1672; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1673; AVX1-NEXT:    vpmaxuw %xmm5, %xmm6, %xmm5
1674; AVX1-NEXT:    vpmaxuw %xmm4, %xmm5, %xmm4
1675; AVX1-NEXT:    vpmaxuw %xmm3, %xmm1, %xmm1
1676; AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
1677; AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1678; AVX1-NEXT:    vpmaxuw %xmm4, %xmm0, %xmm0
1679; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1680; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1681; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1682; AVX1-NEXT:    vmovd %xmm0, %eax
1683; AVX1-NEXT:    notl %eax
1684; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1685; AVX1-NEXT:    vzeroupper
1686; AVX1-NEXT:    retq
1687;
1688; AVX2-LABEL: test_v64i16:
1689; AVX2:       # %bb.0:
1690; AVX2-NEXT:    vpmaxuw %ymm3, %ymm1, %ymm1
1691; AVX2-NEXT:    vpmaxuw %ymm2, %ymm0, %ymm0
1692; AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1693; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1694; AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1695; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1696; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1697; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1698; AVX2-NEXT:    vmovd %xmm0, %eax
1699; AVX2-NEXT:    notl %eax
1700; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1701; AVX2-NEXT:    vzeroupper
1702; AVX2-NEXT:    retq
1703;
1704; AVX512BW-LABEL: test_v64i16:
1705; AVX512BW:       # %bb.0:
1706; AVX512BW-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
1707; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1708; AVX512BW-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1709; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1710; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1711; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
1712; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1713; AVX512BW-NEXT:    vmovd %xmm0, %eax
1714; AVX512BW-NEXT:    notl %eax
1715; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1716; AVX512BW-NEXT:    vzeroupper
1717; AVX512BW-NEXT:    retq
1718;
1719; AVX512VL-LABEL: test_v64i16:
1720; AVX512VL:       # %bb.0:
1721; AVX512VL-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
1722; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1723; AVX512VL-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
1724; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1725; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
1726; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
1727; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1728; AVX512VL-NEXT:    vmovd %xmm0, %eax
1729; AVX512VL-NEXT:    notl %eax
1730; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1731; AVX512VL-NEXT:    vzeroupper
1732; AVX512VL-NEXT:    retq
1733  %1 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> %a0)
1734  ret i16 %1
1735}
1736
1737;
1738; vXi8
1739;
1740
1741define i8 @test_v2i8(<2 x i8> %a0) {
1742; SSE-LABEL: test_v2i8:
1743; SSE:       # %bb.0:
1744; SSE-NEXT:    movdqa %xmm0, %xmm1
1745; SSE-NEXT:    psrlw $8, %xmm1
1746; SSE-NEXT:    pmaxub %xmm0, %xmm1
1747; SSE-NEXT:    movd %xmm1, %eax
1748; SSE-NEXT:    # kill: def $al killed $al killed $eax
1749; SSE-NEXT:    retq
1750;
1751; AVX-LABEL: test_v2i8:
1752; AVX:       # %bb.0:
1753; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1754; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1755; AVX-NEXT:    vmovd %xmm0, %eax
1756; AVX-NEXT:    # kill: def $al killed $al killed $eax
1757; AVX-NEXT:    retq
1758;
1759; AVX512-LABEL: test_v2i8:
1760; AVX512:       # %bb.0:
1761; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1762; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1763; AVX512-NEXT:    vmovd %xmm0, %eax
1764; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1765; AVX512-NEXT:    retq
1766  %1 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> %a0)
1767  ret i8 %1
1768}
1769
1770define i8 @test_v4i8(<4 x i8> %a0) {
1771; SSE-LABEL: test_v4i8:
1772; SSE:       # %bb.0:
1773; SSE-NEXT:    movdqa %xmm0, %xmm1
1774; SSE-NEXT:    psrld $16, %xmm1
1775; SSE-NEXT:    pmaxub %xmm0, %xmm1
1776; SSE-NEXT:    movdqa %xmm1, %xmm0
1777; SSE-NEXT:    psrlw $8, %xmm0
1778; SSE-NEXT:    pmaxub %xmm1, %xmm0
1779; SSE-NEXT:    movd %xmm0, %eax
1780; SSE-NEXT:    # kill: def $al killed $al killed $eax
1781; SSE-NEXT:    retq
1782;
1783; AVX-LABEL: test_v4i8:
1784; AVX:       # %bb.0:
1785; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1786; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1787; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1788; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1789; AVX-NEXT:    vmovd %xmm0, %eax
1790; AVX-NEXT:    # kill: def $al killed $al killed $eax
1791; AVX-NEXT:    retq
1792;
1793; AVX512-LABEL: test_v4i8:
1794; AVX512:       # %bb.0:
1795; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1796; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1797; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1798; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1799; AVX512-NEXT:    vmovd %xmm0, %eax
1800; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1801; AVX512-NEXT:    retq
1802  %1 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> %a0)
1803  ret i8 %1
1804}
1805
1806define i8 @test_v8i8(<8 x i8> %a0) {
1807; SSE-LABEL: test_v8i8:
1808; SSE:       # %bb.0:
1809; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1810; SSE-NEXT:    pmaxub %xmm0, %xmm1
1811; SSE-NEXT:    movdqa %xmm1, %xmm0
1812; SSE-NEXT:    psrld $16, %xmm0
1813; SSE-NEXT:    pmaxub %xmm1, %xmm0
1814; SSE-NEXT:    movdqa %xmm0, %xmm1
1815; SSE-NEXT:    psrlw $8, %xmm1
1816; SSE-NEXT:    pmaxub %xmm0, %xmm1
1817; SSE-NEXT:    movd %xmm1, %eax
1818; SSE-NEXT:    # kill: def $al killed $al killed $eax
1819; SSE-NEXT:    retq
1820;
1821; AVX-LABEL: test_v8i8:
1822; AVX:       # %bb.0:
1823; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1824; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1825; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1826; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1827; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1828; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1829; AVX-NEXT:    vmovd %xmm0, %eax
1830; AVX-NEXT:    # kill: def $al killed $al killed $eax
1831; AVX-NEXT:    retq
1832;
1833; AVX512-LABEL: test_v8i8:
1834; AVX512:       # %bb.0:
1835; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1836; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1837; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1838; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1839; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1840; AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1841; AVX512-NEXT:    vmovd %xmm0, %eax
1842; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1843; AVX512-NEXT:    retq
1844  %1 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> %a0)
1845  ret i8 %1
1846}
1847
1848define i8 @test_v16i8(<16 x i8> %a0) {
1849; SSE2-LABEL: test_v16i8:
1850; SSE2:       # %bb.0:
1851; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1852; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1853; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1854; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1855; SSE2-NEXT:    movdqa %xmm0, %xmm1
1856; SSE2-NEXT:    psrld $16, %xmm1
1857; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1858; SSE2-NEXT:    movdqa %xmm1, %xmm0
1859; SSE2-NEXT:    psrlw $8, %xmm0
1860; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1861; SSE2-NEXT:    movd %xmm0, %eax
1862; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1863; SSE2-NEXT:    retq
1864;
1865; SSE4-LABEL: test_v16i8:
1866; SSE4:       # %bb.0:
1867; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1868; SSE4-NEXT:    pxor %xmm0, %xmm1
1869; SSE4-NEXT:    movdqa %xmm1, %xmm0
1870; SSE4-NEXT:    psrlw $8, %xmm0
1871; SSE4-NEXT:    pminub %xmm1, %xmm0
1872; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1873; SSE4-NEXT:    movd %xmm0, %eax
1874; SSE4-NEXT:    notb %al
1875; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1876; SSE4-NEXT:    retq
1877;
1878; AVX-LABEL: test_v16i8:
1879; AVX:       # %bb.0:
1880; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1881; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1882; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1883; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1884; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1885; AVX-NEXT:    vmovd %xmm0, %eax
1886; AVX-NEXT:    notb %al
1887; AVX-NEXT:    # kill: def $al killed $al killed $eax
1888; AVX-NEXT:    retq
1889;
1890; AVX512BW-LABEL: test_v16i8:
1891; AVX512BW:       # %bb.0:
1892; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1893; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
1894; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
1895; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1896; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1897; AVX512BW-NEXT:    vmovd %xmm0, %eax
1898; AVX512BW-NEXT:    notb %al
1899; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
1900; AVX512BW-NEXT:    vzeroupper
1901; AVX512BW-NEXT:    retq
1902;
1903; AVX512VL-LABEL: test_v16i8:
1904; AVX512VL:       # %bb.0:
1905; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
1906; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
1907; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1908; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
1909; AVX512VL-NEXT:    vmovd %xmm0, %eax
1910; AVX512VL-NEXT:    notb %al
1911; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
1912; AVX512VL-NEXT:    retq
1913  %1 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> %a0)
1914  ret i8 %1
1915}
1916
1917define i8 @test_v32i8(<32 x i8> %a0) {
1918; SSE2-LABEL: test_v32i8:
1919; SSE2:       # %bb.0:
1920; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1921; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1922; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1923; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1924; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1925; SSE2-NEXT:    movdqa %xmm0, %xmm1
1926; SSE2-NEXT:    psrld $16, %xmm1
1927; SSE2-NEXT:    pmaxub %xmm0, %xmm1
1928; SSE2-NEXT:    movdqa %xmm1, %xmm0
1929; SSE2-NEXT:    psrlw $8, %xmm0
1930; SSE2-NEXT:    pmaxub %xmm1, %xmm0
1931; SSE2-NEXT:    movd %xmm0, %eax
1932; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1933; SSE2-NEXT:    retq
1934;
1935; SSE4-LABEL: test_v32i8:
1936; SSE4:       # %bb.0:
1937; SSE4-NEXT:    pmaxub %xmm1, %xmm0
1938; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
1939; SSE4-NEXT:    pxor %xmm0, %xmm1
1940; SSE4-NEXT:    movdqa %xmm1, %xmm0
1941; SSE4-NEXT:    psrlw $8, %xmm0
1942; SSE4-NEXT:    pminub %xmm1, %xmm0
1943; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1944; SSE4-NEXT:    movd %xmm0, %eax
1945; SSE4-NEXT:    notb %al
1946; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1947; SSE4-NEXT:    retq
1948;
1949; AVX1-LABEL: test_v32i8:
1950; AVX1:       # %bb.0:
1951; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1952; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1953; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1954; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1955; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1956; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1957; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1958; AVX1-NEXT:    vmovd %xmm0, %eax
1959; AVX1-NEXT:    notb %al
1960; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1961; AVX1-NEXT:    vzeroupper
1962; AVX1-NEXT:    retq
1963;
1964; AVX2-LABEL: test_v32i8:
1965; AVX2:       # %bb.0:
1966; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1967; AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1968; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1969; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1970; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1971; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1972; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1973; AVX2-NEXT:    vmovd %xmm0, %eax
1974; AVX2-NEXT:    notb %al
1975; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1976; AVX2-NEXT:    vzeroupper
1977; AVX2-NEXT:    retq
1978;
1979; AVX512BW-LABEL: test_v32i8:
1980; AVX512BW:       # %bb.0:
1981; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1982; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1983; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
1984; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
1985; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1986; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
1987; AVX512BW-NEXT:    vmovd %xmm0, %eax
1988; AVX512BW-NEXT:    notb %al
1989; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
1990; AVX512BW-NEXT:    vzeroupper
1991; AVX512BW-NEXT:    retq
1992;
1993; AVX512VL-LABEL: test_v32i8:
1994; AVX512VL:       # %bb.0:
1995; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1996; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
1997; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
1998; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
1999; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2000; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
2001; AVX512VL-NEXT:    vmovd %xmm0, %eax
2002; AVX512VL-NEXT:    notb %al
2003; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
2004; AVX512VL-NEXT:    vzeroupper
2005; AVX512VL-NEXT:    retq
2006  %1 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> %a0)
2007  ret i8 %1
2008}
2009
2010define i8 @test_v64i8(<64 x i8> %a0) {
2011; SSE2-LABEL: test_v64i8:
2012; SSE2:       # %bb.0:
2013; SSE2-NEXT:    pmaxub %xmm3, %xmm1
2014; SSE2-NEXT:    pmaxub %xmm2, %xmm0
2015; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2016; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2017; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2018; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
2019; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2020; SSE2-NEXT:    movdqa %xmm0, %xmm1
2021; SSE2-NEXT:    psrld $16, %xmm1
2022; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2023; SSE2-NEXT:    movdqa %xmm1, %xmm0
2024; SSE2-NEXT:    psrlw $8, %xmm0
2025; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2026; SSE2-NEXT:    movd %xmm0, %eax
2027; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2028; SSE2-NEXT:    retq
2029;
2030; SSE4-LABEL: test_v64i8:
2031; SSE4:       # %bb.0:
2032; SSE4-NEXT:    pmaxub %xmm3, %xmm1
2033; SSE4-NEXT:    pmaxub %xmm2, %xmm0
2034; SSE4-NEXT:    pmaxub %xmm1, %xmm0
2035; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
2036; SSE4-NEXT:    pxor %xmm0, %xmm1
2037; SSE4-NEXT:    movdqa %xmm1, %xmm0
2038; SSE4-NEXT:    psrlw $8, %xmm0
2039; SSE4-NEXT:    pminub %xmm1, %xmm0
2040; SSE4-NEXT:    phminposuw %xmm0, %xmm0
2041; SSE4-NEXT:    movd %xmm0, %eax
2042; SSE4-NEXT:    notb %al
2043; SSE4-NEXT:    # kill: def $al killed $al killed $eax
2044; SSE4-NEXT:    retq
2045;
2046; AVX1-LABEL: test_v64i8:
2047; AVX1:       # %bb.0:
2048; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2049; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2050; AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
2051; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2052; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
2053; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2054; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2055; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2056; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2057; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2058; AVX1-NEXT:    vmovd %xmm0, %eax
2059; AVX1-NEXT:    notb %al
2060; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2061; AVX1-NEXT:    vzeroupper
2062; AVX1-NEXT:    retq
2063;
2064; AVX2-LABEL: test_v64i8:
2065; AVX2:       # %bb.0:
2066; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2067; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2068; AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2069; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2070; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2071; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2072; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2073; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2074; AVX2-NEXT:    vmovd %xmm0, %eax
2075; AVX2-NEXT:    notb %al
2076; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2077; AVX2-NEXT:    vzeroupper
2078; AVX2-NEXT:    retq
2079;
2080; AVX512BW-LABEL: test_v64i8:
2081; AVX512BW:       # %bb.0:
2082; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2083; AVX512BW-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2084; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
2085; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2086; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
2087; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
2088; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2089; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
2090; AVX512BW-NEXT:    vmovd %xmm0, %eax
2091; AVX512BW-NEXT:    notb %al
2092; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2093; AVX512BW-NEXT:    vzeroupper
2094; AVX512BW-NEXT:    retq
2095;
2096; AVX512VL-LABEL: test_v64i8:
2097; AVX512VL:       # %bb.0:
2098; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2099; AVX512VL-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2100; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2101; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2102; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
2103; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2104; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2105; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
2106; AVX512VL-NEXT:    vmovd %xmm0, %eax
2107; AVX512VL-NEXT:    notb %al
2108; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
2109; AVX512VL-NEXT:    vzeroupper
2110; AVX512VL-NEXT:    retq
2111  %1 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> %a0)
2112  ret i8 %1
2113}
2114
2115define i8 @test_v128i8(<128 x i8> %a0) {
2116; SSE2-LABEL: test_v128i8:
2117; SSE2:       # %bb.0:
2118; SSE2-NEXT:    pmaxub %xmm6, %xmm2
2119; SSE2-NEXT:    pmaxub %xmm4, %xmm0
2120; SSE2-NEXT:    pmaxub %xmm2, %xmm0
2121; SSE2-NEXT:    pmaxub %xmm7, %xmm3
2122; SSE2-NEXT:    pmaxub %xmm5, %xmm1
2123; SSE2-NEXT:    pmaxub %xmm3, %xmm1
2124; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2125; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
2126; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2127; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
2128; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2129; SSE2-NEXT:    movdqa %xmm1, %xmm0
2130; SSE2-NEXT:    psrld $16, %xmm0
2131; SSE2-NEXT:    pmaxub %xmm1, %xmm0
2132; SSE2-NEXT:    movdqa %xmm0, %xmm1
2133; SSE2-NEXT:    psrlw $8, %xmm1
2134; SSE2-NEXT:    pmaxub %xmm0, %xmm1
2135; SSE2-NEXT:    movd %xmm1, %eax
2136; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2137; SSE2-NEXT:    retq
2138;
2139; SSE4-LABEL: test_v128i8:
2140; SSE4:       # %bb.0:
2141; SSE4-NEXT:    pmaxub %xmm7, %xmm3
2142; SSE4-NEXT:    pmaxub %xmm5, %xmm1
2143; SSE4-NEXT:    pmaxub %xmm3, %xmm1
2144; SSE4-NEXT:    pmaxub %xmm6, %xmm2
2145; SSE4-NEXT:    pmaxub %xmm4, %xmm0
2146; SSE4-NEXT:    pmaxub %xmm2, %xmm0
2147; SSE4-NEXT:    pmaxub %xmm1, %xmm0
2148; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
2149; SSE4-NEXT:    pxor %xmm0, %xmm1
2150; SSE4-NEXT:    movdqa %xmm1, %xmm0
2151; SSE4-NEXT:    psrlw $8, %xmm0
2152; SSE4-NEXT:    pminub %xmm1, %xmm0
2153; SSE4-NEXT:    phminposuw %xmm0, %xmm0
2154; SSE4-NEXT:    movd %xmm0, %eax
2155; SSE4-NEXT:    notb %al
2156; SSE4-NEXT:    # kill: def $al killed $al killed $eax
2157; SSE4-NEXT:    retq
2158;
2159; AVX1-LABEL: test_v128i8:
2160; AVX1:       # %bb.0:
2161; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
2162; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2163; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
2164; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
2165; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2166; AVX1-NEXT:    vpmaxub %xmm5, %xmm6, %xmm5
2167; AVX1-NEXT:    vpmaxub %xmm4, %xmm5, %xmm4
2168; AVX1-NEXT:    vpmaxub %xmm3, %xmm1, %xmm1
2169; AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
2170; AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2171; AVX1-NEXT:    vpmaxub %xmm4, %xmm0, %xmm0
2172; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2173; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2174; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2175; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2176; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2177; AVX1-NEXT:    vmovd %xmm0, %eax
2178; AVX1-NEXT:    notb %al
2179; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2180; AVX1-NEXT:    vzeroupper
2181; AVX1-NEXT:    retq
2182;
2183; AVX2-LABEL: test_v128i8:
2184; AVX2:       # %bb.0:
2185; AVX2-NEXT:    vpmaxub %ymm3, %ymm1, %ymm1
2186; AVX2-NEXT:    vpmaxub %ymm2, %ymm0, %ymm0
2187; AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2188; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2189; AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2190; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2191; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
2192; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2193; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2194; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2195; AVX2-NEXT:    vmovd %xmm0, %eax
2196; AVX2-NEXT:    notb %al
2197; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2198; AVX2-NEXT:    vzeroupper
2199; AVX2-NEXT:    retq
2200;
2201; AVX512BW-LABEL: test_v128i8:
2202; AVX512BW:       # %bb.0:
2203; AVX512BW-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
2204; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2205; AVX512BW-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2206; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
2207; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2208; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
2209; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
2210; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2211; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
2212; AVX512BW-NEXT:    vmovd %xmm0, %eax
2213; AVX512BW-NEXT:    notb %al
2214; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
2215; AVX512BW-NEXT:    vzeroupper
2216; AVX512BW-NEXT:    retq
2217;
2218; AVX512VL-LABEL: test_v128i8:
2219; AVX512VL:       # %bb.0:
2220; AVX512VL-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
2221; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2222; AVX512VL-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
2223; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
2224; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
2225; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
2226; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
2227; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2228; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
2229; AVX512VL-NEXT:    vmovd %xmm0, %eax
2230; AVX512VL-NEXT:    notb %al
2231; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
2232; AVX512VL-NEXT:    vzeroupper
2233; AVX512VL-NEXT:    retq
2234  %1 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> %a0)
2235  ret i8 %1
2236}
2237
2238declare i64 @llvm.vector.reduce.umax.v2i64(<2 x i64>)
2239declare i64 @llvm.vector.reduce.umax.v4i64(<4 x i64>)
2240declare i64 @llvm.vector.reduce.umax.v8i64(<8 x i64>)
2241declare i64 @llvm.vector.reduce.umax.v16i64(<16 x i64>)
2242
2243declare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>)
2244declare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>)
2245declare i32 @llvm.vector.reduce.umax.v8i32(<8 x i32>)
2246declare i32 @llvm.vector.reduce.umax.v16i32(<16 x i32>)
2247declare i32 @llvm.vector.reduce.umax.v32i32(<32 x i32>)
2248
2249declare i16 @llvm.vector.reduce.umax.v2i16(<2 x i16>)
2250declare i16 @llvm.vector.reduce.umax.v4i16(<4 x i16>)
2251declare i16 @llvm.vector.reduce.umax.v8i16(<8 x i16>)
2252declare i16 @llvm.vector.reduce.umax.v16i16(<16 x i16>)
2253declare i16 @llvm.vector.reduce.umax.v32i16(<32 x i16>)
2254declare i16 @llvm.vector.reduce.umax.v64i16(<64 x i16>)
2255
2256declare i8 @llvm.vector.reduce.umax.v2i8(<2 x i8>)
2257declare i8 @llvm.vector.reduce.umax.v4i8(<4 x i8>)
2258declare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>)
2259declare i8 @llvm.vector.reduce.umax.v16i8(<16 x i8>)
2260declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>)
2261declare i8 @llvm.vector.reduce.umax.v64i8(<64 x i8>)
2262declare i8 @llvm.vector.reduce.umax.v128i8(<128 x i8>)
2263