[llvm] r360360 - [X86][SSE] Fold add(shuffle(), shuffle()) to hadd on 'slow' targets (PR39920)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu May 9 10:45:01 PDT 2019
Author: rksimon
Date: Thu May 9 10:45:01 2019
New Revision: 360360
URL: http://llvm.org/viewvc/llvm-project?rev=360360&view=rev
Log:
[X86][SSE] Fold add(shuffle(),shuffle()) to hadd on 'slow' targets (PR39920)
As reported on PR39920, "slow horizontal ops" targets tend to internally expand to 2*shuffle+add/sub - so if we can reduce 2*shuffle+add/sub to a hadd/sub then we should do it - similar port usage but reduced instruction count.
This works out in most cases, although the "PR22377" regression in vector-shuffle-combining.ll is annoying - going from 2*shuffle+add+shuffle to hadd+2*shuffle - I've opened PR41813 to cover this.
Differential Revision: https://reviews.llvm.org/D61308
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
llvm/trunk/test/CodeGen/X86/avx2-phaddsub.ll
llvm/trunk/test/CodeGen/X86/haddsub-shuf.ll
llvm/trunk/test/CodeGen/X86/haddsub-undef.ll
llvm/trunk/test/CodeGen/X86/haddsub.ll
llvm/trunk/test/CodeGen/X86/phaddsub.ll
llvm/trunk/test/CodeGen/X86/vector-shuffle-combining.ll
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=360360&r1=360359&r2=360360&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu May 9 10:45:01 2019
@@ -39412,7 +39412,8 @@ static bool isHorizontalBinOp(SDValue &L
GetShuffle(RHS, C, D, RMask);
// At least one of the operands should be a vector shuffle.
- if (LMask.empty() && RMask.empty())
+ unsigned NumShuffles = (LMask.empty() ? 0 : 1) + (RMask.empty() ? 0 : 1);
+ if (NumShuffles == 0)
return false;
if (LMask.empty()) {
@@ -39474,7 +39475,7 @@ static bool isHorizontalBinOp(SDValue &L
LHS = A.getNode() ? A : B; // If A is 'UNDEF', use B for it.
RHS = B.getNode() ? B : A; // If B is 'UNDEF', use A for it.
- if (!shouldUseHorizontalOp(LHS == RHS, DAG, Subtarget))
+ if (!shouldUseHorizontalOp(LHS == RHS && NumShuffles < 2, DAG, Subtarget))
return false;
LHS = DAG.getBitcast(VT, LHS);
Modified: llvm/trunk/test/CodeGen/X86/avx2-phaddsub.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx2-phaddsub.ll?rev=360360&r1=360359&r2=360360&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/avx2-phaddsub.ll (original)
+++ llvm/trunk/test/CodeGen/X86/avx2-phaddsub.ll Thu May 9 10:45:01 2019
@@ -69,29 +69,15 @@ define <8 x i32> @phaddd2(<8 x i32> %x,
}
define <8 x i32> @phaddd3(<8 x i32> %x) {
-; X32-SLOW-LABEL: phaddd3:
-; X32-SLOW: # %bb.0:
-; X32-SLOW-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; X32-SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; X32-SLOW-NEXT: vpaddd %ymm0, %ymm1, %ymm0
-; X32-SLOW-NEXT: retl
+; X32-LABEL: phaddd3:
+; X32: # %bb.0:
+; X32-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; X32-NEXT: retl
;
-; X32-FAST-LABEL: phaddd3:
-; X32-FAST: # %bb.0:
-; X32-FAST-NEXT: vphaddd %ymm0, %ymm0, %ymm0
-; X32-FAST-NEXT: retl
-;
-; X64-SLOW-LABEL: phaddd3:
-; X64-SLOW: # %bb.0:
-; X64-SLOW-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; X64-SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; X64-SLOW-NEXT: vpaddd %ymm0, %ymm1, %ymm0
-; X64-SLOW-NEXT: retq
-;
-; X64-FAST-LABEL: phaddd3:
-; X64-FAST: # %bb.0:
-; X64-FAST-NEXT: vphaddd %ymm0, %ymm0, %ymm0
-; X64-FAST-NEXT: retq
+; X64-LABEL: phaddd3:
+; X64: # %bb.0:
+; X64-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; X64-NEXT: retq
%a = shufflevector <8 x i32> %x, <8 x i32> undef, <8 x i32> <i32 undef, i32 2, i32 8, i32 10, i32 4, i32 6, i32 undef, i32 14>
%b = shufflevector <8 x i32> %x, <8 x i32> undef, <8 x i32> <i32 1, i32 3, i32 9, i32 undef, i32 5, i32 7, i32 13, i32 15>
%r = add <8 x i32> %a, %b
Modified: llvm/trunk/test/CodeGen/X86/haddsub-shuf.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/haddsub-shuf.ll?rev=360360&r1=360359&r2=360360&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/haddsub-shuf.ll (original)
+++ llvm/trunk/test/CodeGen/X86/haddsub-shuf.ll Thu May 9 10:45:01 2019
@@ -10,45 +10,15 @@
; PR34111 - https://bugs.llvm.org/show_bug.cgi?id=34111
define <4 x float> @hadd_v4f32(<4 x float> %a) {
-; SSSE3_SLOW-LABEL: hadd_v4f32:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movaps %xmm0, %xmm1
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: addps %xmm1, %xmm0
-; SSSE3_SLOW-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hadd_v4f32:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: haddps %xmm0, %xmm0
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hadd_v4f32:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX1_SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hadd_v4f32:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hadd_v4f32:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX2_SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX2_SLOW-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hadd_v4f32:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: haddps %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hadd_v4f32:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hadd_v4f32:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a02 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 2>
%a13 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 1, i32 3>
%hop = fadd <2 x float> %a02, %a13
@@ -87,51 +57,16 @@ define <8 x float> @hadd_v8f32a(<8 x flo
}
define <8 x float> @hadd_v8f32b(<8 x float> %a) {
-; SSSE3_SLOW-LABEL: hadd_v8f32b:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movaps %xmm0, %xmm2
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm0[2,3]
-; SSSE3_SLOW-NEXT: movaps %xmm1, %xmm3
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm1[2,3]
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: addps %xmm2, %xmm0
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,2,3]
-; SSSE3_SLOW-NEXT: addps %xmm3, %xmm1
-; SSSE3_SLOW-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]
-; SSSE3_SLOW-NEXT: movddup {{.*#+}} xmm1 = xmm1[0,0]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hadd_v8f32b:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: haddps %xmm0, %xmm0
-; SSSE3_FAST-NEXT: haddps %xmm1, %xmm1
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hadd_v8f32b:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX1_SLOW-NEXT: vaddps %ymm0, %ymm1, %ymm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hadd_v8f32b:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vhaddps %ymm0, %ymm0, %ymm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hadd_v8f32b:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX2_SLOW-NEXT: vaddps %ymm0, %ymm1, %ymm0
-; AVX2_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hadd_v8f32b:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: haddps %xmm0, %xmm0
+; SSSE3-NEXT: haddps %xmm1, %xmm1
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hadd_v8f32b:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vhaddps %ymm0, %ymm0, %ymm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hadd_v8f32b:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %ymm0, %ymm0, %ymm0
+; AVX-NEXT: retq
%a0 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>
%a1 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>
%hop = fadd <8 x float> %a0, %a1
@@ -140,45 +75,15 @@ define <8 x float> @hadd_v8f32b(<8 x flo
}
define <4 x float> @hsub_v4f32(<4 x float> %a) {
-; SSSE3_SLOW-LABEL: hsub_v4f32:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movaps %xmm0, %xmm1
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: subps %xmm0, %xmm1
-; SSSE3_SLOW-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hsub_v4f32:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: hsubps %xmm0, %xmm0
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hsub_v4f32:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX1_SLOW-NEXT: vsubps %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hsub_v4f32:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vhsubps %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hsub_v4f32:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX2_SLOW-NEXT: vsubps %xmm0, %xmm1, %xmm0
-; AVX2_SLOW-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hsub_v4f32:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: hsubps %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hsub_v4f32:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vhsubps %xmm0, %xmm0, %xmm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hsub_v4f32:
+; AVX: # %bb.0:
+; AVX-NEXT: vhsubps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a02 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 2>
%a13 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 1, i32 3>
%hop = fsub <2 x float> %a02, %a13
@@ -217,51 +122,16 @@ define <8 x float> @hsub_v8f32a(<8 x flo
}
define <8 x float> @hsub_v8f32b(<8 x float> %a) {
-; SSSE3_SLOW-LABEL: hsub_v8f32b:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movaps %xmm0, %xmm2
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm0[2,3]
-; SSSE3_SLOW-NEXT: movaps %xmm1, %xmm3
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm1[2,3]
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: subps %xmm0, %xmm2
-; SSSE3_SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,2,3]
-; SSSE3_SLOW-NEXT: subps %xmm1, %xmm3
-; SSSE3_SLOW-NEXT: movddup {{.*#+}} xmm0 = xmm2[0,0]
-; SSSE3_SLOW-NEXT: movddup {{.*#+}} xmm1 = xmm3[0,0]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hsub_v8f32b:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: hsubps %xmm0, %xmm0
-; SSSE3_FAST-NEXT: hsubps %xmm1, %xmm1
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hsub_v8f32b:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX1_SLOW-NEXT: vsubps %ymm0, %ymm1, %ymm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hsub_v8f32b:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vhsubps %ymm0, %ymm0, %ymm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hsub_v8f32b:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX2_SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX2_SLOW-NEXT: vsubps %ymm0, %ymm1, %ymm0
-; AVX2_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hsub_v8f32b:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: hsubps %xmm0, %xmm0
+; SSSE3-NEXT: hsubps %xmm1, %xmm1
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hsub_v8f32b:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vhsubps %ymm0, %ymm0, %ymm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hsub_v8f32b:
+; AVX: # %bb.0:
+; AVX-NEXT: vhsubps %ymm0, %ymm0, %ymm0
+; AVX-NEXT: retq
%a0 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>
%a1 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>
%hop = fsub <8 x float> %a0, %a1
@@ -536,44 +406,15 @@ define <4 x double> @hsub_v4f64(<4 x dou
}
define <4 x i32> @hadd_v4i32(<4 x i32> %a) {
-; SSSE3_SLOW-LABEL: hadd_v4i32:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hadd_v4i32:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hadd_v4i32:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX1_SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hadd_v4i32:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hadd_v4i32:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX2_SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX2_SLOW-NEXT: vpbroadcastq %xmm0, %xmm0
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hadd_v4i32:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hadd_v4i32:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hadd_v4i32:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a02 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
%a13 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>
%hop = add <4 x i32> %a02, %a13
@@ -612,57 +453,25 @@ define <8 x i32> @hadd_v8i32a(<8 x i32>
}
define <8 x i32> @hadd_v8i32b(<8 x i32> %a) {
-; SSSE3_SLOW-LABEL: hadd_v8i32b:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,2,2,3]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: paddd %xmm2, %xmm0
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
-; SSSE3_SLOW-NEXT: paddd %xmm3, %xmm1
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hadd_v8i32b:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3_FAST-NEXT: phaddd %xmm1, %xmm1
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hadd_v8i32b:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX1_SLOW-NEXT: vextractf128 $1, %ymm0, %xmm2
-; AVX1_SLOW-NEXT: vextractf128 $1, %ymm1, %xmm3
-; AVX1_SLOW-NEXT: vpaddd %xmm2, %xmm3, %xmm2
-; AVX1_SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hadd_v8i32b:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm1
-; AVX1_FAST-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1_FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
-; AVX1_FAST-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_FAST-NEXT: retq
+; SSSE3-LABEL: hadd_v8i32b:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: phaddd %xmm1, %xmm1
+; SSSE3-NEXT: retq
;
-; AVX2_SLOW-LABEL: hadd_v8i32b:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX2_SLOW-NEXT: vpaddd %ymm0, %ymm1, %ymm0
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[0,1,0,1,4,5,4,5]
-; AVX2_SLOW-NEXT: retq
+; AVX1-LABEL: hadd_v8i32b:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vphaddd %xmm0, %xmm0, %xmm1
+; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; AVX1-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
+; AVX1-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
+; AVX1-NEXT: retq
;
-; AVX2_FAST-LABEL: hadd_v8i32b:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphaddd %ymm0, %ymm0, %ymm0
-; AVX2_FAST-NEXT: retq
+; AVX2-LABEL: hadd_v8i32b:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vphaddd %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: retq
%a0 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>
%a1 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>
%hop = add <8 x i32> %a0, %a1
@@ -671,44 +480,15 @@ define <8 x i32> @hadd_v8i32b(<8 x i32>
}
define <4 x i32> @hsub_v4i32(<4 x i32> %a) {
-; SSSE3_SLOW-LABEL: hsub_v4i32:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: psubd %xmm0, %xmm1
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hsub_v4i32:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phsubd %xmm0, %xmm0
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hsub_v4i32:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX1_SLOW-NEXT: vpsubd %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hsub_v4i32:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hsub_v4i32:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX2_SLOW-NEXT: vpsubd %xmm0, %xmm1, %xmm0
-; AVX2_SLOW-NEXT: vpbroadcastq %xmm0, %xmm0
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hsub_v4i32:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phsubd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hsub_v4i32:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hsub_v4i32:
+; AVX: # %bb.0:
+; AVX-NEXT: vphsubd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a02 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
%a13 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>
%hop = sub <4 x i32> %a02, %a13
@@ -747,57 +527,25 @@ define <8 x i32> @hsub_v8i32a(<8 x i32>
}
define <8 x i32> @hsub_v8i32b(<8 x i32> %a) {
-; SSSE3_SLOW-LABEL: hsub_v8i32b:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,2,2,3]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3_SLOW-NEXT: psubd %xmm0, %xmm2
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
-; SSSE3_SLOW-NEXT: psubd %xmm0, %xmm3
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hsub_v8i32b:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phsubd %xmm0, %xmm0
-; SSSE3_FAST-NEXT: phsubd %xmm1, %xmm1
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hsub_v8i32b:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX1_SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX1_SLOW-NEXT: vextractf128 $1, %ymm0, %xmm2
-; AVX1_SLOW-NEXT: vextractf128 $1, %ymm1, %xmm3
-; AVX1_SLOW-NEXT: vpsubd %xmm2, %xmm3, %xmm2
-; AVX1_SLOW-NEXT: vpsubd %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hsub_v8i32b:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm1
-; AVX1_FAST-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1_FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
-; AVX1_FAST-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_FAST-NEXT: retq
+; SSSE3-LABEL: hsub_v8i32b:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phsubd %xmm0, %xmm0
+; SSSE3-NEXT: phsubd %xmm1, %xmm1
+; SSSE3-NEXT: retq
;
-; AVX2_SLOW-LABEL: hsub_v8i32b:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX2_SLOW-NEXT: vpsubd %ymm0, %ymm1, %ymm0
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[0,1,0,1,4,5,4,5]
-; AVX2_SLOW-NEXT: retq
+; AVX1-LABEL: hsub_v8i32b:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vphsubd %xmm0, %xmm0, %xmm1
+; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; AVX1-NEXT: vphsubd %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
+; AVX1-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
+; AVX1-NEXT: retq
;
-; AVX2_FAST-LABEL: hsub_v8i32b:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphsubd %ymm0, %ymm0, %ymm0
-; AVX2_FAST-NEXT: retq
+; AVX2-LABEL: hsub_v8i32b:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vphsubd %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: retq
%a0 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>
%a1 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>
%hop = sub <8 x i32> %a0, %a1
@@ -806,45 +554,15 @@ define <8 x i32> @hsub_v8i32b(<8 x i32>
}
define <8 x i16> @hadd_v8i16(<8 x i16> %a) {
-; SSSE3_SLOW-LABEL: hadd_v8i16:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movdqa %xmm0, %xmm1
-; SSSE3_SLOW-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; SSSE3_SLOW-NEXT: pshufb {{.*#+}} xmm0 = xmm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; SSSE3_SLOW-NEXT: paddw %xmm1, %xmm0
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hadd_v8i16:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phaddw %xmm0, %xmm0
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hadd_v8i16:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpshufb {{.*#+}} xmm1 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; AVX1_SLOW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; AVX1_SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hadd_v8i16:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hadd_v8i16:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} xmm1 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; AVX2_SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0
-; AVX2_SLOW-NEXT: vpbroadcastq %xmm0, %xmm0
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hadd_v8i16:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddw %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hadd_v8i16:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hadd_v8i16:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a0246 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef>
%a1357 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
%hop = add <8 x i16> %a0246, %a1357
@@ -883,64 +601,25 @@ define <16 x i16> @hadd_v16i16a(<16 x i1
}
define <16 x i16> @hadd_v16i16b(<16 x i16> %a) {
-; SSSE3_SLOW-LABEL: hadd_v16i16b:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; SSSE3_SLOW-NEXT: movdqa %xmm0, %xmm3
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm3
-; SSSE3_SLOW-NEXT: movdqa %xmm1, %xmm4
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm4
-; SSSE3_SLOW-NEXT: movdqa {{.*#+}} xmm2 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm0
-; SSSE3_SLOW-NEXT: paddw %xmm3, %xmm0
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm1
-; SSSE3_SLOW-NEXT: paddw %xmm4, %xmm1
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hadd_v16i16b:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phaddw %xmm0, %xmm0
-; SSSE3_FAST-NEXT: phaddw %xmm1, %xmm1
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hadd_v16i16b:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; AVX1_SLOW-NEXT: vpshufb %xmm1, %xmm0, %xmm2
-; AVX1_SLOW-NEXT: vextractf128 $1, %ymm0, %xmm3
-; AVX1_SLOW-NEXT: vpshufb %xmm1, %xmm3, %xmm1
-; AVX1_SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; AVX1_SLOW-NEXT: vpshufb %xmm4, %xmm0, %xmm0
-; AVX1_SLOW-NEXT: vpaddw %xmm0, %xmm2, %xmm0
-; AVX1_SLOW-NEXT: vpshufb %xmm4, %xmm3, %xmm2
-; AVX1_SLOW-NEXT: vpaddw %xmm2, %xmm1, %xmm1
-; AVX1_SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hadd_v16i16b:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm1
-; AVX1_FAST-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1_FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
-; AVX1_FAST-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_FAST-NEXT: retq
+; SSSE3-LABEL: hadd_v16i16b:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddw %xmm0, %xmm0
+; SSSE3-NEXT: phaddw %xmm1, %xmm1
+; SSSE3-NEXT: retq
;
-; AVX2_SLOW-LABEL: hadd_v16i16b:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} ymm1 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15,18,19,22,23,26,27,30,31,30,31,26,27,28,29,30,31]
-; AVX2_SLOW-NEXT: vpaddw %ymm0, %ymm1, %ymm0
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[0,1,0,1,4,5,4,5]
-; AVX2_SLOW-NEXT: retq
+; AVX1-LABEL: hadd_v16i16b:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vphaddw %xmm0, %xmm0, %xmm1
+; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; AVX1-NEXT: vphaddw %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
+; AVX1-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
+; AVX1-NEXT: retq
;
-; AVX2_FAST-LABEL: hadd_v16i16b:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphaddw %ymm0, %ymm0, %ymm0
-; AVX2_FAST-NEXT: retq
+; AVX2-LABEL: hadd_v16i16b:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vphaddw %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: retq
%a0 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef, i32 8, i32 10, i32 12, i32 14, i32 undef, i32 undef, i32 undef, i32 undef>
%a1 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 9, i32 11, i32 13, i32 15, i32 undef, i32 undef, i32 undef, i32 undef>
%hop = add <16 x i16> %a0, %a1
@@ -949,45 +628,15 @@ define <16 x i16> @hadd_v16i16b(<16 x i1
}
define <8 x i16> @hsub_v8i16(<8 x i16> %a) {
-; SSSE3_SLOW-LABEL: hsub_v8i16:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movdqa %xmm0, %xmm1
-; SSSE3_SLOW-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; SSSE3_SLOW-NEXT: pshufb {{.*#+}} xmm0 = xmm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; SSSE3_SLOW-NEXT: psubw %xmm0, %xmm1
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hsub_v8i16:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phsubw %xmm0, %xmm0
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hsub_v8i16:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vpshufb {{.*#+}} xmm1 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; AVX1_SLOW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; AVX1_SLOW-NEXT: vpsubw %xmm0, %xmm1, %xmm0
-; AVX1_SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hsub_v8i16:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: retq
-;
-; AVX2_SLOW-LABEL: hsub_v8i16:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} xmm1 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; AVX2_SLOW-NEXT: vpsubw %xmm0, %xmm1, %xmm0
-; AVX2_SLOW-NEXT: vpbroadcastq %xmm0, %xmm0
-; AVX2_SLOW-NEXT: retq
+; SSSE3-LABEL: hsub_v8i16:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phsubw %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX2_FAST-LABEL: hsub_v8i16:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm0
-; AVX2_FAST-NEXT: retq
+; AVX-LABEL: hsub_v8i16:
+; AVX: # %bb.0:
+; AVX-NEXT: vphsubw %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a0246 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef>
%a1357 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
%hop = sub <8 x i16> %a0246, %a1357
@@ -1026,64 +675,25 @@ define <16 x i16> @hsub_v16i16a(<16 x i1
}
define <16 x i16> @hsub_v16i16b(<16 x i16> %a) {
-; SSSE3_SLOW-LABEL: hsub_v16i16b:
-; SSSE3_SLOW: # %bb.0:
-; SSSE3_SLOW-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; SSSE3_SLOW-NEXT: movdqa %xmm0, %xmm3
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm3
-; SSSE3_SLOW-NEXT: movdqa %xmm1, %xmm4
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm4
-; SSSE3_SLOW-NEXT: movdqa {{.*#+}} xmm2 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm0
-; SSSE3_SLOW-NEXT: psubw %xmm0, %xmm3
-; SSSE3_SLOW-NEXT: pshufb %xmm2, %xmm1
-; SSSE3_SLOW-NEXT: psubw %xmm1, %xmm4
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,1,0,1]
-; SSSE3_SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,1,0,1]
-; SSSE3_SLOW-NEXT: retq
-;
-; SSSE3_FAST-LABEL: hsub_v16i16b:
-; SSSE3_FAST: # %bb.0:
-; SSSE3_FAST-NEXT: phsubw %xmm0, %xmm0
-; SSSE3_FAST-NEXT: phsubw %xmm1, %xmm1
-; SSSE3_FAST-NEXT: retq
-;
-; AVX1_SLOW-LABEL: hsub_v16i16b:
-; AVX1_SLOW: # %bb.0:
-; AVX1_SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; AVX1_SLOW-NEXT: vpshufb %xmm1, %xmm0, %xmm2
-; AVX1_SLOW-NEXT: vextractf128 $1, %ymm0, %xmm3
-; AVX1_SLOW-NEXT: vpshufb %xmm1, %xmm3, %xmm1
-; AVX1_SLOW-NEXT: vmovdqa {{.*#+}} xmm4 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
-; AVX1_SLOW-NEXT: vpshufb %xmm4, %xmm0, %xmm0
-; AVX1_SLOW-NEXT: vpsubw %xmm0, %xmm2, %xmm0
-; AVX1_SLOW-NEXT: vpshufb %xmm4, %xmm3, %xmm2
-; AVX1_SLOW-NEXT: vpsubw %xmm2, %xmm1, %xmm1
-; AVX1_SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
-; AVX1_SLOW-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_SLOW-NEXT: retq
-;
-; AVX1_FAST-LABEL: hsub_v16i16b:
-; AVX1_FAST: # %bb.0:
-; AVX1_FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm1
-; AVX1_FAST-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1_FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm0
-; AVX1_FAST-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
-; AVX1_FAST-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
-; AVX1_FAST-NEXT: retq
+; SSSE3-LABEL: hsub_v16i16b:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phsubw %xmm0, %xmm0
+; SSSE3-NEXT: phsubw %xmm1, %xmm1
+; SSSE3-NEXT: retq
;
-; AVX2_SLOW-LABEL: hsub_v16i16b:
-; AVX2_SLOW: # %bb.0:
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} ymm1 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
-; AVX2_SLOW-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15,18,19,22,23,26,27,30,31,30,31,26,27,28,29,30,31]
-; AVX2_SLOW-NEXT: vpsubw %ymm0, %ymm1, %ymm0
-; AVX2_SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[0,1,0,1,4,5,4,5]
-; AVX2_SLOW-NEXT: retq
+; AVX1-LABEL: hsub_v16i16b:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vphsubw %xmm0, %xmm0, %xmm1
+; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; AVX1-NEXT: vphsubw %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
+; AVX1-NEXT: vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
+; AVX1-NEXT: retq
;
-; AVX2_FAST-LABEL: hsub_v16i16b:
-; AVX2_FAST: # %bb.0:
-; AVX2_FAST-NEXT: vphsubw %ymm0, %ymm0, %ymm0
-; AVX2_FAST-NEXT: retq
+; AVX2-LABEL: hsub_v16i16b:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vphsubw %ymm0, %ymm0, %ymm0
+; AVX2-NEXT: retq
%a0 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef, i32 8, i32 10, i32 12, i32 14, i32 undef, i32 undef, i32 undef, i32 undef>
%a1 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 9, i32 11, i32 13, i32 15, i32 undef, i32 undef, i32 undef, i32 undef>
%hop = sub <16 x i16> %a0, %a1
Modified: llvm/trunk/test/CodeGen/X86/haddsub-undef.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/haddsub-undef.ll?rev=360360&r1=360359&r2=360360&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/haddsub-undef.ll (original)
+++ llvm/trunk/test/CodeGen/X86/haddsub-undef.ll Thu May 9 10:45:01 2019
@@ -487,30 +487,15 @@ define <2 x double> @add_pd_010(<2 x dou
}
define <4 x float> @add_ps_007(<4 x float> %x) {
-; SSE-SLOW-LABEL: add_ps_007:
-; SSE-SLOW: # %bb.0:
-; SSE-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2]
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSE-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE-SLOW-NEXT: retq
-;
-; SSE-FAST-LABEL: add_ps_007:
-; SSE-FAST: # %bb.0:
-; SSE-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: add_ps_007:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,1,0,2]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
-;
-; AVX-FAST-LABEL: add_ps_007:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; SSE-LABEL: add_ps_007:
+; SSE: # %bb.0:
+; SSE-NEXT: haddps %xmm0, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: add_ps_007:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%l = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 2>
%r = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 3>
%add = fadd <4 x float> %l, %r
@@ -518,34 +503,17 @@ define <4 x float> @add_ps_007(<4 x floa
}
define <4 x float> @add_ps_030(<4 x float> %x) {
-; SSE-SLOW-LABEL: add_ps_030:
-; SSE-SLOW: # %bb.0:
-; SSE-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2]
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSE-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; SSE-SLOW-NEXT: retq
-;
-; SSE-FAST-LABEL: add_ps_030:
-; SSE-FAST: # %bb.0:
-; SSE-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE-FAST-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; SSE-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: add_ps_030:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,1,0,2]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; AVX-SLOW-NEXT: retq
-;
-; AVX-FAST-LABEL: add_ps_030:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; AVX-FAST-NEXT: retq
+; SSE-LABEL: add_ps_030:
+; SSE: # %bb.0:
+; SSE-NEXT: haddps %xmm0, %xmm0
+; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,2,2,3]
+; SSE-NEXT: retq
+;
+; AVX-LABEL: add_ps_030:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,2,2,3]
+; AVX-NEXT: retq
%l = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 2>
%r = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 3>
%add = fadd <4 x float> %l, %r
@@ -554,36 +522,15 @@ define <4 x float> @add_ps_030(<4 x floa
}
define <4 x float> @add_ps_007_2(<4 x float> %x) {
-; SSE-SLOW-LABEL: add_ps_007_2:
-; SSE-SLOW: # %bb.0:
-; SSE-SLOW-NEXT: movddup {{.*#+}} xmm1 = xmm0[0,0]
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSE-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE-SLOW-NEXT: retq
-;
-; SSE-FAST-LABEL: add_ps_007_2:
-; SSE-FAST: # %bb.0:
-; SSE-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE-FAST-NEXT: retq
-;
-; AVX1-SLOW-LABEL: add_ps_007_2:
-; AVX1-SLOW: # %bb.0:
-; AVX1-SLOW-NEXT: vmovddup {{.*#+}} xmm1 = xmm0[0,0]
-; AVX1-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX1-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX1-SLOW-NEXT: retq
-;
-; AVX-FAST-LABEL: add_ps_007_2:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
-;
-; AVX512-SLOW-LABEL: add_ps_007_2:
-; AVX512-SLOW: # %bb.0:
-; AVX512-SLOW-NEXT: vbroadcastss %xmm0, %xmm1
-; AVX512-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX512-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX512-SLOW-NEXT: retq
+; SSE-LABEL: add_ps_007_2:
+; SSE: # %bb.0:
+; SSE-NEXT: haddps %xmm0, %xmm0
+; SSE-NEXT: retq
+;
+; AVX-LABEL: add_ps_007_2:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%l = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 undef>
%r = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 undef>
%add = fadd <4 x float> %l, %r
@@ -651,41 +598,17 @@ define <4 x float> @add_ps_017(<4 x floa
}
define <4 x float> @add_ps_018(<4 x float> %x) {
-; SSE-SLOW-LABEL: add_ps_018:
-; SSE-SLOW: # %bb.0:
-; SSE-SLOW-NEXT: movddup {{.*#+}} xmm1 = xmm0[0,0]
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSE-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE-SLOW-NEXT: retq
-;
-; SSE-FAST-LABEL: add_ps_018:
-; SSE-FAST: # %bb.0:
-; SSE-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE-FAST-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE-FAST-NEXT: retq
-;
-; AVX1-SLOW-LABEL: add_ps_018:
-; AVX1-SLOW: # %bb.0:
-; AVX1-SLOW-NEXT: vmovddup {{.*#+}} xmm1 = xmm0[0,0]
-; AVX1-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX1-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX1-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; AVX1-SLOW-NEXT: retq
-;
-; AVX-FAST-LABEL: add_ps_018:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; AVX-FAST-NEXT: retq
-;
-; AVX512-SLOW-LABEL: add_ps_018:
-; AVX512-SLOW: # %bb.0:
-; AVX512-SLOW-NEXT: vbroadcastss %xmm0, %xmm1
-; AVX512-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX512-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX512-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; AVX512-SLOW-NEXT: retq
+; SSE-LABEL: add_ps_018:
+; SSE: # %bb.0:
+; SSE-NEXT: haddps %xmm0, %xmm0
+; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE-NEXT: retq
+;
+; AVX-LABEL: add_ps_018:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; AVX-NEXT: retq
%l = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 undef>
%r = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 undef>
%add = fadd <4 x float> %l, %r
Modified: llvm/trunk/test/CodeGen/X86/haddsub.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/haddsub.ll?rev=360360&r1=360359&r2=360360&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/haddsub.ll (original)
+++ llvm/trunk/test/CodeGen/X86/haddsub.ll Thu May 9 10:45:01 2019
@@ -103,30 +103,15 @@ define <4 x float> @haddps2(<4 x float>
}
define <4 x float> @haddps3(<4 x float> %x) {
-; SSE3-SLOW-LABEL: haddps3:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
-; SSE3-SLOW-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
-; SSE3-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: haddps3:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: haddps3:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
-; AVX-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: haddps3:
+; SSE3: # %bb.0:
+; SSE3-NEXT: haddps %xmm0, %xmm0
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: haddps3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: haddps3:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6>
%b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7>
%r = fadd <4 x float> %a, %b
@@ -134,30 +119,15 @@ define <4 x float> @haddps3(<4 x float>
}
define <4 x float> @haddps4(<4 x float> %x) {
-; SSE3-SLOW-LABEL: haddps4:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSE3-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: haddps4:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: haddps4:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: haddps4:
+; SSE3: # %bb.0:
+; SSE3-NEXT: haddps %xmm0, %xmm0
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: haddps4:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: haddps4:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
%b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>
%r = fadd <4 x float> %a, %b
@@ -165,30 +135,15 @@ define <4 x float> @haddps4(<4 x float>
}
define <4 x float> @haddps5(<4 x float> %x) {
-; SSE3-SLOW-LABEL: haddps5:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,3],xmm0[2,3]
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2,2,3]
-; SSE3-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: haddps5:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: haddps5:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,3,2,3]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,2,2,3]
-; AVX-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: haddps5:
+; SSE3: # %bb.0:
+; SSE3-NEXT: haddps %xmm0, %xmm0
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: haddps5:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: haddps5:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 undef, i32 undef>
%b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 undef, i32 undef>
%r = fadd <4 x float> %a, %b
@@ -224,30 +179,15 @@ define <4 x float> @haddps6(<4 x float>
}
define <4 x float> @haddps7(<4 x float> %x) {
-; SSE3-SLOW-LABEL: haddps7:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE3-SLOW-NEXT: addps %xmm1, %xmm0
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: haddps7:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: haddps7:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: haddps7:
+; SSE3: # %bb.0:
+; SSE3-NEXT: haddps %xmm0, %xmm0
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: haddps7:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: haddps7:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 3, i32 undef, i32 undef>
%b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 2, i32 undef, i32 undef>
%r = fadd <4 x float> %a, %b
@@ -316,31 +256,15 @@ define <4 x float> @hsubps1(<4 x float>
}
define <4 x float> @hsubps2(<4 x float> %x) {
-; SSE3-SLOW-LABEL: hsubps2:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
-; SSE3-SLOW-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
-; SSE3-SLOW-NEXT: subps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: movaps %xmm1, %xmm0
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: hsubps2:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: hsubps %xmm0, %xmm0
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: hsubps2:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
-; AVX-SLOW-NEXT: vsubps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: hsubps2:
+; SSE3: # %bb.0:
+; SSE3-NEXT: hsubps %xmm0, %xmm0
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: hsubps2:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhsubps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: hsubps2:
+; AVX: # %bb.0:
+; AVX-NEXT: vhsubps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6>
%b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7>
%r = fsub <4 x float> %a, %b
@@ -348,31 +272,15 @@ define <4 x float> @hsubps2(<4 x float>
}
define <4 x float> @hsubps3(<4 x float> %x) {
-; SSE3-SLOW-LABEL: hsubps3:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSE3-SLOW-NEXT: subps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: movaps %xmm1, %xmm0
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: hsubps3:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: hsubps %xmm0, %xmm0
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: hsubps3:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX-SLOW-NEXT: vsubps %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: hsubps3:
+; SSE3: # %bb.0:
+; SSE3-NEXT: hsubps %xmm0, %xmm0
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: hsubps3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhsubps %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: hsubps3:
+; AVX: # %bb.0:
+; AVX-NEXT: vhsubps %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
%b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>
%r = fsub <4 x float> %a, %b
@@ -442,35 +350,16 @@ define <8 x float> @vhaddps2(<8 x float>
}
define <8 x float> @vhaddps3(<8 x float> %x) {
-; SSE3-SLOW-LABEL: vhaddps3:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm1, %xmm2
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[2,3]
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm3
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm0[2,3]
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,2,3]
-; SSE3-SLOW-NEXT: addps %xmm2, %xmm1
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSE3-SLOW-NEXT: addps %xmm3, %xmm0
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: vhaddps3:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: haddps %xmm0, %xmm0
-; SSE3-FAST-NEXT: haddps %xmm1, %xmm1
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: vhaddps3:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX-SLOW-NEXT: vaddps %ymm0, %ymm1, %ymm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: vhaddps3:
+; SSE3: # %bb.0:
+; SSE3-NEXT: haddps %xmm0, %xmm0
+; SSE3-NEXT: haddps %xmm1, %xmm1
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: vhaddps3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhaddps %ymm0, %ymm0, %ymm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: vhaddps3:
+; AVX: # %bb.0:
+; AVX-NEXT: vhaddps %ymm0, %ymm0, %ymm0
+; AVX-NEXT: retq
%a = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 undef, i32 2, i32 8, i32 10, i32 4, i32 6, i32 undef, i32 14>
%b = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 9, i32 undef, i32 5, i32 7, i32 13, i32 15>
%r = fadd <8 x float> %a, %b
@@ -495,37 +384,16 @@ define <8 x float> @vhsubps1(<8 x float>
}
define <8 x float> @vhsubps3(<8 x float> %x) {
-; SSE3-SLOW-LABEL: vhsubps3:
-; SSE3-SLOW: # %bb.0:
-; SSE3-SLOW-NEXT: movaps %xmm1, %xmm2
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[2,3]
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm3
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm0[2,3]
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,2,3]
-; SSE3-SLOW-NEXT: subps %xmm1, %xmm2
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSE3-SLOW-NEXT: subps %xmm0, %xmm3
-; SSE3-SLOW-NEXT: movaps %xmm3, %xmm0
-; SSE3-SLOW-NEXT: movaps %xmm2, %xmm1
-; SSE3-SLOW-NEXT: retq
-;
-; SSE3-FAST-LABEL: vhsubps3:
-; SSE3-FAST: # %bb.0:
-; SSE3-FAST-NEXT: hsubps %xmm0, %xmm0
-; SSE3-FAST-NEXT: hsubps %xmm1, %xmm1
-; SSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: vhsubps3:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm0[0,2,2,3,4,6,6,7]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,3,2,3,5,7,6,7]
-; AVX-SLOW-NEXT: vsubps %ymm0, %ymm1, %ymm0
-; AVX-SLOW-NEXT: retq
+; SSE3-LABEL: vhsubps3:
+; SSE3: # %bb.0:
+; SSE3-NEXT: hsubps %xmm0, %xmm0
+; SSE3-NEXT: hsubps %xmm1, %xmm1
+; SSE3-NEXT: retq
;
-; AVX-FAST-LABEL: vhsubps3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vhsubps %ymm0, %ymm0, %ymm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: vhsubps3:
+; AVX: # %bb.0:
+; AVX-NEXT: vhsubps %ymm0, %ymm0, %ymm0
+; AVX-NEXT: retq
%a = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 undef, i32 2, i32 8, i32 10, i32 4, i32 6, i32 undef, i32 14>
%b = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 9, i32 undef, i32 5, i32 7, i32 13, i32 15>
%r = fsub <8 x float> %a, %b
@@ -1865,10 +1733,7 @@ define float @PR39936_v8f32(<8 x float>)
; SSE3-SLOW-LABEL: PR39936_v8f32:
; SSE3-SLOW: # %bb.0:
; SSE3-SLOW-NEXT: haddps %xmm1, %xmm0
-; SSE3-SLOW-NEXT: movaps %xmm0, %xmm1
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
-; SSE3-SLOW-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSE3-SLOW-NEXT: addps %xmm1, %xmm0
+; SSE3-SLOW-NEXT: haddps %xmm0, %xmm0
; SSE3-SLOW-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
; SSE3-SLOW-NEXT: addss %xmm1, %xmm0
; SSE3-SLOW-NEXT: retq
@@ -1884,9 +1749,7 @@ define float @PR39936_v8f32(<8 x float>)
; AVX-SLOW: # %bb.0:
; AVX-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1
; AVX-SLOW-NEXT: vhaddps %xmm1, %xmm0, %xmm0
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX-SLOW-NEXT: vaddps %xmm0, %xmm1, %xmm0
+; AVX-SLOW-NEXT: vhaddps %xmm0, %xmm0, %xmm0
; AVX-SLOW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
; AVX-SLOW-NEXT: vaddss %xmm1, %xmm0, %xmm0
; AVX-SLOW-NEXT: vzeroupper
Modified: llvm/trunk/test/CodeGen/X86/phaddsub.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/phaddsub.ll?rev=360360&r1=360359&r2=360360&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/phaddsub.ll (original)
+++ llvm/trunk/test/CodeGen/X86/phaddsub.ll Thu May 9 10:45:01 2019
@@ -71,29 +71,15 @@ define <4 x i32> @phaddd2(<4 x i32> %x,
}
define <4 x i32> @phaddd3(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd3:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd3:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddd3:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
-; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddd3:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddd3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddd3:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6>
%b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7>
%r = add <4 x i32> %a, %b
@@ -101,29 +87,15 @@ define <4 x i32> @phaddd3(<4 x i32> %x)
}
define <4 x i32> @phaddd4(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd4:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd4:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddd4:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddd4:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddd4:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddd4:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
%b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>
%r = add <4 x i32> %a, %b
@@ -131,29 +103,15 @@ define <4 x i32> @phaddd4(<4 x i32> %x)
}
define <4 x i32> @phaddd5(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd5:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,3,2,3]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,2,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd5:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddd5:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,3,2,3]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,2,2,3]
-; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddd5:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddd5:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddd5:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 undef, i32 undef>
%b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 undef, i32 undef>
%r = add <4 x i32> %a, %b
@@ -189,29 +147,15 @@ define <4 x i32> @phaddd6(<4 x i32> %x)
}
define <4 x i32> @phaddd7(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd7:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd7:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddd7:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
-; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddd7:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddd7:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddd7:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 3, i32 undef, i32 undef>
%b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 2, i32 undef, i32 undef>
%r = add <4 x i32> %a, %b
@@ -251,30 +195,15 @@ define <4 x i32> @phsubd1(<4 x i32> %x,
}
define <4 x i32> @phsubd2(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phsubd2:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
-; SSSE3-SLOW-NEXT: psubd %xmm0, %xmm1
-; SSSE3-SLOW-NEXT: movdqa %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phsubd2:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phsubd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phsubd2:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
-; AVX-SLOW-NEXT: vpsubd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phsubd2:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phsubd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phsubd2:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phsubd2:
+; AVX: # %bb.0:
+; AVX-NEXT: vphsubd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6>
%b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7>
%r = sub <4 x i32> %a, %b
@@ -282,30 +211,15 @@ define <4 x i32> @phsubd2(<4 x i32> %x)
}
define <4 x i32> @phsubd3(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phsubd3:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3-SLOW-NEXT: psubd %xmm0, %xmm1
-; SSSE3-SLOW-NEXT: movdqa %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phsubd3:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phsubd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phsubd3:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX-SLOW-NEXT: vpsubd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phsubd3:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phsubd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phsubd3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phsubd3:
+; AVX: # %bb.0:
+; AVX-NEXT: vphsubd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>
%b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>
%r = sub <4 x i32> %a, %b
@@ -398,29 +312,15 @@ define <4 x i32> @phsubd1_reverse(<4 x i
}
define <4 x i32> @phaddd_single_source1(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd_single_source1:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,2]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd_single_source1:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddd_single_source1:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,2]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddd_single_source1:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddd_single_source1:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddd_single_source1:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 2>
%r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 3>
%add = add <4 x i32> %l, %r
@@ -428,33 +328,17 @@ define <4 x i32> @phaddd_single_source1(
}
define <4 x i32> @phaddd_single_source2(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd_single_source2:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,2]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd_single_source2:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddd_single_source2:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,2]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddd_single_source2:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,2,2,3]
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddd_single_source2:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,2,3]
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddd_single_source2:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,2,2,3]
+; AVX-NEXT: retq
%l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 2>
%r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 3>
%add = add <4 x i32> %l, %r
@@ -463,36 +347,15 @@ define <4 x i32> @phaddd_single_source2(
}
define <4 x i32> @phaddd_single_source3(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd_single_source3:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd_single_source3:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX1-SLOW-LABEL: phaddd_single_source3:
-; AVX1-SLOW: # %bb.0:
-; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; AVX1-SLOW-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
-; AVX1-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX1-SLOW-NEXT: retq
-;
-; AVX-FAST-LABEL: phaddd_single_source3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; SSSE3-LABEL: phaddd_single_source3:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX2-SLOW-LABEL: phaddd_single_source3:
-; AVX2-SLOW: # %bb.0:
-; AVX2-SLOW-NEXT: vpbroadcastd %xmm0, %xmm1
-; AVX2-SLOW-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
-; AVX2-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX2-SLOW-NEXT: retq
+; AVX-LABEL: phaddd_single_source3:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 undef>
%r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 undef>
%add = add <4 x i32> %l, %r
@@ -559,41 +422,17 @@ define <4 x i32> @phaddd_single_source5(
}
define <4 x i32> @phaddd_single_source6(<4 x i32> %x) {
-; SSSE3-SLOW-LABEL: phaddd_single_source6:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddd_single_source6:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0
-; SSSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
-; SSSE3-FAST-NEXT: retq
-;
-; AVX1-SLOW-LABEL: phaddd_single_source6:
-; AVX1-SLOW: # %bb.0:
-; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; AVX1-SLOW-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
-; AVX1-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
-; AVX1-SLOW-NEXT: retq
-;
-; AVX-FAST-LABEL: phaddd_single_source6:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
-; AVX-FAST-NEXT: retq
+; SSSE3-LABEL: phaddd_single_source6:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddd %xmm0, %xmm0
+; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
+; SSSE3-NEXT: retq
;
-; AVX2-SLOW-LABEL: phaddd_single_source6:
-; AVX2-SLOW: # %bb.0:
-; AVX2-SLOW-NEXT: vpbroadcastd %xmm0, %xmm1
-; AVX2-SLOW-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
-; AVX2-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
-; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
-; AVX2-SLOW-NEXT: retq
+; AVX-LABEL: phaddd_single_source6:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,2,3,3]
+; AVX-NEXT: retq
%l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 undef>
%r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 undef>
%add = add <4 x i32> %l, %r
@@ -602,30 +441,15 @@ define <4 x i32> @phaddd_single_source6(
}
define <8 x i16> @phaddw_single_source1(<8 x i16> %x) {
-; SSSE3-SLOW-LABEL: phaddw_single_source1:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: movdqa %xmm0, %xmm1
-; SSSE3-SLOW-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,4,5,6,7,0,1,4,5,8,9,12,13]
-; SSSE3-SLOW-NEXT: pshufb {{.*#+}} xmm0 = xmm0[6,7,2,3,4,5,6,7,2,3,6,7,10,11,14,15]
-; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddw_single_source1:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddw_single_source1:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshufb {{.*#+}} xmm1 = xmm0[0,1,4,5,4,5,6,7,0,1,4,5,8,9,12,13]
-; AVX-SLOW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[6,7,2,3,4,5,6,7,2,3,6,7,10,11,14,15]
-; AVX-SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddw_single_source1:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddw %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddw_single_source1:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddw_single_source1:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 2, i32 4, i32 6>
%r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 3, i32 5, i32 7>
%add = add <8 x i16> %l, %r
@@ -633,41 +457,19 @@ define <8 x i16> @phaddw_single_source1(
}
define <8 x i16> @phaddw_single_source2(<8 x i16> %x) {
-; SSSE3-SLOW-LABEL: phaddw_single_source2:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
-; SSSE3-SLOW-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,3,4,5,6,7]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
-; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddw_single_source2:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0
-; SSSE3-FAST-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
-; SSSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddw_single_source2:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
-; AVX-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[1,3,2,3,4,5,6,7]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
-; AVX-SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddw_single_source2:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddw %xmm0, %xmm0
+; SSSE3-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
+; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddw_single_source2:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
-; AVX-FAST-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddw_single_source2:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0
+; AVX-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
+; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
+; AVX-NEXT: retq
%l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 2, i32 4, i32 6>
%r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 3, i32 5, i32 7>
%add = add <8 x i16> %l, %r
@@ -676,33 +478,15 @@ define <8 x i16> @phaddw_single_source2(
}
define <8 x i16> @phaddw_single_source3(<8 x i16> %x) {
-; SSSE3-SLOW-LABEL: phaddw_single_source3:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
-; SSSE3-SLOW-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,3,4,5,6,7]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
-; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddw_single_source3:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0
-; SSSE3-FAST-NEXT: retq
-;
-; AVX-SLOW-LABEL: phaddw_single_source3:
-; AVX-SLOW: # %bb.0:
-; AVX-SLOW-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,3]
-; AVX-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[1,3,2,3,4,5,6,7]
-; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
-; AVX-SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0
-; AVX-SLOW-NEXT: retq
+; SSSE3-LABEL: phaddw_single_source3:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddw %xmm0, %xmm0
+; SSSE3-NEXT: retq
;
-; AVX-FAST-LABEL: phaddw_single_source3:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: retq
+; AVX-LABEL: phaddw_single_source3:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0
+; AVX-NEXT: retq
%l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 2, i32 undef, i32 undef>
%r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 3, i32 undef, i32 undef>
%add = add <8 x i16> %l, %r
@@ -739,42 +523,17 @@ define <8 x i16> @phaddw_single_source4(
}
define <8 x i16> @phaddw_single_source6(<8 x i16> %x) {
-; SSSE3-SLOW-LABEL: phaddw_single_source6:
-; SSSE3-SLOW: # %bb.0:
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,3]
-; SSSE3-SLOW-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
-; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
-; SSSE3-SLOW-NEXT: retq
-;
-; SSSE3-FAST-LABEL: phaddw_single_source6:
-; SSSE3-FAST: # %bb.0:
-; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0
-; SSSE3-FAST-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
-; SSSE3-FAST-NEXT: retq
-;
-; AVX1-SLOW-LABEL: phaddw_single_source6:
-; AVX1-SLOW: # %bb.0:
-; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; AVX1-SLOW-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
-; AVX1-SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0
-; AVX1-SLOW-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
-; AVX1-SLOW-NEXT: retq
-;
-; AVX-FAST-LABEL: phaddw_single_source6:
-; AVX-FAST: # %bb.0:
-; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0
-; AVX-FAST-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
-; AVX-FAST-NEXT: retq
+; SSSE3-LABEL: phaddw_single_source6:
+; SSSE3: # %bb.0:
+; SSSE3-NEXT: phaddw %xmm0, %xmm0
+; SSSE3-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
+; SSSE3-NEXT: retq
;
-; AVX2-SLOW-LABEL: phaddw_single_source6:
-; AVX2-SLOW: # %bb.0:
-; AVX2-SLOW-NEXT: vpbroadcastw %xmm0, %xmm1
-; AVX2-SLOW-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
-; AVX2-SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0
-; AVX2-SLOW-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
-; AVX2-SLOW-NEXT: retq
+; AVX-LABEL: phaddw_single_source6:
+; AVX: # %bb.0:
+; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0
+; AVX-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
+; AVX-NEXT: retq
%l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 undef, i32 undef, i32 undef>
%r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 undef, i32 undef, i32 undef>
%add = add <8 x i16> %l, %r
@@ -787,9 +546,7 @@ define i32 @PR39936_v8i32(<8 x i32>) {
; SSSE3-SLOW-LABEL: PR39936_v8i32:
; SSSE3-SLOW: # %bb.0:
; SSSE3-SLOW-NEXT: phaddd %xmm1, %xmm0
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0
+; SSSE3-SLOW-NEXT: phaddd %xmm0, %xmm0
; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
; SSSE3-SLOW-NEXT: paddd %xmm0, %xmm1
; SSSE3-SLOW-NEXT: movd %xmm1, %eax
@@ -807,9 +564,7 @@ define i32 @PR39936_v8i32(<8 x i32>) {
; AVX1-SLOW: # %bb.0:
; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1
; AVX1-SLOW-NEXT: vphaddd %xmm1, %xmm0, %xmm0
-; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX1-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
+; AVX1-SLOW-NEXT: vphaddd %xmm0, %xmm0, %xmm0
; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
; AVX1-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
; AVX1-SLOW-NEXT: vmovd %xmm0, %eax
@@ -830,9 +585,7 @@ define i32 @PR39936_v8i32(<8 x i32>) {
; AVX2-SLOW: # %bb.0:
; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1
; AVX2-SLOW-NEXT: vphaddd %xmm1, %xmm0, %xmm0
-; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
-; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
-; AVX2-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
+; AVX2-SLOW-NEXT: vphaddd %xmm0, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
; AVX2-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0
; AVX2-SLOW-NEXT: vmovd %xmm0, %eax
Modified: llvm/trunk/test/CodeGen/X86/vector-shuffle-combining.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vector-shuffle-combining.ll?rev=360360&r1=360359&r2=360360&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/vector-shuffle-combining.ll (original)
+++ llvm/trunk/test/CodeGen/X86/vector-shuffle-combining.ll Thu May 9 10:45:01 2019
@@ -2701,21 +2701,36 @@ define <4 x i32> @combine_constant_inser
}
define <4 x float> @PR22377(<4 x float> %a, <4 x float> %b) {
-; SSE-LABEL: PR22377:
-; SSE: # %bb.0: # %entry
-; SSE-NEXT: movaps %xmm0, %xmm1
-; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm0[2,3]
-; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,0,2]
-; SSE-NEXT: addps %xmm0, %xmm1
-; SSE-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
-; SSE-NEXT: retq
+; SSE2-LABEL: PR22377:
+; SSE2: # %bb.0: # %entry
+; SSE2-NEXT: movaps %xmm0, %xmm1
+; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm0[2,3]
+; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,0,2]
+; SSE2-NEXT: addps %xmm0, %xmm1
+; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; SSE2-NEXT: retq
+;
+; SSSE3-LABEL: PR22377:
+; SSSE3: # %bb.0: # %entry
+; SSSE3-NEXT: movaps %xmm0, %xmm1
+; SSSE3-NEXT: haddps %xmm0, %xmm1
+; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,1]
+; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
+; SSSE3-NEXT: retq
+;
+; SSE41-LABEL: PR22377:
+; SSE41: # %bb.0: # %entry
+; SSE41-NEXT: movaps %xmm0, %xmm1
+; SSE41-NEXT: haddps %xmm0, %xmm1
+; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,1]
+; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
+; SSE41-NEXT: retq
;
; AVX-LABEL: PR22377:
; AVX: # %bb.0: # %entry
-; AVX-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[1,3,2,3]
-; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,0,2]
-; AVX-NEXT: vaddps %xmm0, %xmm1, %xmm1
-; AVX-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm1
+; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,1]
+; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,1,3]
; AVX-NEXT: retq
entry:
%s1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 1, i32 3>
More information about the llvm-commits
mailing list