Skip to content

Commit 07adb6a

Browse files
committedApr 7, 2019
[X86][SSE] SimplifyDemandedBitsForTargetNode - Add initial PACKSS support
In the case where we only want the sign bit (e.g. when using PACKSS truncation of comparison results for MOVMSK) then we can just demand the sign bit of the source operands. This makes use of the fact that PACKSS saturates out of range values to the min/max int values - so the sign bit is always preserved. Differential Revision: https://reviews.llvm.org/D60333 llvm-svn: 357859
1 parent 47a7662 commit 07adb6a

File tree

6 files changed

+67
-187
lines changed

6 files changed

+67
-187
lines changed
 

‎llvm/lib/Target/X86/X86ISelLowering.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -33508,6 +33508,25 @@ bool X86TargetLowering::SimplifyDemandedBitsForTargetNode(
3350833508
}
3350933509
break;
3351033510
}
33511+
case X86ISD::PACKSS:
33512+
// PACKSS saturates to MIN/MAX integer values. So if we just want the
33513+
// sign bit then we can just ask for the source operands sign bit.
33514+
// TODO - add known bits handling.
33515+
if (OriginalDemandedBits.isSignMask()) {
33516+
APInt DemandedLHS, DemandedRHS;
33517+
getPackDemandedElts(VT, OriginalDemandedElts, DemandedLHS, DemandedRHS);
33518+
33519+
KnownBits KnownLHS, KnownRHS;
33520+
APInt SignMask = APInt::getSignMask(BitWidth * 2);
33521+
if (SimplifyDemandedBits(Op.getOperand(0), SignMask, DemandedLHS,
33522+
KnownLHS, TLO, Depth + 1))
33523+
return true;
33524+
if (SimplifyDemandedBits(Op.getOperand(1), SignMask, DemandedRHS,
33525+
KnownRHS, TLO, Depth + 1))
33526+
return true;
33527+
}
33528+
// TODO - add general PACKSS/PACKUS SimplifyDemandedBits support.
33529+
break;
3351133530
case X86ISD::PCMPGT:
3351233531
// icmp sgt(0, R) == ashr(R, BitWidth-1).
3351333532
// iff we only need the sign bit then we can use R directly.

‎llvm/test/CodeGen/X86/bitcast-and-setcc-512.ll

