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