summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
diff options
context:
space:
mode:
authorMatthew Simpson <mssimpso@codeaurora.org>2018-04-26 13:48:33 +0000
committerMatthew Simpson <mssimpso@codeaurora.org>2018-04-26 13:48:33 +0000
commitb4096ebe26007b3b05aba4c860dd1dd966ec5bfe (patch)
tree9d625d3856f156a54981c0842fd1a628a587de43 /llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
parent130b8b3f2b49a0c04f5acb8e56c0f75245e222e8 (diff)
downloadbcm5719-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.cpp27
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);
+}
OpenPOWER on IntegriCloud