1 | //===- SubtargetFeatureInfo.h - Helpers for subtarget features --*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_UTIL_TABLEGEN_COMMON_SUBTARGETFEATUREINFO_H |
10 | #define LLVM_UTIL_TABLEGEN_COMMON_SUBTARGETFEATUREINFO_H |
11 | |
12 | #include "llvm/ADT/StringRef.h" |
13 | #include "llvm/TableGen/Record.h" |
14 | #include <map> |
15 | #include <string> |
16 | #include <utility> |
17 | #include <vector> |
18 | |
19 | namespace llvm { |
20 | struct SubtargetFeatureInfo; |
21 | using SubtargetFeatureInfoMap = |
22 | std::map<const Record *, SubtargetFeatureInfo, LessRecordByID>; |
23 | using SubtargetFeaturesInfoVec = |
24 | std::vector<std::pair<const Record *, SubtargetFeatureInfo>>; |
25 | |
26 | /// Helper class for storing information on a subtarget feature which |
27 | /// participates in instruction matching. |
28 | struct SubtargetFeatureInfo { |
29 | /// The predicate record for this feature. |
30 | const Record *TheDef; |
31 | |
32 | /// An unique index assigned to represent this feature. |
33 | uint64_t Index; |
34 | |
35 | SubtargetFeatureInfo(const Record *D, uint64_t Idx) : TheDef(D), Index(Idx) {} |
36 | |
37 | /// The name of the enumerated constant identifying this feature. |
38 | std::string getEnumName() const { |
39 | return "Feature_" + TheDef->getName().str(); |
40 | } |
41 | |
42 | /// The name of the enumerated constant identifying the bitnumber for |
43 | /// this feature. |
44 | std::string getEnumBitName() const { |
45 | return "Feature_" + TheDef->getName().str() + "Bit" ; |
46 | } |
47 | |
48 | bool mustRecomputePerFunction() const { |
49 | return TheDef->getValueAsBit(FieldName: "RecomputePerFunction" ); |
50 | } |
51 | |
52 | void dump() const; |
53 | |
54 | static SubtargetFeaturesInfoVec getAll(const RecordKeeper &Records); |
55 | |
56 | /// Emit the subtarget feature flag definitions. |
57 | /// |
58 | /// This version emits the bit index for the feature and can therefore support |
59 | /// more than 64 feature bits. |
60 | static void emitSubtargetFeatureBitEnumeration( |
61 | const SubtargetFeatureInfoMap &SubtargetFeatures, raw_ostream &OS, |
62 | const std::map<std::string, unsigned> *HwModes = nullptr); |
63 | |
64 | static void emitNameTable(SubtargetFeatureInfoMap &SubtargetFeatures, |
65 | raw_ostream &OS); |
66 | |
67 | /// Emit the function to compute the list of available features given a |
68 | /// subtarget. |
69 | /// |
70 | /// This version is used for subtarget features defined using Predicate<> |
71 | /// and supports more than 64 feature bits. |
72 | /// |
73 | /// \param TargetName The name of the target as used in class prefixes (e.g. |
74 | /// <TargetName>Subtarget) |
75 | /// \param ClassName The name of the class that will contain the generated |
76 | /// functions (including the target prefix.) |
77 | /// \param FuncName The name of the function to emit. |
78 | /// \param SubtargetFeatures A map of TableGen records to the |
79 | /// SubtargetFeatureInfo equivalent. |
80 | /// \param ExtraParams Additional arguments to the generated function. |
81 | /// \param HwModes Map of HwMode conditions to check. |
82 | static void emitComputeAvailableFeatures( |
83 | StringRef TargetName, StringRef ClassName, StringRef FuncName, |
84 | const SubtargetFeatureInfoMap &SubtargetFeatures, raw_ostream &OS, |
85 | StringRef = "" , |
86 | const std::map<std::string, unsigned> *HwModes = nullptr); |
87 | |
88 | /// Emit the function to compute the list of available features given a |
89 | /// subtarget. |
90 | /// |
91 | /// This version is used for subtarget features defined using |
92 | /// AssemblerPredicate<> and supports up to 64 feature bits. |
93 | /// |
94 | /// \param TargetName The name of the target as used in class prefixes (e.g. |
95 | /// <TargetName>Subtarget) |
96 | /// \param ClassName The name of the class (without the <Target> prefix) |
97 | /// that will contain the generated functions. |
98 | /// \param FuncName The name of the function to emit. |
99 | /// \param SubtargetFeatures A map of TableGen records to the |
100 | /// SubtargetFeatureInfo equivalent. |
101 | static void emitComputeAssemblerAvailableFeatures( |
102 | StringRef TargetName, StringRef ClassName, StringRef FuncName, |
103 | SubtargetFeatureInfoMap &SubtargetFeatures, raw_ostream &OS); |
104 | }; |
105 | } // end namespace llvm |
106 | |
107 | #endif // LLVM_UTIL_TABLEGEN_COMMON_SUBTARGETFEATUREINFO_H |
108 | |