summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2016-12-15 14:24:07 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2016-12-15 14:24:07 +0000
commit2f7f0e7a480d760999f1973d8db76aee590cf83e (patch)
treeeaf135c4ed1da94fe117a97dc08c3099d56a4459 /llvm/lib
parent4160264e30d74ad92c3e152f3878ac22529e8bed (diff)
downloadbcm5719-llvm-2f7f0e7a480d760999f1973d8db76aee590cf83e.tar.gz
bcm5719-llvm-2f7f0e7a480d760999f1973d8db76aee590cf83e.zip
[CostModel][X86] Updated reverse shuffle costs
llvm-svn: 289819
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86TargetTransformInfo.cpp100
1 files changed, 95 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
index f9d1217dbbe..6b5b5a1528e 100644
--- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
+++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
@@ -604,12 +604,102 @@ int X86TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
if (Kind == TTI::SK_Reverse) {
std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
- int Cost = 1;
- if (LT.second.getSizeInBits() > 128)
- Cost = 3; // Extract + insert + copy.
- // Multiple by the number of parts.
- return Cost * LT.first;
+ static const CostTblEntry AVX512VBMIShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v64i8, 1 }, // vpermb
+ { ISD::VECTOR_SHUFFLE, MVT::v32i8, 1 } // vpermb
+ };
+
+ if (ST->hasVBMI())
+ if (const auto *Entry = CostTableLookup(AVX512VBMIShuffleTbl,
+ ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
+
+ static const CostTblEntry AVX512BWShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v32i16, 1 }, // vpermw
+ { ISD::VECTOR_SHUFFLE, MVT::v64i8, 6 } // vextracti64x4 + 2*vperm2i128
+ // + 2*pshufb + vinserti64x4
+ };
+
+ if (ST->hasBWI())
+ if (const auto *Entry = CostTableLookup(AVX512BWShuffleTbl,
+ ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
+
+ static const CostTblEntry AVX512ShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v8f64, 1 }, // vpermpd
+ { ISD::VECTOR_SHUFFLE, MVT::v16f32, 1 }, // vpermps
+ { ISD::VECTOR_SHUFFLE, MVT::v8i64, 1 }, // vpermq
+ { ISD::VECTOR_SHUFFLE, MVT::v16i32, 1 }, // vpermd
+ };
+
+ if (ST->hasAVX512())
+ if (const auto *Entry =
+ CostTableLookup(AVX512ShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
+
+ static const CostTblEntry AVX2ShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v4f64, 1 }, // vpermpd
+ { ISD::VECTOR_SHUFFLE, MVT::v8f32, 1 }, // vpermps
+ { ISD::VECTOR_SHUFFLE, MVT::v4i64, 1 }, // vpermq
+ { ISD::VECTOR_SHUFFLE, MVT::v8i32, 1 }, // vpermd
+ { ISD::VECTOR_SHUFFLE, MVT::v16i16, 2 }, // vperm2i128 + pshufb
+ { ISD::VECTOR_SHUFFLE, MVT::v32i8, 2 } // vperm2i128 + pshufb
+ };
+
+ if (ST->hasAVX2())
+ if (const auto *Entry =
+ CostTableLookup(AVX2ShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
+
+ static const CostTblEntry AVX1ShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v4f64, 2 }, // vperm2f128 + vpermilpd
+ { ISD::VECTOR_SHUFFLE, MVT::v8f32, 2 }, // vperm2f128 + vpermilps
+ { ISD::VECTOR_SHUFFLE, MVT::v4i64, 2 }, // vperm2f128 + vpermilpd
+ { ISD::VECTOR_SHUFFLE, MVT::v8i32, 2 }, // vperm2f128 + vpermilps
+ { ISD::VECTOR_SHUFFLE, MVT::v16i16, 4 }, // vextractf128 + 2*pshufb
+ // + vinsertf128
+ { ISD::VECTOR_SHUFFLE, MVT::v32i8, 4 } // vextractf128 + 2*pshufb
+ // + vinsertf128
+ };
+
+ if (ST->hasAVX())
+ if (const auto *Entry =
+ CostTableLookup(AVX1ShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
+
+ static const CostTblEntry SSSE3ShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v8i16, 1 }, // pshufb
+ { ISD::VECTOR_SHUFFLE, MVT::v16i8, 1 } // pshufb
+ };
+
+ if (ST->hasSSSE3())
+ if (const auto *Entry =
+ CostTableLookup(SSSE3ShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
+
+ static const CostTblEntry SSE2ShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v2f64, 1 }, // shufpd
+ { ISD::VECTOR_SHUFFLE, MVT::v2i64, 1 }, // pshufd
+ { ISD::VECTOR_SHUFFLE, MVT::v4i32, 1 }, // pshufd
+ { ISD::VECTOR_SHUFFLE, MVT::v8i16, 3 }, // pshuflw + pshufhw + pshufd
+ { ISD::VECTOR_SHUFFLE, MVT::v16i8, 9 } // 2*pshuflw + 2*pshufhw
+ // + 2*pshufd + 2*unpck + packus
+ };
+
+ if (ST->hasSSE2())
+ if (const auto *Entry =
+ CostTableLookup(SSE2ShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
+
+ static const CostTblEntry SSE1ShuffleTbl[] = {
+ { ISD::VECTOR_SHUFFLE, MVT::v4f32, 1 }, // shufps
+ };
+
+ if (ST->hasSSE1())
+ if (const auto *Entry =
+ CostTableLookup(SSE1ShuffleTbl, ISD::VECTOR_SHUFFLE, LT.second))
+ return LT.first * Entry->Cost;
}
if (Kind == TTI::SK_Alternate) {
OpenPOWER on IntegriCloud