Skip to content

Commit

Permalink
Don't provide two different definitions of ModRMDecision, OpcodeDecis…
Browse files Browse the repository at this point in the history
…ion, 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
  • Loading branch information
zygoloid committed Apr 20, 2014
1 parent 5aacafc commit 6f37488
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 43 deletions.
23 changes: 23 additions & 0 deletions lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,29 @@

using namespace llvm::X86Disassembler;

/// 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;
uint16_t instructionIDs;
};

/// 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[IC_max];
};

#include "X86GenDisassemblerTables.inc"

#define TRUE 1
Expand Down
6 changes: 0 additions & 6 deletions lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,8 @@
#ifndef X86DISASSEMBLERDECODER_H
#define X86DISASSEMBLERDECODER_H

#define INSTRUCTION_IDS \
uint16_t instructionIDs;

#include "X86DisassemblerDecoderCommon.h"

#undef INSTRUCTION_SPECIFIER_FIELDS
#undef INSTRUCTION_IDS

namespace llvm {
namespace X86Disassembler {

Expand Down
31 changes: 0 additions & 31 deletions lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -337,37 +337,6 @@ enum ModRMDecisionType {
};
#undef ENUM_ENTRY

/*
* ModRMDecision - 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;

/* The macro below must be defined wherever this file is included. */
INSTRUCTION_IDS
};

/*
* OpcodeDecision - Specifies which set of ModR/M->instruction tables to look at
* given a particular opcode.
*/
struct OpcodeDecision {
ModRMDecision modRMDecisions[256];
};

/*
* ContextDecision - 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[IC_max];
};

/*
* Physical encodings of instruction operands.
*/
Expand Down
29 changes: 23 additions & 6 deletions utils/TableGen/X86DisassemblerShared.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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

0 comments on commit 6f37488

Please sign in to comment.