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