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