1fa3d789dSPierre van Houtryve //===--- CodeGenHwModes.h ---------------------------------------*- 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 // Classes to parse and store HW mode information for instruction selection. 9fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===// 10fa3d789dSPierre van Houtryve 118a61bfcfSRahul Joshi #ifndef LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H 128a61bfcfSRahul Joshi #define LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H 13fa3d789dSPierre van Houtryve 14fa3d789dSPierre van Houtryve #include "llvm/ADT/DenseMap.h" 15fa3d789dSPierre van Houtryve #include "llvm/ADT/StringRef.h" 16fa3d789dSPierre van Houtryve #include <cassert> 17fa3d789dSPierre van Houtryve #include <map> 18fa3d789dSPierre van Houtryve #include <string> 19fa3d789dSPierre van Houtryve #include <utility> 20fa3d789dSPierre van Houtryve #include <vector> 21fa3d789dSPierre van Houtryve 22fa3d789dSPierre van Houtryve // HwModeId -> list of predicates (definition) 23fa3d789dSPierre van Houtryve 24fa3d789dSPierre van Houtryve namespace llvm { 25fa3d789dSPierre van Houtryve class Record; 26fa3d789dSPierre van Houtryve class RecordKeeper; 27fa3d789dSPierre van Houtryve 28fa3d789dSPierre van Houtryve struct CodeGenHwModes; 29fa3d789dSPierre van Houtryve 30fa3d789dSPierre van Houtryve struct HwMode { 31*985600dcSRahul Joshi HwMode(const Record *R); 32fa3d789dSPierre van Houtryve StringRef Name; 33fa3d789dSPierre van Houtryve std::string Features; 34fa3d789dSPierre van Houtryve std::string Predicates; 35fa3d789dSPierre van Houtryve void dump() const; 36fa3d789dSPierre van Houtryve }; 37fa3d789dSPierre van Houtryve 38fa3d789dSPierre van Houtryve struct HwModeSelect { 39*985600dcSRahul Joshi HwModeSelect(const Record *R, CodeGenHwModes &CGH); 40*985600dcSRahul Joshi typedef std::pair<unsigned, const Record *> PairType; 41fa3d789dSPierre van Houtryve std::vector<PairType> Items; 42fa3d789dSPierre van Houtryve void dump() const; 43fa3d789dSPierre van Houtryve }; 44fa3d789dSPierre van Houtryve 45fa3d789dSPierre van Houtryve struct CodeGenHwModes { 46fa3d789dSPierre van Houtryve enum : unsigned { DefaultMode = 0 }; 47fa3d789dSPierre van Houtryve static StringRef DefaultModeName; 48fa3d789dSPierre van Houtryve 49*985600dcSRahul Joshi CodeGenHwModes(const RecordKeeper &R); 50*985600dcSRahul Joshi unsigned getHwModeId(const Record *R) const; 51fa3d789dSPierre van Houtryve const HwMode &getMode(unsigned Id) const { 52fa3d789dSPierre van Houtryve assert(Id != 0 && "Mode id of 0 is reserved for the default mode"); 53fa3d789dSPierre van Houtryve return Modes[Id - 1]; 54fa3d789dSPierre van Houtryve } 55fa3d789dSPierre van Houtryve StringRef getModeName(unsigned Id, bool IncludeDefault = false) const { 56fa3d789dSPierre van Houtryve if (IncludeDefault && Id == CodeGenHwModes::DefaultMode) 57fa3d789dSPierre van Houtryve return DefaultModeName; 58fa3d789dSPierre van Houtryve return getMode(Id).Name; 59fa3d789dSPierre van Houtryve } 60*985600dcSRahul Joshi const HwModeSelect &getHwModeSelect(const Record *R) const; 61*985600dcSRahul Joshi const std::map<const Record *, HwModeSelect> &getHwModeSelects() const { 62fa3d789dSPierre van Houtryve return ModeSelects; 63fa3d789dSPierre van Houtryve } 64fa3d789dSPierre van Houtryve unsigned getNumModeIds() const { return Modes.size() + 1; } 65fa3d789dSPierre van Houtryve void dump() const; 66fa3d789dSPierre van Houtryve 67fa3d789dSPierre van Houtryve private: 68*985600dcSRahul Joshi const RecordKeeper &Records; 69*985600dcSRahul Joshi DenseMap<const Record *, unsigned> ModeIds; // HwMode Record -> HwModeId 70fa3d789dSPierre van Houtryve std::vector<HwMode> Modes; 71*985600dcSRahul Joshi std::map<const Record *, HwModeSelect> ModeSelects; 72fa3d789dSPierre van Houtryve }; 73fa3d789dSPierre van Houtryve } // namespace llvm 74fa3d789dSPierre van Houtryve 758a61bfcfSRahul Joshi #endif // LLVM_UTILS_TABLEGEN_COMMON_CODEGENHWMODES_H 76