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