X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FX86DisassemblerShared.h;h=58952776b7568fa13dbd723ea372b14cb28e8ece;hb=dac67649f271cc085f61d450c649a3ca271c8828;hp=c13a0cc467e195494b2d4fc2ca5de260c7b1e8cf;hpb=5a2c607153993fb7f7e04f9482520b64dffe5757;p=oota-llvm.git diff --git a/utils/TableGen/X86DisassemblerShared.h b/utils/TableGen/X86DisassemblerShared.h index c13a0cc467e..58952776b75 100644 --- a/utils/TableGen/X86DisassemblerShared.h +++ b/utils/TableGen/X86DisassemblerShared.h @@ -7,33 +7,48 @@ // //===----------------------------------------------------------------------===// -#ifndef X86DISASSEMBLERSHARED_H -#define X86DISASSEMBLERSHARED_H +#ifndef LLVM_UTILS_TABLEGEN_X86DISASSEMBLERSHARED_H +#define LLVM_UTILS_TABLEGEN_X86DISASSEMBLERSHARED_H -#include #include +#include + +#include "../../lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h" + +struct InstructionSpecifier { + llvm::X86Disassembler::OperandSpecifier + operands[llvm::X86Disassembler::X86_MAX_OPERANDS]; + llvm::X86Disassembler::InstructionContext insnContext; + std::string name; -#define INSTRUCTION_SPECIFIER_FIELDS \ - struct OperandSpecifier operands[X86_MAX_OPERANDS]; \ - bool filtered; \ - InstructionContext insnContext; \ - std::string name; \ - \ - InstructionSpecifier() { \ - filtered = false; \ - insnContext = IC; \ - name = ""; \ - modifierType = MODIFIER_NONE; \ - modifierBase = 0; \ - memset(operands, 0, sizeof(operands)); \ + InstructionSpecifier() { + insnContext = llvm::X86Disassembler::IC; + name = ""; + memset(operands, 0, sizeof(operands)); } +}; -#define INSTRUCTION_IDS \ - InstrUID instructionIDs[256]; +/// Specifies whether a ModR/M byte is needed and (if so) which +/// instruction each possible value of the ModR/M byte corresponds to. Once +/// this information is known, we have narrowed down to a single instruction. +struct ModRMDecision { + uint8_t modrm_type; + llvm::X86Disassembler::InstrUID instructionIDs[256]; +}; -#include "../../lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h" +/// Specifies which set of ModR/M->instruction tables to look at +/// given a particular opcode. +struct OpcodeDecision { + ModRMDecision modRMDecisions[256]; +}; -#undef INSTRUCTION_SPECIFIER_FIELDS -#undef INSTRUCTION_IDS +/// Specifies which opcode->instruction tables to look at given +/// a particular context (set of attributes). Since there are many possible +/// contexts, the decoder first uses CONTEXTS_SYM to determine which context +/// applies given a specific set of attributes. Hence there are only IC_max +/// entries in this table, rather than 2^(ATTR_max). +struct ContextDecision { + OpcodeDecision opcodeDecisions[llvm::X86Disassembler::IC_max]; +}; #endif