X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fi386-dis.c;h=8a748636343d12611531d777cc7647c6465a3e37;hb=a2b2318d998d2829a7af02d3a8208f136b47578e;hp=aae78659d471b1055e9aa8e7fd664118afaa9bec;hpb=42903f7f5903fc4a27294aab1e23708c59a86b17;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index aae78659d4..8a74863634 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -1,22 +1,25 @@ /* Print i386 instructions for GDB, the GNU debugger. Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + Free Software Foundation, Inc. - This file is part of GDB. + This file is part of the GNU opcodes library. - This program is free software; you can redistribute it and/or modify + This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + the Free Software Foundation; either version 3, or (at your option) + any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + It is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) July 1988 @@ -31,10 +34,11 @@ and the small letter tells about the operand size. Refer to the Intel manual for details. */ -#include "dis-asm.h" #include "sysdep.h" +#include "dis-asm.h" #include "opintl.h" #include "opcode/i386.h" +#include "libiberty.h" #include @@ -50,6 +54,10 @@ static void oappend (const char *); static void append_seg (void); static void OP_indirE (int, int); static void print_operand_value (char *, int, bfd_vma); +static void OP_E_register (int, int); +static void OP_E_memory (int, int); +static void OP_E_extended (int, int); +static void print_displacement (char *, bfd_vma); static void OP_E (int, int); static void OP_G (int, int); static bfd_vma get64 (void); @@ -57,6 +65,7 @@ static bfd_signed_vma get32 (void); static bfd_signed_vma get32s (void); static int get16 (void); static void set_op (bfd_vma, int); +static void OP_Skip_MODRM (int, int); static void OP_REG (int, int); static void OP_IMREG (int, int); static void OP_I (int, int); @@ -83,22 +92,31 @@ static void OP_MXC (int,int); static void OP_MS (int, int); static void OP_XS (int, int); static void OP_M (int, int); -static void OP_VMX (int, int); -static void OP_0fae (int, int); +static void OP_VEX (int, int); +static void OP_VEX_FMA (int, int); +static void OP_EX_Vex (int, int); +static void OP_EX_VexW (int, int); +static void OP_XMM_Vex (int, int); +static void OP_XMM_VexW (int, int); +static void OP_REG_VexI4 (int, int); +static void PCLMUL_Fixup (int, int); +static void VEXI4_Fixup (int, int); +static void VZERO_Fixup (int, int); +static void VCMP_Fixup (int, int); static void OP_0f07 (int, int); +static void OP_Monitor (int, int); +static void OP_Mwait (int, int); static void NOP_Fixup1 (int, int); static void NOP_Fixup2 (int, int); static void OP_3DNowSuffix (int, int); -static void OP_SIMD_Suffix (int, int); -static void SIMD_Fixup (int, int); -static void PNI_Fixup (int, int); -static void SVME_Fixup (int, int); -static void INVLPG_Fixup (int, int); +static void CMP_Fixup (int, int); static void BadOp (void); -static void VMX_Fixup (int, int); static void REP_Fixup (int, int); static void CMPXCHG8B_Fixup (int, int); static void XMM_Fixup (int, int); +static void CRC32_Fixup (int, int); + +static void MOVBE_Fixup (int, int); struct dis_private { /* Points to first byte not fetched. */ @@ -125,6 +143,11 @@ static int prefixes; static int rex; /* Bits of REX we've already used. */ static int rex_used; +/* Original REX prefix. */ +static int rex_original; +/* REX bits in original REX prefix ignored. It may not be the same + as rex_original since some bits may not be ignored. */ +static int rex_ignored; /* Mark parts used in the REX prefix. When we are testing for empty prefix (for 8bit register REX extension), just mask it out. Otherwise test for REX bit is excuse for existence of REX @@ -197,21 +220,29 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define XX { NULL, 0 } #define Eb { OP_E, b_mode } +#define EbS { OP_E, b_swap_mode } #define Ev { OP_E, v_mode } +#define EvS { OP_E, v_swap_mode } #define Ed { OP_E, d_mode } #define Edq { OP_E, dq_mode } #define Edqw { OP_E, dqw_mode } #define Edqb { OP_E, dqb_mode } #define Edqd { OP_E, dqd_mode } +#define Eq { OP_E, q_mode } #define indirEv { OP_indirE, stack_v_mode } #define indirEp { OP_indirE, f_mode } #define stackEv { OP_E, stack_v_mode } #define Em { OP_E, m_mode } #define Ew { OP_E, w_mode } #define M { OP_M, 0 } /* lea, lgdt, etc. */ -#define Ma { OP_M, v_mode } +#define Ma { OP_M, a_mode } +#define Mb { OP_M, b_mode } +#define Md { OP_M, d_mode } +#define Mo { OP_M, o_mode } #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */ #define Mq { OP_M, q_mode } +#define Mx { OP_M, x_mode } +#define Mxmm { OP_M, xmm_mode } #define Gb { OP_G, b_mode } #define Gv { OP_G, v_mode } #define Gd { OP_G, d_mode } @@ -232,6 +263,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define Cm { OP_C, m_mode } #define Dm { OP_D, m_mode } #define Td { OP_T, d_mode } +#define Skip_MODRM { OP_Skip_MODRM, 0 } #define RMeAX { OP_REG, eAX_reg } #define RMeBX { OP_REG, eBX_reg } @@ -303,17 +335,50 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define MX { OP_MMX, 0 } #define XM { OP_XMM, 0 } +#define XMM { OP_XMM, xmm_mode } #define EM { OP_EM, v_mode } -#define EX { OP_EX, v_mode } +#define EMS { OP_EM, v_swap_mode } +#define EMd { OP_EM, d_mode } +#define EMx { OP_EM, x_mode } +#define EXw { OP_EX, w_mode } +#define EXd { OP_EX, d_mode } +#define EXdS { OP_EX, d_swap_mode } +#define EXq { OP_EX, q_mode } +#define EXqS { OP_EX, q_swap_mode } +#define EXx { OP_EX, x_mode } +#define EXxS { OP_EX, x_swap_mode } +#define EXxmm { OP_EX, xmm_mode } +#define EXxmmq { OP_EX, xmmq_mode } +#define EXymmq { OP_EX, ymmq_mode } +#define EXVexWdq { OP_EX, vex_w_dq_mode } #define MS { OP_MS, v_mode } #define XS { OP_XS, v_mode } -#define EMC { OP_EMC, v_mode } +#define EMCq { OP_EMC, q_mode } #define MXC { OP_MXC, 0 } -#define VM { OP_VMX, q_mode } #define OPSUF { OP_3DNowSuffix, 0 } -#define OPSIMD { OP_SIMD_Suffix, 0 } +#define CMP { CMP_Fixup, 0 } #define XMM0 { XMM_Fixup, 0 } +#define Vex { OP_VEX, vex_mode } +#define Vex128 { OP_VEX, vex128_mode } +#define Vex256 { OP_VEX, vex256_mode } +#define VexI4 { VEXI4_Fixup, 0} +#define VexFMA { OP_VEX_FMA, vex_mode } +#define Vex128FMA { OP_VEX_FMA, vex128_mode } +#define EXdVex { OP_EX_Vex, d_mode } +#define EXdVexS { OP_EX_Vex, d_swap_mode } +#define EXqVex { OP_EX_Vex, q_mode } +#define EXqVexS { OP_EX_Vex, q_swap_mode } +#define EXVexW { OP_EX_VexW, x_mode } +#define EXdVexW { OP_EX_VexW, d_mode } +#define EXqVexW { OP_EX_VexW, q_mode } +#define XMVex { OP_XMM_Vex, 0 } +#define XMVexW { OP_XMM_VexW, 0 } +#define XMVexI4 { OP_REG_VexI4, x_mode } +#define PCLMUL { PCLMUL_Fixup, 0 } +#define VZERO { VZERO_Fixup, 0 } +#define VCMP { VCMP_Fixup, 0 } + /* Used handle "rep" prefix for string instructions. */ #define Xbr { REP_Fixup, eSI_reg } #define Xvr { REP_Fixup, eSI_reg } @@ -332,204 +397,892 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define AFLAG 2 #define DFLAG 1 -#define b_mode 1 /* byte operand */ -#define v_mode 2 /* operand size depends on prefixes */ -#define w_mode 3 /* word operand */ -#define d_mode 4 /* double word operand */ -#define q_mode 5 /* quad word operand */ -#define t_mode 6 /* ten-byte operand */ -#define x_mode 7 /* 16-byte XMM operand */ -#define m_mode 8 /* d_mode in 32bit, q_mode in 64bit mode. */ -#define cond_jump_mode 9 -#define loop_jcxz_mode 10 -#define dq_mode 11 /* operand size depends on REX prefixes. */ -#define dqw_mode 12 /* registers like dq_mode, memory like w_mode. */ -#define f_mode 13 /* 4- or 6-byte pointer operand */ -#define const_1_mode 14 -#define stack_v_mode 15 /* v_mode for stack-related opcodes. */ -#define z_mode 16 /* non-quad operand size depends on prefixes */ -#define o_mode 17 /* 16-byte operand */ -#define dqb_mode 18 /* registers like dq_mode, memory like b_mode. */ -#define dqd_mode 19 /* registers like dq_mode, memory like d_mode. */ - -#define es_reg 100 -#define cs_reg 101 -#define ss_reg 102 -#define ds_reg 103 -#define fs_reg 104 -#define gs_reg 105 - -#define eAX_reg 108 -#define eCX_reg 109 -#define eDX_reg 110 -#define eBX_reg 111 -#define eSP_reg 112 -#define eBP_reg 113 -#define eSI_reg 114 -#define eDI_reg 115 - -#define al_reg 116 -#define cl_reg 117 -#define dl_reg 118 -#define bl_reg 119 -#define ah_reg 120 -#define ch_reg 121 -#define dh_reg 122 -#define bh_reg 123 - -#define ax_reg 124 -#define cx_reg 125 -#define dx_reg 126 -#define bx_reg 127 -#define sp_reg 128 -#define bp_reg 129 -#define si_reg 130 -#define di_reg 131 - -#define rAX_reg 132 -#define rCX_reg 133 -#define rDX_reg 134 -#define rBX_reg 135 -#define rSP_reg 136 -#define rBP_reg 137 -#define rSI_reg 138 -#define rDI_reg 139 - -#define z_mode_ax_reg 149 -#define indir_dx_reg 150 - -#define FLOATCODE 1 -#define USE_GROUPS 2 -#define USE_PREFIX_USER_TABLE 3 -#define X86_64_SPECIAL 4 -#define IS_3BYTE_OPCODE 5 - -#define FLOAT NULL, { { NULL, FLOATCODE } } - -#define GRP1a NULL, { { NULL, USE_GROUPS }, { NULL, 0 } } -#define GRP1b NULL, { { NULL, USE_GROUPS }, { NULL, 1 } } -#define GRP1S NULL, { { NULL, USE_GROUPS }, { NULL, 2 } } -#define GRP1Ss NULL, { { NULL, USE_GROUPS }, { NULL, 3 } } -#define GRP2b NULL, { { NULL, USE_GROUPS }, { NULL, 4 } } -#define GRP2S NULL, { { NULL, USE_GROUPS }, { NULL, 5 } } -#define GRP2b_one NULL, { { NULL, USE_GROUPS }, { NULL, 6 } } -#define GRP2S_one NULL, { { NULL, USE_GROUPS }, { NULL, 7 } } -#define GRP2b_cl NULL, { { NULL, USE_GROUPS }, { NULL, 8 } } -#define GRP2S_cl NULL, { { NULL, USE_GROUPS }, { NULL, 9 } } -#define GRP3b NULL, { { NULL, USE_GROUPS }, { NULL, 10 } } -#define GRP3S NULL, { { NULL, USE_GROUPS }, { NULL, 11 } } -#define GRP4 NULL, { { NULL, USE_GROUPS }, { NULL, 12 } } -#define GRP5 NULL, { { NULL, USE_GROUPS }, { NULL, 13 } } -#define GRP6 NULL, { { NULL, USE_GROUPS }, { NULL, 14 } } -#define GRP7 NULL, { { NULL, USE_GROUPS }, { NULL, 15 } } -#define GRP8 NULL, { { NULL, USE_GROUPS }, { NULL, 16 } } -#define GRP9 NULL, { { NULL, USE_GROUPS }, { NULL, 17 } } -#define GRP11_C6 NULL, { { NULL, USE_GROUPS }, { NULL, 18 } } -#define GRP11_C7 NULL, { { NULL, USE_GROUPS }, { NULL, 19 } } -#define GRP12 NULL, { { NULL, USE_GROUPS }, { NULL, 20 } } -#define GRP13 NULL, { { NULL, USE_GROUPS }, { NULL, 21 } } -#define GRP14 NULL, { { NULL, USE_GROUPS }, { NULL, 22 } } -#define GRP15 NULL, { { NULL, USE_GROUPS }, { NULL, 23 } } -#define GRP16 NULL, { { NULL, USE_GROUPS }, { NULL, 24 } } -#define GRPAMD NULL, { { NULL, USE_GROUPS }, { NULL, 25 } } -#define GRPPADLCK1 NULL, { { NULL, USE_GROUPS }, { NULL, 26 } } -#define GRPPADLCK2 NULL, { { NULL, USE_GROUPS }, { NULL, 27 } } - -#define PREGRP0 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 0 } } -#define PREGRP1 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 1 } } -#define PREGRP2 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 2 } } -#define PREGRP3 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 3 } } -#define PREGRP4 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 4 } } -#define PREGRP5 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 5 } } -#define PREGRP6 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 6 } } -#define PREGRP7 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 7 } } -#define PREGRP8 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 8 } } -#define PREGRP9 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 9 } } -#define PREGRP10 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 10 } } -#define PREGRP11 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 11 } } -#define PREGRP12 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 12 } } -#define PREGRP13 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 13 } } -#define PREGRP14 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 14 } } -#define PREGRP15 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 15 } } -#define PREGRP16 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 16 } } -#define PREGRP17 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 17 } } -#define PREGRP18 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 18 } } -#define PREGRP19 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 19 } } -#define PREGRP20 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 20 } } -#define PREGRP21 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 21 } } -#define PREGRP22 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 22 } } -#define PREGRP23 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 23 } } -#define PREGRP24 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 24 } } -#define PREGRP25 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 25 } } -#define PREGRP26 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 26 } } -#define PREGRP27 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 27 } } -#define PREGRP28 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 28 } } -#define PREGRP29 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 29 } } -#define PREGRP30 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 30 } } -#define PREGRP31 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 31 } } -#define PREGRP32 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 32 } } -#define PREGRP33 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 33 } } -#define PREGRP34 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 34 } } -#define PREGRP35 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 35 } } -#define PREGRP36 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 36 } } -#define PREGRP37 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 37 } } -#define PREGRP38 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 38 } } -#define PREGRP39 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 39 } } -#define PREGRP40 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 40 } } -#define PREGRP41 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 41 } } -#define PREGRP42 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 42 } } -#define PREGRP43 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 43 } } -#define PREGRP44 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 44 } } -#define PREGRP45 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 45 } } -#define PREGRP46 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 46 } } -#define PREGRP47 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 47 } } -#define PREGRP48 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 48 } } -#define PREGRP49 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 49 } } -#define PREGRP50 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 50 } } -#define PREGRP51 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 51 } } -#define PREGRP52 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 52 } } -#define PREGRP53 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 53 } } -#define PREGRP54 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 54 } } -#define PREGRP55 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 55 } } -#define PREGRP56 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 56 } } -#define PREGRP57 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 57 } } -#define PREGRP58 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 58 } } -#define PREGRP59 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 59 } } -#define PREGRP60 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 60 } } -#define PREGRP61 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 61 } } -#define PREGRP62 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 62 } } -#define PREGRP63 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 63 } } -#define PREGRP64 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 64 } } -#define PREGRP65 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 65 } } -#define PREGRP66 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 66 } } -#define PREGRP67 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 67 } } -#define PREGRP68 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 68 } } -#define PREGRP69 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 69 } } -#define PREGRP70 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 70 } } -#define PREGRP71 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 71 } } -#define PREGRP72 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 72 } } -#define PREGRP73 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 73 } } -#define PREGRP74 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 74 } } -#define PREGRP75 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 75 } } -#define PREGRP76 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 76 } } -#define PREGRP77 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 77 } } -#define PREGRP78 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 78 } } -#define PREGRP79 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 79 } } -#define PREGRP80 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 80 } } -#define PREGRP81 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 81 } } -#define PREGRP82 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 82 } } -#define PREGRP83 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 83 } } -#define PREGRP84 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 84 } } -#define PREGRP85 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 85 } } - - -#define X86_64_0 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } } -#define X86_64_1 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 1 } } -#define X86_64_2 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 2 } } -#define X86_64_3 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 3 } } - -#define THREE_BYTE_0 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 0 } } -#define THREE_BYTE_1 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 1 } } +enum +{ + /* byte operand */ + b_mode = 1, + /* byte operand with operand swapped */ + b_swap_mode, + /* operand size depends on prefixes */ + v_mode, + /* operand size depends on prefixes with operand swapped */ + v_swap_mode, + /* word operand */ + w_mode, + /* double word operand */ + d_mode, + /* double word operand with operand swapped */ + d_swap_mode, + /* quad word operand */ + q_mode, + /* quad word operand with operand swapped */ + q_swap_mode, + /* ten-byte operand */ + t_mode, + /* 16-byte XMM or 32-byte YMM operand */ + x_mode, + /* 16-byte XMM or 32-byte YMM operand with operand swapped */ + x_swap_mode, + /* 16-byte XMM operand */ + xmm_mode, + /* 16-byte XMM or quad word operand */ + xmmq_mode, + /* 32-byte YMM or quad word operand */ + ymmq_mode, + /* d_mode in 32bit, q_mode in 64bit mode. */ + m_mode, + /* pair of v_mode operands */ + a_mode, + cond_jump_mode, + loop_jcxz_mode, + /* operand size depends on REX prefixes. */ + dq_mode, + /* registers like dq_mode, memory like w_mode. */ + dqw_mode, + /* 4- or 6-byte pointer operand */ + f_mode, + const_1_mode, + /* v_mode for stack-related opcodes. */ + stack_v_mode, + /* non-quad operand size depends on prefixes */ + z_mode, + /* 16-byte operand */ + o_mode, + /* registers like dq_mode, memory like b_mode. */ + dqb_mode, + /* registers like dq_mode, memory like d_mode. */ + dqd_mode, + /* normal vex mode */ + vex_mode, + /* 128bit vex mode */ + vex128_mode, + /* 256bit vex mode */ + vex256_mode, + /* operand size depends on the VEX.W bit. */ + vex_w_dq_mode, + + es_reg, + cs_reg, + ss_reg, + ds_reg, + fs_reg, + gs_reg, + + eAX_reg, + eCX_reg, + eDX_reg, + eBX_reg, + eSP_reg, + eBP_reg, + eSI_reg, + eDI_reg, + + al_reg, + cl_reg, + dl_reg, + bl_reg, + ah_reg, + ch_reg, + dh_reg, + bh_reg, + + ax_reg, + cx_reg, + dx_reg, + bx_reg, + sp_reg, + bp_reg, + si_reg, + di_reg, + + rAX_reg, + rCX_reg, + rDX_reg, + rBX_reg, + rSP_reg, + rBP_reg, + rSI_reg, + rDI_reg, + + z_mode_ax_reg, + indir_dx_reg +}; + +enum +{ + FLOATCODE = 1, + USE_REG_TABLE, + USE_MOD_TABLE, + USE_RM_TABLE, + USE_PREFIX_TABLE, + USE_X86_64_TABLE, + USE_3BYTE_TABLE, + USE_VEX_C4_TABLE, + USE_VEX_C5_TABLE, + USE_VEX_LEN_TABLE +}; + +#define FLOAT NULL, { { NULL, FLOATCODE } } + +#define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } } +#define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I)) +#define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I)) +#define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I)) +#define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I)) +#define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I)) +#define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I)) +#define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I)) +#define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I)) +#define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I)) + +enum +{ + REG_80 = 0, + REG_81, + REG_82, + REG_8F, + REG_C0, + REG_C1, + REG_C6, + REG_C7, + REG_D0, + REG_D1, + REG_D2, + REG_D3, + REG_F6, + REG_F7, + REG_FE, + REG_FF, + REG_0F00, + REG_0F01, + REG_0F0D, + REG_0F18, + REG_0F71, + REG_0F72, + REG_0F73, + REG_0FA6, + REG_0FA7, + REG_0FAE, + REG_0FBA, + REG_0FC7, + REG_VEX_71, + REG_VEX_72, + REG_VEX_73, + REG_VEX_AE +}; + +enum +{ + MOD_8D = 0, + MOD_0F01_REG_0, + MOD_0F01_REG_1, + MOD_0F01_REG_2, + MOD_0F01_REG_3, + MOD_0F01_REG_7, + MOD_0F12_PREFIX_0, + MOD_0F13, + MOD_0F16_PREFIX_0, + MOD_0F17, + MOD_0F18_REG_0, + MOD_0F18_REG_1, + MOD_0F18_REG_2, + MOD_0F18_REG_3, + MOD_0F20, + MOD_0F21, + MOD_0F22, + MOD_0F23, + MOD_0F24, + MOD_0F26, + MOD_0F2B_PREFIX_0, + MOD_0F2B_PREFIX_1, + MOD_0F2B_PREFIX_2, + MOD_0F2B_PREFIX_3, + MOD_0F51, + MOD_0F71_REG_2, + MOD_0F71_REG_4, + MOD_0F71_REG_6, + MOD_0F72_REG_2, + MOD_0F72_REG_4, + MOD_0F72_REG_6, + MOD_0F73_REG_2, + MOD_0F73_REG_3, + MOD_0F73_REG_6, + MOD_0F73_REG_7, + MOD_0FAE_REG_0, + MOD_0FAE_REG_1, + MOD_0FAE_REG_2, + MOD_0FAE_REG_3, + MOD_0FAE_REG_4, + MOD_0FAE_REG_5, + MOD_0FAE_REG_6, + MOD_0FAE_REG_7, + MOD_0FB2, + MOD_0FB4, + MOD_0FB5, + MOD_0FC7_REG_6, + MOD_0FC7_REG_7, + MOD_0FD7, + MOD_0FE7_PREFIX_2, + MOD_0FF0_PREFIX_3, + MOD_0F382A_PREFIX_2, + MOD_62_32BIT, + MOD_C4_32BIT, + MOD_C5_32BIT, + MOD_VEX_12_PREFIX_0, + MOD_VEX_13, + MOD_VEX_16_PREFIX_0, + MOD_VEX_17, + MOD_VEX_2B, + MOD_VEX_51, + MOD_VEX_71_REG_2, + MOD_VEX_71_REG_4, + MOD_VEX_71_REG_6, + MOD_VEX_72_REG_2, + MOD_VEX_72_REG_4, + MOD_VEX_72_REG_6, + MOD_VEX_73_REG_2, + MOD_VEX_73_REG_3, + MOD_VEX_73_REG_6, + MOD_VEX_73_REG_7, + MOD_VEX_AE_REG_2, + MOD_VEX_AE_REG_3, + MOD_VEX_D7_PREFIX_2, + MOD_VEX_E7_PREFIX_2, + MOD_VEX_F0_PREFIX_3, + MOD_VEX_3818_PREFIX_2, + MOD_VEX_3819_PREFIX_2, + MOD_VEX_381A_PREFIX_2, + MOD_VEX_382A_PREFIX_2, + MOD_VEX_382C_PREFIX_2, + MOD_VEX_382D_PREFIX_2, + MOD_VEX_382E_PREFIX_2, + MOD_VEX_382F_PREFIX_2 +}; + +enum +{ + RM_0F01_REG_0 = 0, + RM_0F01_REG_1, + RM_0F01_REG_2, + RM_0F01_REG_3, + RM_0F01_REG_7, + RM_0FAE_REG_5, + RM_0FAE_REG_6, + RM_0FAE_REG_7 +}; + +enum +{ + PREFIX_90 = 0, + PREFIX_0F10, + PREFIX_0F11, + PREFIX_0F12, + PREFIX_0F16, + PREFIX_0F2A, + PREFIX_0F2B, + PREFIX_0F2C, + PREFIX_0F2D, + PREFIX_0F2E, + PREFIX_0F2F, + PREFIX_0F51, + PREFIX_0F52, + PREFIX_0F53, + PREFIX_0F58, + PREFIX_0F59, + PREFIX_0F5A, + PREFIX_0F5B, + PREFIX_0F5C, + PREFIX_0F5D, + PREFIX_0F5E, + PREFIX_0F5F, + PREFIX_0F60, + PREFIX_0F61, + PREFIX_0F62, + PREFIX_0F6C, + PREFIX_0F6D, + PREFIX_0F6F, + PREFIX_0F70, + PREFIX_0F73_REG_3, + PREFIX_0F73_REG_7, + PREFIX_0F78, + PREFIX_0F79, + PREFIX_0F7C, + PREFIX_0F7D, + PREFIX_0F7E, + PREFIX_0F7F, + PREFIX_0FB8, + PREFIX_0FBD, + PREFIX_0FC2, + PREFIX_0FC3, + PREFIX_0FC7_REG_6, + PREFIX_0FD0, + PREFIX_0FD6, + PREFIX_0FE6, + PREFIX_0FE7, + PREFIX_0FF0, + PREFIX_0FF7, + PREFIX_0F3810, + PREFIX_0F3814, + PREFIX_0F3815, + PREFIX_0F3817, + PREFIX_0F3820, + PREFIX_0F3821, + PREFIX_0F3822, + PREFIX_0F3823, + PREFIX_0F3824, + PREFIX_0F3825, + PREFIX_0F3828, + PREFIX_0F3829, + PREFIX_0F382A, + PREFIX_0F382B, + PREFIX_0F3830, + PREFIX_0F3831, + PREFIX_0F3832, + PREFIX_0F3833, + PREFIX_0F3834, + PREFIX_0F3835, + PREFIX_0F3837, + PREFIX_0F3838, + PREFIX_0F3839, + PREFIX_0F383A, + PREFIX_0F383B, + PREFIX_0F383C, + PREFIX_0F383D, + PREFIX_0F383E, + PREFIX_0F383F, + PREFIX_0F3840, + PREFIX_0F3841, + PREFIX_0F3880, + PREFIX_0F3881, + PREFIX_0F38DB, + PREFIX_0F38DC, + PREFIX_0F38DD, + PREFIX_0F38DE, + PREFIX_0F38DF, + PREFIX_0F38F0, + PREFIX_0F38F1, + PREFIX_0F3A08, + PREFIX_0F3A09, + PREFIX_0F3A0A, + PREFIX_0F3A0B, + PREFIX_0F3A0C, + PREFIX_0F3A0D, + PREFIX_0F3A0E, + PREFIX_0F3A14, + PREFIX_0F3A15, + PREFIX_0F3A16, + PREFIX_0F3A17, + PREFIX_0F3A20, + PREFIX_0F3A21, + PREFIX_0F3A22, + PREFIX_0F3A40, + PREFIX_0F3A41, + PREFIX_0F3A42, + PREFIX_0F3A44, + PREFIX_0F3A60, + PREFIX_0F3A61, + PREFIX_0F3A62, + PREFIX_0F3A63, + PREFIX_0F3ADF, + PREFIX_VEX_10, + PREFIX_VEX_11, + PREFIX_VEX_12, + PREFIX_VEX_16, + PREFIX_VEX_2A, + PREFIX_VEX_2C, + PREFIX_VEX_2D, + PREFIX_VEX_2E, + PREFIX_VEX_2F, + PREFIX_VEX_51, + PREFIX_VEX_52, + PREFIX_VEX_53, + PREFIX_VEX_58, + PREFIX_VEX_59, + PREFIX_VEX_5A, + PREFIX_VEX_5B, + PREFIX_VEX_5C, + PREFIX_VEX_5D, + PREFIX_VEX_5E, + PREFIX_VEX_5F, + PREFIX_VEX_60, + PREFIX_VEX_61, + PREFIX_VEX_62, + PREFIX_VEX_63, + PREFIX_VEX_64, + PREFIX_VEX_65, + PREFIX_VEX_66, + PREFIX_VEX_67, + PREFIX_VEX_68, + PREFIX_VEX_69, + PREFIX_VEX_6A, + PREFIX_VEX_6B, + PREFIX_VEX_6C, + PREFIX_VEX_6D, + PREFIX_VEX_6E, + PREFIX_VEX_6F, + PREFIX_VEX_70, + PREFIX_VEX_71_REG_2, + PREFIX_VEX_71_REG_4, + PREFIX_VEX_71_REG_6, + PREFIX_VEX_72_REG_2, + PREFIX_VEX_72_REG_4, + PREFIX_VEX_72_REG_6, + PREFIX_VEX_73_REG_2, + PREFIX_VEX_73_REG_3, + PREFIX_VEX_73_REG_6, + PREFIX_VEX_73_REG_7, + PREFIX_VEX_74, + PREFIX_VEX_75, + PREFIX_VEX_76, + PREFIX_VEX_77, + PREFIX_VEX_7C, + PREFIX_VEX_7D, + PREFIX_VEX_7E, + PREFIX_VEX_7F, + PREFIX_VEX_C2, + PREFIX_VEX_C4, + PREFIX_VEX_C5, + PREFIX_VEX_D0, + PREFIX_VEX_D1, + PREFIX_VEX_D2, + PREFIX_VEX_D3, + PREFIX_VEX_D4, + PREFIX_VEX_D5, + PREFIX_VEX_D6, + PREFIX_VEX_D7, + PREFIX_VEX_D8, + PREFIX_VEX_D9, + PREFIX_VEX_DA, + PREFIX_VEX_DB, + PREFIX_VEX_DC, + PREFIX_VEX_DD, + PREFIX_VEX_DE, + PREFIX_VEX_DF, + PREFIX_VEX_E0, + PREFIX_VEX_E1, + PREFIX_VEX_E2, + PREFIX_VEX_E3, + PREFIX_VEX_E4, + PREFIX_VEX_E5, + PREFIX_VEX_E6, + PREFIX_VEX_E7, + PREFIX_VEX_E8, + PREFIX_VEX_E9, + PREFIX_VEX_EA, + PREFIX_VEX_EB, + PREFIX_VEX_EC, + PREFIX_VEX_ED, + PREFIX_VEX_EE, + PREFIX_VEX_EF, + PREFIX_VEX_F0, + PREFIX_VEX_F1, + PREFIX_VEX_F2, + PREFIX_VEX_F3, + PREFIX_VEX_F4, + PREFIX_VEX_F5, + PREFIX_VEX_F6, + PREFIX_VEX_F7, + PREFIX_VEX_F8, + PREFIX_VEX_F9, + PREFIX_VEX_FA, + PREFIX_VEX_FB, + PREFIX_VEX_FC, + PREFIX_VEX_FD, + PREFIX_VEX_FE, + PREFIX_VEX_3800, + PREFIX_VEX_3801, + PREFIX_VEX_3802, + PREFIX_VEX_3803, + PREFIX_VEX_3804, + PREFIX_VEX_3805, + PREFIX_VEX_3806, + PREFIX_VEX_3807, + PREFIX_VEX_3808, + PREFIX_VEX_3809, + PREFIX_VEX_380A, + PREFIX_VEX_380B, + PREFIX_VEX_380C, + PREFIX_VEX_380D, + PREFIX_VEX_380E, + PREFIX_VEX_380F, + PREFIX_VEX_3817, + PREFIX_VEX_3818, + PREFIX_VEX_3819, + PREFIX_VEX_381A, + PREFIX_VEX_381C, + PREFIX_VEX_381D, + PREFIX_VEX_381E, + PREFIX_VEX_3820, + PREFIX_VEX_3821, + PREFIX_VEX_3822, + PREFIX_VEX_3823, + PREFIX_VEX_3824, + PREFIX_VEX_3825, + PREFIX_VEX_3828, + PREFIX_VEX_3829, + PREFIX_VEX_382A, + PREFIX_VEX_382B, + PREFIX_VEX_382C, + PREFIX_VEX_382D, + PREFIX_VEX_382E, + PREFIX_VEX_382F, + PREFIX_VEX_3830, + PREFIX_VEX_3831, + PREFIX_VEX_3832, + PREFIX_VEX_3833, + PREFIX_VEX_3834, + PREFIX_VEX_3835, + PREFIX_VEX_3837, + PREFIX_VEX_3838, + PREFIX_VEX_3839, + PREFIX_VEX_383A, + PREFIX_VEX_383B, + PREFIX_VEX_383C, + PREFIX_VEX_383D, + PREFIX_VEX_383E, + PREFIX_VEX_383F, + PREFIX_VEX_3840, + PREFIX_VEX_3841, + PREFIX_VEX_3896, + PREFIX_VEX_3897, + PREFIX_VEX_3898, + PREFIX_VEX_3899, + PREFIX_VEX_389A, + PREFIX_VEX_389B, + PREFIX_VEX_389C, + PREFIX_VEX_389D, + PREFIX_VEX_389E, + PREFIX_VEX_389F, + PREFIX_VEX_38A6, + PREFIX_VEX_38A7, + PREFIX_VEX_38A8, + PREFIX_VEX_38A9, + PREFIX_VEX_38AA, + PREFIX_VEX_38AB, + PREFIX_VEX_38AC, + PREFIX_VEX_38AD, + PREFIX_VEX_38AE, + PREFIX_VEX_38AF, + PREFIX_VEX_38B6, + PREFIX_VEX_38B7, + PREFIX_VEX_38B8, + PREFIX_VEX_38B9, + PREFIX_VEX_38BA, + PREFIX_VEX_38BB, + PREFIX_VEX_38BC, + PREFIX_VEX_38BD, + PREFIX_VEX_38BE, + PREFIX_VEX_38BF, + PREFIX_VEX_38DB, + PREFIX_VEX_38DC, + PREFIX_VEX_38DD, + PREFIX_VEX_38DE, + PREFIX_VEX_38DF, + PREFIX_VEX_3A04, + PREFIX_VEX_3A05, + PREFIX_VEX_3A06, + PREFIX_VEX_3A08, + PREFIX_VEX_3A09, + PREFIX_VEX_3A0A, + PREFIX_VEX_3A0B, + PREFIX_VEX_3A0C, + PREFIX_VEX_3A0D, + PREFIX_VEX_3A0E, + PREFIX_VEX_3A0F, + PREFIX_VEX_3A14, + PREFIX_VEX_3A15, + PREFIX_VEX_3A16, + PREFIX_VEX_3A17, + PREFIX_VEX_3A18, + PREFIX_VEX_3A19, + PREFIX_VEX_3A20, + PREFIX_VEX_3A21, + PREFIX_VEX_3A22, + PREFIX_VEX_3A40, + PREFIX_VEX_3A41, + PREFIX_VEX_3A42, + PREFIX_VEX_3A44, + PREFIX_VEX_3A4A, + PREFIX_VEX_3A4B, + PREFIX_VEX_3A4C, + PREFIX_VEX_3A5C, + PREFIX_VEX_3A5D, + PREFIX_VEX_3A5E, + PREFIX_VEX_3A5F, + PREFIX_VEX_3A60, + PREFIX_VEX_3A61, + PREFIX_VEX_3A62, + PREFIX_VEX_3A63, + PREFIX_VEX_3A68, + PREFIX_VEX_3A69, + PREFIX_VEX_3A6A, + PREFIX_VEX_3A6B, + PREFIX_VEX_3A6C, + PREFIX_VEX_3A6D, + PREFIX_VEX_3A6E, + PREFIX_VEX_3A6F, + PREFIX_VEX_3A78, + PREFIX_VEX_3A79, + PREFIX_VEX_3A7A, + PREFIX_VEX_3A7B, + PREFIX_VEX_3A7C, + PREFIX_VEX_3A7D, + PREFIX_VEX_3A7E, + PREFIX_VEX_3A7F, + PREFIX_VEX_3ADF +}; + +enum +{ + X86_64_06 = 0, + X86_64_07, + X86_64_0D, + X86_64_16, + X86_64_17, + X86_64_1E, + X86_64_1F, + X86_64_27, + X86_64_2F, + X86_64_37, + X86_64_3F, + X86_64_60, + X86_64_61, + X86_64_62, + X86_64_63, + X86_64_6D, + X86_64_6F, + X86_64_9A, + X86_64_C4, + X86_64_C5, + X86_64_CE, + X86_64_D4, + X86_64_D5, + X86_64_EA, + X86_64_0F01_REG_0, + X86_64_0F01_REG_1, + X86_64_0F01_REG_2, + X86_64_0F01_REG_3 +}; + +enum +{ + THREE_BYTE_0F38 = 0, + THREE_BYTE_0F3A, + THREE_BYTE_0F7A +}; + +enum +{ + VEX_0F = 0, + VEX_0F38, + VEX_0F3A +}; + +enum +{ + VEX_LEN_10_P_1 = 0, + VEX_LEN_10_P_3, + VEX_LEN_11_P_1, + VEX_LEN_11_P_3, + VEX_LEN_12_P_0_M_0, + VEX_LEN_12_P_0_M_1, + VEX_LEN_12_P_2, + VEX_LEN_13_M_0, + VEX_LEN_16_P_0_M_0, + VEX_LEN_16_P_0_M_1, + VEX_LEN_16_P_2, + VEX_LEN_17_M_0, + VEX_LEN_2A_P_1, + VEX_LEN_2A_P_3, + VEX_LEN_2C_P_1, + VEX_LEN_2C_P_3, + VEX_LEN_2D_P_1, + VEX_LEN_2D_P_3, + VEX_LEN_2E_P_0, + VEX_LEN_2E_P_2, + VEX_LEN_2F_P_0, + VEX_LEN_2F_P_2, + VEX_LEN_51_P_1, + VEX_LEN_51_P_3, + VEX_LEN_52_P_1, + VEX_LEN_53_P_1, + VEX_LEN_58_P_1, + VEX_LEN_58_P_3, + VEX_LEN_59_P_1, + VEX_LEN_59_P_3, + VEX_LEN_5A_P_1, + VEX_LEN_5A_P_3, + VEX_LEN_5C_P_1, + VEX_LEN_5C_P_3, + VEX_LEN_5D_P_1, + VEX_LEN_5D_P_3, + VEX_LEN_5E_P_1, + VEX_LEN_5E_P_3, + VEX_LEN_5F_P_1, + VEX_LEN_5F_P_3, + VEX_LEN_60_P_2, + VEX_LEN_61_P_2, + VEX_LEN_62_P_2, + VEX_LEN_63_P_2, + VEX_LEN_64_P_2, + VEX_LEN_65_P_2, + VEX_LEN_66_P_2, + VEX_LEN_67_P_2, + VEX_LEN_68_P_2, + VEX_LEN_69_P_2, + VEX_LEN_6A_P_2, + VEX_LEN_6B_P_2, + VEX_LEN_6C_P_2, + VEX_LEN_6D_P_2, + VEX_LEN_6E_P_2, + VEX_LEN_70_P_1, + VEX_LEN_70_P_2, + VEX_LEN_70_P_3, + VEX_LEN_71_R_2_P_2, + VEX_LEN_71_R_4_P_2, + VEX_LEN_71_R_6_P_2, + VEX_LEN_72_R_2_P_2, + VEX_LEN_72_R_4_P_2, + VEX_LEN_72_R_6_P_2, + VEX_LEN_73_R_2_P_2, + VEX_LEN_73_R_3_P_2, + VEX_LEN_73_R_6_P_2, + VEX_LEN_73_R_7_P_2, + VEX_LEN_74_P_2, + VEX_LEN_75_P_2, + VEX_LEN_76_P_2, + VEX_LEN_7E_P_1, + VEX_LEN_7E_P_2, + VEX_LEN_AE_R_2_M_0, + VEX_LEN_AE_R_3_M_0, + VEX_LEN_C2_P_1, + VEX_LEN_C2_P_3, + VEX_LEN_C4_P_2, + VEX_LEN_C5_P_2, + VEX_LEN_D1_P_2, + VEX_LEN_D2_P_2, + VEX_LEN_D3_P_2, + VEX_LEN_D4_P_2, + VEX_LEN_D5_P_2, + VEX_LEN_D6_P_2, + VEX_LEN_D7_P_2_M_1, + VEX_LEN_D8_P_2, + VEX_LEN_D9_P_2, + VEX_LEN_DA_P_2, + VEX_LEN_DB_P_2, + VEX_LEN_DC_P_2, + VEX_LEN_DD_P_2, + VEX_LEN_DE_P_2, + VEX_LEN_DF_P_2, + VEX_LEN_E0_P_2, + VEX_LEN_E1_P_2, + VEX_LEN_E2_P_2, + VEX_LEN_E3_P_2, + VEX_LEN_E4_P_2, + VEX_LEN_E5_P_2, + VEX_LEN_E8_P_2, + VEX_LEN_E9_P_2, + VEX_LEN_EA_P_2, + VEX_LEN_EB_P_2, + VEX_LEN_EC_P_2, + VEX_LEN_ED_P_2, + VEX_LEN_EE_P_2, + VEX_LEN_EF_P_2, + VEX_LEN_F1_P_2, + VEX_LEN_F2_P_2, + VEX_LEN_F3_P_2, + VEX_LEN_F4_P_2, + VEX_LEN_F5_P_2, + VEX_LEN_F6_P_2, + VEX_LEN_F7_P_2, + VEX_LEN_F8_P_2, + VEX_LEN_F9_P_2, + VEX_LEN_FA_P_2, + VEX_LEN_FB_P_2, + VEX_LEN_FC_P_2, + VEX_LEN_FD_P_2, + VEX_LEN_FE_P_2, + VEX_LEN_3800_P_2, + VEX_LEN_3801_P_2, + VEX_LEN_3802_P_2, + VEX_LEN_3803_P_2, + VEX_LEN_3804_P_2, + VEX_LEN_3805_P_2, + VEX_LEN_3806_P_2, + VEX_LEN_3807_P_2, + VEX_LEN_3808_P_2, + VEX_LEN_3809_P_2, + VEX_LEN_380A_P_2, + VEX_LEN_380B_P_2, + VEX_LEN_3819_P_2_M_0, + VEX_LEN_381A_P_2_M_0, + VEX_LEN_381C_P_2, + VEX_LEN_381D_P_2, + VEX_LEN_381E_P_2, + VEX_LEN_3820_P_2, + VEX_LEN_3821_P_2, + VEX_LEN_3822_P_2, + VEX_LEN_3823_P_2, + VEX_LEN_3824_P_2, + VEX_LEN_3825_P_2, + VEX_LEN_3828_P_2, + VEX_LEN_3829_P_2, + VEX_LEN_382A_P_2_M_0, + VEX_LEN_382B_P_2, + VEX_LEN_3830_P_2, + VEX_LEN_3831_P_2, + VEX_LEN_3832_P_2, + VEX_LEN_3833_P_2, + VEX_LEN_3834_P_2, + VEX_LEN_3835_P_2, + VEX_LEN_3837_P_2, + VEX_LEN_3838_P_2, + VEX_LEN_3839_P_2, + VEX_LEN_383A_P_2, + VEX_LEN_383B_P_2, + VEX_LEN_383C_P_2, + VEX_LEN_383D_P_2, + VEX_LEN_383E_P_2, + VEX_LEN_383F_P_2, + VEX_LEN_3840_P_2, + VEX_LEN_3841_P_2, + VEX_LEN_38DB_P_2, + VEX_LEN_38DC_P_2, + VEX_LEN_38DD_P_2, + VEX_LEN_38DE_P_2, + VEX_LEN_38DF_P_2, + VEX_LEN_3A06_P_2, + VEX_LEN_3A0A_P_2, + VEX_LEN_3A0B_P_2, + VEX_LEN_3A0E_P_2, + VEX_LEN_3A0F_P_2, + VEX_LEN_3A14_P_2, + VEX_LEN_3A15_P_2, + VEX_LEN_3A16_P_2, + VEX_LEN_3A17_P_2, + VEX_LEN_3A18_P_2, + VEX_LEN_3A19_P_2, + VEX_LEN_3A20_P_2, + VEX_LEN_3A21_P_2, + VEX_LEN_3A22_P_2, + VEX_LEN_3A41_P_2, + VEX_LEN_3A42_P_2, + VEX_LEN_3A44_P_2, + VEX_LEN_3A4C_P_2, + VEX_LEN_3A60_P_2, + VEX_LEN_3A61_P_2, + VEX_LEN_3A62_P_2, + VEX_LEN_3A63_P_2, + VEX_LEN_3A6A_P_2, + VEX_LEN_3A6B_P_2, + VEX_LEN_3A6E_P_2, + VEX_LEN_3A6F_P_2, + VEX_LEN_3A7A_P_2, + VEX_LEN_3A7B_P_2, + VEX_LEN_3A7E_P_2, + VEX_LEN_3A7F_P_2, + VEX_LEN_3ADF_P_2 +}; typedef void (*op_rtn) (int bytemode, int sizeflag); @@ -546,24 +1299,25 @@ struct dis386 { 'A' => print 'b' if no register operands or suffix_always is true 'B' => print 'b' if suffix_always is true 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand - . size prefix + size prefix 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if - . suffix_always is true + suffix_always is true 'E' => print 'e' if 32-bit form of jcxz 'F' => print 'w' or 'l' depending on address size prefix (loop insns) 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns) 'H' => print ",pt" or ",pn" branch hint 'I' => honor following macro letter even in Intel mode (implemented only - . for some of the macro letters) + for some of the macro letters) 'J' => print 'l' 'K' => print 'd' or 'q' if rex prefix is present. 'L' => print 'l' if suffix_always is true + 'M' => print 'r' if intel_mnemonic is false. 'N' => print 'n' if instruction has no wait "prefix" 'O' => print 'd' or 'o' (or 'q' in Intel mode) 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix, - . or suffix_always is true. print 'q' if rex prefix is present. - 'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always - . is true + or suffix_always is true. print 'q' if rex prefix is present. + 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always + is true 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode) 'S' => print 'w', 'l' or 'q' if suffix_always is true 'T' => print 'q' in 64bit mode and behave as 'P' otherwise @@ -571,91 +1325,101 @@ struct dis386 { 'V' => print 'q' in 64bit mode and behave as 'S' otherwise 'W' => print 'b', 'w' or 'l' ('d' in Intel mode) 'X' => print 's', 'd' depending on data16 prefix (for XMM) - 'Y' => 'q' if instruction has an REX 64bit overwrite prefix + 'Y' => 'q' if instruction has an REX 64bit overwrite prefix and + suffix_always is true. 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise + '!' => change condition from true to false or from false to true. + '%' => add 1 upper case letter to the macro. + + 2 upper case letter macros: + "XY" => print 'x' or 'y' if no register operands or suffix_always + is true. + "XW" => print 's', 'd' depending on the VEX.W bit (for FMA) + "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand + or suffix_always is true + "LB" => print "abs" in 64bit mode and behave as 'B' otherwise + "LS" => print "abs" in 64bit mode and behave as 'S' otherwise + "LV" => print "abs" for 64bit operand and behave as 'S' otherwise Many of the above letters print nothing in Intel mode. See "putop" for the details. Braces '{' and '}', and vertical bars '|', indicate alternative - mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel - modes. In cases where there are only two alternatives, the X86_64 - instruction is reserved, and "(bad)" is printed. -*/ + mnemonic strings for AT&T and Intel. */ static const struct dis386 dis386[] = { /* 00 */ { "addB", { Eb, Gb } }, { "addS", { Ev, Gv } }, - { "addB", { Gb, Eb } }, - { "addS", { Gv, Ev } }, + { "addB", { Gb, EbS } }, + { "addS", { Gv, EvS } }, { "addB", { AL, Ib } }, { "addS", { eAX, Iv } }, - { "push{T|}", { es } }, - { "pop{T|}", { es } }, + { X86_64_TABLE (X86_64_06) }, + { X86_64_TABLE (X86_64_07) }, /* 08 */ { "orB", { Eb, Gb } }, { "orS", { Ev, Gv } }, - { "orB", { Gb, Eb } }, - { "orS", { Gv, Ev } }, + { "orB", { Gb, EbS } }, + { "orS", { Gv, EvS } }, { "orB", { AL, Ib } }, { "orS", { eAX, Iv } }, - { "push{T|}", { cs } }, + { X86_64_TABLE (X86_64_0D) }, { "(bad)", { XX } }, /* 0x0f extended opcode escape */ /* 10 */ { "adcB", { Eb, Gb } }, { "adcS", { Ev, Gv } }, - { "adcB", { Gb, Eb } }, - { "adcS", { Gv, Ev } }, + { "adcB", { Gb, EbS } }, + { "adcS", { Gv, EvS } }, { "adcB", { AL, Ib } }, { "adcS", { eAX, Iv } }, - { "push{T|}", { ss } }, - { "pop{T|}", { ss } }, + { X86_64_TABLE (X86_64_16) }, + { X86_64_TABLE (X86_64_17) }, /* 18 */ { "sbbB", { Eb, Gb } }, { "sbbS", { Ev, Gv } }, - { "sbbB", { Gb, Eb } }, - { "sbbS", { Gv, Ev } }, + { "sbbB", { Gb, EbS } }, + { "sbbS", { Gv, EvS } }, { "sbbB", { AL, Ib } }, { "sbbS", { eAX, Iv } }, - { "push{T|}", { ds } }, - { "pop{T|}", { ds } }, + { X86_64_TABLE (X86_64_1E) }, + { X86_64_TABLE (X86_64_1F) }, /* 20 */ { "andB", { Eb, Gb } }, { "andS", { Ev, Gv } }, - { "andB", { Gb, Eb } }, - { "andS", { Gv, Ev } }, + { "andB", { Gb, EbS } }, + { "andS", { Gv, EvS } }, { "andB", { AL, Ib } }, { "andS", { eAX, Iv } }, { "(bad)", { XX } }, /* SEG ES prefix */ - { "daa{|}", { XX } }, + { X86_64_TABLE (X86_64_27) }, /* 28 */ { "subB", { Eb, Gb } }, { "subS", { Ev, Gv } }, - { "subB", { Gb, Eb } }, - { "subS", { Gv, Ev } }, + { "subB", { Gb, EbS } }, + { "subS", { Gv, EvS } }, { "subB", { AL, Ib } }, { "subS", { eAX, Iv } }, { "(bad)", { XX } }, /* SEG CS prefix */ - { "das{|}", { XX } }, + { X86_64_TABLE (X86_64_2F) }, /* 30 */ { "xorB", { Eb, Gb } }, { "xorS", { Ev, Gv } }, - { "xorB", { Gb, Eb } }, - { "xorS", { Gv, Ev } }, + { "xorB", { Gb, EbS } }, + { "xorS", { Gv, EvS } }, { "xorB", { AL, Ib } }, { "xorS", { eAX, Iv } }, { "(bad)", { XX } }, /* SEG SS prefix */ - { "aaa{|}", { XX } }, + { X86_64_TABLE (X86_64_37) }, /* 38 */ { "cmpB", { Eb, Gb } }, { "cmpS", { Ev, Gv } }, - { "cmpB", { Gb, Eb } }, - { "cmpS", { Gv, Ev } }, + { "cmpB", { Gb, EbS } }, + { "cmpS", { Gv, EvS } }, { "cmpB", { AL, Ib } }, { "cmpS", { eAX, Iv } }, { "(bad)", { XX } }, /* SEG DS prefix */ - { "aas{|}", { XX } }, + { X86_64_TABLE (X86_64_3F) }, /* 40 */ { "inc{S|}", { RMeAX } }, { "inc{S|}", { RMeCX } }, @@ -693,10 +1457,10 @@ static const struct dis386 dis386[] = { { "popV", { RMrSI } }, { "popV", { RMrDI } }, /* 60 */ - { X86_64_0 }, - { X86_64_1 }, - { X86_64_2 }, - { X86_64_3 }, + { X86_64_TABLE (X86_64_60) }, + { X86_64_TABLE (X86_64_61) }, + { X86_64_TABLE (X86_64_62) }, + { X86_64_TABLE (X86_64_63) }, { "(bad)", { XX } }, /* seg fs */ { "(bad)", { XX } }, /* seg gs */ { "(bad)", { XX } }, /* op size prefix */ @@ -706,10 +1470,10 @@ static const struct dis386 dis386[] = { { "imulS", { Gv, Ev, Iv } }, { "pushT", { sIb } }, { "imulS", { Gv, Ev, sIb } }, - { "ins{b||b|}", { Ybr, indirDX } }, - { "ins{R||G|}", { Yzr, indirDX } }, - { "outs{b||b|}", { indirDXr, Xb } }, - { "outs{R||G|}", { indirDXr, Xz } }, + { "ins{b|}", { Ybr, indirDX } }, + { X86_64_TABLE (X86_64_6D) }, + { "outs{b|}", { indirDXr, Xb } }, + { X86_64_TABLE (X86_64_6F) }, /* 70 */ { "joH", { Jb, XX, cond_jump_flag } }, { "jnoH", { Jb, XX, cond_jump_flag } }, @@ -729,10 +1493,10 @@ static const struct dis386 dis386[] = { { "jleH", { Jb, XX, cond_jump_flag } }, { "jgH", { Jb, XX, cond_jump_flag } }, /* 80 */ - { GRP1b }, - { GRP1S }, + { REG_TABLE (REG_80) }, + { REG_TABLE (REG_81) }, { "(bad)", { XX } }, - { GRP1Ss }, + { REG_TABLE (REG_82) }, { "testB", { Eb, Gb } }, { "testS", { Ev, Gv } }, { "xchgB", { Eb, Gb } }, @@ -740,14 +1504,14 @@ static const struct dis386 dis386[] = { /* 88 */ { "movB", { Eb, Gb } }, { "movS", { Ev, Gv } }, - { "movB", { Gb, Eb } }, - { "movS", { Gv, Ev } }, + { "movB", { Gb, EbS } }, + { "movS", { Gv, EvS } }, { "movD", { Sv, Sw } }, - { "leaS", { Gv, M } }, + { MOD_TABLE (MOD_8D) }, { "movD", { Sw, Sv } }, - { GRP1a }, + { REG_TABLE (REG_8F) }, /* 90 */ - { PREGRP38 }, + { PREFIX_TABLE (PREFIX_90) }, { "xchgS", { RMeCX, eAX } }, { "xchgS", { RMeDX, eAX } }, { "xchgS", { RMeBX, eAX } }, @@ -756,23 +1520,23 @@ static const struct dis386 dis386[] = { { "xchgS", { RMeSI, eAX } }, { "xchgS", { RMeDI, eAX } }, /* 98 */ - { "cW{t||t|}R", { XX } }, - { "cR{t||t|}O", { XX } }, - { "Jcall{T|}", { Ap } }, + { "cW{t|}R", { XX } }, + { "cR{t|}O", { XX } }, + { X86_64_TABLE (X86_64_9A) }, { "(bad)", { XX } }, /* fwait */ { "pushfT", { XX } }, { "popfT", { XX } }, - { "sahf{|}", { XX } }, - { "lahf{|}", { XX } }, + { "sahf", { XX } }, + { "lahf", { XX } }, /* a0 */ - { "movB", { AL, Ob } }, - { "movS", { eAX, Ov } }, - { "movB", { Ob, AL } }, - { "movS", { Ov, eAX } }, - { "movs{b||b|}", { Ybr, Xb } }, - { "movs{R||R|}", { Yvr, Xv } }, - { "cmps{b||b|}", { Xb, Yb } }, - { "cmps{R||R|}", { Xv, Yv } }, + { "mov%LB", { AL, Ob } }, + { "mov%LS", { eAX, Ov } }, + { "mov%LB", { Ob, AL } }, + { "mov%LS", { Ov, eAX } }, + { "movs{b|}", { Ybr, Xb } }, + { "movs{R|}", { Yvr, Xv } }, + { "cmps{b|}", { Xb, Yb } }, + { "cmps{R|}", { Xv, Yv } }, /* a8 */ { "testB", { AL, Ib } }, { "testS", { eAX, Iv } }, @@ -792,39 +1556,39 @@ static const struct dis386 dis386[] = { { "movB", { RMDH, Ib } }, { "movB", { RMBH, Ib } }, /* b8 */ - { "movS", { RMeAX, Iv64 } }, - { "movS", { RMeCX, Iv64 } }, - { "movS", { RMeDX, Iv64 } }, - { "movS", { RMeBX, Iv64 } }, - { "movS", { RMeSP, Iv64 } }, - { "movS", { RMeBP, Iv64 } }, - { "movS", { RMeSI, Iv64 } }, - { "movS", { RMeDI, Iv64 } }, + { "mov%LV", { RMeAX, Iv64 } }, + { "mov%LV", { RMeCX, Iv64 } }, + { "mov%LV", { RMeDX, Iv64 } }, + { "mov%LV", { RMeBX, Iv64 } }, + { "mov%LV", { RMeSP, Iv64 } }, + { "mov%LV", { RMeBP, Iv64 } }, + { "mov%LV", { RMeSI, Iv64 } }, + { "mov%LV", { RMeDI, Iv64 } }, /* c0 */ - { GRP2b }, - { GRP2S }, + { REG_TABLE (REG_C0) }, + { REG_TABLE (REG_C1) }, { "retT", { Iw } }, { "retT", { XX } }, - { "les{S|}", { Gv, Mp } }, - { "ldsS", { Gv, Mp } }, - { GRP11_C6 }, - { GRP11_C7 }, + { X86_64_TABLE (X86_64_C4) }, + { X86_64_TABLE (X86_64_C5) }, + { REG_TABLE (REG_C6) }, + { REG_TABLE (REG_C7) }, /* c8 */ { "enterT", { Iw, Ib } }, { "leaveT", { XX } }, - { "lretP", { Iw } }, - { "lretP", { XX } }, + { "Jret{|f}P", { Iw } }, + { "Jret{|f}P", { XX } }, { "int3", { XX } }, { "int", { Ib } }, - { "into{|}", { XX } }, + { X86_64_TABLE (X86_64_CE) }, { "iretP", { XX } }, /* d0 */ - { GRP2b_one }, - { GRP2S_one }, - { GRP2b_cl }, - { GRP2S_cl }, - { "aam{|}", { sIb } }, - { "aad{|}", { sIb } }, + { REG_TABLE (REG_D0) }, + { REG_TABLE (REG_D1) }, + { REG_TABLE (REG_D2) }, + { REG_TABLE (REG_D3) }, + { X86_64_TABLE (X86_64_D4) }, + { X86_64_TABLE (X86_64_D5) }, { "(bad)", { XX } }, { "xlat", { DSBX } }, /* d8 */ @@ -848,7 +1612,7 @@ static const struct dis386 dis386[] = { /* e8 */ { "callT", { Jv } }, { "jmpT", { Jv } }, - { "Jjmp{T|}", { Ap } }, + { X86_64_TABLE (X86_64_EA) }, { "jmp", { Jb } }, { "inB", { AL, indirDX } }, { "inG", { zAX, indirDX } }, @@ -861,8 +1625,8 @@ static const struct dis386 dis386[] = { { "(bad)", { XX } }, /* repz */ { "hlt", { XX } }, { "cmc", { XX } }, - { GRP3b }, - { GRP3S }, + { REG_TABLE (REG_F6) }, + { REG_TABLE (REG_F7) }, /* f8 */ { "clc", { XX } }, { "stc", { XX } }, @@ -870,14 +1634,14 @@ static const struct dis386 dis386[] = { { "sti", { XX } }, { "cld", { XX } }, { "std", { XX } }, - { GRP4 }, - { GRP5 }, + { REG_TABLE (REG_FE) }, + { REG_TABLE (REG_FF) }, }; static const struct dis386 dis386_twobyte[] = { /* 00 */ - { GRP6 }, - { GRP7 }, + { REG_TABLE (REG_0F00 ) }, + { REG_TABLE (REG_0F01 ) }, { "larS", { Gv, Ew } }, { "lslS", { Gv, Ew } }, { "(bad)", { XX } }, @@ -890,45 +1654,45 @@ static const struct dis386 dis386_twobyte[] = { { "(bad)", { XX } }, { "ud2a", { XX } }, { "(bad)", { XX } }, - { GRPAMD }, + { REG_TABLE (REG_0F0D) }, { "femms", { XX } }, { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */ /* 10 */ - { PREGRP8 }, - { PREGRP9 }, - { PREGRP30 }, - { "movlpX", { EX, XM, { SIMD_Fixup, 'h' } } }, - { "unpcklpX", { XM, EX } }, - { "unpckhpX", { XM, EX } }, - { PREGRP31 }, - { "movhpX", { EX, XM, { SIMD_Fixup, 'l' } } }, + { PREFIX_TABLE (PREFIX_0F10) }, + { PREFIX_TABLE (PREFIX_0F11) }, + { PREFIX_TABLE (PREFIX_0F12) }, + { MOD_TABLE (MOD_0F13) }, + { "unpcklpX", { XM, EXx } }, + { "unpckhpX", { XM, EXx } }, + { PREFIX_TABLE (PREFIX_0F16) }, + { MOD_TABLE (MOD_0F17) }, /* 18 */ - { GRP16 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { REG_TABLE (REG_0F18) }, + { "nopQ", { Ev } }, + { "nopQ", { Ev } }, + { "nopQ", { Ev } }, + { "nopQ", { Ev } }, + { "nopQ", { Ev } }, + { "nopQ", { Ev } }, { "nopQ", { Ev } }, /* 20 */ - { "movZ", { Rm, Cm } }, - { "movZ", { Rm, Dm } }, - { "movZ", { Cm, Rm } }, - { "movZ", { Dm, Rm } }, - { "movL", { Rd, Td } }, + { MOD_TABLE (MOD_0F20) }, + { MOD_TABLE (MOD_0F21) }, + { MOD_TABLE (MOD_0F22) }, + { MOD_TABLE (MOD_0F23) }, + { MOD_TABLE (MOD_0F24) }, { "(bad)", { XX } }, - { "movL", { Td, Rd } }, + { MOD_TABLE (MOD_0F26) }, { "(bad)", { XX } }, /* 28 */ - { "movapX", { XM, EX } }, - { "movapX", { EX, XM } }, - { PREGRP2 }, - { PREGRP33 }, - { PREGRP4 }, - { PREGRP3 }, - { "ucomisX", { XM,EX } }, - { "comisX", { XM,EX } }, + { "movapX", { XM, EXx } }, + { "movapX", { EXxS, XM } }, + { PREFIX_TABLE (PREFIX_0F2A) }, + { PREFIX_TABLE (PREFIX_0F2B) }, + { PREFIX_TABLE (PREFIX_0F2C) }, + { PREFIX_TABLE (PREFIX_0F2D) }, + { PREFIX_TABLE (PREFIX_0F2E) }, + { PREFIX_TABLE (PREFIX_0F2F) }, /* 30 */ { "wrmsr", { XX } }, { "rdtsc", { XX } }, @@ -937,56 +1701,56 @@ static const struct dis386 dis386_twobyte[] = { { "sysenter", { XX } }, { "sysexit", { XX } }, { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "getsec", { XX } }, /* 38 */ - { THREE_BYTE_0 }, + { THREE_BYTE_TABLE (THREE_BYTE_0F38) }, { "(bad)", { XX } }, - { THREE_BYTE_1 }, + { THREE_BYTE_TABLE (THREE_BYTE_0F3A) }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, /* 40 */ - { "cmovo", { Gv, Ev } }, - { "cmovno", { Gv, Ev } }, - { "cmovb", { Gv, Ev } }, - { "cmovae", { Gv, Ev } }, - { "cmove", { Gv, Ev } }, - { "cmovne", { Gv, Ev } }, - { "cmovbe", { Gv, Ev } }, - { "cmova", { Gv, Ev } }, + { "cmovoS", { Gv, Ev } }, + { "cmovnoS", { Gv, Ev } }, + { "cmovbS", { Gv, Ev } }, + { "cmovaeS", { Gv, Ev } }, + { "cmoveS", { Gv, Ev } }, + { "cmovneS", { Gv, Ev } }, + { "cmovbeS", { Gv, Ev } }, + { "cmovaS", { Gv, Ev } }, /* 48 */ - { "cmovs", { Gv, Ev } }, - { "cmovns", { Gv, Ev } }, - { "cmovp", { Gv, Ev } }, - { "cmovnp", { Gv, Ev } }, - { "cmovl", { Gv, Ev } }, - { "cmovge", { Gv, Ev } }, - { "cmovle", { Gv, Ev } }, - { "cmovg", { Gv, Ev } }, + { "cmovsS", { Gv, Ev } }, + { "cmovnsS", { Gv, Ev } }, + { "cmovpS", { Gv, Ev } }, + { "cmovnpS", { Gv, Ev } }, + { "cmovlS", { Gv, Ev } }, + { "cmovgeS", { Gv, Ev } }, + { "cmovleS", { Gv, Ev } }, + { "cmovgS", { Gv, Ev } }, /* 50 */ - { "movmskpX", { Gdq, XS } }, - { PREGRP13 }, - { PREGRP12 }, - { PREGRP11 }, - { "andpX", { XM, EX } }, - { "andnpX", { XM, EX } }, - { "orpX", { XM, EX } }, - { "xorpX", { XM, EX } }, + { MOD_TABLE (MOD_0F51) }, + { PREFIX_TABLE (PREFIX_0F51) }, + { PREFIX_TABLE (PREFIX_0F52) }, + { PREFIX_TABLE (PREFIX_0F53) }, + { "andpX", { XM, EXx } }, + { "andnpX", { XM, EXx } }, + { "orpX", { XM, EXx } }, + { "xorpX", { XM, EXx } }, /* 58 */ - { PREGRP0 }, - { PREGRP10 }, - { PREGRP17 }, - { PREGRP16 }, - { PREGRP14 }, - { PREGRP7 }, - { PREGRP5 }, - { PREGRP6 }, + { PREFIX_TABLE (PREFIX_0F58) }, + { PREFIX_TABLE (PREFIX_0F59) }, + { PREFIX_TABLE (PREFIX_0F5A) }, + { PREFIX_TABLE (PREFIX_0F5B) }, + { PREFIX_TABLE (PREFIX_0F5C) }, + { PREFIX_TABLE (PREFIX_0F5D) }, + { PREFIX_TABLE (PREFIX_0F5E) }, + { PREFIX_TABLE (PREFIX_0F5F) }, /* 60 */ - { "punpcklbw", { MX, EM } }, - { "punpcklwd", { MX, EM } }, - { "punpckldq", { MX, EM } }, + { PREFIX_TABLE (PREFIX_0F60) }, + { PREFIX_TABLE (PREFIX_0F61) }, + { PREFIX_TABLE (PREFIX_0F62) }, { "packsswb", { MX, EM } }, { "pcmpgtb", { MX, EM } }, { "pcmpgtw", { MX, EM } }, @@ -997,28 +1761,28 @@ static const struct dis386 dis386_twobyte[] = { { "punpckhwd", { MX, EM } }, { "punpckhdq", { MX, EM } }, { "packssdw", { MX, EM } }, - { PREGRP26 }, - { PREGRP24 }, - { "movd", { MX, Edq } }, - { PREGRP19 }, + { PREFIX_TABLE (PREFIX_0F6C) }, + { PREFIX_TABLE (PREFIX_0F6D) }, + { "movK", { MX, Edq } }, + { PREFIX_TABLE (PREFIX_0F6F) }, /* 70 */ - { PREGRP22 }, - { GRP12 }, - { GRP13 }, - { GRP14 }, + { PREFIX_TABLE (PREFIX_0F70) }, + { REG_TABLE (REG_0F71) }, + { REG_TABLE (REG_0F72) }, + { REG_TABLE (REG_0F73) }, { "pcmpeqb", { MX, EM } }, { "pcmpeqw", { MX, EM } }, { "pcmpeqd", { MX, EM } }, { "emms", { XX } }, /* 78 */ - { PREGRP34 }, - { PREGRP35 }, - { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F78) }, + { PREFIX_TABLE (PREFIX_0F79) }, + { THREE_BYTE_TABLE (THREE_BYTE_0F7A) }, { "(bad)", { XX } }, - { PREGRP28 }, - { PREGRP29 }, - { PREGRP23 }, - { PREGRP20 }, + { PREFIX_TABLE (PREFIX_0F7C) }, + { PREFIX_TABLE (PREFIX_0F7D) }, + { PREFIX_TABLE (PREFIX_0F7E) }, + { PREFIX_TABLE (PREFIX_0F7F) }, /* 80 */ { "joH", { Jv, XX, cond_jump_flag } }, { "jnoH", { Jv, XX, cond_jump_flag } }, @@ -1062,8 +1826,8 @@ static const struct dis386 dis386_twobyte[] = { { "btS", { Ev, Gv } }, { "shldS", { Ev, Gv, Ib } }, { "shldS", { Ev, Gv, CL } }, - { GRPPADLCK2 }, - { GRPPADLCK1 }, + { REG_TABLE (REG_0FA6) }, + { REG_TABLE (REG_0FA7) }, /* a8 */ { "pushT", { gs } }, { "popT", { gs } }, @@ -1071,35 +1835,35 @@ static const struct dis386 dis386_twobyte[] = { { "btsS", { Ev, Gv } }, { "shrdS", { Ev, Gv, Ib } }, { "shrdS", { Ev, Gv, CL } }, - { GRP15 }, + { REG_TABLE (REG_0FAE) }, { "imulS", { Gv, Ev } }, /* b0 */ { "cmpxchgB", { Eb, Gb } }, { "cmpxchgS", { Ev, Gv } }, - { "lssS", { Gv, Mp } }, + { MOD_TABLE (MOD_0FB2) }, { "btrS", { Ev, Gv } }, - { "lfsS", { Gv, Mp } }, - { "lgsS", { Gv, Mp } }, - { "movz{bR|x|bR|x}", { Gv, Eb } }, - { "movz{wR|x|wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */ + { MOD_TABLE (MOD_0FB4) }, + { MOD_TABLE (MOD_0FB5) }, + { "movz{bR|x}", { Gv, Eb } }, + { "movz{wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */ /* b8 */ - { PREGRP37 }, + { PREFIX_TABLE (PREFIX_0FB8) }, { "ud2b", { XX } }, - { GRP8 }, + { REG_TABLE (REG_0FBA) }, { "btcS", { Ev, Gv } }, { "bsfS", { Gv, Ev } }, - { PREGRP36 }, - { "movs{bR|x|bR|x}", { Gv, Eb } }, - { "movs{wR|x|wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */ + { PREFIX_TABLE (PREFIX_0FBD) }, + { "movs{bR|x}", { Gv, Eb } }, + { "movs{wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */ /* c0 */ { "xaddB", { Eb, Gb } }, { "xaddS", { Ev, Gv } }, - { PREGRP1 }, - { "movntiS", { Ev, Gv } }, + { PREFIX_TABLE (PREFIX_0FC2) }, + { PREFIX_TABLE (PREFIX_0FC3) }, { "pinsrw", { MX, Edqw, Ib } }, { "pextrw", { Gdq, MS, Ib } }, - { "shufpX", { XM, EX, Ib } }, - { GRP9 }, + { "shufpX", { XM, EXx, Ib } }, + { REG_TABLE (REG_0FC7) }, /* c8 */ { "bswap", { RMeAX } }, { "bswap", { RMeCX } }, @@ -1110,14 +1874,14 @@ static const struct dis386 dis386_twobyte[] = { { "bswap", { RMeSI } }, { "bswap", { RMeDI } }, /* d0 */ - { PREGRP27 }, + { PREFIX_TABLE (PREFIX_0FD0) }, { "psrlw", { MX, EM } }, { "psrld", { MX, EM } }, { "psrlq", { MX, EM } }, { "paddq", { MX, EM } }, { "pmullw", { MX, EM } }, - { PREGRP21 }, - { "pmovmskb", { Gdq, MS } }, + { PREFIX_TABLE (PREFIX_0FD6) }, + { MOD_TABLE (MOD_0FD7) }, /* d8 */ { "psubusb", { MX, EM } }, { "psubusw", { MX, EM } }, @@ -1134,8 +1898,8 @@ static const struct dis386 dis386_twobyte[] = { { "pavgw", { MX, EM } }, { "pmulhuw", { MX, EM } }, { "pmulhw", { MX, EM } }, - { PREGRP15 }, - { PREGRP25 }, + { PREFIX_TABLE (PREFIX_0FE6) }, + { PREFIX_TABLE (PREFIX_0FE7) }, /* e8 */ { "psubsb", { MX, EM } }, { "psubsw", { MX, EM } }, @@ -1146,14 +1910,14 @@ static const struct dis386 dis386_twobyte[] = { { "pmaxsw", { MX, EM } }, { "pxor", { MX, EM } }, /* f0 */ - { PREGRP32 }, + { PREFIX_TABLE (PREFIX_0FF0) }, { "psllw", { MX, EM } }, { "pslld", { MX, EM } }, { "psllq", { MX, EM } }, { "pmuludq", { MX, EM } }, { "pmaddwd", { MX, EM } }, { "psadbw", { MX, EM } }, - { PREGRP18 }, + { PREFIX_TABLE (PREFIX_0FF7) }, /* f8 */ { "psubb", { MX, EM } }, { "psubw", { MX, EM } }, @@ -1192,13 +1956,13 @@ static const unsigned char twobyte_has_modrm[256] = { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /* ------------------------------- */ /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */ - /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */ - /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */ + /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */ + /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */ /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */ /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */ /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */ /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */ - /* 70 */ 1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1, /* 7f */ + /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */ /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */ /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */ @@ -1211,234 +1975,44 @@ static const unsigned char twobyte_has_modrm[256] = { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ }; -static const unsigned char twobyte_uses_DATA_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ - /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */ - /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */ - /* 70 */ 1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -static const unsigned char twobyte_uses_REPNZ_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ - /* 10 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ - /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,1,0,0,0,0,0,0,1,1,1,0,1,1,1,1, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */ - /* 70 */ 1,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -static const unsigned char twobyte_uses_REPZ_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ - /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ - /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, /* 6f */ - /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, /* bf */ - /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -/* This is used to determine if opcode 0f 38 XX uses DATA prefix. */ -static const unsigned char threebyte_0x38_uses_DATA_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, /* 0f */ - /* 10 */ 0,0,0,0,1,1,0,1,0,0,0,0,1,1,1,0, /* 1f */ - /* 20 */ 1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0, /* 2f */ - /* 30 */ 1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1, /* 3f */ - /* 40 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */ - /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -/* This is used to determine if opcode 0f 38 XX uses REPNZ prefix. */ -static const unsigned char threebyte_0x38_uses_REPNZ_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ - /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ - /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */ - /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -/* This is used to determine if opcode 0f 38 XX uses REPZ prefix. */ -static const unsigned char threebyte_0x38_uses_REPZ_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ - /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ - /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */ - /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -/* This is used to determine if opcode 0f 3a XX uses DATA prefix. */ -static const unsigned char threebyte_0x3a_uses_DATA_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, /* 0f */ - /* 10 */ 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ - /* 40 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */ - /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -/* This is used to determine if opcode 0f 3a XX uses REPNZ prefix. */ -static const unsigned char threebyte_0x3a_uses_REPNZ_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ - /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ - /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */ - /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - -/* This is used to determine if opcode 0f 3a XX uses REPZ prefix. */ -static const unsigned char threebyte_0x3a_uses_REPZ_prefix[256] = { - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ - /* ------------------------------- */ - /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */ - /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */ - /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */ - /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */ - /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */ - /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */ - /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */ - /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */ - /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */ - /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */ - /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */ - /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */ - /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */ - /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */ - /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */ - /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */ - /* ------------------------------- */ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ -}; - static char obuf[100]; static char *obufp; +static char *mnemonicendp; static char scratchbuf[100]; static unsigned char *start_codep; static unsigned char *insn_codep; static unsigned char *codep; +static const char *lock_prefix; +static const char *data_prefix; +static const char *addr_prefix; +static const char *repz_prefix; +static const char *repnz_prefix; static disassemble_info *the_info; static struct { int mod; - int rm; int reg; + int rm; } modrm; static unsigned char need_modrm; +static struct + { + int register_specifier; + int length; + int prefix; + int w; + } +vex; +static unsigned char need_vex; +static unsigned char need_vex_reg; +static unsigned char vex_w_done; + +struct op + { + const char *name; + unsigned int len; + }; /* If we are accessing mod/rm/reg without need_modrm set, then the values are stale. Hitting this abort likely indicates that you @@ -1451,6 +2025,8 @@ static const char **names16; static const char **names8; static const char **names8rex; static const char **names_seg; +static const char *index64; +static const char *index32; static const char **index16; static const char *intel_names64[] = { @@ -1475,6 +2051,8 @@ static const char *intel_names8rex[] = { static const char *intel_names_seg[] = { "es", "cs", "ss", "ds", "fs", "gs", "?", "?", }; +static const char *intel_index64 = "riz"; +static const char *intel_index32 = "eiz"; static const char *intel_index16[] = { "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx" }; @@ -1501,23 +2079,14 @@ static const char *att_names8rex[] = { static const char *att_names_seg[] = { "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?", }; +static const char *att_index64 = "%riz"; +static const char *att_index32 = "%eiz"; static const char *att_index16[] = { "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx" }; -static const struct dis386 grps[][8] = { - /* GRP1a */ - { - { "popU", { stackEv } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - }, - /* GRP1b */ +static const struct dis386 reg_table[][8] = { + /* REG_80 */ { { "addA", { Eb, Ib } }, { "orA", { Eb, Ib } }, @@ -1528,7 +2097,7 @@ static const struct dis386 grps[][8] = { { "xorA", { Eb, Ib } }, { "cmpA", { Eb, Ib } }, }, - /* GRP1S */ + /* REG_81 */ { { "addQ", { Ev, Iv } }, { "orQ", { Ev, Iv } }, @@ -1539,7 +2108,7 @@ static const struct dis386 grps[][8] = { { "xorQ", { Ev, Iv } }, { "cmpQ", { Ev, Iv } }, }, - /* GRP1Ss */ + /* REG_82 */ { { "addQ", { Ev, sIb } }, { "orQ", { Ev, sIb } }, @@ -1550,7 +2119,18 @@ static const struct dis386 grps[][8] = { { "xorQ", { Ev, sIb } }, { "cmpQ", { Ev, sIb } }, }, - /* GRP2b */ + /* REG_8F */ + { + { "popU", { stackEv } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + /* REG_C0 */ { { "rolA", { Eb, Ib } }, { "rorA", { Eb, Ib } }, @@ -1561,7 +2141,7 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "sarA", { Eb, Ib } }, }, - /* GRP2S */ + /* REG_C1 */ { { "rolQ", { Ev, Ib } }, { "rorQ", { Ev, Ib } }, @@ -1572,7 +2152,29 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "sarQ", { Ev, Ib } }, }, - /* GRP2b_one */ + /* REG_C6 */ + { + { "movA", { Eb, Ib } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + /* REG_C7 */ + { + { "movQ", { Ev, Iv } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + /* REG_D0 */ { { "rolA", { Eb, I1 } }, { "rorA", { Eb, I1 } }, @@ -1583,7 +2185,7 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "sarA", { Eb, I1 } }, }, - /* GRP2S_one */ + /* REG_D1 */ { { "rolQ", { Ev, I1 } }, { "rorQ", { Ev, I1 } }, @@ -1594,7 +2196,7 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "sarQ", { Ev, I1 } }, }, - /* GRP2b_cl */ + /* REG_D2 */ { { "rolA", { Eb, CL } }, { "rorA", { Eb, CL } }, @@ -1605,7 +2207,7 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "sarA", { Eb, CL } }, }, - /* GRP2S_cl */ + /* REG_D3 */ { { "rolQ", { Ev, CL } }, { "rorQ", { Ev, CL } }, @@ -1616,10 +2218,10 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "sarQ", { Ev, CL } }, }, - /* GRP3b */ + /* REG_F6 */ { { "testA", { Eb, Ib } }, - { "(bad)", { Eb } }, + { "(bad)", { XX } }, { "notA", { Eb } }, { "negA", { Eb } }, { "mulA", { Eb } }, /* Don't print the implicit %al register, */ @@ -1627,7 +2229,7 @@ static const struct dis386 grps[][8] = { { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */ { "idivA", { Eb } }, /* and idiv for consistency. */ }, - /* GRP3S */ + /* REG_F7 */ { { "testQ", { Ev, Iv } }, { "(bad)", { XX } }, @@ -1638,7 +2240,7 @@ static const struct dis386 grps[][8] = { { "divQ", { Ev } }, { "idivQ", { Ev } }, }, - /* GRP4 */ + /* REG_FE */ { { "incA", { Eb } }, { "decA", { Eb } }, @@ -1649,7 +2251,7 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "(bad)", { XX } }, }, - /* GRP5 */ + /* REG_FF */ { { "incQ", { Ev } }, { "decQ", { Ev } }, @@ -1660,7 +2262,7 @@ static const struct dis386 grps[][8] = { { "pushU", { stackEv } }, { "(bad)", { XX } }, }, - /* GRP6 */ + /* REG_0F00 */ { { "sldtD", { Sv } }, { "strD", { Sv } }, @@ -1671,728 +2273,935 @@ static const struct dis386 grps[][8] = { { "(bad)", { XX } }, { "(bad)", { XX } }, }, - /* GRP7 */ + /* REG_0F01 */ { - { "sgdt{Q|IQ||}", { { VMX_Fixup, 0 } } }, - { "sidt{Q|IQ||}", { { PNI_Fixup, 0 } } }, - { "lgdt{Q|Q||}", { M } }, - { "lidt{Q|Q||}", { { SVME_Fixup, 0 } } }, + { MOD_TABLE (MOD_0F01_REG_0) }, + { MOD_TABLE (MOD_0F01_REG_1) }, + { MOD_TABLE (MOD_0F01_REG_2) }, + { MOD_TABLE (MOD_0F01_REG_3) }, { "smswD", { Sv } }, { "(bad)", { XX } }, { "lmsw", { Ew } }, - { "invlpg", { { INVLPG_Fixup, w_mode } } }, + { MOD_TABLE (MOD_0F01_REG_7) }, + }, + /* REG_0F0D */ + { + { "prefetch", { Eb } }, + { "prefetchw", { Eb } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, }, - /* GRP8 */ + /* REG_0F18 */ { + { MOD_TABLE (MOD_0F18_REG_0) }, + { MOD_TABLE (MOD_0F18_REG_1) }, + { MOD_TABLE (MOD_0F18_REG_2) }, + { MOD_TABLE (MOD_0F18_REG_3) }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, - { "btQ", { Ev, Ib } }, - { "btsQ", { Ev, Ib } }, - { "btrQ", { Ev, Ib } }, - { "btcQ", { Ev, Ib } }, }, - /* GRP9 */ + /* REG_0F71 */ { { "(bad)", { XX } }, - { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } }, { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F71_REG_2) }, { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F71_REG_4) }, { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F71_REG_6) }, { "(bad)", { XX } }, - { "", { VM } }, /* See OP_VMX. */ - { "vmptrst", { Mq } }, }, - /* GRP11_C6 */ + /* REG_0F72 */ { - { "movA", { Eb, Ib } }, { "(bad)", { XX } }, { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F72_REG_2) }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F72_REG_4) }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F72_REG_6) }, { "(bad)", { XX } }, + }, + /* REG_0F73 */ + { { "(bad)", { XX } }, { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F73_REG_2) }, + { MOD_TABLE (MOD_0F73_REG_3) }, { "(bad)", { XX } }, { "(bad)", { XX } }, + { MOD_TABLE (MOD_0F73_REG_6) }, + { MOD_TABLE (MOD_0F73_REG_7) }, }, - /* GRP11_C7 */ + /* REG_0FA6 */ { - { "movQ", { Ev, Iv } }, + { "montmul", { { OP_0f07, 0 } } }, + { "xsha1", { { OP_0f07, 0 } } }, + { "xsha256", { { OP_0f07, 0 } } }, + { "(bad)", { { OP_0f07, 0 } } }, + { "(bad)", { { OP_0f07, 0 } } }, + { "(bad)", { { OP_0f07, 0 } } }, + { "(bad)", { { OP_0f07, 0 } } }, + { "(bad)", { { OP_0f07, 0 } } }, + }, + /* REG_0FA7 */ + { + { "xstore-rng", { { OP_0f07, 0 } } }, + { "xcrypt-ecb", { { OP_0f07, 0 } } }, + { "xcrypt-cbc", { { OP_0f07, 0 } } }, + { "xcrypt-ctr", { { OP_0f07, 0 } } }, + { "xcrypt-cfb", { { OP_0f07, 0 } } }, + { "xcrypt-ofb", { { OP_0f07, 0 } } }, + { "(bad)", { { OP_0f07, 0 } } }, + { "(bad)", { { OP_0f07, 0 } } }, + }, + /* REG_0FAE */ + { + { MOD_TABLE (MOD_0FAE_REG_0) }, + { MOD_TABLE (MOD_0FAE_REG_1) }, + { MOD_TABLE (MOD_0FAE_REG_2) }, + { MOD_TABLE (MOD_0FAE_REG_3) }, + { MOD_TABLE (MOD_0FAE_REG_4) }, + { MOD_TABLE (MOD_0FAE_REG_5) }, + { MOD_TABLE (MOD_0FAE_REG_6) }, + { MOD_TABLE (MOD_0FAE_REG_7) }, + }, + /* REG_0FBA */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, { "(bad)", { XX } }, + { "btQ", { Ev, Ib } }, + { "btsQ", { Ev, Ib } }, + { "btrQ", { Ev, Ib } }, + { "btcQ", { Ev, Ib } }, + }, + /* REG_0FC7 */ + { { "(bad)", { XX } }, + { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, { "(bad)", { XX } }, - { "(bad)", { XX } }, + { MOD_TABLE (MOD_0FC7_REG_6) }, + { MOD_TABLE (MOD_0FC7_REG_7) }, }, - /* GRP12 */ + /* REG_VEX_71 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "psrlw", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_71_REG_2) }, { "(bad)", { XX } }, - { "psraw", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_71_REG_4) }, { "(bad)", { XX } }, - { "psllw", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_71_REG_6) }, { "(bad)", { XX } }, }, - /* GRP13 */ + /* REG_VEX_72 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "psrld", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_72_REG_2) }, { "(bad)", { XX } }, - { "psrad", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_72_REG_4) }, { "(bad)", { XX } }, - { "pslld", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_72_REG_6) }, { "(bad)", { XX } }, }, - /* GRP14 */ + /* REG_VEX_73 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "psrlq", { MS, Ib } }, - { "psrldq", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_73_REG_2) }, + { MOD_TABLE (MOD_VEX_73_REG_3) }, { "(bad)", { XX } }, { "(bad)", { XX } }, - { "psllq", { MS, Ib } }, - { "pslldq", { MS, Ib } }, + { MOD_TABLE (MOD_VEX_73_REG_6) }, + { MOD_TABLE (MOD_VEX_73_REG_7) }, }, - /* GRP15 */ + /* REG_VEX_AE */ { - { "fxsave", { Ev } }, - { "fxrstor", { Ev } }, - { "ldmxcsr", { Ev } }, - { "stmxcsr", { Ev } }, - { "(bad)", { XX } }, - { "lfence", { { OP_0fae, 0 } } }, - { "mfence", { { OP_0fae, 0 } } }, - { "clflush", { { OP_0fae, 0 } } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_AE_REG_2) }, + { MOD_TABLE (MOD_VEX_AE_REG_3) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, }, - /* GRP16 */ +}; + +static const struct dis386 prefix_table[][4] = { + /* PREFIX_90 */ { - { "prefetchnta", { Ev } }, - { "prefetcht0", { Ev } }, - { "prefetcht1", { Ev } }, - { "prefetcht2", { Ev } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } }, + { "pause", { XX } }, + { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } }, + { "(bad)", { XX } }, }, - /* GRPAMD */ + + /* PREFIX_0F10 */ { - { "prefetch", { Eb } }, - { "prefetchw", { Eb } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "movups", { XM, EXx } }, + { "movss", { XM, EXd } }, + { "movupd", { XM, EXx } }, + { "movsd", { XM, EXq } }, }, - /* GRPPADLCK1 */ + + /* PREFIX_0F11 */ { - { "xstore-rng", { { OP_0f07, 0 } } }, - { "xcrypt-ecb", { { OP_0f07, 0 } } }, - { "xcrypt-cbc", { { OP_0f07, 0 } } }, - { "xcrypt-ctr", { { OP_0f07, 0 } } }, - { "xcrypt-cfb", { { OP_0f07, 0 } } }, - { "xcrypt-ofb", { { OP_0f07, 0 } } }, - { "(bad)", { { OP_0f07, 0 } } }, - { "(bad)", { { OP_0f07, 0 } } }, + { "movups", { EXxS, XM } }, + { "movss", { EXdS, XM } }, + { "movupd", { EXxS, XM } }, + { "movsd", { EXqS, XM } }, }, - /* GRPPADLCK2 */ + + /* PREFIX_0F12 */ { - { "montmul", { { OP_0f07, 0 } } }, - { "xsha1", { { OP_0f07, 0 } } }, - { "xsha256", { { OP_0f07, 0 } } }, - { "(bad)", { { OP_0f07, 0 } } }, - { "(bad)", { { OP_0f07, 0 } } }, - { "(bad)", { { OP_0f07, 0 } } }, - { "(bad)", { { OP_0f07, 0 } } }, - { "(bad)", { { OP_0f07, 0 } } }, - } -}; + { MOD_TABLE (MOD_0F12_PREFIX_0) }, + { "movsldup", { XM, EXx } }, + { "movlpd", { XM, EXq } }, + { "movddup", { XM, EXq } }, + }, + + /* PREFIX_0F16 */ + { + { MOD_TABLE (MOD_0F16_PREFIX_0) }, + { "movshdup", { XM, EXx } }, + { "movhpd", { XM, EXq } }, + { "(bad)", { XX } }, + }, -static const struct dis386 prefix_user_table[][4] = { - /* PREGRP0 */ + /* PREFIX_0F2A */ { - { "addps", { XM, EX } }, - { "addss", { XM, EX } }, - { "addpd", { XM, EX } }, - { "addsd", { XM, EX } }, + { "cvtpi2ps", { XM, EMCq } }, + { "cvtsi2ss%LQ", { XM, Ev } }, + { "cvtpi2pd", { XM, EMCq } }, + { "cvtsi2sd%LQ", { XM, Ev } }, }, - /* PREGRP1 */ + + /* PREFIX_0F2B */ { - { "", { XM, EX, OPSIMD } }, /* See OP_SIMD_SUFFIX. */ - { "", { XM, EX, OPSIMD } }, - { "", { XM, EX, OPSIMD } }, - { "", { XM, EX, OPSIMD } }, + { MOD_TABLE (MOD_0F2B_PREFIX_0) }, + { MOD_TABLE (MOD_0F2B_PREFIX_1) }, + { MOD_TABLE (MOD_0F2B_PREFIX_2) }, + { MOD_TABLE (MOD_0F2B_PREFIX_3) }, }, - /* PREGRP2 */ + + /* PREFIX_0F2C */ { - { "cvtpi2ps", { XM, EMC } }, - { "cvtsi2ssY", { XM, Ev } }, - { "cvtpi2pd", { XM, EMC } }, - { "cvtsi2sdY", { XM, Ev } }, + { "cvttps2pi", { MXC, EXq } }, + { "cvttss2siY", { Gv, EXd } }, + { "cvttpd2pi", { MXC, EXx } }, + { "cvttsd2siY", { Gv, EXq } }, }, - /* PREGRP3 */ + + /* PREFIX_0F2D */ { - { "cvtps2pi", { MXC, EX } }, - { "cvtss2siY", { Gv, EX } }, - { "cvtpd2pi", { MXC, EX } }, - { "cvtsd2siY", { Gv, EX } }, + { "cvtps2pi", { MXC, EXq } }, + { "cvtss2siY", { Gv, EXd } }, + { "cvtpd2pi", { MXC, EXx } }, + { "cvtsd2siY", { Gv, EXq } }, }, - /* PREGRP4 */ + + /* PREFIX_0F2E */ { - { "cvttps2pi", { MXC, EX } }, - { "cvttss2siY", { Gv, EX } }, - { "cvttpd2pi", { MXC, EX } }, - { "cvttsd2siY", { Gv, EX } }, + { "ucomiss",{ XM, EXd } }, + { "(bad)", { XX } }, + { "ucomisd",{ XM, EXq } }, + { "(bad)", { XX } }, }, - /* PREGRP5 */ + + /* PREFIX_0F2F */ { - { "divps", { XM, EX } }, - { "divss", { XM, EX } }, - { "divpd", { XM, EX } }, - { "divsd", { XM, EX } }, + { "comiss", { XM, EXd } }, + { "(bad)", { XX } }, + { "comisd", { XM, EXq } }, + { "(bad)", { XX } }, }, - /* PREGRP6 */ + + /* PREFIX_0F51 */ { - { "maxps", { XM, EX } }, - { "maxss", { XM, EX } }, - { "maxpd", { XM, EX } }, - { "maxsd", { XM, EX } }, + { "sqrtps", { XM, EXx } }, + { "sqrtss", { XM, EXd } }, + { "sqrtpd", { XM, EXx } }, + { "sqrtsd", { XM, EXq } }, }, - /* PREGRP7 */ + + /* PREFIX_0F52 */ { - { "minps", { XM, EX } }, - { "minss", { XM, EX } }, - { "minpd", { XM, EX } }, - { "minsd", { XM, EX } }, + { "rsqrtps",{ XM, EXx } }, + { "rsqrtss",{ XM, EXd } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, }, - /* PREGRP8 */ + + /* PREFIX_0F53 */ { - { "movups", { XM, EX } }, - { "movss", { XM, EX } }, - { "movupd", { XM, EX } }, - { "movsd", { XM, EX } }, + { "rcpps", { XM, EXx } }, + { "rcpss", { XM, EXd } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, }, - /* PREGRP9 */ + + /* PREFIX_0F58 */ { - { "movups", { EX, XM } }, - { "movss", { EX, XM } }, - { "movupd", { EX, XM } }, - { "movsd", { EX, XM } }, + { "addps", { XM, EXx } }, + { "addss", { XM, EXd } }, + { "addpd", { XM, EXx } }, + { "addsd", { XM, EXq } }, }, - /* PREGRP10 */ + + /* PREFIX_0F59 */ { - { "mulps", { XM, EX } }, - { "mulss", { XM, EX } }, - { "mulpd", { XM, EX } }, - { "mulsd", { XM, EX } }, + { "mulps", { XM, EXx } }, + { "mulss", { XM, EXd } }, + { "mulpd", { XM, EXx } }, + { "mulsd", { XM, EXq } }, }, - /* PREGRP11 */ + + /* PREFIX_0F5A */ { - { "rcpps", { XM, EX } }, - { "rcpss", { XM, EX } }, - { "(bad)", { XM, EX } }, - { "(bad)", { XM, EX } }, + { "cvtps2pd", { XM, EXq } }, + { "cvtss2sd", { XM, EXd } }, + { "cvtpd2ps", { XM, EXx } }, + { "cvtsd2ss", { XM, EXq } }, }, - /* PREGRP12 */ + + /* PREFIX_0F5B */ { - { "rsqrtps",{ XM, EX } }, - { "rsqrtss",{ XM, EX } }, - { "(bad)", { XM, EX } }, - { "(bad)", { XM, EX } }, + { "cvtdq2ps", { XM, EXx } }, + { "cvttps2dq", { XM, EXx } }, + { "cvtps2dq", { XM, EXx } }, + { "(bad)", { XX } }, }, - /* PREGRP13 */ + + /* PREFIX_0F5C */ { - { "sqrtps", { XM, EX } }, - { "sqrtss", { XM, EX } }, - { "sqrtpd", { XM, EX } }, - { "sqrtsd", { XM, EX } }, + { "subps", { XM, EXx } }, + { "subss", { XM, EXd } }, + { "subpd", { XM, EXx } }, + { "subsd", { XM, EXq } }, }, - /* PREGRP14 */ + + /* PREFIX_0F5D */ { - { "subps", { XM, EX } }, - { "subss", { XM, EX } }, - { "subpd", { XM, EX } }, - { "subsd", { XM, EX } }, + { "minps", { XM, EXx } }, + { "minss", { XM, EXd } }, + { "minpd", { XM, EXx } }, + { "minsd", { XM, EXq } }, }, - /* PREGRP15 */ + + /* PREFIX_0F5E */ { - { "(bad)", { XM, EX } }, - { "cvtdq2pd", { XM, EX } }, - { "cvttpd2dq", { XM, EX } }, - { "cvtpd2dq", { XM, EX } }, + { "divps", { XM, EXx } }, + { "divss", { XM, EXd } }, + { "divpd", { XM, EXx } }, + { "divsd", { XM, EXq } }, }, - /* PREGRP16 */ + + /* PREFIX_0F5F */ { - { "cvtdq2ps", { XM, EX } }, - { "cvttps2dq", { XM, EX } }, - { "cvtps2dq", { XM, EX } }, - { "(bad)", { XM, EX } }, + { "maxps", { XM, EXx } }, + { "maxss", { XM, EXd } }, + { "maxpd", { XM, EXx } }, + { "maxsd", { XM, EXq } }, }, - /* PREGRP17 */ + + /* PREFIX_0F60 */ { - { "cvtps2pd", { XM, EX } }, - { "cvtss2sd", { XM, EX } }, - { "cvtpd2ps", { XM, EX } }, - { "cvtsd2ss", { XM, EX } }, + { "punpcklbw",{ MX, EMd } }, + { "(bad)", { XX } }, + { "punpcklbw",{ MX, EMx } }, + { "(bad)", { XX } }, }, - /* PREGRP18 */ + + /* PREFIX_0F61 */ { - { "maskmovq", { MX, MS } }, - { "(bad)", { XM, EX } }, - { "maskmovdqu", { XM, XS } }, - { "(bad)", { XM, EX } }, + { "punpcklwd",{ MX, EMd } }, + { "(bad)", { XX } }, + { "punpcklwd",{ MX, EMx } }, + { "(bad)", { XX } }, }, - /* PREGRP19 */ + + /* PREFIX_0F62 */ { - { "movq", { MX, EM } }, - { "movdqu", { XM, EX } }, - { "movdqa", { XM, EX } }, - { "(bad)", { XM, EX } }, + { "punpckldq",{ MX, EMd } }, + { "(bad)", { XX } }, + { "punpckldq",{ MX, EMx } }, + { "(bad)", { XX } }, }, - /* PREGRP20 */ + + /* PREFIX_0F6C */ { - { "movq", { EM, MX } }, - { "movdqu", { EX, XM } }, - { "movdqa", { EX, XM } }, - { "(bad)", { EX, XM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "punpcklqdq", { XM, EXx } }, + { "(bad)", { XX } }, }, - /* PREGRP21 */ + + /* PREFIX_0F6D */ { - { "(bad)", { EX, XM } }, - { "movq2dq",{ XM, MS } }, - { "movq", { EX, XM } }, - { "movdq2q",{ MX, XS } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "punpckhqdq", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F6F */ + { + { "movq", { MX, EM } }, + { "movdqu", { XM, EXx } }, + { "movdqa", { XM, EXx } }, + { "(bad)", { XX } }, }, - /* PREGRP22 */ + + /* PREFIX_0F70 */ { { "pshufw", { MX, EM, Ib } }, - { "pshufhw",{ XM, EX, Ib } }, - { "pshufd", { XM, EX, Ib } }, - { "pshuflw",{ XM, EX, Ib } }, + { "pshufhw",{ XM, EXx, Ib } }, + { "pshufd", { XM, EXx, Ib } }, + { "pshuflw",{ XM, EXx, Ib } }, }, - /* PREGRP23 */ + + /* PREFIX_0F73_REG_3 */ { - { "movd", { Edq, MX } }, - { "movq", { XM, EX } }, - { "movd", { Edq, XM } }, - { "(bad)", { Ed, XM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "psrldq", { XS, Ib } }, + { "(bad)", { XX } }, }, - /* PREGRP24 */ + + /* PREFIX_0F73_REG_7 */ { - { "(bad)", { MX, EX } }, - { "(bad)", { XM, EX } }, - { "punpckhqdq", { XM, EX } }, - { "(bad)", { XM, EX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pslldq", { XS, Ib } }, + { "(bad)", { XX } }, }, - /* PREGRP25 */ + + /* PREFIX_0F78 */ { - { "movntq", { EM, MX } }, - { "(bad)", { EM, XM } }, - { "movntdq",{ EM, XM } }, - { "(bad)", { EM, XM } }, + {"vmread", { Em, Gm } }, + {"(bad)", { XX } }, + {"extrq", { XS, Ib, Ib } }, + {"insertq", { XM, XS, Ib, Ib } }, }, - /* PREGRP26 */ + + /* PREFIX_0F79 */ { - { "(bad)", { MX, EX } }, - { "(bad)", { XM, EX } }, - { "punpcklqdq", { XM, EX } }, - { "(bad)", { XM, EX } }, + {"vmwrite", { Gm, Em } }, + {"(bad)", { XX } }, + {"extrq", { XM, XS } }, + {"insertq", { XM, XS } }, }, - /* PREGRP27 */ + + /* PREFIX_0F7C */ { - { "(bad)", { MX, EX } }, - { "(bad)", { XM, EX } }, - { "addsubpd", { XM, EX } }, - { "addsubps", { XM, EX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "haddpd", { XM, EXx } }, + { "haddps", { XM, EXx } }, }, - /* PREGRP28 */ + + /* PREFIX_0F7D */ { - { "(bad)", { MX, EX } }, - { "(bad)", { XM, EX } }, - { "haddpd", { XM, EX } }, - { "haddps", { XM, EX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "hsubpd", { XM, EXx } }, + { "hsubps", { XM, EXx } }, }, - /* PREGRP29 */ + + /* PREFIX_0F7E */ { - { "(bad)", { MX, EX } }, - { "(bad)", { XM, EX } }, - { "hsubpd", { XM, EX } }, - { "hsubps", { XM, EX } }, + { "movK", { Edq, MX } }, + { "movq", { XM, EXq } }, + { "movK", { Edq, XM } }, + { "(bad)", { XX } }, }, - /* PREGRP30 */ + + /* PREFIX_0F7F */ { - { "movlpX", { XM, EX, { SIMD_Fixup, 'h' } } }, /* really only 2 operands */ - { "movsldup", { XM, EX } }, - { "movlpd", { XM, EX } }, - { "movddup", { XM, EX } }, + { "movq", { EMS, MX } }, + { "movdqu", { EXxS, XM } }, + { "movdqa", { EXxS, XM } }, + { "(bad)", { XX } }, }, - /* PREGRP31 */ + + /* PREFIX_0FB8 */ { - { "movhpX", { XM, EX, { SIMD_Fixup, 'l' } } }, - { "movshdup", { XM, EX } }, - { "movhpd", { XM, EX } }, - { "(bad)", { XM, EX } }, + { "(bad)", { XX } }, + { "popcntS", { Gv, Ev } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, }, - /* PREGRP32 */ + + /* PREFIX_0FBD */ { - { "(bad)", { XM, EX } }, - { "(bad)", { XM, EX } }, - { "(bad)", { XM, EX } }, - { "lddqu", { XM, M } }, + { "bsrS", { Gv, Ev } }, + { "lzcntS", { Gv, Ev } }, + { "bsrS", { Gv, Ev } }, + { "(bad)", { XX } }, }, - /* PREGRP33 */ + + /* PREFIX_0FC2 */ { - {"movntps", { Ev, XM } }, - {"movntss", { Ev, XM } }, - {"movntpd", { Ev, XM } }, - {"movntsd", { Ev, XM } }, + { "cmpps", { XM, EXx, CMP } }, + { "cmpss", { XM, EXd, CMP } }, + { "cmppd", { XM, EXx, CMP } }, + { "cmpsd", { XM, EXq, CMP } }, }, - /* PREGRP34 */ + /* PREFIX_0FC3 */ { - {"vmread", { Em, Gm } }, - {"(bad)", { XX } }, - {"extrq", { XS, Ib, Ib } }, - {"insertq", { XM, XS, Ib, Ib } }, + { "movntiS", { Ma, Gv } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, }, - /* PREGRP35 */ + /* PREFIX_0FC7_REG_6 */ { - {"vmwrite", { Gm, Em } }, - {"(bad)", { XX } }, - {"extrq", { XM, XS } }, - {"insertq", { XM, XS } }, + { "vmptrld",{ Mq } }, + { "vmxon", { Mq } }, + { "vmclear",{ Mq } }, + { "(bad)", { XX } }, }, - /* PREGRP36 */ + /* PREFIX_0FD0 */ { - { "bsrS", { Gv, Ev } }, - { "lzcntS", { Gv, Ev } }, - { "bsrS", { Gv, Ev } }, { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "addsubpd", { XM, EXx } }, + { "addsubps", { XM, EXx } }, }, - /* PREGRP37 */ + /* PREFIX_0FD6 */ { - { "(bad)", { XX } }, - { "popcntS", { Gv, Ev } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "movq2dq",{ XM, MS } }, + { "movq", { EXqS, XM } }, + { "movdq2q",{ MX, XS } }, }, - /* PREGRP38 */ + /* PREFIX_0FE6 */ { - { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } }, - { "pause", { XX } }, - { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "cvtdq2pd", { XM, EXq } }, + { "cvttpd2dq", { XM, EXx } }, + { "cvtpd2dq", { XM, EXx } }, + }, + + /* PREFIX_0FE7 */ + { + { "movntq", { Mq, MX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_0FE7_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0FF0 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_0FF0_PREFIX_3) }, + }, + + /* PREFIX_0FF7 */ + { + { "maskmovq", { MX, MS } }, + { "(bad)", { XX } }, + { "maskmovdqu", { XM, XS } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3810 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pblendvb", { XM, EXx, XMM0 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3814 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "blendvps", { XM, EXx, XMM0 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3815 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "blendvpd", { XM, EXx, XMM0 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3817 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "ptest", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3820 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pmovsxbw", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3821 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pmovsxbd", { XM, EXd } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3822 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pmovsxbq", { XM, EXw } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F3823 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pmovsxwd", { XM, EXq } }, + { "(bad)", { XX } }, }, - /* PREGRP39 */ + /* PREFIX_0F3824 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pblendvb", {XM, EX, XMM0 } }, + { "pmovsxwq", { XM, EXd } }, { "(bad)", { XX } }, }, - /* PREGRP40 */ + /* PREFIX_0F3825 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "blendvps", {XM, EX, XMM0 } }, + { "pmovsxdq", { XM, EXq } }, { "(bad)", { XX } }, }, - /* PREGRP41 */ + /* PREFIX_0F3828 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "blendvpd", { XM, EX, XMM0 } }, + { "pmuldq", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP42 */ + /* PREFIX_0F3829 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "ptest", { XM, EX } }, + { "pcmpeqq", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP43 */ + /* PREFIX_0F382A */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovsxbw", { XM, EX } }, + { MOD_TABLE (MOD_0F382A_PREFIX_2) }, { "(bad)", { XX } }, }, - /* PREGRP44 */ + /* PREFIX_0F382B */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovsxbd", { XM, EX } }, + { "packusdw", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP45 */ + /* PREFIX_0F3830 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovsxbq", { XM, EX } }, + { "pmovzxbw", { XM, EXq } }, { "(bad)", { XX } }, }, - /* PREGRP46 */ + /* PREFIX_0F3831 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovsxwd", { XM, EX } }, + { "pmovzxbd", { XM, EXd } }, { "(bad)", { XX } }, }, - /* PREGRP47 */ + /* PREFIX_0F3832 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovsxwq", { XM, EX } }, + { "pmovzxbq", { XM, EXw } }, { "(bad)", { XX } }, }, - /* PREGRP48 */ + /* PREFIX_0F3833 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovsxdq", { XM, EX } }, + { "pmovzxwd", { XM, EXq } }, { "(bad)", { XX } }, }, - /* PREGRP49 */ + /* PREFIX_0F3834 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmuldq", { XM, EX } }, + { "pmovzxwq", { XM, EXd } }, { "(bad)", { XX } }, }, - /* PREGRP50 */ + /* PREFIX_0F3835 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pcmpeqq", { XM, EX } }, + { "pmovzxdq", { XM, EXq } }, { "(bad)", { XX } }, }, - /* PREGRP51 */ + /* PREFIX_0F3837 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "movntdqa", { XM, EM } }, + { "pcmpgtq", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP52 */ + /* PREFIX_0F3838 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "packusdw", { XM, EX } }, + { "pminsb", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP53 */ + /* PREFIX_0F3839 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovzxbw", { XM, EX } }, + { "pminsd", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP54 */ + /* PREFIX_0F383A */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovzxbd", { XM, EX } }, + { "pminuw", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP55 */ + /* PREFIX_0F383B */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovzxbq", { XM, EX } }, + { "pminud", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP56 */ + /* PREFIX_0F383C */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovzxwd", { XM, EX } }, + { "pmaxsb", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP57 */ + /* PREFIX_0F383D */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovzxwq", { XM, EX } }, + { "pmaxsd", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP58 */ + /* PREFIX_0F383E */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmovzxdq", { XM, EX } }, + { "pmaxuw", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP59 */ + /* PREFIX_0F383F */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pminsb", { XM, EX } }, + { "pmaxud", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP60 */ + /* PREFIX_0F3840 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pminsd", { XM, EX } }, + { "pmulld", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP61 */ + /* PREFIX_0F3841 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pminuw", { XM, EX } }, + { "phminposuw", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP62 */ + /* PREFIX_0F3880 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pminud", { XM, EX } }, + { "invept", { Gm, Mo } }, { "(bad)", { XX } }, }, - /* PREGRP63 */ + /* PREFIX_0F3881 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmaxsb", { XM, EX } }, + { "invvpid", { Gm, Mo } }, { "(bad)", { XX } }, }, - /* PREGRP64 */ + /* PREFIX_0F38DB */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmaxsd", { XM, EX } }, + { "aesimc", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP65 */ + /* PREFIX_0F38DC */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmaxuw", { XM, EX } }, + { "aesenc", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP66 */ + /* PREFIX_0F38DD */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmaxud", { XM, EX } }, + { "aesenclast", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP67 */ + /* PREFIX_0F38DE */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pmulld", { XM, EX } }, + { "aesdec", { XM, EXx } }, { "(bad)", { XX } }, }, - /* PREGRP68 */ + /* PREFIX_0F38DF */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "phminposuw", { XM, EX } }, + { "aesdeclast", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_0F38F0 */ + { + { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } }, + { "(bad)", { XX } }, + { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } }, + { "crc32", { Gdq, { CRC32_Fixup, b_mode } } }, + }, + + /* PREFIX_0F38F1 */ + { + { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } }, { "(bad)", { XX } }, + { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } }, + { "crc32", { Gdq, { CRC32_Fixup, v_mode } } }, }, - /* PREGRP69 */ + /* PREFIX_0F3A08 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "roundps", { XM, EX, Ib } }, + { "roundps", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP70 */ + /* PREFIX_0F3A09 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "roundpd", { XM, EX, Ib } }, + { "roundpd", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP71 */ + /* PREFIX_0F3A0A */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "roundss", { XM, EX, Ib } }, + { "roundss", { XM, EXd, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP72 */ + /* PREFIX_0F3A0B */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "roundsd", { XM, EX, Ib } }, + { "roundsd", { XM, EXq, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP73 */ + /* PREFIX_0F3A0C */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "blendps", { XM, EX, Ib } }, + { "blendps", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP74 */ + /* PREFIX_0F3A0D */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "blendpd", { XM, EX, Ib } }, + { "blendpd", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP75 */ + /* PREFIX_0F3A0E */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "pblendw", { XM, EX, Ib } }, + { "pblendw", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP76 */ + /* PREFIX_0F3A14 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, @@ -2400,7 +3209,7 @@ static const struct dis386 prefix_user_table[][4] = { { "(bad)", { XX } }, }, - /* PREGRP77 */ + /* PREFIX_0F3A15 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, @@ -2408,7 +3217,7 @@ static const struct dis386 prefix_user_table[][4] = { { "(bad)", { XX } }, }, - /* PREGRP78 */ + /* PREFIX_0F3A16 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, @@ -2416,7 +3225,7 @@ static const struct dis386 prefix_user_table[][4] = { { "(bad)", { XX } }, }, - /* PREGRP79 */ + /* PREFIX_0F3A17 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, @@ -2424,7 +3233,7 @@ static const struct dis386 prefix_user_table[][4] = { { "(bad)", { XX } }, }, - /* PREGRP80 */ + /* PREFIX_0F3A20 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, @@ -2432,15 +3241,15 @@ static const struct dis386 prefix_user_table[][4] = { { "(bad)", { XX } }, }, - /* PREGRP81 */ + /* PREFIX_0F3A21 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "insertps", { XM, EX, Ib } }, + { "insertps", { XM, EXd, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP82 */ + /* PREFIX_0F3A22 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, @@ -2448,633 +3257,5698 @@ static const struct dis386 prefix_user_table[][4] = { { "(bad)", { XX } }, }, - /* PREGRP83 */ + /* PREFIX_0F3A40 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "dpps", { XM, EX, Ib } }, + { "dpps", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP84 */ + /* PREFIX_0F3A41 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "dppd", { XM, EX, Ib } }, + { "dppd", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, - /* PREGRP85 */ + /* PREFIX_0F3A42 */ { { "(bad)", { XX } }, { "(bad)", { XX } }, - { "mpsadbw", { XM, EX, Ib } }, + { "mpsadbw", { XM, EXx, Ib } }, { "(bad)", { XX } }, }, -}; -static const struct dis386 x86_64_table[][2] = { + /* PREFIX_0F3A44 */ { - { "pusha{P|}", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pclmulqdq", { XM, EXx, PCLMUL } }, + { "(bad)", { XX } }, }, + + /* PREFIX_0F3A60 */ { - { "popa{P|}", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pcmpestrm", { XM, EXx, Ib } }, + { "(bad)", { XX } }, }, + + /* PREFIX_0F3A61 */ { - { "bound{S|}", { Gv, Ma } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pcmpestri", { XM, EXx, Ib } }, + { "(bad)", { XX } }, }, + + /* PREFIX_0F3A62 */ { - { "arpl", { Ew, Gw } }, - { "movs{||lq|xd}", { Gv, Ed } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pcmpistrm", { XM, EXx, Ib } }, + { "(bad)", { XX } }, }, -}; -static const struct dis386 three_byte_table[][256] = { - /* THREE_BYTE_0 */ + /* PREFIX_0F3A63 */ { - /* 00 */ - { "pshufb", { MX, EM } }, - { "phaddw", { MX, EM } }, - { "phaddd", { MX, EM } }, - { "phaddsw", { MX, EM } }, - { "pmaddubsw", { MX, EM } }, - { "phsubw", { MX, EM } }, - { "phsubd", { MX, EM } }, - { "phsubsw", { MX, EM } }, - /* 08 */ - { "psignb", { MX, EM } }, - { "psignw", { MX, EM } }, - { "psignd", { MX, EM } }, - { "pmulhrsw", { MX, EM } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 10 */ - { PREGRP39 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { PREGRP40 }, - { PREGRP41 }, - { "(bad)", { XX } }, - { PREGRP42 }, - /* 18 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "pabsb", { MX, EM } }, - { "pabsw", { MX, EM } }, - { "pabsd", { MX, EM } }, - { "(bad)", { XX } }, - /* 20 */ - { PREGRP43 }, - { PREGRP44 }, - { PREGRP45 }, - { PREGRP46 }, - { PREGRP47 }, - { PREGRP48 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 28 */ - { PREGRP49 }, - { PREGRP50 }, - { PREGRP51 }, - { PREGRP52 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 30 */ - { PREGRP53 }, - { PREGRP54 }, - { PREGRP55 }, - { PREGRP56 }, - { PREGRP57 }, - { PREGRP58 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 38 */ - { PREGRP59 }, - { PREGRP60 }, - { PREGRP61 }, - { PREGRP62 }, - { PREGRP63 }, - { PREGRP64 }, - { PREGRP65 }, - { PREGRP66 }, - /* 40 */ - { PREGRP67 }, - { PREGRP68 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 48 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 50 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 58 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 60 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 68 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 70 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 78 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 80 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 88 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 90 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 98 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* a0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* a8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* b0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* b8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* c0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* c8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* d0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* d8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* e0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* e8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* f0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* f8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pcmpistri", { XM, EXx, Ib } }, + { "(bad)", { XX } }, }, - /* THREE_BYTE_1 */ + + /* PREFIX_0F3ADF */ { - /* 00 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 08 */ - { PREGRP69 }, - { PREGRP70 }, - { PREGRP71 }, - { PREGRP72 }, - { PREGRP73 }, - { PREGRP74 }, - { PREGRP75 }, - { "palignr", { MX, EM, Ib } }, - /* 10 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { PREGRP76 }, - { PREGRP77 }, - { PREGRP78 }, - { PREGRP79 }, - /* 18 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 20 */ - { PREGRP80 }, - { PREGRP81 }, - { PREGRP82 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* 28 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "aeskeygenassist", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_10 */ + { + { "vmovups", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_10_P_1) }, + { "vmovupd", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_10_P_3) }, + }, + + /* PREFIX_VEX_11 */ + { + { "vmovups", { EXxS, XM } }, + { VEX_LEN_TABLE (VEX_LEN_11_P_1) }, + { "vmovupd", { EXxS, XM } }, + { VEX_LEN_TABLE (VEX_LEN_11_P_3) }, + }, + + /* PREFIX_VEX_12 */ + { + { MOD_TABLE (MOD_VEX_12_PREFIX_0) }, + { "vmovsldup", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_12_P_2) }, + { "vmovddup", { XM, EXymmq } }, + }, + + /* PREFIX_VEX_16 */ + { + { MOD_TABLE (MOD_VEX_16_PREFIX_0) }, + { "vmovshdup", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_16_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_2A */ + { + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2A_P_1) }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2A_P_3) }, + }, + + /* PREFIX_VEX_2C */ + { + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2C_P_1) }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2C_P_3) }, + }, + + /* PREFIX_VEX_2D */ + { + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2D_P_1) }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2D_P_3) }, + }, + + /* PREFIX_VEX_2E */ + { + { VEX_LEN_TABLE (VEX_LEN_2E_P_0) }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_2F */ + { + { VEX_LEN_TABLE (VEX_LEN_2F_P_0) }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_2F_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_51 */ + { + { "vsqrtps", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_51_P_1) }, + { "vsqrtpd", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_51_P_3) }, + }, + + /* PREFIX_VEX_52 */ + { + { "vrsqrtps", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_52_P_1) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_53 */ + { + { "vrcpps", { XM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_53_P_1) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_58 */ + { + { "vaddps", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_58_P_1) }, + { "vaddpd", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_58_P_3) }, + }, + + /* PREFIX_VEX_59 */ + { + { "vmulps", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_59_P_1) }, + { "vmulpd", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_59_P_3) }, + }, + + /* PREFIX_VEX_5A */ + { + { "vcvtps2pd", { XM, EXxmmq } }, + { VEX_LEN_TABLE (VEX_LEN_5A_P_1) }, + { "vcvtpd2ps%XY", { XMM, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5A_P_3) }, + }, + + /* PREFIX_VEX_5B */ + { + { "vcvtdq2ps", { XM, EXx } }, + { "vcvttps2dq", { XM, EXx } }, + { "vcvtps2dq", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_5C */ + { + { "vsubps", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5C_P_1) }, + { "vsubpd", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5C_P_3) }, + }, + + /* PREFIX_VEX_5D */ + { + { "vminps", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5D_P_1) }, + { "vminpd", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5D_P_3) }, + }, + + /* PREFIX_VEX_5E */ + { + { "vdivps", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5E_P_1) }, + { "vdivpd", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5E_P_3) }, + }, + + /* PREFIX_VEX_5F */ + { + { "vmaxps", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5F_P_1) }, + { "vmaxpd", { XM, Vex, EXx } }, + { VEX_LEN_TABLE (VEX_LEN_5F_P_3) }, + }, + + /* PREFIX_VEX_60 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_60_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_61 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_61_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_62 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_62_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_63 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_63_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_64 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_64_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_65 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_65_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_66 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_66_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_67 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_67_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_68 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_68_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_69 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_69_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_6A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_6A_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_6B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_6B_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_6C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_6C_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_6D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_6D_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_6E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_6E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_6F */ + { + { "(bad)", { XX } }, + { "vmovdqu", { XM, EXx } }, + { "vmovdqa", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_70 */ + { + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_70_P_1) }, + { VEX_LEN_TABLE (VEX_LEN_70_P_2) }, + { VEX_LEN_TABLE (VEX_LEN_70_P_3) }, + }, + + /* PREFIX_VEX_71_REG_2 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_71_REG_4 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_71_REG_6 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_72_REG_2 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_72_REG_4 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_72_REG_6 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_73_REG_2 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_73_REG_3 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_73_REG_6 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_73_REG_7 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_74 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_74_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_75 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_75_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_76 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_76_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_77 */ + { + { "", { VZERO } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_7C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vhaddpd", { XM, Vex, EXx } }, + { "vhaddps", { XM, Vex, EXx } }, + }, + + /* PREFIX_VEX_7D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vhsubpd", { XM, Vex, EXx } }, + { "vhsubps", { XM, Vex, EXx } }, + }, + + /* PREFIX_VEX_7E */ + { + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_7E_P_1) }, + { VEX_LEN_TABLE (VEX_LEN_7E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_7F */ + { + { "(bad)", { XX } }, + { "vmovdqu", { EXxS, XM } }, + { "vmovdqa", { EXxS, XM } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_C2 */ + { + { "vcmpps", { XM, Vex, EXx, VCMP } }, + { VEX_LEN_TABLE (VEX_LEN_C2_P_1) }, + { "vcmppd", { XM, Vex, EXx, VCMP } }, + { VEX_LEN_TABLE (VEX_LEN_C2_P_3) }, + }, + + /* PREFIX_VEX_C4 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_C4_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_C5 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_C5_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D0 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vaddsubpd", { XM, Vex, EXx } }, + { "vaddsubps", { XM, Vex, EXx } }, + }, + + /* PREFIX_VEX_D1 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D1_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D2 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D2_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D3 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D3_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D4 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D4_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D5 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D5_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D6 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D6_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D7 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_D7_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D8 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D8_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_D9 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D9_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_DA */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_DA_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_DB */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_DB_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_DC */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_DC_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_DD */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_DD_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_DE */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_DE_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_DF */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_DF_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E0 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E0_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E1 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E1_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E2 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E2_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E3 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E3_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E4 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E4_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E5 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E5_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E6 */ + { + { "(bad)", { XX } }, + { "vcvtdq2pd", { XM, EXxmmq } }, + { "vcvttpd2dq%XY", { XMM, EXx } }, + { "vcvtpd2dq%XY", { XMM, EXx } }, + }, + + /* PREFIX_VEX_E7 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_E7_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E8 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E8_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_E9 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_E9_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_EA */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_EA_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_EB */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_EB_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_EC */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_EC_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_ED */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_ED_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_EE */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_EE_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_EF */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_EF_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F0 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_F0_PREFIX_3) }, + }, + + /* PREFIX_VEX_F1 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F1_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F2 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F2_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F3 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F3_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F4 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F4_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F5 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F5_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F6 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F6_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F7 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F7_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F8 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F8_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_F9 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_F9_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_FA */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_FA_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_FB */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_FB_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_FC */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_FC_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_FD */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_FD_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_FE */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_FE_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3800 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3800_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3801 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3801_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3802 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3802_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3803 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3803_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3804 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3804_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3805 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3805_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3806 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3806_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3807 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3807_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3808 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3808_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3809 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3809_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_380A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_380A_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_380B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_380B_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_380C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vpermilps", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_380D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vpermilpd", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_380E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vtestps", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_380F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vtestpd", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3817 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vptest", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3818 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_3818_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3819 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_3819_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_381A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_381A_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_381C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_381C_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_381D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_381D_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_381E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_381E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3820 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3820_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3821 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3821_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3822 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3822_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3823 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3823_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3824 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3824_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3825 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3825_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3828 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3828_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3829 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3829_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_382A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_382A_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_382B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_382B_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_382C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_382C_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_382D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_382D_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_382E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_382E_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_382F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { MOD_TABLE (MOD_VEX_382F_PREFIX_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3830 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3830_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3831 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3831_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3832 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3832_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3833 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3833_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3834 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3834_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3835 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3835_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3837 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3837_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3838 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3838_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3839 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3839_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_383A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_383A_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_383B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_383B_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_383C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_383C_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_383D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_383D_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_383E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_383E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_383F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_383F_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3840 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3840_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3841 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3841_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3896 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmaddsub132p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3897 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsubadd132p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3898 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmadd132p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3899 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmadd132s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_389A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsub132p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_389B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsub132s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_389C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmadd132p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_389D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_389E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsub132p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_389F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38A6 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmaddsub213p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38A7 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsubadd213p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38A8 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmadd213p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38A9 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmadd213s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38AA */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsub213p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38AB */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsub213s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38AC */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmadd213p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38AD */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38AE */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsub213p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38AF */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38B6 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmaddsub231p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38B7 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsubadd231p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38B8 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmadd231p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38B9 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmadd231s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38BA */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsub231p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38BB */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsub231s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38BC */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmadd231p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38BD */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38BE */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsub231p%XW", { XM, Vex, EXx } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38BF */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38DB */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38DC */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38DD */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38DE */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_38DF */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A04 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vpermilps", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A05 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vpermilpd", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A06 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A08 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vroundps", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A09 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vroundpd", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A0A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A0B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A0C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vblendps", { XM, Vex, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A0D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vblendpd", { XM, Vex, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A0E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A0F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A14 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A15 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A16 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A17 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A18 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A19 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A20 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A21 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A22 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A40 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vdpps", { XM, Vex, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A41 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A42 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A44 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A4A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vblendvps", { XM, Vex, EXx, XMVexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A4B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vblendvpd", { XM, Vex, EXx, XMVexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A4C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A5C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmaddsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A5D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmaddsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A5E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsubaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A5F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsubaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A60 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A61 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A62 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A63 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A68 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A69 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A6A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A6B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A6C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A6D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A6E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A6F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A78 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmaddps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A79 */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmaddpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A7A */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A7B */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A7C */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsubps", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A7D */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "vfnmsubpd", { XMVexW, VexFMA, EXVexW, EXVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A7E */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3A7F */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) }, + { "(bad)", { XX } }, + }, + + /* PREFIX_VEX_3ADF */ + { + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) }, + { "(bad)", { XX } }, + }, +}; + +static const struct dis386 x86_64_table[][2] = { + /* X86_64_06 */ + { + { "push{T|}", { es } }, + { "(bad)", { XX } }, + }, + + /* X86_64_07 */ + { + { "pop{T|}", { es } }, + { "(bad)", { XX } }, + }, + + /* X86_64_0D */ + { + { "push{T|}", { cs } }, + { "(bad)", { XX } }, + }, + + /* X86_64_16 */ + { + { "push{T|}", { ss } }, + { "(bad)", { XX } }, + }, + + /* X86_64_17 */ + { + { "pop{T|}", { ss } }, + { "(bad)", { XX } }, + }, + + /* X86_64_1E */ + { + { "push{T|}", { ds } }, + { "(bad)", { XX } }, + }, + + /* X86_64_1F */ + { + { "pop{T|}", { ds } }, + { "(bad)", { XX } }, + }, + + /* X86_64_27 */ + { + { "daa", { XX } }, + { "(bad)", { XX } }, + }, + + /* X86_64_2F */ + { + { "das", { XX } }, + { "(bad)", { XX } }, + }, + + /* X86_64_37 */ + { + { "aaa", { XX } }, + { "(bad)", { XX } }, + }, + + /* X86_64_3F */ + { + { "aas", { XX } }, + { "(bad)", { XX } }, + }, + + /* X86_64_60 */ + { + { "pusha{P|}", { XX } }, { "(bad)", { XX } }, + }, + + /* X86_64_61 */ + { + { "popa{P|}", { XX } }, { "(bad)", { XX } }, + }, + + /* X86_64_62 */ + { + { MOD_TABLE (MOD_62_32BIT) }, { "(bad)", { XX } }, + }, + + /* X86_64_63 */ + { + { "arpl", { Ew, Gw } }, + { "movs{lq|xd}", { Gv, Ed } }, + }, + + /* X86_64_6D */ + { + { "ins{R|}", { Yzr, indirDX } }, + { "ins{G|}", { Yzr, indirDX } }, + }, + + /* X86_64_6F */ + { + { "outs{R|}", { indirDXr, Xz } }, + { "outs{G|}", { indirDXr, Xz } }, + }, + + /* X86_64_9A */ + { + { "Jcall{T|}", { Ap } }, { "(bad)", { XX } }, + }, + + /* X86_64_C4 */ + { + { MOD_TABLE (MOD_C4_32BIT) }, + { VEX_C4_TABLE (VEX_0F) }, + }, + + /* X86_64_C5 */ + { + { MOD_TABLE (MOD_C5_32BIT) }, + { VEX_C5_TABLE (VEX_0F) }, + }, + + /* X86_64_CE */ + { + { "into", { XX } }, { "(bad)", { XX } }, + }, + + /* X86_64_D4 */ + { + { "aam", { sIb } }, { "(bad)", { XX } }, + }, + + /* X86_64_D5 */ + { + { "aad", { sIb } }, { "(bad)", { XX } }, + }, + + /* X86_64_EA */ + { + { "Jjmp{T|}", { Ap } }, { "(bad)", { XX } }, + }, + + /* X86_64_0F01_REG_0 */ + { + { "sgdt{Q|IQ}", { M } }, + { "sgdt", { M } }, + }, + + /* X86_64_0F01_REG_1 */ + { + { "sidt{Q|IQ}", { M } }, + { "sidt", { M } }, + }, + + /* X86_64_0F01_REG_2 */ + { + { "lgdt{Q|Q}", { M } }, + { "lgdt", { M } }, + }, + + /* X86_64_0F01_REG_3 */ + { + { "lidt{Q|Q}", { M } }, + { "lidt", { M } }, + }, +}; + +static const struct dis386 three_byte_table[][256] = { + + /* THREE_BYTE_0F38 */ + { + /* 00 */ + { "pshufb", { MX, EM } }, + { "phaddw", { MX, EM } }, + { "phaddd", { MX, EM } }, + { "phaddsw", { MX, EM } }, + { "pmaddubsw", { MX, EM } }, + { "phsubw", { MX, EM } }, + { "phsubd", { MX, EM } }, + { "phsubsw", { MX, EM } }, + /* 08 */ + { "psignb", { MX, EM } }, + { "psignw", { MX, EM } }, + { "psignd", { MX, EM } }, + { "pmulhrsw", { MX, EM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 10 */ + { PREFIX_TABLE (PREFIX_0F3810) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F3814) }, + { PREFIX_TABLE (PREFIX_0F3815) }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F3817) }, + /* 18 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "pabsb", { MX, EM } }, + { "pabsw", { MX, EM } }, + { "pabsd", { MX, EM } }, + { "(bad)", { XX } }, + /* 20 */ + { PREFIX_TABLE (PREFIX_0F3820) }, + { PREFIX_TABLE (PREFIX_0F3821) }, + { PREFIX_TABLE (PREFIX_0F3822) }, + { PREFIX_TABLE (PREFIX_0F3823) }, + { PREFIX_TABLE (PREFIX_0F3824) }, + { PREFIX_TABLE (PREFIX_0F3825) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 28 */ + { PREFIX_TABLE (PREFIX_0F3828) }, + { PREFIX_TABLE (PREFIX_0F3829) }, + { PREFIX_TABLE (PREFIX_0F382A) }, + { PREFIX_TABLE (PREFIX_0F382B) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 30 */ + { PREFIX_TABLE (PREFIX_0F3830) }, + { PREFIX_TABLE (PREFIX_0F3831) }, + { PREFIX_TABLE (PREFIX_0F3832) }, + { PREFIX_TABLE (PREFIX_0F3833) }, + { PREFIX_TABLE (PREFIX_0F3834) }, + { PREFIX_TABLE (PREFIX_0F3835) }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F3837) }, + /* 38 */ + { PREFIX_TABLE (PREFIX_0F3838) }, + { PREFIX_TABLE (PREFIX_0F3839) }, + { PREFIX_TABLE (PREFIX_0F383A) }, + { PREFIX_TABLE (PREFIX_0F383B) }, + { PREFIX_TABLE (PREFIX_0F383C) }, + { PREFIX_TABLE (PREFIX_0F383D) }, + { PREFIX_TABLE (PREFIX_0F383E) }, + { PREFIX_TABLE (PREFIX_0F383F) }, + /* 40 */ + { PREFIX_TABLE (PREFIX_0F3840) }, + { PREFIX_TABLE (PREFIX_0F3841) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 48 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 50 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 58 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 60 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 68 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 70 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 78 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 80 */ + { PREFIX_TABLE (PREFIX_0F3880) }, + { PREFIX_TABLE (PREFIX_0F3881) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 88 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 90 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 98 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* b0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* b8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F38DB) }, + { PREFIX_TABLE (PREFIX_0F38DC) }, + { PREFIX_TABLE (PREFIX_0F38DD) }, + { PREFIX_TABLE (PREFIX_0F38DE) }, + { PREFIX_TABLE (PREFIX_0F38DF) }, + /* e0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* e8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f0 */ + { PREFIX_TABLE (PREFIX_0F38F0) }, + { PREFIX_TABLE (PREFIX_0F38F1) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + /* THREE_BYTE_0F3A */ + { + /* 00 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 08 */ + { PREFIX_TABLE (PREFIX_0F3A08) }, + { PREFIX_TABLE (PREFIX_0F3A09) }, + { PREFIX_TABLE (PREFIX_0F3A0A) }, + { PREFIX_TABLE (PREFIX_0F3A0B) }, + { PREFIX_TABLE (PREFIX_0F3A0C) }, + { PREFIX_TABLE (PREFIX_0F3A0D) }, + { PREFIX_TABLE (PREFIX_0F3A0E) }, + { "palignr", { MX, EM, Ib } }, + /* 10 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F3A14) }, + { PREFIX_TABLE (PREFIX_0F3A15) }, + { PREFIX_TABLE (PREFIX_0F3A16) }, + { PREFIX_TABLE (PREFIX_0F3A17) }, + /* 18 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 20 */ + { PREFIX_TABLE (PREFIX_0F3A20) }, + { PREFIX_TABLE (PREFIX_0F3A21) }, + { PREFIX_TABLE (PREFIX_0F3A22) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 28 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 30 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 38 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 40 */ + { PREFIX_TABLE (PREFIX_0F3A40) }, + { PREFIX_TABLE (PREFIX_0F3A41) }, + { PREFIX_TABLE (PREFIX_0F3A42) }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F3A44) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 48 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 50 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 58 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 60 */ + { PREFIX_TABLE (PREFIX_0F3A60) }, + { PREFIX_TABLE (PREFIX_0F3A61) }, + { PREFIX_TABLE (PREFIX_0F3A62) }, + { PREFIX_TABLE (PREFIX_0F3A63) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 68 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 70 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 78 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 80 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 88 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 90 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 98 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* b0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* b8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F3ADF) }, + /* e0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* e8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + + /* THREE_BYTE_0F7A */ + { + /* 00 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 08 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 10 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 18 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 20 */ + { "ptest", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 28 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 30 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 38 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 40 */ + { "(bad)", { XX } }, + { "phaddbw", { XM, EXq } }, + { "phaddbd", { XM, EXq } }, + { "phaddbq", { XM, EXq } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "phaddwd", { XM, EXq } }, + { "phaddwq", { XM, EXq } }, + /* 48 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "phadddq", { XM, EXq } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 50 */ + { "(bad)", { XX } }, + { "phaddubw", { XM, EXq } }, + { "phaddubd", { XM, EXq } }, + { "phaddubq", { XM, EXq } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "phadduwd", { XM, EXq } }, + { "phadduwq", { XM, EXq } }, + /* 58 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "phaddudq", { XM, EXq } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 60 */ + { "(bad)", { XX } }, + { "phsubbw", { XM, EXq } }, + { "phsubbd", { XM, EXq } }, + { "phsubbq", { XM, EXq } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 68 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 70 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 78 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 80 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 88 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 90 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 98 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* b0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* b8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* e0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* e8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, +}; + + +static const struct dis386 vex_table[][256] = { + /* VEX_0F */ + { + /* 00 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 08 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 10 */ + { PREFIX_TABLE (PREFIX_VEX_10) }, + { PREFIX_TABLE (PREFIX_VEX_11) }, + { PREFIX_TABLE (PREFIX_VEX_12) }, + { MOD_TABLE (MOD_VEX_13) }, + { "vunpcklpX", { XM, Vex, EXx } }, + { "vunpckhpX", { XM, Vex, EXx } }, + { PREFIX_TABLE (PREFIX_VEX_16) }, + { MOD_TABLE (MOD_VEX_17) }, + /* 18 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 20 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 28 */ + { "vmovapX", { XM, EXx } }, + { "vmovapX", { EXxS, XM } }, + { PREFIX_TABLE (PREFIX_VEX_2A) }, + { MOD_TABLE (MOD_VEX_2B) }, + { PREFIX_TABLE (PREFIX_VEX_2C) }, + { PREFIX_TABLE (PREFIX_VEX_2D) }, + { PREFIX_TABLE (PREFIX_VEX_2E) }, + { PREFIX_TABLE (PREFIX_VEX_2F) }, + /* 30 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 38 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 40 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 48 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 50 */ + { MOD_TABLE (MOD_VEX_51) }, + { PREFIX_TABLE (PREFIX_VEX_51) }, + { PREFIX_TABLE (PREFIX_VEX_52) }, + { PREFIX_TABLE (PREFIX_VEX_53) }, + { "vandpX", { XM, Vex, EXx } }, + { "vandnpX", { XM, Vex, EXx } }, + { "vorpX", { XM, Vex, EXx } }, + { "vxorpX", { XM, Vex, EXx } }, + /* 58 */ + { PREFIX_TABLE (PREFIX_VEX_58) }, + { PREFIX_TABLE (PREFIX_VEX_59) }, + { PREFIX_TABLE (PREFIX_VEX_5A) }, + { PREFIX_TABLE (PREFIX_VEX_5B) }, + { PREFIX_TABLE (PREFIX_VEX_5C) }, + { PREFIX_TABLE (PREFIX_VEX_5D) }, + { PREFIX_TABLE (PREFIX_VEX_5E) }, + { PREFIX_TABLE (PREFIX_VEX_5F) }, + /* 60 */ + { PREFIX_TABLE (PREFIX_VEX_60) }, + { PREFIX_TABLE (PREFIX_VEX_61) }, + { PREFIX_TABLE (PREFIX_VEX_62) }, + { PREFIX_TABLE (PREFIX_VEX_63) }, + { PREFIX_TABLE (PREFIX_VEX_64) }, + { PREFIX_TABLE (PREFIX_VEX_65) }, + { PREFIX_TABLE (PREFIX_VEX_66) }, + { PREFIX_TABLE (PREFIX_VEX_67) }, + /* 68 */ + { PREFIX_TABLE (PREFIX_VEX_68) }, + { PREFIX_TABLE (PREFIX_VEX_69) }, + { PREFIX_TABLE (PREFIX_VEX_6A) }, + { PREFIX_TABLE (PREFIX_VEX_6B) }, + { PREFIX_TABLE (PREFIX_VEX_6C) }, + { PREFIX_TABLE (PREFIX_VEX_6D) }, + { PREFIX_TABLE (PREFIX_VEX_6E) }, + { PREFIX_TABLE (PREFIX_VEX_6F) }, + /* 70 */ + { PREFIX_TABLE (PREFIX_VEX_70) }, + { REG_TABLE (REG_VEX_71) }, + { REG_TABLE (REG_VEX_72) }, + { REG_TABLE (REG_VEX_73) }, + { PREFIX_TABLE (PREFIX_VEX_74) }, + { PREFIX_TABLE (PREFIX_VEX_75) }, + { PREFIX_TABLE (PREFIX_VEX_76) }, + { PREFIX_TABLE (PREFIX_VEX_77) }, + /* 78 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_7C) }, + { PREFIX_TABLE (PREFIX_VEX_7D) }, + { PREFIX_TABLE (PREFIX_VEX_7E) }, + { PREFIX_TABLE (PREFIX_VEX_7F) }, + /* 80 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 88 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 90 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 98 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* a8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { REG_TABLE (REG_VEX_AE) }, + { "(bad)", { XX } }, + /* b0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* b8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_C2) }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_C4) }, + { PREFIX_TABLE (PREFIX_VEX_C5) }, + { "vshufpX", { XM, Vex, EXx, Ib } }, + { "(bad)", { XX } }, + /* c8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d0 */ + { PREFIX_TABLE (PREFIX_VEX_D0) }, + { PREFIX_TABLE (PREFIX_VEX_D1) }, + { PREFIX_TABLE (PREFIX_VEX_D2) }, + { PREFIX_TABLE (PREFIX_VEX_D3) }, + { PREFIX_TABLE (PREFIX_VEX_D4) }, + { PREFIX_TABLE (PREFIX_VEX_D5) }, + { PREFIX_TABLE (PREFIX_VEX_D6) }, + { PREFIX_TABLE (PREFIX_VEX_D7) }, + /* d8 */ + { PREFIX_TABLE (PREFIX_VEX_D8) }, + { PREFIX_TABLE (PREFIX_VEX_D9) }, + { PREFIX_TABLE (PREFIX_VEX_DA) }, + { PREFIX_TABLE (PREFIX_VEX_DB) }, + { PREFIX_TABLE (PREFIX_VEX_DC) }, + { PREFIX_TABLE (PREFIX_VEX_DD) }, + { PREFIX_TABLE (PREFIX_VEX_DE) }, + { PREFIX_TABLE (PREFIX_VEX_DF) }, + /* e0 */ + { PREFIX_TABLE (PREFIX_VEX_E0) }, + { PREFIX_TABLE (PREFIX_VEX_E1) }, + { PREFIX_TABLE (PREFIX_VEX_E2) }, + { PREFIX_TABLE (PREFIX_VEX_E3) }, + { PREFIX_TABLE (PREFIX_VEX_E4) }, + { PREFIX_TABLE (PREFIX_VEX_E5) }, + { PREFIX_TABLE (PREFIX_VEX_E6) }, + { PREFIX_TABLE (PREFIX_VEX_E7) }, + /* e8 */ + { PREFIX_TABLE (PREFIX_VEX_E8) }, + { PREFIX_TABLE (PREFIX_VEX_E9) }, + { PREFIX_TABLE (PREFIX_VEX_EA) }, + { PREFIX_TABLE (PREFIX_VEX_EB) }, + { PREFIX_TABLE (PREFIX_VEX_EC) }, + { PREFIX_TABLE (PREFIX_VEX_ED) }, + { PREFIX_TABLE (PREFIX_VEX_EE) }, + { PREFIX_TABLE (PREFIX_VEX_EF) }, + /* f0 */ + { PREFIX_TABLE (PREFIX_VEX_F0) }, + { PREFIX_TABLE (PREFIX_VEX_F1) }, + { PREFIX_TABLE (PREFIX_VEX_F2) }, + { PREFIX_TABLE (PREFIX_VEX_F3) }, + { PREFIX_TABLE (PREFIX_VEX_F4) }, + { PREFIX_TABLE (PREFIX_VEX_F5) }, + { PREFIX_TABLE (PREFIX_VEX_F6) }, + { PREFIX_TABLE (PREFIX_VEX_F7) }, + /* f8 */ + { PREFIX_TABLE (PREFIX_VEX_F8) }, + { PREFIX_TABLE (PREFIX_VEX_F9) }, + { PREFIX_TABLE (PREFIX_VEX_FA) }, + { PREFIX_TABLE (PREFIX_VEX_FB) }, + { PREFIX_TABLE (PREFIX_VEX_FC) }, + { PREFIX_TABLE (PREFIX_VEX_FD) }, + { PREFIX_TABLE (PREFIX_VEX_FE) }, + { "(bad)", { XX } }, + }, + /* VEX_0F38 */ + { + /* 00 */ + { PREFIX_TABLE (PREFIX_VEX_3800) }, + { PREFIX_TABLE (PREFIX_VEX_3801) }, + { PREFIX_TABLE (PREFIX_VEX_3802) }, + { PREFIX_TABLE (PREFIX_VEX_3803) }, + { PREFIX_TABLE (PREFIX_VEX_3804) }, + { PREFIX_TABLE (PREFIX_VEX_3805) }, + { PREFIX_TABLE (PREFIX_VEX_3806) }, + { PREFIX_TABLE (PREFIX_VEX_3807) }, + /* 08 */ + { PREFIX_TABLE (PREFIX_VEX_3808) }, + { PREFIX_TABLE (PREFIX_VEX_3809) }, + { PREFIX_TABLE (PREFIX_VEX_380A) }, + { PREFIX_TABLE (PREFIX_VEX_380B) }, + { PREFIX_TABLE (PREFIX_VEX_380C) }, + { PREFIX_TABLE (PREFIX_VEX_380D) }, + { PREFIX_TABLE (PREFIX_VEX_380E) }, + { PREFIX_TABLE (PREFIX_VEX_380F) }, + /* 10 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3817) }, + /* 18 */ + { PREFIX_TABLE (PREFIX_VEX_3818) }, + { PREFIX_TABLE (PREFIX_VEX_3819) }, + { PREFIX_TABLE (PREFIX_VEX_381A) }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_381C) }, + { PREFIX_TABLE (PREFIX_VEX_381D) }, + { PREFIX_TABLE (PREFIX_VEX_381E) }, + { "(bad)", { XX } }, + /* 20 */ + { PREFIX_TABLE (PREFIX_VEX_3820) }, + { PREFIX_TABLE (PREFIX_VEX_3821) }, + { PREFIX_TABLE (PREFIX_VEX_3822) }, + { PREFIX_TABLE (PREFIX_VEX_3823) }, + { PREFIX_TABLE (PREFIX_VEX_3824) }, + { PREFIX_TABLE (PREFIX_VEX_3825) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 28 */ + { PREFIX_TABLE (PREFIX_VEX_3828) }, + { PREFIX_TABLE (PREFIX_VEX_3829) }, + { PREFIX_TABLE (PREFIX_VEX_382A) }, + { PREFIX_TABLE (PREFIX_VEX_382B) }, + { PREFIX_TABLE (PREFIX_VEX_382C) }, + { PREFIX_TABLE (PREFIX_VEX_382D) }, + { PREFIX_TABLE (PREFIX_VEX_382E) }, + { PREFIX_TABLE (PREFIX_VEX_382F) }, + /* 30 */ + { PREFIX_TABLE (PREFIX_VEX_3830) }, + { PREFIX_TABLE (PREFIX_VEX_3831) }, + { PREFIX_TABLE (PREFIX_VEX_3832) }, + { PREFIX_TABLE (PREFIX_VEX_3833) }, + { PREFIX_TABLE (PREFIX_VEX_3834) }, + { PREFIX_TABLE (PREFIX_VEX_3835) }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3837) }, + /* 38 */ + { PREFIX_TABLE (PREFIX_VEX_3838) }, + { PREFIX_TABLE (PREFIX_VEX_3839) }, + { PREFIX_TABLE (PREFIX_VEX_383A) }, + { PREFIX_TABLE (PREFIX_VEX_383B) }, + { PREFIX_TABLE (PREFIX_VEX_383C) }, + { PREFIX_TABLE (PREFIX_VEX_383D) }, + { PREFIX_TABLE (PREFIX_VEX_383E) }, + { PREFIX_TABLE (PREFIX_VEX_383F) }, + /* 40 */ + { PREFIX_TABLE (PREFIX_VEX_3840) }, + { PREFIX_TABLE (PREFIX_VEX_3841) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 48 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 50 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 58 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 60 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 68 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 70 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 78 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 80 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 88 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 90 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3896) }, + { PREFIX_TABLE (PREFIX_VEX_3897) }, + /* 98 */ + { PREFIX_TABLE (PREFIX_VEX_3898) }, + { PREFIX_TABLE (PREFIX_VEX_3899) }, + { PREFIX_TABLE (PREFIX_VEX_389A) }, + { PREFIX_TABLE (PREFIX_VEX_389B) }, + { PREFIX_TABLE (PREFIX_VEX_389C) }, + { PREFIX_TABLE (PREFIX_VEX_389D) }, + { PREFIX_TABLE (PREFIX_VEX_389E) }, + { PREFIX_TABLE (PREFIX_VEX_389F) }, + /* a0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_38A6) }, + { PREFIX_TABLE (PREFIX_VEX_38A7) }, + /* a8 */ + { PREFIX_TABLE (PREFIX_VEX_38A8) }, + { PREFIX_TABLE (PREFIX_VEX_38A9) }, + { PREFIX_TABLE (PREFIX_VEX_38AA) }, + { PREFIX_TABLE (PREFIX_VEX_38AB) }, + { PREFIX_TABLE (PREFIX_VEX_38AC) }, + { PREFIX_TABLE (PREFIX_VEX_38AD) }, + { PREFIX_TABLE (PREFIX_VEX_38AE) }, + { PREFIX_TABLE (PREFIX_VEX_38AF) }, + /* b0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_38B6) }, + { PREFIX_TABLE (PREFIX_VEX_38B7) }, + /* b8 */ + { PREFIX_TABLE (PREFIX_VEX_38B8) }, + { PREFIX_TABLE (PREFIX_VEX_38B9) }, + { PREFIX_TABLE (PREFIX_VEX_38BA) }, + { PREFIX_TABLE (PREFIX_VEX_38BB) }, + { PREFIX_TABLE (PREFIX_VEX_38BC) }, + { PREFIX_TABLE (PREFIX_VEX_38BD) }, + { PREFIX_TABLE (PREFIX_VEX_38BE) }, + { PREFIX_TABLE (PREFIX_VEX_38BF) }, + /* c0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* c8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* d8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_38DB) }, + { PREFIX_TABLE (PREFIX_VEX_38DC) }, + { PREFIX_TABLE (PREFIX_VEX_38DD) }, + { PREFIX_TABLE (PREFIX_VEX_38DE) }, + { PREFIX_TABLE (PREFIX_VEX_38DF) }, + /* e0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* e8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f0 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + /* VEX_0F3A */ + { + /* 00 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A04) }, + { PREFIX_TABLE (PREFIX_VEX_3A05) }, + { PREFIX_TABLE (PREFIX_VEX_3A06) }, + { "(bad)", { XX } }, + /* 08 */ + { PREFIX_TABLE (PREFIX_VEX_3A08) }, + { PREFIX_TABLE (PREFIX_VEX_3A09) }, + { PREFIX_TABLE (PREFIX_VEX_3A0A) }, + { PREFIX_TABLE (PREFIX_VEX_3A0B) }, + { PREFIX_TABLE (PREFIX_VEX_3A0C) }, + { PREFIX_TABLE (PREFIX_VEX_3A0D) }, + { PREFIX_TABLE (PREFIX_VEX_3A0E) }, + { PREFIX_TABLE (PREFIX_VEX_3A0F) }, + /* 10 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A14) }, + { PREFIX_TABLE (PREFIX_VEX_3A15) }, + { PREFIX_TABLE (PREFIX_VEX_3A16) }, + { PREFIX_TABLE (PREFIX_VEX_3A17) }, + /* 18 */ + { PREFIX_TABLE (PREFIX_VEX_3A18) }, + { PREFIX_TABLE (PREFIX_VEX_3A19) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 20 */ + { PREFIX_TABLE (PREFIX_VEX_3A20) }, + { PREFIX_TABLE (PREFIX_VEX_3A21) }, + { PREFIX_TABLE (PREFIX_VEX_3A22) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* 28 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 30 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 38 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 40 */ - { PREGRP83 }, - { PREGRP84 }, - { PREGRP85 }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A40) }, + { PREFIX_TABLE (PREFIX_VEX_3A41) }, + { PREFIX_TABLE (PREFIX_VEX_3A42) }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A44) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 48 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A4A) }, + { PREFIX_TABLE (PREFIX_VEX_3A4B) }, + { PREFIX_TABLE (PREFIX_VEX_3A4C) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 50 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 58 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A5C) }, + { PREFIX_TABLE (PREFIX_VEX_3A5D) }, + { PREFIX_TABLE (PREFIX_VEX_3A5E) }, + { PREFIX_TABLE (PREFIX_VEX_3A5F) }, /* 60 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A60) }, + { PREFIX_TABLE (PREFIX_VEX_3A61) }, + { PREFIX_TABLE (PREFIX_VEX_3A62) }, + { PREFIX_TABLE (PREFIX_VEX_3A63) }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 68 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A68) }, + { PREFIX_TABLE (PREFIX_VEX_3A69) }, + { PREFIX_TABLE (PREFIX_VEX_3A6A) }, + { PREFIX_TABLE (PREFIX_VEX_3A6B) }, + { PREFIX_TABLE (PREFIX_VEX_3A6C) }, + { PREFIX_TABLE (PREFIX_VEX_3A6D) }, + { PREFIX_TABLE (PREFIX_VEX_3A6E) }, + { PREFIX_TABLE (PREFIX_VEX_3A6F) }, /* 70 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 78 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3A78) }, + { PREFIX_TABLE (PREFIX_VEX_3A79) }, + { PREFIX_TABLE (PREFIX_VEX_3A7A) }, + { PREFIX_TABLE (PREFIX_VEX_3A7B) }, + { PREFIX_TABLE (PREFIX_VEX_3A7C) }, + { PREFIX_TABLE (PREFIX_VEX_3A7D) }, + { PREFIX_TABLE (PREFIX_VEX_3A7E) }, + { PREFIX_TABLE (PREFIX_VEX_3A7F) }, /* 80 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 88 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 90 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* 98 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* a0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* a8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* b0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* b8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* c0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* c8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* d0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* d8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_3ADF) }, /* e0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* e8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, /* f0 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - /* f8 */ - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - { "(bad)", { XX } }, - } + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + /* f8 */ + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, +}; + +static const struct dis386 vex_len_table[][2] = { + /* VEX_LEN_10_P_1 */ + { + { "vmovss", { XMVex, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_10_P_3 */ + { + { "vmovsd", { XMVex, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_11_P_1 */ + { + { "vmovss", { EXdVexS, Vex128, XM } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_11_P_3 */ + { + { "vmovsd", { EXqVexS, Vex128, XM } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_12_P_0_M_0 */ + { + { "vmovlps", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_12_P_0_M_1 */ + { + { "vmovhlps", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_12_P_2 */ + { + { "vmovlpd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_13_M_0 */ + { + { "vmovlpX", { EXq, XM } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_16_P_0_M_0 */ + { + { "vmovhps", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_16_P_0_M_1 */ + { + { "vmovlhps", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_16_P_2 */ + { + { "vmovhpd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_17_M_0 */ + { + { "vmovhpX", { EXq, XM } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2A_P_1 */ + { + { "vcvtsi2ss%LQ", { XM, Vex128, Ev } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2A_P_3 */ + { + { "vcvtsi2sd%LQ", { XM, Vex128, Ev } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2C_P_1 */ + { + { "vcvttss2siY", { Gv, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2C_P_3 */ + { + { "vcvttsd2siY", { Gv, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2D_P_1 */ + { + { "vcvtss2siY", { Gv, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2D_P_3 */ + { + { "vcvtsd2siY", { Gv, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2E_P_0 */ + { + { "vucomiss", { XM, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2E_P_2 */ + { + { "vucomisd", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2F_P_0 */ + { + { "vcomiss", { XM, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_2F_P_2 */ + { + { "vcomisd", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_51_P_1 */ + { + { "vsqrtss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_51_P_3 */ + { + { "vsqrtsd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_52_P_1 */ + { + { "vrsqrtss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_53_P_1 */ + { + { "vrcpss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_58_P_1 */ + { + { "vaddss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_58_P_3 */ + { + { "vaddsd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_59_P_1 */ + { + { "vmulss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_59_P_3 */ + { + { "vmulsd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5A_P_1 */ + { + { "vcvtss2sd", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5A_P_3 */ + { + { "vcvtsd2ss", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5C_P_1 */ + { + { "vsubss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5C_P_3 */ + { + { "vsubsd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5D_P_1 */ + { + { "vminss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5D_P_3 */ + { + { "vminsd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5E_P_1 */ + { + { "vdivss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5E_P_3 */ + { + { "vdivsd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5F_P_1 */ + { + { "vmaxss", { XM, Vex128, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_5F_P_3 */ + { + { "vmaxsd", { XM, Vex128, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_60_P_2 */ + { + { "vpunpcklbw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_61_P_2 */ + { + { "vpunpcklwd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_62_P_2 */ + { + { "vpunpckldq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_63_P_2 */ + { + { "vpacksswb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_64_P_2 */ + { + { "vpcmpgtb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_65_P_2 */ + { + { "vpcmpgtw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_66_P_2 */ + { + { "vpcmpgtd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_67_P_2 */ + { + { "vpackuswb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_68_P_2 */ + { + { "vpunpckhbw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_69_P_2 */ + { + { "vpunpckhwd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_6A_P_2 */ + { + { "vpunpckhdq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_6B_P_2 */ + { + { "vpackssdw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_6C_P_2 */ + { + { "vpunpcklqdq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_6D_P_2 */ + { + { "vpunpckhqdq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_6E_P_2 */ + { + { "vmovK", { XM, Edq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_70_P_1 */ + { + { "vpshufhw", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_70_P_2 */ + { + { "vpshufd", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_70_P_3 */ + { + { "vpshuflw", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_71_R_2_P_2 */ + { + { "vpsrlw", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_71_R_4_P_2 */ + { + { "vpsraw", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_71_R_6_P_2 */ + { + { "vpsllw", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_72_R_2_P_2 */ + { + { "vpsrld", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_72_R_4_P_2 */ + { + { "vpsrad", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_72_R_6_P_2 */ + { + { "vpslld", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_73_R_2_P_2 */ + { + { "vpsrlq", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_73_R_3_P_2 */ + { + { "vpsrldq", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_73_R_6_P_2 */ + { + { "vpsllq", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_73_R_7_P_2 */ + { + { "vpslldq", { Vex128, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_74_P_2 */ + { + { "vpcmpeqb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_75_P_2 */ + { + { "vpcmpeqw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_76_P_2 */ + { + { "vpcmpeqd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_7E_P_1 */ + { + { "vmovq", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_7E_P_2 */ + { + { "vmovK", { Edq, XM } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_AE_R_2_M_0 */ + { + { "vldmxcsr", { Md } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_AE_R_3_M_0 */ + { + { "vstmxcsr", { Md } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_C2_P_1 */ + { + { "vcmpss", { XM, Vex128, EXd, VCMP } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_C2_P_3 */ + { + { "vcmpsd", { XM, Vex128, EXq, VCMP } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_C4_P_2 */ + { + { "vpinsrw", { XM, Vex128, Edqw, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_C5_P_2 */ + { + { "vpextrw", { Gdq, XS, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D1_P_2 */ + { + { "vpsrlw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D2_P_2 */ + { + { "vpsrld", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D3_P_2 */ + { + { "vpsrlq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D4_P_2 */ + { + { "vpaddq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D5_P_2 */ + { + { "vpmullw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D6_P_2 */ + { + { "vmovq", { EXqS, XM } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D7_P_2_M_1 */ + { + { "vpmovmskb", { Gdq, XS } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D8_P_2 */ + { + { "vpsubusb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_D9_P_2 */ + { + { "vpsubusw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_DA_P_2 */ + { + { "vpminub", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_DB_P_2 */ + { + { "vpand", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_DC_P_2 */ + { + { "vpaddusb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_DD_P_2 */ + { + { "vpaddusw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_DE_P_2 */ + { + { "vpmaxub", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_DF_P_2 */ + { + { "vpandn", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E0_P_2 */ + { + { "vpavgb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E1_P_2 */ + { + { "vpsraw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E2_P_2 */ + { + { "vpsrad", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E3_P_2 */ + { + { "vpavgw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E4_P_2 */ + { + { "vpmulhuw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E5_P_2 */ + { + { "vpmulhw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E8_P_2 */ + { + { "vpsubsb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_E9_P_2 */ + { + { "vpsubsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_EA_P_2 */ + { + { "vpminsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_EB_P_2 */ + { + { "vpor", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_EC_P_2 */ + { + { "vpaddsb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_ED_P_2 */ + { + { "vpaddsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_EE_P_2 */ + { + { "vpmaxsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_EF_P_2 */ + { + { "vpxor", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F1_P_2 */ + { + { "vpsllw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F2_P_2 */ + { + { "vpslld", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F3_P_2 */ + { + { "vpsllq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F4_P_2 */ + { + { "vpmuludq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F5_P_2 */ + { + { "vpmaddwd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F6_P_2 */ + { + { "vpsadbw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F7_P_2 */ + { + { "vmaskmovdqu", { XM, XS } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F8_P_2 */ + { + { "vpsubb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_F9_P_2 */ + { + { "vpsubw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_FA_P_2 */ + { + { "vpsubd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_FB_P_2 */ + { + { "vpsubq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_FC_P_2 */ + { + { "vpaddb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_FD_P_2 */ + { + { "vpaddw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_FE_P_2 */ + { + { "vpaddd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3800_P_2 */ + { + { "vpshufb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3801_P_2 */ + { + { "vphaddw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3802_P_2 */ + { + { "vphaddd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3803_P_2 */ + { + { "vphaddsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3804_P_2 */ + { + { "vpmaddubsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3805_P_2 */ + { + { "vphsubw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3806_P_2 */ + { + { "vphsubd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3807_P_2 */ + { + { "vphsubsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3808_P_2 */ + { + { "vpsignb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3809_P_2 */ + { + { "vpsignw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_380A_P_2 */ + { + { "vpsignd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_380B_P_2 */ + { + { "vpmulhrsw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3819_P_2_M_0 */ + { + { "(bad)", { XX } }, + { "vbroadcastsd", { XM, Mq } }, + }, + + /* VEX_LEN_381A_P_2_M_0 */ + { + { "(bad)", { XX } }, + { "vbroadcastf128", { XM, Mxmm } }, + }, + + /* VEX_LEN_381C_P_2 */ + { + { "vpabsb", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_381D_P_2 */ + { + { "vpabsw", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_381E_P_2 */ + { + { "vpabsd", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3820_P_2 */ + { + { "vpmovsxbw", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3821_P_2 */ + { + { "vpmovsxbd", { XM, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3822_P_2 */ + { + { "vpmovsxbq", { XM, EXw } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3823_P_2 */ + { + { "vpmovsxwd", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3824_P_2 */ + { + { "vpmovsxwq", { XM, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3825_P_2 */ + { + { "vpmovsxdq", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3828_P_2 */ + { + { "vpmuldq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3829_P_2 */ + { + { "vpcmpeqq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_382A_P_2_M_0 */ + { + { "vmovntdqa", { XM, Mx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_382B_P_2 */ + { + { "vpackusdw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3830_P_2 */ + { + { "vpmovzxbw", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3831_P_2 */ + { + { "vpmovzxbd", { XM, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3832_P_2 */ + { + { "vpmovzxbq", { XM, EXw } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3833_P_2 */ + { + { "vpmovzxwd", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3834_P_2 */ + { + { "vpmovzxwq", { XM, EXd } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3835_P_2 */ + { + { "vpmovzxdq", { XM, EXq } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3837_P_2 */ + { + { "vpcmpgtq", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3838_P_2 */ + { + { "vpminsb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3839_P_2 */ + { + { "vpminsd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_383A_P_2 */ + { + { "vpminuw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_383B_P_2 */ + { + { "vpminud", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_383C_P_2 */ + { + { "vpmaxsb", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_383D_P_2 */ + { + { "vpmaxsd", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_383E_P_2 */ + { + { "vpmaxuw", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_383F_P_2 */ + { + { "vpmaxud", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3840_P_2 */ + { + { "vpmulld", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3841_P_2 */ + { + { "vphminposuw", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_38DB_P_2 */ + { + { "vaesimc", { XM, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_38DC_P_2 */ + { + { "vaesenc", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_38DD_P_2 */ + { + { "vaesenclast", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_38DE_P_2 */ + { + { "vaesdec", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_38DF_P_2 */ + { + { "vaesdeclast", { XM, Vex128, EXx } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A06_P_2 */ + { + { "(bad)", { XX } }, + { "vperm2f128", { XM, Vex256, EXx, Ib } }, + }, + + /* VEX_LEN_3A0A_P_2 */ + { + { "vroundss", { XM, Vex128, EXd, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A0B_P_2 */ + { + { "vroundsd", { XM, Vex128, EXq, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A0E_P_2 */ + { + { "vpblendw", { XM, Vex128, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A0F_P_2 */ + { + { "vpalignr", { XM, Vex128, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A14_P_2 */ + { + { "vpextrb", { Edqb, XM, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A15_P_2 */ + { + { "vpextrw", { Edqw, XM, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A16_P_2 */ + { + { "vpextrK", { Edq, XM, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A17_P_2 */ + { + { "vextractps", { Edqd, XM, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A18_P_2 */ + { + { "(bad)", { XX } }, + { "vinsertf128", { XM, Vex256, EXxmm, Ib } }, + }, + + /* VEX_LEN_3A19_P_2 */ + { + { "(bad)", { XX } }, + { "vextractf128", { EXxmm, XM, Ib } }, + }, + + /* VEX_LEN_3A20_P_2 */ + { + { "vpinsrb", { XM, Vex128, Edqb, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A21_P_2 */ + { + { "vinsertps", { XM, Vex128, EXd, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A22_P_2 */ + { + { "vpinsrK", { XM, Vex128, Edq, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A41_P_2 */ + { + { "vdppd", { XM, Vex128, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A42_P_2 */ + { + { "vmpsadbw", { XM, Vex128, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A44_P_2 */ + { + { "vpclmulqdq", { XM, Vex128, EXx, PCLMUL } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A4C_P_2 */ + { + { "vpblendvb", { XM, Vex128, EXx, XMVexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A60_P_2 */ + { + { "vpcmpestrm", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A61_P_2 */ + { + { "vpcmpestri", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A62_P_2 */ + { + { "vpcmpistrm", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A63_P_2 */ + { + { "vpcmpistri", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A6A_P_2 */ + { + { "vfmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A6B_P_2 */ + { + { "vfmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A6E_P_2 */ + { + { "vfmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A6F_P_2 */ + { + { "vfmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A7A_P_2 */ + { + { "vfnmaddss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A7B_P_2 */ + { + { "vfnmaddsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A7E_P_2 */ + { + { "vfnmsubss", { XMVexW, Vex128FMA, EXdVexW, EXdVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3A7F_P_2 */ + { + { "vfnmsubsd", { XMVexW, Vex128FMA, EXqVexW, EXqVexW, VexI4 } }, + { "(bad)", { XX } }, + }, + + /* VEX_LEN_3ADF_P_2 */ + { + { "vaeskeygenassist", { XM, EXx, Ib } }, + { "(bad)", { XX } }, + }, +}; + +static const struct dis386 mod_table[][2] = { + { + /* MOD_8D */ + { "leaS", { Gv, M } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F01_REG_0 */ + { X86_64_TABLE (X86_64_0F01_REG_0) }, + { RM_TABLE (RM_0F01_REG_0) }, + }, + { + /* MOD_0F01_REG_1 */ + { X86_64_TABLE (X86_64_0F01_REG_1) }, + { RM_TABLE (RM_0F01_REG_1) }, + }, + { + /* MOD_0F01_REG_2 */ + { X86_64_TABLE (X86_64_0F01_REG_2) }, + { RM_TABLE (RM_0F01_REG_2) }, + }, + { + /* MOD_0F01_REG_3 */ + { X86_64_TABLE (X86_64_0F01_REG_3) }, + { RM_TABLE (RM_0F01_REG_3) }, + }, + { + /* MOD_0F01_REG_7 */ + { "invlpg", { Mb } }, + { RM_TABLE (RM_0F01_REG_7) }, + }, + { + /* MOD_0F12_PREFIX_0 */ + { "movlps", { XM, EXq } }, + { "movhlps", { XM, EXq } }, + }, + { + /* MOD_0F13 */ + { "movlpX", { EXq, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F16_PREFIX_0 */ + { "movhps", { XM, EXq } }, + { "movlhps", { XM, EXq } }, + }, + { + /* MOD_0F17 */ + { "movhpX", { EXq, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F18_REG_0 */ + { "prefetchnta", { Mb } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F18_REG_1 */ + { "prefetcht0", { Mb } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F18_REG_2 */ + { "prefetcht1", { Mb } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F18_REG_3 */ + { "prefetcht2", { Mb } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F20 */ + { "(bad)", { XX } }, + { "movZ", { Rm, Cm } }, + }, + { + /* MOD_0F21 */ + { "(bad)", { XX } }, + { "movZ", { Rm, Dm } }, + }, + { + /* MOD_0F22 */ + { "(bad)", { XX } }, + { "movZ", { Cm, Rm } }, + }, + { + /* MOD_0F23 */ + { "(bad)", { XX } }, + { "movZ", { Dm, Rm } }, + }, + { + /* MOD_0F24 */ + { "(bad)", { XX } }, + { "movL", { Rd, Td } }, + }, + { + /* MOD_0F26 */ + { "(bad)", { XX } }, + { "movL", { Td, Rd } }, + }, + { + /* MOD_0F2B_PREFIX_0 */ + {"movntps", { Mx, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F2B_PREFIX_1 */ + {"movntss", { Md, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F2B_PREFIX_2 */ + {"movntpd", { Mx, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F2B_PREFIX_3 */ + {"movntsd", { Mq, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F51 */ + { "(bad)", { XX } }, + { "movmskpX", { Gdq, XS } }, + }, + { + /* MOD_0F71_REG_2 */ + { "(bad)", { XX } }, + { "psrlw", { MS, Ib } }, + }, + { + /* MOD_0F71_REG_4 */ + { "(bad)", { XX } }, + { "psraw", { MS, Ib } }, + }, + { + /* MOD_0F71_REG_6 */ + { "(bad)", { XX } }, + { "psllw", { MS, Ib } }, + }, + { + /* MOD_0F72_REG_2 */ + { "(bad)", { XX } }, + { "psrld", { MS, Ib } }, + }, + { + /* MOD_0F72_REG_4 */ + { "(bad)", { XX } }, + { "psrad", { MS, Ib } }, + }, + { + /* MOD_0F72_REG_6 */ + { "(bad)", { XX } }, + { "pslld", { MS, Ib } }, + }, + { + /* MOD_0F73_REG_2 */ + { "(bad)", { XX } }, + { "psrlq", { MS, Ib } }, + }, + { + /* MOD_0F73_REG_3 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F73_REG_3) }, + }, + { + /* MOD_0F73_REG_6 */ + { "(bad)", { XX } }, + { "psllq", { MS, Ib } }, + }, + { + /* MOD_0F73_REG_7 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_0F73_REG_7) }, + }, + { + /* MOD_0FAE_REG_0 */ + { "fxsave", { M } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FAE_REG_1 */ + { "fxrstor", { M } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FAE_REG_2 */ + { "ldmxcsr", { Md } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FAE_REG_3 */ + { "stmxcsr", { Md } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FAE_REG_4 */ + { "xsave", { M } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FAE_REG_5 */ + { "xrstor", { M } }, + { RM_TABLE (RM_0FAE_REG_5) }, + }, + { + /* MOD_0FAE_REG_6 */ + { "xsaveopt", { M } }, + { RM_TABLE (RM_0FAE_REG_6) }, + }, + { + /* MOD_0FAE_REG_7 */ + { "clflush", { Mb } }, + { RM_TABLE (RM_0FAE_REG_7) }, + }, + { + /* MOD_0FB2 */ + { "lssS", { Gv, Mp } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FB4 */ + { "lfsS", { Gv, Mp } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FB5 */ + { "lgsS", { Gv, Mp } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FC7_REG_6 */ + { PREFIX_TABLE (PREFIX_0FC7_REG_6) }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FC7_REG_7 */ + { "vmptrst", { Mq } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FD7 */ + { "(bad)", { XX } }, + { "pmovmskb", { Gdq, MS } }, + }, + { + /* MOD_0FE7_PREFIX_2 */ + { "movntdq", { Mx, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0FF0_PREFIX_3 */ + { "lddqu", { XM, M } }, + { "(bad)", { XX } }, + }, + { + /* MOD_0F382A_PREFIX_2 */ + { "movntdqa", { XM, Mx } }, + { "(bad)", { XX } }, + }, + { + /* MOD_62_32BIT */ + { "bound{S|}", { Gv, Ma } }, + { "(bad)", { XX } }, + }, + { + /* MOD_C4_32BIT */ + { "lesS", { Gv, Mp } }, + { VEX_C4_TABLE (VEX_0F) }, + }, + { + /* MOD_C5_32BIT */ + { "ldsS", { Gv, Mp } }, + { VEX_C5_TABLE (VEX_0F) }, + }, + { + /* MOD_VEX_12_PREFIX_0 */ + { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) }, + { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) }, + }, + { + /* MOD_VEX_13 */ + { VEX_LEN_TABLE (VEX_LEN_13_M_0) }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_16_PREFIX_0 */ + { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) }, + { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) }, + }, + { + /* MOD_VEX_17 */ + { VEX_LEN_TABLE (VEX_LEN_17_M_0) }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_2B */ + { "vmovntpX", { Mx, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_51 */ + { "(bad)", { XX } }, + { "vmovmskpX", { Gdq, XS } }, + }, + { + /* MOD_VEX_71_REG_2 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_71_REG_2) }, + }, + { + /* MOD_VEX_71_REG_4 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_71_REG_4) }, + }, + { + /* MOD_VEX_71_REG_6 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_71_REG_6) }, + }, + { + /* MOD_VEX_72_REG_2 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_72_REG_2) }, + }, + { + /* MOD_VEX_72_REG_4 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_72_REG_4) }, + }, + { + /* MOD_VEX_72_REG_6 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_72_REG_6) }, + }, + { + /* MOD_VEX_73_REG_2 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_73_REG_2) }, + }, + { + /* MOD_VEX_73_REG_3 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_73_REG_3) }, + }, + { + /* MOD_VEX_73_REG_6 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_73_REG_6) }, + }, + { + /* MOD_VEX_73_REG_7 */ + { "(bad)", { XX } }, + { PREFIX_TABLE (PREFIX_VEX_73_REG_7) }, + }, + { + /* MOD_VEX_AE_REG_2 */ + { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_AE_REG_3 */ + { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_D7_PREFIX_2 */ + { "(bad)", { XX } }, + { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) }, + }, + { + /* MOD_VEX_E7_PREFIX_2 */ + { "vmovntdq", { Mx, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_F0_PREFIX_3 */ + { "vlddqu", { XM, M } }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_3818_PREFIX_2 */ + { "vbroadcastss", { XM, Md } }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_3819_PREFIX_2 */ + { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_381A_PREFIX_2 */ + { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_382A_PREFIX_2 */ + { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_382C_PREFIX_2 */ + { "vmaskmovps", { XM, Vex, Mx } }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_382D_PREFIX_2 */ + { "vmaskmovpd", { XM, Vex, Mx } }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_382E_PREFIX_2 */ + { "vmaskmovps", { Mx, Vex, XM } }, + { "(bad)", { XX } }, + }, + { + /* MOD_VEX_382F_PREFIX_2 */ + { "vmaskmovpd", { Mx, Vex, XM } }, + { "(bad)", { XX } }, + }, +}; + +static const struct dis386 rm_table[][8] = { + { + /* RM_0F01_REG_0 */ + { "(bad)", { XX } }, + { "vmcall", { Skip_MODRM } }, + { "vmlaunch", { Skip_MODRM } }, + { "vmresume", { Skip_MODRM } }, + { "vmxoff", { Skip_MODRM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + { + /* RM_0F01_REG_1 */ + { "monitor", { { OP_Monitor, 0 } } }, + { "mwait", { { OP_Mwait, 0 } } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + { + /* RM_0F01_REG_2 */ + { "xgetbv", { Skip_MODRM } }, + { "xsetbv", { Skip_MODRM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + { + /* RM_0F01_REG_3 */ + { "vmrun", { Skip_MODRM } }, + { "vmmcall", { Skip_MODRM } }, + { "vmload", { Skip_MODRM } }, + { "vmsave", { Skip_MODRM } }, + { "stgi", { Skip_MODRM } }, + { "clgi", { Skip_MODRM } }, + { "skinit", { Skip_MODRM } }, + { "invlpga", { Skip_MODRM } }, + }, + { + /* RM_0F01_REG_7 */ + { "swapgs", { Skip_MODRM } }, + { "rdtscp", { Skip_MODRM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + { + /* RM_0FAE_REG_5 */ + { "lfence", { Skip_MODRM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + { + /* RM_0FAE_REG_6 */ + { "mfence", { Skip_MODRM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, + { + /* RM_0FAE_REG_7 */ + { "sfence", { Skip_MODRM } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + { "(bad)", { XX } }, + }, }; #define INTERNAL_DISASSEMBLER_ERROR _("") @@ -3084,6 +8958,8 @@ ckprefix (void) { int newrex; rex = 0; + rex_original = 0; + rex_ignored = 0; prefixes = 0; used_prefixes = 0; rex_used = 0; @@ -3170,6 +9046,7 @@ ckprefix (void) return; } rex = newrex; + rex_original = rex; codep++; } } @@ -3269,6 +9146,7 @@ static bfd_vma start_pc; */ static char intel_syntax; +static char intel_mnemonic = !SYSV386_COMPAT; static char open_char; static char close_char; static char separator_char; @@ -3313,6 +9191,10 @@ with the -M switch (multiple options should be separated by commas):\n")); fprintf (stream, _(" i8086 Disassemble in 16bit mode\n")); fprintf (stream, _(" att Display instruction in AT&T syntax\n")); fprintf (stream, _(" intel Display instruction in Intel syntax\n")); + fprintf (stream, _(" att-mnemonic\n" + " Display instruction in AT&T mnemonic\n")); + fprintf (stream, _(" intel-mnemonic\n" + " Display instruction in Intel mnemonic\n")); fprintf (stream, _(" addr64 Assume 64bit address size\n")); fprintf (stream, _(" addr32 Assume 32bit address size\n")); fprintf (stream, _(" addr16 Assume 16bit address size\n")); @@ -3321,6 +9203,233 @@ with the -M switch (multiple options should be separated by commas):\n")); fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n")); } +/* Get a pointer to struct dis386 with a valid name. */ + +static const struct dis386 * +get_valid_dis386 (const struct dis386 *dp, disassemble_info *info) +{ + int index, vex_table_index; + + if (dp->name != NULL) + return dp; + + switch (dp->op[0].bytemode) + { + case USE_REG_TABLE: + dp = ®_table[dp->op[1].bytemode][modrm.reg]; + break; + + case USE_MOD_TABLE: + index = modrm.mod == 0x3 ? 1 : 0; + dp = &mod_table[dp->op[1].bytemode][index]; + break; + + case USE_RM_TABLE: + dp = &rm_table[dp->op[1].bytemode][modrm.rm]; + break; + + case USE_PREFIX_TABLE: + if (need_vex) + { + /* The prefix in VEX is implicit. */ + switch (vex.prefix) + { + case 0: + index = 0; + break; + case REPE_PREFIX_OPCODE: + index = 1; + break; + case DATA_PREFIX_OPCODE: + index = 2; + break; + case REPNE_PREFIX_OPCODE: + index = 3; + break; + default: + abort (); + break; + } + } + else + { + index = 0; + used_prefixes |= (prefixes & PREFIX_REPZ); + if (prefixes & PREFIX_REPZ) + { + index = 1; + repz_prefix = NULL; + } + else + { + /* We should check PREFIX_REPNZ and PREFIX_REPZ before + PREFIX_DATA. */ + used_prefixes |= (prefixes & PREFIX_REPNZ); + if (prefixes & PREFIX_REPNZ) + { + index = 3; + repnz_prefix = NULL; + } + else + { + used_prefixes |= (prefixes & PREFIX_DATA); + if (prefixes & PREFIX_DATA) + { + index = 2; + data_prefix = NULL; + } + } + } + } + dp = &prefix_table[dp->op[1].bytemode][index]; + break; + + case USE_X86_64_TABLE: + index = address_mode == mode_64bit ? 1 : 0; + dp = &x86_64_table[dp->op[1].bytemode][index]; + break; + + case USE_3BYTE_TABLE: + FETCH_DATA (info, codep + 2); + index = *codep++; + dp = &three_byte_table[dp->op[1].bytemode][index]; + modrm.mod = (*codep >> 6) & 3; + modrm.reg = (*codep >> 3) & 7; + modrm.rm = *codep & 7; + break; + + case USE_VEX_LEN_TABLE: + if (!need_vex) + abort (); + + switch (vex.length) + { + case 128: + index = 0; + break; + case 256: + index = 1; + break; + default: + abort (); + break; + } + + dp = &vex_len_table[dp->op[1].bytemode][index]; + break; + + case USE_VEX_C4_TABLE: + FETCH_DATA (info, codep + 3); + /* All bits in the REX prefix are ignored. */ + rex_ignored = rex; + rex = ~(*codep >> 5) & 0x7; + switch ((*codep & 0x1f)) + { + default: + BadOp (); + case 0x1: + vex_table_index = 0; + break; + case 0x2: + vex_table_index = 1; + break; + case 0x3: + vex_table_index = 2; + break; + } + codep++; + vex.w = *codep & 0x80; + if (vex.w && address_mode == mode_64bit) + rex |= REX_W; + + vex.register_specifier = (~(*codep >> 3)) & 0xf; + if (address_mode != mode_64bit + && vex.register_specifier > 0x7) + BadOp (); + + vex.length = (*codep & 0x4) ? 256 : 128; + switch ((*codep & 0x3)) + { + case 0: + vex.prefix = 0; + break; + case 1: + vex.prefix = DATA_PREFIX_OPCODE; + break; + case 2: + vex.prefix = REPE_PREFIX_OPCODE; + break; + case 3: + vex.prefix = REPNE_PREFIX_OPCODE; + break; + } + need_vex = 1; + need_vex_reg = 1; + codep++; + index = *codep++; + dp = &vex_table[vex_table_index][index]; + /* There is no MODRM byte for VEX [82|77]. */ + if (index != 0x77 && index != 0x82) + { + FETCH_DATA (info, codep + 1); + modrm.mod = (*codep >> 6) & 3; + modrm.reg = (*codep >> 3) & 7; + modrm.rm = *codep & 7; + } + break; + + case USE_VEX_C5_TABLE: + FETCH_DATA (info, codep + 2); + /* All bits in the REX prefix are ignored. */ + rex_ignored = rex; + rex = (*codep & 0x80) ? 0 : REX_R; + + vex.register_specifier = (~(*codep >> 3)) & 0xf; + if (address_mode != mode_64bit + && vex.register_specifier > 0x7) + BadOp (); + + vex.length = (*codep & 0x4) ? 256 : 128; + switch ((*codep & 0x3)) + { + case 0: + vex.prefix = 0; + break; + case 1: + vex.prefix = DATA_PREFIX_OPCODE; + break; + case 2: + vex.prefix = REPE_PREFIX_OPCODE; + break; + case 3: + vex.prefix = REPNE_PREFIX_OPCODE; + break; + } + need_vex = 1; + need_vex_reg = 1; + codep++; + index = *codep++; + dp = &vex_table[dp->op[1].bytemode][index]; + /* There is no MODRM byte for VEX [82|77]. */ + if (index != 0x77 && index != 0x82) + { + FETCH_DATA (info, codep + 1); + modrm.mod = (*codep >> 6) & 3; + modrm.reg = (*codep >> 3) & 7; + modrm.rm = *codep & 7; + } + break; + + default: + abort (); + } + + if (dp->name != NULL) + return dp; + else + return get_valid_dis386 (dp, info); +} + static int print_insn (bfd_vma pc, disassemble_info *info) { @@ -3328,27 +9437,32 @@ print_insn (bfd_vma pc, disassemble_info *info) int i; char *op_txt[MAX_OPERANDS]; int needcomma; - unsigned char uses_DATA_prefix, uses_LOCK_prefix; - unsigned char uses_REPNZ_prefix, uses_REPZ_prefix; int sizeflag; const char *p; struct dis_private priv; unsigned char op; + char prefix_obuf[32]; + char *prefix_obufp; if (info->mach == bfd_mach_x86_64_intel_syntax - || info->mach == bfd_mach_x86_64) + || info->mach == bfd_mach_x86_64 + || info->mach == bfd_mach_l1om + || info->mach == bfd_mach_l1om_intel_syntax) address_mode = mode_64bit; else address_mode = mode_32bit; if (intel_syntax == (char) -1) intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax - || info->mach == bfd_mach_x86_64_intel_syntax); + || info->mach == bfd_mach_x86_64_intel_syntax + || info->mach == bfd_mach_l1om_intel_syntax); if (info->mach == bfd_mach_i386_i386 || info->mach == bfd_mach_x86_64 + || info->mach == bfd_mach_l1om || info->mach == bfd_mach_i386_i386_intel_syntax - || info->mach == bfd_mach_x86_64_intel_syntax) + || info->mach == bfd_mach_x86_64_intel_syntax + || info->mach == bfd_mach_l1om_intel_syntax) priv.orig_sizeflag = AFLAG | DFLAG; else if (info->mach == bfd_mach_i386_i8086) priv.orig_sizeflag = 0; @@ -3375,10 +9489,14 @@ print_insn (bfd_vma pc, disassemble_info *info) else if (CONST_STRNEQ (p, "intel")) { intel_syntax = 1; + if (CONST_STRNEQ (p + 5, "-mnemonic")) + intel_mnemonic = 1; } else if (CONST_STRNEQ (p, "att")) { intel_syntax = 0; + if (CONST_STRNEQ (p + 3, "-mnemonic")) + intel_mnemonic = 0; } else if (CONST_STRNEQ (p, "addr")) { @@ -3420,6 +9538,8 @@ print_insn (bfd_vma pc, disassemble_info *info) names8 = intel_names8; names8rex = intel_names8rex; names_seg = intel_names_seg; + index64 = intel_index64; + index32 = intel_index32; index16 = intel_index16; open_char = '['; close_char = ']'; @@ -3434,6 +9554,8 @@ print_insn (bfd_vma pc, disassemble_info *info) names8 = att_names8; names8rex = att_names8rex; names_seg = att_names_seg; + index64 = att_index64; + index32 = att_index32; index16 = att_index16; open_char = '('; close_char = ')'; @@ -3442,8 +9564,13 @@ print_insn (bfd_vma pc, disassemble_info *info) } /* The output looks better if we put 7 bytes on a line, since that - puts most long word instructions on a single line. */ - info->bytes_per_line = 7; + puts most long word instructions on a single line. Use 8 bytes + for Intel L1OM. */ + if (info->mach == bfd_mach_l1om + || info->mach == bfd_mach_l1om_intel_syntax) + info->bytes_per_line = 8; + else + info->bytes_per_line = 7; info->private_data = &priv; priv.max_fetched = priv.the_buffer; @@ -3511,6 +9638,7 @@ print_insn (bfd_vma pc, disassemble_info *info) } op = 0; + if (*codep == 0x0f) { unsigned char threebyte; @@ -3518,75 +9646,55 @@ print_insn (bfd_vma pc, disassemble_info *info) threebyte = *++codep; dp = &dis386_twobyte[threebyte]; need_modrm = twobyte_has_modrm[*codep]; - uses_DATA_prefix = twobyte_uses_DATA_prefix[*codep]; - uses_REPNZ_prefix = twobyte_uses_REPNZ_prefix[*codep]; - uses_REPZ_prefix = twobyte_uses_REPZ_prefix[*codep]; - uses_LOCK_prefix = (*codep & ~0x02) == 0x20; codep++; - if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE) - { - FETCH_DATA (info, codep + 2); - op = *codep++; - switch (threebyte) - { - case 0x38: - uses_DATA_prefix = threebyte_0x38_uses_DATA_prefix[op]; - uses_REPNZ_prefix = threebyte_0x38_uses_REPNZ_prefix[op]; - uses_REPZ_prefix = threebyte_0x38_uses_REPZ_prefix[op]; - break; - case 0x3a: - uses_DATA_prefix = threebyte_0x3a_uses_DATA_prefix[op]; - uses_REPNZ_prefix = threebyte_0x3a_uses_REPNZ_prefix[op]; - uses_REPZ_prefix = threebyte_0x3a_uses_REPZ_prefix[op]; - break; - default: - break; - } - } } else { dp = &dis386[*codep]; need_modrm = onebyte_has_modrm[*codep]; - uses_DATA_prefix = 0; - uses_REPNZ_prefix = 0; - /* pause is 0xf3 0x90. */ - uses_REPZ_prefix = *codep == 0x90; - uses_LOCK_prefix = 0; codep++; } - if (!uses_REPZ_prefix && (prefixes & PREFIX_REPZ)) + if ((prefixes & PREFIX_REPZ)) { - oappend ("repz "); + repz_prefix = "repz "; used_prefixes |= PREFIX_REPZ; } - if (!uses_REPNZ_prefix && (prefixes & PREFIX_REPNZ)) + else + repz_prefix = NULL; + + if ((prefixes & PREFIX_REPNZ)) { - oappend ("repnz "); + repnz_prefix = "repnz "; used_prefixes |= PREFIX_REPNZ; } + else + repnz_prefix = NULL; - if (!uses_LOCK_prefix && (prefixes & PREFIX_LOCK)) + if ((prefixes & PREFIX_LOCK)) { - oappend ("lock "); + lock_prefix = "lock "; used_prefixes |= PREFIX_LOCK; } + else + lock_prefix = NULL; + addr_prefix = NULL; if (prefixes & PREFIX_ADDR) { sizeflag ^= AFLAG; if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax) { if ((sizeflag & AFLAG) || address_mode == mode_64bit) - oappend ("addr32 "); + addr_prefix = "addr32 "; else - oappend ("addr16 "); + addr_prefix = "addr16 "; used_prefixes |= PREFIX_ADDR; } } - if (!uses_DATA_prefix && (prefixes & PREFIX_DATA)) + data_prefix = NULL; + if ((prefixes & PREFIX_DATA)) { sizeflag ^= DFLAG; if (dp->op[2].bytemode == cond_jump_mode @@ -3594,21 +9702,14 @@ print_insn (bfd_vma pc, disassemble_info *info) && !intel_syntax) { if (sizeflag & DFLAG) - oappend ("data32 "); + data_prefix = "data32 "; else - oappend ("data16 "); + data_prefix = "data16 "; used_prefixes |= PREFIX_DATA; } } - if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE) - { - dp = &three_byte_table[dp->op[1].bytemode][op]; - modrm.mod = (*codep >> 6) & 3; - modrm.reg = (*codep >> 3) & 7; - modrm.rm = *codep & 7; - } - else if (need_modrm) + if (need_modrm) { FETCH_DATA (info, codep + 1); modrm.mod = (*codep >> 6) & 3; @@ -3616,55 +9717,18 @@ print_insn (bfd_vma pc, disassemble_info *info) modrm.rm = *codep & 7; } + need_vex = 0; + need_vex_reg = 0; + vex_w_done = 0; + if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE) { dofloat (sizeflag); - } - else - { - int index; - if (dp->name == NULL) - { - switch (dp->op[0].bytemode) - { - case USE_GROUPS: - dp = &grps[dp->op[1].bytemode][modrm.reg]; - break; - - case USE_PREFIX_USER_TABLE: - index = 0; - used_prefixes |= (prefixes & PREFIX_REPZ); - if (prefixes & PREFIX_REPZ) - index = 1; - else - { - /* We should check PREFIX_REPNZ and PREFIX_REPZ - before PREFIX_DATA. */ - used_prefixes |= (prefixes & PREFIX_REPNZ); - if (prefixes & PREFIX_REPNZ) - index = 3; - else - { - used_prefixes |= (prefixes & PREFIX_DATA); - if (prefixes & PREFIX_DATA) - index = 2; - } - } - dp = &prefix_user_table[dp->op[1].bytemode][index]; - break; - - case X86_64_SPECIAL: - index = address_mode == mode_64bit ? 1 : 0; - dp = &x86_64_table[dp->op[1].bytemode][index]; - break; - - default: - oappend (INTERNAL_DISASSEMBLER_ERROR); - break; - } - } - - if (putop (dp->name, sizeflag) == 0) + } + else + { + dp = get_valid_dis386 (dp, info); + if (dp != NULL && putop (dp->name, sizeflag) == 0) { for (i = 0; i < MAX_OPERANDS; ++i) { @@ -3690,17 +9754,33 @@ print_insn (bfd_vma pc, disassemble_info *info) (*info->fprintf_func) (info->stream, "%s", name); return 1; } - if (rex & ~rex_used) + if ((rex_original & ~rex_used) || rex_ignored) { const char *name; - name = prefix_name (rex | 0x40, priv.orig_sizeflag); + name = prefix_name (rex_original, priv.orig_sizeflag); if (name == NULL) name = INTERNAL_DISASSEMBLER_ERROR; (*info->fprintf_func) (info->stream, "%s ", name); } - obufp = obuf + strlen (obuf); - for (i = strlen (obuf); i < 6; i++) + prefix_obuf[0] = 0; + prefix_obufp = prefix_obuf; + if (lock_prefix) + prefix_obufp = stpcpy (prefix_obufp, lock_prefix); + if (repz_prefix) + prefix_obufp = stpcpy (prefix_obufp, repz_prefix); + if (repnz_prefix) + prefix_obufp = stpcpy (prefix_obufp, repnz_prefix); + if (addr_prefix) + prefix_obufp = stpcpy (prefix_obufp, addr_prefix); + if (data_prefix) + prefix_obufp = stpcpy (prefix_obufp, data_prefix); + + if (prefix_obuf[0] != 0) + (*info->fprintf_func) (info->stream, "%s", prefix_obuf); + + obufp = mnemonicendp; + for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++) oappend (" "); oappend (" "); (*info->fprintf_func) (info->stream, "%s", obuf); @@ -3709,6 +9789,8 @@ print_insn (bfd_vma pc, disassemble_info *info) order as the intel book; everything else is printed in reverse order. */ if (intel_syntax || two_source_ops) { + bfd_vma riprel; + for (i = 0; i < MAX_OPERANDS; ++i) op_txt[i] = op_out[i]; @@ -3717,6 +9799,9 @@ print_insn (bfd_vma pc, disassemble_info *info) op_ad = op_index[i]; op_index[i] = op_index[MAX_OPERANDS - 1 - i]; op_index[MAX_OPERANDS - 1 - i] = op_ad; + riprel = op_riprel[i]; + op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i]; + op_riprel[MAX_OPERANDS - 1 - i] = riprel; } } else @@ -3744,61 +9829,62 @@ print_insn (bfd_vma pc, disassemble_info *info) (*info->fprintf_func) (info->stream, " # "); (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep + op_address[op_index[i]]), info); + break; } return codep - priv.the_buffer; } static const char *float_mem[] = { /* d8 */ - "fadd{s||s|}", - "fmul{s||s|}", - "fcom{s||s|}", - "fcomp{s||s|}", - "fsub{s||s|}", - "fsubr{s||s|}", - "fdiv{s||s|}", - "fdivr{s||s|}", + "fadd{s|}", + "fmul{s|}", + "fcom{s|}", + "fcomp{s|}", + "fsub{s|}", + "fsubr{s|}", + "fdiv{s|}", + "fdivr{s|}", /* d9 */ - "fld{s||s|}", + "fld{s|}", "(bad)", - "fst{s||s|}", - "fstp{s||s|}", + "fst{s|}", + "fstp{s|}", "fldenvIC", "fldcw", "fNstenvIC", "fNstcw", /* da */ - "fiadd{l||l|}", - "fimul{l||l|}", - "ficom{l||l|}", - "ficomp{l||l|}", - "fisub{l||l|}", - "fisubr{l||l|}", - "fidiv{l||l|}", - "fidivr{l||l|}", + "fiadd{l|}", + "fimul{l|}", + "ficom{l|}", + "ficomp{l|}", + "fisub{l|}", + "fisubr{l|}", + "fidiv{l|}", + "fidivr{l|}", /* db */ - "fild{l||l|}", - "fisttp{l||l|}", - "fist{l||l|}", - "fistp{l||l|}", + "fild{l|}", + "fisttp{l|}", + "fist{l|}", + "fistp{l|}", "(bad)", "fld{t||t|}", "(bad)", "fstp{t||t|}", /* dc */ - "fadd{l||l|}", - "fmul{l||l|}", - "fcom{l||l|}", - "fcomp{l||l|}", - "fsub{l||l|}", - "fsubr{l||l|}", - "fdiv{l||l|}", - "fdivr{l||l|}", + "fadd{l|}", + "fmul{l|}", + "fcom{l|}", + "fcomp{l|}", + "fsub{l|}", + "fsubr{l|}", + "fdiv{l|}", + "fdivr{l|}", /* dd */ - "fld{l||l|}", - "fisttp{ll||ll|}", - "fst{l||l|}", - "fstp{l||l|}", + "fld{l|}", + "fisttp{ll|}", + "fst{l||}", + "fstp{l|}", "frstorIC", "(bad)", "fNsaveIC", @@ -3818,9 +9904,9 @@ static const char *float_mem[] = { "fist", "fistp", "fbld", - "fild{ll||ll|}", + "fild{ll|}", "fbstp", - "fistp{ll||ll|}", + "fistp{ll|}", }; static const unsigned char float_mem_mode[] = { @@ -3962,17 +10048,10 @@ static const struct dis386 float_reg[][8] = { { "fmul", { STi, ST } }, { "(bad)", { XX } }, { "(bad)", { XX } }, -#if SYSV386_COMPAT - { "fsub", { STi, ST } }, - { "fsubr", { STi, ST } }, - { "fdiv", { STi, ST } }, - { "fdivr", { STi, ST } }, -#else - { "fsubr", { STi, ST } }, - { "fsub", { STi, ST } }, - { "fdivr", { STi, ST } }, - { "fdiv", { STi, ST } }, -#endif + { "fsub!M", { STi, ST } }, + { "fsubM", { STi, ST } }, + { "fdiv!M", { STi, ST } }, + { "fdivM", { STi, ST } }, }, /* dd */ { @@ -3991,17 +10070,10 @@ static const struct dis386 float_reg[][8] = { { "fmulp", { STi, ST } }, { "(bad)", { XX } }, { FGRPde_3 }, -#if SYSV386_COMPAT - { "fsubp", { STi, ST } }, - { "fsubrp", { STi, ST } }, - { "fdivp", { STi, ST } }, - { "fdivrp", { STi, ST } }, -#else - { "fsubrp", { STi, ST } }, - { "fsubp", { STi, ST } }, - { "fdivrp", { STi, ST } }, - { "fdivp", { STi, ST } }, -#endif + { "fsub!Mp", { STi, ST } }, + { "fsubMp", { STi, ST } }, + { "fdiv!Mp", { STi, ST } }, + { "fdivMp", { STi, ST } }, }, /* df */ { @@ -4049,8 +10121,8 @@ static char *fgrps[][8] = { /* db_4 6 */ { - "feni(287 only)","fdisi(287 only)","fNclex","fNinit", - "fNsetpm(287 only)","(bad)","(bad)","(bad)", + "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit", + "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)", }, /* de_3 7 */ @@ -4064,6 +10136,23 @@ static char *fgrps[][8] = { }, }; +static void +swap_operand (void) +{ + mnemonicendp[0] = '.'; + mnemonicendp[1] = 's'; + mnemonicendp += 2; +} + +static void +OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED, + int sizeflag ATTRIBUTE_UNUSED) +{ + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; +} + static void dofloat (int sizeflag) { @@ -4126,39 +10215,40 @@ OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) /* Capital letters in template are macros. */ static int -putop (const char *template, int sizeflag) +putop (const char *in_template, int sizeflag) { const char *p; int alt = 0; + int cond = 1; + unsigned int l = 0, len = 1; + char last[4]; + +#define SAVE_LAST(c) \ + if (l < len && l < sizeof (last)) \ + last[l++] = c; \ + else \ + abort (); - for (p = template; *p; p++) + for (p = in_template; *p; p++) { switch (*p) { default: *obufp++ = *p; break; + case '%': + len++; + break; + case '!': + cond = 0; + break; case '{': alt = 0; if (intel_syntax) - alt += 1; - if (address_mode == mode_64bit) - alt += 2; - while (alt != 0) { while (*++p != '|') - { - if (*p == '}') - { - /* Alternative not valid. */ - strcpy (obuf, "(bad)"); - obufp = obuf + 5; - return 1; - } - else if (*p == '\0') - abort (); - } - alt--; + if (*p == '}' || *p == '\0') + abort (); } /* Fall through. */ case 'I': @@ -4180,10 +10270,34 @@ putop (const char *template, int sizeflag) *obufp++ = 'b'; break; case 'B': - if (intel_syntax) - break; - if (sizeflag & SUFFIX_ALWAYS) - *obufp++ = 'b'; + if (l == 0 && len == 1) + { +case_B: + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) + *obufp++ = 'b'; + } + else + { + if (l != 1 + || len != 2 + || last[0] != 'L') + { + SAVE_LAST (*p); + break; + } + + if (address_mode == mode_64bit + && !(prefixes & PREFIX_ADDR)) + { + *obufp++ = 'a'; + *obufp++ = 'b'; + *obufp++ = 's'; + } + + goto case_B; + } break; case 'C': if (intel_syntax && !alt) @@ -4285,12 +10399,23 @@ putop (const char *template, int sizeflag) break; } /* Fall through. */ + goto case_L; case 'L': + if (l != 0 || len != 1) + { + SAVE_LAST (*p); + break; + } +case_L: if (intel_syntax) break; if (sizeflag & SUFFIX_ALWAYS) *obufp++ = 'l'; break; + case 'M': + if (intel_mnemonic != cond) + *obufp++ = 'r'; + break; case 'N': if ((prefixes & PREFIX_FWAIT) == 0) *obufp++ = 'n'; @@ -4347,22 +10472,45 @@ putop (const char *template, int sizeflag) break; } /* Fall through. */ + goto case_Q; case 'Q': - if (intel_syntax && !alt) - break; - USED_REX (REX_W); - if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS)) + if (l == 0 && len == 1) { - if (rex & REX_W) - *obufp++ = 'q'; - else +case_Q: + if (intel_syntax && !alt) + break; + USED_REX (REX_W); + if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS)) { - if (sizeflag & DFLAG) - *obufp++ = intel_syntax ? 'd' : 'l'; + if (rex & REX_W) + *obufp++ = 'q'; else - *obufp++ = 'w'; + { + if (sizeflag & DFLAG) + *obufp++ = intel_syntax ? 'd' : 'l'; + else + *obufp++ = 'w'; + } + used_prefixes |= (prefixes & PREFIX_DATA); } - used_prefixes |= (prefixes & PREFIX_DATA); + } + else + { + if (l != 1 || len != 2 || last[0] != 'L') + { + SAVE_LAST (*p); + break; + } + if (intel_syntax + || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS))) + break; + if ((rex & REX_W)) + { + USED_REX (REX_W); + *obufp++ = 'q'; + } + else + *obufp++ = 'l'; } break; case 'R': @@ -4385,78 +10533,176 @@ putop (const char *template, int sizeflag) used_prefixes |= (prefixes & PREFIX_DATA); break; case 'V': - if (intel_syntax) - break; - if (address_mode == mode_64bit && (sizeflag & DFLAG)) + if (l == 0 && len == 1) { - if (sizeflag & SUFFIX_ALWAYS) - *obufp++ = 'q'; - break; + if (intel_syntax) + break; + if (address_mode == mode_64bit && (sizeflag & DFLAG)) + { + if (sizeflag & SUFFIX_ALWAYS) + *obufp++ = 'q'; + break; + } + } + else + { + if (l != 1 + || len != 2 + || last[0] != 'L') + { + SAVE_LAST (*p); + break; + } + + if (rex & REX_W) + { + *obufp++ = 'a'; + *obufp++ = 'b'; + *obufp++ = 's'; + } } /* Fall through. */ + goto case_S; case 'S': - if (intel_syntax) - break; - if (sizeflag & SUFFIX_ALWAYS) + if (l == 0 && len == 1) { - if (rex & REX_W) - *obufp++ = 'q'; - else +case_S: + if (intel_syntax) + break; + if (sizeflag & SUFFIX_ALWAYS) { - if (sizeflag & DFLAG) - *obufp++ = 'l'; + if (rex & REX_W) + *obufp++ = 'q'; else - *obufp++ = 'w'; - used_prefixes |= (prefixes & PREFIX_DATA); + { + if (sizeflag & DFLAG) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + } + } + } + else + { + if (l != 1 + || len != 2 + || last[0] != 'L') + { + SAVE_LAST (*p); + break; + } + + if (address_mode == mode_64bit + && !(prefixes & PREFIX_ADDR)) + { + *obufp++ = 'a'; + *obufp++ = 'b'; + *obufp++ = 's'; } + + goto case_S; } break; case 'X': - if (prefixes & PREFIX_DATA) + if (l != 0 || len != 1) + { + SAVE_LAST (*p); + break; + } + if (need_vex && vex.prefix) + { + if (vex.prefix == DATA_PREFIX_OPCODE) + *obufp++ = 'd'; + else + *obufp++ = 's'; + } + else if (prefixes & PREFIX_DATA) *obufp++ = 'd'; else *obufp++ = 's'; used_prefixes |= (prefixes & PREFIX_DATA); break; case 'Y': - if (intel_syntax) - break; - if (rex & REX_W) + if (l == 0 && len == 1) { - USED_REX (REX_W); - *obufp++ = 'q'; + if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS)) + break; + if (rex & REX_W) + { + USED_REX (REX_W); + *obufp++ = 'q'; + } + break; + } + else + { + if (l != 1 || len != 2 || last[0] != 'X') + { + SAVE_LAST (*p); + break; + } + if (!need_vex) + abort (); + if (intel_syntax + || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS))) + break; + switch (vex.length) + { + case 128: + *obufp++ = 'x'; + break; + case 256: + *obufp++ = 'y'; + break; + default: + abort (); + } } break; - /* implicit operand size 'l' for i386 or 'q' for x86-64 */ case 'W': - /* operand size flag for cwtl, cbtw */ - USED_REX (REX_W); - if (rex & REX_W) + if (l == 0 && len == 1) { - if (intel_syntax) - *obufp++ = 'd'; + /* operand size flag for cwtl, cbtw */ + USED_REX (REX_W); + if (rex & REX_W) + { + if (intel_syntax) + *obufp++ = 'd'; + else + *obufp++ = 'l'; + } + else if (sizeflag & DFLAG) + *obufp++ = 'w'; else - *obufp++ = 'l'; + *obufp++ = 'b'; + if (!(rex & REX_W)) + used_prefixes |= (prefixes & PREFIX_DATA); } - else if (sizeflag & DFLAG) - *obufp++ = 'w'; else - *obufp++ = 'b'; - if (!(rex & REX_W)) - used_prefixes |= (prefixes & PREFIX_DATA); + { + if (l != 1 || len != 2 || last[0] != 'X') + { + SAVE_LAST (*p); + break; + } + if (!need_vex) + abort (); + *obufp++ = vex.w ? 'd': 's'; + } break; } alt = 0; } *obufp = 0; + mnemonicendp = obufp; return 0; } static void oappend (const char *s) { - strcpy (obufp, s); - obufp += strlen (s); + obufp = stpcpy (obufp, s); } static void @@ -4559,12 +10805,57 @@ print_operand_value (char *buf, int hex, bfd_vma disp) } } +/* Put DISP in BUF as signed hex number. */ + +static void +print_displacement (char *buf, bfd_vma disp) +{ + bfd_signed_vma val = disp; + char tmp[30]; + int i, j = 0; + + if (val < 0) + { + buf[j++] = '-'; + val = -disp; + + /* Check for possible overflow. */ + if (val < 0) + { + switch (address_mode) + { + case mode_64bit: + strcpy (buf + j, "0x8000000000000000"); + break; + case mode_32bit: + strcpy (buf + j, "0x80000000"); + break; + case mode_16bit: + strcpy (buf + j, "0x8000"); + break; + } + return; + } + } + + buf[j++] = '0'; + buf[j++] = 'x'; + + sprintf_vma (tmp, (bfd_vma) val); + for (i = 0; tmp[i] == '0'; i++) + continue; + if (tmp[i] == '\0') + i--; + strcpy (buf + j, tmp + i); +} + static void intel_operand_size (int bytemode, int sizeflag) { switch (bytemode) { case b_mode: + case b_swap_mode: case dqb_mode: oappend ("BYTE PTR "); break; @@ -4581,6 +10872,7 @@ intel_operand_size (int bytemode, int sizeflag) } /* FALLTHRU */ case v_mode: + case v_swap_mode: case dq_mode: USED_REX (REX_W); if (rex & REX_W) @@ -4598,11 +10890,20 @@ intel_operand_size (int bytemode, int sizeflag) if (!(rex & REX_W)) used_prefixes |= (prefixes & PREFIX_DATA); break; + case a_mode: + if (sizeflag & DFLAG) + oappend ("QWORD PTR "); + else + oappend ("DWORD PTR "); + used_prefixes |= (prefixes & PREFIX_DATA); + break; case d_mode: + case d_swap_mode: case dqd_mode: oappend ("DWORD PTR "); break; case q_mode: + case q_swap_mode: oappend ("QWORD PTR "); break; case m_mode: @@ -4622,103 +10923,174 @@ intel_operand_size (int bytemode, int sizeflag) oappend ("TBYTE PTR "); break; case x_mode: + case x_swap_mode: + if (need_vex) + { + switch (vex.length) + { + case 128: + oappend ("XMMWORD PTR "); + break; + case 256: + oappend ("YMMWORD PTR "); + break; + default: + abort (); + } + } + else + oappend ("XMMWORD PTR "); + break; + case xmm_mode: oappend ("XMMWORD PTR "); break; + case xmmq_mode: + if (!need_vex) + abort (); + + switch (vex.length) + { + case 128: + oappend ("QWORD PTR "); + break; + case 256: + oappend ("XMMWORD PTR "); + break; + default: + abort (); + } + break; + case ymmq_mode: + if (!need_vex) + abort (); + + switch (vex.length) + { + case 128: + oappend ("QWORD PTR "); + break; + case 256: + oappend ("YMMWORD PTR "); + break; + default: + abort (); + } + break; case o_mode: oappend ("OWORD PTR "); break; + case vex_w_dq_mode: + if (!need_vex) + abort (); + + if (vex.w) + oappend ("QWORD PTR "); + else + oappend ("DWORD PTR "); + break; default: break; } } static void -OP_E (int bytemode, int sizeflag) +OP_E_register (int bytemode, int sizeflag) { - bfd_vma disp; - int add = 0; - int riprel = 0; + int reg = modrm.rm; + const char **names; + USED_REX (REX_B); - if (rex & REX_B) - add += 8; + if ((rex & REX_B)) + reg += 8; - /* Skip mod/rm byte. */ - MODRM_CHECK; - codep++; + if ((sizeflag & SUFFIX_ALWAYS) + && (bytemode == b_swap_mode || bytemode == v_swap_mode)) + swap_operand (); - if (modrm.mod == 3) + switch (bytemode) { - switch (bytemode) - { - case b_mode: - USED_REX (0); - if (rex) - oappend (names8rex[modrm.rm + add]); - else - oappend (names8[modrm.rm + add]); - break; - case w_mode: - oappend (names16[modrm.rm + add]); - break; - case d_mode: - oappend (names32[modrm.rm + add]); - break; - case q_mode: - oappend (names64[modrm.rm + add]); - break; - case m_mode: - if (address_mode == mode_64bit) - oappend (names64[modrm.rm + add]); - else - oappend (names32[modrm.rm + add]); - break; - case stack_v_mode: - if (address_mode == mode_64bit && (sizeflag & DFLAG)) - { - oappend (names64[modrm.rm + add]); - used_prefixes |= (prefixes & PREFIX_DATA); - break; - } - bytemode = v_mode; - /* FALLTHRU */ - case v_mode: - case dq_mode: - case dqb_mode: - case dqd_mode: - case dqw_mode: - USED_REX (REX_W); - if (rex & REX_W) - oappend (names64[modrm.rm + add]); - else if ((sizeflag & DFLAG) || bytemode != v_mode) - oappend (names32[modrm.rm + add]); - else - oappend (names16[modrm.rm + add]); + case b_mode: + case b_swap_mode: + USED_REX (0); + if (rex) + names = names8rex; + else + names = names8; + break; + case w_mode: + names = names16; + break; + case d_mode: + names = names32; + break; + case q_mode: + names = names64; + break; + case m_mode: + names = address_mode == mode_64bit ? names64 : names32; + break; + case stack_v_mode: + if (address_mode == mode_64bit && (sizeflag & DFLAG)) + { + names = names64; used_prefixes |= (prefixes & PREFIX_DATA); break; - case 0: - break; - default: - oappend (INTERNAL_DISASSEMBLER_ERROR); - break; } + bytemode = v_mode; + /* FALLTHRU */ + case v_mode: + case v_swap_mode: + case dq_mode: + case dqb_mode: + case dqd_mode: + case dqw_mode: + USED_REX (REX_W); + if (rex & REX_W) + names = names64; + else if ((sizeflag & DFLAG) + || (bytemode != v_mode + && bytemode != v_swap_mode)) + names = names32; + else + names = names16; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + case 0: + return; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); return; } + oappend (names[reg]); +} + +static void +OP_E_memory (int bytemode, int sizeflag) +{ + bfd_vma disp = 0; + int add = (rex & REX_B) ? 8 : 0; + int riprel = 0; - disp = 0; + USED_REX (REX_B); if (intel_syntax) intel_operand_size (bytemode, sizeflag); append_seg (); - if ((sizeflag & AFLAG) || address_mode == mode_64bit) /* 32 bit address mode */ + if ((sizeflag & AFLAG) || address_mode == mode_64bit) { + /* 32/64 bit address mode */ + int havedisp; int havesib; int havebase; - int base; + int haveindex; + int needindex; + int base, rbase; int index = 0; int scale = 0; havesib = 0; havebase = 1; + haveindex = 0; base = modrm.rm; if (base == 4) @@ -4726,21 +11098,20 @@ OP_E (int bytemode, int sizeflag) havesib = 1; FETCH_DATA (the_info, codep + 1); index = (*codep >> 3) & 7; - if (address_mode == mode_64bit || index != 0x4) - /* When INDEX == 0x4 in 32 bit mode, SCALE is ignored. */ - scale = (*codep >> 6) & 3; + scale = (*codep >> 6) & 3; base = *codep & 7; USED_REX (REX_X); if (rex & REX_X) index += 8; + haveindex = index != 4; codep++; } - base += add; + rbase = base + add; switch (modrm.mod) { case 0: - if ((base & 7) == 5) + if (base == 5) { havebase = 0; if (address_mode == mode_64bit && !havesib) @@ -4759,62 +11130,94 @@ OP_E (int bytemode, int sizeflag) break; } + /* In 32bit mode, we need index register to tell [offset] from + [eiz*1 + offset]. */ + needindex = (havesib + && !havebase + && !haveindex + && address_mode == mode_32bit); + havedisp = (havebase + || needindex + || (havesib && (haveindex || scale != 0))); + if (!intel_syntax) - if (modrm.mod != 0 || (base & 7) == 5) + if (modrm.mod != 0 || base == 5) { - print_operand_value (scratchbuf, !riprel, disp); + if (havedisp || riprel) + print_displacement (scratchbuf, disp); + else + print_operand_value (scratchbuf, 1, disp); oappend (scratchbuf); if (riprel) { set_op (disp, 1); - oappend ("(%rip)"); + oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)"); } } - if (havebase || (havesib && (index != 4 || scale != 0))) + if (havebase || haveindex || riprel) + used_prefixes |= PREFIX_ADDR; + + if (havedisp || (intel_syntax && riprel)) { *obufp++ = open_char; if (intel_syntax && riprel) - oappend ("rip + "); + { + set_op (disp, 1); + oappend (sizeflag & AFLAG ? "rip" : "eip"); + } *obufp = '\0'; if (havebase) oappend (address_mode == mode_64bit && (sizeflag & AFLAG) - ? names64[base] : names32[base]); + ? names64[rbase] : names32[rbase]); if (havesib) { - if (index != 4) + /* ESP/RSP won't allow index. If base isn't ESP/RSP, + print index to tell base + index from base. */ + if (scale != 0 + || needindex + || haveindex + || (havebase && base != ESP_REG_NUM)) { if (!intel_syntax || havebase) { *obufp++ = separator_char; *obufp = '\0'; } - oappend (address_mode == mode_64bit && (sizeflag & AFLAG) - ? names64[index] : names32[index]); - } - if (scale != 0 || (!intel_syntax && index != 4)) - { + if (haveindex) + oappend (address_mode == mode_64bit + && (sizeflag & AFLAG) + ? names64[index] : names32[index]); + else + oappend (address_mode == mode_64bit + && (sizeflag & AFLAG) + ? index64 : index32); + *obufp++ = scale_char; *obufp = '\0'; sprintf (scratchbuf, "%d", 1 << scale); oappend (scratchbuf); } } - if (intel_syntax && disp) + if (intel_syntax + && (disp || modrm.mod != 0 || base == 5)) { - if ((bfd_signed_vma) disp > 0) + if (!havedisp || (bfd_signed_vma) disp >= 0) { *obufp++ = '+'; *obufp = '\0'; } - else if (modrm.mod != 1) + else if (modrm.mod != 1 && disp != -disp) { *obufp++ = '-'; *obufp = '\0'; disp = - (bfd_signed_vma) disp; } - print_operand_value (scratchbuf, modrm.mod != 1, disp); + if (havedisp) + print_displacement (scratchbuf, disp); + else + print_operand_value (scratchbuf, 1, disp); oappend (scratchbuf); } @@ -4823,7 +11226,7 @@ OP_E (int bytemode, int sizeflag) } else if (intel_syntax) { - if (modrm.mod != 0 || (base & 7) == 5) + if (modrm.mod != 0 || base == 5) { if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES | PREFIX_FS | PREFIX_GS)) @@ -4866,7 +11269,7 @@ OP_E (int bytemode, int sizeflag) if (!intel_syntax) if (modrm.mod != 0 || modrm.rm == 6) { - print_operand_value (scratchbuf, 0, disp); + print_displacement (scratchbuf, disp); oappend (scratchbuf); } @@ -4875,9 +11278,10 @@ OP_E (int bytemode, int sizeflag) *obufp++ = open_char; *obufp = '\0'; oappend (index16[modrm.rm]); - if (intel_syntax && disp) + if (intel_syntax + && (disp || modrm.mod != 0 || modrm.rm == 6)) { - if ((bfd_signed_vma) disp > 0) + if ((bfd_signed_vma) disp >= 0) { *obufp++ = '+'; *obufp = '\0'; @@ -4889,7 +11293,7 @@ OP_E (int bytemode, int sizeflag) disp = - (bfd_signed_vma) disp; } - print_operand_value (scratchbuf, modrm.mod != 1, disp); + print_displacement (scratchbuf, disp); oappend (scratchbuf); } @@ -4912,6 +11316,26 @@ OP_E (int bytemode, int sizeflag) } } +static void +OP_E_extended (int bytemode, int sizeflag) +{ + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + + if (modrm.mod == 3) + OP_E_register (bytemode, sizeflag); + else + OP_E_memory (bytemode, sizeflag); +} + +static void +OP_E (int bytemode, int sizeflag) +{ + OP_E_extended (bytemode, sizeflag); +} + + static void OP_G (int bytemode, int sizeflag) { @@ -5049,10 +11473,12 @@ static void OP_REG (int code, int sizeflag) { const char *s; - int add = 0; + int add; USED_REX (REX_B); if (rex & REX_B) add = 8; + else + add = 0; switch (code) { @@ -5525,7 +11951,7 @@ OP_DSreg (int code, int sizeflag) static void OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) { - int add = 0; + int add; if (rex & REX_R) { USED_REX (REX_R); @@ -5533,9 +11959,12 @@ OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) } else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK)) { + lock_prefix = NULL; used_prefixes |= PREFIX_LOCK; add = 8; } + else + add = 0; sprintf (scratchbuf, "%%cr%d", modrm.reg + add); oappend (scratchbuf + intel_syntax); } @@ -5543,10 +11972,12 @@ OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) static void OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) { - int add = 0; + int add; USED_REX (REX_R); if (rex & REX_R) add = 8; + else + add = 0; if (intel_syntax) sprintf (scratchbuf, "db%d", modrm.reg + add); else @@ -5576,10 +12007,12 @@ OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) used_prefixes |= (prefixes & PREFIX_DATA); if (prefixes & PREFIX_DATA) { - int add = 0; + int add; USED_REX (REX_R); if (rex & REX_R) add = 8; + else + add = 0; sprintf (scratchbuf, "%%xmm%d", modrm.reg + add); } else @@ -5588,13 +12021,30 @@ OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) } static void -OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) +OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED) { - int add = 0; + int add; USED_REX (REX_R); if (rex & REX_R) add = 8; - sprintf (scratchbuf, "%%xmm%d", modrm.reg + add); + else + add = 0; + if (need_vex && bytemode != xmm_mode) + { + switch (vex.length) + { + case 128: + sprintf (scratchbuf, "%%xmm%d", modrm.reg + add); + break; + case 256: + sprintf (scratchbuf, "%%ymm%d", modrm.reg + add); + break; + default: + abort (); + } + } + else + sprintf (scratchbuf, "%%xmm%d", modrm.reg + add); oappend (scratchbuf + intel_syntax); } @@ -5603,7 +12053,8 @@ OP_EM (int bytemode, int sizeflag) { if (modrm.mod != 3) { - if (intel_syntax && bytemode == v_mode) + if (intel_syntax + && (bytemode == v_mode || bytemode == v_swap_mode)) { bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode; used_prefixes |= (prefixes & PREFIX_DATA); @@ -5612,17 +12063,22 @@ OP_EM (int bytemode, int sizeflag) return; } + if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode) + swap_operand (); + /* Skip mod/rm byte. */ MODRM_CHECK; codep++; used_prefixes |= (prefixes & PREFIX_DATA); if (prefixes & PREFIX_DATA) { - int add = 0; + int add; USED_REX (REX_B); if (rex & REX_B) add = 8; + else + add = 0; sprintf (scratchbuf, "%%xmm%d", modrm.rm + add); } else @@ -5668,31 +12124,48 @@ OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) static void OP_EX (int bytemode, int sizeflag) { - int add = 0; + int add; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + if (modrm.mod != 3) { - if (intel_syntax && bytemode == v_mode) - { - switch (prefixes & (PREFIX_DATA|PREFIX_REPZ|PREFIX_REPNZ)) - { - case 0: bytemode = x_mode; break; - case PREFIX_REPZ: bytemode = d_mode; used_prefixes |= PREFIX_REPZ; break; - case PREFIX_DATA: bytemode = x_mode; used_prefixes |= PREFIX_DATA; break; - case PREFIX_REPNZ: bytemode = q_mode; used_prefixes |= PREFIX_REPNZ; break; - default: bytemode = 0; break; - } - } - OP_E (bytemode, sizeflag); + OP_E_memory (bytemode, sizeflag); return; } + USED_REX (REX_B); if (rex & REX_B) add = 8; + else + add = 0; - /* Skip mod/rm byte. */ - MODRM_CHECK; - codep++; - sprintf (scratchbuf, "%%xmm%d", modrm.rm + add); + if ((sizeflag & SUFFIX_ALWAYS) + && (bytemode == x_swap_mode + || bytemode == d_swap_mode + || bytemode == q_swap_mode)) + swap_operand (); + + if (need_vex + && bytemode != xmm_mode + && bytemode != xmmq_mode) + { + switch (vex.length) + { + case 128: + sprintf (scratchbuf, "%%xmm%d", modrm.rm + add); + break; + case 256: + sprintf (scratchbuf, "%%ymm%d", modrm.rm + add); + break; + default: + abort (); + } + } + else + sprintf (scratchbuf, "%%xmm%d", modrm.rm + add); oappend (scratchbuf + intel_syntax); } @@ -5733,29 +12206,6 @@ OP_0f07 (int bytemode, int sizeflag) OP_E (bytemode, sizeflag); } -static void -OP_0fae (int bytemode, int sizeflag) -{ - if (modrm.mod == 3) - { - if (modrm.reg == 7) - strcpy (obuf + strlen (obuf) - sizeof ("clflush") + 1, "sfence"); - - if (modrm.reg < 5 || modrm.rm != 0) - { - BadOp (); /* bad sfence, mfence, or lfence */ - return; - } - } - else if (modrm.reg != 7) - { - BadOp (); /* bad clflush */ - return; - } - - OP_E (bytemode, sizeflag); -} - /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in 32bit mode and "xchg %rax,%rax" in 64bit mode. */ @@ -5827,7 +12277,7 @@ static const char *const Suffix3DNow[] = { /* A8 */ NULL, NULL, "pfsubr", NULL, /* AC */ NULL, NULL, "pfacc", NULL, /* B0 */ "pfcmpeq", NULL, NULL, NULL, -/* B4 */ "pfmul", NULL, "pfrcpit2", "pfmulhrw", +/* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw", /* B8 */ NULL, NULL, NULL, "pswapd", /* BC */ NULL, NULL, NULL, "pavgusb", /* C0 */ NULL, NULL, NULL, NULL, @@ -5857,7 +12307,7 @@ OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) /* AMD 3DNow! instructions are specified by an opcode suffix in the place where an 8-bit immediate would normally go. ie. the last byte of the instruction. */ - obufp = obuf + strlen (obuf); + obufp = mnemonicendp; mnemonic = Suffix3DNow[*codep++ & 0xff]; if (mnemonic) oappend (mnemonic); @@ -5871,379 +12321,682 @@ OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) op_out[1][0] = '\0'; BadOp (); } + mnemonicendp = obufp; } -static const char *simd_cmp_op[] = { - "eq", - "lt", - "le", - "unord", - "neq", - "nlt", - "nle", - "ord" +static struct op simd_cmp_op[] = +{ + { STRING_COMMA_LEN ("eq") }, + { STRING_COMMA_LEN ("lt") }, + { STRING_COMMA_LEN ("le") }, + { STRING_COMMA_LEN ("unord") }, + { STRING_COMMA_LEN ("neq") }, + { STRING_COMMA_LEN ("nlt") }, + { STRING_COMMA_LEN ("nle") }, + { STRING_COMMA_LEN ("ord") } }; static void -OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) +CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) { unsigned int cmp_type; FETCH_DATA (the_info, codep + 1); - obufp = obuf + strlen (obuf); cmp_type = *codep++ & 0xff; - if (cmp_type < 8) + if (cmp_type < ARRAY_SIZE (simd_cmp_op)) + { + char suffix [3]; + char *p = mnemonicendp - 2; + suffix[0] = p[0]; + suffix[1] = p[1]; + suffix[2] = '\0'; + sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix); + mnemonicendp += simd_cmp_op[cmp_type].len; + } + else + { + /* We have a reserved extension byte. Output it directly. */ + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, cmp_type); + oappend (scratchbuf + intel_syntax); + scratchbuf[0] = '\0'; + } +} + +static void +OP_Mwait (int bytemode ATTRIBUTE_UNUSED, + int sizeflag ATTRIBUTE_UNUSED) +{ + /* mwait %eax,%ecx */ + if (!intel_syntax) + { + const char **names = (address_mode == mode_64bit + ? names64 : names32); + strcpy (op_out[0], names[0]); + strcpy (op_out[1], names[1]); + two_source_ops = 1; + } + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; +} + +static void +OP_Monitor (int bytemode ATTRIBUTE_UNUSED, + int sizeflag ATTRIBUTE_UNUSED) +{ + /* monitor %eax,%ecx,%edx" */ + if (!intel_syntax) + { + const char **op1_names; + const char **names = (address_mode == mode_64bit + ? names64 : names32); + + if (!(prefixes & PREFIX_ADDR)) + op1_names = (address_mode == mode_16bit + ? names16 : names); + else + { + /* Remove "addr16/addr32". */ + addr_prefix = NULL; + op1_names = (address_mode != mode_32bit + ? names32 : names16); + used_prefixes |= PREFIX_ADDR; + } + strcpy (op_out[0], op1_names[0]); + strcpy (op_out[1], names[1]); + strcpy (op_out[2], names[2]); + two_source_ops = 1; + } + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; +} + +static void +BadOp (void) +{ + /* Throw away prefixes and 1st. opcode byte. */ + codep = insn_codep + 1; + oappend ("(bad)"); +} + +static void +REP_Fixup (int bytemode, int sizeflag) +{ + /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs, + lods and stos. */ + if (prefixes & PREFIX_REPZ) + repz_prefix = "rep "; + + switch (bytemode) + { + case al_reg: + case eAX_reg: + case indir_dx_reg: + OP_IMREG (bytemode, sizeflag); + break; + case eDI_reg: + OP_ESreg (bytemode, sizeflag); + break; + case eSI_reg: + OP_DSreg (bytemode, sizeflag); + break; + default: + abort (); + break; + } +} + +static void +CMPXCHG8B_Fixup (int bytemode, int sizeflag) +{ + USED_REX (REX_W); + if (rex & REX_W) + { + /* Change cmpxchg8b to cmpxchg16b. */ + char *p = mnemonicendp - 2; + mnemonicendp = stpcpy (p, "16b"); + bytemode = o_mode; + } + OP_M (bytemode, sizeflag); +} + +static void +XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED) +{ + if (need_vex) + { + switch (vex.length) + { + case 128: + sprintf (scratchbuf, "%%xmm%d", reg); + break; + case 256: + sprintf (scratchbuf, "%%ymm%d", reg); + break; + default: + abort (); + } + } + else + sprintf (scratchbuf, "%%xmm%d", reg); + oappend (scratchbuf + intel_syntax); +} + +static void +CRC32_Fixup (int bytemode, int sizeflag) +{ + /* Add proper suffix to "crc32". */ + char *p = mnemonicendp; + + switch (bytemode) + { + case b_mode: + if (intel_syntax) + goto skip; + + *p++ = 'b'; + break; + case v_mode: + if (intel_syntax) + goto skip; + + USED_REX (REX_W); + if (rex & REX_W) + *p++ = 'q'; + else if (sizeflag & DFLAG) + *p++ = 'l'; + else + *p++ = 'w'; + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } + mnemonicendp = p; + *p = '\0'; + +skip: + if (modrm.mod == 3) { - char suffix1 = 'p', suffix2 = 's'; - used_prefixes |= (prefixes & PREFIX_REPZ); - if (prefixes & PREFIX_REPZ) - suffix1 = 's'; + int add; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + + USED_REX (REX_B); + add = (rex & REX_B) ? 8 : 0; + if (bytemode == b_mode) + { + USED_REX (0); + if (rex) + oappend (names8rex[modrm.rm + add]); + else + oappend (names8[modrm.rm + add]); + } else { - used_prefixes |= (prefixes & PREFIX_DATA); - if (prefixes & PREFIX_DATA) - suffix2 = 'd'; + USED_REX (REX_W); + if (rex & REX_W) + oappend (names64[modrm.rm + add]); + else if ((prefixes & PREFIX_DATA)) + oappend (names16[modrm.rm + add]); else - { - used_prefixes |= (prefixes & PREFIX_REPNZ); - if (prefixes & PREFIX_REPNZ) - suffix1 = 's', suffix2 = 'd'; - } + oappend (names32[modrm.rm + add]); } - sprintf (scratchbuf, "cmp%s%c%c", - simd_cmp_op[cmp_type], suffix1, suffix2); - used_prefixes |= (prefixes & PREFIX_REPZ); - oappend (scratchbuf); } else - { - /* We have a bad extension byte. Clean up. */ - op_out[0][0] = '\0'; - op_out[1][0] = '\0'; - BadOp (); - } + OP_E (bytemode, sizeflag); } +/* Display the destination register operand for instructions with + VEX. */ + static void -SIMD_Fixup (int extrachar, int sizeflag ATTRIBUTE_UNUSED) +OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED) { - /* Change movlps/movhps to movhlps/movlhps for 2 register operand - forms of these instructions. */ - if (modrm.mod == 3) + if (!need_vex) + abort (); + + if (!need_vex_reg) + return; + + switch (vex.length) { - char *p = obuf + strlen (obuf); - *(p + 1) = '\0'; - *p = *(p - 1); - *(p - 1) = *(p - 2); - *(p - 2) = *(p - 3); - *(p - 3) = extrachar; + case 128: + switch (bytemode) + { + case vex_mode: + case vex128_mode: + break; + default: + abort (); + return; + } + + sprintf (scratchbuf, "%%xmm%d", vex.register_specifier); + break; + case 256: + switch (bytemode) + { + case vex_mode: + case vex256_mode: + break; + default: + abort (); + return; + } + + sprintf (scratchbuf, "%%ymm%d", vex.register_specifier); + break; + default: + abort (); + break; } + oappend (scratchbuf + intel_syntax); } -static void -PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag) +/* Get the VEX immediate byte without moving codep. */ + +static unsigned char +get_vex_imm8 (int sizeflag) { - if (modrm.mod == 3 && modrm.reg == 1 && modrm.rm <= 1) - { - /* Override "sidt". */ - size_t olen = strlen (obuf); - char *p = obuf + olen - 4; - const char **names = (address_mode == mode_64bit - ? names64 : names32); + int bytes_before_imm = 0; + + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; - /* We might have a suffix when disassembling with -Msuffix. */ - if (*p == 'i') - --p; - - /* Remove "addr16/addr32" if we aren't in Intel mode. */ - if (!intel_syntax - && (prefixes & PREFIX_ADDR) - && olen >= (4 + 7) - && *(p - 1) == ' ' - && CONST_STRNEQ (p - 7, "addr") - && (CONST_STRNEQ (p - 3, "16") - || CONST_STRNEQ (p - 3, "32"))) - p -= 7; - - if (modrm.rm) + if (modrm.mod != 3) + { + /* There are SIB/displacement bytes. */ + if ((sizeflag & AFLAG) || address_mode == mode_64bit) { - /* mwait %eax,%ecx */ - strcpy (p, "mwait"); - if (!intel_syntax) - strcpy (op_out[0], names[0]); + /* 32/64 bit address mode */ + int base = modrm.rm; + + /* Check SIB byte. */ + if (base == 4) + { + FETCH_DATA (the_info, codep + 1); + base = *codep & 7; + bytes_before_imm++; + } + + switch (modrm.mod) + { + case 0: + /* When modrm.rm == 5 or modrm.rm == 4 and base in + SIB == 5, there is a 4 byte displacement. */ + if (base != 5) + /* No displacement. */ + break; + case 2: + /* 4 byte displacement. */ + bytes_before_imm += 4; + break; + case 1: + /* 1 byte displacement. */ + bytes_before_imm++; + break; + } } else - { - /* monitor %eax,%ecx,%edx" */ - strcpy (p, "monitor"); - if (!intel_syntax) + { /* 16 bit address mode */ + switch (modrm.mod) { - const char **op1_names; - if (!(prefixes & PREFIX_ADDR)) - op1_names = (address_mode == mode_16bit - ? names16 : names); - else - { - op1_names = (address_mode != mode_32bit - ? names32 : names16); - used_prefixes |= PREFIX_ADDR; - } - strcpy (op_out[0], op1_names[0]); - strcpy (op_out[2], names[2]); + case 0: + /* When modrm.rm == 6, there is a 2 byte displacement. */ + if (modrm.rm != 6) + /* No displacement. */ + break; + case 2: + /* 2 byte displacement. */ + bytes_before_imm += 2; + break; + case 1: + /* 1 byte displacement. */ + bytes_before_imm++; + break; } } - if (!intel_syntax) - { - strcpy (op_out[1], names[1]); - two_source_ops = 1; - } - - codep++; } - else - OP_M (0, sizeflag); + + FETCH_DATA (the_info, codep + bytes_before_imm + 1); + return codep [bytes_before_imm]; } static void -SVME_Fixup (int bytemode, int sizeflag) +OP_EX_VexReg (int bytemode, int sizeflag, int reg) { - const char *alt; - char *p; + if (reg == -1 && modrm.mod != 3) + { + OP_E_memory (bytemode, sizeflag); + return; + } + else + { + if (reg == -1) + { + reg = modrm.rm; + USED_REX (REX_B); + if (rex & REX_B) + reg += 8; + } + else if (reg > 7 && address_mode != mode_64bit) + BadOp (); + } - switch (*codep) + switch (vex.length) { - case 0xd8: - alt = "vmrun"; + case 128: + sprintf (scratchbuf, "%%xmm%d", reg); break; - case 0xd9: - alt = "vmmcall"; - break; - case 0xda: - alt = "vmload"; - break; - case 0xdb: - alt = "vmsave"; - break; - case 0xdc: - alt = "stgi"; - break; - case 0xdd: - alt = "clgi"; - break; - case 0xde: - alt = "skinit"; - break; - case 0xdf: - alt = "invlpga"; + case 256: + sprintf (scratchbuf, "%%ymm%d", reg); break; default: - OP_M (bytemode, sizeflag); - return; + abort (); } - /* Override "lidt". */ - p = obuf + strlen (obuf) - 4; - /* We might have a suffix. */ - if (*p == 'i') - --p; - strcpy (p, alt); - if (!(prefixes & PREFIX_ADDR)) + oappend (scratchbuf + intel_syntax); +} + +static void +OP_EX_VexW (int bytemode, int sizeflag) +{ + int reg = -1; + + if (!vex_w_done) { - ++codep; - return; + vex_w_done = 1; + if (vex.w) + reg = vex.register_specifier; } - used_prefixes |= PREFIX_ADDR; - switch (*codep++) + else { - case 0xdf: - strcpy (op_out[1], names32[1]); - two_source_ops = 1; - /* Fall through. */ - case 0xd8: - case 0xda: - case 0xdb: - *obufp++ = open_char; - if (address_mode == mode_64bit || (sizeflag & AFLAG)) - alt = names32[0]; - else - alt = names16[0]; - strcpy (obufp, alt); - obufp += strlen (alt); - *obufp++ = close_char; - *obufp = '\0'; - break; + if (!vex.w) + reg = vex.register_specifier; } + + OP_EX_VexReg (bytemode, sizeflag, reg); } static void -INVLPG_Fixup (int bytemode, int sizeflag) +OP_VEX_FMA (int bytemode, int sizeflag) { - const char *alt; + int reg = get_vex_imm8 (sizeflag) >> 4; + + if (reg > 7 && address_mode != mode_64bit) + BadOp (); - switch (*codep) + switch (vex.length) { - case 0xf8: - alt = "swapgs"; + case 128: + switch (bytemode) + { + case vex_mode: + case vex128_mode: + break; + default: + abort (); + return; + } + + sprintf (scratchbuf, "%%xmm%d", reg); break; - case 0xf9: - alt = "rdtscp"; + case 256: + switch (bytemode) + { + case vex_mode: + break; + default: + abort (); + return; + } + + sprintf (scratchbuf, "%%ymm%d", reg); break; default: - OP_M (bytemode, sizeflag); - return; + abort (); } - /* Override "invlpg". */ - strcpy (obuf + strlen (obuf) - 6, alt); - codep++; + oappend (scratchbuf + intel_syntax); } static void -BadOp (void) +VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED, + int sizeflag ATTRIBUTE_UNUSED) { - /* Throw away prefixes and 1st. opcode byte. */ - codep = insn_codep + 1; - oappend ("(bad)"); + /* Skip the immediate byte and check for invalid bits. */ + FETCH_DATA (the_info, codep + 1); + if (*codep++ & 0xf) + BadOp (); } static void -VMX_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag) +OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED) { - if (modrm.mod == 3 - && modrm.reg == 0 - && modrm.rm >=1 - && modrm.rm <= 4) - { - /* Override "sgdt". */ - char *p = obuf + strlen (obuf) - 4; + int reg; + FETCH_DATA (the_info, codep + 1); + reg = *codep++; - /* We might have a suffix when disassembling with -Msuffix. */ - if (*p == 'g') - --p; + if (bytemode != x_mode) + abort (); - switch (modrm.rm) - { - case 1: - strcpy (p, "vmcall"); - break; - case 2: - strcpy (p, "vmlaunch"); - break; - case 3: - strcpy (p, "vmresume"); - break; - case 4: - strcpy (p, "vmxoff"); - break; - } + if (reg & 0xf) + BadOp (); - codep++; + reg >>= 4; + if (reg > 7 && address_mode != mode_64bit) + BadOp (); + + switch (vex.length) + { + case 128: + sprintf (scratchbuf, "%%xmm%d", reg); + break; + case 256: + sprintf (scratchbuf, "%%ymm%d", reg); + break; + default: + abort (); } - else - OP_E (0, sizeflag); + oappend (scratchbuf + intel_syntax); } static void -OP_VMX (int bytemode, int sizeflag) +OP_XMM_VexW (int bytemode, int sizeflag) { - used_prefixes |= (prefixes & (PREFIX_DATA | PREFIX_REPZ)); - if (prefixes & PREFIX_DATA) - strcpy (obuf, "vmclear"); - else if (prefixes & PREFIX_REPZ) - strcpy (obuf, "vmxon"); - else - strcpy (obuf, "vmptrld"); - OP_E (bytemode, sizeflag); + /* Turn off the REX.W bit since it is used for swapping operands + now. */ + rex &= ~REX_W; + OP_XMM (bytemode, sizeflag); } static void -REP_Fixup (int bytemode, int sizeflag) +OP_EX_Vex (int bytemode, int sizeflag) { - /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs, - lods and stos. */ - size_t ilen = 0; - - if (prefixes & PREFIX_REPZ) - switch (*insn_codep) - { - case 0x6e: /* outsb */ - case 0x6f: /* outsw/outsl */ - case 0xa4: /* movsb */ - case 0xa5: /* movsw/movsl/movsq */ - if (!intel_syntax) - ilen = 5; - else - ilen = 4; - break; - case 0xaa: /* stosb */ - case 0xab: /* stosw/stosl/stosq */ - case 0xac: /* lodsb */ - case 0xad: /* lodsw/lodsl/lodsq */ - if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS)) - ilen = 5; - else - ilen = 4; - break; - case 0x6c: /* insb */ - case 0x6d: /* insl/insw */ - if (!intel_syntax) - ilen = 4; - else - ilen = 3; - break; - default: - abort (); - break; - } - - if (ilen != 0) + if (modrm.mod != 3) { - size_t olen; - char *p; - - olen = strlen (obuf); - p = obuf + olen - ilen - 1 - 4; - /* Handle "repz [addr16|addr32]". */ - if ((prefixes & PREFIX_ADDR)) - p -= 1 + 6; + if (vex.register_specifier != 0) + BadOp (); + need_vex_reg = 0; + } + OP_EX (bytemode, sizeflag); +} - memmove (p + 3, p + 4, olen - (p + 3 - obuf)); +static void +OP_XMM_Vex (int bytemode, int sizeflag) +{ + if (modrm.mod != 3) + { + if (vex.register_specifier != 0) + BadOp (); + need_vex_reg = 0; } + OP_XMM (bytemode, sizeflag); +} - switch (bytemode) +static void +VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) +{ + switch (vex.length) { - case al_reg: - case eAX_reg: - case indir_dx_reg: - OP_IMREG (bytemode, sizeflag); - break; - case eDI_reg: - OP_ESreg (bytemode, sizeflag); + case 128: + mnemonicendp = stpcpy (obuf, "vzeroupper"); break; - case eSI_reg: - OP_DSreg (bytemode, sizeflag); + case 256: + mnemonicendp = stpcpy (obuf, "vzeroall"); break; default: abort (); - break; } } +static struct op vex_cmp_op[] = +{ + { STRING_COMMA_LEN ("eq") }, + { STRING_COMMA_LEN ("lt") }, + { STRING_COMMA_LEN ("le") }, + { STRING_COMMA_LEN ("unord") }, + { STRING_COMMA_LEN ("neq") }, + { STRING_COMMA_LEN ("nlt") }, + { STRING_COMMA_LEN ("nle") }, + { STRING_COMMA_LEN ("ord") }, + { STRING_COMMA_LEN ("eq_uq") }, + { STRING_COMMA_LEN ("nge") }, + { STRING_COMMA_LEN ("ngt") }, + { STRING_COMMA_LEN ("false") }, + { STRING_COMMA_LEN ("neq_oq") }, + { STRING_COMMA_LEN ("ge") }, + { STRING_COMMA_LEN ("gt") }, + { STRING_COMMA_LEN ("true") }, + { STRING_COMMA_LEN ("eq_os") }, + { STRING_COMMA_LEN ("lt_oq") }, + { STRING_COMMA_LEN ("le_oq") }, + { STRING_COMMA_LEN ("unord_s") }, + { STRING_COMMA_LEN ("neq_us") }, + { STRING_COMMA_LEN ("nlt_uq") }, + { STRING_COMMA_LEN ("nle_uq") }, + { STRING_COMMA_LEN ("ord_s") }, + { STRING_COMMA_LEN ("eq_us") }, + { STRING_COMMA_LEN ("nge_uq") }, + { STRING_COMMA_LEN ("ngt_uq") }, + { STRING_COMMA_LEN ("false_os") }, + { STRING_COMMA_LEN ("neq_os") }, + { STRING_COMMA_LEN ("ge_oq") }, + { STRING_COMMA_LEN ("gt_oq") }, + { STRING_COMMA_LEN ("true_us") }, +}; + static void -CMPXCHG8B_Fixup (int bytemode, int sizeflag) +VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) { - USED_REX (REX_W); - if (rex & REX_W) + unsigned int cmp_type; + + FETCH_DATA (the_info, codep + 1); + cmp_type = *codep++ & 0xff; + if (cmp_type < ARRAY_SIZE (vex_cmp_op)) { - /* Change cmpxchg8b to cmpxchg16b. */ - char *p = obuf + strlen (obuf) - 2; - strcpy (p, "16b"); - bytemode = o_mode; + char suffix [3]; + char *p = mnemonicendp - 2; + suffix[0] = p[0]; + suffix[1] = p[1]; + suffix[2] = '\0'; + sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix); + mnemonicendp += vex_cmp_op[cmp_type].len; + } + else + { + /* We have a reserved extension byte. Output it directly. */ + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, cmp_type); + oappend (scratchbuf + intel_syntax); + scratchbuf[0] = '\0'; } - OP_M (bytemode, sizeflag); } +static const struct op pclmul_op[] = +{ + { STRING_COMMA_LEN ("lql") }, + { STRING_COMMA_LEN ("hql") }, + { STRING_COMMA_LEN ("lqh") }, + { STRING_COMMA_LEN ("hqh") } +}; + static void -XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED) +PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED, + int sizeflag ATTRIBUTE_UNUSED) { - sprintf (scratchbuf, "%%xmm%d", reg); - oappend (scratchbuf + intel_syntax); + unsigned int pclmul_type; + + FETCH_DATA (the_info, codep + 1); + pclmul_type = *codep++ & 0xff; + switch (pclmul_type) + { + case 0x10: + pclmul_type = 2; + break; + case 0x11: + pclmul_type = 3; + break; + default: + break; + } + if (pclmul_type < ARRAY_SIZE (pclmul_op)) + { + char suffix [4]; + char *p = mnemonicendp - 3; + suffix[0] = p[0]; + suffix[1] = p[1]; + suffix[2] = p[2]; + suffix[3] = '\0'; + sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix); + mnemonicendp += pclmul_op[pclmul_type].len; + } + else + { + /* We have a reserved extension byte. Output it directly. */ + scratchbuf[0] = '$'; + print_operand_value (scratchbuf + 1, 1, pclmul_type); + oappend (scratchbuf + intel_syntax); + scratchbuf[0] = '\0'; + } +} + +static void +MOVBE_Fixup (int bytemode, int sizeflag) +{ + /* Add proper suffix to "movbe". */ + char *p = mnemonicendp; + + switch (bytemode) + { + case v_mode: + if (intel_syntax) + goto skip; + + USED_REX (REX_W); + if (sizeflag & SUFFIX_ALWAYS) + { + if (rex & REX_W) + *p++ = 'q'; + else if (sizeflag & DFLAG) + *p++ = 'l'; + else + *p++ = 'w'; + } + used_prefixes |= (prefixes & PREFIX_DATA); + break; + default: + oappend (INTERNAL_DISASSEMBLER_ERROR); + break; + } + mnemonicendp = p; + *p = '\0'; + +skip: + OP_M (bytemode, sizeflag); }