mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Allow direct value types in pattern definitions.
Just like register classes, value types can be used in two ways in patterns: (sext_inreg i32:$src, i16) In a named leaf node like i32:$src, the value type simply provides the type of the node directly. This simplifies type inference a lot compared to the current practice of specifiying types indirectly with register classes. As an unnamed leaf node, like i16 above, the value type represents itself as an MVT::Other immediate. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177828 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
02327fefd8
commit
f0a804df49
@ -1378,9 +1378,25 @@ static EEVT::TypeSet getImplicitType(Record *R, unsigned ResNo,
|
||||
return EEVT::TypeSet();
|
||||
}
|
||||
|
||||
if (R->isSubClassOf("ValueType") || R->isSubClassOf("CondCode")) {
|
||||
if (R->isSubClassOf("ValueType")) {
|
||||
assert(ResNo == 0 && "This node only has one result!");
|
||||
// Using a VTSDNode or CondCodeSDNode.
|
||||
// An unnamed VTSDNode represents itself as an MVT::Other immediate.
|
||||
//
|
||||
// (sext_inreg GPR:$src, i16)
|
||||
// ~~~
|
||||
if (Unnamed)
|
||||
return EEVT::TypeSet(MVT::Other, TP);
|
||||
// With a name, the ValueType simply provides the type of the named
|
||||
// variable.
|
||||
//
|
||||
// (sext_inreg i32:$src, i16)
|
||||
// ~~~~~~~~
|
||||
return EEVT::TypeSet(getValueType(R), TP);
|
||||
}
|
||||
|
||||
if (R->isSubClassOf("CondCode")) {
|
||||
assert(ResNo == 0 && "This node only has one result!");
|
||||
// Using a CondCodeSDNode.
|
||||
return EEVT::TypeSet(MVT::Other, TP);
|
||||
}
|
||||
|
||||
|
@ -218,6 +218,17 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) {
|
||||
}
|
||||
|
||||
Record *LeafRec = DI->getDef();
|
||||
|
||||
// A ValueType leaf node can represent a register when named, or itself when
|
||||
// unnamed.
|
||||
if (LeafRec->isSubClassOf("ValueType")) {
|
||||
// A named ValueType leaf always matches: (add i32:$a, i32:$b).
|
||||
if (N->hasName())
|
||||
return;
|
||||
// An unnamed ValueType as in (sext_inreg GPR:$foo, i8).
|
||||
return AddMatcher(new CheckValueTypeMatcher(LeafRec->getName()));
|
||||
}
|
||||
|
||||
if (// Handle register references. Nothing to do here, they always match.
|
||||
LeafRec->isSubClassOf("RegisterClass") ||
|
||||
LeafRec->isSubClassOf("RegisterOperand") ||
|
||||
@ -236,9 +247,6 @@ void MatcherGen::EmitLeafMatchCode(const TreePatternNode *N) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (LeafRec->isSubClassOf("ValueType"))
|
||||
return AddMatcher(new CheckValueTypeMatcher(LeafRec->getName()));
|
||||
|
||||
if (LeafRec->isSubClassOf("CondCode"))
|
||||
return AddMatcher(new CheckCondCodeMatcher(LeafRec->getName()));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user