Fix some tablegen issues to allow using zero_reg for InstAlias definitions.

This is needed to allow an InstAlias for an instruction with an "OptionalDef"
result register (like ARM's cc_out) where you want to set the optional register
to reg0.

llvm-svn: 123490
This commit is contained in:
Bob Wilson 2011-01-14 22:58:09 +00:00
parent 715e461463
commit 03912aba9a
2 changed files with 23 additions and 3 deletions

View File

@ -1380,9 +1380,14 @@ static void EmitConvertToMCInst(CodeGenTarget &Target,
break;
}
case MatchableInfo::ResOperand::RegOperand: {
std::string N = getQualifiedName(OpInfo.Register);
CaseOS << " Inst.addOperand(MCOperand::CreateReg(" << N << "));\n";
Signature += "__reg" + OpInfo.Register->getName();
if (OpInfo.Register == 0) {
CaseOS << " Inst.addOperand(MCOperand::CreateReg(0));\n";
Signature += "__reg0";
} else {
std::string N = getQualifiedName(OpInfo.Register);
CaseOS << " Inst.addOperand(MCOperand::CreateReg(" << N << "));\n";
Signature += "__reg" + OpInfo.Register->getName();
}
}
}
}

View File

@ -442,6 +442,21 @@ CodeGenInstAlias::CodeGenInstAlias(Record *R, CodeGenTarget &T) : TheDef(R) {
++AliasOpNo;
continue;
}
if (ADI->getDef()->getName() == "zero_reg") {
if (!Result->getArgName(AliasOpNo).empty())
throw TGError(R->getLoc(), "result fixed register argument must "
"not have a name!");
// Check if this is an optional def.
if (!ResultOpRec->isSubClassOf("OptionalDefOperand"))
throw TGError(R->getLoc(), "reg0 used for result that is not an "
"OptionalDefOperand!");
// Now that it is validated, add it.
ResultOperands.push_back(ResultOperand(static_cast<Record*>(0)));
++AliasOpNo;
continue;
}
}
// If the operand is a record, it must have a name, and the record type must