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