This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

i386-dis.c cleanup


I've been meaning to merge the insn decode tables for a long time.

opcodes/ChangeLog
	* i386-dis.c: Group function prototypes in one place.
	(FLOATCODE): Redefine as 1.
	(USE_GROUPS): Redefine as 2.
	(USE_PREFIX_USER_TABLE): Redefine as 3.
	(X86_64_SPECIAL): Define as 4.
	(GRP1b..GRPAMD): Move USE_GROUPS to bytecode1, index to bytecode2.
	(PREGRP0..PREGRP26): Similarly with USE_PREFIX_USER_TABLE.
	(dis386_att, dis386_intel, disx86_64_att, disx86_64_intel): Delete.
	(dis386): New table combining above four tables.
	(dis386_twobyte_att, dis386_twobyte_intel): Delete.
	(dis386_twobyte): New table combining above two tables.
	(x86_64_table): New table to handle x86_64.
	(X86_64_0): Define.
	(float_mem_att, float_mem_intel): Delet.
	(float_mem): New table combining above two tables.
	(print_insn_i386): Modify for above.
	(dofloat): Likewise.
	(putop): Handle '{', '|' and '}' to select alternative mnemonics.
	Return 0 on success, 1 if no valid alternative.
	(putop <case 'F'>, <case 'H'>): Print nothing for intel_syntax.
	(putop <case 'T'>): Move to case 'U', and share case 'Q' code.
	(putop <case 'I'>): Move to case 'T', and share case 'P' code.
	(OP_REG <case rAX_reg .. rDI_reg>): Handle as for eAX_reg .. eDI_reg
	if not 64-bit mode.
	(OP_I <case q_mode>): Handle as for v_mode if not 64-bit mode.
	(OP_I64): If not 64-bit mode, call OP_I.
	OP_OFF64): If not 64-bit mode, call OP_OFF.
	(OP_ST, OP_STi, OP_SEG, OP_DIR, OP_OFF, OP_OFF64, OP_MMX): Rename
	'ignore'/'ignored' to 'bytemode'.

-- 
Alan Modra

Index: opcodes/i386-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/i386-dis.c,v
retrieving revision 1.25
diff -c -p -r1.25 i386-dis.c
*** i386-dis.c	2001/06/10 14:07:12	1.25
--- i386-dis.c	2001/06/11 13:07:17
*************** Foundation, Inc., 59 Temple Place - Suit
*** 50,55 ****
--- 50,100 ----
  #endif
  
  static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
