[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-reduce-and-cmp.ll
blobd4d79ddbd589f948d186e427818b20acde3afb0c
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,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL
11 ; vXi64
14 define i1 @test_v2i64(<2 x i64> %a0) {
15 ; SSE2-LABEL: test_v2i64:
16 ; SSE2:       # %bb.0:
17 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
18 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
19 ; SSE2-NEXT:    movmskps %xmm1, %eax
20 ; SSE2-NEXT:    xorl $15, %eax
21 ; SSE2-NEXT:    sete %al
22 ; SSE2-NEXT:    retq
24 ; SSE41-LABEL: test_v2i64:
25 ; SSE41:       # %bb.0:
26 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
27 ; SSE41-NEXT:    ptest %xmm1, %xmm0
28 ; SSE41-NEXT:    setb %al
29 ; SSE41-NEXT:    retq
31 ; AVX-LABEL: test_v2i64:
32 ; AVX:       # %bb.0:
33 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
34 ; AVX-NEXT:    vptest %xmm1, %xmm0
35 ; AVX-NEXT:    setb %al
36 ; AVX-NEXT:    retq
37   %1 = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a0)
38   %2 = icmp eq i64 %1, -1
39   ret i1 %2
42 define i1 @test_v4i64(<4 x i64> %a0) {
43 ; SSE2-LABEL: test_v4i64:
44 ; SSE2:       # %bb.0:
45 ; SSE2-NEXT:    pand %xmm1, %xmm0
46 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
47 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
48 ; SSE2-NEXT:    movmskps %xmm1, %eax
49 ; SSE2-NEXT:    xorl $15, %eax
50 ; SSE2-NEXT:    setne %al
51 ; SSE2-NEXT:    retq
53 ; SSE41-LABEL: test_v4i64:
54 ; SSE41:       # %bb.0:
55 ; SSE41-NEXT:    pand %xmm1, %xmm0
56 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
57 ; SSE41-NEXT:    ptest %xmm1, %xmm0
58 ; SSE41-NEXT:    setae %al
59 ; SSE41-NEXT:    retq
61 ; AVX1-LABEL: test_v4i64:
62 ; AVX1:       # %bb.0:
63 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
64 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
65 ; AVX1-NEXT:    vptest %ymm1, %ymm0
66 ; AVX1-NEXT:    setae %al
67 ; AVX1-NEXT:    vzeroupper
68 ; AVX1-NEXT:    retq
70 ; AVX2-LABEL: test_v4i64:
71 ; AVX2:       # %bb.0:
72 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
73 ; AVX2-NEXT:    vptest %ymm1, %ymm0
74 ; AVX2-NEXT:    setae %al
75 ; AVX2-NEXT:    vzeroupper
76 ; AVX2-NEXT:    retq
78 ; AVX512-LABEL: test_v4i64:
79 ; AVX512:       # %bb.0:
80 ; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
81 ; AVX512-NEXT:    vptest %ymm1, %ymm0
82 ; AVX512-NEXT:    setae %al
83 ; AVX512-NEXT:    vzeroupper
84 ; AVX512-NEXT:    retq
85   %1 = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %a0)
86   %2 = icmp ne i64 %1, -1
87   ret i1 %2
90 define i1 @test_v8i64(<8 x i64> %a0) {
91 ; SSE2-LABEL: test_v8i64:
92 ; SSE2:       # %bb.0:
93 ; SSE2-NEXT:    pand %xmm3, %xmm1
94 ; SSE2-NEXT:    pand %xmm2, %xmm0
95 ; SSE2-NEXT:    pand %xmm1, %xmm0
96 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
97 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
98 ; SSE2-NEXT:    movmskps %xmm1, %eax
99 ; SSE2-NEXT:    xorl $15, %eax
100 ; SSE2-NEXT:    sete %al
101 ; SSE2-NEXT:    retq
103 ; SSE41-LABEL: test_v8i64:
104 ; SSE41:       # %bb.0:
105 ; SSE41-NEXT:    pand %xmm3, %xmm1
106 ; SSE41-NEXT:    pand %xmm2, %xmm0
107 ; SSE41-NEXT:    pand %xmm1, %xmm0
108 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
109 ; SSE41-NEXT:    ptest %xmm1, %xmm0
110 ; SSE41-NEXT:    setb %al
111 ; SSE41-NEXT:    retq
113 ; AVX1-LABEL: test_v8i64:
114 ; AVX1:       # %bb.0:
115 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
116 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
117 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
118 ; AVX1-NEXT:    vptest %ymm1, %ymm0
119 ; AVX1-NEXT:    setb %al
120 ; AVX1-NEXT:    vzeroupper
121 ; AVX1-NEXT:    retq
123 ; AVX2-LABEL: test_v8i64:
124 ; AVX2:       # %bb.0:
125 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
126 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
127 ; AVX2-NEXT:    vptest %ymm1, %ymm0
128 ; AVX2-NEXT:    setb %al
129 ; AVX2-NEXT:    vzeroupper
130 ; AVX2-NEXT:    retq
132 ; AVX512-LABEL: test_v8i64:
133 ; AVX512:       # %bb.0:
134 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
135 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
136 ; AVX512-NEXT:    kortestw %k0, %k0
137 ; AVX512-NEXT:    sete %al
138 ; AVX512-NEXT:    vzeroupper
139 ; AVX512-NEXT:    retq
140   %1 = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %a0)
141   %2 = icmp eq i64 %1, -1
142   ret i1 %2
145 define i1 @test_v16i64(<16 x i64> %a0) {
146 ; SSE2-LABEL: test_v16i64:
147 ; SSE2:       # %bb.0:
148 ; SSE2-NEXT:    pand %xmm7, %xmm3
149 ; SSE2-NEXT:    pand %xmm5, %xmm1
150 ; SSE2-NEXT:    pand %xmm3, %xmm1
151 ; SSE2-NEXT:    pand %xmm6, %xmm2
152 ; SSE2-NEXT:    pand %xmm4, %xmm0
153 ; SSE2-NEXT:    pand %xmm2, %xmm0
154 ; SSE2-NEXT:    pand %xmm1, %xmm0
155 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
156 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
157 ; SSE2-NEXT:    movmskps %xmm1, %eax
158 ; SSE2-NEXT:    xorl $15, %eax
159 ; SSE2-NEXT:    setne %al
160 ; SSE2-NEXT:    retq
162 ; SSE41-LABEL: test_v16i64:
163 ; SSE41:       # %bb.0:
164 ; SSE41-NEXT:    pand %xmm7, %xmm3
165 ; SSE41-NEXT:    pand %xmm5, %xmm1
166 ; SSE41-NEXT:    pand %xmm3, %xmm1
167 ; SSE41-NEXT:    pand %xmm6, %xmm2
168 ; SSE41-NEXT:    pand %xmm4, %xmm0
169 ; SSE41-NEXT:    pand %xmm2, %xmm0
170 ; SSE41-NEXT:    pand %xmm1, %xmm0
171 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
172 ; SSE41-NEXT:    ptest %xmm1, %xmm0
173 ; SSE41-NEXT:    setae %al
174 ; SSE41-NEXT:    retq
176 ; AVX1-LABEL: test_v16i64:
177 ; AVX1:       # %bb.0:
178 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
179 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
180 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
181 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
182 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
183 ; AVX1-NEXT:    vptest %ymm1, %ymm0
184 ; AVX1-NEXT:    setae %al
185 ; AVX1-NEXT:    vzeroupper
186 ; AVX1-NEXT:    retq
188 ; AVX2-LABEL: test_v16i64:
189 ; AVX2:       # %bb.0:
190 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
191 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
192 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
193 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
194 ; AVX2-NEXT:    vptest %ymm1, %ymm0
195 ; AVX2-NEXT:    setae %al
196 ; AVX2-NEXT:    vzeroupper
197 ; AVX2-NEXT:    retq
199 ; AVX512-LABEL: test_v16i64:
200 ; AVX512:       # %bb.0:
201 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0
202 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
203 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
204 ; AVX512-NEXT:    kortestw %k0, %k0
205 ; AVX512-NEXT:    setne %al
206 ; AVX512-NEXT:    vzeroupper
207 ; AVX512-NEXT:    retq
208   %1 = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %a0)
209   %2 = icmp ne i64 %1, -1
210   ret i1 %2
214 ; vXi32
217 define i1 @test_v2i32(<2 x i32> %a0) {
218 ; SSE-LABEL: test_v2i32:
219 ; SSE:       # %bb.0:
220 ; SSE-NEXT:    movq %xmm0, %rax
221 ; SSE-NEXT:    cmpq $-1, %rax
222 ; SSE-NEXT:    sete %al
223 ; SSE-NEXT:    retq
225 ; AVX-LABEL: test_v2i32:
226 ; AVX:       # %bb.0:
227 ; AVX-NEXT:    vmovq %xmm0, %rax
228 ; AVX-NEXT:    cmpq $-1, %rax
229 ; AVX-NEXT:    sete %al
230 ; AVX-NEXT:    retq
231   %1 = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %a0)
232   %2 = icmp eq i32 %1, -1
233   ret i1 %2
236 define i1 @test_v4i32(<4 x i32> %a0) {
237 ; SSE2-LABEL: test_v4i32:
238 ; SSE2:       # %bb.0:
239 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
240 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
241 ; SSE2-NEXT:    movmskps %xmm1, %eax
242 ; SSE2-NEXT:    xorl $15, %eax
243 ; SSE2-NEXT:    setne %al
244 ; SSE2-NEXT:    retq
246 ; SSE41-LABEL: test_v4i32:
247 ; SSE41:       # %bb.0:
248 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
249 ; SSE41-NEXT:    ptest %xmm1, %xmm0
250 ; SSE41-NEXT:    setae %al
251 ; SSE41-NEXT:    retq
253 ; AVX-LABEL: test_v4i32:
254 ; AVX:       # %bb.0:
255 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
256 ; AVX-NEXT:    vptest %xmm1, %xmm0
257 ; AVX-NEXT:    setae %al
258 ; AVX-NEXT:    retq
259   %1 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a0)
260   %2 = icmp ne i32 %1, -1
261   ret i1 %2
264 define i1 @test_v8i32(<8 x i32> %a0) {
265 ; SSE2-LABEL: test_v8i32:
266 ; SSE2:       # %bb.0:
267 ; SSE2-NEXT:    pand %xmm1, %xmm0
268 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
269 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
270 ; SSE2-NEXT:    movmskps %xmm1, %eax
271 ; SSE2-NEXT:    xorl $15, %eax
272 ; SSE2-NEXT:    sete %al
273 ; SSE2-NEXT:    retq
275 ; SSE41-LABEL: test_v8i32:
276 ; SSE41:       # %bb.0:
277 ; SSE41-NEXT:    pand %xmm1, %xmm0
278 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
279 ; SSE41-NEXT:    ptest %xmm1, %xmm0
280 ; SSE41-NEXT:    setb %al
281 ; SSE41-NEXT:    retq
283 ; AVX1-LABEL: test_v8i32:
284 ; AVX1:       # %bb.0:
285 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
286 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
287 ; AVX1-NEXT:    vptest %ymm1, %ymm0
288 ; AVX1-NEXT:    setb %al
289 ; AVX1-NEXT:    vzeroupper
290 ; AVX1-NEXT:    retq
292 ; AVX2-LABEL: test_v8i32:
293 ; AVX2:       # %bb.0:
294 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
295 ; AVX2-NEXT:    vptest %ymm1, %ymm0
296 ; AVX2-NEXT:    setb %al
297 ; AVX2-NEXT:    vzeroupper
298 ; AVX2-NEXT:    retq
300 ; AVX512-LABEL: test_v8i32:
301 ; AVX512:       # %bb.0:
302 ; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
303 ; AVX512-NEXT:    vptest %ymm1, %ymm0
304 ; AVX512-NEXT:    setb %al
305 ; AVX512-NEXT:    vzeroupper
306 ; AVX512-NEXT:    retq
307   %1 = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %a0)
308   %2 = icmp eq i32 %1, -1
309   ret i1 %2
312 define i1 @test_v16i32(<16 x i32> %a0) {
313 ; SSE2-LABEL: test_v16i32:
314 ; SSE2:       # %bb.0:
315 ; SSE2-NEXT:    pand %xmm3, %xmm1
316 ; SSE2-NEXT:    pand %xmm2, %xmm0
317 ; SSE2-NEXT:    pand %xmm1, %xmm0
318 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
319 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
320 ; SSE2-NEXT:    movmskps %xmm1, %eax
321 ; SSE2-NEXT:    xorl $15, %eax
322 ; SSE2-NEXT:    setne %al
323 ; SSE2-NEXT:    retq
325 ; SSE41-LABEL: test_v16i32:
326 ; SSE41:       # %bb.0:
327 ; SSE41-NEXT:    pand %xmm3, %xmm1
328 ; SSE41-NEXT:    pand %xmm2, %xmm0
329 ; SSE41-NEXT:    pand %xmm1, %xmm0
330 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
331 ; SSE41-NEXT:    ptest %xmm1, %xmm0
332 ; SSE41-NEXT:    setae %al
333 ; SSE41-NEXT:    retq
335 ; AVX1-LABEL: test_v16i32:
336 ; AVX1:       # %bb.0:
337 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
338 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
339 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
340 ; AVX1-NEXT:    vptest %ymm1, %ymm0
341 ; AVX1-NEXT:    setae %al
342 ; AVX1-NEXT:    vzeroupper
343 ; AVX1-NEXT:    retq
345 ; AVX2-LABEL: test_v16i32:
346 ; AVX2:       # %bb.0:
347 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
348 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
349 ; AVX2-NEXT:    vptest %ymm1, %ymm0
350 ; AVX2-NEXT:    setae %al
351 ; AVX2-NEXT:    vzeroupper
352 ; AVX2-NEXT:    retq
354 ; AVX512-LABEL: test_v16i32:
355 ; AVX512:       # %bb.0:
356 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
357 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
358 ; AVX512-NEXT:    kortestw %k0, %k0
359 ; AVX512-NEXT:    setne %al
360 ; AVX512-NEXT:    vzeroupper
361 ; AVX512-NEXT:    retq
362   %1 = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %a0)
363   %2 = icmp ne i32 %1, -1
364   ret i1 %2
367 define i1 @test_v32i32(<32 x i32> %a0) {
368 ; SSE2-LABEL: test_v32i32:
369 ; SSE2:       # %bb.0:
370 ; SSE2-NEXT:    pand %xmm7, %xmm3
371 ; SSE2-NEXT:    pand %xmm5, %xmm1
372 ; SSE2-NEXT:    pand %xmm3, %xmm1
373 ; SSE2-NEXT:    pand %xmm6, %xmm2
374 ; SSE2-NEXT:    pand %xmm4, %xmm0
375 ; SSE2-NEXT:    pand %xmm2, %xmm0
376 ; SSE2-NEXT:    pand %xmm1, %xmm0
377 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
378 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
379 ; SSE2-NEXT:    movmskps %xmm1, %eax
380 ; SSE2-NEXT:    xorl $15, %eax
381 ; SSE2-NEXT:    sete %al
382 ; SSE2-NEXT:    retq
384 ; SSE41-LABEL: test_v32i32:
385 ; SSE41:       # %bb.0:
386 ; SSE41-NEXT:    pand %xmm7, %xmm3
387 ; SSE41-NEXT:    pand %xmm5, %xmm1
388 ; SSE41-NEXT:    pand %xmm3, %xmm1
389 ; SSE41-NEXT:    pand %xmm6, %xmm2
390 ; SSE41-NEXT:    pand %xmm4, %xmm0
391 ; SSE41-NEXT:    pand %xmm2, %xmm0
392 ; SSE41-NEXT:    pand %xmm1, %xmm0
393 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
394 ; SSE41-NEXT:    ptest %xmm1, %xmm0
395 ; SSE41-NEXT:    setb %al
396 ; SSE41-NEXT:    retq
398 ; AVX1-LABEL: test_v32i32:
399 ; AVX1:       # %bb.0:
400 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
401 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
402 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
403 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
404 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
405 ; AVX1-NEXT:    vptest %ymm1, %ymm0
406 ; AVX1-NEXT:    setb %al
407 ; AVX1-NEXT:    vzeroupper
408 ; AVX1-NEXT:    retq
410 ; AVX2-LABEL: test_v32i32:
411 ; AVX2:       # %bb.0:
412 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
413 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
414 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
415 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
416 ; AVX2-NEXT:    vptest %ymm1, %ymm0
417 ; AVX2-NEXT:    setb %al
418 ; AVX2-NEXT:    vzeroupper
419 ; AVX2-NEXT:    retq
421 ; AVX512-LABEL: test_v32i32:
422 ; AVX512:       # %bb.0:
423 ; AVX512-NEXT:    vpandd %zmm1, %zmm0, %zmm0
424 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
425 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
426 ; AVX512-NEXT:    kortestw %k0, %k0
427 ; AVX512-NEXT:    sete %al
428 ; AVX512-NEXT:    vzeroupper
429 ; AVX512-NEXT:    retq
430   %1 = call i32 @llvm.vector.reduce.and.v32i32(<32 x i32> %a0)
431   %2 = icmp eq i32 %1, -1
432   ret i1 %2
436 ; vXi16
439 define i1 @test_v2i16(<2 x i16> %a0) {
440 ; SSE-LABEL: test_v2i16:
441 ; SSE:       # %bb.0:
442 ; SSE-NEXT:    movd %xmm0, %eax
443 ; SSE-NEXT:    cmpl $-1, %eax
444 ; SSE-NEXT:    sete %al
445 ; SSE-NEXT:    retq
447 ; AVX-LABEL: test_v2i16:
448 ; AVX:       # %bb.0:
449 ; AVX-NEXT:    vmovd %xmm0, %eax
450 ; AVX-NEXT:    cmpl $-1, %eax
451 ; AVX-NEXT:    sete %al
452 ; AVX-NEXT:    retq
453   %1 = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %a0)
454   %2 = icmp eq i16 %1, -1
455   ret i1 %2
458 define i1 @test_v4i16(<4 x i16> %a0) {
459 ; SSE-LABEL: test_v4i16:
460 ; SSE:       # %bb.0:
461 ; SSE-NEXT:    movq %xmm0, %rax
462 ; SSE-NEXT:    cmpq $-1, %rax
463 ; SSE-NEXT:    setne %al
464 ; SSE-NEXT:    retq
466 ; AVX-LABEL: test_v4i16:
467 ; AVX:       # %bb.0:
468 ; AVX-NEXT:    vmovq %xmm0, %rax
469 ; AVX-NEXT:    cmpq $-1, %rax
470 ; AVX-NEXT:    setne %al
471 ; AVX-NEXT:    retq
472   %1 = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %a0)
473   %2 = icmp ne i16 %1, -1
474   ret i1 %2
477 define i1 @test_v8i16(<8 x i16> %a0) {
478 ; SSE2-LABEL: test_v8i16:
479 ; SSE2:       # %bb.0:
480 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
481 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
482 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
483 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
484 ; SSE2-NEXT:    sete %al
485 ; SSE2-NEXT:    retq
487 ; SSE41-LABEL: test_v8i16:
488 ; SSE41:       # %bb.0:
489 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
490 ; SSE41-NEXT:    ptest %xmm1, %xmm0
491 ; SSE41-NEXT:    setb %al
492 ; SSE41-NEXT:    retq
494 ; AVX-LABEL: test_v8i16:
495 ; AVX:       # %bb.0:
496 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
497 ; AVX-NEXT:    vptest %xmm1, %xmm0
498 ; AVX-NEXT:    setb %al
499 ; AVX-NEXT:    retq
500   %1 = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a0)
501   %2 = icmp eq i16 %1, -1
502   ret i1 %2
505 define i1 @test_v16i16(<16 x i16> %a0) {
506 ; SSE2-LABEL: test_v16i16:
507 ; SSE2:       # %bb.0:
508 ; SSE2-NEXT:    pand %xmm1, %xmm0
509 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
510 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
511 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
512 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
513 ; SSE2-NEXT:    setne %al
514 ; SSE2-NEXT:    retq
516 ; SSE41-LABEL: test_v16i16:
517 ; SSE41:       # %bb.0:
518 ; SSE41-NEXT:    pand %xmm1, %xmm0
519 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
520 ; SSE41-NEXT:    ptest %xmm1, %xmm0
521 ; SSE41-NEXT:    setae %al
522 ; SSE41-NEXT:    retq
524 ; AVX1-LABEL: test_v16i16:
525 ; AVX1:       # %bb.0:
526 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
527 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
528 ; AVX1-NEXT:    vptest %ymm1, %ymm0
529 ; AVX1-NEXT:    setae %al
530 ; AVX1-NEXT:    vzeroupper
531 ; AVX1-NEXT:    retq
533 ; AVX2-LABEL: test_v16i16:
534 ; AVX2:       # %bb.0:
535 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
536 ; AVX2-NEXT:    vptest %ymm1, %ymm0
537 ; AVX2-NEXT:    setae %al
538 ; AVX2-NEXT:    vzeroupper
539 ; AVX2-NEXT:    retq
541 ; AVX512-LABEL: test_v16i16:
542 ; AVX512:       # %bb.0:
543 ; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
544 ; AVX512-NEXT:    vptest %ymm1, %ymm0
545 ; AVX512-NEXT:    setae %al
546 ; AVX512-NEXT:    vzeroupper
547 ; AVX512-NEXT:    retq
548   %1 = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %a0)
549   %2 = icmp ne i16 %1, -1
550   ret i1 %2
553 define i1 @test_v32i16(<32 x i16> %a0) {
554 ; SSE2-LABEL: test_v32i16:
555 ; SSE2:       # %bb.0:
556 ; SSE2-NEXT:    pand %xmm3, %xmm1
557 ; SSE2-NEXT:    pand %xmm2, %xmm0
558 ; SSE2-NEXT:    pand %xmm1, %xmm0
559 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
560 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
561 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
562 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
563 ; SSE2-NEXT:    sete %al
564 ; SSE2-NEXT:    retq
566 ; SSE41-LABEL: test_v32i16:
567 ; SSE41:       # %bb.0:
568 ; SSE41-NEXT:    pand %xmm3, %xmm1
569 ; SSE41-NEXT:    pand %xmm2, %xmm0
570 ; SSE41-NEXT:    pand %xmm1, %xmm0
571 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
572 ; SSE41-NEXT:    ptest %xmm1, %xmm0
573 ; SSE41-NEXT:    setb %al
574 ; SSE41-NEXT:    retq
576 ; AVX1-LABEL: test_v32i16:
577 ; AVX1:       # %bb.0:
578 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
579 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
580 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
581 ; AVX1-NEXT:    vptest %ymm1, %ymm0
582 ; AVX1-NEXT:    setb %al
583 ; AVX1-NEXT:    vzeroupper
584 ; AVX1-NEXT:    retq
586 ; AVX2-LABEL: test_v32i16:
587 ; AVX2:       # %bb.0:
588 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
589 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
590 ; AVX2-NEXT:    vptest %ymm1, %ymm0
591 ; AVX2-NEXT:    setb %al
592 ; AVX2-NEXT:    vzeroupper
593 ; AVX2-NEXT:    retq
595 ; AVX512-LABEL: test_v32i16:
596 ; AVX512:       # %bb.0:
597 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
598 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
599 ; AVX512-NEXT:    kortestw %k0, %k0
600 ; AVX512-NEXT:    sete %al
601 ; AVX512-NEXT:    vzeroupper
602 ; AVX512-NEXT:    retq
603   %1 = call i16 @llvm.vector.reduce.and.v32i16(<32 x i16> %a0)
604   %2 = icmp eq i16 %1, -1
605   ret i1 %2
608 define i1 @test_v64i16(<64 x i16> %a0) {
609 ; SSE2-LABEL: test_v64i16:
610 ; SSE2:       # %bb.0:
611 ; SSE2-NEXT:    pand %xmm7, %xmm3
612 ; SSE2-NEXT:    pand %xmm5, %xmm1
613 ; SSE2-NEXT:    pand %xmm3, %xmm1
614 ; SSE2-NEXT:    pand %xmm6, %xmm2
615 ; SSE2-NEXT:    pand %xmm4, %xmm0
616 ; SSE2-NEXT:    pand %xmm2, %xmm0
617 ; SSE2-NEXT:    pand %xmm1, %xmm0
618 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
619 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
620 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
621 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
622 ; SSE2-NEXT:    setne %al
623 ; SSE2-NEXT:    retq
625 ; SSE41-LABEL: test_v64i16:
626 ; SSE41:       # %bb.0:
627 ; SSE41-NEXT:    pand %xmm7, %xmm3
628 ; SSE41-NEXT:    pand %xmm5, %xmm1
629 ; SSE41-NEXT:    pand %xmm3, %xmm1
630 ; SSE41-NEXT:    pand %xmm6, %xmm2
631 ; SSE41-NEXT:    pand %xmm4, %xmm0
632 ; SSE41-NEXT:    pand %xmm2, %xmm0
633 ; SSE41-NEXT:    pand %xmm1, %xmm0
634 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
635 ; SSE41-NEXT:    ptest %xmm1, %xmm0
636 ; SSE41-NEXT:    setae %al
637 ; SSE41-NEXT:    retq
639 ; AVX1-LABEL: test_v64i16:
640 ; AVX1:       # %bb.0:
641 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
642 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
643 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
644 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
645 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
646 ; AVX1-NEXT:    vptest %ymm1, %ymm0
647 ; AVX1-NEXT:    setae %al
648 ; AVX1-NEXT:    vzeroupper
649 ; AVX1-NEXT:    retq
651 ; AVX2-LABEL: test_v64i16:
652 ; AVX2:       # %bb.0:
653 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
654 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
655 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
656 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
657 ; AVX2-NEXT:    vptest %ymm1, %ymm0
658 ; AVX2-NEXT:    setae %al
659 ; AVX2-NEXT:    vzeroupper
660 ; AVX2-NEXT:    retq
662 ; AVX512-LABEL: test_v64i16:
663 ; AVX512:       # %bb.0:
664 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0
665 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
666 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
667 ; AVX512-NEXT:    kortestw %k0, %k0
668 ; AVX512-NEXT:    setne %al
669 ; AVX512-NEXT:    vzeroupper
670 ; AVX512-NEXT:    retq
671   %1 = call i16 @llvm.vector.reduce.and.v64i16(<64 x i16> %a0)
672   %2 = icmp ne i16 %1, -1
673   ret i1 %2
677 ; vXi8
680 define i1 @test_v2i8(<2 x i8> %a0) {
681 ; SSE-LABEL: test_v2i8:
682 ; SSE:       # %bb.0:
683 ; SSE-NEXT:    movd %xmm0, %eax
684 ; SSE-NEXT:    cmpw $-1, %ax
685 ; SSE-NEXT:    sete %al
686 ; SSE-NEXT:    retq
688 ; AVX-LABEL: test_v2i8:
689 ; AVX:       # %bb.0:
690 ; AVX-NEXT:    vmovd %xmm0, %eax
691 ; AVX-NEXT:    cmpw $-1, %ax
692 ; AVX-NEXT:    sete %al
693 ; AVX-NEXT:    retq
694   %1 = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %a0)
695   %2 = icmp eq i8 %1, -1
696   ret i1 %2
699 define i1 @test_v4i8(<4 x i8> %a0) {
700 ; SSE-LABEL: test_v4i8:
701 ; SSE:       # %bb.0:
702 ; SSE-NEXT:    movd %xmm0, %eax
703 ; SSE-NEXT:    cmpl $-1, %eax
704 ; SSE-NEXT:    setne %al
705 ; SSE-NEXT:    retq
707 ; AVX-LABEL: test_v4i8:
708 ; AVX:       # %bb.0:
709 ; AVX-NEXT:    vmovd %xmm0, %eax
710 ; AVX-NEXT:    cmpl $-1, %eax
711 ; AVX-NEXT:    setne %al
712 ; AVX-NEXT:    retq
713   %1 = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %a0)
714   %2 = icmp ne i8 %1, -1
715   ret i1 %2
718 define i1 @test_v8i8(<8 x i8> %a0) {
719 ; SSE-LABEL: test_v8i8:
720 ; SSE:       # %bb.0:
721 ; SSE-NEXT:    movq %xmm0, %rax
722 ; SSE-NEXT:    cmpq $-1, %rax
723 ; SSE-NEXT:    sete %al
724 ; SSE-NEXT:    retq
726 ; AVX-LABEL: test_v8i8:
727 ; AVX:       # %bb.0:
728 ; AVX-NEXT:    vmovq %xmm0, %rax
729 ; AVX-NEXT:    cmpq $-1, %rax
730 ; AVX-NEXT:    sete %al
731 ; AVX-NEXT:    retq
732   %1 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %a0)
733   %2 = icmp eq i8 %1, -1
734   ret i1 %2
737 define i1 @test_v16i8(<16 x i8> %a0) {
738 ; SSE2-LABEL: test_v16i8:
739 ; SSE2:       # %bb.0:
740 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
741 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
742 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
743 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
744 ; SSE2-NEXT:    setne %al
745 ; SSE2-NEXT:    retq
747 ; SSE41-LABEL: test_v16i8:
748 ; SSE41:       # %bb.0:
749 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
750 ; SSE41-NEXT:    ptest %xmm1, %xmm0
751 ; SSE41-NEXT:    setae %al
752 ; SSE41-NEXT:    retq
754 ; AVX-LABEL: test_v16i8:
755 ; AVX:       # %bb.0:
756 ; AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
757 ; AVX-NEXT:    vptest %xmm1, %xmm0
758 ; AVX-NEXT:    setae %al
759 ; AVX-NEXT:    retq
760   %1 = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a0)
761   %2 = icmp ne i8 %1, -1
762   ret i1 %2
765 define i1 @test_v32i8(<32 x i8> %a0) {
766 ; SSE2-LABEL: test_v32i8:
767 ; SSE2:       # %bb.0:
768 ; SSE2-NEXT:    pand %xmm1, %xmm0
769 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
770 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
771 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
772 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
773 ; SSE2-NEXT:    sete %al
774 ; SSE2-NEXT:    retq
776 ; SSE41-LABEL: test_v32i8:
777 ; SSE41:       # %bb.0:
778 ; SSE41-NEXT:    pand %xmm1, %xmm0
779 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
780 ; SSE41-NEXT:    ptest %xmm1, %xmm0
781 ; SSE41-NEXT:    setb %al
782 ; SSE41-NEXT:    retq
784 ; AVX1-LABEL: test_v32i8:
785 ; AVX1:       # %bb.0:
786 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
787 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
788 ; AVX1-NEXT:    vptest %ymm1, %ymm0
789 ; AVX1-NEXT:    setb %al
790 ; AVX1-NEXT:    vzeroupper
791 ; AVX1-NEXT:    retq
793 ; AVX2-LABEL: test_v32i8:
794 ; AVX2:       # %bb.0:
795 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
796 ; AVX2-NEXT:    vptest %ymm1, %ymm0
797 ; AVX2-NEXT:    setb %al
798 ; AVX2-NEXT:    vzeroupper
799 ; AVX2-NEXT:    retq
801 ; AVX512-LABEL: test_v32i8:
802 ; AVX512:       # %bb.0:
803 ; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
804 ; AVX512-NEXT:    vptest %ymm1, %ymm0
805 ; AVX512-NEXT:    setb %al
806 ; AVX512-NEXT:    vzeroupper
807 ; AVX512-NEXT:    retq
808   %1 = call i8 @llvm.vector.reduce.and.v32i8(<32 x i8> %a0)
809   %2 = icmp eq i8 %1, -1
810   ret i1 %2
813 define i1 @test_v64i8(<64 x i8> %a0) {
814 ; SSE2-LABEL: test_v64i8:
815 ; SSE2:       # %bb.0:
816 ; SSE2-NEXT:    pand %xmm3, %xmm1
817 ; SSE2-NEXT:    pand %xmm2, %xmm0
818 ; SSE2-NEXT:    pand %xmm1, %xmm0
819 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
820 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
821 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
822 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
823 ; SSE2-NEXT:    setne %al
824 ; SSE2-NEXT:    retq
826 ; SSE41-LABEL: test_v64i8:
827 ; SSE41:       # %bb.0:
828 ; SSE41-NEXT:    pand %xmm3, %xmm1
829 ; SSE41-NEXT:    pand %xmm2, %xmm0
830 ; SSE41-NEXT:    pand %xmm1, %xmm0
831 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
832 ; SSE41-NEXT:    ptest %xmm1, %xmm0
833 ; SSE41-NEXT:    setae %al
834 ; SSE41-NEXT:    retq
836 ; AVX1-LABEL: test_v64i8:
837 ; AVX1:       # %bb.0:
838 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
839 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
840 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
841 ; AVX1-NEXT:    vptest %ymm1, %ymm0
842 ; AVX1-NEXT:    setae %al
843 ; AVX1-NEXT:    vzeroupper
844 ; AVX1-NEXT:    retq
846 ; AVX2-LABEL: test_v64i8:
847 ; AVX2:       # %bb.0:
848 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
849 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
850 ; AVX2-NEXT:    vptest %ymm1, %ymm0
851 ; AVX2-NEXT:    setae %al
852 ; AVX2-NEXT:    vzeroupper
853 ; AVX2-NEXT:    retq
855 ; AVX512-LABEL: test_v64i8:
856 ; AVX512:       # %bb.0:
857 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
858 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
859 ; AVX512-NEXT:    kortestw %k0, %k0
860 ; AVX512-NEXT:    setne %al
861 ; AVX512-NEXT:    vzeroupper
862 ; AVX512-NEXT:    retq
863   %1 = call i8 @llvm.vector.reduce.and.v64i8(<64 x i8> %a0)
864   %2 = icmp ne i8 %1, -1
865   ret i1 %2
868 define i1 @test_v128i8(<128 x i8> %a0) {
869 ; SSE2-LABEL: test_v128i8:
870 ; SSE2:       # %bb.0:
871 ; SSE2-NEXT:    pand %xmm7, %xmm3
872 ; SSE2-NEXT:    pand %xmm5, %xmm1
873 ; SSE2-NEXT:    pand %xmm3, %xmm1
874 ; SSE2-NEXT:    pand %xmm6, %xmm2
875 ; SSE2-NEXT:    pand %xmm4, %xmm0
876 ; SSE2-NEXT:    pand %xmm2, %xmm0
877 ; SSE2-NEXT:    pand %xmm1, %xmm0
878 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
879 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
880 ; SSE2-NEXT:    pmovmskb %xmm1, %eax
881 ; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
882 ; SSE2-NEXT:    sete %al
883 ; SSE2-NEXT:    retq
885 ; SSE41-LABEL: test_v128i8:
886 ; SSE41:       # %bb.0:
887 ; SSE41-NEXT:    pand %xmm7, %xmm3
888 ; SSE41-NEXT:    pand %xmm5, %xmm1
889 ; SSE41-NEXT:    pand %xmm3, %xmm1
890 ; SSE41-NEXT:    pand %xmm6, %xmm2
891 ; SSE41-NEXT:    pand %xmm4, %xmm0
892 ; SSE41-NEXT:    pand %xmm2, %xmm0
893 ; SSE41-NEXT:    pand %xmm1, %xmm0
894 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
895 ; SSE41-NEXT:    ptest %xmm1, %xmm0
896 ; SSE41-NEXT:    setb %al
897 ; SSE41-NEXT:    retq
899 ; AVX1-LABEL: test_v128i8:
900 ; AVX1:       # %bb.0:
901 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
902 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
903 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
904 ; AVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm1
905 ; AVX1-NEXT:    vcmptrueps %ymm1, %ymm1, %ymm1
906 ; AVX1-NEXT:    vptest %ymm1, %ymm0
907 ; AVX1-NEXT:    setb %al
908 ; AVX1-NEXT:    vzeroupper
909 ; AVX1-NEXT:    retq
911 ; AVX2-LABEL: test_v128i8:
912 ; AVX2:       # %bb.0:
913 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
914 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
915 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
916 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
917 ; AVX2-NEXT:    vptest %ymm1, %ymm0
918 ; AVX2-NEXT:    setb %al
919 ; AVX2-NEXT:    vzeroupper
920 ; AVX2-NEXT:    retq
922 ; AVX512-LABEL: test_v128i8:
923 ; AVX512:       # %bb.0:
924 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0
925 ; AVX512-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
926 ; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
927 ; AVX512-NEXT:    kortestw %k0, %k0
928 ; AVX512-NEXT:    sete %al
929 ; AVX512-NEXT:    vzeroupper
930 ; AVX512-NEXT:    retq
931   %1 = call i8 @llvm.vector.reduce.and.v128i8(<128 x i8> %a0)
932   %2 = icmp eq i8 %1, -1
933   ret i1 %2
936 declare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>)
937 declare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>)
938 declare i64 @llvm.vector.reduce.and.v8i64(<8 x i64>)
939 declare i64 @llvm.vector.reduce.and.v16i64(<16 x i64>)
941 declare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>)
942 declare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>)
943 declare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>)
944 declare i32 @llvm.vector.reduce.and.v16i32(<16 x i32>)
945 declare i32 @llvm.vector.reduce.and.v32i32(<32 x i32>)
947 declare i16 @llvm.vector.reduce.and.v2i16(<2 x i16>)
948 declare i16 @llvm.vector.reduce.and.v4i16(<4 x i16>)
949 declare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>)
950 declare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>)
951 declare i16 @llvm.vector.reduce.and.v32i16(<32 x i16>)
952 declare i16 @llvm.vector.reduce.and.v64i16(<64 x i16>)
954 declare i8 @llvm.vector.reduce.and.v2i8(<2 x i8>)
955 declare i8 @llvm.vector.reduce.and.v4i8(<4 x i8>)
956 declare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>)
957 declare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>)
958 declare i8 @llvm.vector.reduce.and.v32i8(<32 x i8>)
959 declare i8 @llvm.vector.reduce.and.v64i8(<64 x i8>)
960 declare i8 @llvm.vector.reduce.and.v128i8(<128 x i8>)
961 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
962 ; AVX1OR2: {{.*}}
963 ; AVX512BW: {{.*}}
964 ; AVX512BWVL: {{.*}}
965 ; AVX512F: {{.*}}