xref: /openbsd-src/gnu/llvm/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
109467b48Spatrick //===-- X86DisassemblerDecoderInternal.h - Disassembler decoder -*- C++ -*-===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // This file is part of the X86 Disassembler.
1009467b48Spatrick // It contains the public interface of the instruction decoder.
1109467b48Spatrick // Documentation for the disassembler can be found in X86Disassembler.h.
1209467b48Spatrick //
1309467b48Spatrick //===----------------------------------------------------------------------===//
1409467b48Spatrick 
1509467b48Spatrick #ifndef LLVM_LIB_TARGET_X86_DISASSEMBLER_X86DISASSEMBLERDECODER_H
1609467b48Spatrick #define LLVM_LIB_TARGET_X86_DISASSEMBLER_X86DISASSEMBLERDECODER_H
1709467b48Spatrick 
1809467b48Spatrick #include "llvm/ADT/ArrayRef.h"
1909467b48Spatrick #include "llvm/Support/X86DisassemblerDecoderCommon.h"
2009467b48Spatrick 
2109467b48Spatrick namespace llvm {
2209467b48Spatrick namespace X86Disassembler {
2309467b48Spatrick 
2409467b48Spatrick // Accessor functions for various fields of an Intel instruction
2509467b48Spatrick #define modFromModRM(modRM)  (((modRM) & 0xc0) >> 6)
2609467b48Spatrick #define regFromModRM(modRM)  (((modRM) & 0x38) >> 3)
2709467b48Spatrick #define rmFromModRM(modRM)   ((modRM) & 0x7)
2809467b48Spatrick #define scaleFromSIB(sib)    (((sib) & 0xc0) >> 6)
2909467b48Spatrick #define indexFromSIB(sib)    (((sib) & 0x38) >> 3)
3009467b48Spatrick #define baseFromSIB(sib)     ((sib) & 0x7)
3109467b48Spatrick #define wFromREX(rex)        (((rex) & 0x8) >> 3)
3209467b48Spatrick #define rFromREX(rex)        (((rex) & 0x4) >> 2)
3309467b48Spatrick #define xFromREX(rex)        (((rex) & 0x2) >> 1)
3409467b48Spatrick #define bFromREX(rex)        ((rex) & 0x1)
3509467b48Spatrick 
3609467b48Spatrick #define rFromEVEX2of4(evex)     (((~(evex)) & 0x80) >> 7)
3709467b48Spatrick #define xFromEVEX2of4(evex)     (((~(evex)) & 0x40) >> 6)
3809467b48Spatrick #define bFromEVEX2of4(evex)     (((~(evex)) & 0x20) >> 5)
3909467b48Spatrick #define r2FromEVEX2of4(evex)    (((~(evex)) & 0x10) >> 4)
40*d415bd75Srobert #define mmmFromEVEX2of4(evex)   ((evex) & 0x7)
4109467b48Spatrick #define wFromEVEX3of4(evex)     (((evex) & 0x80) >> 7)
4209467b48Spatrick #define vvvvFromEVEX3of4(evex)  (((~(evex)) & 0x78) >> 3)
4309467b48Spatrick #define ppFromEVEX3of4(evex)    ((evex) & 0x3)
4409467b48Spatrick #define zFromEVEX4of4(evex)     (((evex) & 0x80) >> 7)
4509467b48Spatrick #define l2FromEVEX4of4(evex)    (((evex) & 0x40) >> 6)
4609467b48Spatrick #define lFromEVEX4of4(evex)     (((evex) & 0x20) >> 5)
4709467b48Spatrick #define bFromEVEX4of4(evex)     (((evex) & 0x10) >> 4)
4809467b48Spatrick #define v2FromEVEX4of4(evex)    (((~evex) & 0x8) >> 3)
4909467b48Spatrick #define aaaFromEVEX4of4(evex)   ((evex) & 0x7)
5009467b48Spatrick 
5109467b48Spatrick #define rFromVEX2of3(vex)       (((~(vex)) & 0x80) >> 7)
5209467b48Spatrick #define xFromVEX2of3(vex)       (((~(vex)) & 0x40) >> 6)
5309467b48Spatrick #define bFromVEX2of3(vex)       (((~(vex)) & 0x20) >> 5)
5409467b48Spatrick #define mmmmmFromVEX2of3(vex)   ((vex) & 0x1f)
5509467b48Spatrick #define wFromVEX3of3(vex)       (((vex) & 0x80) >> 7)
5609467b48Spatrick #define vvvvFromVEX3of3(vex)    (((~(vex)) & 0x78) >> 3)
5709467b48Spatrick #define lFromVEX3of3(vex)       (((vex) & 0x4) >> 2)
5809467b48Spatrick #define ppFromVEX3of3(vex)      ((vex) & 0x3)
5909467b48Spatrick 
6009467b48Spatrick #define rFromVEX2of2(vex)       (((~(vex)) & 0x80) >> 7)
6109467b48Spatrick #define vvvvFromVEX2of2(vex)    (((~(vex)) & 0x78) >> 3)
6209467b48Spatrick #define lFromVEX2of2(vex)       (((vex) & 0x4) >> 2)
6309467b48Spatrick #define ppFromVEX2of2(vex)      ((vex) & 0x3)
6409467b48Spatrick 
6509467b48Spatrick #define rFromXOP2of3(xop)       (((~(xop)) & 0x80) >> 7)
6609467b48Spatrick #define xFromXOP2of3(xop)       (((~(xop)) & 0x40) >> 6)
6709467b48Spatrick #define bFromXOP2of3(xop)       (((~(xop)) & 0x20) >> 5)
6809467b48Spatrick #define mmmmmFromXOP2of3(xop)   ((xop) & 0x1f)
6909467b48Spatrick #define wFromXOP3of3(xop)       (((xop) & 0x80) >> 7)
7009467b48Spatrick #define vvvvFromXOP3of3(vex)    (((~(vex)) & 0x78) >> 3)
7109467b48Spatrick #define lFromXOP3of3(xop)       (((xop) & 0x4) >> 2)
7209467b48Spatrick #define ppFromXOP3of3(xop)      ((xop) & 0x3)
7309467b48Spatrick 
7409467b48Spatrick // These enums represent Intel registers for use by the decoder.
7509467b48Spatrick #define REGS_8BIT     \
7609467b48Spatrick   ENTRY(AL)           \
7709467b48Spatrick   ENTRY(CL)           \
7809467b48Spatrick   ENTRY(DL)           \
7909467b48Spatrick   ENTRY(BL)           \
8009467b48Spatrick   ENTRY(AH)           \
8109467b48Spatrick   ENTRY(CH)           \
8209467b48Spatrick   ENTRY(DH)           \
8309467b48Spatrick   ENTRY(BH)           \
8409467b48Spatrick   ENTRY(R8B)          \
8509467b48Spatrick   ENTRY(R9B)          \
8609467b48Spatrick   ENTRY(R10B)         \
8709467b48Spatrick   ENTRY(R11B)         \
8809467b48Spatrick   ENTRY(R12B)         \
8909467b48Spatrick   ENTRY(R13B)         \
9009467b48Spatrick   ENTRY(R14B)         \
9109467b48Spatrick   ENTRY(R15B)         \
9209467b48Spatrick   ENTRY(SPL)          \
9309467b48Spatrick   ENTRY(BPL)          \
9409467b48Spatrick   ENTRY(SIL)          \
9509467b48Spatrick   ENTRY(DIL)
9609467b48Spatrick 
9709467b48Spatrick #define EA_BASES_16BIT  \
9809467b48Spatrick   ENTRY(BX_SI)          \
9909467b48Spatrick   ENTRY(BX_DI)          \
10009467b48Spatrick   ENTRY(BP_SI)          \
10109467b48Spatrick   ENTRY(BP_DI)          \
10209467b48Spatrick   ENTRY(SI)             \
10309467b48Spatrick   ENTRY(DI)             \
10409467b48Spatrick   ENTRY(BP)             \
10509467b48Spatrick   ENTRY(BX)             \
10609467b48Spatrick   ENTRY(R8W)            \
10709467b48Spatrick   ENTRY(R9W)            \
10809467b48Spatrick   ENTRY(R10W)           \
10909467b48Spatrick   ENTRY(R11W)           \
11009467b48Spatrick   ENTRY(R12W)           \
11109467b48Spatrick   ENTRY(R13W)           \
11209467b48Spatrick   ENTRY(R14W)           \
11309467b48Spatrick   ENTRY(R15W)
11409467b48Spatrick 
11509467b48Spatrick #define REGS_16BIT    \
11609467b48Spatrick   ENTRY(AX)           \
11709467b48Spatrick   ENTRY(CX)           \
11809467b48Spatrick   ENTRY(DX)           \
11909467b48Spatrick   ENTRY(BX)           \
12009467b48Spatrick   ENTRY(SP)           \
12109467b48Spatrick   ENTRY(BP)           \
12209467b48Spatrick   ENTRY(SI)           \
12309467b48Spatrick   ENTRY(DI)           \
12409467b48Spatrick   ENTRY(R8W)          \
12509467b48Spatrick   ENTRY(R9W)          \
12609467b48Spatrick   ENTRY(R10W)         \
12709467b48Spatrick   ENTRY(R11W)         \
12809467b48Spatrick   ENTRY(R12W)         \
12909467b48Spatrick   ENTRY(R13W)         \
13009467b48Spatrick   ENTRY(R14W)         \
13109467b48Spatrick   ENTRY(R15W)
13209467b48Spatrick 
13309467b48Spatrick #define EA_BASES_32BIT  \
13409467b48Spatrick   ENTRY(EAX)            \
13509467b48Spatrick   ENTRY(ECX)            \
13609467b48Spatrick   ENTRY(EDX)            \
13709467b48Spatrick   ENTRY(EBX)            \
13809467b48Spatrick   ENTRY(sib)            \
13909467b48Spatrick   ENTRY(EBP)            \
14009467b48Spatrick   ENTRY(ESI)            \
14109467b48Spatrick   ENTRY(EDI)            \
14209467b48Spatrick   ENTRY(R8D)            \
14309467b48Spatrick   ENTRY(R9D)            \
14409467b48Spatrick   ENTRY(R10D)           \
14509467b48Spatrick   ENTRY(R11D)           \
14609467b48Spatrick   ENTRY(R12D)           \
14709467b48Spatrick   ENTRY(R13D)           \
14809467b48Spatrick   ENTRY(R14D)           \
14909467b48Spatrick   ENTRY(R15D)
15009467b48Spatrick 
15109467b48Spatrick #define REGS_32BIT  \
15209467b48Spatrick   ENTRY(EAX)        \
15309467b48Spatrick   ENTRY(ECX)        \
15409467b48Spatrick   ENTRY(EDX)        \
15509467b48Spatrick   ENTRY(EBX)        \
15609467b48Spatrick   ENTRY(ESP)        \
15709467b48Spatrick   ENTRY(EBP)        \
15809467b48Spatrick   ENTRY(ESI)        \
15909467b48Spatrick   ENTRY(EDI)        \
16009467b48Spatrick   ENTRY(R8D)        \
16109467b48Spatrick   ENTRY(R9D)        \
16209467b48Spatrick   ENTRY(R10D)       \
16309467b48Spatrick   ENTRY(R11D)       \
16409467b48Spatrick   ENTRY(R12D)       \
16509467b48Spatrick   ENTRY(R13D)       \
16609467b48Spatrick   ENTRY(R14D)       \
16709467b48Spatrick   ENTRY(R15D)
16809467b48Spatrick 
16909467b48Spatrick #define EA_BASES_64BIT  \
17009467b48Spatrick   ENTRY(RAX)            \
17109467b48Spatrick   ENTRY(RCX)            \
17209467b48Spatrick   ENTRY(RDX)            \
17309467b48Spatrick   ENTRY(RBX)            \
17409467b48Spatrick   ENTRY(sib64)          \
17509467b48Spatrick   ENTRY(RBP)            \
17609467b48Spatrick   ENTRY(RSI)            \
17709467b48Spatrick   ENTRY(RDI)            \
17809467b48Spatrick   ENTRY(R8)             \
17909467b48Spatrick   ENTRY(R9)             \
18009467b48Spatrick   ENTRY(R10)            \
18109467b48Spatrick   ENTRY(R11)            \
18209467b48Spatrick   ENTRY(R12)            \
18309467b48Spatrick   ENTRY(R13)            \
18409467b48Spatrick   ENTRY(R14)            \
18509467b48Spatrick   ENTRY(R15)
18609467b48Spatrick 
18709467b48Spatrick #define REGS_64BIT  \
18809467b48Spatrick   ENTRY(RAX)        \
18909467b48Spatrick   ENTRY(RCX)        \
19009467b48Spatrick   ENTRY(RDX)        \
19109467b48Spatrick   ENTRY(RBX)        \
19209467b48Spatrick   ENTRY(RSP)        \
19309467b48Spatrick   ENTRY(RBP)        \
19409467b48Spatrick   ENTRY(RSI)        \
19509467b48Spatrick   ENTRY(RDI)        \
19609467b48Spatrick   ENTRY(R8)         \
19709467b48Spatrick   ENTRY(R9)         \
19809467b48Spatrick   ENTRY(R10)        \
19909467b48Spatrick   ENTRY(R11)        \
20009467b48Spatrick   ENTRY(R12)        \
20109467b48Spatrick   ENTRY(R13)        \
20209467b48Spatrick   ENTRY(R14)        \
20309467b48Spatrick   ENTRY(R15)
20409467b48Spatrick 
20509467b48Spatrick #define REGS_MMX  \
20609467b48Spatrick   ENTRY(MM0)      \
20709467b48Spatrick   ENTRY(MM1)      \
20809467b48Spatrick   ENTRY(MM2)      \
20909467b48Spatrick   ENTRY(MM3)      \
21009467b48Spatrick   ENTRY(MM4)      \
21109467b48Spatrick   ENTRY(MM5)      \
21209467b48Spatrick   ENTRY(MM6)      \
21309467b48Spatrick   ENTRY(MM7)
21409467b48Spatrick 
21509467b48Spatrick #define REGS_XMM  \
21609467b48Spatrick   ENTRY(XMM0)     \
21709467b48Spatrick   ENTRY(XMM1)     \
21809467b48Spatrick   ENTRY(XMM2)     \
21909467b48Spatrick   ENTRY(XMM3)     \
22009467b48Spatrick   ENTRY(XMM4)     \
22109467b48Spatrick   ENTRY(XMM5)     \
22209467b48Spatrick   ENTRY(XMM6)     \
22309467b48Spatrick   ENTRY(XMM7)     \
22409467b48Spatrick   ENTRY(XMM8)     \
22509467b48Spatrick   ENTRY(XMM9)     \
22609467b48Spatrick   ENTRY(XMM10)    \
22709467b48Spatrick   ENTRY(XMM11)    \
22809467b48Spatrick   ENTRY(XMM12)    \
22909467b48Spatrick   ENTRY(XMM13)    \
23009467b48Spatrick   ENTRY(XMM14)    \
23109467b48Spatrick   ENTRY(XMM15)    \
23209467b48Spatrick   ENTRY(XMM16)    \
23309467b48Spatrick   ENTRY(XMM17)    \
23409467b48Spatrick   ENTRY(XMM18)    \
23509467b48Spatrick   ENTRY(XMM19)    \
23609467b48Spatrick   ENTRY(XMM20)    \
23709467b48Spatrick   ENTRY(XMM21)    \
23809467b48Spatrick   ENTRY(XMM22)    \
23909467b48Spatrick   ENTRY(XMM23)    \
24009467b48Spatrick   ENTRY(XMM24)    \
24109467b48Spatrick   ENTRY(XMM25)    \
24209467b48Spatrick   ENTRY(XMM26)    \
24309467b48Spatrick   ENTRY(XMM27)    \
24409467b48Spatrick   ENTRY(XMM28)    \
24509467b48Spatrick   ENTRY(XMM29)    \
24609467b48Spatrick   ENTRY(XMM30)    \
24709467b48Spatrick   ENTRY(XMM31)
24809467b48Spatrick 
24909467b48Spatrick #define REGS_YMM  \
25009467b48Spatrick   ENTRY(YMM0)     \
25109467b48Spatrick   ENTRY(YMM1)     \
25209467b48Spatrick   ENTRY(YMM2)     \
25309467b48Spatrick   ENTRY(YMM3)     \
25409467b48Spatrick   ENTRY(YMM4)     \
25509467b48Spatrick   ENTRY(YMM5)     \
25609467b48Spatrick   ENTRY(YMM6)     \
25709467b48Spatrick   ENTRY(YMM7)     \
25809467b48Spatrick   ENTRY(YMM8)     \
25909467b48Spatrick   ENTRY(YMM9)     \
26009467b48Spatrick   ENTRY(YMM10)    \
26109467b48Spatrick   ENTRY(YMM11)    \
26209467b48Spatrick   ENTRY(YMM12)    \
26309467b48Spatrick   ENTRY(YMM13)    \
26409467b48Spatrick   ENTRY(YMM14)    \
26509467b48Spatrick   ENTRY(YMM15)    \
26609467b48Spatrick   ENTRY(YMM16)    \
26709467b48Spatrick   ENTRY(YMM17)    \
26809467b48Spatrick   ENTRY(YMM18)    \
26909467b48Spatrick   ENTRY(YMM19)    \
27009467b48Spatrick   ENTRY(YMM20)    \
27109467b48Spatrick   ENTRY(YMM21)    \
27209467b48Spatrick   ENTRY(YMM22)    \
27309467b48Spatrick   ENTRY(YMM23)    \
27409467b48Spatrick   ENTRY(YMM24)    \
27509467b48Spatrick   ENTRY(YMM25)    \
27609467b48Spatrick   ENTRY(YMM26)    \
27709467b48Spatrick   ENTRY(YMM27)    \
27809467b48Spatrick   ENTRY(YMM28)    \
27909467b48Spatrick   ENTRY(YMM29)    \
28009467b48Spatrick   ENTRY(YMM30)    \
28109467b48Spatrick   ENTRY(YMM31)
28209467b48Spatrick 
28309467b48Spatrick #define REGS_ZMM  \
28409467b48Spatrick   ENTRY(ZMM0)     \
28509467b48Spatrick   ENTRY(ZMM1)     \
28609467b48Spatrick   ENTRY(ZMM2)     \
28709467b48Spatrick   ENTRY(ZMM3)     \
28809467b48Spatrick   ENTRY(ZMM4)     \
28909467b48Spatrick   ENTRY(ZMM5)     \
29009467b48Spatrick   ENTRY(ZMM6)     \
29109467b48Spatrick   ENTRY(ZMM7)     \
29209467b48Spatrick   ENTRY(ZMM8)     \
29309467b48Spatrick   ENTRY(ZMM9)     \
29409467b48Spatrick   ENTRY(ZMM10)    \
29509467b48Spatrick   ENTRY(ZMM11)    \
29609467b48Spatrick   ENTRY(ZMM12)    \
29709467b48Spatrick   ENTRY(ZMM13)    \
29809467b48Spatrick   ENTRY(ZMM14)    \
29909467b48Spatrick   ENTRY(ZMM15)    \
30009467b48Spatrick   ENTRY(ZMM16)    \
30109467b48Spatrick   ENTRY(ZMM17)    \
30209467b48Spatrick   ENTRY(ZMM18)    \
30309467b48Spatrick   ENTRY(ZMM19)    \
30409467b48Spatrick   ENTRY(ZMM20)    \
30509467b48Spatrick   ENTRY(ZMM21)    \
30609467b48Spatrick   ENTRY(ZMM22)    \
30709467b48Spatrick   ENTRY(ZMM23)    \
30809467b48Spatrick   ENTRY(ZMM24)    \
30909467b48Spatrick   ENTRY(ZMM25)    \
31009467b48Spatrick   ENTRY(ZMM26)    \
31109467b48Spatrick   ENTRY(ZMM27)    \
31209467b48Spatrick   ENTRY(ZMM28)    \
31309467b48Spatrick   ENTRY(ZMM29)    \
31409467b48Spatrick   ENTRY(ZMM30)    \
31509467b48Spatrick   ENTRY(ZMM31)
31609467b48Spatrick 
31709467b48Spatrick #define REGS_MASKS \
31809467b48Spatrick   ENTRY(K0)        \
31909467b48Spatrick   ENTRY(K1)        \
32009467b48Spatrick   ENTRY(K2)        \
32109467b48Spatrick   ENTRY(K3)        \
32209467b48Spatrick   ENTRY(K4)        \
32309467b48Spatrick   ENTRY(K5)        \
32409467b48Spatrick   ENTRY(K6)        \
32509467b48Spatrick   ENTRY(K7)
32609467b48Spatrick 
32709467b48Spatrick #define REGS_MASK_PAIRS \
32809467b48Spatrick   ENTRY(K0_K1)     \
32909467b48Spatrick   ENTRY(K2_K3)     \
33009467b48Spatrick   ENTRY(K4_K5)     \
33109467b48Spatrick   ENTRY(K6_K7)
33209467b48Spatrick 
33309467b48Spatrick #define REGS_SEGMENT \
33409467b48Spatrick   ENTRY(ES)          \
33509467b48Spatrick   ENTRY(CS)          \
33609467b48Spatrick   ENTRY(SS)          \
33709467b48Spatrick   ENTRY(DS)          \
33809467b48Spatrick   ENTRY(FS)          \
33909467b48Spatrick   ENTRY(GS)
34009467b48Spatrick 
34109467b48Spatrick #define REGS_DEBUG  \
34209467b48Spatrick   ENTRY(DR0)        \
34309467b48Spatrick   ENTRY(DR1)        \
34409467b48Spatrick   ENTRY(DR2)        \
34509467b48Spatrick   ENTRY(DR3)        \
34609467b48Spatrick   ENTRY(DR4)        \
34709467b48Spatrick   ENTRY(DR5)        \
34809467b48Spatrick   ENTRY(DR6)        \
34909467b48Spatrick   ENTRY(DR7)        \
35009467b48Spatrick   ENTRY(DR8)        \
35109467b48Spatrick   ENTRY(DR9)        \
35209467b48Spatrick   ENTRY(DR10)       \
35309467b48Spatrick   ENTRY(DR11)       \
35409467b48Spatrick   ENTRY(DR12)       \
35509467b48Spatrick   ENTRY(DR13)       \
35609467b48Spatrick   ENTRY(DR14)       \
35709467b48Spatrick   ENTRY(DR15)
35809467b48Spatrick 
35909467b48Spatrick #define REGS_CONTROL  \
36009467b48Spatrick   ENTRY(CR0)          \
36109467b48Spatrick   ENTRY(CR1)          \
36209467b48Spatrick   ENTRY(CR2)          \
36309467b48Spatrick   ENTRY(CR3)          \
36409467b48Spatrick   ENTRY(CR4)          \
36509467b48Spatrick   ENTRY(CR5)          \
36609467b48Spatrick   ENTRY(CR6)          \
36709467b48Spatrick   ENTRY(CR7)          \
36809467b48Spatrick   ENTRY(CR8)          \
36909467b48Spatrick   ENTRY(CR9)          \
37009467b48Spatrick   ENTRY(CR10)         \
37109467b48Spatrick   ENTRY(CR11)         \
37209467b48Spatrick   ENTRY(CR12)         \
37309467b48Spatrick   ENTRY(CR13)         \
37409467b48Spatrick   ENTRY(CR14)         \
37509467b48Spatrick   ENTRY(CR15)
37609467b48Spatrick 
377097a140dSpatrick #undef  REGS_TMM
378097a140dSpatrick #define REGS_TMM  \
379097a140dSpatrick   ENTRY(TMM0)     \
380097a140dSpatrick   ENTRY(TMM1)     \
381097a140dSpatrick   ENTRY(TMM2)     \
382097a140dSpatrick   ENTRY(TMM3)     \
383097a140dSpatrick   ENTRY(TMM4)     \
384097a140dSpatrick   ENTRY(TMM5)     \
385097a140dSpatrick   ENTRY(TMM6)     \
386097a140dSpatrick   ENTRY(TMM7)
387097a140dSpatrick 
38809467b48Spatrick #define ALL_EA_BASES  \
38909467b48Spatrick   EA_BASES_16BIT      \
39009467b48Spatrick   EA_BASES_32BIT      \
39109467b48Spatrick   EA_BASES_64BIT
39209467b48Spatrick 
39309467b48Spatrick #define ALL_SIB_BASES \
39409467b48Spatrick   REGS_32BIT          \
39509467b48Spatrick   REGS_64BIT
39609467b48Spatrick 
39709467b48Spatrick #define ALL_REGS      \
39809467b48Spatrick   REGS_8BIT           \
39909467b48Spatrick   REGS_16BIT          \
40009467b48Spatrick   REGS_32BIT          \
40109467b48Spatrick   REGS_64BIT          \
40209467b48Spatrick   REGS_MMX            \
40309467b48Spatrick   REGS_XMM            \
40409467b48Spatrick   REGS_YMM            \
40509467b48Spatrick   REGS_ZMM            \
40609467b48Spatrick   REGS_MASKS          \
40709467b48Spatrick   REGS_MASK_PAIRS     \
40809467b48Spatrick   REGS_SEGMENT        \
40909467b48Spatrick   REGS_DEBUG          \
41009467b48Spatrick   REGS_CONTROL        \
411097a140dSpatrick   REGS_TMM            \
41209467b48Spatrick   ENTRY(RIP)
41309467b48Spatrick 
41409467b48Spatrick /// All possible values of the base field for effective-address
41509467b48Spatrick /// computations, a.k.a. the Mod and R/M fields of the ModR/M byte.
41609467b48Spatrick /// We distinguish between bases (EA_BASE_*) and registers that just happen
41709467b48Spatrick /// to be referred to when Mod == 0b11 (EA_REG_*).
41809467b48Spatrick enum EABase {
41909467b48Spatrick   EA_BASE_NONE,
42009467b48Spatrick #define ENTRY(x) EA_BASE_##x,
42109467b48Spatrick   ALL_EA_BASES
42209467b48Spatrick #undef ENTRY
42309467b48Spatrick #define ENTRY(x) EA_REG_##x,
42409467b48Spatrick   ALL_REGS
42509467b48Spatrick #undef ENTRY
42609467b48Spatrick   EA_max
42709467b48Spatrick };
42809467b48Spatrick 
42909467b48Spatrick /// All possible values of the SIB index field.
43009467b48Spatrick /// borrows entries from ALL_EA_BASES with the special case that
43109467b48Spatrick /// sib is synonymous with NONE.
43209467b48Spatrick /// Vector SIB: index can be XMM or YMM.
43309467b48Spatrick enum SIBIndex {
43409467b48Spatrick   SIB_INDEX_NONE,
43509467b48Spatrick #define ENTRY(x) SIB_INDEX_##x,
43609467b48Spatrick   ALL_EA_BASES
43709467b48Spatrick   REGS_XMM
43809467b48Spatrick   REGS_YMM
43909467b48Spatrick   REGS_ZMM
44009467b48Spatrick #undef ENTRY
44109467b48Spatrick   SIB_INDEX_max
44209467b48Spatrick };
44309467b48Spatrick 
44409467b48Spatrick /// All possible values of the SIB base field.
44509467b48Spatrick enum SIBBase {
44609467b48Spatrick   SIB_BASE_NONE,
44709467b48Spatrick #define ENTRY(x) SIB_BASE_##x,
44809467b48Spatrick   ALL_SIB_BASES
44909467b48Spatrick #undef ENTRY
45009467b48Spatrick   SIB_BASE_max
45109467b48Spatrick };
45209467b48Spatrick 
45309467b48Spatrick /// Possible displacement types for effective-address computations.
45409467b48Spatrick enum EADisplacement {
45509467b48Spatrick   EA_DISP_NONE,
45609467b48Spatrick   EA_DISP_8,
45709467b48Spatrick   EA_DISP_16,
45809467b48Spatrick   EA_DISP_32
45909467b48Spatrick };
46009467b48Spatrick 
46109467b48Spatrick /// All possible values of the reg field in the ModR/M byte.
46209467b48Spatrick enum Reg {
46309467b48Spatrick #define ENTRY(x) MODRM_REG_##x,
46409467b48Spatrick   ALL_REGS
46509467b48Spatrick #undef ENTRY
46609467b48Spatrick   MODRM_REG_max
46709467b48Spatrick };
46809467b48Spatrick 
46909467b48Spatrick /// All possible segment overrides.
47009467b48Spatrick enum SegmentOverride {
47109467b48Spatrick   SEG_OVERRIDE_NONE,
47209467b48Spatrick   SEG_OVERRIDE_CS,
47309467b48Spatrick   SEG_OVERRIDE_SS,
47409467b48Spatrick   SEG_OVERRIDE_DS,
47509467b48Spatrick   SEG_OVERRIDE_ES,
47609467b48Spatrick   SEG_OVERRIDE_FS,
47709467b48Spatrick   SEG_OVERRIDE_GS,
47809467b48Spatrick   SEG_OVERRIDE_max
47909467b48Spatrick };
48009467b48Spatrick 
48109467b48Spatrick /// Possible values for the VEX.m-mmmm field
48209467b48Spatrick enum VEXLeadingOpcodeByte {
48309467b48Spatrick   VEX_LOB_0F = 0x1,
48409467b48Spatrick   VEX_LOB_0F38 = 0x2,
485*d415bd75Srobert   VEX_LOB_0F3A = 0x3,
486*d415bd75Srobert   VEX_LOB_MAP5 = 0x5,
487*d415bd75Srobert   VEX_LOB_MAP6 = 0x6
48809467b48Spatrick };
48909467b48Spatrick 
49009467b48Spatrick enum XOPMapSelect {
49109467b48Spatrick   XOP_MAP_SELECT_8 = 0x8,
49209467b48Spatrick   XOP_MAP_SELECT_9 = 0x9,
49309467b48Spatrick   XOP_MAP_SELECT_A = 0xA
49409467b48Spatrick };
49509467b48Spatrick 
49609467b48Spatrick /// Possible values for the VEX.pp/EVEX.pp field
49709467b48Spatrick enum VEXPrefixCode {
49809467b48Spatrick   VEX_PREFIX_NONE = 0x0,
49909467b48Spatrick   VEX_PREFIX_66 = 0x1,
50009467b48Spatrick   VEX_PREFIX_F3 = 0x2,
50109467b48Spatrick   VEX_PREFIX_F2 = 0x3
50209467b48Spatrick };
50309467b48Spatrick 
50409467b48Spatrick enum VectorExtensionType {
50509467b48Spatrick   TYPE_NO_VEX_XOP   = 0x0,
50609467b48Spatrick   TYPE_VEX_2B       = 0x1,
50709467b48Spatrick   TYPE_VEX_3B       = 0x2,
50809467b48Spatrick   TYPE_EVEX         = 0x3,
50909467b48Spatrick   TYPE_XOP          = 0x4
51009467b48Spatrick };
51109467b48Spatrick 
51209467b48Spatrick /// The specification for how to extract and interpret a full instruction and
51309467b48Spatrick /// its operands.
51409467b48Spatrick struct InstructionSpecifier {
51509467b48Spatrick   uint16_t operands;
51609467b48Spatrick };
51709467b48Spatrick 
51809467b48Spatrick /// The x86 internal instruction, which is produced by the decoder.
51909467b48Spatrick struct InternalInstruction {
52009467b48Spatrick   // Opaque value passed to the reader
52109467b48Spatrick   llvm::ArrayRef<uint8_t> bytes;
52209467b48Spatrick   // The address of the next byte to read via the reader
52309467b48Spatrick   uint64_t readerCursor;
52409467b48Spatrick 
52509467b48Spatrick   // General instruction information
52609467b48Spatrick 
52709467b48Spatrick   // The mode to disassemble for (64-bit, protected, real)
52809467b48Spatrick   DisassemblerMode mode;
52909467b48Spatrick   // The start of the instruction, usable with the reader
53009467b48Spatrick   uint64_t startLocation;
53109467b48Spatrick   // The length of the instruction, in bytes
53209467b48Spatrick   size_t length;
53309467b48Spatrick 
53409467b48Spatrick   // Prefix state
53509467b48Spatrick 
53609467b48Spatrick   // The possible mandatory prefix
53709467b48Spatrick   uint8_t mandatoryPrefix;
53809467b48Spatrick   // The value of the vector extension prefix(EVEX/VEX/XOP), if present
53909467b48Spatrick   uint8_t vectorExtensionPrefix[4];
54009467b48Spatrick   // The type of the vector extension prefix
54109467b48Spatrick   VectorExtensionType vectorExtensionType;
54209467b48Spatrick   // The value of the REX prefix, if present
54309467b48Spatrick   uint8_t rexPrefix;
54409467b48Spatrick   // The segment override type
54509467b48Spatrick   SegmentOverride segmentOverride;
54609467b48Spatrick   // 1 if the prefix byte, 0xf2 or 0xf3 is xacquire or xrelease
54709467b48Spatrick   bool xAcquireRelease;
54809467b48Spatrick 
54909467b48Spatrick   // Address-size override
55009467b48Spatrick   bool hasAdSize;
55109467b48Spatrick   // Operand-size override
55209467b48Spatrick   bool hasOpSize;
55309467b48Spatrick   // Lock prefix
55409467b48Spatrick   bool hasLockPrefix;
55509467b48Spatrick   // The repeat prefix if any
55609467b48Spatrick   uint8_t repeatPrefix;
55709467b48Spatrick 
55809467b48Spatrick   // Sizes of various critical pieces of data, in bytes
55909467b48Spatrick   uint8_t registerSize;
56009467b48Spatrick   uint8_t addressSize;
56109467b48Spatrick   uint8_t displacementSize;
56209467b48Spatrick   uint8_t immediateSize;
56309467b48Spatrick 
56409467b48Spatrick   // Offsets from the start of the instruction to the pieces of data, which is
56509467b48Spatrick   // needed to find relocation entries for adding symbolic operands.
56609467b48Spatrick   uint8_t displacementOffset;
56709467b48Spatrick   uint8_t immediateOffset;
56809467b48Spatrick 
56909467b48Spatrick   // opcode state
57009467b48Spatrick 
57109467b48Spatrick   // The last byte of the opcode, not counting any ModR/M extension
57209467b48Spatrick   uint8_t opcode;
57309467b48Spatrick 
57409467b48Spatrick   // decode state
57509467b48Spatrick 
57609467b48Spatrick   // The type of opcode, used for indexing into the array of decode tables
57709467b48Spatrick   OpcodeType opcodeType;
57809467b48Spatrick   // The instruction ID, extracted from the decode table
57909467b48Spatrick   uint16_t instructionID;
58009467b48Spatrick   // The specifier for the instruction, from the instruction info table
58109467b48Spatrick   const InstructionSpecifier *spec;
58209467b48Spatrick 
58309467b48Spatrick   // state for additional bytes, consumed during operand decode.  Pattern:
58409467b48Spatrick   // consumed___ indicates that the byte was already consumed and does not
58509467b48Spatrick   // need to be consumed again.
58609467b48Spatrick 
58709467b48Spatrick   // The VEX.vvvv field, which contains a third register operand for some AVX
58809467b48Spatrick   // instructions.
58909467b48Spatrick   Reg                           vvvv;
59009467b48Spatrick 
59109467b48Spatrick   // The writemask for AVX-512 instructions which is contained in EVEX.aaa
59209467b48Spatrick   Reg                           writemask;
59309467b48Spatrick 
59409467b48Spatrick   // The ModR/M byte, which contains most register operands and some portion of
59509467b48Spatrick   // all memory operands.
59609467b48Spatrick   bool                          consumedModRM;
59709467b48Spatrick   uint8_t                       modRM;
59809467b48Spatrick 
59909467b48Spatrick   // The SIB byte, used for more complex 32- or 64-bit memory operands
60009467b48Spatrick   uint8_t                       sib;
60109467b48Spatrick 
60209467b48Spatrick   // The displacement, used for memory operands
60309467b48Spatrick   int32_t                       displacement;
60409467b48Spatrick 
60509467b48Spatrick   // Immediates.  There can be two in some cases
60609467b48Spatrick   uint8_t                       numImmediatesConsumed;
60709467b48Spatrick   uint8_t                       numImmediatesTranslated;
60809467b48Spatrick   uint64_t                      immediates[2];
60909467b48Spatrick 
61009467b48Spatrick   // A register or immediate operand encoded into the opcode
61109467b48Spatrick   Reg                           opcodeRegister;
61209467b48Spatrick 
61309467b48Spatrick   // Portions of the ModR/M byte
61409467b48Spatrick 
61509467b48Spatrick   // These fields determine the allowable values for the ModR/M fields, which
61609467b48Spatrick   // depend on operand and address widths.
61709467b48Spatrick   EABase                        eaRegBase;
61809467b48Spatrick   Reg                           regBase;
61909467b48Spatrick 
62009467b48Spatrick   // The Mod and R/M fields can encode a base for an effective address, or a
62109467b48Spatrick   // register.  These are separated into two fields here.
62209467b48Spatrick   EABase                        eaBase;
62309467b48Spatrick   EADisplacement                eaDisplacement;
62409467b48Spatrick   // The reg field always encodes a register
62509467b48Spatrick   Reg                           reg;
62609467b48Spatrick 
62709467b48Spatrick   // SIB state
62809467b48Spatrick   SIBIndex                      sibIndexBase;
62909467b48Spatrick   SIBIndex                      sibIndex;
63009467b48Spatrick   uint8_t                       sibScale;
63109467b48Spatrick   SIBBase                       sibBase;
63209467b48Spatrick 
63309467b48Spatrick   // Embedded rounding control.
63409467b48Spatrick   uint8_t                       RC;
63509467b48Spatrick 
63609467b48Spatrick   ArrayRef<OperandSpecifier> operands;
63709467b48Spatrick };
63809467b48Spatrick 
63909467b48Spatrick } // namespace X86Disassembler
64009467b48Spatrick } // namespace llvm
64109467b48Spatrick 
64209467b48Spatrick #endif
643