diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-22 18:09:02 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-22 18:09:02 +0000 |
commit | 3521367ff337f5dcda145709e143e984dd6b72f3 (patch) | |
tree | 4967b76306bac6fffec69f3081fe5738343b6280 /llvm/lib | |
parent | 279f8a44a1fc508ca041efc67e51f32ae76d58f6 (diff) | |
download | bcm5719-llvm-3521367ff337f5dcda145709e143e984dd6b72f3.tar.gz bcm5719-llvm-3521367ff337f5dcda145709e143e984dd6b72f3.zip |
[X86][SSE] getTargetShuffleMaskIndices - allow opt-in support for whole undef shuffle mask elements
Enable this for PSHUFB constant mask decoding and remove the ConstantPool DecodePSHUFBMask
llvm-svn: 344931
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 6059a2a09e7..e2b2191b181 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -5839,20 +5839,23 @@ static bool isConstantSplat(SDValue Op, APInt &SplatVal) { static bool getTargetShuffleMaskIndices(SDValue MaskNode, unsigned MaskEltSizeInBits, - SmallVectorImpl<uint64_t> &RawMask) { + SmallVectorImpl<uint64_t> &RawMask, + bool AllowWholeUndefs = false) { APInt UndefElts; SmallVector<APInt, 64> EltBits; // Extract the raw target constant bits. - // FIXME: We currently don't support UNDEF bits or mask entries. if (!getTargetConstantBitsFromNode(MaskNode, MaskEltSizeInBits, UndefElts, - EltBits, /* AllowWholeUndefs */ false, + EltBits, AllowWholeUndefs, /* AllowPartialUndefs */ false)) return false; // Insert the extracted elements into the mask. - for (APInt Elt : EltBits) - RawMask.push_back(Elt.getZExtValue()); + for (int i = 0, e = EltBits.size(); i != e; ++i) { + uint64_t M = AllowWholeUndefs && UndefElts[i] ? SM_SentinelUndef + : EltBits[i].getZExtValue(); + RawMask.push_back(M); + } return true; } @@ -6057,14 +6060,10 @@ static bool getTargetShuffleMask(SDNode *N, MVT VT, bool AllowSentinelZero, IsUnary = true; SDValue MaskNode = N->getOperand(1); SmallVector<uint64_t, 32> RawMask; - if (getTargetShuffleMaskIndices(MaskNode, 8, RawMask)) { + if (getTargetShuffleMaskIndices(MaskNode, 8, RawMask, true)) { DecodePSHUFBMask(RawMask, Mask); break; } - if (auto *C = getTargetConstantFromNode(MaskNode)) { - DecodePSHUFBMask(C, Mask); - break; - } return false; } case X86ISD::VPERMI: |