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-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
13 define i64 @test_v2i64(<2 x i64> %a0) {
14 ; SSE2-LABEL: test_v2i64:
16 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
17 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
18 ; SSE2-NEXT: movdqa %xmm0, %xmm3
19 ; SSE2-NEXT: pxor %xmm2, %xmm3
20 ; SSE2-NEXT: pxor %xmm1, %xmm2
21 ; SSE2-NEXT: movdqa %xmm3, %xmm4
22 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
23 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
24 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
25 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
26 ; SSE2-NEXT: pand %xmm5, %xmm2
27 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
28 ; SSE2-NEXT: por %xmm2, %xmm3
29 ; SSE2-NEXT: pand %xmm3, %xmm0
30 ; SSE2-NEXT: pandn %xmm1, %xmm3
31 ; SSE2-NEXT: por %xmm0, %xmm3
32 ; SSE2-NEXT: movq %xmm3, %rax
35 ; SSE41-LABEL: test_v2i64:
37 ; SSE41-NEXT: movdqa %xmm0, %xmm1
38 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
39 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
40 ; SSE41-NEXT: movdqa %xmm0, %xmm4
41 ; SSE41-NEXT: pxor %xmm3, %xmm4
42 ; SSE41-NEXT: pxor %xmm2, %xmm3
43 ; SSE41-NEXT: movdqa %xmm4, %xmm0
44 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm0
45 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
46 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm3
47 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
48 ; SSE41-NEXT: pand %xmm5, %xmm3
49 ; SSE41-NEXT: por %xmm3, %xmm0
50 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
51 ; SSE41-NEXT: movq %xmm2, %rax
54 ; AVX-LABEL: test_v2i64:
56 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
57 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
58 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
59 ; AVX-NEXT: vmovq %xmm0, %rax
62 ; AVX512BW-LABEL: test_v2i64:
64 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
65 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
66 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
67 ; AVX512BW-NEXT: vmovq %xmm0, %rax
68 ; AVX512BW-NEXT: vzeroupper
71 ; AVX512VL-LABEL: test_v2i64:
73 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
74 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
75 ; AVX512VL-NEXT: vmovq %xmm0, %rax
77 %1 = call i64 @llvm.experimental.vector.reduce.smax.v2i64(<2 x i64> %a0)
81 define i64 @test_v4i64(<4 x i64> %a0) {
82 ; SSE2-LABEL: test_v4i64:
84 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
85 ; SSE2-NEXT: movdqa %xmm1, %xmm3
86 ; SSE2-NEXT: pxor %xmm2, %xmm3
87 ; SSE2-NEXT: movdqa %xmm0, %xmm4
88 ; SSE2-NEXT: pxor %xmm2, %xmm4
89 ; SSE2-NEXT: movdqa %xmm4, %xmm5
90 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
91 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
92 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
93 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
94 ; SSE2-NEXT: pand %xmm6, %xmm3
95 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
96 ; SSE2-NEXT: por %xmm3, %xmm4
97 ; SSE2-NEXT: pand %xmm4, %xmm0
98 ; SSE2-NEXT: pandn %xmm1, %xmm4
99 ; SSE2-NEXT: por %xmm0, %xmm4
100 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
101 ; SSE2-NEXT: movdqa %xmm4, %xmm1
102 ; SSE2-NEXT: pxor %xmm2, %xmm1
103 ; SSE2-NEXT: pxor %xmm0, %xmm2
104 ; SSE2-NEXT: movdqa %xmm1, %xmm3
105 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
106 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
107 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
108 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
109 ; SSE2-NEXT: pand %xmm5, %xmm1
110 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
111 ; SSE2-NEXT: por %xmm1, %xmm2
112 ; SSE2-NEXT: pand %xmm2, %xmm4
113 ; SSE2-NEXT: pandn %xmm0, %xmm2
114 ; SSE2-NEXT: por %xmm4, %xmm2
115 ; SSE2-NEXT: movq %xmm2, %rax
118 ; SSE41-LABEL: test_v4i64:
120 ; SSE41-NEXT: movdqa %xmm0, %xmm2
121 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
122 ; SSE41-NEXT: movdqa %xmm1, %xmm4
123 ; SSE41-NEXT: pxor %xmm3, %xmm4
124 ; SSE41-NEXT: movdqa %xmm0, %xmm5
125 ; SSE41-NEXT: pxor %xmm3, %xmm5
126 ; SSE41-NEXT: movdqa %xmm5, %xmm0
127 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
128 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
129 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm5
130 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
131 ; SSE41-NEXT: pand %xmm6, %xmm4
132 ; SSE41-NEXT: por %xmm4, %xmm0
133 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
134 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
135 ; SSE41-NEXT: movdqa %xmm1, %xmm0
136 ; SSE41-NEXT: pxor %xmm3, %xmm0
137 ; SSE41-NEXT: pxor %xmm2, %xmm3
138 ; SSE41-NEXT: movdqa %xmm0, %xmm4
139 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
140 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
141 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
142 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
143 ; SSE41-NEXT: pand %xmm5, %xmm0
144 ; SSE41-NEXT: por %xmm4, %xmm0
145 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
146 ; SSE41-NEXT: movq %xmm2, %rax
149 ; AVX1-LABEL: test_v4i64:
151 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
152 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
153 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
154 ; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
155 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
156 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
157 ; AVX1-NEXT: vmovq %xmm0, %rax
158 ; AVX1-NEXT: vzeroupper
161 ; AVX2-LABEL: test_v4i64:
163 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
164 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
165 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
166 ; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
167 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
168 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
169 ; AVX2-NEXT: vmovq %xmm0, %rax
170 ; AVX2-NEXT: vzeroupper
173 ; AVX512BW-LABEL: test_v4i64:
175 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
176 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
177 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
178 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
179 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
180 ; AVX512BW-NEXT: vmovq %xmm0, %rax
181 ; AVX512BW-NEXT: vzeroupper
182 ; AVX512BW-NEXT: retq
184 ; AVX512VL-LABEL: test_v4i64:
186 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
187 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
188 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
189 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
190 ; AVX512VL-NEXT: vmovq %xmm0, %rax
191 ; AVX512VL-NEXT: vzeroupper
192 ; AVX512VL-NEXT: retq
193 %1 = call i64 @llvm.experimental.vector.reduce.smax.v4i64(<4 x i64> %a0)
197 define i64 @test_v8i64(<8 x i64> %a0) {
198 ; SSE2-LABEL: test_v8i64:
200 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
201 ; SSE2-NEXT: movdqa %xmm2, %xmm5
202 ; SSE2-NEXT: pxor %xmm4, %xmm5
203 ; SSE2-NEXT: movdqa %xmm0, %xmm6
204 ; SSE2-NEXT: pxor %xmm4, %xmm6
205 ; SSE2-NEXT: movdqa %xmm6, %xmm7
206 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
207 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
208 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm6
209 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
210 ; SSE2-NEXT: pand %xmm8, %xmm6
211 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
212 ; SSE2-NEXT: por %xmm6, %xmm5
213 ; SSE2-NEXT: pand %xmm5, %xmm0
214 ; SSE2-NEXT: pandn %xmm2, %xmm5
215 ; SSE2-NEXT: por %xmm0, %xmm5
216 ; SSE2-NEXT: movdqa %xmm3, %xmm0
217 ; SSE2-NEXT: pxor %xmm4, %xmm0
218 ; SSE2-NEXT: movdqa %xmm1, %xmm2
219 ; SSE2-NEXT: pxor %xmm4, %xmm2
220 ; SSE2-NEXT: movdqa %xmm2, %xmm6
221 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6
222 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
223 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
224 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
225 ; SSE2-NEXT: pand %xmm7, %xmm0
226 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
227 ; SSE2-NEXT: por %xmm0, %xmm2
228 ; SSE2-NEXT: pand %xmm2, %xmm1
229 ; SSE2-NEXT: pandn %xmm3, %xmm2
230 ; SSE2-NEXT: por %xmm1, %xmm2
231 ; SSE2-NEXT: movdqa %xmm2, %xmm0
232 ; SSE2-NEXT: pxor %xmm4, %xmm0
233 ; SSE2-NEXT: movdqa %xmm5, %xmm1
234 ; SSE2-NEXT: pxor %xmm4, %xmm1
235 ; SSE2-NEXT: movdqa %xmm1, %xmm3
236 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
237 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
238 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
239 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
240 ; SSE2-NEXT: pand %xmm6, %xmm0
241 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
242 ; SSE2-NEXT: por %xmm0, %xmm1
243 ; SSE2-NEXT: pand %xmm1, %xmm5
244 ; SSE2-NEXT: pandn %xmm2, %xmm1
245 ; SSE2-NEXT: por %xmm5, %xmm1
246 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
247 ; SSE2-NEXT: movdqa %xmm1, %xmm2
248 ; SSE2-NEXT: pxor %xmm4, %xmm2
249 ; SSE2-NEXT: pxor %xmm0, %xmm4
250 ; SSE2-NEXT: movdqa %xmm2, %xmm3
251 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3
252 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
253 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm4
254 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
255 ; SSE2-NEXT: pand %xmm5, %xmm2
256 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
257 ; SSE2-NEXT: por %xmm2, %xmm3
258 ; SSE2-NEXT: pand %xmm3, %xmm1
259 ; SSE2-NEXT: pandn %xmm0, %xmm3
260 ; SSE2-NEXT: por %xmm1, %xmm3
261 ; SSE2-NEXT: movq %xmm3, %rax
264 ; SSE41-LABEL: test_v8i64:
266 ; SSE41-NEXT: movdqa %xmm0, %xmm4
267 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
268 ; SSE41-NEXT: movdqa %xmm2, %xmm6
269 ; SSE41-NEXT: pxor %xmm5, %xmm6
270 ; SSE41-NEXT: movdqa %xmm0, %xmm7
271 ; SSE41-NEXT: pxor %xmm5, %xmm7
272 ; SSE41-NEXT: movdqa %xmm7, %xmm0
273 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm0
274 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
275 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
276 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
277 ; SSE41-NEXT: pand %xmm8, %xmm6
278 ; SSE41-NEXT: por %xmm6, %xmm0
279 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
280 ; SSE41-NEXT: movdqa %xmm3, %xmm0
281 ; SSE41-NEXT: pxor %xmm5, %xmm0
282 ; SSE41-NEXT: movdqa %xmm1, %xmm4
283 ; SSE41-NEXT: pxor %xmm5, %xmm4
284 ; SSE41-NEXT: movdqa %xmm4, %xmm6
285 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
286 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
287 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
288 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
289 ; SSE41-NEXT: pand %xmm7, %xmm0
290 ; SSE41-NEXT: por %xmm6, %xmm0
291 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3
292 ; SSE41-NEXT: movapd %xmm3, %xmm0
293 ; SSE41-NEXT: xorpd %xmm5, %xmm0
294 ; SSE41-NEXT: movapd %xmm2, %xmm1
295 ; SSE41-NEXT: xorpd %xmm5, %xmm1
296 ; SSE41-NEXT: movapd %xmm1, %xmm4
297 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
298 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
299 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
300 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
301 ; SSE41-NEXT: pand %xmm6, %xmm0
302 ; SSE41-NEXT: por %xmm4, %xmm0
303 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
304 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
305 ; SSE41-NEXT: movdqa %xmm3, %xmm0
306 ; SSE41-NEXT: pxor %xmm5, %xmm0
307 ; SSE41-NEXT: pxor %xmm1, %xmm5
308 ; SSE41-NEXT: movdqa %xmm0, %xmm2
309 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm2
310 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
311 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
312 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
313 ; SSE41-NEXT: pand %xmm4, %xmm0
314 ; SSE41-NEXT: por %xmm2, %xmm0
315 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
316 ; SSE41-NEXT: movq %xmm1, %rax
319 ; AVX1-LABEL: test_v8i64:
321 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
322 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
323 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
324 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5
325 ; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm3, %xmm3
326 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
327 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm1
328 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
329 ; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
330 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
331 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
332 ; AVX1-NEXT: vmovq %xmm0, %rax
333 ; AVX1-NEXT: vzeroupper
336 ; AVX2-LABEL: test_v8i64:
338 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
339 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
340 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
341 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
342 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
343 ; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
344 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
345 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
346 ; AVX2-NEXT: vmovq %xmm0, %rax
347 ; AVX2-NEXT: vzeroupper
350 ; AVX512BW-LABEL: test_v8i64:
352 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1
353 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
354 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
355 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
356 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
357 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
358 ; AVX512BW-NEXT: vmovq %xmm0, %rax
359 ; AVX512BW-NEXT: vzeroupper
360 ; AVX512BW-NEXT: retq
362 ; AVX512VL-LABEL: test_v8i64:
364 ; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
365 ; AVX512VL-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
366 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
367 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
368 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
369 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
370 ; AVX512VL-NEXT: vmovq %xmm0, %rax
371 ; AVX512VL-NEXT: vzeroupper
372 ; AVX512VL-NEXT: retq
373 %1 = call i64 @llvm.experimental.vector.reduce.smax.v8i64(<8 x i64> %a0)
377 define i64 @test_v16i64(<16 x i64> %a0) {
378 ; SSE2-LABEL: test_v16i64:
380 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
381 ; SSE2-NEXT: movdqa %xmm5, %xmm9
382 ; SSE2-NEXT: pxor %xmm8, %xmm9
383 ; SSE2-NEXT: movdqa %xmm1, %xmm10
384 ; SSE2-NEXT: pxor %xmm8, %xmm10
385 ; SSE2-NEXT: movdqa %xmm10, %xmm11
386 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm11
387 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
388 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm10
389 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
390 ; SSE2-NEXT: pand %xmm12, %xmm10
391 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
392 ; SSE2-NEXT: por %xmm10, %xmm9
393 ; SSE2-NEXT: pand %xmm9, %xmm1
394 ; SSE2-NEXT: pandn %xmm5, %xmm9
395 ; SSE2-NEXT: por %xmm1, %xmm9
396 ; SSE2-NEXT: movdqa %xmm7, %xmm1
397 ; SSE2-NEXT: pxor %xmm8, %xmm1
398 ; SSE2-NEXT: movdqa %xmm3, %xmm5
399 ; SSE2-NEXT: pxor %xmm8, %xmm5
400 ; SSE2-NEXT: movdqa %xmm5, %xmm10
401 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm10
402 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
403 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5
404 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
405 ; SSE2-NEXT: pand %xmm11, %xmm5
406 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
407 ; SSE2-NEXT: por %xmm5, %xmm1
408 ; SSE2-NEXT: pand %xmm1, %xmm3
409 ; SSE2-NEXT: pandn %xmm7, %xmm1
410 ; SSE2-NEXT: por %xmm3, %xmm1
411 ; SSE2-NEXT: movdqa %xmm4, %xmm3
412 ; SSE2-NEXT: pxor %xmm8, %xmm3
413 ; SSE2-NEXT: movdqa %xmm0, %xmm5
414 ; SSE2-NEXT: pxor %xmm8, %xmm5
415 ; SSE2-NEXT: movdqa %xmm5, %xmm7
416 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm7
417 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
418 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm5
419 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
420 ; SSE2-NEXT: pand %xmm10, %xmm5
421 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
422 ; SSE2-NEXT: por %xmm5, %xmm3
423 ; SSE2-NEXT: pand %xmm3, %xmm0
424 ; SSE2-NEXT: pandn %xmm4, %xmm3
425 ; SSE2-NEXT: por %xmm0, %xmm3
426 ; SSE2-NEXT: movdqa %xmm6, %xmm0
427 ; SSE2-NEXT: pxor %xmm8, %xmm0
428 ; SSE2-NEXT: movdqa %xmm2, %xmm4
429 ; SSE2-NEXT: pxor %xmm8, %xmm4
430 ; SSE2-NEXT: movdqa %xmm4, %xmm5
431 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5
432 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
433 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4
434 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
435 ; SSE2-NEXT: pand %xmm7, %xmm0
436 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
437 ; SSE2-NEXT: por %xmm0, %xmm4
438 ; SSE2-NEXT: pand %xmm4, %xmm2
439 ; SSE2-NEXT: pandn %xmm6, %xmm4
440 ; SSE2-NEXT: por %xmm2, %xmm4
441 ; SSE2-NEXT: movdqa %xmm4, %xmm0
442 ; SSE2-NEXT: pxor %xmm8, %xmm0
443 ; SSE2-NEXT: movdqa %xmm3, %xmm2
444 ; SSE2-NEXT: pxor %xmm8, %xmm2
445 ; SSE2-NEXT: movdqa %xmm2, %xmm5
446 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5
447 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
448 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
449 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
450 ; SSE2-NEXT: pand %xmm6, %xmm2
451 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
452 ; SSE2-NEXT: por %xmm2, %xmm0
453 ; SSE2-NEXT: pand %xmm0, %xmm3
454 ; SSE2-NEXT: pandn %xmm4, %xmm0
455 ; SSE2-NEXT: por %xmm3, %xmm0
456 ; SSE2-NEXT: movdqa %xmm1, %xmm2
457 ; SSE2-NEXT: pxor %xmm8, %xmm2
458 ; SSE2-NEXT: movdqa %xmm9, %xmm3
459 ; SSE2-NEXT: pxor %xmm8, %xmm3
460 ; SSE2-NEXT: movdqa %xmm3, %xmm4
461 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
462 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
463 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
464 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
465 ; SSE2-NEXT: pand %xmm5, %xmm2
466 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
467 ; SSE2-NEXT: por %xmm2, %xmm3
468 ; SSE2-NEXT: pand %xmm3, %xmm9
469 ; SSE2-NEXT: pandn %xmm1, %xmm3
470 ; SSE2-NEXT: por %xmm9, %xmm3
471 ; SSE2-NEXT: movdqa %xmm3, %xmm1
472 ; SSE2-NEXT: pxor %xmm8, %xmm1
473 ; SSE2-NEXT: movdqa %xmm0, %xmm2
474 ; SSE2-NEXT: pxor %xmm8, %xmm2
475 ; SSE2-NEXT: movdqa %xmm2, %xmm4
476 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
477 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
478 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
479 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
480 ; SSE2-NEXT: pand %xmm5, %xmm1
481 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
482 ; SSE2-NEXT: por %xmm1, %xmm2
483 ; SSE2-NEXT: pand %xmm2, %xmm0
484 ; SSE2-NEXT: pandn %xmm3, %xmm2
485 ; SSE2-NEXT: por %xmm0, %xmm2
486 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
487 ; SSE2-NEXT: movdqa %xmm2, %xmm1
488 ; SSE2-NEXT: pxor %xmm8, %xmm1
489 ; SSE2-NEXT: pxor %xmm0, %xmm8
490 ; SSE2-NEXT: movdqa %xmm1, %xmm3
491 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm3
492 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
493 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm8
494 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
495 ; SSE2-NEXT: pand %xmm4, %xmm1
496 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
497 ; SSE2-NEXT: por %xmm1, %xmm3
498 ; SSE2-NEXT: pand %xmm3, %xmm2
499 ; SSE2-NEXT: pandn %xmm0, %xmm3
500 ; SSE2-NEXT: por %xmm2, %xmm3
501 ; SSE2-NEXT: movq %xmm3, %rax
504 ; SSE41-LABEL: test_v16i64:
506 ; SSE41-NEXT: movdqa %xmm0, %xmm8
507 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
508 ; SSE41-NEXT: movdqa %xmm5, %xmm10
509 ; SSE41-NEXT: pxor %xmm9, %xmm10
510 ; SSE41-NEXT: movdqa %xmm1, %xmm0
511 ; SSE41-NEXT: pxor %xmm9, %xmm0
512 ; SSE41-NEXT: movdqa %xmm0, %xmm11
513 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm11
514 ; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
515 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0
516 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
517 ; SSE41-NEXT: pand %xmm12, %xmm0
518 ; SSE41-NEXT: por %xmm11, %xmm0
519 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
520 ; SSE41-NEXT: movdqa %xmm7, %xmm0
521 ; SSE41-NEXT: pxor %xmm9, %xmm0
522 ; SSE41-NEXT: movdqa %xmm3, %xmm1
523 ; SSE41-NEXT: pxor %xmm9, %xmm1
524 ; SSE41-NEXT: movdqa %xmm1, %xmm10
525 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm10
526 ; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
527 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
528 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
529 ; SSE41-NEXT: pand %xmm11, %xmm0
530 ; SSE41-NEXT: por %xmm10, %xmm0
531 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7
532 ; SSE41-NEXT: movdqa %xmm4, %xmm1
533 ; SSE41-NEXT: pxor %xmm9, %xmm1
534 ; SSE41-NEXT: movdqa %xmm8, %xmm3
535 ; SSE41-NEXT: pxor %xmm9, %xmm3
536 ; SSE41-NEXT: movdqa %xmm3, %xmm0
537 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm0
538 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
539 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm3
540 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
541 ; SSE41-NEXT: pand %xmm10, %xmm1
542 ; SSE41-NEXT: por %xmm1, %xmm0
543 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4
544 ; SSE41-NEXT: movdqa %xmm6, %xmm0
545 ; SSE41-NEXT: pxor %xmm9, %xmm0
546 ; SSE41-NEXT: movdqa %xmm2, %xmm1
547 ; SSE41-NEXT: pxor %xmm9, %xmm1
548 ; SSE41-NEXT: movdqa %xmm1, %xmm3
549 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
550 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
551 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
552 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
553 ; SSE41-NEXT: pand %xmm8, %xmm0
554 ; SSE41-NEXT: por %xmm3, %xmm0
555 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6
556 ; SSE41-NEXT: movapd %xmm6, %xmm0
557 ; SSE41-NEXT: xorpd %xmm9, %xmm0
558 ; SSE41-NEXT: movapd %xmm4, %xmm1
559 ; SSE41-NEXT: xorpd %xmm9, %xmm1
560 ; SSE41-NEXT: movapd %xmm1, %xmm2
561 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
562 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
563 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
564 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
565 ; SSE41-NEXT: pand %xmm3, %xmm0
566 ; SSE41-NEXT: por %xmm2, %xmm0
567 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6
568 ; SSE41-NEXT: movapd %xmm7, %xmm0
569 ; SSE41-NEXT: xorpd %xmm9, %xmm0
570 ; SSE41-NEXT: movapd %xmm5, %xmm1
571 ; SSE41-NEXT: xorpd %xmm9, %xmm1
572 ; SSE41-NEXT: movapd %xmm1, %xmm2
573 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
574 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
575 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
576 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
577 ; SSE41-NEXT: pand %xmm3, %xmm0
578 ; SSE41-NEXT: por %xmm2, %xmm0
579 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm7
580 ; SSE41-NEXT: movapd %xmm7, %xmm0
581 ; SSE41-NEXT: xorpd %xmm9, %xmm0
582 ; SSE41-NEXT: movapd %xmm6, %xmm1
583 ; SSE41-NEXT: xorpd %xmm9, %xmm1
584 ; SSE41-NEXT: movapd %xmm1, %xmm2
585 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
586 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
587 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
588 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
589 ; SSE41-NEXT: pand %xmm3, %xmm0
590 ; SSE41-NEXT: por %xmm2, %xmm0
591 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm7
592 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,0,1]
593 ; SSE41-NEXT: movdqa %xmm7, %xmm0
594 ; SSE41-NEXT: pxor %xmm9, %xmm0
595 ; SSE41-NEXT: pxor %xmm1, %xmm9
596 ; SSE41-NEXT: movdqa %xmm0, %xmm2
597 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm2
598 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
599 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm9
600 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3]
601 ; SSE41-NEXT: pand %xmm3, %xmm0
602 ; SSE41-NEXT: por %xmm2, %xmm0
603 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
604 ; SSE41-NEXT: movq %xmm1, %rax
607 ; AVX1-LABEL: test_v16i64:
609 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm11
610 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
611 ; AVX1-NEXT: vpcmpgtq %xmm11, %xmm5, %xmm8
612 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm7
613 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
614 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm9
615 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm10
616 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm4
617 ; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm3, %xmm1
618 ; AVX1-NEXT: vblendvpd %xmm10, %xmm0, %xmm2, %xmm0
619 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
620 ; AVX1-NEXT: vblendvpd %xmm9, %xmm6, %xmm7, %xmm3
621 ; AVX1-NEXT: vblendvpd %xmm8, %xmm5, %xmm11, %xmm4
622 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5
623 ; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm3, %xmm3
624 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
625 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm1
626 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
627 ; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
628 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
629 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
630 ; AVX1-NEXT: vmovq %xmm0, %rax
631 ; AVX1-NEXT: vzeroupper
634 ; AVX2-LABEL: test_v16i64:
636 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm4
637 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
638 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3
639 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
640 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
641 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
642 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
643 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
644 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
645 ; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
646 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
647 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
648 ; AVX2-NEXT: vmovq %xmm0, %rax
649 ; AVX2-NEXT: vzeroupper
652 ; AVX512BW-LABEL: test_v16i64:
654 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
655 ; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1
656 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
657 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
658 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
659 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
660 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
661 ; AVX512BW-NEXT: vmovq %xmm0, %rax
662 ; AVX512BW-NEXT: vzeroupper
663 ; AVX512BW-NEXT: retq
665 ; AVX512VL-LABEL: test_v16i64:
667 ; AVX512VL-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
668 ; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
669 ; AVX512VL-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
670 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
671 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
672 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
673 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
674 ; AVX512VL-NEXT: vmovq %xmm0, %rax
675 ; AVX512VL-NEXT: vzeroupper
676 ; AVX512VL-NEXT: retq
677 %1 = call i64 @llvm.experimental.vector.reduce.smax.v16i64(<16 x i64> %a0)
685 define i32 @test_v2i32(<2 x i32> %a0) {
686 ; SSE2-LABEL: test_v2i32:
688 ; SSE2-NEXT: pxor %xmm1, %xmm1
689 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
690 ; SSE2-NEXT: psllq $32, %xmm0
691 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]
692 ; SSE2-NEXT: psrad $31, %xmm0
693 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
694 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
695 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
696 ; SSE2-NEXT: psrad $31, %xmm1
697 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
698 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
699 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
700 ; SSE2-NEXT: movdqa %xmm0, %xmm3
701 ; SSE2-NEXT: pxor %xmm1, %xmm3
702 ; SSE2-NEXT: pxor %xmm2, %xmm1
703 ; SSE2-NEXT: movdqa %xmm1, %xmm4
704 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
705 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
706 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm1
707 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
708 ; SSE2-NEXT: pand %xmm5, %xmm1
709 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
710 ; SSE2-NEXT: por %xmm1, %xmm3
711 ; SSE2-NEXT: pand %xmm3, %xmm2
712 ; SSE2-NEXT: pandn %xmm0, %xmm3
713 ; SSE2-NEXT: por %xmm2, %xmm3
714 ; SSE2-NEXT: movd %xmm3, %eax
717 ; SSE41-LABEL: test_v2i32:
719 ; SSE41-NEXT: movdqa %xmm0, %xmm1
720 ; SSE41-NEXT: psllq $32, %xmm1
721 ; SSE41-NEXT: psrad $31, %xmm1
722 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
723 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]
724 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]
725 ; SSE41-NEXT: psrad $31, %xmm3
726 ; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
727 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
728 ; SSE41-NEXT: movdqa %xmm3, %xmm2
729 ; SSE41-NEXT: pxor %xmm0, %xmm2
730 ; SSE41-NEXT: pxor %xmm1, %xmm0
731 ; SSE41-NEXT: movdqa %xmm0, %xmm4
732 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm4
733 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
734 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
735 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
736 ; SSE41-NEXT: pand %xmm5, %xmm0
737 ; SSE41-NEXT: por %xmm4, %xmm0
738 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3
739 ; SSE41-NEXT: movd %xmm3, %eax
742 ; AVX1-LABEL: test_v2i32:
744 ; AVX1-NEXT: vpsllq $32, %xmm0, %xmm1
745 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1
746 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
747 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]
748 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
749 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
750 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
751 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
752 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
753 ; AVX1-NEXT: vmovd %xmm0, %eax
756 ; AVX2-LABEL: test_v2i32:
758 ; AVX2-NEXT: vpsllq $32, %xmm0, %xmm1
759 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm1
760 ; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
761 ; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[2,2,3,3]
762 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
763 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0
764 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3]
765 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
766 ; AVX2-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
767 ; AVX2-NEXT: vmovd %xmm0, %eax
770 ; AVX512BW-LABEL: test_v2i32:
772 ; AVX512BW-NEXT: vpsllq $32, %xmm0, %xmm1
773 ; AVX512BW-NEXT: vpsraq $32, %zmm1, %zmm1
774 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
775 ; AVX512BW-NEXT: vpsraq $32, %zmm0, %zmm0
776 ; AVX512BW-NEXT: vpmaxsq %zmm0, %zmm1, %zmm0
777 ; AVX512BW-NEXT: vmovd %xmm0, %eax
778 ; AVX512BW-NEXT: vzeroupper
779 ; AVX512BW-NEXT: retq
781 ; AVX512VL-LABEL: test_v2i32:
783 ; AVX512VL-NEXT: vpsllq $32, %xmm0, %xmm1
784 ; AVX512VL-NEXT: vpsraq $32, %xmm1, %xmm1
785 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
786 ; AVX512VL-NEXT: vpsllq $32, %xmm0, %xmm0
787 ; AVX512VL-NEXT: vpsraq $32, %xmm0, %xmm0
788 ; AVX512VL-NEXT: vpmaxsq %xmm0, %xmm1, %xmm0
789 ; AVX512VL-NEXT: vmovd %xmm0, %eax
790 ; AVX512VL-NEXT: retq
791 %1 = call i32 @llvm.experimental.vector.reduce.smax.v2i32(<2 x i32> %a0)
795 define i32 @test_v4i32(<4 x i32> %a0) {
796 ; SSE2-LABEL: test_v4i32:
798 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
799 ; SSE2-NEXT: movdqa %xmm0, %xmm2
800 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
801 ; SSE2-NEXT: pand %xmm2, %xmm0
802 ; SSE2-NEXT: pandn %xmm1, %xmm2
803 ; SSE2-NEXT: por %xmm0, %xmm2
804 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
805 ; SSE2-NEXT: movdqa %xmm2, %xmm1
806 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
807 ; SSE2-NEXT: pand %xmm1, %xmm2
808 ; SSE2-NEXT: pandn %xmm0, %xmm1
809 ; SSE2-NEXT: por %xmm2, %xmm1
810 ; SSE2-NEXT: movd %xmm1, %eax
813 ; SSE41-LABEL: test_v4i32:
815 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
816 ; SSE41-NEXT: pmaxsd %xmm0, %xmm1
817 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
818 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
819 ; SSE41-NEXT: movd %xmm0, %eax
822 ; AVX-LABEL: test_v4i32:
824 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
825 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
826 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
827 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
828 ; AVX-NEXT: vmovd %xmm0, %eax
831 ; AVX512-LABEL: test_v4i32:
833 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
834 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
835 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
836 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
837 ; AVX512-NEXT: vmovd %xmm0, %eax
839 %1 = call i32 @llvm.experimental.vector.reduce.smax.v4i32(<4 x i32> %a0)
843 define i32 @test_v8i32(<8 x i32> %a0) {
844 ; SSE2-LABEL: test_v8i32:
846 ; SSE2-NEXT: movdqa %xmm0, %xmm2
847 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
848 ; SSE2-NEXT: pand %xmm2, %xmm0
849 ; SSE2-NEXT: pandn %xmm1, %xmm2
850 ; SSE2-NEXT: por %xmm0, %xmm2
851 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
852 ; SSE2-NEXT: movdqa %xmm2, %xmm1
853 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
854 ; SSE2-NEXT: pand %xmm1, %xmm2
855 ; SSE2-NEXT: pandn %xmm0, %xmm1
856 ; SSE2-NEXT: por %xmm2, %xmm1
857 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
858 ; SSE2-NEXT: movdqa %xmm1, %xmm2
859 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
860 ; SSE2-NEXT: pand %xmm2, %xmm1
861 ; SSE2-NEXT: pandn %xmm0, %xmm2
862 ; SSE2-NEXT: por %xmm1, %xmm2
863 ; SSE2-NEXT: movd %xmm2, %eax
866 ; SSE41-LABEL: test_v8i32:
868 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
869 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
870 ; SSE41-NEXT: pmaxsd %xmm0, %xmm1
871 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
872 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
873 ; SSE41-NEXT: movd %xmm0, %eax
876 ; AVX1-LABEL: test_v8i32:
878 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
879 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
880 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
881 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
882 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
883 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
884 ; AVX1-NEXT: vmovd %xmm0, %eax
885 ; AVX1-NEXT: vzeroupper
888 ; AVX2-LABEL: test_v8i32:
890 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
891 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
892 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
893 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
894 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
895 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
896 ; AVX2-NEXT: vmovd %xmm0, %eax
897 ; AVX2-NEXT: vzeroupper
900 ; AVX512-LABEL: test_v8i32:
902 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
903 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
904 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
905 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
906 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
907 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
908 ; AVX512-NEXT: vmovd %xmm0, %eax
909 ; AVX512-NEXT: vzeroupper
911 %1 = call i32 @llvm.experimental.vector.reduce.smax.v8i32(<8 x i32> %a0)
915 define i32 @test_v16i32(<16 x i32> %a0) {
916 ; SSE2-LABEL: test_v16i32:
918 ; SSE2-NEXT: movdqa %xmm1, %xmm4
919 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
920 ; SSE2-NEXT: pand %xmm4, %xmm1
921 ; SSE2-NEXT: pandn %xmm3, %xmm4
922 ; SSE2-NEXT: por %xmm1, %xmm4
923 ; SSE2-NEXT: movdqa %xmm0, %xmm1
924 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
925 ; SSE2-NEXT: pand %xmm1, %xmm0
926 ; SSE2-NEXT: pandn %xmm2, %xmm1
927 ; SSE2-NEXT: por %xmm0, %xmm1
928 ; SSE2-NEXT: movdqa %xmm1, %xmm0
929 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm0
930 ; SSE2-NEXT: pand %xmm0, %xmm1
931 ; SSE2-NEXT: pandn %xmm4, %xmm0
932 ; SSE2-NEXT: por %xmm1, %xmm0
933 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
934 ; SSE2-NEXT: movdqa %xmm0, %xmm2
935 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
936 ; SSE2-NEXT: pand %xmm2, %xmm0
937 ; SSE2-NEXT: pandn %xmm1, %xmm2
938 ; SSE2-NEXT: por %xmm0, %xmm2
939 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
940 ; SSE2-NEXT: movdqa %xmm2, %xmm1
941 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
942 ; SSE2-NEXT: pand %xmm1, %xmm2
943 ; SSE2-NEXT: pandn %xmm0, %xmm1
944 ; SSE2-NEXT: por %xmm2, %xmm1
945 ; SSE2-NEXT: movd %xmm1, %eax
948 ; SSE41-LABEL: test_v16i32:
950 ; SSE41-NEXT: pmaxsd %xmm3, %xmm1
951 ; SSE41-NEXT: pmaxsd %xmm2, %xmm1
952 ; SSE41-NEXT: pmaxsd %xmm0, %xmm1
953 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
954 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
955 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
956 ; SSE41-NEXT: pmaxsd %xmm0, %xmm1
957 ; SSE41-NEXT: movd %xmm1, %eax
960 ; AVX1-LABEL: test_v16i32:
962 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
963 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
964 ; AVX1-NEXT: vpmaxsd %xmm2, %xmm3, %xmm2
965 ; AVX1-NEXT: vpmaxsd %xmm2, %xmm1, %xmm1
966 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
967 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
968 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
969 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
970 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
971 ; AVX1-NEXT: vmovd %xmm0, %eax
972 ; AVX1-NEXT: vzeroupper
975 ; AVX2-LABEL: test_v16i32:
977 ; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
978 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
979 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
980 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
981 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
982 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
983 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
984 ; AVX2-NEXT: vmovd %xmm0, %eax
985 ; AVX2-NEXT: vzeroupper
988 ; AVX512-LABEL: test_v16i32:
990 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
991 ; AVX512-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0
992 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
993 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
994 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
995 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
996 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
997 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
998 ; AVX512-NEXT: vmovd %xmm0, %eax
999 ; AVX512-NEXT: vzeroupper
1001 %1 = call i32 @llvm.experimental.vector.reduce.smax.v16i32(<16 x i32> %a0)
1005 define i32 @test_v32i32(<32 x i32> %a0) {
1006 ; SSE2-LABEL: test_v32i32:
1008 ; SSE2-NEXT: movdqa %xmm2, %xmm8
1009 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm8
1010 ; SSE2-NEXT: pand %xmm8, %xmm2
1011 ; SSE2-NEXT: pandn %xmm6, %xmm8
1012 ; SSE2-NEXT: por %xmm2, %xmm8
1013 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1014 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
1015 ; SSE2-NEXT: pand %xmm2, %xmm0
1016 ; SSE2-NEXT: pandn %xmm4, %xmm2
1017 ; SSE2-NEXT: por %xmm0, %xmm2
1018 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1019 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm0
1020 ; SSE2-NEXT: pand %xmm0, %xmm3
1021 ; SSE2-NEXT: pandn %xmm7, %xmm0
1022 ; SSE2-NEXT: por %xmm3, %xmm0
1023 ; SSE2-NEXT: movdqa %xmm1, %xmm3
1024 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm3
1025 ; SSE2-NEXT: pand %xmm3, %xmm1
1026 ; SSE2-NEXT: pandn %xmm5, %xmm3
1027 ; SSE2-NEXT: por %xmm1, %xmm3
1028 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1029 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1030 ; SSE2-NEXT: pand %xmm1, %xmm3
1031 ; SSE2-NEXT: pandn %xmm0, %xmm1
1032 ; SSE2-NEXT: por %xmm3, %xmm1
1033 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1034 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm0
1035 ; SSE2-NEXT: pand %xmm0, %xmm2
1036 ; SSE2-NEXT: pandn %xmm8, %xmm0
1037 ; SSE2-NEXT: por %xmm2, %xmm0
1038 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1039 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1040 ; SSE2-NEXT: pand %xmm2, %xmm0
1041 ; SSE2-NEXT: pandn %xmm1, %xmm2
1042 ; SSE2-NEXT: por %xmm0, %xmm2
1043 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1044 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1045 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1046 ; SSE2-NEXT: pand %xmm1, %xmm2
1047 ; SSE2-NEXT: pandn %xmm0, %xmm1
1048 ; SSE2-NEXT: por %xmm2, %xmm1
1049 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1050 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1051 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1052 ; SSE2-NEXT: pand %xmm2, %xmm1
1053 ; SSE2-NEXT: pandn %xmm0, %xmm2
1054 ; SSE2-NEXT: por %xmm1, %xmm2
1055 ; SSE2-NEXT: movd %xmm2, %eax
1058 ; SSE41-LABEL: test_v32i32:
1060 ; SSE41-NEXT: pmaxsd %xmm6, %xmm2
1061 ; SSE41-NEXT: pmaxsd %xmm7, %xmm3
1062 ; SSE41-NEXT: pmaxsd %xmm5, %xmm3
1063 ; SSE41-NEXT: pmaxsd %xmm1, %xmm3
1064 ; SSE41-NEXT: pmaxsd %xmm4, %xmm2
1065 ; SSE41-NEXT: pmaxsd %xmm3, %xmm2
1066 ; SSE41-NEXT: pmaxsd %xmm0, %xmm2
1067 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1068 ; SSE41-NEXT: pmaxsd %xmm2, %xmm0
1069 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1070 ; SSE41-NEXT: pmaxsd %xmm0, %xmm1
1071 ; SSE41-NEXT: movd %xmm1, %eax
1074 ; AVX1-LABEL: test_v32i32:
1076 ; AVX1-NEXT: vpmaxsd %xmm3, %xmm1, %xmm4
1077 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
1078 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1079 ; AVX1-NEXT: vpmaxsd %xmm3, %xmm1, %xmm1
1080 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
1081 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm3, %xmm1
1082 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1083 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm3, %xmm1
1084 ; AVX1-NEXT: vpmaxsd %xmm4, %xmm2, %xmm2
1085 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm2, %xmm1
1086 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1087 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1088 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1089 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1090 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1091 ; AVX1-NEXT: vmovd %xmm0, %eax
1092 ; AVX1-NEXT: vzeroupper
1095 ; AVX2-LABEL: test_v32i32:
1097 ; AVX2-NEXT: vpmaxsd %ymm3, %ymm1, %ymm1
1098 ; AVX2-NEXT: vpmaxsd %ymm1, %ymm2, %ymm1
1099 ; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
1100 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1101 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1102 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1103 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1104 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1105 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1106 ; AVX2-NEXT: vmovd %xmm0, %eax
1107 ; AVX2-NEXT: vzeroupper
1110 ; AVX512-LABEL: test_v32i32:
1112 ; AVX512-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0
1113 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1114 ; AVX512-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0
1115 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1116 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1117 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1118 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1119 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1120 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1121 ; AVX512-NEXT: vmovd %xmm0, %eax
1122 ; AVX512-NEXT: vzeroupper
1124 %1 = call i32 @llvm.experimental.vector.reduce.smax.v32i32(<32 x i32> %a0)
1132 define i16 @test_v2i16(<2 x i16> %a0) {
1133 ; SSE2-LABEL: test_v2i16:
1135 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1136 ; SSE2-NEXT: psllq $48, %xmm0
1137 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1138 ; SSE2-NEXT: psrad $31, %xmm2
1139 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
1140 ; SSE2-NEXT: psrad $16, %xmm0
1141 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
1142 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1143 ; SSE2-NEXT: psllq $48, %xmm1
1144 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1145 ; SSE2-NEXT: psrad $31, %xmm2
1146 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
1147 ; SSE2-NEXT: psrad $16, %xmm1
1148 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1149 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1150 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1151 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1152 ; SSE2-NEXT: pxor %xmm2, %xmm3
1153 ; SSE2-NEXT: pxor %xmm1, %xmm2
1154 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1155 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1156 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1157 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1158 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1159 ; SSE2-NEXT: pand %xmm5, %xmm2
1160 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1161 ; SSE2-NEXT: por %xmm2, %xmm3
1162 ; SSE2-NEXT: pand %xmm3, %xmm0
1163 ; SSE2-NEXT: pandn %xmm1, %xmm3
1164 ; SSE2-NEXT: por %xmm0, %xmm3
1165 ; SSE2-NEXT: movd %xmm3, %eax
1166 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1169 ; SSE41-LABEL: test_v2i16:
1171 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1172 ; SSE41-NEXT: psllq $48, %xmm0
1173 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1174 ; SSE41-NEXT: psrad $31, %xmm2
1175 ; SSE41-NEXT: psrad $16, %xmm0
1176 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1177 ; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
1178 ; SSE41-NEXT: psllq $48, %xmm1
1179 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1180 ; SSE41-NEXT: psrad $31, %xmm0
1181 ; SSE41-NEXT: psrad $16, %xmm1
1182 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1183 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
1184 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
1185 ; SSE41-NEXT: movdqa %xmm3, %xmm2
1186 ; SSE41-NEXT: pxor %xmm0, %xmm2
1187 ; SSE41-NEXT: pxor %xmm1, %xmm0
1188 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1189 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1190 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1191 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
1192 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1193 ; SSE41-NEXT: pand %xmm5, %xmm0
1194 ; SSE41-NEXT: por %xmm4, %xmm0
1195 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
1196 ; SSE41-NEXT: movd %xmm1, %eax
1197 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1200 ; AVX1-LABEL: test_v2i16:
1202 ; AVX1-NEXT: vpsllq $48, %xmm0, %xmm1
1203 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2
1204 ; AVX1-NEXT: vpsrad $16, %xmm1, %xmm1
1205 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1206 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1207 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1208 ; AVX1-NEXT: vpsllq $48, %xmm0, %xmm0
1209 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm2
1210 ; AVX1-NEXT: vpsrad $16, %xmm0, %xmm0
1211 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1212 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1213 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1214 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1215 ; AVX1-NEXT: vmovd %xmm0, %eax
1216 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1219 ; AVX2-LABEL: test_v2i16:
1221 ; AVX2-NEXT: vpsllq $48, %xmm0, %xmm1
1222 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm2
1223 ; AVX2-NEXT: vpsrad $16, %xmm1, %xmm1
1224 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1225 ; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
1226 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1227 ; AVX2-NEXT: vpsllq $48, %xmm0, %xmm0
1228 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm2
1229 ; AVX2-NEXT: vpsrad $16, %xmm0, %xmm0
1230 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1231 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1232 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1233 ; AVX2-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1234 ; AVX2-NEXT: vmovd %xmm0, %eax
1235 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1238 ; AVX512BW-LABEL: test_v2i16:
1239 ; AVX512BW: # %bb.0:
1240 ; AVX512BW-NEXT: vpsllq $48, %xmm0, %xmm1
1241 ; AVX512BW-NEXT: vpsraq $48, %zmm1, %zmm1
1242 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1243 ; AVX512BW-NEXT: vpsllq $48, %xmm0, %xmm0
1244 ; AVX512BW-NEXT: vpsraq $48, %zmm0, %zmm0
1245 ; AVX512BW-NEXT: vpmaxsq %zmm0, %zmm1, %zmm0
1246 ; AVX512BW-NEXT: vmovd %xmm0, %eax
1247 ; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax
1248 ; AVX512BW-NEXT: vzeroupper
1249 ; AVX512BW-NEXT: retq
1251 ; AVX512VL-LABEL: test_v2i16:
1252 ; AVX512VL: # %bb.0:
1253 ; AVX512VL-NEXT: vpsllq $48, %xmm0, %xmm1
1254 ; AVX512VL-NEXT: vpsraq $48, %xmm1, %xmm1
1255 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1256 ; AVX512VL-NEXT: vpsllq $48, %xmm0, %xmm0
1257 ; AVX512VL-NEXT: vpsraq $48, %xmm0, %xmm0
1258 ; AVX512VL-NEXT: vpmaxsq %xmm0, %xmm1, %xmm0
1259 ; AVX512VL-NEXT: vmovd %xmm0, %eax
1260 ; AVX512VL-NEXT: # kill: def $ax killed $ax killed $eax
1261 ; AVX512VL-NEXT: retq
1262 %1 = call i16 @llvm.experimental.vector.reduce.smax.v2i16(<2 x i16> %a0)
1266 define i16 @test_v4i16(<4 x i16> %a0) {
1267 ; SSE2-LABEL: test_v4i16:
1269 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1270 ; SSE2-NEXT: pslld $16, %xmm0
1271 ; SSE2-NEXT: psrad $16, %xmm0
1272 ; SSE2-NEXT: pslld $16, %xmm1
1273 ; SSE2-NEXT: psrad $16, %xmm1
1274 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1275 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1276 ; SSE2-NEXT: pand %xmm2, %xmm0
1277 ; SSE2-NEXT: pandn %xmm1, %xmm2
1278 ; SSE2-NEXT: por %xmm0, %xmm2
1279 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1280 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1281 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1282 ; SSE2-NEXT: pand %xmm1, %xmm2
1283 ; SSE2-NEXT: pandn %xmm0, %xmm1
1284 ; SSE2-NEXT: por %xmm2, %xmm1
1285 ; SSE2-NEXT: movd %xmm1, %eax
1286 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1289 ; SSE41-LABEL: test_v4i16:
1291 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1292 ; SSE41-NEXT: pslld $16, %xmm0
1293 ; SSE41-NEXT: psrad $16, %xmm0
1294 ; SSE41-NEXT: pslld $16, %xmm1
1295 ; SSE41-NEXT: psrad $16, %xmm1
1296 ; SSE41-NEXT: pmaxsd %xmm0, %xmm1
1297 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1298 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
1299 ; SSE41-NEXT: movd %xmm0, %eax
1300 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1303 ; AVX-LABEL: test_v4i16:
1305 ; AVX-NEXT: vpslld $16, %xmm0, %xmm1
1306 ; AVX-NEXT: vpsrad $16, %xmm1, %xmm1
1307 ; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1308 ; AVX-NEXT: vpslld $16, %xmm0, %xmm0
1309 ; AVX-NEXT: vpsrad $16, %xmm0, %xmm0
1310 ; AVX-NEXT: vpmaxsd %xmm0, %xmm1, %xmm0
1311 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1312 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1313 ; AVX-NEXT: vmovd %xmm0, %eax
1314 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1317 ; AVX512-LABEL: test_v4i16:
1319 ; AVX512-NEXT: vpslld $16, %xmm0, %xmm1
1320 ; AVX512-NEXT: vpsrad $16, %xmm1, %xmm1
1321 ; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1322 ; AVX512-NEXT: vpslld $16, %xmm0, %xmm0
1323 ; AVX512-NEXT: vpsrad $16, %xmm0, %xmm0
1324 ; AVX512-NEXT: vpmaxsd %xmm0, %xmm1, %xmm0
1325 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1326 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1327 ; AVX512-NEXT: vmovd %xmm0, %eax
1328 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1330 %1 = call i16 @llvm.experimental.vector.reduce.smax.v4i16(<4 x i16> %a0)
1334 define i16 @test_v8i16(<8 x i16> %a0) {
1335 ; SSE2-LABEL: test_v8i16:
1337 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1338 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1339 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1340 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
1341 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1342 ; SSE2-NEXT: psrld $16, %xmm1
1343 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1344 ; SSE2-NEXT: movd %xmm1, %eax
1345 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1348 ; SSE41-LABEL: test_v8i16:
1350 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm0
1351 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
1352 ; SSE41-NEXT: movd %xmm0, %eax
1353 ; SSE41-NEXT: xorl $32767, %eax # imm = 0x7FFF
1354 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1357 ; AVX-LABEL: test_v8i16:
1359 ; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1360 ; AVX-NEXT: vphminposuw %xmm0, %xmm0
1361 ; AVX-NEXT: vmovd %xmm0, %eax
1362 ; AVX-NEXT: xorl $32767, %eax # imm = 0x7FFF
1363 ; AVX-NEXT: # kill: def $ax killed $ax killed $eax
1366 ; AVX512-LABEL: test_v8i16:
1368 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1369 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1370 ; AVX512-NEXT: vmovd %xmm0, %eax
1371 ; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF
1372 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1374 %1 = call i16 @llvm.experimental.vector.reduce.smax.v8i16(<8 x i16> %a0)
1378 define i16 @test_v16i16(<16 x i16> %a0) {
1379 ; SSE2-LABEL: test_v16i16:
1381 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
1382 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1383 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1384 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1385 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
1386 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1387 ; SSE2-NEXT: psrld $16, %xmm1
1388 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1389 ; SSE2-NEXT: movd %xmm1, %eax
1390 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1393 ; SSE41-LABEL: test_v16i16:
1395 ; SSE41-NEXT: pmaxsw %xmm1, %xmm0
1396 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm0
1397 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
1398 ; SSE41-NEXT: movd %xmm0, %eax
1399 ; SSE41-NEXT: xorl $32767, %eax # imm = 0x7FFF
1400 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1403 ; AVX1-LABEL: test_v16i16:
1405 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1406 ; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1407 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1408 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1409 ; AVX1-NEXT: vmovd %xmm0, %eax
1410 ; AVX1-NEXT: xorl $32767, %eax # imm = 0x7FFF
1411 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1412 ; AVX1-NEXT: vzeroupper
1415 ; AVX2-LABEL: test_v16i16:
1417 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1418 ; AVX2-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1419 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1420 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1421 ; AVX2-NEXT: vmovd %xmm0, %eax
1422 ; AVX2-NEXT: xorl $32767, %eax # imm = 0x7FFF
1423 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1424 ; AVX2-NEXT: vzeroupper
1427 ; AVX512-LABEL: test_v16i16:
1429 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1430 ; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1431 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1432 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1433 ; AVX512-NEXT: vmovd %xmm0, %eax
1434 ; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF
1435 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1436 ; AVX512-NEXT: vzeroupper
1438 %1 = call i16 @llvm.experimental.vector.reduce.smax.v16i16(<16 x i16> %a0)
1442 define i16 @test_v32i16(<32 x i16> %a0) {
1443 ; SSE2-LABEL: test_v32i16:
1445 ; SSE2-NEXT: pmaxsw %xmm3, %xmm1
1446 ; SSE2-NEXT: pmaxsw %xmm2, %xmm1
1447 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1448 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1449 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
1450 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1451 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1452 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1453 ; SSE2-NEXT: psrld $16, %xmm0
1454 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
1455 ; SSE2-NEXT: movd %xmm0, %eax
1456 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1459 ; SSE41-LABEL: test_v32i16:
1461 ; SSE41-NEXT: pmaxsw %xmm3, %xmm1
1462 ; SSE41-NEXT: pmaxsw %xmm2, %xmm1
1463 ; SSE41-NEXT: pmaxsw %xmm0, %xmm1
1464 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm1
1465 ; SSE41-NEXT: phminposuw %xmm1, %xmm0
1466 ; SSE41-NEXT: movd %xmm0, %eax
1467 ; SSE41-NEXT: xorl $32767, %eax # imm = 0x7FFF
1468 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1471 ; AVX1-LABEL: test_v32i16:
1473 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1474 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1475 ; AVX1-NEXT: vpmaxsw %xmm2, %xmm3, %xmm2
1476 ; AVX1-NEXT: vpmaxsw %xmm2, %xmm1, %xmm1
1477 ; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1478 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1479 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1480 ; AVX1-NEXT: vmovd %xmm0, %eax
1481 ; AVX1-NEXT: xorl $32767, %eax # imm = 0x7FFF
1482 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1483 ; AVX1-NEXT: vzeroupper
1486 ; AVX2-LABEL: test_v32i16:
1488 ; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
1489 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1490 ; AVX2-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1491 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1492 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1493 ; AVX2-NEXT: vmovd %xmm0, %eax
1494 ; AVX2-NEXT: xorl $32767, %eax # imm = 0x7FFF
1495 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1496 ; AVX2-NEXT: vzeroupper
1499 ; AVX512-LABEL: test_v32i16:
1501 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1502 ; AVX512-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
1503 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1504 ; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1505 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1506 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1507 ; AVX512-NEXT: vmovd %xmm0, %eax
1508 ; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF
1509 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1510 ; AVX512-NEXT: vzeroupper
1512 %1 = call i16 @llvm.experimental.vector.reduce.smax.v32i16(<32 x i16> %a0)
1516 define i16 @test_v64i16(<64 x i16> %a0) {
1517 ; SSE2-LABEL: test_v64i16:
1519 ; SSE2-NEXT: pmaxsw %xmm6, %xmm2
1520 ; SSE2-NEXT: pmaxsw %xmm7, %xmm3
1521 ; SSE2-NEXT: pmaxsw %xmm5, %xmm3
1522 ; SSE2-NEXT: pmaxsw %xmm1, %xmm3
1523 ; SSE2-NEXT: pmaxsw %xmm4, %xmm2
1524 ; SSE2-NEXT: pmaxsw %xmm3, %xmm2
1525 ; SSE2-NEXT: pmaxsw %xmm0, %xmm2
1526 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1527 ; SSE2-NEXT: pmaxsw %xmm2, %xmm0
1528 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1529 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1530 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1531 ; SSE2-NEXT: psrld $16, %xmm0
1532 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
1533 ; SSE2-NEXT: movd %xmm0, %eax
1534 ; SSE2-NEXT: # kill: def $ax killed $ax killed $eax
1537 ; SSE41-LABEL: test_v64i16:
1539 ; SSE41-NEXT: pmaxsw %xmm7, %xmm3
1540 ; SSE41-NEXT: pmaxsw %xmm5, %xmm3
1541 ; SSE41-NEXT: pmaxsw %xmm1, %xmm3
1542 ; SSE41-NEXT: pmaxsw %xmm6, %xmm2
1543 ; SSE41-NEXT: pmaxsw %xmm4, %xmm2
1544 ; SSE41-NEXT: pmaxsw %xmm3, %xmm2
1545 ; SSE41-NEXT: pmaxsw %xmm0, %xmm2
1546 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm2
1547 ; SSE41-NEXT: phminposuw %xmm2, %xmm0
1548 ; SSE41-NEXT: movd %xmm0, %eax
1549 ; SSE41-NEXT: xorl $32767, %eax # imm = 0x7FFF
1550 ; SSE41-NEXT: # kill: def $ax killed $ax killed $eax
1553 ; AVX1-LABEL: test_v64i16:
1555 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1556 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1557 ; AVX1-NEXT: vpmaxsw %xmm4, %xmm5, %xmm4
1558 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
1559 ; AVX1-NEXT: vpmaxsw %xmm4, %xmm5, %xmm4
1560 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1561 ; AVX1-NEXT: vpmaxsw %xmm4, %xmm5, %xmm4
1562 ; AVX1-NEXT: vpmaxsw %xmm3, %xmm1, %xmm1
1563 ; AVX1-NEXT: vpmaxsw %xmm1, %xmm2, %xmm1
1564 ; AVX1-NEXT: vpmaxsw %xmm4, %xmm1, %xmm1
1565 ; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1566 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1567 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
1568 ; AVX1-NEXT: vmovd %xmm0, %eax
1569 ; AVX1-NEXT: xorl $32767, %eax # imm = 0x7FFF
1570 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
1571 ; AVX1-NEXT: vzeroupper
1574 ; AVX2-LABEL: test_v64i16:
1576 ; AVX2-NEXT: vpmaxsw %ymm3, %ymm1, %ymm1
1577 ; AVX2-NEXT: vpmaxsw %ymm1, %ymm2, %ymm1
1578 ; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
1579 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1580 ; AVX2-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1581 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1582 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
1583 ; AVX2-NEXT: vmovd %xmm0, %eax
1584 ; AVX2-NEXT: xorl $32767, %eax # imm = 0x7FFF
1585 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
1586 ; AVX2-NEXT: vzeroupper
1589 ; AVX512-LABEL: test_v64i16:
1591 ; AVX512-NEXT: vpmaxsw %zmm1, %zmm0, %zmm0
1592 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1593 ; AVX512-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
1594 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
1595 ; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1596 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1597 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1598 ; AVX512-NEXT: vmovd %xmm0, %eax
1599 ; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF
1600 ; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
1601 ; AVX512-NEXT: vzeroupper
1603 %1 = call i16 @llvm.experimental.vector.reduce.smax.v64i16(<64 x i16> %a0)
1611 define i8 @test_v2i8(<2 x i8> %a0) {
1612 ; SSE2-LABEL: test_v2i8:
1614 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1615 ; SSE2-NEXT: psllq $56, %xmm0
1616 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1617 ; SSE2-NEXT: psrad $31, %xmm2
1618 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
1619 ; SSE2-NEXT: psrad $24, %xmm0
1620 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
1621 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1622 ; SSE2-NEXT: psllq $56, %xmm1
1623 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1624 ; SSE2-NEXT: psrad $31, %xmm2
1625 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
1626 ; SSE2-NEXT: psrad $24, %xmm1
1627 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1628 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1629 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1630 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1631 ; SSE2-NEXT: pxor %xmm2, %xmm3
1632 ; SSE2-NEXT: pxor %xmm1, %xmm2
1633 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1634 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1635 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1636 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1637 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1638 ; SSE2-NEXT: pand %xmm5, %xmm2
1639 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1640 ; SSE2-NEXT: por %xmm2, %xmm3
1641 ; SSE2-NEXT: pand %xmm3, %xmm0
1642 ; SSE2-NEXT: pandn %xmm1, %xmm3
1643 ; SSE2-NEXT: por %xmm0, %xmm3
1644 ; SSE2-NEXT: movd %xmm3, %eax
1645 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1648 ; SSE41-LABEL: test_v2i8:
1650 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1651 ; SSE41-NEXT: psllq $56, %xmm0
1652 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1653 ; SSE41-NEXT: psrad $31, %xmm2
1654 ; SSE41-NEXT: psrad $24, %xmm0
1655 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1656 ; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
1657 ; SSE41-NEXT: psllq $56, %xmm1
1658 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1659 ; SSE41-NEXT: psrad $31, %xmm0
1660 ; SSE41-NEXT: psrad $24, %xmm1
1661 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1662 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
1663 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
1664 ; SSE41-NEXT: movdqa %xmm3, %xmm2
1665 ; SSE41-NEXT: pxor %xmm0, %xmm2
1666 ; SSE41-NEXT: pxor %xmm1, %xmm0
1667 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1668 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1669 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1670 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
1671 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1672 ; SSE41-NEXT: pand %xmm5, %xmm0
1673 ; SSE41-NEXT: por %xmm4, %xmm0
1674 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
1675 ; SSE41-NEXT: pextrb $0, %xmm1, %eax
1676 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1679 ; AVX1-LABEL: test_v2i8:
1681 ; AVX1-NEXT: vpsllq $56, %xmm0, %xmm1
1682 ; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2
1683 ; AVX1-NEXT: vpsrad $24, %xmm1, %xmm1
1684 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1685 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1686 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1687 ; AVX1-NEXT: vpsllq $56, %xmm0, %xmm0
1688 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm2
1689 ; AVX1-NEXT: vpsrad $24, %xmm0, %xmm0
1690 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1691 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1692 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1693 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1694 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
1695 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
1698 ; AVX2-LABEL: test_v2i8:
1700 ; AVX2-NEXT: vpsllq $56, %xmm0, %xmm1
1701 ; AVX2-NEXT: vpsrad $31, %xmm1, %xmm2
1702 ; AVX2-NEXT: vpsrad $24, %xmm1, %xmm1
1703 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1704 ; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
1705 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1706 ; AVX2-NEXT: vpsllq $56, %xmm0, %xmm0
1707 ; AVX2-NEXT: vpsrad $31, %xmm0, %xmm2
1708 ; AVX2-NEXT: vpsrad $24, %xmm0, %xmm0
1709 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1710 ; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1711 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1712 ; AVX2-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1713 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
1714 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
1717 ; AVX512BW-LABEL: test_v2i8:
1718 ; AVX512BW: # %bb.0:
1719 ; AVX512BW-NEXT: vpsllq $56, %xmm0, %xmm1
1720 ; AVX512BW-NEXT: vpsraq $56, %zmm1, %zmm1
1721 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1722 ; AVX512BW-NEXT: vpsllq $56, %xmm0, %xmm0
1723 ; AVX512BW-NEXT: vpsraq $56, %zmm0, %zmm0
1724 ; AVX512BW-NEXT: vpmaxsq %zmm0, %zmm1, %zmm0
1725 ; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax
1726 ; AVX512BW-NEXT: # kill: def $al killed $al killed $eax
1727 ; AVX512BW-NEXT: vzeroupper
1728 ; AVX512BW-NEXT: retq
1730 ; AVX512VL-LABEL: test_v2i8:
1731 ; AVX512VL: # %bb.0:
1732 ; AVX512VL-NEXT: vpsllq $56, %xmm0, %xmm1
1733 ; AVX512VL-NEXT: vpsraq $56, %xmm1, %xmm1
1734 ; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1735 ; AVX512VL-NEXT: vpsllq $56, %xmm0, %xmm0
1736 ; AVX512VL-NEXT: vpsraq $56, %xmm0, %xmm0
1737 ; AVX512VL-NEXT: vpmaxsq %xmm0, %xmm1, %xmm0
1738 ; AVX512VL-NEXT: vpextrb $0, %xmm0, %eax
1739 ; AVX512VL-NEXT: # kill: def $al killed $al killed $eax
1740 ; AVX512VL-NEXT: retq
1741 %1 = call i8 @llvm.experimental.vector.reduce.smax.v2i8(<2 x i8> %a0)
1745 define i8 @test_v4i8(<4 x i8> %a0) {
1746 ; SSE2-LABEL: test_v4i8:
1748 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1749 ; SSE2-NEXT: pslld $24, %xmm0
1750 ; SSE2-NEXT: psrad $24, %xmm0
1751 ; SSE2-NEXT: pslld $24, %xmm1
1752 ; SSE2-NEXT: psrad $24, %xmm1
1753 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1754 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1755 ; SSE2-NEXT: pand %xmm2, %xmm0
1756 ; SSE2-NEXT: pandn %xmm1, %xmm2
1757 ; SSE2-NEXT: por %xmm0, %xmm2
1758 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1759 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1760 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1761 ; SSE2-NEXT: pand %xmm1, %xmm2
1762 ; SSE2-NEXT: pandn %xmm0, %xmm1
1763 ; SSE2-NEXT: por %xmm2, %xmm1
1764 ; SSE2-NEXT: movd %xmm1, %eax
1765 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1768 ; SSE41-LABEL: test_v4i8:
1770 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1771 ; SSE41-NEXT: pslld $24, %xmm0
1772 ; SSE41-NEXT: psrad $24, %xmm0
1773 ; SSE41-NEXT: pslld $24, %xmm1
1774 ; SSE41-NEXT: psrad $24, %xmm1
1775 ; SSE41-NEXT: pmaxsd %xmm0, %xmm1
1776 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1777 ; SSE41-NEXT: pmaxsd %xmm1, %xmm0
1778 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
1779 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1782 ; AVX-LABEL: test_v4i8:
1784 ; AVX-NEXT: vpslld $24, %xmm0, %xmm1
1785 ; AVX-NEXT: vpsrad $24, %xmm1, %xmm1
1786 ; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1787 ; AVX-NEXT: vpslld $24, %xmm0, %xmm0
1788 ; AVX-NEXT: vpsrad $24, %xmm0, %xmm0
1789 ; AVX-NEXT: vpmaxsd %xmm0, %xmm1, %xmm0
1790 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1791 ; AVX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1792 ; AVX-NEXT: vpextrb $0, %xmm0, %eax
1793 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1796 ; AVX512-LABEL: test_v4i8:
1798 ; AVX512-NEXT: vpslld $24, %xmm0, %xmm1
1799 ; AVX512-NEXT: vpsrad $24, %xmm1, %xmm1
1800 ; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1801 ; AVX512-NEXT: vpslld $24, %xmm0, %xmm0
1802 ; AVX512-NEXT: vpsrad $24, %xmm0, %xmm0
1803 ; AVX512-NEXT: vpmaxsd %xmm0, %xmm1, %xmm0
1804 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1805 ; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1806 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1807 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1809 %1 = call i8 @llvm.experimental.vector.reduce.smax.v4i8(<4 x i8> %a0)
1813 define i8 @test_v8i8(<8 x i8> %a0) {
1814 ; SSE2-LABEL: test_v8i8:
1816 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1817 ; SSE2-NEXT: psllw $8, %xmm0
1818 ; SSE2-NEXT: psraw $8, %xmm0
1819 ; SSE2-NEXT: psllw $8, %xmm1
1820 ; SSE2-NEXT: psraw $8, %xmm1
1821 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1822 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1823 ; SSE2-NEXT: psllw $8, %xmm0
1824 ; SSE2-NEXT: psraw $8, %xmm0
1825 ; SSE2-NEXT: pmaxsw %xmm1, %xmm0
1826 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1827 ; SSE2-NEXT: psrld $16, %xmm1
1828 ; SSE2-NEXT: psllw $8, %xmm1
1829 ; SSE2-NEXT: psraw $8, %xmm1
1830 ; SSE2-NEXT: pmaxsw %xmm0, %xmm1
1831 ; SSE2-NEXT: movd %xmm1, %eax
1832 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1835 ; SSE41-LABEL: test_v8i8:
1837 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1838 ; SSE41-NEXT: psllw $8, %xmm0
1839 ; SSE41-NEXT: psraw $8, %xmm0
1840 ; SSE41-NEXT: psllw $8, %xmm1
1841 ; SSE41-NEXT: psraw $8, %xmm1
1842 ; SSE41-NEXT: pmaxsw %xmm0, %xmm1
1843 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1844 ; SSE41-NEXT: psllw $8, %xmm0
1845 ; SSE41-NEXT: psraw $8, %xmm0
1846 ; SSE41-NEXT: pmaxsw %xmm1, %xmm0
1847 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1848 ; SSE41-NEXT: psrld $16, %xmm1
1849 ; SSE41-NEXT: psllw $8, %xmm1
1850 ; SSE41-NEXT: psraw $8, %xmm1
1851 ; SSE41-NEXT: pmaxsw %xmm0, %xmm1
1852 ; SSE41-NEXT: pextrb $0, %xmm1, %eax
1853 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1856 ; AVX-LABEL: test_v8i8:
1858 ; AVX-NEXT: vpsllw $8, %xmm0, %xmm1
1859 ; AVX-NEXT: vpsraw $8, %xmm1, %xmm1
1860 ; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1861 ; AVX-NEXT: vpsllw $8, %xmm0, %xmm0
1862 ; AVX-NEXT: vpsraw $8, %xmm0, %xmm0
1863 ; AVX-NEXT: vpmaxsw %xmm0, %xmm1, %xmm0
1864 ; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1865 ; AVX-NEXT: vpsllw $8, %xmm1, %xmm1
1866 ; AVX-NEXT: vpsraw $8, %xmm1, %xmm1
1867 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1868 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm1
1869 ; AVX-NEXT: vpsllw $8, %xmm1, %xmm1
1870 ; AVX-NEXT: vpsraw $8, %xmm1, %xmm1
1871 ; AVX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1872 ; AVX-NEXT: vpextrb $0, %xmm0, %eax
1873 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1876 ; AVX512-LABEL: test_v8i8:
1878 ; AVX512-NEXT: vpsllw $8, %xmm0, %xmm1
1879 ; AVX512-NEXT: vpsraw $8, %xmm1, %xmm1
1880 ; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1881 ; AVX512-NEXT: vpsllw $8, %xmm0, %xmm0
1882 ; AVX512-NEXT: vpsraw $8, %xmm0, %xmm0
1883 ; AVX512-NEXT: vpmaxsw %xmm0, %xmm1, %xmm0
1884 ; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1885 ; AVX512-NEXT: vpsllw $8, %xmm1, %xmm1
1886 ; AVX512-NEXT: vpsraw $8, %xmm1, %xmm1
1887 ; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1888 ; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1
1889 ; AVX512-NEXT: vpsllw $8, %xmm1, %xmm1
1890 ; AVX512-NEXT: vpsraw $8, %xmm1, %xmm1
1891 ; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
1892 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1893 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1895 %1 = call i8 @llvm.experimental.vector.reduce.smax.v8i8(<8 x i8> %a0)
1899 define i8 @test_v16i8(<16 x i8> %a0) {
1900 ; SSE2-LABEL: test_v16i8:
1902 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1903 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1904 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
1905 ; SSE2-NEXT: pand %xmm2, %xmm0
1906 ; SSE2-NEXT: pandn %xmm1, %xmm2
1907 ; SSE2-NEXT: por %xmm0, %xmm2
1908 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
1909 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1910 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
1911 ; SSE2-NEXT: pand %xmm1, %xmm2
1912 ; SSE2-NEXT: pandn %xmm0, %xmm1
1913 ; SSE2-NEXT: por %xmm2, %xmm1
1914 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1915 ; SSE2-NEXT: psrld $16, %xmm0
1916 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1917 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
1918 ; SSE2-NEXT: pand %xmm2, %xmm1
1919 ; SSE2-NEXT: pandn %xmm0, %xmm2
1920 ; SSE2-NEXT: por %xmm1, %xmm2
1921 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1922 ; SSE2-NEXT: psrlw $8, %xmm0
1923 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1924 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
1925 ; SSE2-NEXT: pand %xmm1, %xmm2
1926 ; SSE2-NEXT: pandn %xmm0, %xmm1
1927 ; SSE2-NEXT: por %xmm2, %xmm1
1928 ; SSE2-NEXT: movd %xmm1, %eax
1929 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
1932 ; SSE41-LABEL: test_v16i8:
1934 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm0
1935 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1936 ; SSE41-NEXT: psrlw $8, %xmm1
1937 ; SSE41-NEXT: pminub %xmm0, %xmm1
1938 ; SSE41-NEXT: phminposuw %xmm1, %xmm0
1939 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
1940 ; SSE41-NEXT: xorb $127, %al
1941 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
1944 ; AVX-LABEL: test_v16i8:
1946 ; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1947 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1
1948 ; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0
1949 ; AVX-NEXT: vphminposuw %xmm0, %xmm0
1950 ; AVX-NEXT: vpextrb $0, %xmm0, %eax
1951 ; AVX-NEXT: xorb $127, %al
1952 ; AVX-NEXT: # kill: def $al killed $al killed $eax
1955 ; AVX512-LABEL: test_v16i8:
1957 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
1958 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
1959 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
1960 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
1961 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
1962 ; AVX512-NEXT: xorb $127, %al
1963 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
1965 %1 = call i8 @llvm.experimental.vector.reduce.smax.v16i8(<16 x i8> %a0)
1969 define i8 @test_v32i8(<32 x i8> %a0) {
1970 ; SSE2-LABEL: test_v32i8:
1972 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1973 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
1974 ; SSE2-NEXT: pand %xmm2, %xmm0
1975 ; SSE2-NEXT: pandn %xmm1, %xmm2
1976 ; SSE2-NEXT: por %xmm0, %xmm2
1977 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1978 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1979 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
1980 ; SSE2-NEXT: pand %xmm1, %xmm2
1981 ; SSE2-NEXT: pandn %xmm0, %xmm1
1982 ; SSE2-NEXT: por %xmm2, %xmm1
1983 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
1984 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1985 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
1986 ; SSE2-NEXT: pand %xmm2, %xmm1
1987 ; SSE2-NEXT: pandn %xmm0, %xmm2
1988 ; SSE2-NEXT: por %xmm1, %xmm2
1989 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1990 ; SSE2-NEXT: psrld $16, %xmm0
1991 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1992 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
1993 ; SSE2-NEXT: pand %xmm1, %xmm2
1994 ; SSE2-NEXT: pandn %xmm0, %xmm1
1995 ; SSE2-NEXT: por %xmm2, %xmm1
1996 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1997 ; SSE2-NEXT: psrlw $8, %xmm0
1998 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1999 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
2000 ; SSE2-NEXT: pand %xmm2, %xmm1
2001 ; SSE2-NEXT: pandn %xmm0, %xmm2
2002 ; SSE2-NEXT: por %xmm1, %xmm2
2003 ; SSE2-NEXT: movd %xmm2, %eax
2004 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
2007 ; SSE41-LABEL: test_v32i8:
2009 ; SSE41-NEXT: pmaxsb %xmm1, %xmm0
2010 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm0
2011 ; SSE41-NEXT: movdqa %xmm0, %xmm1
2012 ; SSE41-NEXT: psrlw $8, %xmm1
2013 ; SSE41-NEXT: pminub %xmm0, %xmm1
2014 ; SSE41-NEXT: phminposuw %xmm1, %xmm0
2015 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
2016 ; SSE41-NEXT: xorb $127, %al
2017 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
2020 ; AVX1-LABEL: test_v32i8:
2022 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2023 ; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2024 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2025 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
2026 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
2027 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
2028 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
2029 ; AVX1-NEXT: xorb $127, %al
2030 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
2031 ; AVX1-NEXT: vzeroupper
2034 ; AVX2-LABEL: test_v32i8:
2036 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2037 ; AVX2-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2038 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2039 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
2040 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
2041 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
2042 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
2043 ; AVX2-NEXT: xorb $127, %al
2044 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
2045 ; AVX2-NEXT: vzeroupper
2048 ; AVX512-LABEL: test_v32i8:
2050 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
2051 ; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2052 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2053 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
2054 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
2055 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
2056 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
2057 ; AVX512-NEXT: xorb $127, %al
2058 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
2059 ; AVX512-NEXT: vzeroupper
2061 %1 = call i8 @llvm.experimental.vector.reduce.smax.v32i8(<32 x i8> %a0)
2065 define i8 @test_v64i8(<64 x i8> %a0) {
2066 ; SSE2-LABEL: test_v64i8:
2068 ; SSE2-NEXT: movdqa %xmm1, %xmm4
2069 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm4
2070 ; SSE2-NEXT: pand %xmm4, %xmm1
2071 ; SSE2-NEXT: pandn %xmm3, %xmm4
2072 ; SSE2-NEXT: por %xmm1, %xmm4
2073 ; SSE2-NEXT: movdqa %xmm0, %xmm1
2074 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1
2075 ; SSE2-NEXT: pand %xmm1, %xmm0
2076 ; SSE2-NEXT: pandn %xmm2, %xmm1
2077 ; SSE2-NEXT: por %xmm0, %xmm1
2078 ; SSE2-NEXT: movdqa %xmm1, %xmm0
2079 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm0
2080 ; SSE2-NEXT: pand %xmm0, %xmm1
2081 ; SSE2-NEXT: pandn %xmm4, %xmm0
2082 ; SSE2-NEXT: por %xmm1, %xmm0
2083 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2084 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2085 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
2086 ; SSE2-NEXT: pand %xmm2, %xmm0
2087 ; SSE2-NEXT: pandn %xmm1, %xmm2
2088 ; SSE2-NEXT: por %xmm0, %xmm2
2089 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
2090 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2091 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
2092 ; SSE2-NEXT: pand %xmm1, %xmm2
2093 ; SSE2-NEXT: pandn %xmm0, %xmm1
2094 ; SSE2-NEXT: por %xmm2, %xmm1
2095 ; SSE2-NEXT: movdqa %xmm1, %xmm0
2096 ; SSE2-NEXT: psrld $16, %xmm0
2097 ; SSE2-NEXT: movdqa %xmm1, %xmm2
2098 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
2099 ; SSE2-NEXT: pand %xmm2, %xmm1
2100 ; SSE2-NEXT: pandn %xmm0, %xmm2
2101 ; SSE2-NEXT: por %xmm1, %xmm2
2102 ; SSE2-NEXT: movdqa %xmm2, %xmm0
2103 ; SSE2-NEXT: psrlw $8, %xmm0
2104 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2105 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
2106 ; SSE2-NEXT: pand %xmm1, %xmm2
2107 ; SSE2-NEXT: pandn %xmm0, %xmm1
2108 ; SSE2-NEXT: por %xmm2, %xmm1
2109 ; SSE2-NEXT: movd %xmm1, %eax
2110 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
2113 ; SSE41-LABEL: test_v64i8:
2115 ; SSE41-NEXT: pmaxsb %xmm3, %xmm1
2116 ; SSE41-NEXT: pmaxsb %xmm2, %xmm1
2117 ; SSE41-NEXT: pmaxsb %xmm0, %xmm1
2118 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm1
2119 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2120 ; SSE41-NEXT: psrlw $8, %xmm0
2121 ; SSE41-NEXT: pminub %xmm1, %xmm0
2122 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
2123 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
2124 ; SSE41-NEXT: xorb $127, %al
2125 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
2128 ; AVX1-LABEL: test_v64i8:
2130 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
2131 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
2132 ; AVX1-NEXT: vpmaxsb %xmm2, %xmm3, %xmm2
2133 ; AVX1-NEXT: vpmaxsb %xmm2, %xmm1, %xmm1
2134 ; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2135 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2136 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
2137 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
2138 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
2139 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
2140 ; AVX1-NEXT: xorb $127, %al
2141 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
2142 ; AVX1-NEXT: vzeroupper
2145 ; AVX2-LABEL: test_v64i8:
2147 ; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
2148 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2149 ; AVX2-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2150 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2151 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
2152 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
2153 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
2154 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
2155 ; AVX2-NEXT: xorb $127, %al
2156 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
2157 ; AVX2-NEXT: vzeroupper
2160 ; AVX512-LABEL: test_v64i8:
2162 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
2163 ; AVX512-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
2164 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
2165 ; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2166 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2167 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
2168 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
2169 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
2170 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
2171 ; AVX512-NEXT: xorb $127, %al
2172 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
2173 ; AVX512-NEXT: vzeroupper
2175 %1 = call i8 @llvm.experimental.vector.reduce.smax.v64i8(<64 x i8> %a0)
2179 define i8 @test_v128i8(<128 x i8> %a0) {
2180 ; SSE2-LABEL: test_v128i8:
2182 ; SSE2-NEXT: movdqa %xmm2, %xmm8
2183 ; SSE2-NEXT: pcmpgtb %xmm6, %xmm8
2184 ; SSE2-NEXT: pand %xmm8, %xmm2
2185 ; SSE2-NEXT: pandn %xmm6, %xmm8
2186 ; SSE2-NEXT: por %xmm2, %xmm8
2187 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2188 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm2
2189 ; SSE2-NEXT: pand %xmm2, %xmm0
2190 ; SSE2-NEXT: pandn %xmm4, %xmm2
2191 ; SSE2-NEXT: por %xmm0, %xmm2
2192 ; SSE2-NEXT: movdqa %xmm3, %xmm0
2193 ; SSE2-NEXT: pcmpgtb %xmm7, %xmm0
2194 ; SSE2-NEXT: pand %xmm0, %xmm3
2195 ; SSE2-NEXT: pandn %xmm7, %xmm0
2196 ; SSE2-NEXT: por %xmm3, %xmm0
2197 ; SSE2-NEXT: movdqa %xmm1, %xmm3
2198 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm3
2199 ; SSE2-NEXT: pand %xmm3, %xmm1
2200 ; SSE2-NEXT: pandn %xmm5, %xmm3
2201 ; SSE2-NEXT: por %xmm1, %xmm3
2202 ; SSE2-NEXT: movdqa %xmm3, %xmm1
2203 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
2204 ; SSE2-NEXT: pand %xmm1, %xmm3
2205 ; SSE2-NEXT: pandn %xmm0, %xmm1
2206 ; SSE2-NEXT: por %xmm3, %xmm1
2207 ; SSE2-NEXT: movdqa %xmm2, %xmm0
2208 ; SSE2-NEXT: pcmpgtb %xmm8, %xmm0
2209 ; SSE2-NEXT: pand %xmm0, %xmm2
2210 ; SSE2-NEXT: pandn %xmm8, %xmm0
2211 ; SSE2-NEXT: por %xmm2, %xmm0
2212 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2213 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
2214 ; SSE2-NEXT: pand %xmm2, %xmm0
2215 ; SSE2-NEXT: pandn %xmm1, %xmm2
2216 ; SSE2-NEXT: por %xmm0, %xmm2
2217 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
2218 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2219 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
2220 ; SSE2-NEXT: pand %xmm1, %xmm2
2221 ; SSE2-NEXT: pandn %xmm0, %xmm1
2222 ; SSE2-NEXT: por %xmm2, %xmm1
2223 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
2224 ; SSE2-NEXT: movdqa %xmm1, %xmm2
2225 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
2226 ; SSE2-NEXT: pand %xmm2, %xmm1
2227 ; SSE2-NEXT: pandn %xmm0, %xmm2
2228 ; SSE2-NEXT: por %xmm1, %xmm2
2229 ; SSE2-NEXT: movdqa %xmm2, %xmm0
2230 ; SSE2-NEXT: psrld $16, %xmm0
2231 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2232 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
2233 ; SSE2-NEXT: pand %xmm1, %xmm2
2234 ; SSE2-NEXT: pandn %xmm0, %xmm1
2235 ; SSE2-NEXT: por %xmm2, %xmm1
2236 ; SSE2-NEXT: movdqa %xmm1, %xmm0
2237 ; SSE2-NEXT: psrlw $8, %xmm0
2238 ; SSE2-NEXT: movdqa %xmm1, %xmm2
2239 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
2240 ; SSE2-NEXT: pand %xmm2, %xmm1
2241 ; SSE2-NEXT: pandn %xmm0, %xmm2
2242 ; SSE2-NEXT: por %xmm1, %xmm2
2243 ; SSE2-NEXT: movd %xmm2, %eax
2244 ; SSE2-NEXT: # kill: def $al killed $al killed $eax
2247 ; SSE41-LABEL: test_v128i8:
2249 ; SSE41-NEXT: pmaxsb %xmm7, %xmm3
2250 ; SSE41-NEXT: pmaxsb %xmm5, %xmm3
2251 ; SSE41-NEXT: pmaxsb %xmm1, %xmm3
2252 ; SSE41-NEXT: pmaxsb %xmm6, %xmm2
2253 ; SSE41-NEXT: pmaxsb %xmm4, %xmm2
2254 ; SSE41-NEXT: pmaxsb %xmm3, %xmm2
2255 ; SSE41-NEXT: pmaxsb %xmm0, %xmm2
2256 ; SSE41-NEXT: pxor {{.*}}(%rip), %xmm2
2257 ; SSE41-NEXT: movdqa %xmm2, %xmm0
2258 ; SSE41-NEXT: psrlw $8, %xmm0
2259 ; SSE41-NEXT: pminub %xmm2, %xmm0
2260 ; SSE41-NEXT: phminposuw %xmm0, %xmm0
2261 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
2262 ; SSE41-NEXT: xorb $127, %al
2263 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
2266 ; AVX1-LABEL: test_v128i8:
2268 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
2269 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
2270 ; AVX1-NEXT: vpmaxsb %xmm4, %xmm5, %xmm4
2271 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
2272 ; AVX1-NEXT: vpmaxsb %xmm4, %xmm5, %xmm4
2273 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
2274 ; AVX1-NEXT: vpmaxsb %xmm4, %xmm5, %xmm4
2275 ; AVX1-NEXT: vpmaxsb %xmm3, %xmm1, %xmm1
2276 ; AVX1-NEXT: vpmaxsb %xmm1, %xmm2, %xmm1
2277 ; AVX1-NEXT: vpmaxsb %xmm4, %xmm1, %xmm1
2278 ; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2279 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2280 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
2281 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0
2282 ; AVX1-NEXT: vphminposuw %xmm0, %xmm0
2283 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
2284 ; AVX1-NEXT: xorb $127, %al
2285 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
2286 ; AVX1-NEXT: vzeroupper
2289 ; AVX2-LABEL: test_v128i8:
2291 ; AVX2-NEXT: vpmaxsb %ymm3, %ymm1, %ymm1
2292 ; AVX2-NEXT: vpmaxsb %ymm1, %ymm2, %ymm1
2293 ; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
2294 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2295 ; AVX2-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2296 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2297 ; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
2298 ; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0
2299 ; AVX2-NEXT: vphminposuw %xmm0, %xmm0
2300 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
2301 ; AVX2-NEXT: xorb $127, %al
2302 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
2303 ; AVX2-NEXT: vzeroupper
2306 ; AVX512-LABEL: test_v128i8:
2308 ; AVX512-NEXT: vpmaxsb %zmm1, %zmm0, %zmm0
2309 ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1
2310 ; AVX512-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0
2311 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
2312 ; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
2313 ; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0
2314 ; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1
2315 ; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0
2316 ; AVX512-NEXT: vphminposuw %xmm0, %xmm0
2317 ; AVX512-NEXT: vpextrb $0, %xmm0, %eax
2318 ; AVX512-NEXT: xorb $127, %al
2319 ; AVX512-NEXT: # kill: def $al killed $al killed $eax
2320 ; AVX512-NEXT: vzeroupper
2322 %1 = call i8 @llvm.experimental.vector.reduce.smax.v128i8(<128 x i8> %a0)
2326 declare i64 @llvm.experimental.vector.reduce.smax.v2i64(<2 x i64>)
2327 declare i64 @llvm.experimental.vector.reduce.smax.v4i64(<4 x i64>)
2328 declare i64 @llvm.experimental.vector.reduce.smax.v8i64(<8 x i64>)
2329 declare i64 @llvm.experimental.vector.reduce.smax.v16i64(<16 x i64>)
2331 declare i32 @llvm.experimental.vector.reduce.smax.v2i32(<2 x i32>)
2332 declare i32 @llvm.experimental.vector.reduce.smax.v4i32(<4 x i32>)
2333 declare i32 @llvm.experimental.vector.reduce.smax.v8i32(<8 x i32>)
2334 declare i32 @llvm.experimental.vector.reduce.smax.v16i32(<16 x i32>)
2335 declare i32 @llvm.experimental.vector.reduce.smax.v32i32(<32 x i32>)
2337 declare i16 @llvm.experimental.vector.reduce.smax.v2i16(<2 x i16>)
2338 declare i16 @llvm.experimental.vector.reduce.smax.v4i16(<4 x i16>)
2339 declare i16 @llvm.experimental.vector.reduce.smax.v8i16(<8 x i16>)
2340 declare i16 @llvm.experimental.vector.reduce.smax.v16i16(<16 x i16>)
2341 declare i16 @llvm.experimental.vector.reduce.smax.v32i16(<32 x i16>)
2342 declare i16 @llvm.experimental.vector.reduce.smax.v64i16(<64 x i16>)
2344 declare i8 @llvm.experimental.vector.reduce.smax.v2i8(<2 x i8>)
2345 declare i8 @llvm.experimental.vector.reduce.smax.v4i8(<4 x i8>)
2346 declare i8 @llvm.experimental.vector.reduce.smax.v8i8(<8 x i8>)
2347 declare i8 @llvm.experimental.vector.reduce.smax.v16i8(<16 x i8>)
2348 declare i8 @llvm.experimental.vector.reduce.smax.v32i8(<32 x i8>)
2349 declare i8 @llvm.experimental.vector.reduce.smax.v64i8(<64 x i8>)
2350 declare i8 @llvm.experimental.vector.reduce.smax.v128i8(<128 x i8>)