1becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===- CodeGenMapTable.cpp - Instruction Mapping Table Generator ----------===//
2becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
3becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//                     The LLVM Compiler Infrastructure
4becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
5becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// This file is distributed under the University of Illinois Open Source
6becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// License. See LICENSE.TXT for details.
7becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
8becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
9becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// CodeGenMapTable provides functionality for the TabelGen to create
10becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// relation mapping between instructions. Relation models are defined using
11becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// InstrMapping as a base class. This file implements the functionality which
12becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// parses these definitions and generates relation maps using the information
13becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// specified there. These maps are emitted as tables in the XXXGenInstrInfo.inc
14becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// file along with the functions to query them.
15becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
16becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// A relationship model to relate non-predicate instructions with their
17becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// predicated true/false forms can be defined as follows:
18becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
19becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// def getPredOpcode : InstrMapping {
20becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let FilterClass = "PredRel";
21becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let RowFields = ["BaseOpcode"];
22becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let ColFields = ["PredSense"];
23becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let KeyCol = ["none"];
24becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let ValueCols = [["true"], ["false"]]; }
25becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
26becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// CodeGenMapTable parses this map and generates a table in XXXGenInstrInfo.inc
27becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// file that contains the instructions modeling this relationship. This table
28becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// is defined in the function
29becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// "int getPredOpcode(uint16_t Opcode, enum PredSense inPredSense)"
30becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// that can be used to retrieve the predicated form of the instruction by
31becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// passing its opcode value and the predicate sense (true/false) of the desired
32becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// instruction as arguments.
33becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
34becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Short description of the algorithm:
35becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
36becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// 1) Iterate through all the records that derive from "InstrMapping" class.
37becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// 2) For each record, filter out instructions based on the FilterClass value.
38becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// 3) Iterate through this set of instructions and insert them into
39becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// RowInstrMap map based on their RowFields values. RowInstrMap is keyed by the
40becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// vector of RowFields values and contains vectors of Records (instructions) as
41becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// values. RowFields is a list of fields that are required to have the same
42becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// values for all the instructions appearing in the same row of the relation
43becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// table. All the instructions in a given row of the relation table have some
44becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// sort of relationship with the key instruction defined by the corresponding
45becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// relationship model.
46becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
47becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Ex: RowInstrMap(RowVal1, RowVal2, ...) -> [Instr1, Instr2, Instr3, ... ]
48becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Here Instr1, Instr2, Instr3 have same values (RowVal1, RowVal2) for
49becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// RowFields. These groups of instructions are later matched against ValueCols
50becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// to determine the column they belong to, if any.
51becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
52becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// While building the RowInstrMap map, collect all the key instructions in
53becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// KeyInstrVec. These are the instructions having the same values as KeyCol
54becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// for all the fields listed in ColFields.
55becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
56becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// For Example:
57becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
58becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Relate non-predicate instructions with their predicated true/false forms.
59becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
60becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// def getPredOpcode : InstrMapping {
61becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let FilterClass = "PredRel";
62becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let RowFields = ["BaseOpcode"];
63becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let ColFields = ["PredSense"];
64becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let KeyCol = ["none"];
65becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  let ValueCols = [["true"], ["false"]]; }
66becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
67becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Here, only instructions that have "none" as PredSense will be selected as key
68becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// instructions.
69becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
70becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// 4) For each key instruction, get the group of instructions that share the
71becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// same key-value as the key instruction from RowInstrMap. Iterate over the list
72becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// of columns in ValueCols (it is defined as a list<list<string> >. Therefore,
73becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// it can specify multi-column relationships). For each column, find the
74becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// instruction from the group that matches all the values for the column.
75becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Multiple matches are not allowed.
76becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//
77becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
78becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
79becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop#include "CodeGenTarget.h"
80becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop#include "llvm/Support/Format.h"
8161131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger#include "llvm/TableGen/Error.h"
82becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popusing namespace llvm;
83becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Poptypedef std::map<std::string, std::vector<Record*> > InstrRelMapTy;
84becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
85becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Poptypedef std::map<std::vector<Init*>, std::vector<Record*> > RowInstrMapTy;
86becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
87becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popnamespace {
88becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
89becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
90becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// This class is used to represent InstrMapping class defined in Target.td file.
91becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popclass InstrMap {
92becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popprivate:
93becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::string Name;
94becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::string FilterClass;
95becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *RowFields;
96becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *ColFields;
97becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *KeyCol;
98becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::vector<ListInit*> ValueCols;
99becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
100becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Poppublic:
101becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  InstrMap(Record* MapRec) {
102becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Name = MapRec->getName();
103becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
104becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // FilterClass - It's used to reduce the search space only to the
105becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // instructions that define the kind of relationship modeled by
106becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // this InstrMapping object/record.
107becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    const RecordVal *Filter = MapRec->getValue("FilterClass");
108becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    FilterClass = Filter->getValue()->getAsUnquotedString();
109becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
110becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // List of fields/attributes that need to be same across all the
111becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // instructions in a row of the relation table.
112becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    RowFields = MapRec->getValueAsListInit("RowFields");
113becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
114becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // List of fields/attributes that are constant across all the instruction
115becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // in a column of the relation table. Ex: ColFields = 'predSense'
116becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    ColFields = MapRec->getValueAsListInit("ColFields");
117becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
118becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Values for the fields/attributes listed in 'ColFields'.
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Ex: KeyCol = 'noPred' -- key instruction is non-predicated
120becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    KeyCol = MapRec->getValueAsListInit("KeyCol");
121becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
122becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // List of values for the fields/attributes listed in 'ColFields', one for
123becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // each column in the relation table.
124becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    //
125becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Ex: ValueCols = [['true'],['false']] -- it results two columns in the
126becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // table. First column requires all the instructions to have predSense
127becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // set to 'true' and second column requires it to be 'false'.
128becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    ListInit *ColValList = MapRec->getValueAsListInit("ValueCols");
129becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
130becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Each instruction map must specify at least one column for it to be valid.
131becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    if (ColValList->getSize() == 0)
13261131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger      PrintFatalError(MapRec->getLoc(), "InstrMapping record `" +
13361131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger        MapRec->getName() + "' has empty " + "`ValueCols' field!");
134becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
135becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned i = 0, e = ColValList->getSize(); i < e; i++) {
136becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      ListInit *ColI = dyn_cast<ListInit>(ColValList->getElement(i));
137becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
138becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      // Make sure that all the sub-lists in 'ValueCols' have same number of
139becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      // elements as the fields in 'ColFields'.
14061131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger      if (ColI->getSize() != ColFields->getSize())
14161131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger        PrintFatalError(MapRec->getLoc(), "Record `" + MapRec->getName() +
14261131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger          "', field `ValueCols' entries don't match with " +
14361131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger          " the entries in 'ColFields'!");
14461131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger      ValueCols.push_back(ColI);
145becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
146becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
147becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
148becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::string getName() const {
149becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    return Name;
150becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
151becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
152becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::string getFilterClass() {
153becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    return FilterClass;
154becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
155becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
156becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *getRowFields() const {
157becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    return RowFields;
158becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
159becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
160becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *getColFields() const {
161becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    return ColFields;
162becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
163becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
164becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *getKeyCol() const {
165becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    return KeyCol;
166becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
167becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
168becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const std::vector<ListInit*> &getValueCols() const {
169becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    return ValueCols;
170becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
171becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop};
172becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop} // End anonymous namespace.
173becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
174becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
175becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
176becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// class MapTableEmitter : It builds the instruction relation maps using
177becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// the information provided in InstrMapping records. It outputs these
178becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// relationship maps as tables into XXXGenInstrInfo.inc file along with the
179becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// functions to query them.
180becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
181becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popnamespace {
182becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popclass MapTableEmitter {
183becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popprivate:
184becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//  std::string TargetName;
185becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const CodeGenTarget &Target;
186becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // InstrMapDesc - InstrMapping record to be processed.
187becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  InstrMap InstrMapDesc;
188becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
189becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // InstrDefs - list of instructions filtered using FilterClass defined
190becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // in InstrMapDesc.
191becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::vector<Record*> InstrDefs;
192becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
193becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // RowInstrMap - maps RowFields values to the instructions. It's keyed by the
194becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // values of the row fields and contains vector of records as values.
195becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  RowInstrMapTy RowInstrMap;
196becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
197becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // KeyInstrVec - list of key instructions.
198becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::vector<Record*> KeyInstrVec;
199becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  DenseMap<Record*, std::vector<Record*> > MapTable;
200becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
201becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Poppublic:
202becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  MapTableEmitter(CodeGenTarget &Target, RecordKeeper &Records, Record *IMRec):
203a8a0a155de16830b8fcab539ba2ec21de3145532David Blaikie                  Target(Target), InstrMapDesc(IMRec) {
204becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    const std::string FilterClass = InstrMapDesc.getFilterClass();
205becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    InstrDefs = Records.getAllDerivedDefinitions(FilterClass);
206a8a0a155de16830b8fcab539ba2ec21de3145532David Blaikie  }
207becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
208becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  void buildRowInstrMap();
209becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
210becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Returns true if an instruction is a key instruction, i.e., its ColFields
211becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // have same values as KeyCol.
212becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  bool isKeyColInstr(Record* CurInstr);
213becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
214becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Find column instruction corresponding to a key instruction based on the
215becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // constraints for that column.
216becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  Record *getInstrForColumn(Record *KeyInstr, ListInit *CurValueCol);
217becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
218becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Find column instructions for each key instruction based
219becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // on ValueCols and store them into MapTable.
220becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  void buildMapTable();
221becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
222becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  void emitBinSearch(raw_ostream &OS, unsigned TableSize);
223becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  void emitTablesWithFunc(raw_ostream &OS);
224becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  unsigned emitBinSearchTable(raw_ostream &OS);
225becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
226becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Lookup functions to query binary search tables.
227becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  void emitMapFuncBody(raw_ostream &OS, unsigned TableSize);
228becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
229becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop};
230becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop} // End anonymous namespace.
231becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
232becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
233becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
234becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Process all the instructions that model this relation (alreday present in
235becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// InstrDefs) and insert them into RowInstrMap which is keyed by the values of
236becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// the fields listed as RowFields. It stores vectors of records as values.
237becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// All the related instructions have the same values for the RowFields thus are
238becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// part of the same key-value pair.
239becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
240becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
241becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popvoid MapTableEmitter::buildRowInstrMap() {
242becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned i = 0, e = InstrDefs.size(); i < e; i++) {
243becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Record *CurInstr = InstrDefs[i];
244becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::vector<Init*> KeyValue;
245becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    ListInit *RowFields = InstrMapDesc.getRowFields();
246becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned j = 0, endRF = RowFields->getSize(); j < endRF; j++) {
247becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      Init *RowFieldsJ = RowFields->getElement(j);
248becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      Init *CurInstrVal = CurInstr->getValue(RowFieldsJ)->getValue();
249becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      KeyValue.push_back(CurInstrVal);
250becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
251becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
252becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Collect key instructions into KeyInstrVec. Later, these instructions are
253becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // processed to assign column position to the instructions sharing
254becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // their KeyValue in RowInstrMap.
255becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    if (isKeyColInstr(CurInstr))
256becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      KeyInstrVec.push_back(CurInstr);
257becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
258becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    RowInstrMap[KeyValue].push_back(CurInstr);
259becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
260becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
261becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
262becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
263becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Return true if an instruction is a KeyCol instruction.
264becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
265becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
266becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popbool MapTableEmitter::isKeyColInstr(Record* CurInstr) {
267becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *ColFields = InstrMapDesc.getColFields();
268becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *KeyCol = InstrMapDesc.getKeyCol();
269becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
270becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Check if the instruction is a KeyCol instruction.
271becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  bool MatchFound = true;
272becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned j = 0, endCF = ColFields->getSize();
273becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      (j < endCF) && MatchFound; j++) {
274becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    RecordVal *ColFieldName = CurInstr->getValue(ColFields->getElement(j));
275becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::string CurInstrVal = ColFieldName->getValue()->getAsUnquotedString();
276becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::string KeyColValue = KeyCol->getElement(j)->getAsUnquotedString();
277becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    MatchFound = (CurInstrVal == KeyColValue);
278becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
279becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  return MatchFound;
280becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
281becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
282becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
283becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Build a map to link key instructions with the column instructions arranged
284becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// according to their column positions.
285becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
286becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
287becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popvoid MapTableEmitter::buildMapTable() {
288becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Find column instructions for a given key based on the ColField
289becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // constraints.
290becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
291becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  unsigned NumOfCols = ValueCols.size();
292becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned j = 0, endKI = KeyInstrVec.size(); j < endKI; j++) {
293becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Record *CurKeyInstr = KeyInstrVec[j];
294becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::vector<Record*> ColInstrVec(NumOfCols);
295becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
296becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Find the column instruction based on the constraints for the column.
297becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned ColIdx = 0; ColIdx < NumOfCols; ColIdx++) {
298becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      ListInit *CurValueCol = ValueCols[ColIdx];
299becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      Record *ColInstr = getInstrForColumn(CurKeyInstr, CurValueCol);
300becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      ColInstrVec[ColIdx] = ColInstr;
301becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
302becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    MapTable[CurKeyInstr] = ColInstrVec;
303becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
304becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
305becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
306becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
307becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Find column instruction based on the constraints for that column.
308becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
309becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
310becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian PopRecord *MapTableEmitter::getInstrForColumn(Record *KeyInstr,
311becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop                                           ListInit *CurValueCol) {
312becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *RowFields = InstrMapDesc.getRowFields();
313becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::vector<Init*> KeyValue;
314becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
315becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Construct KeyValue using KeyInstr's values for RowFields.
316becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned j = 0, endRF = RowFields->getSize(); j < endRF; j++) {
317becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Init *RowFieldsJ = RowFields->getElement(j);
318becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Init *KeyInstrVal = KeyInstr->getValue(RowFieldsJ)->getValue();
319becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    KeyValue.push_back(KeyInstrVal);
320becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
321becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
322becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Get all the instructions that share the same KeyValue as the KeyInstr
323becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // in RowInstrMap. We search through these instructions to find a match
324becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // for the current column, i.e., the instruction which has the same values
325becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // as CurValueCol for all the fields in ColFields.
326becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const std::vector<Record*> &RelatedInstrVec = RowInstrMap[KeyValue];
327becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
328becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *ColFields = InstrMapDesc.getColFields();
329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Record *MatchInstr = nullptr;
330becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
331becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned i = 0, e = RelatedInstrVec.size(); i < e; i++) {
332becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    bool MatchFound = true;
333becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Record *CurInstr = RelatedInstrVec[i];
334becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned j = 0, endCF = ColFields->getSize();
335becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        (j < endCF) && MatchFound; j++) {
336becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      Init *ColFieldJ = ColFields->getElement(j);
337becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      Init *CurInstrInit = CurInstr->getValue(ColFieldJ)->getValue();
338becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      std::string CurInstrVal = CurInstrInit->getAsUnquotedString();
339becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      Init *ColFieldJVallue = CurValueCol->getElement(j);
340becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      MatchFound = (CurInstrVal == ColFieldJVallue->getAsUnquotedString());
341becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
342becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
343becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    if (MatchFound) {
344becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      if (MatchInstr) // Already had a match
345becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        // Error if multiple matches are found for a column.
34661131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger        PrintFatalError("Multiple matches found for `" + KeyInstr->getName() +
34761131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger              "', for the relation `" + InstrMapDesc.getName());
34861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger      MatchInstr = CurInstr;
349becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
350becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
351becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  return MatchInstr;
352becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
353becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
354becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
355becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Emit one table per relation. Only instructions with a valid relation of a
356becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// given type are included in the table sorted by their enum values (opcodes).
357becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Binary search is used for locating instructions in the table.
358becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
359becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
360becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popunsigned MapTableEmitter::emitBinSearchTable(raw_ostream &OS) {
361becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
362becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const std::vector<const CodeGenInstruction*> &NumberedInstructions =
363becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop                                            Target.getInstructionsByEnumValue();
364becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::string TargetName = Target.getName();
365becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
366becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  unsigned NumCol = ValueCols.size();
367becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  unsigned TotalNumInstr = NumberedInstructions.size();
368becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  unsigned TableSize = 0;
369becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
370becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "static const uint16_t "<<InstrMapDesc.getName();
371becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Number of columns in the table are NumCol+1 because key instructions are
372becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // emitted as first column.
373becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "Table[]["<< NumCol+1 << "] = {\n";
374becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned i = 0; i < TotalNumInstr; i++) {
375becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Record *CurInstr = NumberedInstructions[i]->TheDef;
376becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::vector<Record*> ColInstrs = MapTable[CurInstr];
377becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::string OutStr("");
378becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    unsigned RelExists = 0;
379becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    if (ColInstrs.size()) {
380becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      for (unsigned j = 0; j < NumCol; j++) {
381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        if (ColInstrs[j] != nullptr) {
382becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop          RelExists = 1;
383becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop          OutStr += ", ";
384becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop          OutStr += TargetName;
385becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop          OutStr += "::";
386becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop          OutStr += ColInstrs[j]->getName();
38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        } else { OutStr += ", (uint16_t)-1U";}
388becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      }
389becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
390becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      if (RelExists) {
391becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        OS << "  { " << TargetName << "::" << CurInstr->getName();
392becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        OS << OutStr <<" },\n";
393becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        TableSize++;
394becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      }
395becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
396becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
397becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  if (!TableSize) {
398becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    OS << "  { " << TargetName << "::" << "INSTRUCTION_LIST_END, ";
399becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    OS << TargetName << "::" << "INSTRUCTION_LIST_END }";
400becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
401becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "}; // End of " << InstrMapDesc.getName() << "Table\n\n";
402becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  return TableSize;
403becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
404becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
405becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
406becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Emit binary search algorithm as part of the functions used to query
407becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// relation tables.
408becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
409becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
410becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popvoid MapTableEmitter::emitBinSearch(raw_ostream &OS, unsigned TableSize) {
411becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "  unsigned mid;\n";
412becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "  unsigned start = 0;\n";
413becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "  unsigned end = " << TableSize << ";\n";
414becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "  while (start < end) {\n";
415becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "    mid = start + (end - start)/2;\n";
416becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "    if (Opcode == " << InstrMapDesc.getName() << "Table[mid][0]) {\n";
417becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "      break;\n";
418becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "    }\n";
419becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "    if (Opcode < " << InstrMapDesc.getName() << "Table[mid][0])\n";
420becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "      end = mid;\n";
421becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "    else\n";
422becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "      start = mid + 1;\n";
423becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "  }\n";
424becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "  if (start == end)\n";
425becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "    return -1; // Instruction doesn't exist in this table.\n\n";
426becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
427becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
428becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
429becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Emit functions to query relation tables.
430becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
431becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
432becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popvoid MapTableEmitter::emitMapFuncBody(raw_ostream &OS,
433becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop                                           unsigned TableSize) {
434becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
435becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *ColFields = InstrMapDesc.getColFields();
436becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
437becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
438becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Emit binary search algorithm to locate instructions in the
439becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // relation table. If found, return opcode value from the appropriate column
440becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // of the table.
441becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  emitBinSearch(OS, TableSize);
442becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
443becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  if (ValueCols.size() > 1) {
444becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned i = 0, e = ValueCols.size(); i < e; i++) {
445becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      ListInit *ColumnI = ValueCols[i];
446becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      for (unsigned j = 0, ColSize = ColumnI->getSize(); j < ColSize; j++) {
447becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        std::string ColName = ColFields->getElement(j)->getAsUnquotedString();
448becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        OS << "  if (in" << ColName;
449becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        OS << " == ";
450becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        OS << ColName << "_" << ColumnI->getElement(j)->getAsUnquotedString();
451becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        if (j < ColumnI->getSize() - 1) OS << " && ";
452becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        else OS << ")\n";
453becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      }
454becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      OS << "    return " << InstrMapDesc.getName();
455becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      OS << "Table[mid]["<<i+1<<"];\n";
456becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
457becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    OS << "  return -1;";
458becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
459becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  else
460becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    OS << "  return " << InstrMapDesc.getName() << "Table[mid][1];\n";
461becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
462becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS <<"}\n\n";
463becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
464becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
465becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
466becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Emit relation tables and the functions to query them.
467becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
468becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
469becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popvoid MapTableEmitter::emitTablesWithFunc(raw_ostream &OS) {
470becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
471becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Emit function name and the input parameters : mostly opcode value of the
472becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // current instruction. However, if a table has multiple columns (more than 2
473becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // since first column is used for the key instructions), then we also need
474becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // to pass another input to indicate the column to be selected.
475becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
476becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  ListInit *ColFields = InstrMapDesc.getColFields();
477becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  const std::vector<ListInit*> &ValueCols = InstrMapDesc.getValueCols();
478becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "// "<< InstrMapDesc.getName() << "\n";
479becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "int "<< InstrMapDesc.getName() << "(uint16_t Opcode";
480becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  if (ValueCols.size() > 1) {
481becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned i = 0, e = ColFields->getSize(); i < e; i++) {
482becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      std::string ColName = ColFields->getElement(i)->getAsUnquotedString();
483becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      OS << ", enum " << ColName << " in" << ColName << ") {\n";
484becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
485becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  } else { OS << ") {\n"; }
486becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
487becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Emit map table.
488becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  unsigned TableSize = emitBinSearchTable(OS);
489becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
490becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Emit rest of the function body.
491becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  emitMapFuncBody(OS, TableSize);
492becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
493becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
494becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
495becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Emit enums for the column fields across all the instruction maps.
496becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
497becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
498becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popstatic void emitEnums(raw_ostream &OS, RecordKeeper &Records) {
499becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
500becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::vector<Record*> InstrMapVec;
501becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  InstrMapVec = Records.getAllDerivedDefinitions("InstrMapping");
502becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::map<std::string, std::vector<Init*> > ColFieldValueMap;
503becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
504becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Iterate over all InstrMapping records and create a map between column
505becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // fields and their possible values across all records.
506becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned i = 0, e = InstrMapVec.size(); i < e; i++) {
507becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    Record *CurMap = InstrMapVec[i];
508becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    ListInit *ColFields;
509becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    ColFields = CurMap->getValueAsListInit("ColFields");
510becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    ListInit *List = CurMap->getValueAsListInit("ValueCols");
511becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::vector<ListInit*> ValueCols;
512becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    unsigned ListSize = List->getSize();
513becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
514becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned j = 0; j < ListSize; j++) {
515becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      ListInit *ListJ = dyn_cast<ListInit>(List->getElement(j));
516becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
51761131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger      if (ListJ->getSize() != ColFields->getSize())
51861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger        PrintFatalError("Record `" + CurMap->getName() + "', field "
51961131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger          "`ValueCols' entries don't match with the entries in 'ColFields' !");
520becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      ValueCols.push_back(ListJ);
521becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
522becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
523becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    for (unsigned j = 0, endCF = ColFields->getSize(); j < endCF; j++) {
524becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      for (unsigned k = 0; k < ListSize; k++){
525becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        std::string ColName = ColFields->getElement(j)->getAsUnquotedString();
526becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        ColFieldValueMap[ColName].push_back((ValueCols[k])->getElement(j));
527becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      }
528becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
529becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
530becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
531becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (std::map<std::string, std::vector<Init*> >::iterator
532becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop       II = ColFieldValueMap.begin(), IE = ColFieldValueMap.end();
533becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop       II != IE; II++) {
534becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    std::vector<Init*> FieldValues = (*II).second;
535becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
536becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Delete duplicate entries from ColFieldValueMap
5371912c7624ab7d2130d97088b491ce2d208e30e64Jyotsna Verma    for (unsigned i = 0; i < FieldValues.size() - 1; i++) {
538becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      Init *CurVal = FieldValues[i];
5391912c7624ab7d2130d97088b491ce2d208e30e64Jyotsna Verma      for (unsigned j = i+1; j < FieldValues.size(); j++) {
540becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        if (CurVal == FieldValues[j]) {
541becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop          FieldValues.erase(FieldValues.begin()+j);
542becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        }
543becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      }
544becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
545becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
546becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Emit enumerated values for the column fields.
547becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    OS << "enum " << (*II).first << " {\n";
5481912c7624ab7d2130d97088b491ce2d208e30e64Jyotsna Verma    for (unsigned i = 0, endFV = FieldValues.size(); i < endFV; i++) {
549becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      OS << "\t" << (*II).first << "_" << FieldValues[i]->getAsUnquotedString();
5501912c7624ab7d2130d97088b491ce2d208e30e64Jyotsna Verma      if (i != endFV - 1)
551becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        OS << ",\n";
552becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop      else
553becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop        OS << "\n};\n\n";
554becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    }
555becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
556becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
557becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
558becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popnamespace llvm {
559becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
560becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// Parse 'InstrMapping' records and use the information to form relationship
561becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// between instructions. These relations are emitted as a tables along with the
562becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop// functions to query them.
563becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop//===----------------------------------------------------------------------===//
564becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Popvoid EmitMapTable(RecordKeeper &Records, raw_ostream &OS) {
565becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  CodeGenTarget Target(Records);
566becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::string TargetName = Target.getName();
567becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  std::vector<Record*> InstrMapVec;
568becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  InstrMapVec = Records.getAllDerivedDefinitions("InstrMapping");
569becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
570becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  if (!InstrMapVec.size())
571becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    return;
572becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
573becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "#ifdef GET_INSTRMAP_INFO\n";
574becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "#undef GET_INSTRMAP_INFO\n";
575becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "namespace llvm {\n\n";
576becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "namespace " << TargetName << " {\n\n";
577becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
578becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Emit coulumn field names and their values as enums.
579becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  emitEnums(OS, Records);
580becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
581becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // Iterate over all instruction mapping records and construct relationship
582becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  // maps based on the information specified there.
583becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  //
584becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  for (unsigned i = 0, e = InstrMapVec.size(); i < e; i++) {
585becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    MapTableEmitter IMap(Target, Records, InstrMapVec[i]);
586becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
587becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Build RowInstrMap to group instructions based on their values for
588becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // RowFields. In the process, also collect key instructions into
589becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // KeyInstrVec.
590becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    IMap.buildRowInstrMap();
591becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
592becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Build MapTable to map key instructions with the corresponding column
593becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // instructions.
594becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    IMap.buildMapTable();
595becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
596becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    // Emit map tables and the functions to query them.
597becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop    IMap.emitTablesWithFunc(OS);
598becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  }
599becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "} // End " << TargetName << " namespace\n";
600becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "} // End llvm namespace\n";
601becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop  OS << "#endif // GET_INSTRMAP_INFO\n\n";
602becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop}
603becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop
604becdf4d7cd0d5a3079339b6e177066b143d2f84cSebastian Pop} // End llvm namespace
605