+ static void ckprefix PARAMS ((void));
+ static const char *prefix_name PARAMS ((int, int));
+ static int print_insn_i386 PARAMS ((bfd_vma, disassemble_info *));
+ static void dofloat PARAMS ((int));
+ static void OP_ST PARAMS ((int, int));
+ static void OP_STi  PARAMS ((int, int));
+ static int putop PARAMS ((const char *, int));
+ static void oappend PARAMS ((const char *));
+ static void append_seg PARAMS ((void));
+ static void OP_indirE PARAMS ((int, int));
+ static void print_operand_value PARAMS ((char *, int, bfd_vma));
+ static void OP_E PARAMS ((int, int));
+ static void OP_G PARAMS ((int, int));
+ static bfd_vma get64 PARAMS ((void));
+ static bfd_signed_vma get32 PARAMS ((void));
+ static bfd_signed_vma get32s PARAMS ((void));
+ static int get16 PARAMS ((void));
+ static void set_op PARAMS ((unsigned int, int));
+ static void OP_REG PARAMS ((int, int));
+ static void OP_IMREG PARAMS ((int, int));
+ static void OP_I PARAMS ((int, int));
+ static void OP_I64 PARAMS ((int, int));
+ static void OP_sI PARAMS ((int, int));
+ static void OP_J PARAMS ((int, int));
+ static void OP_SEG PARAMS ((int, int));
+ static void OP_DIR PARAMS ((int, int));
+ static void OP_OFF PARAMS ((int, int));
+ static void OP_OFF64 PARAMS ((int, int));
+ static void ptr_reg PARAMS ((int, int));
+ static void OP_ESreg PARAMS ((int, int));
+ static void OP_DSreg PARAMS ((int, int));
+ static void OP_C PARAMS ((int, int));
+ static void OP_D PARAMS ((int, int));
+ static void OP_T PARAMS ((int, int));
+ static void OP_Rd PARAMS ((int, int));
+ static void OP_MMX PARAMS ((int, int));
+ static void OP_XMM PARAMS ((int, int));
+ static void OP_EM PARAMS ((int, int));
+ static void OP_EX PARAMS ((int, int));
+ static void OP_MS PARAMS ((int, int));
+ static void OP_XS PARAMS ((int, int));
+ static void OP_3DNowSuffix PARAMS ((int, int));
+ static void OP_SIMD_Suffix PARAMS ((int, int));
+ static void SIMD_Fixup PARAMS ((int, int));
+ static void BadOp PARAMS ((void));
  
  struct dis_private
  {
*************** fetch_data (info, addr)
*** 260,313 ****
  #define AFLAG 2
  #define DFLAG 1
  
- typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
- 
- static void OP_E PARAMS ((int, int));
- static void OP_G PARAMS ((int, int));
- static void OP_I PARAMS ((int, int));
- static void OP_I64 PARAMS ((int, int));
- static void OP_OFF PARAMS ((int, int));
- static void OP_REG PARAMS ((int, int));
- static void OP_IMREG PARAMS ((int, int));
- static void OP_OFF64 PARAMS ((int, int));
- static void OP_indirE PARAMS ((int, int));
- static void OP_sI PARAMS ((int, int));
- static void OP_REG PARAMS ((int, int));
- static void OP_J PARAMS ((int, int));
- static void OP_DIR PARAMS ((int, int));
- static void OP_OFF PARAMS ((int, int));
- static void OP_ESreg PARAMS ((int, int));
- static void OP_DSreg PARAMS ((int, int));
- static void OP_SEG PARAMS ((int, int));
- static void OP_C PARAMS ((int, int));
- static void OP_D PARAMS ((int, int));
- static void OP_T PARAMS ((int, int));
- static void OP_Rd PARAMS ((int, int));
- static void OP_ST PARAMS ((int, int));
- static void OP_STi  PARAMS ((int, int));
- static void OP_MMX PARAMS ((int, int));
- static void OP_XMM PARAMS ((int, int));
- static void OP_EM PARAMS ((int, int));
- static void OP_EX PARAMS ((int, int));
- static void OP_MS PARAMS ((int, int));
- static void OP_XS PARAMS ((int, int));
- static void OP_3DNowSuffix PARAMS ((int, int));
- static void OP_SIMD_Suffix PARAMS ((int, int));
- static void SIMD_Fixup PARAMS ((int, int));
- 
- static void append_seg PARAMS ((void));
- static void set_op PARAMS ((unsigned int op, int));
- static void putop PARAMS ((const char *template, int sizeflag));
- static void dofloat PARAMS ((int sizeflag));
- static int get16 PARAMS ((void));
- static bfd_vma get64 PARAMS ((void));
- static bfd_signed_vma get32 PARAMS ((void));
- static bfd_signed_vma get32s PARAMS ((void));
- static void ckprefix PARAMS ((void));
- static const char *prefix_name PARAMS ((int, int));
- static void ptr_reg PARAMS ((int, int));
- static void BadOp PARAMS ((void));
- 
  #define b_mode 1  /* byte operand */
  #define v_mode 2  /* operand size depends on prefixes */
  #define w_mode 3  /* word operand */
--- 305,310 ----
*************** static void BadOp PARAMS ((void));
*** 363,425 ****
  
  #define indir_dx_reg 150
  
! #define USE_GROUPS 1
! #define USE_PREFIX_USER_TABLE 2
  
! #define GRP1b NULL, NULL, 0, NULL, USE_GROUPS, NULL, 0
! #define GRP1S NULL, NULL, 1, NULL, USE_GROUPS, NULL, 0
! #define GRP1Ss NULL, NULL, 2, NULL, USE_GROUPS, NULL, 0
! #define GRP2b NULL, NULL, 3, NULL, USE_GROUPS, NULL, 0
! #define GRP2S NULL, NULL, 4, NULL, USE_GROUPS, NULL, 0
! #define GRP2b_one NULL, NULL, 5, NULL, USE_GROUPS, NULL, 0
! #define GRP2S_one NULL, NULL, 6, NULL, USE_GROUPS, NULL, 0
! #define GRP2b_cl NULL, NULL, 7, NULL, USE_GROUPS, NULL, 0
! #define GRP2S_cl NULL, NULL, 8, NULL, USE_GROUPS, NULL, 0
! #define GRP3b NULL, NULL, 9, NULL, USE_GROUPS, NULL, 0
! #define GRP3S NULL, NULL, 10, NULL, USE_GROUPS, NULL, 0
! #define GRP4  NULL, NULL, 11, NULL, USE_GROUPS, NULL, 0
! #define GRP5  NULL, NULL, 12, NULL, USE_GROUPS, NULL, 0
! #define GRP6  NULL, NULL, 13, NULL, USE_GROUPS, NULL, 0
! #define GRP7 NULL, NULL, 14, NULL, USE_GROUPS, NULL, 0
! #define GRP8 NULL, NULL, 15, NULL, USE_GROUPS, NULL, 0
! #define GRP9 NULL, NULL, 16, NULL, USE_GROUPS, NULL, 0
! #define GRP10 NULL, NULL, 17, NULL, USE_GROUPS, NULL, 0
! #define GRP11 NULL, NULL, 18, NULL, USE_GROUPS, NULL, 0
! #define GRP12 NULL, NULL, 19, NULL, USE_GROUPS, NULL, 0
! #define GRP13 NULL, NULL, 20, NULL, USE_GROUPS, NULL, 0
! #define GRP14 NULL, NULL, 21, NULL, USE_GROUPS, NULL, 0
! #define GRPAMD NULL, NULL, 22, NULL, USE_GROUPS, NULL, 0
! 
! #define PREGRP0 NULL, NULL, 0, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP1 NULL, NULL, 1, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP2 NULL, NULL, 2, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP3 NULL, NULL, 3, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP4 NULL, NULL, 4, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP5 NULL, NULL, 5, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP6 NULL, NULL, 6, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP7 NULL, NULL, 7, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP8 NULL, NULL, 8, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP9 NULL, NULL, 9, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP10 NULL, NULL, 10, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP11 NULL, NULL, 11, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP12 NULL, NULL, 12, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP13 NULL, NULL, 13, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP14 NULL, NULL, 14, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP15 NULL, NULL, 15, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP16 NULL, NULL, 16, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP17 NULL, NULL, 17, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP18 NULL, NULL, 18, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP19 NULL, NULL, 19, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP20 NULL, NULL, 20, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP21 NULL, NULL, 21, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP22 NULL, NULL, 22, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP23 NULL, NULL, 23, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP24 NULL, NULL, 24, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP25 NULL, NULL, 25, NULL, USE_PREFIX_USER_TABLE, NULL, 0
! #define PREGRP26 NULL, NULL, 26, NULL, USE_PREFIX_USER_TABLE, NULL, 0
  
! #define FLOATCODE 50
! #define FLOAT NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
  
  struct dis386 {
    const char *name;
--- 360,427 ----
  
  #define indir_dx_reg 150
  
! #define FLOATCODE 1
! #define USE_GROUPS 2
! #define USE_PREFIX_USER_TABLE 3
! #define X86_64_SPECIAL 4
! 
! #define FLOAT	  NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
! 
! #define GRP1b	  NULL, NULL, USE_GROUPS, NULL,  0, NULL, 0
! #define GRP1S	  NULL, NULL, USE_GROUPS, NULL,  1, NULL, 0
! #define GRP1Ss	  NULL, NULL, USE_GROUPS, NULL,  2, NULL, 0
! #define GRP2b	  NULL, NULL, USE_GROUPS, NULL,  3, NULL, 0
! #define GRP2S	  NULL, NULL, USE_GROUPS, NULL,  4, NULL, 0
! #define GRP2b_one NULL, NULL, USE_GROUPS, NULL,  5, NULL, 0
! #define GRP2S_one NULL, NULL, USE_GROUPS, NULL,  6, NULL, 0
! #define GRP2b_cl  NULL, NULL, USE_GROUPS, NULL,  7, NULL, 0
! #define GRP2S_cl  NULL, NULL, USE_GROUPS, NULL,  8, NULL, 0
! #define GRP3b	  NULL, NULL, USE_GROUPS, NULL,  9, NULL, 0
! #define GRP3S	  NULL, NULL, USE_GROUPS, NULL, 10, NULL, 0
! #define GRP4	  NULL, NULL, USE_GROUPS, NULL, 11, NULL, 0
! #define GRP5	  NULL, NULL, USE_GROUPS, NULL, 12, NULL, 0
! #define GRP6	  NULL, NULL, USE_GROUPS, NULL, 13, NULL, 0
! #define GRP7	  NULL, NULL, USE_GROUPS, NULL, 14, NULL, 0
! #define GRP8	  NULL, NULL, USE_GROUPS, NULL, 15, NULL, 0
! #define GRP9	  NULL, NULL, USE_GROUPS, NULL, 16, NULL, 0
! #define GRP10	  NULL, NULL, USE_GROUPS, NULL, 17, NULL, 0
! #define GRP11	  NULL, NULL, USE_GROUPS, NULL, 18, NULL, 0
! #define GRP12	  NULL, NULL, USE_GROUPS, NULL, 19, NULL, 0
! #define GRP13	  NULL, NULL, USE_GROUPS, NULL, 20, NULL, 0
! #define GRP14	  NULL, NULL, USE_GROUPS, NULL, 21, NULL, 0
! #define GRPAMD	  NULL, NULL, USE_GROUPS, NULL, 22, NULL, 0
! 
! #define PREGRP0   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  0, NULL, 0
! #define PREGRP1   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  1, NULL, 0
! #define PREGRP2   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  2, NULL, 0
! #define PREGRP3   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  3, NULL, 0
! #define PREGRP4   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  4, NULL, 0
! #define PREGRP5   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  5, NULL, 0
! #define PREGRP6   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  6, NULL, 0
! #define PREGRP7   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  7, NULL, 0
! #define PREGRP8   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  8, NULL, 0
! #define PREGRP9   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  9, NULL, 0
! #define PREGRP10  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 10, NULL, 0
! #define PREGRP11  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 11, NULL, 0
! #define PREGRP12  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 12, NULL, 0
! #define PREGRP13  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 13, NULL, 0
! #define PREGRP14  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 14, NULL, 0
! #define PREGRP15  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 15, NULL, 0
! #define PREGRP16  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 16, NULL, 0
! #define PREGRP17  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 17, NULL, 0
! #define PREGRP18  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 18, NULL, 0
! #define PREGRP19  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 19, NULL, 0
! #define PREGRP20  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 20, NULL, 0
! #define PREGRP21  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 21, NULL, 0
! #define PREGRP22  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 22, NULL, 0
! #define PREGRP23  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 23, NULL, 0
! #define PREGRP24  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 24, NULL, 0
! #define PREGRP25  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 25, NULL, 0
! #define PREGRP26  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 26, NULL, 0
  
! #define X86_64_0  NULL, NULL, X86_64_SPECIAL, NULL,  0, NULL, 0
  
! typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
  
  struct dis386 {
    const char *name;
*************** struct dis386 {
*** 443,1581 ****
     'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
                                or suffix_always is true
  	  print 'q' if rex prefix is present.
-    'I' => print 'q' in 64bit mode and behave as 'P' otherwise
     'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always is true
     'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode)
     'S' => print 'w', 'l' or 'q' if suffix_always is true
!    'T' => print 'q' in 64bit mode and behave as 'I' otherwise
     'X' => print 's', 'd' depending on data16 prefix (for XMM)
     'W' => print 'b' or 'w' ("w" or "de" in intel mode)
     'Y' => 'q' if instruction has an REX 64bit overwrite prefix
- */
- 
- static const struct dis386 dis386_att[] = {
-   /* 00 */
-   { "addB",	Eb, Gb, XX },
-   { "addS",	Ev, Gv, XX },
-   { "addB",	Gb, Eb, XX },
-   { "addS",	Gv, Ev, XX },
-   { "addB",	AL, Ib, XX },
-   { "addS",	eAX, Iv, XX },
-   { "pushI",	es, XX, XX },
-   { "popI",	es, XX, XX },
-   /* 08 */
-   { "orB",	Eb, Gb, XX },
-   { "orS",	Ev, Gv, XX },
-   { "orB",	Gb, Eb, XX },
-   { "orS",	Gv, Ev, XX },
-   { "orB",	AL, Ib, XX },
-   { "orS",	eAX, Iv, XX },
-   { "pushI",	cs, XX, XX },
-   { "(bad)",	XX, XX, XX },	/* 0x0f extended opcode escape */
-   /* 10 */
-   { "adcB",	Eb, Gb, XX },
-   { "adcS",	Ev, Gv, XX },
-   { "adcB",	Gb, Eb, XX },
-   { "adcS",	Gv, Ev, XX },
-   { "adcB",	AL, Ib, XX },
-   { "adcS",	eAX, Iv, XX },
-   { "pushI",	ss, XX, XX },
-   { "popI",	ss, XX, XX },
-   /* 18 */
-   { "sbbB",	Eb, Gb, XX },
-   { "sbbS",	Ev, Gv, XX },
-   { "sbbB",	Gb, Eb, XX },
-   { "sbbS",	Gv, Ev, XX },
-   { "sbbB",	AL, Ib, XX },
-   { "sbbS",	eAX, Iv, XX },
-   { "pushI",	ds, XX, XX },
-   { "popI",	ds, XX, XX },
-   /* 20 */
-   { "andB",	Eb, Gb, XX },
-   { "andS",	Ev, Gv, XX },
-   { "andB",	Gb, Eb, XX },
-   { "andS",	Gv, Ev, XX },
-   { "andB",	AL, Ib, XX },
-   { "andS",	eAX, Iv, XX },
-   { "(bad)",	XX, XX, XX },			/* SEG ES prefix */
-   { "daa",	XX, XX, XX },
-   /* 28 */
-   { "subB",	Eb, Gb, XX },
-   { "subS",	Ev, Gv, XX },
-   { "subB",	Gb, Eb, XX },
-   { "subS",	Gv, Ev, XX },
-   { "subB",	AL, Ib, XX },
-   { "subS",	eAX, Iv, XX },
-   { "(bad)",	XX, XX, XX },			/* SEG CS prefix */
-   { "das",	XX, XX, XX },
-   /* 30 */
-   { "xorB",	Eb, Gb, XX },
-   { "xorS",	Ev, Gv, XX },
-   { "xorB",	Gb, Eb, XX },
-   { "xorS",	Gv, Ev, XX },
-   { "xorB",	AL, Ib, XX },
-   { "xorS",	eAX, Iv, XX },
-   { "(bad)",	XX, XX, XX },			/* SEG SS prefix */
-   { "aaa",	XX, XX, XX },
-   /* 38 */
-   { "cmpB",	Eb, Gb, XX },
-   { "cmpS",	Ev, Gv, XX },
-   { "cmpB",	Gb, Eb, XX },
-   { "cmpS",	Gv, Ev, XX },
-   { "cmpB",	AL, Ib, XX },
-   { "cmpS",	eAX, Iv, XX },
-   { "(bad)",	XX, XX, XX },			/* SEG DS prefix */
-   { "aas",	XX, XX, XX },
-   /* 40 */
-   { "incS",	RMeAX, XX, XX },
-   { "incS",	RMeCX, XX, XX },
-   { "incS",	RMeDX, XX, XX },
-   { "incS",	RMeBX, XX, XX },
-   { "incS",	RMeSP, XX, XX },
-   { "incS",	RMeBP, XX, XX },
-   { "incS",	RMeSI, XX, XX },
-   { "incS",	RMeDI, XX, XX },
-   /* 48 */
-   { "decS",	RMeAX, XX, XX },
-   { "decS",	RMeCX, XX, XX },
-   { "decS",	RMeDX, XX, XX },
-   { "decS",	RMeBX, XX, XX },
-   { "decS",	RMeSP, XX, XX },
-   { "decS",	RMeBP, XX, XX },
-   { "decS",	RMeSI, XX, XX },
-   { "decS",	RMeDI, XX, XX },
-   /* 50 */
-   { "pushS",	RMeAX, XX, XX },
-   { "pushS",	RMeCX, XX, XX },
-   { "pushS",	RMeDX, XX, XX },
-   { "pushS",	RMeBX, XX, XX },
-   { "pushS",	RMeSP, XX, XX },
-   { "pushS",	RMeBP, XX, XX },
-   { "pushS",	RMeSI, XX, XX },
-   { "pushS",	RMeDI, XX, XX },
-   /* 58 */
-   { "popS",	RMeAX, XX, XX },
-   { "popS",	RMeCX, XX, XX },
-   { "popS",	RMeDX, XX, XX },
-   { "popS",	RMeBX, XX, XX },
-   { "popS",	RMeSP, XX, XX },
-   { "popS",	RMeBP, XX, XX },
-   { "popS",	RMeSI, XX, XX },
-   { "popS",	RMeDI, XX, XX },
-   /* 60 */
-   { "pushaP",	XX, XX, XX },
-   { "popaP",	XX, XX, XX },
-   { "boundS",	Gv, Ma, XX },
-   { "arpl",	Ew, Gw, XX },
-   { "(bad)",	XX, XX, XX },			/* seg fs */
-   { "(bad)",	XX, XX, XX },			/* seg gs */
-   { "(bad)",	XX, XX, XX },			/* op size prefix */
-   { "(bad)",	XX, XX, XX },			/* adr size prefix */
-   /* 68 */
-   { "pushI",	Iv, XX, XX },		/* 386 book wrong */
-   { "imulS",	Gv, Ev, Iv },
-   { "pushI",	sIb, XX, XX },	/* push of byte really pushes 2 or 4 bytes */
-   { "imulS",	Gv, Ev, sIb },
-   { "insb",	Yb, indirDX, XX },
-   { "insR",	Yv, indirDX, XX },
-   { "outsb",	indirDX, Xb, XX },
-   { "outsR",	indirDX, Xv, XX },
-   /* 70 */
-   { "joH",	Jb, cond_jump_flag, XX },
-   { "jnoH",	Jb, cond_jump_flag, XX },
-   { "jbH",	Jb, cond_jump_flag, XX },
-   { "jaeH",	Jb, cond_jump_flag, XX },
-   { "jeH",	Jb, cond_jump_flag, XX },
-   { "jneH",	Jb, cond_jump_flag, XX },
-   { "jbeH",	Jb, cond_jump_flag, XX },
-   { "jaH",	Jb, cond_jump_flag, XX },
-   /* 78 */
-   { "jsH",	Jb, cond_jump_flag, XX },
-   { "jnsH",	Jb, cond_jump_flag, XX },
-   { "jpH",	Jb, cond_jump_flag, XX },
-   { "jnpH",	Jb, cond_jump_flag, XX },
-   { "jlH",	Jb, cond_jump_flag, XX },
-   { "jgeH",	Jb, cond_jump_flag, XX },
-   { "jleH",	Jb, cond_jump_flag, XX },
-   { "jgH",	Jb, cond_jump_flag, XX },
-   /* 80 */
-   { GRP1b },
-   { GRP1S },
-   { "(bad)",	XX, XX, XX },
-   { GRP1Ss },
-   { "testB",	Eb, Gb, XX },
-   { "testS",	Ev, Gv, XX },
-   { "xchgB",	Eb, Gb, XX },
-   { "xchgS",	Ev, Gv, XX },
-   /* 88 */
-   { "movB",	Eb, Gb, XX },
-   { "movS",	Ev, Gv, XX },
-   { "movB",	Gb, Eb, XX },
-   { "movS",	Gv, Ev, XX },
-   { "movQ",	Ev, Sw, XX },
-   { "leaS",	Gv, M, XX },
-   { "movQ",	Sw, Ev, XX },
-   { "popT",	Ev, XX, XX },
-   /* 90 */
-   { "nop",	XX, XX, XX },
-   /* FIXME: NOP with REPz prefix is called PAUSE.  */
-   { "xchgS",	RMeCX, eAX, XX },
-   { "xchgS",	RMeDX, eAX, XX },
-   { "xchgS",	RMeBX, eAX, XX },
-   { "xchgS",	RMeSP, eAX, XX },
-   { "xchgS",	RMeBP, eAX, XX },
-   { "xchgS",	RMeSI, eAX, XX },
-   { "xchgS",	RMeDI, eAX, XX },
-   /* 98 */
-   { "cWtR",	XX, XX, XX },
-   { "cRtO",	XX, XX, XX },
-   { "lcallI",	Ap, XX, XX },
-   { "(bad)",	XX, XX, XX },		/* fwait */
-   { "pushfI",	XX, XX, XX },
-   { "popfI",	XX, XX, XX },
-   { "sahf",	XX, XX, XX },
-   { "lahf",	XX, XX, XX },
-   /* a0 */
-   { "movB",	AL, Ob, XX },
-   { "movS",	eAX, Ov, XX },
-   { "movB",	Ob, AL, XX },
-   { "movS",	Ov, eAX, XX },
-   { "movsb",	Yb, Xb, XX },
-   { "movsR",	Yv, Xv, XX },
-   { "cmpsb",	Xb, Yb, XX },
-   { "cmpsR",	Xv, Yv, XX },
-   /* a8 */
-   { "testB",	AL, Ib, XX },
-   { "testS",	eAX, Iv, XX },
-   { "stosB",	Yb, AL, XX },
-   { "stosS",	Yv, eAX, XX },
-   { "lodsB",	AL, Xb, XX },
-   { "lodsS",	eAX, Xv, XX },
-   { "scasB",	AL, Yb, XX },
-   { "scasS",	eAX, Yv, XX },
-   /* b0 */
-   { "movB",	RMAL, Ib, XX },
-   { "movB",	RMCL, Ib, XX },
-   { "movB",	RMDL, Ib, XX },
-   { "movB",	RMBL, Ib, XX },
-   { "movB",	RMAH, Ib, XX },
-   { "movB",	RMCH, Ib, XX },
-   { "movB",	RMDH, Ib, XX },
-   { "movB",	RMBH, Ib, XX },
-   /* b8 */
-   { "movS",	RMeAX, Iv, XX },
-   { "movS",	RMeCX, Iv, XX },
-   { "movS",	RMeDX, Iv, XX },
-   { "movS",	RMeBX, Iv, XX },
-   { "movS",	RMeSP, Iv, XX },
-   { "movS",	RMeBP, Iv, XX },
-   { "movS",	RMeSI, Iv, XX },
-   { "movS",	RMeDI, Iv, XX },
-   /* c0 */
-   { GRP2b },
-   { GRP2S },
-   { "retI",	Iw, XX, XX },
-   { "retI",	XX, XX, XX },
-   { "lesS",	Gv, Mp, XX },
-   { "ldsS",	Gv, Mp, XX },
-   { "movA",	Eb, Ib, XX },
-   { "movQ",	Ev, Iv, XX },
-   /* c8 */
-   { "enterI",	Iw, Ib, XX },
-   { "leaveI",	XX, XX, XX },
-   { "lretP",	Iw, XX, XX },
-   { "lretP",	XX, XX, XX },
-   { "int3",	XX, XX, XX },
-   { "int",	Ib, XX, XX },
-   { "into",	XX, XX, XX},
-   { "iretP",	XX, XX, XX },
-   /* d0 */
-   { GRP2b_one },
-   { GRP2S_one },
-   { GRP2b_cl },
-   { GRP2S_cl },
-   { "aam",	sIb, XX, XX },
-   { "aad",	sIb, XX, XX },
-   { "(bad)",	XX, XX, XX },
-   { "xlat",	DSBX, XX, XX },
-   /* d8 */
-   { FLOAT },
-   { FLOAT },
-   { FLOAT },
-   { FLOAT },
-   { FLOAT },
-   { FLOAT },
-   { FLOAT },
-   { FLOAT },
-   /* e0 */
-   { "loopneFH",	Jb, loop_jcxz_flag, XX },
-   { "loopeFH",	Jb, loop_jcxz_flag, XX },
-   { "loopFH",	Jb, loop_jcxz_flag, XX },
-   { "jEcxzH",	Jb, loop_jcxz_flag, XX },
-   { "inB",	AL, Ib, XX },
-   { "inS",	eAX, Ib, XX },
-   { "outB",	Ib, AL, XX },
-   { "outS",	Ib, eAX, XX },
-   /* e8 */
-   { "callI",	Jv, XX, XX },
-   { "jmpI",	Jv, XX, XX },
-   { "ljmpI",	Ap, XX, XX },
-   { "jmp",	Jb, XX, XX },
-   { "inB",	AL, indirDX, XX },
-   { "inS",	eAX, indirDX, XX },
-   { "outB",	indirDX, AL, XX },
-   { "outS",	indirDX, eAX, XX },
-   /* f0 */
-   { "(bad)",	XX, XX, XX },			/* lock prefix */
-   { "(bad)",	XX, XX, XX },
-   { "(bad)",	XX, XX, XX },			/* repne */
-   { "(bad)",	XX, XX, XX },			/* repz */
-   { "hlt",	XX, XX, XX },
-   { "cmc",	XX, XX, XX },
-   { GRP3b },
-   { GRP3S },
-   /* f8 */
-   { "clc",	XX, XX, XX },
-   { "stc",	XX, XX, XX },
-   { "cli",	XX, XX, XX },
-   { "sti",	XX, XX, XX },
-   { "cld",	XX, XX, XX },
-   { "std",	XX, XX, XX },
-   { GRP4 },
-   { GRP5 },
- };
  
! static const struct dis386 dis386_intel[] = {
!   /* 00 */
!   { "add",	Eb, Gb, XX },
!   { "add",	Ev, Gv, XX },
!   { "add",	Gb, Eb, XX },
!   { "add",	Gv, Ev, XX },
!   { "add",	AL, Ib, XX },
!   { "add",	eAX, Iv, XX },
!   { "push",	es, XX, XX },
!   { "pop",	es, XX, XX },
!   /* 08 */
!   { "or",	Eb, Gb, XX },
!   { "or",	Ev, Gv, XX },
!   { "or",	Gb, Eb, XX },
!   { "or",	Gv, Ev, XX },
!   { "or",	AL, Ib, XX },
!   { "or",	eAX, Iv, XX },
!   { "push",	cs, XX, XX },
!   { "(bad)",	XX, XX, XX },	/* 0x0f extended opcode escape */
!   /* 10 */
!   { "adc",	Eb, Gb, XX },
!   { "adc",	Ev, Gv, XX },
!   { "adc",	Gb, Eb, XX },
!   { "adc",	Gv, Ev, XX },
!   { "adc",	AL, Ib, XX },
!   { "adc",	eAX, Iv, XX },
!   { "push",	ss, XX, XX },
!   { "pop",	ss, XX, XX },
!   /* 18 */
!   { "sbb",	Eb, Gb, XX },
!   { "sbb",	Ev, Gv, XX },
!   { "sbb",	Gb, Eb, XX },
!   { "sbb",	Gv, Ev, XX },
!   { "sbb",	AL, Ib, XX },
!   { "sbb",	eAX, Iv, XX },
!   { "push",	ds, XX, XX },
!   { "pop",	ds, XX, XX },
!   /* 20 */
!   { "and",	Eb, Gb, XX },
!   { "and",	Ev, Gv, XX },
!   { "and",	Gb, Eb, XX },
!   { "and",	Gv, Ev, XX },
!   { "and",	AL, Ib, XX },
!   { "and",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG ES prefix */
!   { "daa",	XX, XX, XX },
!   /* 28 */
!   { "sub",	Eb, Gb, XX },
!   { "sub",	Ev, Gv, XX },
!   { "sub",	Gb, Eb, XX },
!   { "sub",	Gv, Ev, XX },
!   { "sub",	AL, Ib, XX },
!   { "sub",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG CS prefix */
!   { "das",	XX, XX, XX },
!   /* 30 */
!   { "xor",	Eb, Gb, XX },
!   { "xor",	Ev, Gv, XX },
!   { "xor",	Gb, Eb, XX },
!   { "xor",	Gv, Ev, XX },
!   { "xor",	AL, Ib, XX },
!   { "xor",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG SS prefix */
!   { "aaa",	XX, XX, XX },
!   /* 38 */
!   { "cmp",	Eb, Gb, XX },
!   { "cmp",	Ev, Gv, XX },
!   { "cmp",	Gb, Eb, XX },
!   { "cmp",	Gv, Ev, XX },
!   { "cmp",	AL, Ib, XX },
!   { "cmp",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG DS prefix */
!   { "aas",	XX, XX, XX },
!   /* 40 */
!   { "inc",	RMeAX, XX, XX },
!   { "inc",	RMeCX, XX, XX },
!   { "inc",	RMeDX, XX, XX },
!   { "inc",	RMeBX, XX, XX },
!   { "inc",	RMeSP, XX, XX },
!   { "inc",	RMeBP, XX, XX },
!   { "inc",	RMeSI, XX, XX },
!   { "inc",	RMeDI, XX, XX },
!   /* 48 */
!   { "dec",	RMeAX, XX, XX },
!   { "dec",	RMeCX, XX, XX },
!   { "dec",	RMeDX, XX, XX },
!   { "dec",	RMeBX, XX, XX },
!   { "dec",	RMeSP, XX, XX },
!   { "dec",	RMeBP, XX, XX },
!   { "dec",	RMeSI, XX, XX },
!   { "dec",	RMeDI, XX, XX },
!   /* 50 */
!   { "push",	RMeAX, XX, XX },
!   { "push",	RMeCX, XX, XX },
!   { "push",	RMeDX, XX, XX },
!   { "push",	RMeBX, XX, XX },
!   { "push",	RMeSP, XX, XX },
!   { "push",	RMeBP, XX, XX },
!   { "push",	RMeSI, XX, XX },
!   { "push",	RMeDI, XX, XX },
!   /* 58 */
!   { "pop",	RMeAX, XX, XX },
!   { "pop",	RMeCX, XX, XX },
!   { "pop",	RMeDX, XX, XX },
!   { "pop",	RMeBX, XX, XX },
!   { "pop",	RMeSP, XX, XX },
!   { "pop",	RMeBP, XX, XX },
!   { "pop",	RMeSI, XX, XX },
!   { "pop",	RMeDI, XX, XX },
!   /* 60 */
!   { "pusha",	XX, XX, XX },
!   { "popa",	XX, XX, XX },
!   { "bound",	Gv, Ma, XX },
!   { "arpl",	Ew, Gw, XX },
!   { "(bad)",	XX, XX, XX },			/* seg fs */
!   { "(bad)",	XX, XX, XX },			/* seg gs */
!   { "(bad)",	XX, XX, XX },			/* op size prefix */
!   { "(bad)",	XX, XX, XX },			/* adr size prefix */
!   /* 68 */
!   { "push",	Iv, XX, XX },		/* 386 book wrong */
!   { "imul",	Gv, Ev, Iv },
!   { "push",	sIb, XX, XX },	/* push of byte really pushes 2 or 4 bytes */
!   { "imul",	Gv, Ev, sIb },
!   { "ins",	Yb, indirDX, XX },
!   { "ins",	Yv, indirDX, XX },
!   { "outs",	indirDX, Xb, XX },
!   { "outs",	indirDX, Xv, XX },
!   /* 70 */
!   { "jo",	Jb, XX, XX },
!   { "jno",	Jb, XX, XX },
!   { "jb",	Jb, XX, XX },
!   { "jae",	Jb, XX, XX },
!   { "je",	Jb, XX, XX },
!   { "jne",	Jb, XX, XX },
!   { "jbe",	Jb, XX, XX },
!   { "ja",	Jb, XX, XX },
!   /* 78 */
!   { "js",	Jb, XX, XX },
!   { "jns",	Jb, XX, XX },
!   { "jp",	Jb, XX, XX },
!   { "jnp",	Jb, XX, XX },
!   { "jl",	Jb, XX, XX },
!   { "jge",	Jb, XX, XX },
!   { "jle",	Jb, XX, XX },
!   { "jg",	Jb, XX, XX },
!   /* 80 */
!   { GRP1b },
!   { GRP1S },
!   { "(bad)",	XX, XX, XX },
!   { GRP1Ss },
!   { "test",	Eb, Gb, XX },
!   { "test",	Ev, Gv, XX },
!   { "xchg",	Eb, Gb, XX },
!   { "xchg",	Ev, Gv, XX },
!   /* 88 */
!   { "mov",	Eb, Gb, XX },
!   { "mov",	Ev, Gv, XX },
!   { "mov",	Gb, Eb, XX },
!   { "mov",	Gv, Ev, XX },
!   { "mov",	Ev, Sw, XX },
!   { "lea",	Gv, M, XX },
!   { "mov",	Sw, Ev, XX },
!   { "pop",	Ev, XX, XX },
!   /* 90 */
!   { "nop",	XX, XX, XX },
!   /* FIXME: NOP with REPz prefix is called PAUSE.  */
!   { "xchg",	RMeCX, eAX, XX },
!   { "xchg",	RMeDX, eAX, XX },
!   { "xchg",	RMeBX, eAX, XX },
!   { "xchg",	RMeSP, eAX, XX },
!   { "xchg",	RMeBP, eAX, XX },
!   { "xchg",	RMeSI, eAX, XX },
!   { "xchg",	RMeDI, eAX, XX },
!   /* 98 */
!   { "cW",	XX, XX, XX },		/* cwde and cbw */
!   { "cR",	XX, XX, XX },		/* cdq and cwd */
!   { "lcall",	Ap, XX, XX },
!   { "(bad)",	XX, XX, XX },		/* fwait */
!   { "pushf",	XX, XX, XX },
!   { "popf",	XX, XX, XX },
!   { "sahf",	XX, XX, XX },
!   { "lahf",	XX, XX, XX },
!   /* a0 */
!   { "mov",	AL, Ob, XX },
!   { "mov",	eAX, Ov, XX },
!   { "mov",	Ob, AL, XX },
!   { "mov",	Ov, eAX, XX },
!   { "movs",	Yb, Xb, XX },
!   { "movs",	Yv, Xv, XX },
!   { "cmps",	Xb, Yb, XX },
!   { "cmps",	Xv, Yv, XX },
!   /* a8 */
!   { "test",	AL, Ib, XX },
!   { "test",	eAX, Iv, XX },
!   { "stos",	Yb, AL, XX },
!   { "stos",	Yv, eAX, XX },
!   { "lods",	AL, Xb, XX },
!   { "lods",	eAX, Xv, XX },
!   { "scas",	AL, Yb, XX },
!   { "scas",	eAX, Yv, XX },
!   /* b0 */
!   { "mov",	RMAL, Ib, XX },
!   { "mov",	RMCL, Ib, XX },
!   { "mov",	RMDL, Ib, XX },
!   { "mov",	RMBL, Ib, XX },
!   { "mov",	RMAH, Ib, XX },
!   { "mov",	RMCH, Ib, XX },
!   { "mov",	RMDH, Ib, XX },
!   { "mov",	RMBH, Ib, XX },
!   /* b8 */
!   { "mov",	RMeAX, Iv, XX },
!   { "mov",	RMeCX, Iv, XX },
!   { "mov",	RMeDX, Iv, XX },
!   { "mov",	RMeBX, Iv, XX },
!   { "mov",	RMeSP, Iv, XX },
!   { "mov",	RMeBP, Iv, XX },
!   { "mov",	RMeSI, Iv, XX },
!   { "mov",	RMeDI, Iv, XX },
!   /* c0 */
!   { GRP2b },
!   { GRP2S },
!   { "ret",	Iw, XX, XX },
!   { "ret",	XX, XX, XX },
!   { "les",	Gv, Mp, XX },
!   { "lds",	Gv, Mp, XX },
!   { "mov",	Eb, Ib, XX },
!   { "mov",	Ev, Iv, XX },
!   /* c8 */
!   { "enter",	Iw, Ib, XX },
!   { "leave",	XX, XX, XX },
!   { "lret",	Iw, XX, XX },
!   { "lret",	XX, XX, XX },
!   { "int3",	XX, XX, XX },
!   { "int",	Ib, XX, XX },
!   { "into",	XX, XX, XX },
!   { "iret",	XX, XX, XX },
!   /* d0 */
!   { GRP2b_one },
!   { GRP2S_one },
!   { GRP2b_cl },
!   { GRP2S_cl },
!   { "aam",	sIb, XX, XX },
!   { "aad",	sIb, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "xlat",	DSBX, XX, XX },
!   /* d8 */
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   /* e0 */
!   { "loopne",	Jb, XX, XX },
!   { "loope",	Jb, XX, XX },
!   { "loop",	Jb, XX, XX },
!   { "jEcxz",	Jb, XX, XX },
!   { "in",	AL, Ib, XX },
!   { "in",	eAX, Ib, XX },
!   { "out",	Ib, AL, XX },
!   { "out",	Ib, eAX, XX },
!   /* e8 */
!   { "call",	Jv, XX, XX },
!   { "jmp",	Jv, XX, XX },
!   { "ljmp",	Ap, XX, XX },
!   { "jmp",	Jb, XX, XX },
!   { "in",	AL, indirDX, XX },
!   { "in",	eAX, indirDX, XX },
!   { "out",	indirDX, AL, XX },
!   { "out",	indirDX, eAX, XX },
!   /* f0 */
!   { "(bad)",	XX, XX, XX },			/* lock prefix */
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },			/* repne */
!   { "(bad)",	XX, XX, XX },			/* repz */
!   { "hlt",	XX, XX, XX },
!   { "cmc",	XX, XX, XX },
!   { GRP3b },
!   { GRP3S },
!   /* f8 */
!   { "clc",	XX, XX, XX },
!   { "stc",	XX, XX, XX },
!   { "cli",	XX, XX, XX },
!   { "sti",	XX, XX, XX },
!   { "cld",	XX, XX, XX },
!   { "std",	XX, XX, XX },
!   { GRP4 },
!   { GRP5 },
! };
  
! /* 64bit mode is having some instruction set differences, so separate table is
!    needed.  */
! static const struct dis386 disx86_64_att[] = {
!   /* 00 */
!   { "addB",	Eb, Gb, XX },
!   { "addS",	Ev, Gv, XX },
!   { "addB",	Gb, Eb, XX },
!   { "addS",	Gv, Ev, XX },
!   { "addB",	AL, Ib, XX },
!   { "addS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   /* 08 */
!   { "orB",	Eb, Gb, XX },
!   { "orS",	Ev, Gv, XX },
!   { "orB",	Gb, Eb, XX },
!   { "orS",	Gv, Ev, XX },
!   { "orB",	AL, Ib, XX },
!   { "orS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },	/* 0x0f extended opcode escape */
!   /* 10 */
!   { "adcB",	Eb, Gb, XX },
!   { "adcS",	Ev, Gv, XX },
!   { "adcB",	Gb, Eb, XX },
!   { "adcS",	Gv, Ev, XX },
!   { "adcB",	AL, Ib, XX },
!   { "adcS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   /* 18 */
!   { "sbbB",	Eb, Gb, XX },
!   { "sbbS",	Ev, Gv, XX },
!   { "sbbB",	Gb, Eb, XX },
!   { "sbbS",	Gv, Ev, XX },
!   { "sbbB",	AL, Ib, XX },
!   { "sbbS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   /* 20 */
!   { "andB",	Eb, Gb, XX },
!   { "andS",	Ev, Gv, XX },
!   { "andB",	Gb, Eb, XX },
!   { "andS",	Gv, Ev, XX },
!   { "andB",	AL, Ib, XX },
!   { "andS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG ES prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   /* 28 */
!   { "subB",	Eb, Gb, XX },
!   { "subS",	Ev, Gv, XX },
!   { "subB",	Gb, Eb, XX },
!   { "subS",	Gv, Ev, XX },
!   { "subB",	AL, Ib, XX },
!   { "subS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG CS prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   /* 30 */
!   { "xorB",	Eb, Gb, XX },
!   { "xorS",	Ev, Gv, XX },
!   { "xorB",	Gb, Eb, XX },
!   { "xorS",	Gv, Ev, XX },
!   { "xorB",	AL, Ib, XX },
!   { "xorS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG SS prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   /* 38 */
!   { "cmpB",	Eb, Gb, XX },
!   { "cmpS",	Ev, Gv, XX },
!   { "cmpB",	Gb, Eb, XX },
!   { "cmpS",	Gv, Ev, XX },
!   { "cmpB",	AL, Ib, XX },
!   { "cmpS",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG DS prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   /* 40 */
!   { "(bad)",	XX, XX, XX },			/* REX prefix area.  */
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   /* 48 */
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   /* 50 */
!   { "pushI",	RMrAX, XX, XX },
!   { "pushI",	RMrCX, XX, XX },
!   { "pushI",	RMrDX, XX, XX },
!   { "pushI",	RMrBX, XX, XX },
!   { "pushI",	RMrSP, XX, XX },
!   { "pushI",	RMrBP, XX, XX },
!   { "pushI",	RMrSI, XX, XX },
!   { "pushI",	RMrDI, XX, XX },
!   /* 58 */
!   { "popI",	RMrAX, XX, XX },
!   { "popI",	RMrCX, XX, XX },
!   { "popI",	RMrDX, XX, XX },
!   { "popI",	RMrBX, XX, XX },
!   { "popI",	RMrSP, XX, XX },
!   { "popI",	RMrBP, XX, XX },
!   { "popI",	RMrSI, XX, XX },
!   { "popI",	RMrDI, XX, XX },
!   /* 60 */
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "movslR",   Gv, Ed, XX },
!   { "(bad)",	XX, XX, XX },			/* seg fs */
!   { "(bad)",	XX, XX, XX },			/* seg gs */
!   { "(bad)",	XX, XX, XX },			/* op size prefix */
!   { "(bad)",	XX, XX, XX },			/* adr size prefix */
!   /* 68 */
!   { "pushI",	Iq, XX, XX },		/* 386 book wrong */
!   { "imulS",	Gv, Ev, Iv },
!   { "pushI",	sIb, XX, XX },	/* push of byte really pushes 2 or 4 bytes */
!   { "imulS",	Gv, Ev, sIb },
!   { "insb",	Yb, indirDX, XX },
!   { "insR",	Yv, indirDX, XX },
!   { "outsb",	indirDX, Xb, XX },
!   { "outsR",	indirDX, Xv, XX },
!   /* 70 */
!   { "joH",	Jb, cond_jump_flag, XX },
!   { "jnoH",	Jb, cond_jump_flag, XX },
!   { "jbH",	Jb, cond_jump_flag, XX },
!   { "jaeH",	Jb, cond_jump_flag, XX },
!   { "jeH",	Jb, cond_jump_flag, XX },
!   { "jneH",	Jb, cond_jump_flag, XX },
!   { "jbeH",	Jb, cond_jump_flag, XX },
!   { "jaH",	Jb, cond_jump_flag, XX },
!   /* 78 */
!   { "jsH",	Jb, cond_jump_flag, XX },
!   { "jnsH",	Jb, cond_jump_flag, XX },
!   { "jpH",	Jb, cond_jump_flag, XX },
!   { "jnpH",	Jb, cond_jump_flag, XX },
!   { "jlH",	Jb, cond_jump_flag, XX },
!   { "jgeH",	Jb, cond_jump_flag, XX },
!   { "jleH",	Jb, cond_jump_flag, XX },
!   { "jgH",	Jb, cond_jump_flag, XX },
!   /* 80 */
!   { GRP1b },
!   { GRP1S },
!   { "(bad)",	XX, XX, XX },
!   { GRP1Ss },
!   { "testB",	Eb, Gb, XX },
!   { "testS",	Ev, Gv, XX },
!   { "xchgB",	Eb, Gb, XX },
!   { "xchgS",	Ev, Gv, XX },
!   /* 88 */
!   { "movB",	Eb, Gb, XX },
!   { "movS",	Ev, Gv, XX },
!   { "movB",	Gb, Eb, XX },
!   { "movS",	Gv, Ev, XX },
!   { "movQ",	Ev, Sw, XX },
!   { "leaS",	Gv, M, XX },
!   { "movQ",	Sw, Ev, XX },
!   { "popI",	Ev, XX, XX },
!   /* 90 */
!   { "nop",	XX, XX, XX },
!   /* FIXME: NOP with REPz prefix is called PAUSE.  */
!   { "xchgS",	RMeCX, eAX, XX },
!   { "xchgS",	RMeDX, eAX, XX },
!   { "xchgS",	RMeBX, eAX, XX },
!   { "xchgS",	RMeSP, eAX, XX },
!   { "xchgS",	RMeBP, eAX, XX },
!   { "xchgS",	RMeSI, eAX, XX },
!   { "xchgS",	RMeDI, eAX, XX },
!   /* 98 */
!   { "cWtR",	XX, XX, XX },
!   { "cRtO",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "(bad)",	XX, XX, XX },		/* fwait */
!   { "pushfI",	XX, XX, XX },
!   { "popfI",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   /* a0 */
!   { "movB",	AL, Ob64, XX },
!   { "movS",	eAX, Ov64, XX },
!   { "movB",	Ob64, AL, XX },
!   { "movS",	Ov64, eAX, XX },
!   { "movsb",	Yb, Xb, XX },
!   { "movsR",	Yv, Xv, XX },
!   { "cmpsb",	Xb, Yb, XX },
!   { "cmpsR",	Xv, Yv, XX },
!   /* a8 */
!   { "testB",	AL, Ib, XX },
!   { "testS",	eAX, Iv, XX },
!   { "stosB",	Yb, AL, XX },
!   { "stosS",	Yv, eAX, XX },
!   { "lodsB",	AL, Xb, XX },
!   { "lodsS",	eAX, Xv, XX },
!   { "scasB",	AL, Yb, XX },
!   { "scasS",	eAX, Yv, XX },
!   /* b0 */
!   { "movB",	RMAL, Ib, XX },
!   { "movB",	RMCL, Ib, XX },
!   { "movB",	RMDL, Ib, XX },
!   { "movB",	RMBL, Ib, XX },
!   { "movB",	RMAH, Ib, XX },
!   { "movB",	RMCH, Ib, XX },
!   { "movB",	RMDH, Ib, XX },
!   { "movB",	RMBH, Ib, XX },
!   /* b8 */
!   { "movS",	RMeAX, Iv64, XX },
!   { "movS",	RMeCX, Iv64, XX },
!   { "movS",	RMeDX, Iv64, XX },
!   { "movS",	RMeBX, Iv64, XX },
!   { "movS",	RMeSP, Iv64, XX },
!   { "movS",	RMeBP, Iv64, XX },
!   { "movS",	RMeSI, Iv64, XX },
!   { "movS",	RMeDI, Iv64, XX },
!   /* c0 */
!   { GRP2b },
!   { GRP2S },
!   { "retI",	Iw, XX, XX },
!   { "retI",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "ldsS",	Gv, Mp, XX },
!   { "movA",	Eb, Ib, XX },
!   { "movQ",	Ev, Iv, XX },
!   /* c8 */
!   { "enterI",	Iw, Ib, XX },
!   { "leaveI",	XX, XX, XX },
!   { "lretP",	Iw, XX, XX },
!   { "lretP",	XX, XX, XX },
!   { "int3",	XX, XX, XX },
!   { "int",	Ib, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "iretP",	XX, XX, XX },
!   /* d0 */
!   { GRP2b_one },
!   { GRP2S_one },
!   { GRP2b_cl },
!   { GRP2S_cl },
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "xlat",	DSBX, XX, XX },
!   /* d8 */
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   { FLOAT },
!   /* e0 */
!   { "loopneFH",	Jb, loop_jcxz_flag, XX },
!   { "loopeFH",	Jb, loop_jcxz_flag, XX },
!   { "loopFH",	Jb, loop_jcxz_flag, XX },
!   { "jEcxzH",	Jb, loop_jcxz_flag, XX },
!   { "inB",	AL, Ib, XX },
!   { "inS",	eAX, Ib, XX },
!   { "outB",	Ib, AL, XX },
!   { "outS",	Ib, eAX, XX },
!   /* e8 */
!   { "callI",	Jv, XX, XX },
!   { "jmpI",	Jv, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* reserved.  */
!   { "jmp",	Jb, XX, XX },
!   { "inB",	AL, indirDX, XX },
!   { "inS",	eAX, indirDX, XX },
!   { "outB",	indirDX, AL, XX },
!   { "outS",	indirDX, eAX, XX },
!   /* f0 */
!   { "(bad)",	XX, XX, XX },			/* lock prefix */
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },			/* repne */
!   { "(bad)",	XX, XX, XX },			/* repz */
!   { "hlt",	XX, XX, XX },
!   { "cmc",	XX, XX, XX },
!   { GRP3b },
!   { GRP3S },
!   /* f8 */
!   { "clc",	XX, XX, XX },
!   { "stc",	XX, XX, XX },
!   { "cli",	XX, XX, XX },
!   { "sti",	XX, XX, XX },
!   { "cld",	XX, XX, XX },
!   { "std",	XX, XX, XX },
!   { GRP4 },
!   { GRP5 },
! };
  
! static const struct dis386 dis386_64_intel[] = {
    /* 00 */
!   { "add",	Eb, Gb, XX },
!   { "add",	Ev, Gv, XX },
!   { "add",	Gb, Eb, XX },
!   { "add",	Gv, Ev, XX },
!   { "add",	AL, Ib, XX },
!   { "add",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* 08 */
!   { "or",	Eb, Gb, XX },
!   { "or",	Ev, Gv, XX },
!   { "or",	Gb, Eb, XX },
!   { "or",	Gv, Ev, XX },
!   { "or",	AL, Ib, XX },
!   { "or",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },	/* 0x0f extended opcode escape */
    /* 10 */
!   { "adc",	Eb, Gb, XX },
!   { "adc",	Ev, Gv, XX },
!   { "adc",	Gb, Eb, XX },
!   { "adc",	Gv, Ev, XX },
!   { "adc",	AL, Ib, XX },
!   { "adc",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* 18 */
!   { "sbb",	Eb, Gb, XX },
!   { "sbb",	Ev, Gv, XX },
!   { "sbb",	Gb, Eb, XX },
!   { "sbb",	Gv, Ev, XX },
!   { "sbb",	AL, Ib, XX },
!   { "sbb",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* 20 */
!   { "and",	Eb, Gb, XX },
!   { "and",	Ev, Gv, XX },
!   { "and",	Gb, Eb, XX },
!   { "and",	Gv, Ev, XX },
!   { "and",	AL, Ib, XX },
!   { "and",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG ES prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* 28 */
!   { "sub",	Eb, Gb, XX },
!   { "sub",	Ev, Gv, XX },
!   { "sub",	Gb, Eb, XX },
!   { "sub",	Gv, Ev, XX },
!   { "sub",	AL, Ib, XX },
!   { "sub",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG CS prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* 30 */
!   { "xor",	Eb, Gb, XX },
!   { "xor",	Ev, Gv, XX },
!   { "xor",	Gb, Eb, XX },
!   { "xor",	Gv, Ev, XX },
!   { "xor",	AL, Ib, XX },
!   { "xor",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG SS prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* 38 */
!   { "cmp",	Eb, Gb, XX },
!   { "cmp",	Ev, Gv, XX },
!   { "cmp",	Gb, Eb, XX },
!   { "cmp",	Gv, Ev, XX },
!   { "cmp",	AL, Ib, XX },
!   { "cmp",	eAX, Iv, XX },
!   { "(bad)",	XX, XX, XX },			/* SEG DS prefix */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* 40 */
!   { "(bad)",	XX, XX, XX },			/* REX prefix area.  */
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
    /* 48 */
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },
    /* 50 */
!   { "push",	RMrAX, XX, XX },
!   { "push",	RMrCX, XX, XX },
!   { "push",	RMrDX, XX, XX },
!   { "push",	RMrBX, XX, XX },
!   { "push",	RMrSP, XX, XX },
!   { "push",	RMrBP, XX, XX },
!   { "push",	RMrSI, XX, XX },
!   { "push",	RMrDI, XX, XX },
    /* 58 */
!   { "pop",	RMrAX, XX, XX },
!   { "pop",	RMrCX, XX, XX },
!   { "pop",	RMrDX, XX, XX },
!   { "pop",	RMrBX, XX, XX },
!   { "pop",	RMrSP, XX, XX },
!   { "pop",	RMrBP, XX, XX },
!   { "pop",	RMrSI, XX, XX },
!   { "pop",	RMrDI, XX, XX },
    /* 60 */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "movsx",	Gv, Ed, XX },
!   { "(bad)",	XX, XX, XX },			/* seg fs */
!   { "(bad)",	XX, XX, XX },			/* seg gs */
!   { "(bad)",	XX, XX, XX },			/* op size prefix */
!   { "(bad)",	XX, XX, XX },			/* adr size prefix */
    /* 68 */
!   { "push",	Iq, XX, XX },		/* 386 book wrong */
!   { "imul",	Gv, Ev, Iv },
!   { "push",	sIb, XX, XX },	/* push of byte really pushes 2 or 4 bytes */
!   { "imul",	Gv, Ev, sIb },
!   { "ins",	Yb, indirDX, XX },
!   { "ins",	Yv, indirDX, XX },
!   { "outs",	indirDX, Xb, XX },
!   { "outs",	indirDX, Xv, XX },
    /* 70 */
!   { "jo",	Jb, XX, XX },
!   { "jno",	Jb, XX, XX },
!   { "jb",	Jb, XX, XX },
!   { "jae",	Jb, XX, XX },
!   { "je",	Jb, XX, XX },
!   { "jne",	Jb, XX, XX },
!   { "jbe",	Jb, XX, XX },
!   { "ja",	Jb, XX, XX },
    /* 78 */
!   { "js",	Jb, XX, XX },
!   { "jns",	Jb, XX, XX },
!   { "jp",	Jb, XX, XX },
!   { "jnp",	Jb, XX, XX },
!   { "jl",	Jb, XX, XX },
!   { "jge",	Jb, XX, XX },
!   { "jle",	Jb, XX, XX },
!   { "jg",	Jb, XX, XX },
    /* 80 */
    { GRP1b },
    { GRP1S },
!   { "(bad)",	XX, XX, XX },
    { GRP1Ss },
!   { "test",	Eb, Gb, XX },
!   { "test",	Ev, Gv, XX },
!   { "xchg",	Eb, Gb, XX },
!   { "xchg",	Ev, Gv, XX },
    /* 88 */
!   { "mov",	Eb, Gb, XX },
!   { "mov",	Ev, Gv, XX },
!   { "mov",	Gb, Eb, XX },
!   { "mov",	Gv, Ev, XX },
!   { "mov",	Ev, Sw, XX },
!   { "lea",	Gv, M, XX },
!   { "mov",	Sw, Ev, XX },
!   { "pop",	Ev, XX, XX },
    /* 90 */
!   { "nop",	XX, XX, XX },
    /* FIXME: NOP with REPz prefix is called PAUSE.  */
!   { "xchg",	RMeCX, eAX, XX },
!   { "xchg",	RMeDX, eAX, XX },
!   { "xchg",	RMeBX, eAX, XX },
!   { "xchg",	RMeSP, eAX, XX },
!   { "xchg",	RMeBP, eAX, XX },
!   { "xchg",	RMeSI, eAX, XX },
!   { "xchg",	RMeDI, eAX, XX },
    /* 98 */
!   { "cW",	XX, XX, XX },		/* cwde and cbw */
!   { "cR",	XX, XX, XX },		/* cdq and cwd */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },		/* fwait */
!   { "pushf",	XX, XX, XX },
!   { "popf",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
    /* a0 */
!   { "mov",	AL, Ob, XX },
!   { "mov",	eAX, Ov, XX },
!   { "mov",	Ob, AL, XX },
!   { "mov",	Ov, eAX, XX },
!   { "movs",	Yb, Xb, XX },
!   { "movs",	Yv, Xv, XX },
!   { "cmps",	Xb, Yb, XX },
!   { "cmps",	Xv, Yv, XX },
    /* a8 */
!   { "test",	AL, Ib, XX },
!   { "test",	eAX, Iv, XX },
!   { "stos",	Yb, AL, XX },
!   { "stos",	Yv, eAX, XX },
!   { "lods",	AL, Xb, XX },
!   { "lods",	eAX, Xv, XX },
!   { "scas",	AL, Yb, XX },
!   { "scas",	eAX, Yv, XX },
    /* b0 */
!   { "mov",	RMAL, Ib, XX },
!   { "mov",	RMCL, Ib, XX },
!   { "mov",	RMDL, Ib, XX },
!   { "mov",	RMBL, Ib, XX },
!   { "mov",	RMAH, Ib, XX },
!   { "mov",	RMCH, Ib, XX },
!   { "mov",	RMDH, Ib, XX },
!   { "mov",	RMBH, Ib, XX },
    /* b8 */
!   { "mov",	RMeAX, Iv, XX },
!   { "mov",	RMeCX, Iv, XX },
!   { "mov",	RMeDX, Iv, XX },
!   { "mov",	RMeBX, Iv, XX },
!   { "mov",	RMeSP, Iv, XX },
!   { "mov",	RMeBP, Iv, XX },
!   { "mov",	RMeSI, Iv, XX },
!   { "mov",	RMeDI, Iv, XX },
    /* c0 */
    { GRP2b },
    { GRP2S },
!   { "ret",	Iw, XX, XX },
!   { "ret",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "lds",	Gv, Mp, XX },
!   { "mov",	Eb, Ib, XX },
!   { "mov",	Ev, Iv, XX },
    /* c8 */
!   { "enter",	Iw, Ib, XX },
!   { "leave",	XX, XX, XX },
!   { "lret",	Iw, XX, XX },
!   { "lret",	XX, XX, XX },
!   { "int3",	XX, XX, XX },
!   { "int",	Ib, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "iret",	XX, XX, XX },
    /* d0 */
    { GRP2b_one },
    { GRP2S_one },
    { GRP2b_cl },
    { GRP2S_cl },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "xlat",	DSBX, XX, XX },
    /* d8 */
    { FLOAT },
    { FLOAT },
--- 445,713 ----
     'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
                                or suffix_always is true
  	  print 'q' if rex prefix is present.
     'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always is true
     'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode)
     'S' => print 'w', 'l' or 'q' if suffix_always is true
!    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
!    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
     'X' => print 's', 'd' depending on data16 prefix (for XMM)
     'W' => print 'b' or 'w' ("w" or "de" in intel mode)
     'Y' => 'q' if instruction has an REX 64bit overwrite prefix
  
!    Many of the above letters print nothing in Intel mode.  See "putop"
!    for the details.
  
!    Braces '{' and '}', and vertical bars '|', indicate alternative
!    mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
!    modes.  In cases where there are only two alternatives, the X86_64
!    instruction is reserved, and "(bad)" is printed.
! */
  
! static const struct dis386 dis386[] = {
    /* 00 */
!   { "addB",		Eb, Gb, XX },
!   { "addS",		Ev, Gv, XX },
!   { "addB",		Gb, Eb, XX },
!   { "addS",		Gv, Ev, XX },
!   { "addB",		AL, Ib, XX },
!   { "addS",		eAX, Iv, XX },
!   { "push{T|}",		es, XX, XX },
!   { "pop{T|}",		es, XX, XX },
    /* 08 */
!   { "orB",		Eb, Gb, XX },
!   { "orS",		Ev, Gv, XX },
!   { "orB",		Gb, Eb, XX },
!   { "orS",		Gv, Ev, XX },
!   { "orB",		AL, Ib, XX },
!   { "orS",		eAX, Iv, XX },
!   { "push{T|}",		cs, XX, XX },
!   { "(bad)",		XX, XX, XX },	/* 0x0f extended opcode escape */
    /* 10 */
!   { "adcB",		Eb, Gb, XX },
!   { "adcS",		Ev, Gv, XX },
!   { "adcB",		Gb, Eb, XX },
!   { "adcS",		Gv, Ev, XX },
!   { "adcB",		AL, Ib, XX },
!   { "adcS",		eAX, Iv, XX },
!   { "push{T|}",		ss, XX, XX },
!   { "popT|}",		ss, XX, XX },
    /* 18 */
!   { "sbbB",		Eb, Gb, XX },
!   { "sbbS",		Ev, Gv, XX },
!   { "sbbB",		Gb, Eb, XX },
!   { "sbbS",		Gv, Ev, XX },
!   { "sbbB",		AL, Ib, XX },
!   { "sbbS",		eAX, Iv, XX },
!   { "push{T|}",		ds, XX, XX },
!   { "pop{T|}",		ds, XX, XX },
    /* 20 */
!   { "andB",		Eb, Gb, XX },
!   { "andS",		Ev, Gv, XX },
!   { "andB",		Gb, Eb, XX },
!   { "andS",		Gv, Ev, XX },
!   { "andB",		AL, Ib, XX },
!   { "andS",		eAX, Iv, XX },
!   { "(bad)",		XX, XX, XX },	/* SEG ES prefix */
!   { "daa{|}",		XX, XX, XX },
    /* 28 */
!   { "subB",		Eb, Gb, XX },
!   { "subS",		Ev, Gv, XX },
!   { "subB",		Gb, Eb, XX },
!   { "subS",		Gv, Ev, XX },
!   { "subB",		AL, Ib, XX },
!   { "subS",		eAX, Iv, XX },
!   { "(bad)",		XX, XX, XX },	/* SEG CS prefix */
!   { "das{|}",		XX, XX, XX },
    /* 30 */
!   { "xorB",		Eb, Gb, XX },
!   { "xorS",		Ev, Gv, XX },
!   { "xorB",		Gb, Eb, XX },
!   { "xorS",		Gv, Ev, XX },
!   { "xorB",		AL, Ib, XX },
!   { "xorS",		eAX, Iv, XX },
!   { "(bad)",		XX, XX, XX },	/* SEG SS prefix */
!   { "aaa{|}",		XX, XX, XX },
    /* 38 */
!   { "cmpB",		Eb, Gb, XX },
!   { "cmpS",		Ev, Gv, XX },
!   { "cmpB",		Gb, Eb, XX },
!   { "cmpS",		Gv, Ev, XX },
!   { "cmpB",		AL, Ib, XX },
!   { "cmpS",		eAX, Iv, XX },
!   { "(bad)",		XX, XX, XX },	/* SEG DS prefix */
!   { "aas{|}",		XX, XX, XX },
    /* 40 */
!   { "inc{S|}",		RMeAX, XX, XX },
!   { "inc{S|}",		RMeCX, XX, XX },
!   { "inc{S|}",		RMeDX, XX, XX },
!   { "inc{S|}",		RMeBX, XX, XX },
!   { "inc{S|}",		RMeSP, XX, XX },
!   { "inc{S|}",		RMeBP, XX, XX },
!   { "inc{S|}",		RMeSI, XX, XX },
!   { "inc{S|}",		RMeDI, XX, XX },
    /* 48 */
!   { "dec{S|}",		RMeAX, XX, XX },
!   { "dec{S|}",		RMeCX, XX, XX },
!   { "dec{S|}",		RMeDX, XX, XX },
!   { "dec{S|}",		RMeBX, XX, XX },
!   { "dec{S|}",		RMeSP, XX, XX },
!   { "dec{S|}",		RMeBP, XX, XX },
!   { "dec{S|}",		RMeSI, XX, XX },
!   { "dec{S|}",		RMeDI, XX, XX },
    /* 50 */
!   { "pushS",		RMrAX, XX, XX },
!   { "pushS",		RMrCX, XX, XX },
!   { "pushS",		RMrDX, XX, XX },
!   { "pushS",		RMrBX, XX, XX },
!   { "pushS",		RMrSP, XX, XX },
!   { "pushS",		RMrBP, XX, XX },
!   { "pushS",		RMrSI, XX, XX },
!   { "pushS",		RMrDI, XX, XX },
    /* 58 */
!   { "popS",		RMrAX, XX, XX },
!   { "popS",		RMrCX, XX, XX },
!   { "popS",		RMrDX, XX, XX },
!   { "popS",		RMrBX, XX, XX },
!   { "popS",		RMrSP, XX, XX },
!   { "popS",		RMrBP, XX, XX },
!   { "popS",		RMrSI, XX, XX },
!   { "popS",		RMrDI, XX, XX },
    /* 60 */
!   { "pusha{P|}",	XX, XX, XX },
!   { "popa{P|}",		XX, XX, XX },
!   { "bound{S|}",	Gv, Ma, XX },
!   { X86_64_0 },
!   { "(bad)",		XX, XX, XX },	/* seg fs */
!   { "(bad)",		XX, XX, XX },	/* seg gs */
!   { "(bad)",		XX, XX, XX },	/* op size prefix */
!   { "(bad)",		XX, XX, XX },	/* adr size prefix */
    /* 68 */
!   { "pushT",		Iq, XX, XX },
!   { "imulS",		Gv, Ev, Iv },
!   { "pushT",		sIb, XX, XX },
!   { "imulS",		Gv, Ev, sIb },
!   { "ins{b||b|}",	Yb, indirDX, XX },
!   { "ins{R||R|}",	Yv, indirDX, XX },
!   { "outs{b||b|}",	indirDX, Xb, XX },
!   { "outs{R||R|}",	indirDX, Xv, XX },
    /* 70 */
!   { "joH",		Jb, XX, cond_jump_flag },
!   { "jnoH",		Jb, XX, cond_jump_flag },
!   { "jbH",		Jb, XX, cond_jump_flag },
!   { "jaeH",		Jb, XX, cond_jump_flag },
!   { "jeH",		Jb, XX, cond_jump_flag },
!   { "jneH",		Jb, XX, cond_jump_flag },
!   { "jbeH",		Jb, XX, cond_jump_flag },
!   { "jaH",		Jb, XX, cond_jump_flag },
    /* 78 */
!   { "jsH",		Jb, XX, cond_jump_flag },
!   { "jnsH",		Jb, XX, cond_jump_flag },
!   { "jpH",		Jb, XX, cond_jump_flag },
!   { "jnpH",		Jb, XX, cond_jump_flag },
!   { "jlH",		Jb, XX, cond_jump_flag },
!   { "jgeH",		Jb, XX, cond_jump_flag },
!   { "jleH",		Jb, XX, cond_jump_flag },
!   { "jgH",		Jb, XX, cond_jump_flag },
    /* 80 */
    { GRP1b },
    { GRP1S },
!   { "(bad)",		XX, XX, XX },
    { GRP1Ss },
!   { "testB",		Eb, Gb, XX },
!   { "testS",		Ev, Gv, XX },
!   { "xchgB",		Eb, Gb, XX },
!   { "xchgS",		Ev, Gv, XX },
    /* 88 */
!   { "movB",		Eb, Gb, XX },
!   { "movS",		Ev, Gv, XX },
!   { "movB",		Gb, Eb, XX },
!   { "movS",		Gv, Ev, XX },
!   { "movQ",		Ev, Sw, XX },
!   { "leaS",		Gv, M, XX },
!   { "movQ",		Sw, Ev, XX },
!   { "popU",		Ev, XX, XX },
    /* 90 */
!   { "nop",		XX, XX, XX },
    /* FIXME: NOP with REPz prefix is called PAUSE.  */
!   { "xchgS",		RMeCX, eAX, XX },
!   { "xchgS",		RMeDX, eAX, XX },
!   { "xchgS",		RMeBX, eAX, XX },
!   { "xchgS",		RMeSP, eAX, XX },
!   { "xchgS",		RMeBP, eAX, XX },
!   { "xchgS",		RMeSI, eAX, XX },
!   { "xchgS",		RMeDI, eAX, XX },
    /* 98 */
!   { "cW{tR||tR|}",	XX, XX, XX },
!   { "cR{tO||tO|}",	XX, XX, XX },
!   { "lcall{T|}",	Ap, XX, XX },
!   { "(bad)",		XX, XX, XX },	/* fwait */
!   { "pushfT",		XX, XX, XX },
!   { "popfT",		XX, XX, XX },
!   { "sahf{|}",		XX, XX, XX },
!   { "lahf{|}",		XX, XX, XX },
    /* a0 */
!   { "movB",		AL, Ob64, XX },
!   { "movS",		eAX, Ov64, XX },
!   { "movB",		Ob64, AL, XX },
!   { "movS",		Ov64, eAX, XX },
!   { "movs{b||b|}",	Yb, Xb, XX },
!   { "movs{R||R|}",	Yv, Xv, XX },
!   { "cmps{b||b|}",	Xb, Yb, XX },
!   { "cmps{R||R|}",	Xv, Yv, XX },
    /* a8 */
!   { "testB",		AL, Ib, XX },
!   { "testS",		eAX, Iv, XX },
!   { "stosB",		Yb, AL, XX },
!   { "stosS",		Yv, eAX, XX },
!   { "lodsB",		AL, Xb, XX },
!   { "lodsS",		eAX, Xv, XX },
!   { "scasB",		AL, Yb, XX },
!   { "scasS",		eAX, Yv, XX },
    /* b0 */
!   { "movB",		RMAL, Ib, XX },
!   { "movB",		RMCL, Ib, XX },
!   { "movB",		RMDL, Ib, XX },
!   { "movB",		RMBL, Ib, XX },
!   { "movB",		RMAH, Ib, XX },
!   { "movB",		RMCH, Ib, XX },
!   { "movB",		RMDH, Ib, XX },
!   { "movB",		RMBH, Ib, XX },
    /* b8 */
!   { "movS",		RMeAX, Iv64, XX },
!   { "movS",		RMeCX, Iv64, XX },
!   { "movS",		RMeDX, Iv64, XX },
!   { "movS",		RMeBX, Iv64, XX },
!   { "movS",		RMeSP, Iv64, XX },
!   { "movS",		RMeBP, Iv64, XX },
!   { "movS",		RMeSI, Iv64, XX },
!   { "movS",		RMeDI, Iv64, XX },
    /* c0 */
    { GRP2b },
    { GRP2S },
!   { "retT",		Iw, XX, XX },
!   { "retT",		XX, XX, XX },
!   { "les{S|}",		Gv, Mp, XX },
!   { "ldsS",		Gv, Mp, XX },
!   { "movA",		Eb, Ib, XX },
!   { "movQ",		Ev, Iv, XX },
    /* c8 */
!   { "enterT",		Iw, Ib, XX },
!   { "leaveT",		XX, XX, XX },
!   { "lretP",		Iw, XX, XX },
!   { "lretP",		XX, XX, XX },
!   { "int3",		XX, XX, XX },
!   { "int",		Ib, XX, XX },
!   { "into{|}",		XX, XX, XX },
!   { "iretP",		XX, XX, XX },
    /* d0 */
    { GRP2b_one },
    { GRP2S_one },
    { GRP2b_cl },
    { GRP2S_cl },
!   { "aam{|}",		sIb, XX, XX },
!   { "aad{|}",		sIb, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "xlat",		DSBX, XX, XX },
    /* d8 */
    { FLOAT },
    { FLOAT },
*************** static const struct dis386 dis386_64_int
*** 1586,1729 ****
    { FLOAT },
    { FLOAT },
    /* e0 */
!   { "loopne",	Jb, XX, XX },
!   { "loope",	Jb, XX, XX },
!   { "loop",	Jb, XX, XX },
!   { "jEcxz",	Jb, XX, XX },
!   { "in",	AL, Ib, XX },
!   { "in",	eAX, Ib, XX },
!   { "out",	Ib, AL, XX },
!   { "out",	Ib, eAX, XX },
    /* e8 */
!   { "call",	Jv, XX, XX },
!   { "jmp",	Jv, XX, XX },
!   { "(bad)",	XX, XX, XX },   /* Reserved.  */
!   { "jmp",	Jb, XX, XX },
!   { "in",	AL, indirDX, XX },
!   { "in",	eAX, indirDX, XX },
!   { "out",	indirDX, AL, XX },
!   { "out",	indirDX, eAX, XX },
    /* f0 */
!   { "(bad)",	XX, XX, XX },			/* lock prefix */
!   { "(bad)",	XX, XX, XX },
!   { "(bad)",	XX, XX, XX },			/* repne */
!   { "(bad)",	XX, XX, XX },			/* repz */
!   { "hlt",	XX, XX, XX },
!   { "cmc",	XX, XX, XX },
    { GRP3b },
    { GRP3S },
    /* f8 */
!   { "clc",	XX, XX, XX },
!   { "stc",	XX, XX, XX },
!   { "cli",	XX, XX, XX },
!   { "sti",	XX, XX, XX },
!   { "cld",	XX, XX, XX },
!   { "std",	XX, XX, XX },
    { GRP4 },
    { GRP5 },
  };
  
! static const struct dis386 dis386_twobyte_att[] = {
    /* 00 */
    { GRP6 },
    { GRP7 },
!   { "larS", Gv, Ew, XX },
!   { "lslS", Gv, Ew, XX },
!   { "(bad)", XX, XX, XX },
!   { "syscall", XX, XX, XX },
!   { "clts", XX, XX, XX },
!   { "sysretP", XX, XX, XX },
    /* 08 */
!   { "invd", XX, XX, XX },
!   { "wbinvd", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "ud2a", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
    { GRPAMD },
!   { "femms", XX, XX, XX },
!   { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
    /* 10 */
    { PREGRP8 },
    { PREGRP9 },
!   { "movlpX", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
!   { "movlpX", EX, XM, SIMD_Fixup, 'h' },
!   { "unpcklpX", XM, EX, XX },
!   { "unpckhpX", XM, EX, XX },
!   { "movhpX", XM, EX, SIMD_Fixup, 'l' },
!   { "movhpX", EX, XM, SIMD_Fixup, 'l' },
    /* 18 */
    { GRP14 },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
    /* 20 */
!   /* these are all backward in appendix A of the intel book */
!   { "movL", Rm, Cm, XX },
!   { "movL", Rm, Dm, XX },
!   { "movL", Cm, Rm, XX },
!   { "movL", Dm, Rm, XX },
!   { "movL", Rd, Td, XX },
!   { "(bad)", XX, XX, XX },
!   { "movL", Td, Rd, XX },
!   { "(bad)", XX, XX, XX },
    /* 28 */
!   { "movapX", XM, EX, XX },
!   { "movapX", EX, XM, XX },
    { PREGRP2 },
!   { "movntpX", Ev, XM, XX },
    { PREGRP4 },
    { PREGRP3 },
!   { "ucomisX", XM,EX, XX },
!   { "comisX", XM,EX, XX },
    /* 30 */
!   { "wrmsr", XX, XX, XX },
!   { "rdtsc", XX, XX, XX },
!   { "rdmsr", XX, XX, XX },
!   { "rdpmc", XX, XX, XX },
!   { "sysenter", XX, XX, XX },
!   { "sysexit", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
    /* 38 */
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
    /* 40 */
!   { "cmovo", Gv, Ev, XX },
!   { "cmovno", Gv, Ev, XX },
!   { "cmovb", Gv, Ev, XX },
!   { "cmovae", Gv, Ev, XX },
!   { "cmove", Gv, Ev, XX },
!   { "cmovne", Gv, Ev, XX },
!   { "cmovbe", Gv, Ev, XX },
!   { "cmova", Gv, Ev, XX },
    /* 48 */
!   { "cmovs", Gv, Ev, XX },
!   { "cmovns", Gv, Ev, XX },
!   { "cmovp", Gv, Ev, XX },
!   { "cmovnp", Gv, Ev, XX },
!   { "cmovl", Gv, Ev, XX },
!   { "cmovge", Gv, Ev, XX },
!   { "cmovle", Gv, Ev, XX },
!   { "cmovg", Gv, Ev, XX },
    /* 50 */
!   { "movmskpX", Gd, XS, XX },
    { PREGRP13 },
    { PREGRP12 },
    { PREGRP11 },
!   { "andpX", XM, EX, XX },
!   { "andnpX", XM, EX, XX },
!   { "orpX", XM, EX, XX },
!   { "xorpX", XM, EX, XX },
    /* 58 */
    { PREGRP0 },
    { PREGRP10 },
--- 718,860 ----
    { FLOAT },
    { FLOAT },
    /* e0 */
!   { "loopneFH",		Jb, XX, loop_jcxz_flag },
!   { "loopeFH",		Jb, XX, loop_jcxz_flag },
!   { "loopFH",		Jb, XX, loop_jcxz_flag },
!   { "jEcxzH",		Jb, XX, loop_jcxz_flag },
!   { "inB",		AL, Ib, XX },
!   { "inS",		eAX, Ib, XX },
!   { "outB",		Ib, AL, XX },
!   { "outS",		Ib, eAX, XX },
    /* e8 */
!   { "callT",		Jv, XX, XX },
!   { "jmpT",		Jv, XX, XX },
!   { "ljmp{T|}",		Ap, XX, XX },
!   { "jmp",		Jb, XX, XX },
!   { "inB",		AL, indirDX, XX },
!   { "inS",		eAX, indirDX, XX },
!   { "outB",		indirDX, AL, XX },
!   { "outS",		indirDX, eAX, XX },
    /* f0 */
!   { "(bad)",		XX, XX, XX },	/* lock prefix */
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },	/* repne */
!   { "(bad)",		XX, XX, XX },	/* repz */
!   { "hlt",		XX, XX, XX },
!   { "cmc",		XX, XX, XX },
    { GRP3b },
    { GRP3S },
    /* f8 */
!   { "clc",		XX, XX, XX },
!   { "stc",		XX, XX, XX },
!   { "cli",		XX, XX, XX },
!   { "sti",		XX, XX, XX },
!   { "cld",		XX, XX, XX },
!   { "std",		XX, XX, XX },
    { GRP4 },
    { GRP5 },
  };
  
! static const struct dis386 dis386_twobyte[] = {
    /* 00 */
    { GRP6 },
    { GRP7 },
!   { "larS",		Gv, Ew, XX },
!   { "lslS",		Gv, Ew, XX },
!   { "(bad)",		XX, XX, XX },
!   { "syscall",		XX, XX, XX },
!   { "clts",		XX, XX, XX },
!   { "sysretP",		XX, XX, XX },
    /* 08 */
!   { "invd",		XX, XX, XX },
!   { "wbinvd",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "ud2a",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
    { GRPAMD },
!   { "femms",		XX, XX, XX },
!   { "",			MX, EM, OPSUF }, /* See OP_3DNowSuffix */
    /* 10 */
    { PREGRP8 },
    { PREGRP9 },
!   { "movlpX",		XM, EX, SIMD_Fixup, 'h' }, /* really only 2 operands */
!   { "movlpX",		EX, XM, SIMD_Fixup, 'h' },
!   { "unpcklpX",		XM, EX, XX },
!   { "unpckhpX",		XM, EX, XX },
!   { "movhpX",		XM, EX, SIMD_Fixup, 'l' },
!   { "movhpX",		EX, XM, SIMD_Fixup, 'l' },
    /* 18 */
    { GRP14 },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
    /* 20 */
!   { "movL",		Rm, Cm, XX },
!   { "movL",		Rm, Dm, XX },
!   { "movL",		Cm, Rm, XX },
!   { "movL",		Dm, Rm, XX },
!   { "movL",		Rd, Td, XX },
!   { "(bad)",		XX, XX, XX },
!   { "movL",		Td, Rd, XX },
!   { "(bad)",		XX, XX, XX },
    /* 28 */
!   { "movapX",		XM, EX, XX },
!   { "movapX",		EX, XM, XX },
    { PREGRP2 },
!   { "movntpX",		Ev, XM, XX },
    { PREGRP4 },
    { PREGRP3 },
!   { "ucomisX",		XM,EX, XX },
!   { "comisX",		XM,EX, XX },
    /* 30 */
!   { "wrmsr",		XX, XX, XX },
!   { "rdtsc",		XX, XX, XX },
!   { "rdmsr",		XX, XX, XX },
!   { "rdpmc",		XX, XX, XX },
!   { "sysenter",		XX, XX, XX },
!   { "sysexit",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
    /* 38 */
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
    /* 40 */
!   { "cmovo",		Gv, Ev, XX },
!   { "cmovno",		Gv, Ev, XX },
!   { "cmovb",		Gv, Ev, XX },
!   { "cmovae",		Gv, Ev, XX },
!   { "cmove",		Gv, Ev, XX },
!   { "cmovne",		Gv, Ev, XX },
!   { "cmovbe",		Gv, Ev, XX },
!   { "cmova",		Gv, Ev, XX },
    /* 48 */
!   { "cmovs",		Gv, Ev, XX },
!   { "cmovns",		Gv, Ev, XX },
!   { "cmovp",		Gv, Ev, XX },
!   { "cmovnp",		Gv, Ev, XX },
!   { "cmovl",		Gv, Ev, XX },
!   { "cmovge",		Gv, Ev, XX },
!   { "cmovle",		Gv, Ev, XX },
!   { "cmovg",		Gv, Ev, XX },
    /* 50 */
!   { "movmskpX",		Gd, XS, XX },
    { PREGRP13 },
    { PREGRP12 },
    { PREGRP11 },
!   { "andpX",		XM, EX, XX },
!   { "andnpX",		XM, EX, XX },
!   { "orpX",		XM, EX, XX },
!   { "xorpX",		XM, EX, XX },
    /* 58 */
    { PREGRP0 },
    { PREGRP10 },
*************** static const struct dis386 dis386_twobyt
*** 1734,2212 ****
    { PREGRP5 },
    { PREGRP6 },
    /* 60 */
!   { "punpcklbw", MX, EM, XX },
!   { "punpcklwd", MX, EM, XX },
!   { "punpckldq", MX, EM, XX },
!   { "packsswb", MX, EM, XX },
!   { "pcmpgtb", MX, EM, XX },
!   { "pcmpgtw", MX, EM, XX },
!   { "pcmpgtd", MX, EM, XX },
!   { "packuswb", MX, EM, XX },
    /* 68 */
!   { "punpckhbw", MX, EM, XX },
!   { "punpckhwd", MX, EM, XX },
!   { "punpckhdq", MX, EM, XX },
!   { "packssdw", MX, EM, XX },
    { PREGRP26 },
    { PREGRP24 },
!   { "movd", MX, Ed, XX },
    { PREGRP19 },
    /* 70 */
    { PREGRP22 },
    { GRP10 },
    { GRP11 },
    { GRP12 },
!   { "pcmpeqb", MX, EM, XX },
!   { "pcmpeqw", MX, EM, XX },
!   { "pcmpeqd", MX, EM, XX },
!   { "emms", XX, XX, XX },
    /* 78 */
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
    { PREGRP23 },
    { PREGRP20 },
    /* 80 */
!   { "joH",  Jv, cond_jump_flag, XX },
!   { "jnoH", Jv, cond_jump_flag, XX },
!   { "jbH",  Jv, cond_jump_flag, XX },
!   { "jaeH", Jv, cond_jump_flag, XX },
!   { "jeH",  Jv, cond_jump_flag, XX },
!   { "jneH", Jv, cond_jump_flag, XX },
!   { "jbeH", Jv, cond_jump_flag, XX },
!   { "jaH",  Jv, cond_jump_flag, XX },
    /* 88 */
!   { "jsH",  Jv, cond_jump_flag, XX },
!   { "jnsH", Jv, cond_jump_flag, XX },
!   { "jpH",  Jv, cond_jump_flag, XX },
!   { "jnpH", Jv, cond_jump_flag, XX },
!   { "jlH",  Jv, cond_jump_flag, XX },
!   { "jgeH", Jv, cond_jump_flag, XX },
!   { "jleH", Jv, cond_jump_flag, XX },
!   { "jgH",  Jv, cond_jump_flag, XX },
    /* 90 */
!   { "seto", Eb, XX, XX },
!   { "setno", Eb, XX, XX },
!   { "setb", Eb, XX, XX },
!   { "setae", Eb, XX, XX },
!   { "sete", Eb, XX, XX },
!   { "setne", Eb, XX, XX },
!   { "setbe", Eb, XX, XX },
!   { "seta", Eb, XX, XX },
    /* 98 */
!   { "sets", Eb, XX, XX },
!   { "setns", Eb, XX, XX },
!   { "setp", Eb, XX, XX },
!   { "setnp", Eb, XX, XX },
!   { "setl", Eb, XX, XX },
!   { "setge", Eb, XX, XX },
!   { "setle", Eb, XX, XX },
!   { "setg", Eb, XX, XX },
    /* a0 */
!   { "pushI", fs, XX, XX },
!   { "popI", fs, XX, XX },
!   { "cpuid", XX, XX, XX },
!   { "btS", Ev, Gv, XX },
!   { "shldS", Ev, Gv, Ib },
!   { "shldS", Ev, Gv, CL },
!   { "(bad)", XX, XX, XX },
!   { "(bad)", XX, XX, XX },
    /* a8 */
!   { "pushI", gs, XX, XX },
!   { "popI", gs, XX, XX },
!   { "rsm", XX, XX, XX },
!   { "btsS", Ev, Gv, XX },
!   { "shrdS", Ev, Gv, Ib },
!   { "shrdS", Ev, Gv, CL },
    { GRP13 },
!   { "imulS", Gv, Ev, XX },
    /* b0 */
!   { "cmpxchgB", Eb, Gb, XX },
!   { "cmpxchgS", Ev, Gv, XX },
!   { "lssS", Gv, Mp, XX },
!   { "btrS", Ev, Gv, XX },
!   { "lfsS", Gv, Mp, XX },
!   { "lgsS", Gv, Mp, XX },
!   { "movzbR", Gv, Eb, XX },
!   { "movzwR", Gv, Ew, XX }, /* yes, there really is movzww ! */
    /* b8 */
!   { "(bad)", XX, XX, XX },
!   { "ud2b", XX, XX, XX },
    { GRP8 },
!   { "btcS", Ev, Gv, XX },
!   { "bsfS", Gv, Ev, XX },
!   { "bsrS", Gv, Ev, XX },
!   { "movsbR", Gv, Eb, XX },
!   { "movswR", Gv, Ew, XX }, /* yes, there really is movsww ! */
    /* c0 */
!   { "xaddB", Eb, Gb, XX },
!   { "xaddS", Ev, Gv, XX },
    { PREGRP1 },
!   { "movntiS", Ev, Gv, XX },
!   { "pinsrw", MX, Ed, Ib },
!   { "pextrw", Gd, MS, Ib },
!   { "shufpX", XM, EX, Ib },
    { GRP9 },
    /* c8 */
!   { "bswap", RMeAX, XX, XX },	/* bswap doesn't support 16 bit regs */
!   { "bswap", RMeCX, XX, XX },
!   { "bswap", RMeDX, XX, XX },
!   { "bswap", RMeBX, XX, XX },
!   { "bswap", RMeSP, XX, XX },
!   { "bswap", RMeBP, XX, XX },
!   { "bswap", RMeSI, XX, XX },
!   { "bswap", RMeDI, XX, XX },
    /* d0 */
!   { "(bad)", XX, XX, XX },
!   { "psrlw", MX, EM, XX },
!   { "psrld", MX, EM, XX },
!   { "psrlq", MX, EM, XX },
!   { "paddq", MX, EM, XX },
!   { "pmullw", MX, EM, XX },
    { PREGRP21 },
!   { "pmovmskb", Gd, MS, XX },
    /* d8 */
!   { "psubusb", MX, EM, XX },
!   { "psubusw", MX, EM, XX },
!   { "pminub", MX, EM, XX },
!   { "pand", MX, EM, XX },
!   { "paddusb", MX, EM, XX },
!   { "paddusw", MX, EM, XX },
!   { "pmaxub", MX, EM, XX },
!   { "pandn", MX, EM, XX },
    /* e0 */
!   { "pavgb", MX, EM, XX },
!   { "psraw", MX, EM, XX },
!   { "psrad", MX, EM, XX },
!   { "pavgw", MX, EM, XX },
!   { "pmulhuw", MX, EM, XX },
!   { "pmulhw", MX, EM, XX },
    { PREGRP15 },
    { PREGRP25 },
    /* e8 */
!   { "psubsb", MX, EM, XX },
!   { "psubsw", MX, EM, XX },
!   { "pminsw", MX, EM, XX },
!   { "por", MX, EM, XX },
!   { "paddsb", MX, EM, XX },
!   { "paddsw", MX, EM, XX },
!   { "pmaxsw", MX, EM, XX },
!   { "pxor", MX, EM, XX },
    /* f0 */
!   { "(bad)", XX, XX, XX },
!   { "psllw", MX, EM, XX },
!   { "pslld", MX, EM, XX },
!   { "psllq", MX, EM, XX },
!   { "pmuludq", MX, EM, XX },
!   { "pmaddwd", MX, EM, XX },
!   { "psadbw", MX, EM, XX },
    { PREGRP18 },
    /* f8 */
!   { "psubb", MX, EM, XX },
!   { "psubw", MX, EM, XX },
!   { "psubd", MX, EM, XX },
!   { "psubq", MX, EM, XX },
!   { "paddb", MX, EM, XX },
!   { "paddw", MX, EM, XX },
!   { "paddd", MX, EM, XX },
!   { "(bad)", XX, XX, XX }
  };
  
- static const struct dis386 dis386_twobyte_intel[] = {
-   /* 00 */
-   { GRP6 },
-   { GRP7 },
-   { "lar", Gv, Ew, XX },
-   { "lsl", Gv, Ew, XX },
-   { "(bad)", XX, XX, XX },
-   { "syscall", XX, XX, XX },
-   { "clts", XX, XX, XX },
-   { "sysretP", XX, XX, XX },
-   /* 08 */
-   { "invd", XX, XX, XX },
-   { "wbinvd", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "ud2a", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { GRPAMD },
-   { "femms" , XX, XX, XX},
-   { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
-   /* 10 */
-   { PREGRP8 },
-   { PREGRP9 },
-   { "movlpX", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
-   { "movlpX", EX, XM, SIMD_Fixup, 'h' },
-   { "unpcklpX", XM, EX, XX },
-   { "unpckhpX", XM, EX, XX },
-   { "movhpX", XM, EX, SIMD_Fixup, 'l' },
-   { "movhpX", EX, XM, SIMD_Fixup, 'l' },
-   /* 18 */
-   { GRP14 },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   /* 20 */
-   /* these are all backward in appendix A of the intel book */
-   { "mov", Rm, Cm, XX },
-   { "mov", Rm, Dm, XX },
-   { "mov", Cm, Rm, XX },
-   { "mov", Dm, Rm, XX },
-   { "mov", Rd, Td, XX },
-   { "(bad)", XX, XX, XX },
-   { "mov", Td, Rd, XX },
-   { "(bad)", XX, XX, XX },
-   /* 28 */
-   { "movapX", XM, EX, XX },
-   { "movapX", EX, XM, XX },
-   { PREGRP2 },
-   { "movntpX", Ev, XM, XX },
-   { PREGRP4 },
-   { PREGRP3 },
-   { "ucomisX", XM,EX, XX },
-   { "comisX", XM,EX, XX },
-   /* 30 */
-   { "wrmsr", XX, XX, XX },
-   { "rdtsc", XX, XX, XX },
-   { "rdmsr", XX, XX, XX },
-   { "rdpmc", XX, XX, XX },
-   { "sysenter", XX, XX, XX },
-   { "sysexit", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   /* 38 */
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   /* 40 */
-   { "cmovo", Gv, Ev, XX },
-   { "cmovno", Gv, Ev, XX },
-   { "cmovb", Gv, Ev, XX },
-   { "cmovae", Gv, Ev, XX },
-   { "cmove", Gv, Ev, XX },
-   { "cmovne", Gv, Ev, XX },
-   { "cmovbe", Gv, Ev, XX },
-   { "cmova", Gv, Ev, XX },
-   /* 48 */
-   { "cmovs", Gv, Ev, XX },
-   { "cmovns", Gv, Ev, XX },
-   { "cmovp", Gv, Ev, XX },
-   { "cmovnp", Gv, Ev, XX },
-   { "cmovl", Gv, Ev, XX },
-   { "cmovge", Gv, Ev, XX },
-   { "cmovle", Gv, Ev, XX },
-   { "cmovg", Gv, Ev, XX },
-   /* 50 */
-   { "movmskpX", Gd, XS, XX },
-   { PREGRP13 },
-   { PREGRP12 },
-   { PREGRP11 },
-   { "andpX", XM, EX, XX },
-   { "andnpX", XM, EX, XX },
-   { "orpX", XM, EX, XX },
-   { "xorpX", XM, EX, XX },
-   /* 58 */
-   { PREGRP0 },
-   { PREGRP10 },
-   { PREGRP17 },
-   { PREGRP16 },
-   { PREGRP14 },
-   { PREGRP7 },
-   { PREGRP5 },
-   { PREGRP6 },
-   /* 60 */
-   { "punpcklbw", MX, EM, XX },
-   { "punpcklwd", MX, EM, XX },
-   { "punpckldq", MX, EM, XX },
-   { "packsswb", MX, EM, XX },
-   { "pcmpgtb", MX, EM, XX },
-   { "pcmpgtw", MX, EM, XX },
-   { "pcmpgtd", MX, EM, XX },
-   { "packuswb", MX, EM, XX },
-   /* 68 */
-   { "punpckhbw", MX, EM, XX },
-   { "punpckhwd", MX, EM, XX },
-   { "punpckhdq", MX, EM, XX },
-   { "packssdw", MX, EM, XX },
-   { PREGRP26 },
-   { PREGRP24 },
-   { "movd", MX, Ed, XX },
-   { PREGRP19 },
-   /* 70 */
-   { PREGRP22 },
-   { GRP10 },
-   { GRP11 },
-   { GRP12 },
-   { "pcmpeqb", MX, EM, XX },
-   { "pcmpeqw", MX, EM, XX },
-   { "pcmpeqd", MX, EM, XX },
-   { "emms", XX, XX, XX },
-   /* 78 */
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   { PREGRP23 },
-   { PREGRP20 },
-   /* 80 */
-   { "jo", Jv, XX, XX },
-   { "jno", Jv, XX, XX },
-   { "jb", Jv, XX, XX },
-   { "jae", Jv, XX, XX },
-   { "je", Jv, XX, XX },
-   { "jne", Jv, XX, XX },
-   { "jbe", Jv, XX, XX },
-   { "ja", Jv, XX, XX },
-   /* 88 */
-   { "js", Jv, XX, XX },
-   { "jns", Jv, XX, XX },
-   { "jp", Jv, XX, XX },
-   { "jnp", Jv, XX, XX },
-   { "jl", Jv, XX, XX },
-   { "jge", Jv, XX, XX },
-   { "jle", Jv, XX, XX },
-   { "jg", Jv, XX, XX },
-   /* 90 */
-   { "seto", Eb, XX, XX },
-   { "setno", Eb, XX, XX },
-   { "setb", Eb, XX, XX },
-   { "setae", Eb, XX, XX },
-   { "sete", Eb, XX, XX },
-   { "setne", Eb, XX, XX },
-   { "setbe", Eb, XX, XX },
-   { "seta", Eb, XX, XX },
-   /* 98 */
-   { "sets", Eb, XX, XX },
-   { "setns", Eb, XX, XX },
-   { "setp", Eb, XX, XX },
-   { "setnp", Eb, XX, XX },
-   { "setl", Eb, XX, XX },
-   { "setge", Eb, XX, XX },
-   { "setle", Eb, XX, XX },
-   { "setg", Eb, XX, XX },
-   /* a0 */
-   { "push", fs, XX, XX },
-   { "pop", fs, XX, XX },
-   { "cpuid", XX, XX, XX },
-   { "bt", Ev, Gv, XX },
-   { "shld", Ev, Gv, Ib },
-   { "shld", Ev, Gv, CL },
-   { "(bad)", XX, XX, XX },
-   { "(bad)", XX, XX, XX },
-   /* a8 */
-   { "push", gs, XX, XX },
-   { "pop", gs, XX, XX },
-   { "rsm" , XX, XX, XX},
-   { "bts", Ev, Gv, XX },
-   { "shrd", Ev, Gv, Ib },
-   { "shrd", Ev, Gv, CL },
-   { GRP13 },
-   { "imul", Gv, Ev, XX },
-   /* b0 */
-   { "cmpxchg", Eb, Gb, XX },
-   { "cmpxchg", Ev, Gv, XX },
-   { "lss", Gv, Mp, XX },
-   { "btr", Ev, Gv, XX },
-   { "lfs", Gv, Mp, XX },
-   { "lgs", Gv, Mp, XX },
-   { "movzx", Gv, Eb, XX },
-   { "movzx", Gv, Ew, XX },
-   /* b8 */
-   { "(bad)", XX, XX, XX },
-   { "ud2b", XX, XX, XX },
-   { GRP8 },
-   { "btc", Ev, Gv, XX },
-   { "bsf", Gv, Ev, XX },
-   { "bsr", Gv, Ev, XX },
-   { "movsx", Gv, Eb, XX },
-   { "movsx", Gv, Ew, XX },
-   /* c0 */
-   { "xadd", Eb, Gb, XX },
-   { "xadd", Ev, Gv, XX },
-   { PREGRP1 },
-   { "movnti", Ev, Gv, XX },
-   { "pinsrw", MX, Ed, Ib },
-   { "pextrw", Gd, MS, Ib },
-   { "shufpX", XM, EX, Ib },
-   { GRP9 },
-   /* c8 */
-   { "bswap", RMeAX, XX, XX },	/* bswap doesn't support 16 bit regs */
-   { "bswap", RMeCX, XX, XX },
-   { "bswap", RMeDX, XX, XX },
-   { "bswap", RMeBX, XX, XX },
-   { "bswap", RMeSP, XX, XX },
-   { "bswap", RMeBP, XX, XX },
-   { "bswap", RMeSI, XX, XX },
-   { "bswap", RMeDI, XX, XX },
-   /* d0 */
-   { "(bad)", XX, XX, XX },
-   { "psrlw", MX, EM, XX },
-   { "psrld", MX, EM, XX },
-   { "psrlq", MX, EM, XX },
-   { "paddq", MX, EM, XX },
-   { "pmullw", MX, EM, XX },
-   { PREGRP21 },
-   { "pmovmskb", Gd, MS, XX },
-   /* d8 */
-   { "psubusb", MX, EM, XX },
-   { "psubusw", MX, EM, XX },
-   { "pminub", MX, EM, XX },
-   { "pand", MX, EM, XX },
-   { "paddusb", MX, EM, XX },
-   { "paddusw", MX, EM, XX },
-   { "pmaxub", MX, EM, XX },
-   { "pandn", MX, EM, XX },
-   /* e0 */
-   { "pavgb", MX, EM, XX },
-   { "psraw", MX, EM, XX },
-   { "psrad", MX, EM, XX },
-   { "pavgw", MX, EM, XX },
-   { "pmulhuw", MX, EM, XX },
-   { "pmulhw", MX, EM, XX },
-   { PREGRP15 },
-   { PREGRP25 },
-   /* e8 */
-   { "psubsb", MX, EM, XX },
-   { "psubsw", MX, EM, XX },
-   { "pminsw", MX, EM, XX },
-   { "por", MX, EM, XX },
-   { "paddsb", MX, EM, XX },
-   { "paddsw", MX, EM, XX },
-   { "pmaxsw", MX, EM, XX },
-   { "pxor", MX, EM, XX },
-   /* f0 */
-   { "(bad)", XX, XX, XX },
-   { "psllw", MX, EM, XX },
-   { "pslld", MX, EM, XX },
-   { "psllq", MX, EM, XX },
-   { "pmuludq", MX, EM, XX },
-   { "pmaddwd", MX, EM, XX },
-   { "psadbw", MX, EM, XX },
-   { PREGRP18 },
-   /* f8 */
-   { "psubb", MX, EM, XX },
-   { "psubw", MX, EM, XX },
-   { "psubd", MX, EM, XX },
-   { "psubq", MX, EM, XX },
-   { "paddb", MX, EM, XX },
-   { "paddw", MX, EM, XX },
-   { "paddd", MX, EM, XX },
-   { "(bad)", XX, XX, XX }
- };
- 
  static const unsigned char onebyte_has_modrm[256] = {
    /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
    /*       -------------------------------        */
--- 865,1051 ----
    { PREGRP5 },
    { PREGRP6 },
    /* 60 */
!   { "punpcklbw",	MX, EM, XX },
!   { "punpcklwd",	MX, EM, XX },
!   { "punpckldq",	MX, EM, XX },
!   { "packsswb",		MX, EM, XX },
!   { "pcmpgtb",		MX, EM, XX },
!   { "pcmpgtw",		MX, EM, XX },
!   { "pcmpgtd",		MX, EM, XX },
!   { "packuswb",		MX, EM, XX },
    /* 68 */
!   { "punpckhbw",	MX, EM, XX },
!   { "punpckhwd",	MX, EM, XX },
!   { "punpckhdq",	MX, EM, XX },
!   { "packssdw",		MX, EM, XX },
    { PREGRP26 },
    { PREGRP24 },
!   { "movd",		MX, Ed, XX },
    { PREGRP19 },
    /* 70 */
    { PREGRP22 },
    { GRP10 },
    { GRP11 },
    { GRP12 },
!   { "pcmpeqb",		MX, EM, XX },
!   { "pcmpeqw",		MX, EM, XX },
!   { "pcmpeqd",		MX, EM, XX },
!   { "emms",		XX, XX, XX },
    /* 78 */
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
    { PREGRP23 },
    { PREGRP20 },
    /* 80 */
!   { "joH",		Jv, XX, cond_jump_flag },
!   { "jnoH",		Jv, XX, cond_jump_flag },
!   { "jbH",		Jv, XX, cond_jump_flag },
!   { "jaeH",		Jv, XX, cond_jump_flag },
!   { "jeH",		Jv, XX, cond_jump_flag },
!   { "jneH",		Jv, XX, cond_jump_flag },
!   { "jbeH",		Jv, XX, cond_jump_flag },
!   { "jaH",		Jv, XX, cond_jump_flag },
    /* 88 */
!   { "jsH",		Jv, XX, cond_jump_flag },
!   { "jnsH",		Jv, XX, cond_jump_flag },
!   { "jpH",		Jv, XX, cond_jump_flag },
!   { "jnpH",		Jv, XX, cond_jump_flag },
!   { "jlH",		Jv, XX, cond_jump_flag },
!   { "jgeH",		Jv, XX, cond_jump_flag },
!   { "jleH",		Jv, XX, cond_jump_flag },
!   { "jgH",		Jv, XX, cond_jump_flag },
    /* 90 */
!   { "seto",		Eb, XX, XX },
!   { "setno",		Eb, XX, XX },
!   { "setb",		Eb, XX, XX },
!   { "setae",		Eb, XX, XX },
!   { "sete",		Eb, XX, XX },
!   { "setne",		Eb, XX, XX },
!   { "setbe",		Eb, XX, XX },
!   { "seta",		Eb, XX, XX },
    /* 98 */
!   { "sets",		Eb, XX, XX },
!   { "setns",		Eb, XX, XX },
!   { "setp",		Eb, XX, XX },
!   { "setnp",		Eb, XX, XX },
!   { "setl",		Eb, XX, XX },
!   { "setge",		Eb, XX, XX },
!   { "setle",		Eb, XX, XX },
!   { "setg",		Eb, XX, XX },
    /* a0 */
!   { "pushT",		fs, XX, XX },
!   { "popT",		fs, XX, XX },
!   { "cpuid",		XX, XX, XX },
!   { "btS",		Ev, Gv, XX },
!   { "shldS",		Ev, Gv, Ib },
!   { "shldS",		Ev, Gv, CL },
!   { "(bad)",		XX, XX, XX },
!   { "(bad)",		XX, XX, XX },
    /* a8 */
!   { "pushT",		gs, XX, XX },
!   { "popT",		gs, XX, XX },
!   { "rsm",		XX, XX, XX },
!   { "btsS",		Ev, Gv, XX },
!   { "shrdS",		Ev, Gv, Ib },
!   { "shrdS",		Ev, Gv, CL },
    { GRP13 },
!   { "imulS",		Gv, Ev, XX },
    /* b0 */
!   { "cmpxchgB",		Eb, Gb, XX },
!   { "cmpxchgS",		Ev, Gv, XX },
!   { "lssS",		Gv, Mp, XX },
!   { "btrS",		Ev, Gv, XX },
!   { "lfsS",		Gv, Mp, XX },
!   { "lgsS",		Gv, Mp, XX },
!   { "movz{bR|x|bR|x}",	Gv, Eb, XX },
!   { "movz{wR|x|wR|x}",	Gv, Ew, XX }, /* yes, there really is movzww ! */
    /* b8 */
!   { "(bad)",		XX, XX, XX },
!   { "ud2b",		XX, XX, XX },
    { GRP8 },
!   { "btcS",		Ev, Gv, XX },
!   { "bsfS",		Gv, Ev, XX },
!   { "bsrS",		Gv, Ev, XX },
!   { "movs{bR|x|bR|x}",	Gv, Eb, XX },
!   { "movs{wR|x|wR|x}",	Gv, Ew, XX }, /* yes, there really is movsww ! */
    /* c0 */
!   { "xaddB",		Eb, Gb, XX },
!   { "xaddS",		Ev, Gv, XX },
    { PREGRP1 },
!   { "movntiS",		Ev, Gv, XX },
!   { "pinsrw",		MX, Ed, Ib },
!   { "pextrw",		Gd, MS, Ib },
!   { "shufpX",		XM, EX, Ib },
    { GRP9 },
    /* c8 */
!   { "bswap",		RMeAX, XX, XX },
!   { "bswap",		RMeCX, XX, XX },
!   { "bswap",		RMeDX, XX, XX },
!   { "bswap",		RMeBX, XX, XX },
!   { "bswap",		RMeSP, XX, XX },
!   { "bswap",		RMeBP, XX, XX },
!   { "bswap",		RMeSI, XX, XX },
!   { "bswap",		RMeDI, XX, XX },
    /* d0 */
!   { "(bad)",		XX, XX, XX },
!   { "psrlw",		MX, EM, XX },
!   { "psrld",		MX, EM, XX },
!   { "psrlq",		MX, EM, XX },
!   { "paddq",		MX, EM, XX },
!   { "pmullw",		MX, EM, XX },
    { PREGRP21 },
!   { "pmovmskb",		Gd, MS, XX },
    /* d8 */
!   { "psubusb",		MX, EM, XX },
!   { "psubusw",		MX, EM, XX },
!   { "pminub",		MX, EM, XX },
!   { "pand",		MX, EM, XX },
!   { "paddusb",		MX, EM, XX },
!   { "paddusw",		MX, EM, XX },
!   { "pmaxub",		MX, EM, XX },
!   { "pandn",		MX, EM, XX },
    /* e0 */
!   { "pavgb",		MX, EM, XX },
!   { "psraw",		MX, EM, XX },
!   { "psrad",		MX, EM, XX },
!   { "pavgw",		MX, EM, XX },
!   { "pmulhuw",		MX, EM, XX },
!   { "pmulhw",		MX, EM, XX },
    { PREGRP15 },
    { PREGRP25 },
    /* e8 */
!   { "psubsb",		MX, EM, XX },
!   { "psubsw",		MX, EM, XX },
!   { "pminsw",		MX, EM, XX },
!   { "por",		MX, EM, XX },
!   { "paddsb",		MX, EM, XX },
!   { "paddsw",		MX, EM, XX },
!   { "pmaxsw",		MX, EM, XX },
!   { "pxor",		MX, EM, XX },
    /* f0 */
!   { "(bad)",		XX, XX, XX },
!   { "psllw",		MX, EM, XX },
!   { "pslld",		MX, EM, XX },
!   { "psllq",		MX, EM, XX },
!   { "pmuludq",		MX, EM, XX },
!   { "pmaddwd",		MX, EM, XX },
!   { "psadbw",		MX, EM, XX },
    { PREGRP18 },
    /* f8 */
!   { "psubb",		MX, EM, XX },
!   { "psubw",		MX, EM, XX },
!   { "psubd",		MX, EM, XX },
!   { "psubq",		MX, EM, XX },
!   { "paddb",		MX, EM, XX },
!   { "paddw",		MX, EM, XX },
!   { "paddd",		MX, EM, XX },
!   { "(bad)",		XX, XX, XX }
  };
  
  static const unsigned char onebyte_has_modrm[256] = {
    /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
    /*       -------------------------------        */
*************** static int mod;
*** 2287,2293 ****
  static int rm;
  static int reg;
  static unsigned char need_modrm;
- static void oappend PARAMS ((const char *s));
  
  /* If we are accessing mod/rm/reg without need_modrm set, then the
     values are stale.  Hitting this abort likely indicates that you
--- 1126,1131 ----
*************** static const struct dis386 grps[][8] = {
*** 2457,2467 ****
    {
      { "incQ",	Ev, XX, XX },
      { "decQ",	Ev, XX, XX },
!     { "callI",	indirEv, XX, XX },
!     { "lcallI",	indirEv, XX, XX },
!     { "jmpI",	indirEv, XX, XX },
!     { "ljmpI",	indirEv, XX, XX },
!     { "pushT",	Ev, XX, XX },
      { "(bad)",	XX, XX, XX },
    },
    /* GRP6 */
--- 1295,1305 ----
    {
      { "incQ",	Ev, XX, XX },
      { "decQ",	Ev, XX, XX },
!     { "callT",	indirEv, XX, XX },
!     { "lcallT",	indirEv, XX, XX },
!     { "jmpT",	indirEv, XX, XX },
!     { "ljmpT",	indirEv, XX, XX },
!     { "pushU",	Ev, XX, XX },
      { "(bad)",	XX, XX, XX },
    },
    /* GRP6 */
*************** static const struct dis386 prefix_user_t
*** 2770,2775 ****
--- 1608,1620 ----
    },
  };
  
+ static const struct dis386 x86_64_table[][2] = {
+   {
+     { "arpl", Ew, Gw, XX },
+     { "movs{||lq|xd}", Gv, Ed, XX },
+   },
+ };
+ 
  #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
  
  static void
*************** static bfd_vma start_pc;
*** 2955,2963 ****
   * The function returns the length of this instruction in bytes.
   */
  
- static int print_insn_i386
-   PARAMS ((bfd_vma pc, disassemble_info *info));
- 
  static char intel_syntax;
  static char open_char;
  static char close_char;
--- 1800,1805 ----
*************** print_insn_i386 (pc, info)
*** 3093,3117 ****
    if (*codep == 0x0f)
      {
        FETCH_DATA (info, codep + 2);
!       if (intel_syntax)
!         dp = &dis386_twobyte_intel[*++codep];
!       else
!         dp = &dis386_twobyte_att[*++codep];
        need_modrm = twobyte_has_modrm[*codep];
        uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
      }
    else
      {
!       if (intel_syntax)
! 	if (mode_64bit)
! 	  dp = &dis386_64_intel[*codep];
! 	else
! 	  dp = &dis386_intel[*codep];
!       else
! 	if (mode_64bit)
! 	  dp = &disx86_64_att[*codep];
! 	else
! 	  dp = &dis386_att[*codep];
        need_modrm = onebyte_has_modrm[*codep];
        uses_SSE_prefix = 0;
      }
--- 1935,1947 ----
    if (*codep == 0x0f)
      {
        FETCH_DATA (info, codep + 2);
!       dp = &dis386_twobyte[*++codep];
        need_modrm = twobyte_has_modrm[*codep];
        uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
      }
    else
      {
!       dp = &dis386[*codep];
        need_modrm = onebyte_has_modrm[*codep];
        uses_SSE_prefix = 0;
      }
*************** print_insn_i386 (pc, info)
*** 3136,3142 ****
    if (prefixes & PREFIX_ADDR)
      {
        sizeflag ^= AFLAG;
!       if (dp->bytemode2 != loop_jcxz_mode)
  	{
  	  if (sizeflag & AFLAG)
  	    oappend ("addr32 ");
--- 1966,1972 ----
    if (prefixes & PREFIX_ADDR)
      {
        sizeflag ^= AFLAG;
!       if (dp->bytemode3 != loop_jcxz_mode || intel_syntax)
  	{
  	  if (sizeflag & AFLAG)
  	    oappend ("addr32 ");
*************** print_insn_i386 (pc, info)
*** 3149,3155 ****
    if (!uses_SSE_prefix && (prefixes & PREFIX_DATA))
      {
        sizeflag ^= DFLAG;
!       if (dp->bytemode2 == cond_jump_mode && dp->bytemode1 == v_mode)
  	{
  	  if (sizeflag & DFLAG)
  	    oappend ("data32 ");
--- 1979,1987 ----
    if (!uses_SSE_prefix && (prefixes & PREFIX_DATA))
      {
        sizeflag ^= DFLAG;
!       if (dp->bytemode3 == cond_jump_mode
! 	  && dp->bytemode1 == v_mode
! 	  && !intel_syntax)
  	{
  	  if (sizeflag & DFLAG)
  	    oappend ("data32 ");
*************** print_insn_i386 (pc, info)
*** 3166,3177 ****
        reg = (*codep >> 3) & 7;
        rm = *codep & 7;
      }
-   else
-     {
-       mod = 0;
-       reg = 0;
-       rm = 0;
-     }
  
    if (dp->name == NULL && dp->bytemode1 == FLOATCODE)
      {
--- 1998,2003 ----
*************** print_insn_i386 (pc, info)
*** 3182,3233 ****
        int index;
        if (dp->name == NULL)
  	{
! 	  switch(dp->bytemode2)
  	    {
! 	      case USE_GROUPS:
! 	        dp = &grps[dp->bytemode1][reg];
! 		break;
! 	      case USE_PREFIX_USER_TABLE:
! 		index = 0;
! 		used_prefixes |= (prefixes & PREFIX_REPZ);
! 		if (prefixes & PREFIX_REPZ)
! 		  index = 1;
! 		else
! 		  {
! 		    used_prefixes |= (prefixes & PREFIX_DATA);
! 		    if (prefixes & PREFIX_DATA)
! 		      index = 2;
! 		    else
! 		      {
! 			used_prefixes |= (prefixes & PREFIX_REPNZ);
! 			if (prefixes & PREFIX_REPNZ)
! 			  index = 3;
! 		      }
! 		  }
! 		dp = &prefix_user_table[dp->bytemode1][index];
! 		break;
! 	      default:
! 		oappend (INTERNAL_DISASSEMBLER_ERROR);
! 		break;
  	    }
  	}
- 
-       putop (dp->name, sizeflag);
- 
-       obufp = op1out;
-       op_ad = 2;
-       if (dp->op1)
- 	(*dp->op1)(dp->bytemode1, sizeflag);
- 
-       obufp = op2out;
-       op_ad = 1;
-       if (dp->op2)
- 	(*dp->op2)(dp->bytemode2, sizeflag);
  
!       obufp = op3out;
!       op_ad = 0;
!       if (dp->op3)
! 	(*dp->op3)(dp->bytemode3, sizeflag);
      }
  
    /* See if any prefixes were not used.  If so, print the first one
--- 2008,2066 ----
        int index;
        if (dp->name == NULL)
  	{
! 	  switch (dp->bytemode1)
  	    {
! 	    case USE_GROUPS:
! 	      dp = &grps[dp->bytemode2][reg];
! 	      break;
! 
! 	    case USE_PREFIX_USER_TABLE:
! 	      index = 0;
! 	      used_prefixes |= (prefixes & PREFIX_REPZ);
! 	      if (prefixes & PREFIX_REPZ)
! 		index = 1;
! 	      else
! 		{
! 		  used_prefixes |= (prefixes & PREFIX_DATA);
! 		  if (prefixes & PREFIX_DATA)
! 		    index = 2;
! 		  else
! 		    {
! 		      used_prefixes |= (prefixes & PREFIX_REPNZ);
! 		      if (prefixes & PREFIX_REPNZ)
! 			index = 3;
! 		    }
! 		}
! 	      dp = &prefix_user_table[dp->bytemode2][index];
! 	      break;
! 
! 	    case X86_64_SPECIAL:
! 	      dp = &x86_64_table[dp->bytemode2][mode_64bit];
! 	      break;
! 
! 	    default:
! 	      oappend (INTERNAL_DISASSEMBLER_ERROR);
! 	      break;
  	    }
  	}
  
!       if (putop (dp->name, sizeflag) == 0)
! 	{
! 	  obufp = op1out;
! 	  op_ad = 2;
! 	  if (dp->op1)
! 	    (*dp->op1)(dp->bytemode1, sizeflag);
! 
! 	  obufp = op2out;
! 	  op_ad = 1;
! 	  if (dp->op2)
! 	    (*dp->op2)(dp->bytemode2, sizeflag);
! 
! 	  obufp = op3out;
! 	  op_ad = 0;
! 	  if (dp->op3)
! 	    (*dp->op3)(dp->bytemode3, sizeflag);
! 	}
      }
  
    /* See if any prefixes were not used.  If so, print the first one
*************** print_insn_i386 (pc, info)
*** 3313,3445 ****
        }
    return codep - inbuf;
  }
- 
- static const char *float_mem_att[] = {
-   /* d8 */
-   "fadds",
-   "fmuls",
-   "fcoms",
-   "fcomps",
-   "fsubs",
-   "fsubrs",
-   "fdivs",
-   "fdivrs",
-   /*  d9 */
-   "flds",
-   "(bad)",
-   "fsts",
-   "fstps",
-   "fldenv",
-   "fldcw",
-   "fNstenv",
-   "fNstcw",
-   /* da */
-   "fiaddl",
-   "fimull",
-   "ficoml",
-   "ficompl",
-   "fisubl",
-   "fisubrl",
-   "fidivl",
-   "fidivrl",
-   /* db */
-   "fildl",
-   "(bad)",
-   "fistl",
-   "fistpl",
-   "(bad)",
-   "fldt",
-   "(bad)",
-   "fstpt",
-   /* dc */
-   "faddl",
-   "fmull",
-   "fcoml",
-   "fcompl",
-   "fsubl",
-   "fsubrl",
-   "fdivl",
-   "fdivrl",
-   /* dd */
-   "fldl",
-   "(bad)",
-   "fstl",
-   "fstpl",
-   "frstor",
-   "(bad)",
-   "fNsave",
-   "fNstsw",
-   /* de */
-   "fiadd",
-   "fimul",
-   "ficom",
-   "ficomp",
-   "fisub",
-   "fisubr",
-   "fidiv",
-   "fidivr",
-   /* df */
-   "fild",
-   "(bad)",
-   "fist",
-   "fistp",
-   "fbld",
-   "fildll",
-   "fbstp",
-   "fistpll",
- };
  
! static const char *float_mem_intel[] = {
    /* d8 */
!   "fadd",
!   "fmul",
!   "fcom",
!   "fcomp",
!   "fsub",
!   "fsubr",
!   "fdiv",
!   "fdivr",
    /*  d9 */
!   "fld",
    "(bad)",
!   "fst",
!   "fstp",
    "fldenv",
    "fldcw",
    "fNstenv",
    "fNstcw",
    /* da */
!   "fiadd",
!   "fimul",
!   "ficom",
!   "ficomp",
!   "fisub",
!   "fisubr",
!   "fidiv",
!   "fidivr",
    /* db */
!   "fild",
    "(bad)",
!   "fist",
!   "fistp",
    "(bad)",
!   "fld",
    "(bad)",
!   "fstp",
    /* dc */
!   "fadd",
!   "fmul",
!   "fcom",
!   "fcomp",
!   "fsub",
!   "fsubr",
!   "fdiv",
!   "fdivr",
    /* dd */
!   "fld",
    "(bad)",
!   "fst",
!   "fstp",
    "frstor",
    "(bad)",
    "fNsave",
--- 2146,2203 ----
        }
    return codep - inbuf;
  }
  
! static const char *float_mem[] = {
    /* d8 */
!   "fadd{s||s|}",
!   "fmul{s||s|}",
!   "fcom{s||s|}",
!   "fcomp{s||s|}",
!   "fsub{s||s|}",
!   "fsubr{s||s|}",
!   "fdiv{s||s|}",
!   "fdivr{s||s|}",
    /*  d9 */
!   "fld{s||s|}",
    "(bad)",
!   "fst{s||s|}",
!   "fstp{s||s|}",
    "fldenv",
    "fldcw",
    "fNstenv",
    "fNstcw",
    /* da */
!   "fiadd{l||l|}",
!   "fimul{l||l|}",
!   "ficom{l||l|}",
!   "ficomp{l||l|}",
!   "fisub{l||l|}",
!   "fisubr{l||l|}",
!   "fidiv{l||l|}",
!   "fidivr{l||l|}",
    /* db */
!   "fild{l||l|}",
    "(bad)",
!   "fist{l||l|}",
!   "fistp{l||l|}",
    "(bad)",
!   "fld{t||t|}",
    "(bad)",
!   "fstp{t||t|}",
    /* dc */
!   "fadd{l||l|}",
!   "fmul{l||l|}",
!   "fcom{l||l|}",
!   "fcomp{l||l|}",
!   "fsub{l||l|}",
!   "fsubr{l||l|}",
!   "fdiv{l||l|}",
!   "fdivr{l||l|}",
    /* dd */
!   "fld{l||l|}",
    "(bad)",
!   "fst{l||l|}",
!   "fstp{l||l|}",
    "frstor",
    "(bad)",
    "fNsave",
*************** static const char *float_mem_intel[] = {
*** 3459,3465 ****
    "fist",
    "fistp",
    "fbld",
!   "fild",
    "fbstp",
    "fistpll",
  };
--- 2217,2223 ----
    "fist",
    "fistp",
    "fbld",
!   "fild{ll||ll|}",
    "fbstp",
    "fistpll",
  };
*************** dofloat (sizeflag)
*** 3642,3651 ****
  
    if (mod != 3)
      {
!       if (intel_syntax)
!         putop (float_mem_intel[(floatop - 0xd8 ) * 8 + reg], sizeflag);
!       else
!         putop (float_mem_att[(floatop - 0xd8 ) * 8 + reg], sizeflag);
        obufp = op1out;
        if (floatop == 0xdb)
          OP_E (x_mode, sizeflag);
--- 2400,2406 ----
  
    if (mod != 3)
      {
!       putop (float_mem[(floatop - 0xd8 ) * 8 + reg], sizeflag);
        obufp = op1out;
        if (floatop == 0xdb)
          OP_E (x_mode, sizeflag);
*************** dofloat (sizeflag)
*** 3681,3713 ****
      }
  }
  
- /* ARGSUSED */
  static void
! OP_ST (ignore, sizeflag)
!      int ignore ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    oappend ("%st");
  }
  
- /* ARGSUSED */
  static void
! OP_STi (ignore, sizeflag)
!      int ignore ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    sprintf (scratchbuf, "%%st(%d)", rm);
    oappend (scratchbuf);
  }
  
- 
  /* capital letters in template are macros */
! static void
  putop (template, sizeflag)
       const char *template;
       int sizeflag;
  {
    const char *p;
  
    for (p = template; *p; p++)
      {
--- 2436,2466 ----
      }
  }
  
  static void
! OP_ST (bytemode, sizeflag)
!      int bytemode ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    oappend ("%st");
  }
  
  static void
! OP_STi (bytemode, sizeflag)
!      int bytemode ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    sprintf (scratchbuf, "%%st(%d)", rm);
    oappend (scratchbuf);
  }
  
  /* capital letters in template are macros */
! static int
  putop (template, sizeflag)
       const char *template;
       int sizeflag;
  {
    const char *p;
+   int alt;
  
    for (p = template; *p; p++)
      {
*************** putop (template, sizeflag)
*** 3716,3721 ****
--- 2469,2506 ----
  	default:
  	  *obufp++ = *p;
  	  break;
+ 	case '{':
+ 	  alt = 0;
+ 	  if (intel_syntax)
+ 	    alt += 1;
+ 	  if (mode_64bit)
+ 	    alt += 2;
+ 	  while (alt != 0)
+ 	    {
+ 	      while (*++p != '|')
+ 		{
+ 		  if (*p == '}')
+ 		    {
+ 		      /* Alternative not valid.  */
+ 		      strcpy (obuf, "(bad)");
+ 		      obufp = obuf + 5;
+ 		      return 1;
+ 		    }
+ 		  else if (*p == '\0')
+ 		    abort ();
+ 		}
+ 	      alt--;
+ 	    }
+ 	  break;
+ 	case '|':
+ 	  while (*++p != '}')
+ 	    {
+ 	      if (*p == '\0')
+ 		abort ();
+ 	    }
+ 	  break;
+ 	case '}':
+ 	  break;
  	case 'A':
            if (intel_syntax)
              break;
*************** putop (template, sizeflag)
*** 3740,3745 ****
--- 2525,2532 ----
  	  used_prefixes |= (prefixes & PREFIX_ADDR);
  	  break;
  	case 'F':
+           if (intel_syntax)
+             break;
  	  if ((prefixes & PREFIX_ADDR)
  #ifdef SUFFIX_ALWAYS
  	      || (sizeflag & SUFFIX_ALWAYS)
*************** putop (template, sizeflag)
*** 3754,3759 ****
--- 2541,2548 ----
  	    }
  	  break;
  	case 'H':
+           if (intel_syntax)
+             break;
  	  if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
  	      || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
  	    {
*************** putop (template, sizeflag)
*** 3766,3792 ****
  		*obufp++ = 'n';
  	    }
  	  break;
- 	case 'I':
-           if (intel_syntax)
-             break;
- 	  if (mode_64bit)
- 	    *obufp++ = 'q';
- 	  else
- 	    {
- 	      if ((prefixes & PREFIX_DATA)
- #ifdef SUFFIX_ALWAYS
- 		  || (sizeflag & SUFFIX_ALWAYS)
- #endif
- 		  )
- 		{
- 		  if (sizeflag & DFLAG)
- 		    *obufp++ = 'l';
- 		  else
- 		    *obufp++ = 'w';
- 		  used_prefixes |= (prefixes & PREFIX_DATA);
- 	      }
- 	    }
- 	  break;
  	case 'L':
            if (intel_syntax)
              break;
--- 2555,2560 ----
*************** putop (template, sizeflag)
*** 3804,3813 ****
  	case 'O':
  	  USED_REX (REX_MODE64);
  	  if (rex & REX_MODE64)
! 	      *obufp++ = 'o';
  	  else
  	    *obufp++ = 'd';
  	  break;
  	case 'P':
            if (intel_syntax)
              break;
--- 2572,2590 ----
  	case 'O':
  	  USED_REX (REX_MODE64);
  	  if (rex & REX_MODE64)
! 	    *obufp++ = 'o';
  	  else
  	    *obufp++ = 'd';
  	  break;
+ 	case 'T':
+           if (intel_syntax)
+             break;
+ 	  if (mode_64bit)
+ 	    {
+ 	      *obufp++ = 'q';
+ 	      break;
+ 	    }
+ 	  /* Fall through */
  	case 'P':
            if (intel_syntax)
              break;
*************** putop (template, sizeflag)
*** 3831,3836 ****
--- 2608,2622 ----
  		}
  	    }
  	  break;
+ 	case 'U':
+           if (intel_syntax)
+             break;
+ 	  if (mode_64bit)
+ 	    {
+ 	      *obufp++ = 'q';
+ 	      break;
+ 	    }
+ 	  /* Fall through */
  	case 'Q':
            if (intel_syntax)
              break;
*************** putop (template, sizeflag)
*** 3904,3927 ****
  	    }
  #endif
  	  break;
- 	case 'T':
-           if (intel_syntax)
-             break;
- 	  if (mode_64bit)
- 	    *obufp++ = 'q';
- 	  else if (mod != 3
- #ifdef SUFFIX_ALWAYS
- 		   || (sizeflag & SUFFIX_ALWAYS)
- #endif
- 		  )
- 	    {
- 	      if (sizeflag & DFLAG)
- 		*obufp++ = 'l';
- 	      else
- 		*obufp++ = 'w';
- 	      used_prefixes |= (prefixes & PREFIX_DATA);
- 	    }
- 	  break;
  	case 'X':
  	  if (prefixes & PREFIX_DATA)
  	    *obufp++ = 'd';
--- 2690,2695 ----
*************** putop (template, sizeflag)
*** 3971,3976 ****
--- 2739,2745 ----
  	}
      }
    *obufp = 0;
+   return 0;
  }
  
  static void
*************** OP_REG (code, sizeflag)
*** 4509,4514 ****
--- 3278,3292 ----
        else
  	s = names8[code - al_reg];
        break;
+     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
+     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
+       if (mode_64bit)
+ 	{
+ 	  s = names64[code - rAX_reg + add];
+ 	  break;
+ 	}
+       code += eAX_reg - rAX_reg;
+       /* Fall through */
      case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
      case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
        USED_REX (REX_MODE64);
*************** OP_REG (code, sizeflag)
*** 4520,4529 ****
  	s = names16[code - eAX_reg + add];
        used_prefixes |= (prefixes & PREFIX_DATA);
        break;
-     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
-     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
-       s = names64[code - rAX_reg + add];
-       break;
      default:
        s = INTERNAL_DISASSEMBLER_ERROR;
        break;
--- 3298,3303 ----
*************** OP_I (bytemode, sizeflag)
*** 4593,4600 ****
        mask = 0xff;
        break;
      case q_mode:
!       op = get32s ();
!       break;
      case v_mode:
        USED_REX (REX_MODE64);
        if (rex & REX_MODE64)
--- 3367,3378 ----
        mask = 0xff;
        break;
      case q_mode:
!       if (mode_64bit)
! 	{
! 	  op = get32s ();
! 	  break;
! 	}
!       /* Fall through */
      case v_mode:
        USED_REX (REX_MODE64);
        if (rex & REX_MODE64)
*************** OP_I64 (bytemode, sizeflag)
*** 4635,4640 ****
--- 3413,3424 ----
    bfd_signed_vma op;
    bfd_signed_vma mask = -1;
  
+   if (!mode_64bit)
+     {
+       OP_I (bytemode, sizeflag);
+       return;
+     }
+ 
    switch (bytemode)
      {
      case b_mode:
*************** OP_J (bytemode, sizeflag)
*** 4763,4769 ****
    oappend (scratchbuf);
  }
  
- /* ARGSUSED */
  static void
  OP_SEG (dummy, sizeflag)
       int dummy ATTRIBUTE_UNUSED;
--- 3547,3552 ----
*************** OP_SEG (dummy, sizeflag)
*** 4776,4782 ****
    oappend (sreg[reg]);
  }
  
- /* ARGSUSED */
  static void
  OP_DIR (dummy, sizeflag)
       int dummy ATTRIBUTE_UNUSED;
--- 3559,3564 ----
*************** OP_DIR (dummy, sizeflag)
*** 4799,4808 ****
    oappend (scratchbuf);
  }
  
- /* ARGSUSED */
  static void
! OP_OFF (ignored, sizeflag)
!      int ignored ATTRIBUTE_UNUSED;
       int sizeflag;
  {
    bfd_vma off;
--- 3581,3589 ----
    oappend (scratchbuf);
  }
  
  static void
! OP_OFF (bytemode, sizeflag)
!      int bytemode ATTRIBUTE_UNUSED;
       int sizeflag;
  {
    bfd_vma off;
*************** OP_OFF (ignored, sizeflag)
*** 4826,4839 ****
    print_operand_value (scratchbuf, 1, off);
    oappend (scratchbuf);
  }
! /* ARGSUSED */
  static void
! OP_OFF64 (ignored, sizeflag)
!      int ignored ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    bfd_vma off;
  
    append_seg ();
  
    off = get64();
--- 3607,3626 ----
    print_operand_value (scratchbuf, 1, off);
    oappend (scratchbuf);
  }
! 
  static void
! OP_OFF64 (bytemode, sizeflag)
!      int bytemode ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    bfd_vma off;
  
+   if (!mode_64bit)
+     {
+       OP_OFF (bytemode, sizeflag);
+       return;
+     }
+ 
    append_seg ();
  
    off = get64();
*************** OP_DSreg (code, sizeflag)
*** 4895,4901 ****
    ptr_reg (code, sizeflag);
  }
  
- /* ARGSUSED */
  static void
  OP_C (dummy, sizeflag)
       int dummy ATTRIBUTE_UNUSED;
--- 3682,3687 ----
*************** OP_C (dummy, sizeflag)
*** 4909,4915 ****
    oappend (scratchbuf);
  }
  
- /* ARGSUSED */
  static void
  OP_D (dummy, sizeflag)
       int dummy ATTRIBUTE_UNUSED;
--- 3695,3700 ----
*************** OP_D (dummy, sizeflag)
*** 4923,4929 ****
    oappend (scratchbuf);
  }
  
- /* ARGSUSED */
  static void
  OP_T (dummy, sizeflag)
       int dummy ATTRIBUTE_UNUSED;
--- 3708,3713 ----
*************** OP_Rd (bytemode, sizeflag)
*** 4945,4952 ****
  }
  
  static void
! OP_MMX (ignore, sizeflag)
!      int ignore ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    int add = 0;
--- 3729,3736 ----
  }
  
  static void
! OP_MMX (bytemode, sizeflag)
!      int bytemode ATTRIBUTE_UNUSED;
       int sizeflag ATTRIBUTE_UNUSED;
  {
    int add = 0;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]