diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-01 16:04:28 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-01 16:04:28 +0000 |
| commit | 1638d49f2026d8c0799133968352290bc12bfd18 (patch) | |
| tree | f96000f7408c3369568821ee2d73844d4a19949b /llvm/lib/Target | |
| parent | 7410717a6220f4cb36b3acfb28df0f4c52f4e1b7 (diff) | |
| download | bcm5719-llvm-1638d49f2026d8c0799133968352290bc12bfd18.tar.gz bcm5719-llvm-1638d49f2026d8c0799133968352290bc12bfd18.zip | |
[X86][SSE] Add support for combining target shuffles to binary BLEND
We already had support for 1-input BLEND with zero - this adds support for 2-input BLEND as well.
llvm-svn: 283040
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 6c8def1c397..cd1ff4de70f 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -25160,7 +25160,7 @@ static bool matchBinaryPermuteVectorShuffle(MVT MaskVT, ArrayRef<int> Mask, } } - // Attempt to blend with zero. + // Attempt to combine to X86ISD::BLENDI. if (NumMaskElts <= 8 && ((Subtarget.hasSSE41() && MaskVT.is128BitVector()) || (Subtarget.hasAVX() && MaskVT.is256BitVector()))) { // Determine a type compatible with X86ISD::BLENDI. @@ -25180,12 +25180,13 @@ static bool matchBinaryPermuteVectorShuffle(MVT MaskVT, ArrayRef<int> Mask, BlendVT = MVT::v8f32; } + unsigned BlendSize = BlendVT.getVectorNumElements(); + unsigned MaskRatio = BlendSize / NumMaskElts; + + // Can we blend with zero? if (isSequentialOrUndefOrZeroInRange(Mask, /*Pos*/ 0, /*Size*/ NumMaskElts, /*Low*/ 0) && NumMaskElts <= BlendVT.getVectorNumElements()) { - unsigned BlendSize = BlendVT.getVectorNumElements(); - unsigned MaskRatio = BlendSize / NumMaskElts; - PermuteImm = 0; for (unsigned i = 0; i != BlendSize; ++i) if (Mask[i / MaskRatio] < 0) @@ -25196,6 +25197,31 @@ static bool matchBinaryPermuteVectorShuffle(MVT MaskVT, ArrayRef<int> Mask, ShuffleVT = BlendVT; return true; } + + // Attempt to match as a binary blend. + if (NumMaskElts <= BlendVT.getVectorNumElements()) { + bool MatchBlend = true; + for (int i = 0; i != NumMaskElts; ++i) { + int M = Mask[i]; + if (M == SM_SentinelUndef) + continue; + else if (M == SM_SentinelZero) + MatchBlend = false; + else if ((M != i) && (M != (i + NumMaskElts))) + MatchBlend = false; + } + + if (MatchBlend) { + PermuteImm = 0; + for (unsigned i = 0; i != BlendSize; ++i) + if ((int)NumMaskElts <= Mask[i / MaskRatio]) + PermuteImm |= 1u << i; + + Shuffle = X86ISD::BLENDI; + ShuffleVT = BlendVT; + return true; + } + } } // Attempt to combine to INSERTPS. |

