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