1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X86-SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X64-SSE,X64-SSE2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL
15 define i1 @trunc_v2i64_v2i1(<2 x i64>) nounwind {
16 ; SSE2-LABEL: trunc_v2i64_v2i1:
18 ; SSE2-NEXT: psllq $63, %xmm0
19 ; SSE2-NEXT: movmskpd %xmm0, %eax
20 ; SSE2-NEXT: cmpl $3, %eax
22 ; SSE2-NEXT: ret{{[l|q]}}
24 ; SSE41-LABEL: trunc_v2i64_v2i1:
26 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
27 ; SSE41-NEXT: setb %al
30 ; AVX1OR2-LABEL: trunc_v2i64_v2i1:
32 ; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
33 ; AVX1OR2-NEXT: setb %al
36 ; AVX512F-LABEL: trunc_v2i64_v2i1:
38 ; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
39 ; AVX512F-NEXT: setb %al
42 ; AVX512BW-LABEL: trunc_v2i64_v2i1:
44 ; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
45 ; AVX512BW-NEXT: setb %al
48 ; AVX512VL-LABEL: trunc_v2i64_v2i1:
50 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,1]
51 ; AVX512VL-NEXT: vptest %xmm1, %xmm0
52 ; AVX512VL-NEXT: setb %al
54 %a = trunc <2 x i64> %0 to <2 x i1>
55 %b = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %a)
59 define i1 @trunc_v4i32_v4i1(<4 x i32>) nounwind {
60 ; SSE2-LABEL: trunc_v4i32_v4i1:
62 ; SSE2-NEXT: pslld $31, %xmm0
63 ; SSE2-NEXT: movmskps %xmm0, %eax
64 ; SSE2-NEXT: xorl $15, %eax
66 ; SSE2-NEXT: ret{{[l|q]}}
68 ; SSE41-LABEL: trunc_v4i32_v4i1:
70 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
71 ; SSE41-NEXT: setb %al
74 ; AVX1OR2-LABEL: trunc_v4i32_v4i1:
76 ; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
77 ; AVX1OR2-NEXT: setb %al
80 ; AVX512F-LABEL: trunc_v4i32_v4i1:
82 ; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
83 ; AVX512F-NEXT: setb %al
86 ; AVX512BW-LABEL: trunc_v4i32_v4i1:
88 ; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
89 ; AVX512BW-NEXT: setb %al
92 ; AVX512VL-LABEL: trunc_v4i32_v4i1:
94 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4294967297,4294967297]
95 ; AVX512VL-NEXT: vptest %xmm1, %xmm0
96 ; AVX512VL-NEXT: setb %al
98 %a = trunc <4 x i32> %0 to <4 x i1>
99 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
103 define i1 @trunc_v8i16_v8i1(<8 x i16>) nounwind {
104 ; SSE2-LABEL: trunc_v8i16_v8i1:
106 ; SSE2-NEXT: psllw $7, %xmm0
107 ; SSE2-NEXT: pmovmskb %xmm0, %eax
108 ; SSE2-NEXT: notl %eax
109 ; SSE2-NEXT: testl $21845, %eax # imm = 0x5555
110 ; SSE2-NEXT: sete %al
111 ; SSE2-NEXT: ret{{[l|q]}}
113 ; SSE41-LABEL: trunc_v8i16_v8i1:
115 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
116 ; SSE41-NEXT: setb %al
119 ; AVX1OR2-LABEL: trunc_v8i16_v8i1:
121 ; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
122 ; AVX1OR2-NEXT: setb %al
125 ; AVX512F-LABEL: trunc_v8i16_v8i1:
127 ; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
128 ; AVX512F-NEXT: setb %al
131 ; AVX512BW-LABEL: trunc_v8i16_v8i1:
133 ; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
134 ; AVX512BW-NEXT: setb %al
135 ; AVX512BW-NEXT: retq
137 ; AVX512VL-LABEL: trunc_v8i16_v8i1:
139 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [281479271743489,281479271743489]
140 ; AVX512VL-NEXT: vptest %xmm1, %xmm0
141 ; AVX512VL-NEXT: setb %al
142 ; AVX512VL-NEXT: retq
143 %a = trunc <8 x i16> %0 to <8 x i1>
144 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
148 define i1 @trunc_v16i8_v16i1(<16 x i8>) nounwind {
149 ; SSE2-LABEL: trunc_v16i8_v16i1:
151 ; SSE2-NEXT: psllw $7, %xmm0
152 ; SSE2-NEXT: pmovmskb %xmm0, %eax
153 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
154 ; SSE2-NEXT: sete %al
155 ; SSE2-NEXT: ret{{[l|q]}}
157 ; SSE41-LABEL: trunc_v16i8_v16i1:
159 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
160 ; SSE41-NEXT: setb %al
163 ; AVX1OR2-LABEL: trunc_v16i8_v16i1:
165 ; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
166 ; AVX1OR2-NEXT: setb %al
169 ; AVX512F-LABEL: trunc_v16i8_v16i1:
171 ; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
172 ; AVX512F-NEXT: setb %al
175 ; AVX512BW-LABEL: trunc_v16i8_v16i1:
177 ; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
178 ; AVX512BW-NEXT: setb %al
179 ; AVX512BW-NEXT: retq
181 ; AVX512VL-LABEL: trunc_v16i8_v16i1:
183 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [72340172838076673,72340172838076673]
184 ; AVX512VL-NEXT: vptest %xmm1, %xmm0
185 ; AVX512VL-NEXT: setb %al
186 ; AVX512VL-NEXT: retq
187 %a = trunc <16 x i8> %0 to <16 x i1>
188 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
192 define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {
193 ; SSE2-LABEL: trunc_v4i64_v4i1:
195 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
196 ; SSE2-NEXT: pslld $31, %xmm0
197 ; SSE2-NEXT: movmskps %xmm0, %eax
198 ; SSE2-NEXT: cmpl $15, %eax
199 ; SSE2-NEXT: sete %al
200 ; SSE2-NEXT: ret{{[l|q]}}
202 ; SSE41-LABEL: trunc_v4i64_v4i1:
204 ; SSE41-NEXT: pand %xmm1, %xmm0
205 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
206 ; SSE41-NEXT: setb %al
209 ; AVX1-LABEL: trunc_v4i64_v4i1:
211 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
212 ; AVX1-NEXT: setb %al
213 ; AVX1-NEXT: vzeroupper
216 ; AVX2-LABEL: trunc_v4i64_v4i1:
218 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
219 ; AVX2-NEXT: vptest %ymm1, %ymm0
220 ; AVX2-NEXT: setb %al
221 ; AVX2-NEXT: vzeroupper
224 ; AVX512-LABEL: trunc_v4i64_v4i1:
226 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
227 ; AVX512-NEXT: vptest %ymm1, %ymm0
228 ; AVX512-NEXT: setb %al
229 ; AVX512-NEXT: vzeroupper
231 %a = trunc <4 x i64> %0 to <4 x i1>
232 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
236 define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {
237 ; SSE2-LABEL: trunc_v8i32_v8i1:
239 ; SSE2-NEXT: pand %xmm1, %xmm0
240 ; SSE2-NEXT: pslld $31, %xmm0
241 ; SSE2-NEXT: movmskps %xmm0, %eax
242 ; SSE2-NEXT: xorl $15, %eax
243 ; SSE2-NEXT: sete %al
244 ; SSE2-NEXT: ret{{[l|q]}}
246 ; SSE41-LABEL: trunc_v8i32_v8i1:
248 ; SSE41-NEXT: pand %xmm1, %xmm0
249 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
250 ; SSE41-NEXT: setb %al
253 ; AVX1-LABEL: trunc_v8i32_v8i1:
255 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
256 ; AVX1-NEXT: setb %al
257 ; AVX1-NEXT: vzeroupper
260 ; AVX2-LABEL: trunc_v8i32_v8i1:
262 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
263 ; AVX2-NEXT: vptest %ymm1, %ymm0
264 ; AVX2-NEXT: setb %al
265 ; AVX2-NEXT: vzeroupper
268 ; AVX512-LABEL: trunc_v8i32_v8i1:
270 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
271 ; AVX512-NEXT: vptest %ymm1, %ymm0
272 ; AVX512-NEXT: setb %al
273 ; AVX512-NEXT: vzeroupper
275 %a = trunc <8 x i32> %0 to <8 x i1>
276 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
280 define i1 @trunc_v16i16_v16i1(<16 x i16>) nounwind {
281 ; SSE2-LABEL: trunc_v16i16_v16i1:
283 ; SSE2-NEXT: pand %xmm1, %xmm0
284 ; SSE2-NEXT: psllw $7, %xmm0
285 ; SSE2-NEXT: pmovmskb %xmm0, %eax
286 ; SSE2-NEXT: notl %eax
287 ; SSE2-NEXT: testl $21845, %eax # imm = 0x5555
288 ; SSE2-NEXT: sete %al
289 ; SSE2-NEXT: ret{{[l|q]}}
291 ; SSE41-LABEL: trunc_v16i16_v16i1:
293 ; SSE41-NEXT: pand %xmm1, %xmm0
294 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
295 ; SSE41-NEXT: setb %al
298 ; AVX1-LABEL: trunc_v16i16_v16i1:
300 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
301 ; AVX1-NEXT: setb %al
302 ; AVX1-NEXT: vzeroupper
305 ; AVX2-LABEL: trunc_v16i16_v16i1:
307 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
308 ; AVX2-NEXT: vptest %ymm1, %ymm0
309 ; AVX2-NEXT: setb %al
310 ; AVX2-NEXT: vzeroupper
313 ; AVX512-LABEL: trunc_v16i16_v16i1:
315 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
316 ; AVX512-NEXT: vptest %ymm1, %ymm0
317 ; AVX512-NEXT: setb %al
318 ; AVX512-NEXT: vzeroupper
320 %a = trunc <16 x i16> %0 to <16 x i1>
321 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
325 define i1 @trunc_v32i8_v32i1(<32 x i8>) nounwind {
326 ; SSE2-LABEL: trunc_v32i8_v32i1:
328 ; SSE2-NEXT: pand %xmm1, %xmm0
329 ; SSE2-NEXT: psllw $7, %xmm0
330 ; SSE2-NEXT: pmovmskb %xmm0, %eax
331 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
332 ; SSE2-NEXT: sete %al
333 ; SSE2-NEXT: ret{{[l|q]}}
335 ; SSE41-LABEL: trunc_v32i8_v32i1:
337 ; SSE41-NEXT: pand %xmm1, %xmm0
338 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
339 ; SSE41-NEXT: setb %al
342 ; AVX1-LABEL: trunc_v32i8_v32i1:
344 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
345 ; AVX1-NEXT: setb %al
346 ; AVX1-NEXT: vzeroupper
349 ; AVX2-LABEL: trunc_v32i8_v32i1:
351 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
352 ; AVX2-NEXT: vptest %ymm1, %ymm0
353 ; AVX2-NEXT: setb %al
354 ; AVX2-NEXT: vzeroupper
357 ; AVX512-LABEL: trunc_v32i8_v32i1:
359 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
360 ; AVX512-NEXT: vptest %ymm1, %ymm0
361 ; AVX512-NEXT: setb %al
362 ; AVX512-NEXT: vzeroupper
364 %a = trunc <32 x i8> %0 to <32 x i1>
365 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
369 define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {
370 ; X86-SSE2-LABEL: trunc_v8i64_v8i1:
372 ; X86-SSE2-NEXT: pushl %ebp
373 ; X86-SSE2-NEXT: movl %esp, %ebp
374 ; X86-SSE2-NEXT: andl $-16, %esp
375 ; X86-SSE2-NEXT: subl $16, %esp
376 ; X86-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
377 ; X86-SSE2-NEXT: pslld $16, %xmm0
378 ; X86-SSE2-NEXT: psrad $16, %xmm0
379 ; X86-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],mem[0,2]
380 ; X86-SSE2-NEXT: pslld $16, %xmm2
381 ; X86-SSE2-NEXT: psrad $16, %xmm2
382 ; X86-SSE2-NEXT: packssdw %xmm2, %xmm0
383 ; X86-SSE2-NEXT: psllw $15, %xmm0
384 ; X86-SSE2-NEXT: packsswb %xmm0, %xmm0
385 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
386 ; X86-SSE2-NEXT: cmpb $-1, %al
387 ; X86-SSE2-NEXT: sete %al
388 ; X86-SSE2-NEXT: movl %ebp, %esp
389 ; X86-SSE2-NEXT: popl %ebp
390 ; X86-SSE2-NEXT: retl
392 ; X64-SSE2-LABEL: trunc_v8i64_v8i1:
394 ; X64-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
395 ; X64-SSE2-NEXT: pslld $16, %xmm2
396 ; X64-SSE2-NEXT: psrad $16, %xmm2
397 ; X64-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
398 ; X64-SSE2-NEXT: pslld $16, %xmm0
399 ; X64-SSE2-NEXT: psrad $16, %xmm0
400 ; X64-SSE2-NEXT: packssdw %xmm2, %xmm0
401 ; X64-SSE2-NEXT: psllw $15, %xmm0
402 ; X64-SSE2-NEXT: packsswb %xmm0, %xmm0
403 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
404 ; X64-SSE2-NEXT: cmpb $-1, %al
405 ; X64-SSE2-NEXT: sete %al
406 ; X64-SSE2-NEXT: retq
408 ; SSE41-LABEL: trunc_v8i64_v8i1:
410 ; SSE41-NEXT: pand %xmm3, %xmm1
411 ; SSE41-NEXT: pand %xmm2, %xmm0
412 ; SSE41-NEXT: pand %xmm1, %xmm0
413 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
414 ; SSE41-NEXT: setb %al
417 ; AVX1-LABEL: trunc_v8i64_v8i1:
419 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
420 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
421 ; AVX1-NEXT: setb %al
422 ; AVX1-NEXT: vzeroupper
425 ; AVX2-LABEL: trunc_v8i64_v8i1:
427 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
428 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
429 ; AVX2-NEXT: vptest %ymm1, %ymm0
430 ; AVX2-NEXT: setb %al
431 ; AVX2-NEXT: vzeroupper
434 ; AVX512-LABEL: trunc_v8i64_v8i1:
436 ; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1]
437 ; AVX512-NEXT: vpandq %zmm1, %zmm0, %zmm0
438 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
439 ; AVX512-NEXT: kortestw %k0, %k0
440 ; AVX512-NEXT: sete %al
441 ; AVX512-NEXT: vzeroupper
443 %a = trunc <8 x i64> %0 to <8 x i1>
444 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
448 define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {
449 ; X86-SSE2-LABEL: trunc_v16i32_v16i1:
451 ; X86-SSE2-NEXT: pushl %ebp
452 ; X86-SSE2-NEXT: movl %esp, %ebp
453 ; X86-SSE2-NEXT: andl $-16, %esp
454 ; X86-SSE2-NEXT: subl $16, %esp
455 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
456 ; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
457 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
458 ; X86-SSE2-NEXT: pslld $31, %xmm1
459 ; X86-SSE2-NEXT: movmskps %xmm1, %eax
460 ; X86-SSE2-NEXT: xorl $15, %eax
461 ; X86-SSE2-NEXT: sete %al
462 ; X86-SSE2-NEXT: movl %ebp, %esp
463 ; X86-SSE2-NEXT: popl %ebp
464 ; X86-SSE2-NEXT: retl
466 ; X64-SSE2-LABEL: trunc_v16i32_v16i1:
468 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
469 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
470 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
471 ; X64-SSE2-NEXT: pslld $31, %xmm0
472 ; X64-SSE2-NEXT: movmskps %xmm0, %eax
473 ; X64-SSE2-NEXT: xorl $15, %eax
474 ; X64-SSE2-NEXT: sete %al
475 ; X64-SSE2-NEXT: retq
477 ; SSE41-LABEL: trunc_v16i32_v16i1:
479 ; SSE41-NEXT: pand %xmm3, %xmm1
480 ; SSE41-NEXT: pand %xmm2, %xmm0
481 ; SSE41-NEXT: pand %xmm1, %xmm0
482 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
483 ; SSE41-NEXT: setb %al
486 ; AVX1-LABEL: trunc_v16i32_v16i1:
488 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
489 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
490 ; AVX1-NEXT: setb %al
491 ; AVX1-NEXT: vzeroupper
494 ; AVX2-LABEL: trunc_v16i32_v16i1:
496 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
497 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
498 ; AVX2-NEXT: vptest %ymm1, %ymm0
499 ; AVX2-NEXT: setb %al
500 ; AVX2-NEXT: vzeroupper
503 ; AVX512-LABEL: trunc_v16i32_v16i1:
505 ; AVX512-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k0
506 ; AVX512-NEXT: kortestw %k0, %k0
507 ; AVX512-NEXT: sete %al
508 ; AVX512-NEXT: vzeroupper
510 %a = trunc <16 x i32> %0 to <16 x i1>
511 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
515 define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {
516 ; X86-SSE2-LABEL: trunc_v32i16_v32i1:
518 ; X86-SSE2-NEXT: pushl %ebp
519 ; X86-SSE2-NEXT: movl %esp, %ebp
520 ; X86-SSE2-NEXT: andl $-16, %esp
521 ; X86-SSE2-NEXT: subl $16, %esp
522 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
523 ; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
524 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
525 ; X86-SSE2-NEXT: psllw $7, %xmm1
526 ; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
527 ; X86-SSE2-NEXT: notl %eax
528 ; X86-SSE2-NEXT: testl $21845, %eax # imm = 0x5555
529 ; X86-SSE2-NEXT: sete %al
530 ; X86-SSE2-NEXT: movl %ebp, %esp
531 ; X86-SSE2-NEXT: popl %ebp
532 ; X86-SSE2-NEXT: retl
534 ; X64-SSE2-LABEL: trunc_v32i16_v32i1:
536 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
537 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
538 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
539 ; X64-SSE2-NEXT: psllw $7, %xmm0
540 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
541 ; X64-SSE2-NEXT: notl %eax
542 ; X64-SSE2-NEXT: testl $21845, %eax # imm = 0x5555
543 ; X64-SSE2-NEXT: sete %al
544 ; X64-SSE2-NEXT: retq
546 ; SSE41-LABEL: trunc_v32i16_v32i1:
548 ; SSE41-NEXT: pand %xmm3, %xmm1
549 ; SSE41-NEXT: pand %xmm2, %xmm0
550 ; SSE41-NEXT: pand %xmm1, %xmm0
551 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
552 ; SSE41-NEXT: setb %al
555 ; AVX1-LABEL: trunc_v32i16_v32i1:
557 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
558 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
559 ; AVX1-NEXT: setb %al
560 ; AVX1-NEXT: vzeroupper
563 ; AVX2-LABEL: trunc_v32i16_v32i1:
565 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
566 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
567 ; AVX2-NEXT: vptest %ymm1, %ymm0
568 ; AVX2-NEXT: setb %al
569 ; AVX2-NEXT: vzeroupper
572 ; AVX512F-LABEL: trunc_v32i16_v32i1:
574 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
575 ; AVX512F-NEXT: vpandq %zmm1, %zmm0, %zmm0
576 ; AVX512F-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
577 ; AVX512F-NEXT: kortestw %k0, %k0
578 ; AVX512F-NEXT: sete %al
579 ; AVX512F-NEXT: vzeroupper
582 ; AVX512BW-LABEL: trunc_v32i16_v32i1:
584 ; AVX512BW-NEXT: vpbroadcastw {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
585 ; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0
586 ; AVX512BW-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
587 ; AVX512BW-NEXT: kortestw %k0, %k0
588 ; AVX512BW-NEXT: sete %al
589 ; AVX512BW-NEXT: vzeroupper
590 ; AVX512BW-NEXT: retq
592 ; AVX512VL-LABEL: trunc_v32i16_v32i1:
594 ; AVX512VL-NEXT: vpbroadcastw {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
595 ; AVX512VL-NEXT: vpandq %zmm1, %zmm0, %zmm0
596 ; AVX512VL-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
597 ; AVX512VL-NEXT: kortestw %k0, %k0
598 ; AVX512VL-NEXT: sete %al
599 ; AVX512VL-NEXT: vzeroupper
600 ; AVX512VL-NEXT: retq
601 %a = trunc <32 x i16> %0 to <32 x i1>
602 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
606 define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {
607 ; X86-SSE2-LABEL: trunc_v64i8_v64i1:
609 ; X86-SSE2-NEXT: pushl %ebp
610 ; X86-SSE2-NEXT: movl %esp, %ebp
611 ; X86-SSE2-NEXT: andl $-16, %esp
612 ; X86-SSE2-NEXT: subl $16, %esp
613 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
614 ; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
615 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
616 ; X86-SSE2-NEXT: psllw $7, %xmm1
617 ; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
618 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
619 ; X86-SSE2-NEXT: sete %al
620 ; X86-SSE2-NEXT: movl %ebp, %esp
621 ; X86-SSE2-NEXT: popl %ebp
622 ; X86-SSE2-NEXT: retl
624 ; X64-SSE2-LABEL: trunc_v64i8_v64i1:
626 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
627 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
628 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
629 ; X64-SSE2-NEXT: psllw $7, %xmm0
630 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
631 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
632 ; X64-SSE2-NEXT: sete %al
633 ; X64-SSE2-NEXT: retq
635 ; SSE41-LABEL: trunc_v64i8_v64i1:
637 ; SSE41-NEXT: pand %xmm3, %xmm1
638 ; SSE41-NEXT: pand %xmm2, %xmm0
639 ; SSE41-NEXT: pand %xmm1, %xmm0
640 ; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
641 ; SSE41-NEXT: setb %al
644 ; AVX1-LABEL: trunc_v64i8_v64i1:
646 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
647 ; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
648 ; AVX1-NEXT: setb %al
649 ; AVX1-NEXT: vzeroupper
652 ; AVX2-LABEL: trunc_v64i8_v64i1:
654 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
655 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
656 ; AVX2-NEXT: vptest %ymm1, %ymm0
657 ; AVX2-NEXT: setb %al
658 ; AVX2-NEXT: vzeroupper
661 ; AVX512F-LABEL: trunc_v64i8_v64i1:
663 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
664 ; AVX512F-NEXT: vpandq %zmm1, %zmm0, %zmm0
665 ; AVX512F-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
666 ; AVX512F-NEXT: kortestw %k0, %k0
667 ; AVX512F-NEXT: sete %al
668 ; AVX512F-NEXT: vzeroupper
671 ; AVX512BW-LABEL: trunc_v64i8_v64i1:
673 ; AVX512BW-NEXT: vpbroadcastb {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
674 ; AVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0
675 ; AVX512BW-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
676 ; AVX512BW-NEXT: kortestw %k0, %k0
677 ; AVX512BW-NEXT: sete %al
678 ; AVX512BW-NEXT: vzeroupper
679 ; AVX512BW-NEXT: retq
681 ; AVX512VL-LABEL: trunc_v64i8_v64i1:
683 ; AVX512VL-NEXT: vpbroadcastb {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
684 ; AVX512VL-NEXT: vpandq %zmm1, %zmm0, %zmm0
685 ; AVX512VL-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
686 ; AVX512VL-NEXT: kortestw %k0, %k0
687 ; AVX512VL-NEXT: sete %al
688 ; AVX512VL-NEXT: vzeroupper
689 ; AVX512VL-NEXT: retq
690 %a = trunc <64 x i8> %0 to <64 x i1>
691 %b = call i1 @llvm.vector.reduce.and.v64i1(<64 x i1> %a)
696 ; Comparison With Zero
699 define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {
700 ; SSE2-LABEL: icmp0_v2i64_v2i1:
702 ; SSE2-NEXT: pxor %xmm1, %xmm1
703 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
704 ; SSE2-NEXT: movmskps %xmm1, %eax
705 ; SSE2-NEXT: xorl $15, %eax
706 ; SSE2-NEXT: sete %al
707 ; SSE2-NEXT: ret{{[l|q]}}
709 ; SSE41-LABEL: icmp0_v2i64_v2i1:
711 ; SSE41-NEXT: ptest %xmm0, %xmm0
712 ; SSE41-NEXT: sete %al
715 ; AVX-LABEL: icmp0_v2i64_v2i1:
717 ; AVX-NEXT: vptest %xmm0, %xmm0
720 %a = icmp eq <2 x i64> %0, zeroinitializer
721 %b = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %a)
725 define i1 @icmp0_v4i32_v4i1(<4 x i32>) nounwind {
726 ; SSE2-LABEL: icmp0_v4i32_v4i1:
728 ; SSE2-NEXT: pxor %xmm1, %xmm1
729 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
730 ; SSE2-NEXT: movmskps %xmm1, %eax
731 ; SSE2-NEXT: xorl $15, %eax
732 ; SSE2-NEXT: sete %al
733 ; SSE2-NEXT: ret{{[l|q]}}
735 ; SSE41-LABEL: icmp0_v4i32_v4i1:
737 ; SSE41-NEXT: ptest %xmm0, %xmm0
738 ; SSE41-NEXT: sete %al
741 ; AVX-LABEL: icmp0_v4i32_v4i1:
743 ; AVX-NEXT: vptest %xmm0, %xmm0
746 %a = icmp eq <4 x i32> %0, zeroinitializer
747 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
751 define i1 @icmp0_v8i16_v8i1(<8 x i16>) nounwind {
752 ; SSE2-LABEL: icmp0_v8i16_v8i1:
754 ; SSE2-NEXT: pxor %xmm1, %xmm1
755 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
756 ; SSE2-NEXT: pmovmskb %xmm1, %eax
757 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
758 ; SSE2-NEXT: sete %al
759 ; SSE2-NEXT: ret{{[l|q]}}
761 ; SSE41-LABEL: icmp0_v8i16_v8i1:
763 ; SSE41-NEXT: ptest %xmm0, %xmm0
764 ; SSE41-NEXT: sete %al
767 ; AVX-LABEL: icmp0_v8i16_v8i1:
769 ; AVX-NEXT: vptest %xmm0, %xmm0
772 %a = icmp eq <8 x i16> %0, zeroinitializer
773 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
777 define i1 @icmp0_v16i8_v16i1(<16 x i8>) nounwind {
778 ; SSE2-LABEL: icmp0_v16i8_v16i1:
780 ; SSE2-NEXT: pxor %xmm1, %xmm1
781 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
782 ; SSE2-NEXT: pmovmskb %xmm1, %eax
783 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
784 ; SSE2-NEXT: sete %al
785 ; SSE2-NEXT: ret{{[l|q]}}
787 ; SSE41-LABEL: icmp0_v16i8_v16i1:
789 ; SSE41-NEXT: ptest %xmm0, %xmm0
790 ; SSE41-NEXT: sete %al
793 ; AVX-LABEL: icmp0_v16i8_v16i1:
795 ; AVX-NEXT: vptest %xmm0, %xmm0
798 %a = icmp eq <16 x i8> %0, zeroinitializer
799 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
803 define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
804 ; SSE2-LABEL: icmp0_v4i64_v4i1:
806 ; SSE2-NEXT: por %xmm1, %xmm0
807 ; SSE2-NEXT: pxor %xmm1, %xmm1
808 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
809 ; SSE2-NEXT: movmskps %xmm1, %eax
810 ; SSE2-NEXT: xorl $15, %eax
811 ; SSE2-NEXT: sete %al
812 ; SSE2-NEXT: ret{{[l|q]}}
814 ; SSE41-LABEL: icmp0_v4i64_v4i1:
816 ; SSE41-NEXT: por %xmm1, %xmm0
817 ; SSE41-NEXT: ptest %xmm0, %xmm0
818 ; SSE41-NEXT: sete %al
821 ; AVX-LABEL: icmp0_v4i64_v4i1:
823 ; AVX-NEXT: vptest %ymm0, %ymm0
825 ; AVX-NEXT: vzeroupper
827 %a = icmp eq <4 x i64> %0, zeroinitializer
828 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
832 define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {
833 ; SSE2-LABEL: icmp0_v8i32_v8i1:
835 ; SSE2-NEXT: por %xmm1, %xmm0
836 ; SSE2-NEXT: pxor %xmm1, %xmm1
837 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
838 ; SSE2-NEXT: movmskps %xmm1, %eax
839 ; SSE2-NEXT: xorl $15, %eax
840 ; SSE2-NEXT: sete %al
841 ; SSE2-NEXT: ret{{[l|q]}}
843 ; SSE41-LABEL: icmp0_v8i32_v8i1:
845 ; SSE41-NEXT: por %xmm1, %xmm0
846 ; SSE41-NEXT: ptest %xmm0, %xmm0
847 ; SSE41-NEXT: sete %al
850 ; AVX-LABEL: icmp0_v8i32_v8i1:
852 ; AVX-NEXT: vptest %ymm0, %ymm0
854 ; AVX-NEXT: vzeroupper
856 %a = icmp eq <8 x i32> %0, zeroinitializer
857 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
861 define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {
862 ; SSE2-LABEL: icmp0_v16i16_v16i1:
864 ; SSE2-NEXT: por %xmm1, %xmm0
865 ; SSE2-NEXT: pxor %xmm1, %xmm1
866 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
867 ; SSE2-NEXT: pmovmskb %xmm1, %eax
868 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
869 ; SSE2-NEXT: sete %al
870 ; SSE2-NEXT: ret{{[l|q]}}
872 ; SSE41-LABEL: icmp0_v16i16_v16i1:
874 ; SSE41-NEXT: por %xmm1, %xmm0
875 ; SSE41-NEXT: ptest %xmm0, %xmm0
876 ; SSE41-NEXT: sete %al
879 ; AVX-LABEL: icmp0_v16i16_v16i1:
881 ; AVX-NEXT: vptest %ymm0, %ymm0
883 ; AVX-NEXT: vzeroupper
885 %a = icmp eq <16 x i16> %0, zeroinitializer
886 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
890 define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {
891 ; SSE2-LABEL: icmp0_v32i8_v32i1:
893 ; SSE2-NEXT: por %xmm1, %xmm0
894 ; SSE2-NEXT: pxor %xmm1, %xmm1
895 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
896 ; SSE2-NEXT: pmovmskb %xmm1, %eax
897 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
898 ; SSE2-NEXT: sete %al
899 ; SSE2-NEXT: ret{{[l|q]}}
901 ; SSE41-LABEL: icmp0_v32i8_v32i1:
903 ; SSE41-NEXT: por %xmm1, %xmm0
904 ; SSE41-NEXT: ptest %xmm0, %xmm0
905 ; SSE41-NEXT: sete %al
908 ; AVX-LABEL: icmp0_v32i8_v32i1:
910 ; AVX-NEXT: vptest %ymm0, %ymm0
912 ; AVX-NEXT: vzeroupper
914 %a = icmp eq <32 x i8> %0, zeroinitializer
915 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
919 define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
920 ; X86-SSE2-LABEL: icmp0_v8i64_v8i1:
922 ; X86-SSE2-NEXT: pushl %ebp
923 ; X86-SSE2-NEXT: movl %esp, %ebp
924 ; X86-SSE2-NEXT: andl $-16, %esp
925 ; X86-SSE2-NEXT: subl $16, %esp
926 ; X86-SSE2-NEXT: por %xmm2, %xmm0
927 ; X86-SSE2-NEXT: por 8(%ebp), %xmm1
928 ; X86-SSE2-NEXT: por %xmm0, %xmm1
929 ; X86-SSE2-NEXT: pxor %xmm0, %xmm0
930 ; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
931 ; X86-SSE2-NEXT: movmskps %xmm0, %eax
932 ; X86-SSE2-NEXT: xorl $15, %eax
933 ; X86-SSE2-NEXT: sete %al
934 ; X86-SSE2-NEXT: movl %ebp, %esp
935 ; X86-SSE2-NEXT: popl %ebp
936 ; X86-SSE2-NEXT: retl
938 ; X64-SSE2-LABEL: icmp0_v8i64_v8i1:
940 ; X64-SSE2-NEXT: por %xmm3, %xmm1
941 ; X64-SSE2-NEXT: por %xmm2, %xmm0
942 ; X64-SSE2-NEXT: por %xmm1, %xmm0
943 ; X64-SSE2-NEXT: pxor %xmm1, %xmm1
944 ; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
945 ; X64-SSE2-NEXT: movmskps %xmm1, %eax
946 ; X64-SSE2-NEXT: xorl $15, %eax
947 ; X64-SSE2-NEXT: sete %al
948 ; X64-SSE2-NEXT: retq
950 ; SSE41-LABEL: icmp0_v8i64_v8i1:
952 ; SSE41-NEXT: por %xmm3, %xmm1
953 ; SSE41-NEXT: por %xmm2, %xmm0
954 ; SSE41-NEXT: por %xmm1, %xmm0
955 ; SSE41-NEXT: ptest %xmm0, %xmm0
956 ; SSE41-NEXT: sete %al
959 ; AVX1-LABEL: icmp0_v8i64_v8i1:
961 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
962 ; AVX1-NEXT: vptest %ymm0, %ymm0
963 ; AVX1-NEXT: sete %al
964 ; AVX1-NEXT: vzeroupper
967 ; AVX2-LABEL: icmp0_v8i64_v8i1:
969 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
970 ; AVX2-NEXT: vptest %ymm0, %ymm0
971 ; AVX2-NEXT: sete %al
972 ; AVX2-NEXT: vzeroupper
975 ; AVX512-LABEL: icmp0_v8i64_v8i1:
977 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
978 ; AVX512-NEXT: kortestw %k0, %k0
979 ; AVX512-NEXT: sete %al
980 ; AVX512-NEXT: vzeroupper
982 %a = icmp eq <8 x i64> %0, zeroinitializer
983 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
987 define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
988 ; X86-SSE2-LABEL: icmp0_v16i32_v16i1:
990 ; X86-SSE2-NEXT: pushl %ebp
991 ; X86-SSE2-NEXT: movl %esp, %ebp
992 ; X86-SSE2-NEXT: andl $-16, %esp
993 ; X86-SSE2-NEXT: subl $16, %esp
994 ; X86-SSE2-NEXT: por %xmm2, %xmm0
995 ; X86-SSE2-NEXT: por 8(%ebp), %xmm1
996 ; X86-SSE2-NEXT: por %xmm0, %xmm1
997 ; X86-SSE2-NEXT: pxor %xmm0, %xmm0
998 ; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
999 ; X86-SSE2-NEXT: movmskps %xmm0, %eax
1000 ; X86-SSE2-NEXT: xorl $15, %eax
1001 ; X86-SSE2-NEXT: sete %al
1002 ; X86-SSE2-NEXT: movl %ebp, %esp
1003 ; X86-SSE2-NEXT: popl %ebp
1004 ; X86-SSE2-NEXT: retl
1006 ; X64-SSE2-LABEL: icmp0_v16i32_v16i1:
1007 ; X64-SSE2: # %bb.0:
1008 ; X64-SSE2-NEXT: por %xmm3, %xmm1
1009 ; X64-SSE2-NEXT: por %xmm2, %xmm0
1010 ; X64-SSE2-NEXT: por %xmm1, %xmm0
1011 ; X64-SSE2-NEXT: pxor %xmm1, %xmm1
1012 ; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1013 ; X64-SSE2-NEXT: movmskps %xmm1, %eax
1014 ; X64-SSE2-NEXT: xorl $15, %eax
1015 ; X64-SSE2-NEXT: sete %al
1016 ; X64-SSE2-NEXT: retq
1018 ; SSE41-LABEL: icmp0_v16i32_v16i1:
1020 ; SSE41-NEXT: por %xmm3, %xmm1
1021 ; SSE41-NEXT: por %xmm2, %xmm0
1022 ; SSE41-NEXT: por %xmm1, %xmm0
1023 ; SSE41-NEXT: ptest %xmm0, %xmm0
1024 ; SSE41-NEXT: sete %al
1027 ; AVX1-LABEL: icmp0_v16i32_v16i1:
1029 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1030 ; AVX1-NEXT: vptest %ymm0, %ymm0
1031 ; AVX1-NEXT: sete %al
1032 ; AVX1-NEXT: vzeroupper
1035 ; AVX2-LABEL: icmp0_v16i32_v16i1:
1037 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1038 ; AVX2-NEXT: vptest %ymm0, %ymm0
1039 ; AVX2-NEXT: sete %al
1040 ; AVX2-NEXT: vzeroupper
1043 ; AVX512-LABEL: icmp0_v16i32_v16i1:
1045 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
1046 ; AVX512-NEXT: kortestw %k0, %k0
1047 ; AVX512-NEXT: sete %al
1048 ; AVX512-NEXT: vzeroupper
1050 %a = icmp eq <16 x i32> %0, zeroinitializer
1051 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
1055 define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
1056 ; X86-SSE2-LABEL: icmp0_v32i16_v32i1:
1057 ; X86-SSE2: # %bb.0:
1058 ; X86-SSE2-NEXT: pushl %ebp
1059 ; X86-SSE2-NEXT: movl %esp, %ebp
1060 ; X86-SSE2-NEXT: andl $-16, %esp
1061 ; X86-SSE2-NEXT: subl $16, %esp
1062 ; X86-SSE2-NEXT: por %xmm2, %xmm0
1063 ; X86-SSE2-NEXT: por 8(%ebp), %xmm1
1064 ; X86-SSE2-NEXT: por %xmm0, %xmm1
1065 ; X86-SSE2-NEXT: pxor %xmm0, %xmm0
1066 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1067 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1068 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1069 ; X86-SSE2-NEXT: sete %al
1070 ; X86-SSE2-NEXT: movl %ebp, %esp
1071 ; X86-SSE2-NEXT: popl %ebp
1072 ; X86-SSE2-NEXT: retl
1074 ; X64-SSE2-LABEL: icmp0_v32i16_v32i1:
1075 ; X64-SSE2: # %bb.0:
1076 ; X64-SSE2-NEXT: por %xmm3, %xmm1
1077 ; X64-SSE2-NEXT: por %xmm2, %xmm0
1078 ; X64-SSE2-NEXT: por %xmm1, %xmm0
1079 ; X64-SSE2-NEXT: pxor %xmm1, %xmm1
1080 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1081 ; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
1082 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1083 ; X64-SSE2-NEXT: sete %al
1084 ; X64-SSE2-NEXT: retq
1086 ; SSE41-LABEL: icmp0_v32i16_v32i1:
1088 ; SSE41-NEXT: por %xmm3, %xmm1
1089 ; SSE41-NEXT: por %xmm2, %xmm0
1090 ; SSE41-NEXT: por %xmm1, %xmm0
1091 ; SSE41-NEXT: ptest %xmm0, %xmm0
1092 ; SSE41-NEXT: sete %al
1095 ; AVX1-LABEL: icmp0_v32i16_v32i1:
1097 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1098 ; AVX1-NEXT: vptest %ymm0, %ymm0
1099 ; AVX1-NEXT: sete %al
1100 ; AVX1-NEXT: vzeroupper
1103 ; AVX2-LABEL: icmp0_v32i16_v32i1:
1105 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1106 ; AVX2-NEXT: vptest %ymm0, %ymm0
1107 ; AVX2-NEXT: sete %al
1108 ; AVX2-NEXT: vzeroupper
1111 ; AVX512-LABEL: icmp0_v32i16_v32i1:
1113 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
1114 ; AVX512-NEXT: kortestw %k0, %k0
1115 ; AVX512-NEXT: sete %al
1116 ; AVX512-NEXT: vzeroupper
1118 %a = icmp eq <32 x i16> %0, zeroinitializer
1119 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
1123 define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
1124 ; X86-SSE2-LABEL: icmp0_v64i8_v64i1:
1125 ; X86-SSE2: # %bb.0:
1126 ; X86-SSE2-NEXT: pushl %ebp
1127 ; X86-SSE2-NEXT: movl %esp, %ebp
1128 ; X86-SSE2-NEXT: andl $-16, %esp
1129 ; X86-SSE2-NEXT: subl $16, %esp
1130 ; X86-SSE2-NEXT: por %xmm2, %xmm0
1131 ; X86-SSE2-NEXT: por 8(%ebp), %xmm1
1132 ; X86-SSE2-NEXT: por %xmm0, %xmm1
1133 ; X86-SSE2-NEXT: pxor %xmm0, %xmm0
1134 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1135 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1136 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1137 ; X86-SSE2-NEXT: sete %al
1138 ; X86-SSE2-NEXT: movl %ebp, %esp
1139 ; X86-SSE2-NEXT: popl %ebp
1140 ; X86-SSE2-NEXT: retl
1142 ; X64-SSE2-LABEL: icmp0_v64i8_v64i1:
1143 ; X64-SSE2: # %bb.0:
1144 ; X64-SSE2-NEXT: por %xmm3, %xmm1
1145 ; X64-SSE2-NEXT: por %xmm2, %xmm0
1146 ; X64-SSE2-NEXT: por %xmm1, %xmm0
1147 ; X64-SSE2-NEXT: pxor %xmm1, %xmm1
1148 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1149 ; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
1150 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1151 ; X64-SSE2-NEXT: sete %al
1152 ; X64-SSE2-NEXT: retq
1154 ; SSE41-LABEL: icmp0_v64i8_v64i1:
1156 ; SSE41-NEXT: por %xmm3, %xmm1
1157 ; SSE41-NEXT: por %xmm2, %xmm0
1158 ; SSE41-NEXT: por %xmm1, %xmm0
1159 ; SSE41-NEXT: ptest %xmm0, %xmm0
1160 ; SSE41-NEXT: sete %al
1163 ; AVX1-LABEL: icmp0_v64i8_v64i1:
1165 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1166 ; AVX1-NEXT: vptest %ymm0, %ymm0
1167 ; AVX1-NEXT: sete %al
1168 ; AVX1-NEXT: vzeroupper
1171 ; AVX2-LABEL: icmp0_v64i8_v64i1:
1173 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1174 ; AVX2-NEXT: vptest %ymm0, %ymm0
1175 ; AVX2-NEXT: sete %al
1176 ; AVX2-NEXT: vzeroupper
1179 ; AVX512-LABEL: icmp0_v64i8_v64i1:
1181 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
1182 ; AVX512-NEXT: kortestw %k0, %k0
1183 ; AVX512-NEXT: sete %al
1184 ; AVX512-NEXT: vzeroupper
1186 %a = icmp eq <64 x i8> %0, zeroinitializer
1187 %b = call i1 @llvm.vector.reduce.and.v64i1(<64 x i1> %a)
1191 define i8 @icmp0_v8i1(<8 x i8>) nounwind {
1192 ; SSE2-LABEL: icmp0_v8i1:
1194 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1195 ; SSE2-NEXT: psllw $15, %xmm0
1196 ; SSE2-NEXT: pmovmskb %xmm0, %eax
1197 ; SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA
1198 ; SSE2-NEXT: sete %al
1199 ; SSE2-NEXT: ret{{[l|q]}}
1201 ; SSE41-LABEL: icmp0_v8i1:
1203 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1204 ; SSE41-NEXT: psllw $15, %xmm0
1205 ; SSE41-NEXT: pmovmskb %xmm0, %eax
1206 ; SSE41-NEXT: testl $43690, %eax # imm = 0xAAAA
1207 ; SSE41-NEXT: sete %al
1210 ; AVX1OR2-LABEL: icmp0_v8i1:
1212 ; AVX1OR2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1213 ; AVX1OR2-NEXT: vpsllw $15, %xmm0, %xmm0
1214 ; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
1215 ; AVX1OR2-NEXT: testl $43690, %eax # imm = 0xAAAA
1216 ; AVX1OR2-NEXT: sete %al
1217 ; AVX1OR2-NEXT: retq
1219 ; AVX512F-LABEL: icmp0_v8i1:
1221 ; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0
1222 ; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0
1223 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0
1224 ; AVX512F-NEXT: kmovw %k0, %eax
1225 ; AVX512F-NEXT: testb %al, %al
1226 ; AVX512F-NEXT: sete %al
1227 ; AVX512F-NEXT: vzeroupper
1228 ; AVX512F-NEXT: retq
1230 ; AVX512BW-LABEL: icmp0_v8i1:
1231 ; AVX512BW: # %bb.0:
1232 ; AVX512BW-NEXT: vpsllw $7, %xmm0, %xmm0
1233 ; AVX512BW-NEXT: vpmovb2m %zmm0, %k0
1234 ; AVX512BW-NEXT: kmovd %k0, %eax
1235 ; AVX512BW-NEXT: testb %al, %al
1236 ; AVX512BW-NEXT: sete %al
1237 ; AVX512BW-NEXT: vzeroupper
1238 ; AVX512BW-NEXT: retq
1240 ; AVX512VL-LABEL: icmp0_v8i1:
1241 ; AVX512VL: # %bb.0:
1242 ; AVX512VL-NEXT: vpsllw $7, %xmm0, %xmm0
1243 ; AVX512VL-NEXT: vpmovb2m %xmm0, %k0
1244 ; AVX512VL-NEXT: kmovd %k0, %eax
1245 ; AVX512VL-NEXT: testb %al, %al
1246 ; AVX512VL-NEXT: sete %al
1247 ; AVX512VL-NEXT: retq
1248 %a = trunc <8 x i8> %0 to <8 x i1>
1249 %b = icmp eq <8 x i1> %a, zeroinitializer
1250 %c = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %b)
1251 %d = zext i1 %c to i8
1256 ; Comparison With All Ones
1259 define i1 @icmp1_v2i64_v2i1(<2 x i64>) nounwind {
1260 ; SSE2-LABEL: icmp1_v2i64_v2i1:
1262 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1263 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1264 ; SSE2-NEXT: movmskps %xmm1, %eax
1265 ; SSE2-NEXT: xorl $15, %eax
1266 ; SSE2-NEXT: sete %al
1267 ; SSE2-NEXT: ret{{[l|q]}}
1269 ; SSE41-LABEL: icmp1_v2i64_v2i1:
1271 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1272 ; SSE41-NEXT: ptest %xmm1, %xmm0
1273 ; SSE41-NEXT: setb %al
1276 ; AVX-LABEL: icmp1_v2i64_v2i1:
1278 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1279 ; AVX-NEXT: vptest %xmm1, %xmm0
1280 ; AVX-NEXT: setb %al
1282 %a = icmp eq <2 x i64> %0, <i64 -1, i64 -1>
1283 %b = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %a)
1287 define i1 @icmp1_v4i32_v4i1(<4 x i32>) nounwind {
1288 ; SSE2-LABEL: icmp1_v4i32_v4i1:
1290 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1291 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1292 ; SSE2-NEXT: movmskps %xmm1, %eax
1293 ; SSE2-NEXT: xorl $15, %eax
1294 ; SSE2-NEXT: sete %al
1295 ; SSE2-NEXT: ret{{[l|q]}}
1297 ; SSE41-LABEL: icmp1_v4i32_v4i1:
1299 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1300 ; SSE41-NEXT: ptest %xmm1, %xmm0
1301 ; SSE41-NEXT: setb %al
1304 ; AVX-LABEL: icmp1_v4i32_v4i1:
1306 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1307 ; AVX-NEXT: vptest %xmm1, %xmm0
1308 ; AVX-NEXT: setb %al
1310 %a = icmp eq <4 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1>
1311 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
1315 define i1 @icmp1_v8i16_v8i1(<8 x i16>) nounwind {
1316 ; SSE2-LABEL: icmp1_v8i16_v8i1:
1318 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1319 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1320 ; SSE2-NEXT: pmovmskb %xmm1, %eax
1321 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1322 ; SSE2-NEXT: sete %al
1323 ; SSE2-NEXT: ret{{[l|q]}}
1325 ; SSE41-LABEL: icmp1_v8i16_v8i1:
1327 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1328 ; SSE41-NEXT: ptest %xmm1, %xmm0
1329 ; SSE41-NEXT: setb %al
1332 ; AVX-LABEL: icmp1_v8i16_v8i1:
1334 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1335 ; AVX-NEXT: vptest %xmm1, %xmm0
1336 ; AVX-NEXT: setb %al
1338 %a = icmp eq <8 x i16> %0, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1339 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
1343 define i1 @icmp1_v16i8_v16i1(<16 x i8>) nounwind {
1344 ; SSE2-LABEL: icmp1_v16i8_v16i1:
1346 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1347 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1348 ; SSE2-NEXT: pmovmskb %xmm1, %eax
1349 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1350 ; SSE2-NEXT: sete %al
1351 ; SSE2-NEXT: ret{{[l|q]}}
1353 ; SSE41-LABEL: icmp1_v16i8_v16i1:
1355 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1356 ; SSE41-NEXT: ptest %xmm1, %xmm0
1357 ; SSE41-NEXT: setb %al
1360 ; AVX-LABEL: icmp1_v16i8_v16i1:
1362 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
1363 ; AVX-NEXT: vptest %xmm1, %xmm0
1364 ; AVX-NEXT: setb %al
1366 %a = icmp eq <16 x i8> %0, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1367 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
1371 define i1 @icmp1_v4i64_v4i1(<4 x i64>) nounwind {
1372 ; SSE2-LABEL: icmp1_v4i64_v4i1:
1374 ; SSE2-NEXT: pand %xmm1, %xmm0
1375 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1376 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1377 ; SSE2-NEXT: movmskps %xmm1, %eax
1378 ; SSE2-NEXT: xorl $15, %eax
1379 ; SSE2-NEXT: sete %al
1380 ; SSE2-NEXT: ret{{[l|q]}}
1382 ; SSE41-LABEL: icmp1_v4i64_v4i1:
1384 ; SSE41-NEXT: pand %xmm1, %xmm0
1385 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1386 ; SSE41-NEXT: ptest %xmm1, %xmm0
1387 ; SSE41-NEXT: setb %al
1390 ; AVX1-LABEL: icmp1_v4i64_v4i1:
1392 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1393 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1394 ; AVX1-NEXT: vptest %ymm1, %ymm0
1395 ; AVX1-NEXT: setb %al
1396 ; AVX1-NEXT: vzeroupper
1399 ; AVX2-LABEL: icmp1_v4i64_v4i1:
1401 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1402 ; AVX2-NEXT: vptest %ymm1, %ymm0
1403 ; AVX2-NEXT: setb %al
1404 ; AVX2-NEXT: vzeroupper
1407 ; AVX512-LABEL: icmp1_v4i64_v4i1:
1409 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1410 ; AVX512-NEXT: vptest %ymm1, %ymm0
1411 ; AVX512-NEXT: setb %al
1412 ; AVX512-NEXT: vzeroupper
1414 %a = icmp eq <4 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1>
1415 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
1419 define i1 @icmp1_v8i32_v8i1(<8 x i32>) nounwind {
1420 ; SSE2-LABEL: icmp1_v8i32_v8i1:
1422 ; SSE2-NEXT: pand %xmm1, %xmm0
1423 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1424 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1425 ; SSE2-NEXT: movmskps %xmm1, %eax
1426 ; SSE2-NEXT: xorl $15, %eax
1427 ; SSE2-NEXT: sete %al
1428 ; SSE2-NEXT: ret{{[l|q]}}
1430 ; SSE41-LABEL: icmp1_v8i32_v8i1:
1432 ; SSE41-NEXT: pand %xmm1, %xmm0
1433 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1434 ; SSE41-NEXT: ptest %xmm1, %xmm0
1435 ; SSE41-NEXT: setb %al
1438 ; AVX1-LABEL: icmp1_v8i32_v8i1:
1440 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1441 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1442 ; AVX1-NEXT: vptest %ymm1, %ymm0
1443 ; AVX1-NEXT: setb %al
1444 ; AVX1-NEXT: vzeroupper
1447 ; AVX2-LABEL: icmp1_v8i32_v8i1:
1449 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1450 ; AVX2-NEXT: vptest %ymm1, %ymm0
1451 ; AVX2-NEXT: setb %al
1452 ; AVX2-NEXT: vzeroupper
1455 ; AVX512-LABEL: icmp1_v8i32_v8i1:
1457 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1458 ; AVX512-NEXT: vptest %ymm1, %ymm0
1459 ; AVX512-NEXT: setb %al
1460 ; AVX512-NEXT: vzeroupper
1462 %a = icmp eq <8 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
1463 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
1467 define i1 @icmp1_v16i16_v16i1(<16 x i16>) nounwind {
1468 ; SSE2-LABEL: icmp1_v16i16_v16i1:
1470 ; SSE2-NEXT: pand %xmm1, %xmm0
1471 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1472 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1473 ; SSE2-NEXT: pmovmskb %xmm1, %eax
1474 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1475 ; SSE2-NEXT: sete %al
1476 ; SSE2-NEXT: ret{{[l|q]}}
1478 ; SSE41-LABEL: icmp1_v16i16_v16i1:
1480 ; SSE41-NEXT: pand %xmm1, %xmm0
1481 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1482 ; SSE41-NEXT: ptest %xmm1, %xmm0
1483 ; SSE41-NEXT: setb %al
1486 ; AVX1-LABEL: icmp1_v16i16_v16i1:
1488 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1489 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1490 ; AVX1-NEXT: vptest %ymm1, %ymm0
1491 ; AVX1-NEXT: setb %al
1492 ; AVX1-NEXT: vzeroupper
1495 ; AVX2-LABEL: icmp1_v16i16_v16i1:
1497 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1498 ; AVX2-NEXT: vptest %ymm1, %ymm0
1499 ; AVX2-NEXT: setb %al
1500 ; AVX2-NEXT: vzeroupper
1503 ; AVX512-LABEL: icmp1_v16i16_v16i1:
1505 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1506 ; AVX512-NEXT: vptest %ymm1, %ymm0
1507 ; AVX512-NEXT: setb %al
1508 ; AVX512-NEXT: vzeroupper
1510 %a = icmp eq <16 x i16> %0, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1511 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
1515 define i1 @icmp1_v32i8_v32i1(<32 x i8>) nounwind {
1516 ; SSE2-LABEL: icmp1_v32i8_v32i1:
1518 ; SSE2-NEXT: pand %xmm1, %xmm0
1519 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1520 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1521 ; SSE2-NEXT: pmovmskb %xmm1, %eax
1522 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1523 ; SSE2-NEXT: sete %al
1524 ; SSE2-NEXT: ret{{[l|q]}}
1526 ; SSE41-LABEL: icmp1_v32i8_v32i1:
1528 ; SSE41-NEXT: pand %xmm1, %xmm0
1529 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1530 ; SSE41-NEXT: ptest %xmm1, %xmm0
1531 ; SSE41-NEXT: setb %al
1534 ; AVX1-LABEL: icmp1_v32i8_v32i1:
1536 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1537 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1538 ; AVX1-NEXT: vptest %ymm1, %ymm0
1539 ; AVX1-NEXT: setb %al
1540 ; AVX1-NEXT: vzeroupper
1543 ; AVX2-LABEL: icmp1_v32i8_v32i1:
1545 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1546 ; AVX2-NEXT: vptest %ymm1, %ymm0
1547 ; AVX2-NEXT: setb %al
1548 ; AVX2-NEXT: vzeroupper
1551 ; AVX512-LABEL: icmp1_v32i8_v32i1:
1553 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1554 ; AVX512-NEXT: vptest %ymm1, %ymm0
1555 ; AVX512-NEXT: setb %al
1556 ; AVX512-NEXT: vzeroupper
1558 %a = icmp eq <32 x i8> %0, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1559 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
1563 define i1 @icmp1_v8i64_v8i1(<8 x i64>) nounwind {
1564 ; X86-SSE2-LABEL: icmp1_v8i64_v8i1:
1565 ; X86-SSE2: # %bb.0:
1566 ; X86-SSE2-NEXT: pushl %ebp
1567 ; X86-SSE2-NEXT: movl %esp, %ebp
1568 ; X86-SSE2-NEXT: andl $-16, %esp
1569 ; X86-SSE2-NEXT: subl $16, %esp
1570 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1571 ; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
1572 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
1573 ; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1574 ; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
1575 ; X86-SSE2-NEXT: movmskps %xmm0, %eax
1576 ; X86-SSE2-NEXT: xorl $15, %eax
1577 ; X86-SSE2-NEXT: sete %al
1578 ; X86-SSE2-NEXT: movl %ebp, %esp
1579 ; X86-SSE2-NEXT: popl %ebp
1580 ; X86-SSE2-NEXT: retl
1582 ; X64-SSE2-LABEL: icmp1_v8i64_v8i1:
1583 ; X64-SSE2: # %bb.0:
1584 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
1585 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1586 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
1587 ; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1588 ; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1589 ; X64-SSE2-NEXT: movmskps %xmm1, %eax
1590 ; X64-SSE2-NEXT: xorl $15, %eax
1591 ; X64-SSE2-NEXT: sete %al
1592 ; X64-SSE2-NEXT: retq
1594 ; SSE41-LABEL: icmp1_v8i64_v8i1:
1596 ; SSE41-NEXT: pand %xmm3, %xmm1
1597 ; SSE41-NEXT: pand %xmm2, %xmm0
1598 ; SSE41-NEXT: pand %xmm1, %xmm0
1599 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1600 ; SSE41-NEXT: ptest %xmm1, %xmm0
1601 ; SSE41-NEXT: setb %al
1604 ; AVX1-LABEL: icmp1_v8i64_v8i1:
1606 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
1607 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1608 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1609 ; AVX1-NEXT: vptest %ymm1, %ymm0
1610 ; AVX1-NEXT: setb %al
1611 ; AVX1-NEXT: vzeroupper
1614 ; AVX2-LABEL: icmp1_v8i64_v8i1:
1616 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
1617 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1618 ; AVX2-NEXT: vptest %ymm1, %ymm0
1619 ; AVX2-NEXT: setb %al
1620 ; AVX2-NEXT: vzeroupper
1623 ; AVX512-LABEL: icmp1_v8i64_v8i1:
1625 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
1626 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1627 ; AVX512-NEXT: kortestw %k0, %k0
1628 ; AVX512-NEXT: sete %al
1629 ; AVX512-NEXT: vzeroupper
1631 %a = icmp eq <8 x i64> %0, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>
1632 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
1636 define i1 @icmp1_v16i32_v16i1(<16 x i32>) nounwind {
1637 ; X86-SSE2-LABEL: icmp1_v16i32_v16i1:
1638 ; X86-SSE2: # %bb.0:
1639 ; X86-SSE2-NEXT: pushl %ebp
1640 ; X86-SSE2-NEXT: movl %esp, %ebp
1641 ; X86-SSE2-NEXT: andl $-16, %esp
1642 ; X86-SSE2-NEXT: subl $16, %esp
1643 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1644 ; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
1645 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
1646 ; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1647 ; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
1648 ; X86-SSE2-NEXT: movmskps %xmm0, %eax
1649 ; X86-SSE2-NEXT: xorl $15, %eax
1650 ; X86-SSE2-NEXT: sete %al
1651 ; X86-SSE2-NEXT: movl %ebp, %esp
1652 ; X86-SSE2-NEXT: popl %ebp
1653 ; X86-SSE2-NEXT: retl
1655 ; X64-SSE2-LABEL: icmp1_v16i32_v16i1:
1656 ; X64-SSE2: # %bb.0:
1657 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
1658 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1659 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
1660 ; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1661 ; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1662 ; X64-SSE2-NEXT: movmskps %xmm1, %eax
1663 ; X64-SSE2-NEXT: xorl $15, %eax
1664 ; X64-SSE2-NEXT: sete %al
1665 ; X64-SSE2-NEXT: retq
1667 ; SSE41-LABEL: icmp1_v16i32_v16i1:
1669 ; SSE41-NEXT: pand %xmm3, %xmm1
1670 ; SSE41-NEXT: pand %xmm2, %xmm0
1671 ; SSE41-NEXT: pand %xmm1, %xmm0
1672 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1673 ; SSE41-NEXT: ptest %xmm1, %xmm0
1674 ; SSE41-NEXT: setb %al
1677 ; AVX1-LABEL: icmp1_v16i32_v16i1:
1679 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
1680 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1681 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1682 ; AVX1-NEXT: vptest %ymm1, %ymm0
1683 ; AVX1-NEXT: setb %al
1684 ; AVX1-NEXT: vzeroupper
1687 ; AVX2-LABEL: icmp1_v16i32_v16i1:
1689 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
1690 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1691 ; AVX2-NEXT: vptest %ymm1, %ymm0
1692 ; AVX2-NEXT: setb %al
1693 ; AVX2-NEXT: vzeroupper
1696 ; AVX512-LABEL: icmp1_v16i32_v16i1:
1698 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
1699 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1700 ; AVX512-NEXT: kortestw %k0, %k0
1701 ; AVX512-NEXT: sete %al
1702 ; AVX512-NEXT: vzeroupper
1704 %a = icmp eq <16 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
1705 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
1709 define i1 @icmp1_v32i16_v32i1(<32 x i16>) nounwind {
1710 ; X86-SSE2-LABEL: icmp1_v32i16_v32i1:
1711 ; X86-SSE2: # %bb.0:
1712 ; X86-SSE2-NEXT: pushl %ebp
1713 ; X86-SSE2-NEXT: movl %esp, %ebp
1714 ; X86-SSE2-NEXT: andl $-16, %esp
1715 ; X86-SSE2-NEXT: subl $16, %esp
1716 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1717 ; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
1718 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
1719 ; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1720 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1721 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1722 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1723 ; X86-SSE2-NEXT: sete %al
1724 ; X86-SSE2-NEXT: movl %ebp, %esp
1725 ; X86-SSE2-NEXT: popl %ebp
1726 ; X86-SSE2-NEXT: retl
1728 ; X64-SSE2-LABEL: icmp1_v32i16_v32i1:
1729 ; X64-SSE2: # %bb.0:
1730 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
1731 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1732 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
1733 ; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1734 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1735 ; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
1736 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1737 ; X64-SSE2-NEXT: sete %al
1738 ; X64-SSE2-NEXT: retq
1740 ; SSE41-LABEL: icmp1_v32i16_v32i1:
1742 ; SSE41-NEXT: pand %xmm3, %xmm1
1743 ; SSE41-NEXT: pand %xmm2, %xmm0
1744 ; SSE41-NEXT: pand %xmm1, %xmm0
1745 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1746 ; SSE41-NEXT: ptest %xmm1, %xmm0
1747 ; SSE41-NEXT: setb %al
1750 ; AVX1-LABEL: icmp1_v32i16_v32i1:
1752 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
1753 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1754 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1755 ; AVX1-NEXT: vptest %ymm1, %ymm0
1756 ; AVX1-NEXT: setb %al
1757 ; AVX1-NEXT: vzeroupper
1760 ; AVX2-LABEL: icmp1_v32i16_v32i1:
1762 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
1763 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1764 ; AVX2-NEXT: vptest %ymm1, %ymm0
1765 ; AVX2-NEXT: setb %al
1766 ; AVX2-NEXT: vzeroupper
1769 ; AVX512-LABEL: icmp1_v32i16_v32i1:
1771 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
1772 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1773 ; AVX512-NEXT: kortestw %k0, %k0
1774 ; AVX512-NEXT: sete %al
1775 ; AVX512-NEXT: vzeroupper
1777 %a = icmp eq <32 x i16> %0, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1778 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
1782 define i1 @icmp1_v64i8_v64i1(<64 x i8>) nounwind {
1783 ; X86-SSE2-LABEL: icmp1_v64i8_v64i1:
1784 ; X86-SSE2: # %bb.0:
1785 ; X86-SSE2-NEXT: pushl %ebp
1786 ; X86-SSE2-NEXT: movl %esp, %ebp
1787 ; X86-SSE2-NEXT: andl $-16, %esp
1788 ; X86-SSE2-NEXT: subl $16, %esp
1789 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1790 ; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
1791 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
1792 ; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
1793 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1794 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1795 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1796 ; X86-SSE2-NEXT: sete %al
1797 ; X86-SSE2-NEXT: movl %ebp, %esp
1798 ; X86-SSE2-NEXT: popl %ebp
1799 ; X86-SSE2-NEXT: retl
1801 ; X64-SSE2-LABEL: icmp1_v64i8_v64i1:
1802 ; X64-SSE2: # %bb.0:
1803 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
1804 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
1805 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
1806 ; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1807 ; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1808 ; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
1809 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1810 ; X64-SSE2-NEXT: sete %al
1811 ; X64-SSE2-NEXT: retq
1813 ; SSE41-LABEL: icmp1_v64i8_v64i1:
1815 ; SSE41-NEXT: pand %xmm3, %xmm1
1816 ; SSE41-NEXT: pand %xmm2, %xmm0
1817 ; SSE41-NEXT: pand %xmm1, %xmm0
1818 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
1819 ; SSE41-NEXT: ptest %xmm1, %xmm0
1820 ; SSE41-NEXT: setb %al
1823 ; AVX1-LABEL: icmp1_v64i8_v64i1:
1825 ; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
1826 ; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1827 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
1828 ; AVX1-NEXT: vptest %ymm1, %ymm0
1829 ; AVX1-NEXT: setb %al
1830 ; AVX1-NEXT: vzeroupper
1833 ; AVX2-LABEL: icmp1_v64i8_v64i1:
1835 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
1836 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
1837 ; AVX2-NEXT: vptest %ymm1, %ymm0
1838 ; AVX2-NEXT: setb %al
1839 ; AVX2-NEXT: vzeroupper
1842 ; AVX512-LABEL: icmp1_v64i8_v64i1:
1844 ; AVX512-NEXT: vpternlogd $255, %zmm1, %zmm1, %zmm1
1845 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
1846 ; AVX512-NEXT: kortestw %k0, %k0
1847 ; AVX512-NEXT: sete %al
1848 ; AVX512-NEXT: vzeroupper
1850 %a = icmp eq <64 x i8> %0, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
1851 %b = call i1 @llvm.vector.reduce.and.v64i1(<64 x i1> %a)
1855 define i8 @icmp1_v8i1(<8 x i8>) nounwind {
1856 ; SSE2-LABEL: icmp1_v8i1:
1858 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1859 ; SSE2-NEXT: psllw $15, %xmm0
1860 ; SSE2-NEXT: packsswb %xmm0, %xmm0
1861 ; SSE2-NEXT: pmovmskb %xmm0, %eax
1862 ; SSE2-NEXT: cmpb $-1, %al
1863 ; SSE2-NEXT: sete %al
1864 ; SSE2-NEXT: ret{{[l|q]}}
1866 ; SSE41-LABEL: icmp1_v8i1:
1868 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1869 ; SSE41-NEXT: psllw $15, %xmm0
1870 ; SSE41-NEXT: packsswb %xmm0, %xmm0
1871 ; SSE41-NEXT: pmovmskb %xmm0, %eax
1872 ; SSE41-NEXT: cmpb $-1, %al
1873 ; SSE41-NEXT: sete %al
1876 ; AVX1OR2-LABEL: icmp1_v8i1:
1878 ; AVX1OR2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1879 ; AVX1OR2-NEXT: vpsllw $15, %xmm0, %xmm0
1880 ; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
1881 ; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
1882 ; AVX1OR2-NEXT: cmpb $-1, %al
1883 ; AVX1OR2-NEXT: sete %al
1884 ; AVX1OR2-NEXT: retq
1886 ; AVX512F-LABEL: icmp1_v8i1:
1888 ; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0
1889 ; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0
1890 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0
1891 ; AVX512F-NEXT: kmovw %k0, %eax
1892 ; AVX512F-NEXT: cmpb $-1, %al
1893 ; AVX512F-NEXT: sete %al
1894 ; AVX512F-NEXT: vzeroupper
1895 ; AVX512F-NEXT: retq
1897 ; AVX512BW-LABEL: icmp1_v8i1:
1898 ; AVX512BW: # %bb.0:
1899 ; AVX512BW-NEXT: vpsllw $7, %xmm0, %xmm0
1900 ; AVX512BW-NEXT: vpmovb2m %zmm0, %k0
1901 ; AVX512BW-NEXT: kmovd %k0, %eax
1902 ; AVX512BW-NEXT: cmpb $-1, %al
1903 ; AVX512BW-NEXT: sete %al
1904 ; AVX512BW-NEXT: vzeroupper
1905 ; AVX512BW-NEXT: retq
1907 ; AVX512VL-LABEL: icmp1_v8i1:
1908 ; AVX512VL: # %bb.0:
1909 ; AVX512VL-NEXT: vpsllw $7, %xmm0, %xmm0
1910 ; AVX512VL-NEXT: vpmovb2m %xmm0, %k0
1911 ; AVX512VL-NEXT: kmovd %k0, %eax
1912 ; AVX512VL-NEXT: cmpb $-1, %al
1913 ; AVX512VL-NEXT: sete %al
1914 ; AVX512VL-NEXT: retq
1915 %a = trunc <8 x i8> %0 to <8 x i1>
1916 %b = icmp eq <8 x i1> %a, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
1917 %c = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %b)
1918 %d = zext i1 %c to i8
1926 define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) nounwind {
1927 ; SSE2-LABEL: icmp_v2i64_v2i1:
1929 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
1930 ; SSE2-NEXT: movmskps %xmm0, %eax
1931 ; SSE2-NEXT: xorl $15, %eax
1932 ; SSE2-NEXT: sete %al
1933 ; SSE2-NEXT: ret{{[l|q]}}
1935 ; SSE41-LABEL: icmp_v2i64_v2i1:
1937 ; SSE41-NEXT: pxor %xmm1, %xmm0
1938 ; SSE41-NEXT: ptest %xmm0, %xmm0
1939 ; SSE41-NEXT: sete %al
1942 ; AVX-LABEL: icmp_v2i64_v2i1:
1944 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
1945 ; AVX-NEXT: vptest %xmm0, %xmm0
1946 ; AVX-NEXT: sete %al
1948 %a = icmp eq <2 x i64> %0, %1
1949 %b = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %a)
1953 define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) nounwind {
1954 ; SSE2-LABEL: icmp_v4i32_v4i1:
1956 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
1957 ; SSE2-NEXT: movmskps %xmm0, %eax
1958 ; SSE2-NEXT: xorl $15, %eax
1959 ; SSE2-NEXT: sete %al
1960 ; SSE2-NEXT: ret{{[l|q]}}
1962 ; SSE41-LABEL: icmp_v4i32_v4i1:
1964 ; SSE41-NEXT: pxor %xmm1, %xmm0
1965 ; SSE41-NEXT: ptest %xmm0, %xmm0
1966 ; SSE41-NEXT: sete %al
1969 ; AVX-LABEL: icmp_v4i32_v4i1:
1971 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
1972 ; AVX-NEXT: vptest %xmm0, %xmm0
1973 ; AVX-NEXT: sete %al
1975 %a = icmp eq <4 x i32> %0, %1
1976 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
1980 define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) nounwind {
1981 ; SSE2-LABEL: icmp_v8i16_v8i1:
1983 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1984 ; SSE2-NEXT: pmovmskb %xmm0, %eax
1985 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1986 ; SSE2-NEXT: sete %al
1987 ; SSE2-NEXT: ret{{[l|q]}}
1989 ; SSE41-LABEL: icmp_v8i16_v8i1:
1991 ; SSE41-NEXT: pxor %xmm1, %xmm0
1992 ; SSE41-NEXT: ptest %xmm0, %xmm0
1993 ; SSE41-NEXT: sete %al
1996 ; AVX-LABEL: icmp_v8i16_v8i1:
1998 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
1999 ; AVX-NEXT: vptest %xmm0, %xmm0
2000 ; AVX-NEXT: sete %al
2002 %a = icmp eq <8 x i16> %0, %1
2003 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
2007 define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) nounwind {
2008 ; SSE2-LABEL: icmp_v16i8_v16i1:
2010 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
2011 ; SSE2-NEXT: pmovmskb %xmm0, %eax
2012 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2013 ; SSE2-NEXT: sete %al
2014 ; SSE2-NEXT: ret{{[l|q]}}
2016 ; SSE41-LABEL: icmp_v16i8_v16i1:
2018 ; SSE41-NEXT: pxor %xmm1, %xmm0
2019 ; SSE41-NEXT: ptest %xmm0, %xmm0
2020 ; SSE41-NEXT: sete %al
2023 ; AVX-LABEL: icmp_v16i8_v16i1:
2025 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
2026 ; AVX-NEXT: vptest %xmm0, %xmm0
2027 ; AVX-NEXT: sete %al
2029 %a = icmp eq <16 x i8> %0, %1
2030 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
2034 define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
2035 ; X86-SSE2-LABEL: icmp_v4i64_v4i1:
2036 ; X86-SSE2: # %bb.0:
2037 ; X86-SSE2-NEXT: pushl %ebp
2038 ; X86-SSE2-NEXT: movl %esp, %ebp
2039 ; X86-SSE2-NEXT: andl $-16, %esp
2040 ; X86-SSE2-NEXT: subl $16, %esp
2041 ; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm0
2042 ; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm1
2043 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
2044 ; X86-SSE2-NEXT: movmskps %xmm1, %eax
2045 ; X86-SSE2-NEXT: xorl $15, %eax
2046 ; X86-SSE2-NEXT: sete %al
2047 ; X86-SSE2-NEXT: movl %ebp, %esp
2048 ; X86-SSE2-NEXT: popl %ebp
2049 ; X86-SSE2-NEXT: retl
2051 ; X64-SSE2-LABEL: icmp_v4i64_v4i1:
2052 ; X64-SSE2: # %bb.0:
2053 ; X64-SSE2-NEXT: pcmpeqd %xmm3, %xmm1
2054 ; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm0
2055 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2056 ; X64-SSE2-NEXT: movmskps %xmm0, %eax
2057 ; X64-SSE2-NEXT: xorl $15, %eax
2058 ; X64-SSE2-NEXT: sete %al
2059 ; X64-SSE2-NEXT: retq
2061 ; SSE41-LABEL: icmp_v4i64_v4i1:
2063 ; SSE41-NEXT: pxor %xmm3, %xmm1
2064 ; SSE41-NEXT: pxor %xmm2, %xmm0
2065 ; SSE41-NEXT: por %xmm1, %xmm0
2066 ; SSE41-NEXT: ptest %xmm0, %xmm0
2067 ; SSE41-NEXT: sete %al
2070 ; AVX1-LABEL: icmp_v4i64_v4i1:
2072 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
2073 ; AVX1-NEXT: vptest %ymm0, %ymm0
2074 ; AVX1-NEXT: sete %al
2075 ; AVX1-NEXT: vzeroupper
2078 ; AVX2-LABEL: icmp_v4i64_v4i1:
2080 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
2081 ; AVX2-NEXT: vptest %ymm0, %ymm0
2082 ; AVX2-NEXT: sete %al
2083 ; AVX2-NEXT: vzeroupper
2086 ; AVX512-LABEL: icmp_v4i64_v4i1:
2088 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
2089 ; AVX512-NEXT: vptest %ymm0, %ymm0
2090 ; AVX512-NEXT: sete %al
2091 ; AVX512-NEXT: vzeroupper
2093 %a = icmp eq <4 x i64> %0, %1
2094 %b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
2098 define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
2099 ; X86-SSE2-LABEL: icmp_v8i32_v8i1:
2100 ; X86-SSE2: # %bb.0:
2101 ; X86-SSE2-NEXT: pushl %ebp
2102 ; X86-SSE2-NEXT: movl %esp, %ebp
2103 ; X86-SSE2-NEXT: andl $-16, %esp
2104 ; X86-SSE2-NEXT: subl $16, %esp
2105 ; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm0
2106 ; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm1
2107 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
2108 ; X86-SSE2-NEXT: movmskps %xmm1, %eax
2109 ; X86-SSE2-NEXT: xorl $15, %eax
2110 ; X86-SSE2-NEXT: sete %al
2111 ; X86-SSE2-NEXT: movl %ebp, %esp
2112 ; X86-SSE2-NEXT: popl %ebp
2113 ; X86-SSE2-NEXT: retl
2115 ; X64-SSE2-LABEL: icmp_v8i32_v8i1:
2116 ; X64-SSE2: # %bb.0:
2117 ; X64-SSE2-NEXT: pcmpeqd %xmm3, %xmm1
2118 ; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm0
2119 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2120 ; X64-SSE2-NEXT: movmskps %xmm0, %eax
2121 ; X64-SSE2-NEXT: xorl $15, %eax
2122 ; X64-SSE2-NEXT: sete %al
2123 ; X64-SSE2-NEXT: retq
2125 ; SSE41-LABEL: icmp_v8i32_v8i1:
2127 ; SSE41-NEXT: pxor %xmm3, %xmm1
2128 ; SSE41-NEXT: pxor %xmm2, %xmm0
2129 ; SSE41-NEXT: por %xmm1, %xmm0
2130 ; SSE41-NEXT: ptest %xmm0, %xmm0
2131 ; SSE41-NEXT: sete %al
2134 ; AVX1-LABEL: icmp_v8i32_v8i1:
2136 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
2137 ; AVX1-NEXT: vptest %ymm0, %ymm0
2138 ; AVX1-NEXT: sete %al
2139 ; AVX1-NEXT: vzeroupper
2142 ; AVX2-LABEL: icmp_v8i32_v8i1:
2144 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
2145 ; AVX2-NEXT: vptest %ymm0, %ymm0
2146 ; AVX2-NEXT: sete %al
2147 ; AVX2-NEXT: vzeroupper
2150 ; AVX512-LABEL: icmp_v8i32_v8i1:
2152 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
2153 ; AVX512-NEXT: vptest %ymm0, %ymm0
2154 ; AVX512-NEXT: sete %al
2155 ; AVX512-NEXT: vzeroupper
2157 %a = icmp eq <8 x i32> %0, %1
2158 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
2162 define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
2163 ; X86-SSE2-LABEL: icmp_v16i16_v16i1:
2164 ; X86-SSE2: # %bb.0:
2165 ; X86-SSE2-NEXT: pushl %ebp
2166 ; X86-SSE2-NEXT: movl %esp, %ebp
2167 ; X86-SSE2-NEXT: andl $-16, %esp
2168 ; X86-SSE2-NEXT: subl $16, %esp
2169 ; X86-SSE2-NEXT: pcmpeqb %xmm2, %xmm0
2170 ; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm1
2171 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
2172 ; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
2173 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2174 ; X86-SSE2-NEXT: sete %al
2175 ; X86-SSE2-NEXT: movl %ebp, %esp
2176 ; X86-SSE2-NEXT: popl %ebp
2177 ; X86-SSE2-NEXT: retl
2179 ; X64-SSE2-LABEL: icmp_v16i16_v16i1:
2180 ; X64-SSE2: # %bb.0:
2181 ; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm1
2182 ; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm0
2183 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2184 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
2185 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2186 ; X64-SSE2-NEXT: sete %al
2187 ; X64-SSE2-NEXT: retq
2189 ; SSE41-LABEL: icmp_v16i16_v16i1:
2191 ; SSE41-NEXT: pxor %xmm3, %xmm1
2192 ; SSE41-NEXT: pxor %xmm2, %xmm0
2193 ; SSE41-NEXT: por %xmm1, %xmm0
2194 ; SSE41-NEXT: ptest %xmm0, %xmm0
2195 ; SSE41-NEXT: sete %al
2198 ; AVX1-LABEL: icmp_v16i16_v16i1:
2200 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
2201 ; AVX1-NEXT: vptest %ymm0, %ymm0
2202 ; AVX1-NEXT: sete %al
2203 ; AVX1-NEXT: vzeroupper
2206 ; AVX2-LABEL: icmp_v16i16_v16i1:
2208 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
2209 ; AVX2-NEXT: vptest %ymm0, %ymm0
2210 ; AVX2-NEXT: sete %al
2211 ; AVX2-NEXT: vzeroupper
2214 ; AVX512-LABEL: icmp_v16i16_v16i1:
2216 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
2217 ; AVX512-NEXT: vptest %ymm0, %ymm0
2218 ; AVX512-NEXT: sete %al
2219 ; AVX512-NEXT: vzeroupper
2221 %a = icmp eq <16 x i16> %0, %1
2222 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
2226 define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
2227 ; X86-SSE2-LABEL: icmp_v32i8_v32i1:
2228 ; X86-SSE2: # %bb.0:
2229 ; X86-SSE2-NEXT: pushl %ebp
2230 ; X86-SSE2-NEXT: movl %esp, %ebp
2231 ; X86-SSE2-NEXT: andl $-16, %esp
2232 ; X86-SSE2-NEXT: subl $16, %esp
2233 ; X86-SSE2-NEXT: pcmpeqb %xmm2, %xmm0
2234 ; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm1
2235 ; X86-SSE2-NEXT: pand %xmm0, %xmm1
2236 ; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
2237 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2238 ; X86-SSE2-NEXT: sete %al
2239 ; X86-SSE2-NEXT: movl %ebp, %esp
2240 ; X86-SSE2-NEXT: popl %ebp
2241 ; X86-SSE2-NEXT: retl
2243 ; X64-SSE2-LABEL: icmp_v32i8_v32i1:
2244 ; X64-SSE2: # %bb.0:
2245 ; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm1
2246 ; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm0
2247 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2248 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
2249 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2250 ; X64-SSE2-NEXT: sete %al
2251 ; X64-SSE2-NEXT: retq
2253 ; SSE41-LABEL: icmp_v32i8_v32i1:
2255 ; SSE41-NEXT: pxor %xmm3, %xmm1
2256 ; SSE41-NEXT: pxor %xmm2, %xmm0
2257 ; SSE41-NEXT: por %xmm1, %xmm0
2258 ; SSE41-NEXT: ptest %xmm0, %xmm0
2259 ; SSE41-NEXT: sete %al
2262 ; AVX1-LABEL: icmp_v32i8_v32i1:
2264 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
2265 ; AVX1-NEXT: vptest %ymm0, %ymm0
2266 ; AVX1-NEXT: sete %al
2267 ; AVX1-NEXT: vzeroupper
2270 ; AVX2-LABEL: icmp_v32i8_v32i1:
2272 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
2273 ; AVX2-NEXT: vptest %ymm0, %ymm0
2274 ; AVX2-NEXT: sete %al
2275 ; AVX2-NEXT: vzeroupper
2278 ; AVX512-LABEL: icmp_v32i8_v32i1:
2280 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
2281 ; AVX512-NEXT: vptest %ymm0, %ymm0
2282 ; AVX512-NEXT: sete %al
2283 ; AVX512-NEXT: vzeroupper
2285 %a = icmp eq <32 x i8> %0, %1
2286 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
2290 define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {
2291 ; X86-SSE2-LABEL: icmp_v8i64_v8i1:
2292 ; X86-SSE2: # %bb.0:
2293 ; X86-SSE2-NEXT: pushl %ebp
2294 ; X86-SSE2-NEXT: movl %esp, %ebp
2295 ; X86-SSE2-NEXT: andl $-16, %esp
2296 ; X86-SSE2-NEXT: subl $16, %esp
2297 ; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
2298 ; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm3
2299 ; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm1
2300 ; X86-SSE2-NEXT: pand %xmm3, %xmm1
2301 ; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm2
2302 ; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm0
2303 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
2304 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
2305 ; X86-SSE2-NEXT: movmskps %xmm0, %eax
2306 ; X86-SSE2-NEXT: xorl $15, %eax
2307 ; X86-SSE2-NEXT: sete %al
2308 ; X86-SSE2-NEXT: movl %ebp, %esp
2309 ; X86-SSE2-NEXT: popl %ebp
2310 ; X86-SSE2-NEXT: retl
2312 ; X64-SSE2-LABEL: icmp_v8i64_v8i1:
2313 ; X64-SSE2: # %bb.0:
2314 ; X64-SSE2-NEXT: pcmpeqd %xmm7, %xmm3
2315 ; X64-SSE2-NEXT: pcmpeqd %xmm5, %xmm1
2316 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
2317 ; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm2
2318 ; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm0
2319 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
2320 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2321 ; X64-SSE2-NEXT: movmskps %xmm0, %eax
2322 ; X64-SSE2-NEXT: xorl $15, %eax
2323 ; X64-SSE2-NEXT: sete %al
2324 ; X64-SSE2-NEXT: retq
2326 ; SSE41-LABEL: icmp_v8i64_v8i1:
2328 ; SSE41-NEXT: pxor %xmm7, %xmm3
2329 ; SSE41-NEXT: pxor %xmm5, %xmm1
2330 ; SSE41-NEXT: por %xmm3, %xmm1
2331 ; SSE41-NEXT: pxor %xmm6, %xmm2
2332 ; SSE41-NEXT: pxor %xmm4, %xmm0
2333 ; SSE41-NEXT: por %xmm2, %xmm0
2334 ; SSE41-NEXT: por %xmm1, %xmm0
2335 ; SSE41-NEXT: ptest %xmm0, %xmm0
2336 ; SSE41-NEXT: sete %al
2339 ; AVX1-LABEL: icmp_v8i64_v8i1:
2341 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
2342 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
2343 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2344 ; AVX1-NEXT: vptest %ymm0, %ymm0
2345 ; AVX1-NEXT: sete %al
2346 ; AVX1-NEXT: vzeroupper
2349 ; AVX2-LABEL: icmp_v8i64_v8i1:
2351 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
2352 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
2353 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2354 ; AVX2-NEXT: vptest %ymm0, %ymm0
2355 ; AVX2-NEXT: sete %al
2356 ; AVX2-NEXT: vzeroupper
2359 ; AVX512-LABEL: icmp_v8i64_v8i1:
2361 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
2362 ; AVX512-NEXT: kortestw %k0, %k0
2363 ; AVX512-NEXT: sete %al
2364 ; AVX512-NEXT: vzeroupper
2366 %a = icmp eq <8 x i64> %0, %1
2367 %b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
2371 define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
2372 ; X86-SSE2-LABEL: icmp_v16i32_v16i1:
2373 ; X86-SSE2: # %bb.0:
2374 ; X86-SSE2-NEXT: pushl %ebp
2375 ; X86-SSE2-NEXT: movl %esp, %ebp
2376 ; X86-SSE2-NEXT: andl $-16, %esp
2377 ; X86-SSE2-NEXT: subl $16, %esp
2378 ; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
2379 ; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm3
2380 ; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm1
2381 ; X86-SSE2-NEXT: pand %xmm3, %xmm1
2382 ; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm2
2383 ; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm0
2384 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
2385 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
2386 ; X86-SSE2-NEXT: movmskps %xmm0, %eax
2387 ; X86-SSE2-NEXT: xorl $15, %eax
2388 ; X86-SSE2-NEXT: sete %al
2389 ; X86-SSE2-NEXT: movl %ebp, %esp
2390 ; X86-SSE2-NEXT: popl %ebp
2391 ; X86-SSE2-NEXT: retl
2393 ; X64-SSE2-LABEL: icmp_v16i32_v16i1:
2394 ; X64-SSE2: # %bb.0:
2395 ; X64-SSE2-NEXT: pcmpeqd %xmm7, %xmm3
2396 ; X64-SSE2-NEXT: pcmpeqd %xmm5, %xmm1
2397 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
2398 ; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm2
2399 ; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm0
2400 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
2401 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2402 ; X64-SSE2-NEXT: movmskps %xmm0, %eax
2403 ; X64-SSE2-NEXT: xorl $15, %eax
2404 ; X64-SSE2-NEXT: sete %al
2405 ; X64-SSE2-NEXT: retq
2407 ; SSE41-LABEL: icmp_v16i32_v16i1:
2409 ; SSE41-NEXT: pxor %xmm7, %xmm3
2410 ; SSE41-NEXT: pxor %xmm5, %xmm1
2411 ; SSE41-NEXT: por %xmm3, %xmm1
2412 ; SSE41-NEXT: pxor %xmm6, %xmm2
2413 ; SSE41-NEXT: pxor %xmm4, %xmm0
2414 ; SSE41-NEXT: por %xmm2, %xmm0
2415 ; SSE41-NEXT: por %xmm1, %xmm0
2416 ; SSE41-NEXT: ptest %xmm0, %xmm0
2417 ; SSE41-NEXT: sete %al
2420 ; AVX1-LABEL: icmp_v16i32_v16i1:
2422 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
2423 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
2424 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2425 ; AVX1-NEXT: vptest %ymm0, %ymm0
2426 ; AVX1-NEXT: sete %al
2427 ; AVX1-NEXT: vzeroupper
2430 ; AVX2-LABEL: icmp_v16i32_v16i1:
2432 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
2433 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
2434 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2435 ; AVX2-NEXT: vptest %ymm0, %ymm0
2436 ; AVX2-NEXT: sete %al
2437 ; AVX2-NEXT: vzeroupper
2440 ; AVX512-LABEL: icmp_v16i32_v16i1:
2442 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
2443 ; AVX512-NEXT: kortestw %k0, %k0
2444 ; AVX512-NEXT: sete %al
2445 ; AVX512-NEXT: vzeroupper
2447 %a = icmp eq <16 x i32> %0, %1
2448 %b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
2452 define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
2453 ; X86-SSE2-LABEL: icmp_v32i16_v32i1:
2454 ; X86-SSE2: # %bb.0:
2455 ; X86-SSE2-NEXT: pushl %ebp
2456 ; X86-SSE2-NEXT: movl %esp, %ebp
2457 ; X86-SSE2-NEXT: andl $-16, %esp
2458 ; X86-SSE2-NEXT: subl $16, %esp
2459 ; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
2460 ; X86-SSE2-NEXT: pcmpeqb 72(%ebp), %xmm3
2461 ; X86-SSE2-NEXT: pcmpeqb 40(%ebp), %xmm1
2462 ; X86-SSE2-NEXT: pand %xmm3, %xmm1
2463 ; X86-SSE2-NEXT: pcmpeqb 56(%ebp), %xmm2
2464 ; X86-SSE2-NEXT: pcmpeqb 24(%ebp), %xmm0
2465 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
2466 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
2467 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
2468 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2469 ; X86-SSE2-NEXT: sete %al
2470 ; X86-SSE2-NEXT: movl %ebp, %esp
2471 ; X86-SSE2-NEXT: popl %ebp
2472 ; X86-SSE2-NEXT: retl
2474 ; X64-SSE2-LABEL: icmp_v32i16_v32i1:
2475 ; X64-SSE2: # %bb.0:
2476 ; X64-SSE2-NEXT: pcmpeqb %xmm7, %xmm3
2477 ; X64-SSE2-NEXT: pcmpeqb %xmm5, %xmm1
2478 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
2479 ; X64-SSE2-NEXT: pcmpeqb %xmm6, %xmm2
2480 ; X64-SSE2-NEXT: pcmpeqb %xmm4, %xmm0
2481 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
2482 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2483 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
2484 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2485 ; X64-SSE2-NEXT: sete %al
2486 ; X64-SSE2-NEXT: retq
2488 ; SSE41-LABEL: icmp_v32i16_v32i1:
2490 ; SSE41-NEXT: pxor %xmm7, %xmm3
2491 ; SSE41-NEXT: pxor %xmm5, %xmm1
2492 ; SSE41-NEXT: por %xmm3, %xmm1
2493 ; SSE41-NEXT: pxor %xmm6, %xmm2
2494 ; SSE41-NEXT: pxor %xmm4, %xmm0
2495 ; SSE41-NEXT: por %xmm2, %xmm0
2496 ; SSE41-NEXT: por %xmm1, %xmm0
2497 ; SSE41-NEXT: ptest %xmm0, %xmm0
2498 ; SSE41-NEXT: sete %al
2501 ; AVX1-LABEL: icmp_v32i16_v32i1:
2503 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
2504 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
2505 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2506 ; AVX1-NEXT: vptest %ymm0, %ymm0
2507 ; AVX1-NEXT: sete %al
2508 ; AVX1-NEXT: vzeroupper
2511 ; AVX2-LABEL: icmp_v32i16_v32i1:
2513 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
2514 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
2515 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2516 ; AVX2-NEXT: vptest %ymm0, %ymm0
2517 ; AVX2-NEXT: sete %al
2518 ; AVX2-NEXT: vzeroupper
2521 ; AVX512-LABEL: icmp_v32i16_v32i1:
2523 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
2524 ; AVX512-NEXT: kortestw %k0, %k0
2525 ; AVX512-NEXT: sete %al
2526 ; AVX512-NEXT: vzeroupper
2528 %a = icmp eq <32 x i16> %0, %1
2529 %b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
2533 define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {
2534 ; X86-SSE2-LABEL: icmp_v64i8_v64i1:
2535 ; X86-SSE2: # %bb.0:
2536 ; X86-SSE2-NEXT: pushl %ebp
2537 ; X86-SSE2-NEXT: movl %esp, %ebp
2538 ; X86-SSE2-NEXT: andl $-16, %esp
2539 ; X86-SSE2-NEXT: subl $16, %esp
2540 ; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
2541 ; X86-SSE2-NEXT: pcmpeqb 72(%ebp), %xmm3
2542 ; X86-SSE2-NEXT: pcmpeqb 40(%ebp), %xmm1
2543 ; X86-SSE2-NEXT: pand %xmm3, %xmm1
2544 ; X86-SSE2-NEXT: pcmpeqb 56(%ebp), %xmm2
2545 ; X86-SSE2-NEXT: pcmpeqb 24(%ebp), %xmm0
2546 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
2547 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
2548 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
2549 ; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2550 ; X86-SSE2-NEXT: sete %al
2551 ; X86-SSE2-NEXT: movl %ebp, %esp
2552 ; X86-SSE2-NEXT: popl %ebp
2553 ; X86-SSE2-NEXT: retl
2555 ; X64-SSE2-LABEL: icmp_v64i8_v64i1:
2556 ; X64-SSE2: # %bb.0:
2557 ; X64-SSE2-NEXT: pcmpeqb %xmm7, %xmm3
2558 ; X64-SSE2-NEXT: pcmpeqb %xmm5, %xmm1
2559 ; X64-SSE2-NEXT: pand %xmm3, %xmm1
2560 ; X64-SSE2-NEXT: pcmpeqb %xmm6, %xmm2
2561 ; X64-SSE2-NEXT: pcmpeqb %xmm4, %xmm0
2562 ; X64-SSE2-NEXT: pand %xmm2, %xmm0
2563 ; X64-SSE2-NEXT: pand %xmm1, %xmm0
2564 ; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
2565 ; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2566 ; X64-SSE2-NEXT: sete %al
2567 ; X64-SSE2-NEXT: retq
2569 ; SSE41-LABEL: icmp_v64i8_v64i1:
2571 ; SSE41-NEXT: pxor %xmm7, %xmm3
2572 ; SSE41-NEXT: pxor %xmm5, %xmm1
2573 ; SSE41-NEXT: por %xmm3, %xmm1
2574 ; SSE41-NEXT: pxor %xmm6, %xmm2
2575 ; SSE41-NEXT: pxor %xmm4, %xmm0
2576 ; SSE41-NEXT: por %xmm2, %xmm0
2577 ; SSE41-NEXT: por %xmm1, %xmm0
2578 ; SSE41-NEXT: ptest %xmm0, %xmm0
2579 ; SSE41-NEXT: sete %al
2582 ; AVX1-LABEL: icmp_v64i8_v64i1:
2584 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
2585 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
2586 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2587 ; AVX1-NEXT: vptest %ymm0, %ymm0
2588 ; AVX1-NEXT: sete %al
2589 ; AVX1-NEXT: vzeroupper
2592 ; AVX2-LABEL: icmp_v64i8_v64i1:
2594 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
2595 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
2596 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2597 ; AVX2-NEXT: vptest %ymm0, %ymm0
2598 ; AVX2-NEXT: sete %al
2599 ; AVX2-NEXT: vzeroupper
2602 ; AVX512-LABEL: icmp_v64i8_v64i1:
2604 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
2605 ; AVX512-NEXT: kortestw %k0, %k0
2606 ; AVX512-NEXT: sete %al
2607 ; AVX512-NEXT: vzeroupper
2609 %a = icmp eq <64 x i8> %0, %1
2610 %b = call i1 @llvm.vector.reduce.and.v64i1(<64 x i1> %a)
2614 declare i1 @llvm.vector.reduce.and.v2i1(<2 x i1>)
2615 declare i1 @llvm.vector.reduce.and.v4i1(<4 x i1>)
2616 declare i1 @llvm.vector.reduce.and.v8i1(<8 x i1>)
2617 declare i1 @llvm.vector.reduce.and.v16i1(<16 x i1>)
2618 declare i1 @llvm.vector.reduce.and.v32i1(<32 x i1>)
2619 declare i1 @llvm.vector.reduce.and.v64i1(<64 x i1>)
2620 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: