diff options
-rw-r--r-- | utils/TableGen/AsmMatcherEmitter.cpp | 11 | ||||
-rw-r--r-- | 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 511538db9d..6262cf8cc1 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 a28b1d58d7..08005fb5e1 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<Record*>(0))); + ++AliasOpNo; + continue; + } } // If the operand is a record, it must have a name, and the record type must |