summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-12-06 22:41:49 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-12-06 22:41:49 +0000
commitd2967868bee7c80f33aa3c59294e286864aafc9f (patch)
tree10c5f3dab288a287ce58deba1b341ca15871f0c2 /llvm/lib/Target
parent03ad4e7f464ffdb5fd16ffc9ad418ea0471673cd (diff)
downloadbcm5719-llvm-d2967868bee7c80f33aa3c59294e286864aafc9f.tar.gz
bcm5719-llvm-d2967868bee7c80f33aa3c59294e286864aafc9f.zip
[Hexagon] Recognize vdealb, vdealh, vshuffb and vshuffh specifically
llvm-svn: 319978
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp41
1 files changed, 37 insertions, 4 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
index 924639ad092..835b088050e 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
@@ -1538,8 +1538,6 @@ OpRef HvxSelector::perfect(ShuffleMask SM, OpRef Va, ResultStack &Results) {
// V6_vshuffvdd (V6_vshuff)
// V6_dealvdd (V6_vdeal)
- // TODO Recognize patterns for V6_vdeal{b,h} and V6_vshuff{b,h}.
-
int VecLen = SM.Mask.size();
assert(isPowerOf2_32(VecLen) && Log2_32(VecLen) <= 8);
unsigned LogLen = Log2_32(VecLen);
@@ -1708,6 +1706,32 @@ OpRef HvxSelector::perfect(ShuffleMask SM, OpRef Va, ResultStack &Results) {
return NewC;
};
+ auto pfs = [](const std::set<CycleType> &Cs, unsigned Len) {
+ // Ordering: shuff: 5 0 1 2 3 4, deal: 5 4 3 2 1 0 (for Log=6),
+ // for bytes zero is included, for halfwords is not.
+ if (Cs.size() != 1)
+ return 0u;
+ const CycleType &C = *Cs.begin();
+ if (C[0] != Len-1)
+ return 0u;
+ int D = Len - C.size();
+ if (D != 0 && D != 1)
+ return 0u;
+
+ bool IsDeal = true, IsShuff = true;
+ for (unsigned I = 1; I != Len-D; ++I) {
+ if (C[I] != Len-1-I)
+ IsDeal = false;
+ if (C[I] != I-(1-D)) // I-1, I
+ IsShuff = false;
+ }
+ // At most one, IsDeal or IsShuff, can be non-zero.
+ assert(!(IsDeal || IsShuff) || IsDeal != IsShuff);
+ static unsigned Deals[] = { Hexagon::V6_vdealb, Hexagon::V6_vdealh };
+ static unsigned Shufs[] = { Hexagon::V6_vshuffb, Hexagon::V6_vshuffh };
+ return IsDeal ? Deals[D] : (IsShuff ? Shufs[D] : 0);
+ };
+
while (!All.empty()) {
unsigned A = *All.begin();
All.erase(A);
@@ -1722,6 +1746,17 @@ OpRef HvxSelector::perfect(ShuffleMask SM, OpRef Va, ResultStack &Results) {
Cycles.insert(canonicalize(C));
}
+ MVT SingleTy = getSingleVT(MVT::i8);
+ MVT PairTy = getPairVT(MVT::i8);
+
+ // Recognize patterns for V6_vdeal{b,h} and V6_vshuff{b,h}.
+ if (unsigned(VecLen) == HwLen) {
+ if (unsigned SingleOpc = pfs(Cycles, LogLen)) {
+ Results.push(SingleOpc, SingleTy, {Va});
+ return OpRef::res(Results.top());
+ }
+ }
+
SmallVector<unsigned,8> SwapElems;
if (HwLen == unsigned(VecLen))
SwapElems.push_back(LogLen-1);
@@ -1733,8 +1768,6 @@ OpRef HvxSelector::perfect(ShuffleMask SM, OpRef Va, ResultStack &Results) {
SwapElems.push_back(C[0]);
}
- MVT SingleTy = getSingleVT(MVT::i8);
- MVT PairTy = getPairVT(MVT::i8);
const SDLoc &dl(Results.InpNode);
OpRef Arg = !Extend ? Va
: concat(Va, OpRef::undef(SingleTy), Results);
OpenPOWER on IntegriCloud