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