diff options
author | Chris Lattner <sabre@nondot.org> | 2010-03-18 21:07:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-03-18 21:07:39 +0000 |
commit | f55eed299b84a9312c3c112d59ff4e6cb048b795 (patch) | |
tree | 56fcd5dda163cebfa28df57a4c72208beea7995c /utils/TableGen/CodeGenInstruction.cpp | |
parent | b7d5226a4ed0d5a7ea2441791cab093741ad5e9f (diff) | |
download | llvm-f55eed299b84a9312c3c112d59ff4e6cb048b795.tar.gz llvm-f55eed299b84a9312c3c112d59ff4e6cb048b795.tar.bz2 llvm-f55eed299b84a9312c3c112d59ff4e6cb048b795.tar.xz |
rewrite this to not artificially force concat the ins/outs list.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98870 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenInstruction.cpp')
-rw-r--r-- | utils/TableGen/CodeGenInstruction.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/utils/TableGen/CodeGenInstruction.cpp b/utils/TableGen/CodeGenInstruction.cpp index e8d0c6bb56..6ab5f06dda 100644 --- a/utils/TableGen/CodeGenInstruction.cpp +++ b/utils/TableGen/CodeGenInstruction.cpp @@ -127,30 +127,37 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr) if (neverHasSideEffects + hasSideEffects > 1) throw R->getName() + ": multiple conflicting side-effect flags set!"; - DagInit *DI = R->getValueAsDag("OutOperandList"); + DagInit *OutDI = R->getValueAsDag("OutOperandList"); - if (DefInit *Init = dynamic_cast<DefInit*>(DI->getOperator())) { + if (DefInit *Init = dynamic_cast<DefInit*>(OutDI->getOperator())) { if (Init->getDef()->getName() != "outs") throw R->getName() + ": invalid def name for output list: use 'outs'"; } else throw R->getName() + ": invalid output list: use 'outs'"; - NumDefs = DI->getNumArgs(); + NumDefs = OutDI->getNumArgs(); - DagInit *IDI = R->getValueAsDag("InOperandList"); - if (DefInit *Init = dynamic_cast<DefInit*>(IDI->getOperator())) { + DagInit *InDI = R->getValueAsDag("InOperandList"); + if (DefInit *Init = dynamic_cast<DefInit*>(InDI->getOperator())) { if (Init->getDef()->getName() != "ins") throw R->getName() + ": invalid def name for input list: use 'ins'"; } else throw R->getName() + ": invalid input list: use 'ins'"; - DI = (DagInit*)(new BinOpInit(BinOpInit::CONCAT, - DI, IDI, new DagRecTy))->Fold(R, 0); - unsigned MIOperandNo = 0; std::set<std::string> OperandNames; - for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) { - DefInit *Arg = dynamic_cast<DefInit*>(DI->getArg(i)); + for (unsigned i = 0, e = InDI->getNumArgs()+OutDI->getNumArgs(); i != e; ++i){ + Init *ArgInit; + std::string ArgName; + if (i < NumDefs) { + ArgInit = OutDI->getArg(i); + ArgName = OutDI->getArgName(i); + } else { + ArgInit = InDI->getArg(i-NumDefs); + ArgName = InDI->getArgName(i-NumDefs); + } + + DefInit *Arg = dynamic_cast<DefInit*>(ArgInit); if (!Arg) throw "Illegal operand for the '" + R->getName() + "' instruction!"; @@ -187,14 +194,14 @@ CodeGenInstruction::CodeGenInstruction(Record *R, const std::string &AsmStr) "' in '" + R->getName() + "' instruction!"; // Check that the operand has a name and that it's unique. - if (DI->getArgName(i).empty()) + if (ArgName.empty()) throw "In instruction '" + R->getName() + "', operand #" + utostr(i) + " has no name!"; - if (!OperandNames.insert(DI->getArgName(i)).second) + if (!OperandNames.insert(ArgName).second) throw "In instruction '" + R->getName() + "', operand #" + utostr(i) + " has the same name as a previous operand!"; - OperandList.push_back(OperandInfo(Rec, DI->getArgName(i), PrintMethod, + OperandList.push_back(OperandInfo(Rec, ArgName, PrintMethod, MIOperandNo, NumOps, MIOpInfo)); MIOperandNo += NumOps; } |