-3
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ define i8 @v8i64(<8 x i64> %a, <8 x i64> %b, <8 x i64> %c, <8 x i64> %d) {
7474
; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
7575
; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
7676
; AVX1-NEXT: vpsllw $15, %xmm0, %xmm0
77-
; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0
7877
; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
7978
; AVX1-NEXT: vpmovmskb %xmm0, %eax
8079
; AVX1-NEXT: # kill: def $al killed $al killed $eax
@@ -99,7 +98,6 @@ define i8 @v8i64(<8 x i64> %a, <8 x i64> %b, <8 x i64> %c, <8 x i64> %d) {
9998
; AVX2-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
10099
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
101100
; AVX2-NEXT: vpsllw $15, %xmm0, %xmm0
102-
; AVX2-NEXT: vpsraw $15, %xmm0, %xmm0
103101
; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
104102
; AVX2-NEXT: vpmovmskb %xmm0, %eax
105103
; AVX2-NEXT: # kill: def $al killed $al killed $eax
@@ -191,7 +189,6 @@ define i8 @v8f64(<8 x double> %a, <8 x double> %b, <8 x double> %c, <8 x double>
191189
; AVX12-NEXT: vpackssdw %xmm1, %xmm2, %xmm1
192190
; AVX12-NEXT: vpand %xmm1, %xmm0, %xmm0
193191
; AVX12-NEXT: vpsllw $15, %xmm0, %xmm0
194-
; AVX12-NEXT: vpsraw $15, %xmm0, %xmm0
195192
; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
196193
; AVX12-NEXT: vpmovmskb %xmm0, %eax
197194
; AVX12-NEXT: # kill: def $al killed $al killed $eax

‎llvm/test/CodeGen/X86/bitcast-setcc-128.ll

+2-6
Original file line numberDiff line numberDiff line change
@@ -765,17 +765,13 @@ define void @bitcast_16i8_store(i16* %p, <16 x i8> %a0) {
765765
define void @bitcast_8i16_store(i8* %p, <8 x i16> %a0) {
766766
; SSE2-SSSE3-LABEL: bitcast_8i16_store:
767767
; SSE2-SSSE3: # %bb.0:
768-
; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm1
769-
; SSE2-SSSE3-NEXT: pcmpgtw %xmm0, %xmm1
770-
; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm1
771-
; SSE2-SSSE3-NEXT: pmovmskb %xmm1, %eax
768+
; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0
769+
; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax
772770
; SSE2-SSSE3-NEXT: movb %al, (%rdi)
773771
; SSE2-SSSE3-NEXT: retq
774772
;
775773
; AVX12-LABEL: bitcast_8i16_store:
776774
; AVX12: # %bb.0:
777-
; AVX12-NEXT: vpxor %xmm1, %xmm1, %xmm1
778-
; AVX12-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
779775
; AVX12-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
780776
; AVX12-NEXT: vpmovmskb %xmm0, %eax
781777
; AVX12-NEXT: movb %al, (%rdi)

‎llvm/test/CodeGen/X86/bitcast-setcc-256.ll

+5-16
Original file line numberDiff line numberDiff line change
@@ -359,21 +359,14 @@ define void @bitcast_32i8_store(i32* %p, <32 x i8> %a0) {
359359
define void @bitcast_16i16_store(i16* %p, <16 x i16> %a0) {
360360
; SSE2-SSSE3-LABEL: bitcast_16i16_store:
361361
; SSE2-SSSE3: # %bb.0:
362-
; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm2
363-
; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm3
364-
; SSE2-SSSE3-NEXT: pcmpgtw %xmm1, %xmm3
365-
; SSE2-SSSE3-NEXT: pcmpgtw %xmm0, %xmm2
366-
; SSE2-SSSE3-NEXT: packsswb %xmm3, %xmm2
367-
; SSE2-SSSE3-NEXT: pmovmskb %xmm2, %eax
362+
; SSE2-SSSE3-NEXT: packsswb %xmm1, %xmm0
363+
; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax
368364
; SSE2-SSSE3-NEXT: movw %ax, (%rdi)
369365
; SSE2-SSSE3-NEXT: retq
370366
;
371367
; AVX1-LABEL: bitcast_16i16_store:
372368
; AVX1: # %bb.0:
373369
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
374-
; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
375-
; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm1
376-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm0
377370
; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
378371
; AVX1-NEXT: vpmovmskb %xmm0, %eax
379372
; AVX1-NEXT: movw %ax, (%rdi)
@@ -416,13 +409,9 @@ define void @bitcast_16i16_store(i16* %p, <16 x i16> %a0) {
416409
define void @bitcast_8i32_store(i8* %p, <8 x i32> %a0) {
417410
; SSE2-SSSE3-LABEL: bitcast_8i32_store:
418411
; SSE2-SSSE3: # %bb.0:
419-
; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm2
420-
; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm3
421-
; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
422-
; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
423-
; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm2
424-
; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm2
425-
; SSE2-SSSE3-NEXT: pmovmskb %xmm2, %eax
412+
; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0
413+
; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0
414+
; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax
426415
; SSE2-SSSE3-NEXT: movb %al, (%rdi)
427416
; SSE2-SSSE3-NEXT: retq
428417
;

‎llvm/test/CodeGen/X86/bitcast-setcc-512.ll

+8-37
Original file line numberDiff line numberDiff line change
@@ -481,18 +481,10 @@ define void @bitcast_64i8_store(i64* %p, <64 x i8> %a0) {
481481
define void @bitcast_32i16_store(i32* %p, <32 x i16> %a0) {
482482
; SSE-LABEL: bitcast_32i16_store:
483483
; SSE: # %bb.0:
484-
; SSE-NEXT: pxor %xmm4, %xmm4
485-
; SSE-NEXT: pxor %xmm5, %xmm5
486-
; SSE-NEXT: pcmpgtw %xmm1, %xmm5
487-
; SSE-NEXT: pxor %xmm1, %xmm1
488-
; SSE-NEXT: pcmpgtw %xmm0, %xmm1
489-
; SSE-NEXT: packsswb %xmm5, %xmm1
490-
; SSE-NEXT: pmovmskb %xmm1, %eax
491-
; SSE-NEXT: pxor %xmm0, %xmm0
492-
; SSE-NEXT: pcmpgtw %xmm3, %xmm0
493-
; SSE-NEXT: pcmpgtw %xmm2, %xmm4
494-
; SSE-NEXT: packsswb %xmm0, %xmm4
495-
; SSE-NEXT: pmovmskb %xmm4, %ecx
484+
; SSE-NEXT: packsswb %xmm1, %xmm0
485+
; SSE-NEXT: pmovmskb %xmm0, %eax
486+
; SSE-NEXT: packsswb %xmm3, %xmm2
487+
; SSE-NEXT: pmovmskb %xmm2, %ecx
496488
; SSE-NEXT: shll $16, %ecx
497489
; SSE-NEXT: orl %eax, %ecx
498490
; SSE-NEXT: movl %ecx, (%rdi)
@@ -501,14 +493,9 @@ define void @bitcast_32i16_store(i32* %p, <32 x i16> %a0) {
501493
; AVX1-LABEL: bitcast_32i16_store:
502494
; AVX1: # %bb.0:
503495
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
504-
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
505-
; AVX1-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm2
506-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm3, %xmm0
507496
; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0
508497
; AVX1-NEXT: vpmovmskb %xmm0, %eax
509498
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
510-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm3, %xmm0
511-
; AVX1-NEXT: vpcmpgtw %xmm1, %xmm3, %xmm1
512499
; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm0
513500
; AVX1-NEXT: vpmovmskb %xmm0, %ecx
514501
; AVX1-NEXT: shll $16, %ecx
@@ -519,9 +506,6 @@ define void @bitcast_32i16_store(i32* %p, <32 x i16> %a0) {
519506
;
520507
; AVX2-LABEL: bitcast_32i16_store:
521508
; AVX2: # %bb.0:
522-
; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
523-
; AVX2-NEXT: vpcmpgtw %ymm1, %ymm2, %ymm1
524-
; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm0
525509
; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
526510
; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
527511
; AVX2-NEXT: vpmovmskb %ymm0, %eax
@@ -558,31 +542,18 @@ define void @bitcast_32i16_store(i32* %p, <32 x i16> %a0) {
558542
define void @bitcast_16i32_store(i16* %p, <16 x i32> %a0) {
559543
; SSE-LABEL: bitcast_16i32_store:
560544
; SSE: # %bb.0:
561-
; SSE-NEXT: pxor %xmm4, %xmm4
562-
; SSE-NEXT: pxor %xmm5, %xmm5
563-
; SSE-NEXT: pcmpgtd %xmm3, %xmm5
564-
; SSE-NEXT: pxor %xmm3, %xmm3
565-
; SSE-NEXT: pcmpgtd %xmm2, %xmm3
566-
; SSE-NEXT: packssdw %xmm5, %xmm3
567-
; SSE-NEXT: pxor %xmm2, %xmm2
568-
; SSE-NEXT: pcmpgtd %xmm1, %xmm2
569-
; SSE-NEXT: pcmpgtd %xmm0, %xmm4
570-
; SSE-NEXT: packssdw %xmm2, %xmm4
571-
; SSE-NEXT: packsswb %xmm3, %xmm4
572-
; SSE-NEXT: pmovmskb %xmm4, %eax
545+
; SSE-NEXT: packssdw %xmm3, %xmm2
546+
; SSE-NEXT: packssdw %xmm1, %xmm0
547+
; SSE-NEXT: packsswb %xmm2, %xmm0
548+
; SSE-NEXT: pmovmskb %xmm0, %eax
573549
; SSE-NEXT: movw %ax, (%rdi)
574550
; SSE-NEXT: retq
575551
;
576552
; AVX1-LABEL: bitcast_16i32_store:
577553
; AVX1: # %bb.0:
578554
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
579-
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
580-
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
581-
; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm1
582555
; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
583556
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
584-
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
585-
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm0
586557
; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
587558
; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
588559
; AVX1-NEXT: vpmovmskb %xmm0, %eax

‎llvm/test/CodeGen/X86/movmsk-cmp.ll

+33-125
Original file line numberDiff line numberDiff line change
@@ -316,18 +316,14 @@ define i1 @allzeros_v64i8_sign(<64 x i8> %arg) {
316316
define i1 @allones_v8i16_sign(<8 x i16> %arg) {
317317
; SSE2-LABEL: allones_v8i16_sign:
318318
; SSE2: # %bb.0:
319-
; SSE2-NEXT: pxor %xmm1, %xmm1
320-
; SSE2-NEXT: pcmpgtw %xmm0, %xmm1
321-
; SSE2-NEXT: packsswb %xmm0, %xmm1
322-
; SSE2-NEXT: pmovmskb %xmm1, %eax
319+
; SSE2-NEXT: packsswb %xmm0, %xmm0
320+
; SSE2-NEXT: pmovmskb %xmm0, %eax
323321
; SSE2-NEXT: cmpb $-1, %al
324322
; SSE2-NEXT: sete %al
325323
; SSE2-NEXT: retq
326324
;
327325
; AVX-LABEL: allones_v8i16_sign:
328326
; AVX: # %bb.0:
329-
; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
330-
; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
331327
; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
332328
; AVX-NEXT: vpmovmskb %xmm0, %eax
333329
; AVX-NEXT: cmpb $-1, %al
@@ -361,18 +357,14 @@ define i1 @allones_v8i16_sign(<8 x i16> %arg) {
361357
define i1 @allzeros_v8i16_sign(<8 x i16> %arg) {
362358
; SSE2-LABEL: allzeros_v8i16_sign:
363359
; SSE2: # %bb.0:
364-
; SSE2-NEXT: pxor %xmm1, %xmm1
365-
; SSE2-NEXT: pcmpgtw %xmm0, %xmm1
366-
; SSE2-NEXT: packsswb %xmm0, %xmm1
367-
; SSE2-NEXT: pmovmskb %xmm1, %eax
360+
; SSE2-NEXT: packsswb %xmm0, %xmm0
361+
; SSE2-NEXT: pmovmskb %xmm0, %eax
368362
; SSE2-NEXT: testb %al, %al
369363
; SSE2-NEXT: sete %al
370364
; SSE2-NEXT: retq
371365
;
372366
; AVX-LABEL: allzeros_v8i16_sign:
373367
; AVX: # %bb.0:
374-
; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
375-
; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
376368
; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
377369
; AVX-NEXT: vpmovmskb %xmm0, %eax
378370
; AVX-NEXT: testb %al, %al
@@ -406,22 +398,15 @@ define i1 @allzeros_v8i16_sign(<8 x i16> %arg) {
406398
define i1 @allones_v16i16_sign(<16 x i16> %arg) {
407399
; SSE2-LABEL: allones_v16i16_sign:
408400
; SSE2: # %bb.0:
409-
; SSE2-NEXT: pxor %xmm2, %xmm2
410-
; SSE2-NEXT: pxor %xmm3, %xmm3
411-
; SSE2-NEXT: pcmpgtw %xmm1, %xmm3
412-
; SSE2-NEXT: pcmpgtw %xmm0, %xmm2
413-
; SSE2-NEXT: packsswb %xmm3, %xmm2
414-
; SSE2-NEXT: pmovmskb %xmm2, %eax
401+
; SSE2-NEXT: packsswb %xmm1, %xmm0
402+
; SSE2-NEXT: pmovmskb %xmm0, %eax
415403
; SSE2-NEXT: cmpw $-1, %ax
416404
; SSE2-NEXT: sete %al
417405
; SSE2-NEXT: retq
418406
;
419407
; AVX1-LABEL: allones_v16i16_sign:
420408
; AVX1: # %bb.0:
421409
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
422-
; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
423-
; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm1
424-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm0
425410
; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
426411
; AVX1-NEXT: vpmovmskb %xmm0, %eax
427412
; AVX1-NEXT: cmpw $-1, %ax
@@ -468,22 +453,15 @@ define i1 @allones_v16i16_sign(<16 x i16> %arg) {
468453
define i1 @allzeros_v16i16_sign(<16 x i16> %arg) {
469454
; SSE2-LABEL: allzeros_v16i16_sign:
470455
; SSE2: # %bb.0:
471-
; SSE2-NEXT: pxor %xmm2, %xmm2
472-
; SSE2-NEXT: pxor %xmm3, %xmm3
473-
; SSE2-NEXT: pcmpgtw %xmm1, %xmm3
474-
; SSE2-NEXT: pcmpgtw %xmm0, %xmm2
475-
; SSE2-NEXT: packsswb %xmm3, %xmm2
476-
; SSE2-NEXT: pmovmskb %xmm2, %eax
456+
; SSE2-NEXT: packsswb %xmm1, %xmm0
457+
; SSE2-NEXT: pmovmskb %xmm0, %eax
477458
; SSE2-NEXT: testw %ax, %ax
478459
; SSE2-NEXT: sete %al
479460
; SSE2-NEXT: retq
480461
;
481462
; AVX1-LABEL: allzeros_v16i16_sign:
482463
; AVX1: # %bb.0:
483464
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
484-
; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
485-
; AVX1-NEXT: vpcmpgtw %xmm1, %xmm2, %xmm1
486-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm0
487465
; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
488466
; AVX1-NEXT: vpmovmskb %xmm0, %eax
489467
; AVX1-NEXT: testw %ax, %ax
@@ -530,18 +508,10 @@ define i1 @allzeros_v16i16_sign(<16 x i16> %arg) {
530508
define i1 @allones_v32i16_sign(<32 x i16> %arg) {
531509
; SSE2-LABEL: allones_v32i16_sign:
532510
; SSE2: # %bb.0:
533-
; SSE2-NEXT: pxor %xmm4, %xmm4
534-
; SSE2-NEXT: pxor %xmm5, %xmm5
535-
; SSE2-NEXT: pcmpgtw %xmm1, %xmm5
536-
; SSE2-NEXT: pxor %xmm1, %xmm1
537-
; SSE2-NEXT: pcmpgtw %xmm0, %xmm1
538-
; SSE2-NEXT: packsswb %xmm5, %xmm1
539-
; SSE2-NEXT: pmovmskb %xmm1, %eax
540-
; SSE2-NEXT: pxor %xmm0, %xmm0
541-
; SSE2-NEXT: pcmpgtw %xmm3, %xmm0
542-
; SSE2-NEXT: pcmpgtw %xmm2, %xmm4
543-
; SSE2-NEXT: packsswb %xmm0, %xmm4
544-
; SSE2-NEXT: pmovmskb %xmm4, %ecx
511+
; SSE2-NEXT: packsswb %xmm1, %xmm0
512+
; SSE2-NEXT: pmovmskb %xmm0, %eax
513+
; SSE2-NEXT: packsswb %xmm3, %xmm2
514+
; SSE2-NEXT: pmovmskb %xmm2, %ecx
545515
; SSE2-NEXT: shll $16, %ecx
546516
; SSE2-NEXT: orl %eax, %ecx
547517
; SSE2-NEXT: cmpl $-1, %ecx
@@ -551,14 +521,9 @@ define i1 @allones_v32i16_sign(<32 x i16> %arg) {
551521
; AVX1-LABEL: allones_v32i16_sign:
552522
; AVX1: # %bb.0:
553523
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
554-
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
555-
; AVX1-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm2
556-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm3, %xmm0
557524
; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0
558525
; AVX1-NEXT: vpmovmskb %xmm0, %eax
559526
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
560-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm3, %xmm0
561-
; AVX1-NEXT: vpcmpgtw %xmm1, %xmm3, %xmm1
562527
; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm0
563528
; AVX1-NEXT: vpmovmskb %xmm0, %ecx
564529
; AVX1-NEXT: shll $16, %ecx
@@ -570,9 +535,6 @@ define i1 @allones_v32i16_sign(<32 x i16> %arg) {
570535
;
571536
; AVX2-LABEL: allones_v32i16_sign:
572537
; AVX2: # %bb.0:
573-
; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
574-
; AVX2-NEXT: vpcmpgtw %ymm1, %ymm2, %ymm1
575-
; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm0
576538
; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
577539
; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
578540
; AVX2-NEXT: vpmovmskb %ymm0, %eax
@@ -615,18 +577,10 @@ define i1 @allones_v32i16_sign(<32 x i16> %arg) {
615577
define i1 @allzeros_v32i16_sign(<32 x i16> %arg) {
616578
; SSE2-LABEL: allzeros_v32i16_sign:
617579
; SSE2: # %bb.0:
618-
; SSE2-NEXT: pxor %xmm4, %xmm4
619-
; SSE2-NEXT: pxor %xmm5, %xmm5
620-
; SSE2-NEXT: pcmpgtw %xmm1, %xmm5
621-
; SSE2-NEXT: pxor %xmm1, %xmm1
622-
; SSE2-NEXT: pcmpgtw %xmm0, %xmm1
623-
; SSE2-NEXT: packsswb %xmm5, %xmm1
624-
; SSE2-NEXT: pmovmskb %xmm1, %eax
625-
; SSE2-NEXT: pxor %xmm0, %xmm0
626-
; SSE2-NEXT: pcmpgtw %xmm3, %xmm0
627-
; SSE2-NEXT: pcmpgtw %xmm2, %xmm4
628-
; SSE2-NEXT: packsswb %xmm0, %xmm4
629-
; SSE2-NEXT: pmovmskb %xmm4, %ecx
580+
; SSE2-NEXT: packsswb %xmm1, %xmm0
581+
; SSE2-NEXT: pmovmskb %xmm0, %eax
582+
; SSE2-NEXT: packsswb %xmm3, %xmm2
583+
; SSE2-NEXT: pmovmskb %xmm2, %ecx
630584
; SSE2-NEXT: shll $16, %ecx
631585
; SSE2-NEXT: orl %eax, %ecx
632586
; SSE2-NEXT: sete %al
@@ -635,14 +589,9 @@ define i1 @allzeros_v32i16_sign(<32 x i16> %arg) {
635589
; AVX1-LABEL: allzeros_v32i16_sign:
636590
; AVX1: # %bb.0:
637591
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
638-
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
639-
; AVX1-NEXT: vpcmpgtw %xmm2, %xmm3, %xmm2
640-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm3, %xmm0
641592
; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0
642593
; AVX1-NEXT: vpmovmskb %xmm0, %eax
643594
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
644-
; AVX1-NEXT: vpcmpgtw %xmm0, %xmm3, %xmm0
645-
; AVX1-NEXT: vpcmpgtw %xmm1, %xmm3, %xmm1
646595
; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm0
647596
; AVX1-NEXT: vpmovmskb %xmm0, %ecx
648597
; AVX1-NEXT: shll $16, %ecx
@@ -653,9 +602,6 @@ define i1 @allzeros_v32i16_sign(<32 x i16> %arg) {
653602
;
654603
; AVX2-LABEL: allzeros_v32i16_sign:
655604
; AVX2: # %bb.0:
656-
; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
657-
; AVX2-NEXT: vpcmpgtw %ymm1, %ymm2, %ymm1
658-
; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm0
659605
; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
660606
; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
661607
; AVX2-NEXT: vpmovmskb %ymm0, %eax
@@ -777,13 +723,9 @@ define i1 @allzeros_v4i32_sign(<4 x i32> %arg) {
777723
define i1 @allones_v8i32_sign(<8 x i32> %arg) {
778724
; SSE2-LABEL: allones_v8i32_sign:
779725
; SSE2: # %bb.0:
780-
; SSE2-NEXT: pxor %xmm2, %xmm2
781-
; SSE2-NEXT: pxor %xmm3, %xmm3
782-
; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
783-
; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
784-
; SSE2-NEXT: packssdw %xmm3, %xmm2
785-
; SSE2-NEXT: packsswb %xmm0, %xmm2
786-
; SSE2-NEXT: pmovmskb %xmm2, %eax
726+
; SSE2-NEXT: packssdw %xmm1, %xmm0
727+
; SSE2-NEXT: packsswb %xmm0, %xmm0
728+
; SSE2-NEXT: pmovmskb %xmm0, %eax
787729
; SSE2-NEXT: cmpb $-1, %al
788730
; SSE2-NEXT: sete %al
789731
; SSE2-NEXT: retq
@@ -823,13 +765,9 @@ define i1 @allones_v8i32_sign(<8 x i32> %arg) {
823765
define i1 @allzeros_v8i32_sign(<8 x i32> %arg) {
824766
; SSE2-LABEL: allzeros_v8i32_sign:
825767
; SSE2: # %bb.0:
826-
; SSE2-NEXT: pxor %xmm2, %xmm2
827-
; SSE2-NEXT: pxor %xmm3, %xmm3
828-
; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
829-
; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
830-
; SSE2-NEXT: packssdw %xmm3, %xmm2
831-
; SSE2-NEXT: packsswb %xmm0, %xmm2
832-
; SSE2-NEXT: pmovmskb %xmm2, %eax
768+
; SSE2-NEXT: packssdw %xmm1, %xmm0
769+
; SSE2-NEXT: packsswb %xmm0, %xmm0
770+
; SSE2-NEXT: pmovmskb %xmm0, %eax
833771
; SSE2-NEXT: testb %al, %al
834772
; SSE2-NEXT: sete %al
835773
; SSE2-NEXT: retq
@@ -869,32 +807,19 @@ define i1 @allzeros_v8i32_sign(<8 x i32> %arg) {
869807
define i1 @allones_v16i32_sign(<16 x i32> %arg) {
870808
; SSE2-LABEL: allones_v16i32_sign:
871809
; SSE2: # %bb.0:
872-
; SSE2-NEXT: pxor %xmm4, %xmm4
873-
; SSE2-NEXT: pxor %xmm5, %xmm5
874-
; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
875-
; SSE2-NEXT: pxor %xmm3, %xmm3
876-
; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
877-
; SSE2-NEXT: packssdw %xmm5, %xmm3
878-
; SSE2-NEXT: pxor %xmm2, %xmm2
879-
; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
880-
; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
881-
; SSE2-NEXT: packssdw %xmm2, %xmm4
882-
; SSE2-NEXT: packsswb %xmm3, %xmm4
883-
; SSE2-NEXT: pmovmskb %xmm4, %eax
810+
; SSE2-NEXT: packssdw %xmm3, %xmm2
811+
; SSE2-NEXT: packssdw %xmm1, %xmm0
812+
; SSE2-NEXT: packsswb %xmm2, %xmm0
813+
; SSE2-NEXT: pmovmskb %xmm0, %eax
884814
; SSE2-NEXT: cmpw $-1, %ax
885815
; SSE2-NEXT: sete %al
886816
; SSE2-NEXT: retq
887817
;
888818
; AVX1-LABEL: allones_v16i32_sign:
889819
; AVX1: # %bb.0:
890820
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
891-
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
892-
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
893-
; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm1
894821
; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
895822
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
896-
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
897-
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm0
898823
; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
899824
; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
900825
; AVX1-NEXT: vpmovmskb %xmm0, %eax
@@ -943,32 +868,19 @@ define i1 @allones_v16i32_sign(<16 x i32> %arg) {
943868
define i1 @allzeros_v16i32_sign(<16 x i32> %arg) {
944869
; SSE2-LABEL: allzeros_v16i32_sign:
945870
; SSE2: # %bb.0:
946-
; SSE2-NEXT: pxor %xmm4, %xmm4
947-
; SSE2-NEXT: pxor %xmm5, %xmm5
948-
; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
949-
; SSE2-NEXT: pxor %xmm3, %xmm3
950-
; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
951-
; SSE2-NEXT: packssdw %xmm5, %xmm3
952-
; SSE2-NEXT: pxor %xmm2, %xmm2
953-
; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
954-
; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
955-
; SSE2-NEXT: packssdw %xmm2, %xmm4
956-
; SSE2-NEXT: packsswb %xmm3, %xmm4
957-
; SSE2-NEXT: pmovmskb %xmm4, %eax
871+
; SSE2-NEXT: packssdw %xmm3, %xmm2
872+
; SSE2-NEXT: packssdw %xmm1, %xmm0
873+
; SSE2-NEXT: packsswb %xmm2, %xmm0
874+
; SSE2-NEXT: pmovmskb %xmm0, %eax
958875
; SSE2-NEXT: testw %ax, %ax
959876
; SSE2-NEXT: sete %al
960877
; SSE2-NEXT: retq
961878
;
962879
; AVX1-LABEL: allzeros_v16i32_sign:
963880
; AVX1: # %bb.0:
964881
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
965-
; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
966-
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
967-
; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm1
968882
; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
969883
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
970-
; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
971-
; AVX1-NEXT: vpcmpgtd %xmm0, %xmm3, %xmm0
972884
; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
973885
; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
974886
; AVX1-NEXT: vpmovmskb %xmm0, %eax
@@ -4663,13 +4575,9 @@ define i32 @movmskpd256(<4 x double> %x) {
46634575
define i32 @movmskps256(<8 x float> %x) {
46644576
; SSE2-LABEL: movmskps256:
46654577
; SSE2: # %bb.0:
4666-
; SSE2-NEXT: pxor %xmm2, %xmm2
4667-
; SSE2-NEXT: pxor %xmm3, %xmm3
4668-
; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
4669-
; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4670-
; SSE2-NEXT: packssdw %xmm3, %xmm2
4671-
; SSE2-NEXT: packsswb %xmm0, %xmm2
4672-
; SSE2-NEXT: pmovmskb %xmm2, %eax
4578+
; SSE2-NEXT: packssdw %xmm1, %xmm0
4579+
; SSE2-NEXT: packsswb %xmm0, %xmm0
4580+
; SSE2-NEXT: pmovmskb %xmm0, %eax
46734581
; SSE2-NEXT: movzbl %al, %eax
46744582
; SSE2-NEXT: retq
46754583
;

0 commit comments

Comments
 (0)
Please sign in to comment.