summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-06-15 05:09:20 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-06-15 05:09:20 +0000
commit5ee87726dd2548a91f24b94a9fbdd41c8c508bf6 (patch)
treec41fa9a21f747d505e8275ed022c715fb5a47e85
parenta337414ff468f5cac73c5ed4111b967c7c01890c (diff)
downloadbcm5719-llvm-5ee87726dd2548a91f24b94a9fbdd41c8c508bf6.tar.gz
bcm5719-llvm-5ee87726dd2548a91f24b94a9fbdd41c8c508bf6.zip
Use a SetTheory instance to expand register lists in register classes.
This prepares tablegen to compute register lists from set theoretic dag expressions. This doesn't really make any difference as long as Target.td still declares RegisterClass::MemberList as [Register]. llvm-svn: 133043
-rw-r--r--llvm/utils/TableGen/CodeGenRegisters.cpp9
-rw-r--r--llvm/utils/TableGen/CodeGenRegisters.h9
2 files changed, 13 insertions, 5 deletions
diff --git a/llvm/utils/TableGen/CodeGenRegisters.cpp b/llvm/utils/TableGen/CodeGenRegisters.cpp
index 1df9cc10bf1..37952fc36af 100644
--- a/llvm/utils/TableGen/CodeGenRegisters.cpp
+++ b/llvm/utils/TableGen/CodeGenRegisters.cpp
@@ -172,9 +172,9 @@ CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank, Record *R)
}
assert(!VTs.empty() && "RegisterClass must contain at least one ValueType!");
- Elements = R->getValueAsListOfDefs("MemberList");
- for (unsigned i = 0, e = Elements.size(); i != e; ++i)
- Members.insert(RegBank.getReg(Elements[i]));
+ Elements = RegBank.getSets().expand(R);
+ for (unsigned i = 0, e = Elements->size(); i != e; ++i)
+ Members.insert(RegBank.getReg((*Elements)[i]));
// SubRegClasses is a list<dag> containing (RC, subregindex, ...) dags.
ListInit *SRC = R->getValueAsListInit("SubRegClasses");
@@ -240,6 +240,9 @@ const std::string &CodeGenRegisterClass::getName() const {
//===----------------------------------------------------------------------===//
CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
+ // Configure register Sets to understand register classes.
+ Sets.addFieldExpander("RegisterClass", "MemberList");
+
// Read in the user-defined (named) sub-register indices.
// More indices will be synthesized later.
SubRegIndices = Records.getAllDerivedDefinitions("SubRegIndex");
diff --git a/llvm/utils/TableGen/CodeGenRegisters.h b/llvm/utils/TableGen/CodeGenRegisters.h
index d096ccd3f39..55f0b9b3aa7 100644
--- a/llvm/utils/TableGen/CodeGenRegisters.h
+++ b/llvm/utils/TableGen/CodeGenRegisters.h
@@ -16,6 +16,7 @@
#define CODEGEN_REGISTERS_H
#include "Record.h"
+#include "SetTheory.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
@@ -84,7 +85,7 @@ namespace llvm {
class CodeGenRegisterClass {
CodeGenRegister::Set Members;
- std::vector<Record*> Elements;
+ const std::vector<Record*> *Elements;
public:
Record *TheDef;
std::string Namespace;
@@ -125,7 +126,7 @@ namespace llvm {
// Returns an ordered list of class members.
// The order of registers is the same as in the .td file.
ArrayRef<Record*> getOrder() const {
- return Elements;
+ return *Elements;
}
CodeGenRegisterClass(CodeGenRegBank&, Record *R);
@@ -135,6 +136,8 @@ namespace llvm {
// them.
class CodeGenRegBank {
RecordKeeper &Records;
+ SetTheory Sets;
+
std::vector<Record*> SubRegIndices;
unsigned NumNamedIndices;
std::vector<CodeGenRegister> Registers;
@@ -154,6 +157,8 @@ namespace llvm {
public:
CodeGenRegBank(RecordKeeper&);
+ SetTheory &getSets() { return Sets; }
+
// 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.
OpenPOWER on IntegriCloud