diff options
author | Matthew Simpson <mssimpso@codeaurora.org> | 2018-04-26 13:48:33 +0000 |
---|---|---|
committer | Matthew Simpson <mssimpso@codeaurora.org> | 2018-04-26 13:48:33 +0000 |
commit | b4096ebe26007b3b05aba4c860dd1dd966ec5bfe (patch) | |
tree | 9d625d3856f156a54981c0842fd1a628a587de43 /llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp | |
parent | 130b8b3f2b49a0c04f5acb8e56c0f75245e222e8 (diff) | |
download | bcm5719-llvm-b4096ebe26007b3b05aba4c860dd1dd966ec5bfe.tar.gz bcm5719-llvm-b4096ebe26007b3b05aba4c860dd1dd966ec5bfe.zip |
[TTI, AArch64] Add transpose shuffle kind
This patch adds a new shuffle kind useful for transposing a 2xn matrix. These
transpose shuffle masks read corresponding even- or odd-numbered vector
elements from two n-dimensional source vectors and write each result into
consecutive elements of an n-dimensional destination vector. The transpose
shuffle kind is meant to model the TRN1 and TRN2 AArch64 instructions. As such,
this patch also considers transpose shuffles in the AArch64 implementation of
getShuffleCost.
Differential Revision: https://reviews.llvm.org/D45982
llvm-svn: 330941
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index a626323635c..337db546658 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -912,3 +912,30 @@ int AArch64TTIImpl::getArithmeticReductionCost(unsigned Opcode, Type *ValTy, return BaseT::getArithmeticReductionCost(Opcode, ValTy, IsPairwiseForm); } + +int AArch64TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index, + Type *SubTp) { + + // Transpose shuffle kinds can be performed with 'trn1/trn2' and 'zip1/zip2' + // instructions. + if (Kind == TTI::SK_Transpose) { + static const CostTblEntry TransposeTbl[] = { + {ISD::VECTOR_SHUFFLE, MVT::v8i8, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v16i8, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v4i16, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v8i16, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v2i32, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v4i32, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v2i64, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v2f32, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v4f32, 1}, + {ISD::VECTOR_SHUFFLE, MVT::v2f64, 1}, + }; + std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp); + if (const auto *Entry = + CostTableLookup(TransposeTbl, ISD::VECTOR_SHUFFLE, LT.second)) + return LT.first * Entry->Cost; + } + + return BaseT::getShuffleCost(Kind, Tp, Index, SubTp); +} |