From dc1a2bd3aa199693413f39dd723cc14a77e9f131 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Fri, 14 Jan 2011 22:58:09 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123490 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/AsmMatcherEmitter.cpp | 11 ++++++++--- utils/TableGen/CodeGenInstruction.cpp | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index 511538db9d7..6262cf8cc16 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -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(); + } } } } diff --git a/utils/TableGen/CodeGenInstruction.cpp b/utils/TableGen/CodeGenInstruction.cpp index a28b1d58d7e..08005fb5e1c 100644 --- a/utils/TableGen/CodeGenInstruction.cpp +++ b/utils/TableGen/CodeGenInstruction.cpp @@ -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(0))); + ++AliasOpNo; + continue; + } } // If the operand is a record, it must have a name, and the record type must -- 2.34.1