mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-21 19:32:16 +00:00
Move some sub-register index calculations to CodeGenRegisters.cpp
Create a new CodeGenRegBank class that will eventually hold all the code that computes the register structure from Records. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132849 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c610017269
commit
dc29c44713
@ -99,3 +99,30 @@ const std::string &CodeGenRegisterClass::getName() const {
|
|||||||
return TheDef->getName();
|
return TheDef->getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// CodeGenRegBank
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
|
||||||
|
// Read in the user-defined (named) sub-register indices. More indices will
|
||||||
|
// be synthesized.
|
||||||
|
SubRegIndices = Records.getAllDerivedDefinitions("SubRegIndex");
|
||||||
|
std::sort(SubRegIndices.begin(), SubRegIndices.end(), LessRecord());
|
||||||
|
NumNamedIndices = SubRegIndices.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
Record *CodeGenRegBank::getCompositeSubRegIndex(Record *A, Record *B) {
|
||||||
|
std::string Name = A->getName() + "_then_" + B->getName();
|
||||||
|
Record *R = new Record(Name, SMLoc(), Records);
|
||||||
|
Records.addDef(R);
|
||||||
|
SubRegIndices.push_back(R);
|
||||||
|
return R;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned CodeGenRegBank::getSubRegIndexNo(Record *idx) {
|
||||||
|
std::vector<Record*>::const_iterator i =
|
||||||
|
std::find(SubRegIndices.begin(), SubRegIndices.end(), idx);
|
||||||
|
assert(i != SubRegIndices.end() && "Not a SubRegIndex");
|
||||||
|
return (i - SubRegIndices.begin()) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
class Record;
|
class Record;
|
||||||
|
class RecordKeeper;
|
||||||
|
|
||||||
/// CodeGenRegister - Represents a register definition.
|
/// CodeGenRegister - Represents a register definition.
|
||||||
struct CodeGenRegister {
|
struct CodeGenRegister {
|
||||||
@ -98,6 +99,32 @@ namespace llvm {
|
|||||||
|
|
||||||
CodeGenRegisterClass(Record *R);
|
CodeGenRegisterClass(Record *R);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// CodeGenRegBank - Represent a target's registers and the relations between
|
||||||
|
// them.
|
||||||
|
class CodeGenRegBank {
|
||||||
|
RecordKeeper &Records;
|
||||||
|
|
||||||
|
// Sub-register indices. The first NumNamedIndices are defined by the user
|
||||||
|
// in the .td files. The rest are synthesized such that all sub-registers
|
||||||
|
// have a unique name.
|
||||||
|
std::vector<Record*> SubRegIndices;
|
||||||
|
|
||||||
|
unsigned NumNamedIndices;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CodeGenRegBank(RecordKeeper&);
|
||||||
|
|
||||||
|
const std::vector<Record*> &getSubRegIndices() { return SubRegIndices; }
|
||||||
|
|
||||||
|
unsigned getNumNamedIndices() { return NumNamedIndices; }
|
||||||
|
|
||||||
|
// Map a SubRegIndex Record to its enum value.
|
||||||
|
unsigned getSubRegIndexNo(Record *idx);
|
||||||
|
|
||||||
|
// Create a new sub-register index representing the A+B composition.
|
||||||
|
Record *getCompositeSubRegIndex(Record *A, Record *B);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -108,7 +108,8 @@ std::string llvm::getQualifiedName(const Record *R) {
|
|||||||
|
|
||||||
/// getTarget - Return the current instance of the Target class.
|
/// getTarget - Return the current instance of the Target class.
|
||||||
///
|
///
|
||||||
CodeGenTarget::CodeGenTarget(RecordKeeper &records) : Records(records) {
|
CodeGenTarget::CodeGenTarget(RecordKeeper &records)
|
||||||
|
: Records(records), RegBank(0) {
|
||||||
std::vector<Record*> Targets = Records.getAllDerivedDefinitions("Target");
|
std::vector<Record*> Targets = Records.getAllDerivedDefinitions("Target");
|
||||||
if (Targets.size() == 0)
|
if (Targets.size() == 0)
|
||||||
throw std::string("ERROR: No 'Target' subclasses defined!");
|
throw std::string("ERROR: No 'Target' subclasses defined!");
|
||||||
@ -156,6 +157,12 @@ Record *CodeGenTarget::getAsmWriter() const {
|
|||||||
return LI[AsmWriterNum];
|
return LI[AsmWriterNum];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CodeGenRegBank &CodeGenTarget::getRegBank() const {
|
||||||
|
if (!RegBank)
|
||||||
|
RegBank = new CodeGenRegBank(Records);
|
||||||
|
return *RegBank;
|
||||||
|
}
|
||||||
|
|
||||||
void CodeGenTarget::ReadRegisters() const {
|
void CodeGenTarget::ReadRegisters() const {
|
||||||
std::vector<Record*> Regs = Records.getAllDerivedDefinitions("Register");
|
std::vector<Record*> Regs = Records.getAllDerivedDefinitions("Register");
|
||||||
if (Regs.empty())
|
if (Regs.empty())
|
||||||
@ -169,18 +176,6 @@ void CodeGenTarget::ReadRegisters() const {
|
|||||||
Registers[i].EnumValue = i + 1;
|
Registers[i].EnumValue = i + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenTarget::ReadSubRegIndices() const {
|
|
||||||
SubRegIndices = Records.getAllDerivedDefinitions("SubRegIndex");
|
|
||||||
std::sort(SubRegIndices.begin(), SubRegIndices.end(), LessRecord());
|
|
||||||
}
|
|
||||||
|
|
||||||
Record *CodeGenTarget::createSubRegIndex(const std::string &Name) {
|
|
||||||
Record *R = new Record(Name, SMLoc(), Records);
|
|
||||||
Records.addDef(R);
|
|
||||||
SubRegIndices.push_back(R);
|
|
||||||
return R;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeGenTarget::ReadRegisterClasses() const {
|
void CodeGenTarget::ReadRegisterClasses() const {
|
||||||
std::vector<Record*> RegClasses =
|
std::vector<Record*> RegClasses =
|
||||||
Records.getAllDerivedDefinitions("RegisterClass");
|
Records.getAllDerivedDefinitions("RegisterClass");
|
||||||
|
@ -65,12 +65,11 @@ class CodeGenTarget {
|
|||||||
Record *TargetRec;
|
Record *TargetRec;
|
||||||
|
|
||||||
mutable DenseMap<const Record*, CodeGenInstruction*> Instructions;
|
mutable DenseMap<const Record*, CodeGenInstruction*> Instructions;
|
||||||
|
mutable CodeGenRegBank *RegBank;
|
||||||
mutable std::vector<CodeGenRegister> Registers;
|
mutable std::vector<CodeGenRegister> Registers;
|
||||||
mutable std::vector<Record*> SubRegIndices;
|
|
||||||
mutable std::vector<CodeGenRegisterClass> RegisterClasses;
|
mutable std::vector<CodeGenRegisterClass> RegisterClasses;
|
||||||
mutable std::vector<MVT::SimpleValueType> LegalValueTypes;
|
mutable std::vector<MVT::SimpleValueType> LegalValueTypes;
|
||||||
void ReadRegisters() const;
|
void ReadRegisters() const;
|
||||||
void ReadSubRegIndices() const;
|
|
||||||
void ReadRegisterClasses() const;
|
void ReadRegisterClasses() const;
|
||||||
void ReadInstructions() const;
|
void ReadInstructions() const;
|
||||||
void ReadLegalValueTypes() const;
|
void ReadLegalValueTypes() const;
|
||||||
@ -98,6 +97,9 @@ public:
|
|||||||
///
|
///
|
||||||
Record *getAsmWriter() const;
|
Record *getAsmWriter() const;
|
||||||
|
|
||||||
|
/// getRegBank - Return the register bank description.
|
||||||
|
CodeGenRegBank &getRegBank() const;
|
||||||
|
|
||||||
const std::vector<CodeGenRegister> &getRegisters() const {
|
const std::vector<CodeGenRegister> &getRegisters() const {
|
||||||
if (Registers.empty()) ReadRegisters();
|
if (Registers.empty()) ReadRegisters();
|
||||||
return Registers;
|
return Registers;
|
||||||
@ -107,23 +109,6 @@ public:
|
|||||||
/// return it.
|
/// return it.
|
||||||
const CodeGenRegister *getRegisterByName(StringRef Name) const;
|
const CodeGenRegister *getRegisterByName(StringRef Name) const;
|
||||||
|
|
||||||
const std::vector<Record*> &getSubRegIndices() const {
|
|
||||||
if (SubRegIndices.empty()) ReadSubRegIndices();
|
|
||||||
return SubRegIndices;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map a SubRegIndex Record to its number.
|
|
||||||
unsigned getSubRegIndexNo(Record *idx) const {
|
|
||||||
if (SubRegIndices.empty()) ReadSubRegIndices();
|
|
||||||
std::vector<Record*>::const_iterator i =
|
|
||||||
std::find(SubRegIndices.begin(), SubRegIndices.end(), idx);
|
|
||||||
assert(i != SubRegIndices.end() && "Not a SubRegIndex");
|
|
||||||
return (i - SubRegIndices.begin()) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new SubRegIndex with the given name.
|
|
||||||
Record *createSubRegIndex(const std::string &Name);
|
|
||||||
|
|
||||||
const std::vector<CodeGenRegisterClass> &getRegisterClasses() const {
|
const std::vector<CodeGenRegisterClass> &getRegisterClasses() const {
|
||||||
if (RegisterClasses.empty()) ReadRegisterClasses();
|
if (RegisterClasses.empty()) ReadRegisterClasses();
|
||||||
return RegisterClasses;
|
return RegisterClasses;
|
||||||
|
@ -26,6 +26,7 @@ using namespace llvm;
|
|||||||
// runEnums - Print out enum values for all of the registers.
|
// runEnums - Print out enum values for all of the registers.
|
||||||
void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
|
void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
|
||||||
CodeGenTarget Target(Records);
|
CodeGenTarget Target(Records);
|
||||||
|
CodeGenRegBank &Bank = Target.getRegBank();
|
||||||
const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
|
const std::vector<CodeGenRegister> &Registers = Target.getRegisters();
|
||||||
|
|
||||||
std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace");
|
std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace");
|
||||||
@ -47,14 +48,14 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS) {
|
|||||||
if (!Namespace.empty())
|
if (!Namespace.empty())
|
||||||
OS << "}\n";
|
OS << "}\n";
|
||||||
|
|
||||||
const std::vector<Record*> SubRegIndices = Target.getSubRegIndices();
|
const std::vector<Record*> &SubRegIndices = Bank.getSubRegIndices();
|
||||||
if (!SubRegIndices.empty()) {
|
if (!SubRegIndices.empty()) {
|
||||||
OS << "\n// Subregister indices\n";
|
OS << "\n// Subregister indices\n";
|
||||||
Namespace = SubRegIndices[0]->getValueAsString("Namespace");
|
Namespace = SubRegIndices[0]->getValueAsString("Namespace");
|
||||||
if (!Namespace.empty())
|
if (!Namespace.empty())
|
||||||
OS << "namespace " << Namespace << " {\n";
|
OS << "namespace " << Namespace << " {\n";
|
||||||
OS << "enum {\n NoSubRegister,\n";
|
OS << "enum {\n NoSubRegister,\n";
|
||||||
for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i)
|
for (unsigned i = 0, e = Bank.getNumNamedIndices(); i != e; ++i)
|
||||||
OS << " " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
|
OS << " " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
|
||||||
OS << " NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices.size()+1 << "\n";
|
OS << " NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices.size()+1 << "\n";
|
||||||
OS << "};\n";
|
OS << "};\n";
|
||||||
@ -257,8 +258,8 @@ RegisterMaps::SubRegMap &RegisterMaps::inferSubRegIndices(Record *Reg,
|
|||||||
++I) {
|
++I) {
|
||||||
Record *&Comp = Composite[I->second];
|
Record *&Comp = Composite[I->second];
|
||||||
if (!Comp)
|
if (!Comp)
|
||||||
Comp = Target.createSubRegIndex(I->second.first->getName() + "_then_" +
|
Comp = Target.getRegBank().getCompositeSubRegIndex(I->second.first,
|
||||||
I->second.second->getName());
|
I->second.second);
|
||||||
SRM[Comp] = I->first;
|
SRM[Comp] = I->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,6 +339,7 @@ public:
|
|||||||
//
|
//
|
||||||
void RegisterInfoEmitter::run(raw_ostream &OS) {
|
void RegisterInfoEmitter::run(raw_ostream &OS) {
|
||||||
CodeGenTarget Target(Records);
|
CodeGenTarget Target(Records);
|
||||||
|
CodeGenRegBank &RegBank = Target.getRegBank();
|
||||||
EmitSourceFileHeader("Register Information Source Fragment", OS);
|
EmitSourceFileHeader("Register Information Source Fragment", OS);
|
||||||
|
|
||||||
OS << "namespace llvm {\n\n";
|
OS << "namespace llvm {\n\n";
|
||||||
@ -404,7 +406,7 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
|
|||||||
std::map<unsigned, std::set<unsigned> > SuperRegClassMap;
|
std::map<unsigned, std::set<unsigned> > SuperRegClassMap;
|
||||||
OS << "\n";
|
OS << "\n";
|
||||||
|
|
||||||
unsigned NumSubRegIndices = Target.getSubRegIndices().size();
|
unsigned NumSubRegIndices = RegBank.getSubRegIndices().size();
|
||||||
|
|
||||||
if (NumSubRegIndices) {
|
if (NumSubRegIndices) {
|
||||||
// Emit the sub-register classes for each RegisterClass
|
// Emit the sub-register classes for each RegisterClass
|
||||||
@ -415,7 +417,7 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
|
|||||||
i = RC.SubRegClasses.begin(),
|
i = RC.SubRegClasses.begin(),
|
||||||
e = RC.SubRegClasses.end(); i != e; ++i) {
|
e = RC.SubRegClasses.end(); i != e; ++i) {
|
||||||
// Build SRC array.
|
// Build SRC array.
|
||||||
unsigned idx = Target.getSubRegIndexNo(i->first);
|
unsigned idx = RegBank.getSubRegIndexNo(i->first);
|
||||||
SRC.at(idx-1) = i->second;
|
SRC.at(idx-1) = i->second;
|
||||||
|
|
||||||
// Find the register class number of i->second for SuperRegClassMap.
|
// Find the register class number of i->second for SuperRegClassMap.
|
||||||
@ -863,13 +865,13 @@ void RegisterInfoEmitter::run(raw_ostream &OS) {
|
|||||||
|
|
||||||
// Calculate the mapping of subregister+index pairs to physical registers.
|
// Calculate the mapping of subregister+index pairs to physical registers.
|
||||||
// This will also create further anonymous indexes.
|
// This will also create further anonymous indexes.
|
||||||
unsigned NamedIndices = Target.getSubRegIndices().size();
|
unsigned NamedIndices = RegBank.getNumNamedIndices();
|
||||||
RegisterMaps RegMaps;
|
RegisterMaps RegMaps;
|
||||||
for (unsigned i = 0, e = Regs.size(); i != e; ++i)
|
for (unsigned i = 0, e = Regs.size(); i != e; ++i)
|
||||||
RegMaps.inferSubRegIndices(Regs[i].TheDef, Target);
|
RegMaps.inferSubRegIndices(Regs[i].TheDef, Target);
|
||||||
|
|
||||||
// Emit SubRegIndex names, skipping 0
|
// Emit SubRegIndex names, skipping 0
|
||||||
const std::vector<Record*> SubRegIndices = Target.getSubRegIndices();
|
const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices();
|
||||||
OS << "\n const char *const SubRegIndexTable[] = { \"";
|
OS << "\n const char *const SubRegIndexTable[] = { \"";
|
||||||
for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
|
for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) {
|
||||||
OS << SubRegIndices[i]->getName();
|
OS << SubRegIndices[i]->getName();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user