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:    movdqa %xmm0, %xmm1
754; SSE41-NEXT:    pxor %xmm0, %xmm0
755; SSE41-NEXT:    movdqa %xmm1, %xmm2
756; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
757; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
758; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
759; SSE41-NEXT:    movdqa %xmm2, %xmm3
760; SSE41-NEXT:    pxor %xmm0, %xmm3
761; SSE41-NEXT:    pxor %xmm1, %xmm0
762; SSE41-NEXT:    movdqa %xmm0, %xmm4
763; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
764; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
765; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
766; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
767; SSE41-NEXT:    pand %xmm5, %xmm0
768; SSE41-NEXT:    por %xmm4, %xmm0
769; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
770; SSE41-NEXT:    movd %xmm1, %eax
771; SSE41-NEXT:    retq
772;
773; AVX1-LABEL: test_v2i32:
774; AVX1:       # %bb.0:
775; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
776; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
777; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
778; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm1
779; AVX1-NEXT:    vblendvpd %xmm1, %xmm2, %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 {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
787; AVX2-NEXT:    vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
788; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm1
789; AVX2-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
790; AVX2-NEXT:    vmovd %xmm0, %eax
791; AVX2-NEXT:    retq
792;
793; AVX512BW-LABEL: test_v2i32:
794; AVX512BW:       # %bb.0:
795; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
796; AVX512BW-NEXT:    vpblendd {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
797; AVX512BW-NEXT:    vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
798; AVX512BW-NEXT:    vpminuq %zmm0, %zmm2, %zmm0
799; AVX512BW-NEXT:    vmovd %xmm0, %eax
800; AVX512BW-NEXT:    vzeroupper
801; AVX512BW-NEXT:    retq
802;
803; AVX512VL-LABEL: test_v2i32:
804; AVX512VL:       # %bb.0:
805; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
806; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
807; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
808; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
809; AVX512VL-NEXT:    vpminuq %xmm0, %xmm1, %xmm0
810; AVX512VL-NEXT:    vmovd %xmm0, %eax
811; AVX512VL-NEXT:    retq
812  %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v2i32(<2 x i32> %a0)
813  ret i32 %1
814}
815
816define i32 @test_v4i32(<4 x i32> %a0) {
817; SSE2-LABEL: test_v4i32:
818; SSE2:       # %bb.0:
819; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
820; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
821; SSE2-NEXT:    movdqa %xmm0, %xmm3
822; SSE2-NEXT:    pxor %xmm2, %xmm3
823; SSE2-NEXT:    movdqa %xmm1, %xmm4
824; SSE2-NEXT:    pxor %xmm2, %xmm4
825; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
826; SSE2-NEXT:    pand %xmm4, %xmm0
827; SSE2-NEXT:    pandn %xmm1, %xmm4
828; SSE2-NEXT:    por %xmm0, %xmm4
829; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
830; SSE2-NEXT:    movdqa %xmm4, %xmm1
831; SSE2-NEXT:    pxor %xmm2, %xmm1
832; SSE2-NEXT:    pxor %xmm0, %xmm2
833; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
834; SSE2-NEXT:    pand %xmm2, %xmm4
835; SSE2-NEXT:    pandn %xmm0, %xmm2
836; SSE2-NEXT:    por %xmm4, %xmm2
837; SSE2-NEXT:    movd %xmm2, %eax
838; SSE2-NEXT:    retq
839;
840; SSE41-LABEL: test_v4i32:
841; SSE41:       # %bb.0:
842; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
843; SSE41-NEXT:    pminud %xmm0, %xmm1
844; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
845; SSE41-NEXT:    pminud %xmm1, %xmm0
846; SSE41-NEXT:    movd %xmm0, %eax
847; SSE41-NEXT:    retq
848;
849; AVX-LABEL: test_v4i32:
850; AVX:       # %bb.0:
851; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
852; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
853; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
854; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
855; AVX-NEXT:    vmovd %xmm0, %eax
856; AVX-NEXT:    retq
857;
858; AVX512-LABEL: test_v4i32:
859; AVX512:       # %bb.0:
860; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
861; AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
862; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
863; AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
864; AVX512-NEXT:    vmovd %xmm0, %eax
865; AVX512-NEXT:    retq
866  %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v4i32(<4 x i32> %a0)
867  ret i32 %1
868}
869
870define i32 @test_v8i32(<8 x i32> %a0) {
871; SSE2-LABEL: test_v8i32:
872; SSE2:       # %bb.0:
873; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
874; SSE2-NEXT:    movdqa %xmm0, %xmm3
875; SSE2-NEXT:    pxor %xmm2, %xmm3
876; SSE2-NEXT:    movdqa %xmm1, %xmm4
877; SSE2-NEXT:    pxor %xmm2, %xmm4
878; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
879; SSE2-NEXT:    pand %xmm4, %xmm0
880; SSE2-NEXT:    pandn %xmm1, %xmm4
881; SSE2-NEXT:    por %xmm0, %xmm4
882; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
883; SSE2-NEXT:    movdqa %xmm4, %xmm1
884; SSE2-NEXT:    pxor %xmm2, %xmm1
885; SSE2-NEXT:    movdqa %xmm0, %xmm3
886; SSE2-NEXT:    pxor %xmm2, %xmm3
887; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
888; SSE2-NEXT:    pand %xmm3, %xmm4
889; SSE2-NEXT:    pandn %xmm0, %xmm3
890; SSE2-NEXT:    por %xmm4, %xmm3
891; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
892; SSE2-NEXT:    movdqa %xmm3, %xmm1
893; SSE2-NEXT:    pxor %xmm2, %xmm1
894; SSE2-NEXT:    pxor %xmm0, %xmm2
895; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
896; SSE2-NEXT:    pand %xmm2, %xmm3
897; SSE2-NEXT:    pandn %xmm0, %xmm2
898; SSE2-NEXT:    por %xmm3, %xmm2
899; SSE2-NEXT:    movd %xmm2, %eax
900; SSE2-NEXT:    retq
901;
902; SSE41-LABEL: test_v8i32:
903; SSE41:       # %bb.0:
904; SSE41-NEXT:    pminud %xmm1, %xmm0
905; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
906; SSE41-NEXT:    pminud %xmm0, %xmm1
907; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
908; SSE41-NEXT:    pminud %xmm1, %xmm0
909; SSE41-NEXT:    movd %xmm0, %eax
910; SSE41-NEXT:    retq
911;
912; AVX1-LABEL: test_v8i32:
913; AVX1:       # %bb.0:
914; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
915; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
916; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
917; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
918; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
919; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
920; AVX1-NEXT:    vmovd %xmm0, %eax
921; AVX1-NEXT:    vzeroupper
922; AVX1-NEXT:    retq
923;
924; AVX2-LABEL: test_v8i32:
925; AVX2:       # %bb.0:
926; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
927; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
928; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
929; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
930; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
931; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
932; AVX2-NEXT:    vmovd %xmm0, %eax
933; AVX2-NEXT:    vzeroupper
934; AVX2-NEXT:    retq
935;
936; AVX512-LABEL: test_v8i32:
937; AVX512:       # %bb.0:
938; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
939; AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm0
940; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
941; AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm0
942; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
943; AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm0
944; AVX512-NEXT:    vmovd %xmm0, %eax
945; AVX512-NEXT:    vzeroupper
946; AVX512-NEXT:    retq
947  %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v8i32(<8 x i32> %a0)
948  ret i32 %1
949}
950
951define i32 @test_v16i32(<16 x i32> %a0) {
952; SSE2-LABEL: test_v16i32:
953; SSE2:       # %bb.0:
954; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
955; SSE2-NEXT:    movdqa %xmm1, %xmm5
956; SSE2-NEXT:    pxor %xmm4, %xmm5
957; SSE2-NEXT:    movdqa %xmm3, %xmm6
958; SSE2-NEXT:    pxor %xmm4, %xmm6
959; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
960; SSE2-NEXT:    pand %xmm6, %xmm1
961; SSE2-NEXT:    pandn %xmm3, %xmm6
962; SSE2-NEXT:    por %xmm1, %xmm6
963; SSE2-NEXT:    movdqa %xmm0, %xmm1
964; SSE2-NEXT:    pxor %xmm4, %xmm1
965; SSE2-NEXT:    movdqa %xmm2, %xmm3
966; SSE2-NEXT:    pxor %xmm4, %xmm3
967; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
968; SSE2-NEXT:    pand %xmm3, %xmm0
969; SSE2-NEXT:    pandn %xmm2, %xmm3
970; SSE2-NEXT:    por %xmm0, %xmm3
971; SSE2-NEXT:    movdqa %xmm3, %xmm0
972; SSE2-NEXT:    pxor %xmm4, %xmm0
973; SSE2-NEXT:    movdqa %xmm6, %xmm1
974; SSE2-NEXT:    pxor %xmm4, %xmm1
975; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
976; SSE2-NEXT:    pand %xmm1, %xmm3
977; SSE2-NEXT:    pandn %xmm6, %xmm1
978; SSE2-NEXT:    por %xmm3, %xmm1
979; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
980; SSE2-NEXT:    movdqa %xmm1, %xmm2
981; SSE2-NEXT:    pxor %xmm4, %xmm2
982; SSE2-NEXT:    movdqa %xmm0, %xmm3
983; SSE2-NEXT:    pxor %xmm4, %xmm3
984; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
985; SSE2-NEXT:    pand %xmm3, %xmm1
986; SSE2-NEXT:    pandn %xmm0, %xmm3
987; SSE2-NEXT:    por %xmm1, %xmm3
988; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
989; SSE2-NEXT:    movdqa %xmm3, %xmm1
990; SSE2-NEXT:    pxor %xmm4, %xmm1
991; SSE2-NEXT:    pxor %xmm0, %xmm4
992; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
993; SSE2-NEXT:    pand %xmm4, %xmm3
994; SSE2-NEXT:    pandn %xmm0, %xmm4
995; SSE2-NEXT:    por %xmm3, %xmm4
996; SSE2-NEXT:    movd %xmm4, %eax
997; SSE2-NEXT:    retq
998;
999; SSE41-LABEL: test_v16i32:
1000; SSE41:       # %bb.0:
1001; SSE41-NEXT:    pminud %xmm3, %xmm1
1002; SSE41-NEXT:    pminud %xmm2, %xmm0
1003; SSE41-NEXT:    pminud %xmm1, %xmm0
1004; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1005; SSE41-NEXT:    pminud %xmm0, %xmm1
1006; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1007; SSE41-NEXT:    pminud %xmm1, %xmm0
1008; SSE41-NEXT:    movd %xmm0, %eax
1009; SSE41-NEXT:    retq
1010;
1011; AVX1-LABEL: test_v16i32:
1012; AVX1:       # %bb.0:
1013; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1014; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1015; AVX1-NEXT:    vpminud %xmm2, %xmm3, %xmm2
1016; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1017; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
1018; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1019; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1020; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1021; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1022; AVX1-NEXT:    vmovd %xmm0, %eax
1023; AVX1-NEXT:    vzeroupper
1024; AVX1-NEXT:    retq
1025;
1026; AVX2-LABEL: test_v16i32:
1027; AVX2:       # %bb.0:
1028; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1029; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1030; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1031; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1032; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1033; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1034; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1035; AVX2-NEXT:    vmovd %xmm0, %eax
1036; AVX2-NEXT:    vzeroupper
1037; AVX2-NEXT:    retq
1038;
1039; AVX512-LABEL: test_v16i32:
1040; AVX512:       # %bb.0:
1041; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1042; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1043; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1044; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1045; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1046; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1047; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1048; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1049; AVX512-NEXT:    vmovd %xmm0, %eax
1050; AVX512-NEXT:    vzeroupper
1051; AVX512-NEXT:    retq
1052  %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v16i32(<16 x i32> %a0)
1053  ret i32 %1
1054}
1055
1056define i32 @test_v32i32(<32 x i32> %a0) {
1057; SSE2-LABEL: test_v32i32:
1058; SSE2:       # %bb.0:
1059; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
1060; SSE2-NEXT:    movdqa %xmm2, %xmm10
1061; SSE2-NEXT:    pxor %xmm8, %xmm10
1062; SSE2-NEXT:    movdqa %xmm6, %xmm9
1063; SSE2-NEXT:    pxor %xmm8, %xmm9
1064; SSE2-NEXT:    pcmpgtd %xmm10, %xmm9
1065; SSE2-NEXT:    pand %xmm9, %xmm2
1066; SSE2-NEXT:    pandn %xmm6, %xmm9
1067; SSE2-NEXT:    por %xmm2, %xmm9
1068; SSE2-NEXT:    movdqa %xmm0, %xmm6
1069; SSE2-NEXT:    pxor %xmm8, %xmm6
1070; SSE2-NEXT:    movdqa %xmm4, %xmm2
1071; SSE2-NEXT:    pxor %xmm8, %xmm2
1072; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
1073; SSE2-NEXT:    pand %xmm2, %xmm0
1074; SSE2-NEXT:    pandn %xmm4, %xmm2
1075; SSE2-NEXT:    por %xmm0, %xmm2
1076; SSE2-NEXT:    movdqa %xmm3, %xmm0
1077; SSE2-NEXT:    pxor %xmm8, %xmm0
1078; SSE2-NEXT:    movdqa %xmm7, %xmm4
1079; SSE2-NEXT:    pxor %xmm8, %xmm4
1080; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1081; SSE2-NEXT:    pand %xmm4, %xmm3
1082; SSE2-NEXT:    pandn %xmm7, %xmm4
1083; SSE2-NEXT:    por %xmm3, %xmm4
1084; SSE2-NEXT:    movdqa %xmm1, %xmm0
1085; SSE2-NEXT:    pxor %xmm8, %xmm0
1086; SSE2-NEXT:    movdqa %xmm5, %xmm3
1087; SSE2-NEXT:    pxor %xmm8, %xmm3
1088; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1089; SSE2-NEXT:    pand %xmm3, %xmm1
1090; SSE2-NEXT:    pandn %xmm5, %xmm3
1091; SSE2-NEXT:    por %xmm1, %xmm3
1092; SSE2-NEXT:    movdqa %xmm3, %xmm0
1093; SSE2-NEXT:    pxor %xmm8, %xmm0
1094; SSE2-NEXT:    movdqa %xmm4, %xmm1
1095; SSE2-NEXT:    pxor %xmm8, %xmm1
1096; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1097; SSE2-NEXT:    pand %xmm1, %xmm3
1098; SSE2-NEXT:    pandn %xmm4, %xmm1
1099; SSE2-NEXT:    por %xmm3, %xmm1
1100; SSE2-NEXT:    movdqa %xmm2, %xmm0
1101; SSE2-NEXT:    pxor %xmm8, %xmm0
1102; SSE2-NEXT:    movdqa %xmm9, %xmm3
1103; SSE2-NEXT:    pxor %xmm8, %xmm3
1104; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1105; SSE2-NEXT:    pand %xmm3, %xmm2
1106; SSE2-NEXT:    pandn %xmm9, %xmm3
1107; SSE2-NEXT:    por %xmm2, %xmm3
1108; SSE2-NEXT:    movdqa %xmm3, %xmm0
1109; SSE2-NEXT:    pxor %xmm8, %xmm0
1110; SSE2-NEXT:    movdqa %xmm1, %xmm2
1111; SSE2-NEXT:    pxor %xmm8, %xmm2
1112; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1113; SSE2-NEXT:    pand %xmm2, %xmm3
1114; SSE2-NEXT:    pandn %xmm1, %xmm2
1115; SSE2-NEXT:    por %xmm3, %xmm2
1116; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1117; SSE2-NEXT:    movdqa %xmm2, %xmm1
1118; SSE2-NEXT:    pxor %xmm8, %xmm1
1119; SSE2-NEXT:    movdqa %xmm0, %xmm3
1120; SSE2-NEXT:    pxor %xmm8, %xmm3
1121; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1122; SSE2-NEXT:    pand %xmm3, %xmm2
1123; SSE2-NEXT:    pandn %xmm0, %xmm3
1124; SSE2-NEXT:    por %xmm2, %xmm3
1125; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1126; SSE2-NEXT:    movdqa %xmm3, %xmm1
1127; SSE2-NEXT:    pxor %xmm8, %xmm1
1128; SSE2-NEXT:    pxor %xmm0, %xmm8
1129; SSE2-NEXT:    pcmpgtd %xmm1, %xmm8
1130; SSE2-NEXT:    pand %xmm8, %xmm3
1131; SSE2-NEXT:    pandn %xmm0, %xmm8
1132; SSE2-NEXT:    por %xmm3, %xmm8
1133; SSE2-NEXT:    movd %xmm8, %eax
1134; SSE2-NEXT:    retq
1135;
1136; SSE41-LABEL: test_v32i32:
1137; SSE41:       # %bb.0:
1138; SSE41-NEXT:    pminud %xmm6, %xmm2
1139; SSE41-NEXT:    pminud %xmm4, %xmm0
1140; SSE41-NEXT:    pminud %xmm2, %xmm0
1141; SSE41-NEXT:    pminud %xmm7, %xmm3
1142; SSE41-NEXT:    pminud %xmm5, %xmm1
1143; SSE41-NEXT:    pminud %xmm3, %xmm1
1144; SSE41-NEXT:    pminud %xmm0, %xmm1
1145; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1146; SSE41-NEXT:    pminud %xmm1, %xmm0
1147; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1148; SSE41-NEXT:    pminud %xmm0, %xmm1
1149; SSE41-NEXT:    movd %xmm1, %eax
1150; SSE41-NEXT:    retq
1151;
1152; AVX1-LABEL: test_v32i32:
1153; AVX1:       # %bb.0:
1154; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm4
1155; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm5
1156; AVX1-NEXT:    vpminud %xmm4, %xmm5, %xmm4
1157; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1158; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1159; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
1160; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
1161; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1162; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
1163; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1164; AVX1-NEXT:    vpminud %xmm0, %xmm4, %xmm0
1165; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1166; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1167; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1168; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1169; AVX1-NEXT:    vmovd %xmm0, %eax
1170; AVX1-NEXT:    vzeroupper
1171; AVX1-NEXT:    retq
1172;
1173; AVX2-LABEL: test_v32i32:
1174; AVX2:       # %bb.0:
1175; AVX2-NEXT:    vpminud %ymm3, %ymm1, %ymm1
1176; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
1177; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1178; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1179; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1180; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1181; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1182; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1183; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1184; AVX2-NEXT:    vmovd %xmm0, %eax
1185; AVX2-NEXT:    vzeroupper
1186; AVX2-NEXT:    retq
1187;
1188; AVX512-LABEL: test_v32i32:
1189; AVX512:       # %bb.0:
1190; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1191; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1192; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1193; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1194; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1195; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1196; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1197; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1198; AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
1199; AVX512-NEXT:    vmovd %xmm0, %eax
1200; AVX512-NEXT:    vzeroupper
1201; AVX512-NEXT:    retq
1202  %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v32i32(<32 x i32> %a0)
1203  ret i32 %1
1204}
1205
1206;
1207; vXi16
1208;
1209
1210define i16 @test_v2i16(<2 x i16> %a0) {
1211; SSE2-LABEL: test_v2i16:
1212; SSE2:       # %bb.0:
1213; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,0,0,65535,0,0,0]
1214; SSE2-NEXT:    pand %xmm0, %xmm1
1215; SSE2-NEXT:    pxor %xmm2, %xmm2
1216; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1217; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1218; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1219; SSE2-NEXT:    movdqa %xmm1, %xmm3
1220; SSE2-NEXT:    por %xmm2, %xmm3
1221; SSE2-NEXT:    por %xmm0, %xmm2
1222; SSE2-NEXT:    movdqa %xmm2, %xmm4
1223; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1224; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1225; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1226; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1227; SSE2-NEXT:    pand %xmm5, %xmm2
1228; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1229; SSE2-NEXT:    por %xmm2, %xmm3
1230; SSE2-NEXT:    pand %xmm3, %xmm1
1231; SSE2-NEXT:    pandn %xmm0, %xmm3
1232; SSE2-NEXT:    por %xmm1, %xmm3
1233; SSE2-NEXT:    movd %xmm3, %eax
1234; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1235; SSE2-NEXT:    retq
1236;
1237; SSE41-LABEL: test_v2i16:
1238; SSE41:       # %bb.0:
1239; SSE41-NEXT:    pxor %xmm1, %xmm1
1240; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
1241; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1242; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1243; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1244; SSE41-NEXT:    movdqa %xmm1, %xmm0
1245; SSE41-NEXT:    por %xmm3, %xmm0
1246; SSE41-NEXT:    por %xmm2, %xmm3
1247; SSE41-NEXT:    movdqa %xmm3, %xmm4
1248; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1249; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1250; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1251; SSE41-NEXT:    pand %xmm4, %xmm0
1252; SSE41-NEXT:    por %xmm3, %xmm0
1253; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1254; SSE41-NEXT:    movd %xmm2, %eax
1255; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1256; SSE41-NEXT:    retq
1257;
1258; AVX-LABEL: test_v2i16:
1259; AVX:       # %bb.0:
1260; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1261; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
1262; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1263; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1264; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1265; AVX-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1266; AVX-NEXT:    vmovd %xmm0, %eax
1267; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1268; AVX-NEXT:    retq
1269;
1270; AVX512BW-LABEL: test_v2i16:
1271; AVX512BW:       # %bb.0:
1272; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1273; AVX512BW-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
1274; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1275; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1276; AVX512BW-NEXT:    vpminuq %zmm0, %zmm1, %zmm0
1277; AVX512BW-NEXT:    vmovd %xmm0, %eax
1278; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
1279; AVX512BW-NEXT:    vzeroupper
1280; AVX512BW-NEXT:    retq
1281;
1282; AVX512VL-LABEL: test_v2i16:
1283; AVX512VL:       # %bb.0:
1284; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1285; AVX512VL-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
1286; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1287; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1288; AVX512VL-NEXT:    vpminuq %xmm0, %xmm1, %xmm0
1289; AVX512VL-NEXT:    vmovd %xmm0, %eax
1290; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
1291; AVX512VL-NEXT:    retq
1292  %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v2i16(<2 x i16> %a0)
1293  ret i16 %1
1294}
1295
1296define i16 @test_v4i16(<4 x i16> %a0) {
1297; SSE2-LABEL: test_v4i16:
1298; SSE2:       # %bb.0:
1299; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [65535,0,65535,0,65535,0,65535,0]
1300; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1301; SSE2-NEXT:    pand %xmm1, %xmm0
1302; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1303; SSE2-NEXT:    movdqa %xmm2, %xmm3
1304; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1305; SSE2-NEXT:    pand %xmm3, %xmm0
1306; SSE2-NEXT:    pandn %xmm2, %xmm3
1307; SSE2-NEXT:    por %xmm0, %xmm3
1308; SSE2-NEXT:    pand %xmm3, %xmm1
1309; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1310; SSE2-NEXT:    pxor %xmm2, %xmm2
1311; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1312; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1313; SSE2-NEXT:    movdqa %xmm0, %xmm2
1314; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1315; SSE2-NEXT:    pand %xmm2, %xmm1
1316; SSE2-NEXT:    pandn %xmm0, %xmm2
1317; SSE2-NEXT:    por %xmm1, %xmm2
1318; SSE2-NEXT:    movd %xmm2, %eax
1319; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1320; SSE2-NEXT:    retq
1321;
1322; SSE41-LABEL: test_v4i16:
1323; SSE41:       # %bb.0:
1324; SSE41-NEXT:    pxor %xmm1, %xmm1
1325; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1326; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1327; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm1[1],xmm2[2],xmm1[3,4,5,6,7]
1328; SSE41-NEXT:    pminud %xmm0, %xmm2
1329; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3],xmm2[4],xmm1[5],xmm2[6],xmm1[7]
1330; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1331; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1332; SSE41-NEXT:    pminud %xmm1, %xmm0
1333; SSE41-NEXT:    movd %xmm0, %eax
1334; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1335; SSE41-NEXT:    retq
1336;
1337; AVX-LABEL: test_v4i16:
1338; AVX:       # %bb.0:
1339; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1340; AVX-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1341; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1342; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3,4,5,6,7]
1343; AVX-NEXT:    vpminud %xmm0, %xmm2, %xmm0
1344; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1345; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1346; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1347; AVX-NEXT:    vpminud %xmm0, %xmm1, %xmm0
1348; AVX-NEXT:    vmovd %xmm0, %eax
1349; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1350; AVX-NEXT:    retq
1351;
1352; AVX512-LABEL: test_v4i16:
1353; AVX512:       # %bb.0:
1354; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1355; AVX512-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1356; AVX512-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1357; AVX512-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3,4,5,6,7]
1358; AVX512-NEXT:    vpminud %xmm0, %xmm2, %xmm0
1359; AVX512-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1360; AVX512-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1361; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1362; AVX512-NEXT:    vpminud %xmm0, %xmm1, %xmm0
1363; AVX512-NEXT:    vmovd %xmm0, %eax
1364; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1365; AVX512-NEXT:    retq
1366  %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v4i16(<4 x i16> %a0)
1367  ret i16 %1
1368}
1369
1370define i16 @test_v8i16(<8 x i16> %a0) {
1371; SSE2-LABEL: test_v8i16:
1372; SSE2:       # %bb.0:
1373; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1374; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1375; SSE2-NEXT:    pxor %xmm2, %xmm0
1376; SSE2-NEXT:    pxor %xmm2, %xmm1
1377; SSE2-NEXT:    pminsw %xmm0, %xmm1
1378; SSE2-NEXT:    movdqa %xmm1, %xmm0
1379; SSE2-NEXT:    pxor %xmm2, %xmm0
1380; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1381; SSE2-NEXT:    pxor %xmm2, %xmm0
1382; SSE2-NEXT:    pminsw %xmm1, %xmm0
1383; SSE2-NEXT:    movdqa %xmm0, %xmm1
1384; SSE2-NEXT:    pxor %xmm2, %xmm1
1385; SSE2-NEXT:    psrld $16, %xmm1
1386; SSE2-NEXT:    pxor %xmm2, %xmm1
1387; SSE2-NEXT:    pminsw %xmm0, %xmm1
1388; SSE2-NEXT:    movd %xmm1, %eax
1389; SSE2-NEXT:    xorl $32768, %eax # imm = 0x8000
1390; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1391; SSE2-NEXT:    retq
1392;
1393; SSE41-LABEL: test_v8i16:
1394; SSE41:       # %bb.0:
1395; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1396; SSE41-NEXT:    movd %xmm0, %eax
1397; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1398; SSE41-NEXT:    retq
1399;
1400; AVX-LABEL: test_v8i16:
1401; AVX:       # %bb.0:
1402; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1403; AVX-NEXT:    vmovd %xmm0, %eax
1404; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1405; AVX-NEXT:    retq
1406;
1407; AVX512-LABEL: test_v8i16:
1408; AVX512:       # %bb.0:
1409; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1410; AVX512-NEXT:    vmovd %xmm0, %eax
1411; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1412; AVX512-NEXT:    retq
1413  %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v8i16(<8 x i16> %a0)
1414  ret i16 %1
1415}
1416
1417define i16 @test_v16i16(<16 x i16> %a0) {
1418; SSE2-LABEL: test_v16i16:
1419; SSE2:       # %bb.0:
1420; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1421; SSE2-NEXT:    pxor %xmm2, %xmm1
1422; SSE2-NEXT:    pxor %xmm2, %xmm0
1423; SSE2-NEXT:    pminsw %xmm1, %xmm0
1424; SSE2-NEXT:    movdqa %xmm0, %xmm1
1425; SSE2-NEXT:    pxor %xmm2, %xmm1
1426; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1427; SSE2-NEXT:    pxor %xmm2, %xmm1
1428; SSE2-NEXT:    pminsw %xmm0, %xmm1
1429; SSE2-NEXT:    movdqa %xmm1, %xmm0
1430; SSE2-NEXT:    pxor %xmm2, %xmm0
1431; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1432; SSE2-NEXT:    pxor %xmm2, %xmm0
1433; SSE2-NEXT:    pminsw %xmm1, %xmm0
1434; SSE2-NEXT:    movdqa %xmm0, %xmm1
1435; SSE2-NEXT:    pxor %xmm2, %xmm1
1436; SSE2-NEXT:    psrld $16, %xmm1
1437; SSE2-NEXT:    pxor %xmm2, %xmm1
1438; SSE2-NEXT:    pminsw %xmm0, %xmm1
1439; SSE2-NEXT:    movd %xmm1, %eax
1440; SSE2-NEXT:    xorl $32768, %eax # imm = 0x8000
1441; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1442; SSE2-NEXT:    retq
1443;
1444; SSE41-LABEL: test_v16i16:
1445; SSE41:       # %bb.0:
1446; SSE41-NEXT:    pminuw %xmm1, %xmm0
1447; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1448; SSE41-NEXT:    movd %xmm0, %eax
1449; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1450; SSE41-NEXT:    retq
1451;
1452; AVX1-LABEL: test_v16i16:
1453; AVX1:       # %bb.0:
1454; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1455; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1456; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1457; AVX1-NEXT:    vmovd %xmm0, %eax
1458; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1459; AVX1-NEXT:    vzeroupper
1460; AVX1-NEXT:    retq
1461;
1462; AVX2-LABEL: test_v16i16:
1463; AVX2:       # %bb.0:
1464; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1465; AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1466; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1467; AVX2-NEXT:    vmovd %xmm0, %eax
1468; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1469; AVX2-NEXT:    vzeroupper
1470; AVX2-NEXT:    retq
1471;
1472; AVX512-LABEL: test_v16i16:
1473; AVX512:       # %bb.0:
1474; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1475; AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1476; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1477; AVX512-NEXT:    vmovd %xmm0, %eax
1478; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1479; AVX512-NEXT:    vzeroupper
1480; AVX512-NEXT:    retq
1481  %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v16i16(<16 x i16> %a0)
1482  ret i16 %1
1483}
1484
1485define i16 @test_v32i16(<32 x i16> %a0) {
1486; SSE2-LABEL: test_v32i16:
1487; SSE2:       # %bb.0:
1488; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1489; SSE2-NEXT:    pxor %xmm4, %xmm3
1490; SSE2-NEXT:    pxor %xmm4, %xmm1
1491; SSE2-NEXT:    pminsw %xmm3, %xmm1
1492; SSE2-NEXT:    pxor %xmm4, %xmm2
1493; SSE2-NEXT:    pxor %xmm4, %xmm0
1494; SSE2-NEXT:    pminsw %xmm2, %xmm0
1495; SSE2-NEXT:    pminsw %xmm1, %xmm0
1496; SSE2-NEXT:    movdqa %xmm0, %xmm1
1497; SSE2-NEXT:    pxor %xmm4, %xmm1
1498; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1499; SSE2-NEXT:    pxor %xmm4, %xmm1
1500; SSE2-NEXT:    pminsw %xmm0, %xmm1
1501; SSE2-NEXT:    movdqa %xmm1, %xmm0
1502; SSE2-NEXT:    pxor %xmm4, %xmm0
1503; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1504; SSE2-NEXT:    pxor %xmm4, %xmm0
1505; SSE2-NEXT:    pminsw %xmm1, %xmm0
1506; SSE2-NEXT:    movdqa %xmm0, %xmm1
1507; SSE2-NEXT:    pxor %xmm4, %xmm1
1508; SSE2-NEXT:    psrld $16, %xmm1
1509; SSE2-NEXT:    pxor %xmm4, %xmm1
1510; SSE2-NEXT:    pminsw %xmm0, %xmm1
1511; SSE2-NEXT:    movd %xmm1, %eax
1512; SSE2-NEXT:    xorl $32768, %eax # imm = 0x8000
1513; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1514; SSE2-NEXT:    retq
1515;
1516; SSE41-LABEL: test_v32i16:
1517; SSE41:       # %bb.0:
1518; SSE41-NEXT:    pminuw %xmm3, %xmm1
1519; SSE41-NEXT:    pminuw %xmm2, %xmm0
1520; SSE41-NEXT:    pminuw %xmm1, %xmm0
1521; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1522; SSE41-NEXT:    movd %xmm0, %eax
1523; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1524; SSE41-NEXT:    retq
1525;
1526; AVX1-LABEL: test_v32i16:
1527; AVX1:       # %bb.0:
1528; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1529; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1530; AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
1531; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1532; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
1533; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1534; AVX1-NEXT:    vmovd %xmm0, %eax
1535; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1536; AVX1-NEXT:    vzeroupper
1537; AVX1-NEXT:    retq
1538;
1539; AVX2-LABEL: test_v32i16:
1540; AVX2:       # %bb.0:
1541; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1542; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1543; AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1544; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1545; AVX2-NEXT:    vmovd %xmm0, %eax
1546; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1547; AVX2-NEXT:    vzeroupper
1548; AVX2-NEXT:    retq
1549;
1550; AVX512-LABEL: test_v32i16:
1551; AVX512:       # %bb.0:
1552; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1553; AVX512-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1554; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1555; AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1556; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1557; AVX512-NEXT:    vmovd %xmm0, %eax
1558; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1559; AVX512-NEXT:    vzeroupper
1560; AVX512-NEXT:    retq
1561  %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v32i16(<32 x i16> %a0)
1562  ret i16 %1
1563}
1564
1565define i16 @test_v64i16(<64 x i16> %a0) {
1566; SSE2-LABEL: test_v64i16:
1567; SSE2:       # %bb.0:
1568; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [32768,32768,32768,32768,32768,32768,32768,32768]
1569; SSE2-NEXT:    pxor %xmm8, %xmm6
1570; SSE2-NEXT:    pxor %xmm8, %xmm2
1571; SSE2-NEXT:    pminsw %xmm6, %xmm2
1572; SSE2-NEXT:    pxor %xmm8, %xmm4
1573; SSE2-NEXT:    pxor %xmm8, %xmm0
1574; SSE2-NEXT:    pminsw %xmm4, %xmm0
1575; SSE2-NEXT:    pminsw %xmm2, %xmm0
1576; SSE2-NEXT:    pxor %xmm8, %xmm7
1577; SSE2-NEXT:    pxor %xmm8, %xmm3
1578; SSE2-NEXT:    pminsw %xmm7, %xmm3
1579; SSE2-NEXT:    pxor %xmm8, %xmm5
1580; SSE2-NEXT:    pxor %xmm8, %xmm1
1581; SSE2-NEXT:    pminsw %xmm5, %xmm1
1582; SSE2-NEXT:    pminsw %xmm3, %xmm1
1583; SSE2-NEXT:    pminsw %xmm0, %xmm1
1584; SSE2-NEXT:    movdqa %xmm1, %xmm0
1585; SSE2-NEXT:    pxor %xmm8, %xmm0
1586; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1587; SSE2-NEXT:    pxor %xmm8, %xmm0
1588; SSE2-NEXT:    pminsw %xmm1, %xmm0
1589; SSE2-NEXT:    movdqa %xmm0, %xmm1
1590; SSE2-NEXT:    pxor %xmm8, %xmm1
1591; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1592; SSE2-NEXT:    pxor %xmm8, %xmm1
1593; SSE2-NEXT:    pminsw %xmm0, %xmm1
1594; SSE2-NEXT:    movdqa %xmm1, %xmm0
1595; SSE2-NEXT:    pxor %xmm8, %xmm0
1596; SSE2-NEXT:    psrld $16, %xmm0
1597; SSE2-NEXT:    pxor %xmm8, %xmm0
1598; SSE2-NEXT:    pminsw %xmm1, %xmm0
1599; SSE2-NEXT:    movd %xmm0, %eax
1600; SSE2-NEXT:    xorl $32768, %eax # imm = 0x8000
1601; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1602; SSE2-NEXT:    retq
1603;
1604; SSE41-LABEL: test_v64i16:
1605; SSE41:       # %bb.0:
1606; SSE41-NEXT:    pminuw %xmm7, %xmm3
1607; SSE41-NEXT:    pminuw %xmm5, %xmm1
1608; SSE41-NEXT:    pminuw %xmm3, %xmm1
1609; SSE41-NEXT:    pminuw %xmm6, %xmm2
1610; SSE41-NEXT:    pminuw %xmm4, %xmm0
1611; SSE41-NEXT:    pminuw %xmm2, %xmm0
1612; SSE41-NEXT:    pminuw %xmm1, %xmm0
1613; SSE41-NEXT:    phminposuw %xmm0, %xmm0
1614; SSE41-NEXT:    movd %xmm0, %eax
1615; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
1616; SSE41-NEXT:    retq
1617;
1618; AVX1-LABEL: test_v64i16:
1619; AVX1:       # %bb.0:
1620; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1621; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1622; AVX1-NEXT:    vpminuw %xmm4, %xmm5, %xmm4
1623; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1624; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1625; AVX1-NEXT:    vpminuw %xmm5, %xmm6, %xmm5
1626; AVX1-NEXT:    vpminuw %xmm4, %xmm5, %xmm4
1627; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm1
1628; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
1629; AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1630; AVX1-NEXT:    vpminuw %xmm4, %xmm0, %xmm0
1631; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1632; AVX1-NEXT:    vmovd %xmm0, %eax
1633; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1634; AVX1-NEXT:    vzeroupper
1635; AVX1-NEXT:    retq
1636;
1637; AVX2-LABEL: test_v64i16:
1638; AVX2:       # %bb.0:
1639; AVX2-NEXT:    vpminuw %ymm3, %ymm1, %ymm1
1640; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
1641; AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1642; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1643; AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1644; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1645; AVX2-NEXT:    vmovd %xmm0, %eax
1646; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1647; AVX2-NEXT:    vzeroupper
1648; AVX2-NEXT:    retq
1649;
1650; AVX512-LABEL: test_v64i16:
1651; AVX512:       # %bb.0:
1652; AVX512-NEXT:    vpminuw %zmm1, %zmm0, %zmm0
1653; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1654; AVX512-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
1655; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1656; AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
1657; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1658; AVX512-NEXT:    vmovd %xmm0, %eax
1659; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1660; AVX512-NEXT:    vzeroupper
1661; AVX512-NEXT:    retq
1662  %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v64i16(<64 x i16> %a0)
1663  ret i16 %1
1664}
1665
1666;
1667; vXi8
1668;
1669
1670define i8 @test_v2i8(<2 x i8> %a0) {
1671; SSE2-LABEL: test_v2i8:
1672; SSE2:       # %bb.0:
1673; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1674; SSE2-NEXT:    pand %xmm0, %xmm1
1675; SSE2-NEXT:    pxor %xmm2, %xmm2
1676; 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]
1677; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1678; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1679; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1680; SSE2-NEXT:    movdqa %xmm1, %xmm3
1681; SSE2-NEXT:    por %xmm2, %xmm3
1682; SSE2-NEXT:    por %xmm0, %xmm2
1683; SSE2-NEXT:    movdqa %xmm2, %xmm4
1684; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1685; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1686; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1687; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1688; SSE2-NEXT:    pand %xmm5, %xmm2
1689; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1690; SSE2-NEXT:    por %xmm2, %xmm3
1691; SSE2-NEXT:    pand %xmm3, %xmm1
1692; SSE2-NEXT:    pandn %xmm0, %xmm3
1693; SSE2-NEXT:    por %xmm1, %xmm3
1694; SSE2-NEXT:    movd %xmm3, %eax
1695; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1696; SSE2-NEXT:    retq
1697;
1698; SSE41-LABEL: test_v2i8:
1699; SSE41:       # %bb.0:
1700; SSE41-NEXT:    movdqa %xmm0, %xmm1
1701; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1702; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
1703; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1704; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1705; SSE41-NEXT:    movdqa %xmm1, %xmm0
1706; SSE41-NEXT:    por %xmm3, %xmm0
1707; SSE41-NEXT:    por %xmm2, %xmm3
1708; SSE41-NEXT:    movdqa %xmm3, %xmm4
1709; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1710; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1711; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1712; SSE41-NEXT:    pand %xmm4, %xmm0
1713; SSE41-NEXT:    por %xmm3, %xmm0
1714; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1715; SSE41-NEXT:    pextrb $0, %xmm2, %eax
1716; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1717; SSE41-NEXT:    retq
1718;
1719; AVX-LABEL: test_v2i8:
1720; AVX:       # %bb.0:
1721; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm1
1722; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1723; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1724; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1725; AVX-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1726; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1727; AVX-NEXT:    # kill: def $al killed $al killed $eax
1728; AVX-NEXT:    retq
1729;
1730; AVX512BW-LABEL: test_v2i8:
1731; AVX512BW:       # %bb.0:
1732; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm1
1733; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1734; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1735; AVX512BW-NEXT:    vpminuq %zmm0, %zmm1, %zmm0
1736; AVX512BW-NEXT:    vpextrb $0, %xmm0, %eax
1737; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
1738; AVX512BW-NEXT:    vzeroupper
1739; AVX512BW-NEXT:    retq
1740;
1741; AVX512VL-LABEL: test_v2i8:
1742; AVX512VL:       # %bb.0:
1743; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm1
1744; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1745; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1746; AVX512VL-NEXT:    vpminuq %xmm0, %xmm1, %xmm0
1747; AVX512VL-NEXT:    vpextrb $0, %xmm0, %eax
1748; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
1749; AVX512VL-NEXT:    retq
1750  %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v2i8(<2 x i8> %a0)
1751  ret i8 %1
1752}
1753
1754define i8 @test_v4i8(<4 x i8> %a0) {
1755; SSE2-LABEL: test_v4i8:
1756; SSE2:       # %bb.0:
1757; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
1758; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1759; SSE2-NEXT:    pand %xmm1, %xmm0
1760; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1761; SSE2-NEXT:    movdqa %xmm2, %xmm3
1762; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1763; SSE2-NEXT:    pand %xmm3, %xmm0
1764; SSE2-NEXT:    pandn %xmm2, %xmm3
1765; SSE2-NEXT:    por %xmm0, %xmm3
1766; SSE2-NEXT:    pand %xmm3, %xmm1
1767; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
1768; SSE2-NEXT:    pxor %xmm2, %xmm2
1769; 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]
1770; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1771; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1772; SSE2-NEXT:    movdqa %xmm0, %xmm2
1773; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1774; SSE2-NEXT:    pand %xmm2, %xmm1
1775; SSE2-NEXT:    pandn %xmm0, %xmm2
1776; SSE2-NEXT:    por %xmm1, %xmm2
1777; SSE2-NEXT:    movd %xmm2, %eax
1778; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1779; SSE2-NEXT:    retq
1780;
1781; SSE41-LABEL: test_v4i8:
1782; SSE41:       # %bb.0:
1783; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
1784; SSE41-NEXT:    movdqa %xmm0, %xmm2
1785; SSE41-NEXT:    pand %xmm1, %xmm2
1786; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1787; SSE41-NEXT:    pminud %xmm2, %xmm0
1788; SSE41-NEXT:    pand %xmm0, %xmm1
1789; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1790; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1791; SSE41-NEXT:    pminud %xmm1, %xmm0
1792; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1793; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1794; SSE41-NEXT:    retq
1795;
1796; AVX1-LABEL: test_v4i8:
1797; AVX1:       # %bb.0:
1798; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [3.57331108E-43,3.57331108E-43,3.57331108E-43,3.57331108E-43]
1799; AVX1-NEXT:    vandps %xmm1, %xmm0, %xmm2
1800; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1801; AVX1-NEXT:    vpminud %xmm0, %xmm2, %xmm0
1802; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm1
1803; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1804; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1805; AVX1-NEXT:    vpminud %xmm0, %xmm1, %xmm0
1806; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1807; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1808; AVX1-NEXT:    retq
1809;
1810; AVX2-LABEL: test_v4i8:
1811; AVX2:       # %bb.0:
1812; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
1813; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
1814; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1815; AVX2-NEXT:    vpminud %xmm0, %xmm2, %xmm0
1816; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm1
1817; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1818; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1819; AVX2-NEXT:    vpminud %xmm0, %xmm1, %xmm0
1820; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1821; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1822; AVX2-NEXT:    retq
1823;
1824; AVX512-LABEL: test_v4i8:
1825; AVX512:       # %bb.0:
1826; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
1827; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm2
1828; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1829; AVX512-NEXT:    vpminud %xmm0, %xmm2, %xmm0
1830; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm1
1831; AVX512-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1832; AVX512-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1833; AVX512-NEXT:    vpminud %xmm0, %xmm1, %xmm0
1834; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1835; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1836; AVX512-NEXT:    retq
1837  %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v4i8(<4 x i8> %a0)
1838  ret i8 %1
1839}
1840
1841define i8 @test_v8i8(<8 x i8> %a0) {
1842; SSE2-LABEL: test_v8i8:
1843; SSE2:       # %bb.0:
1844; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
1845; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1846; SSE2-NEXT:    pand %xmm1, %xmm0
1847; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
1848; SSE2-NEXT:    pminsw %xmm0, %xmm2
1849; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1850; SSE2-NEXT:    pand %xmm1, %xmm2
1851; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1852; SSE2-NEXT:    pminsw %xmm2, %xmm0
1853; SSE2-NEXT:    pand %xmm0, %xmm1
1854; SSE2-NEXT:    psrld $16, %xmm0
1855; SSE2-NEXT:    pxor %xmm2, %xmm2
1856; 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]
1857; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1858; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1859; SSE2-NEXT:    pminsw %xmm1, %xmm0
1860; SSE2-NEXT:    movd %xmm0, %eax
1861; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1862; SSE2-NEXT:    retq
1863;
1864; SSE41-LABEL: test_v8i8:
1865; SSE41:       # %bb.0:
1866; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
1867; SSE41-NEXT:    movdqa %xmm0, %xmm2
1868; SSE41-NEXT:    pand %xmm1, %xmm2
1869; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero
1870; SSE41-NEXT:    pminuw %xmm2, %xmm0
1871; SSE41-NEXT:    movdqa %xmm0, %xmm2
1872; SSE41-NEXT:    pand %xmm1, %xmm2
1873; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1874; SSE41-NEXT:    pminuw %xmm2, %xmm0
1875; SSE41-NEXT:    pand %xmm0, %xmm1
1876; SSE41-NEXT:    psrld $16, %xmm0
1877; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1878; SSE41-NEXT:    pminuw %xmm1, %xmm0
1879; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1880; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1881; SSE41-NEXT:    retq
1882;
1883; AVX1-LABEL: test_v8i8:
1884; AVX1:       # %bb.0:
1885; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
1886; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
1887; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero
1888; AVX1-NEXT:    vpminuw %xmm0, %xmm2, %xmm0
1889; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
1890; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1891; AVX1-NEXT:    vpminuw %xmm0, %xmm2, %xmm0
1892; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm1
1893; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
1894; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1895; AVX1-NEXT:    vpminuw %xmm0, %xmm1, %xmm0
1896; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1897; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1898; AVX1-NEXT:    retq
1899;
1900; AVX2-LABEL: test_v8i8:
1901; AVX2:       # %bb.0:
1902; AVX2-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1903; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
1904; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero
1905; AVX2-NEXT:    vpminuw %xmm0, %xmm2, %xmm0
1906; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
1907; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1908; AVX2-NEXT:    vpminuw %xmm0, %xmm2, %xmm0
1909; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm1
1910; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
1911; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1912; AVX2-NEXT:    vpminuw %xmm0, %xmm1, %xmm0
1913; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1914; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1915; AVX2-NEXT:    retq
1916;
1917; AVX512-LABEL: test_v8i8:
1918; AVX512:       # %bb.0:
1919; AVX512-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1920; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm2
1921; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero
1922; AVX512-NEXT:    vpminuw %xmm0, %xmm2, %xmm0
1923; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm2
1924; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1925; AVX512-NEXT:    vpminuw %xmm0, %xmm2, %xmm0
1926; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm1
1927; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm0
1928; AVX512-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1929; AVX512-NEXT:    vpminuw %xmm0, %xmm1, %xmm0
1930; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1931; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1932; AVX512-NEXT:    retq
1933  %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v8i8(<8 x i8> %a0)
1934  ret i8 %1
1935}
1936
1937define i8 @test_v16i8(<16 x i8> %a0) {
1938; SSE2-LABEL: test_v16i8:
1939; SSE2:       # %bb.0:
1940; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1941; SSE2-NEXT:    pminub %xmm0, %xmm1
1942; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1943; SSE2-NEXT:    pminub %xmm1, %xmm0
1944; SSE2-NEXT:    movdqa %xmm0, %xmm1
1945; SSE2-NEXT:    psrld $16, %xmm1
1946; SSE2-NEXT:    pminub %xmm0, %xmm1
1947; SSE2-NEXT:    movdqa %xmm1, %xmm0
1948; SSE2-NEXT:    psrlw $8, %xmm0
1949; SSE2-NEXT:    pminub %xmm1, %xmm0
1950; SSE2-NEXT:    movd %xmm0, %eax
1951; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1952; SSE2-NEXT:    retq
1953;
1954; SSE41-LABEL: test_v16i8:
1955; SSE41:       # %bb.0:
1956; SSE41-NEXT:    movdqa %xmm0, %xmm1
1957; SSE41-NEXT:    psrlw $8, %xmm1
1958; SSE41-NEXT:    pminub %xmm0, %xmm1
1959; SSE41-NEXT:    phminposuw %xmm1, %xmm0
1960; SSE41-NEXT:    pextrb $0, %xmm0, %eax
1961; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1962; SSE41-NEXT:    retq
1963;
1964; AVX-LABEL: test_v16i8:
1965; AVX:       # %bb.0:
1966; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1967; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1968; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1969; AVX-NEXT:    vpextrb $0, %xmm0, %eax
1970; AVX-NEXT:    # kill: def $al killed $al killed $eax
1971; AVX-NEXT:    retq
1972;
1973; AVX512-LABEL: test_v16i8:
1974; AVX512:       # %bb.0:
1975; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1976; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1977; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1978; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1979; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1980; AVX512-NEXT:    retq
1981  %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v16i8(<16 x i8> %a0)
1982  ret i8 %1
1983}
1984
1985define i8 @test_v32i8(<32 x i8> %a0) {
1986; SSE2-LABEL: test_v32i8:
1987; SSE2:       # %bb.0:
1988; SSE2-NEXT:    pminub %xmm1, %xmm0
1989; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1990; SSE2-NEXT:    pminub %xmm0, %xmm1
1991; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1992; SSE2-NEXT:    pminub %xmm1, %xmm0
1993; SSE2-NEXT:    movdqa %xmm0, %xmm1
1994; SSE2-NEXT:    psrld $16, %xmm1
1995; SSE2-NEXT:    pminub %xmm0, %xmm1
1996; SSE2-NEXT:    movdqa %xmm1, %xmm0
1997; SSE2-NEXT:    psrlw $8, %xmm0
1998; SSE2-NEXT:    pminub %xmm1, %xmm0
1999; SSE2-NEXT:    movd %xmm0, %eax
2000; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2001; SSE2-NEXT:    retq
2002;
2003; SSE41-LABEL: test_v32i8:
2004; SSE41:       # %bb.0:
2005; SSE41-NEXT:    pminub %xmm1, %xmm0
2006; SSE41-NEXT:    movdqa %xmm0, %xmm1
2007; SSE41-NEXT:    psrlw $8, %xmm1
2008; SSE41-NEXT:    pminub %xmm0, %xmm1
2009; SSE41-NEXT:    phminposuw %xmm1, %xmm0
2010; SSE41-NEXT:    pextrb $0, %xmm0, %eax
2011; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2012; SSE41-NEXT:    retq
2013;
2014; AVX1-LABEL: test_v32i8:
2015; AVX1:       # %bb.0:
2016; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2017; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2018; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2019; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2020; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2021; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
2022; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2023; AVX1-NEXT:    vzeroupper
2024; AVX1-NEXT:    retq
2025;
2026; AVX2-LABEL: test_v32i8:
2027; AVX2:       # %bb.0:
2028; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2029; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2030; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2031; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2032; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2033; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
2034; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2035; AVX2-NEXT:    vzeroupper
2036; AVX2-NEXT:    retq
2037;
2038; AVX512-LABEL: test_v32i8:
2039; AVX512:       # %bb.0:
2040; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
2041; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2042; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
2043; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2044; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
2045; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
2046; AVX512-NEXT:    # kill: def $al killed $al killed $eax
2047; AVX512-NEXT:    vzeroupper
2048; AVX512-NEXT:    retq
2049  %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v32i8(<32 x i8> %a0)
2050  ret i8 %1
2051}
2052
2053define i8 @test_v64i8(<64 x i8> %a0) {
2054; SSE2-LABEL: test_v64i8:
2055; SSE2:       # %bb.0:
2056; SSE2-NEXT:    pminub %xmm3, %xmm1
2057; SSE2-NEXT:    pminub %xmm2, %xmm0
2058; SSE2-NEXT:    pminub %xmm1, %xmm0
2059; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2060; SSE2-NEXT:    pminub %xmm0, %xmm1
2061; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
2062; SSE2-NEXT:    pminub %xmm1, %xmm0
2063; SSE2-NEXT:    movdqa %xmm0, %xmm1
2064; SSE2-NEXT:    psrld $16, %xmm1
2065; SSE2-NEXT:    pminub %xmm0, %xmm1
2066; SSE2-NEXT:    movdqa %xmm1, %xmm0
2067; SSE2-NEXT:    psrlw $8, %xmm0
2068; SSE2-NEXT:    pminub %xmm1, %xmm0
2069; SSE2-NEXT:    movd %xmm0, %eax
2070; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2071; SSE2-NEXT:    retq
2072;
2073; SSE41-LABEL: test_v64i8:
2074; SSE41:       # %bb.0:
2075; SSE41-NEXT:    pminub %xmm3, %xmm1
2076; SSE41-NEXT:    pminub %xmm2, %xmm0
2077; SSE41-NEXT:    pminub %xmm1, %xmm0
2078; SSE41-NEXT:    movdqa %xmm0, %xmm1
2079; SSE41-NEXT:    psrlw $8, %xmm1
2080; SSE41-NEXT:    pminub %xmm0, %xmm1
2081; SSE41-NEXT:    phminposuw %xmm1, %xmm0
2082; SSE41-NEXT:    pextrb $0, %xmm0, %eax
2083; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2084; SSE41-NEXT:    retq
2085;
2086; AVX1-LABEL: test_v64i8:
2087; AVX1:       # %bb.0:
2088; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2089; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2090; AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
2091; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2092; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
2093; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2094; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2095; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2096; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
2097; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2098; AVX1-NEXT:    vzeroupper
2099; AVX1-NEXT:    retq
2100;
2101; AVX2-LABEL: test_v64i8:
2102; AVX2:       # %bb.0:
2103; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2104; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2105; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2106; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2107; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2108; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2109; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
2110; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2111; AVX2-NEXT:    vzeroupper
2112; AVX2-NEXT:    retq
2113;
2114; AVX512-LABEL: test_v64i8:
2115; AVX512:       # %bb.0:
2116; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2117; AVX512-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2118; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
2119; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2120; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
2121; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2122; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
2123; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
2124; AVX512-NEXT:    # kill: def $al killed $al killed $eax
2125; AVX512-NEXT:    vzeroupper
2126; AVX512-NEXT:    retq
2127  %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v64i8(<64 x i8> %a0)
2128  ret i8 %1
2129}
2130
2131define i8 @test_v128i8(<128 x i8> %a0) {
2132; SSE2-LABEL: test_v128i8:
2133; SSE2:       # %bb.0:
2134; SSE2-NEXT:    pminub %xmm6, %xmm2
2135; SSE2-NEXT:    pminub %xmm4, %xmm0
2136; SSE2-NEXT:    pminub %xmm2, %xmm0
2137; SSE2-NEXT:    pminub %xmm7, %xmm3
2138; SSE2-NEXT:    pminub %xmm5, %xmm1
2139; SSE2-NEXT:    pminub %xmm3, %xmm1
2140; SSE2-NEXT:    pminub %xmm0, %xmm1
2141; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
2142; SSE2-NEXT:    pminub %xmm1, %xmm0
2143; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
2144; SSE2-NEXT:    pminub %xmm0, %xmm1
2145; SSE2-NEXT:    movdqa %xmm1, %xmm0
2146; SSE2-NEXT:    psrld $16, %xmm0
2147; SSE2-NEXT:    pminub %xmm1, %xmm0
2148; SSE2-NEXT:    movdqa %xmm0, %xmm1
2149; SSE2-NEXT:    psrlw $8, %xmm1
2150; SSE2-NEXT:    pminub %xmm0, %xmm1
2151; SSE2-NEXT:    movd %xmm1, %eax
2152; SSE2-NEXT:    # kill: def $al killed $al killed $eax
2153; SSE2-NEXT:    retq
2154;
2155; SSE41-LABEL: test_v128i8:
2156; SSE41:       # %bb.0:
2157; SSE41-NEXT:    pminub %xmm7, %xmm3
2158; SSE41-NEXT:    pminub %xmm5, %xmm1
2159; SSE41-NEXT:    pminub %xmm3, %xmm1
2160; SSE41-NEXT:    pminub %xmm6, %xmm2
2161; SSE41-NEXT:    pminub %xmm4, %xmm0
2162; SSE41-NEXT:    pminub %xmm2, %xmm0
2163; SSE41-NEXT:    pminub %xmm1, %xmm0
2164; SSE41-NEXT:    movdqa %xmm0, %xmm1
2165; SSE41-NEXT:    psrlw $8, %xmm1
2166; SSE41-NEXT:    pminub %xmm0, %xmm1
2167; SSE41-NEXT:    phminposuw %xmm1, %xmm0
2168; SSE41-NEXT:    pextrb $0, %xmm0, %eax
2169; SSE41-NEXT:    # kill: def $al killed $al killed $eax
2170; SSE41-NEXT:    retq
2171;
2172; AVX1-LABEL: test_v128i8:
2173; AVX1:       # %bb.0:
2174; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
2175; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2176; AVX1-NEXT:    vpminub %xmm4, %xmm5, %xmm4
2177; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
2178; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2179; AVX1-NEXT:    vpminub %xmm5, %xmm6, %xmm5
2180; AVX1-NEXT:    vpminub %xmm4, %xmm5, %xmm4
2181; AVX1-NEXT:    vpminub %xmm3, %xmm1, %xmm1
2182; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
2183; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2184; AVX1-NEXT:    vpminub %xmm4, %xmm0, %xmm0
2185; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2186; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2187; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2188; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
2189; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2190; AVX1-NEXT:    vzeroupper
2191; AVX1-NEXT:    retq
2192;
2193; AVX2-LABEL: test_v128i8:
2194; AVX2:       # %bb.0:
2195; AVX2-NEXT:    vpminub %ymm3, %ymm1, %ymm1
2196; AVX2-NEXT:    vpminub %ymm2, %ymm0, %ymm0
2197; AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2198; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2199; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2200; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2201; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2202; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2203; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
2204; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2205; AVX2-NEXT:    vzeroupper
2206; AVX2-NEXT:    retq
2207;
2208; AVX512-LABEL: test_v128i8:
2209; AVX512:       # %bb.0:
2210; AVX512-NEXT:    vpminub %zmm1, %zmm0, %zmm0
2211; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2212; AVX512-NEXT:    vpminub %ymm1, %ymm0, %ymm0
2213; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
2214; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2215; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
2216; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2217; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
2218; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
2219; AVX512-NEXT:    # kill: def $al killed $al killed $eax
2220; AVX512-NEXT:    vzeroupper
2221; AVX512-NEXT:    retq
2222  %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v128i8(<128 x i8> %a0)
2223  ret i8 %1
2224}
2225
2226declare i64 @llvm.experimental.vector.reduce.umin.i64.v2i64(<2 x i64>)
2227declare i64 @llvm.experimental.vector.reduce.umin.i64.v4i64(<4 x i64>)
2228declare i64 @llvm.experimental.vector.reduce.umin.i64.v8i64(<8 x i64>)
2229declare i64 @llvm.experimental.vector.reduce.umin.i64.v16i64(<16 x i64>)
2230
2231declare i32 @llvm.experimental.vector.reduce.umin.i32.v2i32(<2 x i32>)
2232declare i32 @llvm.experimental.vector.reduce.umin.i32.v4i32(<4 x i32>)
2233declare i32 @llvm.experimental.vector.reduce.umin.i32.v8i32(<8 x i32>)
2234declare i32 @llvm.experimental.vector.reduce.umin.i32.v16i32(<16 x i32>)
2235declare i32 @llvm.experimental.vector.reduce.umin.i32.v32i32(<32 x i32>)
2236
2237declare i16 @llvm.experimental.vector.reduce.umin.i16.v2i16(<2 x i16>)
2238declare i16 @llvm.experimental.vector.reduce.umin.i16.v4i16(<4 x i16>)
2239declare i16 @llvm.experimental.vector.reduce.umin.i16.v8i16(<8 x i16>)
2240declare i16 @llvm.experimental.vector.reduce.umin.i16.v16i16(<16 x i16>)
2241declare i16 @llvm.experimental.vector.reduce.umin.i16.v32i16(<32 x i16>)
2242declare i16 @llvm.experimental.vector.reduce.umin.i16.v64i16(<64 x i16>)
2243
2244declare i8 @llvm.experimental.vector.reduce.umin.i8.v2i8(<2 x i8>)
2245declare i8 @llvm.experimental.vector.reduce.umin.i8.v4i8(<4 x i8>)
2246declare i8 @llvm.experimental.vector.reduce.umin.i8.v8i8(<8 x i8>)
2247declare i8 @llvm.experimental.vector.reduce.umin.i8.v16i8(<16 x i8>)
2248declare i8 @llvm.experimental.vector.reduce.umin.i8.v32i8(<32 x i8>)
2249declare i8 @llvm.experimental.vector.reduce.umin.i8.v64i8(<64 x i8>)
2250declare i8 @llvm.experimental.vector.reduce.umin.i8.v128i8(<128 x i8>)
2251