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