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