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