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