diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-06-15 07:22:16 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-06-15 07:22:16 +0000 |
commit | 8d3af5e7d082dbd029c3987ceadbdcf9e49af6d7 (patch) | |
tree | 547f49ec73cb087e6ccee2b0779efc5f2fc335ab /utils/TableGen/InstrInfoEmitter.cpp | |
parent | d7c2c86239dd543906c363e45e18766223d14c6e (diff) | |
download | llvm-8d3af5e7d082dbd029c3987ceadbdcf9e49af6d7.tar.gz llvm-8d3af5e7d082dbd029c3987ceadbdcf9e49af6d7.tar.bz2 llvm-8d3af5e7d082dbd029c3987ceadbdcf9e49af6d7.tar.xz |
Instructions with variable operands (variable_ops) can have a number required
operands. e.g.
def CALL32r : I<0xFF, MRM2r, (ops GR32:$dst, variable_ops),
"call {*}$dst", [(X86call GR32:$dst)]>;
TableGen should emit operand informations for the "required" operands.
Added a target instruction info flag M_VARIABLE_OPS to indicate the target
instruction may have more operands in addition to the minimum required
operands.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28791 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/InstrInfoEmitter.cpp')
-rw-r--r-- | utils/TableGen/InstrInfoEmitter.cpp | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp index 66d17cb86b..f91babcf86 100644 --- a/utils/TableGen/InstrInfoEmitter.cpp +++ b/utils/TableGen/InstrInfoEmitter.cpp @@ -64,9 +64,6 @@ void InstrInfoEmitter::printDefList(const std::vector<Record*> &Uses, static std::vector<Record*> GetOperandInfo(const CodeGenInstruction &Inst) { std::vector<Record*> Result; - if (Inst.hasVariableNumberOfOperands) - return Result; // No info for variable operand instrs. - for (unsigned i = 0, e = Inst.OperandList.size(); i != e; ++i) { if (Inst.OperandList[i].Rec->isSubClassOf("RegisterClass")) { Result.push_back(Inst.OperandList[i].Rec); @@ -170,15 +167,13 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num, std::map<std::vector<Record*>, unsigned> &EmittedLists, std::map<std::vector<Record*>, unsigned> &OpInfo, std::ostream &OS) { - int NumOperands; - if (Inst.hasVariableNumberOfOperands) - NumOperands = -1; - else if (!Inst.OperandList.empty()) + int MinOperands; + if (!Inst.OperandList.empty()) // Each logical operand can be multiple MI operands. - NumOperands = Inst.OperandList.back().MIOperandNo + + MinOperands = Inst.OperandList.back().MIOperandNo + Inst.OperandList.back().MINumOperands; else - NumOperands = 0; + MinOperands = 0; OS << " { \""; if (Inst.Name.empty()) @@ -189,7 +184,7 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num, unsigned ItinClass = !IsItineraries ? 0 : ItinClassNumber(Inst.TheDef->getValueAsDef("Itinerary")->getName()); - OS << "\",\t" << NumOperands << ", " << ItinClass + OS << "\",\t" << MinOperands << ", " << ItinClass << ", 0"; // Try to determine (from the pattern), if the instruction is a store. @@ -224,6 +219,8 @@ void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num, if (Inst.isTerminator) OS << "|M_TERMINATOR_FLAG"; if (Inst.usesCustomDAGSchedInserter) OS << "|M_USES_CUSTOM_DAG_SCHED_INSERTION"; + if (Inst.hasVariableNumberOfOperands) + OS << "|M_VARIABLE_OPS"; OS << ", 0"; // Emit all of the target-specific flags... |