diff options
Diffstat (limited to 'llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp')
-rw-r--r-- | llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp b/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp index fe567f4cece..bed940d0d0e 100644 --- a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp +++ b/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); } |