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