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