[llvm-commits] CVS: llvm/utils/TableGen/CodeGenRegisters.h CodeGenTarget.cpp DAGISelEmitter.cpp RegisterInfoEmitter.cpp
Nate Begeman
natebegeman at mac.com
Wed Nov 30 20:51:24 PST 2005
Changes in directory llvm/utils/TableGen:
CodeGenRegisters.h updated: 1.8 -> 1.9
CodeGenTarget.cpp updated: 1.45 -> 1.46
DAGISelEmitter.cpp updated: 1.80 -> 1.81
RegisterInfoEmitter.cpp updated: 1.37 -> 1.38
---
Log message:
Support multiple ValueTypes per RegisterClass, needed for upcoming vector
work. This change has no effect on generated code.
---
Diffs of the changes: (+57 -17)
CodeGenRegisters.h | 9 ++++++++-
CodeGenTarget.cpp | 28 ++++++++++++++++++++--------
DAGISelEmitter.cpp | 16 ++++++++++------
RegisterInfoEmitter.cpp | 21 +++++++++++++++++++--
4 files changed, 57 insertions(+), 17 deletions(-)
Index: llvm/utils/TableGen/CodeGenRegisters.h
diff -u llvm/utils/TableGen/CodeGenRegisters.h:1.8 llvm/utils/TableGen/CodeGenRegisters.h:1.9
--- llvm/utils/TableGen/CodeGenRegisters.h:1.8 Thu Sep 8 16:43:21 2005
+++ llvm/utils/TableGen/CodeGenRegisters.h Wed Nov 30 22:51:06 2005
@@ -35,13 +35,20 @@
Record *TheDef;
std::string Namespace;
std::vector<Record*> Elements;
+ std::vector<MVT::ValueType> VTs;
unsigned SpillSize;
unsigned SpillAlignment;
- MVT::ValueType VT;
std::string MethodProtos, MethodBodies;
const std::string &getName() const;
+ const MVT::ValueType getValueTypeNum(unsigned VTNum) const {
+ if (VTNum < VTs.size())
+ return VTs[VTNum];
+ assert(0 && "VTNum greater than number of ValueTypes in RegClass!");
+ abort();
+ }
+
CodeGenRegisterClass(Record *R);
};
}
Index: llvm/utils/TableGen/CodeGenTarget.cpp
diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.45 llvm/utils/TableGen/CodeGenTarget.cpp:1.46
--- llvm/utils/TableGen/CodeGenTarget.cpp:1.45 Wed Nov 30 18:12:04 2005
+++ llvm/utils/TableGen/CodeGenTarget.cpp Wed Nov 30 22:51:06 2005
@@ -154,13 +154,15 @@
R->setName("AnonRegClass_"+utostr(AnonCounter++));
}
- Namespace = R->getValueAsString("Namespace");
- SpillSize = R->getValueAsInt("Size");
- SpillAlignment = R->getValueAsInt("Alignment");
- VT = getValueType(R->getValueAsDef("RegType"));
-
- MethodBodies = R->getValueAsCode("MethodBodies");
- MethodProtos = R->getValueAsCode("MethodProtos");
+ std::vector<Record*> TypeList = R->getValueAsListOfDefs("RegTypes");
+ for (unsigned i = 0, e = TypeList.size(); i != e; ++i) {
+ Record *Type = TypeList[i];
+ if (!Type->isSubClassOf("ValueType"))
+ throw "RegTypes list member '" + Type->getName() +
+ "' does not derive from the ValueType class!";
+ VTs.push_back(getValueType(Type));
+ }
+ assert(!VTs.empty() && "RegisterClass must contain at least one ValueType!");
std::vector<Record*> RegList = R->getValueAsListOfDefs("MemberList");
for (unsigned i = 0, e = RegList.size(); i != e; ++i) {
@@ -170,6 +172,15 @@
"' does not derive from the Register class!";
Elements.push_back(Reg);
}
+
+ // Allow targets to override the size in bits of the RegisterClass.
+ unsigned Size = R->getValueAsInt("Size");
+
+ Namespace = R->getValueAsString("Namespace");
+ SpillSize = Size ? Size : MVT::getSizeInBits(VTs[0]);
+ SpillAlignment = R->getValueAsInt("Alignment");
+ MethodBodies = R->getValueAsCode("MethodBodies");
+ MethodProtos = R->getValueAsCode("MethodProtos");
}
const std::string &CodeGenRegisterClass::getName() const {
@@ -179,7 +190,8 @@
void CodeGenTarget::ReadLegalValueTypes() const {
const std::vector<CodeGenRegisterClass> &RCs = getRegisterClasses();
for (unsigned i = 0, e = RCs.size(); i != e; ++i)
- LegalValueTypes.push_back(RCs[i].VT);
+ for (unsigned ri = 0, re = RCs[i].VTs.size(); ri != re; ++ri)
+ LegalValueTypes.push_back(RCs[i].VTs[ri]);
// Remove duplicates.
std::sort(LegalValueTypes.begin(), LegalValueTypes.end());
Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.80 llvm/utils/TableGen/DAGISelEmitter.cpp:1.81
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.80 Wed Nov 30 18:18:45 2005
+++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Nov 30 22:51:06 2005
@@ -455,7 +455,9 @@
// Check to see if this is a register or a register class...
if (R->isSubClassOf("RegisterClass")) {
if (NotRegisters) return MVT::isUnknown;
- return getValueType(R->getValueAsDef("RegType"));
+ const CodeGenRegisterClass &RC =
+ TP.getDAGISelEmitter().getTargetInfo().getRegisterClass(R);
+ return RC.getValueTypeNum(0);
} else if (R->isSubClassOf("PatFrag")) {
// Pattern fragment types will be resolved when they are inlined.
return MVT::isUnknown;
@@ -537,8 +539,9 @@
const CodeGenRegisterClass &RC =
TP.getDAGISelEmitter().getTargetInfo().getRegisterClass(ResultNode);
-
- bool MadeChange = UpdateNodeType(RC.VT, TP);
+
+ // Get the first ValueType in the RegClass, it's as good as any.
+ bool MadeChange = UpdateNodeType(RC.getValueTypeNum(0), TP);
if (getNumChildren() != Inst.getNumOperands())
TP.error("Instruction '" + getOperator()->getName() + " expects " +
@@ -550,7 +553,7 @@
if (OperandNode->isSubClassOf("RegisterClass")) {
const CodeGenRegisterClass &RC =
TP.getDAGISelEmitter().getTargetInfo().getRegisterClass(OperandNode);
- VT = RC.VT;
+ VT = RC.getValueTypeNum(0);
} else if (OperandNode->isSubClassOf("Operand")) {
VT = getValueType(OperandNode->getValueAsDef("Type"));
} else {
@@ -1672,7 +1675,8 @@
<< ".Val)) goto P" << PatternNo << "Fail;\n";
}
-/// getRegisterValueType - Look up and return ValueType of specified record
+/// getRegisterValueType - Look up and return the first ValueType of specified
+/// RegisterClass record
static MVT::ValueType getRegisterValueType(Record *R, const CodeGenTarget &T) {
const std::vector<CodeGenRegisterClass> &RegisterClasses =
T.getRegisterClasses();
@@ -1681,7 +1685,7 @@
const CodeGenRegisterClass &RC = RegisterClasses[i];
for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) {
if (R == RC.Elements[ei]) {
- return RC.VT;
+ return RC.getValueTypeNum(0);
}
}
}
Index: llvm/utils/TableGen/RegisterInfoEmitter.cpp
diff -u llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.37 llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.38
--- llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.37 Fri Oct 28 17:59:53 2005
+++ llvm/utils/TableGen/RegisterInfoEmitter.cpp Wed Nov 30 22:51:06 2005
@@ -109,6 +109,7 @@
// belongs to.
std::multimap<Record*, const CodeGenRegisterClass*> RegClassesBelongedTo;
+ // Emit the register enum value arrays for each RegisterClass
for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
const CodeGenRegisterClass &RC = RegisterClasses[rc];
@@ -127,6 +128,22 @@
}
OS << "\n };\n\n";
}
+
+ // Emit the ValueType arrays for each RegisterClass
+ for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) {
+ const CodeGenRegisterClass &RC = RegisterClasses[rc];
+
+ // Give the register class a legal C name if it's anonymous.
+ std::string Name = RC.TheDef->getName() + "VTs";
+
+ // Emit the register list now.
+ OS << " // " << Name
+ << " Register Class Value Types...\n const MVT::ValueType " << Name
+ << "[] = {\n ";
+ for (unsigned i = 0, e = RC.VTs.size(); i != e; ++i)
+ OS << "MVT::" << RC.VTs[i] << ", ";
+ OS << "MVT::Other\n };\n\n";
+ }
OS << "} // end anonymous namespace\n\n";
// Now that all of the structs have been emitted, emit the instances.
@@ -140,8 +157,8 @@
for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) {
const CodeGenRegisterClass &RC = RegisterClasses[i];
OS << RC.MethodBodies << "\n";
- OS << RC.getName() << "Class::" << RC.getName()
- << "Class() : TargetRegisterClass(MVT::" << getEnumName(RC.VT) << ","
+ OS << RC.getName() << "Class::" << RC.getName()
+ << "Class() : TargetRegisterClass(" << RC.getName() + "VTs" << ", "
<< RC.SpillSize/8 << ", "
<< RC.SpillAlignment/8 << ", " << RC.getName() << ", "
<< RC.getName() << " + " << RC.Elements.size() << ") {}\n";
More information about the llvm-commits
mailing list