From 87c5905e0b6f551e21c9a96f1b6418920d908210 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 1 Aug 2004 07:42:39 +0000 Subject: Parse the operand list of the instruction. We currently support register and immediate operands. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15390 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/CodeGenInstruction.h | 19 ++++++++++++++++- utils/TableGen/CodeGenTarget.cpp | 41 ++++++++++++++++++++++++++++++++----- utils/TableGen/CodeGenTarget.h | 1 - 3 files changed, 54 insertions(+), 7 deletions(-) (limited to 'utils') diff --git a/utils/TableGen/CodeGenInstruction.h b/utils/TableGen/CodeGenInstruction.h index 88f2c17d9d..5269cc76e2 100644 --- a/utils/TableGen/CodeGenInstruction.h +++ b/utils/TableGen/CodeGenInstruction.h @@ -14,6 +14,7 @@ #ifndef CODEGEN_INSTRUCTION_H #define CODEGEN_INSTRUCTION_H +#include "llvm/CodeGen/ValueTypes.h" #include #include #include @@ -29,10 +30,21 @@ namespace llvm { /// AsmString - The format string used to emit a .s file for the /// instruction. std::string AsmString; + + /// OperandInfo - For each operand declared in the OperandList of the + /// instruction, keep track of its record (which specifies the class of the + /// operand), its type, and the name given to the operand, if any. + struct OperandInfo { + Record *Rec; + MVT::ValueType Ty; + std::string Name; + OperandInfo(Record *R, MVT::ValueType T, const std::string &N) + : Rec(R), Ty(T), Name(N) {} + }; /// OperandList - The list of declared operands, along with their declared /// type (which is a record). - std::vector > OperandList; + std::vector OperandList; // Various boolean values we track for the instruction. bool isReturn; @@ -43,6 +55,11 @@ namespace llvm { bool isTerminator; CodeGenInstruction(Record *R); + + /// getOperandNamed - Return the index of the operand with the specified + /// non-empty name. If the instruction does not have an operand with the + /// specified name, throw an exception. + unsigned getOperandNamed(const std::string &Name) const; }; } diff --git a/utils/TableGen/CodeGenTarget.cpp b/utils/TableGen/CodeGenTarget.cpp index 422e8d0b4f..eef6afe7b0 100644 --- a/utils/TableGen/CodeGenTarget.cpp +++ b/utils/TableGen/CodeGenTarget.cpp @@ -129,16 +129,47 @@ CodeGenInstruction::CodeGenInstruction(Record *R) : TheDef(R) { isTwoAddress = R->getValueAsBit("isTwoAddress"); isTerminator = R->getValueAsBit("isTerminator"); - - //TODO: Parse OperandList try { DagInit *DI = R->getValueAsDag("OperandList"); - // Cannot handle instructions with operands yet. - if (DI->getNumArgs()) - AsmString.clear(); + for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) + if (DefInit *Arg = dynamic_cast(DI->getArg(i))) { + Record *Rec = Arg->getDef(); + MVT::ValueType Ty; + if (Rec->isSubClassOf("RegisterClass")) + Ty = getValueType(Rec->getValueAsDef("RegType")); + else if (Rec->getName() == "i8imm") + Ty = MVT::i8; + else if (Rec->getName() == "i16imm") + Ty = MVT::i16; + else if (Rec->getName() == "i32imm") + Ty = MVT::i32; + else if (Rec->getName() == "i64imm") + Ty = MVT::i64; + else + throw "Unknown operand class '" + Rec->getName() + + "' in instruction '" + R->getName() + "' instruction!"; + + OperandList.push_back(OperandInfo(Rec, Ty, DI->getArgName(i))); + } else { + throw "Illegal operand for the '" + R->getName() + "' instruction!"; + } } catch (...) { + // Error parsing operands list, just ignore it. + AsmString.clear(); + OperandList.clear(); } } + +/// getOperandNamed - Return the index of the operand with the specified +/// non-empty name. If the instruction does not have an operand with the +/// specified name, throw an exception. +unsigned CodeGenInstruction::getOperandNamed(const std::string &Name) const { + assert(!Name.empty() && "Cannot search for operand with no name!"); + for (unsigned i = 0, e = OperandList.size(); i != e; ++i) + if (OperandList[i].Name == Name) return i; + throw "Instruction '" + TheDef->getName() + + "' does not have an operand named '$" + Name + "'!"; +} diff --git a/utils/TableGen/CodeGenTarget.h b/utils/TableGen/CodeGenTarget.h index c3bd1e1153..e711b8190c 100644 --- a/utils/TableGen/CodeGenTarget.h +++ b/utils/TableGen/CodeGenTarget.h @@ -18,7 +18,6 @@ #define CODEGEN_TARGET_H #include "CodeGenInstruction.h" -#include "llvm/CodeGen/ValueTypes.h" #include #include -- cgit v1.2.3