RegisterInfoEmitter.cpp revision 4987033fbd8e774e67903f50a8bd20d539c4dca5
13112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner//===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//                     The LLVM Compiler Infrastructure
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// 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"
224091b059ec9568228f50fd67a1a81ee35c234787Jakob Stoklund Olesen#include "llvm/Support/Format.h"
23cc51c3195374645b18918458bac02e85b8c27db6Chuck Rose III#include <algorithm>
241a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar#include <set>
252082ebe8b3a5db302748828ab4f79a36d239c1d9Chris Lattnerusing namespace llvm;
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2754d156d33324b7715453993f21684915a28e310aChris Lattner// runEnums - Print out enum values for all of the registers.
2873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Chengvoid
2973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan ChengRegisterInfoEmitter::runEnums(raw_ostream &OS,
3073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng                              CodeGenTarget &Target, CodeGenRegBank &Bank) {
31abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  const std::vector<CodeGenRegister*> &Registers = Bank.getRegisters();
3254d156d33324b7715453993f21684915a28e310aChris Lattner
33abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  std::string Namespace = Registers[0]->TheDef->getValueAsString("Namespace");
3454d156d33324b7715453993f21684915a28e310aChris Lattner
350e5e49e6888c354ff95fc9e56d0881af78cb4269Chris Lattner  EmitSourceFileHeader("Target Register Enum Values", OS);
3673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
3773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "\n#ifdef GET_REGINFO_ENUM\n";
3873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "#undef GET_REGINFO_ENUM\n";
3973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
402c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner  OS << "namespace llvm {\n\n";
4154d156d33324b7715453993f21684915a28e310aChris Lattner
4254d156d33324b7715453993f21684915a28e310aChris Lattner  if (!Namespace.empty())
4354d156d33324b7715453993f21684915a28e310aChris Lattner    OS << "namespace " << Namespace << " {\n";
4473ea7bf4509663267317ec3911aac00ca35a2f2cJakob Stoklund Olesen  OS << "enum {\n  NoRegister,\n";
4554d156d33324b7715453993f21684915a28e310aChris Lattner
4654d156d33324b7715453993f21684915a28e310aChris Lattner  for (unsigned i = 0, e = Registers.size(); i != e; ++i)
47abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    OS << "  " << Registers[i]->getName() << " = " <<
48abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen      Registers[i]->EnumValue << ",\n";
49abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  assert(Registers.size() == Registers[Registers.size()-1]->EnumValue &&
5017fad045cccf34822d3163ada9e70a8f4528746eJim Grosbach         "Register enum value mismatch!");
5173ea7bf4509663267317ec3911aac00ca35a2f2cJakob Stoklund Olesen  OS << "  NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n";
5273ea7bf4509663267317ec3911aac00ca35a2f2cJakob Stoklund Olesen  OS << "};\n";
5354d156d33324b7715453993f21684915a28e310aChris Lattner  if (!Namespace.empty())
5454d156d33324b7715453993f21684915a28e310aChris Lattner    OS << "}\n";
5573ea7bf4509663267317ec3911aac00ca35a2f2cJakob Stoklund Olesen
5673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  const std::vector<CodeGenRegisterClass> &RegisterClasses =
5773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    Target.getRegisterClasses();
5873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  if (!RegisterClasses.empty()) {
5973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "\n// Register classes\n";
604987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    if (!Namespace.empty())
614987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng      OS << "namespace " << Namespace << " {\n";
6273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "enum {\n";
6373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
6473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      if (i) OS << ",\n";
6573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << "  " << RegisterClasses[i].getName() << "RegClassID";
6673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << " = " << i;
6773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    }
6873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "\n  };\n";
694987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    if (!Namespace.empty())
704987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng      OS << "}\n";
714987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng  }
724987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng
734987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng  const std::vector<Record*> RegAltNameIndices = Target.getRegAltNameIndices();
744987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng  // If the only definition is the default NoRegAltName, we don't need to
754987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng  // emit anything.
764987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng  if (RegAltNameIndices.size() > 1) {
774987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    OS << "\n// Register alternate name indices\n";
784987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    if (!Namespace.empty())
794987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng      OS << "namespace " << Namespace << " {\n";
804987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    OS << "enum {\n";
814987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    for (unsigned i = 0, e = RegAltNameIndices.size(); i != e; ++i)
824987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng      OS << "  " << RegAltNameIndices[i]->getName() << ",\t// " << i << "\n";
834987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    OS << "  NUM_TARGET_REG_ALT_NAMES = " << RegAltNameIndices.size() << "\n";
844987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    OS << "};\n";
854987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng    if (!Namespace.empty())
864987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng      OS << "}\n";
8773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  }
8873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
894987033fbd8e774e67903f50a8bd20d539c4dca5Evan Cheng
902c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner  OS << "} // End llvm namespace \n";
9173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "#endif // GET_REGINFO_ENUM\n\n";
9254d156d33324b7715453993f21684915a28e310aChris Lattner}
9354d156d33324b7715453993f21684915a28e310aChris Lattner
944091b059ec9568228f50fd67a1a81ee35c234787Jakob Stoklund Olesen//
9573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng// runMCDesc - Print out MC register descriptions.
9654d156d33324b7715453993f21684915a28e310aChris Lattner//
9773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Chengvoid
9873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan ChengRegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
9973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng                               CodeGenRegBank &RegBank) {
10073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  EmitSourceFileHeader("MC Register Information", OS);
10173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
10273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "\n#ifdef GET_REGINFO_MC_DESC\n";
10373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "#undef GET_REGINFO_MC_DESC\n";
10473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
10573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  std::map<const CodeGenRegister*, CodeGenRegister::Set> Overlaps;
10673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  RegBank.computeOverlaps(Overlaps);
10773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
10873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "namespace llvm {\n\n";
10973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
11073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  const std::string &TargetName = Target.getName();
11173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  std::string ClassName = TargetName + "GenMCRegisterInfo";
11273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "struct " << ClassName << " : public MCRegisterInfo {\n"
11373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng     << "  explicit " << ClassName << "(const MCRegisterDesc *D);\n";
11473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "};\n";
11573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
11673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "\nnamespace {\n";
11773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
11873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
11973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
12073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // Emit an overlap list for all registers.
12173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
12273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    const CodeGenRegister *Reg = Regs[i];
12373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    const CodeGenRegister::Set &O = Overlaps[Reg];
12473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    // Move Reg to the front so TRI::getAliasSet can share the list.
12573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "  const unsigned " << Reg->getName() << "_Overlaps[] = { "
12673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng       << getQualifiedName(Reg->TheDef) << ", ";
12773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    for (CodeGenRegister::Set::const_iterator I = O.begin(), E = O.end();
12873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng         I != E; ++I)
12973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      if (*I != Reg)
13073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng        OS << getQualifiedName((*I)->TheDef) << ", ";
13173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "0 };\n";
13273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  }
13373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
13473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // Emit the empty sub-registers list
13573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "  const unsigned Empty_SubRegsSet[] = { 0 };\n";
13673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // Loop over all of the registers which have sub-registers, emitting the
13773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // sub-registers list to memory.
13873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
13973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    const CodeGenRegister &Reg = *Regs[i];
14073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    if (Reg.getSubRegs().empty())
14173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng     continue;
14273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    // getSubRegs() orders by SubRegIndex. We want a topological order.
14373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    SetVector<CodeGenRegister*> SR;
14473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    Reg.addSubRegsPreOrder(SR);
14573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "  const unsigned " << Reg.getName() << "_SubRegsSet[] = { ";
14673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    for (unsigned j = 0, je = SR.size(); j != je; ++j)
14773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << getQualifiedName(SR[j]->TheDef) << ", ";
14873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "0 };\n";
14973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  }
15073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
15173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // Emit the empty super-registers list
15273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "  const unsigned Empty_SuperRegsSet[] = { 0 };\n";
15373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // Loop over all of the registers which have super-registers, emitting the
15473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // super-registers list to memory.
15573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
15673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    const CodeGenRegister &Reg = *Regs[i];
15773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    const CodeGenRegister::SuperRegList &SR = Reg.getSuperRegs();
15873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    if (SR.empty())
15973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      continue;
16073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "  const unsigned " << Reg.getName() << "_SuperRegsSet[] = { ";
16173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    for (unsigned j = 0, je = SR.size(); j != je; ++j)
16273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << getQualifiedName(SR[j]->TheDef) << ", ";
16373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "0 };\n";
16473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  }
16573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
16673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "\n  const MCRegisterDesc " << TargetName
16773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng     << "RegDesc[] = { // Descriptors\n";
16873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "    { \"NOREG\",\t0,\t0,\t0 },\n";
16973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
17073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // Now that register alias and sub-registers sets have been emitted, emit the
17173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // register descriptors now.
17273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
17373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    const CodeGenRegister &Reg = *Regs[i];
17473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << "    { \"";
17573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << Reg.getName() << "\",\t" << Reg.getName() << "_Overlaps,\t";
17673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    if (!Reg.getSubRegs().empty())
17773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << Reg.getName() << "_SubRegsSet,\t";
17873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    else
17973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << "Empty_SubRegsSet,\t";
18073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    if (!Reg.getSuperRegs().empty())
18173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << Reg.getName() << "_SuperRegsSet";
18273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    else
18373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng      OS << "Empty_SuperRegsSet";
18473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng    OS << " },\n";
18573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  }
18673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "  };\n";      // End of register descriptors...
18773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
18873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "}\n\n";       // End of anonymous namespace...
18973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
19073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  // MCRegisterInfo initialization routine.
19173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "static inline void Init" << TargetName
19273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng     << "MCRegisterInfo(MCRegisterInfo *RI) {\n";
19373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "  RI->InitMCRegisterInfo(" << TargetName << "RegDesc, "
19473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng     << Regs.size()+1 << ");\n}\n\n";
19573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
19673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "} // End llvm namespace \n";
19773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "#endif // GET_REGINFO_MC_DESC\n\n";
19873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng}
199026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
200ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Chengvoid
201ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan ChengRegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
202ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng                                     CodeGenRegBank &RegBank) {
203ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  EmitSourceFileHeader("Register Information Header Fragment", OS);
204ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
205ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "\n#ifdef GET_REGINFO_HEADER\n";
206ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "#undef GET_REGINFO_HEADER\n";
207ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
208ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  const std::string &TargetName = Target.getName();
209ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  std::string ClassName = TargetName + "GenRegisterInfo";
210ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
211ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n";
212ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "#include <string>\n\n";
213ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
214ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "namespace llvm {\n\n";
215ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
216ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
217ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  explicit " << ClassName
218ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "(const MCRegisterDesc *D, const TargetRegisterInfoDesc *ID, "
219ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
220ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  virtual int getDwarfRegNumFull(unsigned RegNum, "
221ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "unsigned Flavour) const;\n"
222ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  virtual int getLLVMRegNumFull(unsigned DwarfRegNum, "
223ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "unsigned Flavour) const;\n"
224ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;\n"
225ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  virtual bool needsStackRealignment(const MachineFunction &) const\n"
226ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "     { return false; }\n"
227ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n"
228ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  unsigned getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const;\n"
229ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "  unsigned composeSubRegIndices(unsigned, unsigned) const;\n"
230ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng     << "};\n\n";
231ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
232ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices();
233ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  if (!SubRegIndices.empty()) {
234ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    OS << "\n// Subregister indices\n";
235ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    std::string Namespace = SubRegIndices[0]->getValueAsString("Namespace");
236ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    if (!Namespace.empty())
237ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      OS << "namespace " << Namespace << " {\n";
238ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    OS << "enum {\n  NoSubRegister,\n";
239ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    for (unsigned i = 0, e = RegBank.getNumNamedIndices(); i != e; ++i)
240ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      OS << "  " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
241ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    OS << "  NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices.size()+1 << "\n";
242ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    OS << "};\n";
243ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    if (!Namespace.empty())
244ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      OS << "}\n";
245ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  }
246ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
247ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  const std::vector<CodeGenRegisterClass> &RegisterClasses =
248ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    Target.getRegisterClasses();
249ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
250ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  if (!RegisterClasses.empty()) {
251ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    OS << "namespace " << RegisterClasses[0].Namespace
252ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng       << " { // Register classes\n";
253ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
254ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
255ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      const CodeGenRegisterClass &RC = RegisterClasses[i];
256ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      const std::string &Name = RC.getName();
257ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
258ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      // Output the register class definition.
259ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      OS << "  struct " << Name << "Class : public TargetRegisterClass {\n"
260ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng         << "    " << Name << "Class();\n";
261ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      if (!RC.AltOrderSelect.empty())
262ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng        OS << "    ArrayRef<unsigned> "
263ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng              "getRawAllocationOrder(const MachineFunction&) const;\n";
264ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      OS << "  };\n";
265ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
266ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      // Output the extern for the instance.
267ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      OS << "  extern " << Name << "Class\t" << Name << "RegClass;\n";
268ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      // Output the extern for the pointer to the instance (should remove).
269ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng      OS << "  static TargetRegisterClass * const "<< Name <<"RegisterClass = &"
270ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng         << Name << "RegClass;\n";
271ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    }
272ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng    OS << "} // end of namespace " << TargetName << "\n\n";
273ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  }
274ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "} // End llvm namespace \n";
275ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  OS << "#endif // GET_REGINFO_HEADER\n\n";
276ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng}
277ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng
27873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng//
27973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng// runTargetDesc - Output the target register and register file descriptions.
28073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng//
28173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Chengvoid
28273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan ChengRegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
28373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng                                   CodeGenRegBank &RegBank){
28473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  EmitSourceFileHeader("Target Register and Register Classes Information", OS);
28573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng
28673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "\n#ifdef GET_REGINFO_TARGET_DESC\n";
28773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "#undef GET_REGINFO_TARGET_DESC\n";
28854d156d33324b7715453993f21684915a28e310aChris Lattner
2892c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner  OS << "namespace llvm {\n\n";
2902c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner
291f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen  // Start out by emitting each of the register classes.
292056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner  const std::vector<CodeGenRegisterClass> &RegisterClasses =
293056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    Target.getRegisterClasses();
29454d156d33324b7715453993f21684915a28e310aChris Lattner
295f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen  // Collect all registers belonging to any allocatable class.
296f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen  std::set<Record*> AllocatableRegs;
297f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen
29854d156d33324b7715453993f21684915a28e310aChris Lattner  // Loop over all of the register classes... emitting each one.
29954d156d33324b7715453993f21684915a28e310aChris Lattner  OS << "namespace {     // Register classes...\n";
3009fff8919eefa377936918eec763b392e59049353Chris Lattner
3016510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  // Emit the register enum value arrays for each RegisterClass
30254d156d33324b7715453993f21684915a28e310aChris Lattner  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
303056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    const CodeGenRegisterClass &RC = RegisterClasses[rc];
304ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    ArrayRef<Record*> Order = RC.getOrder();
305c7df109b6c4f7cbf8cc4dbee90291d4e452c7d56Chris Lattner
306f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen    // Collect allocatable registers.
307f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen    if (RC.Allocatable)
308ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen      AllocatableRegs.insert(Order.begin(), Order.end());
309f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen
31042de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner    // Give the register class a legal C name if it's anonymous.
311ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    std::string Name = RC.getName();
3125d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
31342de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner    // Emit the register list now.
3146f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng    OS << "  // " << Name << " Register Class...\n"
3156f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng       << "  static const unsigned " << Name
316c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner       << "[] = {\n    ";
317ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    for (unsigned i = 0, e = Order.size(); i != e; ++i) {
318ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen      Record *Reg = Order[i];
3199fff8919eefa377936918eec763b392e59049353Chris Lattner      OS << getQualifiedName(Reg) << ", ";
320c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner    }
321c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner    OS << "\n  };\n\n";
32242de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner  }
3238d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng
3246510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  // Emit the ValueType arrays for each RegisterClass
3256510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
3266510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    const CodeGenRegisterClass &RC = RegisterClasses[rc];
3275d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
3286510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    // Give the register class a legal C name if it's anonymous.
329ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    std::string Name = RC.getName() + "VTs";
3305d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
3316510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    // Emit the register list now.
3325d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach    OS << "  // " << Name
3333b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng       << " Register Class Value Types...\n"
334e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson       << "  static const EVT " << Name
3353b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng       << "[] = {\n    ";
3366510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    for (unsigned i = 0, e = RC.VTs.size(); i != e; ++i)
3376994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      OS << getEnumName(RC.VTs[i]) << ", ";
338825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    OS << "MVT::Other\n  };\n\n";
3396510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  }
34042de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner  OS << "}  // end anonymous namespace\n\n";
3415d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
34242de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner  // Now that all of the structs have been emitted, emit the instances.
34342de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner  if (!RegisterClasses.empty()) {
34442de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner    OS << "namespace " << RegisterClasses[0].Namespace
34542de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner       << " {   // Register class instances\n";
34642de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i)
34742de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner      OS << "  " << RegisterClasses[i].getName()  << "Class\t"
34860200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner         << RegisterClasses[i].getName() << "RegClass;\n";
3495d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
3502ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng    std::map<unsigned, std::set<unsigned> > SuperClassMap;
351f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman    std::map<unsigned, std::set<unsigned> > SuperRegClassMap;
3528d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng    OS << "\n";
3531367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb
354dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen    unsigned NumSubRegIndices = RegBank.getSubRegIndices().size();
35509bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen
35609bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen    if (NumSubRegIndices) {
35709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen      // Emit the sub-register classes for each RegisterClass
35809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen      for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
35909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        const CodeGenRegisterClass &RC = RegisterClasses[rc];
36009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        std::vector<Record*> SRC(NumSubRegIndices);
36109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        for (DenseMap<Record*,Record*>::const_iterator
36209bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen             i = RC.SubRegClasses.begin(),
36309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen             e = RC.SubRegClasses.end(); i != e; ++i) {
36409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          // Build SRC array.
365dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen          unsigned idx = RegBank.getSubRegIndexNo(i->first);
36609bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          SRC.at(idx-1) = i->second;
36709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen
36809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          // Find the register class number of i->second for SuperRegClassMap.
36909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
37009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen            const CodeGenRegisterClass &RC2 =  RegisterClasses[rc2];
37109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen            if (RC2.TheDef == i->second) {
37209bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen              SuperRegClassMap[rc2].insert(rc);
37309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen              break;
37409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen            }
37509bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          }
37609bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        }
377f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman
37809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        // Give the register class a legal C name if it's anonymous.
37909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        std::string Name = RC.TheDef->getName();
380f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman
38109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        OS << "  // " << Name
38209bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen           << " Sub-register Classes...\n"
38309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen           << "  static const TargetRegisterClass* const "
38409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen           << Name << "SubRegClasses[] = {\n    ";
385f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman
38609bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        for (unsigned idx = 0; idx != NumSubRegIndices; ++idx) {
38709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          if (idx)
38809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen            OS << ", ";
38909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          if (SRC[idx])
39009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen            OS << "&" << getQualifiedName(SRC[idx]) << "RegClass";
39109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          else
39209bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen            OS << "0";
39309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        }
39409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        OS << "\n  };\n\n";
39509bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen      }
396f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman
39709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen      // Emit the super-register classes for each RegisterClass
39809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen      for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
39909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        const CodeGenRegisterClass &RC = RegisterClasses[rc];
40009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen
40109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        // Give the register class a legal C name if it's anonymous.
40209bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        std::string Name = RC.TheDef->getName();
40309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen
40409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        OS << "  // " << Name
40509bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen           << " Super-register Classes...\n"
40609bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen           << "  static const TargetRegisterClass* const "
40709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen           << Name << "SuperRegClasses[] = {\n    ";
40809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen
40909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        bool Empty = true;
41009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        std::map<unsigned, std::set<unsigned> >::iterator I =
41109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          SuperRegClassMap.find(rc);
41209bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        if (I != SuperRegClassMap.end()) {
41309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen          for (std::set<unsigned>::iterator II = I->second.begin(),
41409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen                 EE = I->second.end(); II != EE; ++II) {
41509bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen            const CodeGenRegisterClass &RC2 = RegisterClasses[*II];
416f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman            if (!Empty)
417f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman              OS << ", ";
418f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman            OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
419f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman            Empty = false;
420f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman          }
421f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman        }
422f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman
42309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        OS << (!Empty ? ", " : "") << "NULL";
42409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen        OS << "\n  };\n\n";
425f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman      }
42609bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen    } else {
42709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen      // No subregindices in this target
42809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen      OS << "  static const TargetRegisterClass* const "
42909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen         << "NullRegClasses[] = { NULL };\n\n";
430f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman    }
431f8c7394781f7cf27ac52ca087e289436d36844daDan Gohman
4328d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng    // Emit the sub-classes array for each RegisterClass
4338d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng    for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
4348d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      const CodeGenRegisterClass &RC = RegisterClasses[rc];
4358d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng
4368d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      // Give the register class a legal C name if it's anonymous.
4378d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      std::string Name = RC.TheDef->getName();
4388d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng
4395d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach      OS << "  // " << Name
4406f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng         << " Register Class sub-classes...\n"
4413b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng         << "  static const TargetRegisterClass* const "
4422395f011986e6c6277c71bddcd8af88f9b904fc2Dan Gohman         << Name << "Subclasses[] = {\n    ";
4438d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng
4448d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      bool Empty = true;
4458d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
4468d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng        const CodeGenRegisterClass &RC2 = RegisterClasses[rc2];
4477afcc6aa270ca51e502de9f826ecdf61568a73b9Jakob Stoklund Olesen
4487afcc6aa270ca51e502de9f826ecdf61568a73b9Jakob Stoklund Olesen        // Sub-classes are used to determine if a virtual register can be used
4497afcc6aa270ca51e502de9f826ecdf61568a73b9Jakob Stoklund Olesen        // as an instruction operand, or if it must be copied first.
450a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher        if (rc == rc2 || !RC.hasSubClass(&RC2)) continue;
4515d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
4528d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng        if (!Empty) OS << ", ";
4538d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng        OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
4548d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng        Empty = false;
4552ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng
4562ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng        std::map<unsigned, std::set<unsigned> >::iterator SCMI =
4572ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng          SuperClassMap.find(rc2);
4582ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng        if (SCMI == SuperClassMap.end()) {
4592ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng          SuperClassMap.insert(std::make_pair(rc2, std::set<unsigned>()));
4602ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng          SCMI = SuperClassMap.find(rc2);
4612ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng        }
4622ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng        SCMI->second.insert(rc);
4638d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      }
4648d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng
4658d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      OS << (!Empty ? ", " : "") << "NULL";
4668d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng      OS << "\n  };\n\n";
4678d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng    }
4688d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng
4692ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng    for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
4702ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      const CodeGenRegisterClass &RC = RegisterClasses[rc];
4712ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng
4722ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      // Give the register class a legal C name if it's anonymous.
4732ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      std::string Name = RC.TheDef->getName();
4742ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng
4755d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach      OS << "  // " << Name
4766f6602ce4268c60b5d602b7a3565cca4c6330811Evan Cheng         << " Register Class super-classes...\n"
4773b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng         << "  static const TargetRegisterClass* const "
4782395f011986e6c6277c71bddcd8af88f9b904fc2Dan Gohman         << Name << "Superclasses[] = {\n    ";
4792ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng
4802ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      bool Empty = true;
4812ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      std::map<unsigned, std::set<unsigned> >::iterator I =
4822ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng        SuperClassMap.find(rc);
4832ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      if (I != SuperClassMap.end()) {
4842ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng        for (std::set<unsigned>::iterator II = I->second.begin(),
4852ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng               EE = I->second.end(); II != EE; ++II) {
4862ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng          const CodeGenRegisterClass &RC2 = RegisterClasses[*II];
4872ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng          if (!Empty) OS << ", ";
4882ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng          OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
4895d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach          Empty = false;
4902ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng        }
4912ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      }
4922ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng
4932ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      OS << (!Empty ? ", " : "") << "NULL";
4942ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng      OS << "\n  };\n\n";
4952ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng    }
4962ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng
497b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen    // Emit methods.
49860200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
49960200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner      const CodeGenRegisterClass &RC = RegisterClasses[i];
5005d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach      OS << RC.getName() << "Class::" << RC.getName()
5018d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng         << "Class()  : TargetRegisterClass("
50260f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey         << RC.getName() + "RegClassID" << ", "
50341c90738e9e7e2111fbc31944b5ce2676830f267Chris Lattner         << '\"' << RC.getName() << "\", "
5048d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng         << RC.getName() + "VTs" << ", "
5058d58e6a9be0ced7ad260449e882c5d2dcb5f4990Evan Cheng         << RC.getName() + "Subclasses" << ", "
5062ca0efd71a5a25c1f3fa8b30dc5459fdaf8cd2a9Evan Cheng         << RC.getName() + "Superclasses" << ", "
50709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen         << (NumSubRegIndices ? RC.getName() + "Sub" : std::string("Null"))
50809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen         << "RegClasses, "
50909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen         << (NumSubRegIndices ? RC.getName() + "Super" : std::string("Null"))
51009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen         << "RegClasses, "
5114b2e5a680f2f6b7b3a43df1a4703ed0ff5ba07d5Chris Lattner         << RC.SpillSize/8 << ", "
512a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng         << RC.SpillAlignment/8 << ", "
513a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng         << RC.CopyCost << ", "
514f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen         << RC.Allocatable << ", "
515ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen         << RC.getName() << ", " << RC.getName() << " + "
516ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen         << RC.getOrder().size()
517a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng         << ") {}\n";
518b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen      if (!RC.AltOrderSelect.empty()) {
519b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        OS << "\nstatic inline unsigned " << RC.getName()
520b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen           << "AltOrderSelect(const MachineFunction &MF) {"
521b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen           << RC.AltOrderSelect << "}\n\nArrayRef<unsigned> "
522b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen           << RC.getName() << "Class::"
523b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen           << "getRawAllocationOrder(const MachineFunction &MF) const {\n";
524b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        for (unsigned oi = 1 , oe = RC.getNumOrders(); oi != oe; ++oi) {
525b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen          ArrayRef<Record*> Elems = RC.getOrder(oi);
526b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen          OS << "  static const unsigned AltOrder" << oi << "[] = {";
527b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen          for (unsigned elem = 0; elem != Elems.size(); ++elem)
528b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen            OS << (elem ? ", " : " ") << getQualifiedName(Elems[elem]);
529b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen          OS << " };\n";
530b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        }
531b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        OS << "  static const ArrayRef<unsigned> Order[] = {\n"
532b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen           << "    ArrayRef<unsigned>(" << RC.getName();
533b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        for (unsigned oi = 1, oe = RC.getNumOrders(); oi != oe; ++oi)
534b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen          OS << "),\n    ArrayRef<unsigned>(AltOrder" << oi;
535b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        OS << ")\n  };\n  const unsigned Select = " << RC.getName()
536b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen           << "AltOrderSelect(MF);\n  assert(Select < " << RC.getNumOrders()
537b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen           << ");\n  return Order[Select];\n}\n";
538b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        }
53960200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner    }
5405d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
54142de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner    OS << "}\n";
5429fff8919eefa377936918eec763b392e59049353Chris Lattner  }
5439fff8919eefa377936918eec763b392e59049353Chris Lattner
54442de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner  OS << "\nnamespace {\n";
5459fff8919eefa377936918eec763b392e59049353Chris Lattner  OS << "  const TargetRegisterClass* const RegisterClasses[] = {\n";
54642de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner  for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i)
54742de581b2f28985ec0c8fcbb26ab4d78c684247fChris Lattner    OS << "    &" << getQualifiedName(RegisterClasses[i].TheDef)
54860200e5d32f63b4e54575f5cbec348f3f9baeb5dChris Lattner       << "RegClass,\n";
5499fff8919eefa377936918eec763b392e59049353Chris Lattner  OS << "  };\n";
55054d156d33324b7715453993f21684915a28e310aChris Lattner
551a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  // Emit extra information about registers.
552a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  OS << "\n  static const TargetRegisterInfoDesc "
553a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng     << Target.getName() << "RegInfoDesc[] = "
554a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng     << "{ // Extra Descriptors\n";
555a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  OS << "    { 0, 0 },\n";
55626693113201f4c9d441678e50d96f38d3288798eChris Lattner
557a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
55876f0ad7bf5c05d6056b3bf335d0c3fb7e72de5d6Jakob Stoklund Olesen  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
559abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    const CodeGenRegister &Reg = *Regs[i];
560a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    OS << "    { ";
561a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng    OS << Reg.CostPerUse << ", "
562f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen       << int(AllocatableRegs.count(Reg.TheDef)) << " },\n";
5639fff8919eefa377936918eec763b392e59049353Chris Lattner  }
5649fff8919eefa377936918eec763b392e59049353Chris Lattner  OS << "  };\n";      // End of register descriptors...
5651fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen
566a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
567123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen  // Calculate the mapping of subregister+index pairs to physical registers.
568123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen  // This will also create further anonymous indexes.
569dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  unsigned NamedIndices = RegBank.getNumNamedIndices();
570123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen
5711fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen  // Emit SubRegIndex names, skipping 0
572dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices();
5731fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen  OS << "\n  const char *const SubRegIndexTable[] = { \"";
5741fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen  for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
5751fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen    OS << SubRegIndices[i]->getName();
5761fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen    if (i+1 != e)
5771fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen      OS << "\", \"";
5781fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen  }
5791fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen  OS << "\" };\n\n";
580123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen
581123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen  // Emit names of the anonymus subreg indexes.
582123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen  if (SubRegIndices.size() > NamedIndices) {
583123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen    OS << "  enum {";
584123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen    for (unsigned i = NamedIndices, e = SubRegIndices.size(); i != e; ++i) {
585123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen      OS << "\n    " << SubRegIndices[i]->getName() << " = " << i+1;
586123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen      if (i+1 != e)
587123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen        OS << ',';
588123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen    }
589123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen    OS << "\n  };\n\n";
590123cab9480812e51f6d4cb118fe685691130f625Jakob Stoklund Olesen  }
5919fff8919eefa377936918eec763b392e59049353Chris Lattner  OS << "}\n\n";       // End of anonymous namespace...
5929fff8919eefa377936918eec763b392e59049353Chris Lattner
5937884b750c33b750177b3f22af75c874c97f728d8Chris Lattner  std::string ClassName = Target.getName() + "GenRegisterInfo";
5943da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
5957bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  // Emit the subregister + index mapping function based on the information
5967bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  // calculated above.
597ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen  OS << "unsigned " << ClassName
5987bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman     << "::getSubReg(unsigned RegNo, unsigned Index) const {\n"
5997bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman     << "  switch (RegNo) {\n"
600dd595c5998214c6ee07ed46f5db551b2abbfbbb3Evan Cheng     << "  default:\n    return 0;\n";
601ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
602abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs();
603ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen    if (SRM.empty())
604ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen      continue;
605abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    OS << "  case " << getQualifiedName(Regs[i]->TheDef) << ":\n";
6067bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    OS << "    switch (Index) {\n";
60784a8be3baf8ee5a43ea854e4ea7c3db840e7e285Evan Cheng    OS << "    default: return 0;\n";
608b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(),
6097c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen         ie = SRM.end(); ii != ie; ++ii)
610ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen      OS << "    case " << getQualifiedName(ii->first)
611b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen         << ": return " << getQualifiedName(ii->second->TheDef) << ";\n";
61284a8be3baf8ee5a43ea854e4ea7c3db840e7e285Evan Cheng    OS << "    };\n" << "    break;\n";
6137bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  }
6147bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  OS << "  };\n";
615851879c4cf1fc1f97be704a0459fb0ca5f327a44Bill Wendling  OS << "  return 0;\n";
6167bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  OS << "}\n\n";
617fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng
618ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen  OS << "unsigned " << ClassName
619fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng     << "::getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const {\n"
620fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng     << "  switch (RegNo) {\n"
621fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng     << "  default:\n    return 0;\n";
622ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
623abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen     const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs();
624ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen     if (SRM.empty())
625ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen       continue;
626abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    OS << "  case " << getQualifiedName(Regs[i]->TheDef) << ":\n";
627b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(),
6287c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen         ie = SRM.end(); ii != ie; ++ii)
629b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      OS << "    if (SubRegNo == " << getQualifiedName(ii->second->TheDef)
630ca561ffcf320e9dbfafcac5efcee81471f3259c3Jakob Stoklund Olesen         << ")  return " << getQualifiedName(ii->first) << ";\n";
631fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng    OS << "    return 0;\n";
632fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng  }
633fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng  OS << "  };\n";
634fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng  OS << "  return 0;\n";
635fae3e923452b85e72b2c03dd6eacc063f59d81b1Evan Cheng  OS << "}\n\n";
6367c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen
6377c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen  // Emit composeSubRegIndices
6387c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen  OS << "unsigned " << ClassName
6397c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen     << "::composeSubRegIndices(unsigned IdxA, unsigned IdxB) const {\n"
6407c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen     << "  switch (IdxA) {\n"
6417c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen     << "  default:\n    return IdxB;\n";
6427c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen  for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
6437c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen    bool Open = false;
6447c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen    for (unsigned j = 0; j != e; ++j) {
645b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      if (Record *Comp = RegBank.getCompositeSubRegIndex(SubRegIndices[i],
646b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                                                         SubRegIndices[j])) {
6477c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen        if (!Open) {
6487c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen          OS << "  case " << getQualifiedName(SubRegIndices[i])
6497c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen             << ": switch(IdxB) {\n    default: return IdxB;\n";
6507c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen          Open = true;
6517c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen        }
6527c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen        OS << "    case " << getQualifiedName(SubRegIndices[j])
6537c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen           << ": return " << getQualifiedName(Comp) << ";\n";
6547c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen      }
6557c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen    }
6567c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen    if (Open)
6577c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen      OS << "    }\n";
6587c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen  }
6597c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen  OS << "  }\n}\n\n";
6607c9a6e328407d681414aa66f3e80f92c3d35ad5cJakob Stoklund Olesen
6619fff8919eefa377936918eec763b392e59049353Chris Lattner  // Emit the constructor of the class...
6629fff8919eefa377936918eec763b392e59049353Chris Lattner  OS << ClassName << "::" << ClassName
6635e6b4605bd620a864055276a6d454e5a18f9fee8Evan Cheng     << "(const MCRegisterDesc *D, const TargetRegisterInfoDesc *ID, "
664a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng     << "int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
665a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng     << "  : TargetRegisterInfo(ID"
6661fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen     << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n"
6671fc8e759a767077726f9be35b93767e68bdf101fJakob Stoklund Olesen     << "                 SubRegIndexTable,\n"
6681e56a2a85fbafce5ceee72f72d41b84a71876844Owen Anderson     << "                 CallFrameSetupOpcode, CallFrameDestroyOpcode) {\n"
669a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng     << "  InitMCRegisterInfo(D, " << Regs.size()+1 << ");\n"
670f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson     << "}\n\n";
6713da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
672f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  // Collect all information about dwarf register numbers
673a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  typedef std::map<Record*, std::vector<int64_t>, LessRecord> DwarfRegNumsMapTy;
674a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  DwarfRegNumsMapTy DwarfRegNums;
675f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov
676f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  // First, just pull all provided information to the map
677f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  unsigned maxLength = 0;
67876f0ad7bf5c05d6056b3bf335d0c3fb7e72de5d6Jakob Stoklund Olesen  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
679abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    Record *Reg = Regs[i]->TheDef;
68063f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman    std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers");
681e7e113361ea550afbb8bebcdc1e736c5d4833f8cOwen Anderson    maxLength = std::max((size_t)maxLength, RegNums.size());
682f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov    if (DwarfRegNums.count(Reg))
6831a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar      errs() << "Warning: DWARF numbers for register " << getQualifiedName(Reg)
6841a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar             << "specified multiple times\n";
685f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov    DwarfRegNums[Reg] = RegNums;
68647622e37215429c20d8278ff57496d840811cc13Jim Laskey  }
687f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov
688f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  // Now we know maximal length of number list. Append -1's, where needed
6895d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach  for (DwarfRegNumsMapTy::iterator
690690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner       I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
691f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov    for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
692f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov      I->second.push_back(-1);
693f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov
6946e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola  // Emit reverse information about the dwarf register numbers.
6956e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola  OS << "int " << ClassName << "::getLLVMRegNumFull(unsigned DwarfRegNum, "
6966e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola     << "unsigned Flavour) const {\n"
6976e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola     << "  switch (Flavour) {\n"
6986e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola     << "  default:\n"
6996e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola     << "    assert(0 && \"Unknown DWARF flavour\");\n"
7006e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola     << "    return -1;\n";
7016e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola
7026e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola  for (unsigned i = 0, e = maxLength; i != e; ++i) {
7036e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola    OS << "  case " << i << ":\n"
7046e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola       << "    switch (DwarfRegNum) {\n"
7056e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola       << "    default:\n"
7066e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola       << "      assert(0 && \"Invalid DwarfRegNum\");\n"
7076e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola       << "      return -1;\n";
7086e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola
7096e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola    for (DwarfRegNumsMapTy::iterator
7106e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola           I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
7116e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola      int DwarfRegNo = I->second[i];
7126e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola      if (DwarfRegNo >= 0)
7136e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola        OS << "    case " <<  DwarfRegNo << ":\n"
7146e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola           << "      return " << getQualifiedName(I->first) << ";\n";
7156e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola    }
7166e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola    OS << "    };\n";
7176e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola  }
7186e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola
7196e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola  OS << "  };\n}\n\n";
7206e032942cf58d1c41f88609a1cec74eb74940ecdRafael Espindola
7217a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
722abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    Record *Reg = Regs[i]->TheDef;
7237a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola    const RecordVal *V = Reg->getValue("DwarfAlias");
7247a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola    if (!V || !V->getValue())
7257a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola      continue;
7267a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola
7277a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola    DefInit *DI = dynamic_cast<DefInit*>(V->getValue());
7287a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola    Record *Alias = DI->getDef();
7297a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola    DwarfRegNums[Reg] = DwarfRegNums[Alias];
7307a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola  }
7317a067cc6e0b980b186696c13fe847929fbc0d373Rafael Espindola
732f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  // Emit information about the dwarf register numbers.
733f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  OS << "int " << ClassName << "::getDwarfRegNumFull(unsigned RegNum, "
734f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov     << "unsigned Flavour) const {\n"
735f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov     << "  switch (Flavour) {\n"
736f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov     << "  default:\n"
737f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov     << "    assert(0 && \"Unknown DWARF flavour\");\n"
738f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov     << "    return -1;\n";
7395d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
740f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  for (unsigned i = 0, e = maxLength; i != e; ++i) {
741f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov    OS << "  case " << i << ":\n"
742f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov       << "    switch (RegNum) {\n"
743f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov       << "    default:\n"
744f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov       << "      assert(0 && \"Invalid RegNum\");\n"
745f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov       << "      return -1;\n";
7465d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
747690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner    // Sort by name to get a stable order.
748f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov
7495d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
7505d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach    for (DwarfRegNumsMapTy::iterator
751f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov           I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
752f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov      int RegNo = I->second[i];
7537bf114c1bd0390f4f485905d2fe9c7c6a048b8b7Rafael Espindola      OS << "    case " << getQualifiedName(I->first) << ":\n"
7547bf114c1bd0390f4f485905d2fe9c7c6a048b8b7Rafael Espindola         << "      return " << RegNo << ";\n";
755f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov    }
756f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov    OS << "    };\n";
757f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  }
7585d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach
759f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov  OS << "  };\n}\n\n";
7604794797f1213c4096a6f5ff2b6841dd5866b22baChris Lattner
7612c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner  OS << "} // End llvm namespace \n";
76273f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  OS << "#endif // GET_REGINFO_TARGET_DESC\n\n";
7633112326c88b7090f770c4ff8a1546ef84fd2e8bbChris Lattner}
764a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
76573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Chengvoid RegisterInfoEmitter::run(raw_ostream &OS) {
766a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  CodeGenTarget Target(Records);
767a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  CodeGenRegBank &RegBank = Target.getRegBank();
768a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng  RegBank.computeDerivedInfo();
769a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
77073f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  runEnums(OS, Target, RegBank);
77173f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  runMCDesc(OS, Target, RegBank);
772ebbbfd0e2eeeb5b1a15f0e655a0a2119510713d4Evan Cheng  runTargetHeader(OS, Target, RegBank);
77373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  runTargetDesc(OS, Target, RegBank);
774a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng}
775