diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-20 11:41:25 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-20 11:41:25 +0000 |
commit | d9484dd61cc151c4f34c31e07f693fefa66316b5 (patch) | |
tree | ab0560b3da293f1fafd3269c59692e929418f5c2 /contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp | |
parent | 79e0962d4c3cf1f0acf359a9d69cb3ac68c414c4 (diff) | |
parent | d8e91e46262bc44006913e6796843909f1ac7bcd (diff) |
Merge llvm trunk r351319, resolve conflicts, and update FREEBSD-Xlist.
Notes
Notes:
svn path=/projects/clang800-import/; revision=343210
Diffstat (limited to 'contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp b/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp index fe567f4cece8..bed940d0d0e9 100644 --- a/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp +++ b/contrib/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp @@ -304,12 +304,12 @@ void DecodeVPERM2X128Mask(unsigned NumElts, unsigned Imm, } } -void DecodePSHUFBMask(ArrayRef<uint64_t> RawMask, +void DecodePSHUFBMask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts, SmallVectorImpl<int> &ShuffleMask) { for (int i = 0, e = RawMask.size(); i < e; ++i) { uint64_t M = RawMask[i]; - if (M == (uint64_t)SM_SentinelUndef) { - ShuffleMask.push_back(M); + if (UndefElts[i]) { + ShuffleMask.push_back(SM_SentinelUndef); continue; } // For 256/512-bit vectors the base of the shuffle is the 128-bit @@ -336,7 +336,7 @@ void DecodeBLENDMask(unsigned NumElts, unsigned Imm, } } -void DecodeVPPERMMask(ArrayRef<uint64_t> RawMask, +void DecodeVPPERMMask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts, SmallVectorImpl<int> &ShuffleMask) { assert(RawMask.size() == 16 && "Illegal VPPERM shuffle mask size"); @@ -354,12 +354,12 @@ void DecodeVPPERMMask(ArrayRef<uint64_t> RawMask, // 6 - Most significant bit of source byte replicated in all bit positions. // 7 - Invert most significant bit of source byte and replicate in all bit positions. for (int i = 0, e = RawMask.size(); i < e; ++i) { - uint64_t M = RawMask[i]; - if (M == (uint64_t)SM_SentinelUndef) { - ShuffleMask.push_back(M); + if (UndefElts[i]) { + ShuffleMask.push_back(SM_SentinelUndef); continue; } + uint64_t M = RawMask[i]; uint64_t PermuteOp = (M >> 5) & 0x7; if (PermuteOp == 4) { ShuffleMask.push_back(SM_SentinelZero); @@ -490,7 +490,7 @@ void DecodeINSERTQIMask(unsigned NumElts, unsigned EltSize, int Len, int Idx, } void DecodeVPERMILPMask(unsigned NumElts, unsigned ScalarBits, - ArrayRef<uint64_t> RawMask, + ArrayRef<uint64_t> RawMask, const APInt &UndefElts, SmallVectorImpl<int> &ShuffleMask) { unsigned VecSize = NumElts * ScalarBits; unsigned NumLanes = VecSize / 128; @@ -500,6 +500,10 @@ void DecodeVPERMILPMask(unsigned NumElts, unsigned ScalarBits, assert((ScalarBits == 32 || ScalarBits == 64) && "Unexpected element size"); for (unsigned i = 0, e = RawMask.size(); i < e; ++i) { + if (UndefElts[i]) { + ShuffleMask.push_back(SM_SentinelUndef); + continue; + } uint64_t M = RawMask[i]; M = (ScalarBits == 64 ? ((M >> 1) & 0x1) : (M & 0x3)); unsigned LaneOffset = i & ~(NumEltsPerLane - 1); @@ -508,7 +512,7 @@ void DecodeVPERMILPMask(unsigned NumElts, unsigned ScalarBits, } void DecodeVPERMIL2PMask(unsigned NumElts, unsigned ScalarBits, unsigned M2Z, - ArrayRef<uint64_t> RawMask, + ArrayRef<uint64_t> RawMask, const APInt &UndefElts, SmallVectorImpl<int> &ShuffleMask) { unsigned VecSize = NumElts * ScalarBits; unsigned NumLanes = VecSize / 128; @@ -518,6 +522,11 @@ void DecodeVPERMIL2PMask(unsigned NumElts, unsigned ScalarBits, unsigned M2Z, assert((NumElts == RawMask.size()) && "Unexpected mask size"); for (unsigned i = 0, e = RawMask.size(); i < e; ++i) { + if (UndefElts[i]) { + ShuffleMask.push_back(SM_SentinelUndef); + continue; + } + // VPERMIL2 Operation. // Bits[3] - Match Bit. // Bits[2:1] - (Per Lane) PD Shuffle Mask. @@ -548,19 +557,29 @@ void DecodeVPERMIL2PMask(unsigned NumElts, unsigned ScalarBits, unsigned M2Z, } } -void DecodeVPERMVMask(ArrayRef<uint64_t> RawMask, +void DecodeVPERMVMask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts, SmallVectorImpl<int> &ShuffleMask) { uint64_t EltMaskSize = RawMask.size() - 1; - for (auto M : RawMask) { + for (int i = 0, e = RawMask.size(); i != e; ++i) { + if (UndefElts[i]) { + ShuffleMask.push_back(SM_SentinelUndef); + continue; + } + uint64_t M = RawMask[i]; M &= EltMaskSize; ShuffleMask.push_back((int)M); } } -void DecodeVPERMV3Mask(ArrayRef<uint64_t> RawMask, +void DecodeVPERMV3Mask(ArrayRef<uint64_t> RawMask, const APInt &UndefElts, SmallVectorImpl<int> &ShuffleMask) { uint64_t EltMaskSize = (RawMask.size() * 2) - 1; - for (auto M : RawMask) { + for (int i = 0, e = RawMask.size(); i != e; ++i) { + if (UndefElts[i]) { + ShuffleMask.push_back(SM_SentinelUndef); + continue; + } + uint64_t M = RawMask[i]; M &= EltMaskSize; ShuffleMask.push_back((int)M); } |