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