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