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