@@ -372,6 +372,94 @@ define i32 @ptestz_v2i64_concat(<4 x i64> %c, <4 x i64> %d, i32 %a, i32 %b) {
372
372
ret i32 %t9
373
373
}
374
374
375
+ ; PR123456 - all_of(x == 0)
376
+ define i1 @ptestc_v4i32_eq0 (<4 x i32 > %a0 ) {
377
+ ; SSE-LABEL: ptestc_v4i32_eq0:
378
+ ; SSE: # %bb.0:
379
+ ; SSE-NEXT: pxor %xmm1, %xmm1
380
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm1
381
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
382
+ ; SSE-NEXT: ptest %xmm0, %xmm1
383
+ ; SSE-NEXT: setb %al
384
+ ; SSE-NEXT: retq
385
+ ;
386
+ ; AVX-LABEL: ptestc_v4i32_eq0:
387
+ ; AVX: # %bb.0:
388
+ ; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
389
+ ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
390
+ ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
391
+ ; AVX-NEXT: vptest %xmm1, %xmm0
392
+ ; AVX-NEXT: setb %al
393
+ ; AVX-NEXT: retq
394
+ %icmp = icmp eq <4 x i32 > %a0 , zeroinitializer
395
+ %sext = sext <4 x i1 > %icmp to <4 x i32 >
396
+ %bc = bitcast <4 x i32 > %sext to <2 x i64 >
397
+ %test = tail call noundef i32 @llvm.x86.sse41.ptestc (<2 x i64 > %bc , <2 x i64 > splat (i64 -1 ))
398
+ %res = icmp ne i32 %test , 0
399
+ ret i1 %res
400
+ }
401
+
402
+ ; PR123456 - all_of((a & b) == 0)
403
+ define i1 @ptestc_v4i32_and_eq0 (<4 x i32 > %a0 , <4 x i32 > %a1 ) {
404
+ ; SSE-LABEL: ptestc_v4i32_and_eq0:
405
+ ; SSE: # %bb.0:
406
+ ; SSE-NEXT: pand %xmm1, %xmm0
407
+ ; SSE-NEXT: pxor %xmm1, %xmm1
408
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm1
409
+ ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
410
+ ; SSE-NEXT: ptest %xmm0, %xmm1
411
+ ; SSE-NEXT: setb %al
412
+ ; SSE-NEXT: retq
413
+ ;
414
+ ; AVX-LABEL: ptestc_v4i32_and_eq0:
415
+ ; AVX: # %bb.0:
416
+ ; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0
417
+ ; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
418
+ ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
419
+ ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
420
+ ; AVX-NEXT: vptest %xmm1, %xmm0
421
+ ; AVX-NEXT: setb %al
422
+ ; AVX-NEXT: retq
423
+ %and = and <4 x i32 > %a1 , %a0
424
+ %icmp = icmp eq <4 x i32 > %and , zeroinitializer
425
+ %sext = sext <4 x i1 > %icmp to <4 x i32 >
426
+ %bc = bitcast <4 x i32 > %sext to <2 x i64 >
427
+ %test = tail call noundef i32 @llvm.x86.sse41.ptestc (<2 x i64 > %bc , <2 x i64 > splat (i64 -1 ))
428
+ %res = icmp ne i32 %test , 0
429
+ ret i1 %res
430
+ }
431
+
432
+ ; PR123456 - !all_of((a & ~b) == 0)
433
+ define i1 @ptestc_v4i32_andnot_eq0 (<4 x i32 > %a0 , <4 x i32 > %a1 ) {
434
+ ; SSE-LABEL: ptestc_v4i32_andnot_eq0:
435
+ ; SSE: # %bb.0:
436
+ ; SSE-NEXT: pandn %xmm0, %xmm1
437
+ ; SSE-NEXT: pxor %xmm0, %xmm0
438
+ ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
439
+ ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
440
+ ; SSE-NEXT: ptest %xmm1, %xmm0
441
+ ; SSE-NEXT: setae %al
442
+ ; SSE-NEXT: retq
443
+ ;
444
+ ; AVX-LABEL: ptestc_v4i32_andnot_eq0:
445
+ ; AVX: # %bb.0:
446
+ ; AVX-NEXT: vpandn %xmm0, %xmm1, %xmm0
447
+ ; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
448
+ ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
449
+ ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
450
+ ; AVX-NEXT: vptest %xmm1, %xmm0
451
+ ; AVX-NEXT: setae %al
452
+ ; AVX-NEXT: retq
453
+ %not = xor <4 x i32 > %a1 , splat (i32 -1 )
454
+ %and = and <4 x i32 > %a0 , %not
455
+ %icmp = icmp eq <4 x i32 > %and , zeroinitializer
456
+ %sext = sext <4 x i1 > %icmp to <4 x i32 >
457
+ %bc = bitcast <4 x i32 > %sext to <2 x i64 >
458
+ %test = tail call noundef i32 @llvm.x86.sse41.ptestc (<2 x i64 > %bc , <2 x i64 > splat (i64 -1 ))
459
+ %res = icmp eq i32 %test , 0
460
+ ret i1 %res
461
+ }
462
+
375
463
; FIXME: Foldable to ptest(xor(%0,%1),xor(%0,%1))
376
464
define i1 @PR38788 (<4 x i32 > %0 , <4 x i32 > %1 ) {
377
465
; SSE-LABEL: PR38788:
0 commit comments