[X86][SSE4A] Shuffle lowering using SSE4A EXTRQ/INSERTQ instructions
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 6 Jul 2015 20:46:41 +0000 (20:46 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 6 Jul 2015 20:46:41 +0000 (20:46 +0000)
commit3ecdd44e5d50403a690ac450d2164ac084a040cd
treeaf8d519478482fda716844ac19445752d45aba48
parentecb00f403c4b44f21e16a86afc17d162eed6ea03
[X86][SSE4A] Shuffle lowering using SSE4A EXTRQ/INSERTQ instructions

This patch adds support for v8i16 and v16i8 shuffle lowering using the immediate versions of the SSE4A EXTRQ and INSERTQ instructions. Although rather limited (they can only act on the lower 64-bits of the source vectors, leave the upper 64-bits of the result vector undefined and don't have VEX encoded variants), the instructions are still useful for the zero extension of any lane (EXTRQ) or inserting a lane into another vector (INSERTQ). Testing demonstrated that it wasn't typically worth it to use these instructions for v2i64 or v4i32 vector shuffles although they are capable of it.

As well as adding specific pattern matching for the shuffles, the patch uses EXTRQ for zero extension cases where SSE41 isn't available and its more efficient than the SSE2 'unpack' default approach. It also adds shuffle decode support for the EXTRQ / INSERTQ cases when the instructions are handling full byte-sized extractions / insertions.

From this foundation, future patches will be able to make use of the instructions for situations that use their ability to extract/insert at the bit level.

Differential Revision: http://reviews.llvm.org/D10146

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241508 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/InstPrinter/X86InstComments.cpp
lib/Target/X86/Utils/X86ShuffleDecode.cpp
lib/Target/X86/Utils/X86ShuffleDecode.h
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86ISelLowering.h
lib/Target/X86/X86InstrFragmentsSIMD.td
lib/Target/X86/X86InstrSSE.td
lib/Target/X86/X86IntrinsicsInfo.h
test/CodeGen/X86/vector-shuffle-sse4a.ll [new file with mode: 0644]