summaryrefslogtreecommitdiffstats
path: root/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-07 19:59:42 +0000
committerChris Lattner <sabre@nondot.org>2003-08-07 19:59:42 +0000
commitca89a11494663c3aeaf25c75dae0c3eb8b514d2d (patch)
tree3480f7b96782dc7fbb78a27e954cd7fa2068bb7f /llvm/support/tools/TableGen/InstrSelectorEmitter.cpp
parentbd1ffb4ea1fa0552441590a6fa7dc53413c6c643 (diff)
downloadbcm5719-llvm-ca89a11494663c3aeaf25c75dae0c3eb8b514d2d.tar.gz
bcm5719-llvm-ca89a11494663c3aeaf25c75dae0c3eb8b514d2d.zip
Add support for "cast" nodes, which are required when there is not enough information
to infer type type of all nodes, e.g. (ret imm) llvm-svn: 7684
Diffstat (limited to 'llvm/support/tools/TableGen/InstrSelectorEmitter.cpp')
-rw-r--r--llvm/support/tools/TableGen/InstrSelectorEmitter.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp b/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp
index b9f0d6e240d..b33888acda3 100644
--- a/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp
+++ b/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp
@@ -52,6 +52,7 @@ std::ostream &operator<<(std::ostream &OS, const TreePatternNode &N) {
}
return OS << ")";
}
+
void TreePatternNode::dump() const { std::cerr << *this; }
//===----------------------------------------------------------------------===//
@@ -126,11 +127,33 @@ static MVT::ValueType getIntrinsicType(Record *R) {
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
Record *Operator = DI->getNodeType();
+ const std::vector<Init*> &Args = DI->getArgs();
+
+ if (Operator->isSubClassOf("ValueType")) {
+ // If the operator is a ValueType, then this must be "type cast" of a leaf
+ // node.
+ if (Args.size() != 1)
+ error("Type cast only valid for a leaf node!");
+
+ Init *Arg = Args[0];
+ TreePatternNode *New;
+ if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
+ New = new TreePatternNode(DI);
+ // If it's a regclass or something else known, set the type.
+ New->setType(getIntrinsicType(DI->getDef()));
+ } else {
+ Arg->dump();
+ error("Unknown leaf value for tree pattern!");
+ }
+
+ // Apply the type cast...
+ New->updateNodeType(getValueType(Operator), TheRecord->getName());
+ return New;
+ }
if (!ISE.getNodeTypes().count(Operator))
error("Unrecognized node '" + Operator->getName() + "'!");
- const std::vector<Init*> &Args = DI->getArgs();
std::vector<TreePatternNode*> Children;
for (unsigned i = 0, e = Args.size(); i != e; ++i) {
OpenPOWER on IntegriCloud