1//===--- CodeGenHwModes.h ---------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// Classes to parse and store HW mode information for instruction selection. 9//===----------------------------------------------------------------------===// 10 11#ifndef LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H 12#define LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H 13 14#include "llvm/ADT/DenseMap.h" 15#include "llvm/ADT/StringRef.h" 16#include <cassert> 17#include <map> 18#include <string> 19#include <utility> 20#include <vector> 21 22// HwModeId -> list of predicates (definition) 23 24namespace llvm { 25 class Record; 26 class RecordKeeper; 27 28 struct CodeGenHwModes; 29 30 struct HwMode { 31 HwMode(Record *R); 32 StringRef Name; 33 std::string Features; 34 std::string Predicates; 35 void dump() const; 36 }; 37 38 struct HwModeSelect { 39 HwModeSelect(Record *R, CodeGenHwModes &CGH); 40 typedef std::pair<unsigned, Record*> PairType; 41 std::vector<PairType> Items; 42 void dump() const; 43 }; 44 45 struct CodeGenHwModes { 46 enum : unsigned { DefaultMode = 0 }; 47 static StringRef DefaultModeName; 48 49 CodeGenHwModes(RecordKeeper &R); 50 unsigned getHwModeId(Record *R) const; 51 const HwMode &getMode(unsigned Id) const { 52 assert(Id != 0 && "Mode id of 0 is reserved for the default mode"); 53 return Modes[Id-1]; 54 } 55 const HwModeSelect &getHwModeSelect(Record *R) const; 56 unsigned getNumModeIds() const { return Modes.size()+1; } 57 void dump() const; 58 59 private: 60 RecordKeeper &Records; 61 DenseMap<Record *, unsigned> ModeIds; // HwMode Record -> HwModeId 62 std::vector<HwMode> Modes; 63 std::map<Record*,HwModeSelect> ModeSelects; 64 }; 65} 66 67#endif // LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H 68