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