mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
TableGen: Generate an enum for all named Operand types in tblgen'd InstrInfo.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194978 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0df7f51365
commit
b923d2f5f5
@ -955,6 +955,50 @@ XXXInstrInfo.h:
|
|||||||
int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIndex);
|
int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIndex);
|
||||||
} // End namespace XXX
|
} // End namespace XXX
|
||||||
|
|
||||||
|
Instruction Operand Types
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
TableGen will also generate an enumeration consisting of all named Operand
|
||||||
|
types defined in the backend, in the llvm::XXX::OpTypes namespace.
|
||||||
|
Some common immediate Operand types (for instance i8, i32, i64, f32, f64)
|
||||||
|
are defined for all targets in ``include/llvm/Target/Target.td``, and are
|
||||||
|
available in each Target's OpTypes enum. Also, only named Operand types appear
|
||||||
|
in the enumeration: anonymous types are ignored.
|
||||||
|
For example, the X86 backend defines ``brtarget`` and ``brtarget8``, both
|
||||||
|
instances of the TableGen ``Operand`` class, which represent branch target
|
||||||
|
operands:
|
||||||
|
|
||||||
|
.. code-block:: llvm
|
||||||
|
|
||||||
|
def brtarget : Operand<OtherVT>;
|
||||||
|
def brtarget8 : Operand<OtherVT>;
|
||||||
|
|
||||||
|
This results in:
|
||||||
|
|
||||||
|
.. code-block:: c++
|
||||||
|
namespace X86 {
|
||||||
|
namespace OpTypes {
|
||||||
|
enum OperandType {
|
||||||
|
...
|
||||||
|
brtarget,
|
||||||
|
brtarget8,
|
||||||
|
...
|
||||||
|
i32imm,
|
||||||
|
i64imm,
|
||||||
|
...
|
||||||
|
OPERAND_TYPE_LIST_END
|
||||||
|
} // End namespace OpTypes
|
||||||
|
} // End namespace X86
|
||||||
|
|
||||||
|
In typical TableGen fashion, to use the enum, you will need to define a
|
||||||
|
preprocessor macro:
|
||||||
|
|
||||||
|
.. code-block:: c++
|
||||||
|
|
||||||
|
#define GET_INSTRINFO_OPERAND_TYPES_ENUM // For OpTypes enum
|
||||||
|
#include "XXXGenInstrInfo.inc"
|
||||||
|
|
||||||
|
|
||||||
Instruction Scheduling
|
Instruction Scheduling
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ private:
|
|||||||
std::map<std::vector<Record*>, unsigned> &EL,
|
std::map<std::vector<Record*>, unsigned> &EL,
|
||||||
const OperandInfoMapTy &OpInfo,
|
const OperandInfoMapTy &OpInfo,
|
||||||
raw_ostream &OS);
|
raw_ostream &OS);
|
||||||
|
void emitOperandTypesEnum(raw_ostream &OS, const CodeGenTarget &Target);
|
||||||
void initOperandMapData(
|
void initOperandMapData(
|
||||||
const std::vector<const CodeGenInstruction *> NumberedInstructions,
|
const std::vector<const CodeGenInstruction *> NumberedInstructions,
|
||||||
const std::string &Namespace,
|
const std::string &Namespace,
|
||||||
@ -311,6 +312,34 @@ void InstrInfoEmitter::emitOperandNameMappings(raw_ostream &OS,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Generate an enum for all the operand types for this target, under the
|
||||||
|
/// llvm::TargetNamespace::OpTypes namespace.
|
||||||
|
/// Operand types are all definitions derived of the Operand Target.td class.
|
||||||
|
void InstrInfoEmitter::emitOperandTypesEnum(raw_ostream &OS,
|
||||||
|
const CodeGenTarget &Target) {
|
||||||
|
|
||||||
|
const std::string &Namespace = Target.getInstNamespace();
|
||||||
|
std::vector<Record *> Operands = Records.getAllDerivedDefinitions("Operand");
|
||||||
|
|
||||||
|
OS << "\n#ifdef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
|
||||||
|
OS << "#undef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
|
||||||
|
OS << "namespace llvm {";
|
||||||
|
OS << "namespace " << Namespace << " {\n";
|
||||||
|
OS << "namespace OpTypes { \n";
|
||||||
|
OS << "enum OperandType {\n";
|
||||||
|
|
||||||
|
for (unsigned oi = 0, oe = Operands.size(); oi != oe; ++oi) {
|
||||||
|
if (!Operands[oi]->isAnonymous())
|
||||||
|
OS << " " << Operands[oi]->getName() << " = " << oi << ",\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
OS << " OPERAND_TYPE_LIST_END" << "\n};\n";
|
||||||
|
OS << "} // End namespace OpTypes\n";
|
||||||
|
OS << "} // End namespace " << Namespace << "\n";
|
||||||
|
OS << "} // End namespace llvm\n";
|
||||||
|
OS << "#endif // GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Main Output.
|
// Main Output.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -432,6 +461,8 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
|
|||||||
OS << "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
|
OS << "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
|
||||||
|
|
||||||
emitOperandNameMappings(OS, Target, NumberedInstructions);
|
emitOperandNameMappings(OS, Target, NumberedInstructions);
|
||||||
|
|
||||||
|
emitOperandTypesEnum(OS, Target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
|
||||||
|
Loading…
Reference in New Issue
Block a user