mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-18 10:24:45 +00:00
Read in expanders too
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7678 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -42,6 +42,7 @@ void TreePatternNode::dump() const { std::cerr << *this; }
|
|||||||
///
|
///
|
||||||
void InstrSelectorEmitter::ProcessNodeTypes() {
|
void InstrSelectorEmitter::ProcessNodeTypes() {
|
||||||
std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
|
std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
|
||||||
|
DEBUG(std::cerr << "Getting node types: ");
|
||||||
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
|
||||||
Record *Node = Nodes[i];
|
Record *Node = Nodes[i];
|
||||||
|
|
||||||
@@ -70,8 +71,9 @@ void InstrSelectorEmitter::ProcessNodeTypes() {
|
|||||||
|
|
||||||
// Add the node type mapping now...
|
// Add the node type mapping now...
|
||||||
NodeTypes[Node] = NodeType(RetTy, ArgTypes);
|
NodeTypes[Node] = NodeType(RetTy, ArgTypes);
|
||||||
DEBUG(std::cerr << "Got node type '" << Node->getName() << "'\n");
|
DEBUG(std::cerr << Node->getName() << ", ");
|
||||||
}
|
}
|
||||||
|
DEBUG(std::cerr << "DONE!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static MVT::ValueType getIntrinsicType(Record *R) {
|
static MVT::ValueType getIntrinsicType(Record *R) {
|
||||||
@@ -106,10 +108,10 @@ Pattern::Pattern(PatternType pty, DagInit *RawPat, Record *TheRec,
|
|||||||
AnyUnset = InferTypes(Tree, MadeChange);
|
AnyUnset = InferTypes(Tree, MadeChange);
|
||||||
} while ((AnyUnset || MadeChange) && !(AnyUnset && !MadeChange));
|
} while ((AnyUnset || MadeChange) && !(AnyUnset && !MadeChange));
|
||||||
|
|
||||||
if (PTy == Instruction) {
|
if (PTy == Instruction || PTy == Expander) {
|
||||||
// Check to make sure there is not any unset types in the tree pattern...
|
// Check to make sure there is not any unset types in the tree pattern...
|
||||||
if (AnyUnset) {
|
if (AnyUnset) {
|
||||||
std::cerr << "In instruction pattern: " << *Tree << "\n";
|
std::cerr << "In pattern: " << *Tree << "\n";
|
||||||
error("Could not infer all types!");
|
error("Could not infer all types!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,6 +298,20 @@ void InstrSelectorEmitter::ProcessInstructionPatterns() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ProcessExpanderPatterns - Read in all expander patterns...
|
||||||
|
///
|
||||||
|
void InstrSelectorEmitter::ProcessExpanderPatterns() {
|
||||||
|
std::vector<Record*> Expanders = Records.getAllDerivedDefinitions("Expander");
|
||||||
|
for (unsigned i = 0, e = Expanders.size(); i != e; ++i) {
|
||||||
|
Record *Expander = Expanders[i];
|
||||||
|
DagInit *DI = Expanders[i]->getValueAsDag("Pattern");
|
||||||
|
|
||||||
|
Pattern *P = new Pattern(Pattern::Expander, DI, Expanders[i], *this);
|
||||||
|
|
||||||
|
DEBUG(std::cerr << "Parsed " << *P << "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void InstrSelectorEmitter::run(std::ostream &OS) {
|
void InstrSelectorEmitter::run(std::ostream &OS) {
|
||||||
// Type-check all of the node types to ensure we "understand" them.
|
// Type-check all of the node types to ensure we "understand" them.
|
||||||
@@ -308,5 +324,5 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
|
|||||||
ProcessInstructionPatterns();
|
ProcessInstructionPatterns();
|
||||||
|
|
||||||
// Read all of the Expander patterns in...
|
// Read all of the Expander patterns in...
|
||||||
|
ProcessExpanderPatterns();
|
||||||
}
|
}
|
||||||
|
@@ -199,6 +199,9 @@ private:
|
|||||||
// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
|
// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
|
||||||
// process those with a useful Pattern field.
|
// process those with a useful Pattern field.
|
||||||
void ProcessInstructionPatterns();
|
void ProcessInstructionPatterns();
|
||||||
|
|
||||||
|
// ProcessExpanderPatterns - Read in all of the expanded patterns.
|
||||||
|
void ProcessExpanderPatterns();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -42,6 +42,7 @@ void TreePatternNode::dump() const { std::cerr << *this; }
|
|||||||
///
|
///
|
||||||
void InstrSelectorEmitter::ProcessNodeTypes() {
|
void InstrSelectorEmitter::ProcessNodeTypes() {
|
||||||
std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
|
std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("DagNode");
|
||||||
|
DEBUG(std::cerr << "Getting node types: ");
|
||||||
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
|
||||||
Record *Node = Nodes[i];
|
Record *Node = Nodes[i];
|
||||||
|
|
||||||
@@ -70,8 +71,9 @@ void InstrSelectorEmitter::ProcessNodeTypes() {
|
|||||||
|
|
||||||
// Add the node type mapping now...
|
// Add the node type mapping now...
|
||||||
NodeTypes[Node] = NodeType(RetTy, ArgTypes);
|
NodeTypes[Node] = NodeType(RetTy, ArgTypes);
|
||||||
DEBUG(std::cerr << "Got node type '" << Node->getName() << "'\n");
|
DEBUG(std::cerr << Node->getName() << ", ");
|
||||||
}
|
}
|
||||||
|
DEBUG(std::cerr << "DONE!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static MVT::ValueType getIntrinsicType(Record *R) {
|
static MVT::ValueType getIntrinsicType(Record *R) {
|
||||||
@@ -106,10 +108,10 @@ Pattern::Pattern(PatternType pty, DagInit *RawPat, Record *TheRec,
|
|||||||
AnyUnset = InferTypes(Tree, MadeChange);
|
AnyUnset = InferTypes(Tree, MadeChange);
|
||||||
} while ((AnyUnset || MadeChange) && !(AnyUnset && !MadeChange));
|
} while ((AnyUnset || MadeChange) && !(AnyUnset && !MadeChange));
|
||||||
|
|
||||||
if (PTy == Instruction) {
|
if (PTy == Instruction || PTy == Expander) {
|
||||||
// Check to make sure there is not any unset types in the tree pattern...
|
// Check to make sure there is not any unset types in the tree pattern...
|
||||||
if (AnyUnset) {
|
if (AnyUnset) {
|
||||||
std::cerr << "In instruction pattern: " << *Tree << "\n";
|
std::cerr << "In pattern: " << *Tree << "\n";
|
||||||
error("Could not infer all types!");
|
error("Could not infer all types!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,6 +298,20 @@ void InstrSelectorEmitter::ProcessInstructionPatterns() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ProcessExpanderPatterns - Read in all expander patterns...
|
||||||
|
///
|
||||||
|
void InstrSelectorEmitter::ProcessExpanderPatterns() {
|
||||||
|
std::vector<Record*> Expanders = Records.getAllDerivedDefinitions("Expander");
|
||||||
|
for (unsigned i = 0, e = Expanders.size(); i != e; ++i) {
|
||||||
|
Record *Expander = Expanders[i];
|
||||||
|
DagInit *DI = Expanders[i]->getValueAsDag("Pattern");
|
||||||
|
|
||||||
|
Pattern *P = new Pattern(Pattern::Expander, DI, Expanders[i], *this);
|
||||||
|
|
||||||
|
DEBUG(std::cerr << "Parsed " << *P << "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void InstrSelectorEmitter::run(std::ostream &OS) {
|
void InstrSelectorEmitter::run(std::ostream &OS) {
|
||||||
// Type-check all of the node types to ensure we "understand" them.
|
// Type-check all of the node types to ensure we "understand" them.
|
||||||
@@ -308,5 +324,5 @@ void InstrSelectorEmitter::run(std::ostream &OS) {
|
|||||||
ProcessInstructionPatterns();
|
ProcessInstructionPatterns();
|
||||||
|
|
||||||
// Read all of the Expander patterns in...
|
// Read all of the Expander patterns in...
|
||||||
|
ProcessExpanderPatterns();
|
||||||
}
|
}
|
||||||
|
@@ -199,6 +199,9 @@ private:
|
|||||||
// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
|
// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
|
||||||
// process those with a useful Pattern field.
|
// process those with a useful Pattern field.
|
||||||
void ProcessInstructionPatterns();
|
void ProcessInstructionPatterns();
|
||||||
|
|
||||||
|
// ProcessExpanderPatterns - Read in all of the expanded patterns.
|
||||||
|
void ProcessExpanderPatterns();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user