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