Home | History | Annotate | Download | only in Target
      1 //===-- CostTable.h - Instruction Cost Table handling -----------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 ///
     10 /// \file
     11 /// \brief Cost tables and simple lookup functions
     12 ///
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_TARGET_COSTTABLE_H_
     16 #define LLVM_TARGET_COSTTABLE_H_
     17 
     18 namespace llvm {
     19 
     20 /// Cost Table Entry
     21 template <class TypeTy>
     22 struct CostTblEntry {
     23   int ISD;
     24   TypeTy Type;
     25   unsigned Cost;
     26 };
     27 
     28 /// Find in cost table, TypeTy must be comparable to CompareTy by ==
     29 template <class TypeTy, class CompareTy>
     30 int CostTableLookup(const CostTblEntry<TypeTy> *Tbl, unsigned len, int ISD,
     31                     CompareTy Ty) {
     32   for (unsigned int i = 0; i < len; ++i)
     33     if (ISD == Tbl[i].ISD && Ty == Tbl[i].Type)
     34       return i;
     35 
     36   // Could not find an entry.
     37   return -1;
     38 }
     39 
     40 /// Find in cost table, TypeTy must be comparable to CompareTy by ==
     41 template <class TypeTy, class CompareTy, unsigned N>
     42 int CostTableLookup(const CostTblEntry<TypeTy>(&Tbl)[N], int ISD,
     43                     CompareTy Ty) {
     44   return CostTableLookup(Tbl, N, ISD, Ty);
     45 }
     46 
     47 /// Type Conversion Cost Table
     48 template <class TypeTy>
     49 struct TypeConversionCostTblEntry {
     50   int ISD;
     51   TypeTy Dst;
     52   TypeTy Src;
     53   unsigned Cost;
     54 };
     55 
     56 /// Find in type conversion cost table, TypeTy must be comparable to CompareTy
     57 /// by ==
     58 template <class TypeTy, class CompareTy>
     59 int ConvertCostTableLookup(const TypeConversionCostTblEntry<TypeTy> *Tbl,
     60                            unsigned len, int ISD, CompareTy Dst,
     61                            CompareTy Src) {
     62   for (unsigned int i = 0; i < len; ++i)
     63     if (ISD == Tbl[i].ISD && Src == Tbl[i].Src && Dst == Tbl[i].Dst)
     64       return i;
     65 
     66   // Could not find an entry.
     67   return -1;
     68 }
     69 
     70 /// Find in type conversion cost table, TypeTy must be comparable to CompareTy
     71 /// by ==
     72 template <class TypeTy, class CompareTy, unsigned N>
     73 int ConvertCostTableLookup(const TypeConversionCostTblEntry<TypeTy>(&Tbl)[N],
     74                            int ISD, CompareTy Dst, CompareTy Src) {
     75   return ConvertCostTableLookup(Tbl, N, ISD, Dst, Src);
     76 }
     77 
     78 } // namespace llvm
     79 
     80 
     81 #endif /* LLVM_TARGET_COSTTABLE_H_ */
     82