mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-23 22:23:00 +00:00
Add support for alternative register names, useful for instructions whose operands are logically equivalent to existing registers, but happen to be printed specially. For example, an instruciton that prints d0[0] instead of s0.
Patch by Jim Grosbach. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133940 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -871,6 +871,31 @@ AsmMatcherInfo::getOperandClass(const CGIOperandList::OperandInfo &OI,
|
||||
if (SubOpIdx != -1)
|
||||
Rec = dynamic_cast<DefInit*>(OI.MIOperandInfo->getArg(SubOpIdx))->getDef();
|
||||
|
||||
if (Rec->isSubClassOf("RegisterOperand")) {
|
||||
// RegisterOperand may have an associated ParserMatchClass. If it does,
|
||||
// use it, else just fall back to the underlying register class.
|
||||
const RecordVal *R = Rec->getValue("ParserMatchClass");
|
||||
if (R == 0 || R->getValue() == 0)
|
||||
throw "Record `" + Rec->getName() +
|
||||
"' does not have a ParserMatchClass!\n";
|
||||
|
||||
if (DefInit *DI= dynamic_cast<DefInit*>(R->getValue())) {
|
||||
Record *MatchClass = DI->getDef();
|
||||
if (ClassInfo *CI = AsmOperandClasses[MatchClass])
|
||||
return CI;
|
||||
}
|
||||
|
||||
// No custom match class. Just use the register class.
|
||||
Record *ClassRec = Rec->getValueAsDef("RegClass");
|
||||
if (!ClassRec)
|
||||
throw TGError(Rec->getLoc(), "RegisterOperand `" + Rec->getName() +
|
||||
"' has no associated register class!\n");
|
||||
if (ClassInfo *CI = RegisterClassClasses[ClassRec])
|
||||
return CI;
|
||||
throw TGError(Rec->getLoc(), "register class has no class info!");
|
||||
}
|
||||
|
||||
|
||||
if (Rec->isSubClassOf("RegisterClass")) {
|
||||
if (ClassInfo *CI = RegisterClassClasses[Rec])
|
||||
return CI;
|
||||
|
||||
Reference in New Issue
Block a user