xref: /llvm-project/llvm/utils/TableGen/Common/CodeGenHwModes.h (revision 985600dcd3fcef4095097bea5b556e84c8143a7f)
1fa3d789dSPierre van Houtryve //===--- CodeGenHwModes.h ---------------------------------------*- C++ -*-===//
2fa3d789dSPierre van Houtryve //
3fa3d789dSPierre van Houtryve // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fa3d789dSPierre van Houtryve // See https://llvm.org/LICENSE.txt for license information.
5fa3d789dSPierre van Houtryve // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fa3d789dSPierre van Houtryve //
7fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===//
8fa3d789dSPierre van Houtryve // Classes to parse and store HW mode information for instruction selection.
9fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===//
10fa3d789dSPierre van Houtryve 
118a61bfcfSRahul Joshi #ifndef LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H
128a61bfcfSRahul Joshi #define LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H
13fa3d789dSPierre van Houtryve 
14fa3d789dSPierre van Houtryve #include "llvm/ADT/DenseMap.h"
15fa3d789dSPierre van Houtryve #include "llvm/ADT/StringRef.h"
16fa3d789dSPierre van Houtryve #include <cassert>
17fa3d789dSPierre van Houtryve #include <map>
18fa3d789dSPierre van Houtryve #include <string>
19fa3d789dSPierre van Houtryve #include <utility>
20fa3d789dSPierre van Houtryve #include <vector>
21fa3d789dSPierre van Houtryve 
22fa3d789dSPierre van Houtryve // HwModeId -> list of predicates (definition)
23fa3d789dSPierre van Houtryve 
24fa3d789dSPierre van Houtryve namespace llvm {
25fa3d789dSPierre van Houtryve class Record;
26fa3d789dSPierre van Houtryve class RecordKeeper;
27fa3d789dSPierre van Houtryve 
28fa3d789dSPierre van Houtryve struct CodeGenHwModes;
29fa3d789dSPierre van Houtryve 
30fa3d789dSPierre van Houtryve struct HwMode {
31*985600dcSRahul Joshi   HwMode(const Record *R);
32fa3d789dSPierre van Houtryve   StringRef Name;
33fa3d789dSPierre van Houtryve   std::string Features;
34fa3d789dSPierre van Houtryve   std::string Predicates;
35fa3d789dSPierre van Houtryve   void dump() const;
36fa3d789dSPierre van Houtryve };
37fa3d789dSPierre van Houtryve 
38fa3d789dSPierre van Houtryve struct HwModeSelect {
39*985600dcSRahul Joshi   HwModeSelect(const Record *R, CodeGenHwModes &CGH);
40*985600dcSRahul Joshi   typedef std::pair<unsigned, const Record *> PairType;
41fa3d789dSPierre van Houtryve   std::vector<PairType> Items;
42fa3d789dSPierre van Houtryve   void dump() const;
43fa3d789dSPierre van Houtryve };
44fa3d789dSPierre van Houtryve 
45fa3d789dSPierre van Houtryve struct CodeGenHwModes {
46fa3d789dSPierre van Houtryve   enum : unsigned { DefaultMode = 0 };
47fa3d789dSPierre van Houtryve   static StringRef DefaultModeName;
48fa3d789dSPierre van Houtryve 
49*985600dcSRahul Joshi   CodeGenHwModes(const RecordKeeper &R);
50*985600dcSRahul Joshi   unsigned getHwModeId(const Record *R) const;
51fa3d789dSPierre van Houtryve   const HwMode &getMode(unsigned Id) const {
52fa3d789dSPierre van Houtryve     assert(Id != 0 && "Mode id of 0 is reserved for the default mode");
53fa3d789dSPierre van Houtryve     return Modes[Id - 1];
54fa3d789dSPierre van Houtryve   }
55fa3d789dSPierre van Houtryve   StringRef getModeName(unsigned Id, bool IncludeDefault = false) const {
56fa3d789dSPierre van Houtryve     if (IncludeDefault && Id == CodeGenHwModes::DefaultMode)
57fa3d789dSPierre van Houtryve       return DefaultModeName;
58fa3d789dSPierre van Houtryve     return getMode(Id).Name;
59fa3d789dSPierre van Houtryve   }
60*985600dcSRahul Joshi   const HwModeSelect &getHwModeSelect(const Record *R) const;
61*985600dcSRahul Joshi   const std::map<const Record *, HwModeSelect> &getHwModeSelects() const {
62fa3d789dSPierre van Houtryve     return ModeSelects;
63fa3d789dSPierre van Houtryve   }
64fa3d789dSPierre van Houtryve   unsigned getNumModeIds() const { return Modes.size() + 1; }
65fa3d789dSPierre van Houtryve   void dump() const;
66fa3d789dSPierre van Houtryve 
67fa3d789dSPierre van Houtryve private:
68*985600dcSRahul Joshi   const RecordKeeper &Records;
69*985600dcSRahul Joshi   DenseMap<const Record *, unsigned> ModeIds; // HwMode Record -> HwModeId
70fa3d789dSPierre van Houtryve   std::vector<HwMode> Modes;
71*985600dcSRahul Joshi   std::map<const Record *, HwModeSelect> ModeSelects;
72fa3d789dSPierre van Houtryve };
73fa3d789dSPierre van Houtryve } // namespace llvm
74fa3d789dSPierre van Houtryve 
758a61bfcfSRahul Joshi #endif // LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H
76