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