diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-04-20 21:52:16 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-04-20 21:52:16 +0000 |
commit | 6f37488863f7db2be9294b67e01fefc01751891c (patch) | |
tree | 9b326d9d820b6c2a5b3b5b8b562ff02021a24527 /utils | |
parent | 5aacafc256d19a105f51f0b003117a2087f26557 (diff) |
Don't provide two different definitions of ModRMDecision, OpcodeDecision, and ContextDecision in different source files (depending on #define magic).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206720 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/X86DisassemblerShared.h | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/utils/TableGen/X86DisassemblerShared.h b/utils/TableGen/X86DisassemblerShared.h index 2d3d3fc1bcb..62da951be93 100644 --- a/utils/TableGen/X86DisassemblerShared.h +++ b/utils/TableGen/X86DisassemblerShared.h @@ -13,14 +13,8 @@ #include <string.h> #include <string> -#define INSTRUCTION_IDS \ - InstrUID instructionIDs[256]; - #include "../../lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h" -#undef INSTRUCTION_SPECIFIER_FIELDS -#undef INSTRUCTION_IDS - struct InstructionSpecifier { llvm::X86Disassembler::OperandSpecifier operands[X86_MAX_OPERANDS]; llvm::X86Disassembler::InstructionContext insnContext; @@ -33,4 +27,27 @@ struct InstructionSpecifier { } }; +/// 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]; +}; + +/// Specifies which set of ModR/M->instruction tables to look at +/// given a particular opcode. +struct OpcodeDecision { + ModRMDecision modRMDecisions[256]; +}; + +/// 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 |