diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-12-15 14:24:07 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-12-15 14:24:07 +0000 |
commit | 2f7f0e7a480d760999f1973d8db76aee590cf83e (patch) | |
tree | eaf135c4ed1da94fe117a97dc08c3099d56a4459 /llvm/lib | |
parent | 4160264e30d74ad92c3e152f3878ac22529e8bed (diff) | |
download | bcm5719-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.cpp | 100 |
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) { |