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
18namespace llvm {
19
20/// Cost Table Entry
21template <class TypeTy>
22struct CostTblEntry {
23  int ISD;
24  TypeTy Type;
25  unsigned Cost;
26};
27
28/// Find in cost table, TypeTy must be comparable to CompareTy by ==
29template <class TypeTy, class CompareTy>
30int 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 ==
41template <class TypeTy, class CompareTy, unsigned N>
42int 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
48template <class TypeTy>
49struct 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 ==
58template <class TypeTy, class CompareTy>
59int 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 ==
72template <class TypeTy, class CompareTy, unsigned N>
73int 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