diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-03-05 22:53:31 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-03-05 22:53:31 +0000 |
commit | 40e1a71cddebff3e55179e5642b8e4b216f2c2c0 (patch) | |
tree | 919fee8fd2dbb28107f9386b19618087e17cf7bf /llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp | |
parent | 1feae0d0bb0c40420333384be423efebe1dcdbeb (diff) | |
download | llvm-40e1a71cddebff3e55179e5642b8e4b216f2c2c0.zip llvm-40e1a71cddebff3e55179e5642b8e4b216f2c2c0.tar.gz llvm-40e1a71cddebff3e55179e5642b8e4b216f2c2c0.tar.bz2 |
[X86][AVX] Improved VPERMILPS variable shuffle mask decoding.
Added support for decoding VPERMILPS variable shuffle masks that aren't in the constant pool.
Added target shuffle mask decoding for SCALAR_TO_VECTOR+VZEXT_MOVL cases - these can happen for v2i64 constant re-materialization
Followup to D17681
llvm-svn: 262784
Diffstat (limited to 'llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp')
-rw-r--r-- | llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp b/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp index 5c99926..b7b444a 100644 --- a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp +++ b/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp @@ -454,6 +454,24 @@ void DecodeINSERTQIMask(int Len, int Idx, ShuffleMask.push_back(SM_SentinelUndef); } +void DecodeVPERMILPMask(MVT VT, ArrayRef<uint64_t> RawMask, + SmallVectorImpl<int> &ShuffleMask) { + unsigned VecSize = VT.getSizeInBits(); + unsigned EltSize = VT.getScalarSizeInBits(); + unsigned NumLanes = VecSize / 128; + unsigned NumEltsPerLane = VT.getVectorNumElements() / NumLanes; + assert((VecSize == 128 || VecSize == 256 || VecSize == 512) && + "Unexpected vector size"); + assert((EltSize == 32 || EltSize == 64) && "Unexpected element size"); + + for (unsigned i = 0, e = RawMask.size(); i < e; ++i) { + uint64_t M = RawMask[i]; + M = (EltSize == 64 ? ((M >> 1) & 0x1) : (M & 0x3)); + unsigned LaneOffset = i & ~(NumEltsPerLane - 1); + ShuffleMask.push_back((int)(LaneOffset + M)); + } +} + void DecodeVPERMVMask(ArrayRef<uint64_t> RawMask, SmallVectorImpl<int> &ShuffleMask) { for (int i = 0, e = RawMask.size(); i < e; ++i) { |