From a938ac6223c5fd315ab745086d843df5e0604e09 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 29 Jul 2009 20:43:05 +0000 Subject: [PATCH] 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 --- include/llvm/Target/Target.td | 12 +++++++++++- utils/TableGen/CodeGenDAGPatterns.cpp | 8 ++++---- utils/TableGen/DAGISelEmitter.cpp | 2 +- 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 bdb5abb517a..a62036a5203 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 2289ae789bd..2423ff93a14 100644 --- a/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/utils/TableGen/CodeGenDAGPatterns.cpp @@ -753,7 +753,7 @@ static std::vector getImplicitType(Record *R, bool NotRegisters, std::vector 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 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 6ec8b46c06c..d953c13a561 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -698,7 +698,7 @@ public: if (DefInit *DI = dynamic_cast(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 4502da176f4..c0e441cc48b 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<