diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-29 20:43:05 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-29 20:43:05 +0000 |
commit | a938ac6223c5fd315ab745086d843df5e0604e09 (patch) | |
tree | f227b4a80405e6bbd2ce037939fde9f5a050bdf1 | |
parent | 2cfd52c507bd5790457a171eb9bcb39019cc6860 (diff) | |
download | external_llvm-a938ac6223c5fd315ab745086d843df5e0604e09.zip external_llvm-a938ac6223c5fd315ab745086d843df5e0604e09.tar.gz external_llvm-a938ac6223c5fd315ab745086d843df5e0604e09.tar.bz2 |
make ptr_rc derive from a new PointerLikeRegClass tblgen class.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77503 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Target/Target.td | 12 | ||||
-rw-r--r-- | utils/TableGen/CodeGenDAGPatterns.cpp | 8 | ||||
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 2 | ||||
-rw-r--r-- | utils/TableGen/InstrInfoEmitter.cpp | 2 |
4 files changed, 17 insertions, 7 deletions
diff --git a/include/llvm/Target/Target.td b/include/llvm/Target/Target.td index bdb5abb..a62036a 100644 --- a/include/llvm/Target/Target.td +++ b/include/llvm/Target/Target.td @@ -258,11 +258,21 @@ def ins; /// of operands. def variable_ops; + +/// PointerLikeRegClass - Values that are designed to have pointer width are +/// derived from this. TableGen treats the register class as having a symbolic +/// type that it doesn't know, and resolves the actual regclass to use by using +/// the TargetRegisterInfo::getPointerRegClass() hook at codegen time. +class PointerLikeRegClass { + +} + + /// ptr_rc definition - Mark this operand as being a pointer value whose /// register class is resolved dynamically via a callback to TargetInstrInfo. /// FIXME: We should probably change this to a class which contain a list of /// flags. But currently we have but one flag. -def ptr_rc; +def ptr_rc : PointerLikeRegClass; /// unknown definition - Mark this operand as being of unknown type, causing /// it to be resolved by inference in the context it is used. diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp index 2289ae7..2423ff9 100644 --- a/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/utils/TableGen/CodeGenDAGPatterns.cpp @@ -753,7 +753,7 @@ static std::vector<unsigned char> getImplicitType(Record *R, bool NotRegisters, std::vector<unsigned char> ComplexPat(1, TP.getDAGPatterns().getComplexPattern(R).getValueType()); return ComplexPat; - } else if (R->getName() == "ptr_rc") { + } else if (R->isSubClassOf("PointerLikeRegClass")) { Other[0] = MVT::iPTR; return Other; } else if (R->getName() == "node" || R->getName() == "srcvalue" || @@ -924,7 +924,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) { } else { Record *ResultNode = Inst.getResult(0); - if (ResultNode->getName() == "ptr_rc") { + if (ResultNode->isSubClassOf("PointerLikeRegClass")) { std::vector<unsigned char> VT; VT.push_back(MVT::iPTR); MadeChange = UpdateNodeType(VT, TP); @@ -968,7 +968,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) { } else if (OperandNode->isSubClassOf("Operand")) { VT = getValueType(OperandNode->getValueAsDef("Type")); MadeChange |= Child->UpdateNodeType(VT, TP); - } else if (OperandNode->getName() == "ptr_rc") { + } else if (OperandNode->isSubClassOf("PointerLikeRegClass")) { MadeChange |= Child->UpdateNodeType(MVT::iPTR, TP); } else if (OperandNode->getName() == "unknown") { MadeChange |= Child->UpdateNodeType(EMVT::isUnknown, TP); @@ -1602,7 +1602,7 @@ FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat, I->error("set destination should be a register!"); if (Val->getDef()->isSubClassOf("RegisterClass") || - Val->getDef()->getName() == "ptr_rc") { + Val->getDef()->isSubClassOf("PointerLikeRegClass")) { if (Dest->getName().empty()) I->error("set destination must have a name!"); if (InstResults.count(Dest->getName())) diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 6ec8b46..d953c13 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -698,7 +698,7 @@ public: if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) { Record *LeafRec = DI->getDef(); if (LeafRec->isSubClassOf("RegisterClass") || - LeafRec->getName() == "ptr_rc") { + LeafRec->isSubClassOf("PointerLikeRegClass")) { // Handle register references. Nothing to do here. } else if (LeafRec->isSubClassOf("Register")) { // Handle register references. diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp index 4502da1..c0e441c 100644 --- a/utils/TableGen/InstrInfoEmitter.cpp +++ b/utils/TableGen/InstrInfoEmitter.cpp @@ -100,7 +100,7 @@ InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) { Res += "0"; // Ptr value whose register class is resolved via callback. - if (OpR->getName() == "ptr_rc") + if (OpR->isSubClassOf("PointerLikeRegClass")) Res += "|(1<<TOI::LookupPtrRegClass)"; // Predicate operands. Check to see if the original unexpanded operand |