[X86] Improved lowering of packed v8i16 vector shifts by non-constant count.
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Mon, 8 Dec 2014 14:36:51 +0000 (14:36 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Mon, 8 Dec 2014 14:36:51 +0000 (14:36 +0000)
commit64bc246f3feb7eb672ba53860c0c1a98c29f0e48
tree04731d0e79397f5b73b954775fc9dda4f8ad91d9
parent3519da82b83a7517d3be6b75d8256bfd8e24efbd
[X86] Improved lowering of packed v8i16 vector shifts by non-constant count.

Before this patch, the backend sub-optimally expanded the non-constant shift
count of a v8i16 shift into a sequence of two 'movd' plus 'movzwl'.

With this patch the backend checks if the target features sse4.1. If so, then
it lets the shuffle legalizer deal with the expansion of the shift amount.

Example:
;;
define <8 x i16> @test(<8 x i16> %A, <8 x i16> %B) {
  %shamt = shufflevector <8 x i16> %B, <8 x i16> undef, <8 x i32> zeroinitializer
  %shl = shl <8 x i16> %A, %shamt
  ret <8 x i16> %shl
}
;;

Before (with -mattr=+avx):
  vmovd  %xmm1, %eax
  movzwl  %ax, %eax
  vmovd  %eax, %xmm1
  vpsllw  %xmm1, %xmm0, %xmm0
  retq

Now:
  vpxor  %xmm2, %xmm2, %xmm2
  vpblendw  $1, %xmm1, %xmm2, %xmm1
  vpsllw  %xmm1, %xmm0, %xmm0
  retq

llvm-svn: 223660
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/lower-vec-shift-2.ll