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