RegisterInfoEmitter.cpp revision fbf3b4a07690751f72302757058ab0298dfb832e
1364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro//===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===//
26b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee//
36b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee//                     The LLVM Compiler Infrastructure
46b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee//
56b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee// This file is distributed under the University of Illinois Open Source
66b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee// License. See LICENSE.TXT for details.
7364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro//
86b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee//===----------------------------------------------------------------------===//
96b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee//
106b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee// This tablegen backend is responsible for emitting a description of a target
1183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee// register file for a code generator.  It uses instances of the Register,
12478c10554b366989b341af4017602571edfe9b2eTim Peters// RegisterAliases, and RegisterClass classes to gather this information.
136b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee//
14364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro//===----------------------------------------------------------------------===//
15364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro
16364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro#include "CodeGenRegisters.h"
176b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee#include "CodeGenTarget.h"
186b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee#include "SequenceToOffsetTable.h"
19364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro#include "llvm/ADT/BitVector.h"
20364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro#include "llvm/ADT/STLExtras.h"
21364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro#include "llvm/ADT/StringExtras.h"
226b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee#include "llvm/ADT/Twine.h"
23ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon#include "llvm/Support/Format.h"
24ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon#include "llvm/TableGen/Error.h"
25ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon#include "llvm/TableGen/Record.h"
26ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon#include "llvm/TableGen/TableGenBackend.h"
27ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon#include <algorithm>
28ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon#include <set>
29fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee#include <vector>
30ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannonusing namespace llvm;
31ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon
32ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannonnamespace {
33ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannonclass RegisterInfoEmitter {
34ad078a0d7a4a4a840c259ec4a744043375de452bBrett Cannon  RecordKeeper &Records;
35fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yeepublic:
366b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  RegisterInfoEmitter(RecordKeeper &R) : Records(R) {}
376b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee
386b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  // runEnums - Print out enum values for all of the registers.
396b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  void runEnums(raw_ostream &o, CodeGenTarget &Target, CodeGenRegBank &Bank);
406b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee
4183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  // runMCDesc - Print out MC register descriptions.
4283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  void runMCDesc(raw_ostream &o, CodeGenTarget &Target, CodeGenRegBank &Bank);
436b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee
446b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  // runTargetHeader - Emit a header fragment for the register info emitter.
456b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  void runTargetHeader(raw_ostream &o, CodeGenTarget &Target,
4683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee                       CodeGenRegBank &Bank);
475fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling
485fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling  // runTargetDesc - Output the target register and register file descriptions.
495fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling  void runTargetDesc(raw_ostream &o, CodeGenTarget &Target,
505fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling                     CodeGenRegBank &Bank);
515fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling
52182b5aca27d376b08a2904bed42b751496f932f3Tim Peters  // run - Output the register file description.
535fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling  void run(raw_ostream &o);
545fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling
555fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchlingprivate:
565fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling  void EmitRegMapping(raw_ostream &o,
575fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling                      const std::vector<CodeGenRegister*> &Regs, bool isCtor);
58182b5aca27d376b08a2904bed42b751496f932f3Tim Peters  void EmitRegMappingTables(raw_ostream &o,
595fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling                            const std::vector<CodeGenRegister*> &Regs,
605fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling                            bool isCtor);
615fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling  void EmitRegClasses(raw_ostream &OS, CodeGenTarget &Target);
625fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling
635fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling  void EmitRegUnitPressure(raw_ostream &OS, const CodeGenRegBank &RegBank,
6483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee                           const std::string &ClassName);
6583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  void emitComposeSubRegIndices(raw_ostream &OS, CodeGenRegBank &RegBank,
6683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee                                const std::string &ClassName);
6783205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee};
6883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee} // End anonymous namespace
6983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
7083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee// runEnums - Print out enum values for all of the registers.
71711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yeevoid RegisterInfoEmitter::runEnums(raw_ostream &OS,
72711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee                                   CodeGenTarget &Target, CodeGenRegBank &Bank) {
73711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee  const std::vector<CodeGenRegister*> &Registers = Bank.getRegisters();
74711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee
75711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee  // Register enums are stored as uint16_t in the tables. Make sure we'll fit.
76711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee  assert(Registers.size() <= 0xffff && "Too many regs to fit in tables");
77711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee
78711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee  std::string Namespace = Registers[0]->TheDef->getValueAsString("Namespace");
7983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
8083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  emitSourceFileHeader("Target Register Enum Values", OS);
8183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
8283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  OS << "\n#ifdef GET_REGINFO_ENUM\n";
8326f6bdf4f19336c125e3fac7aacaf55b312f474bAndrew M. Kuchling  OS << "#undef GET_REGINFO_ENUM\n";
8483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
8583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  OS << "namespace llvm {\n\n";
8683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
8783205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  OS << "class MCRegisterClass;\n"
8883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee     << "extern const MCRegisterClass " << Namespace
8983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee     << "MCRegisterClasses[];\n\n";
9083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
9183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  if (!Namespace.empty())
9283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "namespace " << Namespace << " {\n";
9383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  OS << "enum {\n  NoRegister,\n";
9483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
9583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  for (unsigned i = 0, e = Registers.size(); i != e; ++i)
9683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "  " << Registers[i]->getName() << " = " <<
9783205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      Registers[i]->EnumValue << ",\n";
9883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  assert(Registers.size() == Registers[Registers.size()-1]->EnumValue &&
9983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee         "Register enum value mismatch!");
10083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  OS << "  NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n";
10183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  OS << "};\n";
10283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  if (!Namespace.empty())
10383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "}\n";
1046b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee
1056b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  ArrayRef<CodeGenRegisterClass*> RegisterClasses = Bank.getRegClasses();
1066b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  if (!RegisterClasses.empty()) {
1076b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee
10883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    // RegisterClass enums are stored as uint16_t in the tables.
1095fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling    assert(RegisterClasses.size() <= 0xffff &&
1105fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling           "Too many register classes to fit in tables");
11183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
11283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "\n// Register classes\n";
1135fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling    if (!Namespace.empty())
1146b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      OS << "namespace " << Namespace << " {\n";
11583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "enum {\n";
1166b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
1176b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      if (i) OS << ",\n";
1186b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      OS << "  " << RegisterClasses[i]->getName() << "RegClassID";
11907c81d9074fd72cb6a7ad1548685a87d5a764a09Georg Brandl      OS << " = " << i;
12007c81d9074fd72cb6a7ad1548685a87d5a764a09Georg Brandl    }
12107c81d9074fd72cb6a7ad1548685a87d5a764a09Georg Brandl    OS << "\n  };\n";
12207c81d9074fd72cb6a7ad1548685a87d5a764a09Georg Brandl    if (!Namespace.empty())
12307c81d9074fd72cb6a7ad1548685a87d5a764a09Georg Brandl      OS << "}\n";
1246b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  }
12583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
12683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  const std::vector<Record*> RegAltNameIndices = Target.getRegAltNameIndices();
12783205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  // If the only definition is the default NoRegAltName, we don't need to
12883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  // emit anything.
12983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  if (RegAltNameIndices.size() > 1) {
13083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "\n// Register alternate name indices\n";
13183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    if (!Namespace.empty())
13283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      OS << "namespace " << Namespace << " {\n";
13383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "enum {\n";
13483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    for (unsigned i = 0, e = RegAltNameIndices.size(); i != e; ++i)
13583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      OS << "  " << RegAltNameIndices[i]->getName() << ",\t// " << i << "\n";
13683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "  NUM_TARGET_REG_ALT_NAMES = " << RegAltNameIndices.size() << "\n";
13783205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "};\n";
13883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    if (!Namespace.empty())
13983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      OS << "}\n";
1406b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  }
1416b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee
1426b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  ArrayRef<CodeGenSubRegIndex*> SubRegIndices = Bank.getSubRegIndices();
14383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  if (!SubRegIndices.empty()) {
14483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "\n// Subregister indices\n";
14583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    std::string Namespace =
14683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      SubRegIndices[0]->getNamespace();
14783205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    if (!Namespace.empty())
14883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      OS << "namespace " << Namespace << " {\n";
14983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "enum {\n  NoSubRegister,\n";
15083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i)
15183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      OS << "  " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
15283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "  NUM_TARGET_SUBREGS\n};\n";
15383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    if (!Namespace.empty())
15483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee      OS << "}\n";
15583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  }
156dbecd93b7203cd187c1978de1207c29d3a9a686cRaymond Hettinger
157711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee  OS << "} // End llvm namespace \n";
158711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee  OS << "#endif // GET_REGINFO_ENUM\n\n";
159711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee}
160711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee
161711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yeevoid RegisterInfoEmitter::
16283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping YeeEmitRegUnitPressure(raw_ostream &OS, const CodeGenRegBank &RegBank,
16383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee                    const std::string &ClassName) {
16483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  unsigned NumRCs = RegBank.getRegClasses().size();
16583205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  unsigned NumSets = RegBank.getNumRegPressureSets();
16683205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee
1675fcefdb32600fa64d3160f031d48fb033150fdb3Andrew M. Kuchling  OS << "/// Get the weight in units of pressure for this register class.\n"
16883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee     << "const RegClassWeight &" << ClassName << "::\n"
16983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee     << "getRegClassWeight(const TargetRegisterClass *RC) const {\n"
17083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee     << "  static const RegClassWeight RCWeightTable[] = {\n";
171b67c94318ec85722ce01c03955d6fbf50e3f7aa9Andrew M. Kuchling  for (unsigned i = 0, e = NumRCs; i != e; ++i) {
172b67c94318ec85722ce01c03955d6fbf50e3f7aa9Andrew M. Kuchling    const CodeGenRegisterClass &RC = *RegBank.getRegClasses()[i];
173135c3174e7edbb2e01fabacfd5e015e49b640efdGeorg Brandl    const CodeGenRegister::Set &Regs = RC.getMembers();
1746b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    if (Regs.empty())
175711cad769a60b4a53520bb1daf580d2ca252b450Ka-Ping Yee      OS << "    {0, 0";
1766b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    else {
1776b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      std::vector<unsigned> RegUnits;
1786b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      RC.buildRegUnitSet(RegUnits);
1796b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      OS << "    {" << (*Regs.begin())->getWeight(RegBank)
1806b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee         << ", " << RegBank.getRegUnitSetWeight(RegUnits);
1816b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    }
18283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    OS << "},  \t// " << RC.getName() << "\n";
18383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  }
18483205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  OS << "    {0, 0} };\n"
1856b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "  return RCWeightTable[RC->getID()];\n"
1866b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "}\n\n";
1876b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee
188a09a96a5440144f926c69250dab7b9bbf06bd789Georg Brandl  // Reasonable targets (not ARMv7) have unit weight for all units, so don't
189a09a96a5440144f926c69250dab7b9bbf06bd789Georg Brandl  // bother generating a table.
1906b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  bool RegUnitsHaveUnitWeight = true;
191364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  for (unsigned UnitIdx = 0, UnitEnd = RegBank.getNumNativeRegUnits();
192364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro       UnitIdx < UnitEnd; ++UnitIdx) {
193364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    if (RegBank.getRegUnit(UnitIdx).Weight > 1)
194364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro      RegUnitsHaveUnitWeight = false;
195364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  }
196364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "/// Get the weight in units of pressure for this register unit.\n"
197364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "unsigned " << ClassName << "::\n"
198364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "getRegUnitWeight(unsigned RegUnit) const {\n"
199364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "  assert(RegUnit < " << RegBank.getNumNativeRegUnits()
200364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << " && \"invalid register unit\");\n";
201364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  if (!RegUnitsHaveUnitWeight) {
202364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    OS << "  static const uint8_t RUWeightTable[] = {\n    ";
203364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    for (unsigned UnitIdx = 0, UnitEnd = RegBank.getNumNativeRegUnits();
204364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro         UnitIdx < UnitEnd; ++UnitIdx) {
205364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro      const RegUnit &RU = RegBank.getRegUnit(UnitIdx);
206364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro      assert(RU.Weight < 256 && "RegUnit too heavy");
207364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro      OS << RU.Weight << ", ";
208364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    }
209364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    OS << "0 };\n"
210364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro       << "  return RUWeightTable[RegUnit];\n";
211364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  }
212364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  else {
213364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    OS << "  // All register units have unit weight.\n"
214364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro       << "  return 1;\n";
215364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  }
216364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "}\n\n";
217364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro
218364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "\n"
219364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "// Get the number of dimensions of register pressure.\n"
220364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "unsigned " << ClassName << "::getNumRegPressureSets() const {\n"
221364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "  return " << NumSets << ";\n}\n\n";
222364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro
223364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "// Get the name of this register unit pressure set.\n"
224364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "const char *" << ClassName << "::\n"
225364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "getRegPressureSetName(unsigned Idx) const {\n"
226364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "  static const char *PressureNameTable[] = {\n";
227364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  for (unsigned i = 0; i < NumSets; ++i ) {
228364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    OS << "    \"" << RegBank.getRegPressureSet(i).Name << "\",\n";
229364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  }
230364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "    0 };\n"
231364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "  return PressureNameTable[Idx];\n"
232364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "}\n\n";
233364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro
2341c0228a51902233b3478e835be65198d305824e4Skip Montanaro  OS << "// Get the register unit pressure limit for this dimension.\n"
235364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "// This limit must be adjusted dynamically for reserved registers.\n"
236364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "unsigned " << ClassName << "::\n"
237364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "getRegPressureSetLimit(unsigned Idx) const {\n"
238364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "  static const unsigned PressureLimitTable[] = {\n";
239364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  for (unsigned i = 0; i < NumSets; ++i ) {
240364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    const RegUnitSet &RegUnits = RegBank.getRegPressureSet(i);
241364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    OS << "    " << RegBank.getRegUnitSetWeight(RegUnits.Units)
242364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro       << ",  \t// " << i << ": " << RegUnits.Name << "\n";
243135c3174e7edbb2e01fabacfd5e015e49b640efdGeorg Brandl  }
244364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "    0 };\n"
245364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "  return PressureLimitTable[Idx];\n"
246364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "}\n\n";
247364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro
248364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  // This table may be larger than NumRCs if some register units needed a list
249364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  // of unit sets that did not correspond to a register class.
250364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  unsigned NumRCUnitSets = RegBank.getNumRegClassPressureSetLists();
251364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "/// Table of pressure sets per register class or unit.\n"
252364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "static const int RCSetsTable[] = {\n    ";
253364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  std::vector<unsigned> RCSetStarts(NumRCUnitSets);
254364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  for (unsigned i = 0, StartIdx = 0, e = NumRCUnitSets; i != e; ++i) {
255364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    RCSetStarts[i] = StartIdx;
2566b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    ArrayRef<unsigned> PSetIDs = RegBank.getRCPressureSetIDs(i);
25783205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    for (ArrayRef<unsigned>::iterator PSetI = PSetIDs.begin(),
25883205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee           PSetE = PSetIDs.end(); PSetI != PSetE; ++PSetI) {
259364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro      OS << *PSetI << ",  ";
260364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro      ++StartIdx;
2616b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    }
2626b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    OS << "-1,  \t// #" << RCSetStarts[i] << " ";
26383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee    if (i < NumRCs)
264fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee      OS << RegBank.getRegClasses()[i]->getName();
265364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    else {
2666b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      OS << "inferred";
2676b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      for (ArrayRef<unsigned>::iterator PSetI = PSetIDs.begin(),
2686b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee             PSetE = PSetIDs.end(); PSetI != PSetE; ++PSetI) {
2696b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee        OS << "~" << RegBank.getRegPressureSet(*PSetI).Name;
2706b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee      }
2716b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee    }
272364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    OS << "\n    ";
273364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    ++StartIdx;
2746b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  }
275364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  OS << "-1 };\n\n";
276364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro
2776b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  OS << "/// Get the dimensions of register pressure impacted by this "
278364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "register class.\n"
2796b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "/// Returns a -1 terminated array of pressure set IDs\n"
280364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "const int* " << ClassName << "::\n"
281364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "getRegClassPressureSets(const TargetRegisterClass *RC) const {\n";
2826b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  OS << "  static const unsigned RCSetStartTable[] = {\n    ";
2836b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  for (unsigned i = 0, e = NumRCs; i != e; ++i) {
284364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro    OS << RCSetStarts[i] << ",";
2856b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  }
286fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee  OS << "0 };\n"
2876b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "  unsigned SetListStart = RCSetStartTable[RC->getID()];\n"
288fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee     << "  return &RCSetsTable[SetListStart];\n"
2896b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "}\n\n";
290fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee
2916b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  OS << "/// Get the dimensions of register pressure impacted by this "
2926b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "register unit.\n"
29330633c9a6423459cdd481a6e44954d5933c7842bAndrew M. Kuchling     << "/// Returns a -1 terminated array of pressure set IDs\n"
294364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro     << "const int* " << ClassName << "::\n"
2956b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "getRegUnitPressureSets(unsigned RegUnit) const {\n"
2963b0a3293c369f3c3f4753e3cb9172cb4e242af76Guido van Rossum     << "  assert(RegUnit < " << RegBank.getNumNativeRegUnits()
2976b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << " && \"invalid register unit\");\n";
2986b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee  OS << "  static const unsigned RUSetStartTable[] = {\n    ";
299fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee  for (unsigned UnitIdx = 0, UnitEnd = RegBank.getNumNativeRegUnits();
3006b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee       UnitIdx < UnitEnd; ++UnitIdx) {
301fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee    OS << RCSetStarts[RegBank.getRegUnit(UnitIdx).RegClassUnitSetsIdx] << ",";
302fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee  }
303fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee  OS << "0 };\n"
304fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee     << "  unsigned SetListStart = RUSetStartTable[RegUnit];\n"
305fa78d0fbe45a7f16d5d30c3d4e3ad30dc4933e8fKa-Ping Yee     << "  return &RCSetsTable[SetListStart];\n"
3066b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee     << "}\n\n";
3076b5a48d48ea15c1364b2fbc8552f50ebf72fa64aKa-Ping Yee}
308364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro
30983205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yeevoid
31083205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping YeeRegisterInfoEmitter::EmitRegMappingTables(raw_ostream &OS,
31183205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee                                       const std::vector<CodeGenRegister*> &Regs,
31283205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee                                          bool isCtor) {
31383205972a2d027517ebedd827d1c19a5b0264c0aKa-Ping Yee  // Collect all information about dwarf register numbers
314364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  typedef std::map<Record*, std::vector<int64_t>, LessRecord> DwarfRegNumsMapTy;
315364ca40c2a053718f67c2032769de1f1fd76bb22Skip Montanaro  DwarfRegNumsMapTy DwarfRegNums;
316
317  // First, just pull all provided information to the map
318  unsigned maxLength = 0;
319  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
320    Record *Reg = Regs[i]->TheDef;
321    std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers");
322    maxLength = std::max((size_t)maxLength, RegNums.size());
323    if (DwarfRegNums.count(Reg))
324      PrintWarning(Reg->getLoc(), Twine("DWARF numbers for register ") +
325                   getQualifiedName(Reg) + "specified multiple times");
326    DwarfRegNums[Reg] = RegNums;
327  }
328
329  if (!maxLength)
330    return;
331
332  // Now we know maximal length of number list. Append -1's, where needed
333  for (DwarfRegNumsMapTy::iterator
334       I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
335    for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
336      I->second.push_back(-1);
337
338  std::string Namespace = Regs[0]->TheDef->getValueAsString("Namespace");
339
340  OS << "// " << Namespace << " Dwarf<->LLVM register mappings.\n";
341
342  // Emit reverse information about the dwarf register numbers.
343  for (unsigned j = 0; j < 2; ++j) {
344    for (unsigned i = 0, e = maxLength; i != e; ++i) {
345      OS << "extern const MCRegisterInfo::DwarfLLVMRegPair " << Namespace;
346      OS << (j == 0 ? "DwarfFlavour" : "EHFlavour");
347      OS << i << "Dwarf2L[]";
348
349      if (!isCtor) {
350        OS << " = {\n";
351
352        // Store the mapping sorted by the LLVM reg num so lookup can be done
353        // with a binary search.
354        std::map<uint64_t, Record*> Dwarf2LMap;
355        for (DwarfRegNumsMapTy::iterator
356               I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
357          int DwarfRegNo = I->second[i];
358          if (DwarfRegNo < 0)
359            continue;
360          Dwarf2LMap[DwarfRegNo] = I->first;
361        }
362
363        for (std::map<uint64_t, Record*>::iterator
364               I = Dwarf2LMap.begin(), E = Dwarf2LMap.end(); I != E; ++I)
365          OS << "  { " << I->first << "U, " << getQualifiedName(I->second)
366             << " },\n";
367
368        OS << "};\n";
369      } else {
370        OS << ";\n";
371      }
372
373      // We have to store the size in a const global, it's used in multiple
374      // places.
375      OS << "extern const unsigned " << Namespace
376         << (j == 0 ? "DwarfFlavour" : "EHFlavour") << i << "Dwarf2LSize";
377      if (!isCtor)
378        OS << " = sizeof(" << Namespace
379           << (j == 0 ? "DwarfFlavour" : "EHFlavour") << i
380           << "Dwarf2L)/sizeof(MCRegisterInfo::DwarfLLVMRegPair);\n\n";
381      else
382        OS << ";\n\n";
383    }
384  }
385
386  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
387    Record *Reg = Regs[i]->TheDef;
388    const RecordVal *V = Reg->getValue("DwarfAlias");
389    if (!V || !V->getValue())
390      continue;
391
392    DefInit *DI = cast<DefInit>(V->getValue());
393    Record *Alias = DI->getDef();
394    DwarfRegNums[Reg] = DwarfRegNums[Alias];
395  }
396
397  // Emit information about the dwarf register numbers.
398  for (unsigned j = 0; j < 2; ++j) {
399    for (unsigned i = 0, e = maxLength; i != e; ++i) {
400      OS << "extern const MCRegisterInfo::DwarfLLVMRegPair " << Namespace;
401      OS << (j == 0 ? "DwarfFlavour" : "EHFlavour");
402      OS << i << "L2Dwarf[]";
403      if (!isCtor) {
404        OS << " = {\n";
405        // Store the mapping sorted by the Dwarf reg num so lookup can be done
406        // with a binary search.
407        for (DwarfRegNumsMapTy::iterator
408               I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
409          int RegNo = I->second[i];
410          if (RegNo == -1) // -1 is the default value, don't emit a mapping.
411            continue;
412
413          OS << "  { " << getQualifiedName(I->first) << ", " << RegNo
414             << "U },\n";
415        }
416        OS << "};\n";
417      } else {
418        OS << ";\n";
419      }
420
421      // We have to store the size in a const global, it's used in multiple
422      // places.
423      OS << "extern const unsigned " << Namespace
424         << (j == 0 ? "DwarfFlavour" : "EHFlavour") << i << "L2DwarfSize";
425      if (!isCtor)
426        OS << " = sizeof(" << Namespace
427           << (j == 0 ? "DwarfFlavour" : "EHFlavour") << i
428           << "L2Dwarf)/sizeof(MCRegisterInfo::DwarfLLVMRegPair);\n\n";
429      else
430        OS << ";\n\n";
431    }
432  }
433}
434
435void
436RegisterInfoEmitter::EmitRegMapping(raw_ostream &OS,
437                                    const std::vector<CodeGenRegister*> &Regs,
438                                    bool isCtor) {
439  // Emit the initializer so the tables from EmitRegMappingTables get wired up
440  // to the MCRegisterInfo object.
441  unsigned maxLength = 0;
442  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
443    Record *Reg = Regs[i]->TheDef;
444    maxLength = std::max((size_t)maxLength,
445                         Reg->getValueAsListOfInts("DwarfNumbers").size());
446  }
447
448  if (!maxLength)
449    return;
450
451  std::string Namespace = Regs[0]->TheDef->getValueAsString("Namespace");
452
453  // Emit reverse information about the dwarf register numbers.
454  for (unsigned j = 0; j < 2; ++j) {
455    OS << "  switch (";
456    if (j == 0)
457      OS << "DwarfFlavour";
458    else
459      OS << "EHFlavour";
460    OS << ") {\n"
461     << "  default:\n"
462     << "    llvm_unreachable(\"Unknown DWARF flavour\");\n";
463
464    for (unsigned i = 0, e = maxLength; i != e; ++i) {
465      OS << "  case " << i << ":\n";
466      OS << "    ";
467      if (!isCtor)
468        OS << "RI->";
469      std::string Tmp;
470      raw_string_ostream(Tmp) << Namespace
471                              << (j == 0 ? "DwarfFlavour" : "EHFlavour") << i
472                              << "Dwarf2L";
473      OS << "mapDwarfRegsToLLVMRegs(" << Tmp << ", " << Tmp << "Size, ";
474      if (j == 0)
475          OS << "false";
476        else
477          OS << "true";
478      OS << ");\n";
479      OS << "    break;\n";
480    }
481    OS << "  }\n";
482  }
483
484  // Emit information about the dwarf register numbers.
485  for (unsigned j = 0; j < 2; ++j) {
486    OS << "  switch (";
487    if (j == 0)
488      OS << "DwarfFlavour";
489    else
490      OS << "EHFlavour";
491    OS << ") {\n"
492       << "  default:\n"
493       << "    llvm_unreachable(\"Unknown DWARF flavour\");\n";
494
495    for (unsigned i = 0, e = maxLength; i != e; ++i) {
496      OS << "  case " << i << ":\n";
497      OS << "    ";
498      if (!isCtor)
499        OS << "RI->";
500      std::string Tmp;
501      raw_string_ostream(Tmp) << Namespace
502                              << (j == 0 ? "DwarfFlavour" : "EHFlavour") << i
503                              << "L2Dwarf";
504      OS << "mapLLVMRegsToDwarfRegs(" << Tmp << ", " << Tmp << "Size, ";
505      if (j == 0)
506          OS << "false";
507        else
508          OS << "true";
509      OS << ");\n";
510      OS << "    break;\n";
511    }
512    OS << "  }\n";
513  }
514}
515
516// Print a BitVector as a sequence of hex numbers using a little-endian mapping.
517// Width is the number of bits per hex number.
518static void printBitVectorAsHex(raw_ostream &OS,
519                                const BitVector &Bits,
520                                unsigned Width) {
521  assert(Width <= 32 && "Width too large");
522  unsigned Digits = (Width + 3) / 4;
523  for (unsigned i = 0, e = Bits.size(); i < e; i += Width) {
524    unsigned Value = 0;
525    for (unsigned j = 0; j != Width && i + j != e; ++j)
526      Value |= Bits.test(i + j) << j;
527    OS << format("0x%0*x, ", Digits, Value);
528  }
529}
530
531// Helper to emit a set of bits into a constant byte array.
532class BitVectorEmitter {
533  BitVector Values;
534public:
535  void add(unsigned v) {
536    if (v >= Values.size())
537      Values.resize(((v/8)+1)*8); // Round up to the next byte.
538    Values[v] = true;
539  }
540
541  void print(raw_ostream &OS) {
542    printBitVectorAsHex(OS, Values, 8);
543  }
544};
545
546static void printSimpleValueType(raw_ostream &OS, MVT::SimpleValueType VT) {
547  OS << getEnumName(VT);
548}
549
550static void printSubRegIndex(raw_ostream &OS, const CodeGenSubRegIndex *Idx) {
551  OS << Idx->EnumValue;
552}
553
554// Differentially encoded register and regunit lists allow for better
555// compression on regular register banks. The sequence is computed from the
556// differential list as:
557//
558//   out[0] = InitVal;
559//   out[n+1] = out[n] + diff[n]; // n = 0, 1, ...
560//
561// The initial value depends on the specific list. The list is terminated by a
562// 0 differential which means we can't encode repeated elements.
563
564typedef SmallVector<uint16_t, 4> DiffVec;
565
566// Differentially encode a sequence of numbers into V. The starting value and
567// terminating 0 are not added to V, so it will have the same size as List.
568static
569DiffVec &diffEncode(DiffVec &V, unsigned InitVal, ArrayRef<unsigned> List) {
570  assert(V.empty() && "Clear DiffVec before diffEncode.");
571  uint16_t Val = uint16_t(InitVal);
572  for (unsigned i = 0; i != List.size(); ++i) {
573    uint16_t Cur = List[i];
574    V.push_back(Cur - Val);
575    Val = Cur;
576  }
577  return V;
578}
579
580template<typename Iter>
581static
582DiffVec &diffEncode(DiffVec &V, unsigned InitVal, Iter Begin, Iter End) {
583  assert(V.empty() && "Clear DiffVec before diffEncode.");
584  uint16_t Val = uint16_t(InitVal);
585  for (Iter I = Begin; I != End; ++I) {
586    uint16_t Cur = (*I)->EnumValue;
587    V.push_back(Cur - Val);
588    Val = Cur;
589  }
590  return V;
591}
592
593static void printDiff16(raw_ostream &OS, uint16_t Val) {
594  OS << Val;
595}
596
597// Try to combine Idx's compose map into Vec if it is compatible.
598// Return false if it's not possible.
599static bool combine(const CodeGenSubRegIndex *Idx,
600                    SmallVectorImpl<CodeGenSubRegIndex*> &Vec) {
601  const CodeGenSubRegIndex::CompMap &Map = Idx->getComposites();
602  for (CodeGenSubRegIndex::CompMap::const_iterator
603       I = Map.begin(), E = Map.end(); I != E; ++I) {
604    CodeGenSubRegIndex *&Entry = Vec[I->first->EnumValue - 1];
605    if (Entry && Entry != I->second)
606      return false;
607  }
608
609  // All entries are compatible. Make it so.
610  for (CodeGenSubRegIndex::CompMap::const_iterator
611       I = Map.begin(), E = Map.end(); I != E; ++I)
612    Vec[I->first->EnumValue - 1] = I->second;
613  return true;
614}
615
616static const char *getMinimalTypeForRange(uint64_t Range) {
617  assert(Range < 0xFFFFFFFFULL && "Enum too large");
618  if (Range > 0xFFFF)
619    return "uint32_t";
620  if (Range > 0xFF)
621    return "uint16_t";
622  return "uint8_t";
623}
624
625void
626RegisterInfoEmitter::emitComposeSubRegIndices(raw_ostream &OS,
627                                              CodeGenRegBank &RegBank,
628                                              const std::string &ClName) {
629  ArrayRef<CodeGenSubRegIndex*> SubRegIndices = RegBank.getSubRegIndices();
630  OS << "unsigned " << ClName
631     << "::composeSubRegIndicesImpl(unsigned IdxA, unsigned IdxB) const {\n";
632
633  // Many sub-register indexes are composition-compatible, meaning that
634  //
635  //   compose(IdxA, IdxB) == compose(IdxA', IdxB)
636  //
637  // for many IdxA, IdxA' pairs. Not all sub-register indexes can be composed.
638  // The illegal entries can be use as wildcards to compress the table further.
639
640  // Map each Sub-register index to a compatible table row.
641  SmallVector<unsigned, 4> RowMap;
642  SmallVector<SmallVector<CodeGenSubRegIndex*, 4>, 4> Rows;
643
644  for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
645    unsigned Found = ~0u;
646    for (unsigned r = 0, re = Rows.size(); r != re; ++r) {
647      if (combine(SubRegIndices[i], Rows[r])) {
648        Found = r;
649        break;
650      }
651    }
652    if (Found == ~0u) {
653      Found = Rows.size();
654      Rows.resize(Found + 1);
655      Rows.back().resize(SubRegIndices.size());
656      combine(SubRegIndices[i], Rows.back());
657    }
658    RowMap.push_back(Found);
659  }
660
661  // Output the row map if there is multiple rows.
662  if (Rows.size() > 1) {
663    OS << "  static const " << getMinimalTypeForRange(Rows.size())
664       << " RowMap[" << SubRegIndices.size() << "] = {\n    ";
665    for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i)
666      OS << RowMap[i] << ", ";
667    OS << "\n  };\n";
668  }
669
670  // Output the rows.
671  OS << "  static const " << getMinimalTypeForRange(SubRegIndices.size()+1)
672     << " Rows[" << Rows.size() << "][" << SubRegIndices.size() << "] = {\n";
673  for (unsigned r = 0, re = Rows.size(); r != re; ++r) {
674    OS << "    { ";
675    for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i)
676      if (Rows[r][i])
677        OS << Rows[r][i]->EnumValue << ", ";
678      else
679        OS << "0, ";
680    OS << "},\n";
681  }
682  OS << "  };\n\n";
683
684  OS << "  --IdxA; assert(IdxA < " << SubRegIndices.size() << ");\n"
685     << "  --IdxB; assert(IdxB < " << SubRegIndices.size() << ");\n";
686  if (Rows.size() > 1)
687    OS << "  return Rows[RowMap[IdxA]][IdxB];\n";
688  else
689    OS << "  return Rows[0][IdxB];\n";
690  OS << "}\n\n";
691}
692
693//
694// runMCDesc - Print out MC register descriptions.
695//
696void
697RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
698                               CodeGenRegBank &RegBank) {
699  emitSourceFileHeader("MC Register Information", OS);
700
701  OS << "\n#ifdef GET_REGINFO_MC_DESC\n";
702  OS << "#undef GET_REGINFO_MC_DESC\n";
703
704  const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
705
706  // The lists of sub-registers, super-registers, and overlaps all go in the
707  // same array. That allows us to share suffixes.
708  typedef std::vector<const CodeGenRegister*> RegVec;
709
710  // Differentially encoded lists.
711  SequenceToOffsetTable<DiffVec> DiffSeqs;
712  SmallVector<DiffVec, 4> SubRegLists(Regs.size());
713  SmallVector<DiffVec, 4> SuperRegLists(Regs.size());
714  SmallVector<DiffVec, 4> OverlapLists(Regs.size());
715  SmallVector<DiffVec, 4> RegUnitLists(Regs.size());
716  SmallVector<unsigned, 4> RegUnitInitScale(Regs.size());
717
718  // Keep track of sub-register names as well. These are not differentially
719  // encoded.
720  typedef SmallVector<const CodeGenSubRegIndex*, 4> SubRegIdxVec;
721  SequenceToOffsetTable<SubRegIdxVec> SubRegIdxSeqs;
722  SmallVector<SubRegIdxVec, 4> SubRegIdxLists(Regs.size());
723
724  SequenceToOffsetTable<std::string> RegStrings;
725
726  // Precompute register lists for the SequenceToOffsetTable.
727  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
728    const CodeGenRegister *Reg = Regs[i];
729
730    RegStrings.add(Reg->getName());
731
732    // Compute the ordered sub-register list.
733    SetVector<const CodeGenRegister*> SR;
734    Reg->addSubRegsPreOrder(SR, RegBank);
735    diffEncode(SubRegLists[i], Reg->EnumValue, SR.begin(), SR.end());
736    DiffSeqs.add(SubRegLists[i]);
737
738    // Compute the corresponding sub-register indexes.
739    SubRegIdxVec &SRIs = SubRegIdxLists[i];
740    for (unsigned j = 0, je = SR.size(); j != je; ++j)
741      SRIs.push_back(Reg->getSubRegIndex(SR[j]));
742    SubRegIdxSeqs.add(SRIs);
743
744    // Super-registers are already computed.
745    const RegVec &SuperRegList = Reg->getSuperRegs();
746    diffEncode(SuperRegLists[i], Reg->EnumValue,
747               SuperRegList.begin(), SuperRegList.end());
748    DiffSeqs.add(SuperRegLists[i]);
749
750    // The list of overlaps doesn't need to have any particular order, and Reg
751    // itself must be omitted.
752    DiffVec &OverlapList = OverlapLists[i];
753    CodeGenRegister::Set OSet;
754    Reg->computeOverlaps(OSet, RegBank);
755    OSet.erase(Reg);
756    diffEncode(OverlapList, Reg->EnumValue, OSet.begin(), OSet.end());
757    DiffSeqs.add(OverlapList);
758
759    // Differentially encode the register unit list, seeded by register number.
760    // First compute a scale factor that allows more diff-lists to be reused:
761    //
762    //   D0 -> (S0, S1)
763    //   D1 -> (S2, S3)
764    //
765    // A scale factor of 2 allows D0 and D1 to share a diff-list. The initial
766    // value for the differential decoder is the register number multiplied by
767    // the scale.
768    //
769    // Check the neighboring registers for arithmetic progressions.
770    unsigned ScaleA = ~0u, ScaleB = ~0u;
771    ArrayRef<unsigned> RUs = Reg->getNativeRegUnits();
772    if (i > 0 && Regs[i-1]->getNativeRegUnits().size() == RUs.size())
773      ScaleB = RUs.front() - Regs[i-1]->getNativeRegUnits().front();
774    if (i+1 != Regs.size() &&
775        Regs[i+1]->getNativeRegUnits().size() == RUs.size())
776      ScaleA = Regs[i+1]->getNativeRegUnits().front() - RUs.front();
777    unsigned Scale = std::min(ScaleB, ScaleA);
778    // Default the scale to 0 if it can't be encoded in 4 bits.
779    if (Scale >= 16)
780      Scale = 0;
781    RegUnitInitScale[i] = Scale;
782    DiffSeqs.add(diffEncode(RegUnitLists[i], Scale * Reg->EnumValue, RUs));
783  }
784
785  // Compute the final layout of the sequence table.
786  DiffSeqs.layout();
787  SubRegIdxSeqs.layout();
788
789  OS << "namespace llvm {\n\n";
790
791  const std::string &TargetName = Target.getName();
792
793  // Emit the shared table of differential lists.
794  OS << "extern const MCPhysReg " << TargetName << "RegDiffLists[] = {\n";
795  DiffSeqs.emit(OS, printDiff16);
796  OS << "};\n\n";
797
798  // Emit the table of sub-register indexes.
799  OS << "extern const uint16_t " << TargetName << "SubRegIdxLists[] = {\n";
800  SubRegIdxSeqs.emit(OS, printSubRegIndex);
801  OS << "};\n\n";
802
803  // Emit the string table.
804  RegStrings.layout();
805  OS << "extern const char " << TargetName << "RegStrings[] = {\n";
806  RegStrings.emit(OS, printChar);
807  OS << "};\n\n";
808
809  OS << "extern const MCRegisterDesc " << TargetName
810     << "RegDesc[] = { // Descriptors\n";
811  OS << "  { " << RegStrings.get("") << ", 0, 0, 0, 0, 0 },\n";
812
813  // Emit the register descriptors now.
814  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
815    const CodeGenRegister *Reg = Regs[i];
816    OS << "  { " << RegStrings.get(Reg->getName()) << ", "
817       << DiffSeqs.get(OverlapLists[i]) << ", "
818       << DiffSeqs.get(SubRegLists[i]) << ", "
819       << DiffSeqs.get(SuperRegLists[i]) << ", "
820       << SubRegIdxSeqs.get(SubRegIdxLists[i]) << ", "
821       << (DiffSeqs.get(RegUnitLists[i])*16 + RegUnitInitScale[i]) << " },\n";
822  }
823  OS << "};\n\n";      // End of register descriptors...
824
825  // Emit the table of register unit roots. Each regunit has one or two root
826  // registers.
827  OS << "extern const uint16_t " << TargetName << "RegUnitRoots[][2] = {\n";
828  for (unsigned i = 0, e = RegBank.getNumNativeRegUnits(); i != e; ++i) {
829    ArrayRef<const CodeGenRegister*> Roots = RegBank.getRegUnit(i).getRoots();
830    assert(!Roots.empty() && "All regunits must have a root register.");
831    assert(Roots.size() <= 2 && "More than two roots not supported yet.");
832    OS << "  { " << getQualifiedName(Roots.front()->TheDef);
833    for (unsigned r = 1; r != Roots.size(); ++r)
834      OS << ", " << getQualifiedName(Roots[r]->TheDef);
835    OS << " },\n";
836  }
837  OS << "};\n\n";
838
839  ArrayRef<CodeGenRegisterClass*> RegisterClasses = RegBank.getRegClasses();
840
841  // Loop over all of the register classes... emitting each one.
842  OS << "namespace {     // Register classes...\n";
843
844  // Emit the register enum value arrays for each RegisterClass
845  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
846    const CodeGenRegisterClass &RC = *RegisterClasses[rc];
847    ArrayRef<Record*> Order = RC.getOrder();
848
849    // Give the register class a legal C name if it's anonymous.
850    std::string Name = RC.getName();
851
852    // Emit the register list now.
853    OS << "  // " << Name << " Register Class...\n"
854       << "  const uint16_t " << Name
855       << "[] = {\n    ";
856    for (unsigned i = 0, e = Order.size(); i != e; ++i) {
857      Record *Reg = Order[i];
858      OS << getQualifiedName(Reg) << ", ";
859    }
860    OS << "\n  };\n\n";
861
862    OS << "  // " << Name << " Bit set.\n"
863       << "  const uint8_t " << Name
864       << "Bits[] = {\n    ";
865    BitVectorEmitter BVE;
866    for (unsigned i = 0, e = Order.size(); i != e; ++i) {
867      Record *Reg = Order[i];
868      BVE.add(Target.getRegBank().getReg(Reg)->EnumValue);
869    }
870    BVE.print(OS);
871    OS << "\n  };\n\n";
872
873  }
874  OS << "}\n\n";
875
876  OS << "extern const MCRegisterClass " << TargetName
877     << "MCRegisterClasses[] = {\n";
878
879  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
880    const CodeGenRegisterClass &RC = *RegisterClasses[rc];
881
882    // Asserts to make sure values will fit in table assuming types from
883    // MCRegisterInfo.h
884    assert((RC.SpillSize/8) <= 0xffff && "SpillSize too large.");
885    assert((RC.SpillAlignment/8) <= 0xffff && "SpillAlignment too large.");
886    assert(RC.CopyCost >= -128 && RC.CopyCost <= 127 && "Copy cost too large.");
887
888    OS << "  { " << '\"' << RC.getName() << "\", "
889       << RC.getName() << ", " << RC.getName() << "Bits, "
890       << RC.getOrder().size() << ", sizeof(" << RC.getName() << "Bits), "
891       << RC.getQualifiedName() + "RegClassID" << ", "
892       << RC.SpillSize/8 << ", "
893       << RC.SpillAlignment/8 << ", "
894       << RC.CopyCost << ", "
895       << RC.Allocatable << " },\n";
896  }
897
898  OS << "};\n\n";
899
900  ArrayRef<CodeGenSubRegIndex*> SubRegIndices = RegBank.getSubRegIndices();
901
902  EmitRegMappingTables(OS, Regs, false);
903
904  // Emit Reg encoding table
905  OS << "extern const uint16_t " << TargetName;
906  OS << "RegEncodingTable[] = {\n";
907  // Add entry for NoRegister
908  OS << "  0,\n";
909  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
910    Record *Reg = Regs[i]->TheDef;
911    BitsInit *BI = Reg->getValueAsBitsInit("HWEncoding");
912    uint64_t Value = 0;
913    for (unsigned b = 0, be = BI->getNumBits(); b != be; ++b) {
914      if (BitInit *B = dyn_cast<BitInit>(BI->getBit(b)))
915      Value |= (uint64_t)B->getValue() << b;
916    }
917    OS << "  " << Value << ",\n";
918  }
919  OS << "};\n";       // End of HW encoding table
920
921  // MCRegisterInfo initialization routine.
922  OS << "static inline void Init" << TargetName
923     << "MCRegisterInfo(MCRegisterInfo *RI, unsigned RA, "
924     << "unsigned DwarfFlavour = 0, unsigned EHFlavour = 0, unsigned PC = 0) {\n"
925     << "  RI->InitMCRegisterInfo(" << TargetName << "RegDesc, "
926     << Regs.size()+1 << ", RA, PC, " << TargetName << "MCRegisterClasses, "
927     << RegisterClasses.size() << ", "
928     << TargetName << "RegUnitRoots, "
929     << RegBank.getNumNativeRegUnits() << ", "
930     << TargetName << "RegDiffLists, "
931     << TargetName << "RegStrings, "
932     << TargetName << "SubRegIdxLists, "
933     << (SubRegIndices.size() + 1) << ",\n"
934     << "  " << TargetName << "RegEncodingTable);\n\n";
935
936  EmitRegMapping(OS, Regs, false);
937
938  OS << "}\n\n";
939
940  OS << "} // End llvm namespace \n";
941  OS << "#endif // GET_REGINFO_MC_DESC\n\n";
942}
943
944void
945RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
946                                     CodeGenRegBank &RegBank) {
947  emitSourceFileHeader("Register Information Header Fragment", OS);
948
949  OS << "\n#ifdef GET_REGINFO_HEADER\n";
950  OS << "#undef GET_REGINFO_HEADER\n";
951
952  const std::string &TargetName = Target.getName();
953  std::string ClassName = TargetName + "GenRegisterInfo";
954
955  OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n\n";
956
957  OS << "namespace llvm {\n\n";
958
959  OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
960     << "  explicit " << ClassName
961     << "(unsigned RA, unsigned D = 0, unsigned E = 0, unsigned PC = 0);\n"
962     << "  virtual bool needsStackRealignment(const MachineFunction &) const\n"
963     << "     { return false; }\n";
964  if (!RegBank.getSubRegIndices().empty()) {
965    OS << "  virtual unsigned composeSubRegIndicesImpl"
966       << "(unsigned, unsigned) const;\n"
967      << "  virtual const TargetRegisterClass *"
968      "getSubClassWithSubReg(const TargetRegisterClass*, unsigned) const;\n";
969  }
970  OS << "  virtual const RegClassWeight &getRegClassWeight("
971     << "const TargetRegisterClass *RC) const;\n"
972     << "  virtual unsigned getRegUnitWeight(unsigned RegUnit) const;\n"
973     << "  virtual unsigned getNumRegPressureSets() const;\n"
974     << "  virtual const char *getRegPressureSetName(unsigned Idx) const;\n"
975     << "  virtual unsigned getRegPressureSetLimit(unsigned Idx) const;\n"
976     << "  virtual const int *getRegClassPressureSets("
977     << "const TargetRegisterClass *RC) const;\n"
978     << "  virtual const int *getRegUnitPressureSets(unsigned RegUnit) const;\n"
979     << "};\n\n";
980
981  ArrayRef<CodeGenRegisterClass*> RegisterClasses = RegBank.getRegClasses();
982
983  if (!RegisterClasses.empty()) {
984    OS << "namespace " << RegisterClasses[0]->Namespace
985       << " { // Register classes\n";
986
987    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
988      const CodeGenRegisterClass &RC = *RegisterClasses[i];
989      const std::string &Name = RC.getName();
990
991      // Output the extern for the instance.
992      OS << "  extern const TargetRegisterClass " << Name << "RegClass;\n";
993    }
994    OS << "} // end of namespace " << TargetName << "\n\n";
995  }
996  OS << "} // End llvm namespace \n";
997  OS << "#endif // GET_REGINFO_HEADER\n\n";
998}
999
1000//
1001// runTargetDesc - Output the target register and register file descriptions.
1002//
1003void
1004RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
1005                                   CodeGenRegBank &RegBank){
1006  emitSourceFileHeader("Target Register and Register Classes Information", OS);
1007
1008  OS << "\n#ifdef GET_REGINFO_TARGET_DESC\n";
1009  OS << "#undef GET_REGINFO_TARGET_DESC\n";
1010
1011  OS << "namespace llvm {\n\n";
1012
1013  // Get access to MCRegisterClass data.
1014  OS << "extern const MCRegisterClass " << Target.getName()
1015     << "MCRegisterClasses[];\n";
1016
1017  // Start out by emitting each of the register classes.
1018  ArrayRef<CodeGenRegisterClass*> RegisterClasses = RegBank.getRegClasses();
1019  ArrayRef<CodeGenSubRegIndex*> SubRegIndices = RegBank.getSubRegIndices();
1020
1021  // Collect all registers belonging to any allocatable class.
1022  std::set<Record*> AllocatableRegs;
1023
1024  // Collect allocatable registers.
1025  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
1026    const CodeGenRegisterClass &RC = *RegisterClasses[rc];
1027    ArrayRef<Record*> Order = RC.getOrder();
1028
1029    if (RC.Allocatable)
1030      AllocatableRegs.insert(Order.begin(), Order.end());
1031  }
1032
1033  // Build a shared array of value types.
1034  SequenceToOffsetTable<std::vector<MVT::SimpleValueType> > VTSeqs;
1035  for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc)
1036    VTSeqs.add(RegisterClasses[rc]->VTs);
1037  VTSeqs.layout();
1038  OS << "\nstatic const MVT::SimpleValueType VTLists[] = {\n";
1039  VTSeqs.emit(OS, printSimpleValueType, "MVT::Other");
1040  OS << "};\n";
1041
1042  // Emit SubRegIndex names, skipping 0.
1043  OS << "\nstatic const char *const SubRegIndexNameTable[] = { \"";
1044  for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
1045    OS << SubRegIndices[i]->getName();
1046    if (i + 1 != e)
1047      OS << "\", \"";
1048  }
1049  OS << "\" };\n\n";
1050
1051  // Emit SubRegIndex lane masks, including 0.
1052  OS << "\nstatic const unsigned SubRegIndexLaneMaskTable[] = {\n  ~0u,\n";
1053  for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
1054    OS << format("  0x%08x, // ", SubRegIndices[i]->LaneMask)
1055       << SubRegIndices[i]->getName() << '\n';
1056  }
1057  OS << " };\n\n";
1058
1059  OS << "\n";
1060
1061  // Now that all of the structs have been emitted, emit the instances.
1062  if (!RegisterClasses.empty()) {
1063    OS << "\nstatic const TargetRegisterClass *const "
1064       << "NullRegClasses[] = { NULL };\n\n";
1065
1066    // Emit register class bit mask tables. The first bit mask emitted for a
1067    // register class, RC, is the set of sub-classes, including RC itself.
1068    //
1069    // If RC has super-registers, also create a list of subreg indices and bit
1070    // masks, (Idx, Mask). The bit mask has a bit for every superreg regclass,
1071    // SuperRC, that satisfies:
1072    //
1073    //   For all SuperReg in SuperRC: SuperReg:Idx in RC
1074    //
1075    // The 0-terminated list of subreg indices starts at:
1076    //
1077    //   RC->getSuperRegIndices() = SuperRegIdxSeqs + ...
1078    //
1079    // The corresponding bitmasks follow the sub-class mask in memory. Each
1080    // mask has RCMaskWords uint32_t entries.
1081    //
1082    // Every bit mask present in the list has at least one bit set.
1083
1084    // Compress the sub-reg index lists.
1085    typedef std::vector<const CodeGenSubRegIndex*> IdxList;
1086    SmallVector<IdxList, 8> SuperRegIdxLists(RegisterClasses.size());
1087    SequenceToOffsetTable<IdxList> SuperRegIdxSeqs;
1088    BitVector MaskBV(RegisterClasses.size());
1089
1090    for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
1091      const CodeGenRegisterClass &RC = *RegisterClasses[rc];
1092      OS << "static const uint32_t " << RC.getName() << "SubClassMask[] = {\n  ";
1093      printBitVectorAsHex(OS, RC.getSubClasses(), 32);
1094
1095      // Emit super-reg class masks for any relevant SubRegIndices that can
1096      // project into RC.
1097      IdxList &SRIList = SuperRegIdxLists[rc];
1098      for (unsigned sri = 0, sre = SubRegIndices.size(); sri != sre; ++sri) {
1099        CodeGenSubRegIndex *Idx = SubRegIndices[sri];
1100        MaskBV.reset();
1101        RC.getSuperRegClasses(Idx, MaskBV);
1102        if (MaskBV.none())
1103          continue;
1104        SRIList.push_back(Idx);
1105        OS << "\n  ";
1106        printBitVectorAsHex(OS, MaskBV, 32);
1107        OS << "// " << Idx->getName();
1108      }
1109      SuperRegIdxSeqs.add(SRIList);
1110      OS << "\n};\n\n";
1111    }
1112
1113    OS << "static const uint16_t SuperRegIdxSeqs[] = {\n";
1114    SuperRegIdxSeqs.layout();
1115    SuperRegIdxSeqs.emit(OS, printSubRegIndex);
1116    OS << "};\n\n";
1117
1118    // Emit NULL terminated super-class lists.
1119    for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
1120      const CodeGenRegisterClass &RC = *RegisterClasses[rc];
1121      ArrayRef<CodeGenRegisterClass*> Supers = RC.getSuperClasses();
1122
1123      // Skip classes without supers.  We can reuse NullRegClasses.
1124      if (Supers.empty())
1125        continue;
1126
1127      OS << "static const TargetRegisterClass *const "
1128         << RC.getName() << "Superclasses[] = {\n";
1129      for (unsigned i = 0; i != Supers.size(); ++i)
1130        OS << "  &" << Supers[i]->getQualifiedName() << "RegClass,\n";
1131      OS << "  NULL\n};\n\n";
1132    }
1133
1134    // Emit methods.
1135    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
1136      const CodeGenRegisterClass &RC = *RegisterClasses[i];
1137      if (!RC.AltOrderSelect.empty()) {
1138        OS << "\nstatic inline unsigned " << RC.getName()
1139           << "AltOrderSelect(const MachineFunction &MF) {"
1140           << RC.AltOrderSelect << "}\n\n"
1141           << "static ArrayRef<MCPhysReg> " << RC.getName()
1142           << "GetRawAllocationOrder(const MachineFunction &MF) {\n";
1143        for (unsigned oi = 1 , oe = RC.getNumOrders(); oi != oe; ++oi) {
1144          ArrayRef<Record*> Elems = RC.getOrder(oi);
1145          if (!Elems.empty()) {
1146            OS << "  static const MCPhysReg AltOrder" << oi << "[] = {";
1147            for (unsigned elem = 0; elem != Elems.size(); ++elem)
1148              OS << (elem ? ", " : " ") << getQualifiedName(Elems[elem]);
1149            OS << " };\n";
1150          }
1151        }
1152        OS << "  const MCRegisterClass &MCR = " << Target.getName()
1153           << "MCRegisterClasses[" << RC.getQualifiedName() + "RegClassID];\n"
1154           << "  const ArrayRef<MCPhysReg> Order[] = {\n"
1155           << "    makeArrayRef(MCR.begin(), MCR.getNumRegs()";
1156        for (unsigned oi = 1, oe = RC.getNumOrders(); oi != oe; ++oi)
1157          if (RC.getOrder(oi).empty())
1158            OS << "),\n    ArrayRef<MCPhysReg>(";
1159          else
1160            OS << "),\n    makeArrayRef(AltOrder" << oi;
1161        OS << ")\n  };\n  const unsigned Select = " << RC.getName()
1162           << "AltOrderSelect(MF);\n  assert(Select < " << RC.getNumOrders()
1163           << ");\n  return Order[Select];\n}\n";
1164        }
1165    }
1166
1167    // Now emit the actual value-initialized register class instances.
1168    OS << "namespace " << RegisterClasses[0]->Namespace
1169       << " {   // Register class instances\n";
1170
1171    for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
1172      const CodeGenRegisterClass &RC = *RegisterClasses[i];
1173      OS << "  extern const TargetRegisterClass "
1174         << RegisterClasses[i]->getName() << "RegClass = {\n    "
1175         << '&' << Target.getName() << "MCRegisterClasses[" << RC.getName()
1176         << "RegClassID],\n    "
1177         << "VTLists + " << VTSeqs.get(RC.VTs) << ",\n    "
1178         << RC.getName() << "SubClassMask,\n    SuperRegIdxSeqs + "
1179         << SuperRegIdxSeqs.get(SuperRegIdxLists[i]) << ",\n    ";
1180      if (RC.getSuperClasses().empty())
1181        OS << "NullRegClasses,\n    ";
1182      else
1183        OS << RC.getName() << "Superclasses,\n    ";
1184      if (RC.AltOrderSelect.empty())
1185        OS << "0\n";
1186      else
1187        OS << RC.getName() << "GetRawAllocationOrder\n";
1188      OS << "  };\n\n";
1189    }
1190
1191    OS << "}\n";
1192  }
1193
1194  OS << "\nnamespace {\n";
1195  OS << "  const TargetRegisterClass* const RegisterClasses[] = {\n";
1196  for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i)
1197    OS << "    &" << RegisterClasses[i]->getQualifiedName()
1198       << "RegClass,\n";
1199  OS << "  };\n";
1200  OS << "}\n";       // End of anonymous namespace...
1201
1202  // Emit extra information about registers.
1203  const std::string &TargetName = Target.getName();
1204  OS << "\nstatic const TargetRegisterInfoDesc "
1205     << TargetName << "RegInfoDesc[] = { // Extra Descriptors\n";
1206  OS << "  { 0, 0 },\n";
1207
1208  const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
1209  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
1210    const CodeGenRegister &Reg = *Regs[i];
1211    OS << "  { ";
1212    OS << Reg.CostPerUse << ", "
1213       << int(AllocatableRegs.count(Reg.TheDef)) << " },\n";
1214  }
1215  OS << "};\n";      // End of register descriptors...
1216
1217
1218  std::string ClassName = Target.getName() + "GenRegisterInfo";
1219
1220  if (!SubRegIndices.empty())
1221    emitComposeSubRegIndices(OS, RegBank, ClassName);
1222
1223  // Emit getSubClassWithSubReg.
1224  if (!SubRegIndices.empty()) {
1225    OS << "const TargetRegisterClass *" << ClassName
1226       << "::getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx)"
1227       << " const {\n";
1228    // Use the smallest type that can hold a regclass ID with room for a
1229    // sentinel.
1230    if (RegisterClasses.size() < UINT8_MAX)
1231      OS << "  static const uint8_t Table[";
1232    else if (RegisterClasses.size() < UINT16_MAX)
1233      OS << "  static const uint16_t Table[";
1234    else
1235      PrintFatalError("Too many register classes.");
1236    OS << RegisterClasses.size() << "][" << SubRegIndices.size() << "] = {\n";
1237    for (unsigned rci = 0, rce = RegisterClasses.size(); rci != rce; ++rci) {
1238      const CodeGenRegisterClass &RC = *RegisterClasses[rci];
1239      OS << "    {\t// " << RC.getName() << "\n";
1240      for (unsigned sri = 0, sre = SubRegIndices.size(); sri != sre; ++sri) {
1241        CodeGenSubRegIndex *Idx = SubRegIndices[sri];
1242        if (CodeGenRegisterClass *SRC = RC.getSubClassWithSubReg(Idx))
1243          OS << "      " << SRC->EnumValue + 1 << ",\t// " << Idx->getName()
1244             << " -> " << SRC->getName() << "\n";
1245        else
1246          OS << "      0,\t// " << Idx->getName() << "\n";
1247      }
1248      OS << "    },\n";
1249    }
1250    OS << "  };\n  assert(RC && \"Missing regclass\");\n"
1251       << "  if (!Idx) return RC;\n  --Idx;\n"
1252       << "  assert(Idx < " << SubRegIndices.size() << " && \"Bad subreg\");\n"
1253       << "  unsigned TV = Table[RC->getID()][Idx];\n"
1254       << "  return TV ? getRegClass(TV - 1) : 0;\n}\n\n";
1255  }
1256
1257  EmitRegUnitPressure(OS, RegBank, ClassName);
1258
1259  // Emit the constructor of the class...
1260  OS << "extern const MCRegisterDesc " << TargetName << "RegDesc[];\n";
1261  OS << "extern const MCPhysReg " << TargetName << "RegDiffLists[];\n";
1262  OS << "extern const char " << TargetName << "RegStrings[];\n";
1263  OS << "extern const uint16_t " << TargetName << "RegUnitRoots[][2];\n";
1264  OS << "extern const uint16_t " << TargetName << "SubRegIdxLists[];\n";
1265  OS << "extern const uint16_t " << TargetName << "RegEncodingTable[];\n";
1266
1267  EmitRegMappingTables(OS, Regs, true);
1268
1269  OS << ClassName << "::\n" << ClassName
1270     << "(unsigned RA, unsigned DwarfFlavour, unsigned EHFlavour, unsigned PC)\n"
1271     << "  : TargetRegisterInfo(" << TargetName << "RegInfoDesc"
1272     << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n"
1273     << "             SubRegIndexNameTable, SubRegIndexLaneMaskTable) {\n"
1274     << "  InitMCRegisterInfo(" << TargetName << "RegDesc, "
1275     << Regs.size()+1 << ", RA, PC,\n                     " << TargetName
1276     << "MCRegisterClasses, " << RegisterClasses.size() << ",\n"
1277     << "                     " << TargetName << "RegUnitRoots,\n"
1278     << "                     " << RegBank.getNumNativeRegUnits() << ",\n"
1279     << "                     " << TargetName << "RegDiffLists,\n"
1280     << "                     " << TargetName << "RegStrings,\n"
1281     << "                     " << TargetName << "SubRegIdxLists,\n"
1282     << "                     " << SubRegIndices.size() + 1 << ",\n"
1283     << "                     " << TargetName << "RegEncodingTable);\n\n";
1284
1285  EmitRegMapping(OS, Regs, true);
1286
1287  OS << "}\n\n";
1288
1289
1290  // Emit CalleeSavedRegs information.
1291  std::vector<Record*> CSRSets =
1292    Records.getAllDerivedDefinitions("CalleeSavedRegs");
1293  for (unsigned i = 0, e = CSRSets.size(); i != e; ++i) {
1294    Record *CSRSet = CSRSets[i];
1295    const SetTheory::RecVec *Regs = RegBank.getSets().expand(CSRSet);
1296    assert(Regs && "Cannot expand CalleeSavedRegs instance");
1297
1298    // Emit the *_SaveList list of callee-saved registers.
1299    OS << "static const MCPhysReg " << CSRSet->getName()
1300       << "_SaveList[] = { ";
1301    for (unsigned r = 0, re = Regs->size(); r != re; ++r)
1302      OS << getQualifiedName((*Regs)[r]) << ", ";
1303    OS << "0 };\n";
1304
1305    // Emit the *_RegMask bit mask of call-preserved registers.
1306    OS << "static const uint32_t " << CSRSet->getName()
1307       << "_RegMask[] = { ";
1308    printBitVectorAsHex(OS, RegBank.computeCoveredRegisters(*Regs), 32);
1309    OS << "};\n";
1310  }
1311  OS << "\n\n";
1312
1313  OS << "} // End llvm namespace \n";
1314  OS << "#endif // GET_REGINFO_TARGET_DESC\n\n";
1315}
1316
1317void RegisterInfoEmitter::run(raw_ostream &OS) {
1318  CodeGenTarget Target(Records);
1319  CodeGenRegBank &RegBank = Target.getRegBank();
1320  RegBank.computeDerivedInfo();
1321
1322  runEnums(OS, Target, RegBank);
1323  runMCDesc(OS, Target, RegBank);
1324  runTargetHeader(OS, Target, RegBank);
1325  runTargetDesc(OS, Target, RegBank);
1326}
1327
1328namespace llvm {
1329
1330void EmitRegisterInfo(RecordKeeper &RK, raw_ostream &OS) {
1331  RegisterInfoEmitter(RK).run(OS);
1332}
1333
1334} // End llvm namespace
1335