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