@@ -812,6 +812,69 @@ define <16 x i16> @mul_v16i16_neg9(<16 x i16> %a0) nounwind {
812
812
ret <16 x i16 > %1
813
813
}
814
814
815
+ ; PR47422 - check mul-shl-add sequence expands to adds.
816
+ define <16 x i16 > @madd_v16i16_3 (<16 x i16 > %a0 , <16 x i16 > %a1 ) nounwind {
817
+ ; X86-SSE-LABEL: madd_v16i16_3:
818
+ ; X86-SSE: # %bb.0:
819
+ ; X86-SSE-NEXT: pushl %ebp
820
+ ; X86-SSE-NEXT: movl %esp, %ebp
821
+ ; X86-SSE-NEXT: andl $-16, %esp
822
+ ; X86-SSE-NEXT: subl $16, %esp
823
+ ; X86-SSE-NEXT: movdqa %xmm1, %xmm3
824
+ ; X86-SSE-NEXT: paddw %xmm1, %xmm3
825
+ ; X86-SSE-NEXT: paddw %xmm3, %xmm1
826
+ ; X86-SSE-NEXT: movdqa %xmm0, %xmm3
827
+ ; X86-SSE-NEXT: paddw %xmm0, %xmm3
828
+ ; X86-SSE-NEXT: paddw %xmm2, %xmm0
829
+ ; X86-SSE-NEXT: paddw %xmm3, %xmm0
830
+ ; X86-SSE-NEXT: paddw 8(%ebp), %xmm1
831
+ ; X86-SSE-NEXT: movl %ebp, %esp
832
+ ; X86-SSE-NEXT: popl %ebp
833
+ ; X86-SSE-NEXT: retl
834
+ ;
835
+ ; X64-SSE-LABEL: madd_v16i16_3:
836
+ ; X64-SSE: # %bb.0:
837
+ ; X64-SSE-NEXT: movdqa %xmm1, %xmm4
838
+ ; X64-SSE-NEXT: paddw %xmm1, %xmm4
839
+ ; X64-SSE-NEXT: movdqa %xmm0, %xmm5
840
+ ; X64-SSE-NEXT: paddw %xmm0, %xmm5
841
+ ; X64-SSE-NEXT: paddw %xmm2, %xmm0
842
+ ; X64-SSE-NEXT: paddw %xmm5, %xmm0
843
+ ; X64-SSE-NEXT: paddw %xmm3, %xmm1
844
+ ; X64-SSE-NEXT: paddw %xmm4, %xmm1
845
+ ; X64-SSE-NEXT: retq
846
+ ;
847
+ ; X64-XOP-LABEL: madd_v16i16_3:
848
+ ; X64-XOP: # %bb.0:
849
+ ; X64-XOP-NEXT: vpaddw %xmm0, %xmm0, %xmm2
850
+ ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm3
851
+ ; X64-XOP-NEXT: vpaddw %xmm3, %xmm3, %xmm4
852
+ ; X64-XOP-NEXT: vextractf128 $1, %ymm1, %xmm5
853
+ ; X64-XOP-NEXT: vpaddw %xmm5, %xmm3, %xmm3
854
+ ; X64-XOP-NEXT: vpaddw %xmm3, %xmm4, %xmm3
855
+ ; X64-XOP-NEXT: vpaddw %xmm1, %xmm0, %xmm0
856
+ ; X64-XOP-NEXT: vpaddw %xmm0, %xmm2, %xmm0
857
+ ; X64-XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
858
+ ; X64-XOP-NEXT: retq
859
+ ;
860
+ ; X64-AVX2-LABEL: madd_v16i16_3:
861
+ ; X64-AVX2: # %bb.0:
862
+ ; X64-AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm2
863
+ ; X64-AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0
864
+ ; X64-AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0
865
+ ; X64-AVX2-NEXT: retq
866
+ ;
867
+ ; X64-AVX512DQ-LABEL: madd_v16i16_3:
868
+ ; X64-AVX512DQ: # %bb.0:
869
+ ; X64-AVX512DQ-NEXT: vpaddw %ymm0, %ymm0, %ymm2
870
+ ; X64-AVX512DQ-NEXT: vpaddw %ymm1, %ymm0, %ymm0
871
+ ; X64-AVX512DQ-NEXT: vpaddw %ymm2, %ymm0, %ymm0
872
+ ; X64-AVX512DQ-NEXT: retq
873
+ %mul = mul <16 x i16 > %a0 , splat (i16 3 )
874
+ %add = add <16 x i16 > %mul , %a1
875
+ ret <16 x i16 > %add
876
+ }
877
+
815
878
define <32 x i8 > @mul_v32i8_neg5 (<32 x i8 > %a0 ) nounwind {
816
879
; SSE-LABEL: mul_v32i8_neg5:
817
880
; SSE: # %bb.0:
0 commit comments