Add support for alternative register names, useful for instructions whose operands...
[oota-llvm.git] / utils / TableGen / RegisterInfoEmitter.cpp
1 //===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This tablegen backend is responsible for emitting a description of a target
11 // register file for a code generator.  It uses instances of the Register,
12 // RegisterAliases, and RegisterClass classes to gather this information.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "RegisterInfoEmitter.h"
17 #include "CodeGenTarget.h"
18 #include "CodeGenRegisters.h"
19 #include "Record.h"
20 #include "llvm/ADT/StringExtras.h"
21 #include "llvm/ADT/STLExtras.h"
22 #include "llvm/Support/Format.h"
23 #include <algorithm>
24 #include <set>
25 using namespace llvm;
26
27 // runEnums - Print out enum values for all of the registers.
28 void
29 RegisterInfoEmitter::runEnums(raw_ostream &OS,
30                               CodeGenTarget &Target, CodeGenRegBank &Bank) {
31   const std::vector<CodeGenRegister*> &Registers = Bank.getRegisters();
32
33   std::string Namespace = Registers[0]->TheDef->getValueAsString("Namespace");
34
35   EmitSourceFileHeader("Target Register Enum Values", OS);
36
37   OS << "\n#ifdef GET_REGINFO_ENUM\n";
38   OS << "#undef GET_REGINFO_ENUM\n";
39
40   OS << "namespace llvm {\n\n";
41
42   if (!Namespace.empty())
43     OS << "namespace " << Namespace << " {\n";
44   OS << "enum {\n  NoRegister,\n";
45
46   for (unsigned i = 0, e = Registers.size(); i != e; ++i)
47     OS << "  " << Registers[i]->getName() << " = " <<
48       Registers[i]->EnumValue << ",\n";
49   assert(Registers.size() == Registers[Registers.size()-1]->EnumValue &&
50          "Register enum value mismatch!");
51   OS << "  NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n";
52   OS << "};\n";
53   if (!Namespace.empty())
54     OS << "}\n";
55
56   const std::vector<CodeGenRegisterClass> &RegisterClasses =
57     Target.getRegisterClasses();
58   if (!RegisterClasses.empty()) {
59     OS << "\n// Register classes\n";
60     OS << "namespace " << RegisterClasses[0].Namespace << " {\n";
61     OS << "enum {\n";
62     for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
63       if (i) OS << ",\n";
64       OS << "  " << RegisterClasses[i].getName() << "RegClassID";
65       OS << " = " << i;
66     }
67     OS << "\n  };\n";
68     OS << "}\n";
69   }
70
71   OS << "} // End llvm namespace \n";
72   OS << "#endif // GET_REGINFO_ENUM\n\n";
73 }
74
75 //
76 // runMCDesc - Print out MC register descriptions.
77 //
78 void
79 RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
80                                CodeGenRegBank &RegBank) {
81   EmitSourceFileHeader("MC Register Information", OS);
82
83   OS << "\n#ifdef GET_REGINFO_MC_DESC\n";
84   OS << "#undef GET_REGINFO_MC_DESC\n";
85
86   std::map<const CodeGenRegister*, CodeGenRegister::Set> Overlaps;
87   RegBank.computeOverlaps(Overlaps);
88
89   OS << "namespace llvm {\n\n";
90
91   const std::string &TargetName = Target.getName();
92   std::string ClassName = TargetName + "GenMCRegisterInfo";
93   OS << "struct " << ClassName << " : public MCRegisterInfo {\n"
94      << "  explicit " << ClassName << "(const MCRegisterDesc *D);\n";
95   OS << "};\n";
96
97   OS << "\nnamespace {\n";
98
99   const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
100
101   // Emit an overlap list for all registers.
102   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
103     const CodeGenRegister *Reg = Regs[i];
104     const CodeGenRegister::Set &O = Overlaps[Reg];
105     // Move Reg to the front so TRI::getAliasSet can share the list.
106     OS << "  const unsigned " << Reg->getName() << "_Overlaps[] = { "
107        << getQualifiedName(Reg->TheDef) << ", ";
108     for (CodeGenRegister::Set::const_iterator I = O.begin(), E = O.end();
109          I != E; ++I)
110       if (*I != Reg)
111         OS << getQualifiedName((*I)->TheDef) << ", ";
112     OS << "0 };\n";
113   }
114
115   const std::vector<Record*> RegAltNameIndices = Target.getRegAltNameIndices();
116   // If the only definition is the default NoRegAltName, we don't need to
117   // emit anything.
118   if (RegAltNameIndices.size() > 1) {
119     OS << "\n// Register alternate name indices\n";
120     OS << "enum {\n";
121     for (unsigned i = 0, e = RegAltNameIndices.size(); i != e; ++i)
122       OS << "  " << RegAltNameIndices[i]->getName() << ",\t// " << i << "\n";
123     OS << "  NUM_TARGET_REG_ALT_NAMES = " << RegAltNameIndices.size() << "\n";
124     OS << "};\n";
125   }
126
127   // Emit the empty sub-registers list
128   OS << "  const unsigned Empty_SubRegsSet[] = { 0 };\n";
129   // Loop over all of the registers which have sub-registers, emitting the
130   // sub-registers list to memory.
131   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
132     const CodeGenRegister &Reg = *Regs[i];
133     if (Reg.getSubRegs().empty())
134      continue;
135     // getSubRegs() orders by SubRegIndex. We want a topological order.
136     SetVector<CodeGenRegister*> SR;
137     Reg.addSubRegsPreOrder(SR);
138     OS << "  const unsigned " << Reg.getName() << "_SubRegsSet[] = { ";
139     for (unsigned j = 0, je = SR.size(); j != je; ++j)
140       OS << getQualifiedName(SR[j]->TheDef) << ", ";
141     OS << "0 };\n";
142   }
143
144   // Emit the empty super-registers list
145   OS << "  const unsigned Empty_SuperRegsSet[] = { 0 };\n";
146   // Loop over all of the registers which have super-registers, emitting the
147   // super-registers list to memory.
148   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
149     const CodeGenRegister &Reg = *Regs[i];
150     const CodeGenRegister::SuperRegList &SR = Reg.getSuperRegs();
151     if (SR.empty())
152       continue;
153     OS << "  const unsigned " << Reg.getName() << "_SuperRegsSet[] = { ";
154     for (unsigned j = 0, je = SR.size(); j != je; ++j)
155       OS << getQualifiedName(SR[j]->TheDef) << ", ";
156     OS << "0 };\n";
157   }
158
159   OS << "\n  const MCRegisterDesc " << TargetName
160      << "RegDesc[] = { // Descriptors\n";
161   OS << "    { \"NOREG\",\t0,\t0,\t0 },\n";
162
163   // Now that register alias and sub-registers sets have been emitted, emit the
164   // register descriptors now.
165   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
166     const CodeGenRegister &Reg = *Regs[i];
167     OS << "    { \"";
168     OS << Reg.getName() << "\",\t" << Reg.getName() << "_Overlaps,\t";
169     if (!Reg.getSubRegs().empty())
170       OS << Reg.getName() << "_SubRegsSet,\t";
171     else
172       OS << "Empty_SubRegsSet,\t";
173     if (!Reg.getSuperRegs().empty())
174       OS << Reg.getName() << "_SuperRegsSet";
175     else
176       OS << "Empty_SuperRegsSet";
177     OS << " },\n";
178   }
179   OS << "  };\n";      // End of register descriptors...
180
181   OS << "}\n\n";       // End of anonymous namespace...
182
183   // MCRegisterInfo initialization routine.
184   OS << "static inline void Init" << TargetName
185      << "MCRegisterInfo(MCRegisterInfo *RI) {\n";
186   OS << "  RI->InitMCRegisterInfo(" << TargetName << "RegDesc, "
187      << Regs.size()+1 << ");\n}\n\n";
188
189   OS << "} // End llvm namespace \n";
190   OS << "#endif // GET_REGINFO_MC_DESC\n\n";
191 }
192
193 void
194 RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target,
195                                      CodeGenRegBank &RegBank) {
196   EmitSourceFileHeader("Register Information Header Fragment", OS);
197
198   OS << "\n#ifdef GET_REGINFO_HEADER\n";
199   OS << "#undef GET_REGINFO_HEADER\n";
200
201   const std::string &TargetName = Target.getName();
202   std::string ClassName = TargetName + "GenRegisterInfo";
203
204   OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n";
205   OS << "#include <string>\n\n";
206
207   OS << "namespace llvm {\n\n";
208
209   OS << "struct " << ClassName << " : public TargetRegisterInfo {\n"
210      << "  explicit " << ClassName
211      << "(const MCRegisterDesc *D, const TargetRegisterInfoDesc *ID, "
212      << "int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
213      << "  virtual int getDwarfRegNumFull(unsigned RegNum, "
214      << "unsigned Flavour) const;\n"
215      << "  virtual int getLLVMRegNumFull(unsigned DwarfRegNum, "
216      << "unsigned Flavour) const;\n"
217      << "  virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;\n"
218      << "  virtual bool needsStackRealignment(const MachineFunction &) const\n"
219      << "     { return false; }\n"
220      << "  unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n"
221      << "  unsigned getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const;\n"
222      << "  unsigned composeSubRegIndices(unsigned, unsigned) const;\n"
223      << "};\n\n";
224
225   const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices();
226   if (!SubRegIndices.empty()) {
227     OS << "\n// Subregister indices\n";
228     std::string Namespace = SubRegIndices[0]->getValueAsString("Namespace");
229     if (!Namespace.empty())
230       OS << "namespace " << Namespace << " {\n";
231     OS << "enum {\n  NoSubRegister,\n";
232     for (unsigned i = 0, e = RegBank.getNumNamedIndices(); i != e; ++i)
233       OS << "  " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
234     OS << "  NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices.size()+1 << "\n";
235     OS << "};\n";
236     if (!Namespace.empty())
237       OS << "}\n";
238   }
239
240   const std::vector<CodeGenRegisterClass> &RegisterClasses =
241     Target.getRegisterClasses();
242
243   if (!RegisterClasses.empty()) {
244     OS << "namespace " << RegisterClasses[0].Namespace
245        << " { // Register classes\n";
246
247     for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
248       const CodeGenRegisterClass &RC = RegisterClasses[i];
249       const std::string &Name = RC.getName();
250
251       // Output the register class definition.
252       OS << "  struct " << Name << "Class : public TargetRegisterClass {\n"
253          << "    " << Name << "Class();\n";
254       if (!RC.AltOrderSelect.empty())
255         OS << "    ArrayRef<unsigned> "
256               "getRawAllocationOrder(const MachineFunction&) const;\n";
257       OS << "  };\n";
258
259       // Output the extern for the instance.
260       OS << "  extern " << Name << "Class\t" << Name << "RegClass;\n";
261       // Output the extern for the pointer to the instance (should remove).
262       OS << "  static TargetRegisterClass * const "<< Name <<"RegisterClass = &"
263          << Name << "RegClass;\n";
264     }
265     OS << "} // end of namespace " << TargetName << "\n\n";
266   }
267   OS << "} // End llvm namespace \n";
268   OS << "#endif // GET_REGINFO_HEADER\n\n";
269 }
270
271 //
272 // runTargetDesc - Output the target register and register file descriptions.
273 //
274 void
275 RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
276                                    CodeGenRegBank &RegBank){
277   EmitSourceFileHeader("Target Register and Register Classes Information", OS);
278
279   OS << "\n#ifdef GET_REGINFO_TARGET_DESC\n";
280   OS << "#undef GET_REGINFO_TARGET_DESC\n";
281
282   OS << "namespace llvm {\n\n";
283
284   // Start out by emitting each of the register classes.
285   const std::vector<CodeGenRegisterClass> &RegisterClasses =
286     Target.getRegisterClasses();
287
288   // Collect all registers belonging to any allocatable class.
289   std::set<Record*> AllocatableRegs;
290
291   // Loop over all of the register classes... emitting each one.
292   OS << "namespace {     // Register classes...\n";
293
294   // Emit the register enum value arrays for each RegisterClass
295   for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
296     const CodeGenRegisterClass &RC = RegisterClasses[rc];
297     ArrayRef<Record*> Order = RC.getOrder();
298
299     // Collect allocatable registers.
300     if (RC.Allocatable)
301       AllocatableRegs.insert(Order.begin(), Order.end());
302
303     // Give the register class a legal C name if it's anonymous.
304     std::string Name = RC.getName();
305
306     // Emit the register list now.
307     OS << "  // " << Name << " Register Class...\n"
308        << "  static const unsigned " << Name
309        << "[] = {\n    ";
310     for (unsigned i = 0, e = Order.size(); i != e; ++i) {
311       Record *Reg = Order[i];
312       OS << getQualifiedName(Reg) << ", ";
313     }
314     OS << "\n  };\n\n";
315   }
316
317   // Emit the ValueType arrays for each RegisterClass
318   for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
319     const CodeGenRegisterClass &RC = RegisterClasses[rc];
320
321     // Give the register class a legal C name if it's anonymous.
322     std::string Name = RC.getName() + "VTs";
323
324     // Emit the register list now.
325     OS << "  // " << Name
326        << " Register Class Value Types...\n"
327        << "  static const EVT " << Name
328        << "[] = {\n    ";
329     for (unsigned i = 0, e = RC.VTs.size(); i != e; ++i)
330       OS << getEnumName(RC.VTs[i]) << ", ";
331     OS << "MVT::Other\n  };\n\n";
332   }
333   OS << "}  // end anonymous namespace\n\n";
334
335   // Now that all of the structs have been emitted, emit the instances.
336   if (!RegisterClasses.empty()) {
337     OS << "namespace " << RegisterClasses[0].Namespace
338        << " {   // Register class instances\n";
339     for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i)
340       OS << "  " << RegisterClasses[i].getName()  << "Class\t"
341          << RegisterClasses[i].getName() << "RegClass;\n";
342
343     std::map<unsigned, std::set<unsigned> > SuperClassMap;
344     std::map<unsigned, std::set<unsigned> > SuperRegClassMap;
345     OS << "\n";
346
347     unsigned NumSubRegIndices = RegBank.getSubRegIndices().size();
348
349     if (NumSubRegIndices) {
350       // Emit the sub-register classes for each RegisterClass
351       for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
352         const CodeGenRegisterClass &RC = RegisterClasses[rc];
353         std::vector<Record*> SRC(NumSubRegIndices);
354         for (DenseMap<Record*,Record*>::const_iterator
355              i = RC.SubRegClasses.begin(),
356              e = RC.SubRegClasses.end(); i != e; ++i) {
357           // Build SRC array.
358           unsigned idx = RegBank.getSubRegIndexNo(i->first);
359           SRC.at(idx-1) = i->second;
360
361           // Find the register class number of i->second for SuperRegClassMap.
362           for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
363             const CodeGenRegisterClass &RC2 =  RegisterClasses[rc2];
364             if (RC2.TheDef == i->second) {
365               SuperRegClassMap[rc2].insert(rc);
366               break;
367             }
368           }
369         }
370
371         // Give the register class a legal C name if it's anonymous.
372         std::string Name = RC.TheDef->getName();
373
374         OS << "  // " << Name
375            << " Sub-register Classes...\n"
376            << "  static const TargetRegisterClass* const "
377            << Name << "SubRegClasses[] = {\n    ";
378
379         for (unsigned idx = 0; idx != NumSubRegIndices; ++idx) {
380           if (idx)
381             OS << ", ";
382           if (SRC[idx])
383             OS << "&" << getQualifiedName(SRC[idx]) << "RegClass";
384           else
385             OS << "0";
386         }
387         OS << "\n  };\n\n";
388       }
389
390       // Emit the super-register classes for each RegisterClass
391       for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
392         const CodeGenRegisterClass &RC = RegisterClasses[rc];
393
394         // Give the register class a legal C name if it's anonymous.
395         std::string Name = RC.TheDef->getName();
396
397         OS << "  // " << Name
398            << " Super-register Classes...\n"
399            << "  static const TargetRegisterClass* const "
400            << Name << "SuperRegClasses[] = {\n    ";
401
402         bool Empty = true;
403         std::map<unsigned, std::set<unsigned> >::iterator I =
404           SuperRegClassMap.find(rc);
405         if (I != SuperRegClassMap.end()) {
406           for (std::set<unsigned>::iterator II = I->second.begin(),
407                  EE = I->second.end(); II != EE; ++II) {
408             const CodeGenRegisterClass &RC2 = RegisterClasses[*II];
409             if (!Empty)
410               OS << ", ";
411             OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
412             Empty = false;
413           }
414         }
415
416         OS << (!Empty ? ", " : "") << "NULL";
417         OS << "\n  };\n\n";
418       }
419     } else {
420       // No subregindices in this target
421       OS << "  static const TargetRegisterClass* const "
422          << "NullRegClasses[] = { NULL };\n\n";
423     }
424
425     // Emit the sub-classes array for each RegisterClass
426     for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
427       const CodeGenRegisterClass &RC = RegisterClasses[rc];
428
429       // Give the register class a legal C name if it's anonymous.
430       std::string Name = RC.TheDef->getName();
431
432       OS << "  // " << Name
433          << " Register Class sub-classes...\n"
434          << "  static const TargetRegisterClass* const "
435          << Name << "Subclasses[] = {\n    ";
436
437       bool Empty = true;
438       for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) {
439         const CodeGenRegisterClass &RC2 = RegisterClasses[rc2];
440
441         // Sub-classes are used to determine if a virtual register can be used
442         // as an instruction operand, or if it must be copied first.
443         if (rc == rc2 || !RC.hasSubClass(&RC2)) continue;
444
445         if (!Empty) OS << ", ";
446         OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
447         Empty = false;
448
449         std::map<unsigned, std::set<unsigned> >::iterator SCMI =
450           SuperClassMap.find(rc2);
451         if (SCMI == SuperClassMap.end()) {
452           SuperClassMap.insert(std::make_pair(rc2, std::set<unsigned>()));
453           SCMI = SuperClassMap.find(rc2);
454         }
455         SCMI->second.insert(rc);
456       }
457
458       OS << (!Empty ? ", " : "") << "NULL";
459       OS << "\n  };\n\n";
460     }
461
462     for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
463       const CodeGenRegisterClass &RC = RegisterClasses[rc];
464
465       // Give the register class a legal C name if it's anonymous.
466       std::string Name = RC.TheDef->getName();
467
468       OS << "  // " << Name
469          << " Register Class super-classes...\n"
470          << "  static const TargetRegisterClass* const "
471          << Name << "Superclasses[] = {\n    ";
472
473       bool Empty = true;
474       std::map<unsigned, std::set<unsigned> >::iterator I =
475         SuperClassMap.find(rc);
476       if (I != SuperClassMap.end()) {
477         for (std::set<unsigned>::iterator II = I->second.begin(),
478                EE = I->second.end(); II != EE; ++II) {
479           const CodeGenRegisterClass &RC2 = RegisterClasses[*II];
480           if (!Empty) OS << ", ";
481           OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass";
482           Empty = false;
483         }
484       }
485
486       OS << (!Empty ? ", " : "") << "NULL";
487       OS << "\n  };\n\n";
488     }
489
490     // Emit methods.
491     for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
492       const CodeGenRegisterClass &RC = RegisterClasses[i];
493       OS << RC.getName() << "Class::" << RC.getName()
494          << "Class()  : TargetRegisterClass("
495          << RC.getName() + "RegClassID" << ", "
496          << '\"' << RC.getName() << "\", "
497          << RC.getName() + "VTs" << ", "
498          << RC.getName() + "Subclasses" << ", "
499          << RC.getName() + "Superclasses" << ", "
500          << (NumSubRegIndices ? RC.getName() + "Sub" : std::string("Null"))
501          << "RegClasses, "
502          << (NumSubRegIndices ? RC.getName() + "Super" : std::string("Null"))
503          << "RegClasses, "
504          << RC.SpillSize/8 << ", "
505          << RC.SpillAlignment/8 << ", "
506          << RC.CopyCost << ", "
507          << RC.Allocatable << ", "
508          << RC.getName() << ", " << RC.getName() << " + "
509          << RC.getOrder().size()
510          << ") {}\n";
511       if (!RC.AltOrderSelect.empty()) {
512         OS << "\nstatic inline unsigned " << RC.getName()
513            << "AltOrderSelect(const MachineFunction &MF) {"
514            << RC.AltOrderSelect << "}\n\nArrayRef<unsigned> "
515            << RC.getName() << "Class::"
516            << "getRawAllocationOrder(const MachineFunction &MF) const {\n";
517         for (unsigned oi = 1 , oe = RC.getNumOrders(); oi != oe; ++oi) {
518           ArrayRef<Record*> Elems = RC.getOrder(oi);
519           OS << "  static const unsigned AltOrder" << oi << "[] = {";
520           for (unsigned elem = 0; elem != Elems.size(); ++elem)
521             OS << (elem ? ", " : " ") << getQualifiedName(Elems[elem]);
522           OS << " };\n";
523         }
524         OS << "  static const ArrayRef<unsigned> Order[] = {\n"
525            << "    ArrayRef<unsigned>(" << RC.getName();
526         for (unsigned oi = 1, oe = RC.getNumOrders(); oi != oe; ++oi)
527           OS << "),\n    ArrayRef<unsigned>(AltOrder" << oi;
528         OS << ")\n  };\n  const unsigned Select = " << RC.getName()
529            << "AltOrderSelect(MF);\n  assert(Select < " << RC.getNumOrders()
530            << ");\n  return Order[Select];\n}\n";
531         }
532     }
533
534     OS << "}\n";
535   }
536
537   OS << "\nnamespace {\n";
538   OS << "  const TargetRegisterClass* const RegisterClasses[] = {\n";
539   for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i)
540     OS << "    &" << getQualifiedName(RegisterClasses[i].TheDef)
541        << "RegClass,\n";
542   OS << "  };\n";
543
544   // Emit extra information about registers.
545   OS << "\n  static const TargetRegisterInfoDesc "
546      << Target.getName() << "RegInfoDesc[] = "
547      << "{ // Extra Descriptors\n";
548   OS << "    { 0, 0 },\n";
549
550   const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
551   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
552     const CodeGenRegister &Reg = *Regs[i];
553     OS << "    { ";
554     OS << Reg.CostPerUse << ", "
555        << int(AllocatableRegs.count(Reg.TheDef)) << " },\n";
556   }
557   OS << "  };\n";      // End of register descriptors...
558
559
560   // Calculate the mapping of subregister+index pairs to physical registers.
561   // This will also create further anonymous indexes.
562   unsigned NamedIndices = RegBank.getNumNamedIndices();
563
564   // Emit SubRegIndex names, skipping 0
565   const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices();
566   OS << "\n  const char *const SubRegIndexTable[] = { \"";
567   for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
568     OS << SubRegIndices[i]->getName();
569     if (i+1 != e)
570       OS << "\", \"";
571   }
572   OS << "\" };\n\n";
573
574   // Emit names of the anonymus subreg indexes.
575   if (SubRegIndices.size() > NamedIndices) {
576     OS << "  enum {";
577     for (unsigned i = NamedIndices, e = SubRegIndices.size(); i != e; ++i) {
578       OS << "\n    " << SubRegIndices[i]->getName() << " = " << i+1;
579       if (i+1 != e)
580         OS << ',';
581     }
582     OS << "\n  };\n\n";
583   }
584   OS << "}\n\n";       // End of anonymous namespace...
585
586   std::string ClassName = Target.getName() + "GenRegisterInfo";
587
588   // Emit the subregister + index mapping function based on the information
589   // calculated above.
590   OS << "unsigned " << ClassName
591      << "::getSubReg(unsigned RegNo, unsigned Index) const {\n"
592      << "  switch (RegNo) {\n"
593      << "  default:\n    return 0;\n";
594   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
595     const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs();
596     if (SRM.empty())
597       continue;
598     OS << "  case " << getQualifiedName(Regs[i]->TheDef) << ":\n";
599     OS << "    switch (Index) {\n";
600     OS << "    default: return 0;\n";
601     for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(),
602          ie = SRM.end(); ii != ie; ++ii)
603       OS << "    case " << getQualifiedName(ii->first)
604          << ": return " << getQualifiedName(ii->second->TheDef) << ";\n";
605     OS << "    };\n" << "    break;\n";
606   }
607   OS << "  };\n";
608   OS << "  return 0;\n";
609   OS << "}\n\n";
610
611   OS << "unsigned " << ClassName
612      << "::getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const {\n"
613      << "  switch (RegNo) {\n"
614      << "  default:\n    return 0;\n";
615    for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
616      const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs();
617      if (SRM.empty())
618        continue;
619     OS << "  case " << getQualifiedName(Regs[i]->TheDef) << ":\n";
620     for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(),
621          ie = SRM.end(); ii != ie; ++ii)
622       OS << "    if (SubRegNo == " << getQualifiedName(ii->second->TheDef)
623          << ")  return " << getQualifiedName(ii->first) << ";\n";
624     OS << "    return 0;\n";
625   }
626   OS << "  };\n";
627   OS << "  return 0;\n";
628   OS << "}\n\n";
629
630   // Emit composeSubRegIndices
631   OS << "unsigned " << ClassName
632      << "::composeSubRegIndices(unsigned IdxA, unsigned IdxB) const {\n"
633      << "  switch (IdxA) {\n"
634      << "  default:\n    return IdxB;\n";
635   for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
636     bool Open = false;
637     for (unsigned j = 0; j != e; ++j) {
638       if (Record *Comp = RegBank.getCompositeSubRegIndex(SubRegIndices[i],
639                                                          SubRegIndices[j])) {
640         if (!Open) {
641           OS << "  case " << getQualifiedName(SubRegIndices[i])
642              << ": switch(IdxB) {\n    default: return IdxB;\n";
643           Open = true;
644         }
645         OS << "    case " << getQualifiedName(SubRegIndices[j])
646            << ": return " << getQualifiedName(Comp) << ";\n";
647       }
648     }
649     if (Open)
650       OS << "    }\n";
651   }
652   OS << "  }\n}\n\n";
653
654   // Emit the constructor of the class...
655   OS << ClassName << "::" << ClassName
656      << "(const MCRegisterDesc *D, const TargetRegisterInfoDesc *ID, "
657      << "int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
658      << "  : TargetRegisterInfo(ID"
659      << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n"
660      << "                 SubRegIndexTable,\n"
661      << "                 CallFrameSetupOpcode, CallFrameDestroyOpcode) {\n"
662      << "  InitMCRegisterInfo(D, " << Regs.size()+1 << ");\n"
663      << "}\n\n";
664
665   // Collect all information about dwarf register numbers
666   typedef std::map<Record*, std::vector<int64_t>, LessRecord> DwarfRegNumsMapTy;
667   DwarfRegNumsMapTy DwarfRegNums;
668
669   // First, just pull all provided information to the map
670   unsigned maxLength = 0;
671   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
672     Record *Reg = Regs[i]->TheDef;
673     std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers");
674     maxLength = std::max((size_t)maxLength, RegNums.size());
675     if (DwarfRegNums.count(Reg))
676       errs() << "Warning: DWARF numbers for register " << getQualifiedName(Reg)
677              << "specified multiple times\n";
678     DwarfRegNums[Reg] = RegNums;
679   }
680
681   // Now we know maximal length of number list. Append -1's, where needed
682   for (DwarfRegNumsMapTy::iterator
683        I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I)
684     for (unsigned i = I->second.size(), e = maxLength; i != e; ++i)
685       I->second.push_back(-1);
686
687   // Emit reverse information about the dwarf register numbers.
688   OS << "int " << ClassName << "::getLLVMRegNumFull(unsigned DwarfRegNum, "
689      << "unsigned Flavour) const {\n"
690      << "  switch (Flavour) {\n"
691      << "  default:\n"
692      << "    assert(0 && \"Unknown DWARF flavour\");\n"
693      << "    return -1;\n";
694
695   for (unsigned i = 0, e = maxLength; i != e; ++i) {
696     OS << "  case " << i << ":\n"
697        << "    switch (DwarfRegNum) {\n"
698        << "    default:\n"
699        << "      assert(0 && \"Invalid DwarfRegNum\");\n"
700        << "      return -1;\n";
701
702     for (DwarfRegNumsMapTy::iterator
703            I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
704       int DwarfRegNo = I->second[i];
705       if (DwarfRegNo >= 0)
706         OS << "    case " <<  DwarfRegNo << ":\n"
707            << "      return " << getQualifiedName(I->first) << ";\n";
708     }
709     OS << "    };\n";
710   }
711
712   OS << "  };\n}\n\n";
713
714   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
715     Record *Reg = Regs[i]->TheDef;
716     const RecordVal *V = Reg->getValue("DwarfAlias");
717     if (!V || !V->getValue())
718       continue;
719
720     DefInit *DI = dynamic_cast<DefInit*>(V->getValue());
721     Record *Alias = DI->getDef();
722     DwarfRegNums[Reg] = DwarfRegNums[Alias];
723   }
724
725   // Emit information about the dwarf register numbers.
726   OS << "int " << ClassName << "::getDwarfRegNumFull(unsigned RegNum, "
727      << "unsigned Flavour) const {\n"
728      << "  switch (Flavour) {\n"
729      << "  default:\n"
730      << "    assert(0 && \"Unknown DWARF flavour\");\n"
731      << "    return -1;\n";
732
733   for (unsigned i = 0, e = maxLength; i != e; ++i) {
734     OS << "  case " << i << ":\n"
735        << "    switch (RegNum) {\n"
736        << "    default:\n"
737        << "      assert(0 && \"Invalid RegNum\");\n"
738        << "      return -1;\n";
739
740     // Sort by name to get a stable order.
741
742
743     for (DwarfRegNumsMapTy::iterator
744            I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) {
745       int RegNo = I->second[i];
746       OS << "    case " << getQualifiedName(I->first) << ":\n"
747          << "      return " << RegNo << ";\n";
748     }
749     OS << "    };\n";
750   }
751
752   OS << "  };\n}\n\n";
753
754   OS << "} // End llvm namespace \n";
755   OS << "#endif // GET_REGINFO_TARGET_DESC\n\n";
756 }
757
758 void RegisterInfoEmitter::run(raw_ostream &OS) {
759   CodeGenTarget Target(Records);
760   CodeGenRegBank &RegBank = Target.getRegBank();
761   RegBank.computeDerivedInfo();
762
763   runEnums(OS, Target, RegBank);
764   runMCDesc(OS, Target, RegBank);
765   runTargetHeader(OS, Target, RegBank);
766   runTargetDesc(OS, Target, RegBank);
767 }