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:
41 ; X86-SSE42: ## %bb.0:
42 ; X86-SSE42-NEXT: movdqa %xmm0, %xmm1
43 ; X86-SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
44 ; X86-SSE42-NEXT: 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 = [9223372039002259456,9223372039002259456]
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:
87 ; X64-SSE42: ## %bb.0:
88 ; X64-SSE42-NEXT: movdqa %xmm0, %xmm1
89 ; X64-SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[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:
110 ; X64-AVX2: ## %bb.0:
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:
135 ; X86-SSE2: ## %bb.0:
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:
176 ; X64-SSE2: ## %bb.0:
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:
227 ; X86-SSE2: ## %bb.0:
228 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
229 ; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
230 ; X86-SSE2-NEXT: pxor %xmm2, %xmm0
231 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
232 ; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
233 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
234 ; X86-SSE2-NEXT: pxor %xmm2, %xmm0
235 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
236 ; X86-SSE2-NEXT: pxor %xmm2, %xmm0
237 ; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
238 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
239 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
240 ; X86-SSE2-NEXT: psrld $16, %xmm1
241 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
242 ; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
243 ; X86-SSE2-NEXT: movd %xmm1, %eax
244 ; X86-SSE2-NEXT: xorl $32768, %eax ## imm = 0x8000
245 ; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
246 ; X86-SSE2-NEXT: retl
248 ; X86-SSE42-LABEL: test_reduce_v8i16:
249 ; X86-SSE42: ## %bb.0:
250 ; X86-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
251 ; X86-SSE42-NEXT: pxor %xmm0, %xmm1
252 ; X86-SSE42-NEXT: phminposuw %xmm1, %xmm0
253 ; X86-SSE42-NEXT: movd %xmm0, %eax
254 ; X86-SSE42-NEXT: notl %eax
255 ; X86-SSE42-NEXT: ## kill: def $ax killed $ax killed $eax
256 ; X86-SSE42-NEXT: retl
258 ; X86-AVX-LABEL: test_reduce_v8i16:
260 ; X86-AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
261 ; X86-AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
262 ; X86-AVX-NEXT: vphminposuw %xmm0, %xmm0
263 ; X86-AVX-NEXT: vmovd %xmm0, %eax
264 ; X86-AVX-NEXT: notl %eax
265 ; X86-AVX-NEXT: ## kill: def $ax killed $ax killed $eax
268 ; X64-SSE2-LABEL: test_reduce_v8i16:
269 ; X64-SSE2: ## %bb.0:
270 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
271 ; X64-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
272 ; X64-SSE2-NEXT: pxor %xmm2, %xmm0
273 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
274 ; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
275 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
276 ; X64-SSE2-NEXT: pxor %xmm2, %xmm0
277 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
278 ; X64-SSE2-NEXT: pxor %xmm2, %xmm0
279 ; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
280 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
281 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
282 ; X64-SSE2-NEXT: psrld $16, %xmm1
283 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
284 ; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
285 ; X64-SSE2-NEXT: movd %xmm1, %eax
286 ; X64-SSE2-NEXT: xorl $32768, %eax ## imm = 0x8000
287 ; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
288 ; X64-SSE2-NEXT: retq
290 ; X64-SSE42-LABEL: test_reduce_v8i16:
291 ; X64-SSE42: ## %bb.0:
292 ; X64-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
293 ; X64-SSE42-NEXT: pxor %xmm0, %xmm1
294 ; X64-SSE42-NEXT: phminposuw %xmm1, %xmm0
295 ; X64-SSE42-NEXT: movd %xmm0, %eax
296 ; X64-SSE42-NEXT: notl %eax
297 ; X64-SSE42-NEXT: ## kill: def $ax killed $ax killed $eax
298 ; X64-SSE42-NEXT: retq
300 ; X64-AVX1-LABEL: test_reduce_v8i16:
301 ; X64-AVX1: ## %bb.0:
302 ; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
303 ; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
304 ; X64-AVX1-NEXT: vphminposuw %xmm0, %xmm0
305 ; X64-AVX1-NEXT: vmovd %xmm0, %eax
306 ; X64-AVX1-NEXT: notl %eax
307 ; X64-AVX1-NEXT: ## kill: def $ax killed $ax killed $eax
308 ; X64-AVX1-NEXT: retq
310 ; X64-AVX2-LABEL: test_reduce_v8i16:
311 ; X64-AVX2: ## %bb.0:
312 ; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
313 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
314 ; X64-AVX2-NEXT: vphminposuw %xmm0, %xmm0
315 ; X64-AVX2-NEXT: vmovd %xmm0, %eax
316 ; X64-AVX2-NEXT: notl %eax
317 ; X64-AVX2-NEXT: ## kill: def $ax killed $ax killed $eax
318 ; X64-AVX2-NEXT: retq
320 ; X64-AVX512-LABEL: test_reduce_v8i16:
321 ; X64-AVX512: ## %bb.0:
322 ; X64-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
323 ; X64-AVX512-NEXT: vphminposuw %xmm0, %xmm0
324 ; X64-AVX512-NEXT: vmovd %xmm0, %eax
325 ; X64-AVX512-NEXT: notl %eax
326 ; X64-AVX512-NEXT: ## kill: def $ax killed $ax killed $eax
327 ; X64-AVX512-NEXT: retq
328 %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>
329 %2 = icmp ugt <8 x i16> %a0, %1
330 %3 = select <8 x i1> %2, <8 x i16> %a0, <8 x i16> %1
331 %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>
332 %5 = icmp ugt <8 x i16> %3, %4
333 %6 = select <8 x i1> %5, <8 x i16> %3, <8 x i16> %4
334 %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>
335 %8 = icmp ugt <8 x i16> %6, %7
336 %9 = select <8 x i1> %8, <8 x i16> %6, <8 x i16> %7
337 %10 = extractelement <8 x i16> %9, i32 0
341 define i8 @test_reduce_v16i8(<16 x i8> %a0) {
342 ; X86-SSE2-LABEL: test_reduce_v16i8:
343 ; X86-SSE2: ## %bb.0:
344 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
345 ; X86-SSE2-NEXT: pmaxub %xmm0, %xmm1
346 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
347 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
348 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
349 ; X86-SSE2-NEXT: psrld $16, %xmm1
350 ; X86-SSE2-NEXT: pmaxub %xmm0, %xmm1
351 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
352 ; X86-SSE2-NEXT: psrlw $8, %xmm0
353 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
354 ; X86-SSE2-NEXT: movd %xmm0, %eax
355 ; X86-SSE2-NEXT: ## kill: def $al killed $al killed $eax
356 ; X86-SSE2-NEXT: retl
358 ; X86-SSE42-LABEL: test_reduce_v16i8:
359 ; X86-SSE42: ## %bb.0:
360 ; X86-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
361 ; X86-SSE42-NEXT: pxor %xmm0, %xmm1
362 ; X86-SSE42-NEXT: movdqa %xmm1, %xmm0
363 ; X86-SSE42-NEXT: psrlw $8, %xmm0
364 ; X86-SSE42-NEXT: pminub %xmm1, %xmm0
365 ; X86-SSE42-NEXT: phminposuw %xmm0, %xmm0
366 ; X86-SSE42-NEXT: pextrb $0, %xmm0, %eax
367 ; X86-SSE42-NEXT: notb %al
368 ; X86-SSE42-NEXT: ## kill: def $al killed $al killed $eax
369 ; X86-SSE42-NEXT: retl
371 ; X86-AVX-LABEL: test_reduce_v16i8:
373 ; X86-AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
374 ; X86-AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
375 ; X86-AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
376 ; X86-AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
377 ; X86-AVX-NEXT: vphminposuw %xmm0, %xmm0
378 ; X86-AVX-NEXT: vpextrb $0, %xmm0, %eax
379 ; X86-AVX-NEXT: notb %al
380 ; X86-AVX-NEXT: ## kill: def $al killed $al killed $eax
383 ; X64-SSE2-LABEL: test_reduce_v16i8:
384 ; X64-SSE2: ## %bb.0:
385 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
386 ; X64-SSE2-NEXT: pmaxub %xmm0, %xmm1
387 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
388 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
389 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
390 ; X64-SSE2-NEXT: psrld $16, %xmm1
391 ; X64-SSE2-NEXT: pmaxub %xmm0, %xmm1
392 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
393 ; X64-SSE2-NEXT: psrlw $8, %xmm0
394 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
395 ; X64-SSE2-NEXT: movd %xmm0, %eax
396 ; X64-SSE2-NEXT: ## kill: def $al killed $al killed $eax
397 ; X64-SSE2-NEXT: retq
399 ; X64-SSE42-LABEL: test_reduce_v16i8:
400 ; X64-SSE42: ## %bb.0:
401 ; X64-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
402 ; X64-SSE42-NEXT: pxor %xmm0, %xmm1
403 ; X64-SSE42-NEXT: movdqa %xmm1, %xmm0
404 ; X64-SSE42-NEXT: psrlw $8, %xmm0
405 ; X64-SSE42-NEXT: pminub %xmm1, %xmm0
406 ; X64-SSE42-NEXT: phminposuw %xmm0, %xmm0
407 ; X64-SSE42-NEXT: pextrb $0, %xmm0, %eax
408 ; X64-SSE42-NEXT: notb %al
409 ; X64-SSE42-NEXT: ## kill: def $al killed $al killed $eax
410 ; X64-SSE42-NEXT: retq
412 ; X64-AVX1-LABEL: test_reduce_v16i8:
413 ; X64-AVX1: ## %bb.0:
414 ; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
415 ; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
416 ; X64-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
417 ; X64-AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
418 ; X64-AVX1-NEXT: vphminposuw %xmm0, %xmm0
419 ; X64-AVX1-NEXT: vpextrb $0, %xmm0, %eax
420 ; X64-AVX1-NEXT: notb %al
421 ; X64-AVX1-NEXT: ## kill: def $al killed $al killed $eax
422 ; X64-AVX1-NEXT: retq
424 ; X64-AVX2-LABEL: test_reduce_v16i8:
425 ; X64-AVX2: ## %bb.0:
426 ; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
427 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
428 ; X64-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
429 ; X64-AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
430 ; X64-AVX2-NEXT: vphminposuw %xmm0, %xmm0
431 ; X64-AVX2-NEXT: vpextrb $0, %xmm0, %eax
432 ; X64-AVX2-NEXT: notb %al
433 ; X64-AVX2-NEXT: ## kill: def $al killed $al killed $eax
434 ; X64-AVX2-NEXT: retq
436 ; X64-AVX512-LABEL: test_reduce_v16i8:
437 ; X64-AVX512: ## %bb.0:
438 ; X64-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
439 ; X64-AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
440 ; X64-AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
441 ; X64-AVX512-NEXT: vphminposuw %xmm0, %xmm0
442 ; X64-AVX512-NEXT: vpextrb $0, %xmm0, %eax
443 ; X64-AVX512-NEXT: notb %al
444 ; X64-AVX512-NEXT: ## kill: def $al killed $al killed $eax
445 ; X64-AVX512-NEXT: retq
446 %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>
447 %2 = icmp ugt <16 x i8> %a0, %1
448 %3 = select <16 x i1> %2, <16 x i8> %a0, <16 x i8> %1
449 %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>
450 %5 = icmp ugt <16 x i8> %3, %4
451 %6 = select <16 x i1> %5, <16 x i8> %3, <16 x i8> %4
452 %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>
453 %8 = icmp ugt <16 x i8> %6, %7
454 %9 = select <16 x i1> %8, <16 x i8> %6, <16 x i8> %7
455 %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>
456 %11 = icmp ugt <16 x i8> %9, %10
457 %12 = select <16 x i1> %11, <16 x i8> %9, <16 x i8> %10
458 %13 = extractelement <16 x i8> %12, i32 0
466 define i64 @test_reduce_v4i64(<4 x i64> %a0) {
467 ; X86-SSE2-LABEL: test_reduce_v4i64:
468 ; X86-SSE2: ## %bb.0:
469 ; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
470 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm3
471 ; X86-SSE2-NEXT: pxor %xmm2, %xmm3
472 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm4
473 ; X86-SSE2-NEXT: pxor %xmm2, %xmm4
474 ; X86-SSE2-NEXT: movdqa %xmm4, %xmm5
475 ; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm5
476 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
477 ; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm4
478 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
479 ; X86-SSE2-NEXT: pand %xmm6, %xmm3
480 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
481 ; X86-SSE2-NEXT: por %xmm3, %xmm4
482 ; X86-SSE2-NEXT: pand %xmm4, %xmm0
483 ; X86-SSE2-NEXT: pandn %xmm1, %xmm4
484 ; X86-SSE2-NEXT: por %xmm0, %xmm4
485 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
486 ; X86-SSE2-NEXT: movdqa %xmm4, %xmm1
487 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
488 ; X86-SSE2-NEXT: pxor %xmm0, %xmm2
489 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm3
490 ; X86-SSE2-NEXT: pcmpgtd %xmm2, %xmm3
491 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
492 ; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm2
493 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
494 ; X86-SSE2-NEXT: pand %xmm5, %xmm1
495 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
496 ; X86-SSE2-NEXT: por %xmm1, %xmm2
497 ; X86-SSE2-NEXT: pand %xmm2, %xmm4
498 ; X86-SSE2-NEXT: pandn %xmm0, %xmm2
499 ; X86-SSE2-NEXT: por %xmm4, %xmm2
500 ; X86-SSE2-NEXT: movd %xmm2, %eax
501 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
502 ; X86-SSE2-NEXT: movd %xmm0, %edx
503 ; X86-SSE2-NEXT: retl
505 ; X86-SSE42-LABEL: test_reduce_v4i64:
506 ; X86-SSE42: ## %bb.0:
507 ; X86-SSE42-NEXT: movdqa %xmm0, %xmm2
508 ; X86-SSE42-NEXT: movdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
509 ; X86-SSE42-NEXT: movdqa %xmm1, %xmm4
510 ; X86-SSE42-NEXT: pxor %xmm3, %xmm4
511 ; X86-SSE42-NEXT: pxor %xmm3, %xmm0
512 ; X86-SSE42-NEXT: pcmpgtq %xmm4, %xmm0
513 ; X86-SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm1
514 ; X86-SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
515 ; X86-SSE42-NEXT: movdqa %xmm1, %xmm0
516 ; X86-SSE42-NEXT: pxor %xmm3, %xmm0
517 ; X86-SSE42-NEXT: pxor %xmm2, %xmm3
518 ; X86-SSE42-NEXT: pcmpgtq %xmm3, %xmm0
519 ; X86-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm2
520 ; X86-SSE42-NEXT: movd %xmm2, %eax
521 ; X86-SSE42-NEXT: pextrd $1, %xmm2, %edx
522 ; X86-SSE42-NEXT: retl
524 ; X86-AVX1-LABEL: test_reduce_v4i64:
525 ; X86-AVX1: ## %bb.0:
526 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
527 ; X86-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
528 ; X86-AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3
529 ; X86-AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm4
530 ; X86-AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm4
531 ; X86-AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm3
532 ; X86-AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
533 ; X86-AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
534 ; X86-AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
535 ; X86-AVX1-NEXT: vxorpd %xmm2, %xmm0, %xmm3
536 ; X86-AVX1-NEXT: vxorpd %xmm2, %xmm1, %xmm2
537 ; X86-AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
538 ; X86-AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
539 ; X86-AVX1-NEXT: vmovd %xmm0, %eax
540 ; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
541 ; X86-AVX1-NEXT: vzeroupper
542 ; X86-AVX1-NEXT: retl
544 ; X86-AVX2-LABEL: test_reduce_v4i64:
545 ; X86-AVX2: ## %bb.0:
546 ; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
547 ; X86-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
548 ; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3
549 ; X86-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm4
550 ; X86-AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm3
551 ; X86-AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
552 ; X86-AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
553 ; X86-AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3
554 ; X86-AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm2
555 ; X86-AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
556 ; X86-AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
557 ; X86-AVX2-NEXT: vmovd %xmm0, %eax
558 ; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
559 ; X86-AVX2-NEXT: vzeroupper
560 ; X86-AVX2-NEXT: retl
562 ; X64-SSE2-LABEL: test_reduce_v4i64:
563 ; X64-SSE2: ## %bb.0:
564 ; X64-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
565 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm3
566 ; X64-SSE2-NEXT: pxor %xmm2, %xmm3
567 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm4
568 ; X64-SSE2-NEXT: pxor %xmm2, %xmm4
569 ; X64-SSE2-NEXT: movdqa %xmm4, %xmm5
570 ; X64-SSE2-NEXT: pcmpgtd %xmm3, %xmm5
571 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
572 ; X64-SSE2-NEXT: pcmpeqd %xmm3, %xmm4
573 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
574 ; X64-SSE2-NEXT: pand %xmm6, %xmm3
575 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
576 ; X64-SSE2-NEXT: por %xmm3, %xmm4
577 ; X64-SSE2-NEXT: pand %xmm4, %xmm0
578 ; X64-SSE2-NEXT: pandn %xmm1, %xmm4
579 ; X64-SSE2-NEXT: por %xmm0, %xmm4
580 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
581 ; X64-SSE2-NEXT: movdqa %xmm4, %xmm1
582 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
583 ; X64-SSE2-NEXT: pxor %xmm0, %xmm2
584 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm3
585 ; X64-SSE2-NEXT: pcmpgtd %xmm2, %xmm3
586 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
587 ; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm2
588 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
589 ; X64-SSE2-NEXT: pand %xmm5, %xmm1
590 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
591 ; X64-SSE2-NEXT: por %xmm1, %xmm2
592 ; X64-SSE2-NEXT: pand %xmm2, %xmm4
593 ; X64-SSE2-NEXT: pandn %xmm0, %xmm2
594 ; X64-SSE2-NEXT: por %xmm4, %xmm2
595 ; X64-SSE2-NEXT: movq %xmm2, %rax
596 ; X64-SSE2-NEXT: retq
598 ; X64-SSE42-LABEL: test_reduce_v4i64:
599 ; X64-SSE42: ## %bb.0:
600 ; X64-SSE42-NEXT: movdqa %xmm0, %xmm2
601 ; X64-SSE42-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
602 ; X64-SSE42-NEXT: movdqa %xmm1, %xmm4
603 ; X64-SSE42-NEXT: pxor %xmm3, %xmm4
604 ; X64-SSE42-NEXT: pxor %xmm3, %xmm0
605 ; X64-SSE42-NEXT: pcmpgtq %xmm4, %xmm0
606 ; X64-SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm1
607 ; X64-SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
608 ; X64-SSE42-NEXT: movdqa %xmm1, %xmm0
609 ; X64-SSE42-NEXT: pxor %xmm3, %xmm0
610 ; X64-SSE42-NEXT: pxor %xmm2, %xmm3
611 ; X64-SSE42-NEXT: pcmpgtq %xmm3, %xmm0
612 ; X64-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm2
613 ; X64-SSE42-NEXT: movq %xmm2, %rax
614 ; X64-SSE42-NEXT: retq
616 ; X64-AVX1-LABEL: test_reduce_v4i64:
617 ; X64-AVX1: ## %bb.0:
618 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
619 ; X64-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
620 ; X64-AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm3
621 ; X64-AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm4
622 ; X64-AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm4
623 ; X64-AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm3
624 ; X64-AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
625 ; X64-AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
626 ; X64-AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
627 ; X64-AVX1-NEXT: vxorpd %xmm2, %xmm0, %xmm3
628 ; X64-AVX1-NEXT: vxorpd %xmm2, %xmm1, %xmm2
629 ; X64-AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
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:
636 ; X64-AVX2: ## %bb.0:
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:
673 ; X86-SSE2: ## %bb.0:
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:
714 ; X86-AVX1: ## %bb.0:
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:
726 ; X86-AVX2: ## %bb.0:
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:
738 ; X64-SSE2: ## %bb.0:
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:
779 ; X64-AVX1: ## %bb.0:
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:
791 ; X64-AVX2: ## %bb.0:
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:
828 ; X86-SSE2: ## %bb.0:
829 ; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
830 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
831 ; X86-SSE2-NEXT: pxor %xmm2, %xmm0
832 ; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
833 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
834 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
835 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
836 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
837 ; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
838 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
839 ; X86-SSE2-NEXT: pxor %xmm2, %xmm0
840 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
841 ; X86-SSE2-NEXT: pxor %xmm2, %xmm0
842 ; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
843 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
844 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
845 ; X86-SSE2-NEXT: psrld $16, %xmm1
846 ; X86-SSE2-NEXT: pxor %xmm2, %xmm1
847 ; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
848 ; X86-SSE2-NEXT: movd %xmm1, %eax
849 ; X86-SSE2-NEXT: xorl $32768, %eax ## imm = 0x8000
850 ; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
851 ; X86-SSE2-NEXT: retl
853 ; X86-SSE42-LABEL: test_reduce_v16i16:
854 ; X86-SSE42: ## %bb.0:
855 ; X86-SSE42-NEXT: pmaxuw %xmm1, %xmm0
856 ; X86-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
857 ; X86-SSE42-NEXT: pxor %xmm0, %xmm1
858 ; X86-SSE42-NEXT: phminposuw %xmm1, %xmm0
859 ; X86-SSE42-NEXT: movd %xmm0, %eax
860 ; X86-SSE42-NEXT: notl %eax
861 ; X86-SSE42-NEXT: ## kill: def $ax killed $ax killed $eax
862 ; X86-SSE42-NEXT: retl
864 ; X86-AVX1-LABEL: test_reduce_v16i16:
865 ; X86-AVX1: ## %bb.0:
866 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
867 ; X86-AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
868 ; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
869 ; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
870 ; X86-AVX1-NEXT: vphminposuw %xmm0, %xmm0
871 ; X86-AVX1-NEXT: vmovd %xmm0, %eax
872 ; X86-AVX1-NEXT: notl %eax
873 ; X86-AVX1-NEXT: ## kill: def $ax killed $ax killed $eax
874 ; X86-AVX1-NEXT: vzeroupper
875 ; X86-AVX1-NEXT: retl
877 ; X86-AVX2-LABEL: test_reduce_v16i16:
878 ; X86-AVX2: ## %bb.0:
879 ; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
880 ; X86-AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
881 ; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
882 ; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
883 ; X86-AVX2-NEXT: vphminposuw %xmm0, %xmm0
884 ; X86-AVX2-NEXT: vmovd %xmm0, %eax
885 ; X86-AVX2-NEXT: notl %eax
886 ; X86-AVX2-NEXT: ## kill: def $ax killed $ax killed $eax
887 ; X86-AVX2-NEXT: vzeroupper
888 ; X86-AVX2-NEXT: retl
890 ; X64-SSE2-LABEL: test_reduce_v16i16:
891 ; X64-SSE2: ## %bb.0:
892 ; X64-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
893 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
894 ; X64-SSE2-NEXT: pxor %xmm2, %xmm0
895 ; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
896 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
897 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
898 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
899 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
900 ; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
901 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
902 ; X64-SSE2-NEXT: pxor %xmm2, %xmm0
903 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
904 ; X64-SSE2-NEXT: pxor %xmm2, %xmm0
905 ; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
906 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
907 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
908 ; X64-SSE2-NEXT: psrld $16, %xmm1
909 ; X64-SSE2-NEXT: pxor %xmm2, %xmm1
910 ; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
911 ; X64-SSE2-NEXT: movd %xmm1, %eax
912 ; X64-SSE2-NEXT: xorl $32768, %eax ## imm = 0x8000
913 ; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
914 ; X64-SSE2-NEXT: retq
916 ; X64-SSE42-LABEL: test_reduce_v16i16:
917 ; X64-SSE42: ## %bb.0:
918 ; X64-SSE42-NEXT: pmaxuw %xmm1, %xmm0
919 ; X64-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
920 ; X64-SSE42-NEXT: pxor %xmm0, %xmm1
921 ; X64-SSE42-NEXT: phminposuw %xmm1, %xmm0
922 ; X64-SSE42-NEXT: movd %xmm0, %eax
923 ; X64-SSE42-NEXT: notl %eax
924 ; X64-SSE42-NEXT: ## kill: def $ax killed $ax killed $eax
925 ; X64-SSE42-NEXT: retq
927 ; X64-AVX1-LABEL: test_reduce_v16i16:
928 ; X64-AVX1: ## %bb.0:
929 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
930 ; X64-AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
931 ; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
932 ; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
933 ; X64-AVX1-NEXT: vphminposuw %xmm0, %xmm0
934 ; X64-AVX1-NEXT: vmovd %xmm0, %eax
935 ; X64-AVX1-NEXT: notl %eax
936 ; X64-AVX1-NEXT: ## kill: def $ax killed $ax killed $eax
937 ; X64-AVX1-NEXT: vzeroupper
938 ; X64-AVX1-NEXT: retq
940 ; X64-AVX2-LABEL: test_reduce_v16i16:
941 ; X64-AVX2: ## %bb.0:
942 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
943 ; X64-AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
944 ; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
945 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
946 ; X64-AVX2-NEXT: vphminposuw %xmm0, %xmm0
947 ; X64-AVX2-NEXT: vmovd %xmm0, %eax
948 ; X64-AVX2-NEXT: notl %eax
949 ; X64-AVX2-NEXT: ## kill: def $ax killed $ax killed $eax
950 ; X64-AVX2-NEXT: vzeroupper
951 ; X64-AVX2-NEXT: retq
953 ; X64-AVX512-LABEL: test_reduce_v16i16:
954 ; X64-AVX512: ## %bb.0:
955 ; X64-AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
956 ; X64-AVX512-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
957 ; X64-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
958 ; X64-AVX512-NEXT: vphminposuw %xmm0, %xmm0
959 ; X64-AVX512-NEXT: vmovd %xmm0, %eax
960 ; X64-AVX512-NEXT: notl %eax
961 ; X64-AVX512-NEXT: ## kill: def $ax killed $ax killed $eax
962 ; X64-AVX512-NEXT: vzeroupper
963 ; X64-AVX512-NEXT: retq
964 %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>
965 %2 = icmp ugt <16 x i16> %a0, %1
966 %3 = select <16 x i1> %2, <16 x i16> %a0, <16 x i16> %1
967 %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>
968 %5 = icmp ugt <16 x i16> %3, %4
969 %6 = select <16 x i1> %5, <16 x i16> %3, <16 x i16> %4
970 %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>
971 %8 = icmp ugt <16 x i16> %6, %7
972 %9 = select <16 x i1> %8, <16 x i16> %6, <16 x i16> %7
973 %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>
974 %11 = icmp ugt <16 x i16> %9, %10
975 %12 = select <16 x i1> %11, <16 x i16> %9, <16 x i16> %10
976 %13 = extractelement <16 x i16> %12, i32 0
980 define i8 @test_reduce_v32i8(<32 x i8> %a0) {
981 ; X86-SSE2-LABEL: test_reduce_v32i8:
982 ; X86-SSE2: ## %bb.0:
983 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
984 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
985 ; X86-SSE2-NEXT: pmaxub %xmm0, %xmm1
986 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
987 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
988 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
989 ; X86-SSE2-NEXT: psrld $16, %xmm1
990 ; X86-SSE2-NEXT: pmaxub %xmm0, %xmm1
991 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
992 ; X86-SSE2-NEXT: psrlw $8, %xmm0
993 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
994 ; X86-SSE2-NEXT: movd %xmm0, %eax
995 ; X86-SSE2-NEXT: ## kill: def $al killed $al killed $eax
996 ; X86-SSE2-NEXT: retl
998 ; X86-SSE42-LABEL: test_reduce_v32i8:
999 ; X86-SSE42: ## %bb.0:
1000 ; X86-SSE42-NEXT: pmaxub %xmm1, %xmm0
1001 ; X86-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
1002 ; X86-SSE42-NEXT: pxor %xmm0, %xmm1
1003 ; X86-SSE42-NEXT: movdqa %xmm1, %xmm0
1004 ; X86-SSE42-NEXT: psrlw $8, %xmm0
1005 ; X86-SSE42-NEXT: pminub %xmm1, %xmm0
1006 ; X86-SSE42-NEXT: phminposuw %xmm0, %xmm0
1007 ; X86-SSE42-NEXT: pextrb $0, %xmm0, %eax
1008 ; X86-SSE42-NEXT: notb %al
1009 ; X86-SSE42-NEXT: ## kill: def $al killed $al killed $eax
1010 ; X86-SSE42-NEXT: retl
1012 ; X86-AVX1-LABEL: test_reduce_v32i8:
1013 ; X86-AVX1: ## %bb.0:
1014 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1015 ; X86-AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1016 ; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1017 ; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1018 ; X86-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1019 ; X86-AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1020 ; X86-AVX1-NEXT: vphminposuw %xmm0, %xmm0
1021 ; X86-AVX1-NEXT: vpextrb $0, %xmm0, %eax
1022 ; X86-AVX1-NEXT: notb %al
1023 ; X86-AVX1-NEXT: ## kill: def $al killed $al killed $eax
1024 ; X86-AVX1-NEXT: vzeroupper
1025 ; X86-AVX1-NEXT: retl
1027 ; X86-AVX2-LABEL: test_reduce_v32i8:
1028 ; X86-AVX2: ## %bb.0:
1029 ; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1030 ; X86-AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1031 ; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1032 ; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1033 ; X86-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1034 ; X86-AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1035 ; X86-AVX2-NEXT: vphminposuw %xmm0, %xmm0
1036 ; X86-AVX2-NEXT: vpextrb $0, %xmm0, %eax
1037 ; X86-AVX2-NEXT: notb %al
1038 ; X86-AVX2-NEXT: ## kill: def $al killed $al killed $eax
1039 ; X86-AVX2-NEXT: vzeroupper
1040 ; X86-AVX2-NEXT: retl
1042 ; X64-SSE2-LABEL: test_reduce_v32i8:
1043 ; X64-SSE2: ## %bb.0:
1044 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
1045 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1046 ; X64-SSE2-NEXT: pmaxub %xmm0, %xmm1
1047 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1048 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
1049 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
1050 ; X64-SSE2-NEXT: psrld $16, %xmm1
1051 ; X64-SSE2-NEXT: pmaxub %xmm0, %xmm1
1052 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
1053 ; X64-SSE2-NEXT: psrlw $8, %xmm0
1054 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
1055 ; X64-SSE2-NEXT: movd %xmm0, %eax
1056 ; X64-SSE2-NEXT: ## kill: def $al killed $al killed $eax
1057 ; X64-SSE2-NEXT: retq
1059 ; X64-SSE42-LABEL: test_reduce_v32i8:
1060 ; X64-SSE42: ## %bb.0:
1061 ; X64-SSE42-NEXT: pmaxub %xmm1, %xmm0
1062 ; X64-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
1063 ; X64-SSE42-NEXT: pxor %xmm0, %xmm1
1064 ; X64-SSE42-NEXT: movdqa %xmm1, %xmm0
1065 ; X64-SSE42-NEXT: psrlw $8, %xmm0
1066 ; X64-SSE42-NEXT: pminub %xmm1, %xmm0
1067 ; X64-SSE42-NEXT: phminposuw %xmm0, %xmm0
1068 ; X64-SSE42-NEXT: pextrb $0, %xmm0, %eax
1069 ; X64-SSE42-NEXT: notb %al
1070 ; X64-SSE42-NEXT: ## kill: def $al killed $al killed $eax
1071 ; X64-SSE42-NEXT: retq
1073 ; X64-AVX1-LABEL: test_reduce_v32i8:
1074 ; X64-AVX1: ## %bb.0:
1075 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1076 ; X64-AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1077 ; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1078 ; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1079 ; X64-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1080 ; X64-AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1081 ; X64-AVX1-NEXT: vphminposuw %xmm0, %xmm0
1082 ; X64-AVX1-NEXT: vpextrb $0, %xmm0, %eax
1083 ; X64-AVX1-NEXT: notb %al
1084 ; X64-AVX1-NEXT: ## kill: def $al killed $al killed $eax
1085 ; X64-AVX1-NEXT: vzeroupper
1086 ; X64-AVX1-NEXT: retq
1088 ; X64-AVX2-LABEL: test_reduce_v32i8:
1089 ; X64-AVX2: ## %bb.0:
1090 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1091 ; X64-AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1092 ; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1093 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1094 ; X64-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1095 ; X64-AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1096 ; X64-AVX2-NEXT: vphminposuw %xmm0, %xmm0
1097 ; X64-AVX2-NEXT: vpextrb $0, %xmm0, %eax
1098 ; X64-AVX2-NEXT: notb %al
1099 ; X64-AVX2-NEXT: ## kill: def $al killed $al killed $eax
1100 ; X64-AVX2-NEXT: vzeroupper
1101 ; X64-AVX2-NEXT: retq
1103 ; X64-AVX512-LABEL: test_reduce_v32i8:
1104 ; X64-AVX512: ## %bb.0:
1105 ; X64-AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1106 ; X64-AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1107 ; X64-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1108 ; X64-AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1109 ; X64-AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1110 ; X64-AVX512-NEXT: vphminposuw %xmm0, %xmm0
1111 ; X64-AVX512-NEXT: vpextrb $0, %xmm0, %eax
1112 ; X64-AVX512-NEXT: notb %al
1113 ; X64-AVX512-NEXT: ## kill: def $al killed $al killed $eax
1114 ; X64-AVX512-NEXT: vzeroupper
1115 ; X64-AVX512-NEXT: retq
1116 %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>
1117 %2 = icmp ugt <32 x i8> %a0, %1
1118 %3 = select <32 x i1> %2, <32 x i8> %a0, <32 x i8> %1
1119 %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>
1120 %5 = icmp ugt <32 x i8> %3, %4
1121 %6 = select <32 x i1> %5, <32 x i8> %3, <32 x i8> %4
1122 %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>
1123 %8 = icmp ugt <32 x i8> %6, %7
1124 %9 = select <32 x i1> %8, <32 x i8> %6, <32 x i8> %7
1125 %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>
1126 %11 = icmp ugt <32 x i8> %9, %10
1127 %12 = select <32 x i1> %11, <32 x i8> %9, <32 x i8> %10
1128 %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>
1129 %14 = icmp ugt <32 x i8> %12, %13
1130 %15 = select <32 x i1> %14, <32 x i8> %12, <32 x i8> %13
1131 %16 = extractelement <32 x i8> %15, i32 0
1139 define i64 @test_reduce_v8i64(<8 x i64> %a0) {
1140 ; X86-SSE2-LABEL: test_reduce_v8i64:
1141 ; X86-SSE2: ## %bb.0:
1142 ; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1143 ; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
1144 ; X86-SSE2-NEXT: pxor %xmm4, %xmm5
1145 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm6
1146 ; X86-SSE2-NEXT: pxor %xmm4, %xmm6
1147 ; X86-SSE2-NEXT: movdqa %xmm6, %xmm7
1148 ; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
1149 ; X86-SSE2-NEXT: pcmpeqd %xmm5, %xmm6
1150 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1151 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1152 ; X86-SSE2-NEXT: pand %xmm5, %xmm6
1153 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1154 ; X86-SSE2-NEXT: por %xmm6, %xmm5
1155 ; X86-SSE2-NEXT: pand %xmm5, %xmm0
1156 ; X86-SSE2-NEXT: pandn %xmm2, %xmm5
1157 ; X86-SSE2-NEXT: por %xmm0, %xmm5
1158 ; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
1159 ; X86-SSE2-NEXT: pxor %xmm4, %xmm0
1160 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
1161 ; X86-SSE2-NEXT: pxor %xmm4, %xmm2
1162 ; X86-SSE2-NEXT: movdqa %xmm2, %xmm6
1163 ; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm6
1164 ; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm2
1165 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1166 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1167 ; X86-SSE2-NEXT: pand %xmm0, %xmm2
1168 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1169 ; X86-SSE2-NEXT: por %xmm2, %xmm0
1170 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
1171 ; X86-SSE2-NEXT: pandn %xmm3, %xmm0
1172 ; X86-SSE2-NEXT: por %xmm1, %xmm0
1173 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
1174 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1175 ; X86-SSE2-NEXT: movdqa %xmm5, %xmm2
1176 ; X86-SSE2-NEXT: pxor %xmm4, %xmm2
1177 ; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
1178 ; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm3
1179 ; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm2
1180 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,0,2,2]
1181 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1182 ; X86-SSE2-NEXT: pand %xmm1, %xmm2
1183 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1184 ; X86-SSE2-NEXT: por %xmm2, %xmm1
1185 ; X86-SSE2-NEXT: pand %xmm1, %xmm5
1186 ; X86-SSE2-NEXT: pandn %xmm0, %xmm1
1187 ; X86-SSE2-NEXT: por %xmm5, %xmm1
1188 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1189 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
1190 ; X86-SSE2-NEXT: pxor %xmm4, %xmm2
1191 ; X86-SSE2-NEXT: pxor %xmm0, %xmm4
1192 ; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
1193 ; X86-SSE2-NEXT: pcmpgtd %xmm4, %xmm3
1194 ; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm4
1195 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1196 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1197 ; X86-SSE2-NEXT: pand %xmm2, %xmm4
1198 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1199 ; X86-SSE2-NEXT: por %xmm4, %xmm2
1200 ; X86-SSE2-NEXT: pand %xmm2, %xmm1
1201 ; X86-SSE2-NEXT: pandn %xmm0, %xmm2
1202 ; X86-SSE2-NEXT: por %xmm1, %xmm2
1203 ; X86-SSE2-NEXT: movd %xmm2, %eax
1204 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1205 ; X86-SSE2-NEXT: movd %xmm0, %edx
1206 ; X86-SSE2-NEXT: retl
1208 ; X86-SSE42-LABEL: test_reduce_v8i64:
1209 ; X86-SSE42: ## %bb.0:
1210 ; X86-SSE42-NEXT: movdqa %xmm0, %xmm4
1211 ; X86-SSE42-NEXT: movdqa {{.*#+}} xmm5 = [0,2147483648,0,2147483648]
1212 ; X86-SSE42-NEXT: movdqa %xmm2, %xmm6
1213 ; X86-SSE42-NEXT: pxor %xmm5, %xmm6
1214 ; X86-SSE42-NEXT: pxor %xmm5, %xmm0
1215 ; X86-SSE42-NEXT: pcmpgtq %xmm6, %xmm0
1216 ; X86-SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1217 ; X86-SSE42-NEXT: movdqa %xmm3, %xmm4
1218 ; X86-SSE42-NEXT: pxor %xmm5, %xmm4
1219 ; X86-SSE42-NEXT: movdqa %xmm1, %xmm0
1220 ; X86-SSE42-NEXT: pxor %xmm5, %xmm0
1221 ; X86-SSE42-NEXT: pcmpgtq %xmm4, %xmm0
1222 ; X86-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
1223 ; X86-SSE42-NEXT: movapd %xmm3, %xmm1
1224 ; X86-SSE42-NEXT: xorpd %xmm5, %xmm1
1225 ; X86-SSE42-NEXT: movapd %xmm2, %xmm0
1226 ; X86-SSE42-NEXT: xorpd %xmm5, %xmm0
1227 ; X86-SSE42-NEXT: pcmpgtq %xmm1, %xmm0
1228 ; X86-SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm3
1229 ; X86-SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
1230 ; X86-SSE42-NEXT: movdqa %xmm3, %xmm0
1231 ; X86-SSE42-NEXT: pxor %xmm5, %xmm0
1232 ; X86-SSE42-NEXT: pxor %xmm1, %xmm5
1233 ; X86-SSE42-NEXT: pcmpgtq %xmm5, %xmm0
1234 ; X86-SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm1
1235 ; X86-SSE42-NEXT: movd %xmm1, %eax
1236 ; X86-SSE42-NEXT: pextrd $1, %xmm1, %edx
1237 ; X86-SSE42-NEXT: retl
1239 ; X86-AVX1-LABEL: test_reduce_v8i64:
1240 ; X86-AVX1: ## %bb.0:
1241 ; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1242 ; X86-AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
1243 ; X86-AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
1244 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1245 ; X86-AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4
1246 ; X86-AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
1247 ; X86-AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm4
1248 ; X86-AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm5
1249 ; X86-AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
1250 ; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
1251 ; X86-AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1252 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1253 ; X86-AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm2
1254 ; X86-AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm4
1255 ; X86-AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm4
1256 ; X86-AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm2
1257 ; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
1258 ; X86-AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1259 ; X86-AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1260 ; X86-AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm2
1261 ; X86-AVX1-NEXT: vxorpd %xmm3, %xmm1, %xmm3
1262 ; X86-AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
1263 ; X86-AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1264 ; X86-AVX1-NEXT: vmovd %xmm0, %eax
1265 ; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
1266 ; X86-AVX1-NEXT: vzeroupper
1267 ; X86-AVX1-NEXT: retl
1269 ; X86-AVX2-LABEL: test_reduce_v8i64:
1270 ; X86-AVX2: ## %bb.0:
1271 ; X86-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
1272 ; X86-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3
1273 ; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm4
1274 ; X86-AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3
1275 ; X86-AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1276 ; X86-AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
1277 ; X86-AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3
1278 ; X86-AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm4
1279 ; X86-AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm3
1280 ; X86-AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1281 ; X86-AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1282 ; X86-AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3
1283 ; X86-AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm2
1284 ; X86-AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
1285 ; X86-AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1286 ; X86-AVX2-NEXT: vmovd %xmm0, %eax
1287 ; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
1288 ; X86-AVX2-NEXT: vzeroupper
1289 ; X86-AVX2-NEXT: retl
1291 ; X64-SSE2-LABEL: test_reduce_v8i64:
1292 ; X64-SSE2: ## %bb.0:
1293 ; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1294 ; X64-SSE2-NEXT: movdqa %xmm2, %xmm5
1295 ; X64-SSE2-NEXT: pxor %xmm4, %xmm5
1296 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm6
1297 ; X64-SSE2-NEXT: pxor %xmm4, %xmm6
1298 ; X64-SSE2-NEXT: movdqa %xmm6, %xmm7
1299 ; X64-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
1300 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1301 ; X64-SSE2-NEXT: pcmpeqd %xmm5, %xmm6
1302 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1303 ; X64-SSE2-NEXT: pand %xmm8, %xmm6
1304 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1305 ; X64-SSE2-NEXT: por %xmm6, %xmm5
1306 ; X64-SSE2-NEXT: pand %xmm5, %xmm0
1307 ; X64-SSE2-NEXT: pandn %xmm2, %xmm5
1308 ; X64-SSE2-NEXT: por %xmm0, %xmm5
1309 ; X64-SSE2-NEXT: movdqa %xmm3, %xmm0
1310 ; X64-SSE2-NEXT: pxor %xmm4, %xmm0
1311 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
1312 ; X64-SSE2-NEXT: pxor %xmm4, %xmm2
1313 ; X64-SSE2-NEXT: movdqa %xmm2, %xmm6
1314 ; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm6
1315 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1316 ; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm2
1317 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
1318 ; X64-SSE2-NEXT: pand %xmm7, %xmm0
1319 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1320 ; X64-SSE2-NEXT: por %xmm0, %xmm2
1321 ; X64-SSE2-NEXT: pand %xmm2, %xmm1
1322 ; X64-SSE2-NEXT: pandn %xmm3, %xmm2
1323 ; X64-SSE2-NEXT: por %xmm1, %xmm2
1324 ; X64-SSE2-NEXT: movdqa %xmm2, %xmm0
1325 ; X64-SSE2-NEXT: pxor %xmm4, %xmm0
1326 ; X64-SSE2-NEXT: movdqa %xmm5, %xmm1
1327 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1328 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm3
1329 ; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1330 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1331 ; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1332 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1333 ; X64-SSE2-NEXT: pand %xmm6, %xmm0
1334 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1335 ; X64-SSE2-NEXT: por %xmm0, %xmm1
1336 ; X64-SSE2-NEXT: pand %xmm1, %xmm5
1337 ; X64-SSE2-NEXT: pandn %xmm2, %xmm1
1338 ; X64-SSE2-NEXT: por %xmm5, %xmm1
1339 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1340 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
1341 ; X64-SSE2-NEXT: pxor %xmm4, %xmm2
1342 ; X64-SSE2-NEXT: pxor %xmm0, %xmm4
1343 ; X64-SSE2-NEXT: movdqa %xmm2, %xmm3
1344 ; X64-SSE2-NEXT: pcmpgtd %xmm4, %xmm3
1345 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1346 ; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm4
1347 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1348 ; X64-SSE2-NEXT: pand %xmm5, %xmm2
1349 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1350 ; X64-SSE2-NEXT: por %xmm2, %xmm3
1351 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
1352 ; X64-SSE2-NEXT: pandn %xmm0, %xmm3
1353 ; X64-SSE2-NEXT: por %xmm1, %xmm3
1354 ; X64-SSE2-NEXT: movq %xmm3, %rax
1355 ; X64-SSE2-NEXT: retq
1357 ; X64-SSE42-LABEL: test_reduce_v8i64:
1358 ; X64-SSE42: ## %bb.0:
1359 ; X64-SSE42-NEXT: movdqa %xmm0, %xmm4
1360 ; X64-SSE42-NEXT: movdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1361 ; X64-SSE42-NEXT: movdqa %xmm2, %xmm6
1362 ; X64-SSE42-NEXT: pxor %xmm5, %xmm6
1363 ; X64-SSE42-NEXT: pxor %xmm5, %xmm0
1364 ; X64-SSE42-NEXT: pcmpgtq %xmm6, %xmm0
1365 ; X64-SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1366 ; X64-SSE42-NEXT: movdqa %xmm3, %xmm4
1367 ; X64-SSE42-NEXT: pxor %xmm5, %xmm4
1368 ; X64-SSE42-NEXT: movdqa %xmm1, %xmm0
1369 ; X64-SSE42-NEXT: pxor %xmm5, %xmm0
1370 ; X64-SSE42-NEXT: pcmpgtq %xmm4, %xmm0
1371 ; X64-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
1372 ; X64-SSE42-NEXT: movapd %xmm3, %xmm1
1373 ; X64-SSE42-NEXT: xorpd %xmm5, %xmm1
1374 ; X64-SSE42-NEXT: movapd %xmm2, %xmm0
1375 ; X64-SSE42-NEXT: xorpd %xmm5, %xmm0
1376 ; X64-SSE42-NEXT: pcmpgtq %xmm1, %xmm0
1377 ; X64-SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm3
1378 ; X64-SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
1379 ; X64-SSE42-NEXT: movdqa %xmm3, %xmm0
1380 ; X64-SSE42-NEXT: pxor %xmm5, %xmm0
1381 ; X64-SSE42-NEXT: pxor %xmm1, %xmm5
1382 ; X64-SSE42-NEXT: pcmpgtq %xmm5, %xmm0
1383 ; X64-SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm1
1384 ; X64-SSE42-NEXT: movq %xmm1, %rax
1385 ; X64-SSE42-NEXT: retq
1387 ; X64-AVX1-LABEL: test_reduce_v8i64:
1388 ; X64-AVX1: ## %bb.0:
1389 ; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1390 ; X64-AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1391 ; X64-AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
1392 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1393 ; X64-AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4
1394 ; X64-AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
1395 ; X64-AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm4
1396 ; X64-AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm5
1397 ; X64-AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
1398 ; X64-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
1399 ; X64-AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1400 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1401 ; X64-AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm2
1402 ; X64-AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm4
1403 ; X64-AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm4
1404 ; X64-AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm2
1405 ; X64-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
1406 ; X64-AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1407 ; X64-AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1408 ; X64-AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm2
1409 ; X64-AVX1-NEXT: vxorpd %xmm3, %xmm1, %xmm3
1410 ; X64-AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2
1411 ; X64-AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1412 ; X64-AVX1-NEXT: vmovq %xmm0, %rax
1413 ; X64-AVX1-NEXT: vzeroupper
1414 ; X64-AVX1-NEXT: retq
1416 ; X64-AVX2-LABEL: test_reduce_v8i64:
1417 ; X64-AVX2: ## %bb.0:
1418 ; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1419 ; X64-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm3
1420 ; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm4
1421 ; X64-AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3
1422 ; X64-AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1423 ; X64-AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
1424 ; X64-AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3
1425 ; X64-AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm4
1426 ; X64-AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm3
1427 ; X64-AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1428 ; X64-AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
1429 ; X64-AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3
1430 ; X64-AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm2
1431 ; X64-AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
1432 ; X64-AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1433 ; X64-AVX2-NEXT: vmovq %xmm0, %rax
1434 ; X64-AVX2-NEXT: vzeroupper
1435 ; X64-AVX2-NEXT: retq
1437 ; X64-AVX512-LABEL: test_reduce_v8i64:
1438 ; X64-AVX512: ## %bb.0:
1439 ; X64-AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1440 ; X64-AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
1441 ; X64-AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1442 ; X64-AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
1443 ; X64-AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1444 ; X64-AVX512-NEXT: vpmaxuq %zmm1, %zmm0, %zmm0
1445 ; X64-AVX512-NEXT: vmovq %xmm0, %rax
1446 ; X64-AVX512-NEXT: vzeroupper
1447 ; X64-AVX512-NEXT: retq
1448 %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>
1449 %2 = icmp ugt <8 x i64> %a0, %1
1450 %3 = select <8 x i1> %2, <8 x i64> %a0, <8 x i64> %1
1451 %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>
1452 %5 = icmp ugt <8 x i64> %3, %4
1453 %6 = select <8 x i1> %5, <8 x i64> %3, <8 x i64> %4
1454 %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>
1455 %8 = icmp ugt <8 x i64> %6, %7
1456 %9 = select <8 x i1> %8, <8 x i64> %6, <8 x i64> %7
1457 %10 = extractelement <8 x i64> %9, i32 0
1461 define i32 @test_reduce_v16i32(<16 x i32> %a0) {
1462 ; X86-SSE2-LABEL: test_reduce_v16i32:
1463 ; X86-SSE2: ## %bb.0:
1464 ; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1465 ; X86-SSE2-NEXT: movdqa %xmm2, %xmm6
1466 ; X86-SSE2-NEXT: pxor %xmm4, %xmm6
1467 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm5
1468 ; X86-SSE2-NEXT: pxor %xmm4, %xmm5
1469 ; X86-SSE2-NEXT: pcmpgtd %xmm6, %xmm5
1470 ; X86-SSE2-NEXT: pand %xmm5, %xmm0
1471 ; X86-SSE2-NEXT: pandn %xmm2, %xmm5
1472 ; X86-SSE2-NEXT: por %xmm0, %xmm5
1473 ; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
1474 ; X86-SSE2-NEXT: pxor %xmm4, %xmm0
1475 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
1476 ; X86-SSE2-NEXT: pxor %xmm4, %xmm2
1477 ; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1478 ; X86-SSE2-NEXT: pand %xmm2, %xmm1
1479 ; X86-SSE2-NEXT: pandn %xmm3, %xmm2
1480 ; X86-SSE2-NEXT: por %xmm1, %xmm2
1481 ; X86-SSE2-NEXT: movdqa %xmm2, %xmm0
1482 ; X86-SSE2-NEXT: pxor %xmm4, %xmm0
1483 ; X86-SSE2-NEXT: movdqa %xmm5, %xmm1
1484 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1485 ; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1486 ; X86-SSE2-NEXT: pand %xmm1, %xmm5
1487 ; X86-SSE2-NEXT: pandn %xmm2, %xmm1
1488 ; X86-SSE2-NEXT: por %xmm5, %xmm1
1489 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1490 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
1491 ; X86-SSE2-NEXT: pxor %xmm4, %xmm2
1492 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
1493 ; X86-SSE2-NEXT: pxor %xmm4, %xmm3
1494 ; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm2
1495 ; X86-SSE2-NEXT: pand %xmm2, %xmm1
1496 ; X86-SSE2-NEXT: pandn %xmm0, %xmm2
1497 ; X86-SSE2-NEXT: por %xmm1, %xmm2
1498 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1499 ; X86-SSE2-NEXT: movdqa %xmm2, %xmm1
1500 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1501 ; X86-SSE2-NEXT: pxor %xmm0, %xmm4
1502 ; X86-SSE2-NEXT: pcmpgtd %xmm4, %xmm1
1503 ; X86-SSE2-NEXT: pand %xmm1, %xmm2
1504 ; X86-SSE2-NEXT: pandn %xmm0, %xmm1
1505 ; X86-SSE2-NEXT: por %xmm2, %xmm1
1506 ; X86-SSE2-NEXT: movd %xmm1, %eax
1507 ; X86-SSE2-NEXT: retl
1509 ; X86-SSE42-LABEL: test_reduce_v16i32:
1510 ; X86-SSE42: ## %bb.0:
1511 ; X86-SSE42-NEXT: pmaxud %xmm3, %xmm1
1512 ; X86-SSE42-NEXT: pmaxud %xmm2, %xmm0
1513 ; X86-SSE42-NEXT: pmaxud %xmm1, %xmm0
1514 ; X86-SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1515 ; X86-SSE42-NEXT: pmaxud %xmm0, %xmm1
1516 ; X86-SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1517 ; X86-SSE42-NEXT: pmaxud %xmm1, %xmm0
1518 ; X86-SSE42-NEXT: movd %xmm0, %eax
1519 ; X86-SSE42-NEXT: retl
1521 ; X86-AVX1-LABEL: test_reduce_v16i32:
1522 ; X86-AVX1: ## %bb.0:
1523 ; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1524 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1525 ; X86-AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm2
1526 ; X86-AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
1527 ; X86-AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm0
1528 ; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1529 ; X86-AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
1530 ; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1531 ; X86-AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
1532 ; X86-AVX1-NEXT: vmovd %xmm0, %eax
1533 ; X86-AVX1-NEXT: vzeroupper
1534 ; X86-AVX1-NEXT: retl
1536 ; X86-AVX2-LABEL: test_reduce_v16i32:
1537 ; X86-AVX2: ## %bb.0:
1538 ; X86-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1539 ; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1540 ; X86-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1541 ; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1542 ; X86-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1543 ; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1544 ; X86-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1545 ; X86-AVX2-NEXT: vmovd %xmm0, %eax
1546 ; X86-AVX2-NEXT: vzeroupper
1547 ; X86-AVX2-NEXT: retl
1549 ; X64-SSE2-LABEL: test_reduce_v16i32:
1550 ; X64-SSE2: ## %bb.0:
1551 ; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1552 ; X64-SSE2-NEXT: movdqa %xmm2, %xmm6
1553 ; X64-SSE2-NEXT: pxor %xmm4, %xmm6
1554 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm5
1555 ; X64-SSE2-NEXT: pxor %xmm4, %xmm5
1556 ; X64-SSE2-NEXT: pcmpgtd %xmm6, %xmm5
1557 ; X64-SSE2-NEXT: pand %xmm5, %xmm0
1558 ; X64-SSE2-NEXT: pandn %xmm2, %xmm5
1559 ; X64-SSE2-NEXT: por %xmm0, %xmm5
1560 ; X64-SSE2-NEXT: movdqa %xmm3, %xmm0
1561 ; X64-SSE2-NEXT: pxor %xmm4, %xmm0
1562 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
1563 ; X64-SSE2-NEXT: pxor %xmm4, %xmm2
1564 ; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1565 ; X64-SSE2-NEXT: pand %xmm2, %xmm1
1566 ; X64-SSE2-NEXT: pandn %xmm3, %xmm2
1567 ; X64-SSE2-NEXT: por %xmm1, %xmm2
1568 ; X64-SSE2-NEXT: movdqa %xmm2, %xmm0
1569 ; X64-SSE2-NEXT: pxor %xmm4, %xmm0
1570 ; X64-SSE2-NEXT: movdqa %xmm5, %xmm1
1571 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1572 ; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1573 ; X64-SSE2-NEXT: pand %xmm1, %xmm5
1574 ; X64-SSE2-NEXT: pandn %xmm2, %xmm1
1575 ; X64-SSE2-NEXT: por %xmm5, %xmm1
1576 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1577 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
1578 ; X64-SSE2-NEXT: pxor %xmm4, %xmm2
1579 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm3
1580 ; X64-SSE2-NEXT: pxor %xmm4, %xmm3
1581 ; X64-SSE2-NEXT: pcmpgtd %xmm3, %xmm2
1582 ; X64-SSE2-NEXT: pand %xmm2, %xmm1
1583 ; X64-SSE2-NEXT: pandn %xmm0, %xmm2
1584 ; X64-SSE2-NEXT: por %xmm1, %xmm2
1585 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1586 ; X64-SSE2-NEXT: movdqa %xmm2, %xmm1
1587 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1588 ; X64-SSE2-NEXT: pxor %xmm0, %xmm4
1589 ; X64-SSE2-NEXT: pcmpgtd %xmm4, %xmm1
1590 ; X64-SSE2-NEXT: pand %xmm1, %xmm2
1591 ; X64-SSE2-NEXT: pandn %xmm0, %xmm1
1592 ; X64-SSE2-NEXT: por %xmm2, %xmm1
1593 ; X64-SSE2-NEXT: movd %xmm1, %eax
1594 ; X64-SSE2-NEXT: retq
1596 ; X64-SSE42-LABEL: test_reduce_v16i32:
1597 ; X64-SSE42: ## %bb.0:
1598 ; X64-SSE42-NEXT: pmaxud %xmm3, %xmm1
1599 ; X64-SSE42-NEXT: pmaxud %xmm2, %xmm0
1600 ; X64-SSE42-NEXT: pmaxud %xmm1, %xmm0
1601 ; X64-SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1602 ; X64-SSE42-NEXT: pmaxud %xmm0, %xmm1
1603 ; X64-SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1604 ; X64-SSE42-NEXT: pmaxud %xmm1, %xmm0
1605 ; X64-SSE42-NEXT: movd %xmm0, %eax
1606 ; X64-SSE42-NEXT: retq
1608 ; X64-AVX1-LABEL: test_reduce_v16i32:
1609 ; X64-AVX1: ## %bb.0:
1610 ; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1611 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1612 ; X64-AVX1-NEXT: vpmaxud %xmm2, %xmm3, %xmm2
1613 ; X64-AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
1614 ; X64-AVX1-NEXT: vpmaxud %xmm2, %xmm0, %xmm0
1615 ; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1616 ; X64-AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
1617 ; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1618 ; X64-AVX1-NEXT: vpmaxud %xmm1, %xmm0, %xmm0
1619 ; X64-AVX1-NEXT: vmovd %xmm0, %eax
1620 ; X64-AVX1-NEXT: vzeroupper
1621 ; X64-AVX1-NEXT: retq
1623 ; X64-AVX2-LABEL: test_reduce_v16i32:
1624 ; X64-AVX2: ## %bb.0:
1625 ; X64-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1626 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1627 ; X64-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1628 ; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1629 ; X64-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1630 ; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1631 ; X64-AVX2-NEXT: vpmaxud %ymm1, %ymm0, %ymm0
1632 ; X64-AVX2-NEXT: vmovd %xmm0, %eax
1633 ; X64-AVX2-NEXT: vzeroupper
1634 ; X64-AVX2-NEXT: retq
1636 ; X64-AVX512-LABEL: test_reduce_v16i32:
1637 ; X64-AVX512: ## %bb.0:
1638 ; X64-AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1639 ; X64-AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm0
1640 ; X64-AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1641 ; X64-AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm0
1642 ; X64-AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1643 ; X64-AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm0
1644 ; X64-AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1645 ; X64-AVX512-NEXT: vpmaxud %zmm1, %zmm0, %zmm0
1646 ; X64-AVX512-NEXT: vmovd %xmm0, %eax
1647 ; X64-AVX512-NEXT: vzeroupper
1648 ; X64-AVX512-NEXT: retq
1649 %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>
1650 %2 = icmp ugt <16 x i32> %a0, %1
1651 %3 = select <16 x i1> %2, <16 x i32> %a0, <16 x i32> %1
1652 %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>
1653 %5 = icmp ugt <16 x i32> %3, %4
1654 %6 = select <16 x i1> %5, <16 x i32> %3, <16 x i32> %4
1655 %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>
1656 %8 = icmp ugt <16 x i32> %6, %7
1657 %9 = select <16 x i1> %8, <16 x i32> %6, <16 x i32> %7
1658 %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>
1659 %11 = icmp ugt <16 x i32> %9, %10
1660 %12 = select <16 x i1> %11, <16 x i32> %9, <16 x i32> %10
1661 %13 = extractelement <16 x i32> %12, i32 0
1665 define i16 @test_reduce_v32i16(<32 x i16> %a0) {
1666 ; X86-SSE2-LABEL: test_reduce_v32i16:
1667 ; X86-SSE2: ## %bb.0:
1668 ; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1669 ; X86-SSE2-NEXT: pxor %xmm4, %xmm3
1670 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1671 ; X86-SSE2-NEXT: pmaxsw %xmm3, %xmm1
1672 ; X86-SSE2-NEXT: pxor %xmm4, %xmm2
1673 ; X86-SSE2-NEXT: pxor %xmm4, %xmm0
1674 ; X86-SSE2-NEXT: pmaxsw %xmm2, %xmm0
1675 ; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
1676 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
1677 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1678 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1679 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1680 ; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
1681 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
1682 ; X86-SSE2-NEXT: pxor %xmm4, %xmm0
1683 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1684 ; X86-SSE2-NEXT: pxor %xmm4, %xmm0
1685 ; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
1686 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
1687 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1688 ; X86-SSE2-NEXT: psrld $16, %xmm1
1689 ; X86-SSE2-NEXT: pxor %xmm4, %xmm1
1690 ; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
1691 ; X86-SSE2-NEXT: movd %xmm1, %eax
1692 ; X86-SSE2-NEXT: xorl $32768, %eax ## imm = 0x8000
1693 ; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
1694 ; X86-SSE2-NEXT: retl
1696 ; X86-SSE42-LABEL: test_reduce_v32i16:
1697 ; X86-SSE42: ## %bb.0:
1698 ; X86-SSE42-NEXT: pmaxuw %xmm3, %xmm1
1699 ; X86-SSE42-NEXT: pmaxuw %xmm2, %xmm0
1700 ; X86-SSE42-NEXT: pmaxuw %xmm1, %xmm0
1701 ; X86-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
1702 ; X86-SSE42-NEXT: pxor %xmm0, %xmm1
1703 ; X86-SSE42-NEXT: phminposuw %xmm1, %xmm0
1704 ; X86-SSE42-NEXT: movd %xmm0, %eax
1705 ; X86-SSE42-NEXT: notl %eax
1706 ; X86-SSE42-NEXT: ## kill: def $ax killed $ax killed $eax
1707 ; X86-SSE42-NEXT: retl
1709 ; X86-AVX1-LABEL: test_reduce_v32i16:
1710 ; X86-AVX1: ## %bb.0:
1711 ; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1712 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1713 ; X86-AVX1-NEXT: vpmaxuw %xmm2, %xmm3, %xmm2
1714 ; X86-AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
1715 ; X86-AVX1-NEXT: vpmaxuw %xmm2, %xmm0, %xmm0
1716 ; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1717 ; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1718 ; X86-AVX1-NEXT: vphminposuw %xmm0, %xmm0
1719 ; X86-AVX1-NEXT: vmovd %xmm0, %eax
1720 ; X86-AVX1-NEXT: notl %eax
1721 ; X86-AVX1-NEXT: ## kill: def $ax killed $ax killed $eax
1722 ; X86-AVX1-NEXT: vzeroupper
1723 ; X86-AVX1-NEXT: retl
1725 ; X86-AVX2-LABEL: test_reduce_v32i16:
1726 ; X86-AVX2: ## %bb.0:
1727 ; X86-AVX2-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0
1728 ; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1729 ; X86-AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
1730 ; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1731 ; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1732 ; X86-AVX2-NEXT: vphminposuw %xmm0, %xmm0
1733 ; X86-AVX2-NEXT: vmovd %xmm0, %eax
1734 ; X86-AVX2-NEXT: notl %eax
1735 ; X86-AVX2-NEXT: ## kill: def $ax killed $ax killed $eax
1736 ; X86-AVX2-NEXT: vzeroupper
1737 ; X86-AVX2-NEXT: retl
1739 ; X64-SSE2-LABEL: test_reduce_v32i16:
1740 ; X64-SSE2: ## %bb.0:
1741 ; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1742 ; X64-SSE2-NEXT: pxor %xmm4, %xmm3
1743 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1744 ; X64-SSE2-NEXT: pmaxsw %xmm3, %xmm1
1745 ; X64-SSE2-NEXT: pxor %xmm4, %xmm2
1746 ; X64-SSE2-NEXT: pxor %xmm4, %xmm0
1747 ; X64-SSE2-NEXT: pmaxsw %xmm2, %xmm0
1748 ; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
1749 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
1750 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1751 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
1752 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1753 ; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
1754 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
1755 ; X64-SSE2-NEXT: pxor %xmm4, %xmm0
1756 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1757 ; X64-SSE2-NEXT: pxor %xmm4, %xmm0
1758 ; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
1759 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
1760 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1761 ; X64-SSE2-NEXT: psrld $16, %xmm1
1762 ; X64-SSE2-NEXT: pxor %xmm4, %xmm1
1763 ; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
1764 ; X64-SSE2-NEXT: movd %xmm1, %eax
1765 ; X64-SSE2-NEXT: xorl $32768, %eax ## imm = 0x8000
1766 ; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
1767 ; X64-SSE2-NEXT: retq
1769 ; X64-SSE42-LABEL: test_reduce_v32i16:
1770 ; X64-SSE42: ## %bb.0:
1771 ; X64-SSE42-NEXT: pmaxuw %xmm3, %xmm1
1772 ; X64-SSE42-NEXT: pmaxuw %xmm2, %xmm0
1773 ; X64-SSE42-NEXT: pmaxuw %xmm1, %xmm0
1774 ; X64-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
1775 ; X64-SSE42-NEXT: pxor %xmm0, %xmm1
1776 ; X64-SSE42-NEXT: phminposuw %xmm1, %xmm0
1777 ; X64-SSE42-NEXT: movd %xmm0, %eax
1778 ; X64-SSE42-NEXT: notl %eax
1779 ; X64-SSE42-NEXT: ## kill: def $ax killed $ax killed $eax
1780 ; X64-SSE42-NEXT: retq
1782 ; X64-AVX1-LABEL: test_reduce_v32i16:
1783 ; X64-AVX1: ## %bb.0:
1784 ; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1785 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1786 ; X64-AVX1-NEXT: vpmaxuw %xmm2, %xmm3, %xmm2
1787 ; X64-AVX1-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
1788 ; X64-AVX1-NEXT: vpmaxuw %xmm2, %xmm0, %xmm0
1789 ; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1790 ; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1791 ; X64-AVX1-NEXT: vphminposuw %xmm0, %xmm0
1792 ; X64-AVX1-NEXT: vmovd %xmm0, %eax
1793 ; X64-AVX1-NEXT: notl %eax
1794 ; X64-AVX1-NEXT: ## kill: def $ax killed $ax killed $eax
1795 ; X64-AVX1-NEXT: vzeroupper
1796 ; X64-AVX1-NEXT: retq
1798 ; X64-AVX2-LABEL: test_reduce_v32i16:
1799 ; X64-AVX2: ## %bb.0:
1800 ; X64-AVX2-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0
1801 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1802 ; X64-AVX2-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
1803 ; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1804 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1805 ; X64-AVX2-NEXT: vphminposuw %xmm0, %xmm0
1806 ; X64-AVX2-NEXT: vmovd %xmm0, %eax
1807 ; X64-AVX2-NEXT: notl %eax
1808 ; X64-AVX2-NEXT: ## kill: def $ax killed $ax killed $eax
1809 ; X64-AVX2-NEXT: vzeroupper
1810 ; X64-AVX2-NEXT: retq
1812 ; X64-AVX512-LABEL: test_reduce_v32i16:
1813 ; X64-AVX512: ## %bb.0:
1814 ; X64-AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1815 ; X64-AVX512-NEXT: vpmaxuw %ymm1, %ymm0, %ymm0
1816 ; X64-AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1817 ; X64-AVX512-NEXT: vpmaxuw %xmm1, %xmm0, %xmm0
1818 ; X64-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1819 ; X64-AVX512-NEXT: vphminposuw %xmm0, %xmm0
1820 ; X64-AVX512-NEXT: vmovd %xmm0, %eax
1821 ; X64-AVX512-NEXT: notl %eax
1822 ; X64-AVX512-NEXT: ## kill: def $ax killed $ax killed $eax
1823 ; X64-AVX512-NEXT: vzeroupper
1824 ; X64-AVX512-NEXT: retq
1825 %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>
1826 %2 = icmp ugt <32 x i16> %a0, %1
1827 %3 = select <32 x i1> %2, <32 x i16> %a0, <32 x i16> %1
1828 %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>
1829 %5 = icmp ugt <32 x i16> %3, %4
1830 %6 = select <32 x i1> %5, <32 x i16> %3, <32 x i16> %4
1831 %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>
1832 %8 = icmp ugt <32 x i16> %6, %7
1833 %9 = select <32 x i1> %8, <32 x i16> %6, <32 x i16> %7
1834 %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>
1835 %11 = icmp ugt <32 x i16> %9, %10
1836 %12 = select <32 x i1> %11, <32 x i16> %9, <32 x i16> %10
1837 %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>
1838 %14 = icmp ugt <32 x i16> %12, %13
1839 %15 = select <32 x i1> %14, <32 x i16> %12, <32 x i16> %13
1840 %16 = extractelement <32 x i16> %15, i32 0
1844 define i8 @test_reduce_v64i8(<64 x i8> %a0) {
1845 ; X86-SSE2-LABEL: test_reduce_v64i8:
1846 ; X86-SSE2: ## %bb.0:
1847 ; X86-SSE2-NEXT: pmaxub %xmm3, %xmm1
1848 ; X86-SSE2-NEXT: pmaxub %xmm2, %xmm0
1849 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
1850 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1851 ; X86-SSE2-NEXT: pmaxub %xmm0, %xmm1
1852 ; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1853 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
1854 ; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
1855 ; X86-SSE2-NEXT: psrld $16, %xmm1
1856 ; X86-SSE2-NEXT: pmaxub %xmm0, %xmm1
1857 ; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
1858 ; X86-SSE2-NEXT: psrlw $8, %xmm0
1859 ; X86-SSE2-NEXT: pmaxub %xmm1, %xmm0
1860 ; X86-SSE2-NEXT: movd %xmm0, %eax
1861 ; X86-SSE2-NEXT: ## kill: def $al killed $al killed $eax
1862 ; X86-SSE2-NEXT: retl
1864 ; X86-SSE42-LABEL: test_reduce_v64i8:
1865 ; X86-SSE42: ## %bb.0:
1866 ; X86-SSE42-NEXT: pmaxub %xmm3, %xmm1
1867 ; X86-SSE42-NEXT: pmaxub %xmm2, %xmm0
1868 ; X86-SSE42-NEXT: pmaxub %xmm1, %xmm0
1869 ; X86-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
1870 ; X86-SSE42-NEXT: pxor %xmm0, %xmm1
1871 ; X86-SSE42-NEXT: movdqa %xmm1, %xmm0
1872 ; X86-SSE42-NEXT: psrlw $8, %xmm0
1873 ; X86-SSE42-NEXT: pminub %xmm1, %xmm0
1874 ; X86-SSE42-NEXT: phminposuw %xmm0, %xmm0
1875 ; X86-SSE42-NEXT: pextrb $0, %xmm0, %eax
1876 ; X86-SSE42-NEXT: notb %al
1877 ; X86-SSE42-NEXT: ## kill: def $al killed $al killed $eax
1878 ; X86-SSE42-NEXT: retl
1880 ; X86-AVX1-LABEL: test_reduce_v64i8:
1881 ; X86-AVX1: ## %bb.0:
1882 ; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1883 ; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1884 ; X86-AVX1-NEXT: vpmaxub %xmm2, %xmm3, %xmm2
1885 ; X86-AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1886 ; X86-AVX1-NEXT: vpmaxub %xmm2, %xmm0, %xmm0
1887 ; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1888 ; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1889 ; X86-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1890 ; X86-AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1891 ; X86-AVX1-NEXT: vphminposuw %xmm0, %xmm0
1892 ; X86-AVX1-NEXT: vpextrb $0, %xmm0, %eax
1893 ; X86-AVX1-NEXT: notb %al
1894 ; X86-AVX1-NEXT: ## kill: def $al killed $al killed $eax
1895 ; X86-AVX1-NEXT: vzeroupper
1896 ; X86-AVX1-NEXT: retl
1898 ; X86-AVX2-LABEL: test_reduce_v64i8:
1899 ; X86-AVX2: ## %bb.0:
1900 ; X86-AVX2-NEXT: vpmaxub %ymm1, %ymm0, %ymm0
1901 ; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1902 ; X86-AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1903 ; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1904 ; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1905 ; X86-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1906 ; X86-AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1907 ; X86-AVX2-NEXT: vphminposuw %xmm0, %xmm0
1908 ; X86-AVX2-NEXT: vpextrb $0, %xmm0, %eax
1909 ; X86-AVX2-NEXT: notb %al
1910 ; X86-AVX2-NEXT: ## kill: def $al killed $al killed $eax
1911 ; X86-AVX2-NEXT: vzeroupper
1912 ; X86-AVX2-NEXT: retl
1914 ; X64-SSE2-LABEL: test_reduce_v64i8:
1915 ; X64-SSE2: ## %bb.0:
1916 ; X64-SSE2-NEXT: pmaxub %xmm3, %xmm1
1917 ; X64-SSE2-NEXT: pmaxub %xmm2, %xmm0
1918 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
1919 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1920 ; X64-SSE2-NEXT: pmaxub %xmm0, %xmm1
1921 ; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1922 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
1923 ; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
1924 ; X64-SSE2-NEXT: psrld $16, %xmm1
1925 ; X64-SSE2-NEXT: pmaxub %xmm0, %xmm1
1926 ; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
1927 ; X64-SSE2-NEXT: psrlw $8, %xmm0
1928 ; X64-SSE2-NEXT: pmaxub %xmm1, %xmm0
1929 ; X64-SSE2-NEXT: movd %xmm0, %eax
1930 ; X64-SSE2-NEXT: ## kill: def $al killed $al killed $eax
1931 ; X64-SSE2-NEXT: retq
1933 ; X64-SSE42-LABEL: test_reduce_v64i8:
1934 ; X64-SSE42: ## %bb.0:
1935 ; X64-SSE42-NEXT: pmaxub %xmm3, %xmm1
1936 ; X64-SSE42-NEXT: pmaxub %xmm2, %xmm0
1937 ; X64-SSE42-NEXT: pmaxub %xmm1, %xmm0
1938 ; X64-SSE42-NEXT: pcmpeqd %xmm1, %xmm1
1939 ; X64-SSE42-NEXT: pxor %xmm0, %xmm1
1940 ; X64-SSE42-NEXT: movdqa %xmm1, %xmm0
1941 ; X64-SSE42-NEXT: psrlw $8, %xmm0
1942 ; X64-SSE42-NEXT: pminub %xmm1, %xmm0
1943 ; X64-SSE42-NEXT: phminposuw %xmm0, %xmm0
1944 ; X64-SSE42-NEXT: pextrb $0, %xmm0, %eax
1945 ; X64-SSE42-NEXT: notb %al
1946 ; X64-SSE42-NEXT: ## kill: def $al killed $al killed $eax
1947 ; X64-SSE42-NEXT: retq
1949 ; X64-AVX1-LABEL: test_reduce_v64i8:
1950 ; X64-AVX1: ## %bb.0:
1951 ; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1952 ; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1953 ; X64-AVX1-NEXT: vpmaxub %xmm2, %xmm3, %xmm2
1954 ; X64-AVX1-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1955 ; X64-AVX1-NEXT: vpmaxub %xmm2, %xmm0, %xmm0
1956 ; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1957 ; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
1958 ; X64-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
1959 ; X64-AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
1960 ; X64-AVX1-NEXT: vphminposuw %xmm0, %xmm0
1961 ; X64-AVX1-NEXT: vpextrb $0, %xmm0, %eax
1962 ; X64-AVX1-NEXT: notb %al
1963 ; X64-AVX1-NEXT: ## kill: def $al killed $al killed $eax
1964 ; X64-AVX1-NEXT: vzeroupper
1965 ; X64-AVX1-NEXT: retq
1967 ; X64-AVX2-LABEL: test_reduce_v64i8:
1968 ; X64-AVX2: ## %bb.0:
1969 ; X64-AVX2-NEXT: vpmaxub %ymm1, %ymm0, %ymm0
1970 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1971 ; X64-AVX2-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1972 ; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1973 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
1974 ; X64-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
1975 ; X64-AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
1976 ; X64-AVX2-NEXT: vphminposuw %xmm0, %xmm0
1977 ; X64-AVX2-NEXT: vpextrb $0, %xmm0, %eax
1978 ; X64-AVX2-NEXT: notb %al
1979 ; X64-AVX2-NEXT: ## kill: def $al killed $al killed $eax
1980 ; X64-AVX2-NEXT: vzeroupper
1981 ; X64-AVX2-NEXT: retq
1983 ; X64-AVX512-LABEL: test_reduce_v64i8:
1984 ; X64-AVX512: ## %bb.0:
1985 ; X64-AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1986 ; X64-AVX512-NEXT: vpmaxub %ymm1, %ymm0, %ymm0
1987 ; X64-AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1988 ; X64-AVX512-NEXT: vpmaxub %xmm1, %xmm0, %xmm0
1989 ; X64-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1990 ; X64-AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1991 ; X64-AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1992 ; X64-AVX512-NEXT: vphminposuw %xmm0, %xmm0
1993 ; X64-AVX512-NEXT: vpextrb $0, %xmm0, %eax
1994 ; X64-AVX512-NEXT: notb %al
1995 ; X64-AVX512-NEXT: ## kill: def $al killed $al killed $eax
1996 ; X64-AVX512-NEXT: vzeroupper
1997 ; X64-AVX512-NEXT: retq
1998 %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>
1999 %2 = icmp ugt <64 x i8> %a0, %1
2000 %3 = select <64 x i1> %2, <64 x i8> %a0, <64 x i8> %1
2001 %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>
2002 %5 = icmp ugt <64 x i8> %3, %4
2003 %6 = select <64 x i1> %5, <64 x i8> %3, <64 x i8> %4
2004 %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>
2005 %8 = icmp ugt <64 x i8> %6, %7
2006 %9 = select <64 x i1> %8, <64 x i8> %6, <64 x i8> %7
2007 %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>
2008 %11 = icmp ugt <64 x i8> %9, %10
2009 %12 = select <64 x i1> %11, <64 x i8> %9, <64 x i8> %10
2010 %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>
2011 %14 = icmp ugt <64 x i8> %12, %13
2012 %15 = select <64 x i1> %14, <64 x i8> %12, <64 x i8> %13
2013 %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>
2014 %17 = icmp ugt <64 x i8> %15, %16
2015 %18 = select <64 x i1> %17, <64 x i8> %15, <64 x i8> %16
2016 %19 = extractelement <64 x i8> %18, i32 0