1 //===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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.
14 //===----------------------------------------------------------------------===//
16 #include "RegisterInfoEmitter.h"
17 #include "CodeGenTarget.h"
18 #include "CodeGenRegisters.h"
20 #include "llvm/ADT/StringExtras.h"
21 #include "llvm/ADT/STLExtras.h"
26 // runEnums - Print out enum values for all of the registers.
27 void RegisterInfoEmitter::runEnums(raw_ostream
&OS
) {
28 CodeGenTarget
Target(Records
);
29 const std::vector
<CodeGenRegister
> &Registers
= Target
.getRegisters();
31 std::string Namespace
= Registers
[0].TheDef
->getValueAsString("Namespace");
33 EmitSourceFileHeader("Target Register Enum Values", OS
);
34 OS
<< "namespace llvm {\n\n";
36 if (!Namespace
.empty())
37 OS
<< "namespace " << Namespace
<< " {\n";
38 OS
<< "enum {\n NoRegister,\n";
40 for (unsigned i
= 0, e
= Registers
.size(); i
!= e
; ++i
)
41 OS
<< " " << Registers
[i
].getName() << " = " <<
42 Registers
[i
].EnumValue
<< ",\n";
43 assert(Registers
.size() == Registers
[Registers
.size()-1].EnumValue
&&
44 "Register enum value mismatch!");
45 OS
<< " NUM_TARGET_REGS \t// " << Registers
.size()+1 << "\n";
47 if (!Namespace
.empty())
50 const std::vector
<Record
*> SubRegIndices
= Target
.getSubRegIndices();
51 if (!SubRegIndices
.empty()) {
52 OS
<< "\n// Subregister indices\n";
53 Namespace
= SubRegIndices
[0]->getValueAsString("Namespace");
54 if (!Namespace
.empty())
55 OS
<< "namespace " << Namespace
<< " {\n";
56 OS
<< "enum {\n NoSubRegister,\n";
57 for (unsigned i
= 0, e
= SubRegIndices
.size(); i
!= e
; ++i
)
58 OS
<< " " << SubRegIndices
[i
]->getName() << ",\t// " << i
+1 << "\n";
59 OS
<< " NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices
.size()+1 << "\n";
61 if (!Namespace
.empty())
64 OS
<< "} // End llvm namespace \n";
67 void RegisterInfoEmitter::runHeader(raw_ostream
&OS
) {
68 EmitSourceFileHeader("Register Information Header Fragment", OS
);
69 CodeGenTarget
Target(Records
);
70 const std::string
&TargetName
= Target
.getName();
71 std::string ClassName
= TargetName
+ "GenRegisterInfo";
73 OS
<< "#include \"llvm/Target/TargetRegisterInfo.h\"\n";
74 OS
<< "#include <string>\n\n";
76 OS
<< "namespace llvm {\n\n";
78 OS
<< "struct " << ClassName
<< " : public TargetRegisterInfo {\n"
79 << " explicit " << ClassName
80 << "(int CallFrameSetupOpcode = -1, int CallFrameDestroyOpcode = -1);\n"
81 << " virtual int getDwarfRegNumFull(unsigned RegNum, "
82 << "unsigned Flavour) const;\n"
83 << " virtual int getLLVMRegNumFull(unsigned DwarfRegNum, "
84 << "unsigned Flavour) const;\n"
85 << " virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;\n"
86 << " virtual bool needsStackRealignment(const MachineFunction &) const\n"
87 << " { return false; }\n"
88 << " unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n"
89 << " unsigned getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const;\n"
90 << " unsigned composeSubRegIndices(unsigned, unsigned) const;\n"
93 const std::vector
<CodeGenRegisterClass
> &RegisterClasses
=
94 Target
.getRegisterClasses();
96 if (!RegisterClasses
.empty()) {
97 OS
<< "namespace " << RegisterClasses
[0].Namespace
98 << " { // Register classes\n";
101 for (unsigned i
= 0, e
= RegisterClasses
.size(); i
!= e
; ++i
) {
103 OS
<< " " << RegisterClasses
[i
].getName() << "RegClassID";
108 for (unsigned i
= 0, e
= RegisterClasses
.size(); i
!= e
; ++i
) {
109 const std::string
&Name
= RegisterClasses
[i
].getName();
111 // Output the register class definition.
112 OS
<< " struct " << Name
<< "Class : public TargetRegisterClass {\n"
113 << " " << Name
<< "Class();\n"
114 << RegisterClasses
[i
].MethodProtos
<< " };\n";
116 // Output the extern for the instance.
117 OS
<< " extern " << Name
<< "Class\t" << Name
<< "RegClass;\n";
118 // Output the extern for the pointer to the instance (should remove).
119 OS
<< " static TargetRegisterClass * const "<< Name
<<"RegisterClass = &"
120 << Name
<< "RegClass;\n";
122 OS
<< "} // end of namespace " << TargetName
<< "\n\n";
124 OS
<< "} // End llvm namespace \n";
127 static void addSuperReg(Record
*R
, Record
*S
,
128 std::map
<Record
*, std::set
<Record
*>, LessRecord
> &SubRegs
,
129 std::map
<Record
*, std::set
<Record
*>, LessRecord
> &SuperRegs
,
130 std::map
<Record
*, std::set
<Record
*>, LessRecord
> &Aliases
) {
132 errs() << "Error: recursive sub-register relationship between"
133 << " register " << getQualifiedName(R
)
134 << " and its sub-registers?\n";
137 if (!SuperRegs
[R
].insert(S
).second
)
139 SubRegs
[S
].insert(R
);
140 Aliases
[R
].insert(S
);
141 Aliases
[S
].insert(R
);
142 if (SuperRegs
.count(S
))
143 for (std::set
<Record
*>::iterator I
= SuperRegs
[S
].begin(),
144 E
= SuperRegs
[S
].end(); I
!= E
; ++I
)
145 addSuperReg(R
, *I
, SubRegs
, SuperRegs
, Aliases
);
148 static void addSubSuperReg(Record
*R
, Record
*S
,
149 std::map
<Record
*, std::set
<Record
*>, LessRecord
> &SubRegs
,
150 std::map
<Record
*, std::set
<Record
*>, LessRecord
> &SuperRegs
,
151 std::map
<Record
*, std::set
<Record
*>, LessRecord
> &Aliases
) {
153 errs() << "Error: recursive sub-register relationship between"
154 << " register " << getQualifiedName(R
)
155 << " and its sub-registers?\n";
159 if (!SubRegs
[R
].insert(S
).second
)
161 addSuperReg(S
, R
, SubRegs
, SuperRegs
, Aliases
);
162 Aliases
[R
].insert(S
);
163 Aliases
[S
].insert(R
);
164 if (SubRegs
.count(S
))
165 for (std::set
<Record
*>::iterator I
= SubRegs
[S
].begin(),
166 E
= SubRegs
[S
].end(); I
!= E
; ++I
)
167 addSubSuperReg(R
, *I
, SubRegs
, SuperRegs
, Aliases
);
170 struct RegisterMaps
{
171 // Map SubRegIndex -> Register
172 typedef std::map
<Record
*, Record
*, LessRecord
> SubRegMap
;
173 // Map Register -> SubRegMap
174 typedef std::map
<Record
*, SubRegMap
> SubRegMaps
;
177 SubRegMap
&inferSubRegIndices(Record
*Reg
, CodeGenTarget
&);
179 // Composite SubRegIndex instances.
180 // Map (SubRegIndex,SubRegIndex) -> SubRegIndex
181 typedef DenseMap
<std::pair
<Record
*,Record
*>,Record
*> CompositeMap
;
182 CompositeMap Composite
;
184 // Compute SubRegIndex compositions after inferSubRegIndices has run on all
186 void computeComposites();
189 // Calculate all subregindices for Reg. Loopy subregs cause infinite recursion.
190 RegisterMaps::SubRegMap
&RegisterMaps::inferSubRegIndices(Record
*Reg
,
191 CodeGenTarget
&Target
) {
192 SubRegMap
&SRM
= SubReg
[Reg
];
195 std::vector
<Record
*> SubRegs
= Reg
->getValueAsListOfDefs("SubRegs");
196 std::vector
<Record
*> Indices
= Reg
->getValueAsListOfDefs("SubRegIndices");
197 if (SubRegs
.size() != Indices
.size())
198 throw "Register " + Reg
->getName() + " SubRegIndices doesn't match SubRegs";
200 // First insert the direct subregs and make sure they are fully indexed.
201 for (unsigned i
= 0, e
= SubRegs
.size(); i
!= e
; ++i
) {
202 if (!SRM
.insert(std::make_pair(Indices
[i
], SubRegs
[i
])).second
)
203 throw "SubRegIndex " + Indices
[i
]->getName()
204 + " appears twice in Register " + Reg
->getName();
205 inferSubRegIndices(SubRegs
[i
], Target
);
208 // Keep track of inherited subregs and how they can be reached.
209 // Register -> (SubRegIndex, SubRegIndex)
210 typedef std::map
<Record
*, std::pair
<Record
*,Record
*>, LessRecord
> OrphanMap
;
213 // Clone inherited subregs. Here the order is important - earlier subregs take
215 for (unsigned i
= 0, e
= SubRegs
.size(); i
!= e
; ++i
) {
216 SubRegMap
&M
= SubReg
[SubRegs
[i
]];
217 for (SubRegMap::iterator si
= M
.begin(), se
= M
.end(); si
!= se
; ++si
)
218 if (!SRM
.insert(*si
).second
)
219 Orphans
[si
->second
] = std::make_pair(Indices
[i
], si
->first
);
222 // Finally process the composites.
223 ListInit
*Comps
= Reg
->getValueAsListInit("CompositeIndices");
224 for (unsigned i
= 0, e
= Comps
->size(); i
!= e
; ++i
) {
225 DagInit
*Pat
= dynamic_cast<DagInit
*>(Comps
->getElement(i
));
227 throw "Invalid dag '" + Comps
->getElement(i
)->getAsString()
228 + "' in CompositeIndices";
229 DefInit
*BaseIdxInit
= dynamic_cast<DefInit
*>(Pat
->getOperator());
230 if (!BaseIdxInit
|| !BaseIdxInit
->getDef()->isSubClassOf("SubRegIndex"))
231 throw "Invalid SubClassIndex in " + Pat
->getAsString();
233 // Resolve list of subreg indices into R2.
235 for (DagInit::const_arg_iterator di
= Pat
->arg_begin(),
236 de
= Pat
->arg_end(); di
!= de
; ++di
) {
237 DefInit
*IdxInit
= dynamic_cast<DefInit
*>(*di
);
238 if (!IdxInit
|| !IdxInit
->getDef()->isSubClassOf("SubRegIndex"))
239 throw "Invalid SubClassIndex in " + Pat
->getAsString();
240 SubRegMap::const_iterator ni
= SubReg
[R2
].find(IdxInit
->getDef());
241 if (ni
== SubReg
[R2
].end())
242 throw "Composite " + Pat
->getAsString() + " refers to bad index in "
247 // Insert composite index. Allow overriding inherited indices etc.
248 SRM
[BaseIdxInit
->getDef()] = R2
;
250 // R2 is now directly addressable, no longer an orphan.
254 // Now Orphans contains the inherited subregisters without a direct index.
255 // Create inferred indexes for all missing entries.
256 for (OrphanMap::iterator I
= Orphans
.begin(), E
= Orphans
.end(); I
!= E
;
258 Record
*&Comp
= Composite
[I
->second
];
260 Comp
= Target
.createSubRegIndex(I
->second
.first
->getName() + "_then_" +
261 I
->second
.second
->getName());
262 SRM
[Comp
] = I
->first
;
268 void RegisterMaps::computeComposites() {
269 for (SubRegMaps::const_iterator sri
= SubReg
.begin(), sre
= SubReg
.end();
271 Record
*Reg1
= sri
->first
;
272 const SubRegMap
&SRM1
= sri
->second
;
273 for (SubRegMap::const_iterator i1
= SRM1
.begin(), e1
= SRM1
.end();
275 Record
*Idx1
= i1
->first
;
276 Record
*Reg2
= i1
->second
;
277 // Ignore identity compositions.
280 // If Reg2 has no subregs, Idx1 doesn't compose.
281 if (!SubReg
.count(Reg2
))
283 const SubRegMap
&SRM2
= SubReg
[Reg2
];
284 // Try composing Idx1 with another SubRegIndex.
285 for (SubRegMap::const_iterator i2
= SRM2
.begin(), e2
= SRM2
.end();
287 std::pair
<Record
*,Record
*> IdxPair(Idx1
, i2
->first
);
288 Record
*Reg3
= i2
->second
;
289 // OK Reg1:IdxPair == Reg3. Find the index with Reg:Idx == Reg3.
290 for (SubRegMap::const_iterator i1d
= SRM1
.begin(), e1d
= SRM1
.end();
292 // Ignore identity compositions.
295 if (i1d
->second
== Reg3
) {
296 std::pair
<CompositeMap::iterator
,bool> Ins
=
297 Composite
.insert(std::make_pair(IdxPair
, i1d
->first
));
298 // Conflicting composition? Emit a warning but allow it.
299 if (!Ins
.second
&& Ins
.first
->second
!= i1d
->first
) {
300 errs() << "Warning: SubRegIndex " << getQualifiedName(Idx1
)
301 << " and " << getQualifiedName(IdxPair
.second
)
302 << " compose ambiguously as "
303 << getQualifiedName(Ins
.first
->second
) << " or "
304 << getQualifiedName(i1d
->first
) << "\n";
312 // We don't care about the difference between (Idx1, Idx2) -> Idx2 and invalid
313 // compositions, so remove any mappings of that form.
314 for (CompositeMap::iterator i
= Composite
.begin(), e
= Composite
.end();
316 CompositeMap::iterator j
= i
;
318 if (j
->first
.second
== j
->second
)
323 class RegisterSorter
{
325 std::map
<Record
*, std::set
<Record
*>, LessRecord
> &RegisterSubRegs
;
328 RegisterSorter(std::map
<Record
*, std::set
<Record
*>, LessRecord
> &RS
)
329 : RegisterSubRegs(RS
) {}
331 bool operator()(Record
*RegA
, Record
*RegB
) {
332 // B is sub-register of A.
333 return RegisterSubRegs
.count(RegA
) && RegisterSubRegs
[RegA
].count(RegB
);
337 // RegisterInfoEmitter::run - Main register file description emitter.
339 void RegisterInfoEmitter::run(raw_ostream
&OS
) {
340 CodeGenTarget
Target(Records
);
341 EmitSourceFileHeader("Register Information Source Fragment", OS
);
343 OS
<< "namespace llvm {\n\n";
345 // Start out by emitting each of the register classes.
346 const std::vector
<CodeGenRegisterClass
> &RegisterClasses
=
347 Target
.getRegisterClasses();
349 // Collect all registers belonging to any allocatable class.
350 std::set
<Record
*> AllocatableRegs
;
352 // Loop over all of the register classes... emitting each one.
353 OS
<< "namespace { // Register classes...\n";
355 // Emit the register enum value arrays for each RegisterClass
356 for (unsigned rc
= 0, e
= RegisterClasses
.size(); rc
!= e
; ++rc
) {
357 const CodeGenRegisterClass
&RC
= RegisterClasses
[rc
];
359 // Collect allocatable registers.
361 AllocatableRegs
.insert(RC
.Elements
.begin(), RC
.Elements
.end());
363 // Give the register class a legal C name if it's anonymous.
364 std::string Name
= RC
.TheDef
->getName();
366 // Emit the register list now.
367 OS
<< " // " << Name
<< " Register Class...\n"
368 << " static const unsigned " << Name
370 for (unsigned i
= 0, e
= RC
.Elements
.size(); i
!= e
; ++i
) {
371 Record
*Reg
= RC
.Elements
[i
];
372 OS
<< getQualifiedName(Reg
) << ", ";
377 // Emit the ValueType arrays for each RegisterClass
378 for (unsigned rc
= 0, e
= RegisterClasses
.size(); rc
!= e
; ++rc
) {
379 const CodeGenRegisterClass
&RC
= RegisterClasses
[rc
];
381 // Give the register class a legal C name if it's anonymous.
382 std::string Name
= RC
.TheDef
->getName() + "VTs";
384 // Emit the register list now.
386 << " Register Class Value Types...\n"
387 << " static const EVT " << Name
389 for (unsigned i
= 0, e
= RC
.VTs
.size(); i
!= e
; ++i
)
390 OS
<< getEnumName(RC
.VTs
[i
]) << ", ";
391 OS
<< "MVT::Other\n };\n\n";
393 OS
<< "} // end anonymous namespace\n\n";
395 // Now that all of the structs have been emitted, emit the instances.
396 if (!RegisterClasses
.empty()) {
397 OS
<< "namespace " << RegisterClasses
[0].Namespace
398 << " { // Register class instances\n";
399 for (unsigned i
= 0, e
= RegisterClasses
.size(); i
!= e
; ++i
)
400 OS
<< " " << RegisterClasses
[i
].getName() << "Class\t"
401 << RegisterClasses
[i
].getName() << "RegClass;\n";
403 std::map
<unsigned, std::set
<unsigned> > SuperClassMap
;
404 std::map
<unsigned, std::set
<unsigned> > SuperRegClassMap
;
407 unsigned NumSubRegIndices
= Target
.getSubRegIndices().size();
409 if (NumSubRegIndices
) {
410 // Emit the sub-register classes for each RegisterClass
411 for (unsigned rc
= 0, e
= RegisterClasses
.size(); rc
!= e
; ++rc
) {
412 const CodeGenRegisterClass
&RC
= RegisterClasses
[rc
];
413 std::vector
<Record
*> SRC(NumSubRegIndices
);
414 for (DenseMap
<Record
*,Record
*>::const_iterator
415 i
= RC
.SubRegClasses
.begin(),
416 e
= RC
.SubRegClasses
.end(); i
!= e
; ++i
) {
418 unsigned idx
= Target
.getSubRegIndexNo(i
->first
);
419 SRC
.at(idx
-1) = i
->second
;
421 // Find the register class number of i->second for SuperRegClassMap.
422 for (unsigned rc2
= 0, e2
= RegisterClasses
.size(); rc2
!= e2
; ++rc2
) {
423 const CodeGenRegisterClass
&RC2
= RegisterClasses
[rc2
];
424 if (RC2
.TheDef
== i
->second
) {
425 SuperRegClassMap
[rc2
].insert(rc
);
431 // Give the register class a legal C name if it's anonymous.
432 std::string Name
= RC
.TheDef
->getName();
435 << " Sub-register Classes...\n"
436 << " static const TargetRegisterClass* const "
437 << Name
<< "SubRegClasses[] = {\n ";
439 for (unsigned idx
= 0; idx
!= NumSubRegIndices
; ++idx
) {
443 OS
<< "&" << getQualifiedName(SRC
[idx
]) << "RegClass";
450 // Emit the super-register classes for each RegisterClass
451 for (unsigned rc
= 0, e
= RegisterClasses
.size(); rc
!= e
; ++rc
) {
452 const CodeGenRegisterClass
&RC
= RegisterClasses
[rc
];
454 // Give the register class a legal C name if it's anonymous.
455 std::string Name
= RC
.TheDef
->getName();
458 << " Super-register Classes...\n"
459 << " static const TargetRegisterClass* const "
460 << Name
<< "SuperRegClasses[] = {\n ";
463 std::map
<unsigned, std::set
<unsigned> >::iterator I
=
464 SuperRegClassMap
.find(rc
);
465 if (I
!= SuperRegClassMap
.end()) {
466 for (std::set
<unsigned>::iterator II
= I
->second
.begin(),
467 EE
= I
->second
.end(); II
!= EE
; ++II
) {
468 const CodeGenRegisterClass
&RC2
= RegisterClasses
[*II
];
471 OS
<< "&" << getQualifiedName(RC2
.TheDef
) << "RegClass";
476 OS
<< (!Empty
? ", " : "") << "NULL";
480 // No subregindices in this target
481 OS
<< " static const TargetRegisterClass* const "
482 << "NullRegClasses[] = { NULL };\n\n";
485 // Emit the sub-classes array for each RegisterClass
486 for (unsigned rc
= 0, e
= RegisterClasses
.size(); rc
!= e
; ++rc
) {
487 const CodeGenRegisterClass
&RC
= RegisterClasses
[rc
];
489 // Give the register class a legal C name if it's anonymous.
490 std::string Name
= RC
.TheDef
->getName();
493 << " Register Class sub-classes...\n"
494 << " static const TargetRegisterClass* const "
495 << Name
<< "Subclasses[] = {\n ";
498 for (unsigned rc2
= 0, e2
= RegisterClasses
.size(); rc2
!= e2
; ++rc2
) {
499 const CodeGenRegisterClass
&RC2
= RegisterClasses
[rc2
];
501 // Sub-classes are used to determine if a virtual register can be used
502 // as an instruction operand, or if it must be copied first.
503 if (rc
== rc2
|| !RC
.hasSubClass(&RC2
)) continue;
505 if (!Empty
) OS
<< ", ";
506 OS
<< "&" << getQualifiedName(RC2
.TheDef
) << "RegClass";
509 std::map
<unsigned, std::set
<unsigned> >::iterator SCMI
=
510 SuperClassMap
.find(rc2
);
511 if (SCMI
== SuperClassMap
.end()) {
512 SuperClassMap
.insert(std::make_pair(rc2
, std::set
<unsigned>()));
513 SCMI
= SuperClassMap
.find(rc2
);
515 SCMI
->second
.insert(rc
);
518 OS
<< (!Empty
? ", " : "") << "NULL";
522 for (unsigned rc
= 0, e
= RegisterClasses
.size(); rc
!= e
; ++rc
) {
523 const CodeGenRegisterClass
&RC
= RegisterClasses
[rc
];
525 // Give the register class a legal C name if it's anonymous.
526 std::string Name
= RC
.TheDef
->getName();
529 << " Register Class super-classes...\n"
530 << " static const TargetRegisterClass* const "
531 << Name
<< "Superclasses[] = {\n ";
534 std::map
<unsigned, std::set
<unsigned> >::iterator I
=
535 SuperClassMap
.find(rc
);
536 if (I
!= SuperClassMap
.end()) {
537 for (std::set
<unsigned>::iterator II
= I
->second
.begin(),
538 EE
= I
->second
.end(); II
!= EE
; ++II
) {
539 const CodeGenRegisterClass
&RC2
= RegisterClasses
[*II
];
540 if (!Empty
) OS
<< ", ";
541 OS
<< "&" << getQualifiedName(RC2
.TheDef
) << "RegClass";
546 OS
<< (!Empty
? ", " : "") << "NULL";
551 for (unsigned i
= 0, e
= RegisterClasses
.size(); i
!= e
; ++i
) {
552 const CodeGenRegisterClass
&RC
= RegisterClasses
[i
];
553 OS
<< RC
.MethodBodies
<< "\n";
554 OS
<< RC
.getName() << "Class::" << RC
.getName()
555 << "Class() : TargetRegisterClass("
556 << RC
.getName() + "RegClassID" << ", "
557 << '\"' << RC
.getName() << "\", "
558 << RC
.getName() + "VTs" << ", "
559 << RC
.getName() + "Subclasses" << ", "
560 << RC
.getName() + "Superclasses" << ", "
561 << (NumSubRegIndices
? RC
.getName() + "Sub" : std::string("Null"))
563 << (NumSubRegIndices
? RC
.getName() + "Super" : std::string("Null"))
565 << RC
.SpillSize
/8 << ", "
566 << RC
.SpillAlignment
/8 << ", "
567 << RC
.CopyCost
<< ", "
568 << RC
.Allocatable
<< ", "
569 << RC
.getName() << ", " << RC
.getName() << " + " << RC
.Elements
.size()
576 OS
<< "\nnamespace {\n";
577 OS
<< " const TargetRegisterClass* const RegisterClasses[] = {\n";
578 for (unsigned i
= 0, e
= RegisterClasses
.size(); i
!= e
; ++i
)
579 OS
<< " &" << getQualifiedName(RegisterClasses
[i
].TheDef
)
583 // Emit register sub-registers / super-registers, aliases...
584 std::map
<Record
*, std::set
<Record
*>, LessRecord
> RegisterSubRegs
;
585 std::map
<Record
*, std::set
<Record
*>, LessRecord
> RegisterSuperRegs
;
586 std::map
<Record
*, std::set
<Record
*>, LessRecord
> RegisterAliases
;
587 typedef std::map
<Record
*, std::vector
<int64_t>, LessRecord
> DwarfRegNumsMapTy
;
588 DwarfRegNumsMapTy DwarfRegNums
;
590 const std::vector
<CodeGenRegister
> &Regs
= Target
.getRegisters();
592 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
593 Record
*R
= Regs
[i
].TheDef
;
594 std::vector
<Record
*> LI
= Regs
[i
].TheDef
->getValueAsListOfDefs("Aliases");
595 // Add information that R aliases all of the elements in the list... and
596 // that everything in the list aliases R.
597 for (unsigned j
= 0, e
= LI
.size(); j
!= e
; ++j
) {
599 if (RegisterAliases
[R
].count(Reg
))
600 errs() << "Warning: register alias between " << getQualifiedName(R
)
601 << " and " << getQualifiedName(Reg
)
602 << " specified multiple times!\n";
603 RegisterAliases
[R
].insert(Reg
);
605 if (RegisterAliases
[Reg
].count(R
))
606 errs() << "Warning: register alias between " << getQualifiedName(R
)
607 << " and " << getQualifiedName(Reg
)
608 << " specified multiple times!\n";
609 RegisterAliases
[Reg
].insert(R
);
613 // Process sub-register sets.
614 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
615 Record
*R
= Regs
[i
].TheDef
;
616 std::vector
<Record
*> LI
= Regs
[i
].TheDef
->getValueAsListOfDefs("SubRegs");
617 // Process sub-register set and add aliases information.
618 for (unsigned j
= 0, e
= LI
.size(); j
!= e
; ++j
) {
619 Record
*SubReg
= LI
[j
];
620 if (RegisterSubRegs
[R
].count(SubReg
))
621 errs() << "Warning: register " << getQualifiedName(SubReg
)
622 << " specified as a sub-register of " << getQualifiedName(R
)
623 << " multiple times!\n";
624 addSubSuperReg(R
, SubReg
, RegisterSubRegs
, RegisterSuperRegs
,
629 // Print the SubregHashTable, a simple quadratically probed
630 // hash table for determining if a register is a subregister
631 // of another register.
632 unsigned NumSubRegs
= 0;
633 std::map
<Record
*, unsigned> RegNo
;
634 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
635 RegNo
[Regs
[i
].TheDef
] = i
;
636 NumSubRegs
+= RegisterSubRegs
[Regs
[i
].TheDef
].size();
639 unsigned SubregHashTableSize
= 2 * NextPowerOf2(2 * NumSubRegs
);
640 unsigned* SubregHashTable
= new unsigned[2 * SubregHashTableSize
];
641 std::fill(SubregHashTable
, SubregHashTable
+ 2 * SubregHashTableSize
, ~0U);
643 unsigned hashMisses
= 0;
645 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
646 Record
* R
= Regs
[i
].TheDef
;
647 for (std::set
<Record
*>::iterator I
= RegisterSubRegs
[R
].begin(),
648 E
= RegisterSubRegs
[R
].end(); I
!= E
; ++I
) {
650 // We have to increase the indices of both registers by one when
651 // computing the hash because, in the generated code, there
652 // will be an extra empty slot at register 0.
653 size_t index
= ((i
+1) + (RegNo
[RJ
]+1) * 37) & (SubregHashTableSize
-1);
654 unsigned ProbeAmt
= 2;
655 while (SubregHashTable
[index
*2] != ~0U &&
656 SubregHashTable
[index
*2+1] != ~0U) {
657 index
= (index
+ ProbeAmt
) & (SubregHashTableSize
-1);
663 SubregHashTable
[index
*2] = i
;
664 SubregHashTable
[index
*2+1] = RegNo
[RJ
];
668 OS
<< "\n\n // Number of hash collisions: " << hashMisses
<< "\n";
670 if (SubregHashTableSize
) {
671 std::string Namespace
= Regs
[0].TheDef
->getValueAsString("Namespace");
673 OS
<< " const unsigned SubregHashTable[] = { ";
674 for (unsigned i
= 0; i
< SubregHashTableSize
- 1; ++i
) {
676 // Insert spaces for nice formatting.
679 if (SubregHashTable
[2*i
] != ~0U) {
680 OS
<< getQualifiedName(Regs
[SubregHashTable
[2*i
]].TheDef
) << ", "
681 << getQualifiedName(Regs
[SubregHashTable
[2*i
+1]].TheDef
) << ", \n";
683 OS
<< Namespace
<< "::NoRegister, " << Namespace
<< "::NoRegister, \n";
687 unsigned Idx
= SubregHashTableSize
*2-2;
688 if (SubregHashTable
[Idx
] != ~0U) {
690 << getQualifiedName(Regs
[SubregHashTable
[Idx
]].TheDef
) << ", "
691 << getQualifiedName(Regs
[SubregHashTable
[Idx
+1]].TheDef
) << " };\n";
693 OS
<< Namespace
<< "::NoRegister, " << Namespace
<< "::NoRegister };\n";
696 OS
<< " const unsigned SubregHashTableSize = "
697 << SubregHashTableSize
<< ";\n";
699 OS
<< " const unsigned SubregHashTable[] = { ~0U, ~0U };\n"
700 << " const unsigned SubregHashTableSize = 1;\n";
703 delete [] SubregHashTable
;
706 // Print the AliasHashTable, a simple quadratically probed
707 // hash table for determining if a register aliases another register.
708 unsigned NumAliases
= 0;
710 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
711 RegNo
[Regs
[i
].TheDef
] = i
;
712 NumAliases
+= RegisterAliases
[Regs
[i
].TheDef
].size();
715 unsigned AliasesHashTableSize
= 2 * NextPowerOf2(2 * NumAliases
);
716 unsigned* AliasesHashTable
= new unsigned[2 * AliasesHashTableSize
];
717 std::fill(AliasesHashTable
, AliasesHashTable
+ 2 * AliasesHashTableSize
, ~0U);
721 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
722 Record
* R
= Regs
[i
].TheDef
;
723 for (std::set
<Record
*>::iterator I
= RegisterAliases
[R
].begin(),
724 E
= RegisterAliases
[R
].end(); I
!= E
; ++I
) {
726 // We have to increase the indices of both registers by one when
727 // computing the hash because, in the generated code, there
728 // will be an extra empty slot at register 0.
729 size_t index
= ((i
+1) + (RegNo
[RJ
]+1) * 37) & (AliasesHashTableSize
-1);
730 unsigned ProbeAmt
= 2;
731 while (AliasesHashTable
[index
*2] != ~0U &&
732 AliasesHashTable
[index
*2+1] != ~0U) {
733 index
= (index
+ ProbeAmt
) & (AliasesHashTableSize
-1);
739 AliasesHashTable
[index
*2] = i
;
740 AliasesHashTable
[index
*2+1] = RegNo
[RJ
];
744 OS
<< "\n\n // Number of hash collisions: " << hashMisses
<< "\n";
746 if (AliasesHashTableSize
) {
747 std::string Namespace
= Regs
[0].TheDef
->getValueAsString("Namespace");
749 OS
<< " const unsigned AliasesHashTable[] = { ";
750 for (unsigned i
= 0; i
< AliasesHashTableSize
- 1; ++i
) {
752 // Insert spaces for nice formatting.
755 if (AliasesHashTable
[2*i
] != ~0U) {
756 OS
<< getQualifiedName(Regs
[AliasesHashTable
[2*i
]].TheDef
) << ", "
757 << getQualifiedName(Regs
[AliasesHashTable
[2*i
+1]].TheDef
) << ", \n";
759 OS
<< Namespace
<< "::NoRegister, " << Namespace
<< "::NoRegister, \n";
763 unsigned Idx
= AliasesHashTableSize
*2-2;
764 if (AliasesHashTable
[Idx
] != ~0U) {
766 << getQualifiedName(Regs
[AliasesHashTable
[Idx
]].TheDef
) << ", "
767 << getQualifiedName(Regs
[AliasesHashTable
[Idx
+1]].TheDef
) << " };\n";
769 OS
<< Namespace
<< "::NoRegister, " << Namespace
<< "::NoRegister };\n";
772 OS
<< " const unsigned AliasesHashTableSize = "
773 << AliasesHashTableSize
<< ";\n";
775 OS
<< " const unsigned AliasesHashTable[] = { ~0U, ~0U };\n"
776 << " const unsigned AliasesHashTableSize = 1;\n";
779 delete [] AliasesHashTable
;
781 if (!RegisterAliases
.empty())
782 OS
<< "\n\n // Register Overlap Lists...\n";
784 // Emit an overlap list for all registers.
785 for (std::map
<Record
*, std::set
<Record
*>, LessRecord
>::iterator
786 I
= RegisterAliases
.begin(), E
= RegisterAliases
.end(); I
!= E
; ++I
) {
787 OS
<< " const unsigned " << I
->first
->getName() << "_Overlaps[] = { "
788 << getQualifiedName(I
->first
) << ", ";
789 for (std::set
<Record
*>::iterator ASI
= I
->second
.begin(),
790 E
= I
->second
.end(); ASI
!= E
; ++ASI
)
791 OS
<< getQualifiedName(*ASI
) << ", ";
795 if (!RegisterSubRegs
.empty())
796 OS
<< "\n\n // Register Sub-registers Sets...\n";
798 // Emit the empty sub-registers list
799 OS
<< " const unsigned Empty_SubRegsSet[] = { 0 };\n";
800 // Loop over all of the registers which have sub-registers, emitting the
801 // sub-registers list to memory.
802 for (std::map
<Record
*, std::set
<Record
*>, LessRecord
>::iterator
803 I
= RegisterSubRegs
.begin(), E
= RegisterSubRegs
.end(); I
!= E
; ++I
) {
804 if (I
->second
.empty())
806 OS
<< " const unsigned " << I
->first
->getName() << "_SubRegsSet[] = { ";
807 std::vector
<Record
*> SubRegsVector
;
808 for (std::set
<Record
*>::iterator ASI
= I
->second
.begin(),
809 E
= I
->second
.end(); ASI
!= E
; ++ASI
)
810 SubRegsVector
.push_back(*ASI
);
811 RegisterSorter
RS(RegisterSubRegs
);
812 std::stable_sort(SubRegsVector
.begin(), SubRegsVector
.end(), RS
);
813 for (unsigned i
= 0, e
= SubRegsVector
.size(); i
!= e
; ++i
)
814 OS
<< getQualifiedName(SubRegsVector
[i
]) << ", ";
818 if (!RegisterSuperRegs
.empty())
819 OS
<< "\n\n // Register Super-registers Sets...\n";
821 // Emit the empty super-registers list
822 OS
<< " const unsigned Empty_SuperRegsSet[] = { 0 };\n";
823 // Loop over all of the registers which have super-registers, emitting the
824 // super-registers list to memory.
825 for (std::map
<Record
*, std::set
<Record
*>, LessRecord
>::iterator
826 I
= RegisterSuperRegs
.begin(), E
= RegisterSuperRegs
.end(); I
!= E
; ++I
) {
827 if (I
->second
.empty())
829 OS
<< " const unsigned " << I
->first
->getName() << "_SuperRegsSet[] = { ";
831 std::vector
<Record
*> SuperRegsVector
;
832 for (std::set
<Record
*>::iterator ASI
= I
->second
.begin(),
833 E
= I
->second
.end(); ASI
!= E
; ++ASI
)
834 SuperRegsVector
.push_back(*ASI
);
835 RegisterSorter
RS(RegisterSubRegs
);
836 std::stable_sort(SuperRegsVector
.begin(), SuperRegsVector
.end(), RS
);
837 for (unsigned i
= 0, e
= SuperRegsVector
.size(); i
!= e
; ++i
)
838 OS
<< getQualifiedName(SuperRegsVector
[i
]) << ", ";
842 OS
<<"\n const TargetRegisterDesc RegisterDescriptors[] = { // Descriptors\n";
843 OS
<< " { \"NOREG\",\t0,\t0,\t0,\t0,\t0 },\n";
845 // Now that register alias and sub-registers sets have been emitted, emit the
846 // register descriptors now.
847 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
848 const CodeGenRegister
&Reg
= Regs
[i
];
850 OS
<< Reg
.getName() << "\",\t" << Reg
.getName() << "_Overlaps,\t";
851 if (!RegisterSubRegs
[Reg
.TheDef
].empty())
852 OS
<< Reg
.getName() << "_SubRegsSet,\t";
854 OS
<< "Empty_SubRegsSet,\t";
855 if (!RegisterSuperRegs
[Reg
.TheDef
].empty())
856 OS
<< Reg
.getName() << "_SuperRegsSet,\t";
858 OS
<< "Empty_SuperRegsSet,\t";
859 OS
<< Reg
.CostPerUse
<< ",\t"
860 << int(AllocatableRegs
.count(Reg
.TheDef
)) << " },\n";
862 OS
<< " };\n"; // End of register descriptors...
864 // Calculate the mapping of subregister+index pairs to physical registers.
865 // This will also create further anonymous indexes.
866 unsigned NamedIndices
= Target
.getSubRegIndices().size();
867 RegisterMaps RegMaps
;
868 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
)
869 RegMaps
.inferSubRegIndices(Regs
[i
].TheDef
, Target
);
871 // Emit SubRegIndex names, skipping 0
872 const std::vector
<Record
*> SubRegIndices
= Target
.getSubRegIndices();
873 OS
<< "\n const char *const SubRegIndexTable[] = { \"";
874 for (unsigned i
= 0, e
= SubRegIndices
.size(); i
!= e
; ++i
) {
875 OS
<< SubRegIndices
[i
]->getName();
881 // Emit names of the anonymus subreg indexes.
882 if (SubRegIndices
.size() > NamedIndices
) {
884 for (unsigned i
= NamedIndices
, e
= SubRegIndices
.size(); i
!= e
; ++i
) {
885 OS
<< "\n " << SubRegIndices
[i
]->getName() << " = " << i
+1;
891 OS
<< "}\n\n"; // End of anonymous namespace...
893 std::string ClassName
= Target
.getName() + "GenRegisterInfo";
895 // Emit the subregister + index mapping function based on the information
897 OS
<< "unsigned " << ClassName
898 << "::getSubReg(unsigned RegNo, unsigned Index) const {\n"
899 << " switch (RegNo) {\n"
900 << " default:\n return 0;\n";
901 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
902 RegisterMaps::SubRegMap
&SRM
= RegMaps
.SubReg
[Regs
[i
].TheDef
];
905 OS
<< " case " << getQualifiedName(Regs
[i
].TheDef
) << ":\n";
906 OS
<< " switch (Index) {\n";
907 OS
<< " default: return 0;\n";
908 for (RegisterMaps::SubRegMap::const_iterator ii
= SRM
.begin(),
909 ie
= SRM
.end(); ii
!= ie
; ++ii
)
910 OS
<< " case " << getQualifiedName(ii
->first
)
911 << ": return " << getQualifiedName(ii
->second
) << ";\n";
912 OS
<< " };\n" << " break;\n";
915 OS
<< " return 0;\n";
918 OS
<< "unsigned " << ClassName
919 << "::getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const {\n"
920 << " switch (RegNo) {\n"
921 << " default:\n return 0;\n";
922 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
923 RegisterMaps::SubRegMap
&SRM
= RegMaps
.SubReg
[Regs
[i
].TheDef
];
926 OS
<< " case " << getQualifiedName(Regs
[i
].TheDef
) << ":\n";
927 for (RegisterMaps::SubRegMap::const_iterator ii
= SRM
.begin(),
928 ie
= SRM
.end(); ii
!= ie
; ++ii
)
929 OS
<< " if (SubRegNo == " << getQualifiedName(ii
->second
)
930 << ") return " << getQualifiedName(ii
->first
) << ";\n";
931 OS
<< " return 0;\n";
934 OS
<< " return 0;\n";
937 // Emit composeSubRegIndices
938 RegMaps
.computeComposites();
939 OS
<< "unsigned " << ClassName
940 << "::composeSubRegIndices(unsigned IdxA, unsigned IdxB) const {\n"
941 << " switch (IdxA) {\n"
942 << " default:\n return IdxB;\n";
943 for (unsigned i
= 0, e
= SubRegIndices
.size(); i
!= e
; ++i
) {
945 for (unsigned j
= 0; j
!= e
; ++j
) {
946 if (Record
*Comp
= RegMaps
.Composite
.lookup(
947 std::make_pair(SubRegIndices
[i
], SubRegIndices
[j
]))) {
949 OS
<< " case " << getQualifiedName(SubRegIndices
[i
])
950 << ": switch(IdxB) {\n default: return IdxB;\n";
953 OS
<< " case " << getQualifiedName(SubRegIndices
[j
])
954 << ": return " << getQualifiedName(Comp
) << ";\n";
962 // Emit the constructor of the class...
963 OS
<< ClassName
<< "::" << ClassName
964 << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n"
965 << " : TargetRegisterInfo(RegisterDescriptors, " << Regs
.size()+1
966 << ", RegisterClasses, RegisterClasses+" << RegisterClasses
.size() <<",\n"
967 << " SubRegIndexTable,\n"
968 << " CallFrameSetupOpcode, CallFrameDestroyOpcode,\n"
969 << " SubregHashTable, SubregHashTableSize,\n"
970 << " AliasesHashTable, AliasesHashTableSize) {\n"
973 // Collect all information about dwarf register numbers
975 // First, just pull all provided information to the map
976 unsigned maxLength
= 0;
977 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
978 Record
*Reg
= Regs
[i
].TheDef
;
979 std::vector
<int64_t> RegNums
= Reg
->getValueAsListOfInts("DwarfNumbers");
980 maxLength
= std::max((size_t)maxLength
, RegNums
.size());
981 if (DwarfRegNums
.count(Reg
))
982 errs() << "Warning: DWARF numbers for register " << getQualifiedName(Reg
)
983 << "specified multiple times\n";
984 DwarfRegNums
[Reg
] = RegNums
;
987 // Now we know maximal length of number list. Append -1's, where needed
988 for (DwarfRegNumsMapTy::iterator
989 I
= DwarfRegNums
.begin(), E
= DwarfRegNums
.end(); I
!= E
; ++I
)
990 for (unsigned i
= I
->second
.size(), e
= maxLength
; i
!= e
; ++i
)
991 I
->second
.push_back(-1);
993 // Emit reverse information about the dwarf register numbers.
994 OS
<< "int " << ClassName
<< "::getLLVMRegNumFull(unsigned DwarfRegNum, "
995 << "unsigned Flavour) const {\n"
996 << " switch (Flavour) {\n"
998 << " assert(0 && \"Unknown DWARF flavour\");\n"
1001 for (unsigned i
= 0, e
= maxLength
; i
!= e
; ++i
) {
1002 OS
<< " case " << i
<< ":\n"
1003 << " switch (DwarfRegNum) {\n"
1005 << " assert(0 && \"Invalid DwarfRegNum\");\n"
1008 for (DwarfRegNumsMapTy::iterator
1009 I
= DwarfRegNums
.begin(), E
= DwarfRegNums
.end(); I
!= E
; ++I
) {
1010 int DwarfRegNo
= I
->second
[i
];
1011 if (DwarfRegNo
>= 0)
1012 OS
<< " case " << DwarfRegNo
<< ":\n"
1013 << " return " << getQualifiedName(I
->first
) << ";\n";
1020 for (unsigned i
= 0, e
= Regs
.size(); i
!= e
; ++i
) {
1021 Record
*Reg
= Regs
[i
].TheDef
;
1022 const RecordVal
*V
= Reg
->getValue("DwarfAlias");
1023 if (!V
|| !V
->getValue())
1026 DefInit
*DI
= dynamic_cast<DefInit
*>(V
->getValue());
1027 Record
*Alias
= DI
->getDef();
1028 DwarfRegNums
[Reg
] = DwarfRegNums
[Alias
];
1031 // Emit information about the dwarf register numbers.
1032 OS
<< "int " << ClassName
<< "::getDwarfRegNumFull(unsigned RegNum, "
1033 << "unsigned Flavour) const {\n"
1034 << " switch (Flavour) {\n"
1036 << " assert(0 && \"Unknown DWARF flavour\");\n"
1039 for (unsigned i
= 0, e
= maxLength
; i
!= e
; ++i
) {
1040 OS
<< " case " << i
<< ":\n"
1041 << " switch (RegNum) {\n"
1043 << " assert(0 && \"Invalid RegNum\");\n"
1046 // Sort by name to get a stable order.
1049 for (DwarfRegNumsMapTy::iterator
1050 I
= DwarfRegNums
.begin(), E
= DwarfRegNums
.end(); I
!= E
; ++I
) {
1051 int RegNo
= I
->second
[i
];
1052 OS
<< " case " << getQualifiedName(I
->first
) << ":\n"
1053 << " return " << RegNo
<< ";\n";
1060 OS
<< "} // End llvm namespace \n";