mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
add support for literal immediates in patterns to match, allowing us to
write things like this: def : Pat<(add GPRC:$in, 12), (ADD12 GPRC:$in)>; Andrew: if this isn't enough or doesn't work for you, please lemme know. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23819 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f6cd147471
commit
2f041d49a9
@ -1472,6 +1472,9 @@ static unsigned getPatternSize(TreePatternNode *P) {
|
||||
TreePatternNode *Child = P->getChild(i);
|
||||
if (!Child->isLeaf() && Child->getExtType() != MVT::Other)
|
||||
Size += getPatternSize(Child);
|
||||
else if (Child->isLeaf() && dynamic_cast<IntInit*>(Child->getLeafValue())) {
|
||||
++Size; // Matches a ConstantSDNode.
|
||||
}
|
||||
}
|
||||
|
||||
return Size;
|
||||
@ -1562,15 +1565,24 @@ void DAGISelEmitter::EmitMatchForPattern(TreePatternNode *N,
|
||||
}
|
||||
|
||||
// Handle leaves of various types.
|
||||
Init *LeafVal = Child->getLeafValue();
|
||||
Record *LeafRec = dynamic_cast<DefInit*>(LeafVal)->getDef();
|
||||
if (LeafRec->isSubClassOf("RegisterClass")) {
|
||||
// Handle register references. Nothing to do here.
|
||||
} else if (LeafRec->isSubClassOf("ValueType")) {
|
||||
// Make sure this is the specified value type.
|
||||
OS << " if (cast<VTSDNode>(" << RootName << i << ")->getVT() != "
|
||||
<< "MVT::" << LeafRec->getName() << ") goto P" << PatternNo
|
||||
<< "Fail;\n";
|
||||
if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) {
|
||||
Record *LeafRec = DI->getDef();
|
||||
if (LeafRec->isSubClassOf("RegisterClass")) {
|
||||
// Handle register references. Nothing to do here.
|
||||
} else if (LeafRec->isSubClassOf("ValueType")) {
|
||||
// Make sure this is the specified value type.
|
||||
OS << " if (cast<VTSDNode>(" << RootName << i << ")->getVT() != "
|
||||
<< "MVT::" << LeafRec->getName() << ") goto P" << PatternNo
|
||||
<< "Fail;\n";
|
||||
} else {
|
||||
Child->dump();
|
||||
assert(0 && "Unknown leaf type!");
|
||||
}
|
||||
} else if (IntInit *II = dynamic_cast<IntInit*>(Child->getLeafValue())) {
|
||||
OS << " if (!isa<ConstantSDNode>(" << RootName << i << ") ||\n"
|
||||
<< " cast<ConstantSDNode>(" << RootName << i
|
||||
<< ")->getValue() != " << II->getValue() << ")\n"
|
||||
<< " goto P" << PatternNo << "Fail;\n";
|
||||
} else {
|
||||
Child->dump();
|
||||
assert(0 && "Unknown leaf type!");
|
||||
|
Loading…
Reference in New Issue
Block a user