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