diff options
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/TargetTransformInfo.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/Analysis/TargetTransformInfo.cpp b/lib/Analysis/TargetTransformInfo.cpp index 3ef74eb..344be71 100644 --- a/lib/Analysis/TargetTransformInfo.cpp +++ b/lib/Analysis/TargetTransformInfo.cpp @@ -286,3 +286,44 @@ char NoTTI::ID = 0; ImmutablePass *llvm::createNoTargetTransformInfoPass() { return new NoTTI(); } + +//======================================= COST TABLES == + +CostTable::CostTable(const CostTableEntry *table, const size_t size, unsigned numTypes) + : table(table), size(size), numTypes(numTypes) { + assert(table && "missing cost table"); + assert(size > 0 && "empty cost table"); +} + +unsigned CostTable::_findCost(int ISD, MVT *Types) const { + for (unsigned i = 0; i < size; ++i) { + if (table[i].ISD == ISD) { + bool found = true; + for (unsigned t=0; t<numTypes; t++) { + if (table[i].Types[t] != Types[t]) { + found = false; + break; + } + } + if (found) + return table[i].Cost; + } + } + return COST_NOT_FOUND; +} + +UnaryCostTable::UnaryCostTable(const CostTableEntry *table, const size_t size) + : CostTable(table, size, 1) { } + +unsigned UnaryCostTable::findCost(int ISD, MVT Type) const { + MVT tys[1] = { Type }; + return _findCost(ISD, tys); +} + +BinaryCostTable::BinaryCostTable(const CostTableEntry *table, const size_t size) + : CostTable(table, size, 2) { } + +unsigned BinaryCostTable::findCost(int ISD, MVT Type, MVT SrcType) const { + MVT tys[2] = { Type, SrcType }; + return _findCost(ISD, tys); +} |