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