[llvm] 066773c - [X86] computeKnownBitsForTargetNode - add generic handling of PSHUFB
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 20 09:15:02 PST 2024
Author: Simon Pilgrim
Date: 2024-02-20T17:14:49Z
New Revision: 066773c4117512a76e127741631630fef57caf14
URL: https://github.com/llvm/llvm-project/commit/066773c4117512a76e127741631630fef57caf14
DIFF: https://github.com/llvm/llvm-project/commit/066773c4117512a76e127741631630fef57caf14.diff
LOG: [X86] computeKnownBitsForTargetNode - add generic handling of PSHUFB
When PSHUFB is used as a LUT (for CTPOP, BITREVERSE etc.), its the source operand that is constant and the index operand the variable. As long as the indices don't set the MSB (which zeros the output element), then the common known bits from the source operand can be used directly, even though the shuffle mask isn't constant.
Further helps to improve CTPOP reduction codegen
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/vector-reduce-ctpop.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 2199be77a3882f..ac2d1c76980adf 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -36707,6 +36707,19 @@ void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
Known = Known.trunc(BitWidth);
break;
}
+ case X86ISD::PSHUFB: {
+ SDValue Src = Op.getOperand(0);
+ SDValue Idx = Op.getOperand(1);
+
+ // If the index vector is never negative (MSB is zero), then all elements
+ // come from the source vector. This is useful for cases where
+ // PSHUFB is being used as a LUT (ctpop etc.) - the target shuffle handling
+ // below will handle the more common constant shuffle mask case.
+ KnownBits KnownIdx = DAG.computeKnownBits(Idx, DemandedElts, Depth + 1);
+ if (KnownIdx.isNonNegative())
+ Known = DAG.computeKnownBits(Src, Depth + 1);
+ break;
+ }
case X86ISD::VBROADCAST: {
SDValue Src = Op.getOperand(0);
if (!Src.getSimpleValueType().isVector()) {
diff --git a/llvm/test/CodeGen/X86/vector-reduce-ctpop.ll b/llvm/test/CodeGen/X86/vector-reduce-ctpop.ll
index e218d912d0b2f2..2511fbf99fc46c 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-ctpop.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-ctpop.ll
@@ -327,21 +327,20 @@ define i64 @reduce_ctpop_v4i64(<4 x i64> %a0) {
; SSE42-NEXT: movdqa %xmm4, %xmm3
; SSE42-NEXT: pshufb %xmm1, %xmm3
; SSE42-NEXT: paddb %xmm5, %xmm3
-; SSE42-NEXT: pxor %xmm1, %xmm1
-; SSE42-NEXT: psadbw %xmm1, %xmm3
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: pand %xmm2, %xmm5
-; SSE42-NEXT: movdqa %xmm4, %xmm6
-; SSE42-NEXT: pshufb %xmm5, %xmm6
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: pand %xmm2, %xmm1
+; SSE42-NEXT: movdqa %xmm4, %xmm5
+; SSE42-NEXT: pshufb %xmm1, %xmm5
; SSE42-NEXT: psrlw $4, %xmm0
; SSE42-NEXT: pand %xmm2, %xmm0
; SSE42-NEXT: pshufb %xmm0, %xmm4
-; SSE42-NEXT: paddb %xmm6, %xmm4
-; SSE42-NEXT: psadbw %xmm1, %xmm4
-; SSE42-NEXT: paddq %xmm3, %xmm4
-; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
-; SSE42-NEXT: paddq %xmm4, %xmm0
-; SSE42-NEXT: movq %xmm0, %rax
+; SSE42-NEXT: paddb %xmm5, %xmm4
+; SSE42-NEXT: paddb %xmm3, %xmm4
+; SSE42-NEXT: pxor %xmm0, %xmm0
+; SSE42-NEXT: psadbw %xmm4, %xmm0
+; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE42-NEXT: paddq %xmm0, %xmm1
+; SSE42-NEXT: movq %xmm1, %rax
; SSE42-NEXT: retq
;
; AVX2-LABEL: reduce_ctpop_v4i64:
@@ -516,46 +515,43 @@ define i64 @reduce_ctpop_v8i64(<8 x i64> %a0) {
; SSE42-NEXT: pshufb %xmm6, %xmm7
; SSE42-NEXT: psrlw $4, %xmm2
; SSE42-NEXT: pand %xmm5, %xmm2
-; SSE42-NEXT: movdqa %xmm4, %xmm8
-; SSE42-NEXT: pshufb %xmm2, %xmm8
-; SSE42-NEXT: paddb %xmm7, %xmm8
-; SSE42-NEXT: pxor %xmm2, %xmm2
-; SSE42-NEXT: psadbw %xmm2, %xmm8
-; SSE42-NEXT: movdqa %xmm0, %xmm6
-; SSE42-NEXT: pand %xmm5, %xmm6
+; SSE42-NEXT: movdqa %xmm4, %xmm6
+; SSE42-NEXT: pshufb %xmm2, %xmm6
+; SSE42-NEXT: paddb %xmm7, %xmm6
+; SSE42-NEXT: movdqa %xmm0, %xmm2
+; SSE42-NEXT: pand %xmm5, %xmm2
; SSE42-NEXT: movdqa %xmm4, %xmm7
-; SSE42-NEXT: pshufb %xmm6, %xmm7
+; SSE42-NEXT: pshufb %xmm2, %xmm7
; SSE42-NEXT: psrlw $4, %xmm0
; SSE42-NEXT: pand %xmm5, %xmm0
-; SSE42-NEXT: movdqa %xmm4, %xmm6
-; SSE42-NEXT: pshufb %xmm0, %xmm6
-; SSE42-NEXT: paddb %xmm7, %xmm6
-; SSE42-NEXT: psadbw %xmm2, %xmm6
-; SSE42-NEXT: paddq %xmm8, %xmm6
+; SSE42-NEXT: movdqa %xmm4, %xmm2
+; SSE42-NEXT: pshufb %xmm0, %xmm2
+; SSE42-NEXT: paddb %xmm7, %xmm2
+; SSE42-NEXT: paddb %xmm6, %xmm2
; SSE42-NEXT: movdqa %xmm3, %xmm0
; SSE42-NEXT: pand %xmm5, %xmm0
-; SSE42-NEXT: movdqa %xmm4, %xmm7
-; SSE42-NEXT: pshufb %xmm0, %xmm7
+; SSE42-NEXT: movdqa %xmm4, %xmm6
+; SSE42-NEXT: pshufb %xmm0, %xmm6
; SSE42-NEXT: psrlw $4, %xmm3
; SSE42-NEXT: pand %xmm5, %xmm3
; SSE42-NEXT: movdqa %xmm4, %xmm0
; SSE42-NEXT: pshufb %xmm3, %xmm0
-; SSE42-NEXT: paddb %xmm7, %xmm0
-; SSE42-NEXT: psadbw %xmm2, %xmm0
+; SSE42-NEXT: paddb %xmm6, %xmm0
; SSE42-NEXT: movdqa %xmm1, %xmm3
; SSE42-NEXT: pand %xmm5, %xmm3
-; SSE42-NEXT: movdqa %xmm4, %xmm7
-; SSE42-NEXT: pshufb %xmm3, %xmm7
+; SSE42-NEXT: movdqa %xmm4, %xmm6
+; SSE42-NEXT: pshufb %xmm3, %xmm6
; SSE42-NEXT: psrlw $4, %xmm1
; SSE42-NEXT: pand %xmm5, %xmm1
; SSE42-NEXT: pshufb %xmm1, %xmm4
-; SSE42-NEXT: paddb %xmm7, %xmm4
-; SSE42-NEXT: psadbw %xmm2, %xmm4
-; SSE42-NEXT: paddq %xmm0, %xmm4
-; SSE42-NEXT: paddq %xmm6, %xmm4
-; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
-; SSE42-NEXT: paddq %xmm4, %xmm0
-; SSE42-NEXT: movq %xmm0, %rax
+; SSE42-NEXT: paddb %xmm6, %xmm4
+; SSE42-NEXT: paddb %xmm0, %xmm4
+; SSE42-NEXT: paddb %xmm2, %xmm4
+; SSE42-NEXT: pxor %xmm0, %xmm0
+; SSE42-NEXT: psadbw %xmm4, %xmm0
+; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE42-NEXT: paddq %xmm0, %xmm1
+; SSE42-NEXT: movq %xmm1, %rax
; SSE42-NEXT: retq
;
; AVX2-LABEL: reduce_ctpop_v8i64:
@@ -569,16 +565,15 @@ define i64 @reduce_ctpop_v8i64(<8 x i64> %a0) {
; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
; AVX2-NEXT: vpshufb %ymm1, %ymm4, %ymm1
; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
-; AVX2-NEXT: vpsadbw %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm5
-; AVX2-NEXT: vpshufb %ymm5, %ymm4, %ymm5
+; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm3
+; AVX2-NEXT: vpshufb %ymm3, %ymm4, %ymm3
; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpshufb %ymm0, %ymm4, %ymm0
-; AVX2-NEXT: vpaddb %ymm5, %ymm0, %ymm0
-; AVX2-NEXT: vpsadbw %ymm3, %ymm0, %ymm0
-; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpaddb %ymm3, %ymm0, %ymm0
+; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -784,32 +779,28 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
; SSE42-NEXT: pshufb %xmm10, %xmm11
; SSE42-NEXT: psrlw $4, %xmm5
; SSE42-NEXT: pand %xmm9, %xmm5
-; SSE42-NEXT: movdqa %xmm8, %xmm12
-; SSE42-NEXT: pshufb %xmm5, %xmm12
-; SSE42-NEXT: paddb %xmm11, %xmm12
-; SSE42-NEXT: pxor %xmm5, %xmm5
-; SSE42-NEXT: psadbw %xmm5, %xmm12
-; SSE42-NEXT: movdqa %xmm1, %xmm10
-; SSE42-NEXT: pand %xmm9, %xmm10
+; SSE42-NEXT: movdqa %xmm8, %xmm10
+; SSE42-NEXT: pshufb %xmm5, %xmm10
+; SSE42-NEXT: paddb %xmm11, %xmm10
+; SSE42-NEXT: movdqa %xmm1, %xmm5
+; SSE42-NEXT: pand %xmm9, %xmm5
; SSE42-NEXT: movdqa %xmm8, %xmm11
-; SSE42-NEXT: pshufb %xmm10, %xmm11
+; SSE42-NEXT: pshufb %xmm5, %xmm11
; SSE42-NEXT: psrlw $4, %xmm1
; SSE42-NEXT: pand %xmm9, %xmm1
-; SSE42-NEXT: movdqa %xmm8, %xmm10
-; SSE42-NEXT: pshufb %xmm1, %xmm10
-; SSE42-NEXT: paddb %xmm11, %xmm10
-; SSE42-NEXT: psadbw %xmm5, %xmm10
-; SSE42-NEXT: paddq %xmm12, %xmm10
+; SSE42-NEXT: movdqa %xmm8, %xmm5
+; SSE42-NEXT: pshufb %xmm1, %xmm5
+; SSE42-NEXT: paddb %xmm11, %xmm5
+; SSE42-NEXT: paddb %xmm10, %xmm5
; SSE42-NEXT: movdqa %xmm7, %xmm1
; SSE42-NEXT: pand %xmm9, %xmm1
-; SSE42-NEXT: movdqa %xmm8, %xmm11
-; SSE42-NEXT: pshufb %xmm1, %xmm11
+; SSE42-NEXT: movdqa %xmm8, %xmm10
+; SSE42-NEXT: pshufb %xmm1, %xmm10
; SSE42-NEXT: psrlw $4, %xmm7
; SSE42-NEXT: pand %xmm9, %xmm7
-; SSE42-NEXT: movdqa %xmm8, %xmm12
-; SSE42-NEXT: pshufb %xmm7, %xmm12
-; SSE42-NEXT: paddb %xmm11, %xmm12
-; SSE42-NEXT: psadbw %xmm5, %xmm12
+; SSE42-NEXT: movdqa %xmm8, %xmm11
+; SSE42-NEXT: pshufb %xmm7, %xmm11
+; SSE42-NEXT: paddb %xmm10, %xmm11
; SSE42-NEXT: movdqa %xmm3, %xmm1
; SSE42-NEXT: pand %xmm9, %xmm1
; SSE42-NEXT: movdqa %xmm8, %xmm7
@@ -819,19 +810,17 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
; SSE42-NEXT: movdqa %xmm8, %xmm1
; SSE42-NEXT: pshufb %xmm3, %xmm1
; SSE42-NEXT: paddb %xmm7, %xmm1
-; SSE42-NEXT: psadbw %xmm5, %xmm1
-; SSE42-NEXT: paddq %xmm12, %xmm1
-; SSE42-NEXT: paddq %xmm10, %xmm1
+; SSE42-NEXT: paddb %xmm11, %xmm1
+; SSE42-NEXT: paddb %xmm5, %xmm1
; SSE42-NEXT: movdqa %xmm4, %xmm3
; SSE42-NEXT: pand %xmm9, %xmm3
-; SSE42-NEXT: movdqa %xmm8, %xmm7
-; SSE42-NEXT: pshufb %xmm3, %xmm7
+; SSE42-NEXT: movdqa %xmm8, %xmm5
+; SSE42-NEXT: pshufb %xmm3, %xmm5
; SSE42-NEXT: psrlw $4, %xmm4
; SSE42-NEXT: pand %xmm9, %xmm4
-; SSE42-NEXT: movdqa %xmm8, %xmm10
-; SSE42-NEXT: pshufb %xmm4, %xmm10
-; SSE42-NEXT: paddb %xmm7, %xmm10
-; SSE42-NEXT: psadbw %xmm5, %xmm10
+; SSE42-NEXT: movdqa %xmm8, %xmm7
+; SSE42-NEXT: pshufb %xmm4, %xmm7
+; SSE42-NEXT: paddb %xmm5, %xmm7
; SSE42-NEXT: movdqa %xmm0, %xmm3
; SSE42-NEXT: pand %xmm9, %xmm3
; SSE42-NEXT: movdqa %xmm8, %xmm4
@@ -841,8 +830,7 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
; SSE42-NEXT: movdqa %xmm8, %xmm3
; SSE42-NEXT: pshufb %xmm0, %xmm3
; SSE42-NEXT: paddb %xmm4, %xmm3
-; SSE42-NEXT: psadbw %xmm5, %xmm3
-; SSE42-NEXT: paddq %xmm10, %xmm3
+; SSE42-NEXT: paddb %xmm7, %xmm3
; SSE42-NEXT: movdqa %xmm6, %xmm0
; SSE42-NEXT: pand %xmm9, %xmm0
; SSE42-NEXT: movdqa %xmm8, %xmm4
@@ -852,22 +840,22 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
; SSE42-NEXT: movdqa %xmm8, %xmm0
; SSE42-NEXT: pshufb %xmm6, %xmm0
; SSE42-NEXT: paddb %xmm4, %xmm0
-; SSE42-NEXT: psadbw %xmm5, %xmm0
; SSE42-NEXT: movdqa %xmm2, %xmm4
; SSE42-NEXT: pand %xmm9, %xmm4
-; SSE42-NEXT: movdqa %xmm8, %xmm6
-; SSE42-NEXT: pshufb %xmm4, %xmm6
+; SSE42-NEXT: movdqa %xmm8, %xmm5
+; SSE42-NEXT: pshufb %xmm4, %xmm5
; SSE42-NEXT: psrlw $4, %xmm2
; SSE42-NEXT: pand %xmm9, %xmm2
; SSE42-NEXT: pshufb %xmm2, %xmm8
-; SSE42-NEXT: paddb %xmm6, %xmm8
-; SSE42-NEXT: psadbw %xmm5, %xmm8
-; SSE42-NEXT: paddq %xmm0, %xmm8
-; SSE42-NEXT: paddq %xmm3, %xmm8
-; SSE42-NEXT: paddq %xmm1, %xmm8
-; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm8[2,3,2,3]
-; SSE42-NEXT: paddq %xmm8, %xmm0
-; SSE42-NEXT: movq %xmm0, %rax
+; SSE42-NEXT: paddb %xmm5, %xmm8
+; SSE42-NEXT: paddb %xmm0, %xmm8
+; SSE42-NEXT: paddb %xmm3, %xmm8
+; SSE42-NEXT: paddb %xmm1, %xmm8
+; SSE42-NEXT: pxor %xmm0, %xmm0
+; SSE42-NEXT: psadbw %xmm8, %xmm0
+; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE42-NEXT: paddq %xmm0, %xmm1
+; SSE42-NEXT: movq %xmm1, %rax
; SSE42-NEXT: retq
;
; AVX2-LABEL: reduce_ctpop_v16i64:
@@ -881,32 +869,29 @@ define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2
; AVX2-NEXT: vpshufb %ymm2, %ymm6, %ymm2
; AVX2-NEXT: vpaddb %ymm5, %ymm2, %ymm2
-; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5
-; AVX2-NEXT: vpsadbw %ymm5, %ymm2, %ymm2
-; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm7
-; AVX2-NEXT: vpshufb %ymm7, %ymm6, %ymm7
+; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm5
+; AVX2-NEXT: vpshufb %ymm5, %ymm6, %ymm5
; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0
-; AVX2-NEXT: vpaddb %ymm7, %ymm0, %ymm0
-; AVX2-NEXT: vpsadbw %ymm5, %ymm0, %ymm0
-; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
+; AVX2-NEXT: vpaddb %ymm5, %ymm0, %ymm0
+; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm2
; AVX2-NEXT: vpshufb %ymm2, %ymm6, %ymm2
; AVX2-NEXT: vpsrlw $4, %ymm3, %ymm3
; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm3
; AVX2-NEXT: vpshufb %ymm3, %ymm6, %ymm3
; AVX2-NEXT: vpaddb %ymm2, %ymm3, %ymm2
-; AVX2-NEXT: vpsadbw %ymm5, %ymm2, %ymm2
; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm3
; AVX2-NEXT: vpshufb %ymm3, %ymm6, %ymm3
; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1
; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1
; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1
; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpsadbw %ymm5, %ymm1, %ymm1
-; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpaddb %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -984,8 +969,6 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm9, %xmm12
; SSE42-NEXT: pshufb %xmm1, %xmm12
; SSE42-NEXT: paddb %xmm11, %xmm12
-; SSE42-NEXT: pxor %xmm11, %xmm11
-; SSE42-NEXT: psadbw %xmm11, %xmm12
; SSE42-NEXT: movdqa %xmm8, %xmm0
; SSE42-NEXT: pand %xmm10, %xmm0
; SSE42-NEXT: movdqa %xmm9, %xmm1
@@ -995,8 +978,7 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm9, %xmm0
; SSE42-NEXT: pshufb %xmm8, %xmm0
; SSE42-NEXT: paddb %xmm1, %xmm0
-; SSE42-NEXT: psadbw %xmm11, %xmm0
-; SSE42-NEXT: paddq %xmm12, %xmm0
+; SSE42-NEXT: paddb %xmm12, %xmm0
; SSE42-NEXT: movdqa %xmm3, %xmm1
; SSE42-NEXT: pand %xmm10, %xmm1
; SSE42-NEXT: movdqa %xmm9, %xmm8
@@ -1006,7 +988,6 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm9, %xmm1
; SSE42-NEXT: pshufb %xmm3, %xmm1
; SSE42-NEXT: paddb %xmm8, %xmm1
-; SSE42-NEXT: psadbw %xmm11, %xmm1
; SSE42-NEXT: movdqa %xmm2, %xmm3
; SSE42-NEXT: pand %xmm10, %xmm3
; SSE42-NEXT: movdqa %xmm9, %xmm8
@@ -1016,8 +997,7 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm9, %xmm3
; SSE42-NEXT: pshufb %xmm2, %xmm3
; SSE42-NEXT: paddb %xmm8, %xmm3
-; SSE42-NEXT: psadbw %xmm11, %xmm3
-; SSE42-NEXT: paddq %xmm1, %xmm3
+; SSE42-NEXT: paddb %xmm1, %xmm3
; SSE42-NEXT: movdqa %xmm5, %xmm1
; SSE42-NEXT: pand %xmm10, %xmm1
; SSE42-NEXT: movdqa %xmm9, %xmm2
@@ -1027,7 +1007,6 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm9, %xmm8
; SSE42-NEXT: pshufb %xmm5, %xmm8
; SSE42-NEXT: paddb %xmm2, %xmm8
-; SSE42-NEXT: psadbw %xmm11, %xmm8
; SSE42-NEXT: movdqa %xmm4, %xmm1
; SSE42-NEXT: pand %xmm10, %xmm1
; SSE42-NEXT: movdqa %xmm9, %xmm2
@@ -1037,8 +1016,7 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm9, %xmm1
; SSE42-NEXT: pshufb %xmm4, %xmm1
; SSE42-NEXT: paddb %xmm2, %xmm1
-; SSE42-NEXT: psadbw %xmm11, %xmm1
-; SSE42-NEXT: paddq %xmm8, %xmm1
+; SSE42-NEXT: paddb %xmm8, %xmm1
; SSE42-NEXT: movdqa %xmm7, %xmm2
; SSE42-NEXT: pand %xmm10, %xmm2
; SSE42-NEXT: movdqa %xmm9, %xmm4
@@ -1048,7 +1026,6 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm9, %xmm2
; SSE42-NEXT: pshufb %xmm7, %xmm2
; SSE42-NEXT: paddb %xmm4, %xmm2
-; SSE42-NEXT: psadbw %xmm11, %xmm2
; SSE42-NEXT: movdqa %xmm6, %xmm4
; SSE42-NEXT: pand %xmm10, %xmm4
; SSE42-NEXT: movdqa %xmm9, %xmm5
@@ -1057,8 +1034,12 @@ define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: pand %xmm10, %xmm6
; SSE42-NEXT: pshufb %xmm6, %xmm9
; SSE42-NEXT: paddb %xmm5, %xmm9
-; SSE42-NEXT: psadbw %xmm11, %xmm9
-; SSE42-NEXT: paddq %xmm2, %xmm9
+; SSE42-NEXT: paddb %xmm2, %xmm9
+; SSE42-NEXT: pxor %xmm2, %xmm2
+; SSE42-NEXT: psadbw %xmm2, %xmm0
+; SSE42-NEXT: psadbw %xmm2, %xmm3
+; SSE42-NEXT: psadbw %xmm2, %xmm1
+; SSE42-NEXT: psadbw %xmm2, %xmm9
; SSE42-NEXT: movdqa %xmm0, %xmm2
; SSE42-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm3[1]
; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
@@ -1194,62 +1175,57 @@ define <8 x i32> @reduce_ctpop_v4i64_buildvector_v8i32(<4 x i64> %a0, <4 x i64>
; SSE42-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
; SSE42: # %bb.0:
; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9
-; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
-; SSE42-NEXT: movdqa %xmm1, %xmm12
-; SSE42-NEXT: pand %xmm10, %xmm12
+; SSE42-NEXT: movdqa %xmm1, %xmm11
+; SSE42-NEXT: pand %xmm10, %xmm11
; SSE42-NEXT: movdqa {{.*#+}} xmm8 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
-; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm12, %xmm13
+; SSE42-NEXT: movdqa %xmm8, %xmm12
+; SSE42-NEXT: pshufb %xmm11, %xmm12
; SSE42-NEXT: psrlw $4, %xmm1
; SSE42-NEXT: pand %xmm10, %xmm1
-; SSE42-NEXT: movdqa %xmm8, %xmm12
-; SSE42-NEXT: pshufb %xmm1, %xmm12
-; SSE42-NEXT: paddb %xmm13, %xmm12
+; SSE42-NEXT: movdqa %xmm8, %xmm11
+; SSE42-NEXT: pshufb %xmm1, %xmm11
+; SSE42-NEXT: paddb %xmm12, %xmm11
; SSE42-NEXT: movdqa %xmm0, %xmm1
; SSE42-NEXT: pand %xmm10, %xmm1
-; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm1, %xmm13
+; SSE42-NEXT: movdqa %xmm8, %xmm12
+; SSE42-NEXT: pshufb %xmm1, %xmm12
; SSE42-NEXT: psrlw $4, %xmm0
; SSE42-NEXT: pand %xmm10, %xmm0
; SSE42-NEXT: movdqa %xmm8, %xmm1
; SSE42-NEXT: pshufb %xmm0, %xmm1
-; SSE42-NEXT: pxor %xmm0, %xmm0
-; SSE42-NEXT: psadbw %xmm0, %xmm12
-; SSE42-NEXT: paddb %xmm13, %xmm1
-; SSE42-NEXT: psadbw %xmm0, %xmm1
-; SSE42-NEXT: paddq %xmm12, %xmm1
-; SSE42-NEXT: movdqa %xmm3, %xmm12
-; SSE42-NEXT: pand %xmm10, %xmm12
-; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm12, %xmm13
+; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0
+; SSE42-NEXT: paddb %xmm12, %xmm1
+; SSE42-NEXT: paddb %xmm11, %xmm1
+; SSE42-NEXT: movdqa %xmm3, %xmm11
+; SSE42-NEXT: pand %xmm10, %xmm11
+; SSE42-NEXT: movdqa %xmm8, %xmm12
+; SSE42-NEXT: pshufb %xmm11, %xmm12
; SSE42-NEXT: psrlw $4, %xmm3
; SSE42-NEXT: pand %xmm10, %xmm3
-; SSE42-NEXT: movdqa %xmm8, %xmm14
-; SSE42-NEXT: pshufb %xmm3, %xmm14
-; SSE42-NEXT: paddb %xmm13, %xmm14
-; SSE42-NEXT: movdqa %xmm2, %xmm3
-; SSE42-NEXT: pand %xmm10, %xmm3
; SSE42-NEXT: movdqa %xmm8, %xmm13
; SSE42-NEXT: pshufb %xmm3, %xmm13
+; SSE42-NEXT: paddb %xmm12, %xmm13
+; SSE42-NEXT: movdqa %xmm2, %xmm3
+; SSE42-NEXT: pand %xmm10, %xmm3
+; SSE42-NEXT: movdqa %xmm8, %xmm12
+; SSE42-NEXT: pshufb %xmm3, %xmm12
; SSE42-NEXT: psrlw $4, %xmm2
; SSE42-NEXT: pand %xmm10, %xmm2
; SSE42-NEXT: movdqa %xmm8, %xmm3
; SSE42-NEXT: pshufb %xmm2, %xmm3
-; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12
-; SSE42-NEXT: psadbw %xmm0, %xmm14
+; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
+; SSE42-NEXT: paddb %xmm12, %xmm3
; SSE42-NEXT: paddb %xmm13, %xmm3
-; SSE42-NEXT: psadbw %xmm0, %xmm3
-; SSE42-NEXT: paddq %xmm14, %xmm3
; SSE42-NEXT: movdqa %xmm5, %xmm2
; SSE42-NEXT: pand %xmm10, %xmm2
-; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm2, %xmm13
+; SSE42-NEXT: movdqa %xmm8, %xmm12
+; SSE42-NEXT: pshufb %xmm2, %xmm12
; SSE42-NEXT: psrlw $4, %xmm5
; SSE42-NEXT: pand %xmm10, %xmm5
-; SSE42-NEXT: movdqa %xmm8, %xmm14
-; SSE42-NEXT: pshufb %xmm5, %xmm14
-; SSE42-NEXT: paddb %xmm13, %xmm14
+; SSE42-NEXT: movdqa %xmm8, %xmm13
+; SSE42-NEXT: pshufb %xmm5, %xmm13
+; SSE42-NEXT: paddb %xmm12, %xmm13
; SSE42-NEXT: movdqa %xmm4, %xmm2
; SSE42-NEXT: pand %xmm10, %xmm2
; SSE42-NEXT: movdqa %xmm8, %xmm5
@@ -1258,20 +1234,18 @@ define <8 x i32> @reduce_ctpop_v4i64_buildvector_v8i32(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: pand %xmm10, %xmm4
; SSE42-NEXT: movdqa %xmm8, %xmm2
; SSE42-NEXT: pshufb %xmm4, %xmm2
-; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13
-; SSE42-NEXT: psadbw %xmm0, %xmm14
+; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12
; SSE42-NEXT: paddb %xmm5, %xmm2
-; SSE42-NEXT: psadbw %xmm0, %xmm2
-; SSE42-NEXT: paddq %xmm14, %xmm2
+; SSE42-NEXT: paddb %xmm13, %xmm2
; SSE42-NEXT: movdqa %xmm7, %xmm4
; SSE42-NEXT: pand %xmm10, %xmm4
; SSE42-NEXT: movdqa %xmm8, %xmm5
; SSE42-NEXT: pshufb %xmm4, %xmm5
; SSE42-NEXT: psrlw $4, %xmm7
; SSE42-NEXT: pand %xmm10, %xmm7
-; SSE42-NEXT: movdqa %xmm8, %xmm14
-; SSE42-NEXT: pshufb %xmm7, %xmm14
-; SSE42-NEXT: paddb %xmm5, %xmm14
+; SSE42-NEXT: movdqa %xmm8, %xmm13
+; SSE42-NEXT: pshufb %xmm7, %xmm13
+; SSE42-NEXT: paddb %xmm5, %xmm13
; SSE42-NEXT: movdqa %xmm6, %xmm4
; SSE42-NEXT: pand %xmm10, %xmm4
; SSE42-NEXT: movdqa %xmm8, %xmm5
@@ -1281,114 +1255,113 @@ define <8 x i32> @reduce_ctpop_v4i64_buildvector_v8i32(<4 x i64> %a0, <4 x i64>
; SSE42-NEXT: movdqa %xmm8, %xmm4
; SSE42-NEXT: pshufb %xmm6, %xmm4
; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm6
-; SSE42-NEXT: psadbw %xmm0, %xmm14
; SSE42-NEXT: paddb %xmm5, %xmm4
-; SSE42-NEXT: psadbw %xmm0, %xmm4
-; SSE42-NEXT: paddq %xmm14, %xmm4
+; SSE42-NEXT: paddb %xmm13, %xmm4
; SSE42-NEXT: movdqa %xmm6, %xmm5
; SSE42-NEXT: pand %xmm10, %xmm5
; SSE42-NEXT: movdqa %xmm8, %xmm7
; SSE42-NEXT: pshufb %xmm5, %xmm7
; SSE42-NEXT: psrlw $4, %xmm6
; SSE42-NEXT: pand %xmm10, %xmm6
-; SSE42-NEXT: movdqa %xmm8, %xmm14
-; SSE42-NEXT: pshufb %xmm6, %xmm14
-; SSE42-NEXT: paddb %xmm7, %xmm14
-; SSE42-NEXT: movdqa %xmm13, %xmm5
+; SSE42-NEXT: movdqa %xmm8, %xmm13
+; SSE42-NEXT: pshufb %xmm6, %xmm13
+; SSE42-NEXT: paddb %xmm7, %xmm13
+; SSE42-NEXT: movdqa %xmm12, %xmm5
; SSE42-NEXT: pand %xmm10, %xmm5
; SSE42-NEXT: movdqa %xmm8, %xmm6
; SSE42-NEXT: pshufb %xmm5, %xmm6
-; SSE42-NEXT: psrlw $4, %xmm13
-; SSE42-NEXT: pand %xmm10, %xmm13
+; SSE42-NEXT: psrlw $4, %xmm12
+; SSE42-NEXT: pand %xmm10, %xmm12
; SSE42-NEXT: movdqa %xmm8, %xmm5
-; SSE42-NEXT: pshufb %xmm13, %xmm5
+; SSE42-NEXT: pshufb %xmm12, %xmm5
; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7
-; SSE42-NEXT: psadbw %xmm0, %xmm14
; SSE42-NEXT: paddb %xmm6, %xmm5
-; SSE42-NEXT: psadbw %xmm0, %xmm5
-; SSE42-NEXT: paddq %xmm14, %xmm5
+; SSE42-NEXT: paddb %xmm13, %xmm5
; SSE42-NEXT: movdqa %xmm7, %xmm6
; SSE42-NEXT: pand %xmm10, %xmm6
-; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm6, %xmm13
+; SSE42-NEXT: movdqa %xmm8, %xmm12
+; SSE42-NEXT: pshufb %xmm6, %xmm12
; SSE42-NEXT: psrlw $4, %xmm7
; SSE42-NEXT: pand %xmm10, %xmm7
-; SSE42-NEXT: movdqa %xmm8, %xmm14
-; SSE42-NEXT: pshufb %xmm7, %xmm14
-; SSE42-NEXT: paddb %xmm13, %xmm14
-; SSE42-NEXT: movdqa %xmm12, %xmm6
+; SSE42-NEXT: movdqa %xmm8, %xmm13
+; SSE42-NEXT: pshufb %xmm7, %xmm13
+; SSE42-NEXT: paddb %xmm12, %xmm13
+; SSE42-NEXT: movdqa %xmm11, %xmm6
; SSE42-NEXT: pand %xmm10, %xmm6
; SSE42-NEXT: movdqa %xmm8, %xmm7
; SSE42-NEXT: pshufb %xmm6, %xmm7
-; SSE42-NEXT: psrlw $4, %xmm12
-; SSE42-NEXT: pand %xmm10, %xmm12
+; SSE42-NEXT: psrlw $4, %xmm11
+; SSE42-NEXT: pand %xmm10, %xmm11
; SSE42-NEXT: movdqa %xmm8, %xmm6
-; SSE42-NEXT: pshufb %xmm12, %xmm6
-; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12
-; SSE42-NEXT: psadbw %xmm0, %xmm14
+; SSE42-NEXT: pshufb %xmm11, %xmm6
+; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
; SSE42-NEXT: paddb %xmm7, %xmm6
-; SSE42-NEXT: psadbw %xmm0, %xmm6
-; SSE42-NEXT: paddq %xmm14, %xmm6
-; SSE42-NEXT: movdqa %xmm12, %xmm7
-; SSE42-NEXT: pand %xmm10, %xmm7
-; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm7, %xmm13
-; SSE42-NEXT: psrlw $4, %xmm12
-; SSE42-NEXT: pand %xmm10, %xmm12
-; SSE42-NEXT: movdqa %xmm8, %xmm14
-; SSE42-NEXT: pshufb %xmm12, %xmm14
-; SSE42-NEXT: paddb %xmm13, %xmm14
+; SSE42-NEXT: paddb %xmm13, %xmm6
; SSE42-NEXT: movdqa %xmm11, %xmm7
; SSE42-NEXT: pand %xmm10, %xmm7
; SSE42-NEXT: movdqa %xmm8, %xmm12
; SSE42-NEXT: pshufb %xmm7, %xmm12
; SSE42-NEXT: psrlw $4, %xmm11
; SSE42-NEXT: pand %xmm10, %xmm11
-; SSE42-NEXT: movdqa %xmm8, %xmm7
-; SSE42-NEXT: pshufb %xmm11, %xmm7
-; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
-; SSE42-NEXT: psadbw %xmm0, %xmm14
-; SSE42-NEXT: paddb %xmm12, %xmm7
-; SSE42-NEXT: psadbw %xmm0, %xmm7
-; SSE42-NEXT: paddq %xmm14, %xmm7
-; SSE42-NEXT: movdqa %xmm11, %xmm12
-; SSE42-NEXT: pand %xmm10, %xmm12
; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm12, %xmm13
-; SSE42-NEXT: psrlw $4, %xmm11
+; SSE42-NEXT: pshufb %xmm11, %xmm13
+; SSE42-NEXT: paddb %xmm12, %xmm13
+; SSE42-NEXT: movdqa %xmm0, %xmm7
+; SSE42-NEXT: pand %xmm10, %xmm7
+; SSE42-NEXT: movdqa %xmm8, %xmm11
+; SSE42-NEXT: pshufb %xmm7, %xmm11
+; SSE42-NEXT: psrlw $4, %xmm0
+; SSE42-NEXT: pand %xmm10, %xmm0
+; SSE42-NEXT: movdqa %xmm8, %xmm7
+; SSE42-NEXT: pshufb %xmm0, %xmm7
+; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0
+; SSE42-NEXT: paddb %xmm11, %xmm7
+; SSE42-NEXT: paddb %xmm13, %xmm7
+; SSE42-NEXT: movdqa %xmm0, %xmm11
; SSE42-NEXT: pand %xmm10, %xmm11
; SSE42-NEXT: movdqa %xmm8, %xmm12
; SSE42-NEXT: pshufb %xmm11, %xmm12
-; SSE42-NEXT: paddb %xmm13, %xmm12
-; SSE42-NEXT: movdqa %xmm9, %xmm11
-; SSE42-NEXT: pand %xmm10, %xmm11
-; SSE42-NEXT: movdqa %xmm8, %xmm13
-; SSE42-NEXT: pshufb %xmm11, %xmm13
+; SSE42-NEXT: psrlw $4, %xmm0
+; SSE42-NEXT: pand %xmm10, %xmm0
+; SSE42-NEXT: movdqa %xmm8, %xmm11
+; SSE42-NEXT: pshufb %xmm0, %xmm11
+; SSE42-NEXT: paddb %xmm12, %xmm11
+; SSE42-NEXT: movdqa %xmm9, %xmm0
+; SSE42-NEXT: pand %xmm10, %xmm0
+; SSE42-NEXT: movdqa %xmm8, %xmm12
+; SSE42-NEXT: pshufb %xmm0, %xmm12
; SSE42-NEXT: psrlw $4, %xmm9
; SSE42-NEXT: pand %xmm10, %xmm9
; SSE42-NEXT: pshufb %xmm9, %xmm8
-; SSE42-NEXT: paddb %xmm13, %xmm8
-; SSE42-NEXT: psadbw %xmm0, %xmm12
-; SSE42-NEXT: psadbw %xmm0, %xmm8
-; SSE42-NEXT: paddq %xmm12, %xmm8
+; SSE42-NEXT: paddb %xmm12, %xmm8
+; SSE42-NEXT: paddb %xmm11, %xmm8
+; SSE42-NEXT: pxor %xmm9, %xmm9
+; SSE42-NEXT: psadbw %xmm9, %xmm1
; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
; SSE42-NEXT: paddq %xmm1, %xmm0
+; SSE42-NEXT: psadbw %xmm9, %xmm3
; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
; SSE42-NEXT: paddq %xmm3, %xmm1
; SSE42-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; SSE42-NEXT: psadbw %xmm9, %xmm2
; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
; SSE42-NEXT: paddq %xmm2, %xmm1
+; SSE42-NEXT: psadbw %xmm9, %xmm4
; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm4[2,3,2,3]
; SSE42-NEXT: paddq %xmm4, %xmm2
; SSE42-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE42-NEXT: psadbw %xmm9, %xmm5
; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
; SSE42-NEXT: paddq %xmm5, %xmm1
+; SSE42-NEXT: psadbw %xmm9, %xmm6
; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm6[2,3,2,3]
; SSE42-NEXT: paddq %xmm6, %xmm2
; SSE42-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
+; SSE42-NEXT: psadbw %xmm9, %xmm7
; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm7[2,3,2,3]
; SSE42-NEXT: paddq %xmm7, %xmm2
+; SSE42-NEXT: psadbw %xmm9, %xmm8
; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm8[2,3,2,3]
; SSE42-NEXT: paddq %xmm8, %xmm3
; SSE42-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
More information about the llvm-commits
mailing list