131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu/*===-- X86DisassemblerDecoderInternal.h - Disassembler decoder ---*- 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 *
108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * This file is part of the X86 Disassembler.
118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * It contains the public interface of the instruction decoder.
128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * Documentation for the disassembler can be found in X86Disassembler.h.
138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *
148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *===----------------------------------------------------------------------===*/
158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#ifndef X86DISASSEMBLERDECODER_H
178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define X86DISASSEMBLERDECODER_H
188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#ifdef __cplusplus
208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananextern "C" {
218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#endif
22a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
235a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper#define INSTRUCTION_SPECIFIER_FIELDS \
245a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper  uint16_t operands;
258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define INSTRUCTION_IDS     \
27ce8f4c58d8804ee2cfda7751cdc6520bc5f43dd7Craig Topper  unsigned instructionIDs;
288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#include "X86DisassemblerDecoderCommon.h"
30a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef INSTRUCTION_SPECIFIER_FIELDS
328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef INSTRUCTION_IDS
33a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * Accessor functions for various fields of an Intel instruction
368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
37a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define modFromModRM(modRM)  (((modRM) & 0xc0) >> 6)
38a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define regFromModRM(modRM)  (((modRM) & 0x38) >> 3)
39a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rmFromModRM(modRM)   ((modRM) & 0x7)
40a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define scaleFromSIB(sib)    (((sib) & 0xc0) >> 6)
41a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define indexFromSIB(sib)    (((sib) & 0x38) >> 3)
42a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define baseFromSIB(sib)     ((sib) & 0x7)
43a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define wFromREX(rex)        (((rex) & 0x8) >> 3)
44a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rFromREX(rex)        (((rex) & 0x4) >> 2)
45a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define xFromREX(rex)        (((rex) & 0x2) >> 1)
46a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define bFromREX(rex)        ((rex) & 0x1)
47a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
48a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rFromVEX2of3(vex)       (((~(vex)) & 0x80) >> 7)
49a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define xFromVEX2of3(vex)       (((~(vex)) & 0x40) >> 6)
50a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define bFromVEX2of3(vex)       (((~(vex)) & 0x20) >> 5)
51a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define mmmmmFromVEX2of3(vex)   ((vex) & 0x1f)
52a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define wFromVEX3of3(vex)       (((vex) & 0x80) >> 7)
53a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define vvvvFromVEX3of3(vex)    (((~(vex)) & 0x78) >> 3)
54a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define lFromVEX3of3(vex)       (((vex) & 0x4) >> 2)
55a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define ppFromVEX3of3(vex)      ((vex) & 0x3)
56a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
57a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rFromVEX2of2(vex)       (((~(vex)) & 0x80) >> 7)
58a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define vvvvFromVEX2of2(vex)    (((~(vex)) & 0x78) >> 3)
59a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define lFromVEX2of2(vex)       (((vex) & 0x4) >> 2)
60a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define ppFromVEX2of2(vex)      ((vex) & 0x3)
618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * These enums represent Intel registers for use by the decoder.
648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_8BIT     \
678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(AL)           \
688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(CL)           \
698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DL)           \
708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BL)           \
718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(AH)           \
728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(CH)           \
738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DH)           \
748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BH)           \
758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R8B)          \
768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R9B)          \
778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R10B)         \
788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R11B)         \
798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R12B)         \
808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R13B)         \
818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R14B)         \
828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R15B)         \
838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(SPL)          \
848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BPL)          \
858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(SIL)          \
868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DIL)
878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EA_BASES_16BIT  \
898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BX_SI)          \
908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BX_DI)          \
918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BP_SI)          \
928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BP_DI)          \
938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(SI)             \
948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DI)             \
958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BP)             \
968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BX)             \
978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R8W)            \
988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R9W)            \
998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R10W)           \
1008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R11W)           \
1018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R12W)           \
1028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R13W)           \
1038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R14W)           \
1048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R15W)
1058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_16BIT    \
1078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(AX)           \
1088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(CX)           \
1098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DX)           \
1108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BX)           \
1118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(SP)           \
1128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(BP)           \
1138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(SI)           \
1148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DI)           \
1158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R8W)          \
1168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R9W)          \
1178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R10W)         \
1188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R11W)         \
1198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R12W)         \
1208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R13W)         \
1218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R14W)         \
1228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R15W)
1238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EA_BASES_32BIT  \
1258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EAX)            \
1268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(ECX)            \
1278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EDX)            \
1288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EBX)            \
1298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(sib)            \
1308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EBP)            \
1318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(ESI)            \
1328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EDI)            \
1338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R8D)            \
1348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R9D)            \
1358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R10D)           \
1368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R11D)           \
1378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R12D)           \
1388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R13D)           \
1398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R14D)           \
1408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R15D)
1418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_32BIT  \
1438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EAX)        \
1448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(ECX)        \
1458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EDX)        \
1468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EBX)        \
1478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(ESP)        \
1488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EBP)        \
1498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(ESI)        \
1508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(EDI)        \
1518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R8D)        \
1528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R9D)        \
1538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R10D)       \
1548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R11D)       \
1558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R12D)       \
1568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R13D)       \
1578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R14D)       \
1588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R15D)
1598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EA_BASES_64BIT  \
1618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RAX)            \
1628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RCX)            \
1638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RDX)            \
1648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RBX)            \
1658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(sib64)          \
1668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RBP)            \
1678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RSI)            \
1688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RDI)            \
1698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R8)             \
1708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R9)             \
1718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R10)            \
1728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R11)            \
1738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R12)            \
1748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R13)            \
1758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R14)            \
1768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R15)
1778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_64BIT  \
1798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RAX)        \
1808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RCX)        \
1818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RDX)        \
1828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RBX)        \
1838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RSP)        \
1848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RBP)        \
1858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RSI)        \
1868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RDI)        \
1878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R8)         \
1888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R9)         \
1898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R10)        \
1908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R11)        \
1918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R12)        \
1928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R13)        \
1938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R14)        \
1948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(R15)
1958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
1968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_MMX  \
1978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM0)      \
1988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM1)      \
1998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM2)      \
2008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM3)      \
2018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM4)      \
2028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM5)      \
2038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM6)      \
2048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(MM7)
2058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
2068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_XMM  \
2078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM0)     \
2088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM1)     \
2098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM2)     \
2108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM3)     \
2118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM4)     \
2128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM5)     \
2138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM6)     \
2148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM7)     \
2158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM8)     \
2168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM9)     \
2178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM10)    \
2188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM11)    \
2198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM12)    \
2208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM13)    \
2218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM14)    \
2228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(XMM15)
223a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
224a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define REGS_YMM  \
225a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM0)     \
226a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM1)     \
227a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM2)     \
228a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM3)     \
229a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM4)     \
230a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM5)     \
231a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM6)     \
232a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM7)     \
233a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM8)     \
234a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM9)     \
235a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM10)    \
236a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM11)    \
237a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM12)    \
238a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM13)    \
239a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM14)    \
240a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  ENTRY(YMM15)
241a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
2428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_SEGMENT \
2438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(ES)          \
2448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(CS)          \
2458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(SS)          \
2468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DS)          \
2478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(FS)          \
2488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(GS)
249a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
2508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_DEBUG  \
2518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR0)        \
2528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR1)        \
2538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR2)        \
2548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR3)        \
2558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR4)        \
2568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR5)        \
2578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR6)        \
2588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(DR7)
2598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
2601a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan#define REGS_CONTROL  \
2611a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR0)          \
2621a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR1)          \
2631a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR2)          \
2641a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR3)          \
2651a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR4)          \
2661a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR5)          \
2671a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR6)          \
2681a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR7)          \
2691a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  ENTRY(CR8)
270a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
2718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ALL_EA_BASES  \
2728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_BASES_16BIT      \
2738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_BASES_32BIT      \
2748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_BASES_64BIT
275a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
2768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ALL_SIB_BASES \
2778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_32BIT          \
2788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_64BIT
2798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
2808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ALL_REGS      \
2818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_8BIT           \
2828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_16BIT          \
2838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_32BIT          \
2848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_64BIT          \
2858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_MMX            \
2868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_XMM            \
287a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  REGS_YMM            \
2888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_SEGMENT        \
2898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  REGS_DEBUG          \
2901a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan  REGS_CONTROL        \
2918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ENTRY(RIP)
2928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
2938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
294a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper * EABase - All possible values of the base field for effective-address
2958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   computations, a.k.a. the Mod and R/M fields of the ModR/M byte.  We
2968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   distinguish between bases (EA_BASE_*) and registers that just happen to be
2978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   referred to when Mod == 0b11 (EA_REG_*).
2988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
2998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum {
3008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_BASE_NONE,
3018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) EA_BASE_##x,
3028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ALL_EA_BASES
3038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY
3048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) EA_REG_##x,
3058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ALL_REGS
3068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY
3078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_max
3088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} EABase;
309a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
310a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper/*
3118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * SIBIndex - All possible values of the SIB index field.
3128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   Borrows entries from ALL_EA_BASES with the special case that
3138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   sib is synonymous with NONE.
3141f7a1b68a07ea6bdf521525a7928f4a8c5216713Manman Ren * Vector SIB: index can be XMM or YMM.
3158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
3168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum {
3178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SIB_INDEX_NONE,
3188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) SIB_INDEX_##x,
3198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ALL_EA_BASES
3201f7a1b68a07ea6bdf521525a7928f4a8c5216713Manman Ren  REGS_XMM
3211f7a1b68a07ea6bdf521525a7928f4a8c5216713Manman Ren  REGS_YMM
3228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY
3238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SIB_INDEX_max
3248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} SIBIndex;
325a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
3268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
3278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * SIBBase - All possible values of the SIB base field.
3288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
3298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum {
3308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SIB_BASE_NONE,
3318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) SIB_BASE_##x,
3328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ALL_SIB_BASES
3338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY
3348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SIB_BASE_max
3358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} SIBBase;
3368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
3378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
3388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * EADisplacement - Possible displacement types for effective-address
3398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   computations.
3408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
3418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum {
3428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_DISP_NONE,
3438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_DISP_8,
3448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_DISP_16,
3458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EA_DISP_32
3468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} EADisplacement;
3478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
3488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
3498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * Reg - All possible values of the reg field in the ModR/M byte.
3508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
3518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum {
35206b766d1c0ff7373e911fe5f8c42f62aa2f67e92Sean Callanan#define ENTRY(x) MODRM_REG_##x,
3538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  ALL_REGS
3548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY
35506b766d1c0ff7373e911fe5f8c42f62aa2f67e92Sean Callanan  MODRM_REG_max
3568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} Reg;
357a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
3588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
3598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * SegmentOverride - All possible segment overrides.
3608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
3618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum {
3628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_NONE,
3638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_CS,
3648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_SS,
3658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_DS,
3668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_ES,
3678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_FS,
3688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_GS,
3698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SEG_OVERRIDE_max
3708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} SegmentOverride;
371a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
372a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan/*
373a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan * VEXLeadingOpcodeByte - Possible values for the VEX.m-mmmm field
374a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan */
375a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
376a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanantypedef enum {
377a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  VEX_LOB_0F = 0x1,
378a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  VEX_LOB_0F38 = 0x2,
379a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  VEX_LOB_0F3A = 0x3
380a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan} VEXLeadingOpcodeByte;
381a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
382a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan/*
383a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan * VEXPrefixCode - Possible values for the VEX.pp field
384a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan */
385a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
386a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanantypedef enum {
387a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  VEX_PREFIX_NONE = 0x0,
388a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  VEX_PREFIX_66 = 0x1,
389a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  VEX_PREFIX_F3 = 0x2,
390a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  VEX_PREFIX_F2 = 0x3
391a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan} VEXPrefixCode;
3928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
3938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef uint8_t BOOL;
3948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
3958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
3968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * byteReader_t - Type for the byte reader that the consumer must provide to
3978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   the decoder.  Reads a single byte from the instruction's address space.
3988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param arg     - A baton that the consumer can associate with any internal
3998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                  state that it needs.
4008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param byte    - A pointer to a single byte in memory that should be set to
4018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                  contain the value at address.
4028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param address - The address in the instruction's address space that should
4038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                  be read from.
4048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @return        - -1 if the byte cannot be read for any reason; 0 otherwise.
4058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
406b438615abdc826a2fef33895b50dc60e3f39f988Roman Divackytypedef int (*byteReader_t)(const void* arg, uint8_t* byte, uint64_t address);
4078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
4098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * dlog_t - Type for the logging function that the consumer can provide to
4108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   get debugging output from the decoder.
4118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param arg     - A baton that the consumer can associate with any internal
4128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                  state that it needs.
4138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param log     - A string that contains the message.  Will be reused after
4148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                  the logger returns.
4158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
4168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef void (*dlog_t)(void* arg, const char *log);
4178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/*
4198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * The x86 internal instruction, which is produced by the decoder.
4208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
4218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananstruct InternalInstruction {
4228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* Reader interface (C) */
4238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  byteReader_t reader;
4248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* Opaque value passed to the reader */
425b438615abdc826a2fef33895b50dc60e3f39f988Roman Divacky  const void* readerArg;
4268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The address of the next byte to read via the reader */
4278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint64_t readerCursor;
4288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* Logger interface (C) */
4308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  dlog_t dlog;
4318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* Opaque value passed to the logger */
4328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  void* dlogArg;
4338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
4348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* General instruction information */
435a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The mode to disassemble for (64-bit, protected, real) */
4378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  DisassemblerMode mode;
4388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The start of the instruction, usable with the reader */
4398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint64_t startLocation;
4408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The length of the instruction, in bytes */
4418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  size_t length;
442a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* Prefix state */
444a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* 1 if the prefix byte corresponding to the entry is present; 0 if not */
4468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t prefixPresent[0x100];
4478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* contains the location (for use with the reader) of the prefix byte */
4488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint64_t prefixLocations[0x100];
449a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  /* The value of the VEX prefix, if present */
450a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  uint8_t vexPrefix[3];
451a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  /* The length of the VEX prefix (0 if not present) */
452a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  uint8_t vexSize;
4538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The value of the REX prefix, if present */
4548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t rexPrefix;
4558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The location where a mandatory prefix would have to be (i.e., right before
4568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     the opcode, or right before the REX prefix if one is present) */
4578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint64_t necessaryPrefixLocation;
4588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The segment override type */
4598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SegmentOverride segmentOverride;
460a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
46189e59e6343303696e14d4c134582dda083cf7408Sean Callanan  /* Sizes of various critical pieces of data, in bytes */
4628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t registerSize;
4638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t addressSize;
4648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t displacementSize;
4658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t immediateSize;
466b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby
467b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby  /* Offsets from the start of the instruction to the pieces of data, which is
468b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby     needed to find relocation entries for adding symbolic operands */
469b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby  uint8_t displacementOffset;
470b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby  uint8_t immediateOffset;
471a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* opcode state */
473a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The value of the two-byte escape prefix (usually 0x0f) */
4758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t twoByteEscape;
4768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The value of the three-byte escape prefix (usually 0x38 or 0x3a) */
4778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t threeByteEscape;
4788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The last byte of the opcode, not counting any ModR/M extension */
4798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t opcode;
4808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The ModR/M byte of the instruction, if it is an opcode extension */
4818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t modRMExtension;
482a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* decode state */
484a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The type of opcode, used for indexing into the array of decode tables */
4868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  OpcodeType opcodeType;
4878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The instruction ID, extracted from the decode table */
4888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint16_t instructionID;
4898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The specifier for the instruction, from the instruction info table */
4904d1dca92bd6d4aad7121e28c7ffc93c0a6a187d7Benjamin Kramer  const struct InstructionSpecifier *spec;
491a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
4928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* state for additional bytes, consumed during operand decode.  Pattern:
4938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     consumed___ indicates that the byte was already consumed and does not
4948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     need to be consumed again */
495a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan
4967a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner  /* The VEX.vvvv field, which contains a third register operand for some AVX
497a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan     instructions */
498a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan  Reg                           vvvv;
499a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The ModR/M byte, which contains most register operands and some portion of
5018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     all memory operands */
5028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  BOOL                          consumedModRM;
5038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t                       modRM;
504a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The SIB byte, used for more complex 32- or 64-bit memory operands */
5068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  BOOL                          consumedSIB;
5078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t                       sib;
5088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
5098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The displacement, used for memory operands */
5108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  BOOL                          consumedDisplacement;
5118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  int32_t                       displacement;
512a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* Immediates.  There can be two in some cases */
5148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t                       numImmediatesConsumed;
5158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t                       numImmediatesTranslated;
5168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint64_t                      immediates[2];
517a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* A register or immediate operand encoded into the opcode */
5198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  BOOL                          consumedOpcodeModifier;
5208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t                       opcodeModifier;
5218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Reg                           opcodeRegister;
522a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* Portions of the ModR/M byte */
524a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* These fields determine the allowable values for the ModR/M fields, which
5268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     depend on operand and address widths */
5278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EABase                        eaBaseBase;
5288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EABase                        eaRegBase;
5298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Reg                           regBase;
5308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
5318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The Mod and R/M fields can encode a base for an effective address, or a
5328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan     register.  These are separated into two fields here */
5338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EABase                        eaBase;
5348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  EADisplacement                eaDisplacement;
5358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* The reg field always encodes a register */
5368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  Reg                           reg;
537a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  /* SIB state */
5398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SIBIndex                      sibIndex;
5408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  uint8_t                       sibScale;
5418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan  SIBBase                       sibBase;
5425a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper
5435a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper  const struct OperandSpecifier *operands;
5448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan};
5458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
5468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* decodeInstruction - Decode one instruction and store the decoding results in
5478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *   a buffer provided by the consumer.
5488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param insn      - The buffer to store the instruction in.  Allocated by the
5498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                    consumer.
5508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param reader    - The byteReader_t for the bytes to be read.
5518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param readerArg - An argument to pass to the reader for storing context
5528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                    specific to the consumer.  May be NULL.
5538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param logger    - The dlog_t to be used in printing status messages from the
5548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                    disassembler.  May be NULL.
5558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param loggerArg - An argument to pass to the logger for storing context
5568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                    specific to the logger.  May be NULL.
5578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param startLoc  - The address (in the reader's address space) of the first
5588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *                    byte in the instruction.
5598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param mode      - The mode (16-bit, 32-bit, 64-bit) to decode in.
5608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @return          - Nonzero if there was an error during decode, 0 otherwise.
5618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */
5628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananint decodeInstruction(struct InternalInstruction* insn,
5638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                      byteReader_t reader,
564b438615abdc826a2fef33895b50dc60e3f39f988Roman Divacky                      const void* readerArg,
5658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                      dlog_t logger,
5668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                      void* loggerArg,
567b438615abdc826a2fef33895b50dc60e3f39f988Roman Divacky                      const void* miiArg,
5688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                      uint64_t startLoc,
5698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan                      DisassemblerMode mode);
5708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan
571a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan/* x86DisassemblerDebug - C-accessible function for printing a message to
572a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan *   debugs()
573a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan * @param file  - The name of the file printing the debug message.
574a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan * @param line  - The line number that printed the debug message.
575a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan * @param s     - The message to print.
576a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan */
577a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
578a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callananvoid x86DisassemblerDebug(const char *file,
579a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan                          unsigned line,
580a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan                          const char *s);
581a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan
582b438615abdc826a2fef33895b50dc60e3f39f988Roman Divackyconst char *x86DisassemblerGetInstrName(unsigned Opcode, const void *mii);
583953362cdfbf1088153f65376c86d22ee0176bcdfBenjamin Kramer
584a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper#ifdef __cplusplus
5858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}
5868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#endif
587a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper
5888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#endif
589