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