From b84628679ad7240a63d267fc6388efbc1e91f588 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 18 Jul 2006 17:56:07 +0000 Subject: [PATCH] Change generator to remove operands as it processes them. No change in generated file. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29183 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/AsmWriterEmitter.cpp | 36 +++++++++++++++++------------ utils/TableGen/AsmWriterEmitter.h | 3 +-- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/utils/TableGen/AsmWriterEmitter.cpp b/utils/TableGen/AsmWriterEmitter.cpp index 7162590cc1d..016bac5c760 100644 --- a/utils/TableGen/AsmWriterEmitter.cpp +++ b/utils/TableGen/AsmWriterEmitter.cpp @@ -330,7 +330,7 @@ static void EmitInstructions(std::vector &Insts, void AsmWriterEmitter:: FindUniqueOperandCommands(std::vector &UniqueOperandCommands, - std::vector &InstIdxs, unsigned Op) const { + std::vector &InstIdxs) const { InstIdxs.clear(); InstIdxs.resize(NumberedInstructions.size()); @@ -345,13 +345,13 @@ FindUniqueOperandCommands(std::vector &UniqueOperandCommands, if (Inst == 0) continue; // PHI, INLINEASM, etc. std::string Command; - if (Op >= Inst->Operands.size()) + if (Inst->Operands.empty()) continue; // Instruction already done. - Command = " " + Inst->Operands[Op].getCode() + "\n"; + Command = " " + Inst->Operands[0].getCode() + "\n"; // If this is the last operand, emit a return. - if (Op == Inst->Operands.size()-1) + if (Inst->Operands.size() == 1) Command += " return true;\n"; // Check to see if we already have 'Command' in UniqueOperandCommands. @@ -463,16 +463,19 @@ void AsmWriterEmitter::run(std::ostream &O) { std::vector > TableDrivenOperandPrinters; - for (unsigned i = 0; ; ++i) { + bool isFirst = true; + while (1) { std::vector UniqueOperandCommands; // For the first operand check, add a default value that unhandled // instructions will use. - if (i == 0) + if (isFirst) { UniqueOperandCommands.push_back(" return false;\n"); + isFirst = false; + } std::vector InstIdxs; - FindUniqueOperandCommands(UniqueOperandCommands, InstIdxs, i); + FindUniqueOperandCommands(UniqueOperandCommands, InstIdxs); // If we ran out of operands to print, we're done. if (UniqueOperandCommands.empty()) break; @@ -495,6 +498,14 @@ void AsmWriterEmitter::run(std::ostream &O) { for (unsigned i = 0, e = InstIdxs.size(); i != e; ++i) OpcodeInfo[i] |= InstIdxs[i] << (BitsLeft+AsmStrBits); + // Remove the info about this operand. + for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) { + if (AsmWriterInst *Inst = getAsmWriterInstByID(i)) + if (!Inst->Operands.empty()) + Inst->Operands.erase(Inst->Operands.begin()); + } + + // Remember the handlers for this set of operands. TableDrivenOperandPrinters.push_back(UniqueOperandCommands); } @@ -590,18 +601,13 @@ void AsmWriterEmitter::run(std::ostream &O) { } } - // Okay, go through and strip out the operand information that we just - // emitted. - unsigned NumOpsToRemove = TableDrivenOperandPrinters.size(); + // Okay, delete instructions with no operand info left. for (unsigned i = 0, e = Instructions.size(); i != e; ++i) { // Entire instruction has been emitted? AsmWriterInst &Inst = Instructions[i]; - if (Inst.Operands.size() <= NumOpsToRemove) { + if (Inst.Operands.empty()) { Instructions.erase(Instructions.begin()+i); - --i; --e; - } else { - Inst.Operands.erase(Inst.Operands.begin(), - Inst.Operands.begin()+NumOpsToRemove); + --i; --e; } } diff --git a/utils/TableGen/AsmWriterEmitter.h b/utils/TableGen/AsmWriterEmitter.h index c7a9c60bff5..5def47efddd 100644 --- a/utils/TableGen/AsmWriterEmitter.h +++ b/utils/TableGen/AsmWriterEmitter.h @@ -43,8 +43,7 @@ private: return I->second; } void FindUniqueOperandCommands(std::vector &UOC, - std::vector &InstIdxs, - unsigned Op) const; + std::vector &InstIdxs) const; }; } #endif