Ignore:
Timestamp:
Aug 16, 2003, 6:59:22 PM (22 years ago)
Author:
bird
Message:

binutils v2.14 - offical sources.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GNU/src/binutils/opcodes/i386-dis.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r608 r609  
    11/* Print i386 instructions for GDB, the GNU debugger.
    22   Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
    3    2001
    4    Free Software Foundation, Inc.
     3   2001, 2002, 2003 Free Software Foundation, Inc.
    54
    65This file is part of GDB.
     
    5150
    5251static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
    53 
    54 struct dis_private
    55 {
     52static void ckprefix PARAMS ((void));
     53static const char *prefix_name PARAMS ((int, int));
     54static int print_insn PARAMS ((bfd_vma, disassemble_info *));
     55static void dofloat PARAMS ((int));
     56static void OP_ST PARAMS ((int, int));
     57static void OP_STi  PARAMS ((int, int));
     58static int putop PARAMS ((const char *, int));
     59static void oappend PARAMS ((const char *));
     60static void append_seg PARAMS ((void));
     61static void OP_indirE PARAMS ((int, int));
     62static void print_operand_value PARAMS ((char *, int, bfd_vma));
     63static void OP_E PARAMS ((int, int));
     64static void OP_G PARAMS ((int, int));
     65static bfd_vma get64 PARAMS ((void));
     66static bfd_signed_vma get32 PARAMS ((void));
     67static bfd_signed_vma get32s PARAMS ((void));
     68static int get16 PARAMS ((void));
     69static void set_op PARAMS ((bfd_vma, int));
     70static void OP_REG PARAMS ((int, int));
     71static void OP_IMREG PARAMS ((int, int));
     72static void OP_I PARAMS ((int, int));
     73static void OP_I64 PARAMS ((int, int));
     74static void OP_sI PARAMS ((int, int));
     75static void OP_J PARAMS ((int, int));
     76static void OP_SEG PARAMS ((int, int));
     77static void OP_DIR PARAMS ((int, int));
     78static void OP_OFF PARAMS ((int, int));
     79static void OP_OFF64 PARAMS ((int, int));
     80static void ptr_reg PARAMS ((int, int));
     81static void OP_ESreg PARAMS ((int, int));
     82static void OP_DSreg PARAMS ((int, int));
     83static void OP_C PARAMS ((int, int));
     84static void OP_D PARAMS ((int, int));
     85static void OP_T PARAMS ((int, int));
     86static void OP_Rd PARAMS ((int, int));
     87static void OP_MMX PARAMS ((int, int));
     88static void OP_XMM PARAMS ((int, int));
     89static void OP_EM PARAMS ((int, int));
     90static void OP_EX PARAMS ((int, int));
     91static void OP_MS PARAMS ((int, int));
     92static void OP_XS PARAMS ((int, int));
     93static void OP_3DNowSuffix PARAMS ((int, int));
     94static void OP_SIMD_Suffix PARAMS ((int, int));
     95static void SIMD_Fixup PARAMS ((int, int));
     96static void BadOp PARAMS ((void));
     97
     98struct dis_private {
    5699  /* Points to first byte not fetched.  */
    57100  bfd_byte *max_fetched;
    58101  bfd_byte the_buffer[MAXLEN];
    59102  bfd_vma insn_start;
     103  int orig_sizeflag;
    60104  jmp_buf bailout;
    61105};
     
    113157   on error.  */
    114158#define FETCH_DATA(info, addr) \
    115   ((addr) <= ((struct dis_private *)(info->private_data))->max_fetched \
     159  ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
    116160   ? 1 : fetch_data ((info), (addr)))
    117161
     
    122166{
    123167  int status;
    124   struct dis_private *priv = (struct dis_private *)info->private_data;
     168  struct dis_private *priv = (struct dis_private *) info->private_data;
    125169  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
    126170
     
    132176    {
    133177      /* If we did manage to read at least one byte, then
    134         print_insn_i386 will do something sensible.  Otherwise, print
    135         an error.  We do that here because this is where we know
    136         STATUS.  */
     178        print_insn_i386 will do something sensible.  Otherwise, print
     179        an error.  We do that here because this is where we know
     180        STATUS.  */
    137181      if (priv->max_fetched == priv->the_buffer)
    138182        (*info->memory_error_func) (status, start, info);
     
    149193#define Ev OP_E, v_mode
    150194#define Ed OP_E, d_mode
     195#define Edq OP_E, dq_mode
    151196#define indirEb OP_indirE, b_mode
    152197#define indirEv OP_indirE, v_mode
    153198#define Ew OP_E, w_mode
    154199#define Ma OP_E, v_mode
    155 #define M OP_E, 0               /* lea */
     200#define M OP_E, 0               /* lea, lgdt, etc. */
    156201#define Mp OP_E, 0              /* 32 or 48 bit memory operand for LDS, LES etc */
    157202#define Gb OP_G, b_mode
     
    255300
    256301/* bits in sizeflag */
    257 #if 0 /* leave undefined until someone adds the extra flag to objdump */
    258302#define SUFFIX_ALWAYS 4
    259 #endif
    260303#define AFLAG 2
    261304#define DFLAG 1
    262 
    263 typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
    264 
    265 static void OP_E PARAMS ((int, int));
    266 static void OP_G PARAMS ((int, int));
    267 static void OP_I PARAMS ((int, int));
    268 static void OP_I64 PARAMS ((int, int));
    269 static void OP_OFF PARAMS ((int, int));
    270 static void OP_REG PARAMS ((int, int));
    271 static void OP_IMREG PARAMS ((int, int));
    272 static void OP_OFF64 PARAMS ((int, int));
    273 static void OP_indirE PARAMS ((int, int));
    274 static void OP_sI PARAMS ((int, int));
    275 static void OP_REG PARAMS ((int, int));
    276 static void OP_J PARAMS ((int, int));
    277 static void OP_DIR PARAMS ((int, int));
    278 static void OP_OFF PARAMS ((int, int));
    279 static void OP_ESreg PARAMS ((int, int));
    280 static void OP_DSreg PARAMS ((int, int));
    281 static void OP_SEG PARAMS ((int, int));
    282 static void OP_C PARAMS ((int, int));
    283 static void OP_D PARAMS ((int, int));
    284 static void OP_T PARAMS ((int, int));
    285 static void OP_Rd PARAMS ((int, int));
    286 static void OP_ST PARAMS ((int, int));
    287 static void OP_STi  PARAMS ((int, int));
    288 static void OP_MMX PARAMS ((int, int));
    289 static void OP_XMM PARAMS ((int, int));
    290 static void OP_EM PARAMS ((int, int));
    291 static void OP_EX PARAMS ((int, int));
    292 static void OP_MS PARAMS ((int, int));
    293 static void OP_XS PARAMS ((int, int));
    294 static void OP_3DNowSuffix PARAMS ((int, int));
    295 static void OP_SIMD_Suffix PARAMS ((int, int));
    296 static void SIMD_Fixup PARAMS ((int, int));
    297 
    298 static void append_seg PARAMS ((void));
    299 static void set_op PARAMS ((unsigned int op, int));
    300 static void putop PARAMS ((const char *template, int sizeflag));
    301 static void dofloat PARAMS ((int sizeflag));
    302 static int get16 PARAMS ((void));
    303 static bfd_vma get64 PARAMS ((void));
    304 static bfd_signed_vma get32 PARAMS ((void));
    305 static bfd_signed_vma get32s PARAMS ((void));
    306 static void ckprefix PARAMS ((void));
    307 static const char *prefix_name PARAMS ((int, int));
    308 static void ptr_reg PARAMS ((int, int));
    309 static void BadOp PARAMS ((void));
    310305
    311306#define b_mode 1  /* byte operand */
     
    318313#define cond_jump_mode 8
    319314#define loop_jcxz_mode 9
     315#define dq_mode 10 /* operand size depends on REX prefixes.  */
    320316
    321317#define es_reg 100
     
    364360#define indir_dx_reg 150
    365361
    366 #define USE_GROUPS 1
    367 #define USE_PREFIX_USER_TABLE 2
    368 
    369 #define GRP1b NULL, NULL, 0, NULL, USE_GROUPS, NULL, 0
    370 #define GRP1S NULL, NULL, 1, NULL, USE_GROUPS, NULL, 0
    371 #define GRP1Ss NULL, NULL, 2, NULL, USE_GROUPS, NULL, 0
    372 #define GRP2b NULL, NULL, 3, NULL, USE_GROUPS, NULL, 0
    373 #define GRP2S NULL, NULL, 4, NULL, USE_GROUPS, NULL, 0
    374 #define GRP2b_one NULL, NULL, 5, NULL, USE_GROUPS, NULL, 0
    375 #define GRP2S_one NULL, NULL, 6, NULL, USE_GROUPS, NULL, 0
    376 #define GRP2b_cl NULL, NULL, 7, NULL, USE_GROUPS, NULL, 0
    377 #define GRP2S_cl NULL, NULL, 8, NULL, USE_GROUPS, NULL, 0
    378 #define GRP3b NULL, NULL, 9, NULL, USE_GROUPS, NULL, 0
    379 #define GRP3S NULL, NULL, 10, NULL, USE_GROUPS, NULL, 0
    380 #define GRP4  NULL, NULL, 11, NULL, USE_GROUPS, NULL, 0
    381 #define GRP5  NULL, NULL, 12, NULL, USE_GROUPS, NULL, 0
    382 #define GRP6  NULL, NULL, 13, NULL, USE_GROUPS, NULL, 0
    383 #define GRP7 NULL, NULL, 14, NULL, USE_GROUPS, NULL, 0
    384 #define GRP8 NULL, NULL, 15, NULL, USE_GROUPS, NULL, 0
    385 #define GRP9 NULL, NULL, 16, NULL, USE_GROUPS, NULL, 0
    386 #define GRP10 NULL, NULL, 17, NULL, USE_GROUPS, NULL, 0
    387 #define GRP11 NULL, NULL, 18, NULL, USE_GROUPS, NULL, 0
    388 #define GRP12 NULL, NULL, 19, NULL, USE_GROUPS, NULL, 0
    389 #define GRP13 NULL, NULL, 20, NULL, USE_GROUPS, NULL, 0
    390 #define GRP14 NULL, NULL, 21, NULL, USE_GROUPS, NULL, 0
    391 #define GRPAMD NULL, NULL, 22, NULL, USE_GROUPS, NULL, 0
    392 
    393 #define PREGRP0 NULL, NULL, 0, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    394 #define PREGRP1 NULL, NULL, 1, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    395 #define PREGRP2 NULL, NULL, 2, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    396 #define PREGRP3 NULL, NULL, 3, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    397 #define PREGRP4 NULL, NULL, 4, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    398 #define PREGRP5 NULL, NULL, 5, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    399 #define PREGRP6 NULL, NULL, 6, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    400 #define PREGRP7 NULL, NULL, 7, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    401 #define PREGRP8 NULL, NULL, 8, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    402 #define PREGRP9 NULL, NULL, 9, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    403 #define PREGRP10 NULL, NULL, 10, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    404 #define PREGRP11 NULL, NULL, 11, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    405 #define PREGRP12 NULL, NULL, 12, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    406 #define PREGRP13 NULL, NULL, 13, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    407 #define PREGRP14 NULL, NULL, 14, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    408 #define PREGRP15 NULL, NULL, 15, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    409 #define PREGRP16 NULL, NULL, 16, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    410 #define PREGRP17 NULL, NULL, 17, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    411 #define PREGRP18 NULL, NULL, 18, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    412 #define PREGRP19 NULL, NULL, 19, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    413 #define PREGRP20 NULL, NULL, 20, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    414 #define PREGRP21 NULL, NULL, 21, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    415 #define PREGRP22 NULL, NULL, 22, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    416 #define PREGRP23 NULL, NULL, 23, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    417 #define PREGRP24 NULL, NULL, 24, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    418 #define PREGRP25 NULL, NULL, 25, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    419 #define PREGRP26 NULL, NULL, 26, NULL, USE_PREFIX_USER_TABLE, NULL, 0
    420 
    421 #define FLOATCODE 50
    422 #define FLOAT NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
     362#define FLOATCODE 1
     363#define USE_GROUPS 2
     364#define USE_PREFIX_USER_TABLE 3
     365#define X86_64_SPECIAL 4
     366
     367#define FLOAT     NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
     368
     369#define GRP1b     NULL, NULL, USE_GROUPS, NULL,  0, NULL, 0
     370#define GRP1S     NULL, NULL, USE_GROUPS, NULL,  1, NULL, 0
     371#define GRP1Ss    NULL, NULL, USE_GROUPS, NULL,  2, NULL, 0
     372#define GRP2b     NULL, NULL, USE_GROUPS, NULL,  3, NULL, 0
     373#define GRP2S     NULL, NULL, USE_GROUPS, NULL,  4, NULL, 0
     374#define GRP2b_one NULL, NULL, USE_GROUPS, NULL,  5, NULL, 0
     375#define GRP2S_one NULL, NULL, USE_GROUPS, NULL,  6, NULL, 0
     376#define GRP2b_cl  NULL, NULL, USE_GROUPS, NULL,  7, NULL, 0
     377#define GRP2S_cl  NULL, NULL, USE_GROUPS, NULL,  8, NULL, 0
     378#define GRP3b     NULL, NULL, USE_GROUPS, NULL,  9, NULL, 0
     379#define GRP3S     NULL, NULL, USE_GROUPS, NULL, 10, NULL, 0
     380#define GRP4      NULL, NULL, USE_GROUPS, NULL, 11, NULL, 0
     381#define GRP5      NULL, NULL, USE_GROUPS, NULL, 12, NULL, 0
     382#define GRP6      NULL, NULL, USE_GROUPS, NULL, 13, NULL, 0
     383#define GRP7      NULL, NULL, USE_GROUPS, NULL, 14, NULL, 0
     384#define GRP8      NULL, NULL, USE_GROUPS, NULL, 15, NULL, 0
     385#define GRP9      NULL, NULL, USE_GROUPS, NULL, 16, NULL, 0
     386#define GRP10     NULL, NULL, USE_GROUPS, NULL, 17, NULL, 0
     387#define GRP11     NULL, NULL, USE_GROUPS, NULL, 18, NULL, 0
     388#define GRP12     NULL, NULL, USE_GROUPS, NULL, 19, NULL, 0
     389#define GRP13     NULL, NULL, USE_GROUPS, NULL, 20, NULL, 0
     390#define GRP14     NULL, NULL, USE_GROUPS, NULL, 21, NULL, 0
     391#define GRPAMD    NULL, NULL, USE_GROUPS, NULL, 22, NULL, 0
     392
     393#define PREGRP0   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  0, NULL, 0
     394#define PREGRP1   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  1, NULL, 0
     395#define PREGRP2   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  2, NULL, 0
     396#define PREGRP3   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  3, NULL, 0
     397#define PREGRP4   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  4, NULL, 0
     398#define PREGRP5   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  5, NULL, 0
     399#define PREGRP6   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  6, NULL, 0
     400#define PREGRP7   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  7, NULL, 0
     401#define PREGRP8   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  8, NULL, 0
     402#define PREGRP9   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  9, NULL, 0
     403#define PREGRP10  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 10, NULL, 0
     404#define PREGRP11  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 11, NULL, 0
     405#define PREGRP12  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 12, NULL, 0
     406#define PREGRP13  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 13, NULL, 0
     407#define PREGRP14  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 14, NULL, 0
     408#define PREGRP15  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 15, NULL, 0
     409#define PREGRP16  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 16, NULL, 0
     410#define PREGRP17  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 17, NULL, 0
     411#define PREGRP18  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 18, NULL, 0
     412#define PREGRP19  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 19, NULL, 0
     413#define PREGRP20  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 20, NULL, 0
     414#define PREGRP21  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 21, NULL, 0
     415#define PREGRP22  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 22, NULL, 0
     416#define PREGRP23  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 23, NULL, 0
     417#define PREGRP24  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 24, NULL, 0
     418#define PREGRP25  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 25, NULL, 0
     419#define PREGRP26  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 26, NULL, 0
     420
     421#define X86_64_0  NULL, NULL, X86_64_SPECIAL, NULL,  0, NULL, 0
     422
     423typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
    423424
    424425struct dis386 {
     
    437438   'E' => print 'e' if 32-bit form of jcxz
    438439   'F' => print 'w' or 'l' depending on address size prefix (loop insns)
     440   'H' => print ",pt" or ",pn" branch hint
    439441   'L' => print 'l' if suffix_always is true
    440442   'N' => print 'n' if instruction has no wait "prefix"
    441443   'O' => print 'd', or 'o'
    442444   'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
    443                               or suffix_always is true
    444           print 'q' if rex prefix is present.
    445    'I' => print 'q' in 64bit mode and behave as 'P' otherwise
    446    'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always is true
     445   .      or suffix_always is true.  print 'q' if rex prefix is present.
     446   'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
     447   .      is true
    447448   'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode)
    448449   'S' => print 'w', 'l' or 'q' if suffix_always is true
    449    'T' => print 'q' in 64bit mode and behave as 'I' otherwise
     450   'T' => print 'q' in 64bit mode and behave as 'P' otherwise
     451   'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
    450452   'X' => print 's', 'd' depending on data16 prefix (for XMM)
    451453   'W' => print 'b' or 'w' ("w" or "de" in intel mode)
    452454   'Y' => 'q' if instruction has an REX 64bit overwrite prefix
     455
     456   Many of the above letters print nothing in Intel mode.  See "putop"
     457   for the details.
     458
     459   Braces '{' and '}', and vertical bars '|', indicate alternative
     460   mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
     461   modes.  In cases where there are only two alternatives, the X86_64
     462   instruction is reserved, and "(bad)" is printed.
    453463*/
    454464
    455 static const struct dis386 dis386_att[] = {
     465static const struct dis386 dis386[] = {
    456466  /* 00 */
    457   { "addB",     Eb, Gb, XX },
    458   { "addS",     Ev, Gv, XX },
    459   { "addB",     Gb, Eb, XX },
    460   { "addS",     Gv, Ev, XX },
    461   { "addB",     AL, Ib, XX },
    462   { "addS",     eAX, Iv, XX },
    463   { "pushI",    es, XX, XX },
    464   { "popI",     es, XX, XX },
     467  { "addB",             Eb, Gb, XX },
     468  { "addS",             Ev, Gv, XX },
     469  { "addB",             Gb, Eb, XX },
     470  { "addS",             Gv, Ev, XX },
     471  { "addB",             AL, Ib, XX },
     472  { "addS",             eAX, Iv, XX },
     473  { "push{T|}",         es, XX, XX },
     474  { "pop{T|}",          es, XX, XX },
    465475  /* 08 */
    466   { "orB",      Eb, Gb, XX },
    467   { "orS",      Ev, Gv, XX },
    468   { "orB",      Gb, Eb, XX },
    469   { "orS",      Gv, Ev, XX },
    470   { "orB",      AL, Ib, XX },
    471   { "orS",      eAX, Iv, XX },
    472   { "pushI",    cs, XX, XX },
    473   { "(bad)",    XX, XX, XX },   /* 0x0f extended opcode escape */
     476  { "orB",              Eb, Gb, XX },
     477  { "orS",              Ev, Gv, XX },
     478  { "orB",              Gb, Eb, XX },
     479  { "orS",              Gv, Ev, XX },
     480  { "orB",              AL, Ib, XX },
     481  { "orS",              eAX, Iv, XX },
     482  { "push{T|}",         cs, XX, XX },
     483  { "(bad)",            XX, XX, XX },   /* 0x0f extended opcode escape */
    474484  /* 10 */
    475   { "adcB",     Eb, Gb, XX },
    476   { "adcS",     Ev, Gv, XX },
    477   { "adcB",     Gb, Eb, XX },
    478   { "adcS",     Gv, Ev, XX },
    479   { "adcB",     AL, Ib, XX },
    480   { "adcS",     eAX, Iv, XX },
    481   { "pushI",    ss, XX, XX },
    482   { "popI",     ss, XX, XX },
     485  { "adcB",             Eb, Gb, XX },
     486  { "adcS",             Ev, Gv, XX },
     487  { "adcB",             Gb, Eb, XX },
     488  { "adcS",             Gv, Ev, XX },
     489  { "adcB",             AL, Ib, XX },
     490  { "adcS",             eAX, Iv, XX },
     491  { "push{T|}",         ss, XX, XX },
     492  { "popT|}",           ss, XX, XX },
    483493  /* 18 */
    484   { "sbbB",     Eb, Gb, XX },
    485   { "sbbS",     Ev, Gv, XX },
    486   { "sbbB",     Gb, Eb, XX },
    487   { "sbbS",     Gv, Ev, XX },
    488   { "sbbB",     AL, Ib, XX },
    489   { "sbbS",     eAX, Iv, XX },
    490   { "pushI",    ds, XX, XX },
    491   { "popI",     ds, XX, XX },
     494  { "sbbB",             Eb, Gb, XX },
     495  { "sbbS",             Ev, Gv, XX },
     496  { "sbbB",             Gb, Eb, XX },
     497  { "sbbS",             Gv, Ev, XX },
     498  { "sbbB",             AL, Ib, XX },
     499  { "sbbS",             eAX, Iv, XX },
     500  { "push{T|}",         ds, XX, XX },
     501  { "pop{T|}",          ds, XX, XX },
    492502  /* 20 */
    493   { "andB",     Eb, Gb, XX },
    494   { "andS",     Ev, Gv, XX },
    495   { "andB",     Gb, Eb, XX },
    496   { "andS",     Gv, Ev, XX },
    497   { "andB",     AL, Ib, XX },
    498   { "andS",     eAX, Iv, XX },
    499   { "(bad)",    XX, XX, XX },                   /* SEG ES prefix */
    500   { "daa",      XX, XX, XX },
     503  { "andB",             Eb, Gb, XX },
     504  { "andS",             Ev, Gv, XX },
     505  { "andB",             Gb, Eb, XX },
     506  { "andS",             Gv, Ev, XX },
     507  { "andB",             AL, Ib, XX },
     508  { "andS",             eAX, Iv, XX },
     509  { "(bad)",            XX, XX, XX },   /* SEG ES prefix */
     510  { "daa{|}",           XX, XX, XX },
    501511  /* 28 */
    502   { "subB",     Eb, Gb, XX },
    503   { "subS",     Ev, Gv, XX },
    504   { "subB",     Gb, Eb, XX },
    505   { "subS",     Gv, Ev, XX },
    506   { "subB",     AL, Ib, XX },
    507   { "subS",     eAX, Iv, XX },
    508   { "(bad)",    XX, XX, XX },                   /* SEG CS prefix */
    509   { "das",      XX, XX, XX },
     512  { "subB",             Eb, Gb, XX },
     513  { "subS",             Ev, Gv, XX },
     514  { "subB",             Gb, Eb, XX },
     515  { "subS",             Gv, Ev, XX },
     516  { "subB",             AL, Ib, XX },
     517  { "subS",             eAX, Iv, XX },
     518  { "(bad)",            XX, XX, XX },   /* SEG CS prefix */
     519  { "das{|}",           XX, XX, XX },
    510520  /* 30 */
    511   { "xorB",     Eb, Gb, XX },
    512   { "xorS",     Ev, Gv, XX },
    513   { "xorB",     Gb, Eb, XX },
    514   { "xorS",     Gv, Ev, XX },
    515   { "xorB",     AL, Ib, XX },
    516   { "xorS",     eAX, Iv, XX },
    517   { "(bad)",    XX, XX, XX },                   /* SEG SS prefix */
    518   { "aaa",      XX, XX, XX },
     521  { "xorB",             Eb, Gb, XX },
     522  { "xorS",             Ev, Gv, XX },
     523  { "xorB",             Gb, Eb, XX },
     524  { "xorS",             Gv, Ev, XX },
     525  { "xorB",             AL, Ib, XX },
     526  { "xorS",             eAX, Iv, XX },
     527  { "(bad)",            XX, XX, XX },   /* SEG SS prefix */
     528  { "aaa{|}",           XX, XX, XX },
    519529  /* 38 */
    520   { "cmpB",     Eb, Gb, XX },
    521   { "cmpS",     Ev, Gv, XX },
    522   { "cmpB",     Gb, Eb, XX },
    523   { "cmpS",     Gv, Ev, XX },
    524   { "cmpB",     AL, Ib, XX },
    525   { "cmpS",     eAX, Iv, XX },
    526   { "(bad)",    XX, XX, XX },                   /* SEG DS prefix */
    527   { "aas",      XX, XX, XX },
     530  { "cmpB",             Eb, Gb, XX },
     531  { "cmpS",             Ev, Gv, XX },
     532  { "cmpB",             Gb, Eb, XX },
     533  { "cmpS",             Gv, Ev, XX },
     534  { "cmpB",             AL, Ib, XX },
     535  { "cmpS",             eAX, Iv, XX },
     536  { "(bad)",            XX, XX, XX },   /* SEG DS prefix */
     537  { "aas{|}",           XX, XX, XX },
    528538  /* 40 */
    529   { "incS",     RMeAX, XX, XX },
    530   { "incS",     RMeCX, XX, XX },
    531   { "incS",     RMeDX, XX, XX },
    532   { "incS",     RMeBX, XX, XX },
    533   { "incS",     RMeSP, XX, XX },
    534   { "incS",     RMeBP, XX, XX },
    535   { "incS",     RMeSI, XX, XX },
    536   { "incS",     RMeDI, XX, XX },
     539  { "inc{S|}",          RMeAX, XX, XX },
     540  { "inc{S|}",          RMeCX, XX, XX },
     541  { "inc{S|}",          RMeDX, XX, XX },
     542  { "inc{S|}",          RMeBX, XX, XX },
     543  { "inc{S|}",          RMeSP, XX, XX },
     544  { "inc{S|}",          RMeBP, XX, XX },
     545  { "inc{S|}",          RMeSI, XX, XX },
     546  { "inc{S|}",          RMeDI, XX, XX },
    537547  /* 48 */
    538   { "decS",     RMeAX, XX, XX },
    539   { "decS",     RMeCX, XX, XX },
    540   { "decS",     RMeDX, XX, XX },
    541   { "decS",     RMeBX, XX, XX },
    542   { "decS",     RMeSP, XX, XX },
    543   { "decS",     RMeBP, XX, XX },
    544   { "decS",     RMeSI, XX, XX },
    545   { "decS",     RMeDI, XX, XX },
     548  { "dec{S|}",          RMeAX, XX, XX },
     549  { "dec{S|}",          RMeCX, XX, XX },
     550  { "dec{S|}",          RMeDX, XX, XX },
     551  { "dec{S|}",          RMeBX, XX, XX },
     552  { "dec{S|}",          RMeSP, XX, XX },
     553  { "dec{S|}",          RMeBP, XX, XX },
     554  { "dec{S|}",          RMeSI, XX, XX },
     555  { "dec{S|}",          RMeDI, XX, XX },
    546556  /* 50 */
    547   { "pushS",    RMeAX, XX, XX },
    548   { "pushS",    RMeCX, XX, XX },
    549   { "pushS",    RMeDX, XX, XX },
    550   { "pushS",    RMeBX, XX, XX },
    551   { "pushS",    RMeSP, XX, XX },
    552   { "pushS",    RMeBP, XX, XX },
    553   { "pushS",    RMeSI, XX, XX },
    554   { "pushS",    RMeDI, XX, XX },
     557  { "pushS",            RMrAX, XX, XX },
     558  { "pushS",            RMrCX, XX, XX },
     559  { "pushS",            RMrDX, XX, XX },
     560  { "pushS",            RMrBX, XX, XX },
     561  { "pushS",            RMrSP, XX, XX },
     562  { "pushS",            RMrBP, XX, XX },
     563  { "pushS",            RMrSI, XX, XX },
     564  { "pushS",            RMrDI, XX, XX },
    555565  /* 58 */
    556   { "popS",     RMeAX, XX, XX },
    557   { "popS",     RMeCX, XX, XX },
    558   { "popS",     RMeDX, XX, XX },
    559   { "popS",     RMeBX, XX, XX },
    560   { "popS",     RMeSP, XX, XX },
    561   { "popS",     RMeBP, XX, XX },
    562   { "popS",     RMeSI, XX, XX },
    563   { "popS",     RMeDI, XX, XX },
     566  { "popS",             RMrAX, XX, XX },
     567  { "popS",             RMrCX, XX, XX },
     568  { "popS",             RMrDX, XX, XX },
     569  { "popS",             RMrBX, XX, XX },
     570  { "popS",             RMrSP, XX, XX },
     571  { "popS",             RMrBP, XX, XX },
     572  { "popS",             RMrSI, XX, XX },
     573  { "popS",             RMrDI, XX, XX },
    564574  /* 60 */
    565   { "pushaP",   XX, XX, XX },
    566   { "popaP",    XX, XX, XX },
    567   { "boundS",   Gv, Ma, XX },
    568   { "arpl",     Ew, Gw, XX },
    569   { "(bad)",    XX, XX, XX },                   /* seg fs */
    570   { "(bad)",    XX, XX, XX },                   /* seg gs */
    571   { "(bad)",    XX, XX, XX },                   /* op size prefix */
    572   { "(bad)",    XX, XX, XX },                   /* adr size prefix */
     575  { "pusha{P|}",        XX, XX, XX },
     576  { "popa{P|}",         XX, XX, XX },
     577  { "bound{S|}",        Gv, Ma, XX },
     578  { X86_64_0 },
     579  { "(bad)",            XX, XX, XX },   /* seg fs */
     580  { "(bad)",            XX, XX, XX },   /* seg gs */
     581  { "(bad)",            XX, XX, XX },   /* op size prefix */
     582  { "(bad)",            XX, XX, XX },   /* adr size prefix */
    573583  /* 68 */
    574   { "pushI",    Iv, XX, XX },           /* 386 book wrong */
    575   { "imulS",    Gv, Ev, Iv },
    576   { "pushI",    sIb, XX, XX },  /* push of byte really pushes 2 or 4 bytes */
    577   { "imulS",    Gv, Ev, sIb },
    578   { "insb",     Yb, indirDX, XX },
    579   { "insR",     Yv, indirDX, XX },
    580   { "outsb",    indirDX, Xb, XX },
    581   { "outsR",    indirDX, Xv, XX },
     584  { "pushT",            Iq, XX, XX },
     585  { "imulS",            Gv, Ev, Iv },
     586  { "pushT",            sIb, XX, XX },
     587  { "imulS",            Gv, Ev, sIb },
     588  { "ins{b||b|}",       Yb, indirDX, XX },
     589  { "ins{R||R|}",       Yv, indirDX, XX },
     590  { "outs{b||b|}",      indirDX, Xb, XX },
     591  { "outs{R||R|}",      indirDX, Xv, XX },
    582592  /* 70 */
    583   { "jo",       Jb, cond_jump_flag, XX },
    584   { "jno",      Jb, cond_jump_flag, XX },
    585   { "jb",       Jb, cond_jump_flag, XX },
    586   { "jae",      Jb, cond_jump_flag, XX },
    587   { "je",       Jb, cond_jump_flag, XX },
    588   { "jne",      Jb, cond_jump_flag, XX },
    589   { "jbe",      Jb, cond_jump_flag, XX },
    590   { "ja",       Jb, cond_jump_flag, XX },
     593  { "joH",              Jb, XX, cond_jump_flag },
     594  { "jnoH",             Jb, XX, cond_jump_flag },
     595  { "jbH",              Jb, XX, cond_jump_flag },
     596  { "jaeH",             Jb, XX, cond_jump_flag },
     597  { "jeH",              Jb, XX, cond_jump_flag },
     598  { "jneH",             Jb, XX, cond_jump_flag },
     599  { "jbeH",             Jb, XX, cond_jump_flag },
     600  { "jaH",              Jb, XX, cond_jump_flag },
    591601  /* 78 */
    592   { "js",       Jb, cond_jump_flag, XX },
    593   { "jns",      Jb, cond_jump_flag, XX },
    594   { "jp",       Jb, cond_jump_flag, XX },
    595   { "jnp",      Jb, cond_jump_flag, XX },
    596   { "jl",       Jb, cond_jump_flag, XX },
    597   { "jge",      Jb, cond_jump_flag, XX },
    598   { "jle",      Jb, cond_jump_flag, XX },
    599   { "jg",       Jb, cond_jump_flag, XX },
     602  { "jsH",              Jb, XX, cond_jump_flag },
     603  { "jnsH",             Jb, XX, cond_jump_flag },
     604  { "jpH",              Jb, XX, cond_jump_flag },
     605  { "jnpH",             Jb, XX, cond_jump_flag },
     606  { "jlH",              Jb, XX, cond_jump_flag },
     607  { "jgeH",             Jb, XX, cond_jump_flag },
     608  { "jleH",             Jb, XX, cond_jump_flag },
     609  { "jgH",              Jb, XX, cond_jump_flag },
    600610  /* 80 */
    601611  { GRP1b },
    602612  { GRP1S },
    603   { "(bad)",    XX, XX, XX },
     613  { "(bad)",            XX, XX, XX },
    604614  { GRP1Ss },
    605   { "testB",    Eb, Gb, XX },
    606   { "testS",    Ev, Gv, XX },
    607   { "xchgB",    Eb, Gb, XX },
    608   { "xchgS",    Ev, Gv, XX },
     615  { "testB",            Eb, Gb, XX },
     616  { "testS",            Ev, Gv, XX },
     617  { "xchgB",            Eb, Gb, XX },
     618  { "xchgS",            Ev, Gv, XX },
    609619  /* 88 */
    610   { "movB",     Eb, Gb, XX },
    611   { "movS",     Ev, Gv, XX },
    612   { "movB",     Gb, Eb, XX },
    613   { "movS",     Gv, Ev, XX },
    614   { "movQ",     Ev, Sw, XX },
    615   { "leaS",     Gv, M, XX },
    616   { "movQ",     Sw, Ev, XX },
    617   { "popT",     Ev, XX, XX },
     620  { "movB",             Eb, Gb, XX },
     621  { "movS",             Ev, Gv, XX },
     622  { "movB",             Gb, Eb, XX },
     623  { "movS",             Gv, Ev, XX },
     624  { "movQ",             Ev, Sw, XX },
     625  { "leaS",             Gv, M, XX },
     626  { "movQ",             Sw, Ev, XX },
     627  { "popU",             Ev, XX, XX },
    618628  /* 90 */
    619   { "nop",      XX, XX, XX },
     629  { "nop",              XX, XX, XX },
    620630  /* FIXME: NOP with REPz prefix is called PAUSE.  */
    621   { "xchgS",    RMeCX, eAX, XX },
    622   { "xchgS",    RMeDX, eAX, XX },
    623   { "xchgS",    RMeBX, eAX, XX },
    624   { "xchgS",    RMeSP, eAX, XX },
    625   { "xchgS",    RMeBP, eAX, XX },
    626   { "xchgS",    RMeSI, eAX, XX },
    627   { "xchgS",    RMeDI, eAX, XX },
     631  { "xchgS",            RMeCX, eAX, XX },
     632  { "xchgS",            RMeDX, eAX, XX },
     633  { "xchgS",            RMeBX, eAX, XX },
     634  { "xchgS",            RMeSP, eAX, XX },
     635  { "xchgS",            RMeBP, eAX, XX },
     636  { "xchgS",            RMeSI, eAX, XX },
     637  { "xchgS",            RMeDI, eAX, XX },
    628638  /* 98 */
    629   { "cWtR",     XX, XX, XX },
    630   { "cRtO",     XX, XX, XX },
    631   { "lcallI",   Ap, XX, XX },
    632   { "(bad)",    XX, XX, XX },           /* fwait */
    633   { "pushfI",   XX, XX, XX },
    634   { "popfI",    XX, XX, XX },
    635   { "sahf",     XX, XX, XX },
    636   { "lahf",     XX, XX, XX },
     639  { "cW{tR||tR|}",      XX, XX, XX },
     640  { "cR{tO||tO|}",      XX, XX, XX },
     641  { "lcall{T|}",        Ap, XX, XX },
     642  { "(bad)",            XX, XX, XX },   /* fwait */
     643  { "pushfT",           XX, XX, XX },
     644  { "popfT",            XX, XX, XX },
     645  { "sahf{|}",          XX, XX, XX },
     646  { "lahf{|}",          XX, XX, XX },
    637647  /* a0 */
    638   { "movB",     AL, Ob, XX },
    639   { "movS",     eAX, Ov, XX },
    640   { "movB",     Ob, AL, XX },
    641   { "movS",     Ov, eAX, XX },
    642   { "movsb",    Yb, Xb, XX },
    643   { "movsR",    Yv, Xv, XX },
    644   { "cmpsb",    Xb, Yb, XX },
    645   { "cmpsR",    Xv, Yv, XX },
     648  { "movB",             AL, Ob64, XX },
     649  { "movS",             eAX, Ov64, XX },
     650  { "movB",             Ob64, AL, XX },
     651  { "movS",             Ov64, eAX, XX },
     652  { "movs{b||b|}",      Yb, Xb, XX },
     653  { "movs{R||R|}",      Yv, Xv, XX },
     654  { "cmps{b||b|}",      Xb, Yb, XX },
     655  { "cmps{R||R|}",      Xv, Yv, XX },
    646656  /* a8 */
    647   { "testB",    AL, Ib, XX },
    648   { "testS",    eAX, Iv, XX },
    649   { "stosB",    Yb, AL, XX },
    650   { "stosS",    Yv, eAX, XX },
    651   { "lodsB",    AL, Xb, XX },
    652   { "lodsS",    eAX, Xv, XX },
    653   { "scasB",    AL, Yb, XX },
    654   { "scasS",    eAX, Yv, XX },
     657  { "testB",            AL, Ib, XX },
     658  { "testS",            eAX, Iv, XX },
     659  { "stosB",            Yb, AL, XX },
     660  { "stosS",            Yv, eAX, XX },
     661  { "lodsB",            AL, Xb, XX },
     662  { "lodsS",            eAX, Xv, XX },
     663  { "scasB",            AL, Yb, XX },
     664  { "scasS",            eAX, Yv, XX },
    655665  /* b0 */
    656   { "movB",     RMAL, Ib, XX },
    657   { "movB",     RMCL, Ib, XX },
    658   { "movB",     RMDL, Ib, XX },
    659   { "movB",     RMBL, Ib, XX },
    660   { "movB",     RMAH, Ib, XX },
    661   { "movB",     RMCH, Ib, XX },
    662   { "movB",     RMDH, Ib, XX },
    663   { "movB",     RMBH, Ib, XX },
     666  { "movB",             RMAL, Ib, XX },
     667  { "movB",             RMCL, Ib, XX },
     668  { "movB",             RMDL, Ib, XX },
     669  { "movB",             RMBL, Ib, XX },
     670  { "movB",             RMAH, Ib, XX },
     671  { "movB",             RMCH, Ib, XX },
     672  { "movB",             RMDH, Ib, XX },
     673  { "movB",             RMBH, Ib, XX },
    664674  /* b8 */
    665   { "movS",     RMeAX, Iv, XX },
    666   { "movS",     RMeCX, Iv, XX },
    667   { "movS",     RMeDX, Iv, XX },
    668   { "movS",     RMeBX, Iv, XX },
    669   { "movS",     RMeSP, Iv, XX },
    670   { "movS",     RMeBP, Iv, XX },
    671   { "movS",     RMeSI, Iv, XX },
    672   { "movS",     RMeDI, Iv, XX },
     675  { "movS",             RMeAX, Iv64, XX },
     676  { "movS",             RMeCX, Iv64, XX },
     677  { "movS",             RMeDX, Iv64, XX },
     678  { "movS",             RMeBX, Iv64, XX },
     679  { "movS",             RMeSP, Iv64, XX },
     680  { "movS",             RMeBP, Iv64, XX },
     681  { "movS",             RMeSI, Iv64, XX },
     682  { "movS",             RMeDI, Iv64, XX },
    673683  /* c0 */
    674684  { GRP2b },
    675685  { GRP2S },
    676   { "retI",     Iw, XX, XX },
    677   { "retI",     XX, XX, XX },
    678   { "lesS",     Gv, Mp, XX },
    679   { "ldsS",     Gv, Mp, XX },
    680   { "movA",     Eb, Ib, XX },
    681   { "movQ",     Ev, Iv, XX },
     686  { "retT",             Iw, XX, XX },
     687  { "retT",             XX, XX, XX },
     688  { "les{S|}",          Gv, Mp, XX },
     689  { "ldsS",             Gv, Mp, XX },
     690  { "movA",             Eb, Ib, XX },
     691  { "movQ",             Ev, Iv, XX },
    682692  /* c8 */
    683   { "enterI",   Iw, Ib, XX },
    684   { "leaveI",   XX, XX, XX },
    685   { "lretP",    Iw, XX, XX },
    686   { "lretP",    XX, XX, XX },
    687   { "int3",     XX, XX, XX },
    688   { "int",      Ib, XX, XX },
    689   { "into",     XX, XX, XX},
    690   { "iretP",    XX, XX, XX },
     693  { "enterT",           Iw, Ib, XX },
     694  { "leaveT",           XX, XX, XX },
     695  { "lretP",            Iw, XX, XX },
     696  { "lretP",            XX, XX, XX },
     697  { "int3",             XX, XX, XX },
     698  { "int",              Ib, XX, XX },
     699  { "into{|}",          XX, XX, XX },
     700  { "iretP",            XX, XX, XX },
    691701  /* d0 */
    692702  { GRP2b_one },
     
    694704  { GRP2b_cl },
    695705  { GRP2S_cl },
    696   { "aam",      sIb, XX, XX },
    697   { "aad",      sIb, XX, XX },
    698   { "(bad)",    XX, XX, XX },
    699   { "xlat",     DSBX, XX, XX },
     706  { "aam{|}",           sIb, XX, XX },
     707  { "aad{|}",           sIb, XX, XX },
     708  { "(bad)",            XX, XX, XX },
     709  { "xlat",             DSBX, XX, XX },
    700710  /* d8 */
    701711  { FLOAT },
     
    708718  { FLOAT },
    709719  /* e0 */
    710   { "loopneF",  Jb, loop_jcxz_flag, XX },
    711   { "loopeF",   Jb, loop_jcxz_flag, XX },
    712   { "loopF",    Jb, loop_jcxz_flag, XX },
    713   { "jEcxz",    Jb, loop_jcxz_flag, XX },
    714   { "inB",      AL, Ib, XX },
    715   { "inS",      eAX, Ib, XX },
    716   { "outB",     Ib, AL, XX },
    717   { "outS",     Ib, eAX, XX },
     720  { "loopneFH",         Jb, XX, loop_jcxz_flag },
     721  { "loopeFH",          Jb, XX, loop_jcxz_flag },
     722  { "loopFH",           Jb, XX, loop_jcxz_flag },
     723  { "jEcxzH",           Jb, XX, loop_jcxz_flag },
     724  { "inB",              AL, Ib, XX },
     725  { "inS",              eAX, Ib, XX },
     726  { "outB",             Ib, AL, XX },
     727  { "outS",             Ib, eAX, XX },
    718728  /* e8 */
    719   { "callI",    Jv, XX, XX },
    720   { "jmpI",     Jv, XX, XX },
    721   { "ljmpI",    Ap, XX, XX },
    722   { "jmp",      Jb, XX, XX },
    723   { "inB",      AL, indirDX, XX },
    724   { "inS",      eAX, indirDX, XX },
    725   { "outB",     indirDX, AL, XX },
    726   { "outS",     indirDX, eAX, XX },
     729  { "callT",            Jv, XX, XX },
     730  { "jmpT",             Jv, XX, XX },
     731  { "ljmp{T|}",         Ap, XX, XX },
     732  { "jmp",              Jb, XX, XX },
     733  { "inB",              AL, indirDX, XX },
     734  { "inS",              eAX, indirDX, XX },
     735  { "outB",             indirDX, AL, XX },
     736  { "outS",             indirDX, eAX, XX },
    727737  /* f0 */
    728   { "(bad)",    XX, XX, XX },                   /* lock prefix */
    729   { "(bad)",    XX, XX, XX },
    730   { "(bad)",    XX, XX, XX },                   /* repne */
    731   { "(bad)",    XX, XX, XX },                   /* repz */
    732   { "hlt",      XX, XX, XX },
    733   { "cmc",      XX, XX, XX },
     738  { "(bad)",            XX, XX, XX },   /* lock prefix */
     739  { "icebp",            XX, XX, XX },
     740  { "(bad)",            XX, XX, XX },   /* repne */
     741  { "(bad)",            XX, XX, XX },   /* repz */
     742  { "hlt",              XX, XX, XX },
     743  { "cmc",              XX, XX, XX },
    734744  { GRP3b },
    735745  { GRP3S },
    736746  /* f8 */
    737   { "clc",      XX, XX, XX },
    738   { "stc",      XX, XX, XX },
    739   { "cli",      XX, XX, XX },
    740   { "sti",      XX, XX, XX },
    741   { "cld",      XX, XX, XX },
    742   { "std",      XX, XX, XX },
     747  { "clc",              XX, XX, XX },
     748  { "stc",              XX, XX, XX },
     749  { "cli",              XX, XX, XX },
     750  { "sti",              XX, XX, XX },
     751  { "cld",              XX, XX, XX },
     752  { "std",              XX, XX, XX },
    743753  { GRP4 },
    744754  { GRP5 },
    745755};
    746756
    747 static const struct dis386 dis386_intel[] = {
    748   /* 00 */
    749   { "add",      Eb, Gb, XX },
    750   { "add",      Ev, Gv, XX },
    751   { "add",      Gb, Eb, XX },
    752   { "add",      Gv, Ev, XX },
    753   { "add",      AL, Ib, XX },
    754   { "add",      eAX, Iv, XX },
    755   { "push",     es, XX, XX },
    756   { "pop",      es, XX, XX },
    757   /* 08 */
    758   { "or",       Eb, Gb, XX },
    759   { "or",       Ev, Gv, XX },
    760   { "or",       Gb, Eb, XX },
    761   { "or",       Gv, Ev, XX },
    762   { "or",       AL, Ib, XX },
    763   { "or",       eAX, Iv, XX },
    764   { "push",     cs, XX, XX },
    765   { "(bad)",    XX, XX, XX },   /* 0x0f extended opcode escape */
    766   /* 10 */
    767   { "adc",      Eb, Gb, XX },
    768   { "adc",      Ev, Gv, XX },
    769   { "adc",      Gb, Eb, XX },
    770   { "adc",      Gv, Ev, XX },
    771   { "adc",      AL, Ib, XX },
    772   { "adc",      eAX, Iv, XX },
    773   { "push",     ss, XX, XX },
    774   { "pop",      ss, XX, XX },
    775   /* 18 */
    776   { "sbb",      Eb, Gb, XX },
    777   { "sbb",      Ev, Gv, XX },
    778   { "sbb",      Gb, Eb, XX },
    779   { "sbb",      Gv, Ev, XX },
    780   { "sbb",      AL, Ib, XX },
    781   { "sbb",      eAX, Iv, XX },
    782   { "push",     ds, XX, XX },
    783   { "pop",      ds, XX, XX },
    784   /* 20 */
    785   { "and",      Eb, Gb, XX },
    786   { "and",      Ev, Gv, XX },
    787   { "and",      Gb, Eb, XX },
    788   { "and",      Gv, Ev, XX },
    789   { "and",      AL, Ib, XX },
    790   { "and",      eAX, Iv, XX },
    791   { "(bad)",    XX, XX, XX },                   /* SEG ES prefix */
    792   { "daa",      XX, XX, XX },
    793   /* 28 */
    794   { "sub",      Eb, Gb, XX },
    795   { "sub",      Ev, Gv, XX },
    796   { "sub",      Gb, Eb, XX },
    797   { "sub",      Gv, Ev, XX },
    798   { "sub",      AL, Ib, XX },
    799   { "sub",      eAX, Iv, XX },
    800   { "(bad)",    XX, XX, XX },                   /* SEG CS prefix */
    801   { "das",      XX, XX, XX },
    802   /* 30 */
    803   { "xor",      Eb, Gb, XX },
    804   { "xor",      Ev, Gv, XX },
    805   { "xor",      Gb, Eb, XX },
    806   { "xor",      Gv, Ev, XX },
    807   { "xor",      AL, Ib, XX },
    808   { "xor",      eAX, Iv, XX },
    809   { "(bad)",    XX, XX, XX },                   /* SEG SS prefix */
    810   { "aaa",      XX, XX, XX },
    811   /* 38 */
    812   { "cmp",      Eb, Gb, XX },
    813   { "cmp",      Ev, Gv, XX },
    814   { "cmp",      Gb, Eb, XX },
    815   { "cmp",      Gv, Ev, XX },
    816   { "cmp",      AL, Ib, XX },
    817   { "cmp",      eAX, Iv, XX },
    818   { "(bad)",    XX, XX, XX },                   /* SEG DS prefix */
    819   { "aas",      XX, XX, XX },
    820   /* 40 */
    821   { "inc",      RMeAX, XX, XX },
    822   { "inc",      RMeCX, XX, XX },
    823   { "inc",      RMeDX, XX, XX },
    824   { "inc",      RMeBX, XX, XX },
    825   { "inc",      RMeSP, XX, XX },
    826   { "inc",      RMeBP, XX, XX },
    827   { "inc",      RMeSI, XX, XX },
    828   { "inc",      RMeDI, XX, XX },
    829   /* 48 */
    830   { "dec",      RMeAX, XX, XX },
    831   { "dec",      RMeCX, XX, XX },
    832   { "dec",      RMeDX, XX, XX },
    833   { "dec",      RMeBX, XX, XX },
    834   { "dec",      RMeSP, XX, XX },
    835   { "dec",      RMeBP, XX, XX },
    836   { "dec",      RMeSI, XX, XX },
    837   { "dec",      RMeDI, XX, XX },
    838   /* 50 */
    839   { "push",     RMeAX, XX, XX },
    840   { "push",     RMeCX, XX, XX },
    841   { "push",     RMeDX, XX, XX },
    842   { "push",     RMeBX, XX, XX },
    843   { "push",     RMeSP, XX, XX },
    844   { "push",     RMeBP, XX, XX },
    845   { "push",     RMeSI, XX, XX },
    846   { "push",     RMeDI, XX, XX },
    847   /* 58 */
    848   { "pop",      RMeAX, XX, XX },
    849   { "pop",      RMeCX, XX, XX },
    850   { "pop",      RMeDX, XX, XX },
    851   { "pop",      RMeBX, XX, XX },
    852   { "pop",      RMeSP, XX, XX },
    853   { "pop",      RMeBP, XX, XX },
    854   { "pop",      RMeSI, XX, XX },
    855   { "pop",      RMeDI, XX, XX },
    856   /* 60 */
    857   { "pusha",    XX, XX, XX },
    858   { "popa",     XX, XX, XX },
    859   { "bound",    Gv, Ma, XX },
    860   { "arpl",     Ew, Gw, XX },
    861   { "(bad)",    XX, XX, XX },                   /* seg fs */
    862   { "(bad)",    XX, XX, XX },                   /* seg gs */
    863   { "(bad)",    XX, XX, XX },                   /* op size prefix */
    864   { "(bad)",    XX, XX, XX },                   /* adr size prefix */
    865   /* 68 */
    866   { "push",     Iv, XX, XX },           /* 386 book wrong */
    867   { "imul",     Gv, Ev, Iv },
    868   { "push",     sIb, XX, XX },  /* push of byte really pushes 2 or 4 bytes */
    869   { "imul",     Gv, Ev, sIb },
    870   { "ins",      Yb, indirDX, XX },
    871   { "ins",      Yv, indirDX, XX },
    872   { "outs",     indirDX, Xb, XX },
    873   { "outs",     indirDX, Xv, XX },
    874   /* 70 */
    875   { "jo",       Jb, XX, XX },
    876   { "jno",      Jb, XX, XX },
    877   { "jb",       Jb, XX, XX },
    878   { "jae",      Jb, XX, XX },
    879   { "je",       Jb, XX, XX },
    880   { "jne",      Jb, XX, XX },
    881   { "jbe",      Jb, XX, XX },
    882   { "ja",       Jb, XX, XX },
    883   /* 78 */
    884   { "js",       Jb, XX, XX },
    885   { "jns",      Jb, XX, XX },
    886   { "jp",       Jb, XX, XX },
    887   { "jnp",      Jb, XX, XX },
    888   { "jl",       Jb, XX, XX },
    889   { "jge",      Jb, XX, XX },
    890   { "jle",      Jb, XX, XX },
    891   { "jg",       Jb, XX, XX },
    892   /* 80 */
    893   { GRP1b },
    894   { GRP1S },
    895   { "(bad)",    XX, XX, XX },
    896   { GRP1Ss },
    897   { "test",     Eb, Gb, XX },
    898   { "test",     Ev, Gv, XX },
    899   { "xchg",     Eb, Gb, XX },
    900   { "xchg",     Ev, Gv, XX },
    901   /* 88 */
    902   { "mov",      Eb, Gb, XX },
    903   { "mov",      Ev, Gv, XX },
    904   { "mov",      Gb, Eb, XX },
    905   { "mov",      Gv, Ev, XX },
    906   { "mov",      Ev, Sw, XX },
    907   { "lea",      Gv, M, XX },
    908   { "mov",      Sw, Ev, XX },
    909   { "pop",      Ev, XX, XX },
    910   /* 90 */
    911   { "nop",      XX, XX, XX },
    912   /* FIXME: NOP with REPz prefix is called PAUSE.  */
    913   { "xchg",     RMeCX, eAX, XX },
    914   { "xchg",     RMeDX, eAX, XX },
    915   { "xchg",     RMeBX, eAX, XX },
    916   { "xchg",     RMeSP, eAX, XX },
    917   { "xchg",     RMeBP, eAX, XX },
    918   { "xchg",     RMeSI, eAX, XX },
    919   { "xchg",     RMeDI, eAX, XX },
    920   /* 98 */
    921   { "cW",       XX, XX, XX },           /* cwde and cbw */
    922   { "cR",       XX, XX, XX },           /* cdq and cwd */
    923   { "lcall",    Ap, XX, XX },
    924   { "(bad)",    XX, XX, XX },           /* fwait */
    925   { "pushf",    XX, XX, XX },
    926   { "popf",     XX, XX, XX },
    927   { "sahf",     XX, XX, XX },
    928   { "lahf",     XX, XX, XX },
    929   /* a0 */
    930   { "mov",      AL, Ob, XX },
    931   { "mov",      eAX, Ov, XX },
    932   { "mov",      Ob, AL, XX },
    933   { "mov",      Ov, eAX, XX },
    934   { "movs",     Yb, Xb, XX },
    935   { "movs",     Yv, Xv, XX },
    936   { "cmps",     Xb, Yb, XX },
    937   { "cmps",     Xv, Yv, XX },
    938   /* a8 */
    939   { "test",     AL, Ib, XX },
    940   { "test",     eAX, Iv, XX },
    941   { "stos",     Yb, AL, XX },
    942   { "stos",     Yv, eAX, XX },
    943   { "lods",     AL, Xb, XX },
    944   { "lods",     eAX, Xv, XX },
    945   { "scas",     AL, Yb, XX },
    946   { "scas",     eAX, Yv, XX },
    947   /* b0 */
    948   { "mov",      RMAL, Ib, XX },
    949   { "mov",      RMCL, Ib, XX },
    950   { "mov",      RMDL, Ib, XX },
    951   { "mov",      RMBL, Ib, XX },
    952   { "mov",      RMAH, Ib, XX },
    953   { "mov",      RMCH, Ib, XX },
    954   { "mov",      RMDH, Ib, XX },
    955   { "mov",      RMBH, Ib, XX },
    956   /* b8 */
    957   { "mov",      RMeAX, Iv, XX },
    958   { "mov",      RMeCX, Iv, XX },
    959   { "mov",      RMeDX, Iv, XX },
    960   { "mov",      RMeBX, Iv, XX },
    961   { "mov",      RMeSP, Iv, XX },
    962   { "mov",      RMeBP, Iv, XX },
    963   { "mov",      RMeSI, Iv, XX },
    964   { "mov",      RMeDI, Iv, XX },
    965   /* c0 */
    966   { GRP2b },
    967   { GRP2S },
    968   { "ret",      Iw, XX, XX },
    969   { "ret",      XX, XX, XX },
    970   { "les",      Gv, Mp, XX },
    971   { "lds",      Gv, Mp, XX },
    972   { "mov",      Eb, Ib, XX },
    973   { "mov",      Ev, Iv, XX },
    974   /* c8 */
    975   { "enter",    Iw, Ib, XX },
    976   { "leave",    XX, XX, XX },
    977   { "lret",     Iw, XX, XX },
    978   { "lret",     XX, XX, XX },
    979   { "int3",     XX, XX, XX },
    980   { "int",      Ib, XX, XX },
    981   { "into",     XX, XX, XX },
    982   { "iret",     XX, XX, XX },
    983   /* d0 */
    984   { GRP2b_one },
    985   { GRP2S_one },
    986   { GRP2b_cl },
    987   { GRP2S_cl },
    988   { "aam",      sIb, XX, XX },
    989   { "aad",      sIb, XX, XX },
    990   { "(bad)",    XX, XX, XX },
    991   { "xlat",     DSBX, XX, XX },
    992   /* d8 */
    993   { FLOAT },
    994   { FLOAT },
    995   { FLOAT },
    996   { FLOAT },
    997   { FLOAT },
    998   { FLOAT },
    999   { FLOAT },
    1000   { FLOAT },
    1001   /* e0 */
    1002   { "loopne",   Jb, XX, XX },
    1003   { "loope",    Jb, XX, XX },
    1004   { "loop",     Jb, XX, XX },
    1005   { "jEcxz",    Jb, XX, XX },
    1006   { "in",       AL, Ib, XX },
    1007   { "in",       eAX, Ib, XX },
    1008   { "out",      Ib, AL, XX },
    1009   { "out",      Ib, eAX, XX },
    1010   /* e8 */
    1011   { "call",     Jv, XX, XX },
    1012   { "jmp",      Jv, XX, XX },
    1013   { "ljmp",     Ap, XX, XX },
    1014   { "jmp",      Jb, XX, XX },
    1015   { "in",       AL, indirDX, XX },
    1016   { "in",       eAX, indirDX, XX },
    1017   { "out",      indirDX, AL, XX },
    1018   { "out",      indirDX, eAX, XX },
    1019   /* f0 */
    1020   { "(bad)",    XX, XX, XX },                   /* lock prefix */
    1021   { "(bad)",    XX, XX, XX },
    1022   { "(bad)",    XX, XX, XX },                   /* repne */
    1023   { "(bad)",    XX, XX, XX },                   /* repz */
    1024   { "hlt",      XX, XX, XX },
    1025   { "cmc",      XX, XX, XX },
    1026   { GRP3b },
    1027   { GRP3S },
    1028   /* f8 */
    1029   { "clc",      XX, XX, XX },
    1030   { "stc",      XX, XX, XX },
    1031   { "cli",      XX, XX, XX },
    1032   { "sti",      XX, XX, XX },
    1033   { "cld",      XX, XX, XX },
    1034   { "std",      XX, XX, XX },
    1035   { GRP4 },
    1036   { GRP5 },
    1037 };
    1038 
    1039 /* 64bit mode is having some instruction set differences, so separate table is
    1040    needed.  */
    1041 static const struct dis386 disx86_64_att[] = {
    1042   /* 00 */
    1043   { "addB",     Eb, Gb, XX },
    1044   { "addS",     Ev, Gv, XX },
    1045   { "addB",     Gb, Eb, XX },
    1046   { "addS",     Gv, Ev, XX },
    1047   { "addB",     AL, Ib, XX },
    1048   { "addS",     eAX, Iv, XX },
    1049   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1050   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1051   /* 08 */
    1052   { "orB",      Eb, Gb, XX },
    1053   { "orS",      Ev, Gv, XX },
    1054   { "orB",      Gb, Eb, XX },
    1055   { "orS",      Gv, Ev, XX },
    1056   { "orB",      AL, Ib, XX },
    1057   { "orS",      eAX, Iv, XX },
    1058   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1059   { "(bad)",    XX, XX, XX },   /* 0x0f extended opcode escape */
    1060   /* 10 */
    1061   { "adcB",     Eb, Gb, XX },
    1062   { "adcS",     Ev, Gv, XX },
    1063   { "adcB",     Gb, Eb, XX },
    1064   { "adcS",     Gv, Ev, XX },
    1065   { "adcB",     AL, Ib, XX },
    1066   { "adcS",     eAX, Iv, XX },
    1067   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1068   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1069   /* 18 */
    1070   { "sbbB",     Eb, Gb, XX },
    1071   { "sbbS",     Ev, Gv, XX },
    1072   { "sbbB",     Gb, Eb, XX },
    1073   { "sbbS",     Gv, Ev, XX },
    1074   { "sbbB",     AL, Ib, XX },
    1075   { "sbbS",     eAX, Iv, XX },
    1076   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1077   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1078   /* 20 */
    1079   { "andB",     Eb, Gb, XX },
    1080   { "andS",     Ev, Gv, XX },
    1081   { "andB",     Gb, Eb, XX },
    1082   { "andS",     Gv, Ev, XX },
    1083   { "andB",     AL, Ib, XX },
    1084   { "andS",     eAX, Iv, XX },
    1085   { "(bad)",    XX, XX, XX },                   /* SEG ES prefix */
    1086   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1087   /* 28 */
    1088   { "subB",     Eb, Gb, XX },
    1089   { "subS",     Ev, Gv, XX },
    1090   { "subB",     Gb, Eb, XX },
    1091   { "subS",     Gv, Ev, XX },
    1092   { "subB",     AL, Ib, XX },
    1093   { "subS",     eAX, Iv, XX },
    1094   { "(bad)",    XX, XX, XX },                   /* SEG CS prefix */
    1095   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1096   /* 30 */
    1097   { "xorB",     Eb, Gb, XX },
    1098   { "xorS",     Ev, Gv, XX },
    1099   { "xorB",     Gb, Eb, XX },
    1100   { "xorS",     Gv, Ev, XX },
    1101   { "xorB",     AL, Ib, XX },
    1102   { "xorS",     eAX, Iv, XX },
    1103   { "(bad)",    XX, XX, XX },                   /* SEG SS prefix */
    1104   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1105   /* 38 */
    1106   { "cmpB",     Eb, Gb, XX },
    1107   { "cmpS",     Ev, Gv, XX },
    1108   { "cmpB",     Gb, Eb, XX },
    1109   { "cmpS",     Gv, Ev, XX },
    1110   { "cmpB",     AL, Ib, XX },
    1111   { "cmpS",     eAX, Iv, XX },
    1112   { "(bad)",    XX, XX, XX },                   /* SEG DS prefix */
    1113   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1114   /* 40 */
    1115   { "(bad)",    XX, XX, XX },                   /* REX prefix area.  */
    1116   { "(bad)",    XX, XX, XX },
    1117   { "(bad)",    XX, XX, XX },
    1118   { "(bad)",    XX, XX, XX },
    1119   { "(bad)",    XX, XX, XX },
    1120   { "(bad)",    XX, XX, XX },
    1121   { "(bad)",    XX, XX, XX },
    1122   { "(bad)",    XX, XX, XX },
    1123   /* 48 */
    1124   { "(bad)",    XX, XX, XX },
    1125   { "(bad)",    XX, XX, XX },
    1126   { "(bad)",    XX, XX, XX },
    1127   { "(bad)",    XX, XX, XX },
    1128   { "(bad)",    XX, XX, XX },
    1129   { "(bad)",    XX, XX, XX },
    1130   { "(bad)",    XX, XX, XX },
    1131   { "(bad)",    XX, XX, XX },
    1132   /* 50 */
    1133   { "pushI",    RMrAX, XX, XX },
    1134   { "pushI",    RMrCX, XX, XX },
    1135   { "pushI",    RMrDX, XX, XX },
    1136   { "pushI",    RMrBX, XX, XX },
    1137   { "pushI",    RMrSP, XX, XX },
    1138   { "pushI",    RMrBP, XX, XX },
    1139   { "pushI",    RMrSI, XX, XX },
    1140   { "pushI",    RMrDI, XX, XX },
    1141   /* 58 */
    1142   { "popI",     RMrAX, XX, XX },
    1143   { "popI",     RMrCX, XX, XX },
    1144   { "popI",     RMrDX, XX, XX },
    1145   { "popI",     RMrBX, XX, XX },
    1146   { "popI",     RMrSP, XX, XX },
    1147   { "popI",     RMrBP, XX, XX },
    1148   { "popI",     RMrSI, XX, XX },
    1149   { "popI",     RMrDI, XX, XX },
    1150   /* 60 */
    1151   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1152   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1153   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1154   { "movslR",   Gv, Ed, XX },
    1155   { "(bad)",    XX, XX, XX },                   /* seg fs */
    1156   { "(bad)",    XX, XX, XX },                   /* seg gs */
    1157   { "(bad)",    XX, XX, XX },                   /* op size prefix */
    1158   { "(bad)",    XX, XX, XX },                   /* adr size prefix */
    1159   /* 68 */
    1160   { "pushI",    Iq, XX, XX },           /* 386 book wrong */
    1161   { "imulS",    Gv, Ev, Iv },
    1162   { "pushI",    sIb, XX, XX },  /* push of byte really pushes 2 or 4 bytes */
    1163   { "imulS",    Gv, Ev, sIb },
    1164   { "insb",     Yb, indirDX, XX },
    1165   { "insR",     Yv, indirDX, XX },
    1166   { "outsb",    indirDX, Xb, XX },
    1167   { "outsR",    indirDX, Xv, XX },
    1168   /* 70 */
    1169   { "jo",       Jb, cond_jump_flag, XX },
    1170   { "jno",      Jb, cond_jump_flag, XX },
    1171   { "jb",       Jb, cond_jump_flag, XX },
    1172   { "jae",      Jb, cond_jump_flag, XX },
    1173   { "je",       Jb, cond_jump_flag, XX },
    1174   { "jne",      Jb, cond_jump_flag, XX },
    1175   { "jbe",      Jb, cond_jump_flag, XX },
    1176   { "ja",       Jb, cond_jump_flag, XX },
    1177   /* 78 */
    1178   { "js",       Jb, cond_jump_flag, XX },
    1179   { "jns",      Jb, cond_jump_flag, XX },
    1180   { "jp",       Jb, cond_jump_flag, XX },
    1181   { "jnp",      Jb, cond_jump_flag, XX },
    1182   { "jl",       Jb, cond_jump_flag, XX },
    1183   { "jge",      Jb, cond_jump_flag, XX },
    1184   { "jle",      Jb, cond_jump_flag, XX },
    1185   { "jg",       Jb, cond_jump_flag, XX },
    1186   /* 80 */
    1187   { GRP1b },
    1188   { GRP1S },
    1189   { "(bad)",    XX, XX, XX },
    1190   { GRP1Ss },
    1191   { "testB",    Eb, Gb, XX },
    1192   { "testS",    Ev, Gv, XX },
    1193   { "xchgB",    Eb, Gb, XX },
    1194   { "xchgS",    Ev, Gv, XX },
    1195   /* 88 */
    1196   { "movB",     Eb, Gb, XX },
    1197   { "movS",     Ev, Gv, XX },
    1198   { "movB",     Gb, Eb, XX },
    1199   { "movS",     Gv, Ev, XX },
    1200   { "movQ",     Ev, Sw, XX },
    1201   { "leaS",     Gv, M, XX },
    1202   { "movQ",     Sw, Ev, XX },
    1203   { "popI",     Ev, XX, XX },
    1204   /* 90 */
    1205   { "nop",      XX, XX, XX },
    1206   /* FIXME: NOP with REPz prefix is called PAUSE.  */
    1207   { "xchgS",    RMeCX, eAX, XX },
    1208   { "xchgS",    RMeDX, eAX, XX },
    1209   { "xchgS",    RMeBX, eAX, XX },
    1210   { "xchgS",    RMeSP, eAX, XX },
    1211   { "xchgS",    RMeBP, eAX, XX },
    1212   { "xchgS",    RMeSI, eAX, XX },
    1213   { "xchgS",    RMeDI, eAX, XX },
    1214   /* 98 */
    1215   { "cWtR",     XX, XX, XX },
    1216   { "cRtO",     XX, XX, XX },
    1217   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1218   { "(bad)",    XX, XX, XX },           /* fwait */
    1219   { "pushfI",   XX, XX, XX },
    1220   { "popfI",    XX, XX, XX },
    1221   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1222   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1223   /* a0 */
    1224   { "movB",     AL, Ob64, XX },
    1225   { "movS",     eAX, Ov64, XX },
    1226   { "movB",     Ob64, AL, XX },
    1227   { "movS",     Ov64, eAX, XX },
    1228   { "movsb",    Yb, Xb, XX },
    1229   { "movsR",    Yv, Xv, XX },
    1230   { "cmpsb",    Xb, Yb, XX },
    1231   { "cmpsR",    Xv, Yv, XX },
    1232   /* a8 */
    1233   { "testB",    AL, Ib, XX },
    1234   { "testS",    eAX, Iv, XX },
    1235   { "stosB",    Yb, AL, XX },
    1236   { "stosS",    Yv, eAX, XX },
    1237   { "lodsB",    AL, Xb, XX },
    1238   { "lodsS",    eAX, Xv, XX },
    1239   { "scasB",    AL, Yb, XX },
    1240   { "scasS",    eAX, Yv, XX },
    1241   /* b0 */
    1242   { "movB",     RMAL, Ib, XX },
    1243   { "movB",     RMCL, Ib, XX },
    1244   { "movB",     RMDL, Ib, XX },
    1245   { "movB",     RMBL, Ib, XX },
    1246   { "movB",     RMAH, Ib, XX },
    1247   { "movB",     RMCH, Ib, XX },
    1248   { "movB",     RMDH, Ib, XX },
    1249   { "movB",     RMBH, Ib, XX },
    1250   /* b8 */
    1251   { "movS",     RMeAX, Iv64, XX },
    1252   { "movS",     RMeCX, Iv64, XX },
    1253   { "movS",     RMeDX, Iv64, XX },
    1254   { "movS",     RMeBX, Iv64, XX },
    1255   { "movS",     RMeSP, Iv64, XX },
    1256   { "movS",     RMeBP, Iv64, XX },
    1257   { "movS",     RMeSI, Iv64, XX },
    1258   { "movS",     RMeDI, Iv64, XX },
    1259   /* c0 */
    1260   { GRP2b },
    1261   { GRP2S },
    1262   { "retI",     Iw, XX, XX },
    1263   { "retI",     XX, XX, XX },
    1264   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1265   { "ldsS",     Gv, Mp, XX },
    1266   { "movA",     Eb, Ib, XX },
    1267   { "movQ",     Ev, Iv, XX },
    1268   /* c8 */
    1269   { "enterI",   Iw, Ib, XX },
    1270   { "leaveI",   XX, XX, XX },
    1271   { "lretP",    Iw, XX, XX },
    1272   { "lretP",    XX, XX, XX },
    1273   { "int3",     XX, XX, XX },
    1274   { "int",      Ib, XX, XX },
    1275   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1276   { "iretP",    XX, XX, XX },
    1277   /* d0 */
    1278   { GRP2b_one },
    1279   { GRP2S_one },
    1280   { GRP2b_cl },
    1281   { GRP2S_cl },
    1282   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1283   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1284   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1285   { "xlat",     DSBX, XX, XX },
    1286   /* d8 */
    1287   { FLOAT },
    1288   { FLOAT },
    1289   { FLOAT },
    1290   { FLOAT },
    1291   { FLOAT },
    1292   { FLOAT },
    1293   { FLOAT },
    1294   { FLOAT },
    1295   /* e0 */
    1296   { "loopneF",  Jb, loop_jcxz_flag, XX },
    1297   { "loopeF",   Jb, loop_jcxz_flag, XX },
    1298   { "loopF",    Jb, loop_jcxz_flag, XX },
    1299   { "jEcxz",    Jb, loop_jcxz_flag, XX },
    1300   { "inB",      AL, Ib, XX },
    1301   { "inS",      eAX, Ib, XX },
    1302   { "outB",     Ib, AL, XX },
    1303   { "outS",     Ib, eAX, XX },
    1304   /* e8 */
    1305   { "callI",    Jv, XX, XX },
    1306   { "jmpI",     Jv, XX, XX },
    1307   { "(bad)",    XX, XX, XX },   /* reserved.  */
    1308   { "jmp",      Jb, XX, XX },
    1309   { "inB",      AL, indirDX, XX },
    1310   { "inS",      eAX, indirDX, XX },
    1311   { "outB",     indirDX, AL, XX },
    1312   { "outS",     indirDX, eAX, XX },
    1313   /* f0 */
    1314   { "(bad)",    XX, XX, XX },                   /* lock prefix */
    1315   { "(bad)",    XX, XX, XX },
    1316   { "(bad)",    XX, XX, XX },                   /* repne */
    1317   { "(bad)",    XX, XX, XX },                   /* repz */
    1318   { "hlt",      XX, XX, XX },
    1319   { "cmc",      XX, XX, XX },
    1320   { GRP3b },
    1321   { GRP3S },
    1322   /* f8 */
    1323   { "clc",      XX, XX, XX },
    1324   { "stc",      XX, XX, XX },
    1325   { "cli",      XX, XX, XX },
    1326   { "sti",      XX, XX, XX },
    1327   { "cld",      XX, XX, XX },
    1328   { "std",      XX, XX, XX },
    1329   { GRP4 },
    1330   { GRP5 },
    1331 };
    1332 
    1333 static const struct dis386 dis386_64_intel[] = {
    1334   /* 00 */
    1335   { "add",      Eb, Gb, XX },
    1336   { "add",      Ev, Gv, XX },
    1337   { "add",      Gb, Eb, XX },
    1338   { "add",      Gv, Ev, XX },
    1339   { "add",      AL, Ib, XX },
    1340   { "add",      eAX, Iv, XX },
    1341   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1342   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1343   /* 08 */
    1344   { "or",       Eb, Gb, XX },
    1345   { "or",       Ev, Gv, XX },
    1346   { "or",       Gb, Eb, XX },
    1347   { "or",       Gv, Ev, XX },
    1348   { "or",       AL, Ib, XX },
    1349   { "or",       eAX, Iv, XX },
    1350   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1351   { "(bad)",    XX, XX, XX },   /* 0x0f extended opcode escape */
    1352   /* 10 */
    1353   { "adc",      Eb, Gb, XX },
    1354   { "adc",      Ev, Gv, XX },
    1355   { "adc",      Gb, Eb, XX },
    1356   { "adc",      Gv, Ev, XX },
    1357   { "adc",      AL, Ib, XX },
    1358   { "adc",      eAX, Iv, XX },
    1359   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1360   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1361   /* 18 */
    1362   { "sbb",      Eb, Gb, XX },
    1363   { "sbb",      Ev, Gv, XX },
    1364   { "sbb",      Gb, Eb, XX },
    1365   { "sbb",      Gv, Ev, XX },
    1366   { "sbb",      AL, Ib, XX },
    1367   { "sbb",      eAX, Iv, XX },
    1368   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1369   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1370   /* 20 */
    1371   { "and",      Eb, Gb, XX },
    1372   { "and",      Ev, Gv, XX },
    1373   { "and",      Gb, Eb, XX },
    1374   { "and",      Gv, Ev, XX },
    1375   { "and",      AL, Ib, XX },
    1376   { "and",      eAX, Iv, XX },
    1377   { "(bad)",    XX, XX, XX },                   /* SEG ES prefix */
    1378   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1379   /* 28 */
    1380   { "sub",      Eb, Gb, XX },
    1381   { "sub",      Ev, Gv, XX },
    1382   { "sub",      Gb, Eb, XX },
    1383   { "sub",      Gv, Ev, XX },
    1384   { "sub",      AL, Ib, XX },
    1385   { "sub",      eAX, Iv, XX },
    1386   { "(bad)",    XX, XX, XX },                   /* SEG CS prefix */
    1387   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1388   /* 30 */
    1389   { "xor",      Eb, Gb, XX },
    1390   { "xor",      Ev, Gv, XX },
    1391   { "xor",      Gb, Eb, XX },
    1392   { "xor",      Gv, Ev, XX },
    1393   { "xor",      AL, Ib, XX },
    1394   { "xor",      eAX, Iv, XX },
    1395   { "(bad)",    XX, XX, XX },                   /* SEG SS prefix */
    1396   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1397   /* 38 */
    1398   { "cmp",      Eb, Gb, XX },
    1399   { "cmp",      Ev, Gv, XX },
    1400   { "cmp",      Gb, Eb, XX },
    1401   { "cmp",      Gv, Ev, XX },
    1402   { "cmp",      AL, Ib, XX },
    1403   { "cmp",      eAX, Iv, XX },
    1404   { "(bad)",    XX, XX, XX },                   /* SEG DS prefix */
    1405   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1406   /* 40 */
    1407   { "(bad)",    XX, XX, XX },                   /* REX prefix area.  */
    1408   { "(bad)",    XX, XX, XX },
    1409   { "(bad)",    XX, XX, XX },
    1410   { "(bad)",    XX, XX, XX },
    1411   { "(bad)",    XX, XX, XX },
    1412   { "(bad)",    XX, XX, XX },
    1413   { "(bad)",    XX, XX, XX },
    1414   { "(bad)",    XX, XX, XX },
    1415   /* 48 */
    1416   { "(bad)",    XX, XX, XX },
    1417   { "(bad)",    XX, XX, XX },
    1418   { "(bad)",    XX, XX, XX },
    1419   { "(bad)",    XX, XX, XX },
    1420   { "(bad)",    XX, XX, XX },
    1421   { "(bad)",    XX, XX, XX },
    1422   { "(bad)",    XX, XX, XX },
    1423   { "(bad)",    XX, XX, XX },
    1424   /* 50 */
    1425   { "push",     RMrAX, XX, XX },
    1426   { "push",     RMrCX, XX, XX },
    1427   { "push",     RMrDX, XX, XX },
    1428   { "push",     RMrBX, XX, XX },
    1429   { "push",     RMrSP, XX, XX },
    1430   { "push",     RMrBP, XX, XX },
    1431   { "push",     RMrSI, XX, XX },
    1432   { "push",     RMrDI, XX, XX },
    1433   /* 58 */
    1434   { "pop",      RMrAX, XX, XX },
    1435   { "pop",      RMrCX, XX, XX },
    1436   { "pop",      RMrDX, XX, XX },
    1437   { "pop",      RMrBX, XX, XX },
    1438   { "pop",      RMrSP, XX, XX },
    1439   { "pop",      RMrBP, XX, XX },
    1440   { "pop",      RMrSI, XX, XX },
    1441   { "pop",      RMrDI, XX, XX },
    1442   /* 60 */
    1443   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1444   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1445   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1446   { "movsx",    Gv, Ed, XX },
    1447   { "(bad)",    XX, XX, XX },                   /* seg fs */
    1448   { "(bad)",    XX, XX, XX },                   /* seg gs */
    1449   { "(bad)",    XX, XX, XX },                   /* op size prefix */
    1450   { "(bad)",    XX, XX, XX },                   /* adr size prefix */
    1451   /* 68 */
    1452   { "push",     Iq, XX, XX },           /* 386 book wrong */
    1453   { "imul",     Gv, Ev, Iv },
    1454   { "push",     sIb, XX, XX },  /* push of byte really pushes 2 or 4 bytes */
    1455   { "imul",     Gv, Ev, sIb },
    1456   { "ins",      Yb, indirDX, XX },
    1457   { "ins",      Yv, indirDX, XX },
    1458   { "outs",     indirDX, Xb, XX },
    1459   { "outs",     indirDX, Xv, XX },
    1460   /* 70 */
    1461   { "jo",       Jb, XX, XX },
    1462   { "jno",      Jb, XX, XX },
    1463   { "jb",       Jb, XX, XX },
    1464   { "jae",      Jb, XX, XX },
    1465   { "je",       Jb, XX, XX },
    1466   { "jne",      Jb, XX, XX },
    1467   { "jbe",      Jb, XX, XX },
    1468   { "ja",       Jb, XX, XX },
    1469   /* 78 */
    1470   { "js",       Jb, XX, XX },
    1471   { "jns",      Jb, XX, XX },
    1472   { "jp",       Jb, XX, XX },
    1473   { "jnp",      Jb, XX, XX },
    1474   { "jl",       Jb, XX, XX },
    1475   { "jge",      Jb, XX, XX },
    1476   { "jle",      Jb, XX, XX },
    1477   { "jg",       Jb, XX, XX },
    1478   /* 80 */
    1479   { GRP1b },
    1480   { GRP1S },
    1481   { "(bad)",    XX, XX, XX },
    1482   { GRP1Ss },
    1483   { "test",     Eb, Gb, XX },
    1484   { "test",     Ev, Gv, XX },
    1485   { "xchg",     Eb, Gb, XX },
    1486   { "xchg",     Ev, Gv, XX },
    1487   /* 88 */
    1488   { "mov",      Eb, Gb, XX },
    1489   { "mov",      Ev, Gv, XX },
    1490   { "mov",      Gb, Eb, XX },
    1491   { "mov",      Gv, Ev, XX },
    1492   { "mov",      Ev, Sw, XX },
    1493   { "lea",      Gv, M, XX },
    1494   { "mov",      Sw, Ev, XX },
    1495   { "pop",      Ev, XX, XX },
    1496   /* 90 */
    1497   { "nop",      XX, XX, XX },
    1498   /* FIXME: NOP with REPz prefix is called PAUSE.  */
    1499   { "xchg",     RMeCX, eAX, XX },
    1500   { "xchg",     RMeDX, eAX, XX },
    1501   { "xchg",     RMeBX, eAX, XX },
    1502   { "xchg",     RMeSP, eAX, XX },
    1503   { "xchg",     RMeBP, eAX, XX },
    1504   { "xchg",     RMeSI, eAX, XX },
    1505   { "xchg",     RMeDI, eAX, XX },
    1506   /* 98 */
    1507   { "cW",       XX, XX, XX },           /* cwde and cbw */
    1508   { "cR",       XX, XX, XX },           /* cdq and cwd */
    1509   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1510   { "(bad)",    XX, XX, XX },           /* fwait */
    1511   { "pushf",    XX, XX, XX },
    1512   { "popf",     XX, XX, XX },
    1513   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1514   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1515   /* a0 */
    1516   { "mov",      AL, Ob, XX },
    1517   { "mov",      eAX, Ov, XX },
    1518   { "mov",      Ob, AL, XX },
    1519   { "mov",      Ov, eAX, XX },
    1520   { "movs",     Yb, Xb, XX },
    1521   { "movs",     Yv, Xv, XX },
    1522   { "cmps",     Xb, Yb, XX },
    1523   { "cmps",     Xv, Yv, XX },
    1524   /* a8 */
    1525   { "test",     AL, Ib, XX },
    1526   { "test",     eAX, Iv, XX },
    1527   { "stos",     Yb, AL, XX },
    1528   { "stos",     Yv, eAX, XX },
    1529   { "lods",     AL, Xb, XX },
    1530   { "lods",     eAX, Xv, XX },
    1531   { "scas",     AL, Yb, XX },
    1532   { "scas",     eAX, Yv, XX },
    1533   /* b0 */
    1534   { "mov",      RMAL, Ib, XX },
    1535   { "mov",      RMCL, Ib, XX },
    1536   { "mov",      RMDL, Ib, XX },
    1537   { "mov",      RMBL, Ib, XX },
    1538   { "mov",      RMAH, Ib, XX },
    1539   { "mov",      RMCH, Ib, XX },
    1540   { "mov",      RMDH, Ib, XX },
    1541   { "mov",      RMBH, Ib, XX },
    1542   /* b8 */
    1543   { "mov",      RMeAX, Iv, XX },
    1544   { "mov",      RMeCX, Iv, XX },
    1545   { "mov",      RMeDX, Iv, XX },
    1546   { "mov",      RMeBX, Iv, XX },
    1547   { "mov",      RMeSP, Iv, XX },
    1548   { "mov",      RMeBP, Iv, XX },
    1549   { "mov",      RMeSI, Iv, XX },
    1550   { "mov",      RMeDI, Iv, XX },
    1551   /* c0 */
    1552   { GRP2b },
    1553   { GRP2S },
    1554   { "ret",      Iw, XX, XX },
    1555   { "ret",      XX, XX, XX },
    1556   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1557   { "lds",      Gv, Mp, XX },
    1558   { "mov",      Eb, Ib, XX },
    1559   { "mov",      Ev, Iv, XX },
    1560   /* c8 */
    1561   { "enter",    Iw, Ib, XX },
    1562   { "leave",    XX, XX, XX },
    1563   { "lret",     Iw, XX, XX },
    1564   { "lret",     XX, XX, XX },
    1565   { "int3",     XX, XX, XX },
    1566   { "int",      Ib, XX, XX },
    1567   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1568   { "iret",     XX, XX, XX },
    1569   /* d0 */
    1570   { GRP2b_one },
    1571   { GRP2S_one },
    1572   { GRP2b_cl },
    1573   { GRP2S_cl },
    1574   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1575   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1576   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1577   { "xlat",     DSBX, XX, XX },
    1578   /* d8 */
    1579   { FLOAT },
    1580   { FLOAT },
    1581   { FLOAT },
    1582   { FLOAT },
    1583   { FLOAT },
    1584   { FLOAT },
    1585   { FLOAT },
    1586   { FLOAT },
    1587   /* e0 */
    1588   { "loopne",   Jb, XX, XX },
    1589   { "loope",    Jb, XX, XX },
    1590   { "loop",     Jb, XX, XX },
    1591   { "jEcxz",    Jb, XX, XX },
    1592   { "in",       AL, Ib, XX },
    1593   { "in",       eAX, Ib, XX },
    1594   { "out",      Ib, AL, XX },
    1595   { "out",      Ib, eAX, XX },
    1596   /* e8 */
    1597   { "call",     Jv, XX, XX },
    1598   { "jmp",      Jv, XX, XX },
    1599   { "(bad)",    XX, XX, XX },   /* Reserved.  */
    1600   { "jmp",      Jb, XX, XX },
    1601   { "in",       AL, indirDX, XX },
    1602   { "in",       eAX, indirDX, XX },
    1603   { "out",      indirDX, AL, XX },
    1604   { "out",      indirDX, eAX, XX },
    1605   /* f0 */
    1606   { "(bad)",    XX, XX, XX },                   /* lock prefix */
    1607   { "(bad)",    XX, XX, XX },
    1608   { "(bad)",    XX, XX, XX },                   /* repne */
    1609   { "(bad)",    XX, XX, XX },                   /* repz */
    1610   { "hlt",      XX, XX, XX },
    1611   { "cmc",      XX, XX, XX },
    1612   { GRP3b },
    1613   { GRP3S },
    1614   /* f8 */
    1615   { "clc",      XX, XX, XX },
    1616   { "stc",      XX, XX, XX },
    1617   { "cli",      XX, XX, XX },
    1618   { "sti",      XX, XX, XX },
    1619   { "cld",      XX, XX, XX },
    1620   { "std",      XX, XX, XX },
    1621   { GRP4 },
    1622   { GRP5 },
    1623 };
    1624 
    1625 static const struct dis386 dis386_twobyte_att[] = {
     757static const struct dis386 dis386_twobyte[] = {
    1626758  /* 00 */
    1627759  { GRP6 },
    1628760  { GRP7 },
    1629   { "larS", Gv, Ew, XX },
    1630   { "lslS", Gv, Ew, XX },
    1631   { "(bad)", XX, XX, XX },
    1632   { "syscall", XX, XX, XX },
    1633   { "clts", XX, XX, XX },
    1634   { "sysretP", XX, XX, XX },
     761  { "larS",             Gv, Ew, XX },
     762  { "lslS",             Gv, Ew, XX },
     763  { "(bad)",            XX, XX, XX },
     764  { "syscall",          XX, XX, XX },
     765  { "clts",             XX, XX, XX },
     766  { "sysretP",          XX, XX, XX },
    1635767  /* 08 */
    1636   { "invd", XX, XX, XX },
    1637   { "wbinvd", XX, XX, XX },
    1638   { "(bad)", XX, XX, XX },
    1639   { "ud2a", XX, XX, XX },
    1640   { "(bad)", XX, XX, XX },
     768  { "invd",             XX, XX, XX },
     769  { "wbinvd",           XX, XX, XX },
     770  { "(bad)",            XX, XX, XX },
     771  { "ud2a",             XX, XX, XX },
     772  { "(bad)",            XX, XX, XX },
    1641773  { GRPAMD },
    1642   { "femms", XX, XX, XX },
    1643   { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
     774  { "femms",            XX, XX, XX },
     775  { "",                 MX, EM, OPSUF }, /* See OP_3DNowSuffix. */
    1644776  /* 10 */
    1645777  { PREGRP8 },
    1646778  { PREGRP9 },
    1647   { "movlpX", XM, EX, SIMD_Fixup, 'h' }, /* really only 2 operands */
    1648   { "movlpX", EX, XM, SIMD_Fixup, 'h' },
    1649   { "unpcklpX", XM, EX, XX },
    1650   { "unpckhpX", XM, EX, XX },
    1651   { "movhpX", XM, EX, SIMD_Fixup, 'l' },
    1652   { "movhpX", EX, XM, SIMD_Fixup, 'l' },
     779  { "movlpX",           XM, EX, SIMD_Fixup, 'h' }, /* really only 2 operands */
     780  { "movlpX",           EX, XM, SIMD_Fixup, 'h' },
     781  { "unpcklpX",         XM, EX, XX },
     782  { "unpckhpX",         XM, EX, XX },
     783  { "movhpX",           XM, EX, SIMD_Fixup, 'l' },
     784  { "movhpX",           EX, XM, SIMD_Fixup, 'l' },
    1653785  /* 18 */
    1654786  { GRP14 },
    1655   { "(bad)", XX, XX, XX },
    1656   { "(bad)", XX, XX, XX },
    1657   { "(bad)", XX, XX, XX },
    1658   { "(bad)", XX, XX, XX },
    1659   { "(bad)", XX, XX, XX },
    1660   { "(bad)", XX, XX, XX },
    1661   { "(bad)", XX, XX, XX },
     787  { "(bad)",            XX, XX, XX },
     788  { "(bad)",            XX, XX, XX },
     789  { "(bad)",            XX, XX, XX },
     790  { "(bad)",            XX, XX, XX },
     791  { "(bad)",            XX, XX, XX },
     792  { "(bad)",            XX, XX, XX },
     793  { "(bad)",            XX, XX, XX },
    1662794  /* 20 */
    1663   /* these are all backward in appendix A of the intel book */
    1664   { "movL", Rm, Cm, XX },
    1665   { "movL", Rm, Dm, XX },
    1666   { "movL", Cm, Rm, XX },
    1667   { "movL", Dm, Rm, XX },
    1668   { "movL", Rd, Td, XX },
    1669   { "(bad)", XX, XX, XX },
    1670   { "movL", Td, Rd, XX },
    1671   { "(bad)", XX, XX, XX },
     795  { "movL",             Rm, Cm, XX },
     796  { "movL",             Rm, Dm, XX },
     797  { "movL",             Cm, Rm, XX },
     798  { "movL",             Dm, Rm, XX },
     799  { "movL",             Rd, Td, XX },
     800  { "(bad)",            XX, XX, XX },
     801  { "movL",             Td, Rd, XX },
     802  { "(bad)",            XX, XX, XX },
    1672803  /* 28 */
    1673   { "movapX", XM, EX, XX },
    1674   { "movapX", EX, XM, XX },
     804  { "movapX",           XM, EX, XX },
     805  { "movapX",           EX, XM, XX },
    1675806  { PREGRP2 },
    1676   { "movntpX", Ev, XM, XX },
     807  { "movntpX",          Ev, XM, XX },
    1677808  { PREGRP4 },
    1678809  { PREGRP3 },
    1679   { "ucomisX", XM,EX, XX },
    1680   { "comisX", XM,EX, XX },
     810  { "ucomisX",          XM,EX, XX },
     811  { "comisX",           XM,EX, XX },
    1681812  /* 30 */
    1682   { "wrmsr", XX, XX, XX },
    1683   { "rdtsc", XX, XX, XX },
    1684   { "rdmsr", XX, XX, XX },
    1685   { "rdpmc", XX, XX, XX },
    1686   { "sysenter", XX, XX, XX },
    1687   { "sysexit", XX, XX, XX },
    1688   { "(bad)", XX, XX, XX },
    1689   { "(bad)", XX, XX, XX },
     813  { "wrmsr",            XX, XX, XX },
     814  { "rdtsc",            XX, XX, XX },
     815  { "rdmsr",            XX, XX, XX },
     816  { "rdpmc",            XX, XX, XX },
     817  { "sysenter",         XX, XX, XX },
     818  { "sysexit",          XX, XX, XX },
     819  { "(bad)",            XX, XX, XX },
     820  { "(bad)",            XX, XX, XX },
    1690821  /* 38 */
    1691   { "(bad)", XX, XX, XX },
    1692   { "(bad)", XX, XX, XX },
    1693   { "(bad)", XX, XX, XX },
    1694   { "(bad)", XX, XX, XX },
    1695   { "(bad)", XX, XX, XX },
    1696   { "(bad)", XX, XX, XX },
    1697   { "(bad)", XX, XX, XX },
    1698   { "(bad)", XX, XX, XX },
     822  { "(bad)",            XX, XX, XX },
     823  { "(bad)",            XX, XX, XX },
     824  { "(bad)",            XX, XX, XX },
     825  { "(bad)",            XX, XX, XX },
     826  { "(bad)",            XX, XX, XX },
     827  { "(bad)",            XX, XX, XX },
     828  { "(bad)",            XX, XX, XX },
     829  { "(bad)",            XX, XX, XX },
    1699830  /* 40 */
    1700   { "cmovo", Gv, Ev, XX },
    1701   { "cmovno", Gv, Ev, XX },
    1702   { "cmovb", Gv, Ev, XX },
    1703   { "cmovae", Gv, Ev, XX },
    1704   { "cmove", Gv, Ev, XX },
    1705   { "cmovne", Gv, Ev, XX },
    1706   { "cmovbe", Gv, Ev, XX },
    1707   { "cmova", Gv, Ev, XX },
     831  { "cmovo",            Gv, Ev, XX },
     832  { "cmovno",           Gv, Ev, XX },
     833  { "cmovb",            Gv, Ev, XX },
     834  { "cmovae",           Gv, Ev, XX },
     835  { "cmove",            Gv, Ev, XX },
     836  { "cmovne",           Gv, Ev, XX },
     837  { "cmovbe",           Gv, Ev, XX },
     838  { "cmova",            Gv, Ev, XX },
    1708839  /* 48 */
    1709   { "cmovs", Gv, Ev, XX },
    1710   { "cmovns", Gv, Ev, XX },
    1711   { "cmovp", Gv, Ev, XX },
    1712   { "cmovnp", Gv, Ev, XX },
    1713   { "cmovl", Gv, Ev, XX },
    1714   { "cmovge", Gv, Ev, XX },
    1715   { "cmovle", Gv, Ev, XX },
    1716   { "cmovg", Gv, Ev, XX },
     840  { "cmovs",            Gv, Ev, XX },
     841  { "cmovns",           Gv, Ev, XX },
     842  { "cmovp",            Gv, Ev, XX },
     843  { "cmovnp",           Gv, Ev, XX },
     844  { "cmovl",            Gv, Ev, XX },
     845  { "cmovge",           Gv, Ev, XX },
     846  { "cmovle",           Gv, Ev, XX },
     847  { "cmovg",            Gv, Ev, XX },
    1717848  /* 50 */
    1718   { "movmskpX", Gd, XS, XX },
     849  { "movmskpX",         Gd, XS, XX },
    1719850  { PREGRP13 },
    1720851  { PREGRP12 },
    1721852  { PREGRP11 },
    1722   { "andpX", XM, EX, XX },
    1723   { "andnpX", XM, EX, XX },
    1724   { "orpX", XM, EX, XX },
    1725   { "xorpX", XM, EX, XX },
     853  { "andpX",            XM, EX, XX },
     854  { "andnpX",           XM, EX, XX },
     855  { "orpX",             XM, EX, XX },
     856  { "xorpX",            XM, EX, XX },
    1726857  /* 58 */
    1727858  { PREGRP0 },
     
    1734865  { PREGRP6 },
    1735866  /* 60 */
    1736   { "punpcklbw", MX, EM, XX },
    1737   { "punpcklwd", MX, EM, XX },
    1738   { "punpckldq", MX, EM, XX },
    1739   { "packsswb", MX, EM, XX },
    1740   { "pcmpgtb", MX, EM, XX },
    1741   { "pcmpgtw", MX, EM, XX },
    1742   { "pcmpgtd", MX, EM, XX },
    1743   { "packuswb", MX, EM, XX },
     867  { "punpcklbw",        MX, EM, XX },
     868  { "punpcklwd",        MX, EM, XX },
     869  { "punpckldq",        MX, EM, XX },
     870  { "packsswb",         MX, EM, XX },
     871  { "pcmpgtb",          MX, EM, XX },
     872  { "pcmpgtw",          MX, EM, XX },
     873  { "pcmpgtd",          MX, EM, XX },
     874  { "packuswb",         MX, EM, XX },
    1744875  /* 68 */
    1745   { "punpckhbw", MX, EM, XX },
    1746   { "punpckhwd", MX, EM, XX },
    1747   { "punpckhdq", MX, EM, XX },
    1748   { "packssdw", MX, EM, XX },
     876  { "punpckhbw",        MX, EM, XX },
     877  { "punpckhwd",        MX, EM, XX },
     878  { "punpckhdq",        MX, EM, XX },
     879  { "packssdw",         MX, EM, XX },
    1749880  { PREGRP26 },
    1750881  { PREGRP24 },
    1751   { "movd", MX, Ed, XX },
     882  { "movd",             MX, Edq, XX },
    1752883  { PREGRP19 },
    1753884  /* 70 */
     
    1756887  { GRP11 },
    1757888  { GRP12 },
    1758   { "pcmpeqb", MX, EM, XX },
    1759   { "pcmpeqw", MX, EM, XX },
    1760   { "pcmpeqd", MX, EM, XX },
    1761   { "emms", XX, XX, XX },
     889  { "pcmpeqb",          MX, EM, XX },
     890  { "pcmpeqw",          MX, EM, XX },
     891  { "pcmpeqd",          MX, EM, XX },
     892  { "emms",             XX, XX, XX },
    1762893  /* 78 */
    1763   { "(bad)", XX, XX, XX },
    1764   { "(bad)", XX, XX, XX },
    1765   { "(bad)", XX, XX, XX },
    1766   { "(bad)", XX, XX, XX },
    1767   { "(bad)", XX, XX, XX },
    1768   { "(bad)", XX, XX, XX },
     894  { "(bad)",            XX, XX, XX },
     895  { "(bad)",            XX, XX, XX },
     896  { "(bad)",            XX, XX, XX },
     897  { "(bad)",            XX, XX, XX },
     898  { "(bad)",            XX, XX, XX },
     899  { "(bad)",            XX, XX, XX },
    1769900  { PREGRP23 },
    1770901  { PREGRP20 },
    1771902  /* 80 */
    1772   { "jo",  Jv, cond_jump_flag, XX },
    1773   { "jno", Jv, cond_jump_flag, XX },
    1774   { "jb",  Jv, cond_jump_flag, XX },
    1775   { "jae", Jv, cond_jump_flag, XX },
    1776   { "je",  Jv, cond_jump_flag, XX },
    1777   { "jne", Jv, cond_jump_flag, XX },
    1778   { "jbe", Jv, cond_jump_flag, XX },
    1779   { "ja",  Jv, cond_jump_flag, XX },
     903  { "joH",              Jv, XX, cond_jump_flag },
     904  { "jnoH",             Jv, XX, cond_jump_flag },
     905  { "jbH",              Jv, XX, cond_jump_flag },
     906  { "jaeH",             Jv, XX, cond_jump_flag },
     907  { "jeH",              Jv, XX, cond_jump_flag },
     908  { "jneH",             Jv, XX, cond_jump_flag },
     909  { "jbeH",             Jv, XX, cond_jump_flag },
     910  { "jaH",              Jv, XX, cond_jump_flag },
    1780911  /* 88 */
    1781   { "js",  Jv, cond_jump_flag, XX },
    1782   { "jns", Jv, cond_jump_flag, XX },
    1783   { "jp",  Jv, cond_jump_flag, XX },
    1784   { "jnp", Jv, cond_jump_flag, XX },
    1785   { "jl",  Jv, cond_jump_flag, XX },
    1786   { "jge", Jv, cond_jump_flag, XX },
    1787   { "jle", Jv, cond_jump_flag, XX },
    1788   { "jg",  Jv, cond_jump_flag, XX },
     912  { "jsH",              Jv, XX, cond_jump_flag },
     913  { "jnsH",             Jv, XX, cond_jump_flag },
     914  { "jpH",              Jv, XX, cond_jump_flag },
     915  { "jnpH",             Jv, XX, cond_jump_flag },
     916  { "jlH",              Jv, XX, cond_jump_flag },
     917  { "jgeH",             Jv, XX, cond_jump_flag },
     918  { "jleH",             Jv, XX, cond_jump_flag },
     919  { "jgH",              Jv, XX, cond_jump_flag },
    1789920  /* 90 */
    1790   { "seto", Eb, XX, XX },
    1791   { "setno", Eb, XX, XX },
    1792   { "setb", Eb, XX, XX },
    1793   { "setae", Eb, XX, XX },
    1794   { "sete", Eb, XX, XX },
    1795   { "setne", Eb, XX, XX },
    1796   { "setbe", Eb, XX, XX },
    1797   { "seta", Eb, XX, XX },
     921  { "seto",             Eb, XX, XX },
     922  { "setno",            Eb, XX, XX },
     923  { "setb",             Eb, XX, XX },
     924  { "setae",            Eb, XX, XX },
     925  { "sete",             Eb, XX, XX },
     926  { "setne",            Eb, XX, XX },
     927  { "setbe",            Eb, XX, XX },
     928  { "seta",             Eb, XX, XX },
    1798929  /* 98 */
    1799   { "sets", Eb, XX, XX },
    1800   { "setns", Eb, XX, XX },
    1801   { "setp", Eb, XX, XX },
    1802   { "setnp", Eb, XX, XX },
    1803   { "setl", Eb, XX, XX },
    1804   { "setge", Eb, XX, XX },
    1805   { "setle", Eb, XX, XX },
    1806   { "setg", Eb, XX, XX },
     930  { "sets",             Eb, XX, XX },
     931  { "setns",            Eb, XX, XX },
     932  { "setp",             Eb, XX, XX },
     933  { "setnp",            Eb, XX, XX },
     934  { "setl",             Eb, XX, XX },
     935  { "setge",            Eb, XX, XX },
     936  { "setle",            Eb, XX, XX },
     937  { "setg",             Eb, XX, XX },
    1807938  /* a0 */
    1808   { "pushI", fs, XX, XX },
    1809   { "popI", fs, XX, XX },
    1810   { "cpuid", XX, XX, XX },
    1811   { "btS", Ev, Gv, XX },
    1812   { "shldS", Ev, Gv, Ib },
    1813   { "shldS", Ev, Gv, CL },
    1814   { "(bad)", XX, XX, XX },
    1815   { "(bad)", XX, XX, XX },
     939  { "pushT",            fs, XX, XX },
     940  { "popT",             fs, XX, XX },
     941  { "cpuid",            XX, XX, XX },
     942  { "btS",              Ev, Gv, XX },
     943  { "shldS",            Ev, Gv, Ib },
     944  { "shldS",            Ev, Gv, CL },
     945  { "(bad)",            XX, XX, XX },
     946  { "(bad)",            XX, XX, XX },
    1816947  /* a8 */
    1817   { "pushI", gs, XX, XX },
    1818   { "popI", gs, XX, XX },
    1819   { "rsm", XX, XX, XX },
    1820   { "btsS", Ev, Gv, XX },
    1821   { "shrdS", Ev, Gv, Ib },
    1822   { "shrdS", Ev, Gv, CL },
     948  { "pushT",            gs, XX, XX },
     949  { "popT",             gs, XX, XX },
     950  { "rsm",              XX, XX, XX },
     951  { "btsS",             Ev, Gv, XX },
     952  { "shrdS",            Ev, Gv, Ib },
     953  { "shrdS",            Ev, Gv, CL },
    1823954  { GRP13 },
    1824   { "imulS", Gv, Ev, XX },
     955  { "imulS",            Gv, Ev, XX },
    1825956  /* b0 */
    1826   { "cmpxchgB", Eb, Gb, XX },
    1827   { "cmpxchgS", Ev, Gv, XX },
    1828   { "lssS", Gv, Mp, XX },
    1829   { "btrS", Ev, Gv, XX },
    1830   { "lfsS", Gv, Mp, XX },
    1831   { "lgsS", Gv, Mp, XX },
    1832   { "movzbR", Gv, Eb, XX },
    1833   { "movzwR", Gv, Ew, XX }, /* yes, there really is movzww ! */
     957  { "cmpxchgB",         Eb, Gb, XX },
     958  { "cmpxchgS",         Ev, Gv, XX },
     959  { "lssS",             Gv, Mp, XX },
     960  { "btrS",             Ev, Gv, XX },
     961  { "lfsS",             Gv, Mp, XX },
     962  { "lgsS",             Gv, Mp, XX },
     963  { "movz{bR|x|bR|x}",  Gv, Eb, XX },
     964  { "movz{wR|x|wR|x}",  Gv, Ew, XX }, /* yes, there really is movzww ! */
    1834965  /* b8 */
    1835   { "(bad)", XX, XX, XX },
    1836   { "ud2b", XX, XX, XX },
     966  { "(bad)",            XX, XX, XX },
     967  { "ud2b",             XX, XX, XX },
    1837968  { GRP8 },
    1838   { "btcS", Ev, Gv, XX },
    1839   { "bsfS", Gv, Ev, XX },
    1840   { "bsrS", Gv, Ev, XX },
    1841   { "movsbR", Gv, Eb, XX },
    1842   { "movswR", Gv, Ew, XX }, /* yes, there really is movsww ! */
     969  { "btcS",             Ev, Gv, XX },
     970  { "bsfS",             Gv, Ev, XX },
     971  { "bsrS",             Gv, Ev, XX },
     972  { "movs{bR|x|bR|x}",  Gv, Eb, XX },
     973  { "movs{wR|x|wR|x}",  Gv, Ew, XX }, /* yes, there really is movsww ! */
    1843974  /* c0 */
    1844   { "xaddB", Eb, Gb, XX },
    1845   { "xaddS", Ev, Gv, XX },
     975  { "xaddB",            Eb, Gb, XX },
     976  { "xaddS",            Ev, Gv, XX },
    1846977  { PREGRP1 },
    1847   { "movntiS", Ev, Gv, XX },
    1848   { "pinsrw", MX, Ed, Ib },
    1849   { "pextrw", Gd, MS, Ib },
    1850   { "shufpX", XM, EX, Ib },
     978  { "movntiS",          Ev, Gv, XX },
     979  { "pinsrw",           MX, Ed, Ib },
     980  { "pextrw",           Gd, MS, Ib },
     981  { "shufpX",           XM, EX, Ib },
    1851982  { GRP9 },
    1852983  /* c8 */
    1853   { "bswap", RMeAX, XX, XX },   /* bswap doesn't support 16 bit regs */
    1854   { "bswap", RMeCX, XX, XX },
    1855   { "bswap", RMeDX, XX, XX },
    1856   { "bswap", RMeBX, XX, XX },
    1857   { "bswap", RMeSP, XX, XX },
    1858   { "bswap", RMeBP, XX, XX },
    1859   { "bswap", RMeSI, XX, XX },
    1860   { "bswap", RMeDI, XX, XX },
     984  { "bswap",            RMeAX, XX, XX },
     985  { "bswap",            RMeCX, XX, XX },
     986  { "bswap",            RMeDX, XX, XX },
     987  { "bswap",            RMeBX, XX, XX },
     988  { "bswap",            RMeSP, XX, XX },
     989  { "bswap",            RMeBP, XX, XX },
     990  { "bswap",            RMeSI, XX, XX },
     991  { "bswap",            RMeDI, XX, XX },
    1861992  /* d0 */
    1862   { "(bad)", XX, XX, XX },
    1863   { "psrlw", MX, EM, XX },
    1864   { "psrld", MX, EM, XX },
    1865   { "psrlq", MX, EM, XX },
    1866   { "paddq", MX, EM, XX },
    1867   { "pmullw", MX, EM, XX },
     993  { "(bad)",            XX, XX, XX },
     994  { "psrlw",            MX, EM, XX },
     995  { "psrld",            MX, EM, XX },
     996  { "psrlq",            MX, EM, XX },
     997  { "paddq",            MX, EM, XX },
     998  { "pmullw",           MX, EM, XX },
    1868999  { PREGRP21 },
    1869   { "pmovmskb", Gd, MS, XX },
     1000  { "pmovmskb",         Gd, MS, XX },
    18701001  /* d8 */
    1871   { "psubusb", MX, EM, XX },
    1872   { "psubusw", MX, EM, XX },
    1873   { "pminub", MX, EM, XX },
    1874   { "pand", MX, EM, XX },
    1875   { "paddusb", MX, EM, XX },
    1876   { "paddusw", MX, EM, XX },
    1877   { "pmaxub", MX, EM, XX },
    1878   { "pandn", MX, EM, XX },
     1002  { "psubusb",          MX, EM, XX },
     1003  { "psubusw",          MX, EM, XX },
     1004  { "pminub",           MX, EM, XX },
     1005  { "pand",             MX, EM, XX },
     1006  { "paddusb",          MX, EM, XX },
     1007  { "paddusw",          MX, EM, XX },
     1008  { "pmaxub",           MX, EM, XX },
     1009  { "pandn",            MX, EM, XX },
    18791010  /* e0 */
    1880   { "pavgb", MX, EM, XX },
    1881   { "psraw", MX, EM, XX },
    1882   { "psrad", MX, EM, XX },
    1883   { "pavgw", MX, EM, XX },
    1884   { "pmulhuw", MX, EM, XX },
    1885   { "pmulhw", MX, EM, XX },
     1011  { "pavgb",            MX, EM, XX },
     1012  { "psraw",            MX, EM, XX },
     1013  { "psrad",            MX, EM, XX },
     1014  { "pavgw",            MX, EM, XX },
     1015  { "pmulhuw",          MX, EM, XX },
     1016  { "pmulhw",           MX, EM, XX },
    18861017  { PREGRP15 },
    18871018  { PREGRP25 },
    18881019  /* e8 */
    1889   { "psubsb", MX, EM, XX },
    1890   { "psubsw", MX, EM, XX },
    1891   { "pminsw", MX, EM, XX },
    1892   { "por", MX, EM, XX },
    1893   { "paddsb", MX, EM, XX },
    1894   { "paddsw", MX, EM, XX },
    1895   { "pmaxsw", MX, EM, XX },
    1896   { "pxor", MX, EM, XX },
     1020  { "psubsb",           MX, EM, XX },
     1021  { "psubsw",           MX, EM, XX },
     1022  { "pminsw",           MX, EM, XX },
     1023  { "por",              MX, EM, XX },
     1024  { "paddsb",           MX, EM, XX },
     1025  { "paddsw",           MX, EM, XX },
     1026  { "pmaxsw",           MX, EM, XX },
     1027  { "pxor",             MX, EM, XX },
    18971028  /* f0 */
    1898   { "(bad)", XX, XX, XX },
    1899   { "psllw", MX, EM, XX },
    1900   { "pslld", MX, EM, XX },
    1901   { "psllq", MX, EM, XX },
    1902   { "pmuludq", MX, EM, XX },
    1903   { "pmaddwd", MX, EM, XX },
    1904   { "psadbw", MX, EM, XX },
     1029  { "(bad)",            XX, XX, XX },
     1030  { "psllw",            MX, EM, XX },
     1031  { "pslld",            MX, EM, XX },
     1032  { "psllq",            MX, EM, XX },
     1033  { "pmuludq",          MX, EM, XX },
     1034  { "pmaddwd",          MX, EM, XX },
     1035  { "psadbw",           MX, EM, XX },
    19051036  { PREGRP18 },
    19061037  /* f8 */
    1907   { "psubb", MX, EM, XX },
    1908   { "psubw", MX, EM, XX },
    1909   { "psubd", MX, EM, XX },
    1910   { "psubq", MX, EM, XX },
    1911   { "paddb", MX, EM, XX },
    1912   { "paddw", MX, EM, XX },
    1913   { "paddd", MX, EM, XX },
    1914   { "(bad)", XX, XX, XX }
    1915 };
    1916 
    1917 static const struct dis386 dis386_twobyte_intel[] = {
    1918   /* 00 */
    1919   { GRP6 },
    1920   { GRP7 },
    1921   { "lar", Gv, Ew, XX },
    1922   { "lsl", Gv, Ew, XX },
    1923   { "(bad)", XX, XX, XX },
    1924   { "syscall", XX, XX, XX },
    1925   { "clts", XX, XX, XX },
    1926   { "sysretP", XX, XX, XX },
    1927   /* 08 */
    1928   { "invd", XX, XX, XX },
    1929   { "wbinvd", XX, XX, XX },
    1930   { "(bad)", XX, XX, XX },
    1931   { "ud2a", XX, XX, XX },
    1932   { "(bad)", XX, XX, XX },
    1933   { GRPAMD },
    1934   { "femms" , XX, XX, XX},
    1935   { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
    1936   /* 10 */
    1937   { PREGRP8 },
    1938   { PREGRP9 },
    1939   { "movlpX", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
    1940   { "movlpX", EX, XM, SIMD_Fixup, 'h' },
    1941   { "unpcklpX", XM, EX, XX },
    1942   { "unpckhpX", XM, EX, XX },
    1943   { "movhpX", XM, EX, SIMD_Fixup, 'l' },
    1944   { "movhpX", EX, XM, SIMD_Fixup, 'l' },
    1945   /* 18 */
    1946   { GRP14 },
    1947   { "(bad)", XX, XX, XX },
    1948   { "(bad)", XX, XX, XX },
    1949   { "(bad)", XX, XX, XX },
    1950   { "(bad)", XX, XX, XX },
    1951   { "(bad)", XX, XX, XX },
    1952   { "(bad)", XX, XX, XX },
    1953   { "(bad)", XX, XX, XX },
    1954   /* 20 */
    1955   /* these are all backward in appendix A of the intel book */
    1956   { "mov", Rm, Cm, XX },
    1957   { "mov", Rm, Dm, XX },
    1958   { "mov", Cm, Rm, XX },
    1959   { "mov", Dm, Rm, XX },
    1960   { "mov", Rd, Td, XX },
    1961   { "(bad)", XX, XX, XX },
    1962   { "mov", Td, Rd, XX },
    1963   { "(bad)", XX, XX, XX },
    1964   /* 28 */
    1965   { "movapX", XM, EX, XX },
    1966   { "movapX", EX, XM, XX },
    1967   { PREGRP2 },
    1968   { "movntpX", Ev, XM, XX },
    1969   { PREGRP4 },
    1970   { PREGRP3 },
    1971   { "ucomisX", XM,EX, XX },
    1972   { "comisX", XM,EX, XX },
    1973   /* 30 */
    1974   { "wrmsr", XX, XX, XX },
    1975   { "rdtsc", XX, XX, XX },
    1976   { "rdmsr", XX, XX, XX },
    1977   { "rdpmc", XX, XX, XX },
    1978   { "sysenter", XX, XX, XX },
    1979   { "sysexit", XX, XX, XX },
    1980   { "(bad)", XX, XX, XX },
    1981   { "(bad)", XX, XX, XX },
    1982   /* 38 */
    1983   { "(bad)", XX, XX, XX },
    1984   { "(bad)", XX, XX, XX },
    1985   { "(bad)", XX, XX, XX },
    1986   { "(bad)", XX, XX, XX },
    1987   { "(bad)", XX, XX, XX },
    1988   { "(bad)", XX, XX, XX },
    1989   { "(bad)", XX, XX, XX },
    1990   { "(bad)", XX, XX, XX },
    1991   /* 40 */
    1992   { "cmovo", Gv, Ev, XX },
    1993   { "cmovno", Gv, Ev, XX },
    1994   { "cmovb", Gv, Ev, XX },
    1995   { "cmovae", Gv, Ev, XX },
    1996   { "cmove", Gv, Ev, XX },
    1997   { "cmovne", Gv, Ev, XX },
    1998   { "cmovbe", Gv, Ev, XX },
    1999   { "cmova", Gv, Ev, XX },
    2000   /* 48 */
    2001   { "cmovs", Gv, Ev, XX },
    2002   { "cmovns", Gv, Ev, XX },
    2003   { "cmovp", Gv, Ev, XX },
    2004   { "cmovnp", Gv, Ev, XX },
    2005   { "cmovl", Gv, Ev, XX },
    2006   { "cmovge", Gv, Ev, XX },
    2007   { "cmovle", Gv, Ev, XX },
    2008   { "cmovg", Gv, Ev, XX },
    2009   /* 50 */
    2010   { "movmskpX", Gd, XS, XX },
    2011   { PREGRP13 },
    2012   { PREGRP12 },
    2013   { PREGRP11 },
    2014   { "andpX", XM, EX, XX },
    2015   { "andnpX", XM, EX, XX },
    2016   { "orpX", XM, EX, XX },
    2017   { "xorpX", XM, EX, XX },
    2018   /* 58 */
    2019   { PREGRP0 },
    2020   { PREGRP10 },
    2021   { PREGRP17 },
    2022   { PREGRP16 },
    2023   { PREGRP14 },
    2024   { PREGRP7 },
    2025   { PREGRP5 },
    2026   { PREGRP6 },
    2027   /* 60 */
    2028   { "punpcklbw", MX, EM, XX },
    2029   { "punpcklwd", MX, EM, XX },
    2030   { "punpckldq", MX, EM, XX },
    2031   { "packsswb", MX, EM, XX },
    2032   { "pcmpgtb", MX, EM, XX },
    2033   { "pcmpgtw", MX, EM, XX },
    2034   { "pcmpgtd", MX, EM, XX },
    2035   { "packuswb", MX, EM, XX },
    2036   /* 68 */
    2037   { "punpckhbw", MX, EM, XX },
    2038   { "punpckhwd", MX, EM, XX },
    2039   { "punpckhdq", MX, EM, XX },
    2040   { "packssdw", MX, EM, XX },
    2041   { PREGRP26 },
    2042   { PREGRP24 },
    2043   { "movd", MX, Ed, XX },
    2044   { PREGRP19 },
    2045   /* 70 */
    2046   { PREGRP22 },
    2047   { GRP10 },
    2048   { GRP11 },
    2049   { GRP12 },
    2050   { "pcmpeqb", MX, EM, XX },
    2051   { "pcmpeqw", MX, EM, XX },
    2052   { "pcmpeqd", MX, EM, XX },
    2053   { "emms", XX, XX, XX },
    2054   /* 78 */
    2055   { "(bad)", XX, XX, XX },
    2056   { "(bad)", XX, XX, XX },
    2057   { "(bad)", XX, XX, XX },
    2058   { "(bad)", XX, XX, XX },
    2059   { "(bad)", XX, XX, XX },
    2060   { "(bad)", XX, XX, XX },
    2061   { PREGRP23 },
    2062   { PREGRP20 },
    2063   /* 80 */
    2064   { "jo", Jv, XX, XX },
    2065   { "jno", Jv, XX, XX },
    2066   { "jb", Jv, XX, XX },
    2067   { "jae", Jv, XX, XX },
    2068   { "je", Jv, XX, XX },
    2069   { "jne", Jv, XX, XX },
    2070   { "jbe", Jv, XX, XX },
    2071   { "ja", Jv, XX, XX },
    2072   /* 88 */
    2073   { "js", Jv, XX, XX },
    2074   { "jns", Jv, XX, XX },
    2075   { "jp", Jv, XX, XX },
    2076   { "jnp", Jv, XX, XX },
    2077   { "jl", Jv, XX, XX },
    2078   { "jge", Jv, XX, XX },
    2079   { "jle", Jv, XX, XX },
    2080   { "jg", Jv, XX, XX },
    2081   /* 90 */
    2082   { "seto", Eb, XX, XX },
    2083   { "setno", Eb, XX, XX },
    2084   { "setb", Eb, XX, XX },
    2085   { "setae", Eb, XX, XX },
    2086   { "sete", Eb, XX, XX },
    2087   { "setne", Eb, XX, XX },
    2088   { "setbe", Eb, XX, XX },
    2089   { "seta", Eb, XX, XX },
    2090   /* 98 */
    2091   { "sets", Eb, XX, XX },
    2092   { "setns", Eb, XX, XX },
    2093   { "setp", Eb, XX, XX },
    2094   { "setnp", Eb, XX, XX },
    2095   { "setl", Eb, XX, XX },
    2096   { "setge", Eb, XX, XX },
    2097   { "setle", Eb, XX, XX },
    2098   { "setg", Eb, XX, XX },
    2099   /* a0 */
    2100   { "push", fs, XX, XX },
    2101   { "pop", fs, XX, XX },
    2102   { "cpuid", XX, XX, XX },
    2103   { "bt", Ev, Gv, XX },
    2104   { "shld", Ev, Gv, Ib },
    2105   { "shld", Ev, Gv, CL },
    2106   { "(bad)", XX, XX, XX },
    2107   { "(bad)", XX, XX, XX },
    2108   /* a8 */
    2109   { "push", gs, XX, XX },
    2110   { "pop", gs, XX, XX },
    2111   { "rsm" , XX, XX, XX},
    2112   { "bts", Ev, Gv, XX },
    2113   { "shrd", Ev, Gv, Ib },
    2114   { "shrd", Ev, Gv, CL },
    2115   { GRP13 },
    2116   { "imul", Gv, Ev, XX },
    2117   /* b0 */
    2118   { "cmpxchg", Eb, Gb, XX },
    2119   { "cmpxchg", Ev, Gv, XX },
    2120   { "lss", Gv, Mp, XX },
    2121   { "btr", Ev, Gv, XX },
    2122   { "lfs", Gv, Mp, XX },
    2123   { "lgs", Gv, Mp, XX },
    2124   { "movzx", Gv, Eb, XX },
    2125   { "movzx", Gv, Ew, XX },
    2126   /* b8 */
    2127   { "(bad)", XX, XX, XX },
    2128   { "ud2b", XX, XX, XX },
    2129   { GRP8 },
    2130   { "btc", Ev, Gv, XX },
    2131   { "bsf", Gv, Ev, XX },
    2132   { "bsr", Gv, Ev, XX },
    2133   { "movsx", Gv, Eb, XX },
    2134   { "movsx", Gv, Ew, XX },
    2135   /* c0 */
    2136   { "xadd", Eb, Gb, XX },
    2137   { "xadd", Ev, Gv, XX },
    2138   { PREGRP1 },
    2139   { "movnti", Ev, Gv, XX },
    2140   { "pinsrw", MX, Ed, Ib },
    2141   { "pextrw", Gd, MS, Ib },
    2142   { "shufpX", XM, EX, Ib },
    2143   { GRP9 },
    2144   /* c8 */
    2145   { "bswap", RMeAX, XX, XX },   /* bswap doesn't support 16 bit regs */
    2146   { "bswap", RMeCX, XX, XX },
    2147   { "bswap", RMeDX, XX, XX },
    2148   { "bswap", RMeBX, XX, XX },
    2149   { "bswap", RMeSP, XX, XX },
    2150   { "bswap", RMeBP, XX, XX },
    2151   { "bswap", RMeSI, XX, XX },
    2152   { "bswap", RMeDI, XX, XX },
    2153   /* d0 */
    2154   { "(bad)", XX, XX, XX },
    2155   { "psrlw", MX, EM, XX },
    2156   { "psrld", MX, EM, XX },
    2157   { "psrlq", MX, EM, XX },
    2158   { "paddq", MX, EM, XX },
    2159   { "pmullw", MX, EM, XX },
    2160   { PREGRP21 },
    2161   { "pmovmskb", Gd, MS, XX },
    2162   /* d8 */
    2163   { "psubusb", MX, EM, XX },
    2164   { "psubusw", MX, EM, XX },
    2165   { "pminub", MX, EM, XX },
    2166   { "pand", MX, EM, XX },
    2167   { "paddusb", MX, EM, XX },
    2168   { "paddusw", MX, EM, XX },
    2169   { "pmaxub", MX, EM, XX },
    2170   { "pandn", MX, EM, XX },
    2171   /* e0 */
    2172   { "pavgb", MX, EM, XX },
    2173   { "psraw", MX, EM, XX },
    2174   { "psrad", MX, EM, XX },
    2175   { "pavgw", MX, EM, XX },
    2176   { "pmulhuw", MX, EM, XX },
    2177   { "pmulhw", MX, EM, XX },
    2178   { PREGRP15 },
    2179   { PREGRP25 },
    2180   /* e8 */
    2181   { "psubsb", MX, EM, XX },
    2182   { "psubsw", MX, EM, XX },
    2183   { "pminsw", MX, EM, XX },
    2184   { "por", MX, EM, XX },
    2185   { "paddsb", MX, EM, XX },
    2186   { "paddsw", MX, EM, XX },
    2187   { "pmaxsw", MX, EM, XX },
    2188   { "pxor", MX, EM, XX },
    2189   /* f0 */
    2190   { "(bad)", XX, XX, XX },
    2191   { "psllw", MX, EM, XX },
    2192   { "pslld", MX, EM, XX },
    2193   { "psllq", MX, EM, XX },
    2194   { "pmuludq", MX, EM, XX },
    2195   { "pmaddwd", MX, EM, XX },
    2196   { "psadbw", MX, EM, XX },
    2197   { PREGRP18 },
    2198   /* f8 */
    2199   { "psubb", MX, EM, XX },
    2200   { "psubw", MX, EM, XX },
    2201   { "psubd", MX, EM, XX },
    2202   { "psubq", MX, EM, XX },
    2203   { "paddb", MX, EM, XX },
    2204   { "paddw", MX, EM, XX },
    2205   { "paddd", MX, EM, XX },
    2206   { "(bad)", XX, XX, XX }
     1038  { "psubb",            MX, EM, XX },
     1039  { "psubw",            MX, EM, XX },
     1040  { "psubd",            MX, EM, XX },
     1041  { "psubq",            MX, EM, XX },
     1042  { "paddb",            MX, EM, XX },
     1043  { "paddw",            MX, EM, XX },
     1044  { "paddd",            MX, EM, XX },
     1045  { "(bad)",            XX, XX, XX }
    22071046};
    22081047
     
    22871126static int reg;
    22881127static unsigned char need_modrm;
    2289 static void oappend PARAMS ((const char *s));
    22901128
    22911129/* If we are accessing mod/rm/reg without need_modrm set, then the
     
    22941132#define MODRM_CHECK  if (!need_modrm) abort ()
    22951133
    2296 static const char *names64[] = {
    2297   "%rax","%rcx","%rdx","%rbx", "%rsp","%rbp","%rsi","%rdi",
     1134static const char **names64;
     1135static const char **names32;
     1136static const char **names16;
     1137static const char **names8;
     1138static const char **names8rex;
     1139static const char **names_seg;
     1140static const char **index16;
     1141
     1142static const char *intel_names64[] = {
     1143  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
     1144  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
     1145};
     1146static const char *intel_names32[] = {
     1147  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
     1148  "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
     1149};
     1150static const char *intel_names16[] = {
     1151  "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
     1152  "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
     1153};
     1154static const char *intel_names8[] = {
     1155  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
     1156};
     1157static const char *intel_names8rex[] = {
     1158  "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
     1159  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
     1160};
     1161static const char *intel_names_seg[] = {
     1162  "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
     1163};
     1164static const char *intel_index16[] = {
     1165  "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
     1166};
     1167
     1168static const char *att_names64[] = {
     1169  "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
    22981170  "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
    22991171};
    2300 static const char *names32[] = {
    2301   "%eax","%ecx","%edx","%ebx", "%esp","%ebp","%esi","%edi",
     1172static const char *att_names32[] = {
     1173  "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
    23021174  "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
    23031175};
    2304 static const char *names16[] = {
    2305   "%ax","%cx","%dx","%bx","%sp","%bp","%si","%di",
     1176static const char *att_names16[] = {
     1177  "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
    23061178  "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
    23071179};
    2308 static const char *names8[] = {
    2309   "%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh",
     1180static const char *att_names8[] = {
     1181  "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
    23101182};
    2311 static const char *names8rex[] = {
    2312   "%al","%cl","%dl","%bl","%spl", "%bpl", "%sil", "%dil",
     1183static const char *att_names8rex[] = {
     1184  "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
    23131185  "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
    23141186};
    2315 static const char *names_seg[] = {
    2316   "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
     1187static const char *att_names_seg[] = {
     1188  "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
    23171189};
    2318 static const char *index16[] = {
    2319   "%bx,%si","%bx,%di","%bp,%si","%bp,%di","%si","%di","%bp","%bx"
     1190static const char *att_index16[] = {
     1191  "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
    23201192};
    23211193
     
    24261298    { "notA",   Eb, XX, XX },
    24271299    { "negA",   Eb, XX, XX },
    2428     { "mulB",   AL, Eb, XX },
    2429     { "imulB",  AL, Eb, XX },
    2430     { "divB",   AL, Eb, XX },
    2431     { "idivB",  AL, Eb, XX }
     1300    { "mulA",   Eb, XX, XX },   /* Don't print the implicit %al register,  */
     1301    { "imulA",  Eb, XX, XX },   /* to distinguish these opcodes from other */
     1302    { "divA",   Eb, XX, XX },   /* mul/imul opcodes.  Do the same for div  */
     1303    { "idivA",  Eb, XX, XX }    /* and idiv for consistency.               */
    24321304  },
    24331305  /* GRP3S */
     
    24371309    { "notQ",   Ev, XX, XX },
    24381310    { "negQ",   Ev, XX, XX },
    2439     { "mulS",   eAX, Ev, XX },
    2440     { "imulS",  eAX, Ev, XX },
    2441     { "divS",   eAX, Ev, XX },
    2442     { "idivS",  eAX, Ev, XX },
     1311    { "mulQ",   Ev, XX, XX },   /* Don't print the implicit register.  */
     1312    { "imulQ",  Ev, XX, XX },
     1313    { "divQ",   Ev, XX, XX },
     1314    { "idivQ",  Ev, XX, XX },
    24431315  },
    24441316  /* GRP4 */
     
    24571329    { "incQ",   Ev, XX, XX },
    24581330    { "decQ",   Ev, XX, XX },
    2459     { "callI",  indirEv, XX, XX },
    2460     { "lcallI", indirEv, XX, XX },
    2461     { "jmpI",   indirEv, XX, XX },
    2462     { "ljmpI",  indirEv, XX, XX },
    2463     { "pushT",  Ev, XX, XX },
     1331    { "callT",  indirEv, XX, XX },
     1332    { "lcallT", indirEv, XX, XX },
     1333    { "jmpT",   indirEv, XX, XX },
     1334    { "ljmpT",  indirEv, XX, XX },
     1335    { "pushU",  Ev, XX, XX },
    24641336    { "(bad)",  XX, XX, XX },
    24651337  },
    24661338  /* GRP6 */
    24671339  {
    2468     { "sldt",   Ew, XX, XX },
    2469     { "str",    Ew, XX, XX },
     1340    { "sldtQ",  Ev, XX, XX },
     1341    { "strQ",   Ev, XX, XX },
    24701342    { "lldt",   Ew, XX, XX },
    24711343    { "ltr",    Ew, XX, XX },
     
    24771349  /* GRP7 */
    24781350  {
    2479     { "sgdt", Ew, XX, XX },
    2480     { "sidt", Ew, XX, XX },
    2481     { "lgdt", Ew, XX, XX },
    2482     { "lidt", Ew, XX, XX },
    2483     { "smsw", Ew, XX, XX },
    2484     { "(bad)", XX, XX, XX },
    2485     { "lmsw", Ew, XX, XX },
    2486     { "invlpg", Ew, XX, XX },
     1351    { "sgdtQ",   M, XX, XX },
     1352    { "sidtQ",   M, XX, XX },
     1353    { "lgdtQ",   M, XX, XX },
     1354    { "lidtQ",   M, XX, XX },
     1355    { "smswQ",  Ev, XX, XX },
     1356    { "(bad)",  XX, XX, XX },
     1357    { "lmsw",   Ew, XX, XX },
     1358    { "invlpg", Ew, XX, XX },
    24871359  },
    24881360  /* GRP8 */
     
    25511423    { "mfence", None, XX, XX },
    25521424    { "sfence", None, XX, XX },
    2553     /* FIXME: the sfence with memory operand is clflush! */
     1425    /* FIXME: the sfence with memory operand is clflush!  */
    25541426  },
    25551427  /* GRP14 */
     
    25751447    { "(bad)",  XX, XX, XX },
    25761448  }
    2577 
    25781449};
    25791450
     
    25881459  /* PREGRP1 */
    25891460  {
    2590     { "", XM, EX, OPSIMD },     /* See OP_SIMD_SUFFIX */
     1461    { "", XM, EX, OPSIMD },     /* See OP_SIMD_SUFFIX. */
    25911462    { "", XM, EX, OPSIMD },
    25921463    { "", XM, EX, OPSIMD },
     
    27421613  /* PREGRP23 */
    27431614  {
    2744     { "movd", Ed, MX, XX },
     1615    { "movd", Edq, MX, XX },
    27451616    { "movq", XM, EX, XX },
    2746     { "movd", Ed, XM, XX },
     1617    { "movd", Edq, XM, XX },
    27471618    { "(bad)", Ed, XM, XX },
    27481619  },
     
    27671638    { "punpcklqdq", XM, EX, XX },
    27681639    { "(bad)", XM, EX, XX },
     1640  },
     1641};
     1642
     1643static const struct dis386 x86_64_table[][2] = {
     1644  {
     1645    { "arpl", Ew, Gw, XX },
     1646    { "movs{||lq|xd}", Gv, Ed, XX },
    27691647  },
    27701648};
     
    29311809      return (sizeflag & DFLAG) ? "data16" : "data32";
    29321810    case 0x67:
    2933       return (sizeflag & AFLAG) ? "addr16" : "addr32";
     1811      if (mode_64bit)
     1812        return (sizeflag & AFLAG) ? "addr32" : "addr64";
     1813      else
     1814        return ((sizeflag & AFLAG) && !mode_64bit) ? "addr16" : "addr32";
    29341815    case FWAIT_OPCODE:
    29351816      return "fwait";
     
    29411822static char op1out[100], op2out[100], op3out[100];
    29421823static int op_ad, op_index[3];
    2943 static unsigned int op_address[3];
    2944 static unsigned int op_riprel[3];
     1824static bfd_vma op_address[3];
     1825static bfd_vma op_riprel[3];
    29451826static bfd_vma start_pc;
    2946 
    29471827
    29481828
     
    29561836 */
    29571837
    2958 static int print_insn_i386
    2959   PARAMS ((bfd_vma pc, disassemble_info *info));
    2960 
    29611838static char intel_syntax;
    29621839static char open_char;
     
    29651842static char scale_char;
    29661843
     1844/* Here for backwards compatibility.  When gdb stops using
     1845   print_insn_i386_att and print_insn_i386_intel these functions can
     1846   disappear, and print_insn_i386 be merged into print_insn.  */
    29671847int
    29681848print_insn_i386_att (pc, info)
     
    29711851{
    29721852  intel_syntax = 0;
    2973   open_char = '(';
    2974   close_char =  ')';
    2975   separator_char = ',';
    2976   scale_char = ',';
    2977 
    2978   return print_insn_i386 (pc, info);
     1853
     1854  return print_insn (pc, info);
    29791855}
    29801856
     
    29851861{
    29861862  intel_syntax = 1;
    2987   open_char = '[';
    2988   close_char = ']';
    2989   separator_char = '+';
    2990   scale_char = '*';
    2991 
    2992   return print_insn_i386 (pc, info);
     1863
     1864  return print_insn (pc, info);
     1865}
     1866
     1867int
     1868print_insn_i386 (pc, info)
     1869     bfd_vma pc;
     1870     disassemble_info *info;
     1871{
     1872  intel_syntax = -1;
     1873
     1874  return print_insn (pc, info);
    29931875}
    29941876
    29951877static int
    2996 print_insn_i386 (pc, info)
     1878print_insn (pc, info)
    29971879     bfd_vma pc;
    29981880     disassemble_info *info;
     
    30041886  int needcomma;
    30051887  unsigned char uses_SSE_prefix;
    3006   VOLATILE int sizeflag;
    3007   VOLATILE int orig_sizeflag;
    3008 
     1888  int sizeflag;
     1889  const char *p;
    30091890  struct dis_private priv;
    3010   bfd_byte *inbuf = priv.the_buffer;
    30111891
    30121892  mode_64bit = (info->mach == bfd_mach_x86_64_intel_syntax
    30131893                || info->mach == bfd_mach_x86_64);
     1894
     1895  if (intel_syntax == (char) -1)
     1896    intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
     1897                    || info->mach == bfd_mach_x86_64_intel_syntax);
    30141898
    30151899  if (info->mach == bfd_mach_i386_i386
     
    30171901      || info->mach == bfd_mach_i386_i386_intel_syntax
    30181902      || info->mach == bfd_mach_x86_64_intel_syntax)
    3019     sizeflag = AFLAG|DFLAG;
     1903    priv.orig_sizeflag = AFLAG | DFLAG;
    30201904  else if (info->mach == bfd_mach_i386_i8086)
    3021     sizeflag = 0;
     1905    priv.orig_sizeflag = 0;
    30221906  else
    30231907    abort ();
    3024   orig_sizeflag = sizeflag;
     1908
     1909  for (p = info->disassembler_options; p != NULL; )
     1910    {
     1911      if (strncmp (p, "x86-64", 6) == 0)
     1912        {
     1913          mode_64bit = 1;
     1914          priv.orig_sizeflag = AFLAG | DFLAG;
     1915        }
     1916      else if (strncmp (p, "i386", 4) == 0)
     1917        {
     1918          mode_64bit = 0;
     1919          priv.orig_sizeflag = AFLAG | DFLAG;
     1920        }
     1921      else if (strncmp (p, "i8086", 5) == 0)
     1922        {
     1923          mode_64bit = 0;
     1924          priv.orig_sizeflag = 0;
     1925        }
     1926      else if (strncmp (p, "intel", 5) == 0)
     1927        {
     1928          intel_syntax = 1;
     1929        }
     1930      else if (strncmp (p, "att", 3) == 0)
     1931        {
     1932          intel_syntax = 0;
     1933        }
     1934      else if (strncmp (p, "addr", 4) == 0)
     1935        {
     1936          if (p[4] == '1' && p[5] == '6')
     1937            priv.orig_sizeflag &= ~AFLAG;
     1938          else if (p[4] == '3' && p[5] == '2')
     1939            priv.orig_sizeflag |= AFLAG;
     1940        }
     1941      else if (strncmp (p, "data", 4) == 0)
     1942        {
     1943          if (p[4] == '1' && p[5] == '6')
     1944            priv.orig_sizeflag &= ~DFLAG;
     1945          else if (p[4] == '3' && p[5] == '2')
     1946            priv.orig_sizeflag |= DFLAG;
     1947        }
     1948      else if (strncmp (p, "suffix", 6) == 0)
     1949        priv.orig_sizeflag |= SUFFIX_ALWAYS;
     1950
     1951      p = strchr (p, ',');
     1952      if (p != NULL)
     1953        p++;
     1954    }
     1955
     1956  if (intel_syntax)
     1957    {
     1958      names64 = intel_names64;
     1959      names32 = intel_names32;
     1960      names16 = intel_names16;
     1961      names8 = intel_names8;
     1962      names8rex = intel_names8rex;
     1963      names_seg = intel_names_seg;
     1964      index16 = intel_index16;
     1965      open_char = '[';
     1966      close_char = ']';
     1967      separator_char = '+';
     1968      scale_char = '*';
     1969    }
     1970  else
     1971    {
     1972      names64 = att_names64;
     1973      names32 = att_names32;
     1974      names16 = att_names16;
     1975      names8 = att_names8;
     1976      names8rex = att_names8rex;
     1977      names_seg = att_names_seg;
     1978      index16 = att_index16;
     1979      open_char = '(';
     1980      close_char =  ')';
     1981      separator_char = ',';
     1982      scale_char = ',';
     1983    }
    30251984
    30261985  /* The output looks better if we put 7 bytes on a line, since that
     
    30412000  the_info = info;
    30422001  start_pc = pc;
    3043   start_codep = inbuf;
    3044   codep = inbuf;
     2002  start_codep = priv.the_buffer;
     2003  codep = priv.the_buffer;
    30452004
    30462005  if (setjmp (priv.bailout) != 0)
     
    30492008
    30502009      /* Getting here means we tried for data but didn't get it.  That
    3051         means we have an incomplete instruction of some sort.  Just
    3052         print the first byte as a prefix or a .byte pseudo-op.  */
    3053       if (codep > inbuf)
     2010        means we have an incomplete instruction of some sort.  Just
     2011        print the first byte as a prefix or a .byte pseudo-op.  */
     2012      if (codep > priv.the_buffer)
    30542013        {
    3055           name = prefix_name (inbuf[0], orig_sizeflag);
     2014          name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
    30562015          if (name != NULL)
    30572016            (*info->fprintf_func) (info->stream, "%s", name);
     
    30602019              /* Just print the first byte as a .byte instruction.  */
    30612020              (*info->fprintf_func) (info->stream, ".byte 0x%x",
    3062                                      (unsigned int) inbuf[0]);
     2021                                     (unsigned int) priv.the_buffer[0]);
    30632022            }
    30642023
     
    30732032
    30742033  insn_codep = codep;
     2034  sizeflag = priv.orig_sizeflag;
    30752035
    30762036  FETCH_DATA (info, codep + 1);
     
    30832043
    30842044      /* fwait not followed by floating point instruction.  Print the
    3085         first prefix, which is probably fwait itself.  */
    3086       name = prefix_name (inbuf[0], orig_sizeflag);
     2045        first prefix, which is probably fwait itself.  */
     2046      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
    30872047      if (name == NULL)
    30882048        name = INTERNAL_DISASSEMBLER_ERROR;
     
    30942054    {
    30952055      FETCH_DATA (info, codep + 2);
    3096       if (intel_syntax)
    3097         dp = &dis386_twobyte_intel[*++codep];
    3098       else
    3099         dp = &dis386_twobyte_att[*++codep];
     2056      dp = &dis386_twobyte[*++codep];
    31002057      need_modrm = twobyte_has_modrm[*codep];
    31012058      uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
     
    31032060  else
    31042061    {
    3105       if (intel_syntax)
    3106         if (mode_64bit)
    3107           dp = &dis386_64_intel[*codep];
    3108         else
    3109           dp = &dis386_intel[*codep];
    3110       else
    3111         if (mode_64bit)
    3112           dp = &disx86_64_att[*codep];
    3113         else
    3114           dp = &dis386_att[*codep];
     2062      dp = &dis386[*codep];
    31152063      need_modrm = onebyte_has_modrm[*codep];
    31162064      uses_SSE_prefix = 0;
     
    31372085    {
    31382086      sizeflag ^= AFLAG;
    3139       if (dp->bytemode2 != loop_jcxz_mode)
     2087      if (dp->bytemode3 != loop_jcxz_mode || intel_syntax)
    31402088        {
    3141           if (sizeflag & AFLAG)
     2089          if ((sizeflag & AFLAG) || mode_64bit)
    31422090            oappend ("addr32 ");
    31432091          else
     
    31502098    {
    31512099      sizeflag ^= DFLAG;
    3152       if (dp->bytemode2 == cond_jump_mode && dp->bytemode1 == v_mode)
     2100      if (dp->bytemode3 == cond_jump_mode
     2101          && dp->bytemode1 == v_mode
     2102          && !intel_syntax)
    31532103        {
    31542104          if (sizeflag & DFLAG)
     
    31602110    }
    31612111
    3162   if (dp->bytemode2 == cond_jump_mode || dp->bytemode2 == loop_jcxz_mode)
    3163     {
    3164       if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS)
    3165         {
    3166           oappend ("cs ");
    3167           used_prefixes |= PREFIX_CS;
    3168         }
    3169       if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
    3170         {
    3171           oappend ("ds ");
    3172           used_prefixes |= PREFIX_DS;
    3173         }
    3174     }
    3175 
    31762112  if (need_modrm)
    31772113    {
     
    31912127      if (dp->name == NULL)
    31922128        {
    3193           switch(dp->bytemode2)
     2129          switch (dp->bytemode1)
    31942130            {
    3195               case USE_GROUPS:
    3196                 dp = &grps[dp->bytemode1][reg];
    3197                 break;
    3198               case USE_PREFIX_USER_TABLE:
    3199                 index = 0;
    3200                 used_prefixes |= (prefixes & PREFIX_REPZ);
    3201                 if (prefixes & PREFIX_REPZ)
    3202                   index = 1;
    3203                 else
    3204                   {
    3205                     used_prefixes |= (prefixes & PREFIX_DATA);
    3206                     if (prefixes & PREFIX_DATA)
    3207                       index = 2;
    3208                     else
    3209                       {
    3210                         used_prefixes |= (prefixes & PREFIX_REPNZ);
    3211                         if (prefixes & PREFIX_REPNZ)
    3212                           index = 3;
    3213                       }
    3214                   }
    3215                 dp = &prefix_user_table[dp->bytemode1][index];
    3216                 break;
    3217               default:
    3218                 oappend (INTERNAL_DISASSEMBLER_ERROR);
    3219                 break;
     2131            case USE_GROUPS:
     2132              dp = &grps[dp->bytemode2][reg];
     2133              break;
     2134
     2135            case USE_PREFIX_USER_TABLE:
     2136              index = 0;
     2137              used_prefixes |= (prefixes & PREFIX_REPZ);
     2138              if (prefixes & PREFIX_REPZ)
     2139                index = 1;
     2140              else
     2141                {
     2142                  used_prefixes |= (prefixes & PREFIX_DATA);
     2143                  if (prefixes & PREFIX_DATA)
     2144                    index = 2;
     2145                  else
     2146                    {
     2147                      used_prefixes |= (prefixes & PREFIX_REPNZ);
     2148                      if (prefixes & PREFIX_REPNZ)
     2149                        index = 3;
     2150                    }
     2151                }
     2152              dp = &prefix_user_table[dp->bytemode2][index];
     2153              break;
     2154
     2155            case X86_64_SPECIAL:
     2156              dp = &x86_64_table[dp->bytemode2][mode_64bit];
     2157              break;
     2158
     2159            default:
     2160              oappend (INTERNAL_DISASSEMBLER_ERROR);
     2161              break;
    32202162            }
    32212163        }
    32222164
    3223       putop (dp->name, sizeflag);
    3224 
    3225       obufp = op1out;
    3226       op_ad = 2;
    3227       if (dp->op1)
    3228         (*dp->op1)(dp->bytemode1, sizeflag);
    3229 
    3230       obufp = op2out;
    3231       op_ad = 1;
    3232       if (dp->op2)
    3233         (*dp->op2)(dp->bytemode2, sizeflag);
    3234 
    3235       obufp = op3out;
    3236       op_ad = 0;
    3237       if (dp->op3)
    3238         (*dp->op3)(dp->bytemode3, sizeflag);
     2165      if (putop (dp->name, sizeflag) == 0)
     2166        {
     2167          obufp = op1out;
     2168          op_ad = 2;
     2169          if (dp->op1)
     2170            (*dp->op1) (dp->bytemode1, sizeflag);
     2171
     2172          obufp = op2out;
     2173          op_ad = 1;
     2174          if (dp->op2)
     2175            (*dp->op2) (dp->bytemode2, sizeflag);
     2176
     2177          obufp = op3out;
     2178          op_ad = 0;
     2179          if (dp->op3)
     2180            (*dp->op3) (dp->bytemode3, sizeflag);
     2181        }
    32392182    }
    32402183
     
    32472190      const char *name;
    32482191
    3249       name = prefix_name (inbuf[0], orig_sizeflag);
     2192      name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
    32502193      if (name == NULL)
    32512194        name = INTERNAL_DISASSEMBLER_ERROR;
     
    32562199    {
    32572200      const char *name;
    3258       name = prefix_name (rex | 0x40, orig_sizeflag);
     2201      name = prefix_name (rex | 0x40, priv.orig_sizeflag);
    32592202      if (name == NULL)
    32602203        name = INTERNAL_DISASSEMBLER_ERROR;
     
    33202263                                                + op_address[op_index[i]]), info);
    33212264      }
    3322   return codep - inbuf;
    3323 }
    3324 
    3325 static const char *float_mem_att[] = {
     2265  return codep - priv.the_buffer;
     2266}
     2267
     2268static const char *float_mem[] = {
    33262269  /* d8 */
    3327   "fadds",
    3328   "fmuls",
    3329   "fcoms",
    3330   "fcomps",
    3331   "fsubs",
    3332   "fsubrs",
    3333   "fdivs",
    3334   "fdivrs",
    3335   /*  d9 */
    3336   "flds",
     2270  "fadd{s||s|}",
     2271  "fmul{s||s|}",
     2272  "fcom{s||s|}",
     2273  "fcomp{s||s|}",
     2274  "fsub{s||s|}",
     2275  "fsubr{s||s|}",
     2276  "fdiv{s||s|}",
     2277  "fdivr{s||s|}",
     2278  /* d9 */
     2279  "fld{s||s|}",
    33372280  "(bad)",
    3338   "fsts",
    3339   "fstps",
     2281  "fst{s||s|}",
     2282  "fstp{s||s|}",
    33402283  "fldenv",
    33412284  "fldcw",
     
    33432286  "fNstcw",
    33442287  /* da */
    3345   "fiaddl",
    3346   "fimull",
    3347   "ficoml",
    3348   "ficompl",
    3349   "fisubl",
    3350   "fisubrl",
    3351   "fidivl",
    3352   "fidivrl",
     2288  "fiadd{l||l|}",
     2289  "fimul{l||l|}",
     2290  "ficom{l||l|}",
     2291  "ficomp{l||l|}",
     2292  "fisub{l||l|}",
     2293  "fisubr{l||l|}",
     2294  "fidiv{l||l|}",
     2295  "fidivr{l||l|}",
    33532296  /* db */
    3354   "fildl",
     2297  "fild{l||l|}",
    33552298  "(bad)",
    3356   "fistl",
    3357   "fistpl",
     2299  "fist{l||l|}",
     2300  "fistp{l||l|}",
    33582301  "(bad)",
    3359   "fldt",
     2302  "fld{t||t|}",
    33602303  "(bad)",
    3361   "fstpt",
     2304  "fstp{t||t|}",
    33622305  /* dc */
    3363   "faddl",
    3364   "fmull",
    3365   "fcoml",
    3366   "fcompl",
    3367   "fsubl",
    3368   "fsubrl",
    3369   "fdivl",
    3370   "fdivrl",
     2306  "fadd{l||l|}",
     2307  "fmul{l||l|}",
     2308  "fcom{l||l|}",
     2309  "fcomp{l||l|}",
     2310  "fsub{l||l|}",
     2311  "fsubr{l||l|}",
     2312  "fdiv{l||l|}",
     2313  "fdivr{l||l|}",
    33712314  /* dd */
    3372   "fldl",
     2315  "fld{l||l|}",
    33732316  "(bad)",
    3374   "fstl",
    3375   "fstpl",
     2317  "fst{l||l|}",
     2318  "fstp{l||l|}",
    33762319  "frstor",
    33772320  "(bad)",
     
    33932336  "fistp",
    33942337  "fbld",
    3395   "fildll",
    3396   "fbstp",
    3397   "fistpll",
    3398 };
    3399 
    3400 static const char *float_mem_intel[] = {
    3401   /* d8 */
    3402   "fadd",
    3403   "fmul",
    3404   "fcom",
    3405   "fcomp",
    3406   "fsub",
    3407   "fsubr",
    3408   "fdiv",
    3409   "fdivr",
    3410   /*  d9 */
    3411   "fld",
    3412   "(bad)",
    3413   "fst",
    3414   "fstp",
    3415   "fldenv",
    3416   "fldcw",
    3417   "fNstenv",
    3418   "fNstcw",
    3419   /* da */
    3420   "fiadd",
    3421   "fimul",
    3422   "ficom",
    3423   "ficomp",
    3424   "fisub",
    3425   "fisubr",
    3426   "fidiv",
    3427   "fidivr",
    3428   /* db */
    3429   "fild",
    3430   "(bad)",
    3431   "fist",
    3432   "fistp",
    3433   "(bad)",
    3434   "fld",
    3435   "(bad)",
    3436   "fstp",
    3437   /* dc */
    3438   "fadd",
    3439   "fmul",
    3440   "fcom",
    3441   "fcomp",
    3442   "fsub",
    3443   "fsubr",
    3444   "fdiv",
    3445   "fdivr",
    3446   /* dd */
    3447   "fld",
    3448   "(bad)",
    3449   "fst",
    3450   "fstp",
    3451   "frstor",
    3452   "(bad)",
    3453   "fNsave",
    3454   "fNstsw",
    3455   /* de */
    3456   "fiadd",
    3457   "fimul",
    3458   "ficom",
    3459   "ficomp",
    3460   "fisub",
    3461   "fisubr",
    3462   "fidiv",
    3463   "fidivr",
    3464   /* df */
    3465   "fild",
    3466   "(bad)",
    3467   "fist",
    3468   "fistp",
    3469   "fbld",
    3470   "fild",
     2338  "fild{ll||ll|}",
    34712339  "fbstp",
    34722340  "fistpll",
     
    35912459};
    35922460
    3593 
    35942461static char *fgrps[][8] = {
    35952462  /* d9_2  0 */
     
    36512518  if (mod != 3)
    36522519    {
    3653       if (intel_syntax)
    3654         putop (float_mem_intel[(floatop - 0xd8 ) * 8 + reg], sizeflag);
    3655       else
    3656         putop (float_mem_att[(floatop - 0xd8 ) * 8 + reg], sizeflag);
     2520      putop (float_mem[(floatop - 0xd8) * 8 + reg], sizeflag);
    36572521      obufp = op1out;
    36582522      if (floatop == 0xdb)
    3659         OP_E (x_mode, sizeflag);
     2523        OP_E (x_mode, sizeflag);
    36602524      else if (floatop == 0xdd)
    3661         OP_E (d_mode, sizeflag);
     2525        OP_E (d_mode, sizeflag);
    36622526      else
    3663         OP_E (v_mode, sizeflag);
     2527        OP_E (v_mode, sizeflag);
    36642528      return;
    36652529    }
    3666   /* skip mod/rm byte */
     2530  /* Skip mod/rm byte. */
    36672531  MODRM_CHECK;
    36682532  codep++;
     
    36732537      putop (fgrps[dp->bytemode1][rm], sizeflag);
    36742538
    3675       /* instruction fnstsw is only one with strange arg */
     2539      /* Instruction fnstsw is only one with strange arg. */
    36762540      if (floatop == 0xdf && codep[-1] == 0xe0)
    36772541        strcpy (op1out, names16[0]);
     
    36832547      obufp = op1out;
    36842548      if (dp->op1)
    3685         (*dp->op1)(dp->bytemode1, sizeflag);
     2549        (*dp->op1) (dp->bytemode1, sizeflag);
    36862550      obufp = op2out;
    36872551      if (dp->op2)
    3688         (*dp->op2)(dp->bytemode2, sizeflag);
    3689     }
    3690 }
    3691 
    3692 /* ARGSUSED */
     2552        (*dp->op2) (dp->bytemode2, sizeflag);
     2553    }
     2554}
     2555
    36932556static void
    3694 OP_ST (ignore, sizeflag)
    3695      int ignore ATTRIBUTE_UNUSED;
     2557OP_ST (bytemode, sizeflag)
     2558     int bytemode ATTRIBUTE_UNUSED;
    36962559     int sizeflag ATTRIBUTE_UNUSED;
    36972560{
     
    36992562}
    37002563
    3701 /* ARGSUSED */
    37022564static void
    3703 OP_STi (ignore, sizeflag)
    3704      int ignore ATTRIBUTE_UNUSED;
     2565OP_STi (bytemode, sizeflag)
     2566     int bytemode ATTRIBUTE_UNUSED;
    37052567     int sizeflag ATTRIBUTE_UNUSED;
    37062568{
    37072569  sprintf (scratchbuf, "%%st(%d)", rm);
    3708   oappend (scratchbuf);
    3709 }
    3710 
    3711 
    3712 /* capital letters in template are macros */
    3713 static void
     2570  oappend (scratchbuf + intel_syntax);
     2571}
     2572
     2573/* Capital letters in template are macros.  */
     2574static int
    37142575putop (template, sizeflag)
    37152576     const char *template;
     
    37172578{
    37182579  const char *p;
     2580  int alt;
    37192581
    37202582  for (p = template; *p; p++)
     
    37252587          *obufp++ = *p;
    37262588          break;
     2589        case '{':
     2590          alt = 0;
     2591          if (intel_syntax)
     2592            alt += 1;
     2593          if (mode_64bit)
     2594            alt += 2;
     2595          while (alt != 0)
     2596            {
     2597              while (*++p != '|')
     2598                {
     2599                  if (*p == '}')
     2600                    {
     2601                      /* Alternative not valid.  */
     2602                      strcpy (obuf, "(bad)");
     2603                      obufp = obuf + 5;
     2604                      return 1;
     2605                    }
     2606                  else if (*p == '\0')
     2607                    abort ();
     2608                }
     2609              alt--;
     2610            }
     2611          break;
     2612        case '|':
     2613          while (*++p != '}')
     2614            {
     2615              if (*p == '\0')
     2616                abort ();
     2617            }
     2618          break;
     2619        case '}':
     2620          break;
    37272621        case 'A':
    3728           if (intel_syntax)
    3729             break;
    3730           if (mod != 3
    3731 #ifdef SUFFIX_ALWAYS
    3732               || (sizeflag & SUFFIX_ALWAYS)
    3733 #endif
    3734               )
     2622          if (intel_syntax)
     2623            break;
     2624          if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
    37352625            *obufp++ = 'b';
    37362626          break;
    37372627        case 'B':
    3738           if (intel_syntax)
    3739             break;
    3740 #ifdef SUFFIX_ALWAYS
     2628          if (intel_syntax)
     2629            break;
    37412630          if (sizeflag & SUFFIX_ALWAYS)
    37422631            *obufp++ = 'b';
    3743 #endif
    37442632          break;
    37452633        case 'E':               /* For jcxz/jecxz */
    3746           if (sizeflag & AFLAG)
    3747             *obufp++ = 'e';
    3748           used_prefixes |= (prefixes & PREFIX_ADDR);
    3749           break;
    3750         case 'F':
    3751           if ((prefixes & PREFIX_ADDR)
    3752 #ifdef SUFFIX_ALWAYS
    3753               || (sizeflag & SUFFIX_ALWAYS)
    3754 #endif
    3755               )
     2634          if (mode_64bit)
    37562635            {
    37572636              if (sizeflag & AFLAG)
    3758                 *obufp++ = 'l';
     2637                *obufp++ = 'r';
    37592638              else
    3760                 *obufp++ = 'w';
     2639                *obufp++ = 'e';
     2640            }
     2641          else
     2642            if (sizeflag & AFLAG)
     2643              *obufp++ = 'e';
     2644          used_prefixes |= (prefixes & PREFIX_ADDR);
     2645          break;
     2646        case 'F':
     2647          if (intel_syntax)
     2648            break;
     2649          if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
     2650            {
     2651              if (sizeflag & AFLAG)
     2652                *obufp++ = mode_64bit ? 'q' : 'l';
     2653              else
     2654                *obufp++ = mode_64bit ? 'l' : 'w';
    37612655              used_prefixes |= (prefixes & PREFIX_ADDR);
    37622656            }
    37632657          break;
    3764         case 'I':
    3765           if (intel_syntax)
    3766             break;
    3767           if (mode_64bit)
    3768             *obufp++ = 'q';
    3769           else
     2658        case 'H':
     2659          if (intel_syntax)
     2660            break;
     2661          if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
     2662              || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
    37702663            {
    3771               if ((prefixes & PREFIX_DATA)
    3772 #ifdef SUFFIX_ALWAYS
    3773                   || (sizeflag & SUFFIX_ALWAYS)
    3774 #endif
    3775                   )
    3776                 {
    3777                   if (sizeflag & DFLAG)
    3778                     *obufp++ = 'l';
    3779                   else
    3780                     *obufp++ = 'w';
    3781                   used_prefixes |= (prefixes & PREFIX_DATA);
    3782               }
     2664              used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
     2665              *obufp++ = ',';
     2666              *obufp++ = 'p';
     2667              if (prefixes & PREFIX_DS)
     2668                *obufp++ = 't';
     2669              else
     2670                *obufp++ = 'n';
    37832671            }
    37842672          break;
    37852673        case 'L':
    3786           if (intel_syntax)
    3787             break;
    3788 #ifdef SUFFIX_ALWAYS
     2674          if (intel_syntax)
     2675            break;
    37892676          if (sizeflag & SUFFIX_ALWAYS)
    37902677            *obufp++ = 'l';
    3791 #endif
    37922678          break;
    37932679        case 'N':
     
    38002686          USED_REX (REX_MODE64);
    38012687          if (rex & REX_MODE64)
    3802               *obufp++ = 'o';
     2688            *obufp++ = 'o';
    38032689          else
    38042690            *obufp++ = 'd';
    38052691          break;
     2692        case 'T':
     2693          if (intel_syntax)
     2694            break;
     2695          if (mode_64bit)
     2696            {
     2697              *obufp++ = 'q';
     2698              break;
     2699            }
     2700          /* Fall through.  */
    38062701        case 'P':
    3807           if (intel_syntax)
    3808             break;
     2702          if (intel_syntax)
     2703            break;
    38092704          if ((prefixes & PREFIX_DATA)
    38102705              || (rex & REX_MODE64)
    3811 #ifdef SUFFIX_ALWAYS
    3812               || (sizeflag & SUFFIX_ALWAYS)
    3813 #endif
    3814               )
     2706              || (sizeflag & SUFFIX_ALWAYS))
    38152707            {
    38162708              USED_REX (REX_MODE64);
     
    38272719            }
    38282720          break;
     2721        case 'U':
     2722          if (intel_syntax)
     2723            break;
     2724          if (mode_64bit)
     2725            {
     2726              *obufp++ = 'q';
     2727              break;
     2728            }
     2729          /* Fall through.  */
    38292730        case 'Q':
    3830           if (intel_syntax)
    3831             break;
     2731          if (intel_syntax)
     2732            break;
    38322733          USED_REX (REX_MODE64);
    3833           if (mod != 3
    3834 #ifdef SUFFIX_ALWAYS
    3835               || (sizeflag & SUFFIX_ALWAYS)
    3836 #endif
    3837               )
     2734          if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
    38382735            {
    38392736              if (rex & REX_MODE64)
     
    38512748        case 'R':
    38522749          USED_REX (REX_MODE64);
    3853           if (intel_syntax)
     2750          if (intel_syntax)
    38542751            {
    38552752              if (rex & REX_MODE64)
     
    38822779          break;
    38832780        case 'S':
    3884           if (intel_syntax)
    3885             break;
    3886 #ifdef SUFFIX_ALWAYS
     2781          if (intel_syntax)
     2782            break;
    38872783          if (sizeflag & SUFFIX_ALWAYS)
    38882784            {
     
    38982794                }
    38992795            }
    3900 #endif
    3901           break;
    3902         case 'T':
    3903           if (intel_syntax)
    3904             break;
    3905           if (mode_64bit)
    3906             *obufp++ = 'q';
    3907           else if (mod != 3
    3908 #ifdef SUFFIX_ALWAYS
    3909                    || (sizeflag & SUFFIX_ALWAYS)
    3910 #endif
    3911                   )
    3912             {
    3913               if (sizeflag & DFLAG)
    3914                 *obufp++ = 'l';
    3915               else
    3916                 *obufp++ = 'w';
    3917               used_prefixes |= (prefixes & PREFIX_DATA);
    3918             }
    39192796          break;
    39202797        case 'X':
     
    39232800          else
    39242801            *obufp++ = 's';
    3925           used_prefixes |= (prefixes & PREFIX_DATA);
     2802          used_prefixes |= (prefixes & PREFIX_DATA);
    39262803          break;
    39272804        case 'Y':
    3928           if (intel_syntax)
    3929             break;
     2805          if (intel_syntax)
     2806            break;
    39302807          if (rex & REX_MODE64)
    39312808            {
     
    39442821          else
    39452822            *obufp++ = 'b';
    3946           if (intel_syntax)
     2823          if (intel_syntax)
    39472824            {
    39482825              if (rex)
     
    39672844    }
    39682845  *obufp = 0;
     2846  return 0;
    39692847}
    39702848
     
    39822860  if (prefixes & PREFIX_CS)
    39832861    {
    3984       oappend ("%cs:");
    39852862      used_prefixes |= PREFIX_CS;
     2863      oappend ("%cs:" + intel_syntax);
    39862864    }
    39872865  if (prefixes & PREFIX_DS)
    39882866    {
    3989       oappend ("%ds:");
    39902867      used_prefixes |= PREFIX_DS;
     2868      oappend ("%ds:" + intel_syntax);
    39912869    }
    39922870  if (prefixes & PREFIX_SS)
    39932871    {
    3994       oappend ("%ss:");
    39952872      used_prefixes |= PREFIX_SS;
     2873      oappend ("%ss:" + intel_syntax);
    39962874    }
    39972875  if (prefixes & PREFIX_ES)
    39982876    {
    3999       oappend ("%es:");
    40002877      used_prefixes |= PREFIX_ES;
     2878      oappend ("%es:" + intel_syntax);
    40012879    }
    40022880  if (prefixes & PREFIX_FS)
    40032881    {
    4004       oappend ("%fs:");
    40052882      used_prefixes |= PREFIX_FS;
     2883      oappend ("%fs:" + intel_syntax);
    40062884    }
    40072885  if (prefixes & PREFIX_GS)
    40082886    {
    4009       oappend ("%gs:");
    40102887      used_prefixes |= PREFIX_GS;
     2888      oappend ("%gs:" + intel_syntax);
    40112889    }
    40122890}
     
    40372915          buf[1] = 'x';
    40382916          sprintf_vma (tmp, disp);
    4039           for (i = 0; tmp[i] == '0' && tmp[i+1]; i++);
     2917          for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
    40402918          strcpy (buf + 2, tmp + i);
    40412919        }
     
    40492927              *(buf++) = '-';
    40502928              v = -disp;
    4051               /* Check for possible overflow on 0x8000000000000000 */
     2929              /* Check for possible overflow on 0x8000000000000000. */
    40522930              if (v < 0)
    40532931                {
     
    40662944          while (v)
    40672945            {
    4068               tmp[28-i] = (v % 10) + '0';
     2946              tmp[28 - i] = (v % 10) + '0';
    40692947              v /= 10;
    40702948              i++;
     
    40942972    add += 8;
    40952973
    4096   /* skip mod/rm byte */
     2974  /* Skip mod/rm byte. */
    40972975  MODRM_CHECK;
    40982976  codep++;
     
    41253003          break;
    41263004        case v_mode:
     3005        case dq_mode:
    41273006          USED_REX (REX_MODE64);
    41283007          if (rex & REX_MODE64)
    41293008            oappend (names64[rm + add]);
    4130           else if (sizeflag & DFLAG)
     3009          else if ((sizeflag & DFLAG) || bytemode == dq_mode)
    41313010            oappend (names32[rm + add]);
    41323011          else
     
    41353014          break;
    41363015        case 0:
    4137           if ( !(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */)
     3016          if (!(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */)
    41383017              && !(codep[-2] == 0xAE && codep[-1] == 0xF0 /* mfence */)
    41393018              && !(codep[-2] == 0xAE && codep[-1] == 0xe8 /* lfence */))
    4140             BadOp();    /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */
     3019            BadOp ();   /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */
    41413020          break;
    41423021        default:
     
    41503029  append_seg ();
    41513030
    4152   if (sizeflag & AFLAG) /* 32 bit address mode */
     3031  if ((sizeflag & AFLAG) || mode_64bit) /* 32 bit address mode */
    41533032    {
    41543033      int havesib;
     
    41843063            {
    41853064              havebase = 0;
    4186               if (mode_64bit && !havesib)
     3065              if (mode_64bit && !havesib && (sizeflag & AFLAG))
    41873066                riprel = 1;
    41883067              disp = get32s ();
     
    42013080
    42023081      if (!intel_syntax)
    4203         if (mod != 0 || (base & 7) == 5)
    4204           {
     3082        if (mod != 0 || (base & 7) == 5)
     3083          {
    42053084            print_operand_value (scratchbuf, !riprel, disp);
    4206             oappend (scratchbuf);
     3085            oappend (scratchbuf);
    42073086            if (riprel)
    42083087              {
     
    42103089                oappend ("(%rip)");
    42113090              }
    4212           }
     3091          }
    42133092
    42143093      if (havebase || (havesib && (index != 4 || scale != 0)))
    42153094        {
    4216           if (intel_syntax)
    4217             {
    4218               switch (bytemode)
    4219                 {
    4220                 case b_mode:
    4221                   oappend ("BYTE PTR ");
    4222                   break;
    4223                 case w_mode:
    4224                   oappend ("WORD PTR ");
    4225                   break;
    4226                 case v_mode:
    4227                   oappend ("DWORD PTR ");
    4228                   break;
    4229                 case d_mode:
    4230                   oappend ("QWORD PTR ");
    4231                   break;
    4232                 case m_mode:
     3095          if (intel_syntax)
     3096            {
     3097              switch (bytemode)
     3098                {
     3099                case b_mode:
     3100                  oappend ("BYTE PTR ");
     3101                  break;
     3102                case w_mode:
     3103                  oappend ("WORD PTR ");
     3104                  break;
     3105                case v_mode:
     3106                  oappend ("DWORD PTR ");
     3107                  break;
     3108                case d_mode:
     3109                  oappend ("QWORD PTR ");
     3110                  break;
     3111                case m_mode:
    42333112                  if (mode_64bit)
    42343113                    oappend ("DWORD PTR ");
     
    42363115                    oappend ("QWORD PTR ");
    42373116                  break;
    4238                 case x_mode:
    4239                   oappend ("XWORD PTR ");
    4240                   break;
    4241                 default:
    4242                   break;
    4243                 }
    4244              }
     3117                case x_mode:
     3118                  oappend ("XWORD PTR ");
     3119                  break;
     3120                default:
     3121                  break;
     3122                }
     3123             }
    42453124          *obufp++ = open_char;
    42463125          if (intel_syntax && riprel)
    42473126            oappend ("rip + ");
    4248           *obufp = '\0';
     3127          *obufp = '\0';
    42493128          USED_REX (REX_EXTZ);
    42503129          if (!havesib && (rex & REX_EXTZ))
    42513130            base += 8;
    42523131          if (havebase)
    4253             oappend (mode_64bit ? names64[base] : names32[base]);
     3132            oappend (mode_64bit && (sizeflag & AFLAG)
     3133                     ? names64[base] : names32[base]);
    42543134          if (havesib)
    42553135            {
    42563136              if (index != 4)
    42573137                {
    4258                   if (intel_syntax)
    4259                     {
    4260                       if (havebase)
    4261                         {
    4262                           *obufp++ = separator_char;
    4263                           *obufp = '\0';
    4264                         }
    4265                       sprintf (scratchbuf, "%s", mode_64bit ? names64[index] : names32[index]);
    4266                     }
    4267                   else
    4268                     sprintf (scratchbuf, ",%s", mode_64bit ? names64[index] : names32[index]);
     3138                  if (intel_syntax)
     3139                    {
     3140                      if (havebase)
     3141                        {
     3142                          *obufp++ = separator_char;
     3143                          *obufp = '\0';
     3144                        }
     3145                      sprintf (scratchbuf, "%s",
     3146                               mode_64bit && (sizeflag & AFLAG)
     3147                               ? names64[index] : names32[index]);
     3148                    }
     3149                  else
     3150                    sprintf (scratchbuf, ",%s",
     3151                             mode_64bit && (sizeflag & AFLAG)
     3152                             ? names64[index] : names32[index]);
    42693153                  oappend (scratchbuf);
    42703154                }
    4271               if (!intel_syntax
    4272                   || (intel_syntax
    4273                       && bytemode != b_mode
    4274                       && bytemode != w_mode
    4275                       && bytemode != v_mode))
    4276                 {
    4277                   *obufp++ = scale_char;
    4278                   *obufp = '\0';
    4279                   sprintf (scratchbuf, "%d", 1 << scale);
    4280                   oappend (scratchbuf);
    4281                 }
     3155              if (!intel_syntax
     3156                  || (intel_syntax
     3157                      && bytemode != b_mode
     3158                      && bytemode != w_mode
     3159                      && bytemode != v_mode))
     3160                {
     3161                  *obufp++ = scale_char;
     3162                  *obufp = '\0';
     3163                  sprintf (scratchbuf, "%d", 1 << scale);
     3164                  oappend (scratchbuf);
     3165                }
    42823166            }
    4283           if (intel_syntax)
    4284             if (mod != 0 || (base & 7) == 5)
    4285               {
    4286                 /* Don't print zero displacements */
    4287                 if (disp != 0)
    4288                   {
     3167          if (intel_syntax)
     3168            if (mod != 0 || (base & 7) == 5)
     3169              {
     3170                /* Don't print zero displacements.  */
     3171                if (disp != 0)
     3172                  {
     3173                    if ((bfd_signed_vma) disp > 0)
     3174                      {
     3175                        *obufp++ = '+';
     3176                        *obufp = '\0';
     3177                      }
     3178
    42893179                    print_operand_value (scratchbuf, 0, disp);
    4290                     oappend (scratchbuf);
    4291                   }
    4292               }
     3180                    oappend (scratchbuf);
     3181                  }
     3182              }
    42933183
    42943184          *obufp++ = close_char;
    4295           *obufp = '\0';
     3185          *obufp = '\0';
    42963186        }
    42973187      else if (intel_syntax)
    4298         {
    4299           if (mod != 0 || (base & 7) == 5)
    4300             {
     3188        {
     3189          if (mod != 0 || (base & 7) == 5)
     3190            {
    43013191              if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
    43023192                              | PREFIX_ES | PREFIX_FS | PREFIX_GS))
     
    43043194              else
    43053195                {
    4306                   oappend (names_seg[3]);
     3196                  oappend (names_seg[ds_reg - es_reg]);
    43073197                  oappend (":");
    43083198                }
    43093199              print_operand_value (scratchbuf, 1, disp);
    4310               oappend (scratchbuf);
    4311             }
    4312         }
     3200              oappend (scratchbuf);
     3201            }
     3202        }
    43133203    }
    43143204  else
     
    43383228
    43393229      if (!intel_syntax)
    4340         if (mod != 0 || (rm & 7) == 6)
    4341           {
     3230        if (mod != 0 || (rm & 7) == 6)
     3231          {
    43423232            print_operand_value (scratchbuf, 0, disp);
    4343             oappend (scratchbuf);
    4344           }
     3233            oappend (scratchbuf);
     3234          }
    43453235
    43463236      if (mod != 0 || (rm & 7) != 6)
    43473237        {
    43483238          *obufp++ = open_char;
    4349           *obufp = '\0';
     3239          *obufp = '\0';
    43503240          oappend (index16[rm + add]);
    4351           *obufp++ = close_char;
    4352           *obufp = '\0';
     3241          *obufp++ = close_char;
     3242          *obufp = '\0';
    43533243        }
    43543244    }
     
    44013291get64 ()
    44023292{
    4403   unsigned int a = 0;
    4404   unsigned int b = 0;
    4405   bfd_vma x = 0;
    4406 
     3293  bfd_vma x;
    44073294#ifdef BFD64
     3295  unsigned int a;
     3296  unsigned int b;
     3297
    44083298  FETCH_DATA (the_info, codep + 8);
    44093299  a = *codep++ & 0xff;
     
    44113301  a |= (*codep++ & 0xff) << 16;
    44123302  a |= (*codep++ & 0xff) << 24;
    4413   b |= (*codep++ & 0xff);
     3303  b = *codep++ & 0xff;
    44143304  b |= (*codep++ & 0xff) << 8;
    44153305  b |= (*codep++ & 0xff) << 16;
     
    44173307  x = a + ((bfd_vma) b << 32);
    44183308#else
    4419   abort();
     3309  abort ();
     3310  x = 0;
    44203311#endif
    44213312  return x;
     
    44643355static void
    44653356set_op (op, riprel)
    4466      unsigned int op;
     3357     bfd_vma op;
    44673358     int riprel;
    44683359{
    44693360  op_index[op_ad] = op_ad;
    4470   op_address[op_ad] = op;
    4471   op_riprel[op_ad] = riprel;
     3361  if (mode_64bit)
     3362    {
     3363      op_address[op_ad] = op;
     3364      op_riprel[op_ad] = riprel;
     3365    }
     3366  else
     3367    {
     3368      /* Mask to get a 32-bit address.  */
     3369      op_address[op_ad] = op & 0xffffffff;
     3370      op_riprel[op_ad] = riprel & 0xffffffff;
     3371    }
    44723372}
    44733373
     
    44863386    {
    44873387    case indir_dx_reg:
    4488       s = "(%dx)";
     3388      if (intel_syntax)
     3389        s = "[dx]";
     3390      else
     3391        s = "(%dx)";
    44893392      break;
    44903393    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
     
    45043407        s = names8[code - al_reg];
    45053408      break;
     3409    case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
     3410    case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
     3411      if (mode_64bit)
     3412        {
     3413          s = names64[code - rAX_reg + add];
     3414          break;
     3415        }
     3416      code += eAX_reg - rAX_reg;
     3417      /* Fall through.  */
    45063418    case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
    45073419    case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
     
    45153427      used_prefixes |= (prefixes & PREFIX_DATA);
    45163428      break;
    4517     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
    4518     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
    4519       s = names64[code - rAX_reg + add];
    4520       break;
    45213429    default:
    45223430      s = INTERNAL_DISASSEMBLER_ERROR;
     
    45363444    {
    45373445    case indir_dx_reg:
    4538       s = "(%dx)";
     3446      if (intel_syntax)
     3447        s = "[dx]";
     3448      else
     3449        s = "(%dx)";
    45393450      break;
    45403451    case ax_reg: case cx_reg: case dx_reg: case bx_reg:
     
    45883499      break;
    45893500    case q_mode:
    4590       op = get32s ();
    4591       break;
     3501      if (mode_64bit)
     3502        {
     3503          op = get32s ();
     3504          break;
     3505        }
     3506      /* Fall through.  */
    45923507    case v_mode:
    45933508      USED_REX (REX_MODE64);
     
    46173532  op &= mask;
    46183533  scratchbuf[0] = '$';
    4619   print_operand_value (scratchbuf + !intel_syntax, 1, op);
    4620   oappend (scratchbuf);
     3534  print_operand_value (scratchbuf + 1, 1, op);
     3535  oappend (scratchbuf + intel_syntax);
    46213536  scratchbuf[0] = '\0';
    46223537}
     
    46293544  bfd_signed_vma op;
    46303545  bfd_signed_vma mask = -1;
     3546
     3547  if (!mode_64bit)
     3548    {
     3549      OP_I (bytemode, sizeflag);
     3550      return;
     3551    }
    46313552
    46323553  switch (bytemode)
     
    46643585  op &= mask;
    46653586  scratchbuf[0] = '$';
    4666   print_operand_value (scratchbuf + !intel_syntax, 1, op);
    4667   oappend (scratchbuf);
     3587  print_operand_value (scratchbuf + 1, 1, op);
     3588  oappend (scratchbuf + intel_syntax);
    46683589  scratchbuf[0] = '\0';
    46693590}
     
    46983619        {
    46993620          mask = 0xffffffff;
    4700           op = get16();
     3621          op = get16 ();
    47013622          if ((op & 0x8000) != 0)
    47023623            op -= 0x10000;
     
    47173638  scratchbuf[0] = '$';
    47183639  print_operand_value (scratchbuf + 1, 1, op);
    4719   oappend (scratchbuf);
     3640  oappend (scratchbuf + intel_syntax);
    47203641}
    47213642
     
    47263647{
    47273648  bfd_vma disp;
    4728   int mask = -1;
     3649  bfd_vma mask = -1;
    47293650
    47303651  switch (bytemode)
     
    47423663        {
    47433664          disp = get16 ();
    4744           /* for some reason, a data16 prefix on a jump instruction
     3665          /* For some reason, a data16 prefix on a jump instruction
    47453666             means that the pc is masked to 16 bits after the
    47463667             displacement is added!  */
     
    47583679}
    47593680
    4760 /* ARGSUSED */
    47613681static void
    47623682OP_SEG (dummy, sizeflag)
     
    47643684     int sizeflag ATTRIBUTE_UNUSED;
    47653685{
    4766   static char *sreg[] = {
    4767     "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
    4768   };
    4769 
    4770   oappend (sreg[reg]);
    4771 }
    4772 
    4773 /* ARGSUSED */
     3686  oappend (names_seg[reg]);
     3687}
     3688
    47743689static void
    47753690OP_DIR (dummy, sizeflag)
     
    47903705    }
    47913706  used_prefixes |= (prefixes & PREFIX_DATA);
    4792   sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
     3707  if (intel_syntax)
     3708    sprintf (scratchbuf, "0x%x,0x%x", seg, offset);
     3709  else
     3710    sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
    47933711  oappend (scratchbuf);
    47943712}
    47953713
    4796 /* ARGSUSED */
    47973714static void
    4798 OP_OFF (ignored, sizeflag)
    4799      int ignored ATTRIBUTE_UNUSED;
     3715OP_OFF (bytemode, sizeflag)
     3716     int bytemode ATTRIBUTE_UNUSED;
    48003717     int sizeflag;
    48013718{
     
    48043721  append_seg ();
    48053722
    4806   if (sizeflag & AFLAG)
     3723  if ((sizeflag & AFLAG) || mode_64bit)
    48073724    off = get32 ();
    48083725  else
     
    48123729    {
    48133730      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
    4814                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
     3731                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
    48153732        {
    4816           oappend (names_seg[3]);
     3733          oappend (names_seg[ds_reg - es_reg]);
    48173734          oappend (":");
    48183735        }
     
    48213738  oappend (scratchbuf);
    48223739}
    4823 /* ARGSUSED */
     3740
    48243741static void
    4825 OP_OFF64 (ignored, sizeflag)
    4826      int ignored ATTRIBUTE_UNUSED;
     3742OP_OFF64 (bytemode, sizeflag)
     3743     int bytemode ATTRIBUTE_UNUSED;
    48273744     int sizeflag ATTRIBUTE_UNUSED;
    48283745{
    48293746  bfd_vma off;
    48303747
     3748  if (!mode_64bit)
     3749    {
     3750      OP_OFF (bytemode, sizeflag);
     3751      return;
     3752    }
     3753
    48313754  append_seg ();
    48323755
    4833   off = get64();
     3756  off = get64 ();
    48343757
    48353758  if (intel_syntax)
    48363759    {
    48373760      if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
    4838                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
     3761                        | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
    48393762        {
    4840           oappend (names_seg[3]);
     3763          oappend (names_seg[ds_reg - es_reg]);
    48413764          oappend (":");
    48423765        }
     
    48523775{
    48533776  const char *s;
    4854   oappend ("(");
     3777  if (intel_syntax)
     3778    oappend ("[");
     3779  else
     3780    oappend ("(");
     3781
    48553782  USED_REX (REX_MODE64);
    48563783  if (rex & REX_MODE64)
    4857     s = names64[code - eAX_reg];
     3784    {
     3785      if (!(sizeflag & AFLAG))
     3786        s = names32[code - eAX_reg];
     3787      else
     3788        s = names64[code - eAX_reg];
     3789    }
    48583790  else if (sizeflag & AFLAG)
    48593791    s = names32[code - eAX_reg];
     
    48613793    s = names16[code - eAX_reg];
    48623794  oappend (s);
    4863   oappend (")");
     3795  if (intel_syntax)
     3796    oappend ("]");
     3797  else
     3798    oappend (")");
    48643799}
    48653800
     
    48693804     int sizeflag;
    48703805{
    4871   oappend ("%es:");
     3806  oappend ("%es:" + intel_syntax);
    48723807  ptr_reg (code, sizeflag);
    48733808}
     
    48863821          | PREFIX_GS)) == 0)
    48873822    prefixes |= PREFIX_DS;
    4888   append_seg();
     3823  append_seg ();
    48893824  ptr_reg (code, sizeflag);
    48903825}
    48913826
    4892 /* ARGSUSED */
    48933827static void
    48943828OP_C (dummy, sizeflag)
     
    49003834  if (rex & REX_EXTX)
    49013835    add = 8;
    4902   sprintf (scratchbuf, "%%cr%d", reg+add);
    4903   oappend (scratchbuf);
    4904 }
    4905 
    4906 /* ARGSUSED */
     3836  sprintf (scratchbuf, "%%cr%d", reg + add);
     3837  oappend (scratchbuf + intel_syntax);
     3838}
     3839
    49073840static void
    49083841OP_D (dummy, sizeflag)
     
    49143847  if (rex & REX_EXTX)
    49153848    add = 8;
    4916   sprintf (scratchbuf, "%%db%d", reg+add);
     3849  if (intel_syntax)
     3850    sprintf (scratchbuf, "db%d", reg + add);
     3851  else
     3852    sprintf (scratchbuf, "%%db%d", reg + add);
    49173853  oappend (scratchbuf);
    49183854}
    49193855
    4920 /* ARGSUSED */
    49213856static void
    49223857OP_T (dummy, sizeflag)
     
    49253860{
    49263861  sprintf (scratchbuf, "%%tr%d", reg);
    4927   oappend (scratchbuf);
     3862  oappend (scratchbuf + intel_syntax);
    49283863}
    49293864
     
    49363871    OP_E (bytemode, sizeflag);
    49373872  else
    4938     BadOp();
     3873    BadOp ();
    49393874}
    49403875
    49413876static void
    4942 OP_MMX (ignore, sizeflag)
    4943      int ignore ATTRIBUTE_UNUSED;
     3877OP_MMX (bytemode, sizeflag)
     3878     int bytemode ATTRIBUTE_UNUSED;
    49443879     int sizeflag ATTRIBUTE_UNUSED;
    49453880{
     
    49533888  else
    49543889    sprintf (scratchbuf, "%%mm%d", reg + add);
    4955   oappend (scratchbuf);
     3890  oappend (scratchbuf + intel_syntax);
    49563891}
    49573892
     
    49663901    add = 8;
    49673902  sprintf (scratchbuf, "%%xmm%d", reg + add);
    4968   oappend (scratchbuf);
     3903  oappend (scratchbuf + intel_syntax);
    49693904}
    49703905
     
    49843919    add = 8;
    49853920
    4986   /* skip mod/rm byte */
     3921  /* Skip mod/rm byte. */
    49873922  MODRM_CHECK;
    49883923  codep++;
     
    49923927  else
    49933928    sprintf (scratchbuf, "%%mm%d", rm + add);
    4994   oappend (scratchbuf);
     3929  oappend (scratchbuf + intel_syntax);
    49953930}
    49963931
     
    50103945    add = 8;
    50113946
    5012   /* skip mod/rm byte */
     3947  /* Skip mod/rm byte. */
    50133948  MODRM_CHECK;
    50143949  codep++;
    50153950  sprintf (scratchbuf, "%%xmm%d", rm + add);
    5016   oappend (scratchbuf);
     3951  oappend (scratchbuf + intel_syntax);
    50173952}
    50183953
     
    50253960    OP_EM (bytemode, sizeflag);
    50263961  else
    5027     BadOp();
     3962    BadOp ();
    50283963}
    50293964
     
    50363971    OP_EX (bytemode, sizeflag);
    50373972  else
    5038     BadOp();
    5039 }
    5040 
    5041 static const char *Suffix3DNow[] = {
     3973    BadOp ();
     3974}
     3975
     3976static const char *const Suffix3DNow[] = {
    50423977/* 00 */        NULL,           NULL,           NULL,           NULL,
    50433978/* 04 */        NULL,           NULL,           NULL,           NULL,
     
    51174052     place where an 8-bit immediate would normally go.  ie. the last
    51184053     byte of the instruction.  */
    5119   obufp = obuf + strlen(obuf);
     4054  obufp = obuf + strlen (obuf);
    51204055  mnemonic = Suffix3DNow[*codep++ & 0xff];
    51214056  if (mnemonic)
     
    51294064      op1out[0] = '\0';
    51304065      op2out[0] = '\0';
    5131       BadOp();
    5132     }
    5133 }
    5134 
    5135 
    5136 static const char *simd_cmp_op [] = {
     4066      BadOp ();
     4067    }
     4068}
     4069
     4070static const char *simd_cmp_op[] = {
    51374071  "eq",
    51384072  "lt",
     
    51534087
    51544088  FETCH_DATA (the_info, codep + 1);
    5155   obufp = obuf + strlen(obuf);
     4089  obufp = obuf + strlen (obuf);
    51564090  cmp_type = *codep++ & 0xff;
    51574091  if (cmp_type < 8)
     
    51834117      op1out[0] = '\0';
    51844118      op2out[0] = '\0';
    5185       BadOp();
     4119      BadOp ();
    51864120    }
    51874121}
     
    51964130  if (mod == 3)
    51974131    {
    5198       char *p = obuf + strlen(obuf);
    5199       *(p+1) = '\0';
    5200       *p     = *(p-1);
    5201       *(p-1) = *(p-2);
    5202       *(p-2) = *(p-3);
    5203       *(p-3) = extrachar;
    5204     }
    5205 }
    5206 
    5207 static void BadOp (void)
    5208 {
    5209   codep = insn_codep + 1;       /* throw away prefixes and 1st. opcode byte */
     4132      char *p = obuf + strlen (obuf);
     4133      *(p + 1) = '\0';
     4134      *p       = *(p - 1);
     4135      *(p - 1) = *(p - 2);
     4136      *(p - 2) = *(p - 3);
     4137      *(p - 3) = extrachar;
     4138    }
     4139}
     4140
     4141static void
     4142BadOp (void)
     4143{
     4144  /* Throw away prefixes and 1st. opcode byte.  */
     4145  codep = insn_codep + 1;
    52104146  oappend ("(bad)");
    52114147}
Note: See TracChangeset for help on using the changeset viewer.