mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
Allow InstAlias's to use immediate matcher patterns that xform the value.
For example, On ARM, "mov r3, #-3" is an alias for "mvn r3, #2", so we want to use a matcher pattern that handles the bitwise negation when mapping to t2MVNi. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143233 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -428,8 +428,11 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
|
||||
if (ADI && ADI->getDef()->isSubClassOf("RegisterClass")) {
|
||||
if (!InstOpRec->isSubClassOf("RegisterClass"))
|
||||
return false;
|
||||
return T.getRegisterClass(InstOpRec)
|
||||
.hasSubClass(&T.getRegisterClass(ADI->getDef()));
|
||||
if (!T.getRegisterClass(InstOpRec)
|
||||
.hasSubClass(&T.getRegisterClass(ADI->getDef())))
|
||||
return false;
|
||||
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ADI->getDef());
|
||||
return true;
|
||||
}
|
||||
|
||||
// Handle explicit registers.
|
||||
@ -473,6 +476,7 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
|
||||
return true;
|
||||
}
|
||||
|
||||
// Literal integers.
|
||||
if (IntInit *II = dynamic_cast<IntInit*>(Arg)) {
|
||||
if (hasSubOps || !InstOpRec->isSubClassOf("Operand"))
|
||||
return false;
|
||||
@ -484,6 +488,19 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
|
||||
return true;
|
||||
}
|
||||
|
||||
// If both are Operands with the same MVT, allow the conversion. It's
|
||||
// up to the user to make sure the values are appropriate, just like
|
||||
// for isel Pat's.
|
||||
if (InstOpRec->isSubClassOf("Operand") &&
|
||||
ADI->getDef()->isSubClassOf("Operand")) {
|
||||
// FIXME: What other attributes should we check here? Identical
|
||||
// MIOperandInfo perhaps?
|
||||
if (InstOpRec->getValueInit("Type") != ADI->getDef()->getValueInit("Type"))
|
||||
return false;
|
||||
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ADI->getDef());
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user