xref: /aosp_15_r20/external/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- X86DisassemblerDecoderInternal.h - Disassembler decoder -*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file is part of the X86 Disassembler.
11*9880d681SAndroid Build Coastguard Worker // It contains the public interface of the instruction decoder.
12*9880d681SAndroid Build Coastguard Worker // Documentation for the disassembler can be found in X86Disassembler.h.
13*9880d681SAndroid Build Coastguard Worker //
14*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_X86_DISASSEMBLER_X86DISASSEMBLERDECODER_H
17*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_X86_DISASSEMBLER_X86DISASSEMBLERDECODER_H
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker #include "X86DisassemblerDecoderCommon.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/ArrayRef.h"
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker namespace llvm {
23*9880d681SAndroid Build Coastguard Worker namespace X86Disassembler {
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker // Accessor functions for various fields of an Intel instruction
26*9880d681SAndroid Build Coastguard Worker #define modFromModRM(modRM)  (((modRM) & 0xc0) >> 6)
27*9880d681SAndroid Build Coastguard Worker #define regFromModRM(modRM)  (((modRM) & 0x38) >> 3)
28*9880d681SAndroid Build Coastguard Worker #define rmFromModRM(modRM)   ((modRM) & 0x7)
29*9880d681SAndroid Build Coastguard Worker #define scaleFromSIB(sib)    (((sib) & 0xc0) >> 6)
30*9880d681SAndroid Build Coastguard Worker #define indexFromSIB(sib)    (((sib) & 0x38) >> 3)
31*9880d681SAndroid Build Coastguard Worker #define baseFromSIB(sib)     ((sib) & 0x7)
32*9880d681SAndroid Build Coastguard Worker #define wFromREX(rex)        (((rex) & 0x8) >> 3)
33*9880d681SAndroid Build Coastguard Worker #define rFromREX(rex)        (((rex) & 0x4) >> 2)
34*9880d681SAndroid Build Coastguard Worker #define xFromREX(rex)        (((rex) & 0x2) >> 1)
35*9880d681SAndroid Build Coastguard Worker #define bFromREX(rex)        ((rex) & 0x1)
36*9880d681SAndroid Build Coastguard Worker 
37*9880d681SAndroid Build Coastguard Worker #define rFromEVEX2of4(evex)     (((~(evex)) & 0x80) >> 7)
38*9880d681SAndroid Build Coastguard Worker #define xFromEVEX2of4(evex)     (((~(evex)) & 0x40) >> 6)
39*9880d681SAndroid Build Coastguard Worker #define bFromEVEX2of4(evex)     (((~(evex)) & 0x20) >> 5)
40*9880d681SAndroid Build Coastguard Worker #define r2FromEVEX2of4(evex)    (((~(evex)) & 0x10) >> 4)
41*9880d681SAndroid Build Coastguard Worker #define mmFromEVEX2of4(evex)    ((evex) & 0x3)
42*9880d681SAndroid Build Coastguard Worker #define wFromEVEX3of4(evex)     (((evex) & 0x80) >> 7)
43*9880d681SAndroid Build Coastguard Worker #define vvvvFromEVEX3of4(evex)  (((~(evex)) & 0x78) >> 3)
44*9880d681SAndroid Build Coastguard Worker #define ppFromEVEX3of4(evex)    ((evex) & 0x3)
45*9880d681SAndroid Build Coastguard Worker #define zFromEVEX4of4(evex)     (((evex) & 0x80) >> 7)
46*9880d681SAndroid Build Coastguard Worker #define l2FromEVEX4of4(evex)    (((evex) & 0x40) >> 6)
47*9880d681SAndroid Build Coastguard Worker #define lFromEVEX4of4(evex)     (((evex) & 0x20) >> 5)
48*9880d681SAndroid Build Coastguard Worker #define bFromEVEX4of4(evex)     (((evex) & 0x10) >> 4)
49*9880d681SAndroid Build Coastguard Worker #define v2FromEVEX4of4(evex)    (((~evex) & 0x8) >> 3)
50*9880d681SAndroid Build Coastguard Worker #define aaaFromEVEX4of4(evex)   ((evex) & 0x7)
51*9880d681SAndroid Build Coastguard Worker 
52*9880d681SAndroid Build Coastguard Worker #define rFromVEX2of3(vex)       (((~(vex)) & 0x80) >> 7)
53*9880d681SAndroid Build Coastguard Worker #define xFromVEX2of3(vex)       (((~(vex)) & 0x40) >> 6)
54*9880d681SAndroid Build Coastguard Worker #define bFromVEX2of3(vex)       (((~(vex)) & 0x20) >> 5)
55*9880d681SAndroid Build Coastguard Worker #define mmmmmFromVEX2of3(vex)   ((vex) & 0x1f)
56*9880d681SAndroid Build Coastguard Worker #define wFromVEX3of3(vex)       (((vex) & 0x80) >> 7)
57*9880d681SAndroid Build Coastguard Worker #define vvvvFromVEX3of3(vex)    (((~(vex)) & 0x78) >> 3)
58*9880d681SAndroid Build Coastguard Worker #define lFromVEX3of3(vex)       (((vex) & 0x4) >> 2)
59*9880d681SAndroid Build Coastguard Worker #define ppFromVEX3of3(vex)      ((vex) & 0x3)
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker #define rFromVEX2of2(vex)       (((~(vex)) & 0x80) >> 7)
62*9880d681SAndroid Build Coastguard Worker #define vvvvFromVEX2of2(vex)    (((~(vex)) & 0x78) >> 3)
63*9880d681SAndroid Build Coastguard Worker #define lFromVEX2of2(vex)       (((vex) & 0x4) >> 2)
64*9880d681SAndroid Build Coastguard Worker #define ppFromVEX2of2(vex)      ((vex) & 0x3)
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker #define rFromXOP2of3(xop)       (((~(xop)) & 0x80) >> 7)
67*9880d681SAndroid Build Coastguard Worker #define xFromXOP2of3(xop)       (((~(xop)) & 0x40) >> 6)
68*9880d681SAndroid Build Coastguard Worker #define bFromXOP2of3(xop)       (((~(xop)) & 0x20) >> 5)
69*9880d681SAndroid Build Coastguard Worker #define mmmmmFromXOP2of3(xop)   ((xop) & 0x1f)
70*9880d681SAndroid Build Coastguard Worker #define wFromXOP3of3(xop)       (((xop) & 0x80) >> 7)
71*9880d681SAndroid Build Coastguard Worker #define vvvvFromXOP3of3(vex)    (((~(vex)) & 0x78) >> 3)
72*9880d681SAndroid Build Coastguard Worker #define lFromXOP3of3(xop)       (((xop) & 0x4) >> 2)
73*9880d681SAndroid Build Coastguard Worker #define ppFromXOP3of3(xop)      ((xop) & 0x3)
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker // These enums represent Intel registers for use by the decoder.
76*9880d681SAndroid Build Coastguard Worker #define REGS_8BIT     \
77*9880d681SAndroid Build Coastguard Worker   ENTRY(AL)           \
78*9880d681SAndroid Build Coastguard Worker   ENTRY(CL)           \
79*9880d681SAndroid Build Coastguard Worker   ENTRY(DL)           \
80*9880d681SAndroid Build Coastguard Worker   ENTRY(BL)           \
81*9880d681SAndroid Build Coastguard Worker   ENTRY(AH)           \
82*9880d681SAndroid Build Coastguard Worker   ENTRY(CH)           \
83*9880d681SAndroid Build Coastguard Worker   ENTRY(DH)           \
84*9880d681SAndroid Build Coastguard Worker   ENTRY(BH)           \
85*9880d681SAndroid Build Coastguard Worker   ENTRY(R8B)          \
86*9880d681SAndroid Build Coastguard Worker   ENTRY(R9B)          \
87*9880d681SAndroid Build Coastguard Worker   ENTRY(R10B)         \
88*9880d681SAndroid Build Coastguard Worker   ENTRY(R11B)         \
89*9880d681SAndroid Build Coastguard Worker   ENTRY(R12B)         \
90*9880d681SAndroid Build Coastguard Worker   ENTRY(R13B)         \
91*9880d681SAndroid Build Coastguard Worker   ENTRY(R14B)         \
92*9880d681SAndroid Build Coastguard Worker   ENTRY(R15B)         \
93*9880d681SAndroid Build Coastguard Worker   ENTRY(SPL)          \
94*9880d681SAndroid Build Coastguard Worker   ENTRY(BPL)          \
95*9880d681SAndroid Build Coastguard Worker   ENTRY(SIL)          \
96*9880d681SAndroid Build Coastguard Worker   ENTRY(DIL)
97*9880d681SAndroid Build Coastguard Worker 
98*9880d681SAndroid Build Coastguard Worker #define EA_BASES_16BIT  \
99*9880d681SAndroid Build Coastguard Worker   ENTRY(BX_SI)          \
100*9880d681SAndroid Build Coastguard Worker   ENTRY(BX_DI)          \
101*9880d681SAndroid Build Coastguard Worker   ENTRY(BP_SI)          \
102*9880d681SAndroid Build Coastguard Worker   ENTRY(BP_DI)          \
103*9880d681SAndroid Build Coastguard Worker   ENTRY(SI)             \
104*9880d681SAndroid Build Coastguard Worker   ENTRY(DI)             \
105*9880d681SAndroid Build Coastguard Worker   ENTRY(BP)             \
106*9880d681SAndroid Build Coastguard Worker   ENTRY(BX)             \
107*9880d681SAndroid Build Coastguard Worker   ENTRY(R8W)            \
108*9880d681SAndroid Build Coastguard Worker   ENTRY(R9W)            \
109*9880d681SAndroid Build Coastguard Worker   ENTRY(R10W)           \
110*9880d681SAndroid Build Coastguard Worker   ENTRY(R11W)           \
111*9880d681SAndroid Build Coastguard Worker   ENTRY(R12W)           \
112*9880d681SAndroid Build Coastguard Worker   ENTRY(R13W)           \
113*9880d681SAndroid Build Coastguard Worker   ENTRY(R14W)           \
114*9880d681SAndroid Build Coastguard Worker   ENTRY(R15W)
115*9880d681SAndroid Build Coastguard Worker 
116*9880d681SAndroid Build Coastguard Worker #define REGS_16BIT    \
117*9880d681SAndroid Build Coastguard Worker   ENTRY(AX)           \
118*9880d681SAndroid Build Coastguard Worker   ENTRY(CX)           \
119*9880d681SAndroid Build Coastguard Worker   ENTRY(DX)           \
120*9880d681SAndroid Build Coastguard Worker   ENTRY(BX)           \
121*9880d681SAndroid Build Coastguard Worker   ENTRY(SP)           \
122*9880d681SAndroid Build Coastguard Worker   ENTRY(BP)           \
123*9880d681SAndroid Build Coastguard Worker   ENTRY(SI)           \
124*9880d681SAndroid Build Coastguard Worker   ENTRY(DI)           \
125*9880d681SAndroid Build Coastguard Worker   ENTRY(R8W)          \
126*9880d681SAndroid Build Coastguard Worker   ENTRY(R9W)          \
127*9880d681SAndroid Build Coastguard Worker   ENTRY(R10W)         \
128*9880d681SAndroid Build Coastguard Worker   ENTRY(R11W)         \
129*9880d681SAndroid Build Coastguard Worker   ENTRY(R12W)         \
130*9880d681SAndroid Build Coastguard Worker   ENTRY(R13W)         \
131*9880d681SAndroid Build Coastguard Worker   ENTRY(R14W)         \
132*9880d681SAndroid Build Coastguard Worker   ENTRY(R15W)
133*9880d681SAndroid Build Coastguard Worker 
134*9880d681SAndroid Build Coastguard Worker #define EA_BASES_32BIT  \
135*9880d681SAndroid Build Coastguard Worker   ENTRY(EAX)            \
136*9880d681SAndroid Build Coastguard Worker   ENTRY(ECX)            \
137*9880d681SAndroid Build Coastguard Worker   ENTRY(EDX)            \
138*9880d681SAndroid Build Coastguard Worker   ENTRY(EBX)            \
139*9880d681SAndroid Build Coastguard Worker   ENTRY(sib)            \
140*9880d681SAndroid Build Coastguard Worker   ENTRY(EBP)            \
141*9880d681SAndroid Build Coastguard Worker   ENTRY(ESI)            \
142*9880d681SAndroid Build Coastguard Worker   ENTRY(EDI)            \
143*9880d681SAndroid Build Coastguard Worker   ENTRY(R8D)            \
144*9880d681SAndroid Build Coastguard Worker   ENTRY(R9D)            \
145*9880d681SAndroid Build Coastguard Worker   ENTRY(R10D)           \
146*9880d681SAndroid Build Coastguard Worker   ENTRY(R11D)           \
147*9880d681SAndroid Build Coastguard Worker   ENTRY(R12D)           \
148*9880d681SAndroid Build Coastguard Worker   ENTRY(R13D)           \
149*9880d681SAndroid Build Coastguard Worker   ENTRY(R14D)           \
150*9880d681SAndroid Build Coastguard Worker   ENTRY(R15D)
151*9880d681SAndroid Build Coastguard Worker 
152*9880d681SAndroid Build Coastguard Worker #define REGS_32BIT  \
153*9880d681SAndroid Build Coastguard Worker   ENTRY(EAX)        \
154*9880d681SAndroid Build Coastguard Worker   ENTRY(ECX)        \
155*9880d681SAndroid Build Coastguard Worker   ENTRY(EDX)        \
156*9880d681SAndroid Build Coastguard Worker   ENTRY(EBX)        \
157*9880d681SAndroid Build Coastguard Worker   ENTRY(ESP)        \
158*9880d681SAndroid Build Coastguard Worker   ENTRY(EBP)        \
159*9880d681SAndroid Build Coastguard Worker   ENTRY(ESI)        \
160*9880d681SAndroid Build Coastguard Worker   ENTRY(EDI)        \
161*9880d681SAndroid Build Coastguard Worker   ENTRY(R8D)        \
162*9880d681SAndroid Build Coastguard Worker   ENTRY(R9D)        \
163*9880d681SAndroid Build Coastguard Worker   ENTRY(R10D)       \
164*9880d681SAndroid Build Coastguard Worker   ENTRY(R11D)       \
165*9880d681SAndroid Build Coastguard Worker   ENTRY(R12D)       \
166*9880d681SAndroid Build Coastguard Worker   ENTRY(R13D)       \
167*9880d681SAndroid Build Coastguard Worker   ENTRY(R14D)       \
168*9880d681SAndroid Build Coastguard Worker   ENTRY(R15D)
169*9880d681SAndroid Build Coastguard Worker 
170*9880d681SAndroid Build Coastguard Worker #define EA_BASES_64BIT  \
171*9880d681SAndroid Build Coastguard Worker   ENTRY(RAX)            \
172*9880d681SAndroid Build Coastguard Worker   ENTRY(RCX)            \
173*9880d681SAndroid Build Coastguard Worker   ENTRY(RDX)            \
174*9880d681SAndroid Build Coastguard Worker   ENTRY(RBX)            \
175*9880d681SAndroid Build Coastguard Worker   ENTRY(sib64)          \
176*9880d681SAndroid Build Coastguard Worker   ENTRY(RBP)            \
177*9880d681SAndroid Build Coastguard Worker   ENTRY(RSI)            \
178*9880d681SAndroid Build Coastguard Worker   ENTRY(RDI)            \
179*9880d681SAndroid Build Coastguard Worker   ENTRY(R8)             \
180*9880d681SAndroid Build Coastguard Worker   ENTRY(R9)             \
181*9880d681SAndroid Build Coastguard Worker   ENTRY(R10)            \
182*9880d681SAndroid Build Coastguard Worker   ENTRY(R11)            \
183*9880d681SAndroid Build Coastguard Worker   ENTRY(R12)            \
184*9880d681SAndroid Build Coastguard Worker   ENTRY(R13)            \
185*9880d681SAndroid Build Coastguard Worker   ENTRY(R14)            \
186*9880d681SAndroid Build Coastguard Worker   ENTRY(R15)
187*9880d681SAndroid Build Coastguard Worker 
188*9880d681SAndroid Build Coastguard Worker #define REGS_64BIT  \
189*9880d681SAndroid Build Coastguard Worker   ENTRY(RAX)        \
190*9880d681SAndroid Build Coastguard Worker   ENTRY(RCX)        \
191*9880d681SAndroid Build Coastguard Worker   ENTRY(RDX)        \
192*9880d681SAndroid Build Coastguard Worker   ENTRY(RBX)        \
193*9880d681SAndroid Build Coastguard Worker   ENTRY(RSP)        \
194*9880d681SAndroid Build Coastguard Worker   ENTRY(RBP)        \
195*9880d681SAndroid Build Coastguard Worker   ENTRY(RSI)        \
196*9880d681SAndroid Build Coastguard Worker   ENTRY(RDI)        \
197*9880d681SAndroid Build Coastguard Worker   ENTRY(R8)         \
198*9880d681SAndroid Build Coastguard Worker   ENTRY(R9)         \
199*9880d681SAndroid Build Coastguard Worker   ENTRY(R10)        \
200*9880d681SAndroid Build Coastguard Worker   ENTRY(R11)        \
201*9880d681SAndroid Build Coastguard Worker   ENTRY(R12)        \
202*9880d681SAndroid Build Coastguard Worker   ENTRY(R13)        \
203*9880d681SAndroid Build Coastguard Worker   ENTRY(R14)        \
204*9880d681SAndroid Build Coastguard Worker   ENTRY(R15)
205*9880d681SAndroid Build Coastguard Worker 
206*9880d681SAndroid Build Coastguard Worker #define REGS_MMX  \
207*9880d681SAndroid Build Coastguard Worker   ENTRY(MM0)      \
208*9880d681SAndroid Build Coastguard Worker   ENTRY(MM1)      \
209*9880d681SAndroid Build Coastguard Worker   ENTRY(MM2)      \
210*9880d681SAndroid Build Coastguard Worker   ENTRY(MM3)      \
211*9880d681SAndroid Build Coastguard Worker   ENTRY(MM4)      \
212*9880d681SAndroid Build Coastguard Worker   ENTRY(MM5)      \
213*9880d681SAndroid Build Coastguard Worker   ENTRY(MM6)      \
214*9880d681SAndroid Build Coastguard Worker   ENTRY(MM7)
215*9880d681SAndroid Build Coastguard Worker 
216*9880d681SAndroid Build Coastguard Worker #define REGS_XMM  \
217*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM0)     \
218*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM1)     \
219*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM2)     \
220*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM3)     \
221*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM4)     \
222*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM5)     \
223*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM6)     \
224*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM7)     \
225*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM8)     \
226*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM9)     \
227*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM10)    \
228*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM11)    \
229*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM12)    \
230*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM13)    \
231*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM14)    \
232*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM15)    \
233*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM16)    \
234*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM17)    \
235*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM18)    \
236*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM19)    \
237*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM20)    \
238*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM21)    \
239*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM22)    \
240*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM23)    \
241*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM24)    \
242*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM25)    \
243*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM26)    \
244*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM27)    \
245*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM28)    \
246*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM29)    \
247*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM30)    \
248*9880d681SAndroid Build Coastguard Worker   ENTRY(XMM31)
249*9880d681SAndroid Build Coastguard Worker 
250*9880d681SAndroid Build Coastguard Worker #define REGS_YMM  \
251*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM0)     \
252*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM1)     \
253*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM2)     \
254*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM3)     \
255*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM4)     \
256*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM5)     \
257*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM6)     \
258*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM7)     \
259*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM8)     \
260*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM9)     \
261*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM10)    \
262*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM11)    \
263*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM12)    \
264*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM13)    \
265*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM14)    \
266*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM15)    \
267*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM16)    \
268*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM17)    \
269*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM18)    \
270*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM19)    \
271*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM20)    \
272*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM21)    \
273*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM22)    \
274*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM23)    \
275*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM24)    \
276*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM25)    \
277*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM26)    \
278*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM27)    \
279*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM28)    \
280*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM29)    \
281*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM30)    \
282*9880d681SAndroid Build Coastguard Worker   ENTRY(YMM31)
283*9880d681SAndroid Build Coastguard Worker 
284*9880d681SAndroid Build Coastguard Worker #define REGS_ZMM  \
285*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM0)     \
286*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM1)     \
287*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM2)     \
288*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM3)     \
289*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM4)     \
290*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM5)     \
291*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM6)     \
292*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM7)     \
293*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM8)     \
294*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM9)     \
295*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM10)    \
296*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM11)    \
297*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM12)    \
298*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM13)    \
299*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM14)    \
300*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM15)    \
301*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM16)    \
302*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM17)    \
303*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM18)    \
304*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM19)    \
305*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM20)    \
306*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM21)    \
307*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM22)    \
308*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM23)    \
309*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM24)    \
310*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM25)    \
311*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM26)    \
312*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM27)    \
313*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM28)    \
314*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM29)    \
315*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM30)    \
316*9880d681SAndroid Build Coastguard Worker   ENTRY(ZMM31)
317*9880d681SAndroid Build Coastguard Worker 
318*9880d681SAndroid Build Coastguard Worker #define REGS_MASKS \
319*9880d681SAndroid Build Coastguard Worker   ENTRY(K0)        \
320*9880d681SAndroid Build Coastguard Worker   ENTRY(K1)        \
321*9880d681SAndroid Build Coastguard Worker   ENTRY(K2)        \
322*9880d681SAndroid Build Coastguard Worker   ENTRY(K3)        \
323*9880d681SAndroid Build Coastguard Worker   ENTRY(K4)        \
324*9880d681SAndroid Build Coastguard Worker   ENTRY(K5)        \
325*9880d681SAndroid Build Coastguard Worker   ENTRY(K6)        \
326*9880d681SAndroid Build Coastguard Worker   ENTRY(K7)
327*9880d681SAndroid Build Coastguard Worker 
328*9880d681SAndroid Build Coastguard Worker #define REGS_SEGMENT \
329*9880d681SAndroid Build Coastguard Worker   ENTRY(ES)          \
330*9880d681SAndroid Build Coastguard Worker   ENTRY(CS)          \
331*9880d681SAndroid Build Coastguard Worker   ENTRY(SS)          \
332*9880d681SAndroid Build Coastguard Worker   ENTRY(DS)          \
333*9880d681SAndroid Build Coastguard Worker   ENTRY(FS)          \
334*9880d681SAndroid Build Coastguard Worker   ENTRY(GS)
335*9880d681SAndroid Build Coastguard Worker 
336*9880d681SAndroid Build Coastguard Worker #define REGS_DEBUG  \
337*9880d681SAndroid Build Coastguard Worker   ENTRY(DR0)        \
338*9880d681SAndroid Build Coastguard Worker   ENTRY(DR1)        \
339*9880d681SAndroid Build Coastguard Worker   ENTRY(DR2)        \
340*9880d681SAndroid Build Coastguard Worker   ENTRY(DR3)        \
341*9880d681SAndroid Build Coastguard Worker   ENTRY(DR4)        \
342*9880d681SAndroid Build Coastguard Worker   ENTRY(DR5)        \
343*9880d681SAndroid Build Coastguard Worker   ENTRY(DR6)        \
344*9880d681SAndroid Build Coastguard Worker   ENTRY(DR7)        \
345*9880d681SAndroid Build Coastguard Worker   ENTRY(DR8)        \
346*9880d681SAndroid Build Coastguard Worker   ENTRY(DR9)        \
347*9880d681SAndroid Build Coastguard Worker   ENTRY(DR10)       \
348*9880d681SAndroid Build Coastguard Worker   ENTRY(DR11)       \
349*9880d681SAndroid Build Coastguard Worker   ENTRY(DR12)       \
350*9880d681SAndroid Build Coastguard Worker   ENTRY(DR13)       \
351*9880d681SAndroid Build Coastguard Worker   ENTRY(DR14)       \
352*9880d681SAndroid Build Coastguard Worker   ENTRY(DR15)
353*9880d681SAndroid Build Coastguard Worker 
354*9880d681SAndroid Build Coastguard Worker #define REGS_CONTROL  \
355*9880d681SAndroid Build Coastguard Worker   ENTRY(CR0)          \
356*9880d681SAndroid Build Coastguard Worker   ENTRY(CR1)          \
357*9880d681SAndroid Build Coastguard Worker   ENTRY(CR2)          \
358*9880d681SAndroid Build Coastguard Worker   ENTRY(CR3)          \
359*9880d681SAndroid Build Coastguard Worker   ENTRY(CR4)          \
360*9880d681SAndroid Build Coastguard Worker   ENTRY(CR5)          \
361*9880d681SAndroid Build Coastguard Worker   ENTRY(CR6)          \
362*9880d681SAndroid Build Coastguard Worker   ENTRY(CR7)          \
363*9880d681SAndroid Build Coastguard Worker   ENTRY(CR8)          \
364*9880d681SAndroid Build Coastguard Worker   ENTRY(CR9)          \
365*9880d681SAndroid Build Coastguard Worker   ENTRY(CR10)         \
366*9880d681SAndroid Build Coastguard Worker   ENTRY(CR11)         \
367*9880d681SAndroid Build Coastguard Worker   ENTRY(CR12)         \
368*9880d681SAndroid Build Coastguard Worker   ENTRY(CR13)         \
369*9880d681SAndroid Build Coastguard Worker   ENTRY(CR14)         \
370*9880d681SAndroid Build Coastguard Worker   ENTRY(CR15)
371*9880d681SAndroid Build Coastguard Worker 
372*9880d681SAndroid Build Coastguard Worker #define REGS_BOUND    \
373*9880d681SAndroid Build Coastguard Worker   ENTRY(BND0)         \
374*9880d681SAndroid Build Coastguard Worker   ENTRY(BND1)         \
375*9880d681SAndroid Build Coastguard Worker   ENTRY(BND2)         \
376*9880d681SAndroid Build Coastguard Worker   ENTRY(BND3)
377*9880d681SAndroid Build Coastguard Worker 
378*9880d681SAndroid Build Coastguard Worker #define ALL_EA_BASES  \
379*9880d681SAndroid Build Coastguard Worker   EA_BASES_16BIT      \
380*9880d681SAndroid Build Coastguard Worker   EA_BASES_32BIT      \
381*9880d681SAndroid Build Coastguard Worker   EA_BASES_64BIT
382*9880d681SAndroid Build Coastguard Worker 
383*9880d681SAndroid Build Coastguard Worker #define ALL_SIB_BASES \
384*9880d681SAndroid Build Coastguard Worker   REGS_32BIT          \
385*9880d681SAndroid Build Coastguard Worker   REGS_64BIT
386*9880d681SAndroid Build Coastguard Worker 
387*9880d681SAndroid Build Coastguard Worker #define ALL_REGS      \
388*9880d681SAndroid Build Coastguard Worker   REGS_8BIT           \
389*9880d681SAndroid Build Coastguard Worker   REGS_16BIT          \
390*9880d681SAndroid Build Coastguard Worker   REGS_32BIT          \
391*9880d681SAndroid Build Coastguard Worker   REGS_64BIT          \
392*9880d681SAndroid Build Coastguard Worker   REGS_MMX            \
393*9880d681SAndroid Build Coastguard Worker   REGS_XMM            \
394*9880d681SAndroid Build Coastguard Worker   REGS_YMM            \
395*9880d681SAndroid Build Coastguard Worker   REGS_ZMM            \
396*9880d681SAndroid Build Coastguard Worker   REGS_MASKS          \
397*9880d681SAndroid Build Coastguard Worker   REGS_SEGMENT        \
398*9880d681SAndroid Build Coastguard Worker   REGS_DEBUG          \
399*9880d681SAndroid Build Coastguard Worker   REGS_CONTROL        \
400*9880d681SAndroid Build Coastguard Worker   REGS_BOUND          \
401*9880d681SAndroid Build Coastguard Worker   ENTRY(RIP)
402*9880d681SAndroid Build Coastguard Worker 
403*9880d681SAndroid Build Coastguard Worker /// \brief All possible values of the base field for effective-address
404*9880d681SAndroid Build Coastguard Worker /// computations, a.k.a. the Mod and R/M fields of the ModR/M byte.
405*9880d681SAndroid Build Coastguard Worker /// We distinguish between bases (EA_BASE_*) and registers that just happen
406*9880d681SAndroid Build Coastguard Worker /// to be referred to when Mod == 0b11 (EA_REG_*).
407*9880d681SAndroid Build Coastguard Worker enum EABase {
408*9880d681SAndroid Build Coastguard Worker   EA_BASE_NONE,
409*9880d681SAndroid Build Coastguard Worker #define ENTRY(x) EA_BASE_##x,
410*9880d681SAndroid Build Coastguard Worker   ALL_EA_BASES
411*9880d681SAndroid Build Coastguard Worker #undef ENTRY
412*9880d681SAndroid Build Coastguard Worker #define ENTRY(x) EA_REG_##x,
413*9880d681SAndroid Build Coastguard Worker   ALL_REGS
414*9880d681SAndroid Build Coastguard Worker #undef ENTRY
415*9880d681SAndroid Build Coastguard Worker   EA_max
416*9880d681SAndroid Build Coastguard Worker };
417*9880d681SAndroid Build Coastguard Worker 
418*9880d681SAndroid Build Coastguard Worker /// \brief All possible values of the SIB index field.
419*9880d681SAndroid Build Coastguard Worker /// borrows entries from ALL_EA_BASES with the special case that
420*9880d681SAndroid Build Coastguard Worker /// sib is synonymous with NONE.
421*9880d681SAndroid Build Coastguard Worker /// Vector SIB: index can be XMM or YMM.
422*9880d681SAndroid Build Coastguard Worker enum SIBIndex {
423*9880d681SAndroid Build Coastguard Worker   SIB_INDEX_NONE,
424*9880d681SAndroid Build Coastguard Worker #define ENTRY(x) SIB_INDEX_##x,
425*9880d681SAndroid Build Coastguard Worker   ALL_EA_BASES
426*9880d681SAndroid Build Coastguard Worker   REGS_XMM
427*9880d681SAndroid Build Coastguard Worker   REGS_YMM
428*9880d681SAndroid Build Coastguard Worker   REGS_ZMM
429*9880d681SAndroid Build Coastguard Worker #undef ENTRY
430*9880d681SAndroid Build Coastguard Worker   SIB_INDEX_max
431*9880d681SAndroid Build Coastguard Worker };
432*9880d681SAndroid Build Coastguard Worker 
433*9880d681SAndroid Build Coastguard Worker /// \brief All possible values of the SIB base field.
434*9880d681SAndroid Build Coastguard Worker enum SIBBase {
435*9880d681SAndroid Build Coastguard Worker   SIB_BASE_NONE,
436*9880d681SAndroid Build Coastguard Worker #define ENTRY(x) SIB_BASE_##x,
437*9880d681SAndroid Build Coastguard Worker   ALL_SIB_BASES
438*9880d681SAndroid Build Coastguard Worker #undef ENTRY
439*9880d681SAndroid Build Coastguard Worker   SIB_BASE_max
440*9880d681SAndroid Build Coastguard Worker };
441*9880d681SAndroid Build Coastguard Worker 
442*9880d681SAndroid Build Coastguard Worker /// \brief Possible displacement types for effective-address computations.
443*9880d681SAndroid Build Coastguard Worker typedef enum {
444*9880d681SAndroid Build Coastguard Worker   EA_DISP_NONE,
445*9880d681SAndroid Build Coastguard Worker   EA_DISP_8,
446*9880d681SAndroid Build Coastguard Worker   EA_DISP_16,
447*9880d681SAndroid Build Coastguard Worker   EA_DISP_32
448*9880d681SAndroid Build Coastguard Worker } EADisplacement;
449*9880d681SAndroid Build Coastguard Worker 
450*9880d681SAndroid Build Coastguard Worker /// \brief All possible values of the reg field in the ModR/M byte.
451*9880d681SAndroid Build Coastguard Worker enum Reg {
452*9880d681SAndroid Build Coastguard Worker #define ENTRY(x) MODRM_REG_##x,
453*9880d681SAndroid Build Coastguard Worker   ALL_REGS
454*9880d681SAndroid Build Coastguard Worker #undef ENTRY
455*9880d681SAndroid Build Coastguard Worker   MODRM_REG_max
456*9880d681SAndroid Build Coastguard Worker };
457*9880d681SAndroid Build Coastguard Worker 
458*9880d681SAndroid Build Coastguard Worker /// \brief All possible segment overrides.
459*9880d681SAndroid Build Coastguard Worker enum SegmentOverride {
460*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_NONE,
461*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_CS,
462*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_SS,
463*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_DS,
464*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_ES,
465*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_FS,
466*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_GS,
467*9880d681SAndroid Build Coastguard Worker   SEG_OVERRIDE_max
468*9880d681SAndroid Build Coastguard Worker };
469*9880d681SAndroid Build Coastguard Worker 
470*9880d681SAndroid Build Coastguard Worker /// \brief Possible values for the VEX.m-mmmm field
471*9880d681SAndroid Build Coastguard Worker enum VEXLeadingOpcodeByte {
472*9880d681SAndroid Build Coastguard Worker   VEX_LOB_0F = 0x1,
473*9880d681SAndroid Build Coastguard Worker   VEX_LOB_0F38 = 0x2,
474*9880d681SAndroid Build Coastguard Worker   VEX_LOB_0F3A = 0x3
475*9880d681SAndroid Build Coastguard Worker };
476*9880d681SAndroid Build Coastguard Worker 
477*9880d681SAndroid Build Coastguard Worker enum XOPMapSelect {
478*9880d681SAndroid Build Coastguard Worker   XOP_MAP_SELECT_8 = 0x8,
479*9880d681SAndroid Build Coastguard Worker   XOP_MAP_SELECT_9 = 0x9,
480*9880d681SAndroid Build Coastguard Worker   XOP_MAP_SELECT_A = 0xA
481*9880d681SAndroid Build Coastguard Worker };
482*9880d681SAndroid Build Coastguard Worker 
483*9880d681SAndroid Build Coastguard Worker /// \brief Possible values for the VEX.pp/EVEX.pp field
484*9880d681SAndroid Build Coastguard Worker enum VEXPrefixCode {
485*9880d681SAndroid Build Coastguard Worker   VEX_PREFIX_NONE = 0x0,
486*9880d681SAndroid Build Coastguard Worker   VEX_PREFIX_66 = 0x1,
487*9880d681SAndroid Build Coastguard Worker   VEX_PREFIX_F3 = 0x2,
488*9880d681SAndroid Build Coastguard Worker   VEX_PREFIX_F2 = 0x3
489*9880d681SAndroid Build Coastguard Worker };
490*9880d681SAndroid Build Coastguard Worker 
491*9880d681SAndroid Build Coastguard Worker enum VectorExtensionType {
492*9880d681SAndroid Build Coastguard Worker   TYPE_NO_VEX_XOP   = 0x0,
493*9880d681SAndroid Build Coastguard Worker   TYPE_VEX_2B       = 0x1,
494*9880d681SAndroid Build Coastguard Worker   TYPE_VEX_3B       = 0x2,
495*9880d681SAndroid Build Coastguard Worker   TYPE_EVEX         = 0x3,
496*9880d681SAndroid Build Coastguard Worker   TYPE_XOP          = 0x4
497*9880d681SAndroid Build Coastguard Worker };
498*9880d681SAndroid Build Coastguard Worker 
499*9880d681SAndroid Build Coastguard Worker /// \brief Type for the byte reader that the consumer must provide to
500*9880d681SAndroid Build Coastguard Worker /// the decoder. Reads a single byte from the instruction's address space.
501*9880d681SAndroid Build Coastguard Worker /// \param arg     A baton that the consumer can associate with any internal
502*9880d681SAndroid Build Coastguard Worker ///                state that it needs.
503*9880d681SAndroid Build Coastguard Worker /// \param byte    A pointer to a single byte in memory that should be set to
504*9880d681SAndroid Build Coastguard Worker ///                contain the value at address.
505*9880d681SAndroid Build Coastguard Worker /// \param address The address in the instruction's address space that should
506*9880d681SAndroid Build Coastguard Worker ///                be read from.
507*9880d681SAndroid Build Coastguard Worker /// \return        -1 if the byte cannot be read for any reason; 0 otherwise.
508*9880d681SAndroid Build Coastguard Worker typedef int (*byteReader_t)(const void *arg, uint8_t *byte, uint64_t address);
509*9880d681SAndroid Build Coastguard Worker 
510*9880d681SAndroid Build Coastguard Worker /// \brief Type for the logging function that the consumer can provide to
511*9880d681SAndroid Build Coastguard Worker /// get debugging output from the decoder.
512*9880d681SAndroid Build Coastguard Worker /// \param arg A baton that the consumer can associate with any internal
513*9880d681SAndroid Build Coastguard Worker ///            state that it needs.
514*9880d681SAndroid Build Coastguard Worker /// \param log A string that contains the message.  Will be reused after
515*9880d681SAndroid Build Coastguard Worker ///            the logger returns.
516*9880d681SAndroid Build Coastguard Worker typedef void (*dlog_t)(void *arg, const char *log);
517*9880d681SAndroid Build Coastguard Worker 
518*9880d681SAndroid Build Coastguard Worker /// The specification for how to extract and interpret a full instruction and
519*9880d681SAndroid Build Coastguard Worker /// its operands.
520*9880d681SAndroid Build Coastguard Worker struct InstructionSpecifier {
521*9880d681SAndroid Build Coastguard Worker   uint16_t operands;
522*9880d681SAndroid Build Coastguard Worker };
523*9880d681SAndroid Build Coastguard Worker 
524*9880d681SAndroid Build Coastguard Worker /// The x86 internal instruction, which is produced by the decoder.
525*9880d681SAndroid Build Coastguard Worker struct InternalInstruction {
526*9880d681SAndroid Build Coastguard Worker   // Reader interface (C)
527*9880d681SAndroid Build Coastguard Worker   byteReader_t reader;
528*9880d681SAndroid Build Coastguard Worker   // Opaque value passed to the reader
529*9880d681SAndroid Build Coastguard Worker   const void* readerArg;
530*9880d681SAndroid Build Coastguard Worker   // The address of the next byte to read via the reader
531*9880d681SAndroid Build Coastguard Worker   uint64_t readerCursor;
532*9880d681SAndroid Build Coastguard Worker 
533*9880d681SAndroid Build Coastguard Worker   // Logger interface (C)
534*9880d681SAndroid Build Coastguard Worker   dlog_t dlog;
535*9880d681SAndroid Build Coastguard Worker   // Opaque value passed to the logger
536*9880d681SAndroid Build Coastguard Worker   void* dlogArg;
537*9880d681SAndroid Build Coastguard Worker 
538*9880d681SAndroid Build Coastguard Worker   // General instruction information
539*9880d681SAndroid Build Coastguard Worker 
540*9880d681SAndroid Build Coastguard Worker   // The mode to disassemble for (64-bit, protected, real)
541*9880d681SAndroid Build Coastguard Worker   DisassemblerMode mode;
542*9880d681SAndroid Build Coastguard Worker   // The start of the instruction, usable with the reader
543*9880d681SAndroid Build Coastguard Worker   uint64_t startLocation;
544*9880d681SAndroid Build Coastguard Worker   // The length of the instruction, in bytes
545*9880d681SAndroid Build Coastguard Worker   size_t length;
546*9880d681SAndroid Build Coastguard Worker 
547*9880d681SAndroid Build Coastguard Worker   // Prefix state
548*9880d681SAndroid Build Coastguard Worker 
549*9880d681SAndroid Build Coastguard Worker   // 1 if the prefix byte corresponding to the entry is present; 0 if not
550*9880d681SAndroid Build Coastguard Worker   uint8_t prefixPresent[0x100];
551*9880d681SAndroid Build Coastguard Worker   // contains the location (for use with the reader) of the prefix byte
552*9880d681SAndroid Build Coastguard Worker   uint64_t prefixLocations[0x100];
553*9880d681SAndroid Build Coastguard Worker   // The value of the vector extension prefix(EVEX/VEX/XOP), if present
554*9880d681SAndroid Build Coastguard Worker   uint8_t vectorExtensionPrefix[4];
555*9880d681SAndroid Build Coastguard Worker   // The type of the vector extension prefix
556*9880d681SAndroid Build Coastguard Worker   VectorExtensionType vectorExtensionType;
557*9880d681SAndroid Build Coastguard Worker   // The value of the REX prefix, if present
558*9880d681SAndroid Build Coastguard Worker   uint8_t rexPrefix;
559*9880d681SAndroid Build Coastguard Worker   // The location where a mandatory prefix would have to be (i.e., right before
560*9880d681SAndroid Build Coastguard Worker   // the opcode, or right before the REX prefix if one is present).
561*9880d681SAndroid Build Coastguard Worker   uint64_t necessaryPrefixLocation;
562*9880d681SAndroid Build Coastguard Worker   // The segment override type
563*9880d681SAndroid Build Coastguard Worker   SegmentOverride segmentOverride;
564*9880d681SAndroid Build Coastguard Worker   // 1 if the prefix byte, 0xf2 or 0xf3 is xacquire or xrelease
565*9880d681SAndroid Build Coastguard Worker   bool xAcquireRelease;
566*9880d681SAndroid Build Coastguard Worker 
567*9880d681SAndroid Build Coastguard Worker   // Sizes of various critical pieces of data, in bytes
568*9880d681SAndroid Build Coastguard Worker   uint8_t registerSize;
569*9880d681SAndroid Build Coastguard Worker   uint8_t addressSize;
570*9880d681SAndroid Build Coastguard Worker   uint8_t displacementSize;
571*9880d681SAndroid Build Coastguard Worker   uint8_t immediateSize;
572*9880d681SAndroid Build Coastguard Worker 
573*9880d681SAndroid Build Coastguard Worker   // Offsets from the start of the instruction to the pieces of data, which is
574*9880d681SAndroid Build Coastguard Worker   // needed to find relocation entries for adding symbolic operands.
575*9880d681SAndroid Build Coastguard Worker   uint8_t displacementOffset;
576*9880d681SAndroid Build Coastguard Worker   uint8_t immediateOffset;
577*9880d681SAndroid Build Coastguard Worker 
578*9880d681SAndroid Build Coastguard Worker   // opcode state
579*9880d681SAndroid Build Coastguard Worker 
580*9880d681SAndroid Build Coastguard Worker   // The last byte of the opcode, not counting any ModR/M extension
581*9880d681SAndroid Build Coastguard Worker   uint8_t opcode;
582*9880d681SAndroid Build Coastguard Worker 
583*9880d681SAndroid Build Coastguard Worker   // decode state
584*9880d681SAndroid Build Coastguard Worker 
585*9880d681SAndroid Build Coastguard Worker   // The type of opcode, used for indexing into the array of decode tables
586*9880d681SAndroid Build Coastguard Worker   OpcodeType opcodeType;
587*9880d681SAndroid Build Coastguard Worker   // The instruction ID, extracted from the decode table
588*9880d681SAndroid Build Coastguard Worker   uint16_t instructionID;
589*9880d681SAndroid Build Coastguard Worker   // The specifier for the instruction, from the instruction info table
590*9880d681SAndroid Build Coastguard Worker   const InstructionSpecifier *spec;
591*9880d681SAndroid Build Coastguard Worker 
592*9880d681SAndroid Build Coastguard Worker   // state for additional bytes, consumed during operand decode.  Pattern:
593*9880d681SAndroid Build Coastguard Worker   // consumed___ indicates that the byte was already consumed and does not
594*9880d681SAndroid Build Coastguard Worker   // need to be consumed again.
595*9880d681SAndroid Build Coastguard Worker 
596*9880d681SAndroid Build Coastguard Worker   // The VEX.vvvv field, which contains a third register operand for some AVX
597*9880d681SAndroid Build Coastguard Worker   // instructions.
598*9880d681SAndroid Build Coastguard Worker   Reg                           vvvv;
599*9880d681SAndroid Build Coastguard Worker 
600*9880d681SAndroid Build Coastguard Worker   // The writemask for AVX-512 instructions which is contained in EVEX.aaa
601*9880d681SAndroid Build Coastguard Worker   Reg                           writemask;
602*9880d681SAndroid Build Coastguard Worker 
603*9880d681SAndroid Build Coastguard Worker   // The ModR/M byte, which contains most register operands and some portion of
604*9880d681SAndroid Build Coastguard Worker   // all memory operands.
605*9880d681SAndroid Build Coastguard Worker   bool                          consumedModRM;
606*9880d681SAndroid Build Coastguard Worker   uint8_t                       modRM;
607*9880d681SAndroid Build Coastguard Worker 
608*9880d681SAndroid Build Coastguard Worker   // The SIB byte, used for more complex 32- or 64-bit memory operands
609*9880d681SAndroid Build Coastguard Worker   bool                          consumedSIB;
610*9880d681SAndroid Build Coastguard Worker   uint8_t                       sib;
611*9880d681SAndroid Build Coastguard Worker 
612*9880d681SAndroid Build Coastguard Worker   // The displacement, used for memory operands
613*9880d681SAndroid Build Coastguard Worker   bool                          consumedDisplacement;
614*9880d681SAndroid Build Coastguard Worker   int32_t                       displacement;
615*9880d681SAndroid Build Coastguard Worker 
616*9880d681SAndroid Build Coastguard Worker   // Immediates.  There can be two in some cases
617*9880d681SAndroid Build Coastguard Worker   uint8_t                       numImmediatesConsumed;
618*9880d681SAndroid Build Coastguard Worker   uint8_t                       numImmediatesTranslated;
619*9880d681SAndroid Build Coastguard Worker   uint64_t                      immediates[2];
620*9880d681SAndroid Build Coastguard Worker 
621*9880d681SAndroid Build Coastguard Worker   // A register or immediate operand encoded into the opcode
622*9880d681SAndroid Build Coastguard Worker   Reg                           opcodeRegister;
623*9880d681SAndroid Build Coastguard Worker 
624*9880d681SAndroid Build Coastguard Worker   // Portions of the ModR/M byte
625*9880d681SAndroid Build Coastguard Worker 
626*9880d681SAndroid Build Coastguard Worker   // These fields determine the allowable values for the ModR/M fields, which
627*9880d681SAndroid Build Coastguard Worker   // depend on operand and address widths.
628*9880d681SAndroid Build Coastguard Worker   EABase                        eaBaseBase;
629*9880d681SAndroid Build Coastguard Worker   EABase                        eaRegBase;
630*9880d681SAndroid Build Coastguard Worker   Reg                           regBase;
631*9880d681SAndroid Build Coastguard Worker 
632*9880d681SAndroid Build Coastguard Worker   // The Mod and R/M fields can encode a base for an effective address, or a
633*9880d681SAndroid Build Coastguard Worker   // register.  These are separated into two fields here.
634*9880d681SAndroid Build Coastguard Worker   EABase                        eaBase;
635*9880d681SAndroid Build Coastguard Worker   EADisplacement                eaDisplacement;
636*9880d681SAndroid Build Coastguard Worker   // The reg field always encodes a register
637*9880d681SAndroid Build Coastguard Worker   Reg                           reg;
638*9880d681SAndroid Build Coastguard Worker 
639*9880d681SAndroid Build Coastguard Worker   // SIB state
640*9880d681SAndroid Build Coastguard Worker   SIBIndex                      sibIndex;
641*9880d681SAndroid Build Coastguard Worker   uint8_t                       sibScale;
642*9880d681SAndroid Build Coastguard Worker   SIBBase                       sibBase;
643*9880d681SAndroid Build Coastguard Worker 
644*9880d681SAndroid Build Coastguard Worker   ArrayRef<OperandSpecifier> operands;
645*9880d681SAndroid Build Coastguard Worker };
646*9880d681SAndroid Build Coastguard Worker 
647*9880d681SAndroid Build Coastguard Worker /// \brief Decode one instruction and store the decoding results in
648*9880d681SAndroid Build Coastguard Worker /// a buffer provided by the consumer.
649*9880d681SAndroid Build Coastguard Worker /// \param insn      The buffer to store the instruction in.  Allocated by the
650*9880d681SAndroid Build Coastguard Worker ///                  consumer.
651*9880d681SAndroid Build Coastguard Worker /// \param reader    The byteReader_t for the bytes to be read.
652*9880d681SAndroid Build Coastguard Worker /// \param readerArg An argument to pass to the reader for storing context
653*9880d681SAndroid Build Coastguard Worker ///                  specific to the consumer.  May be NULL.
654*9880d681SAndroid Build Coastguard Worker /// \param logger    The dlog_t to be used in printing status messages from the
655*9880d681SAndroid Build Coastguard Worker ///                  disassembler.  May be NULL.
656*9880d681SAndroid Build Coastguard Worker /// \param loggerArg An argument to pass to the logger for storing context
657*9880d681SAndroid Build Coastguard Worker ///                  specific to the logger.  May be NULL.
658*9880d681SAndroid Build Coastguard Worker /// \param startLoc  The address (in the reader's address space) of the first
659*9880d681SAndroid Build Coastguard Worker ///                  byte in the instruction.
660*9880d681SAndroid Build Coastguard Worker /// \param mode      The mode (16-bit, 32-bit, 64-bit) to decode in.
661*9880d681SAndroid Build Coastguard Worker /// \return          Nonzero if there was an error during decode, 0 otherwise.
662*9880d681SAndroid Build Coastguard Worker int decodeInstruction(InternalInstruction *insn,
663*9880d681SAndroid Build Coastguard Worker                       byteReader_t reader,
664*9880d681SAndroid Build Coastguard Worker                       const void *readerArg,
665*9880d681SAndroid Build Coastguard Worker                       dlog_t logger,
666*9880d681SAndroid Build Coastguard Worker                       void *loggerArg,
667*9880d681SAndroid Build Coastguard Worker                       const void *miiArg,
668*9880d681SAndroid Build Coastguard Worker                       uint64_t startLoc,
669*9880d681SAndroid Build Coastguard Worker                       DisassemblerMode mode);
670*9880d681SAndroid Build Coastguard Worker 
671*9880d681SAndroid Build Coastguard Worker /// \brief Print a message to debugs()
672*9880d681SAndroid Build Coastguard Worker /// \param file The name of the file printing the debug message.
673*9880d681SAndroid Build Coastguard Worker /// \param line The line number that printed the debug message.
674*9880d681SAndroid Build Coastguard Worker /// \param s    The message to print.
675*9880d681SAndroid Build Coastguard Worker void Debug(const char *file, unsigned line, const char *s);
676*9880d681SAndroid Build Coastguard Worker 
677*9880d681SAndroid Build Coastguard Worker const char *GetInstrName(unsigned Opcode, const void *mii);
678*9880d681SAndroid Build Coastguard Worker 
679*9880d681SAndroid Build Coastguard Worker } // namespace X86Disassembler
680*9880d681SAndroid Build Coastguard Worker } // namespace llvm
681*9880d681SAndroid Build Coastguard Worker 
682*9880d681SAndroid Build Coastguard Worker #endif
683