@@ -864,3 +864,37 @@ define <4 x i32> @combine_vec_add_shl_nonsplat(<4 x i32> %a0) {
864
864
%2 = add <4 x i32 > %1 , <i32 3 , i32 3 , i32 3 , i32 3 >
865
865
ret <4 x i32 > %2
866
866
}
867
+
868
+ define <4 x i32 > @combine_vec_add_shuffle_shl (<4 x i32 > %a0 ) {
869
+ ; SSE2-LABEL: combine_vec_add_shuffle_shl:
870
+ ; SSE2: # %bb.0:
871
+ ; SSE2-NEXT: movdqa %xmm0, %xmm1
872
+ ; SSE2-NEXT: pslld $3, %xmm1
873
+ ; SSE2-NEXT: pslld $2, %xmm0
874
+ ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
875
+ ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,3,0]
876
+ ; SSE2-NEXT: por {{.*}}(%rip), %xmm0
877
+ ; SSE2-NEXT: retq
878
+ ;
879
+ ; SSE41-LABEL: combine_vec_add_shuffle_shl:
880
+ ; SSE41: # %bb.0:
881
+ ; SSE41-NEXT: movdqa %xmm0, %xmm1
882
+ ; SSE41-NEXT: pslld $3, %xmm1
883
+ ; SSE41-NEXT: pslld $2, %xmm0
884
+ ; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
885
+ ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,0]
886
+ ; SSE41-NEXT: por {{.*}}(%rip), %xmm0
887
+ ; SSE41-NEXT: retq
888
+ ;
889
+ ; AVX-LABEL: combine_vec_add_shuffle_shl:
890
+ ; AVX: # %bb.0:
891
+ ; AVX-NEXT: vpsllvd {{.*}}(%rip), %xmm0, %xmm0
892
+ ; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,0]
893
+ ; AVX-NEXT: vpbroadcastd {{.*#+}} xmm1 = [3,3,3,3]
894
+ ; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0
895
+ ; AVX-NEXT: retq
896
+ %1 = shl <4 x i32 > %a0 , <i32 2 , i32 3 , i32 0 , i32 1 >
897
+ %2 = shufflevector <4 x i32 > %1 , <4 x i32 > undef , <4 x i32 > <i32 0 , i32 1 , i32 1 , i32 0 >
898
+ %3 = add <4 x i32 > %2 , <i32 3 , i32 3 , i32 3 , i32 3 >
899
+ ret <4 x i32 > %3
900
+ }
0 commit comments