RegisterInfoEmitter.cpp revision 1367fd09cb021bae61e7dd2ee208f76574c8e789
13112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner//===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// The LLVM Compiler Infrastructure 401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 501d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// This file was developed by the LLVM research group and is distributed under 601d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===// 93112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// 103112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// This tablegen backend is responsible for emitting a description of a target 113112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// register file for a code generator. It uses instances of the Register, 123112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// RegisterAliases, and RegisterClass classes to gather this information. 133112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner// 143112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner//===----------------------------------------------------------------------===// 153112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 163112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner#include "RegisterInfoEmitter.h" 17803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner#include "CodeGenTarget.h" 1826693113201f4c9d441678e50d96f38d3288798eChris Lattner#include "CodeGenRegisters.h" 193112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner#include "Record.h" 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/StringExtras.h" 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/STLExtras.h" 22f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling#include "llvm/Support/Streams.h" 2354d156d33324b7715453993f21684915a28e310aChris Lattner#include <set> 242082ebe8b3a5db302748828ab4f79a36d239c1d9Chris Lattnerusing namespace llvm; 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2654d156d33324b7715453993f21684915a28e310aChris Lattner// runEnums - Print out enum values for all of the registers. 2754d156d33324b7715453993f21684915a28e310aChris Lattnervoid RegisterInfoEmitter::runEnums(std::ostream &OS) { 2826693113201f4c9d441678e50d96f38d3288798eChris Lattner CodeGenTarget Target; 2926693113201f4c9d441678e50d96f38d3288798eChris Lattner const std::vector<CodeGenRegister> &Registers = Target.getRegisters(); 3054d156d33324b7715453993f21684915a28e310aChris Lattner 3126693113201f4c9d441678e50d96f38d3288798eChris Lattner std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace"); 3254d156d33324b7715453993f21684915a28e310aChris Lattner 330e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner EmitSourceFileHeader("Target Register Enum Values", OS); 342c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "namespace llvm {\n\n"; 3554d156d33324b7715453993f21684915a28e310aChris Lattner 3654d156d33324b7715453993f21684915a28e310aChris Lattner if (!Namespace.empty()) 3754d156d33324b7715453993f21684915a28e310aChris Lattner OS << "namespace " << Namespace << " {\n"; 3854d156d33324b7715453993f21684915a28e310aChris Lattner OS << " enum {\n NoRegister,\n"; 3954d156d33324b7715453993f21684915a28e310aChris Lattner 4054d156d33324b7715453993f21684915a28e310aChris Lattner for (unsigned i = 0, e = Registers.size(); i != e; ++i) 41114e5dd464f32e4275e5f0a28aa1586e463d6bbbChris Lattner OS << " " << Registers[i].getName() << ", \t// " << i+1 << "\n"; 42114e5dd464f32e4275e5f0a28aa1586e463d6bbbChris Lattner OS << " NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n"; 4354d156d33324b7715453993f21684915a28e310aChris Lattner OS << " };\n"; 4454d156d33324b7715453993f21684915a28e310aChris Lattner if (!Namespace.empty()) 4554d156d33324b7715453993f21684915a28e310aChris Lattner OS << "}\n"; 462c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "} // End llvm namespace \n"; 4754d156d33324b7715453993f21684915a28e310aChris Lattner} 4854d156d33324b7715453993f21684915a28e310aChris Lattner 499fff8919eefa377936918eec763b392e59049353Chris Lattnervoid RegisterInfoEmitter::runHeader(std::ostream &OS) { 500e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner EmitSourceFileHeader("Register Information Header Fragment", OS); 5126693113201f4c9d441678e50d96f38d3288798eChris Lattner CodeGenTarget Target; 5226693113201f4c9d441678e50d96f38d3288798eChris Lattner const std::string &TargetName = Target.getName(); 5338aa542f3679af5925315626a37e2d085954ce9fChris Lattner std::string ClassName = TargetName + "GenRegisterInfo"; 543112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 5512f75782141983c16e435a11dd724dfa32ed8dddDuraid Madina OS << "#include \"llvm/Target/MRegisterInfo.h\"\n"; 5612f75782141983c16e435a11dd724dfa32ed8dddDuraid Madina OS << "#include <string>\n\n"; 573112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 582c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "namespace llvm {\n\n"; 592c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner 6054d156d33324b7715453993f21684915a28e310aChris Lattner OS << "struct " << ClassName << " : public MRegisterInfo {\n" 619fff8919eefa377936918eec763b392e59049353Chris Lattner << " " << ClassName 629fff8919eefa377936918eec763b392e59049353Chris Lattner << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n" 6347622e37215429c20d8278ff57496d840811cc13Jim Laskey << " int getDwarfRegNum(unsigned RegNum) const;\n" 647bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman << " unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n" 653112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner << "};\n\n"; 6638aa542f3679af5925315626a37e2d085954ce9fChris Lattner 6742de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner const std::vector<CodeGenRegisterClass> &RegisterClasses = 6842de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner Target.getRegisterClasses(); 6942de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner 7042de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner if (!RegisterClasses.empty()) { 7142de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << "namespace " << RegisterClasses[0].Namespace 7242de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner << " { // Register classes\n"; 7360f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey 7460f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey OS << " enum {\n"; 7560f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 7660f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey if (i) OS << ",\n"; 7760f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey OS << " " << RegisterClasses[i].getName() << "RegClassID"; 7860f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey if (!i) OS << " = 1"; 7960f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey } 8060f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey OS << "\n };\n\n"; 8160f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey 8242de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 8342de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner const std::string &Name = RegisterClasses[i].getName(); 8460200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner 8560200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner // Output the register class definition. 8660200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner OS << " struct " << Name << "Class : public TargetRegisterClass {\n" 8760200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner << " " << Name << "Class();\n" 8860200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner << RegisterClasses[i].MethodProtos << " };\n"; 8960200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner 9060200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner // Output the extern for the instance. 9160200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner OS << " extern " << Name << "Class\t" << Name << "RegClass;\n"; 9260200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner // Output the extern for the pointer to the instance (should remove). 9360200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner OS << " static TargetRegisterClass * const "<< Name <<"RegisterClass = &" 9460200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner << Name << "RegClass;\n"; 9542de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner } 9642de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << "} // end of namespace " << TargetName << "\n\n"; 9738aa542f3679af5925315626a37e2d085954ce9fChris Lattner } 982c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "} // End llvm namespace \n"; 993112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner} 1003112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 1018d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Chengbool isSubRegisterClass(const CodeGenRegisterClass &RC, 1028d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng std::set<Record*> &RegSet) { 1038d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) { 1048d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng Record *Reg = RC.Elements[i]; 1058d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng if (!RegSet.count(Reg)) 1068d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng return false; 1078d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng } 1088d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng return true; 1098d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng} 1108d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 1114fc4fab856f9616bb4f42bd658d5c8de89751628Evan Chengstatic void addSuperReg(Record *R, Record *S, 1124fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng std::map<Record*, std::set<Record*> > &SubRegs, 1134fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng std::map<Record*, std::set<Record*> > &SuperRegs, 1144fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng std::map<Record*, std::set<Record*> > &Aliases, 1154fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng RegisterInfoEmitter &RIE) { 1164fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng if (R == S) { 1174fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng cerr << "Error: recursive sub-register relationship between" 1184fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng << " register " << RIE.getQualifiedName(R) 1194fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng << " and its sub-registers?\n"; 1204fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng abort(); 1214fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng } 1224fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng if (!SuperRegs[R].insert(S).second) 1234fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng return; 1244fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng SubRegs[S].insert(R); 1254fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng Aliases[R].insert(S); 1264fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng Aliases[S].insert(R); 1274fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng if (SuperRegs.count(S)) 1284fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng for (std::set<Record*>::iterator I = SuperRegs[S].begin(), 1294fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng E = SuperRegs[S].end(); I != E; ++I) 1304fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng addSuperReg(R, *I, SubRegs, SuperRegs, Aliases, RIE); 1314fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng} 1324fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng 1334fc4fab856f9616bb4f42bd658d5c8de89751628Evan Chengstatic void addSubSuperReg(Record *R, Record *S, 1344fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng std::map<Record*, std::set<Record*> > &SubRegs, 1354fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng std::map<Record*, std::set<Record*> > &SuperRegs, 1364fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng std::map<Record*, std::set<Record*> > &Aliases, 1374fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng RegisterInfoEmitter &RIE) { 1383cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng if (R == S) { 1393cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng cerr << "Error: recursive sub-register relationship between" 1403cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng << " register " << RIE.getQualifiedName(R) 1413cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng << " and its sub-registers?\n"; 1423cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng abort(); 1433cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng } 1443cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng 1453cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng if (!SubRegs[R].insert(S).second) 1463cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng return; 1474fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng addSuperReg(S, R, SubRegs, SuperRegs, Aliases, RIE); 1483cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng Aliases[R].insert(S); 1493cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng Aliases[S].insert(R); 1503cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng if (SubRegs.count(S)) 1513cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng for (std::set<Record*>::iterator I = SubRegs[S].begin(), 1523cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng E = SubRegs[S].end(); I != E; ++I) 1534fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng addSubSuperReg(R, *I, SubRegs, SuperRegs, Aliases, RIE); 1543cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng} 1553cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng 15654d156d33324b7715453993f21684915a28e310aChris Lattner// RegisterInfoEmitter::run - Main register file description emitter. 15754d156d33324b7715453993f21684915a28e310aChris Lattner// 15854d156d33324b7715453993f21684915a28e310aChris Lattnervoid RegisterInfoEmitter::run(std::ostream &OS) { 15959b92cec35af49e82e834cbef5384e170e410cbfChris Lattner CodeGenTarget Target; 1600e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner EmitSourceFileHeader("Register Information Source Fragment", OS); 16154d156d33324b7715453993f21684915a28e310aChris Lattner 1622c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "namespace llvm {\n\n"; 1632c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner 16454d156d33324b7715453993f21684915a28e310aChris Lattner // Start out by emitting each of the register classes... to do this, we build 16554d156d33324b7715453993f21684915a28e310aChris Lattner // a set of registers which belong to a register class, this is to ensure that 16654d156d33324b7715453993f21684915a28e310aChris Lattner // each register is only in a single register class. 16754d156d33324b7715453993f21684915a28e310aChris Lattner // 168056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner const std::vector<CodeGenRegisterClass> &RegisterClasses = 169056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner Target.getRegisterClasses(); 17054d156d33324b7715453993f21684915a28e310aChris Lattner 17154d156d33324b7715453993f21684915a28e310aChris Lattner // Loop over all of the register classes... emitting each one. 17254d156d33324b7715453993f21684915a28e310aChris Lattner OS << "namespace { // Register classes...\n"; 1739fff8919eefa377936918eec763b392e59049353Chris Lattner 174987b5cc5578410c3bbc6077c2e2aa5df33cd3447Chris Lattner // RegClassesBelongedTo - Keep track of which register classes each reg 175987b5cc5578410c3bbc6077c2e2aa5df33cd3447Chris Lattner // belongs to. 176987b5cc5578410c3bbc6077c2e2aa5df33cd3447Chris Lattner std::multimap<Record*, const CodeGenRegisterClass*> RegClassesBelongedTo; 177987b5cc5578410c3bbc6077c2e2aa5df33cd3447Chris Lattner 1786510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman // Emit the register enum value arrays for each RegisterClass 17954d156d33324b7715453993f21684915a28e310aChris Lattner for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 180056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner const CodeGenRegisterClass &RC = RegisterClasses[rc]; 181c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner 18242de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner // Give the register class a legal C name if it's anonymous. 18342de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner std::string Name = RC.TheDef->getName(); 18442de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner 18542de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner // Emit the register list now. 1866f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng OS << " // " << Name << " Register Class...\n" 1876f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng << " static const unsigned " << Name 188c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner << "[] = {\n "; 189056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) { 190056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner Record *Reg = RC.Elements[i]; 1919fff8919eefa377936918eec763b392e59049353Chris Lattner OS << getQualifiedName(Reg) << ", "; 192987b5cc5578410c3bbc6077c2e2aa5df33cd3447Chris Lattner 193987b5cc5578410c3bbc6077c2e2aa5df33cd3447Chris Lattner // Keep track of which regclasses this register is in. 194987b5cc5578410c3bbc6077c2e2aa5df33cd3447Chris Lattner RegClassesBelongedTo.insert(std::make_pair(Reg, &RC)); 195c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner } 196c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner OS << "\n };\n\n"; 19742de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner } 1988d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 1996510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman // Emit the ValueType arrays for each RegisterClass 2006510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 2016510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman const CodeGenRegisterClass &RC = RegisterClasses[rc]; 2026510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman 2036510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman // Give the register class a legal C name if it's anonymous. 2046510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman std::string Name = RC.TheDef->getName() + "VTs"; 2056510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman 2066510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman // Emit the register list now. 2076510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman OS << " // " << Name 2083b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng << " Register Class Value Types...\n" 2093b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng << " static const MVT::ValueType " << Name 2103b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng << "[] = {\n "; 2116510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman for (unsigned i = 0, e = RC.VTs.size(); i != e; ++i) 212b9daee9ece898ff5bf8cf354fe2286ad44a357e8Dan Gohman OS << getName(RC.VTs[i]) << ", "; 2136510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman OS << "MVT::Other\n };\n\n"; 2146510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman } 21542de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << "} // end anonymous namespace\n\n"; 21642de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner 21742de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner // Now that all of the structs have been emitted, emit the instances. 21842de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner if (!RegisterClasses.empty()) { 21942de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << "namespace " << RegisterClasses[0].Namespace 22042de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner << " { // Register class instances\n"; 22142de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) 22242de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << " " << RegisterClasses[i].getName() << "Class\t" 22360200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner << RegisterClasses[i].getName() << "RegClass;\n"; 22460f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey 2252ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng std::map<unsigned, std::set<unsigned> > SuperClassMap; 2261367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb std::map<unsigned, std::set<unsigned> > SuperRegClassMap; 2278d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng OS << "\n"; 228a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb 229a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb // Emit the sub-register classes for each RegisterClass 230a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 231a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb const CodeGenRegisterClass &RC = RegisterClasses[rc]; 232a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb 233a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb // Give the register class a legal C name if it's anonymous. 234a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb std::string Name = RC.TheDef->getName(); 235a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb 236a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb OS << " // " << Name 237a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb << " Sub-register Classess...\n" 238a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb << " static const TargetRegisterClass* const " 239a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb << Name << "SubRegClasses [] = {\n "; 240a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb 241a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb bool Empty = true; 242a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb 243a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb for (unsigned subrc = 0, e2 = RC.SubRegClasses.size(); 244a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb subrc != e2; ++subrc) { 245a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb unsigned rc2 = 0, e2 = RegisterClasses.size(); 246a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb for (; rc2 != e2; ++rc2) { 247a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb const CodeGenRegisterClass &RC2 = RegisterClasses[rc2]; 248a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb if (RC.SubRegClasses[subrc]->getName() == RC2.getName()) { 2491367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb if (!Empty) 2501367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb OS << ", "; 2511367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass"; 252a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb Empty = false; 2531367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb 2541367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb std::map<unsigned, std::set<unsigned> >::iterator SCMI = 2551367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb SuperRegClassMap.find(rc2); 2561367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb if (SCMI == SuperRegClassMap.end()) { 2571367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb SuperRegClassMap.insert(std::make_pair(rc2, std::set<unsigned>())); 2581367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb SCMI = SuperRegClassMap.find(rc2); 2591367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb } 2601367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb SCMI->second.insert(rc); 261a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb break; 262a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb } 263a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb } 264a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb if (rc2 == e2) 265a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb throw "Register Class member '" + 266a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb RC.SubRegClasses[subrc]->getName() + 267a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb "' is not a valid RegisterClass!"; 268a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb } 269a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb 270a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb OS << (!Empty ? ", " : "") << "NULL"; 271a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb OS << "\n };\n\n"; 272a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb } 273a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb 2741367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb // Emit the super-register classes for each RegisterClass 2751367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 2761367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb const CodeGenRegisterClass &RC = RegisterClasses[rc]; 2771367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb 2781367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb // Give the register class a legal C name if it's anonymous. 2791367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb std::string Name = RC.TheDef->getName(); 2801367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb 2811367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb OS << " // " << Name 2821367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb << " Super-register Classess...\n" 2831367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb << " static const TargetRegisterClass* const " 2841367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb << Name << "SuperRegClasses [] = {\n "; 2851367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb 2861367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb bool Empty = true; 2871367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb std::map<unsigned, std::set<unsigned> >::iterator I = 2881367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb SuperRegClassMap.find(rc); 2891367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb if (I != SuperRegClassMap.end()) { 2901367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb for (std::set<unsigned>::iterator II = I->second.begin(), 2911367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb EE = I->second.end(); II != EE; ++II) { 2921367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb const CodeGenRegisterClass &RC2 = RegisterClasses[*II]; 2931367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb if (!Empty) 2941367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb OS << ", "; 2951367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass"; 2961367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb Empty = false; 2971367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb } 2981367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb } 2991367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb 3001367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb OS << (!Empty ? ", " : "") << "NULL"; 3011367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb OS << "\n };\n\n"; 3021367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb } 3031367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb 3048d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng // Emit the sub-classes array for each RegisterClass 3058d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 3068d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng const CodeGenRegisterClass &RC = RegisterClasses[rc]; 3078d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 3088d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng // Give the register class a legal C name if it's anonymous. 3098d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng std::string Name = RC.TheDef->getName(); 3108d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 3118d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng std::set<Record*> RegSet; 3128d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng for (unsigned i = 0, e = RC.Elements.size(); i != e; ++i) { 3138d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng Record *Reg = RC.Elements[i]; 3148d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng RegSet.insert(Reg); 3158d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng } 3168d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 3178d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng OS << " // " << Name 3186f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng << " Register Class sub-classes...\n" 3193b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng << " static const TargetRegisterClass* const " 3208d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng << Name << "Subclasses [] = {\n "; 3218d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 3228d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng bool Empty = true; 3238d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) { 3248d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng const CodeGenRegisterClass &RC2 = RegisterClasses[rc2]; 3258d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng if (rc == rc2 || RC2.Elements.size() > RC.Elements.size() || 3268d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng RC.SpillSize != RC2.SpillSize || !isSubRegisterClass(RC2, RegSet)) 3278d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng continue; 3288d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 3298d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng if (!Empty) OS << ", "; 3308d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass"; 3318d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng Empty = false; 3322ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng 3332ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng std::map<unsigned, std::set<unsigned> >::iterator SCMI = 3342ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng SuperClassMap.find(rc2); 3352ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng if (SCMI == SuperClassMap.end()) { 3362ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng SuperClassMap.insert(std::make_pair(rc2, std::set<unsigned>())); 3372ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng SCMI = SuperClassMap.find(rc2); 3382ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng } 3392ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng SCMI->second.insert(rc); 3408d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng } 3418d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 3428d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng OS << (!Empty ? ", " : "") << "NULL"; 3438d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng OS << "\n };\n\n"; 3448d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng } 3458d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng 3462ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 3472ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng const CodeGenRegisterClass &RC = RegisterClasses[rc]; 3482ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng 3492ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng // Give the register class a legal C name if it's anonymous. 3502ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng std::string Name = RC.TheDef->getName(); 3512ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng 3522ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng OS << " // " << Name 3536f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng << " Register Class super-classes...\n" 3543b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng << " static const TargetRegisterClass* const " 3552ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng << Name << "Superclasses [] = {\n "; 3562ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng 3572ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng bool Empty = true; 3582ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng std::map<unsigned, std::set<unsigned> >::iterator I = 3592ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng SuperClassMap.find(rc); 3602ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng if (I != SuperClassMap.end()) { 3612ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng for (std::set<unsigned>::iterator II = I->second.begin(), 3622ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng EE = I->second.end(); II != EE; ++II) { 3632ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng const CodeGenRegisterClass &RC2 = RegisterClasses[*II]; 3642ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng if (!Empty) OS << ", "; 3652ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass"; 3662ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng Empty = false; 3672ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng } 3682ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng } 3692ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng 3702ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng OS << (!Empty ? ", " : "") << "NULL"; 3712ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng OS << "\n };\n\n"; 3722ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng } 3732ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng 3742ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng 37560200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 37660200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner const CodeGenRegisterClass &RC = RegisterClasses[i]; 37760200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner OS << RC.MethodBodies << "\n"; 3786510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman OS << RC.getName() << "Class::" << RC.getName() 3798d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng << "Class() : TargetRegisterClass(" 38060f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey << RC.getName() + "RegClassID" << ", " 3818d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng << RC.getName() + "VTs" << ", " 3828d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng << RC.getName() + "Subclasses" << ", " 3832ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng << RC.getName() + "Superclasses" << ", " 384a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb << RC.getName() + "SubRegClasses" << ", " 3851367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb << RC.getName() + "SuperRegClasses" << ", " 3864b2e5a680f2f6b7b3a43df1a4703ed0ff5ba07d5Chris Lattner << RC.SpillSize/8 << ", " 3874b2e5a680f2f6b7b3a43df1a4703ed0ff5ba07d5Chris Lattner << RC.SpillAlignment/8 << ", " << RC.getName() << ", " 3884b2e5a680f2f6b7b3a43df1a4703ed0ff5ba07d5Chris Lattner << RC.getName() << " + " << RC.Elements.size() << ") {}\n"; 38960200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner } 39060200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner 39142de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << "}\n"; 3929fff8919eefa377936918eec763b392e59049353Chris Lattner } 3939fff8919eefa377936918eec763b392e59049353Chris Lattner 39442de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << "\nnamespace {\n"; 3959fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " const TargetRegisterClass* const RegisterClasses[] = {\n"; 39642de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) 39742de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner OS << " &" << getQualifiedName(RegisterClasses[i].TheDef) 39860200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner << "RegClass,\n"; 3999fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " };\n"; 40054d156d33324b7715453993f21684915a28e310aChris Lattner 4014fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng // Emit register sub-registers / super-registers, aliases... 402c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng std::map<Record*, std::set<Record*> > RegisterImmSubRegs; 4033cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng std::map<Record*, std::set<Record*> > RegisterSubRegs; 4044fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng std::map<Record*, std::set<Record*> > RegisterSuperRegs; 4059fff8919eefa377936918eec763b392e59049353Chris Lattner std::map<Record*, std::set<Record*> > RegisterAliases; 4067bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman std::map<Record*, std::vector<std::pair<int, Record*> > > SubRegVectors; 407b228657acc4afbdc74dc523e9f465d08935f9e8dChris Lattner const std::vector<CodeGenRegister> &Regs = Target.getRegisters(); 40873ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos 409b228657acc4afbdc74dc523e9f465d08935f9e8dChris Lattner for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 410b228657acc4afbdc74dc523e9f465d08935f9e8dChris Lattner Record *R = Regs[i].TheDef; 411366080c5e6b4b8e1f07829a2489cc5d21f51bf3bChris Lattner std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("Aliases"); 4129fff8919eefa377936918eec763b392e59049353Chris Lattner // Add information that R aliases all of the elements in the list... and 4139fff8919eefa377936918eec763b392e59049353Chris Lattner // that everything in the list aliases R. 414366080c5e6b4b8e1f07829a2489cc5d21f51bf3bChris Lattner for (unsigned j = 0, e = LI.size(); j != e; ++j) { 415366080c5e6b4b8e1f07829a2489cc5d21f51bf3bChris Lattner Record *Reg = LI[j]; 416366080c5e6b4b8e1f07829a2489cc5d21f51bf3bChris Lattner if (RegisterAliases[R].count(Reg)) 417f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling cerr << "Warning: register alias between " << getQualifiedName(R) 418f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling << " and " << getQualifiedName(Reg) 419f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling << " specified multiple times!\n"; 420366080c5e6b4b8e1f07829a2489cc5d21f51bf3bChris Lattner RegisterAliases[R].insert(Reg); 4219fff8919eefa377936918eec763b392e59049353Chris Lattner 422366080c5e6b4b8e1f07829a2489cc5d21f51bf3bChris Lattner if (RegisterAliases[Reg].count(R)) 423f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling cerr << "Warning: register alias between " << getQualifiedName(R) 424f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling << " and " << getQualifiedName(Reg) 425f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling << " specified multiple times!\n"; 426366080c5e6b4b8e1f07829a2489cc5d21f51bf3bChris Lattner RegisterAliases[Reg].insert(R); 4279fff8919eefa377936918eec763b392e59049353Chris Lattner } 4283da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman } 4299fff8919eefa377936918eec763b392e59049353Chris Lattner 4304fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng // Process sub-register sets. 4313cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 4323cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng Record *R = Regs[i].TheDef; 4333cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("SubRegs"); 4343cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng // Process sub-register set and add aliases information. 4353cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng for (unsigned j = 0, e = LI.size(); j != e; ++j) { 4363cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng Record *SubReg = LI[j]; 4373cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng if (RegisterSubRegs[R].count(SubReg)) 4383cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng cerr << "Warning: register " << getQualifiedName(SubReg) 4393cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng << " specified as a sub-register of " << getQualifiedName(R) 4403cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng << " multiple times!\n"; 441c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng RegisterImmSubRegs[R].insert(SubReg); 4424fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng addSubSuperReg(R, SubReg, RegisterSubRegs, RegisterSuperRegs, 4434fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng RegisterAliases, *this); 4443cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng } 4453cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng } 4463cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng 4479fff8919eefa377936918eec763b392e59049353Chris Lattner if (!RegisterAliases.empty()) 4489fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "\n\n // Register Alias Sets...\n"; 4493da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 45073ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos // Emit the empty alias list 45173ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos OS << " const unsigned Empty_AliasSet[] = { 0 };\n"; 4529fff8919eefa377936918eec763b392e59049353Chris Lattner // Loop over all of the registers which have aliases, emitting the alias list 4539fff8919eefa377936918eec763b392e59049353Chris Lattner // to memory. 4549fff8919eefa377936918eec763b392e59049353Chris Lattner for (std::map<Record*, std::set<Record*> >::iterator 4559fff8919eefa377936918eec763b392e59049353Chris Lattner I = RegisterAliases.begin(), E = RegisterAliases.end(); I != E; ++I) { 4569fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " const unsigned " << I->first->getName() << "_AliasSet[] = { "; 4579fff8919eefa377936918eec763b392e59049353Chris Lattner for (std::set<Record*>::iterator ASI = I->second.begin(), 4589fff8919eefa377936918eec763b392e59049353Chris Lattner E = I->second.end(); ASI != E; ++ASI) 4599fff8919eefa377936918eec763b392e59049353Chris Lattner OS << getQualifiedName(*ASI) << ", "; 4609fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "0 };\n"; 46154d156d33324b7715453993f21684915a28e310aChris Lattner } 4623112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner 4633cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng if (!RegisterSubRegs.empty()) 4643cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng OS << "\n\n // Register Sub-registers Sets...\n"; 4653cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng 4663cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng // Emit the empty sub-registers list 4673cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng OS << " const unsigned Empty_SubRegsSet[] = { 0 };\n"; 4683cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng // Loop over all of the registers which have sub-registers, emitting the 4693cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng // sub-registers list to memory. 4703cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng for (std::map<Record*, std::set<Record*> >::iterator 4713cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng I = RegisterSubRegs.begin(), E = RegisterSubRegs.end(); I != E; ++I) { 4723cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng OS << " const unsigned " << I->first->getName() << "_SubRegsSet[] = { "; 4733cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng for (std::set<Record*>::iterator ASI = I->second.begin(), 4743cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng E = I->second.end(); ASI != E; ++ASI) 4753cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng OS << getQualifiedName(*ASI) << ", "; 4763cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng OS << "0 };\n"; 4773cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng } 47826693113201f4c9d441678e50d96f38d3288798eChris Lattner 479c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng if (!RegisterImmSubRegs.empty()) 480c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng OS << "\n\n // Register Immediate Sub-registers Sets...\n"; 481c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng 482c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng // Loop over all of the registers which have sub-registers, emitting the 483c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng // sub-registers list to memory. 484c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng for (std::map<Record*, std::set<Record*> >::iterator 485c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng I = RegisterImmSubRegs.begin(), E = RegisterImmSubRegs.end(); 486c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng I != E; ++I) { 487c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng OS << " const unsigned " << I->first->getName() << "_ImmSubRegsSet[] = { "; 488c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng for (std::set<Record*>::iterator ASI = I->second.begin(), 489c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng E = I->second.end(); ASI != E; ++ASI) 490c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng OS << getQualifiedName(*ASI) << ", "; 491c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng OS << "0 };\n"; 492c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng } 493c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng 4944fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng if (!RegisterSuperRegs.empty()) 4954fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << "\n\n // Register Super-registers Sets...\n"; 4964fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng 4974fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng // Emit the empty super-registers list 4984fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << " const unsigned Empty_SuperRegsSet[] = { 0 };\n"; 4994fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng // Loop over all of the registers which have super-registers, emitting the 5004fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng // super-registers list to memory. 5014fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng for (std::map<Record*, std::set<Record*> >::iterator 5024fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng I = RegisterSuperRegs.begin(), E = RegisterSuperRegs.end(); I != E; ++I) { 5034fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << " const unsigned " << I->first->getName() << "_SuperRegsSet[] = { "; 5044fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng for (std::set<Record*>::iterator ASI = I->second.begin(), 5054fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng E = I->second.end(); ASI != E; ++ASI) 5064fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << getQualifiedName(*ASI) << ", "; 5074fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << "0 };\n"; 5084fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng } 5094fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng 5104fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS<<"\n const TargetRegisterDesc RegisterDescriptors[] = { // Descriptors\n"; 5115e4f292e53dc0a94b7f12218935bce55c780653cEvan Cheng OS << " { \"NOREG\",\t0,\t0,\t0,\t0 },\n"; 51226693113201f4c9d441678e50d96f38d3288798eChris Lattner 5133cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng // Now that register alias and sub-registers sets have been emitted, emit the 5143cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng // register descriptors now. 51526693113201f4c9d441678e50d96f38d3288798eChris Lattner const std::vector<CodeGenRegister> &Registers = Target.getRegisters(); 5169fff8919eefa377936918eec763b392e59049353Chris Lattner for (unsigned i = 0, e = Registers.size(); i != e; ++i) { 51726693113201f4c9d441678e50d96f38d3288798eChris Lattner const CodeGenRegister &Reg = Registers[i]; 518a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner OS << " { \""; 51926693113201f4c9d441678e50d96f38d3288798eChris Lattner if (!Reg.TheDef->getValueAsString("Name").empty()) 52026693113201f4c9d441678e50d96f38d3288798eChris Lattner OS << Reg.TheDef->getValueAsString("Name"); 521a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner else 52226693113201f4c9d441678e50d96f38d3288798eChris Lattner OS << Reg.getName(); 523a8af7799dd4b9dda7016f72b2e5f7b7d07780a8aChris Lattner OS << "\",\t"; 52426693113201f4c9d441678e50d96f38d3288798eChris Lattner if (RegisterAliases.count(Reg.TheDef)) 5253cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng OS << Reg.getName() << "_AliasSet,\t"; 5263cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng else 5273cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng OS << "Empty_AliasSet,\t"; 5283cafbf7e5fa13b303cc387a058a511ce517b5bd5Evan Cheng if (RegisterSubRegs.count(Reg.TheDef)) 5294fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << Reg.getName() << "_SubRegsSet,\t"; 5304fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng else 5314fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << "Empty_SubRegsSet,\t"; 532c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng if (RegisterImmSubRegs.count(Reg.TheDef)) 533c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng OS << Reg.getName() << "_ImmSubRegsSet,\t"; 534c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng else 535c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng OS << "Empty_SubRegsSet,\t"; 5364fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng if (RegisterSuperRegs.count(Reg.TheDef)) 5374fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << Reg.getName() << "_SuperRegsSet },\n"; 5389fff8919eefa377936918eec763b392e59049353Chris Lattner else 5394fc4fab856f9616bb4f42bd658d5c8de89751628Evan Cheng OS << "Empty_SuperRegsSet },\n"; 5409fff8919eefa377936918eec763b392e59049353Chris Lattner } 5419fff8919eefa377936918eec763b392e59049353Chris Lattner OS << " };\n"; // End of register descriptors... 5429fff8919eefa377936918eec763b392e59049353Chris Lattner OS << "}\n\n"; // End of anonymous namespace... 5439fff8919eefa377936918eec763b392e59049353Chris Lattner 5447884b750c33b750177b3f22af75c874c97f728d8Chris Lattner std::string ClassName = Target.getName() + "GenRegisterInfo"; 5453da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 5467bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman // Calculate the mapping of subregister+index pairs to physical registers. 5477bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman std::vector<Record*> SubRegs = Records.getAllDerivedDefinitions("SubRegSet"); 5487bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman for (unsigned i = 0, e = SubRegs.size(); i != e; ++i) { 5497bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman int subRegIndex = SubRegs[i]->getValueAsInt("index"); 5507bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman std::vector<Record*> From = SubRegs[i]->getValueAsListOfDefs("From"); 5517bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman std::vector<Record*> To = SubRegs[i]->getValueAsListOfDefs("To"); 5527bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman 5536f7c8ffd9a92bdd625c5bc316187a49c0b1d41d6Nate Begeman if (From.size() != To.size()) { 5546f7c8ffd9a92bdd625c5bc316187a49c0b1d41d6Nate Begeman cerr << "Error: register list and sub-register list not of equal length" 5556f7c8ffd9a92bdd625c5bc316187a49c0b1d41d6Nate Begeman << " in SubRegSet\n"; 5566f7c8ffd9a92bdd625c5bc316187a49c0b1d41d6Nate Begeman exit(1); 5576f7c8ffd9a92bdd625c5bc316187a49c0b1d41d6Nate Begeman } 5587bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman 5597bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman // For each entry in from/to vectors, insert the to register at index 5607bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman for (unsigned ii = 0, ee = From.size(); ii != ee; ++ii) 5617bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman SubRegVectors[From[ii]].push_back(std::make_pair(subRegIndex, To[ii])); 5627bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman } 5637bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman 5647bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman // Emit the subregister + index mapping function based on the information 5657bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman // calculated above. 5667bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << "unsigned " << ClassName 5677bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman << "::getSubReg(unsigned RegNo, unsigned Index) const {\n" 5687bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman << " switch (RegNo) {\n" 5697bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman << " default: abort(); break;\n"; 5707bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman for (std::map<Record*, std::vector<std::pair<int, Record*> > >::iterator 5717bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman I = SubRegVectors.begin(), E = SubRegVectors.end(); I != E; ++I) { 5727bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << " case " << getQualifiedName(I->first) << ":\n"; 5737bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << " switch (Index) {\n"; 5747bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << " default: abort(); break;\n"; 5757bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman for (unsigned i = 0, e = I->second.size(); i != e; ++i) 5767bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << " case " << (I->second)[i].first << ": return " 5777bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman << getQualifiedName((I->second)[i].second) << ";\n"; 5787bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << " }; break;\n"; 5797bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman } 5807bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << " };\n"; 581851879c4cf1fc1f97be704a0459fb0ca5f327a44Bill Wendling OS << " return 0;\n"; 5827bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman OS << "}\n\n"; 5837bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman 5849fff8919eefa377936918eec763b392e59049353Chris Lattner // Emit the constructor of the class... 5859fff8919eefa377936918eec763b392e59049353Chris Lattner OS << ClassName << "::" << ClassName 5869fff8919eefa377936918eec763b392e59049353Chris Lattner << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n" 5879fff8919eefa377936918eec763b392e59049353Chris Lattner << " : MRegisterInfo(RegisterDescriptors, " << Registers.size()+1 58842de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n " 5899fff8919eefa377936918eec763b392e59049353Chris Lattner << " CallFrameSetupOpcode, CallFrameDestroyOpcode) {}\n\n"; 5903da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 59147622e37215429c20d8278ff57496d840811cc13Jim Laskey // Emit information about the dwarf register numbers. 59247622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << "int " << ClassName << "::getDwarfRegNum(unsigned RegNum) const {\n"; 59347622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << " static const int DwarfRegNums[] = { -1, // NoRegister"; 59447622e37215429c20d8278ff57496d840811cc13Jim Laskey for (unsigned i = 0, e = Registers.size(); i != e; ++i) { 59547622e37215429c20d8278ff57496d840811cc13Jim Laskey if (!(i % 16)) OS << "\n "; 59647622e37215429c20d8278ff57496d840811cc13Jim Laskey const CodeGenRegister &Reg = Registers[i]; 59747622e37215429c20d8278ff57496d840811cc13Jim Laskey int DwarfRegNum = Reg.TheDef->getValueAsInt("DwarfNumber"); 59847622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << DwarfRegNum; 59947622e37215429c20d8278ff57496d840811cc13Jim Laskey if ((i + 1) != e) OS << ", "; 60047622e37215429c20d8278ff57496d840811cc13Jim Laskey } 60147622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << "\n };\n"; 60247622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << " assert(RegNum < (sizeof(DwarfRegNums)/sizeof(int)) &&\n"; 60347622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << " \"RegNum exceeds number of registers\");\n"; 60447622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << " return DwarfRegNums[RegNum];\n"; 60547622e37215429c20d8278ff57496d840811cc13Jim Laskey OS << "}\n\n"; 6064794797f1213c4096a6f5ff2b6841dd5866b22baChris Lattner 6072c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "} // End llvm namespace \n"; 6083112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner} 609