18ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//===- X86DisassemblerShared.h - Emitter shared header ----------*- C++ -*-===//
28ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
38ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//                     The LLVM Compiler Infrastructure
48ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
58ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// This file is distributed under the University of Illinois Open Source
68ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan// License. See LICENSE.TXT for details.
78ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//
88ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan//===----------------------------------------------------------------------===//
98ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_UTILS_TABLEGEN_X86DISASSEMBLERSHARED_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_UTILS_TABLEGEN_X86DISASSEMBLERSHARED_H
128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
132c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include <cstring>
144ffd89fa4d2788611187d1a534d2ed46adf1702cChandler Carruth#include <string>
158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "../../lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h"
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct InstructionSpecifier {
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::X86Disassembler::OperandSpecifier
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      operands[llvm::X86Disassembler::X86_MAX_OPERANDS];
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::X86Disassembler::InstructionContext insnContext;
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::string name;
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  InstructionSpecifier() {
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    insnContext = llvm::X86Disassembler::IC;
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    name = "";
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    memset(operands, 0, sizeof(operands));
288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  }
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// Specifies whether a ModR/M byte is needed and (if so) which
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// instruction each possible value of the ModR/M byte corresponds to. Once
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// this information is known, we have narrowed down to a single instruction.
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct ModRMDecision {
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  uint8_t modrm_type;
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  llvm::X86Disassembler::InstrUID instructionIDs[256];
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// Specifies which set of ModR/M->instruction tables to look at
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// given a particular opcode.
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct OpcodeDecision {
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ModRMDecision modRMDecisions[256];
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// Specifies which opcode->instruction tables to look at given
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// a particular context (set of attributes).  Since there are many possible
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// contexts, the decoder first uses CONTEXTS_SYM to determine which context
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// applies given a specific set of attributes.  Hence there are only IC_max
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// entries in this table, rather than 2^(ATTR_max).
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct ContextDecision {
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  OpcodeDecision opcodeDecisions[llvm::X86Disassembler::IC_max];
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#endif
55