[X86] Improve the lowering of packed shifts by constant build_vector.
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Tue, 15 Apr 2014 19:30:48 +0000 (19:30 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Tue, 15 Apr 2014 19:30:48 +0000 (19:30 +0000)
commit749e8fee34bec3ed166fe5b6b440a6fac678cd08
tree759d5f53d01b79c340da1055e8c47fdc72c2cc3b
parent49ad5d5dd5c8649631cf5edb31076efae4749dcc
[X86] Improve the lowering of packed shifts by constant build_vector.

This patch teaches the backend how to efficiently lower logical and
arithmetic packed shifts on both SSE and AVX/AVX2 machines.

When possible, instead of scalarizing a vector shift, the backend should try
to expand the shift into a sequence of two packed shifts by immedate count
followed by a MOVSS/MOVSD.

Example
  (v4i32 (srl A, (build_vector < X, Y, Y, Y>)))

Can be rewritten as:
  (v4i32 (MOVSS (srl A, <Y,Y,Y,Y>), (srl A, <X,X,X,X>)))

[with X and Y ConstantInt]

The advantage is that the two new shifts from the example would be lowered into
X86ISD::VSRLI nodes. This is always cheaper than scalarizing the vector into
four scalar shifts plus four pairs of vector insert/extract.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206316 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/lower-vec-shift.ll [new file with mode: 0644]