Home | History | Annotate | Download | only in qemu
      1 /* opcodes/i386-dis.c r1.126 */
      2 /* Print i386 instructions for GDB, the GNU debugger.
      3    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
      4    2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
      5 
      6    This file is part of GDB.
      7 
      8    This program is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 2 of the License, or
     11    (at your option) any later version.
     12 
     13    This program is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; if not, write to the Free Software
     20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
     21 
     22 /* 80386 instruction printer by Pace Willisson (pace (at) prep.ai.mit.edu)
     23    July 1988
     24     modified by John Hassey (hassey (at) dg-rtp.dg.com)
     25     x86-64 support added by Jan Hubicka (jh (at) suse.cz)
     26     VIA PadLock support by Michal Ludvig (mludvig (at) suse.cz).  */
     27 
     28 /* The main tables describing the instructions is essentially a copy
     29    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
     30    Programmers Manual.  Usually, there is a capital letter, followed
     31    by a small letter.  The capital letter tell the addressing mode,
     32    and the small letter tells about the operand size.  Refer to
     33    the Intel manual for details.  */
     34 
     35 #include <stdlib.h>
     36 #include "dis-asm.h"
     37 /* include/opcode/i386.h r1.78 */
     38 
     39 /* opcode/i386.h -- Intel 80386 opcode macros
     40    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
     41    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
     42    Free Software Foundation, Inc.
     43 
     44    This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger.
     45 
     46    This program is free software; you can redistribute it and/or modify
     47    it under the terms of the GNU General Public License as published by
     48    the Free Software Foundation; either version 2 of the License, or
     49    (at your option) any later version.
     50 
     51    This program is distributed in the hope that it will be useful,
     52    but WITHOUT ANY WARRANTY; without even the implied warranty of
     53    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     54    GNU General Public License for more details.
     55 
     56    You should have received a copy of the GNU General Public License
     57    along with this program; if not, write to the Free Software
     58    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
     59 
     60 /* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived
     61    ix86 Unix assemblers, generate floating point instructions with
     62    reversed source and destination registers in certain cases.
     63    Unfortunately, gcc and possibly many other programs use this
     64    reversed syntax, so we're stuck with it.
     65 
     66    eg. `fsub %st(3),%st' results in st = st - st(3) as expected, but
     67    `fsub %st,%st(3)' results in st(3) = st - st(3), rather than
     68    the expected st(3) = st(3) - st
     69 
     70    This happens with all the non-commutative arithmetic floating point
     71    operations with two register operands, where the source register is
     72    %st, and destination register is %st(i).
     73 
     74    The affected opcode map is dceX, dcfX, deeX, defX.  */
     75 
     76 #ifndef SYSV386_COMPAT
     77 /* Set non-zero for broken, compatible instructions.  Set to zero for
     78    non-broken opcodes at your peril.  gcc generates SystemV/386
     79    compatible instructions.  */
     80 #define SYSV386_COMPAT 1
     81 #endif
     82 #ifndef OLDGCC_COMPAT
     83 /* Set non-zero to cater for old (<= 2.8.1) versions of gcc that could
     84    generate nonsense fsubp, fsubrp, fdivp and fdivrp with operands
     85    reversed.  */
     86 #define OLDGCC_COMPAT SYSV386_COMPAT
     87 #endif
     88 
     89 #define MOV_AX_DISP32 0xa0
     90 #define POP_SEG_SHORT 0x07
     91 #define JUMP_PC_RELATIVE 0xeb
     92 #define INT_OPCODE  0xcd
     93 #define INT3_OPCODE 0xcc
     94 /* The opcode for the fwait instruction, which disassembler treats as a
     95    prefix when it can.  */
     96 #define FWAIT_OPCODE 0x9b
     97 #define ADDR_PREFIX_OPCODE 0x67
     98 #define DATA_PREFIX_OPCODE 0x66
     99 #define LOCK_PREFIX_OPCODE 0xf0
    100 #define CS_PREFIX_OPCODE 0x2e
    101 #define DS_PREFIX_OPCODE 0x3e
    102 #define ES_PREFIX_OPCODE 0x26
    103 #define FS_PREFIX_OPCODE 0x64
    104 #define GS_PREFIX_OPCODE 0x65
    105 #define SS_PREFIX_OPCODE 0x36
    106 #define REPNE_PREFIX_OPCODE 0xf2
    107 #define REPE_PREFIX_OPCODE  0xf3
    108 
    109 #define TWO_BYTE_OPCODE_ESCAPE 0x0f
    110 #define NOP_OPCODE (char) 0x90
    111 
    112 /* register numbers */
    113 #define EBP_REG_NUM 5
    114 #define ESP_REG_NUM 4
    115 
    116 /* modrm_byte.regmem for twobyte escape */
    117 #define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM
    118 /* index_base_byte.index for no index register addressing */
    119 #define NO_INDEX_REGISTER ESP_REG_NUM
    120 /* index_base_byte.base for no base register addressing */
    121 #define NO_BASE_REGISTER EBP_REG_NUM
    122 #define NO_BASE_REGISTER_16 6
    123 
    124 /* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */
    125 #define REGMEM_FIELD_HAS_REG 0x3/* always = 0x3 */
    126 #define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG)
    127 
    128 /* x86-64 extension prefix.  */
    129 #define REX_OPCODE	0x40
    130 
    131 /* Indicates 64 bit operand size.  */
    132 #define REX_W	8
    133 /* High extension to reg field of modrm byte.  */
    134 #define REX_R	4
    135 /* High extension to SIB index field.  */
    136 #define REX_X	2
    137 /* High extension to base field of modrm or SIB, or reg field of opcode.  */
    138 #define REX_B	1
    139 
    140 /* max operands per insn */
    141 #define MAX_OPERANDS 4
    142 
    143 /* max immediates per insn (lcall, ljmp, insertq, extrq) */
    144 #define MAX_IMMEDIATE_OPERANDS 2
    145 
    146 /* max memory refs per insn (string ops) */
    147 #define MAX_MEMORY_OPERANDS 2
    148 
    149 /* max size of insn mnemonics.  */
    150 #define MAX_MNEM_SIZE 16
    151 
    152 /* max size of register name in insn mnemonics.  */
    153 #define MAX_REG_NAME_SIZE 8
    154 
    155 /* opcodes/i386-dis.c r1.126 */
    156 #include "qemu-common.h"
    157 
    158 #include <setjmp.h>
    159 
    160 static int fetch_data (struct disassemble_info *, bfd_byte *);
    161 static void ckprefix (void);
    162 static const char *prefix_name (int, int);
    163 static int print_insn (bfd_vma, disassemble_info *);
    164 static void dofloat (int);
    165 static void OP_ST (int, int);
    166 static void OP_STi (int, int);
    167 static int putop (const char *, int);
    168 static void oappend (const char *);
    169 static void append_seg (void);
    170 static void OP_indirE (int, int);
    171 static void print_operand_value (char *buf, size_t bufsize, int hex, bfd_vma disp);
    172 static void print_displacement (char *, bfd_vma);
    173 static void OP_E (int, int);
    174 static void OP_G (int, int);
    175 static bfd_vma get64 (void);
    176 static bfd_signed_vma get32 (void);
    177 static bfd_signed_vma get32s (void);
    178 static int get16 (void);
    179 static void set_op (bfd_vma, int);
    180 static void OP_REG (int, int);
    181 static void OP_IMREG (int, int);
    182 static void OP_I (int, int);
    183 static void OP_I64 (int, int);
    184 static void OP_sI (int, int);
    185 static void OP_J (int, int);
    186 static void OP_SEG (int, int);
    187 static void OP_DIR (int, int);
    188 static void OP_OFF (int, int);
    189 static void OP_OFF64 (int, int);
    190 static void ptr_reg (int, int);
    191 static void OP_ESreg (int, int);
    192 static void OP_DSreg (int, int);
    193 static void OP_C (int, int);
    194 static void OP_D (int, int);
    195 static void OP_T (int, int);
    196 static void OP_R (int, int);
    197 static void OP_MMX (int, int);
    198 static void OP_XMM (int, int);
    199 static void OP_EM (int, int);
    200 static void OP_EX (int, int);
    201 static void OP_EMC (int,int);
    202 static void OP_MXC (int,int);
    203 static void OP_MS (int, int);
    204 static void OP_XS (int, int);
    205 static void OP_M (int, int);
    206 static void OP_VMX (int, int);
    207 static void OP_0fae (int, int);
    208 static void OP_0f07 (int, int);
    209 static void NOP_Fixup1 (int, int);
    210 static void NOP_Fixup2 (int, int);
    211 static void OP_3DNowSuffix (int, int);
    212 static void OP_SIMD_Suffix (int, int);
    213 static void SIMD_Fixup (int, int);
    214 static void PNI_Fixup (int, int);
    215 static void SVME_Fixup (int, int);
    216 static void INVLPG_Fixup (int, int);
    217 static void BadOp (void);
    218 static void VMX_Fixup (int, int);
    219 static void REP_Fixup (int, int);
    220 static void CMPXCHG8B_Fixup (int, int);
    221 static void XMM_Fixup (int, int);
    222 static void CRC32_Fixup (int, int);
    223 
    224 struct dis_private {
    225   /* Points to first byte not fetched.  */
    226   bfd_byte *max_fetched;
    227   bfd_byte the_buffer[MAX_MNEM_SIZE];
    228   bfd_vma insn_start;
    229   int orig_sizeflag;
    230   jmp_buf bailout;
    231 };
    232 
    233 enum address_mode
    234 {
    235   mode_16bit,
    236   mode_32bit,
    237   mode_64bit
    238 };
    239 
    240 static enum address_mode address_mode;
    241 
    242 /* Flags for the prefixes for the current instruction.  See below.  */
    243 static int prefixes;
    244 
    245 /* REX prefix the current instruction.  See below.  */
    246 static int rex;
    247 /* Bits of REX we've already used.  */
    248 static int rex_used;
    249 /* Mark parts used in the REX prefix.  When we are testing for
    250    empty prefix (for 8bit register REX extension), just mask it
    251    out.  Otherwise test for REX bit is excuse for existence of REX
    252    only in case value is nonzero.  */
    253 #define USED_REX(value)					\
    254   {							\
    255     if (value)						\
    256       {							\
    257 	if ((rex & value))				\
    258 	  rex_used |= (value) | REX_OPCODE;		\
    259       }							\
    260     else						\
    261       rex_used |= REX_OPCODE;				\
    262   }
    263 
    264 /* Flags for prefixes which we somehow handled when printing the
    265    current instruction.  */
    266 static int used_prefixes;
    267 
    268 /* Flags stored in PREFIXES.  */
    269 #define PREFIX_REPZ 1
    270 #define PREFIX_REPNZ 2
    271 #define PREFIX_LOCK 4
    272 #define PREFIX_CS 8
    273 #define PREFIX_SS 0x10
    274 #define PREFIX_DS 0x20
    275 #define PREFIX_ES 0x40
    276 #define PREFIX_FS 0x80
    277 #define PREFIX_GS 0x100
    278 #define PREFIX_DATA 0x200
    279 #define PREFIX_ADDR 0x400
    280 #define PREFIX_FWAIT 0x800
    281 
    282 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
    283    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
    284    on error.  */
    285 #define FETCH_DATA(info, addr) \
    286   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
    287    ? 1 : fetch_data ((info), (addr)))
    288 
    289 static int
    290 fetch_data (struct disassemble_info *info, bfd_byte *addr)
    291 {
    292   int status;
    293   struct dis_private *priv = (struct dis_private *) info->private_data;
    294   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
    295 
    296   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
    297     status = (*info->read_memory_func) (start,
    298 					priv->max_fetched,
    299 					addr - priv->max_fetched,
    300 					info);
    301   else
    302     status = -1;
    303   if (status != 0)
    304     {
    305       /* If we did manage to read at least one byte, then
    306 	 print_insn_i386 will do something sensible.  Otherwise, print
    307 	 an error.  We do that here because this is where we know
    308 	 STATUS.  */
    309       if (priv->max_fetched == priv->the_buffer)
    310 	(*info->memory_error_func) (status, start, info);
    311       longjmp (priv->bailout, 1);
    312     }
    313   else
    314     priv->max_fetched = addr;
    315   return 1;
    316 }
    317 
    318 #define XX { NULL, 0 }
    319 
    320 #define Eb { OP_E, b_mode }
    321 #define Ev { OP_E, v_mode }
    322 #define Ed { OP_E, d_mode }
    323 #define Edq { OP_E, dq_mode }
    324 #define Edqw { OP_E, dqw_mode }
    325 #define Edqb { OP_E, dqb_mode }
    326 #define Edqd { OP_E, dqd_mode }
    327 #define indirEv { OP_indirE, stack_v_mode }
    328 #define indirEp { OP_indirE, f_mode }
    329 #define stackEv { OP_E, stack_v_mode }
    330 #define Em { OP_E, m_mode }
    331 #define Ew { OP_E, w_mode }
    332 #define M { OP_M, 0 }		/* lea, lgdt, etc. */
    333 #define Ma { OP_M, v_mode }
    334 #define Mp { OP_M, f_mode }		/* 32 or 48 bit memory operand for LDS, LES etc */
    335 #define Mq { OP_M, q_mode }
    336 #define Gb { OP_G, b_mode }
    337 #define Gv { OP_G, v_mode }
    338 #define Gd { OP_G, d_mode }
    339 #define Gdq { OP_G, dq_mode }
    340 #define Gm { OP_G, m_mode }
    341 #define Gw { OP_G, w_mode }
    342 #define Rd { OP_R, d_mode }
    343 #define Rm { OP_R, m_mode }
    344 #define Ib { OP_I, b_mode }
    345 #define sIb { OP_sI, b_mode }	/* sign extened byte */
    346 #define Iv { OP_I, v_mode }
    347 #define Iq { OP_I, q_mode }
    348 #define Iv64 { OP_I64, v_mode }
    349 #define Iw { OP_I, w_mode }
    350 #define I1 { OP_I, const_1_mode }
    351 #define Jb { OP_J, b_mode }
    352 #define Jv { OP_J, v_mode }
    353 #define Cm { OP_C, m_mode }
    354 #define Dm { OP_D, m_mode }
    355 #define Td { OP_T, d_mode }
    356 
    357 #define RMeAX { OP_REG, eAX_reg }
    358 #define RMeBX { OP_REG, eBX_reg }
    359 #define RMeCX { OP_REG, eCX_reg }
    360 #define RMeDX { OP_REG, eDX_reg }
    361 #define RMeSP { OP_REG, eSP_reg }
    362 #define RMeBP { OP_REG, eBP_reg }
    363 #define RMeSI { OP_REG, eSI_reg }
    364 #define RMeDI { OP_REG, eDI_reg }
    365 #define RMrAX { OP_REG, rAX_reg }
    366 #define RMrBX { OP_REG, rBX_reg }
    367 #define RMrCX { OP_REG, rCX_reg }
    368 #define RMrDX { OP_REG, rDX_reg }
    369 #define RMrSP { OP_REG, rSP_reg }
    370 #define RMrBP { OP_REG, rBP_reg }
    371 #define RMrSI { OP_REG, rSI_reg }
    372 #define RMrDI { OP_REG, rDI_reg }
    373 #define RMAL { OP_REG, al_reg }
    374 #define RMAL { OP_REG, al_reg }
    375 #define RMCL { OP_REG, cl_reg }
    376 #define RMDL { OP_REG, dl_reg }
    377 #define RMBL { OP_REG, bl_reg }
    378 #define RMAH { OP_REG, ah_reg }
    379 #define RMCH { OP_REG, ch_reg }
    380 #define RMDH { OP_REG, dh_reg }
    381 #define RMBH { OP_REG, bh_reg }
    382 #define RMAX { OP_REG, ax_reg }
    383 #define RMDX { OP_REG, dx_reg }
    384 
    385 #define eAX { OP_IMREG, eAX_reg }
    386 #define eBX { OP_IMREG, eBX_reg }
    387 #define eCX { OP_IMREG, eCX_reg }
    388 #define eDX { OP_IMREG, eDX_reg }
    389 #define eSP { OP_IMREG, eSP_reg }
    390 #define eBP { OP_IMREG, eBP_reg }
    391 #define eSI { OP_IMREG, eSI_reg }
    392 #define eDI { OP_IMREG, eDI_reg }
    393 #define AL { OP_IMREG, al_reg }
    394 #define CL { OP_IMREG, cl_reg }
    395 #define DL { OP_IMREG, dl_reg }
    396 #define BL { OP_IMREG, bl_reg }
    397 #define AH { OP_IMREG, ah_reg }
    398 #define CH { OP_IMREG, ch_reg }
    399 #define DH { OP_IMREG, dh_reg }
    400 #define BH { OP_IMREG, bh_reg }
    401 #define AX { OP_IMREG, ax_reg }
    402 #define DX { OP_IMREG, dx_reg }
    403 #define zAX { OP_IMREG, z_mode_ax_reg }
    404 #define indirDX { OP_IMREG, indir_dx_reg }
    405 
    406 #define Sw { OP_SEG, w_mode }
    407 #define Sv { OP_SEG, v_mode }
    408 #define Ap { OP_DIR, 0 }
    409 #define Ob { OP_OFF64, b_mode }
    410 #define Ov { OP_OFF64, v_mode }
    411 #define Xb { OP_DSreg, eSI_reg }
    412 #define Xv { OP_DSreg, eSI_reg }
    413 #define Xz { OP_DSreg, eSI_reg }
    414 #define Yb { OP_ESreg, eDI_reg }
    415 #define Yv { OP_ESreg, eDI_reg }
    416 #define DSBX { OP_DSreg, eBX_reg }
    417 
    418 #define es { OP_REG, es_reg }
    419 #define ss { OP_REG, ss_reg }
    420 #define cs { OP_REG, cs_reg }
    421 #define ds { OP_REG, ds_reg }
    422 #define fs { OP_REG, fs_reg }
    423 #define gs { OP_REG, gs_reg }
    424 
    425 #define MX { OP_MMX, 0 }
    426 #define XM { OP_XMM, 0 }
    427 #define EM { OP_EM, v_mode }
    428 #define EMd { OP_EM, d_mode }
    429 #define EMq { OP_EM, q_mode }
    430 #define EXd { OP_EX, d_mode }
    431 #define EXq { OP_EX, q_mode }
    432 #define EXx { OP_EX, x_mode }
    433 #define MS { OP_MS, v_mode }
    434 #define XS { OP_XS, v_mode }
    435 #define EMC { OP_EMC, v_mode }
    436 #define MXC { OP_MXC, 0 }
    437 #define VM { OP_VMX, q_mode }
    438 #define OPSUF { OP_3DNowSuffix, 0 }
    439 #define OPSIMD { OP_SIMD_Suffix, 0 }
    440 #define XMM0 { XMM_Fixup, 0 }
    441 
    442 /* Used handle "rep" prefix for string instructions.  */
    443 #define Xbr { REP_Fixup, eSI_reg }
    444 #define Xvr { REP_Fixup, eSI_reg }
    445 #define Ybr { REP_Fixup, eDI_reg }
    446 #define Yvr { REP_Fixup, eDI_reg }
    447 #define Yzr { REP_Fixup, eDI_reg }
    448 #define indirDXr { REP_Fixup, indir_dx_reg }
    449 #define ALr { REP_Fixup, al_reg }
    450 #define eAXr { REP_Fixup, eAX_reg }
    451 
    452 #define cond_jump_flag { NULL, cond_jump_mode }
    453 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
    454 
    455 /* bits in sizeflag */
    456 #define SUFFIX_ALWAYS 4
    457 #define AFLAG 2
    458 #define DFLAG 1
    459 
    460 #define b_mode 1  /* byte operand */
    461 #define v_mode 2  /* operand size depends on prefixes */
    462 #define w_mode 3  /* word operand */
    463 #define d_mode 4  /* double word operand  */
    464 #define q_mode 5  /* quad word operand */
    465 #define t_mode 6  /* ten-byte operand */
    466 #define x_mode 7  /* 16-byte XMM operand */
    467 #define m_mode 8  /* d_mode in 32bit, q_mode in 64bit mode.  */
    468 #define cond_jump_mode 9
    469 #define loop_jcxz_mode 10
    470 #define dq_mode 11 /* operand size depends on REX prefixes.  */
    471 #define dqw_mode 12 /* registers like dq_mode, memory like w_mode.  */
    472 #define f_mode 13 /* 4- or 6-byte pointer operand */
    473 #define const_1_mode 14
    474 #define stack_v_mode 15 /* v_mode for stack-related opcodes.  */
    475 #define z_mode 16 /* non-quad operand size depends on prefixes */
    476 #define o_mode 17  /* 16-byte operand */
    477 #define dqb_mode 18 /* registers like dq_mode, memory like b_mode.  */
    478 #define dqd_mode 19 /* registers like dq_mode, memory like d_mode.  */
    479 
    480 #define es_reg 100
    481 #define cs_reg 101
    482 #define ss_reg 102
    483 #define ds_reg 103
    484 #define fs_reg 104
    485 #define gs_reg 105
    486 
    487 #define eAX_reg 108
    488 #define eCX_reg 109
    489 #define eDX_reg 110
    490 #define eBX_reg 111
    491 #define eSP_reg 112
    492 #define eBP_reg 113
    493 #define eSI_reg 114
    494 #define eDI_reg 115
    495 
    496 #define al_reg 116
    497 #define cl_reg 117
    498 #define dl_reg 118
    499 #define bl_reg 119
    500 #define ah_reg 120
    501 #define ch_reg 121
    502 #define dh_reg 122
    503 #define bh_reg 123
    504 
    505 #define ax_reg 124
    506 #define cx_reg 125
    507 #define dx_reg 126
    508 #define bx_reg 127
    509 #define sp_reg 128
    510 #define bp_reg 129
    511 #define si_reg 130
    512 #define di_reg 131
    513 
    514 #define rAX_reg 132
    515 #define rCX_reg 133
    516 #define rDX_reg 134
    517 #define rBX_reg 135
    518 #define rSP_reg 136
    519 #define rBP_reg 137
    520 #define rSI_reg 138
    521 #define rDI_reg 139
    522 
    523 #define z_mode_ax_reg 149
    524 #define indir_dx_reg 150
    525 
    526 #define FLOATCODE 1
    527 #define USE_GROUPS 2
    528 #define USE_PREFIX_USER_TABLE 3
    529 #define X86_64_SPECIAL 4
    530 #define IS_3BYTE_OPCODE 5
    531 
    532 #define FLOAT	  NULL, { { NULL, FLOATCODE } }
    533 
    534 #define GRP1a	  NULL, { { NULL, USE_GROUPS }, { NULL,  0 } }
    535 #define GRP1b	  NULL, { { NULL, USE_GROUPS }, { NULL,  1 } }
    536 #define GRP1S	  NULL, { { NULL, USE_GROUPS }, { NULL,  2 } }
    537 #define GRP1Ss	  NULL, { { NULL, USE_GROUPS }, { NULL,  3 } }
    538 #define GRP2b	  NULL, { { NULL, USE_GROUPS }, { NULL,  4 } }
    539 #define GRP2S	  NULL, { { NULL, USE_GROUPS }, { NULL,  5 } }
    540 #define GRP2b_one NULL, { { NULL, USE_GROUPS }, { NULL,  6 } }
    541 #define GRP2S_one NULL, { { NULL, USE_GROUPS }, { NULL,  7 } }
    542 #define GRP2b_cl  NULL, { { NULL, USE_GROUPS }, { NULL,  8 } }
    543 #define GRP2S_cl  NULL, { { NULL, USE_GROUPS }, { NULL,  9 } }
    544 #define GRP3b	  NULL, { { NULL, USE_GROUPS }, { NULL, 10 } }
    545 #define GRP3S	  NULL, { { NULL, USE_GROUPS }, { NULL, 11 } }
    546 #define GRP4	  NULL, { { NULL, USE_GROUPS }, { NULL, 12 } }
    547 #define GRP5	  NULL, { { NULL, USE_GROUPS }, { NULL, 13 } }
    548 #define GRP6	  NULL, { { NULL, USE_GROUPS }, { NULL, 14 } }
    549 #define GRP7	  NULL, { { NULL, USE_GROUPS }, { NULL, 15 } }
    550 #define GRP8	  NULL, { { NULL, USE_GROUPS }, { NULL, 16 } }
    551 #define GRP9	  NULL, { { NULL, USE_GROUPS }, { NULL, 17 } }
    552 #define GRP11_C6  NULL, { { NULL, USE_GROUPS }, { NULL, 18 } }
    553 #define GRP11_C7  NULL, { { NULL, USE_GROUPS }, { NULL, 19 } }
    554 #define GRP12	  NULL, { { NULL, USE_GROUPS }, { NULL, 20 } }
    555 #define GRP13	  NULL, { { NULL, USE_GROUPS }, { NULL, 21 } }
    556 #define GRP14	  NULL, { { NULL, USE_GROUPS }, { NULL, 22 } }
    557 #define GRP15	  NULL, { { NULL, USE_GROUPS }, { NULL, 23 } }
    558 #define GRP16	  NULL, { { NULL, USE_GROUPS }, { NULL, 24 } }
    559 #define GRPAMD	  NULL, { { NULL, USE_GROUPS }, { NULL, 25 } }
    560 #define GRPPADLCK1 NULL, { { NULL, USE_GROUPS }, { NULL, 26 } }
    561 #define GRPPADLCK2 NULL, { { NULL, USE_GROUPS }, { NULL, 27 } }
    562 
    563 #define PREGRP0   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  0 } }
    564 #define PREGRP1   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  1 } }
    565 #define PREGRP2   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  2 } }
    566 #define PREGRP3   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  3 } }
    567 #define PREGRP4   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  4 } }
    568 #define PREGRP5   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  5 } }
    569 #define PREGRP6   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  6 } }
    570 #define PREGRP7   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  7 } }
    571 #define PREGRP8   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  8 } }
    572 #define PREGRP9   NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL,  9 } }
    573 #define PREGRP10  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 10 } }
    574 #define PREGRP11  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 11 } }
    575 #define PREGRP12  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 12 } }
    576 #define PREGRP13  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 13 } }
    577 #define PREGRP14  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 14 } }
    578 #define PREGRP15  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 15 } }
    579 #define PREGRP16  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 16 } }
    580 #define PREGRP17  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 17 } }
    581 #define PREGRP18  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 18 } }
    582 #define PREGRP19  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 19 } }
    583 #define PREGRP20  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 20 } }
    584 #define PREGRP21  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 21 } }
    585 #define PREGRP22  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 22 } }
    586 #define PREGRP23  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 23 } }
    587 #define PREGRP24  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 24 } }
    588 #define PREGRP25  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 25 } }
    589 #define PREGRP26  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 26 } }
    590 #define PREGRP27  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 27 } }
    591 #define PREGRP28  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 28 } }
    592 #define PREGRP29  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 29 } }
    593 #define PREGRP30  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 30 } }
    594 #define PREGRP31  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 31 } }
    595 #define PREGRP32  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 32 } }
    596 #define PREGRP33  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 33 } }
    597 #define PREGRP34  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 34 } }
    598 #define PREGRP35  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 35 } }
    599 #define PREGRP36  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 36 } }
    600 #define PREGRP37  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 37 } }
    601 #define PREGRP38  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 38 } }
    602 #define PREGRP39  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 39 } }
    603 #define PREGRP40  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 40 } }
    604 #define PREGRP41  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 41 } }
    605 #define PREGRP42  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 42 } }
    606 #define PREGRP43  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 43 } }
    607 #define PREGRP44  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 44 } }
    608 #define PREGRP45  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 45 } }
    609 #define PREGRP46  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 46 } }
    610 #define PREGRP47  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 47 } }
    611 #define PREGRP48  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 48 } }
    612 #define PREGRP49  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 49 } }
    613 #define PREGRP50  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 50 } }
    614 #define PREGRP51  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 51 } }
    615 #define PREGRP52  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 52 } }
    616 #define PREGRP53  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 53 } }
    617 #define PREGRP54  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 54 } }
    618 #define PREGRP55  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 55 } }
    619 #define PREGRP56  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 56 } }
    620 #define PREGRP57  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 57 } }
    621 #define PREGRP58  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 58 } }
    622 #define PREGRP59  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 59 } }
    623 #define PREGRP60  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 60 } }
    624 #define PREGRP61  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 61 } }
    625 #define PREGRP62  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 62 } }
    626 #define PREGRP63  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 63 } }
    627 #define PREGRP64  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 64 } }
    628 #define PREGRP65  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 65 } }
    629 #define PREGRP66  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 66 } }
    630 #define PREGRP67  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 67 } }
    631 #define PREGRP68  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 68 } }
    632 #define PREGRP69  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 69 } }
    633 #define PREGRP70  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 70 } }
    634 #define PREGRP71  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 71 } }
    635 #define PREGRP72  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 72 } }
    636 #define PREGRP73  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 73 } }
    637 #define PREGRP74  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 74 } }
    638 #define PREGRP75  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 75 } }
    639 #define PREGRP76  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 76 } }
    640 #define PREGRP77  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 77 } }
    641 #define PREGRP78  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 78 } }
    642 #define PREGRP79  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 79 } }
    643 #define PREGRP80  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 80 } }
    644 #define PREGRP81  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 81 } }
    645 #define PREGRP82  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 82 } }
    646 #define PREGRP83  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 83 } }
    647 #define PREGRP84  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 84 } }
    648 #define PREGRP85  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 85 } }
    649 #define PREGRP86  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 86 } }
    650 #define PREGRP87  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 87 } }
    651 #define PREGRP88  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 88 } }
    652 #define PREGRP89  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 89 } }
    653 #define PREGRP90  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 90 } }
    654 #define PREGRP91  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 91 } }
    655 #define PREGRP92  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 92 } }
    656 #define PREGRP93  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 93 } }
    657 #define PREGRP94  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 94 } }
    658 #define PREGRP95  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 95 } }
    659 #define PREGRP96  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 96 } }
    660 #define PREGRP97  NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 97 } }
    661 
    662 
    663 #define X86_64_0  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } }
    664 #define X86_64_1  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 1 } }
    665 #define X86_64_2  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 2 } }
    666 #define X86_64_3  NULL, { { NULL, X86_64_SPECIAL }, { NULL, 3 } }
    667 
    668 #define THREE_BYTE_0 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 0 } }
    669 #define THREE_BYTE_1 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 1 } }
    670 
    671 typedef void (*op_rtn) (int bytemode, int sizeflag);
    672 
    673 struct dis386 {
    674   const char *name;
    675   struct
    676     {
    677       op_rtn rtn;
    678       int bytemode;
    679     } op[MAX_OPERANDS];
    680 };
    681 
    682 /* Upper case letters in the instruction names here are macros.
    683    'A' => print 'b' if no register operands or suffix_always is true
    684    'B' => print 'b' if suffix_always is true
    685    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
    686    .      size prefix
    687    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
    688    .      suffix_always is true
    689    'E' => print 'e' if 32-bit form of jcxz
    690    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
    691    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
    692    'H' => print ",pt" or ",pn" branch hint
    693    'I' => honor following macro letter even in Intel mode (implemented only
    694    .      for some of the macro letters)
    695    'J' => print 'l'
    696    'K' => print 'd' or 'q' if rex prefix is present.
    697    'L' => print 'l' if suffix_always is true
    698    'N' => print 'n' if instruction has no wait "prefix"
    699    'O' => print 'd' or 'o' (or 'q' in Intel mode)
    700    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
    701    .      or suffix_always is true.  print 'q' if rex prefix is present.
    702    'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
    703    .      is true
    704    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
    705    'S' => print 'w', 'l' or 'q' if suffix_always is true
    706    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
    707    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
    708    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
    709    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
    710    'X' => print 's', 'd' depending on data16 prefix (for XMM)
    711    'Y' => 'q' if instruction has an REX 64bit overwrite prefix
    712    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
    713 
    714    Many of the above letters print nothing in Intel mode.  See "putop"
    715    for the details.
    716 
    717    Braces '{' and '}', and vertical bars '|', indicate alternative
    718    mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
    719    modes.  In cases where there are only two alternatives, the X86_64
    720    instruction is reserved, and "(bad)" is printed.
    721 */
    722 
    723 static const struct dis386 dis386[] = {
    724   /* 00 */
    725   { "addB",		{ Eb, Gb } },
    726   { "addS",		{ Ev, Gv } },
    727   { "addB",		{ Gb, Eb } },
    728   { "addS",		{ Gv, Ev } },
    729   { "addB",		{ AL, Ib } },
    730   { "addS",		{ eAX, Iv } },
    731   { "push{T|}",		{ es } },
    732   { "pop{T|}",		{ es } },
    733   /* 08 */
    734   { "orB",		{ Eb, Gb } },
    735   { "orS",		{ Ev, Gv } },
    736   { "orB",		{ Gb, Eb } },
    737   { "orS",		{ Gv, Ev } },
    738   { "orB",		{ AL, Ib } },
    739   { "orS",		{ eAX, Iv } },
    740   { "push{T|}",		{ cs } },
    741   { "(bad)",		{ XX } },	/* 0x0f extended opcode escape */
    742   /* 10 */
    743   { "adcB",		{ Eb, Gb } },
    744   { "adcS",		{ Ev, Gv } },
    745   { "adcB",		{ Gb, Eb } },
    746   { "adcS",		{ Gv, Ev } },
    747   { "adcB",		{ AL, Ib } },
    748   { "adcS",		{ eAX, Iv } },
    749   { "push{T|}",		{ ss } },
    750   { "pop{T|}",		{ ss } },
    751   /* 18 */
    752   { "sbbB",		{ Eb, Gb } },
    753   { "sbbS",		{ Ev, Gv } },
    754   { "sbbB",		{ Gb, Eb } },
    755   { "sbbS",		{ Gv, Ev } },
    756   { "sbbB",		{ AL, Ib } },
    757   { "sbbS",		{ eAX, Iv } },
    758   { "push{T|}",		{ ds } },
    759   { "pop{T|}",		{ ds } },
    760   /* 20 */
    761   { "andB",		{ Eb, Gb } },
    762   { "andS",		{ Ev, Gv } },
    763   { "andB",		{ Gb, Eb } },
    764   { "andS",		{ Gv, Ev } },
    765   { "andB",		{ AL, Ib } },
    766   { "andS",		{ eAX, Iv } },
    767   { "(bad)",		{ XX } },	/* SEG ES prefix */
    768   { "daa{|}",		{ XX } },
    769   /* 28 */
    770   { "subB",		{ Eb, Gb } },
    771   { "subS",		{ Ev, Gv } },
    772   { "subB",		{ Gb, Eb } },
    773   { "subS",		{ Gv, Ev } },
    774   { "subB",		{ AL, Ib } },
    775   { "subS",		{ eAX, Iv } },
    776   { "(bad)",		{ XX } },	/* SEG CS prefix */
    777   { "das{|}",		{ XX } },
    778   /* 30 */
    779   { "xorB",		{ Eb, Gb } },
    780   { "xorS",		{ Ev, Gv } },
    781   { "xorB",		{ Gb, Eb } },
    782   { "xorS",		{ Gv, Ev } },
    783   { "xorB",		{ AL, Ib } },
    784   { "xorS",		{ eAX, Iv } },
    785   { "(bad)",		{ XX } },	/* SEG SS prefix */
    786   { "aaa{|}",		{ XX } },
    787   /* 38 */
    788   { "cmpB",		{ Eb, Gb } },
    789   { "cmpS",		{ Ev, Gv } },
    790   { "cmpB",		{ Gb, Eb } },
    791   { "cmpS",		{ Gv, Ev } },
    792   { "cmpB",		{ AL, Ib } },
    793   { "cmpS",		{ eAX, Iv } },
    794   { "(bad)",		{ XX } },	/* SEG DS prefix */
    795   { "aas{|}",		{ XX } },
    796   /* 40 */
    797   { "inc{S|}",		{ RMeAX } },
    798   { "inc{S|}",		{ RMeCX } },
    799   { "inc{S|}",		{ RMeDX } },
    800   { "inc{S|}",		{ RMeBX } },
    801   { "inc{S|}",		{ RMeSP } },
    802   { "inc{S|}",		{ RMeBP } },
    803   { "inc{S|}",		{ RMeSI } },
    804   { "inc{S|}",		{ RMeDI } },
    805   /* 48 */
    806   { "dec{S|}",		{ RMeAX } },
    807   { "dec{S|}",		{ RMeCX } },
    808   { "dec{S|}",		{ RMeDX } },
    809   { "dec{S|}",		{ RMeBX } },
    810   { "dec{S|}",		{ RMeSP } },
    811   { "dec{S|}",		{ RMeBP } },
    812   { "dec{S|}",		{ RMeSI } },
    813   { "dec{S|}",		{ RMeDI } },
    814   /* 50 */
    815   { "pushV",		{ RMrAX } },
    816   { "pushV",		{ RMrCX } },
    817   { "pushV",		{ RMrDX } },
    818   { "pushV",		{ RMrBX } },
    819   { "pushV",		{ RMrSP } },
    820   { "pushV",		{ RMrBP } },
    821   { "pushV",		{ RMrSI } },
    822   { "pushV",		{ RMrDI } },
    823   /* 58 */
    824   { "popV",		{ RMrAX } },
    825   { "popV",		{ RMrCX } },
    826   { "popV",		{ RMrDX } },
    827   { "popV",		{ RMrBX } },
    828   { "popV",		{ RMrSP } },
    829   { "popV",		{ RMrBP } },
    830   { "popV",		{ RMrSI } },
    831   { "popV",		{ RMrDI } },
    832   /* 60 */
    833   { X86_64_0 },
    834   { X86_64_1 },
    835   { X86_64_2 },
    836   { X86_64_3 },
    837   { "(bad)",		{ XX } },	/* seg fs */
    838   { "(bad)",		{ XX } },	/* seg gs */
    839   { "(bad)",		{ XX } },	/* op size prefix */
    840   { "(bad)",		{ XX } },	/* adr size prefix */
    841   /* 68 */
    842   { "pushT",		{ Iq } },
    843   { "imulS",		{ Gv, Ev, Iv } },
    844   { "pushT",		{ sIb } },
    845   { "imulS",		{ Gv, Ev, sIb } },
    846   { "ins{b||b|}",	{ Ybr, indirDX } },
    847   { "ins{R||G|}",	{ Yzr, indirDX } },
    848   { "outs{b||b|}",	{ indirDXr, Xb } },
    849   { "outs{R||G|}",	{ indirDXr, Xz } },
    850   /* 70 */
    851   { "joH",		{ Jb, XX, cond_jump_flag } },
    852   { "jnoH",		{ Jb, XX, cond_jump_flag } },
    853   { "jbH",		{ Jb, XX, cond_jump_flag } },
    854   { "jaeH",		{ Jb, XX, cond_jump_flag } },
    855   { "jeH",		{ Jb, XX, cond_jump_flag } },
    856   { "jneH",		{ Jb, XX, cond_jump_flag } },
    857   { "jbeH",		{ Jb, XX, cond_jump_flag } },
    858   { "jaH",		{ Jb, XX, cond_jump_flag } },
    859   /* 78 */
    860   { "jsH",		{ Jb, XX, cond_jump_flag } },
    861   { "jnsH",		{ Jb, XX, cond_jump_flag } },
    862   { "jpH",		{ Jb, XX, cond_jump_flag } },
    863   { "jnpH",		{ Jb, XX, cond_jump_flag } },
    864   { "jlH",		{ Jb, XX, cond_jump_flag } },
    865   { "jgeH",		{ Jb, XX, cond_jump_flag } },
    866   { "jleH",		{ Jb, XX, cond_jump_flag } },
    867   { "jgH",		{ Jb, XX, cond_jump_flag } },
    868   /* 80 */
    869   { GRP1b },
    870   { GRP1S },
    871   { "(bad)",		{ XX } },
    872   { GRP1Ss },
    873   { "testB",		{ Eb, Gb } },
    874   { "testS",		{ Ev, Gv } },
    875   { "xchgB",		{ Eb, Gb } },
    876   { "xchgS",		{ Ev, Gv } },
    877   /* 88 */
    878   { "movB",		{ Eb, Gb } },
    879   { "movS",		{ Ev, Gv } },
    880   { "movB",		{ Gb, Eb } },
    881   { "movS",		{ Gv, Ev } },
    882   { "movD",		{ Sv, Sw } },
    883   { "leaS",		{ Gv, M } },
    884   { "movD",		{ Sw, Sv } },
    885   { GRP1a },
    886   /* 90 */
    887   { PREGRP38 },
    888   { "xchgS",		{ RMeCX, eAX } },
    889   { "xchgS",		{ RMeDX, eAX } },
    890   { "xchgS",		{ RMeBX, eAX } },
    891   { "xchgS",		{ RMeSP, eAX } },
    892   { "xchgS",		{ RMeBP, eAX } },
    893   { "xchgS",		{ RMeSI, eAX } },
    894   { "xchgS",		{ RMeDI, eAX } },
    895   /* 98 */
    896   { "cW{t||t|}R",	{ XX } },
    897   { "cR{t||t|}O",	{ XX } },
    898   { "Jcall{T|}",	{ Ap } },
    899   { "(bad)",		{ XX } },	/* fwait */
    900   { "pushfT",		{ XX } },
    901   { "popfT",		{ XX } },
    902   { "sahf{|}",		{ XX } },
    903   { "lahf{|}",		{ XX } },
    904   /* a0 */
    905   { "movB",		{ AL, Ob } },
    906   { "movS",		{ eAX, Ov } },
    907   { "movB",		{ Ob, AL } },
    908   { "movS",		{ Ov, eAX } },
    909   { "movs{b||b|}",	{ Ybr, Xb } },
    910   { "movs{R||R|}",	{ Yvr, Xv } },
    911   { "cmps{b||b|}",	{ Xb, Yb } },
    912   { "cmps{R||R|}",	{ Xv, Yv } },
    913   /* a8 */
    914   { "testB",		{ AL, Ib } },
    915   { "testS",		{ eAX, Iv } },
    916   { "stosB",		{ Ybr, AL } },
    917   { "stosS",		{ Yvr, eAX } },
    918   { "lodsB",		{ ALr, Xb } },
    919   { "lodsS",		{ eAXr, Xv } },
    920   { "scasB",		{ AL, Yb } },
    921   { "scasS",		{ eAX, Yv } },
    922   /* b0 */
    923   { "movB",		{ RMAL, Ib } },
    924   { "movB",		{ RMCL, Ib } },
    925   { "movB",		{ RMDL, Ib } },
    926   { "movB",		{ RMBL, Ib } },
    927   { "movB",		{ RMAH, Ib } },
    928   { "movB",		{ RMCH, Ib } },
    929   { "movB",		{ RMDH, Ib } },
    930   { "movB",		{ RMBH, Ib } },
    931   /* b8 */
    932   { "movS",		{ RMeAX, Iv64 } },
    933   { "movS",		{ RMeCX, Iv64 } },
    934   { "movS",		{ RMeDX, Iv64 } },
    935   { "movS",		{ RMeBX, Iv64 } },
    936   { "movS",		{ RMeSP, Iv64 } },
    937   { "movS",		{ RMeBP, Iv64 } },
    938   { "movS",		{ RMeSI, Iv64 } },
    939   { "movS",		{ RMeDI, Iv64 } },
    940   /* c0 */
    941   { GRP2b },
    942   { GRP2S },
    943   { "retT",		{ Iw } },
    944   { "retT",		{ XX } },
    945   { "les{S|}",		{ Gv, Mp } },
    946   { "ldsS",		{ Gv, Mp } },
    947   { GRP11_C6 },
    948   { GRP11_C7 },
    949   /* c8 */
    950   { "enterT",		{ Iw, Ib } },
    951   { "leaveT",		{ XX } },
    952   { "lretP",		{ Iw } },
    953   { "lretP",		{ XX } },
    954   { "int3",		{ XX } },
    955   { "int",		{ Ib } },
    956   { "into{|}",		{ XX } },
    957   { "iretP",		{ XX } },
    958   /* d0 */
    959   { GRP2b_one },
    960   { GRP2S_one },
    961   { GRP2b_cl },
    962   { GRP2S_cl },
    963   { "aam{|}",		{ sIb } },
    964   { "aad{|}",		{ sIb } },
    965   { "(bad)",		{ XX } },
    966   { "xlat",		{ DSBX } },
    967   /* d8 */
    968   { FLOAT },
    969   { FLOAT },
    970   { FLOAT },
    971   { FLOAT },
    972   { FLOAT },
    973   { FLOAT },
    974   { FLOAT },
    975   { FLOAT },
    976   /* e0 */
    977   { "loopneFH",		{ Jb, XX, loop_jcxz_flag } },
    978   { "loopeFH",		{ Jb, XX, loop_jcxz_flag } },
    979   { "loopFH",		{ Jb, XX, loop_jcxz_flag } },
    980   { "jEcxzH",		{ Jb, XX, loop_jcxz_flag } },
    981   { "inB",		{ AL, Ib } },
    982   { "inG",		{ zAX, Ib } },
    983   { "outB",		{ Ib, AL } },
    984   { "outG",		{ Ib, zAX } },
    985   /* e8 */
    986   { "callT",		{ Jv } },
    987   { "jmpT",		{ Jv } },
    988   { "Jjmp{T|}",		{ Ap } },
    989   { "jmp",		{ Jb } },
    990   { "inB",		{ AL, indirDX } },
    991   { "inG",		{ zAX, indirDX } },
    992   { "outB",		{ indirDX, AL } },
    993   { "outG",		{ indirDX, zAX } },
    994   /* f0 */
    995   { "(bad)",		{ XX } },	/* lock prefix */
    996   { "icebp",		{ XX } },
    997   { "(bad)",		{ XX } },	/* repne */
    998   { "(bad)",		{ XX } },	/* repz */
    999   { "hlt",		{ XX } },
   1000   { "cmc",		{ XX } },
   1001   { GRP3b },
   1002   { GRP3S },
   1003   /* f8 */
   1004   { "clc",		{ XX } },
   1005   { "stc",		{ XX } },
   1006   { "cli",		{ XX } },
   1007   { "sti",		{ XX } },
   1008   { "cld",		{ XX } },
   1009   { "std",		{ XX } },
   1010   { GRP4 },
   1011   { GRP5 },
   1012 };
   1013 
   1014 static const struct dis386 dis386_twobyte[] = {
   1015   /* 00 */
   1016   { GRP6 },
   1017   { GRP7 },
   1018   { "larS",		{ Gv, Ew } },
   1019   { "lslS",		{ Gv, Ew } },
   1020   { "(bad)",		{ XX } },
   1021   { "syscall",		{ XX } },
   1022   { "clts",		{ XX } },
   1023   { "sysretP",		{ XX } },
   1024   /* 08 */
   1025   { "invd",		{ XX } },
   1026   { "wbinvd",		{ XX } },
   1027   { "(bad)",		{ XX } },
   1028   { "ud2a",		{ XX } },
   1029   { "(bad)",		{ XX } },
   1030   { GRPAMD },
   1031   { "femms",		{ XX } },
   1032   { "",			{ MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
   1033   /* 10 */
   1034   { PREGRP8 },
   1035   { PREGRP9 },
   1036   { PREGRP30 },
   1037   { "movlpX",		{ EXq, XM, { SIMD_Fixup, 'h' } } },
   1038   { "unpcklpX",		{ XM, EXq } },
   1039   { "unpckhpX",		{ XM, EXq } },
   1040   { PREGRP31 },
   1041   { "movhpX",		{ EXq, XM, { SIMD_Fixup, 'l' } } },
   1042   /* 18 */
   1043   { GRP16 },
   1044   { "(bad)",		{ XX } },
   1045   { "(bad)",		{ XX } },
   1046   { "(bad)",		{ XX } },
   1047   { "(bad)",		{ XX } },
   1048   { "(bad)",		{ XX } },
   1049   { "(bad)",		{ XX } },
   1050   { "nopQ",		{ Ev } },
   1051   /* 20 */
   1052   { "movZ",		{ Rm, Cm } },
   1053   { "movZ",		{ Rm, Dm } },
   1054   { "movZ",		{ Cm, Rm } },
   1055   { "movZ",		{ Dm, Rm } },
   1056   { "movL",		{ Rd, Td } },
   1057   { "(bad)",		{ XX } },
   1058   { "movL",		{ Td, Rd } },
   1059   { "(bad)",		{ XX } },
   1060   /* 28 */
   1061   { "movapX",		{ XM, EXx } },
   1062   { "movapX",		{ EXx,  XM } },
   1063   { PREGRP2 },
   1064   { PREGRP33 },
   1065   { PREGRP4 },
   1066   { PREGRP3 },
   1067   { PREGRP93 },
   1068   { PREGRP94 },
   1069   /* 30 */
   1070   { "wrmsr",		{ XX } },
   1071   { "rdtsc",		{ XX } },
   1072   { "rdmsr",		{ XX } },
   1073   { "rdpmc",		{ XX } },
   1074   { "sysenter",		{ XX } },
   1075   { "sysexit",		{ XX } },
   1076   { "(bad)",		{ XX } },
   1077   { "(bad)",		{ XX } },
   1078   /* 38 */
   1079   { THREE_BYTE_0 },
   1080   { "(bad)",		{ XX } },
   1081   { THREE_BYTE_1 },
   1082   { "(bad)",		{ XX } },
   1083   { "(bad)",		{ XX } },
   1084   { "(bad)",		{ XX } },
   1085   { "(bad)",		{ XX } },
   1086   { "(bad)",		{ XX } },
   1087   /* 40 */
   1088   { "cmovo",		{ Gv, Ev } },
   1089   { "cmovno",		{ Gv, Ev } },
   1090   { "cmovb",		{ Gv, Ev } },
   1091   { "cmovae",		{ Gv, Ev } },
   1092   { "cmove",		{ Gv, Ev } },
   1093   { "cmovne",		{ Gv, Ev } },
   1094   { "cmovbe",		{ Gv, Ev } },
   1095   { "cmova",		{ Gv, Ev } },
   1096   /* 48 */
   1097   { "cmovs",		{ Gv, Ev } },
   1098   { "cmovns",		{ Gv, Ev } },
   1099   { "cmovp",		{ Gv, Ev } },
   1100   { "cmovnp",		{ Gv, Ev } },
   1101   { "cmovl",		{ Gv, Ev } },
   1102   { "cmovge",		{ Gv, Ev } },
   1103   { "cmovle",		{ Gv, Ev } },
   1104   { "cmovg",		{ Gv, Ev } },
   1105   /* 50 */
   1106   { "movmskpX",		{ Gdq, XS } },
   1107   { PREGRP13 },
   1108   { PREGRP12 },
   1109   { PREGRP11 },
   1110   { "andpX",		{ XM, EXx } },
   1111   { "andnpX",		{ XM, EXx } },
   1112   { "orpX",		{ XM, EXx } },
   1113   { "xorpX",		{ XM, EXx } },
   1114   /* 58 */
   1115   { PREGRP0 },
   1116   { PREGRP10 },
   1117   { PREGRP17 },
   1118   { PREGRP16 },
   1119   { PREGRP14 },
   1120   { PREGRP7 },
   1121   { PREGRP5 },
   1122   { PREGRP6 },
   1123   /* 60 */
   1124   { PREGRP95 },
   1125   { PREGRP96 },
   1126   { PREGRP97 },
   1127   { "packsswb",		{ MX, EM } },
   1128   { "pcmpgtb",		{ MX, EM } },
   1129   { "pcmpgtw",		{ MX, EM } },
   1130   { "pcmpgtd",		{ MX, EM } },
   1131   { "packuswb",		{ MX, EM } },
   1132   /* 68 */
   1133   { "punpckhbw",	{ MX, EM } },
   1134   { "punpckhwd",	{ MX, EM } },
   1135   { "punpckhdq",	{ MX, EM } },
   1136   { "packssdw",		{ MX, EM } },
   1137   { PREGRP26 },
   1138   { PREGRP24 },
   1139   { "movd",		{ MX, Edq } },
   1140   { PREGRP19 },
   1141   /* 70 */
   1142   { PREGRP22 },
   1143   { GRP12 },
   1144   { GRP13 },
   1145   { GRP14 },
   1146   { "pcmpeqb",		{ MX, EM } },
   1147   { "pcmpeqw",		{ MX, EM } },
   1148   { "pcmpeqd",		{ MX, EM } },
   1149   { "emms",		{ XX } },
   1150   /* 78 */
   1151   { PREGRP34 },
   1152   { PREGRP35 },
   1153   { "(bad)",		{ XX } },
   1154   { "(bad)",		{ XX } },
   1155   { PREGRP28 },
   1156   { PREGRP29 },
   1157   { PREGRP23 },
   1158   { PREGRP20 },
   1159   /* 80 */
   1160   { "joH",		{ Jv, XX, cond_jump_flag } },
   1161   { "jnoH",		{ Jv, XX, cond_jump_flag } },
   1162   { "jbH",		{ Jv, XX, cond_jump_flag } },
   1163   { "jaeH",		{ Jv, XX, cond_jump_flag } },
   1164   { "jeH",		{ Jv, XX, cond_jump_flag } },
   1165   { "jneH",		{ Jv, XX, cond_jump_flag } },
   1166   { "jbeH",		{ Jv, XX, cond_jump_flag } },
   1167   { "jaH",		{ Jv, XX, cond_jump_flag } },
   1168   /* 88 */
   1169   { "jsH",		{ Jv, XX, cond_jump_flag } },
   1170   { "jnsH",		{ Jv, XX, cond_jump_flag } },
   1171   { "jpH",		{ Jv, XX, cond_jump_flag } },
   1172   { "jnpH",		{ Jv, XX, cond_jump_flag } },
   1173   { "jlH",		{ Jv, XX, cond_jump_flag } },
   1174   { "jgeH",		{ Jv, XX, cond_jump_flag } },
   1175   { "jleH",		{ Jv, XX, cond_jump_flag } },
   1176   { "jgH",		{ Jv, XX, cond_jump_flag } },
   1177   /* 90 */
   1178   { "seto",		{ Eb } },
   1179   { "setno",		{ Eb } },
   1180   { "setb",		{ Eb } },
   1181   { "setae",		{ Eb } },
   1182   { "sete",		{ Eb } },
   1183   { "setne",		{ Eb } },
   1184   { "setbe",		{ Eb } },
   1185   { "seta",		{ Eb } },
   1186   /* 98 */
   1187   { "sets",		{ Eb } },
   1188   { "setns",		{ Eb } },
   1189   { "setp",		{ Eb } },
   1190   { "setnp",		{ Eb } },
   1191   { "setl",		{ Eb } },
   1192   { "setge",		{ Eb } },
   1193   { "setle",		{ Eb } },
   1194   { "setg",		{ Eb } },
   1195   /* a0 */
   1196   { "pushT",		{ fs } },
   1197   { "popT",		{ fs } },
   1198   { "cpuid",		{ XX } },
   1199   { "btS",		{ Ev, Gv } },
   1200   { "shldS",		{ Ev, Gv, Ib } },
   1201   { "shldS",		{ Ev, Gv, CL } },
   1202   { GRPPADLCK2 },
   1203   { GRPPADLCK1 },
   1204   /* a8 */
   1205   { "pushT",		{ gs } },
   1206   { "popT",		{ gs } },
   1207   { "rsm",		{ XX } },
   1208   { "btsS",		{ Ev, Gv } },
   1209   { "shrdS",		{ Ev, Gv, Ib } },
   1210   { "shrdS",		{ Ev, Gv, CL } },
   1211   { GRP15 },
   1212   { "imulS",		{ Gv, Ev } },
   1213   /* b0 */
   1214   { "cmpxchgB",		{ Eb, Gb } },
   1215   { "cmpxchgS",		{ Ev, Gv } },
   1216   { "lssS",		{ Gv, Mp } },
   1217   { "btrS",		{ Ev, Gv } },
   1218   { "lfsS",		{ Gv, Mp } },
   1219   { "lgsS",		{ Gv, Mp } },
   1220   { "movz{bR|x|bR|x}",	{ Gv, Eb } },
   1221   { "movz{wR|x|wR|x}",	{ Gv, Ew } }, /* yes, there really is movzww ! */
   1222   /* b8 */
   1223   { PREGRP37 },
   1224   { "ud2b",		{ XX } },
   1225   { GRP8 },
   1226   { "btcS",		{ Ev, Gv } },
   1227   { "bsfS",		{ Gv, Ev } },
   1228   { PREGRP36 },
   1229   { "movs{bR|x|bR|x}",	{ Gv, Eb } },
   1230   { "movs{wR|x|wR|x}",	{ Gv, Ew } }, /* yes, there really is movsww ! */
   1231   /* c0 */
   1232   { "xaddB",		{ Eb, Gb } },
   1233   { "xaddS",		{ Ev, Gv } },
   1234   { PREGRP1 },
   1235   { "movntiS",		{ Ev, Gv } },
   1236   { "pinsrw",		{ MX, Edqw, Ib } },
   1237   { "pextrw",		{ Gdq, MS, Ib } },
   1238   { "shufpX",		{ XM, EXx, Ib } },
   1239   { GRP9 },
   1240   /* c8 */
   1241   { "bswap",		{ RMeAX } },
   1242   { "bswap",		{ RMeCX } },
   1243   { "bswap",		{ RMeDX } },
   1244   { "bswap",		{ RMeBX } },
   1245   { "bswap",		{ RMeSP } },
   1246   { "bswap",		{ RMeBP } },
   1247   { "bswap",		{ RMeSI } },
   1248   { "bswap",		{ RMeDI } },
   1249   /* d0 */
   1250   { PREGRP27 },
   1251   { "psrlw",		{ MX, EM } },
   1252   { "psrld",		{ MX, EM } },
   1253   { "psrlq",		{ MX, EM } },
   1254   { "paddq",		{ MX, EM } },
   1255   { "pmullw",		{ MX, EM } },
   1256   { PREGRP21 },
   1257   { "pmovmskb",		{ Gdq, MS } },
   1258   /* d8 */
   1259   { "psubusb",		{ MX, EM } },
   1260   { "psubusw",		{ MX, EM } },
   1261   { "pminub",		{ MX, EM } },
   1262   { "pand",		{ MX, EM } },
   1263   { "paddusb",		{ MX, EM } },
   1264   { "paddusw",		{ MX, EM } },
   1265   { "pmaxub",		{ MX, EM } },
   1266   { "pandn",		{ MX, EM } },
   1267   /* e0 */
   1268   { "pavgb",		{ MX, EM } },
   1269   { "psraw",		{ MX, EM } },
   1270   { "psrad",		{ MX, EM } },
   1271   { "pavgw",		{ MX, EM } },
   1272   { "pmulhuw",		{ MX, EM } },
   1273   { "pmulhw",		{ MX, EM } },
   1274   { PREGRP15 },
   1275   { PREGRP25 },
   1276   /* e8 */
   1277   { "psubsb",		{ MX, EM } },
   1278   { "psubsw",		{ MX, EM } },
   1279   { "pminsw",		{ MX, EM } },
   1280   { "por",		{ MX, EM } },
   1281   { "paddsb",		{ MX, EM } },
   1282   { "paddsw",		{ MX, EM } },
   1283   { "pmaxsw",		{ MX, EM } },
   1284   { "pxor",		{ MX, EM } },
   1285   /* f0 */
   1286   { PREGRP32 },
   1287   { "psllw",		{ MX, EM } },
   1288   { "pslld",		{ MX, EM } },
   1289   { "psllq",		{ MX, EM } },
   1290   { "pmuludq",		{ MX, EM } },
   1291   { "pmaddwd",		{ MX, EM } },
   1292   { "psadbw",		{ MX, EM } },
   1293   { PREGRP18 },
   1294   /* f8 */
   1295   { "psubb",		{ MX, EM } },
   1296   { "psubw",		{ MX, EM } },
   1297   { "psubd",		{ MX, EM } },
   1298   { "psubq",		{ MX, EM } },
   1299   { "paddb",		{ MX, EM } },
   1300   { "paddw",		{ MX, EM } },
   1301   { "paddd",		{ MX, EM } },
   1302   { "(bad)",		{ XX } },
   1303 };
   1304 
   1305 static const unsigned char onebyte_has_modrm[256] = {
   1306   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1307   /*       -------------------------------        */
   1308   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
   1309   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
   1310   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
   1311   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
   1312   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
   1313   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
   1314   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
   1315   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
   1316   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
   1317   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
   1318   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
   1319   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
   1320   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
   1321   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
   1322   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
   1323   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
   1324   /*       -------------------------------        */
   1325   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1326 };
   1327 
   1328 static const unsigned char twobyte_has_modrm[256] = {
   1329   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1330   /*       -------------------------------        */
   1331   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
   1332   /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
   1333   /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
   1334   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
   1335   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
   1336   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
   1337   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
   1338   /* 70 */ 1,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1, /* 7f */
   1339   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1340   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
   1341   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
   1342   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
   1343   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
   1344   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
   1345   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
   1346   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
   1347   /*       -------------------------------        */
   1348   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1349 };
   1350 
   1351 static const unsigned char twobyte_uses_DATA_prefix[256] = {
   1352   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1353   /*       -------------------------------        */
   1354   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
   1355   /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */
   1356   /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */
   1357   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
   1358   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1359   /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */
   1360   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */
   1361   /* 70 */ 1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1, /* 7f */
   1362   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1363   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1364   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1365   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1366   /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1367   /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
   1368   /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
   1369   /* f0 */ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0  /* ff */
   1370   /*       -------------------------------        */
   1371   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1372 };
   1373 
   1374 static const unsigned char twobyte_uses_REPNZ_prefix[256] = {
   1375   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1376   /*       -------------------------------        */
   1377   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
   1378   /* 10 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
   1379   /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */
   1380   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   1381   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1382   /* 50 */ 0,1,0,0,0,0,0,0,1,1,1,0,1,1,1,1, /* 5f */
   1383   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
   1384   /* 70 */ 1,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0, /* 7f */
   1385   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1386   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1387   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1388   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1389   /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1390   /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
   1391   /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
   1392   /* f0 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1393   /*       -------------------------------        */
   1394   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1395 };
   1396 
   1397 static const unsigned char twobyte_uses_REPZ_prefix[256] = {
   1398   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1399   /*       -------------------------------        */
   1400   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
   1401   /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */
   1402   /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, /* 2f */
   1403   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   1404   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1405   /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */
   1406   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, /* 6f */
   1407   /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 7f */
   1408   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1409   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1410   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1411   /* b0 */ 0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, /* bf */
   1412   /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1413   /* d0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
   1414   /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
   1415   /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1416   /*       -------------------------------        */
   1417   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1418 };
   1419 
   1420 /* This is used to determine if opcode 0f 38 XX uses DATA prefix.  */
   1421 static const unsigned char threebyte_0x38_uses_DATA_prefix[256] = {
   1422   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1423   /*       -------------------------------        */
   1424   /* 00 */ 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, /* 0f */
   1425   /* 10 */ 1,0,0,0,1,1,0,1,0,0,0,0,1,1,1,0, /* 1f */
   1426   /* 20 */ 1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0, /* 2f */
   1427   /* 30 */ 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, /* 3f */
   1428   /* 40 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1429   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
   1430   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
   1431   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
   1432   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1433   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1434   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1435   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1436   /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1437   /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
   1438   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
   1439   /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1440   /*       -------------------------------        */
   1441   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1442 };
   1443 
   1444 /* This is used to determine if opcode 0f 38 XX uses REPNZ prefix.  */
   1445 static const unsigned char threebyte_0x38_uses_REPNZ_prefix[256] = {
   1446   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1447   /*       -------------------------------        */
   1448   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
   1449   /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
   1450   /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
   1451   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   1452   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1453   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
   1454   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
   1455   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
   1456   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1457   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1458   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1459   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1460   /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1461   /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
   1462   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
   1463   /* f0 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1464   /*       -------------------------------        */
   1465   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1466 };
   1467 
   1468 /* This is used to determine if opcode 0f 38 XX uses REPZ prefix.  */
   1469 static const unsigned char threebyte_0x38_uses_REPZ_prefix[256] = {
   1470   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1471   /*       -------------------------------        */
   1472   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
   1473   /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
   1474   /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
   1475   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   1476   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1477   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
   1478   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
   1479   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
   1480   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1481   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1482   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1483   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1484   /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1485   /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
   1486   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
   1487   /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1488   /*       -------------------------------        */
   1489   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1490 };
   1491 
   1492 /* This is used to determine if opcode 0f 3a XX uses DATA prefix.  */
   1493 static const unsigned char threebyte_0x3a_uses_DATA_prefix[256] = {
   1494   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1495   /*       -------------------------------        */
   1496   /* 00 */ 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, /* 0f */
   1497   /* 10 */ 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* 1f */
   1498   /* 20 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
   1499   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   1500   /* 40 */ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1501   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
   1502   /* 60 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
   1503   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
   1504   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1505   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1506   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1507   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1508   /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1509   /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
   1510   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
   1511   /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1512   /*       -------------------------------        */
   1513   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1514 };
   1515 
   1516 /* This is used to determine if opcode 0f 3a XX uses REPNZ prefix.  */
   1517 static const unsigned char threebyte_0x3a_uses_REPNZ_prefix[256] = {
   1518   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1519   /*       -------------------------------        */
   1520   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
   1521   /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
   1522   /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
   1523   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   1524   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1525   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
   1526   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
   1527   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
   1528   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1529   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1530   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1531   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1532   /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1533   /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
   1534   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
   1535   /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1536   /*       -------------------------------        */
   1537   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1538 };
   1539 
   1540 /* This is used to determine if opcode 0f 3a XX uses REPZ prefix.  */
   1541 static const unsigned char threebyte_0x3a_uses_REPZ_prefix[256] = {
   1542   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1543   /*       -------------------------------        */
   1544   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
   1545   /* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
   1546   /* 20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 2f */
   1547   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
   1548   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
   1549   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
   1550   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
   1551   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
   1552   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1553   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
   1554   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
   1555   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
   1556   /* c0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
   1557   /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
   1558   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
   1559   /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ff */
   1560   /*       -------------------------------        */
   1561   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   1562 };
   1563 
   1564 static char obuf[100];
   1565 static char *obufp;
   1566 static char scratchbuf[100];
   1567 static unsigned char *start_codep;
   1568 static unsigned char *insn_codep;
   1569 static unsigned char *codep;
   1570 static disassemble_info *the_info;
   1571 static struct
   1572   {
   1573     int mod;
   1574     int reg;
   1575     int rm;
   1576   }
   1577 modrm;
   1578 static unsigned char need_modrm;
   1579 
   1580 /* If we are accessing mod/rm/reg without need_modrm set, then the
   1581    values are stale.  Hitting this abort likely indicates that you
   1582    need to update onebyte_has_modrm or twobyte_has_modrm.  */
   1583 #define MODRM_CHECK  if (!need_modrm) abort ()
   1584 
   1585 static const char * const *names64;
   1586 static const char * const *names32;
   1587 static const char * const *names16;
   1588 static const char * const *names8;
   1589 static const char * const *names8rex;
   1590 static const char * const *names_seg;
   1591 static const char * const *index16;
   1592 
   1593 static const char * const intel_names64[] = {
   1594   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
   1595   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
   1596 };
   1597 static const char * const intel_names32[] = {
   1598   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
   1599   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
   1600 };
   1601 static const char * const intel_names16[] = {
   1602   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
   1603   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
   1604 };
   1605 static const char * const intel_names8[] = {
   1606   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
   1607 };
   1608 static const char * const intel_names8rex[] = {
   1609   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
   1610   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
   1611 };
   1612 static const char * const intel_names_seg[] = {
   1613   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
   1614 };
   1615 static const char * const intel_index16[] = {
   1616   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
   1617 };
   1618 
   1619 static const char * const att_names64[] = {
   1620   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
   1621   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
   1622 };
   1623 static const char * const att_names32[] = {
   1624   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
   1625   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
   1626 };
   1627 static const char * const att_names16[] = {
   1628   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
   1629   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
   1630 };
   1631 static const char * const att_names8[] = {
   1632   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
   1633 };
   1634 static const char * const att_names8rex[] = {
   1635   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
   1636   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
   1637 };
   1638 static const char * const att_names_seg[] = {
   1639   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
   1640 };
   1641 static const char * const att_index16[] = {
   1642   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
   1643 };
   1644 
   1645 static const struct dis386 grps[][8] = {
   1646   /* GRP1a */
   1647   {
   1648     { "popU",	{ stackEv } },
   1649     { "(bad)",	{ XX } },
   1650     { "(bad)",	{ XX } },
   1651     { "(bad)",	{ XX } },
   1652     { "(bad)",	{ XX } },
   1653     { "(bad)",	{ XX } },
   1654     { "(bad)",	{ XX } },
   1655     { "(bad)",	{ XX } },
   1656   },
   1657   /* GRP1b */
   1658   {
   1659     { "addA",	{ Eb, Ib } },
   1660     { "orA",	{ Eb, Ib } },
   1661     { "adcA",	{ Eb, Ib } },
   1662     { "sbbA",	{ Eb, Ib } },
   1663     { "andA",	{ Eb, Ib } },
   1664     { "subA",	{ Eb, Ib } },
   1665     { "xorA",	{ Eb, Ib } },
   1666     { "cmpA",	{ Eb, Ib } },
   1667   },
   1668   /* GRP1S */
   1669   {
   1670     { "addQ",	{ Ev, Iv } },
   1671     { "orQ",	{ Ev, Iv } },
   1672     { "adcQ",	{ Ev, Iv } },
   1673     { "sbbQ",	{ Ev, Iv } },
   1674     { "andQ",	{ Ev, Iv } },
   1675     { "subQ",	{ Ev, Iv } },
   1676     { "xorQ",	{ Ev, Iv } },
   1677     { "cmpQ",	{ Ev, Iv } },
   1678   },
   1679   /* GRP1Ss */
   1680   {
   1681     { "addQ",	{ Ev, sIb } },
   1682     { "orQ",	{ Ev, sIb } },
   1683     { "adcQ",	{ Ev, sIb } },
   1684     { "sbbQ",	{ Ev, sIb } },
   1685     { "andQ",	{ Ev, sIb } },
   1686     { "subQ",	{ Ev, sIb } },
   1687     { "xorQ",	{ Ev, sIb } },
   1688     { "cmpQ",	{ Ev, sIb } },
   1689   },
   1690   /* GRP2b */
   1691   {
   1692     { "rolA",	{ Eb, Ib } },
   1693     { "rorA",	{ Eb, Ib } },
   1694     { "rclA",	{ Eb, Ib } },
   1695     { "rcrA",	{ Eb, Ib } },
   1696     { "shlA",	{ Eb, Ib } },
   1697     { "shrA",	{ Eb, Ib } },
   1698     { "(bad)",	{ XX } },
   1699     { "sarA",	{ Eb, Ib } },
   1700   },
   1701   /* GRP2S */
   1702   {
   1703     { "rolQ",	{ Ev, Ib } },
   1704     { "rorQ",	{ Ev, Ib } },
   1705     { "rclQ",	{ Ev, Ib } },
   1706     { "rcrQ",	{ Ev, Ib } },
   1707     { "shlQ",	{ Ev, Ib } },
   1708     { "shrQ",	{ Ev, Ib } },
   1709     { "(bad)",	{ XX } },
   1710     { "sarQ",	{ Ev, Ib } },
   1711   },
   1712   /* GRP2b_one */
   1713   {
   1714     { "rolA",	{ Eb, I1 } },
   1715     { "rorA",	{ Eb, I1 } },
   1716     { "rclA",	{ Eb, I1 } },
   1717     { "rcrA",	{ Eb, I1 } },
   1718     { "shlA",	{ Eb, I1 } },
   1719     { "shrA",	{ Eb, I1 } },
   1720     { "(bad)",	{ XX } },
   1721     { "sarA",	{ Eb, I1 } },
   1722   },
   1723   /* GRP2S_one */
   1724   {
   1725     { "rolQ",	{ Ev, I1 } },
   1726     { "rorQ",	{ Ev, I1 } },
   1727     { "rclQ",	{ Ev, I1 } },
   1728     { "rcrQ",	{ Ev, I1 } },
   1729     { "shlQ",	{ Ev, I1 } },
   1730     { "shrQ",	{ Ev, I1 } },
   1731     { "(bad)",	{ XX } },
   1732     { "sarQ",	{ Ev, I1 } },
   1733   },
   1734   /* GRP2b_cl */
   1735   {
   1736     { "rolA",	{ Eb, CL } },
   1737     { "rorA",	{ Eb, CL } },
   1738     { "rclA",	{ Eb, CL } },
   1739     { "rcrA",	{ Eb, CL } },
   1740     { "shlA",	{ Eb, CL } },
   1741     { "shrA",	{ Eb, CL } },
   1742     { "(bad)",	{ XX } },
   1743     { "sarA",	{ Eb, CL } },
   1744   },
   1745   /* GRP2S_cl */
   1746   {
   1747     { "rolQ",	{ Ev, CL } },
   1748     { "rorQ",	{ Ev, CL } },
   1749     { "rclQ",	{ Ev, CL } },
   1750     { "rcrQ",	{ Ev, CL } },
   1751     { "shlQ",	{ Ev, CL } },
   1752     { "shrQ",	{ Ev, CL } },
   1753     { "(bad)",	{ XX } },
   1754     { "sarQ",	{ Ev, CL } },
   1755   },
   1756   /* GRP3b */
   1757   {
   1758     { "testA",	{ Eb, Ib } },
   1759     { "(bad)",	{ Eb } },
   1760     { "notA",	{ Eb } },
   1761     { "negA",	{ Eb } },
   1762     { "mulA",	{ Eb } },	/* Don't print the implicit %al register,  */
   1763     { "imulA",	{ Eb } },	/* to distinguish these opcodes from other */
   1764     { "divA",	{ Eb } },	/* mul/imul opcodes.  Do the same for div  */
   1765     { "idivA",	{ Eb } },	/* and idiv for consistency.		   */
   1766   },
   1767   /* GRP3S */
   1768   {
   1769     { "testQ",	{ Ev, Iv } },
   1770     { "(bad)",	{ XX } },
   1771     { "notQ",	{ Ev } },
   1772     { "negQ",	{ Ev } },
   1773     { "mulQ",	{ Ev } },	/* Don't print the implicit register.  */
   1774     { "imulQ",	{ Ev } },
   1775     { "divQ",	{ Ev } },
   1776     { "idivQ",	{ Ev } },
   1777   },
   1778   /* GRP4 */
   1779   {
   1780     { "incA",	{ Eb } },
   1781     { "decA",	{ Eb } },
   1782     { "(bad)",	{ XX } },
   1783     { "(bad)",	{ XX } },
   1784     { "(bad)",	{ XX } },
   1785     { "(bad)",	{ XX } },
   1786     { "(bad)",	{ XX } },
   1787     { "(bad)",	{ XX } },
   1788   },
   1789   /* GRP5 */
   1790   {
   1791     { "incQ",	{ Ev } },
   1792     { "decQ",	{ Ev } },
   1793     { "callT",	{ indirEv } },
   1794     { "JcallT",	{ indirEp } },
   1795     { "jmpT",	{ indirEv } },
   1796     { "JjmpT",	{ indirEp } },
   1797     { "pushU",	{ stackEv } },
   1798     { "(bad)",	{ XX } },
   1799   },
   1800   /* GRP6 */
   1801   {
   1802     { "sldtD",	{ Sv } },
   1803     { "strD",	{ Sv } },
   1804     { "lldt",	{ Ew } },
   1805     { "ltr",	{ Ew } },
   1806     { "verr",	{ Ew } },
   1807     { "verw",	{ Ew } },
   1808     { "(bad)",	{ XX } },
   1809     { "(bad)",	{ XX } },
   1810   },
   1811   /* GRP7 */
   1812   {
   1813     { "sgdt{Q|IQ||}", { { VMX_Fixup, 0 } } },
   1814     { "sidt{Q|IQ||}", { { PNI_Fixup, 0 } } },
   1815     { "lgdt{Q|Q||}",	 { M } },
   1816     { "lidt{Q|Q||}",	 { { SVME_Fixup, 0 } } },
   1817     { "smswD",	{ Sv } },
   1818     { "(bad)",	{ XX } },
   1819     { "lmsw",	{ Ew } },
   1820     { "invlpg",	{ { INVLPG_Fixup, w_mode } } },
   1821   },
   1822   /* GRP8 */
   1823   {
   1824     { "(bad)",	{ XX } },
   1825     { "(bad)",	{ XX } },
   1826     { "(bad)",	{ XX } },
   1827     { "(bad)",	{ XX } },
   1828     { "btQ",	{ Ev, Ib } },
   1829     { "btsQ",	{ Ev, Ib } },
   1830     { "btrQ",	{ Ev, Ib } },
   1831     { "btcQ",	{ Ev, Ib } },
   1832   },
   1833   /* GRP9 */
   1834   {
   1835     { "(bad)",	{ XX } },
   1836     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
   1837     { "(bad)",	{ XX } },
   1838     { "(bad)",	{ XX } },
   1839     { "(bad)",	{ XX } },
   1840     { "(bad)",	{ XX } },
   1841     { "",	{ VM } },		/* See OP_VMX.  */
   1842     { "vmptrst", { Mq } },
   1843   },
   1844   /* GRP11_C6 */
   1845   {
   1846     { "movA",	{ Eb, Ib } },
   1847     { "(bad)",	{ XX } },
   1848     { "(bad)",	{ XX } },
   1849     { "(bad)",	{ XX } },
   1850     { "(bad)",	{ XX } },
   1851     { "(bad)",	{ XX } },
   1852     { "(bad)",	{ XX } },
   1853     { "(bad)",	{ XX } },
   1854   },
   1855   /* GRP11_C7 */
   1856   {
   1857     { "movQ",	{ Ev, Iv } },
   1858     { "(bad)",	{ XX } },
   1859     { "(bad)",	{ XX } },
   1860     { "(bad)",	{ XX } },
   1861     { "(bad)",	{ XX } },
   1862     { "(bad)",	{ XX } },
   1863     { "(bad)",	{ XX } },
   1864     { "(bad)",  { XX } },
   1865   },
   1866   /* GRP12 */
   1867   {
   1868     { "(bad)",	{ XX } },
   1869     { "(bad)",	{ XX } },
   1870     { "psrlw",	{ MS, Ib } },
   1871     { "(bad)",	{ XX } },
   1872     { "psraw",	{ MS, Ib } },
   1873     { "(bad)",	{ XX } },
   1874     { "psllw",	{ MS, Ib } },
   1875     { "(bad)",	{ XX } },
   1876   },
   1877   /* GRP13 */
   1878   {
   1879     { "(bad)",	{ XX } },
   1880     { "(bad)",	{ XX } },
   1881     { "psrld",	{ MS, Ib } },
   1882     { "(bad)",	{ XX } },
   1883     { "psrad",	{ MS, Ib } },
   1884     { "(bad)",	{ XX } },
   1885     { "pslld",	{ MS, Ib } },
   1886     { "(bad)",	{ XX } },
   1887   },
   1888   /* GRP14 */
   1889   {
   1890     { "(bad)",	{ XX } },
   1891     { "(bad)",	{ XX } },
   1892     { "psrlq",	{ MS, Ib } },
   1893     { "psrldq",	{ MS, Ib } },
   1894     { "(bad)",	{ XX } },
   1895     { "(bad)",	{ XX } },
   1896     { "psllq",	{ MS, Ib } },
   1897     { "pslldq",	{ MS, Ib } },
   1898   },
   1899   /* GRP15 */
   1900   {
   1901     { "fxsave",		{ Ev } },
   1902     { "fxrstor",	{ Ev } },
   1903     { "ldmxcsr",	{ Ev } },
   1904     { "stmxcsr",	{ Ev } },
   1905     { "(bad)",		{ XX } },
   1906     { "lfence",		{ { OP_0fae, 0 } } },
   1907     { "mfence",		{ { OP_0fae, 0 } } },
   1908     { "clflush",	{ { OP_0fae, 0 } } },
   1909   },
   1910   /* GRP16 */
   1911   {
   1912     { "prefetchnta",	{ Ev } },
   1913     { "prefetcht0",	{ Ev } },
   1914     { "prefetcht1",	{ Ev } },
   1915     { "prefetcht2",	{ Ev } },
   1916     { "(bad)",		{ XX } },
   1917     { "(bad)",		{ XX } },
   1918     { "(bad)",		{ XX } },
   1919     { "(bad)",		{ XX } },
   1920   },
   1921   /* GRPAMD */
   1922   {
   1923     { "prefetch",	{ Eb } },
   1924     { "prefetchw",	{ Eb } },
   1925     { "(bad)",		{ XX } },
   1926     { "(bad)",		{ XX } },
   1927     { "(bad)",		{ XX } },
   1928     { "(bad)",		{ XX } },
   1929     { "(bad)",		{ XX } },
   1930     { "(bad)",		{ XX } },
   1931   },
   1932   /* GRPPADLCK1 */
   1933   {
   1934     { "xstore-rng",	{ { OP_0f07, 0 } } },
   1935     { "xcrypt-ecb",	{ { OP_0f07, 0 } } },
   1936     { "xcrypt-cbc",	{ { OP_0f07, 0 } } },
   1937     { "xcrypt-ctr",	{ { OP_0f07, 0 } } },
   1938     { "xcrypt-cfb",	{ { OP_0f07, 0 } } },
   1939     { "xcrypt-ofb",	{ { OP_0f07, 0 } } },
   1940     { "(bad)",		{ { OP_0f07, 0 } } },
   1941     { "(bad)",		{ { OP_0f07, 0 } } },
   1942   },
   1943   /* GRPPADLCK2 */
   1944   {
   1945     { "montmul",	{ { OP_0f07, 0 } } },
   1946     { "xsha1",		{ { OP_0f07, 0 } } },
   1947     { "xsha256",	{ { OP_0f07, 0 } } },
   1948     { "(bad)",		{ { OP_0f07, 0 } } },
   1949     { "(bad)",		{ { OP_0f07, 0 } } },
   1950     { "(bad)",		{ { OP_0f07, 0 } } },
   1951     { "(bad)",		{ { OP_0f07, 0 } } },
   1952     { "(bad)",		{ { OP_0f07, 0 } } },
   1953   }
   1954 };
   1955 
   1956 static const struct dis386 prefix_user_table[][4] = {
   1957   /* PREGRP0 */
   1958   {
   1959     { "addps", { XM, EXx } },
   1960     { "addss", { XM, EXd } },
   1961     { "addpd", { XM, EXx } },
   1962     { "addsd", { XM, EXq } },
   1963   },
   1964   /* PREGRP1 */
   1965   {
   1966     { "", { XM, EXx, OPSIMD } },	/* See OP_SIMD_SUFFIX.  */
   1967     { "", { XM, EXx, OPSIMD } },
   1968     { "", { XM, EXx, OPSIMD } },
   1969     { "", { XM, EXx, OPSIMD } },
   1970   },
   1971   /* PREGRP2 */
   1972   {
   1973     { "cvtpi2ps", { XM, EMC } },
   1974     { "cvtsi2ssY", { XM, Ev } },
   1975     { "cvtpi2pd", { XM, EMC } },
   1976     { "cvtsi2sdY", { XM, Ev } },
   1977   },
   1978   /* PREGRP3 */
   1979   {
   1980     { "cvtps2pi", { MXC, EXx } },
   1981     { "cvtss2siY", { Gv, EXx } },
   1982     { "cvtpd2pi", { MXC, EXx } },
   1983     { "cvtsd2siY", { Gv, EXx } },
   1984   },
   1985   /* PREGRP4 */
   1986   {
   1987     { "cvttps2pi", { MXC, EXx } },
   1988     { "cvttss2siY", { Gv, EXx } },
   1989     { "cvttpd2pi", { MXC, EXx } },
   1990     { "cvttsd2siY", { Gv, EXx } },
   1991   },
   1992   /* PREGRP5 */
   1993   {
   1994     { "divps",	{ XM, EXx } },
   1995     { "divss",	{ XM, EXx } },
   1996     { "divpd",	{ XM, EXx } },
   1997     { "divsd",	{ XM, EXx } },
   1998   },
   1999   /* PREGRP6 */
   2000   {
   2001     { "maxps",	{ XM, EXx } },
   2002     { "maxss",	{ XM, EXx } },
   2003     { "maxpd",	{ XM, EXx } },
   2004     { "maxsd",	{ XM, EXx } },
   2005   },
   2006   /* PREGRP7 */
   2007   {
   2008     { "minps",	{ XM, EXx } },
   2009     { "minss",	{ XM, EXx } },
   2010     { "minpd",	{ XM, EXx } },
   2011     { "minsd",	{ XM, EXx } },
   2012   },
   2013   /* PREGRP8 */
   2014   {
   2015     { "movups",	{ XM, EXx } },
   2016     { "movss",	{ XM, EXx } },
   2017     { "movupd",	{ XM, EXx } },
   2018     { "movsd",	{ XM, EXx } },
   2019   },
   2020   /* PREGRP9 */
   2021   {
   2022     { "movups",	{ EXx,  XM } },
   2023     { "movss",	{ EXx,  XM } },
   2024     { "movupd",	{ EXx,  XM } },
   2025     { "movsd",	{ EXx,  XM } },
   2026   },
   2027   /* PREGRP10 */
   2028   {
   2029     { "mulps",	{ XM, EXx } },
   2030     { "mulss",	{ XM, EXx } },
   2031     { "mulpd",	{ XM, EXx } },
   2032     { "mulsd",	{ XM, EXx } },
   2033   },
   2034   /* PREGRP11 */
   2035   {
   2036     { "rcpps",	{ XM, EXx } },
   2037     { "rcpss",	{ XM, EXx } },
   2038     { "(bad)",	{ XM, EXx } },
   2039     { "(bad)",	{ XM, EXx } },
   2040   },
   2041   /* PREGRP12 */
   2042   {
   2043     { "rsqrtps",{ XM, EXx } },
   2044     { "rsqrtss",{ XM, EXx } },
   2045     { "(bad)",	{ XM, EXx } },
   2046     { "(bad)",	{ XM, EXx } },
   2047   },
   2048   /* PREGRP13 */
   2049   {
   2050     { "sqrtps", { XM, EXx } },
   2051     { "sqrtss", { XM, EXx } },
   2052     { "sqrtpd", { XM, EXx } },
   2053     { "sqrtsd",	{ XM, EXx } },
   2054   },
   2055   /* PREGRP14 */
   2056   {
   2057     { "subps",	{ XM, EXx } },
   2058     { "subss",	{ XM, EXx } },
   2059     { "subpd",	{ XM, EXx } },
   2060     { "subsd",	{ XM, EXx } },
   2061   },
   2062   /* PREGRP15 */
   2063   {
   2064     { "(bad)",	{ XM, EXx } },
   2065     { "cvtdq2pd", { XM, EXq } },
   2066     { "cvttpd2dq", { XM, EXx } },
   2067     { "cvtpd2dq", { XM, EXx } },
   2068   },
   2069   /* PREGRP16 */
   2070   {
   2071     { "cvtdq2ps", { XM, EXx } },
   2072     { "cvttps2dq", { XM, EXx } },
   2073     { "cvtps2dq", { XM, EXx } },
   2074     { "(bad)",	{ XM, EXx } },
   2075   },
   2076   /* PREGRP17 */
   2077   {
   2078     { "cvtps2pd", { XM, EXq } },
   2079     { "cvtss2sd", { XM, EXx } },
   2080     { "cvtpd2ps", { XM, EXx } },
   2081     { "cvtsd2ss", { XM, EXx } },
   2082   },
   2083   /* PREGRP18 */
   2084   {
   2085     { "maskmovq", { MX, MS } },
   2086     { "(bad)",	{ XM, EXx } },
   2087     { "maskmovdqu", { XM, XS } },
   2088     { "(bad)",	{ XM, EXx } },
   2089   },
   2090   /* PREGRP19 */
   2091   {
   2092     { "movq",	{ MX, EM } },
   2093     { "movdqu",	{ XM, EXx } },
   2094     { "movdqa",	{ XM, EXx } },
   2095     { "(bad)",	{ XM, EXx } },
   2096   },
   2097   /* PREGRP20 */
   2098   {
   2099     { "movq",	{ EM, MX } },
   2100     { "movdqu",	{ EXx,  XM } },
   2101     { "movdqa",	{ EXx,  XM } },
   2102     { "(bad)",	{ EXx,  XM } },
   2103   },
   2104   /* PREGRP21 */
   2105   {
   2106     { "(bad)",	{ EXx,  XM } },
   2107     { "movq2dq",{ XM, MS } },
   2108     { "movq",	{ EXx,  XM } },
   2109     { "movdq2q",{ MX, XS } },
   2110   },
   2111   /* PREGRP22 */
   2112   {
   2113     { "pshufw",	{ MX, EM, Ib } },
   2114     { "pshufhw",{ XM, EXx, Ib } },
   2115     { "pshufd",	{ XM, EXx, Ib } },
   2116     { "pshuflw",{ XM, EXx, Ib } },
   2117   },
   2118   /* PREGRP23 */
   2119   {
   2120     { "movd",	{ Edq, MX } },
   2121     { "movq",	{ XM, EXx } },
   2122     { "movd",	{ Edq, XM } },
   2123     { "(bad)",	{ Ed, XM } },
   2124   },
   2125   /* PREGRP24 */
   2126   {
   2127     { "(bad)",	{ MX, EXx } },
   2128     { "(bad)",	{ XM, EXx } },
   2129     { "punpckhqdq", { XM, EXx } },
   2130     { "(bad)",	{ XM, EXx } },
   2131   },
   2132   /* PREGRP25 */
   2133   {
   2134     { "movntq",	{ EM, MX } },
   2135     { "(bad)",	{ EM, XM } },
   2136     { "movntdq",{ EM, XM } },
   2137     { "(bad)",	{ EM, XM } },
   2138   },
   2139   /* PREGRP26 */
   2140   {
   2141     { "(bad)",	{ MX, EXx } },
   2142     { "(bad)",	{ XM, EXx } },
   2143     { "punpcklqdq", { XM, EXx } },
   2144     { "(bad)",	{ XM, EXx } },
   2145   },
   2146   /* PREGRP27 */
   2147   {
   2148     { "(bad)",	{ MX, EXx } },
   2149     { "(bad)",	{ XM, EXx } },
   2150     { "addsubpd", { XM, EXx } },
   2151     { "addsubps", { XM, EXx } },
   2152   },
   2153   /* PREGRP28 */
   2154   {
   2155     { "(bad)",	{ MX, EXx } },
   2156     { "(bad)",	{ XM, EXx } },
   2157     { "haddpd",	{ XM, EXx } },
   2158     { "haddps",	{ XM, EXx } },
   2159   },
   2160   /* PREGRP29 */
   2161   {
   2162     { "(bad)",	{ MX, EXx } },
   2163     { "(bad)",	{ XM, EXx } },
   2164     { "hsubpd",	{ XM, EXx } },
   2165     { "hsubps",	{ XM, EXx } },
   2166   },
   2167   /* PREGRP30 */
   2168   {
   2169     { "movlpX",	{ XM, EXq, { SIMD_Fixup, 'h' } } }, /* really only 2 operands */
   2170     { "movsldup", { XM, EXx } },
   2171     { "movlpd",	{ XM, EXq } },
   2172     { "movddup", { XM, EXq } },
   2173   },
   2174   /* PREGRP31 */
   2175   {
   2176     { "movhpX",	{ XM, EXq, { SIMD_Fixup, 'l' } } },
   2177     { "movshdup", { XM, EXx } },
   2178     { "movhpd",	{ XM, EXq } },
   2179     { "(bad)",	{ XM, EXq } },
   2180   },
   2181   /* PREGRP32 */
   2182   {
   2183     { "(bad)",	{ XM, EXx } },
   2184     { "(bad)",	{ XM, EXx } },
   2185     { "(bad)",	{ XM, EXx } },
   2186     { "lddqu",	{ XM, M } },
   2187   },
   2188   /* PREGRP33 */
   2189   {
   2190     {"movntps", { Ev, XM } },
   2191     {"movntss", { Ev, XM } },
   2192     {"movntpd", { Ev, XM } },
   2193     {"movntsd", { Ev, XM } },
   2194   },
   2195 
   2196   /* PREGRP34 */
   2197   {
   2198     {"vmread",	{ Em, Gm } },
   2199     {"(bad)",	{ XX } },
   2200     {"extrq",	{ XS, Ib, Ib } },
   2201     {"insertq",	{ XM, XS, Ib, Ib } },
   2202   },
   2203 
   2204  /* PREGRP35 */
   2205   {
   2206     {"vmwrite",	{ Gm, Em } },
   2207     {"(bad)",	{ XX } },
   2208     {"extrq",	{ XM, XS } },
   2209     {"insertq",	{ XM, XS } },
   2210   },
   2211 
   2212   /* PREGRP36 */
   2213   {
   2214     { "bsrS",	{ Gv, Ev } },
   2215     { "lzcntS",	{ Gv, Ev } },
   2216     { "bsrS",	{ Gv, Ev } },
   2217     { "(bad)",	{ XX } },
   2218   },
   2219 
   2220   /* PREGRP37 */
   2221   {
   2222     { "(bad)", { XX } },
   2223     { "popcntS", { Gv, Ev } },
   2224     { "(bad)", { XX } },
   2225     { "(bad)", { XX } },
   2226   },
   2227 
   2228   /* PREGRP38 */
   2229   {
   2230     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
   2231     { "pause", { XX } },
   2232     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
   2233     { "(bad)", { XX } },
   2234   },
   2235 
   2236   /* PREGRP39 */
   2237   {
   2238     { "(bad)",	{ XX } },
   2239     { "(bad)",	{ XX } },
   2240     { "pblendvb", {XM, EXx, XMM0 } },
   2241     { "(bad)",	{ XX } },
   2242   },
   2243 
   2244   /* PREGRP40 */
   2245   {
   2246     { "(bad)",	{ XX } },
   2247     { "(bad)",	{ XX } },
   2248     { "blendvps", {XM, EXx, XMM0 } },
   2249     { "(bad)",	{ XX } },
   2250   },
   2251 
   2252   /* PREGRP41 */
   2253   {
   2254     { "(bad)",	{ XX } },
   2255     { "(bad)",	{ XX } },
   2256     { "blendvpd", { XM, EXx, XMM0 } },
   2257     { "(bad)",	{ XX } },
   2258   },
   2259 
   2260   /* PREGRP42 */
   2261   {
   2262     { "(bad)",	{ XX } },
   2263     { "(bad)",	{ XX } },
   2264     { "ptest",  { XM, EXx } },
   2265     { "(bad)",	{ XX } },
   2266   },
   2267 
   2268   /* PREGRP43 */
   2269   {
   2270     { "(bad)",	{ XX } },
   2271     { "(bad)",	{ XX } },
   2272     { "pmovsxbw", { XM, EXx } },
   2273     { "(bad)",	{ XX } },
   2274   },
   2275 
   2276   /* PREGRP44 */
   2277   {
   2278     { "(bad)",	{ XX } },
   2279     { "(bad)",	{ XX } },
   2280     { "pmovsxbd", { XM, EXx } },
   2281     { "(bad)",	{ XX } },
   2282   },
   2283 
   2284   /* PREGRP45 */
   2285   {
   2286     { "(bad)",	{ XX } },
   2287     { "(bad)",	{ XX } },
   2288     { "pmovsxbq", { XM, EXx } },
   2289     { "(bad)",	{ XX } },
   2290   },
   2291 
   2292   /* PREGRP46 */
   2293   {
   2294     { "(bad)",	{ XX } },
   2295     { "(bad)",	{ XX } },
   2296     { "pmovsxwd", { XM, EXx } },
   2297     { "(bad)",	{ XX } },
   2298   },
   2299 
   2300   /* PREGRP47 */
   2301   {
   2302     { "(bad)",	{ XX } },
   2303     { "(bad)",	{ XX } },
   2304     { "pmovsxwq", { XM, EXx } },
   2305     { "(bad)",	{ XX } },
   2306   },
   2307 
   2308   /* PREGRP48 */
   2309   {
   2310     { "(bad)",	{ XX } },
   2311     { "(bad)",	{ XX } },
   2312     { "pmovsxdq", { XM, EXx } },
   2313     { "(bad)",	{ XX } },
   2314   },
   2315 
   2316   /* PREGRP49 */
   2317   {
   2318     { "(bad)",	{ XX } },
   2319     { "(bad)",	{ XX } },
   2320     { "pmuldq", { XM, EXx } },
   2321     { "(bad)",	{ XX } },
   2322   },
   2323 
   2324   /* PREGRP50 */
   2325   {
   2326     { "(bad)",	{ XX } },
   2327     { "(bad)",	{ XX } },
   2328     { "pcmpeqq", { XM, EXx } },
   2329     { "(bad)",	{ XX } },
   2330   },
   2331 
   2332   /* PREGRP51 */
   2333   {
   2334     { "(bad)",	{ XX } },
   2335     { "(bad)",	{ XX } },
   2336     { "movntdqa", { XM, EM } },
   2337     { "(bad)",	{ XX } },
   2338   },
   2339 
   2340   /* PREGRP52 */
   2341   {
   2342     { "(bad)",	{ XX } },
   2343     { "(bad)",	{ XX } },
   2344     { "packusdw", { XM, EXx } },
   2345     { "(bad)",	{ XX } },
   2346   },
   2347 
   2348   /* PREGRP53 */
   2349   {
   2350     { "(bad)",	{ XX } },
   2351     { "(bad)",	{ XX } },
   2352     { "pmovzxbw", { XM, EXx } },
   2353     { "(bad)",	{ XX } },
   2354   },
   2355 
   2356   /* PREGRP54 */
   2357   {
   2358     { "(bad)",	{ XX } },
   2359     { "(bad)",	{ XX } },
   2360     { "pmovzxbd", { XM, EXx } },
   2361     { "(bad)",	{ XX } },
   2362   },
   2363 
   2364   /* PREGRP55 */
   2365   {
   2366     { "(bad)",	{ XX } },
   2367     { "(bad)",	{ XX } },
   2368     { "pmovzxbq", { XM, EXx } },
   2369     { "(bad)",	{ XX } },
   2370   },
   2371 
   2372   /* PREGRP56 */
   2373   {
   2374     { "(bad)",	{ XX } },
   2375     { "(bad)",	{ XX } },
   2376     { "pmovzxwd", { XM, EXx } },
   2377     { "(bad)",	{ XX } },
   2378   },
   2379 
   2380   /* PREGRP57 */
   2381   {
   2382     { "(bad)",	{ XX } },
   2383     { "(bad)",	{ XX } },
   2384     { "pmovzxwq", { XM, EXx } },
   2385     { "(bad)",	{ XX } },
   2386   },
   2387 
   2388   /* PREGRP58 */
   2389   {
   2390     { "(bad)",	{ XX } },
   2391     { "(bad)",	{ XX } },
   2392     { "pmovzxdq", { XM, EXx } },
   2393     { "(bad)",	{ XX } },
   2394   },
   2395 
   2396   /* PREGRP59 */
   2397   {
   2398     { "(bad)",	{ XX } },
   2399     { "(bad)",	{ XX } },
   2400     { "pminsb",	{ XM, EXx } },
   2401     { "(bad)",	{ XX } },
   2402   },
   2403 
   2404   /* PREGRP60 */
   2405   {
   2406     { "(bad)",	{ XX } },
   2407     { "(bad)",	{ XX } },
   2408     { "pminsd",	{ XM, EXx } },
   2409     { "(bad)",	{ XX } },
   2410   },
   2411 
   2412   /* PREGRP61 */
   2413   {
   2414     { "(bad)",	{ XX } },
   2415     { "(bad)",	{ XX } },
   2416     { "pminuw",	{ XM, EXx } },
   2417     { "(bad)",	{ XX } },
   2418   },
   2419 
   2420   /* PREGRP62 */
   2421   {
   2422     { "(bad)",	{ XX } },
   2423     { "(bad)",	{ XX } },
   2424     { "pminud",	{ XM, EXx } },
   2425     { "(bad)",	{ XX } },
   2426   },
   2427 
   2428   /* PREGRP63 */
   2429   {
   2430     { "(bad)",	{ XX } },
   2431     { "(bad)",	{ XX } },
   2432     { "pmaxsb",	{ XM, EXx } },
   2433     { "(bad)",	{ XX } },
   2434   },
   2435 
   2436   /* PREGRP64 */
   2437   {
   2438     { "(bad)",	{ XX } },
   2439     { "(bad)",	{ XX } },
   2440     { "pmaxsd",	{ XM, EXx } },
   2441     { "(bad)",	{ XX } },
   2442   },
   2443 
   2444   /* PREGRP65 */
   2445   {
   2446     { "(bad)",	{ XX } },
   2447     { "(bad)",	{ XX } },
   2448     { "pmaxuw", { XM, EXx } },
   2449     { "(bad)",	{ XX } },
   2450   },
   2451 
   2452   /* PREGRP66 */
   2453   {
   2454     { "(bad)",	{ XX } },
   2455     { "(bad)",	{ XX } },
   2456     { "pmaxud", { XM, EXx } },
   2457     { "(bad)",	{ XX } },
   2458   },
   2459 
   2460   /* PREGRP67 */
   2461   {
   2462     { "(bad)",	{ XX } },
   2463     { "(bad)",	{ XX } },
   2464     { "pmulld", { XM, EXx } },
   2465     { "(bad)",	{ XX } },
   2466   },
   2467 
   2468   /* PREGRP68 */
   2469   {
   2470     { "(bad)",	{ XX } },
   2471     { "(bad)",	{ XX } },
   2472     { "phminposuw", { XM, EXx } },
   2473     { "(bad)",	{ XX } },
   2474   },
   2475 
   2476   /* PREGRP69 */
   2477   {
   2478     { "(bad)",	{ XX } },
   2479     { "(bad)",	{ XX } },
   2480     { "roundps", { XM, EXx, Ib } },
   2481     { "(bad)",	{ XX } },
   2482   },
   2483 
   2484   /* PREGRP70 */
   2485   {
   2486     { "(bad)",	{ XX } },
   2487     { "(bad)",	{ XX } },
   2488     { "roundpd", { XM, EXx, Ib } },
   2489     { "(bad)",	{ XX } },
   2490   },
   2491 
   2492   /* PREGRP71 */
   2493   {
   2494     { "(bad)",	{ XX } },
   2495     { "(bad)",	{ XX } },
   2496     { "roundss", { XM, EXx, Ib } },
   2497     { "(bad)",	{ XX } },
   2498   },
   2499 
   2500   /* PREGRP72 */
   2501   {
   2502     { "(bad)",	{ XX } },
   2503     { "(bad)",	{ XX } },
   2504     { "roundsd", { XM, EXx, Ib } },
   2505     { "(bad)",	{ XX } },
   2506   },
   2507 
   2508   /* PREGRP73 */
   2509   {
   2510     { "(bad)",	{ XX } },
   2511     { "(bad)",	{ XX } },
   2512     { "blendps", { XM, EXx, Ib } },
   2513     { "(bad)",	{ XX } },
   2514   },
   2515 
   2516   /* PREGRP74 */
   2517   {
   2518     { "(bad)",	{ XX } },
   2519     { "(bad)",	{ XX } },
   2520     { "blendpd", { XM, EXx, Ib } },
   2521     { "(bad)",	{ XX } },
   2522   },
   2523 
   2524   /* PREGRP75 */
   2525   {
   2526     { "(bad)",	{ XX } },
   2527     { "(bad)",	{ XX } },
   2528     { "pblendw", { XM, EXx, Ib } },
   2529     { "(bad)",	{ XX } },
   2530   },
   2531 
   2532   /* PREGRP76 */
   2533   {
   2534     { "(bad)",	{ XX } },
   2535     { "(bad)",	{ XX } },
   2536     { "pextrb",	{ Edqb, XM, Ib } },
   2537     { "(bad)",	{ XX } },
   2538   },
   2539 
   2540   /* PREGRP77 */
   2541   {
   2542     { "(bad)",	{ XX } },
   2543     { "(bad)",	{ XX } },
   2544     { "pextrw",	{ Edqw, XM, Ib } },
   2545     { "(bad)",	{ XX } },
   2546   },
   2547 
   2548   /* PREGRP78 */
   2549   {
   2550     { "(bad)",	{ XX } },
   2551     { "(bad)",	{ XX } },
   2552     { "pextrK",	{ Edq, XM, Ib } },
   2553     { "(bad)",	{ XX } },
   2554   },
   2555 
   2556   /* PREGRP79 */
   2557   {
   2558     { "(bad)",	{ XX } },
   2559     { "(bad)",	{ XX } },
   2560     { "extractps", { Edqd, XM, Ib } },
   2561     { "(bad)",	{ XX } },
   2562   },
   2563 
   2564   /* PREGRP80 */
   2565   {
   2566     { "(bad)",	{ XX } },
   2567     { "(bad)",	{ XX } },
   2568     { "pinsrb",	{ XM, Edqb, Ib } },
   2569     { "(bad)",	{ XX } },
   2570   },
   2571 
   2572   /* PREGRP81 */
   2573   {
   2574     { "(bad)",	{ XX } },
   2575     { "(bad)",	{ XX } },
   2576     { "insertps", { XM, EXx, Ib } },
   2577     { "(bad)",	{ XX } },
   2578   },
   2579 
   2580   /* PREGRP82 */
   2581   {
   2582     { "(bad)",	{ XX } },
   2583     { "(bad)",	{ XX } },
   2584     { "pinsrK",	{ XM, Edq, Ib } },
   2585     { "(bad)",	{ XX } },
   2586   },
   2587 
   2588   /* PREGRP83 */
   2589   {
   2590     { "(bad)",	{ XX } },
   2591     { "(bad)",	{ XX } },
   2592     { "dpps",	{ XM, EXx, Ib } },
   2593     { "(bad)",	{ XX } },
   2594   },
   2595 
   2596   /* PREGRP84 */
   2597   {
   2598     { "(bad)",	{ XX } },
   2599     { "(bad)",	{ XX } },
   2600     { "dppd",	{ XM, EXx, Ib } },
   2601     { "(bad)",	{ XX } },
   2602   },
   2603 
   2604   /* PREGRP85 */
   2605   {
   2606     { "(bad)",	{ XX } },
   2607     { "(bad)",	{ XX } },
   2608     { "mpsadbw", { XM, EXx, Ib } },
   2609     { "(bad)",	{ XX } },
   2610   },
   2611 
   2612   /* PREGRP86 */
   2613   {
   2614     { "(bad)",	{ XX } },
   2615     { "(bad)",	{ XX } },
   2616     { "pcmpgtq", { XM, EXx } },
   2617     { "(bad)",	{ XX } },
   2618   },
   2619 
   2620   /* PREGRP87 */
   2621   {
   2622     { "(bad)",	{ XX } },
   2623     { "(bad)",	{ XX } },
   2624     { "(bad)",	{ XX } },
   2625     { "crc32",	{ Gdq, { CRC32_Fixup, b_mode } } },
   2626   },
   2627 
   2628   /* PREGRP88 */
   2629   {
   2630     { "(bad)",	{ XX } },
   2631     { "(bad)",	{ XX } },
   2632     { "(bad)",	{ XX } },
   2633     { "crc32",	{ Gdq, { CRC32_Fixup, v_mode } } },
   2634   },
   2635 
   2636   /* PREGRP89 */
   2637   {
   2638     { "(bad)",	{ XX } },
   2639     { "(bad)",	{ XX } },
   2640     { "pcmpestrm", { XM, EXx, Ib } },
   2641     { "(bad)",	{ XX } },
   2642   },
   2643 
   2644   /* PREGRP90 */
   2645   {
   2646     { "(bad)",	{ XX } },
   2647     { "(bad)",	{ XX } },
   2648     { "pcmpestri", { XM, EXx, Ib } },
   2649     { "(bad)",	{ XX } },
   2650   },
   2651 
   2652   /* PREGRP91 */
   2653   {
   2654     { "(bad)",	{ XX } },
   2655     { "(bad)",	{ XX } },
   2656     { "pcmpistrm", { XM, EXx, Ib } },
   2657     { "(bad)",	{ XX } },
   2658   },
   2659 
   2660   /* PREGRP92 */
   2661   {
   2662     { "(bad)",	{ XX } },
   2663     { "(bad)",	{ XX } },
   2664     { "pcmpistri", { XM, EXx, Ib } },
   2665     { "(bad)",	{ XX } },
   2666   },
   2667 
   2668   /* PREGRP93 */
   2669   {
   2670     { "ucomiss",{ XM, EXd } },
   2671     { "(bad)",	{ XX } },
   2672     { "ucomisd",{ XM, EXq } },
   2673     { "(bad)",	{ XX } },
   2674   },
   2675 
   2676   /* PREGRP94 */
   2677   {
   2678     { "comiss",	{ XM, EXd } },
   2679     { "(bad)",	{ XX } },
   2680     { "comisd",	{ XM, EXq } },
   2681     { "(bad)",	{ XX } },
   2682   },
   2683 
   2684   /* PREGRP95 */
   2685   {
   2686     { "punpcklbw",{ MX, EMd } },
   2687     { "(bad)",	{ XX } },
   2688     { "punpcklbw",{ MX, EMq } },
   2689     { "(bad)",	{ XX } },
   2690   },
   2691 
   2692   /* PREGRP96 */
   2693   {
   2694     { "punpcklwd",{ MX, EMd } },
   2695     { "(bad)",	{ XX } },
   2696     { "punpcklwd",{ MX, EMq } },
   2697     { "(bad)",	{ XX } },
   2698   },
   2699 
   2700   /* PREGRP97 */
   2701   {
   2702     { "punpckldq",{ MX, EMd } },
   2703     { "(bad)",	{ XX } },
   2704     { "punpckldq",{ MX, EMq } },
   2705     { "(bad)",	{ XX } },
   2706   },
   2707 };
   2708 
   2709 static const struct dis386 x86_64_table[][2] = {
   2710   {
   2711     { "pusha{P|}", { XX } },
   2712     { "(bad)", { XX } },
   2713   },
   2714   {
   2715     { "popa{P|}", { XX } },
   2716     { "(bad)", { XX } },
   2717   },
   2718   {
   2719     { "bound{S|}", { Gv, Ma } },
   2720     { "(bad)", { XX } },
   2721   },
   2722   {
   2723     { "arpl", { Ew, Gw } },
   2724     { "movs{||lq|xd}", { Gv, Ed } },
   2725   },
   2726 };
   2727 
   2728 static const struct dis386 three_byte_table[][256] = {
   2729   /* THREE_BYTE_0 */
   2730   {
   2731     /* 00 */
   2732     { "pshufb", { MX, EM } },
   2733     { "phaddw", { MX, EM } },
   2734     { "phaddd",	{ MX, EM } },
   2735     { "phaddsw", { MX, EM } },
   2736     { "pmaddubsw", { MX, EM } },
   2737     { "phsubw", { MX, EM } },
   2738     { "phsubd", { MX, EM } },
   2739     { "phsubsw", { MX, EM } },
   2740     /* 08 */
   2741     { "psignb", { MX, EM } },
   2742     { "psignw", { MX, EM } },
   2743     { "psignd", { MX, EM } },
   2744     { "pmulhrsw", { MX, EM } },
   2745     { "(bad)", { XX } },
   2746     { "(bad)", { XX } },
   2747     { "(bad)", { XX } },
   2748     { "(bad)", { XX } },
   2749     /* 10 */
   2750     { PREGRP39 },
   2751     { "(bad)", { XX } },
   2752     { "(bad)", { XX } },
   2753     { "(bad)", { XX } },
   2754     { PREGRP40 },
   2755     { PREGRP41 },
   2756     { "(bad)", { XX } },
   2757     { PREGRP42 },
   2758     /* 18 */
   2759     { "(bad)", { XX } },
   2760     { "(bad)", { XX } },
   2761     { "(bad)", { XX } },
   2762     { "(bad)", { XX } },
   2763     { "pabsb", { MX, EM } },
   2764     { "pabsw", { MX, EM } },
   2765     { "pabsd", { MX, EM } },
   2766     { "(bad)", { XX } },
   2767     /* 20 */
   2768     { PREGRP43 },
   2769     { PREGRP44 },
   2770     { PREGRP45 },
   2771     { PREGRP46 },
   2772     { PREGRP47 },
   2773     { PREGRP48 },
   2774     { "(bad)", { XX } },
   2775     { "(bad)", { XX } },
   2776     /* 28 */
   2777     { PREGRP49 },
   2778     { PREGRP50 },
   2779     { PREGRP51 },
   2780     { PREGRP52 },
   2781     { "(bad)", { XX } },
   2782     { "(bad)", { XX } },
   2783     { "(bad)", { XX } },
   2784     { "(bad)", { XX } },
   2785     /* 30 */
   2786     { PREGRP53 },
   2787     { PREGRP54 },
   2788     { PREGRP55 },
   2789     { PREGRP56 },
   2790     { PREGRP57 },
   2791     { PREGRP58 },
   2792     { "(bad)", { XX } },
   2793     { PREGRP86 },
   2794     /* 38 */
   2795     { PREGRP59 },
   2796     { PREGRP60 },
   2797     { PREGRP61 },
   2798     { PREGRP62 },
   2799     { PREGRP63 },
   2800     { PREGRP64 },
   2801     { PREGRP65 },
   2802     { PREGRP66 },
   2803     /* 40 */
   2804     { PREGRP67 },
   2805     { PREGRP68 },
   2806     { "(bad)", { XX } },
   2807     { "(bad)", { XX } },
   2808     { "(bad)", { XX } },
   2809     { "(bad)", { XX } },
   2810     { "(bad)", { XX } },
   2811     { "(bad)", { XX } },
   2812     /* 48 */
   2813     { "(bad)", { XX } },
   2814     { "(bad)", { XX } },
   2815     { "(bad)", { XX } },
   2816     { "(bad)", { XX } },
   2817     { "(bad)", { XX } },
   2818     { "(bad)", { XX } },
   2819     { "(bad)", { XX } },
   2820     { "(bad)", { XX } },
   2821     /* 50 */
   2822     { "(bad)", { XX } },
   2823     { "(bad)", { XX } },
   2824     { "(bad)", { XX } },
   2825     { "(bad)", { XX } },
   2826     { "(bad)", { XX } },
   2827     { "(bad)", { XX } },
   2828     { "(bad)", { XX } },
   2829     { "(bad)", { XX } },
   2830     /* 58 */
   2831     { "(bad)", { XX } },
   2832     { "(bad)", { XX } },
   2833     { "(bad)", { XX } },
   2834     { "(bad)", { XX } },
   2835     { "(bad)", { XX } },
   2836     { "(bad)", { XX } },
   2837     { "(bad)", { XX } },
   2838     { "(bad)", { XX } },
   2839     /* 60 */
   2840     { "(bad)", { XX } },
   2841     { "(bad)", { XX } },
   2842     { "(bad)", { XX } },
   2843     { "(bad)", { XX } },
   2844     { "(bad)", { XX } },
   2845     { "(bad)", { XX } },
   2846     { "(bad)", { XX } },
   2847     { "(bad)", { XX } },
   2848     /* 68 */
   2849     { "(bad)", { XX } },
   2850     { "(bad)", { XX } },
   2851     { "(bad)", { XX } },
   2852     { "(bad)", { XX } },
   2853     { "(bad)", { XX } },
   2854     { "(bad)", { XX } },
   2855     { "(bad)", { XX } },
   2856     { "(bad)", { XX } },
   2857     /* 70 */
   2858     { "(bad)", { XX } },
   2859     { "(bad)", { XX } },
   2860     { "(bad)", { XX } },
   2861     { "(bad)", { XX } },
   2862     { "(bad)", { XX } },
   2863     { "(bad)", { XX } },
   2864     { "(bad)", { XX } },
   2865     { "(bad)", { XX } },
   2866     /* 78 */
   2867     { "(bad)", { XX } },
   2868     { "(bad)", { XX } },
   2869     { "(bad)", { XX } },
   2870     { "(bad)", { XX } },
   2871     { "(bad)", { XX } },
   2872     { "(bad)", { XX } },
   2873     { "(bad)", { XX } },
   2874     { "(bad)", { XX } },
   2875     /* 80 */
   2876     { "(bad)", { XX } },
   2877     { "(bad)", { XX } },
   2878     { "(bad)", { XX } },
   2879     { "(bad)", { XX } },
   2880     { "(bad)", { XX } },
   2881     { "(bad)", { XX } },
   2882     { "(bad)", { XX } },
   2883     { "(bad)", { XX } },
   2884     /* 88 */
   2885     { "(bad)", { XX } },
   2886     { "(bad)", { XX } },
   2887     { "(bad)", { XX } },
   2888     { "(bad)", { XX } },
   2889     { "(bad)", { XX } },
   2890     { "(bad)", { XX } },
   2891     { "(bad)", { XX } },
   2892     { "(bad)", { XX } },
   2893     /* 90 */
   2894     { "(bad)", { XX } },
   2895     { "(bad)", { XX } },
   2896     { "(bad)", { XX } },
   2897     { "(bad)", { XX } },
   2898     { "(bad)", { XX } },
   2899     { "(bad)", { XX } },
   2900     { "(bad)", { XX } },
   2901     { "(bad)", { XX } },
   2902     /* 98 */
   2903     { "(bad)", { XX } },
   2904     { "(bad)", { XX } },
   2905     { "(bad)", { XX } },
   2906     { "(bad)", { XX } },
   2907     { "(bad)", { XX } },
   2908     { "(bad)", { XX } },
   2909     { "(bad)", { XX } },
   2910     { "(bad)", { XX } },
   2911     /* a0 */
   2912     { "(bad)", { XX } },
   2913     { "(bad)", { XX } },
   2914     { "(bad)", { XX } },
   2915     { "(bad)", { XX } },
   2916     { "(bad)", { XX } },
   2917     { "(bad)", { XX } },
   2918     { "(bad)", { XX } },
   2919     { "(bad)", { XX } },
   2920     /* a8 */
   2921     { "(bad)", { XX } },
   2922     { "(bad)", { XX } },
   2923     { "(bad)", { XX } },
   2924     { "(bad)", { XX } },
   2925     { "(bad)", { XX } },
   2926     { "(bad)", { XX } },
   2927     { "(bad)", { XX } },
   2928     { "(bad)", { XX } },
   2929     /* b0 */
   2930     { "(bad)", { XX } },
   2931     { "(bad)", { XX } },
   2932     { "(bad)", { XX } },
   2933     { "(bad)", { XX } },
   2934     { "(bad)", { XX } },
   2935     { "(bad)", { XX } },
   2936     { "(bad)", { XX } },
   2937     { "(bad)", { XX } },
   2938     /* b8 */
   2939     { "(bad)", { XX } },
   2940     { "(bad)", { XX } },
   2941     { "(bad)", { XX } },
   2942     { "(bad)", { XX } },
   2943     { "(bad)", { XX } },
   2944     { "(bad)", { XX } },
   2945     { "(bad)", { XX } },
   2946     { "(bad)", { XX } },
   2947     /* c0 */
   2948     { "(bad)", { XX } },
   2949     { "(bad)", { XX } },
   2950     { "(bad)", { XX } },
   2951     { "(bad)", { XX } },
   2952     { "(bad)", { XX } },
   2953     { "(bad)", { XX } },
   2954     { "(bad)", { XX } },
   2955     { "(bad)", { XX } },
   2956     /* c8 */
   2957     { "(bad)", { XX } },
   2958     { "(bad)", { XX } },
   2959     { "(bad)", { XX } },
   2960     { "(bad)", { XX } },
   2961     { "(bad)", { XX } },
   2962     { "(bad)", { XX } },
   2963     { "(bad)", { XX } },
   2964     { "(bad)", { XX } },
   2965     /* d0 */
   2966     { "(bad)", { XX } },
   2967     { "(bad)", { XX } },
   2968     { "(bad)", { XX } },
   2969     { "(bad)", { XX } },
   2970     { "(bad)", { XX } },
   2971     { "(bad)", { XX } },
   2972     { "(bad)", { XX } },
   2973     { "(bad)", { XX } },
   2974     /* d8 */
   2975     { "(bad)", { XX } },
   2976     { "(bad)", { XX } },
   2977     { "(bad)", { XX } },
   2978     { "(bad)", { XX } },
   2979     { "(bad)", { XX } },
   2980     { "(bad)", { XX } },
   2981     { "(bad)", { XX } },
   2982     { "(bad)", { XX } },
   2983     /* e0 */
   2984     { "(bad)", { XX } },
   2985     { "(bad)", { XX } },
   2986     { "(bad)", { XX } },
   2987     { "(bad)", { XX } },
   2988     { "(bad)", { XX } },
   2989     { "(bad)", { XX } },
   2990     { "(bad)", { XX } },
   2991     { "(bad)", { XX } },
   2992     /* e8 */
   2993     { "(bad)", { XX } },
   2994     { "(bad)", { XX } },
   2995     { "(bad)", { XX } },
   2996     { "(bad)", { XX } },
   2997     { "(bad)", { XX } },
   2998     { "(bad)", { XX } },
   2999     { "(bad)", { XX } },
   3000     { "(bad)", { XX } },
   3001     /* f0 */
   3002     { PREGRP87 },
   3003     { PREGRP88 },
   3004     { "(bad)", { XX } },
   3005     { "(bad)", { XX } },
   3006     { "(bad)", { XX } },
   3007     { "(bad)", { XX } },
   3008     { "(bad)", { XX } },
   3009     { "(bad)", { XX } },
   3010     /* f8 */
   3011     { "(bad)", { XX } },
   3012     { "(bad)", { XX } },
   3013     { "(bad)", { XX } },
   3014     { "(bad)", { XX } },
   3015     { "(bad)", { XX } },
   3016     { "(bad)", { XX } },
   3017     { "(bad)", { XX } },
   3018     { "(bad)", { XX } },
   3019   },
   3020   /* THREE_BYTE_1 */
   3021   {
   3022     /* 00 */
   3023     { "(bad)", { XX } },
   3024     { "(bad)", { XX } },
   3025     { "(bad)", { XX } },
   3026     { "(bad)", { XX } },
   3027     { "(bad)", { XX } },
   3028     { "(bad)", { XX } },
   3029     { "(bad)", { XX } },
   3030     { "(bad)", { XX } },
   3031     /* 08 */
   3032     { PREGRP69 },
   3033     { PREGRP70 },
   3034     { PREGRP71 },
   3035     { PREGRP72 },
   3036     { PREGRP73 },
   3037     { PREGRP74 },
   3038     { PREGRP75 },
   3039     { "palignr", { MX, EM, Ib } },
   3040     /* 10 */
   3041     { "(bad)", { XX } },
   3042     { "(bad)", { XX } },
   3043     { "(bad)", { XX } },
   3044     { "(bad)", { XX } },
   3045     { PREGRP76 },
   3046     { PREGRP77 },
   3047     { PREGRP78 },
   3048     { PREGRP79 },
   3049     /* 18 */
   3050     { "(bad)", { XX } },
   3051     { "(bad)", { XX } },
   3052     { "(bad)", { XX } },
   3053     { "(bad)", { XX } },
   3054     { "(bad)", { XX } },
   3055     { "(bad)", { XX } },
   3056     { "(bad)", { XX } },
   3057     { "(bad)", { XX } },
   3058     /* 20 */
   3059     { PREGRP80 },
   3060     { PREGRP81 },
   3061     { PREGRP82 },
   3062     { "(bad)", { XX } },
   3063     { "(bad)", { XX } },
   3064     { "(bad)", { XX } },
   3065     { "(bad)", { XX } },
   3066     { "(bad)", { XX } },
   3067     /* 28 */
   3068     { "(bad)", { XX } },
   3069     { "(bad)", { XX } },
   3070     { "(bad)", { XX } },
   3071     { "(bad)", { XX } },
   3072     { "(bad)", { XX } },
   3073     { "(bad)", { XX } },
   3074     { "(bad)", { XX } },
   3075     { "(bad)", { XX } },
   3076     /* 30 */
   3077     { "(bad)", { XX } },
   3078     { "(bad)", { XX } },
   3079     { "(bad)", { XX } },
   3080     { "(bad)", { XX } },
   3081     { "(bad)", { XX } },
   3082     { "(bad)", { XX } },
   3083     { "(bad)", { XX } },
   3084     { "(bad)", { XX } },
   3085     /* 38 */
   3086     { "(bad)", { XX } },
   3087     { "(bad)", { XX } },
   3088     { "(bad)", { XX } },
   3089     { "(bad)", { XX } },
   3090     { "(bad)", { XX } },
   3091     { "(bad)", { XX } },
   3092     { "(bad)", { XX } },
   3093     { "(bad)", { XX } },
   3094     /* 40 */
   3095     { PREGRP83 },
   3096     { PREGRP84 },
   3097     { PREGRP85 },
   3098     { "(bad)", { XX } },
   3099     { "(bad)", { XX } },
   3100     { "(bad)", { XX } },
   3101     { "(bad)", { XX } },
   3102     { "(bad)", { XX } },
   3103     /* 48 */
   3104     { "(bad)", { XX } },
   3105     { "(bad)", { XX } },
   3106     { "(bad)", { XX } },
   3107     { "(bad)", { XX } },
   3108     { "(bad)", { XX } },
   3109     { "(bad)", { XX } },
   3110     { "(bad)", { XX } },
   3111     { "(bad)", { XX } },
   3112     /* 50 */
   3113     { "(bad)", { XX } },
   3114     { "(bad)", { XX } },
   3115     { "(bad)", { XX } },
   3116     { "(bad)", { XX } },
   3117     { "(bad)", { XX } },
   3118     { "(bad)", { XX } },
   3119     { "(bad)", { XX } },
   3120     { "(bad)", { XX } },
   3121     /* 58 */
   3122     { "(bad)", { XX } },
   3123     { "(bad)", { XX } },
   3124     { "(bad)", { XX } },
   3125     { "(bad)", { XX } },
   3126     { "(bad)", { XX } },
   3127     { "(bad)", { XX } },
   3128     { "(bad)", { XX } },
   3129     { "(bad)", { XX } },
   3130     /* 60 */
   3131     { PREGRP89 },
   3132     { PREGRP90 },
   3133     { PREGRP91 },
   3134     { PREGRP92 },
   3135     { "(bad)", { XX } },
   3136     { "(bad)", { XX } },
   3137     { "(bad)", { XX } },
   3138     { "(bad)", { XX } },
   3139     /* 68 */
   3140     { "(bad)", { XX } },
   3141     { "(bad)", { XX } },
   3142     { "(bad)", { XX } },
   3143     { "(bad)", { XX } },
   3144     { "(bad)", { XX } },
   3145     { "(bad)", { XX } },
   3146     { "(bad)", { XX } },
   3147     { "(bad)", { XX } },
   3148     /* 70 */
   3149     { "(bad)", { XX } },
   3150     { "(bad)", { XX } },
   3151     { "(bad)", { XX } },
   3152     { "(bad)", { XX } },
   3153     { "(bad)", { XX } },
   3154     { "(bad)", { XX } },
   3155     { "(bad)", { XX } },
   3156     { "(bad)", { XX } },
   3157     /* 78 */
   3158     { "(bad)", { XX } },
   3159     { "(bad)", { XX } },
   3160     { "(bad)", { XX } },
   3161     { "(bad)", { XX } },
   3162     { "(bad)", { XX } },
   3163     { "(bad)", { XX } },
   3164     { "(bad)", { XX } },
   3165     { "(bad)", { XX } },
   3166     /* 80 */
   3167     { "(bad)", { XX } },
   3168     { "(bad)", { XX } },
   3169     { "(bad)", { XX } },
   3170     { "(bad)", { XX } },
   3171     { "(bad)", { XX } },
   3172     { "(bad)", { XX } },
   3173     { "(bad)", { XX } },
   3174     { "(bad)", { XX } },
   3175     /* 88 */
   3176     { "(bad)", { XX } },
   3177     { "(bad)", { XX } },
   3178     { "(bad)", { XX } },
   3179     { "(bad)", { XX } },
   3180     { "(bad)", { XX } },
   3181     { "(bad)", { XX } },
   3182     { "(bad)", { XX } },
   3183     { "(bad)", { XX } },
   3184     /* 90 */
   3185     { "(bad)", { XX } },
   3186     { "(bad)", { XX } },
   3187     { "(bad)", { XX } },
   3188     { "(bad)", { XX } },
   3189     { "(bad)", { XX } },
   3190     { "(bad)", { XX } },
   3191     { "(bad)", { XX } },
   3192     { "(bad)", { XX } },
   3193     /* 98 */
   3194     { "(bad)", { XX } },
   3195     { "(bad)", { XX } },
   3196     { "(bad)", { XX } },
   3197     { "(bad)", { XX } },
   3198     { "(bad)", { XX } },
   3199     { "(bad)", { XX } },
   3200     { "(bad)", { XX } },
   3201     { "(bad)", { XX } },
   3202     /* a0 */
   3203     { "(bad)", { XX } },
   3204     { "(bad)", { XX } },
   3205     { "(bad)", { XX } },
   3206     { "(bad)", { XX } },
   3207     { "(bad)", { XX } },
   3208     { "(bad)", { XX } },
   3209     { "(bad)", { XX } },
   3210     { "(bad)", { XX } },
   3211     /* a8 */
   3212     { "(bad)", { XX } },
   3213     { "(bad)", { XX } },
   3214     { "(bad)", { XX } },
   3215     { "(bad)", { XX } },
   3216     { "(bad)", { XX } },
   3217     { "(bad)", { XX } },
   3218     { "(bad)", { XX } },
   3219     { "(bad)", { XX } },
   3220     /* b0 */
   3221     { "(bad)", { XX } },
   3222     { "(bad)", { XX } },
   3223     { "(bad)", { XX } },
   3224     { "(bad)", { XX } },
   3225     { "(bad)", { XX } },
   3226     { "(bad)", { XX } },
   3227     { "(bad)", { XX } },
   3228     { "(bad)", { XX } },
   3229     /* b8 */
   3230     { "(bad)", { XX } },
   3231     { "(bad)", { XX } },
   3232     { "(bad)", { XX } },
   3233     { "(bad)", { XX } },
   3234     { "(bad)", { XX } },
   3235     { "(bad)", { XX } },
   3236     { "(bad)", { XX } },
   3237     { "(bad)", { XX } },
   3238     /* c0 */
   3239     { "(bad)", { XX } },
   3240     { "(bad)", { XX } },
   3241     { "(bad)", { XX } },
   3242     { "(bad)", { XX } },
   3243     { "(bad)", { XX } },
   3244     { "(bad)", { XX } },
   3245     { "(bad)", { XX } },
   3246     { "(bad)", { XX } },
   3247     /* c8 */
   3248     { "(bad)", { XX } },
   3249     { "(bad)", { XX } },
   3250     { "(bad)", { XX } },
   3251     { "(bad)", { XX } },
   3252     { "(bad)", { XX } },
   3253     { "(bad)", { XX } },
   3254     { "(bad)", { XX } },
   3255     { "(bad)", { XX } },
   3256     /* d0 */
   3257     { "(bad)", { XX } },
   3258     { "(bad)", { XX } },
   3259     { "(bad)", { XX } },
   3260     { "(bad)", { XX } },
   3261     { "(bad)", { XX } },
   3262     { "(bad)", { XX } },
   3263     { "(bad)", { XX } },
   3264     { "(bad)", { XX } },
   3265     /* d8 */
   3266     { "(bad)", { XX } },
   3267     { "(bad)", { XX } },
   3268     { "(bad)", { XX } },
   3269     { "(bad)", { XX } },
   3270     { "(bad)", { XX } },
   3271     { "(bad)", { XX } },
   3272     { "(bad)", { XX } },
   3273     { "(bad)", { XX } },
   3274     /* e0 */
   3275     { "(bad)", { XX } },
   3276     { "(bad)", { XX } },
   3277     { "(bad)", { XX } },
   3278     { "(bad)", { XX } },
   3279     { "(bad)", { XX } },
   3280     { "(bad)", { XX } },
   3281     { "(bad)", { XX } },
   3282     { "(bad)", { XX } },
   3283     /* e8 */
   3284     { "(bad)", { XX } },
   3285     { "(bad)", { XX } },
   3286     { "(bad)", { XX } },
   3287     { "(bad)", { XX } },
   3288     { "(bad)", { XX } },
   3289     { "(bad)", { XX } },
   3290     { "(bad)", { XX } },
   3291     { "(bad)", { XX } },
   3292     /* f0 */
   3293     { "(bad)", { XX } },
   3294     { "(bad)", { XX } },
   3295     { "(bad)", { XX } },
   3296     { "(bad)", { XX } },
   3297     { "(bad)", { XX } },
   3298     { "(bad)", { XX } },
   3299     { "(bad)", { XX } },
   3300     { "(bad)", { XX } },
   3301     /* f8 */
   3302     { "(bad)", { XX } },
   3303     { "(bad)", { XX } },
   3304     { "(bad)", { XX } },
   3305     { "(bad)", { XX } },
   3306     { "(bad)", { XX } },
   3307     { "(bad)", { XX } },
   3308     { "(bad)", { XX } },
   3309     { "(bad)", { XX } },
   3310   }
   3311 };
   3312 
   3313 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
   3314 
   3315 static void
   3316 ckprefix (void)
   3317 {
   3318   int newrex;
   3319   rex = 0;
   3320   prefixes = 0;
   3321   used_prefixes = 0;
   3322   rex_used = 0;
   3323   while (1)
   3324     {
   3325       FETCH_DATA (the_info, codep + 1);
   3326       newrex = 0;
   3327       switch (*codep)
   3328 	{
   3329 	/* REX prefixes family.  */
   3330 	case 0x40:
   3331 	case 0x41:
   3332 	case 0x42:
   3333 	case 0x43:
   3334 	case 0x44:
   3335 	case 0x45:
   3336 	case 0x46:
   3337 	case 0x47:
   3338 	case 0x48:
   3339 	case 0x49:
   3340 	case 0x4a:
   3341 	case 0x4b:
   3342 	case 0x4c:
   3343 	case 0x4d:
   3344 	case 0x4e:
   3345 	case 0x4f:
   3346 	    if (address_mode == mode_64bit)
   3347 	      newrex = *codep;
   3348 	    else
   3349 	      return;
   3350 	  break;
   3351 	case 0xf3:
   3352 	  prefixes |= PREFIX_REPZ;
   3353 	  break;
   3354 	case 0xf2:
   3355 	  prefixes |= PREFIX_REPNZ;
   3356 	  break;
   3357 	case 0xf0:
   3358 	  prefixes |= PREFIX_LOCK;
   3359 	  break;
   3360 	case 0x2e:
   3361 	  prefixes |= PREFIX_CS;
   3362 	  break;
   3363 	case 0x36:
   3364 	  prefixes |= PREFIX_SS;
   3365 	  break;
   3366 	case 0x3e:
   3367 	  prefixes |= PREFIX_DS;
   3368 	  break;
   3369 	case 0x26:
   3370 	  prefixes |= PREFIX_ES;
   3371 	  break;
   3372 	case 0x64:
   3373 	  prefixes |= PREFIX_FS;
   3374 	  break;
   3375 	case 0x65:
   3376 	  prefixes |= PREFIX_GS;
   3377 	  break;
   3378 	case 0x66:
   3379 	  prefixes |= PREFIX_DATA;
   3380 	  break;
   3381 	case 0x67:
   3382 	  prefixes |= PREFIX_ADDR;
   3383 	  break;
   3384 	case FWAIT_OPCODE:
   3385 	  /* fwait is really an instruction.  If there are prefixes
   3386 	     before the fwait, they belong to the fwait, *not* to the
   3387 	     following instruction.  */
   3388 	  if (prefixes || rex)
   3389 	    {
   3390 	      prefixes |= PREFIX_FWAIT;
   3391 	      codep++;
   3392 	      return;
   3393 	    }
   3394 	  prefixes = PREFIX_FWAIT;
   3395 	  break;
   3396 	default:
   3397 	  return;
   3398 	}
   3399       /* Rex is ignored when followed by another prefix.  */
   3400       if (rex)
   3401 	{
   3402 	  rex_used = rex;
   3403 	  return;
   3404 	}
   3405       rex = newrex;
   3406       codep++;
   3407     }
   3408 }
   3409 
   3410 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
   3411    prefix byte.  */
   3412 
   3413 static const char *
   3414 prefix_name (int pref, int sizeflag)
   3415 {
   3416   static const char * const rexes [16] =
   3417     {
   3418       "rex",		/* 0x40 */
   3419       "rex.B",		/* 0x41 */
   3420       "rex.X",		/* 0x42 */
   3421       "rex.XB",		/* 0x43 */
   3422       "rex.R",		/* 0x44 */
   3423       "rex.RB",		/* 0x45 */
   3424       "rex.RX",		/* 0x46 */
   3425       "rex.RXB",	/* 0x47 */
   3426       "rex.W",		/* 0x48 */
   3427       "rex.WB",		/* 0x49 */
   3428       "rex.WX",		/* 0x4a */
   3429       "rex.WXB",	/* 0x4b */
   3430       "rex.WR",		/* 0x4c */
   3431       "rex.WRB",	/* 0x4d */
   3432       "rex.WRX",	/* 0x4e */
   3433       "rex.WRXB",	/* 0x4f */
   3434     };
   3435 
   3436   switch (pref)
   3437     {
   3438     /* REX prefixes family.  */
   3439     case 0x40:
   3440     case 0x41:
   3441     case 0x42:
   3442     case 0x43:
   3443     case 0x44:
   3444     case 0x45:
   3445     case 0x46:
   3446     case 0x47:
   3447     case 0x48:
   3448     case 0x49:
   3449     case 0x4a:
   3450     case 0x4b:
   3451     case 0x4c:
   3452     case 0x4d:
   3453     case 0x4e:
   3454     case 0x4f:
   3455       return rexes [pref - 0x40];
   3456     case 0xf3:
   3457       return "repz";
   3458     case 0xf2:
   3459       return "repnz";
   3460     case 0xf0:
   3461       return "lock";
   3462     case 0x2e:
   3463       return "cs";
   3464     case 0x36:
   3465       return "ss";
   3466     case 0x3e:
   3467       return "ds";
   3468     case 0x26:
   3469       return "es";
   3470     case 0x64:
   3471       return "fs";
   3472     case 0x65:
   3473       return "gs";
   3474     case 0x66:
   3475       return (sizeflag & DFLAG) ? "data16" : "data32";
   3476     case 0x67:
   3477       if (address_mode == mode_64bit)
   3478 	return (sizeflag & AFLAG) ? "addr32" : "addr64";
   3479       else
   3480 	return (sizeflag & AFLAG) ? "addr16" : "addr32";
   3481     case FWAIT_OPCODE:
   3482       return "fwait";
   3483     default:
   3484       return NULL;
   3485     }
   3486 }
   3487 
   3488 static char op_out[MAX_OPERANDS][100];
   3489 static int op_ad, op_index[MAX_OPERANDS];
   3490 static int two_source_ops;
   3491 static bfd_vma op_address[MAX_OPERANDS];
   3492 static bfd_vma op_riprel[MAX_OPERANDS];
   3493 static bfd_vma start_pc;
   3494 
   3495 /*
   3496  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
   3497  *   (see topic "Redundant prefixes" in the "Differences from 8086"
   3498  *   section of the "Virtual 8086 Mode" chapter.)
   3499  * 'pc' should be the address of this instruction, it will
   3500  *   be used to print the target address if this is a relative jump or call
   3501  * The function returns the length of this instruction in bytes.
   3502  */
   3503 
   3504 static char intel_syntax;
   3505 static char open_char;
   3506 static char close_char;
   3507 static char separator_char;
   3508 static char scale_char;
   3509 
   3510 int
   3511 print_insn_i386 (bfd_vma pc, disassemble_info *info)
   3512 {
   3513   intel_syntax = -1;
   3514 
   3515   return print_insn (pc, info);
   3516 }
   3517 
   3518 static int
   3519 print_insn (bfd_vma pc, disassemble_info *info)
   3520 {
   3521   const struct dis386 *dp;
   3522   int i;
   3523   char *op_txt[MAX_OPERANDS];
   3524   int needcomma;
   3525   unsigned char uses_DATA_prefix, uses_LOCK_prefix;
   3526   unsigned char uses_REPNZ_prefix, uses_REPZ_prefix;
   3527   int sizeflag;
   3528   const char *p;
   3529   struct dis_private priv;
   3530   unsigned char op;
   3531 
   3532   if (info->mach == bfd_mach_x86_64_intel_syntax
   3533       || info->mach == bfd_mach_x86_64)
   3534     address_mode = mode_64bit;
   3535   else
   3536     address_mode = mode_32bit;
   3537 
   3538   if (intel_syntax == (char) -1)
   3539     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
   3540 		    || info->mach == bfd_mach_x86_64_intel_syntax);
   3541 
   3542   if (info->mach == bfd_mach_i386_i386
   3543       || info->mach == bfd_mach_x86_64
   3544       || info->mach == bfd_mach_i386_i386_intel_syntax
   3545       || info->mach == bfd_mach_x86_64_intel_syntax)
   3546     priv.orig_sizeflag = AFLAG | DFLAG;
   3547   else if (info->mach == bfd_mach_i386_i8086)
   3548     priv.orig_sizeflag = 0;
   3549   else
   3550     abort ();
   3551 
   3552   for (p = info->disassembler_options; p != NULL; )
   3553     {
   3554       if (strncmp (p, "x86-64", 6) == 0)
   3555 	{
   3556 	  address_mode = mode_64bit;
   3557 	  priv.orig_sizeflag = AFLAG | DFLAG;
   3558 	}
   3559       else if (strncmp (p, "i386", 4) == 0)
   3560 	{
   3561 	  address_mode = mode_32bit;
   3562 	  priv.orig_sizeflag = AFLAG | DFLAG;
   3563 	}
   3564       else if (strncmp (p, "i8086", 5) == 0)
   3565 	{
   3566 	  address_mode = mode_16bit;
   3567 	  priv.orig_sizeflag = 0;
   3568 	}
   3569       else if (strncmp (p, "intel", 5) == 0)
   3570 	{
   3571 	  intel_syntax = 1;
   3572 	}
   3573       else if (strncmp (p, "att", 3) == 0)
   3574 	{
   3575 	  intel_syntax = 0;
   3576 	}
   3577       else if (strncmp (p, "addr", 4) == 0)
   3578 	{
   3579 	  if (address_mode == mode_64bit)
   3580 	    {
   3581 	      if (p[4] == '3' && p[5] == '2')
   3582 		priv.orig_sizeflag &= ~AFLAG;
   3583 	      else if (p[4] == '6' && p[5] == '4')
   3584 		priv.orig_sizeflag |= AFLAG;
   3585 	    }
   3586 	  else
   3587 	    {
   3588 	      if (p[4] == '1' && p[5] == '6')
   3589 		priv.orig_sizeflag &= ~AFLAG;
   3590 	      else if (p[4] == '3' && p[5] == '2')
   3591 		priv.orig_sizeflag |= AFLAG;
   3592 	    }
   3593 	}
   3594       else if (strncmp (p, "data", 4) == 0)
   3595 	{
   3596 	  if (p[4] == '1' && p[5] == '6')
   3597 	    priv.orig_sizeflag &= ~DFLAG;
   3598 	  else if (p[4] == '3' && p[5] == '2')
   3599 	    priv.orig_sizeflag |= DFLAG;
   3600 	}
   3601       else if (strncmp (p, "suffix", 6) == 0)
   3602 	priv.orig_sizeflag |= SUFFIX_ALWAYS;
   3603 
   3604       p = strchr (p, ',');
   3605       if (p != NULL)
   3606 	p++;
   3607     }
   3608 
   3609   if (intel_syntax)
   3610     {
   3611       names64 = intel_names64;
   3612       names32 = intel_names32;
   3613       names16 = intel_names16;
   3614       names8 = intel_names8;
   3615       names8rex = intel_names8rex;
   3616       names_seg = intel_names_seg;
   3617       index16 = intel_index16;
   3618       open_char = '[';
   3619       close_char = ']';
   3620       separator_char = '+';
   3621       scale_char = '*';
   3622     }
   3623   else
   3624     {
   3625       names64 = att_names64;
   3626       names32 = att_names32;
   3627       names16 = att_names16;
   3628       names8 = att_names8;
   3629       names8rex = att_names8rex;
   3630       names_seg = att_names_seg;
   3631       index16 = att_index16;
   3632       open_char = '(';
   3633       close_char =  ')';
   3634       separator_char = ',';
   3635       scale_char = ',';
   3636     }
   3637 
   3638   /* The output looks better if we put 7 bytes on a line, since that
   3639      puts most long word instructions on a single line.  */
   3640   info->bytes_per_line = 7;
   3641 
   3642   info->private_data = &priv;
   3643   priv.max_fetched = priv.the_buffer;
   3644   priv.insn_start = pc;
   3645 
   3646   obuf[0] = 0;
   3647   for (i = 0; i < MAX_OPERANDS; ++i)
   3648     {
   3649       op_out[i][0] = 0;
   3650       op_index[i] = -1;
   3651     }
   3652 
   3653   the_info = info;
   3654   start_pc = pc;
   3655   start_codep = priv.the_buffer;
   3656   codep = priv.the_buffer;
   3657 
   3658   if (setjmp (priv.bailout) != 0)
   3659     {
   3660       const char *name;
   3661 
   3662       /* Getting here means we tried for data but didn't get it.  That
   3663 	 means we have an incomplete instruction of some sort.  Just
   3664 	 print the first byte as a prefix or a .byte pseudo-op.  */
   3665       if (codep > priv.the_buffer)
   3666 	{
   3667 	  name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
   3668 	  if (name != NULL)
   3669 	    (*info->fprintf_func) (info->stream, "%s", name);
   3670 	  else
   3671 	    {
   3672 	      /* Just print the first byte as a .byte instruction.  */
   3673 	      (*info->fprintf_func) (info->stream, ".byte 0x%x",
   3674 				     (unsigned int) priv.the_buffer[0]);
   3675 	    }
   3676 
   3677 	  return 1;
   3678 	}
   3679 
   3680       return -1;
   3681     }
   3682 
   3683   obufp = obuf;
   3684   ckprefix ();
   3685 
   3686   insn_codep = codep;
   3687   sizeflag = priv.orig_sizeflag;
   3688 
   3689   FETCH_DATA (info, codep + 1);
   3690   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
   3691 
   3692   if (((prefixes & PREFIX_FWAIT)
   3693        && ((*codep < 0xd8) || (*codep > 0xdf)))
   3694       || (rex && rex_used))
   3695     {
   3696       const char *name;
   3697 
   3698       /* fwait not followed by floating point instruction, or rex followed
   3699 	 by other prefixes.  Print the first prefix.  */
   3700       name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
   3701       if (name == NULL)
   3702 	name = INTERNAL_DISASSEMBLER_ERROR;
   3703       (*info->fprintf_func) (info->stream, "%s", name);
   3704       return 1;
   3705     }
   3706 
   3707   op = 0;
   3708   if (*codep == 0x0f)
   3709     {
   3710       unsigned char threebyte;
   3711       FETCH_DATA (info, codep + 2);
   3712       threebyte = *++codep;
   3713       dp = &dis386_twobyte[threebyte];
   3714       need_modrm = twobyte_has_modrm[*codep];
   3715       uses_DATA_prefix = twobyte_uses_DATA_prefix[*codep];
   3716       uses_REPNZ_prefix = twobyte_uses_REPNZ_prefix[*codep];
   3717       uses_REPZ_prefix = twobyte_uses_REPZ_prefix[*codep];
   3718       uses_LOCK_prefix = (*codep & ~0x02) == 0x20;
   3719       codep++;
   3720       if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE)
   3721 	{
   3722 	  FETCH_DATA (info, codep + 2);
   3723 	  op = *codep++;
   3724 	  switch (threebyte)
   3725 	    {
   3726 	    case 0x38:
   3727 	      uses_DATA_prefix = threebyte_0x38_uses_DATA_prefix[op];
   3728 	      uses_REPNZ_prefix = threebyte_0x38_uses_REPNZ_prefix[op];
   3729 	      uses_REPZ_prefix = threebyte_0x38_uses_REPZ_prefix[op];
   3730 	      break;
   3731 	    case 0x3a:
   3732 	      uses_DATA_prefix = threebyte_0x3a_uses_DATA_prefix[op];
   3733 	      uses_REPNZ_prefix = threebyte_0x3a_uses_REPNZ_prefix[op];
   3734 	      uses_REPZ_prefix = threebyte_0x3a_uses_REPZ_prefix[op];
   3735 	      break;
   3736 	    default:
   3737 	      break;
   3738 	    }
   3739 	}
   3740     }
   3741   else
   3742     {
   3743       dp = &dis386[*codep];
   3744       need_modrm = onebyte_has_modrm[*codep];
   3745       uses_DATA_prefix = 0;
   3746       uses_REPNZ_prefix = 0;
   3747       /* pause is 0xf3 0x90.  */
   3748       uses_REPZ_prefix = *codep == 0x90;
   3749       uses_LOCK_prefix = 0;
   3750       codep++;
   3751     }
   3752 
   3753   if (!uses_REPZ_prefix && (prefixes & PREFIX_REPZ))
   3754     {
   3755       oappend ("repz ");
   3756       used_prefixes |= PREFIX_REPZ;
   3757     }
   3758   if (!uses_REPNZ_prefix && (prefixes & PREFIX_REPNZ))
   3759     {
   3760       oappend ("repnz ");
   3761       used_prefixes |= PREFIX_REPNZ;
   3762     }
   3763 
   3764   if (!uses_LOCK_prefix && (prefixes & PREFIX_LOCK))
   3765     {
   3766       oappend ("lock ");
   3767       used_prefixes |= PREFIX_LOCK;
   3768     }
   3769 
   3770   if (prefixes & PREFIX_ADDR)
   3771     {
   3772       sizeflag ^= AFLAG;
   3773       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
   3774 	{
   3775 	  if ((sizeflag & AFLAG) || address_mode == mode_64bit)
   3776 	    oappend ("addr32 ");
   3777 	  else
   3778 	    oappend ("addr16 ");
   3779 	  used_prefixes |= PREFIX_ADDR;
   3780 	}
   3781     }
   3782 
   3783   if (!uses_DATA_prefix && (prefixes & PREFIX_DATA))
   3784     {
   3785       sizeflag ^= DFLAG;
   3786       if (dp->op[2].bytemode == cond_jump_mode
   3787 	  && dp->op[0].bytemode == v_mode
   3788 	  && !intel_syntax)
   3789 	{
   3790 	  if (sizeflag & DFLAG)
   3791 	    oappend ("data32 ");
   3792 	  else
   3793 	    oappend ("data16 ");
   3794 	  used_prefixes |= PREFIX_DATA;
   3795 	}
   3796     }
   3797 
   3798   if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE)
   3799     {
   3800       dp = &three_byte_table[dp->op[1].bytemode][op];
   3801       modrm.mod = (*codep >> 6) & 3;
   3802       modrm.reg = (*codep >> 3) & 7;
   3803       modrm.rm = *codep & 7;
   3804     }
   3805   else if (need_modrm)
   3806     {
   3807       FETCH_DATA (info, codep + 1);
   3808       modrm.mod = (*codep >> 6) & 3;
   3809       modrm.reg = (*codep >> 3) & 7;
   3810       modrm.rm = *codep & 7;
   3811     }
   3812 
   3813   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
   3814     {
   3815       dofloat (sizeflag);
   3816     }
   3817   else
   3818     {
   3819       int index;
   3820       if (dp->name == NULL)
   3821 	{
   3822 	  switch (dp->op[0].bytemode)
   3823 	    {
   3824 	    case USE_GROUPS:
   3825 	      dp = &grps[dp->op[1].bytemode][modrm.reg];
   3826 	      break;
   3827 
   3828 	    case USE_PREFIX_USER_TABLE:
   3829 	      index = 0;
   3830 	      used_prefixes |= (prefixes & PREFIX_REPZ);
   3831 	      if (prefixes & PREFIX_REPZ)
   3832 		index = 1;
   3833 	      else
   3834 		{
   3835 		  /* We should check PREFIX_REPNZ and PREFIX_REPZ
   3836 		     before PREFIX_DATA.  */
   3837 		  used_prefixes |= (prefixes & PREFIX_REPNZ);
   3838 		  if (prefixes & PREFIX_REPNZ)
   3839 		    index = 3;
   3840 		  else
   3841 		    {
   3842 		      used_prefixes |= (prefixes & PREFIX_DATA);
   3843 		      if (prefixes & PREFIX_DATA)
   3844 			index = 2;
   3845 		    }
   3846 		}
   3847 	      dp = &prefix_user_table[dp->op[1].bytemode][index];
   3848 	      break;
   3849 
   3850 	    case X86_64_SPECIAL:
   3851 	      index = address_mode == mode_64bit ? 1 : 0;
   3852 	      dp = &x86_64_table[dp->op[1].bytemode][index];
   3853 	      break;
   3854 
   3855 	    default:
   3856 	      oappend (INTERNAL_DISASSEMBLER_ERROR);
   3857 	      break;
   3858 	    }
   3859 	}
   3860 
   3861       if (putop (dp->name, sizeflag) == 0)
   3862         {
   3863 	  for (i = 0; i < MAX_OPERANDS; ++i)
   3864 	    {
   3865 	      obufp = op_out[i];
   3866 	      op_ad = MAX_OPERANDS - 1 - i;
   3867 	      if (dp->op[i].rtn)
   3868 		(*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
   3869 	    }
   3870 	}
   3871     }
   3872 
   3873   /* See if any prefixes were not used.  If so, print the first one
   3874      separately.  If we don't do this, we'll wind up printing an
   3875      instruction stream which does not precisely correspond to the
   3876      bytes we are disassembling.  */
   3877   if ((prefixes & ~used_prefixes) != 0)
   3878     {
   3879       const char *name;
   3880 
   3881       name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
   3882       if (name == NULL)
   3883 	name = INTERNAL_DISASSEMBLER_ERROR;
   3884       (*info->fprintf_func) (info->stream, "%s", name);
   3885       return 1;
   3886     }
   3887   if (rex & ~rex_used)
   3888     {
   3889       const char *name;
   3890       name = prefix_name (rex | 0x40, priv.orig_sizeflag);
   3891       if (name == NULL)
   3892 	name = INTERNAL_DISASSEMBLER_ERROR;
   3893       (*info->fprintf_func) (info->stream, "%s ", name);
   3894     }
   3895 
   3896   obufp = obuf + strlen (obuf);
   3897   for (i = strlen (obuf); i < 6; i++)
   3898     oappend (" ");
   3899   oappend (" ");
   3900   (*info->fprintf_func) (info->stream, "%s", obuf);
   3901 
   3902   /* The enter and bound instructions are printed with operands in the same
   3903      order as the intel book; everything else is printed in reverse order.  */
   3904   if (intel_syntax || two_source_ops)
   3905     {
   3906       bfd_vma riprel;
   3907 
   3908       for (i = 0; i < MAX_OPERANDS; ++i)
   3909         op_txt[i] = op_out[i];
   3910 
   3911       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
   3912 	{
   3913           op_ad = op_index[i];
   3914           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
   3915           op_index[MAX_OPERANDS - 1 - i] = op_ad;
   3916 	  riprel = op_riprel[i];
   3917 	  op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
   3918 	  op_riprel[MAX_OPERANDS - 1 - i] = riprel;
   3919 	}
   3920     }
   3921   else
   3922     {
   3923       for (i = 0; i < MAX_OPERANDS; ++i)
   3924         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
   3925     }
   3926 
   3927   needcomma = 0;
   3928   for (i = 0; i < MAX_OPERANDS; ++i)
   3929     if (*op_txt[i])
   3930       {
   3931 	if (needcomma)
   3932 	  (*info->fprintf_func) (info->stream, ",");
   3933 	if (op_index[i] != -1 && !op_riprel[i])
   3934 	  (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
   3935 	else
   3936 	  (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
   3937 	needcomma = 1;
   3938       }
   3939 
   3940   for (i = 0; i < MAX_OPERANDS; i++)
   3941     if (op_index[i] != -1 && op_riprel[i])
   3942       {
   3943 	(*info->fprintf_func) (info->stream, "        # ");
   3944 	(*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
   3945 						+ op_address[op_index[i]]), info);
   3946 	break;
   3947       }
   3948   return codep - priv.the_buffer;
   3949 }
   3950 
   3951 static const char *float_mem[] = {
   3952   /* d8 */
   3953   "fadd{s||s|}",
   3954   "fmul{s||s|}",
   3955   "fcom{s||s|}",
   3956   "fcomp{s||s|}",
   3957   "fsub{s||s|}",
   3958   "fsubr{s||s|}",
   3959   "fdiv{s||s|}",
   3960   "fdivr{s||s|}",
   3961   /* d9 */
   3962   "fld{s||s|}",
   3963   "(bad)",
   3964   "fst{s||s|}",
   3965   "fstp{s||s|}",
   3966   "fldenvIC",
   3967   "fldcw",
   3968   "fNstenvIC",
   3969   "fNstcw",
   3970   /* da */
   3971   "fiadd{l||l|}",
   3972   "fimul{l||l|}",
   3973   "ficom{l||l|}",
   3974   "ficomp{l||l|}",
   3975   "fisub{l||l|}",
   3976   "fisubr{l||l|}",
   3977   "fidiv{l||l|}",
   3978   "fidivr{l||l|}",
   3979   /* db */
   3980   "fild{l||l|}",
   3981   "fisttp{l||l|}",
   3982   "fist{l||l|}",
   3983   "fistp{l||l|}",
   3984   "(bad)",
   3985   "fld{t||t|}",
   3986   "(bad)",
   3987   "fstp{t||t|}",
   3988   /* dc */
   3989   "fadd{l||l|}",
   3990   "fmul{l||l|}",
   3991   "fcom{l||l|}",
   3992   "fcomp{l||l|}",
   3993   "fsub{l||l|}",
   3994   "fsubr{l||l|}",
   3995   "fdiv{l||l|}",
   3996   "fdivr{l||l|}",
   3997   /* dd */
   3998   "fld{l||l|}",
   3999   "fisttp{ll||ll|}",
   4000   "fst{l||l|}",
   4001   "fstp{l||l|}",
   4002   "frstorIC",
   4003   "(bad)",
   4004   "fNsaveIC",
   4005   "fNstsw",
   4006   /* de */
   4007   "fiadd",
   4008   "fimul",
   4009   "ficom",
   4010   "ficomp",
   4011   "fisub",
   4012   "fisubr",
   4013   "fidiv",
   4014   "fidivr",
   4015   /* df */
   4016   "fild",
   4017   "fisttp",
   4018   "fist",
   4019   "fistp",
   4020   "fbld",
   4021   "fild{ll||ll|}",
   4022   "fbstp",
   4023   "fistp{ll||ll|}",
   4024 };
   4025 
   4026 static const unsigned char float_mem_mode[] = {
   4027   /* d8 */
   4028   d_mode,
   4029   d_mode,
   4030   d_mode,
   4031   d_mode,
   4032   d_mode,
   4033   d_mode,
   4034   d_mode,
   4035   d_mode,
   4036   /* d9 */
   4037   d_mode,
   4038   0,
   4039   d_mode,
   4040   d_mode,
   4041   0,
   4042   w_mode,
   4043   0,
   4044   w_mode,
   4045   /* da */
   4046   d_mode,
   4047   d_mode,
   4048   d_mode,
   4049   d_mode,
   4050   d_mode,
   4051   d_mode,
   4052   d_mode,
   4053   d_mode,
   4054   /* db */
   4055   d_mode,
   4056   d_mode,
   4057   d_mode,
   4058   d_mode,
   4059   0,
   4060   t_mode,
   4061   0,
   4062   t_mode,
   4063   /* dc */
   4064   q_mode,
   4065   q_mode,
   4066   q_mode,
   4067   q_mode,
   4068   q_mode,
   4069   q_mode,
   4070   q_mode,
   4071   q_mode,
   4072   /* dd */
   4073   q_mode,
   4074   q_mode,
   4075   q_mode,
   4076   q_mode,
   4077   0,
   4078   0,
   4079   0,
   4080   w_mode,
   4081   /* de */
   4082   w_mode,
   4083   w_mode,
   4084   w_mode,
   4085   w_mode,
   4086   w_mode,
   4087   w_mode,
   4088   w_mode,
   4089   w_mode,
   4090   /* df */
   4091   w_mode,
   4092   w_mode,
   4093   w_mode,
   4094   w_mode,
   4095   t_mode,
   4096   q_mode,
   4097   t_mode,
   4098   q_mode
   4099 };
   4100 
   4101 #define ST { OP_ST, 0 }
   4102 #define STi { OP_STi, 0 }
   4103 
   4104 #define FGRPd9_2 NULL, { { NULL, 0 } }
   4105 #define FGRPd9_4 NULL, { { NULL, 1 } }
   4106 #define FGRPd9_5 NULL, { { NULL, 2 } }
   4107 #define FGRPd9_6 NULL, { { NULL, 3 } }
   4108 #define FGRPd9_7 NULL, { { NULL, 4 } }
   4109 #define FGRPda_5 NULL, { { NULL, 5 } }
   4110 #define FGRPdb_4 NULL, { { NULL, 6 } }
   4111 #define FGRPde_3 NULL, { { NULL, 7 } }
   4112 #define FGRPdf_4 NULL, { { NULL, 8 } }
   4113 
   4114 static const struct dis386 float_reg[][8] = {
   4115   /* d8 */
   4116   {
   4117     { "fadd",	{ ST, STi } },
   4118     { "fmul",	{ ST, STi } },
   4119     { "fcom",	{ STi } },
   4120     { "fcomp",	{ STi } },
   4121     { "fsub",	{ ST, STi } },
   4122     { "fsubr",	{ ST, STi } },
   4123     { "fdiv",	{ ST, STi } },
   4124     { "fdivr",	{ ST, STi } },
   4125   },
   4126   /* d9 */
   4127   {
   4128     { "fld",	{ STi } },
   4129     { "fxch",	{ STi } },
   4130     { FGRPd9_2 },
   4131     { "(bad)",	{ XX } },
   4132     { FGRPd9_4 },
   4133     { FGRPd9_5 },
   4134     { FGRPd9_6 },
   4135     { FGRPd9_7 },
   4136   },
   4137   /* da */
   4138   {
   4139     { "fcmovb",	{ ST, STi } },
   4140     { "fcmove",	{ ST, STi } },
   4141     { "fcmovbe",{ ST, STi } },
   4142     { "fcmovu",	{ ST, STi } },
   4143     { "(bad)",	{ XX } },
   4144     { FGRPda_5 },
   4145     { "(bad)",	{ XX } },
   4146     { "(bad)",	{ XX } },
   4147   },
   4148   /* db */
   4149   {
   4150     { "fcmovnb",{ ST, STi } },
   4151     { "fcmovne",{ ST, STi } },
   4152     { "fcmovnbe",{ ST, STi } },
   4153     { "fcmovnu",{ ST, STi } },
   4154     { FGRPdb_4 },
   4155     { "fucomi",	{ ST, STi } },
   4156     { "fcomi",	{ ST, STi } },
   4157     { "(bad)",	{ XX } },
   4158   },
   4159   /* dc */
   4160   {
   4161     { "fadd",	{ STi, ST } },
   4162     { "fmul",	{ STi, ST } },
   4163     { "(bad)",	{ XX } },
   4164     { "(bad)",	{ XX } },
   4165 #if SYSV386_COMPAT
   4166     { "fsub",	{ STi, ST } },
   4167     { "fsubr",	{ STi, ST } },
   4168     { "fdiv",	{ STi, ST } },
   4169     { "fdivr",	{ STi, ST } },
   4170 #else
   4171     { "fsubr",	{ STi, ST } },
   4172     { "fsub",	{ STi, ST } },
   4173     { "fdivr",	{ STi, ST } },
   4174     { "fdiv",	{ STi, ST } },
   4175 #endif
   4176   },
   4177   /* dd */
   4178   {
   4179     { "ffree",	{ STi } },
   4180     { "(bad)",	{ XX } },
   4181     { "fst",	{ STi } },
   4182     { "fstp",	{ STi } },
   4183     { "fucom",	{ STi } },
   4184     { "fucomp",	{ STi } },
   4185     { "(bad)",	{ XX } },
   4186     { "(bad)",	{ XX } },
   4187   },
   4188   /* de */
   4189   {
   4190     { "faddp",	{ STi, ST } },
   4191     { "fmulp",	{ STi, ST } },
   4192     { "(bad)",	{ XX } },
   4193     { FGRPde_3 },
   4194 #if SYSV386_COMPAT
   4195     { "fsubp",	{ STi, ST } },
   4196     { "fsubrp",	{ STi, ST } },
   4197     { "fdivp",	{ STi, ST } },
   4198     { "fdivrp",	{ STi, ST } },
   4199 #else
   4200     { "fsubrp",	{ STi, ST } },
   4201     { "fsubp",	{ STi, ST } },
   4202     { "fdivrp",	{ STi, ST } },
   4203     { "fdivp",	{ STi, ST } },
   4204 #endif
   4205   },
   4206   /* df */
   4207   {
   4208     { "ffreep",	{ STi } },
   4209     { "(bad)",	{ XX } },
   4210     { "(bad)",	{ XX } },
   4211     { "(bad)",	{ XX } },
   4212     { FGRPdf_4 },
   4213     { "fucomip", { ST, STi } },
   4214     { "fcomip", { ST, STi } },
   4215     { "(bad)",	{ XX } },
   4216   },
   4217 };
   4218 
   4219 static const char *fgrps[][8] = {
   4220   /* d9_2  0 */
   4221   {
   4222     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   4223   },
   4224 
   4225   /* d9_4  1 */
   4226   {
   4227     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
   4228   },
   4229 
   4230   /* d9_5  2 */
   4231   {
   4232     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
   4233   },
   4234 
   4235   /* d9_6  3 */
   4236   {
   4237     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
   4238   },
   4239 
   4240   /* d9_7  4 */
   4241   {
   4242     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
   4243   },
   4244 
   4245   /* da_5  5 */
   4246   {
   4247     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   4248   },
   4249 
   4250   /* db_4  6 */
   4251   {
   4252     "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
   4253     "fNsetpm(287 only)","(bad)","(bad)","(bad)",
   4254   },
   4255 
   4256   /* de_3  7 */
   4257   {
   4258     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   4259   },
   4260 
   4261   /* df_4  8 */
   4262   {
   4263     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
   4264   },
   4265 };
   4266 
   4267 static void
   4268 dofloat (int sizeflag)
   4269 {
   4270   const struct dis386 *dp;
   4271   unsigned char floatop;
   4272 
   4273   floatop = codep[-1];
   4274 
   4275   if (modrm.mod != 3)
   4276     {
   4277       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
   4278 
   4279       putop (float_mem[fp_indx], sizeflag);
   4280       obufp = op_out[0];
   4281       op_ad = 2;
   4282       OP_E (float_mem_mode[fp_indx], sizeflag);
   4283       return;
   4284     }
   4285   /* Skip mod/rm byte.  */
   4286   MODRM_CHECK;
   4287   codep++;
   4288 
   4289   dp = &float_reg[floatop - 0xd8][modrm.reg];
   4290   if (dp->name == NULL)
   4291     {
   4292       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
   4293 
   4294       /* Instruction fnstsw is only one with strange arg.  */
   4295       if (floatop == 0xdf && codep[-1] == 0xe0)
   4296         pstrcpy (op_out[0], sizeof(op_out[0]), names16[0]);
   4297     }
   4298   else
   4299     {
   4300       putop (dp->name, sizeflag);
   4301 
   4302       obufp = op_out[0];
   4303       op_ad = 2;
   4304       if (dp->op[0].rtn)
   4305 	(*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
   4306 
   4307       obufp = op_out[1];
   4308       op_ad = 1;
   4309       if (dp->op[1].rtn)
   4310 	(*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
   4311     }
   4312 }
   4313 
   4314 static void
   4315 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   4316 {
   4317   oappend ("%st" + intel_syntax);
   4318 }
   4319 
   4320 static void
   4321 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   4322 {
   4323   snprintf (scratchbuf, sizeof(scratchbuf), "%%st(%d)", modrm.rm);
   4324   oappend (scratchbuf + intel_syntax);
   4325 }
   4326 
   4327 /* Capital letters in template are macros.  */
   4328 static int
   4329 putop (const char *template, int sizeflag)
   4330 {
   4331   const char *p;
   4332   int alt = 0;
   4333 
   4334   for (p = template; *p; p++)
   4335     {
   4336       switch (*p)
   4337 	{
   4338 	default:
   4339 	  *obufp++ = *p;
   4340 	  break;
   4341 	case '{':
   4342 	  alt = 0;
   4343 	  if (intel_syntax)
   4344 	    alt += 1;
   4345 	  if (address_mode == mode_64bit)
   4346 	    alt += 2;
   4347 	  while (alt != 0)
   4348 	    {
   4349 	      while (*++p != '|')
   4350 		{
   4351 		  if (*p == '}')
   4352 		    {
   4353 		      /* Alternative not valid.  */
   4354                       pstrcpy (obuf, sizeof(obuf), "(bad)");
   4355 		      obufp = obuf + 5;
   4356 		      return 1;
   4357 		    }
   4358 		  else if (*p == '\0')
   4359 		    abort ();
   4360 		}
   4361 	      alt--;
   4362 	    }
   4363 	  /* Fall through.  */
   4364 	case 'I':
   4365 	  alt = 1;
   4366 	  continue;
   4367 	case '|':
   4368 	  while (*++p != '}')
   4369 	    {
   4370 	      if (*p == '\0')
   4371 		abort ();
   4372 	    }
   4373 	  break;
   4374 	case '}':
   4375 	  break;
   4376 	case 'A':
   4377 	  if (intel_syntax)
   4378 	    break;
   4379 	  if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
   4380 	    *obufp++ = 'b';
   4381 	  break;
   4382 	case 'B':
   4383 	  if (intel_syntax)
   4384 	    break;
   4385 	  if (sizeflag & SUFFIX_ALWAYS)
   4386 	    *obufp++ = 'b';
   4387 	  break;
   4388 	case 'C':
   4389 	  if (intel_syntax && !alt)
   4390 	    break;
   4391 	  if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
   4392 	    {
   4393 	      if (sizeflag & DFLAG)
   4394 		*obufp++ = intel_syntax ? 'd' : 'l';
   4395 	      else
   4396 		*obufp++ = intel_syntax ? 'w' : 's';
   4397 	      used_prefixes |= (prefixes & PREFIX_DATA);
   4398 	    }
   4399 	  break;
   4400 	case 'D':
   4401 	  if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
   4402 	    break;
   4403 	  USED_REX (REX_W);
   4404 	  if (modrm.mod == 3)
   4405 	    {
   4406 	      if (rex & REX_W)
   4407 		*obufp++ = 'q';
   4408 	      else if (sizeflag & DFLAG)
   4409 		*obufp++ = intel_syntax ? 'd' : 'l';
   4410 	      else
   4411 		*obufp++ = 'w';
   4412 	      used_prefixes |= (prefixes & PREFIX_DATA);
   4413 	    }
   4414 	  else
   4415 	    *obufp++ = 'w';
   4416 	  break;
   4417 	case 'E':		/* For jcxz/jecxz */
   4418 	  if (address_mode == mode_64bit)
   4419 	    {
   4420 	      if (sizeflag & AFLAG)
   4421 		*obufp++ = 'r';
   4422 	      else
   4423 		*obufp++ = 'e';
   4424 	    }
   4425 	  else
   4426 	    if (sizeflag & AFLAG)
   4427 	      *obufp++ = 'e';
   4428 	  used_prefixes |= (prefixes & PREFIX_ADDR);
   4429 	  break;
   4430 	case 'F':
   4431 	  if (intel_syntax)
   4432 	    break;
   4433 	  if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
   4434 	    {
   4435 	      if (sizeflag & AFLAG)
   4436 		*obufp++ = address_mode == mode_64bit ? 'q' : 'l';
   4437 	      else
   4438 		*obufp++ = address_mode == mode_64bit ? 'l' : 'w';
   4439 	      used_prefixes |= (prefixes & PREFIX_ADDR);
   4440 	    }
   4441 	  break;
   4442 	case 'G':
   4443 	  if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
   4444 	    break;
   4445 	  if ((rex & REX_W) || (sizeflag & DFLAG))
   4446 	    *obufp++ = 'l';
   4447 	  else
   4448 	    *obufp++ = 'w';
   4449 	  if (!(rex & REX_W))
   4450 	    used_prefixes |= (prefixes & PREFIX_DATA);
   4451 	  break;
   4452 	case 'H':
   4453 	  if (intel_syntax)
   4454 	    break;
   4455 	  if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
   4456 	      || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
   4457 	    {
   4458 	      used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
   4459 	      *obufp++ = ',';
   4460 	      *obufp++ = 'p';
   4461 	      if (prefixes & PREFIX_DS)
   4462 		*obufp++ = 't';
   4463 	      else
   4464 		*obufp++ = 'n';
   4465 	    }
   4466 	  break;
   4467 	case 'J':
   4468 	  if (intel_syntax)
   4469 	    break;
   4470 	  *obufp++ = 'l';
   4471 	  break;
   4472 	case 'K':
   4473 	  USED_REX (REX_W);
   4474 	  if (rex & REX_W)
   4475 	    *obufp++ = 'q';
   4476 	  else
   4477 	    *obufp++ = 'd';
   4478 	  break;
   4479 	case 'Z':
   4480 	  if (intel_syntax)
   4481 	    break;
   4482 	  if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
   4483 	    {
   4484 	      *obufp++ = 'q';
   4485 	      break;
   4486 	    }
   4487 	  /* Fall through.  */
   4488 	case 'L':
   4489 	  if (intel_syntax)
   4490 	    break;
   4491 	  if (sizeflag & SUFFIX_ALWAYS)
   4492 	    *obufp++ = 'l';
   4493 	  break;
   4494 	case 'N':
   4495 	  if ((prefixes & PREFIX_FWAIT) == 0)
   4496 	    *obufp++ = 'n';
   4497 	  else
   4498 	    used_prefixes |= PREFIX_FWAIT;
   4499 	  break;
   4500 	case 'O':
   4501 	  USED_REX (REX_W);
   4502 	  if (rex & REX_W)
   4503 	    *obufp++ = 'o';
   4504 	  else if (intel_syntax && (sizeflag & DFLAG))
   4505 	    *obufp++ = 'q';
   4506 	  else
   4507 	    *obufp++ = 'd';
   4508 	  if (!(rex & REX_W))
   4509 	    used_prefixes |= (prefixes & PREFIX_DATA);
   4510 	  break;
   4511 	case 'T':
   4512 	  if (intel_syntax)
   4513 	    break;
   4514 	  if (address_mode == mode_64bit && (sizeflag & DFLAG))
   4515 	    {
   4516 	      *obufp++ = 'q';
   4517 	      break;
   4518 	    }
   4519 	  /* Fall through.  */
   4520 	case 'P':
   4521 	  if (intel_syntax)
   4522 	    break;
   4523 	  if ((prefixes & PREFIX_DATA)
   4524 	      || (rex & REX_W)
   4525 	      || (sizeflag & SUFFIX_ALWAYS))
   4526 	    {
   4527 	      USED_REX (REX_W);
   4528 	      if (rex & REX_W)
   4529 		*obufp++ = 'q';
   4530 	      else
   4531 		{
   4532 		   if (sizeflag & DFLAG)
   4533 		      *obufp++ = 'l';
   4534 		   else
   4535 		     *obufp++ = 'w';
   4536 		}
   4537 	      used_prefixes |= (prefixes & PREFIX_DATA);
   4538 	    }
   4539 	  break;
   4540 	case 'U':
   4541 	  if (intel_syntax)
   4542 	    break;
   4543 	  if (address_mode == mode_64bit && (sizeflag & DFLAG))
   4544 	    {
   4545 	      if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
   4546 		*obufp++ = 'q';
   4547 	      break;
   4548 	    }
   4549 	  /* Fall through.  */
   4550 	case 'Q':
   4551 	  if (intel_syntax && !alt)
   4552 	    break;
   4553 	  USED_REX (REX_W);
   4554 	  if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
   4555 	    {
   4556 	      if (rex & REX_W)
   4557 		*obufp++ = 'q';
   4558 	      else
   4559 		{
   4560 		  if (sizeflag & DFLAG)
   4561 		    *obufp++ = intel_syntax ? 'd' : 'l';
   4562 		  else
   4563 		    *obufp++ = 'w';
   4564 		}
   4565 	      used_prefixes |= (prefixes & PREFIX_DATA);
   4566 	    }
   4567 	  break;
   4568 	case 'R':
   4569 	  USED_REX (REX_W);
   4570 	  if (rex & REX_W)
   4571 	    *obufp++ = 'q';
   4572 	  else if (sizeflag & DFLAG)
   4573 	    {
   4574 	      if (intel_syntax)
   4575 		  *obufp++ = 'd';
   4576 	      else
   4577 		  *obufp++ = 'l';
   4578 	    }
   4579 	  else
   4580 	    *obufp++ = 'w';
   4581 	  if (intel_syntax && !p[1]
   4582 	      && ((rex & REX_W) || (sizeflag & DFLAG)))
   4583 	    *obufp++ = 'e';
   4584 	  if (!(rex & REX_W))
   4585 	    used_prefixes |= (prefixes & PREFIX_DATA);
   4586 	  break;
   4587 	case 'V':
   4588 	  if (intel_syntax)
   4589 	    break;
   4590 	  if (address_mode == mode_64bit && (sizeflag & DFLAG))
   4591 	    {
   4592 	      if (sizeflag & SUFFIX_ALWAYS)
   4593 		*obufp++ = 'q';
   4594 	      break;
   4595 	    }
   4596 	  /* Fall through.  */
   4597 	case 'S':
   4598 	  if (intel_syntax)
   4599 	    break;
   4600 	  if (sizeflag & SUFFIX_ALWAYS)
   4601 	    {
   4602 	      if (rex & REX_W)
   4603 		*obufp++ = 'q';
   4604 	      else
   4605 		{
   4606 		  if (sizeflag & DFLAG)
   4607 		    *obufp++ = 'l';
   4608 		  else
   4609 		    *obufp++ = 'w';
   4610 		  used_prefixes |= (prefixes & PREFIX_DATA);
   4611 		}
   4612 	    }
   4613 	  break;
   4614 	case 'X':
   4615 	  if (prefixes & PREFIX_DATA)
   4616 	    *obufp++ = 'd';
   4617 	  else
   4618 	    *obufp++ = 's';
   4619 	  used_prefixes |= (prefixes & PREFIX_DATA);
   4620 	  break;
   4621 	case 'Y':
   4622 	  if (intel_syntax)
   4623 	    break;
   4624 	  if (rex & REX_W)
   4625 	    {
   4626 	      USED_REX (REX_W);
   4627 	      *obufp++ = 'q';
   4628 	    }
   4629 	  break;
   4630 	  /* implicit operand size 'l' for i386 or 'q' for x86-64 */
   4631 	case 'W':
   4632 	  /* operand size flag for cwtl, cbtw */
   4633 	  USED_REX (REX_W);
   4634 	  if (rex & REX_W)
   4635 	    {
   4636 	      if (intel_syntax)
   4637 		*obufp++ = 'd';
   4638 	      else
   4639 		*obufp++ = 'l';
   4640 	    }
   4641 	  else if (sizeflag & DFLAG)
   4642 	    *obufp++ = 'w';
   4643 	  else
   4644 	    *obufp++ = 'b';
   4645 	  if (!(rex & REX_W))
   4646 	    used_prefixes |= (prefixes & PREFIX_DATA);
   4647 	  break;
   4648 	}
   4649       alt = 0;
   4650     }
   4651   *obufp = 0;
   4652   return 0;
   4653 }
   4654 
   4655 static void
   4656 oappend (const char *s)
   4657 {
   4658   strcpy (obufp, s);
   4659   obufp += strlen (s);
   4660 }
   4661 
   4662 static void
   4663 append_seg (void)
   4664 {
   4665   if (prefixes & PREFIX_CS)
   4666     {
   4667       used_prefixes |= PREFIX_CS;
   4668       oappend ("%cs:" + intel_syntax);
   4669     }
   4670   if (prefixes & PREFIX_DS)
   4671     {
   4672       used_prefixes |= PREFIX_DS;
   4673       oappend ("%ds:" + intel_syntax);
   4674     }
   4675   if (prefixes & PREFIX_SS)
   4676     {
   4677       used_prefixes |= PREFIX_SS;
   4678       oappend ("%ss:" + intel_syntax);
   4679     }
   4680   if (prefixes & PREFIX_ES)
   4681     {
   4682       used_prefixes |= PREFIX_ES;
   4683       oappend ("%es:" + intel_syntax);
   4684     }
   4685   if (prefixes & PREFIX_FS)
   4686     {
   4687       used_prefixes |= PREFIX_FS;
   4688       oappend ("%fs:" + intel_syntax);
   4689     }
   4690   if (prefixes & PREFIX_GS)
   4691     {
   4692       used_prefixes |= PREFIX_GS;
   4693       oappend ("%gs:" + intel_syntax);
   4694     }
   4695 }
   4696 
   4697 static void
   4698 OP_indirE (int bytemode, int sizeflag)
   4699 {
   4700   if (!intel_syntax)
   4701     oappend ("*");
   4702   OP_E (bytemode, sizeflag);
   4703 }
   4704 
   4705 static void
   4706 print_operand_value (char *buf, size_t bufsize, int hex, bfd_vma disp)
   4707 {
   4708   if (address_mode == mode_64bit)
   4709     {
   4710       if (hex)
   4711 	{
   4712 	  char tmp[30];
   4713 	  int i;
   4714 	  buf[0] = '0';
   4715 	  buf[1] = 'x';
   4716           snprintf_vma (tmp, sizeof(tmp), disp);
   4717 	  for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
   4718           pstrcpy (buf + 2, bufsize - 2, tmp + i);
   4719 	}
   4720       else
   4721 	{
   4722 	  bfd_signed_vma v = disp;
   4723 	  char tmp[30];
   4724 	  int i;
   4725 	  if (v < 0)
   4726 	    {
   4727 	      *(buf++) = '-';
   4728 	      v = -disp;
   4729 	      /* Check for possible overflow on 0x8000000000000000.  */
   4730 	      if (v < 0)
   4731 		{
   4732                   pstrcpy (buf, bufsize, "9223372036854775808");
   4733 		  return;
   4734 		}
   4735 	    }
   4736 	  if (!v)
   4737 	    {
   4738                 pstrcpy (buf, bufsize, "0");
   4739 	      return;
   4740 	    }
   4741 
   4742 	  i = 0;
   4743 	  tmp[29] = 0;
   4744 	  while (v)
   4745 	    {
   4746 	      tmp[28 - i] = (v % 10) + '0';
   4747 	      v /= 10;
   4748 	      i++;
   4749 	    }
   4750           pstrcpy (buf, bufsize, tmp + 29 - i);
   4751 	}
   4752     }
   4753   else
   4754     {
   4755       if (hex)
   4756         snprintf (buf, bufsize, "0x%x", (unsigned int) disp);
   4757       else
   4758         snprintf (buf, bufsize, "%d", (int) disp);
   4759     }
   4760 }
   4761 
   4762 /* Put DISP in BUF as signed hex number.  */
   4763 
   4764 static void
   4765 print_displacement (char *buf, bfd_vma disp)
   4766 {
   4767   bfd_signed_vma val = disp;
   4768   char tmp[30];
   4769   int i, j = 0;
   4770 
   4771   if (val < 0)
   4772     {
   4773       buf[j++] = '-';
   4774       val = -disp;
   4775 
   4776       /* Check for possible overflow.  */
   4777       if (val < 0)
   4778 	{
   4779 	  switch (address_mode)
   4780 	    {
   4781 	    case mode_64bit:
   4782 	      strcpy (buf + j, "0x8000000000000000");
   4783 	      break;
   4784 	    case mode_32bit:
   4785 	      strcpy (buf + j, "0x80000000");
   4786 	      break;
   4787 	    case mode_16bit:
   4788 	      strcpy (buf + j, "0x8000");
   4789 	      break;
   4790 	    }
   4791 	  return;
   4792 	}
   4793     }
   4794 
   4795   buf[j++] = '0';
   4796   buf[j++] = 'x';
   4797 
   4798   snprintf_vma (tmp, sizeof(tmp), val);
   4799   for (i = 0; tmp[i] == '0'; i++)
   4800     continue;
   4801   if (tmp[i] == '\0')
   4802     i--;
   4803   strcpy (buf + j, tmp + i);
   4804 }
   4805 
   4806 static void
   4807 intel_operand_size (int bytemode, int sizeflag)
   4808 {
   4809   switch (bytemode)
   4810     {
   4811     case b_mode:
   4812     case dqb_mode:
   4813       oappend ("BYTE PTR ");
   4814       break;
   4815     case w_mode:
   4816     case dqw_mode:
   4817       oappend ("WORD PTR ");
   4818       break;
   4819     case stack_v_mode:
   4820       if (address_mode == mode_64bit && (sizeflag & DFLAG))
   4821 	{
   4822 	  oappend ("QWORD PTR ");
   4823 	  used_prefixes |= (prefixes & PREFIX_DATA);
   4824 	  break;
   4825 	}
   4826       /* FALLTHRU */
   4827     case v_mode:
   4828     case dq_mode:
   4829       USED_REX (REX_W);
   4830       if (rex & REX_W)
   4831 	oappend ("QWORD PTR ");
   4832       else if ((sizeflag & DFLAG) || bytemode == dq_mode)
   4833 	oappend ("DWORD PTR ");
   4834       else
   4835 	oappend ("WORD PTR ");
   4836       used_prefixes |= (prefixes & PREFIX_DATA);
   4837       break;
   4838     case z_mode:
   4839       if ((rex & REX_W) || (sizeflag & DFLAG))
   4840 	*obufp++ = 'D';
   4841       oappend ("WORD PTR ");
   4842       if (!(rex & REX_W))
   4843 	used_prefixes |= (prefixes & PREFIX_DATA);
   4844       break;
   4845     case d_mode:
   4846     case dqd_mode:
   4847       oappend ("DWORD PTR ");
   4848       break;
   4849     case q_mode:
   4850       oappend ("QWORD PTR ");
   4851       break;
   4852     case m_mode:
   4853       if (address_mode == mode_64bit)
   4854 	oappend ("QWORD PTR ");
   4855       else
   4856 	oappend ("DWORD PTR ");
   4857       break;
   4858     case f_mode:
   4859       if (sizeflag & DFLAG)
   4860 	oappend ("FWORD PTR ");
   4861       else
   4862 	oappend ("DWORD PTR ");
   4863       used_prefixes |= (prefixes & PREFIX_DATA);
   4864       break;
   4865     case t_mode:
   4866       oappend ("TBYTE PTR ");
   4867       break;
   4868     case x_mode:
   4869       oappend ("XMMWORD PTR ");
   4870       break;
   4871     case o_mode:
   4872       oappend ("OWORD PTR ");
   4873       break;
   4874     default:
   4875       break;
   4876     }
   4877 }
   4878 
   4879 static void
   4880 OP_E (int bytemode, int sizeflag)
   4881 {
   4882   bfd_vma disp;
   4883   int add = 0;
   4884   int riprel = 0;
   4885   USED_REX (REX_B);
   4886   if (rex & REX_B)
   4887     add += 8;
   4888 
   4889   /* Skip mod/rm byte.  */
   4890   MODRM_CHECK;
   4891   codep++;
   4892 
   4893   if (modrm.mod == 3)
   4894     {
   4895       switch (bytemode)
   4896 	{
   4897 	case b_mode:
   4898 	  USED_REX (0);
   4899 	  if (rex)
   4900 	    oappend (names8rex[modrm.rm + add]);
   4901 	  else
   4902 	    oappend (names8[modrm.rm + add]);
   4903 	  break;
   4904 	case w_mode:
   4905 	  oappend (names16[modrm.rm + add]);
   4906 	  break;
   4907 	case d_mode:
   4908 	  oappend (names32[modrm.rm + add]);
   4909 	  break;
   4910 	case q_mode:
   4911 	  oappend (names64[modrm.rm + add]);
   4912 	  break;
   4913 	case m_mode:
   4914 	  if (address_mode == mode_64bit)
   4915 	    oappend (names64[modrm.rm + add]);
   4916 	  else
   4917 	    oappend (names32[modrm.rm + add]);
   4918 	  break;
   4919 	case stack_v_mode:
   4920 	  if (address_mode == mode_64bit && (sizeflag & DFLAG))
   4921 	    {
   4922 	      oappend (names64[modrm.rm + add]);
   4923 	      used_prefixes |= (prefixes & PREFIX_DATA);
   4924 	      break;
   4925 	    }
   4926 	  bytemode = v_mode;
   4927 	  /* FALLTHRU */
   4928 	case v_mode:
   4929 	case dq_mode:
   4930 	case dqb_mode:
   4931 	case dqd_mode:
   4932 	case dqw_mode:
   4933 	  USED_REX (REX_W);
   4934 	  if (rex & REX_W)
   4935 	    oappend (names64[modrm.rm + add]);
   4936 	  else if ((sizeflag & DFLAG) || bytemode != v_mode)
   4937 	    oappend (names32[modrm.rm + add]);
   4938 	  else
   4939 	    oappend (names16[modrm.rm + add]);
   4940 	  used_prefixes |= (prefixes & PREFIX_DATA);
   4941 	  break;
   4942 	case 0:
   4943 	  break;
   4944 	default:
   4945 	  oappend (INTERNAL_DISASSEMBLER_ERROR);
   4946 	  break;
   4947 	}
   4948       return;
   4949     }
   4950 
   4951   disp = 0;
   4952   if (intel_syntax)
   4953     intel_operand_size (bytemode, sizeflag);
   4954   append_seg ();
   4955 
   4956   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
   4957     {
   4958       /* 32/64 bit address mode */
   4959       int havedisp;
   4960       int havesib;
   4961       int havebase;
   4962       int base;
   4963       int index = 0;
   4964       int scale = 0;
   4965 
   4966       havesib = 0;
   4967       havebase = 1;
   4968       base = modrm.rm;
   4969 
   4970       if (base == 4)
   4971 	{
   4972 	  havesib = 1;
   4973 	  FETCH_DATA (the_info, codep + 1);
   4974 	  index = (*codep >> 3) & 7;
   4975 	  if (address_mode == mode_64bit || index != 0x4)
   4976 	    /* When INDEX == 0x4 in 32 bit mode, SCALE is ignored.  */
   4977 	    scale = (*codep >> 6) & 3;
   4978 	  base = *codep & 7;
   4979 	  USED_REX (REX_X);
   4980 	  if (rex & REX_X)
   4981 	    index += 8;
   4982 	  codep++;
   4983 	}
   4984       base += add;
   4985 
   4986       switch (modrm.mod)
   4987 	{
   4988 	case 0:
   4989 	  if ((base & 7) == 5)
   4990 	    {
   4991 	      havebase = 0;
   4992 	      if (address_mode == mode_64bit && !havesib)
   4993 		riprel = 1;
   4994 	      disp = get32s ();
   4995 	    }
   4996 	  break;
   4997 	case 1:
   4998 	  FETCH_DATA (the_info, codep + 1);
   4999 	  disp = *codep++;
   5000 	  if ((disp & 0x80) != 0)
   5001 	    disp -= 0x100;
   5002 	  break;
   5003 	case 2:
   5004 	  disp = get32s ();
   5005 	  break;
   5006 	}
   5007 
   5008       havedisp = havebase || (havesib && (index != 4 || scale != 0));
   5009 
   5010       if (!intel_syntax)
   5011 	if (modrm.mod != 0 || (base & 7) == 5)
   5012 	  {
   5013 	    if (havedisp || riprel)
   5014 	      print_displacement (scratchbuf, disp);
   5015 	    else
   5016               print_operand_value (scratchbuf, sizeof(scratchbuf), 1, disp);
   5017 	    oappend (scratchbuf);
   5018 	    if (riprel)
   5019 	      {
   5020 		set_op (disp, 1);
   5021 		oappend ("(%rip)");
   5022 	      }
   5023 	  }
   5024 
   5025       if (havedisp || (intel_syntax && riprel))
   5026 	{
   5027 	  *obufp++ = open_char;
   5028 	  if (intel_syntax && riprel)
   5029 	    {
   5030 	      set_op (disp, 1);
   5031 	      oappend ("rip");
   5032 	    }
   5033 	  *obufp = '\0';
   5034 	  if (havebase)
   5035 	    oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
   5036 		     ? names64[base] : names32[base]);
   5037 	  if (havesib)
   5038 	    {
   5039 	      if (index != 4)
   5040 		{
   5041 		  if (!intel_syntax || havebase)
   5042 		    {
   5043 		      *obufp++ = separator_char;
   5044 		      *obufp = '\0';
   5045 		    }
   5046 		  oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
   5047 			   ? names64[index] : names32[index]);
   5048 		}
   5049 	      if (scale != 0 || (!intel_syntax && index != 4))
   5050 		{
   5051 		  *obufp++ = scale_char;
   5052 		  *obufp = '\0';
   5053 		  snprintf (scratchbuf, sizeof(scratchbuf), "%d", 1 << scale);
   5054 		  oappend (scratchbuf);
   5055 		}
   5056 	    }
   5057 	  if (intel_syntax
   5058 	      && (disp || modrm.mod != 0 || (base & 7) == 5))
   5059 	    {
   5060 	      if ((bfd_signed_vma) disp >= 0)
   5061 		{
   5062 		  *obufp++ = '+';
   5063 		  *obufp = '\0';
   5064 		}
   5065 	      else if (modrm.mod != 1)
   5066 		{
   5067 		  *obufp++ = '-';
   5068 		  *obufp = '\0';
   5069 		  disp = - (bfd_signed_vma) disp;
   5070 		}
   5071 
   5072 	      print_displacement (scratchbuf, disp);
   5073 	      oappend (scratchbuf);
   5074 	    }
   5075 
   5076 	  *obufp++ = close_char;
   5077 	  *obufp = '\0';
   5078 	}
   5079       else if (intel_syntax)
   5080 	{
   5081 	  if (modrm.mod != 0 || (base & 7) == 5)
   5082 	    {
   5083 	      if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
   5084 			      | PREFIX_ES | PREFIX_FS | PREFIX_GS))
   5085 		;
   5086 	      else
   5087 		{
   5088 		  oappend (names_seg[ds_reg - es_reg]);
   5089 		  oappend (":");
   5090 		}
   5091 	      print_operand_value (scratchbuf, sizeof(scratchbuf), 1, disp);
   5092 	      oappend (scratchbuf);
   5093 	    }
   5094 	}
   5095     }
   5096   else
   5097     { /* 16 bit address mode */
   5098       switch (modrm.mod)
   5099 	{
   5100 	case 0:
   5101 	  if (modrm.rm == 6)
   5102 	    {
   5103 	      disp = get16 ();
   5104 	      if ((disp & 0x8000) != 0)
   5105 		disp -= 0x10000;
   5106 	    }
   5107 	  break;
   5108 	case 1:
   5109 	  FETCH_DATA (the_info, codep + 1);
   5110 	  disp = *codep++;
   5111 	  if ((disp & 0x80) != 0)
   5112 	    disp -= 0x100;
   5113 	  break;
   5114 	case 2:
   5115 	  disp = get16 ();
   5116 	  if ((disp & 0x8000) != 0)
   5117 	    disp -= 0x10000;
   5118 	  break;
   5119 	}
   5120 
   5121       if (!intel_syntax)
   5122 	if (modrm.mod != 0 || modrm.rm == 6)
   5123 	  {
   5124 	    print_displacement (scratchbuf, disp);
   5125 	    oappend (scratchbuf);
   5126 	  }
   5127 
   5128       if (modrm.mod != 0 || modrm.rm != 6)
   5129 	{
   5130 	  *obufp++ = open_char;
   5131 	  *obufp = '\0';
   5132 	  oappend (index16[modrm.rm]);
   5133 	  if (intel_syntax
   5134 	      && (disp || modrm.mod != 0 || modrm.rm == 6))
   5135 	    {
   5136 	      if ((bfd_signed_vma) disp >= 0)
   5137 		{
   5138 		  *obufp++ = '+';
   5139 		  *obufp = '\0';
   5140 		}
   5141 	      else if (modrm.mod != 1)
   5142 		{
   5143 		  *obufp++ = '-';
   5144 		  *obufp = '\0';
   5145 		  disp = - (bfd_signed_vma) disp;
   5146 		}
   5147 
   5148 	      print_displacement (scratchbuf, disp);
   5149 	      oappend (scratchbuf);
   5150 	    }
   5151 
   5152 	  *obufp++ = close_char;
   5153 	  *obufp = '\0';
   5154 	}
   5155       else if (intel_syntax)
   5156 	{
   5157 	  if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
   5158 			  | PREFIX_ES | PREFIX_FS | PREFIX_GS))
   5159 	    ;
   5160 	  else
   5161 	    {
   5162 	      oappend (names_seg[ds_reg - es_reg]);
   5163 	      oappend (":");
   5164 	    }
   5165 	  print_operand_value (scratchbuf, sizeof(scratchbuf), 1,
   5166                                disp & 0xffff);
   5167 	  oappend (scratchbuf);
   5168 	}
   5169     }
   5170 }
   5171 
   5172 static void
   5173 OP_G (int bytemode, int sizeflag)
   5174 {
   5175   int add = 0;
   5176   USED_REX (REX_R);
   5177   if (rex & REX_R)
   5178     add += 8;
   5179   switch (bytemode)
   5180     {
   5181     case b_mode:
   5182       USED_REX (0);
   5183       if (rex)
   5184 	oappend (names8rex[modrm.reg + add]);
   5185       else
   5186 	oappend (names8[modrm.reg + add]);
   5187       break;
   5188     case w_mode:
   5189       oappend (names16[modrm.reg + add]);
   5190       break;
   5191     case d_mode:
   5192       oappend (names32[modrm.reg + add]);
   5193       break;
   5194     case q_mode:
   5195       oappend (names64[modrm.reg + add]);
   5196       break;
   5197     case v_mode:
   5198     case dq_mode:
   5199     case dqb_mode:
   5200     case dqd_mode:
   5201     case dqw_mode:
   5202       USED_REX (REX_W);
   5203       if (rex & REX_W)
   5204 	oappend (names64[modrm.reg + add]);
   5205       else if ((sizeflag & DFLAG) || bytemode != v_mode)
   5206 	oappend (names32[modrm.reg + add]);
   5207       else
   5208 	oappend (names16[modrm.reg + add]);
   5209       used_prefixes |= (prefixes & PREFIX_DATA);
   5210       break;
   5211     case m_mode:
   5212       if (address_mode == mode_64bit)
   5213 	oappend (names64[modrm.reg + add]);
   5214       else
   5215 	oappend (names32[modrm.reg + add]);
   5216       break;
   5217     default:
   5218       oappend (INTERNAL_DISASSEMBLER_ERROR);
   5219       break;
   5220     }
   5221 }
   5222 
   5223 static bfd_vma
   5224 get64 (void)
   5225 {
   5226   bfd_vma x;
   5227 #ifdef BFD64
   5228   unsigned int a;
   5229   unsigned int b;
   5230 
   5231   FETCH_DATA (the_info, codep + 8);
   5232   a = *codep++ & 0xff;
   5233   a |= (*codep++ & 0xff) << 8;
   5234   a |= (*codep++ & 0xff) << 16;
   5235   a |= (*codep++ & 0xff) << 24;
   5236   b = *codep++ & 0xff;
   5237   b |= (*codep++ & 0xff) << 8;
   5238   b |= (*codep++ & 0xff) << 16;
   5239   b |= (*codep++ & 0xff) << 24;
   5240   x = a + ((bfd_vma) b << 32);
   5241 #else
   5242   abort ();
   5243   x = 0;
   5244 #endif
   5245   return x;
   5246 }
   5247 
   5248 static bfd_signed_vma
   5249 get32 (void)
   5250 {
   5251   bfd_signed_vma x = 0;
   5252 
   5253   FETCH_DATA (the_info, codep + 4);
   5254   x = *codep++ & (bfd_signed_vma) 0xff;
   5255   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
   5256   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
   5257   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
   5258   return x;
   5259 }
   5260 
   5261 static bfd_signed_vma
   5262 get32s (void)
   5263 {
   5264   bfd_signed_vma x = 0;
   5265 
   5266   FETCH_DATA (the_info, codep + 4);
   5267   x = *codep++ & (bfd_signed_vma) 0xff;
   5268   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
   5269   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
   5270   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
   5271 
   5272   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
   5273 
   5274   return x;
   5275 }
   5276 
   5277 static int
   5278 get16 (void)
   5279 {
   5280   int x = 0;
   5281 
   5282   FETCH_DATA (the_info, codep + 2);
   5283   x = *codep++ & 0xff;
   5284   x |= (*codep++ & 0xff) << 8;
   5285   return x;
   5286 }
   5287 
   5288 static void
   5289 set_op (bfd_vma op, int riprel)
   5290 {
   5291   op_index[op_ad] = op_ad;
   5292   if (address_mode == mode_64bit)
   5293     {
   5294       op_address[op_ad] = op;
   5295       op_riprel[op_ad] = riprel;
   5296     }
   5297   else
   5298     {
   5299       /* Mask to get a 32-bit address.  */
   5300       op_address[op_ad] = op & 0xffffffff;
   5301       op_riprel[op_ad] = riprel & 0xffffffff;
   5302     }
   5303 }
   5304 
   5305 static void
   5306 OP_REG (int code, int sizeflag)
   5307 {
   5308   const char *s;
   5309   int add = 0;
   5310   USED_REX (REX_B);
   5311   if (rex & REX_B)
   5312     add = 8;
   5313 
   5314   switch (code)
   5315     {
   5316     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
   5317     case sp_reg: case bp_reg: case si_reg: case di_reg:
   5318       s = names16[code - ax_reg + add];
   5319       break;
   5320     case es_reg: case ss_reg: case cs_reg:
   5321     case ds_reg: case fs_reg: case gs_reg:
   5322       s = names_seg[code - es_reg + add];
   5323       break;
   5324     case al_reg: case ah_reg: case cl_reg: case ch_reg:
   5325     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
   5326       USED_REX (0);
   5327       if (rex)
   5328 	s = names8rex[code - al_reg + add];
   5329       else
   5330 	s = names8[code - al_reg];
   5331       break;
   5332     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
   5333     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
   5334       if (address_mode == mode_64bit && (sizeflag & DFLAG))
   5335 	{
   5336 	  s = names64[code - rAX_reg + add];
   5337 	  break;
   5338 	}
   5339       code += eAX_reg - rAX_reg;
   5340       /* Fall through.  */
   5341     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
   5342     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
   5343       USED_REX (REX_W);
   5344       if (rex & REX_W)
   5345 	s = names64[code - eAX_reg + add];
   5346       else if (sizeflag & DFLAG)
   5347 	s = names32[code - eAX_reg + add];
   5348       else
   5349 	s = names16[code - eAX_reg + add];
   5350       used_prefixes |= (prefixes & PREFIX_DATA);
   5351       break;
   5352     default:
   5353       s = INTERNAL_DISASSEMBLER_ERROR;
   5354       break;
   5355     }
   5356   oappend (s);
   5357 }
   5358 
   5359 static void
   5360 OP_IMREG (int code, int sizeflag)
   5361 {
   5362   const char *s;
   5363 
   5364   switch (code)
   5365     {
   5366     case indir_dx_reg:
   5367       if (intel_syntax)
   5368 	s = "dx";
   5369       else
   5370 	s = "(%dx)";
   5371       break;
   5372     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
   5373     case sp_reg: case bp_reg: case si_reg: case di_reg:
   5374       s = names16[code - ax_reg];
   5375       break;
   5376     case es_reg: case ss_reg: case cs_reg:
   5377     case ds_reg: case fs_reg: case gs_reg:
   5378       s = names_seg[code - es_reg];
   5379       break;
   5380     case al_reg: case ah_reg: case cl_reg: case ch_reg:
   5381     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
   5382       USED_REX (0);
   5383       if (rex)
   5384 	s = names8rex[code - al_reg];
   5385       else
   5386 	s = names8[code - al_reg];
   5387       break;
   5388     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
   5389     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
   5390       USED_REX (REX_W);
   5391       if (rex & REX_W)
   5392 	s = names64[code - eAX_reg];
   5393       else if (sizeflag & DFLAG)
   5394 	s = names32[code - eAX_reg];
   5395       else
   5396 	s = names16[code - eAX_reg];
   5397       used_prefixes |= (prefixes & PREFIX_DATA);
   5398       break;
   5399     case z_mode_ax_reg:
   5400       if ((rex & REX_W) || (sizeflag & DFLAG))
   5401 	s = *names32;
   5402       else
   5403 	s = *names16;
   5404       if (!(rex & REX_W))
   5405 	used_prefixes |= (prefixes & PREFIX_DATA);
   5406       break;
   5407     default:
   5408       s = INTERNAL_DISASSEMBLER_ERROR;
   5409       break;
   5410     }
   5411   oappend (s);
   5412 }
   5413 
   5414 static void
   5415 OP_I (int bytemode, int sizeflag)
   5416 {
   5417   bfd_signed_vma op;
   5418   bfd_signed_vma mask = -1;
   5419 
   5420   switch (bytemode)
   5421     {
   5422     case b_mode:
   5423       FETCH_DATA (the_info, codep + 1);
   5424       op = *codep++;
   5425       mask = 0xff;
   5426       break;
   5427     case q_mode:
   5428       if (address_mode == mode_64bit)
   5429 	{
   5430 	  op = get32s ();
   5431 	  break;
   5432 	}
   5433       /* Fall through.  */
   5434     case v_mode:
   5435       USED_REX (REX_W);
   5436       if (rex & REX_W)
   5437 	op = get32s ();
   5438       else if (sizeflag & DFLAG)
   5439 	{
   5440 	  op = get32 ();
   5441 	  mask = 0xffffffff;
   5442 	}
   5443       else
   5444 	{
   5445 	  op = get16 ();
   5446 	  mask = 0xfffff;
   5447 	}
   5448       used_prefixes |= (prefixes & PREFIX_DATA);
   5449       break;
   5450     case w_mode:
   5451       mask = 0xfffff;
   5452       op = get16 ();
   5453       break;
   5454     case const_1_mode:
   5455       if (intel_syntax)
   5456         oappend ("1");
   5457       return;
   5458     default:
   5459       oappend (INTERNAL_DISASSEMBLER_ERROR);
   5460       return;
   5461     }
   5462 
   5463   op &= mask;
   5464   scratchbuf[0] = '$';
   5465   print_operand_value (scratchbuf + 1, sizeof(scratchbuf) - 1, 1, op);
   5466   oappend (scratchbuf + intel_syntax);
   5467   scratchbuf[0] = '\0';
   5468 }
   5469 
   5470 static void
   5471 OP_I64 (int bytemode, int sizeflag)
   5472 {
   5473   bfd_signed_vma op;
   5474   bfd_signed_vma mask = -1;
   5475 
   5476   if (address_mode != mode_64bit)
   5477     {
   5478       OP_I (bytemode, sizeflag);
   5479       return;
   5480     }
   5481 
   5482   switch (bytemode)
   5483     {
   5484     case b_mode:
   5485       FETCH_DATA (the_info, codep + 1);
   5486       op = *codep++;
   5487       mask = 0xff;
   5488       break;
   5489     case v_mode:
   5490       USED_REX (REX_W);
   5491       if (rex & REX_W)
   5492 	op = get64 ();
   5493       else if (sizeflag & DFLAG)
   5494 	{
   5495 	  op = get32 ();
   5496 	  mask = 0xffffffff;
   5497 	}
   5498       else
   5499 	{
   5500 	  op = get16 ();
   5501 	  mask = 0xfffff;
   5502 	}
   5503       used_prefixes |= (prefixes & PREFIX_DATA);
   5504       break;
   5505     case w_mode:
   5506       mask = 0xfffff;
   5507       op = get16 ();
   5508       break;
   5509     default:
   5510       oappend (INTERNAL_DISASSEMBLER_ERROR);
   5511       return;
   5512     }
   5513 
   5514   op &= mask;
   5515   scratchbuf[0] = '$';
   5516   print_operand_value (scratchbuf + 1, sizeof(scratchbuf) - 1, 1, op);
   5517   oappend (scratchbuf + intel_syntax);
   5518   scratchbuf[0] = '\0';
   5519 }
   5520 
   5521 static void
   5522 OP_sI (int bytemode, int sizeflag)
   5523 {
   5524   bfd_signed_vma op;
   5525   bfd_signed_vma mask = -1;
   5526 
   5527   switch (bytemode)
   5528     {
   5529     case b_mode:
   5530       FETCH_DATA (the_info, codep + 1);
   5531       op = *codep++;
   5532       if ((op & 0x80) != 0)
   5533 	op -= 0x100;
   5534       mask = 0xffffffff;
   5535       break;
   5536     case v_mode:
   5537       USED_REX (REX_W);
   5538       if (rex & REX_W)
   5539 	op = get32s ();
   5540       else if (sizeflag & DFLAG)
   5541 	{
   5542 	  op = get32s ();
   5543 	  mask = 0xffffffff;
   5544 	}
   5545       else
   5546 	{
   5547 	  mask = 0xffffffff;
   5548 	  op = get16 ();
   5549 	  if ((op & 0x8000) != 0)
   5550 	    op -= 0x10000;
   5551 	}
   5552       used_prefixes |= (prefixes & PREFIX_DATA);
   5553       break;
   5554     case w_mode:
   5555       op = get16 ();
   5556       mask = 0xffffffff;
   5557       if ((op & 0x8000) != 0)
   5558 	op -= 0x10000;
   5559       break;
   5560     default:
   5561       oappend (INTERNAL_DISASSEMBLER_ERROR);
   5562       return;
   5563     }
   5564 
   5565   scratchbuf[0] = '$';
   5566   print_operand_value (scratchbuf + 1, sizeof(scratchbuf) - 1, 1, op);
   5567   oappend (scratchbuf + intel_syntax);
   5568 }
   5569 
   5570 static void
   5571 OP_J (int bytemode, int sizeflag)
   5572 {
   5573   bfd_vma disp;
   5574   bfd_vma mask = -1;
   5575   bfd_vma segment = 0;
   5576 
   5577   switch (bytemode)
   5578     {
   5579     case b_mode:
   5580       FETCH_DATA (the_info, codep + 1);
   5581       disp = *codep++;
   5582       if ((disp & 0x80) != 0)
   5583 	disp -= 0x100;
   5584       break;
   5585     case v_mode:
   5586       if ((sizeflag & DFLAG) || (rex & REX_W))
   5587 	disp = get32s ();
   5588       else
   5589 	{
   5590 	  disp = get16 ();
   5591 	  if ((disp & 0x8000) != 0)
   5592 	    disp -= 0x10000;
   5593 	  /* In 16bit mode, address is wrapped around at 64k within
   5594 	     the same segment.  Otherwise, a data16 prefix on a jump
   5595 	     instruction means that the pc is masked to 16 bits after
   5596 	     the displacement is added!  */
   5597 	  mask = 0xffff;
   5598 	  if ((prefixes & PREFIX_DATA) == 0)
   5599 	    segment = ((start_pc + codep - start_codep)
   5600 		       & ~((bfd_vma) 0xffff));
   5601 	}
   5602       used_prefixes |= (prefixes & PREFIX_DATA);
   5603       break;
   5604     default:
   5605       oappend (INTERNAL_DISASSEMBLER_ERROR);
   5606       return;
   5607     }
   5608   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
   5609   set_op (disp, 0);
   5610   print_operand_value (scratchbuf, sizeof(scratchbuf), 1, disp);
   5611   oappend (scratchbuf);
   5612 }
   5613 
   5614 static void
   5615 OP_SEG (int bytemode, int sizeflag)
   5616 {
   5617   if (bytemode == w_mode)
   5618     oappend (names_seg[modrm.reg]);
   5619   else
   5620     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
   5621 }
   5622 
   5623 static void
   5624 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
   5625 {
   5626   int seg, offset;
   5627 
   5628   if (sizeflag & DFLAG)
   5629     {
   5630       offset = get32 ();
   5631       seg = get16 ();
   5632     }
   5633   else
   5634     {
   5635       offset = get16 ();
   5636       seg = get16 ();
   5637     }
   5638   used_prefixes |= (prefixes & PREFIX_DATA);
   5639   if (intel_syntax)
   5640     snprintf (scratchbuf, sizeof(scratchbuf), "0x%x:0x%x", seg, offset);
   5641   else
   5642     snprintf (scratchbuf, sizeof(scratchbuf), "$0x%x,$0x%x", seg, offset);
   5643   oappend (scratchbuf);
   5644 }
   5645 
   5646 static void
   5647 OP_OFF (int bytemode, int sizeflag)
   5648 {
   5649   bfd_vma off;
   5650 
   5651   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
   5652     intel_operand_size (bytemode, sizeflag);
   5653   append_seg ();
   5654 
   5655   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
   5656     off = get32 ();
   5657   else
   5658     off = get16 ();
   5659 
   5660   if (intel_syntax)
   5661     {
   5662       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
   5663 			| PREFIX_ES | PREFIX_FS | PREFIX_GS)))
   5664 	{
   5665 	  oappend (names_seg[ds_reg - es_reg]);
   5666 	  oappend (":");
   5667 	}
   5668     }
   5669   print_operand_value (scratchbuf, sizeof(scratchbuf), 1, off);
   5670   oappend (scratchbuf);
   5671 }
   5672 
   5673 static void
   5674 OP_OFF64 (int bytemode, int sizeflag)
   5675 {
   5676   bfd_vma off;
   5677 
   5678   if (address_mode != mode_64bit
   5679       || (prefixes & PREFIX_ADDR))
   5680     {
   5681       OP_OFF (bytemode, sizeflag);
   5682       return;
   5683     }
   5684 
   5685   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
   5686     intel_operand_size (bytemode, sizeflag);
   5687   append_seg ();
   5688 
   5689   off = get64 ();
   5690 
   5691   if (intel_syntax)
   5692     {
   5693       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
   5694 			| PREFIX_ES | PREFIX_FS | PREFIX_GS)))
   5695 	{
   5696 	  oappend (names_seg[ds_reg - es_reg]);
   5697 	  oappend (":");
   5698 	}
   5699     }
   5700   print_operand_value (scratchbuf, sizeof(scratchbuf), 1, off);
   5701   oappend (scratchbuf);
   5702 }
   5703 
   5704 static void
   5705 ptr_reg (int code, int sizeflag)
   5706 {
   5707   const char *s;
   5708 
   5709   *obufp++ = open_char;
   5710   used_prefixes |= (prefixes & PREFIX_ADDR);
   5711   if (address_mode == mode_64bit)
   5712     {
   5713       if (!(sizeflag & AFLAG))
   5714 	s = names32[code - eAX_reg];
   5715       else
   5716 	s = names64[code - eAX_reg];
   5717     }
   5718   else if (sizeflag & AFLAG)
   5719     s = names32[code - eAX_reg];
   5720   else
   5721     s = names16[code - eAX_reg];
   5722   oappend (s);
   5723   *obufp++ = close_char;
   5724   *obufp = 0;
   5725 }
   5726 
   5727 static void
   5728 OP_ESreg (int code, int sizeflag)
   5729 {
   5730   if (intel_syntax)
   5731     {
   5732       switch (codep[-1])
   5733 	{
   5734 	case 0x6d:	/* insw/insl */
   5735 	  intel_operand_size (z_mode, sizeflag);
   5736 	  break;
   5737 	case 0xa5:	/* movsw/movsl/movsq */
   5738 	case 0xa7:	/* cmpsw/cmpsl/cmpsq */
   5739 	case 0xab:	/* stosw/stosl */
   5740 	case 0xaf:	/* scasw/scasl */
   5741 	  intel_operand_size (v_mode, sizeflag);
   5742 	  break;
   5743 	default:
   5744 	  intel_operand_size (b_mode, sizeflag);
   5745 	}
   5746     }
   5747   oappend ("%es:" + intel_syntax);
   5748   ptr_reg (code, sizeflag);
   5749 }
   5750 
   5751 static void
   5752 OP_DSreg (int code, int sizeflag)
   5753 {
   5754   if (intel_syntax)
   5755     {
   5756       switch (codep[-1])
   5757 	{
   5758 	case 0x6f:	/* outsw/outsl */
   5759 	  intel_operand_size (z_mode, sizeflag);
   5760 	  break;
   5761 	case 0xa5:	/* movsw/movsl/movsq */
   5762 	case 0xa7:	/* cmpsw/cmpsl/cmpsq */
   5763 	case 0xad:	/* lodsw/lodsl/lodsq */
   5764 	  intel_operand_size (v_mode, sizeflag);
   5765 	  break;
   5766 	default:
   5767 	  intel_operand_size (b_mode, sizeflag);
   5768 	}
   5769     }
   5770   if ((prefixes
   5771        & (PREFIX_CS
   5772 	  | PREFIX_DS
   5773 	  | PREFIX_SS
   5774 	  | PREFIX_ES
   5775 	  | PREFIX_FS
   5776 	  | PREFIX_GS)) == 0)
   5777     prefixes |= PREFIX_DS;
   5778   append_seg ();
   5779   ptr_reg (code, sizeflag);
   5780 }
   5781 
   5782 static void
   5783 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   5784 {
   5785   int add = 0;
   5786   if (rex & REX_R)
   5787     {
   5788       USED_REX (REX_R);
   5789       add = 8;
   5790     }
   5791   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
   5792     {
   5793       used_prefixes |= PREFIX_LOCK;
   5794       add = 8;
   5795     }
   5796   snprintf (scratchbuf, sizeof(scratchbuf), "%%cr%d", modrm.reg + add);
   5797   oappend (scratchbuf + intel_syntax);
   5798 }
   5799 
   5800 static void
   5801 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   5802 {
   5803   int add = 0;
   5804   USED_REX (REX_R);
   5805   if (rex & REX_R)
   5806     add = 8;
   5807   if (intel_syntax)
   5808     snprintf (scratchbuf, sizeof(scratchbuf), "db%d", modrm.reg + add);
   5809   else
   5810     snprintf (scratchbuf, sizeof(scratchbuf), "%%db%d", modrm.reg + add);
   5811   oappend (scratchbuf);
   5812 }
   5813 
   5814 static void
   5815 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   5816 {
   5817   snprintf (scratchbuf, sizeof(scratchbuf), "%%tr%d", modrm.reg);
   5818   oappend (scratchbuf + intel_syntax);
   5819 }
   5820 
   5821 static void
   5822 OP_R (int bytemode, int sizeflag)
   5823 {
   5824   if (modrm.mod == 3)
   5825     OP_E (bytemode, sizeflag);
   5826   else
   5827     BadOp ();
   5828 }
   5829 
   5830 static void
   5831 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   5832 {
   5833   used_prefixes |= (prefixes & PREFIX_DATA);
   5834   if (prefixes & PREFIX_DATA)
   5835     {
   5836       int add = 0;
   5837       USED_REX (REX_R);
   5838       if (rex & REX_R)
   5839 	add = 8;
   5840       snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.reg + add);
   5841     }
   5842   else
   5843     snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.reg);
   5844   oappend (scratchbuf + intel_syntax);
   5845 }
   5846 
   5847 static void
   5848 OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   5849 {
   5850   int add = 0;
   5851   USED_REX (REX_R);
   5852   if (rex & REX_R)
   5853     add = 8;
   5854   snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.reg + add);
   5855   oappend (scratchbuf + intel_syntax);
   5856 }
   5857 
   5858 static void
   5859 OP_EM (int bytemode, int sizeflag)
   5860 {
   5861   if (modrm.mod != 3)
   5862     {
   5863       if (intel_syntax && bytemode == v_mode)
   5864 	{
   5865 	  bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
   5866 	  used_prefixes |= (prefixes & PREFIX_DATA);
   5867  	}
   5868       OP_E (bytemode, sizeflag);
   5869       return;
   5870     }
   5871 
   5872   /* Skip mod/rm byte.  */
   5873   MODRM_CHECK;
   5874   codep++;
   5875   used_prefixes |= (prefixes & PREFIX_DATA);
   5876   if (prefixes & PREFIX_DATA)
   5877     {
   5878       int add = 0;
   5879 
   5880       USED_REX (REX_B);
   5881       if (rex & REX_B)
   5882 	add = 8;
   5883       snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.rm + add);
   5884     }
   5885   else
   5886     snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.rm);
   5887   oappend (scratchbuf + intel_syntax);
   5888 }
   5889 
   5890 /* cvt* are the only instructions in sse2 which have
   5891    both SSE and MMX operands and also have 0x66 prefix
   5892    in their opcode. 0x66 was originally used to differentiate
   5893    between SSE and MMX instruction(operands). So we have to handle the
   5894    cvt* separately using OP_EMC and OP_MXC */
   5895 static void
   5896 OP_EMC (int bytemode, int sizeflag)
   5897 {
   5898   if (modrm.mod != 3)
   5899     {
   5900       if (intel_syntax && bytemode == v_mode)
   5901 	{
   5902 	  bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
   5903 	  used_prefixes |= (prefixes & PREFIX_DATA);
   5904  	}
   5905       OP_E (bytemode, sizeflag);
   5906       return;
   5907     }
   5908 
   5909   /* Skip mod/rm byte.  */
   5910   MODRM_CHECK;
   5911   codep++;
   5912   used_prefixes |= (prefixes & PREFIX_DATA);
   5913   snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.rm);
   5914   oappend (scratchbuf + intel_syntax);
   5915 }
   5916 
   5917 static void
   5918 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   5919 {
   5920   used_prefixes |= (prefixes & PREFIX_DATA);
   5921   snprintf (scratchbuf, sizeof(scratchbuf), "%%mm%d", modrm.reg);
   5922   oappend (scratchbuf + intel_syntax);
   5923 }
   5924 
   5925 static void
   5926 OP_EX (int bytemode, int sizeflag)
   5927 {
   5928   int add = 0;
   5929   if (modrm.mod != 3)
   5930     {
   5931       OP_E (bytemode, sizeflag);
   5932       return;
   5933     }
   5934   USED_REX (REX_B);
   5935   if (rex & REX_B)
   5936     add = 8;
   5937 
   5938   /* Skip mod/rm byte.  */
   5939   MODRM_CHECK;
   5940   codep++;
   5941   snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", modrm.rm + add);
   5942   oappend (scratchbuf + intel_syntax);
   5943 }
   5944 
   5945 static void
   5946 OP_MS (int bytemode, int sizeflag)
   5947 {
   5948   if (modrm.mod == 3)
   5949     OP_EM (bytemode, sizeflag);
   5950   else
   5951     BadOp ();
   5952 }
   5953 
   5954 static void
   5955 OP_XS (int bytemode, int sizeflag)
   5956 {
   5957   if (modrm.mod == 3)
   5958     OP_EX (bytemode, sizeflag);
   5959   else
   5960     BadOp ();
   5961 }
   5962 
   5963 static void
   5964 OP_M (int bytemode, int sizeflag)
   5965 {
   5966   if (modrm.mod == 3)
   5967     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
   5968     BadOp ();
   5969   else
   5970     OP_E (bytemode, sizeflag);
   5971 }
   5972 
   5973 static void
   5974 OP_0f07 (int bytemode, int sizeflag)
   5975 {
   5976   if (modrm.mod != 3 || modrm.rm != 0)
   5977     BadOp ();
   5978   else
   5979     OP_E (bytemode, sizeflag);
   5980 }
   5981 
   5982 static void
   5983 OP_0fae (int bytemode, int sizeflag)
   5984 {
   5985   if (modrm.mod == 3)
   5986     {
   5987       if (modrm.reg == 7)
   5988 	strcpy (obuf + strlen (obuf) - sizeof ("clflush") + 1, "sfence");
   5989 
   5990       if (modrm.reg < 5 || modrm.rm != 0)
   5991 	{
   5992 	  BadOp ();	/* bad sfence, mfence, or lfence */
   5993 	  return;
   5994 	}
   5995     }
   5996   else if (modrm.reg != 7)
   5997     {
   5998       BadOp ();		/* bad clflush */
   5999       return;
   6000     }
   6001 
   6002   OP_E (bytemode, sizeflag);
   6003 }
   6004 
   6005 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
   6006    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
   6007 
   6008 static void
   6009 NOP_Fixup1 (int bytemode, int sizeflag)
   6010 {
   6011   if ((prefixes & PREFIX_DATA) != 0
   6012       || (rex != 0
   6013 	  && rex != 0x48
   6014 	  && address_mode == mode_64bit))
   6015     OP_REG (bytemode, sizeflag);
   6016   else
   6017     strcpy (obuf, "nop");
   6018 }
   6019 
   6020 static void
   6021 NOP_Fixup2 (int bytemode, int sizeflag)
   6022 {
   6023   if ((prefixes & PREFIX_DATA) != 0
   6024       || (rex != 0
   6025 	  && rex != 0x48
   6026 	  && address_mode == mode_64bit))
   6027     OP_IMREG (bytemode, sizeflag);
   6028 }
   6029 
   6030 static const char *Suffix3DNow[] = {
   6031 /* 00 */	NULL,		NULL,		NULL,		NULL,
   6032 /* 04 */	NULL,		NULL,		NULL,		NULL,
   6033 /* 08 */	NULL,		NULL,		NULL,		NULL,
   6034 /* 0C */	"pi2fw",	"pi2fd",	NULL,		NULL,
   6035 /* 10 */	NULL,		NULL,		NULL,		NULL,
   6036 /* 14 */	NULL,		NULL,		NULL,		NULL,
   6037 /* 18 */	NULL,		NULL,		NULL,		NULL,
   6038 /* 1C */	"pf2iw",	"pf2id",	NULL,		NULL,
   6039 /* 20 */	NULL,		NULL,		NULL,		NULL,
   6040 /* 24 */	NULL,		NULL,		NULL,		NULL,
   6041 /* 28 */	NULL,		NULL,		NULL,		NULL,
   6042 /* 2C */	NULL,		NULL,		NULL,		NULL,
   6043 /* 30 */	NULL,		NULL,		NULL,		NULL,
   6044 /* 34 */	NULL,		NULL,		NULL,		NULL,
   6045 /* 38 */	NULL,		NULL,		NULL,		NULL,
   6046 /* 3C */	NULL,		NULL,		NULL,		NULL,
   6047 /* 40 */	NULL,		NULL,		NULL,		NULL,
   6048 /* 44 */	NULL,		NULL,		NULL,		NULL,
   6049 /* 48 */	NULL,		NULL,		NULL,		NULL,
   6050 /* 4C */	NULL,		NULL,		NULL,		NULL,
   6051 /* 50 */	NULL,		NULL,		NULL,		NULL,
   6052 /* 54 */	NULL,		NULL,		NULL,		NULL,
   6053 /* 58 */	NULL,		NULL,		NULL,		NULL,
   6054 /* 5C */	NULL,		NULL,		NULL,		NULL,
   6055 /* 60 */	NULL,		NULL,		NULL,		NULL,
   6056 /* 64 */	NULL,		NULL,		NULL,		NULL,
   6057 /* 68 */	NULL,		NULL,		NULL,		NULL,
   6058 /* 6C */	NULL,		NULL,		NULL,		NULL,
   6059 /* 70 */	NULL,		NULL,		NULL,		NULL,
   6060 /* 74 */	NULL,		NULL,		NULL,		NULL,
   6061 /* 78 */	NULL,		NULL,		NULL,		NULL,
   6062 /* 7C */	NULL,		NULL,		NULL,		NULL,
   6063 /* 80 */	NULL,		NULL,		NULL,		NULL,
   6064 /* 84 */	NULL,		NULL,		NULL,		NULL,
   6065 /* 88 */	NULL,		NULL,		"pfnacc",	NULL,
   6066 /* 8C */	NULL,		NULL,		"pfpnacc",	NULL,
   6067 /* 90 */	"pfcmpge",	NULL,		NULL,		NULL,
   6068 /* 94 */	"pfmin",	NULL,		"pfrcp",	"pfrsqrt",
   6069 /* 98 */	NULL,		NULL,		"pfsub",	NULL,
   6070 /* 9C */	NULL,		NULL,		"pfadd",	NULL,
   6071 /* A0 */	"pfcmpgt",	NULL,		NULL,		NULL,
   6072 /* A4 */	"pfmax",	NULL,		"pfrcpit1",	"pfrsqit1",
   6073 /* A8 */	NULL,		NULL,		"pfsubr",	NULL,
   6074 /* AC */	NULL,		NULL,		"pfacc",	NULL,
   6075 /* B0 */	"pfcmpeq",	NULL,		NULL,		NULL,
   6076 /* B4 */	"pfmul",	NULL,		"pfrcpit2",	"pmulhrw",
   6077 /* B8 */	NULL,		NULL,		NULL,		"pswapd",
   6078 /* BC */	NULL,		NULL,		NULL,		"pavgusb",
   6079 /* C0 */	NULL,		NULL,		NULL,		NULL,
   6080 /* C4 */	NULL,		NULL,		NULL,		NULL,
   6081 /* C8 */	NULL,		NULL,		NULL,		NULL,
   6082 /* CC */	NULL,		NULL,		NULL,		NULL,
   6083 /* D0 */	NULL,		NULL,		NULL,		NULL,
   6084 /* D4 */	NULL,		NULL,		NULL,		NULL,
   6085 /* D8 */	NULL,		NULL,		NULL,		NULL,
   6086 /* DC */	NULL,		NULL,		NULL,		NULL,
   6087 /* E0 */	NULL,		NULL,		NULL,		NULL,
   6088 /* E4 */	NULL,		NULL,		NULL,		NULL,
   6089 /* E8 */	NULL,		NULL,		NULL,		NULL,
   6090 /* EC */	NULL,		NULL,		NULL,		NULL,
   6091 /* F0 */	NULL,		NULL,		NULL,		NULL,
   6092 /* F4 */	NULL,		NULL,		NULL,		NULL,
   6093 /* F8 */	NULL,		NULL,		NULL,		NULL,
   6094 /* FC */	NULL,		NULL,		NULL,		NULL,
   6095 };
   6096 
   6097 static void
   6098 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   6099 {
   6100   const char *mnemonic;
   6101 
   6102   FETCH_DATA (the_info, codep + 1);
   6103   /* AMD 3DNow! instructions are specified by an opcode suffix in the
   6104      place where an 8-bit immediate would normally go.  ie. the last
   6105      byte of the instruction.  */
   6106   obufp = obuf + strlen (obuf);
   6107   mnemonic = Suffix3DNow[*codep++ & 0xff];
   6108   if (mnemonic)
   6109     oappend (mnemonic);
   6110   else
   6111     {
   6112       /* Since a variable sized modrm/sib chunk is between the start
   6113 	 of the opcode (0x0f0f) and the opcode suffix, we need to do
   6114 	 all the modrm processing first, and don't know until now that
   6115 	 we have a bad opcode.  This necessitates some cleaning up.  */
   6116       op_out[0][0] = '\0';
   6117       op_out[1][0] = '\0';
   6118       BadOp ();
   6119     }
   6120 }
   6121 
   6122 static const char *simd_cmp_op[] = {
   6123   "eq",
   6124   "lt",
   6125   "le",
   6126   "unord",
   6127   "neq",
   6128   "nlt",
   6129   "nle",
   6130   "ord"
   6131 };
   6132 
   6133 static void
   6134 OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
   6135 {
   6136   unsigned int cmp_type;
   6137 
   6138   FETCH_DATA (the_info, codep + 1);
   6139   obufp = obuf + strlen (obuf);
   6140   cmp_type = *codep++ & 0xff;
   6141   if (cmp_type < 8)
   6142     {
   6143       char suffix1 = 'p', suffix2 = 's';
   6144       used_prefixes |= (prefixes & PREFIX_REPZ);
   6145       if (prefixes & PREFIX_REPZ)
   6146 	suffix1 = 's';
   6147       else
   6148 	{
   6149 	  used_prefixes |= (prefixes & PREFIX_DATA);
   6150 	  if (prefixes & PREFIX_DATA)
   6151 	    suffix2 = 'd';
   6152 	  else
   6153 	    {
   6154 	      used_prefixes |= (prefixes & PREFIX_REPNZ);
   6155 	      if (prefixes & PREFIX_REPNZ)
   6156 		suffix1 = 's', suffix2 = 'd';
   6157 	    }
   6158 	}
   6159       snprintf (scratchbuf, sizeof(scratchbuf), "cmp%s%c%c",
   6160                 simd_cmp_op[cmp_type], suffix1, suffix2);
   6161       used_prefixes |= (prefixes & PREFIX_REPZ);
   6162       oappend (scratchbuf);
   6163     }
   6164   else
   6165     {
   6166       /* We have a bad extension byte.  Clean up.  */
   6167       op_out[0][0] = '\0';
   6168       op_out[1][0] = '\0';
   6169       BadOp ();
   6170     }
   6171 }
   6172 
   6173 static void
   6174 SIMD_Fixup (int extrachar, int sizeflag ATTRIBUTE_UNUSED)
   6175 {
   6176   /* Change movlps/movhps to movhlps/movlhps for 2 register operand
   6177      forms of these instructions.  */
   6178   if (modrm.mod == 3)
   6179     {
   6180       char *p = obuf + strlen (obuf);
   6181       *(p + 1) = '\0';
   6182       *p       = *(p - 1);
   6183       *(p - 1) = *(p - 2);
   6184       *(p - 2) = *(p - 3);
   6185       *(p - 3) = extrachar;
   6186     }
   6187 }
   6188 
   6189 static void
   6190 PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
   6191 {
   6192   if (modrm.mod == 3 && modrm.reg == 1 && modrm.rm <= 1)
   6193     {
   6194       /* Override "sidt".  */
   6195       size_t olen = strlen (obuf);
   6196       char *p = obuf + olen - 4;
   6197       const char * const *names = (address_mode == mode_64bit
   6198 			    ? names64 : names32);
   6199 
   6200       /* We might have a suffix when disassembling with -Msuffix.  */
   6201       if (*p == 'i')
   6202 	--p;
   6203 
   6204       /* Remove "addr16/addr32" if we aren't in Intel mode.  */
   6205       if (!intel_syntax
   6206 	  && (prefixes & PREFIX_ADDR)
   6207 	  && olen >= (4 + 7)
   6208 	  && *(p - 1) == ' '
   6209 	  && strncmp (p - 7, "addr", 4) == 0
   6210 	  && (strncmp (p - 3, "16", 2) == 0
   6211 	      || strncmp (p - 3, "32", 2) == 0))
   6212 	p -= 7;
   6213 
   6214       if (modrm.rm)
   6215 	{
   6216 	  /* mwait %eax,%ecx  */
   6217 	  strcpy (p, "mwait");
   6218 	  if (!intel_syntax)
   6219 	    strcpy (op_out[0], names[0]);
   6220 	}
   6221       else
   6222 	{
   6223 	  /* monitor %eax,%ecx,%edx"  */
   6224 	  strcpy (p, "monitor");
   6225 	  if (!intel_syntax)
   6226 	    {
   6227 	      const char * const *op1_names;
   6228 	      if (!(prefixes & PREFIX_ADDR))
   6229 		op1_names = (address_mode == mode_16bit
   6230 			     ? names16 : names);
   6231 	      else
   6232 		{
   6233 		  op1_names = (address_mode != mode_32bit
   6234 			       ? names32 : names16);
   6235 		  used_prefixes |= PREFIX_ADDR;
   6236 		}
   6237 	      strcpy (op_out[0], op1_names[0]);
   6238 	      strcpy (op_out[2], names[2]);
   6239 	    }
   6240 	}
   6241       if (!intel_syntax)
   6242 	{
   6243 	  strcpy (op_out[1], names[1]);
   6244 	  two_source_ops = 1;
   6245 	}
   6246 
   6247       codep++;
   6248     }
   6249   else
   6250     OP_M (0, sizeflag);
   6251 }
   6252 
   6253 static void
   6254 SVME_Fixup (int bytemode, int sizeflag)
   6255 {
   6256   const char *alt;
   6257   char *p;
   6258 
   6259   switch (*codep)
   6260     {
   6261     case 0xd8:
   6262       alt = "vmrun";
   6263       break;
   6264     case 0xd9:
   6265       alt = "vmmcall";
   6266       break;
   6267     case 0xda:
   6268       alt = "vmload";
   6269       break;
   6270     case 0xdb:
   6271       alt = "vmsave";
   6272       break;
   6273     case 0xdc:
   6274       alt = "stgi";
   6275       break;
   6276     case 0xdd:
   6277       alt = "clgi";
   6278       break;
   6279     case 0xde:
   6280       alt = "skinit";
   6281       break;
   6282     case 0xdf:
   6283       alt = "invlpga";
   6284       break;
   6285     default:
   6286       OP_M (bytemode, sizeflag);
   6287       return;
   6288     }
   6289   /* Override "lidt".  */
   6290   p = obuf + strlen (obuf) - 4;
   6291   /* We might have a suffix.  */
   6292   if (*p == 'i')
   6293     --p;
   6294   strcpy (p, alt);
   6295   if (!(prefixes & PREFIX_ADDR))
   6296     {
   6297       ++codep;
   6298       return;
   6299     }
   6300   used_prefixes |= PREFIX_ADDR;
   6301   switch (*codep++)
   6302     {
   6303     case 0xdf:
   6304       strcpy (op_out[1], names32[1]);
   6305       two_source_ops = 1;
   6306 	  /* Fall through.  */
   6307     case 0xd8:
   6308     case 0xda:
   6309     case 0xdb:
   6310       *obufp++ = open_char;
   6311       if (address_mode == mode_64bit || (sizeflag & AFLAG))
   6312         alt = names32[0];
   6313       else
   6314         alt = names16[0];
   6315       strcpy (obufp, alt);
   6316       obufp += strlen (alt);
   6317       *obufp++ = close_char;
   6318       *obufp = '\0';
   6319       break;
   6320     }
   6321 }
   6322 
   6323 static void
   6324 INVLPG_Fixup (int bytemode, int sizeflag)
   6325 {
   6326   const char *alt;
   6327 
   6328   switch (*codep)
   6329     {
   6330     case 0xf8:
   6331       alt = "swapgs";
   6332       break;
   6333     case 0xf9:
   6334       alt = "rdtscp";
   6335       break;
   6336     default:
   6337       OP_M (bytemode, sizeflag);
   6338       return;
   6339     }
   6340   /* Override "invlpg".  */
   6341   strcpy (obuf + strlen (obuf) - 6, alt);
   6342   codep++;
   6343 }
   6344 
   6345 static void
   6346 BadOp (void)
   6347 {
   6348   /* Throw away prefixes and 1st. opcode byte.  */
   6349   codep = insn_codep + 1;
   6350   oappend ("(bad)");
   6351 }
   6352 
   6353 static void
   6354 VMX_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
   6355 {
   6356   if (modrm.mod == 3
   6357       && modrm.reg == 0
   6358       && modrm.rm >=1
   6359       && modrm.rm <= 4)
   6360     {
   6361       /* Override "sgdt".  */
   6362       char *p = obuf + strlen (obuf) - 4;
   6363 
   6364       /* We might have a suffix when disassembling with -Msuffix.  */
   6365       if (*p == 'g')
   6366 	--p;
   6367 
   6368       switch (modrm.rm)
   6369 	{
   6370 	case 1:
   6371 	  strcpy (p, "vmcall");
   6372 	  break;
   6373 	case 2:
   6374 	  strcpy (p, "vmlaunch");
   6375 	  break;
   6376 	case 3:
   6377 	  strcpy (p, "vmresume");
   6378 	  break;
   6379 	case 4:
   6380 	  strcpy (p, "vmxoff");
   6381 	  break;
   6382 	}
   6383 
   6384       codep++;
   6385     }
   6386   else
   6387     OP_E (0, sizeflag);
   6388 }
   6389 
   6390 static void
   6391 OP_VMX (int bytemode, int sizeflag)
   6392 {
   6393   used_prefixes |= (prefixes & (PREFIX_DATA | PREFIX_REPZ));
   6394   if (prefixes & PREFIX_DATA)
   6395     strcpy (obuf, "vmclear");
   6396   else if (prefixes & PREFIX_REPZ)
   6397     strcpy (obuf, "vmxon");
   6398   else
   6399     strcpy (obuf, "vmptrld");
   6400   OP_E (bytemode, sizeflag);
   6401 }
   6402 
   6403 static void
   6404 REP_Fixup (int bytemode, int sizeflag)
   6405 {
   6406   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
   6407      lods and stos.  */
   6408   size_t ilen = 0;
   6409 
   6410   if (prefixes & PREFIX_REPZ)
   6411     switch (*insn_codep)
   6412       {
   6413       case 0x6e:	/* outsb */
   6414       case 0x6f:	/* outsw/outsl */
   6415       case 0xa4:	/* movsb */
   6416       case 0xa5:	/* movsw/movsl/movsq */
   6417 	if (!intel_syntax)
   6418 	  ilen = 5;
   6419 	else
   6420 	  ilen = 4;
   6421 	break;
   6422       case 0xaa:	/* stosb */
   6423       case 0xab:	/* stosw/stosl/stosq */
   6424       case 0xac:	/* lodsb */
   6425       case 0xad:	/* lodsw/lodsl/lodsq */
   6426 	if (!intel_syntax && (sizeflag & SUFFIX_ALWAYS))
   6427 	  ilen = 5;
   6428 	else
   6429 	  ilen = 4;
   6430 	break;
   6431       case 0x6c:	/* insb */
   6432       case 0x6d:	/* insl/insw */
   6433 	if (!intel_syntax)
   6434 	  ilen = 4;
   6435 	else
   6436 	  ilen = 3;
   6437 	break;
   6438       default:
   6439 	abort ();
   6440 	break;
   6441       }
   6442 
   6443   if (ilen != 0)
   6444     {
   6445       size_t olen;
   6446       char *p;
   6447 
   6448       olen = strlen (obuf);
   6449       p = obuf + olen - ilen - 1 - 4;
   6450       /* Handle "repz [addr16|addr32]".  */
   6451       if ((prefixes & PREFIX_ADDR))
   6452 	p -= 1 + 6;
   6453 
   6454       memmove (p + 3, p + 4, olen - (p + 3 - obuf));
   6455     }
   6456 
   6457   switch (bytemode)
   6458     {
   6459     case al_reg:
   6460     case eAX_reg:
   6461     case indir_dx_reg:
   6462       OP_IMREG (bytemode, sizeflag);
   6463       break;
   6464     case eDI_reg:
   6465       OP_ESreg (bytemode, sizeflag);
   6466       break;
   6467     case eSI_reg:
   6468       OP_DSreg (bytemode, sizeflag);
   6469       break;
   6470     default:
   6471       abort ();
   6472       break;
   6473     }
   6474 }
   6475 
   6476 static void
   6477 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
   6478 {
   6479   USED_REX (REX_W);
   6480   if (rex & REX_W)
   6481     {
   6482       /* Change cmpxchg8b to cmpxchg16b.  */
   6483       char *p = obuf + strlen (obuf) - 2;
   6484       strcpy (p, "16b");
   6485       bytemode = o_mode;
   6486     }
   6487   OP_M (bytemode, sizeflag);
   6488 }
   6489 
   6490 static void
   6491 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
   6492 {
   6493   snprintf (scratchbuf, sizeof(scratchbuf), "%%xmm%d", reg);
   6494   oappend (scratchbuf + intel_syntax);
   6495 }
   6496 
   6497 static void
   6498 CRC32_Fixup (int bytemode, int sizeflag)
   6499 {
   6500   /* Add proper suffix to "crc32".  */
   6501   char *p = obuf + strlen (obuf);
   6502 
   6503   switch (bytemode)
   6504     {
   6505     case b_mode:
   6506       if (intel_syntax)
   6507 	break;
   6508 
   6509       *p++ = 'b';
   6510       break;
   6511     case v_mode:
   6512       if (intel_syntax)
   6513 	break;
   6514 
   6515       USED_REX (REX_W);
   6516       if (rex & REX_W)
   6517 	*p++ = 'q';
   6518       else if (sizeflag & DFLAG)
   6519 	*p++ = 'l';
   6520       else
   6521 	*p++ = 'w';
   6522       used_prefixes |= (prefixes & PREFIX_DATA);
   6523       break;
   6524     default:
   6525       oappend (INTERNAL_DISASSEMBLER_ERROR);
   6526       break;
   6527     }
   6528   *p = '\0';
   6529 
   6530   if (modrm.mod == 3)
   6531     {
   6532       int add;
   6533 
   6534       /* Skip mod/rm byte.  */
   6535       MODRM_CHECK;
   6536       codep++;
   6537 
   6538       USED_REX (REX_B);
   6539       add = (rex & REX_B) ? 8 : 0;
   6540       if (bytemode == b_mode)
   6541 	{
   6542 	  USED_REX (0);
   6543 	  if (rex)
   6544 	    oappend (names8rex[modrm.rm + add]);
   6545 	  else
   6546 	    oappend (names8[modrm.rm + add]);
   6547 	}
   6548       else
   6549 	{
   6550 	  USED_REX (REX_W);
   6551 	  if (rex & REX_W)
   6552 	    oappend (names64[modrm.rm + add]);
   6553 	  else if ((prefixes & PREFIX_DATA))
   6554 	    oappend (names16[modrm.rm + add]);
   6555 	  else
   6556 	    oappend (names32[modrm.rm + add]);
   6557 	}
   6558     }
   6559   else
   6560     OP_E (bytemode, sizeflag);
   6561 }
   6562