]> CyberLeo.Net >> Repos - FreeBSD/stable/8.git/blob - contrib/binutils/opcodes/i386-dis.c
MFC r362623:
[FreeBSD/stable/8.git] / contrib / binutils / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
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
29 /*
30  * The main tables describing the instructions is essentially a copy
31  * of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32  * Programmers Manual.  Usually, there is a capital letter, followed
33  * by a small letter.  The capital letter tell the addressing mode,
34  * and the small letter tells about the operand size.  Refer to
35  * the Intel manual for details.
36  */
37
38 #include "dis-asm.h"
39 #include "sysdep.h"
40 #include "opintl.h"
41
42 #define MAXLEN 20
43
44 #include <setjmp.h>
45
46 #ifndef UNIXWARE_COMPAT
47 /* Set non-zero for broken, compatible instructions.  Set to zero for
48    non-broken opcodes.  */
49 #define UNIXWARE_COMPAT 1
50 #endif
51
52 static int fetch_data (struct disassemble_info *, bfd_byte *);
53 static void ckprefix (void);
54 static const char *prefix_name (int, int);
55 static int print_insn (bfd_vma, disassemble_info *);
56 static void dofloat (int);
57 static void OP_ST (int, int);
58 static void OP_STi (int, int);
59 static int putop (const char *, int);
60 static void oappend (const char *);
61 static void append_seg (void);
62 static void OP_indirE (int, int);
63 static void print_operand_value (char *, int, bfd_vma);
64 static void OP_E (int, int);
65 static void OP_G (int, int);
66 static bfd_vma get64 (void);
67 static bfd_signed_vma get32 (void);
68 static bfd_signed_vma get32s (void);
69 static int get16 (void);
70 static void set_op (bfd_vma, int);
71 static void OP_REG (int, int);
72 static void OP_IMREG (int, int);
73 static void OP_I (int, int);
74 static void OP_I64 (int, int);
75 static void OP_sI (int, int);
76 static void OP_J (int, int);
77 static void OP_SEG (int, int);
78 static void OP_DIR (int, int);
79 static void OP_OFF (int, int);
80 static void OP_OFF64 (int, int);
81 static void ptr_reg (int, int);
82 static void OP_ESreg (int, int);
83 static void OP_DSreg (int, int);
84 static void OP_C (int, int);
85 static void OP_D (int, int);
86 static void OP_T (int, int);
87 static void OP_Rd (int, int);
88 static void OP_MMX (int, int);
89 static void OP_XMM (int, int);
90 static void OP_EM (int, int);
91 static void OP_EX (int, int);
92 static void OP_MS (int, int);
93 static void OP_XS (int, int);
94 static void OP_M (int, int);
95 static void OP_0fae (int, int);
96 static void OP_0f07 (int, int);
97 static void NOP_Fixup (int, int);
98 static void OP_3DNowSuffix (int, int);
99 static void OP_SIMD_Suffix (int, int);
100 static void SIMD_Fixup (int, int);
101 static void PNI_Fixup (int, int);
102 static void INVLPG_Fixup (int, int);
103 static void BadOp (void);
104
105 struct dis_private {
106   /* Points to first byte not fetched.  */
107   bfd_byte *max_fetched;
108   bfd_byte the_buffer[MAXLEN];
109   bfd_vma insn_start;
110   int orig_sizeflag;
111   jmp_buf bailout;
112 };
113
114 /* The opcode for the fwait instruction, which we treat as a prefix
115    when we can.  */
116 #define FWAIT_OPCODE (0x9b)
117
118 /* Set to 1 for 64bit mode disassembly.  */
119 static int mode_64bit;
120
121 /* Flags for the prefixes for the current instruction.  See below.  */
122 static int prefixes;
123
124 /* REX prefix the current instruction.  See below.  */
125 static int rex;
126 /* Bits of REX we've already used.  */
127 static int rex_used;
128 #define REX_MODE64      8
129 #define REX_EXTX        4
130 #define REX_EXTY        2
131 #define REX_EXTZ        1
132 /* Mark parts used in the REX prefix.  When we are testing for
133    empty prefix (for 8bit register REX extension), just mask it
134    out.  Otherwise test for REX bit is excuse for existence of REX
135    only in case value is nonzero.  */
136 #define USED_REX(value)                                 \
137   {                                                     \
138     if (value)                                          \
139       rex_used |= (rex & value) ? (value) | 0x40 : 0;   \
140     else                                                \
141       rex_used |= 0x40;                                 \
142   }
143
144 /* Flags for prefixes which we somehow handled when printing the
145    current instruction.  */
146 static int used_prefixes;
147
148 /* Flags stored in PREFIXES.  */
149 #define PREFIX_REPZ 1
150 #define PREFIX_REPNZ 2
151 #define PREFIX_LOCK 4
152 #define PREFIX_CS 8
153 #define PREFIX_SS 0x10
154 #define PREFIX_DS 0x20
155 #define PREFIX_ES 0x40
156 #define PREFIX_FS 0x80
157 #define PREFIX_GS 0x100
158 #define PREFIX_DATA 0x200
159 #define PREFIX_ADDR 0x400
160 #define PREFIX_FWAIT 0x800
161
162 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
163    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
164    on error.  */
165 #define FETCH_DATA(info, addr) \
166   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
167    ? 1 : fetch_data ((info), (addr)))
168
169 static int
170 fetch_data (struct disassemble_info *info, bfd_byte *addr)
171 {
172   int status;
173   struct dis_private *priv = (struct dis_private *) info->private_data;
174   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
175
176   status = (*info->read_memory_func) (start,
177                                       priv->max_fetched,
178                                       addr - priv->max_fetched,
179                                       info);
180   if (status != 0)
181     {
182       /* If we did manage to read at least one byte, then
183          print_insn_i386 will do something sensible.  Otherwise, print
184          an error.  We do that here because this is where we know
185          STATUS.  */
186       if (priv->max_fetched == priv->the_buffer)
187         (*info->memory_error_func) (status, start, info);
188       longjmp (priv->bailout, 1);
189     }
190   else
191     priv->max_fetched = addr;
192   return 1;
193 }
194
195 #define XX NULL, 0
196
197 #define Eb OP_E, b_mode
198 #define Ev OP_E, v_mode
199 #define Ed OP_E, d_mode
200 #define Edq OP_E, dq_mode
201 #define indirEb OP_indirE, b_mode
202 #define indirEv OP_indirE, v_mode
203 #define Ew OP_E, w_mode
204 #define Ma OP_E, v_mode
205 #define M OP_M, 0               /* lea, lgdt, etc. */
206 #define Mp OP_M, 0              /* 32 or 48 bit memory operand for LDS, LES etc */
207 #define Gb OP_G, b_mode
208 #define Gv OP_G, v_mode
209 #define Gd OP_G, d_mode
210 #define Gw OP_G, w_mode
211 #define Rd OP_Rd, d_mode
212 #define Rm OP_Rd, m_mode
213 #define Ib OP_I, b_mode
214 #define sIb OP_sI, b_mode       /* sign extened byte */
215 #define Iv OP_I, v_mode
216 #define Iq OP_I, q_mode
217 #define Iv64 OP_I64, v_mode
218 #define Iw OP_I, w_mode
219 #define Jb OP_J, b_mode
220 #define Jv OP_J, v_mode
221 #define Cm OP_C, m_mode
222 #define Dm OP_D, m_mode
223 #define Td OP_T, d_mode
224
225 #define RMeAX OP_REG, eAX_reg
226 #define RMeBX OP_REG, eBX_reg
227 #define RMeCX OP_REG, eCX_reg
228 #define RMeDX OP_REG, eDX_reg
229 #define RMeSP OP_REG, eSP_reg
230 #define RMeBP OP_REG, eBP_reg
231 #define RMeSI OP_REG, eSI_reg
232 #define RMeDI OP_REG, eDI_reg
233 #define RMrAX OP_REG, rAX_reg
234 #define RMrBX OP_REG, rBX_reg
235 #define RMrCX OP_REG, rCX_reg
236 #define RMrDX OP_REG, rDX_reg
237 #define RMrSP OP_REG, rSP_reg
238 #define RMrBP OP_REG, rBP_reg
239 #define RMrSI OP_REG, rSI_reg
240 #define RMrDI OP_REG, rDI_reg
241 #define RMAL OP_REG, al_reg
242 #define RMAL OP_REG, al_reg
243 #define RMCL OP_REG, cl_reg
244 #define RMDL OP_REG, dl_reg
245 #define RMBL OP_REG, bl_reg
246 #define RMAH OP_REG, ah_reg
247 #define RMCH OP_REG, ch_reg
248 #define RMDH OP_REG, dh_reg
249 #define RMBH OP_REG, bh_reg
250 #define RMAX OP_REG, ax_reg
251 #define RMDX OP_REG, dx_reg
252
253 #define eAX OP_IMREG, eAX_reg
254 #define eBX OP_IMREG, eBX_reg
255 #define eCX OP_IMREG, eCX_reg
256 #define eDX OP_IMREG, eDX_reg
257 #define eSP OP_IMREG, eSP_reg
258 #define eBP OP_IMREG, eBP_reg
259 #define eSI OP_IMREG, eSI_reg
260 #define eDI OP_IMREG, eDI_reg
261 #define AL OP_IMREG, al_reg
262 #define AL OP_IMREG, al_reg
263 #define CL OP_IMREG, cl_reg
264 #define DL OP_IMREG, dl_reg
265 #define BL OP_IMREG, bl_reg
266 #define AH OP_IMREG, ah_reg
267 #define CH OP_IMREG, ch_reg
268 #define DH OP_IMREG, dh_reg
269 #define BH OP_IMREG, bh_reg
270 #define AX OP_IMREG, ax_reg
271 #define DX OP_IMREG, dx_reg
272 #define indirDX OP_IMREG, indir_dx_reg
273
274 #define Sw OP_SEG, w_mode
275 #define Ap OP_DIR, 0
276 #define Ob OP_OFF, b_mode
277 #define Ob64 OP_OFF64, b_mode
278 #define Ov OP_OFF, v_mode
279 #define Ov64 OP_OFF64, v_mode
280 #define Xb OP_DSreg, eSI_reg
281 #define Xv OP_DSreg, eSI_reg
282 #define Yb OP_ESreg, eDI_reg
283 #define Yv OP_ESreg, eDI_reg
284 #define DSBX OP_DSreg, eBX_reg
285
286 #define es OP_REG, es_reg
287 #define ss OP_REG, ss_reg
288 #define cs OP_REG, cs_reg
289 #define ds OP_REG, ds_reg
290 #define fs OP_REG, fs_reg
291 #define gs OP_REG, gs_reg
292
293 #define MX OP_MMX, 0
294 #define XM OP_XMM, 0
295 #define EM OP_EM, v_mode
296 #define EX OP_EX, v_mode
297 #define MS OP_MS, v_mode
298 #define XS OP_XS, v_mode
299 #define OPSUF OP_3DNowSuffix, 0
300 #define OPSIMD OP_SIMD_Suffix, 0
301
302 #define cond_jump_flag NULL, cond_jump_mode
303 #define loop_jcxz_flag NULL, loop_jcxz_mode
304
305 /* bits in sizeflag */
306 #define SUFFIX_ALWAYS 4
307 #define AFLAG 2
308 #define DFLAG 1
309
310 #define b_mode 1  /* byte operand */
311 #define v_mode 2  /* operand size depends on prefixes */
312 #define w_mode 3  /* word operand */
313 #define d_mode 4  /* double word operand  */
314 #define q_mode 5  /* quad word operand */
315 #define x_mode 6
316 #define m_mode 7  /* d_mode in 32bit, q_mode in 64bit mode.  */
317 #define cond_jump_mode 8
318 #define loop_jcxz_mode 9
319 #define dq_mode 10 /* operand size depends on REX prefixes.  */
320
321 #define es_reg 100
322 #define cs_reg 101
323 #define ss_reg 102
324 #define ds_reg 103
325 #define fs_reg 104
326 #define gs_reg 105
327
328 #define eAX_reg 108
329 #define eCX_reg 109
330 #define eDX_reg 110
331 #define eBX_reg 111
332 #define eSP_reg 112
333 #define eBP_reg 113
334 #define eSI_reg 114
335 #define eDI_reg 115
336
337 #define al_reg 116
338 #define cl_reg 117
339 #define dl_reg 118
340 #define bl_reg 119
341 #define ah_reg 120
342 #define ch_reg 121
343 #define dh_reg 122
344 #define bh_reg 123
345
346 #define ax_reg 124
347 #define cx_reg 125
348 #define dx_reg 126
349 #define bx_reg 127
350 #define sp_reg 128
351 #define bp_reg 129
352 #define si_reg 130
353 #define di_reg 131
354
355 #define rAX_reg 132
356 #define rCX_reg 133
357 #define rDX_reg 134
358 #define rBX_reg 135
359 #define rSP_reg 136
360 #define rBP_reg 137
361 #define rSI_reg 138
362 #define rDI_reg 139
363
364 #define indir_dx_reg 150
365
366 #define FLOATCODE 1
367 #define USE_GROUPS 2
368 #define USE_PREFIX_USER_TABLE 3
369 #define X86_64_SPECIAL 4
370 #define IS_3BYTE_OPCODE 5
371
372 #define FLOAT     NULL, NULL, FLOATCODE, NULL, 0, NULL, 0
373
374 #define GRP1b     NULL, NULL, USE_GROUPS, NULL,  0, NULL, 0
375 #define GRP1S     NULL, NULL, USE_GROUPS, NULL,  1, NULL, 0
376 #define GRP1Ss    NULL, NULL, USE_GROUPS, NULL,  2, NULL, 0
377 #define GRP2b     NULL, NULL, USE_GROUPS, NULL,  3, NULL, 0
378 #define GRP2S     NULL, NULL, USE_GROUPS, NULL,  4, NULL, 0
379 #define GRP2b_one NULL, NULL, USE_GROUPS, NULL,  5, NULL, 0
380 #define GRP2S_one NULL, NULL, USE_GROUPS, NULL,  6, NULL, 0
381 #define GRP2b_cl  NULL, NULL, USE_GROUPS, NULL,  7, NULL, 0
382 #define GRP2S_cl  NULL, NULL, USE_GROUPS, NULL,  8, NULL, 0
383 #define GRP3b     NULL, NULL, USE_GROUPS, NULL,  9, NULL, 0
384 #define GRP3S     NULL, NULL, USE_GROUPS, NULL, 10, NULL, 0
385 #define GRP4      NULL, NULL, USE_GROUPS, NULL, 11, NULL, 0
386 #define GRP5      NULL, NULL, USE_GROUPS, NULL, 12, NULL, 0
387 #define GRP6      NULL, NULL, USE_GROUPS, NULL, 13, NULL, 0
388 #define GRP7      NULL, NULL, USE_GROUPS, NULL, 14, NULL, 0
389 #define GRP8      NULL, NULL, USE_GROUPS, NULL, 15, NULL, 0
390 #define GRP9      NULL, NULL, USE_GROUPS, NULL, 16, NULL, 0
391 #define GRP10     NULL, NULL, USE_GROUPS, NULL, 17, NULL, 0
392 #define GRP11     NULL, NULL, USE_GROUPS, NULL, 18, NULL, 0
393 #define GRP12     NULL, NULL, USE_GROUPS, NULL, 19, NULL, 0
394 #define GRP13     NULL, NULL, USE_GROUPS, NULL, 20, NULL, 0
395 #define GRP14     NULL, NULL, USE_GROUPS, NULL, 21, NULL, 0
396 #define GRPAMD    NULL, NULL, USE_GROUPS, NULL, 22, NULL, 0
397 #define GRPPADLCK NULL, NULL, USE_GROUPS, NULL, 23, NULL, 0
398
399 #define PREGRP0   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  0, NULL, 0
400 #define PREGRP1   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  1, NULL, 0
401 #define PREGRP2   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  2, NULL, 0
402 #define PREGRP3   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  3, NULL, 0
403 #define PREGRP4   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  4, NULL, 0
404 #define PREGRP5   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  5, NULL, 0
405 #define PREGRP6   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  6, NULL, 0
406 #define PREGRP7   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  7, NULL, 0
407 #define PREGRP8   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  8, NULL, 0
408 #define PREGRP9   NULL, NULL, USE_PREFIX_USER_TABLE, NULL,  9, NULL, 0
409 #define PREGRP10  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 10, NULL, 0
410 #define PREGRP11  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 11, NULL, 0
411 #define PREGRP12  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 12, NULL, 0
412 #define PREGRP13  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 13, NULL, 0
413 #define PREGRP14  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 14, NULL, 0
414 #define PREGRP15  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 15, NULL, 0
415 #define PREGRP16  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 16, NULL, 0
416 #define PREGRP17  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 17, NULL, 0
417 #define PREGRP18  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 18, NULL, 0
418 #define PREGRP19  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 19, NULL, 0
419 #define PREGRP20  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 20, NULL, 0
420 #define PREGRP21  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 21, NULL, 0
421 #define PREGRP22  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 22, NULL, 0
422 #define PREGRP23  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 23, NULL, 0
423 #define PREGRP24  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 24, NULL, 0
424 #define PREGRP25  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 25, NULL, 0
425 #define PREGRP26  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 26, NULL, 0
426 #define PREGRP27  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 27, NULL, 0
427 #define PREGRP28  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 28, NULL, 0
428 #define PREGRP29  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 29, NULL, 0
429 #define PREGRP30  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 30, NULL, 0
430 #define PREGRP31  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 31, NULL, 0
431 #define PREGRP32  NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 32, NULL, 0
432
433 #define X86_64_0  NULL, NULL, X86_64_SPECIAL, NULL,  0, NULL, 0
434
435 #define THREE_BYTE_0 NULL, NULL, IS_3BYTE_OPCODE, NULL, 0, NULL, 0
436 #define THREE_BYTE_1 NULL, NULL, IS_3BYTE_OPCODE, NULL, 1, NULL, 0
437
438 typedef void (*op_rtn) (int bytemode, int sizeflag);
439
440 struct dis386 {
441   const char *name;
442   op_rtn op1;
443   int bytemode1;
444   op_rtn op2;
445   int bytemode2;
446   op_rtn op3;
447   int bytemode3;
448 };
449
450 /* Upper case letters in the instruction names here are macros.
451    'A' => print 'b' if no register operands or suffix_always is true
452    'B' => print 'b' if suffix_always is true
453    'E' => print 'e' if 32-bit form of jcxz
454    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
455    'H' => print ",pt" or ",pn" branch hint
456    'L' => print 'l' if suffix_always is true
457    'N' => print 'n' if instruction has no wait "prefix"
458    'O' => print 'd', or 'o'
459    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
460    .      or suffix_always is true.  print 'q' if rex prefix is present.
461    'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
462    .      is true
463    'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode)
464    'S' => print 'w', 'l' or 'q' if suffix_always is true
465    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
466    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
467    'X' => print 's', 'd' depending on data16 prefix (for XMM)
468    'W' => print 'b' or 'w' ("w" or "de" in intel mode)
469    'Y' => 'q' if instruction has an REX 64bit overwrite prefix
470
471    Many of the above letters print nothing in Intel mode.  See "putop"
472    for the details.
473
474    Braces '{' and '}', and vertical bars '|', indicate alternative
475    mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
476    modes.  In cases where there are only two alternatives, the X86_64
477    instruction is reserved, and "(bad)" is printed.
478 */
479
480 static const struct dis386 dis386[] = {
481   /* 00 */
482   { "addB",             Eb, Gb, XX },
483   { "addS",             Ev, Gv, XX },
484   { "addB",             Gb, Eb, XX },
485   { "addS",             Gv, Ev, XX },
486   { "addB",             AL, Ib, XX },
487   { "addS",             eAX, Iv, XX },
488   { "push{T|}",         es, XX, XX },
489   { "pop{T|}",          es, XX, XX },
490   /* 08 */
491   { "orB",              Eb, Gb, XX },
492   { "orS",              Ev, Gv, XX },
493   { "orB",              Gb, Eb, XX },
494   { "orS",              Gv, Ev, XX },
495   { "orB",              AL, Ib, XX },
496   { "orS",              eAX, Iv, XX },
497   { "push{T|}",         cs, XX, XX },
498   { "(bad)",            XX, XX, XX },   /* 0x0f extended opcode escape */
499   /* 10 */
500   { "adcB",             Eb, Gb, XX },
501   { "adcS",             Ev, Gv, XX },
502   { "adcB",             Gb, Eb, XX },
503   { "adcS",             Gv, Ev, XX },
504   { "adcB",             AL, Ib, XX },
505   { "adcS",             eAX, Iv, XX },
506   { "push{T|}",         ss, XX, XX },
507   { "popT|}",           ss, XX, XX },
508   /* 18 */
509   { "sbbB",             Eb, Gb, XX },
510   { "sbbS",             Ev, Gv, XX },
511   { "sbbB",             Gb, Eb, XX },
512   { "sbbS",             Gv, Ev, XX },
513   { "sbbB",             AL, Ib, XX },
514   { "sbbS",             eAX, Iv, XX },
515   { "push{T|}",         ds, XX, XX },
516   { "pop{T|}",          ds, XX, XX },
517   /* 20 */
518   { "andB",             Eb, Gb, XX },
519   { "andS",             Ev, Gv, XX },
520   { "andB",             Gb, Eb, XX },
521   { "andS",             Gv, Ev, XX },
522   { "andB",             AL, Ib, XX },
523   { "andS",             eAX, Iv, XX },
524   { "(bad)",            XX, XX, XX },   /* SEG ES prefix */
525   { "daa{|}",           XX, XX, XX },
526   /* 28 */
527   { "subB",             Eb, Gb, XX },
528   { "subS",             Ev, Gv, XX },
529   { "subB",             Gb, Eb, XX },
530   { "subS",             Gv, Ev, XX },
531   { "subB",             AL, Ib, XX },
532   { "subS",             eAX, Iv, XX },
533   { "(bad)",            XX, XX, XX },   /* SEG CS prefix */
534   { "das{|}",           XX, XX, XX },
535   /* 30 */
536   { "xorB",             Eb, Gb, XX },
537   { "xorS",             Ev, Gv, XX },
538   { "xorB",             Gb, Eb, XX },
539   { "xorS",             Gv, Ev, XX },
540   { "xorB",             AL, Ib, XX },
541   { "xorS",             eAX, Iv, XX },
542   { "(bad)",            XX, XX, XX },   /* SEG SS prefix */
543   { "aaa{|}",           XX, XX, XX },
544   /* 38 */
545   { "cmpB",             Eb, Gb, XX },
546   { "cmpS",             Ev, Gv, XX },
547   { "cmpB",             Gb, Eb, XX },
548   { "cmpS",             Gv, Ev, XX },
549   { "cmpB",             AL, Ib, XX },
550   { "cmpS",             eAX, Iv, XX },
551   { "(bad)",            XX, XX, XX },   /* SEG DS prefix */
552   { "aas{|}",           XX, XX, XX },
553   /* 40 */
554   { "inc{S|}",          RMeAX, XX, XX },
555   { "inc{S|}",          RMeCX, XX, XX },
556   { "inc{S|}",          RMeDX, XX, XX },
557   { "inc{S|}",          RMeBX, XX, XX },
558   { "inc{S|}",          RMeSP, XX, XX },
559   { "inc{S|}",          RMeBP, XX, XX },
560   { "inc{S|}",          RMeSI, XX, XX },
561   { "inc{S|}",          RMeDI, XX, XX },
562   /* 48 */
563   { "dec{S|}",          RMeAX, XX, XX },
564   { "dec{S|}",          RMeCX, XX, XX },
565   { "dec{S|}",          RMeDX, XX, XX },
566   { "dec{S|}",          RMeBX, XX, XX },
567   { "dec{S|}",          RMeSP, XX, XX },
568   { "dec{S|}",          RMeBP, XX, XX },
569   { "dec{S|}",          RMeSI, XX, XX },
570   { "dec{S|}",          RMeDI, XX, XX },
571   /* 50 */
572   { "pushS",            RMrAX, XX, XX },
573   { "pushS",            RMrCX, XX, XX },
574   { "pushS",            RMrDX, XX, XX },
575   { "pushS",            RMrBX, XX, XX },
576   { "pushS",            RMrSP, XX, XX },
577   { "pushS",            RMrBP, XX, XX },
578   { "pushS",            RMrSI, XX, XX },
579   { "pushS",            RMrDI, XX, XX },
580   /* 58 */
581   { "popS",             RMrAX, XX, XX },
582   { "popS",             RMrCX, XX, XX },
583   { "popS",             RMrDX, XX, XX },
584   { "popS",             RMrBX, XX, XX },
585   { "popS",             RMrSP, XX, XX },
586   { "popS",             RMrBP, XX, XX },
587   { "popS",             RMrSI, XX, XX },
588   { "popS",             RMrDI, XX, XX },
589   /* 60 */
590   { "pusha{P|}",        XX, XX, XX },
591   { "popa{P|}",         XX, XX, XX },
592   { "bound{S|}",        Gv, Ma, XX },
593   { X86_64_0 },
594   { "(bad)",            XX, XX, XX },   /* seg fs */
595   { "(bad)",            XX, XX, XX },   /* seg gs */
596   { "(bad)",            XX, XX, XX },   /* op size prefix */
597   { "(bad)",            XX, XX, XX },   /* adr size prefix */
598   /* 68 */
599   { "pushT",            Iq, XX, XX },
600   { "imulS",            Gv, Ev, Iv },
601   { "pushT",            sIb, XX, XX },
602   { "imulS",            Gv, Ev, sIb },
603   { "ins{b||b|}",       Yb, indirDX, XX },
604   { "ins{R||R|}",       Yv, indirDX, XX },
605   { "outs{b||b|}",      indirDX, Xb, XX },
606   { "outs{R||R|}",      indirDX, Xv, XX },
607   /* 70 */
608   { "joH",              Jb, XX, cond_jump_flag },
609   { "jnoH",             Jb, XX, cond_jump_flag },
610   { "jbH",              Jb, XX, cond_jump_flag },
611   { "jaeH",             Jb, XX, cond_jump_flag },
612   { "jeH",              Jb, XX, cond_jump_flag },
613   { "jneH",             Jb, XX, cond_jump_flag },
614   { "jbeH",             Jb, XX, cond_jump_flag },
615   { "jaH",              Jb, XX, cond_jump_flag },
616   /* 78 */
617   { "jsH",              Jb, XX, cond_jump_flag },
618   { "jnsH",             Jb, XX, cond_jump_flag },
619   { "jpH",              Jb, XX, cond_jump_flag },
620   { "jnpH",             Jb, XX, cond_jump_flag },
621   { "jlH",              Jb, XX, cond_jump_flag },
622   { "jgeH",             Jb, XX, cond_jump_flag },
623   { "jleH",             Jb, XX, cond_jump_flag },
624   { "jgH",              Jb, XX, cond_jump_flag },
625   /* 80 */
626   { GRP1b },
627   { GRP1S },
628   { "(bad)",            XX, XX, XX },
629   { GRP1Ss },
630   { "testB",            Eb, Gb, XX },
631   { "testS",            Ev, Gv, XX },
632   { "xchgB",            Eb, Gb, XX },
633   { "xchgS",            Ev, Gv, XX },
634   /* 88 */
635   { "movB",             Eb, Gb, XX },
636   { "movS",             Ev, Gv, XX },
637   { "movB",             Gb, Eb, XX },
638   { "movS",             Gv, Ev, XX },
639   { "movQ",             Ev, Sw, XX },
640   { "leaS",             Gv, M, XX },
641   { "movQ",             Sw, Ev, XX },
642   { "popU",             Ev, XX, XX },
643   /* 90 */
644   { "nop",              NOP_Fixup, 0, XX, XX },
645   { "xchgS",            RMeCX, eAX, XX },
646   { "xchgS",            RMeDX, eAX, XX },
647   { "xchgS",            RMeBX, eAX, XX },
648   { "xchgS",            RMeSP, eAX, XX },
649   { "xchgS",            RMeBP, eAX, XX },
650   { "xchgS",            RMeSI, eAX, XX },
651   { "xchgS",            RMeDI, eAX, XX },
652   /* 98 */
653   { "cW{tR||tR|}",      XX, XX, XX },
654   { "cR{tO||tO|}",      XX, XX, XX },
655   { "lcall{T|}",        Ap, XX, XX },
656   { "(bad)",            XX, XX, XX },   /* fwait */
657   { "pushfT",           XX, XX, XX },
658   { "popfT",            XX, XX, XX },
659   { "sahf{|}",          XX, XX, XX },
660   { "lahf{|}",          XX, XX, XX },
661   /* a0 */
662   { "movB",             AL, Ob64, XX },
663   { "movS",             eAX, Ov64, XX },
664   { "movB",             Ob64, AL, XX },
665   { "movS",             Ov64, eAX, XX },
666   { "movs{b||b|}",      Yb, Xb, XX },
667   { "movs{R||R|}",      Yv, Xv, XX },
668   { "cmps{b||b|}",      Xb, Yb, XX },
669   { "cmps{R||R|}",      Xv, Yv, XX },
670   /* a8 */
671   { "testB",            AL, Ib, XX },
672   { "testS",            eAX, Iv, XX },
673   { "stosB",            Yb, AL, XX },
674   { "stosS",            Yv, eAX, XX },
675   { "lodsB",            AL, Xb, XX },
676   { "lodsS",            eAX, Xv, XX },
677   { "scasB",            AL, Yb, XX },
678   { "scasS",            eAX, Yv, XX },
679   /* b0 */
680   { "movB",             RMAL, Ib, XX },
681   { "movB",             RMCL, Ib, XX },
682   { "movB",             RMDL, Ib, XX },
683   { "movB",             RMBL, Ib, XX },
684   { "movB",             RMAH, Ib, XX },
685   { "movB",             RMCH, Ib, XX },
686   { "movB",             RMDH, Ib, XX },
687   { "movB",             RMBH, Ib, XX },
688   /* b8 */
689   { "movS",             RMeAX, Iv64, XX },
690   { "movS",             RMeCX, Iv64, XX },
691   { "movS",             RMeDX, Iv64, XX },
692   { "movS",             RMeBX, Iv64, XX },
693   { "movS",             RMeSP, Iv64, XX },
694   { "movS",             RMeBP, Iv64, XX },
695   { "movS",             RMeSI, Iv64, XX },
696   { "movS",             RMeDI, Iv64, XX },
697   /* c0 */
698   { GRP2b },
699   { GRP2S },
700   { "retT",             Iw, XX, XX },
701   { "retT",             XX, XX, XX },
702   { "les{S|}",          Gv, Mp, XX },
703   { "ldsS",             Gv, Mp, XX },
704   { "movA",             Eb, Ib, XX },
705   { "movQ",             Ev, Iv, XX },
706   /* c8 */
707   { "enterT",           Iw, Ib, XX },
708   { "leaveT",           XX, XX, XX },
709   { "lretP",            Iw, XX, XX },
710   { "lretP",            XX, XX, XX },
711   { "int3",             XX, XX, XX },
712   { "int",              Ib, XX, XX },
713   { "into{|}",          XX, XX, XX },
714   { "iretP",            XX, XX, XX },
715   /* d0 */
716   { GRP2b_one },
717   { GRP2S_one },
718   { GRP2b_cl },
719   { GRP2S_cl },
720   { "aam{|}",           sIb, XX, XX },
721   { "aad{|}",           sIb, XX, XX },
722   { "(bad)",            XX, XX, XX },
723   { "xlat",             DSBX, XX, XX },
724   /* d8 */
725   { FLOAT },
726   { FLOAT },
727   { FLOAT },
728   { FLOAT },
729   { FLOAT },
730   { FLOAT },
731   { FLOAT },
732   { FLOAT },
733   /* e0 */
734   { "loopneFH",         Jb, XX, loop_jcxz_flag },
735   { "loopeFH",          Jb, XX, loop_jcxz_flag },
736   { "loopFH",           Jb, XX, loop_jcxz_flag },
737   { "jEcxzH",           Jb, XX, loop_jcxz_flag },
738   { "inB",              AL, Ib, XX },
739   { "inS",              eAX, Ib, XX },
740   { "outB",             Ib, AL, XX },
741   { "outS",             Ib, eAX, XX },
742   /* e8 */
743   { "callT",            Jv, XX, XX },
744   { "jmpT",             Jv, XX, XX },
745   { "ljmp{T|}",         Ap, XX, XX },
746   { "jmp",              Jb, XX, XX },
747   { "inB",              AL, indirDX, XX },
748   { "inS",              eAX, indirDX, XX },
749   { "outB",             indirDX, AL, XX },
750   { "outS",             indirDX, eAX, XX },
751   /* f0 */
752   { "(bad)",            XX, XX, XX },   /* lock prefix */
753   { "icebp",            XX, XX, XX },
754   { "(bad)",            XX, XX, XX },   /* repne */
755   { "(bad)",            XX, XX, XX },   /* repz */
756   { "hlt",              XX, XX, XX },
757   { "cmc",              XX, XX, XX },
758   { GRP3b },
759   { GRP3S },
760   /* f8 */
761   { "clc",              XX, XX, XX },
762   { "stc",              XX, XX, XX },
763   { "cli",              XX, XX, XX },
764   { "sti",              XX, XX, XX },
765   { "cld",              XX, XX, XX },
766   { "std",              XX, XX, XX },
767   { GRP4 },
768   { GRP5 },
769 };
770
771 static const struct dis386 dis386_twobyte[] = {
772   /* 00 */
773   { GRP6 },
774   { GRP7 },
775   { "larS",             Gv, Ew, XX },
776   { "lslS",             Gv, Ew, XX },
777   { "(bad)",            XX, XX, XX },
778   { "syscall",          XX, XX, XX },
779   { "clts",             XX, XX, XX },
780   { "sysretP",          XX, XX, XX },
781   /* 08 */
782   { "invd",             XX, XX, XX },
783   { "wbinvd",           XX, XX, XX },
784   { "(bad)",            XX, XX, XX },
785   { "ud2a",             XX, XX, XX },
786   { "(bad)",            XX, XX, XX },
787   { GRPAMD },
788   { "femms",            XX, XX, XX },
789   { "",                 MX, EM, OPSUF }, /* See OP_3DNowSuffix.  */
790   /* 10 */
791   { PREGRP8 },
792   { PREGRP9 },
793   { PREGRP30 },
794   { "movlpX",           EX, XM, SIMD_Fixup, 'h' },
795   { "unpcklpX",         XM, EX, XX },
796   { "unpckhpX",         XM, EX, XX },
797   { PREGRP31 },
798   { "movhpX",           EX, XM, SIMD_Fixup, 'l' },
799   /* 18 */
800   { GRP14 },
801   { "(bad)",            XX, XX, XX },
802   { "(bad)",            XX, XX, XX },
803   { "(bad)",            XX, XX, XX },
804   { "(bad)",            XX, XX, XX },
805   { "(bad)",            XX, XX, XX },
806   { "(bad)",            XX, XX, XX },
807   { "(bad)",            XX, XX, XX },
808   /* 20 */
809   { "movL",             Rm, Cm, XX },
810   { "movL",             Rm, Dm, XX },
811   { "movL",             Cm, Rm, XX },
812   { "movL",             Dm, Rm, XX },
813   { "movL",             Rd, Td, XX },
814   { "(bad)",            XX, XX, XX },
815   { "movL",             Td, Rd, XX },
816   { "(bad)",            XX, XX, XX },
817   /* 28 */
818   { "movapX",           XM, EX, XX },
819   { "movapX",           EX, XM, XX },
820   { PREGRP2 },
821   { "movntpX",          Ev, XM, XX },
822   { PREGRP4 },
823   { PREGRP3 },
824   { "ucomisX",          XM,EX, XX },
825   { "comisX",           XM,EX, XX },
826   /* 30 */
827   { "wrmsr",            XX, XX, XX },
828   { "rdtsc",            XX, XX, XX },
829   { "rdmsr",            XX, XX, XX },
830   { "rdpmc",            XX, XX, XX },
831   { "sysenter",         XX, XX, XX },
832   { "sysexit",          XX, XX, XX },
833   { "(bad)",            XX, XX, XX },
834   { "(bad)",            XX, XX, XX },
835   /* 38 */
836   { THREE_BYTE_0 },
837   { "(bad)",            XX, XX, XX },
838   { THREE_BYTE_1 },
839   { "(bad)",            XX, XX, XX },
840   { "(bad)",            XX, XX, XX },
841   { "(bad)",            XX, XX, XX },
842   { "(bad)",            XX, XX, XX },
843   { "(bad)",            XX, XX, XX },
844   /* 40 */
845   { "cmovo",            Gv, Ev, XX },
846   { "cmovno",           Gv, Ev, XX },
847   { "cmovb",            Gv, Ev, XX },
848   { "cmovae",           Gv, Ev, XX },
849   { "cmove",            Gv, Ev, XX },
850   { "cmovne",           Gv, Ev, XX },
851   { "cmovbe",           Gv, Ev, XX },
852   { "cmova",            Gv, Ev, XX },
853   /* 48 */
854   { "cmovs",            Gv, Ev, XX },
855   { "cmovns",           Gv, Ev, XX },
856   { "cmovp",            Gv, Ev, XX },
857   { "cmovnp",           Gv, Ev, XX },
858   { "cmovl",            Gv, Ev, XX },
859   { "cmovge",           Gv, Ev, XX },
860   { "cmovle",           Gv, Ev, XX },
861   { "cmovg",            Gv, Ev, XX },
862   /* 50 */
863   { "movmskpX",         Gd, XS, XX },
864   { PREGRP13 },
865   { PREGRP12 },
866   { PREGRP11 },
867   { "andpX",            XM, EX, XX },
868   { "andnpX",           XM, EX, XX },
869   { "orpX",             XM, EX, XX },
870   { "xorpX",            XM, EX, XX },
871   /* 58 */
872   { PREGRP0 },
873   { PREGRP10 },
874   { PREGRP17 },
875   { PREGRP16 },
876   { PREGRP14 },
877   { PREGRP7 },
878   { PREGRP5 },
879   { PREGRP6 },
880   /* 60 */
881   { "punpcklbw",        MX, EM, XX },
882   { "punpcklwd",        MX, EM, XX },
883   { "punpckldq",        MX, EM, XX },
884   { "packsswb",         MX, EM, XX },
885   { "pcmpgtb",          MX, EM, XX },
886   { "pcmpgtw",          MX, EM, XX },
887   { "pcmpgtd",          MX, EM, XX },
888   { "packuswb",         MX, EM, XX },
889   /* 68 */
890   { "punpckhbw",        MX, EM, XX },
891   { "punpckhwd",        MX, EM, XX },
892   { "punpckhdq",        MX, EM, XX },
893   { "packssdw",         MX, EM, XX },
894   { PREGRP26 },
895   { PREGRP24 },
896   { "movd",             MX, Edq, XX },
897   { PREGRP19 },
898   /* 70 */
899   { PREGRP22 },
900   { GRP10 },
901   { GRP11 },
902   { GRP12 },
903   { "pcmpeqb",          MX, EM, XX },
904   { "pcmpeqw",          MX, EM, XX },
905   { "pcmpeqd",          MX, EM, XX },
906   { "emms",             XX, XX, XX },
907   /* 78 */
908   { "(bad)",            XX, XX, XX },
909   { "(bad)",            XX, XX, XX },
910   { "(bad)",            XX, XX, XX },
911   { "(bad)",            XX, XX, XX },
912   { PREGRP28 },
913   { PREGRP29 },
914   { PREGRP23 },
915   { PREGRP20 },
916   /* 80 */
917   { "joH",              Jv, XX, cond_jump_flag },
918   { "jnoH",             Jv, XX, cond_jump_flag },
919   { "jbH",              Jv, XX, cond_jump_flag },
920   { "jaeH",             Jv, XX, cond_jump_flag },
921   { "jeH",              Jv, XX, cond_jump_flag },
922   { "jneH",             Jv, XX, cond_jump_flag },
923   { "jbeH",             Jv, XX, cond_jump_flag },
924   { "jaH",              Jv, XX, cond_jump_flag },
925   /* 88 */
926   { "jsH",              Jv, XX, cond_jump_flag },
927   { "jnsH",             Jv, XX, cond_jump_flag },
928   { "jpH",              Jv, XX, cond_jump_flag },
929   { "jnpH",             Jv, XX, cond_jump_flag },
930   { "jlH",              Jv, XX, cond_jump_flag },
931   { "jgeH",             Jv, XX, cond_jump_flag },
932   { "jleH",             Jv, XX, cond_jump_flag },
933   { "jgH",              Jv, XX, cond_jump_flag },
934   /* 90 */
935   { "seto",             Eb, XX, XX },
936   { "setno",            Eb, XX, XX },
937   { "setb",             Eb, XX, XX },
938   { "setae",            Eb, XX, XX },
939   { "sete",             Eb, XX, XX },
940   { "setne",            Eb, XX, XX },
941   { "setbe",            Eb, XX, XX },
942   { "seta",             Eb, XX, XX },
943   /* 98 */
944   { "sets",             Eb, XX, XX },
945   { "setns",            Eb, XX, XX },
946   { "setp",             Eb, XX, XX },
947   { "setnp",            Eb, XX, XX },
948   { "setl",             Eb, XX, XX },
949   { "setge",            Eb, XX, XX },
950   { "setle",            Eb, XX, XX },
951   { "setg",             Eb, XX, XX },
952   /* a0 */
953   { "pushT",            fs, XX, XX },
954   { "popT",             fs, XX, XX },
955   { "cpuid",            XX, XX, XX },
956   { "btS",              Ev, Gv, XX },
957   { "shldS",            Ev, Gv, Ib },
958   { "shldS",            Ev, Gv, CL },
959   { "(bad)",            XX, XX, XX },
960   { GRPPADLCK },
961   /* a8 */
962   { "pushT",            gs, XX, XX },
963   { "popT",             gs, XX, XX },
964   { "rsm",              XX, XX, XX },
965   { "btsS",             Ev, Gv, XX },
966   { "shrdS",            Ev, Gv, Ib },
967   { "shrdS",            Ev, Gv, CL },
968   { GRP13 },
969   { "imulS",            Gv, Ev, XX },
970   /* b0 */
971   { "cmpxchgB",         Eb, Gb, XX },
972   { "cmpxchgS",         Ev, Gv, XX },
973   { "lssS",             Gv, Mp, XX },
974   { "btrS",             Ev, Gv, XX },
975   { "lfsS",             Gv, Mp, XX },
976   { "lgsS",             Gv, Mp, XX },
977   { "movz{bR|x|bR|x}",  Gv, Eb, XX },
978   { "movz{wR|x|wR|x}",  Gv, Ew, XX }, /* yes, there really is movzww ! */
979   /* b8 */
980   { "(bad)",            XX, XX, XX },
981   { "ud2b",             XX, XX, XX },
982   { GRP8 },
983   { "btcS",             Ev, Gv, XX },
984   { "bsfS",             Gv, Ev, XX },
985   { "bsrS",             Gv, Ev, XX },
986   { "movs{bR|x|bR|x}",  Gv, Eb, XX },
987   { "movs{wR|x|wR|x}",  Gv, Ew, XX }, /* yes, there really is movsww ! */
988   /* c0 */
989   { "xaddB",            Eb, Gb, XX },
990   { "xaddS",            Ev, Gv, XX },
991   { PREGRP1 },
992   { "movntiS",          Ev, Gv, XX },
993   { "pinsrw",           MX, Ed, Ib },
994   { "pextrw",           Gd, MS, Ib },
995   { "shufpX",           XM, EX, Ib },
996   { GRP9 },
997   /* c8 */
998   { "bswap",            RMeAX, XX, XX },
999   { "bswap",            RMeCX, XX, XX },
1000   { "bswap",            RMeDX, XX, XX },
1001   { "bswap",            RMeBX, XX, XX },
1002   { "bswap",            RMeSP, XX, XX },
1003   { "bswap",            RMeBP, XX, XX },
1004   { "bswap",            RMeSI, XX, XX },
1005   { "bswap",            RMeDI, XX, XX },
1006   /* d0 */
1007   { PREGRP27 },
1008   { "psrlw",            MX, EM, XX },
1009   { "psrld",            MX, EM, XX },
1010   { "psrlq",            MX, EM, XX },
1011   { "paddq",            MX, EM, XX },
1012   { "pmullw",           MX, EM, XX },
1013   { PREGRP21 },
1014   { "pmovmskb",         Gd, MS, XX },
1015   /* d8 */
1016   { "psubusb",          MX, EM, XX },
1017   { "psubusw",          MX, EM, XX },
1018   { "pminub",           MX, EM, XX },
1019   { "pand",             MX, EM, XX },
1020   { "paddusb",          MX, EM, XX },
1021   { "paddusw",          MX, EM, XX },
1022   { "pmaxub",           MX, EM, XX },
1023   { "pandn",            MX, EM, XX },
1024   /* e0 */
1025   { "pavgb",            MX, EM, XX },
1026   { "psraw",            MX, EM, XX },
1027   { "psrad",            MX, EM, XX },
1028   { "pavgw",            MX, EM, XX },
1029   { "pmulhuw",          MX, EM, XX },
1030   { "pmulhw",           MX, EM, XX },
1031   { PREGRP15 },
1032   { PREGRP25 },
1033   /* e8 */
1034   { "psubsb",           MX, EM, XX },
1035   { "psubsw",           MX, EM, XX },
1036   { "pminsw",           MX, EM, XX },
1037   { "por",              MX, EM, XX },
1038   { "paddsb",           MX, EM, XX },
1039   { "paddsw",           MX, EM, XX },
1040   { "pmaxsw",           MX, EM, XX },
1041   { "pxor",             MX, EM, XX },
1042   /* f0 */
1043   { PREGRP32 },
1044   { "psllw",            MX, EM, XX },
1045   { "pslld",            MX, EM, XX },
1046   { "psllq",            MX, EM, XX },
1047   { "pmuludq",          MX, EM, XX },
1048   { "pmaddwd",          MX, EM, XX },
1049   { "psadbw",           MX, EM, XX },
1050   { PREGRP18 },
1051   /* f8 */
1052   { "psubb",            MX, EM, XX },
1053   { "psubw",            MX, EM, XX },
1054   { "psubd",            MX, EM, XX },
1055   { "psubq",            MX, EM, XX },
1056   { "paddb",            MX, EM, XX },
1057   { "paddw",            MX, EM, XX },
1058   { "paddd",            MX, EM, XX },
1059   { "(bad)",            XX, XX, XX }
1060 };
1061
1062 static const unsigned char onebyte_has_modrm[256] = {
1063   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1064   /*       -------------------------------        */
1065   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1066   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1067   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1068   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1069   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1070   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1071   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1072   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1073   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1074   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1075   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1076   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1077   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1078   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1079   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1080   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1081   /*       -------------------------------        */
1082   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1083 };
1084
1085 static const unsigned char twobyte_has_modrm[256] = {
1086   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1087   /*       -------------------------------        */
1088   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1089   /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */
1090   /* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
1091   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1092   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1093   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1094   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1095   /* 70 */ 1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1, /* 7f */
1096   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1097   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1098   /* a0 */ 0,0,0,1,1,1,0,1,0,0,0,1,1,1,1,1, /* af */
1099   /* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */
1100   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1101   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1102   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1103   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
1104   /*       -------------------------------        */
1105   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1106 };
1107
1108 static const unsigned char twobyte_uses_SSE_prefix[256] = {
1109   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1110   /*       -------------------------------        */
1111   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1112   /* 10 */ 1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, /* 1f */
1113   /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0, /* 2f */
1114   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1115   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1116   /* 50 */ 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* 5f */
1117   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1, /* 6f */
1118   /* 70 */ 1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, /* 7f */
1119   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1120   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1121   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1122   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1123   /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1124   /* d0 */ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* df */
1125   /* e0 */ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, /* ef */
1126   /* f0 */ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0  /* ff */
1127   /*       -------------------------------        */
1128   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1129 };
1130
1131 static char obuf[100];
1132 static char *obufp;
1133 static char scratchbuf[100];
1134 static unsigned char *start_codep;
1135 static unsigned char *insn_codep;
1136 static unsigned char *codep;
1137 static disassemble_info *the_info;
1138 static int mod;
1139 static int rm;
1140 static int reg;
1141 static unsigned char need_modrm;
1142
1143 /* If we are accessing mod/rm/reg without need_modrm set, then the
1144    values are stale.  Hitting this abort likely indicates that you
1145    need to update onebyte_has_modrm or twobyte_has_modrm.  */
1146 #define MODRM_CHECK  if (!need_modrm) abort ()
1147
1148 static const char **names64;
1149 static const char **names32;
1150 static const char **names16;
1151 static const char **names8;
1152 static const char **names8rex;
1153 static const char **names_seg;
1154 static const char **index16;
1155
1156 static const char *intel_names64[] = {
1157   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1158   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1159 };
1160 static const char *intel_names32[] = {
1161   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1162   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1163 };
1164 static const char *intel_names16[] = {
1165   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1166   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1167 };
1168 static const char *intel_names8[] = {
1169   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1170 };
1171 static const char *intel_names8rex[] = {
1172   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1173   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1174 };
1175 static const char *intel_names_seg[] = {
1176   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1177 };
1178 static const char *intel_index16[] = {
1179   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1180 };
1181
1182 static const char *att_names64[] = {
1183   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1184   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1185 };
1186 static const char *att_names32[] = {
1187   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1188   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1189 };
1190 static const char *att_names16[] = {
1191   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1192   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1193 };
1194 static const char *att_names8[] = {
1195   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1196 };
1197 static const char *att_names8rex[] = {
1198   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1199   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1200 };
1201 static const char *att_names_seg[] = {
1202   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1203 };
1204 static const char *att_index16[] = {
1205   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1206 };
1207
1208 static const struct dis386 grps[][8] = {
1209   /* GRP1b */
1210   {
1211     { "addA",   Eb, Ib, XX },
1212     { "orA",    Eb, Ib, XX },
1213     { "adcA",   Eb, Ib, XX },
1214     { "sbbA",   Eb, Ib, XX },
1215     { "andA",   Eb, Ib, XX },
1216     { "subA",   Eb, Ib, XX },
1217     { "xorA",   Eb, Ib, XX },
1218     { "cmpA",   Eb, Ib, XX }
1219   },
1220   /* GRP1S */
1221   {
1222     { "addQ",   Ev, Iv, XX },
1223     { "orQ",    Ev, Iv, XX },
1224     { "adcQ",   Ev, Iv, XX },
1225     { "sbbQ",   Ev, Iv, XX },
1226     { "andQ",   Ev, Iv, XX },
1227     { "subQ",   Ev, Iv, XX },
1228     { "xorQ",   Ev, Iv, XX },
1229     { "cmpQ",   Ev, Iv, XX }
1230   },
1231   /* GRP1Ss */
1232   {
1233     { "addQ",   Ev, sIb, XX },
1234     { "orQ",    Ev, sIb, XX },
1235     { "adcQ",   Ev, sIb, XX },
1236     { "sbbQ",   Ev, sIb, XX },
1237     { "andQ",   Ev, sIb, XX },
1238     { "subQ",   Ev, sIb, XX },
1239     { "xorQ",   Ev, sIb, XX },
1240     { "cmpQ",   Ev, sIb, XX }
1241   },
1242   /* GRP2b */
1243   {
1244     { "rolA",   Eb, Ib, XX },
1245     { "rorA",   Eb, Ib, XX },
1246     { "rclA",   Eb, Ib, XX },
1247     { "rcrA",   Eb, Ib, XX },
1248     { "shlA",   Eb, Ib, XX },
1249     { "shrA",   Eb, Ib, XX },
1250     { "(bad)",  XX, XX, XX },
1251     { "sarA",   Eb, Ib, XX },
1252   },
1253   /* GRP2S */
1254   {
1255     { "rolQ",   Ev, Ib, XX },
1256     { "rorQ",   Ev, Ib, XX },
1257     { "rclQ",   Ev, Ib, XX },
1258     { "rcrQ",   Ev, Ib, XX },
1259     { "shlQ",   Ev, Ib, XX },
1260     { "shrQ",   Ev, Ib, XX },
1261     { "(bad)",  XX, XX, XX },
1262     { "sarQ",   Ev, Ib, XX },
1263   },
1264   /* GRP2b_one */
1265   {
1266     { "rolA",   Eb, XX, XX },
1267     { "rorA",   Eb, XX, XX },
1268     { "rclA",   Eb, XX, XX },
1269     { "rcrA",   Eb, XX, XX },
1270     { "shlA",   Eb, XX, XX },
1271     { "shrA",   Eb, XX, XX },
1272     { "(bad)",  XX, XX, XX },
1273     { "sarA",   Eb, XX, XX },
1274   },
1275   /* GRP2S_one */
1276   {
1277     { "rolQ",   Ev, XX, XX },
1278     { "rorQ",   Ev, XX, XX },
1279     { "rclQ",   Ev, XX, XX },
1280     { "rcrQ",   Ev, XX, XX },
1281     { "shlQ",   Ev, XX, XX },
1282     { "shrQ",   Ev, XX, XX },
1283     { "(bad)",  XX, XX, XX},
1284     { "sarQ",   Ev, XX, XX },
1285   },
1286   /* GRP2b_cl */
1287   {
1288     { "rolA",   Eb, CL, XX },
1289     { "rorA",   Eb, CL, XX },
1290     { "rclA",   Eb, CL, XX },
1291     { "rcrA",   Eb, CL, XX },
1292     { "shlA",   Eb, CL, XX },
1293     { "shrA",   Eb, CL, XX },
1294     { "(bad)",  XX, XX, XX },
1295     { "sarA",   Eb, CL, XX },
1296   },
1297   /* GRP2S_cl */
1298   {
1299     { "rolQ",   Ev, CL, XX },
1300     { "rorQ",   Ev, CL, XX },
1301     { "rclQ",   Ev, CL, XX },
1302     { "rcrQ",   Ev, CL, XX },
1303     { "shlQ",   Ev, CL, XX },
1304     { "shrQ",   Ev, CL, XX },
1305     { "(bad)",  XX, XX, XX },
1306     { "sarQ",   Ev, CL, XX }
1307   },
1308   /* GRP3b */
1309   {
1310     { "testA",  Eb, Ib, XX },
1311     { "(bad)",  Eb, XX, XX },
1312     { "notA",   Eb, XX, XX },
1313     { "negA",   Eb, XX, XX },
1314     { "mulA",   Eb, XX, XX },   /* Don't print the implicit %al register,  */
1315     { "imulA",  Eb, XX, XX },   /* to distinguish these opcodes from other */
1316     { "divA",   Eb, XX, XX },   /* mul/imul opcodes.  Do the same for div  */
1317     { "idivA",  Eb, XX, XX }    /* and idiv for consistency.               */
1318   },
1319   /* GRP3S */
1320   {
1321     { "testQ",  Ev, Iv, XX },
1322     { "(bad)",  XX, XX, XX },
1323     { "notQ",   Ev, XX, XX },
1324     { "negQ",   Ev, XX, XX },
1325     { "mulQ",   Ev, XX, XX },   /* Don't print the implicit register.  */
1326     { "imulQ",  Ev, XX, XX },
1327     { "divQ",   Ev, XX, XX },
1328     { "idivQ",  Ev, XX, XX },
1329   },
1330   /* GRP4 */
1331   {
1332     { "incA",   Eb, XX, XX },
1333     { "decA",   Eb, XX, XX },
1334     { "(bad)",  XX, XX, XX },
1335     { "(bad)",  XX, XX, XX },
1336     { "(bad)",  XX, XX, XX },
1337     { "(bad)",  XX, XX, XX },
1338     { "(bad)",  XX, XX, XX },
1339     { "(bad)",  XX, XX, XX },
1340   },
1341   /* GRP5 */
1342   {
1343     { "incQ",   Ev, XX, XX },
1344     { "decQ",   Ev, XX, XX },
1345     { "callT",  indirEv, XX, XX },
1346     { "lcallT", indirEv, XX, XX },
1347     { "jmpT",   indirEv, XX, XX },
1348     { "ljmpT",  indirEv, XX, XX },
1349     { "pushU",  Ev, XX, XX },
1350     { "(bad)",  XX, XX, XX },
1351   },
1352   /* GRP6 */
1353   {
1354     { "sldtQ",  Ev, XX, XX },
1355     { "strQ",   Ev, XX, XX },
1356     { "lldt",   Ew, XX, XX },
1357     { "ltr",    Ew, XX, XX },
1358     { "verr",   Ew, XX, XX },
1359     { "verw",   Ew, XX, XX },
1360     { "(bad)",  XX, XX, XX },
1361     { "(bad)",  XX, XX, XX }
1362   },
1363   /* GRP7 */
1364   {
1365     { "sgdtQ",   M, XX, XX },
1366     { "sidtQ", PNI_Fixup, 0, XX, XX },
1367     { "lgdtQ",   M, XX, XX },
1368     { "lidtQ",   M, XX, XX },
1369     { "smswQ",  Ev, XX, XX },
1370     { "(bad)",  XX, XX, XX },
1371     { "lmsw",   Ew, XX, XX },
1372     { "invlpg", INVLPG_Fixup, w_mode, XX, XX },
1373   },
1374   /* GRP8 */
1375   {
1376     { "(bad)",  XX, XX, XX },
1377     { "(bad)",  XX, XX, XX },
1378     { "(bad)",  XX, XX, XX },
1379     { "(bad)",  XX, XX, XX },
1380     { "btQ",    Ev, Ib, XX },
1381     { "btsQ",   Ev, Ib, XX },
1382     { "btrQ",   Ev, Ib, XX },
1383     { "btcQ",   Ev, Ib, XX },
1384   },
1385   /* GRP9 */
1386   {
1387     { "(bad)",  XX, XX, XX },
1388     { "cmpxchg8b", Ev, XX, XX },
1389     { "(bad)",  XX, XX, XX },
1390     { "(bad)",  XX, XX, XX },
1391     { "(bad)",  XX, XX, XX },
1392     { "(bad)",  XX, XX, XX },
1393     { "(bad)",  XX, XX, XX },
1394     { "(bad)",  XX, XX, XX },
1395   },
1396   /* GRP10 */
1397   {
1398     { "(bad)",  XX, XX, XX },
1399     { "(bad)",  XX, XX, XX },
1400     { "psrlw",  MS, Ib, XX },
1401     { "(bad)",  XX, XX, XX },
1402     { "psraw",  MS, Ib, XX },
1403     { "(bad)",  XX, XX, XX },
1404     { "psllw",  MS, Ib, XX },
1405     { "(bad)",  XX, XX, XX },
1406   },
1407   /* GRP11 */
1408   {
1409     { "(bad)",  XX, XX, XX },
1410     { "(bad)",  XX, XX, XX },
1411     { "psrld",  MS, Ib, XX },
1412     { "(bad)",  XX, XX, XX },
1413     { "psrad",  MS, Ib, XX },
1414     { "(bad)",  XX, XX, XX },
1415     { "pslld",  MS, Ib, XX },
1416     { "(bad)",  XX, XX, XX },
1417   },
1418   /* GRP12 */
1419   {
1420     { "(bad)",  XX, XX, XX },
1421     { "(bad)",  XX, XX, XX },
1422     { "psrlq",  MS, Ib, XX },
1423     { "psrldq", MS, Ib, XX },
1424     { "(bad)",  XX, XX, XX },
1425     { "(bad)",  XX, XX, XX },
1426     { "psllq",  MS, Ib, XX },
1427     { "pslldq", MS, Ib, XX },
1428   },
1429   /* GRP13 */
1430   {
1431     { "fxsave", Ev, XX, XX },
1432     { "fxrstor", Ev, XX, XX },
1433     { "ldmxcsr", Ev, XX, XX },
1434     { "stmxcsr", Ev, XX, XX },
1435     { "(bad)",  XX, XX, XX },
1436     { "lfence", OP_0fae, 0, XX, XX },
1437     { "mfence", OP_0fae, 0, XX, XX },
1438     { "clflush", OP_0fae, 0, XX, XX },
1439   },
1440   /* GRP14 */
1441   {
1442     { "prefetchnta", Ev, XX, XX },
1443     { "prefetcht0", Ev, XX, XX },
1444     { "prefetcht1", Ev, XX, XX },
1445     { "prefetcht2", Ev, XX, XX },
1446     { "(bad)",  XX, XX, XX },
1447     { "(bad)",  XX, XX, XX },
1448     { "(bad)",  XX, XX, XX },
1449     { "(bad)",  XX, XX, XX },
1450   },
1451   /* GRPAMD */
1452   {
1453     { "prefetch", Eb, XX, XX },
1454     { "prefetchw", Eb, XX, XX },
1455     { "(bad)",  XX, XX, XX },
1456     { "(bad)",  XX, XX, XX },
1457     { "(bad)",  XX, XX, XX },
1458     { "(bad)",  XX, XX, XX },
1459     { "(bad)",  XX, XX, XX },
1460     { "(bad)",  XX, XX, XX },
1461   },
1462   /* GRPPADLCK */
1463   {
1464     { "xstorerng", OP_0f07, 0, XX, XX },
1465     { "xcryptecb", OP_0f07, 0, XX, XX },
1466     { "xcryptcbc", OP_0f07, 0, XX, XX },
1467     { "(bad)",     OP_0f07, 0, XX, XX },
1468     { "xcryptcfb", OP_0f07, 0, XX, XX },
1469     { "xcryptofb", OP_0f07, 0, XX, XX },
1470     { "(bad)",     OP_0f07, 0, XX, XX },
1471     { "(bad)",     OP_0f07, 0, XX, XX },
1472   }
1473 };
1474
1475 static const struct dis386 prefix_user_table[][4] = {
1476   /* PREGRP0 */
1477   {
1478     { "addps", XM, EX, XX },
1479     { "addss", XM, EX, XX },
1480     { "addpd", XM, EX, XX },
1481     { "addsd", XM, EX, XX },
1482   },
1483   /* PREGRP1 */
1484   {
1485     { "", XM, EX, OPSIMD },     /* See OP_SIMD_SUFFIX.  */
1486     { "", XM, EX, OPSIMD },
1487     { "", XM, EX, OPSIMD },
1488     { "", XM, EX, OPSIMD },
1489   },
1490   /* PREGRP2 */
1491   {
1492     { "cvtpi2ps", XM, EM, XX },
1493     { "cvtsi2ssY", XM, Ev, XX },
1494     { "cvtpi2pd", XM, EM, XX },
1495     { "cvtsi2sdY", XM, Ev, XX },
1496   },
1497   /* PREGRP3 */
1498   {
1499     { "cvtps2pi", MX, EX, XX },
1500     { "cvtss2siY", Gv, EX, XX },
1501     { "cvtpd2pi", MX, EX, XX },
1502     { "cvtsd2siY", Gv, EX, XX },
1503   },
1504   /* PREGRP4 */
1505   {
1506     { "cvttps2pi", MX, EX, XX },
1507     { "cvttss2siY", Gv, EX, XX },
1508     { "cvttpd2pi", MX, EX, XX },
1509     { "cvttsd2siY", Gv, EX, XX },
1510   },
1511   /* PREGRP5 */
1512   {
1513     { "divps", XM, EX, XX },
1514     { "divss", XM, EX, XX },
1515     { "divpd", XM, EX, XX },
1516     { "divsd", XM, EX, XX },
1517   },
1518   /* PREGRP6 */
1519   {
1520     { "maxps", XM, EX, XX },
1521     { "maxss", XM, EX, XX },
1522     { "maxpd", XM, EX, XX },
1523     { "maxsd", XM, EX, XX },
1524   },
1525   /* PREGRP7 */
1526   {
1527     { "minps", XM, EX, XX },
1528     { "minss", XM, EX, XX },
1529     { "minpd", XM, EX, XX },
1530     { "minsd", XM, EX, XX },
1531   },
1532   /* PREGRP8 */
1533   {
1534     { "movups", XM, EX, XX },
1535     { "movss", XM, EX, XX },
1536     { "movupd", XM, EX, XX },
1537     { "movsd", XM, EX, XX },
1538   },
1539   /* PREGRP9 */
1540   {
1541     { "movups", EX, XM, XX },
1542     { "movss", EX, XM, XX },
1543     { "movupd", EX, XM, XX },
1544     { "movsd", EX, XM, XX },
1545   },
1546   /* PREGRP10 */
1547   {
1548     { "mulps", XM, EX, XX },
1549     { "mulss", XM, EX, XX },
1550     { "mulpd", XM, EX, XX },
1551     { "mulsd", XM, EX, XX },
1552   },
1553   /* PREGRP11 */
1554   {
1555     { "rcpps", XM, EX, XX },
1556     { "rcpss", XM, EX, XX },
1557     { "(bad)", XM, EX, XX },
1558     { "(bad)", XM, EX, XX },
1559   },
1560   /* PREGRP12 */
1561   {
1562     { "rsqrtps", XM, EX, XX },
1563     { "rsqrtss", XM, EX, XX },
1564     { "(bad)", XM, EX, XX },
1565     { "(bad)", XM, EX, XX },
1566   },
1567   /* PREGRP13 */
1568   {
1569     { "sqrtps", XM, EX, XX },
1570     { "sqrtss", XM, EX, XX },
1571     { "sqrtpd", XM, EX, XX },
1572     { "sqrtsd", XM, EX, XX },
1573   },
1574   /* PREGRP14 */
1575   {
1576     { "subps", XM, EX, XX },
1577     { "subss", XM, EX, XX },
1578     { "subpd", XM, EX, XX },
1579     { "subsd", XM, EX, XX },
1580   },
1581   /* PREGRP15 */
1582   {
1583     { "(bad)", XM, EX, XX },
1584     { "cvtdq2pd", XM, EX, XX },
1585     { "cvttpd2dq", XM, EX, XX },
1586     { "cvtpd2dq", XM, EX, XX },
1587   },
1588   /* PREGRP16 */
1589   {
1590     { "cvtdq2ps", XM, EX, XX },
1591     { "cvttps2dq",XM, EX, XX },
1592     { "cvtps2dq",XM, EX, XX },
1593     { "(bad)", XM, EX, XX },
1594   },
1595   /* PREGRP17 */
1596   {
1597     { "cvtps2pd", XM, EX, XX },
1598     { "cvtss2sd", XM, EX, XX },
1599     { "cvtpd2ps", XM, EX, XX },
1600     { "cvtsd2ss", XM, EX, XX },
1601   },
1602   /* PREGRP18 */
1603   {
1604     { "maskmovq", MX, MS, XX },
1605     { "(bad)", XM, EX, XX },
1606     { "maskmovdqu", XM, EX, XX },
1607     { "(bad)", XM, EX, XX },
1608   },
1609   /* PREGRP19 */
1610   {
1611     { "movq", MX, EM, XX },
1612     { "movdqu", XM, EX, XX },
1613     { "movdqa", XM, EX, XX },
1614     { "(bad)", XM, EX, XX },
1615   },
1616   /* PREGRP20 */
1617   {
1618     { "movq", EM, MX, XX },
1619     { "movdqu", EX, XM, XX },
1620     { "movdqa", EX, XM, XX },
1621     { "(bad)", EX, XM, XX },
1622   },
1623   /* PREGRP21 */
1624   {
1625     { "(bad)", EX, XM, XX },
1626     { "movq2dq", XM, MS, XX },
1627     { "movq", EX, XM, XX },
1628     { "movdq2q", MX, XS, XX },
1629   },
1630   /* PREGRP22 */
1631   {
1632     { "pshufw", MX, EM, Ib },
1633     { "pshufhw", XM, EX, Ib },
1634     { "pshufd", XM, EX, Ib },
1635     { "pshuflw", XM, EX, Ib },
1636   },
1637   /* PREGRP23 */
1638   {
1639     { "movd", Edq, MX, XX },
1640     { "movq", XM, EX, XX },
1641     { "movd", Edq, XM, XX },
1642     { "(bad)", Ed, XM, XX },
1643   },
1644   /* PREGRP24 */
1645   {
1646     { "(bad)", MX, EX, XX },
1647     { "(bad)", XM, EX, XX },
1648     { "punpckhqdq", XM, EX, XX },
1649     { "(bad)", XM, EX, XX },
1650   },
1651   /* PREGRP25 */
1652   {
1653   { "movntq", Ev, MX, XX },
1654   { "(bad)", Ev, XM, XX },
1655   { "movntdq", Ev, XM, XX },
1656   { "(bad)", Ev, XM, XX },
1657   },
1658   /* PREGRP26 */
1659   {
1660     { "(bad)", MX, EX, XX },
1661     { "(bad)", XM, EX, XX },
1662     { "punpcklqdq", XM, EX, XX },
1663     { "(bad)", XM, EX, XX },
1664   },
1665   /* PREGRP27 */
1666   {
1667     { "(bad)", MX, EX, XX },
1668     { "(bad)", XM, EX, XX },
1669     { "addsubpd", XM, EX, XX },
1670     { "addsubps", XM, EX, XX },
1671   },
1672   /* PREGRP28 */
1673   {
1674     { "(bad)", MX, EX, XX },
1675     { "(bad)", XM, EX, XX },
1676     { "haddpd", XM, EX, XX },
1677     { "haddps", XM, EX, XX },
1678   },
1679   /* PREGRP29 */
1680   {
1681     { "(bad)", MX, EX, XX },
1682     { "(bad)", XM, EX, XX },
1683     { "hsubpd", XM, EX, XX },
1684     { "hsubps", XM, EX, XX },
1685   },
1686   /* PREGRP30 */
1687   {
1688     { "movlpX", XM, EX, SIMD_Fixup, 'h' }, /* really only 2 operands */
1689     { "movsldup", XM, EX, XX },
1690     { "movlpd", XM, EX, XX },
1691     { "movddup", XM, EX, XX },
1692   },
1693   /* PREGRP31 */
1694   {
1695     { "movhpX", XM, EX, SIMD_Fixup, 'l' },
1696     { "movshdup", XM, EX, XX },
1697     { "movhpd", XM, EX, XX },
1698     { "(bad)", XM, EX, XX },
1699   },
1700   /* PREGRP32 */
1701   {
1702     { "(bad)", XM, EX, XX },
1703     { "(bad)", XM, EX, XX },
1704     { "(bad)", XM, EX, XX },
1705     { "lddqu", XM, M, XX },
1706   },
1707 };
1708
1709 static const struct dis386 x86_64_table[][2] = {
1710   {
1711     { "arpl", Ew, Gw, XX },
1712     { "movs{||lq|xd}", Gv, Ed, XX },
1713   },
1714 };
1715
1716 static const struct dis386 three_byte_table[][32] = {
1717   /* THREE_BYTE_0 */
1718   {
1719     { "pshufb",         MX, EM, XX },
1720     { "phaddw",         MX, EM, XX },
1721     { "phaddd",         MX, EM, XX },
1722     { "phaddsw",        MX, EM, XX },
1723     { "pmaddubsw",      MX, EM, XX },
1724     { "phsubw",         MX, EM, XX },
1725     { "phsubd",         MX, EM, XX },
1726     { "phsubsw",        MX, EM, XX },
1727     { "psignb",         MX, EM, XX },
1728     { "psignw",         MX, EM, XX },
1729     { "psignd",         MX, EM, XX },
1730     { "pmulhrsw",       MX, EM, XX },
1731     { "(bad)",          XX, XX, XX },
1732     { "(bad)",          XX, XX, XX },
1733     { "(bad)",          XX, XX, XX },
1734     { "(bad)",          XX, XX, XX },
1735     { "(bad)",          XX, XX, XX },
1736     { "(bad)",          XX, XX, XX },
1737     { "(bad)",          XX, XX, XX },
1738     { "(bad)",          XX, XX, XX },
1739     { "(bad)",          XX, XX, XX },
1740     { "(bad)",          XX, XX, XX },
1741     { "(bad)",          XX, XX, XX },
1742     { "(bad)",          XX, XX, XX },
1743     { "(bad)",          XX, XX, XX },
1744     { "(bad)",          XX, XX, XX },
1745     { "(bad)",          XX, XX, XX },
1746     { "(bad)",          XX, XX, XX },
1747     { "pabsb",          MX, EM, XX },
1748     { "pabsw",          MX, EM, XX },
1749     { "pabsd",          MX, EM, XX },
1750     { "(bad)",          XX, XX, XX }
1751   },
1752   /* THREE_BYTE_1 */
1753   {
1754     { "(bad)",          XX, XX, XX },
1755     { "(bad)",          XX, XX, XX },
1756     { "(bad)",          XX, XX, XX },
1757     { "(bad)",          XX, XX, XX },
1758     { "(bad)",          XX, XX, XX },
1759     { "(bad)",          XX, XX, XX },
1760     { "(bad)",          XX, XX, XX },
1761     { "(bad)",          XX, XX, XX },
1762     { "(bad)",          XX, XX, XX },
1763     { "(bad)",          XX, XX, XX },
1764     { "(bad)",          XX, XX, XX },
1765     { "(bad)",          XX, XX, XX },
1766     { "(bad)",          XX, XX, XX },
1767     { "(bad)",          XX, XX, XX },
1768     { "(bad)",          XX, XX, XX },
1769     { "palignr",        MX, EM, Ib },
1770     { "(bad)",          XX, XX, XX },
1771     { "(bad)",          XX, XX, XX },
1772     { "(bad)",          XX, XX, XX },
1773     { "(bad)",          XX, XX, XX },
1774     { "(bad)",          XX, XX, XX },
1775     { "(bad)",          XX, XX, XX },
1776     { "(bad)",          XX, XX, XX },
1777     { "(bad)",          XX, XX, XX },
1778     { "(bad)",          XX, XX, XX },
1779     { "(bad)",          XX, XX, XX },
1780     { "(bad)",          XX, XX, XX },
1781     { "(bad)",          XX, XX, XX },
1782     { "(bad)",          XX, XX, XX },
1783     { "(bad)",          XX, XX, XX },
1784     { "(bad)",          XX, XX, XX },
1785     { "(bad)",          XX, XX, XX }
1786   },
1787 };
1788
1789 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
1790
1791 static void
1792 ckprefix (void)
1793 {
1794   int newrex;
1795   rex = 0;
1796   prefixes = 0;
1797   used_prefixes = 0;
1798   rex_used = 0;
1799   while (1)
1800     {
1801       FETCH_DATA (the_info, codep + 1);
1802       newrex = 0;
1803       switch (*codep)
1804         {
1805         /* REX prefixes family.  */
1806         case 0x40:
1807         case 0x41:
1808         case 0x42:
1809         case 0x43:
1810         case 0x44:
1811         case 0x45:
1812         case 0x46:
1813         case 0x47:
1814         case 0x48:
1815         case 0x49:
1816         case 0x4a:
1817         case 0x4b:
1818         case 0x4c:
1819         case 0x4d:
1820         case 0x4e:
1821         case 0x4f:
1822             if (mode_64bit)
1823               newrex = *codep;
1824             else
1825               return;
1826           break;
1827         case 0xf3:
1828           prefixes |= PREFIX_REPZ;
1829           break;
1830         case 0xf2:
1831           prefixes |= PREFIX_REPNZ;
1832           break;
1833         case 0xf0:
1834           prefixes |= PREFIX_LOCK;
1835           break;
1836         case 0x2e:
1837           prefixes |= PREFIX_CS;
1838           break;
1839         case 0x36:
1840           prefixes |= PREFIX_SS;
1841           break;
1842         case 0x3e:
1843           prefixes |= PREFIX_DS;
1844           break;
1845         case 0x26:
1846           prefixes |= PREFIX_ES;
1847           break;
1848         case 0x64:
1849           prefixes |= PREFIX_FS;
1850           break;
1851         case 0x65:
1852           prefixes |= PREFIX_GS;
1853           break;
1854         case 0x66:
1855           prefixes |= PREFIX_DATA;
1856           break;
1857         case 0x67:
1858           prefixes |= PREFIX_ADDR;
1859           break;
1860         case FWAIT_OPCODE:
1861           /* fwait is really an instruction.  If there are prefixes
1862              before the fwait, they belong to the fwait, *not* to the
1863              following instruction.  */
1864           if (prefixes)
1865             {
1866               prefixes |= PREFIX_FWAIT;
1867               codep++;
1868               return;
1869             }
1870           prefixes = PREFIX_FWAIT;
1871           break;
1872         default:
1873           return;
1874         }
1875       /* Rex is ignored when followed by another prefix.  */
1876       if (rex)
1877         {
1878           oappend (prefix_name (rex, 0));
1879           oappend (" ");
1880         }
1881       rex = newrex;
1882       codep++;
1883     }
1884 }
1885
1886 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
1887    prefix byte.  */
1888
1889 static const char *
1890 prefix_name (int pref, int sizeflag)
1891 {
1892   switch (pref)
1893     {
1894     /* REX prefixes family.  */
1895     case 0x40:
1896       return "rex";
1897     case 0x41:
1898       return "rexZ";
1899     case 0x42:
1900       return "rexY";
1901     case 0x43:
1902       return "rexYZ";
1903     case 0x44:
1904       return "rexX";
1905     case 0x45:
1906       return "rexXZ";
1907     case 0x46:
1908       return "rexXY";
1909     case 0x47:
1910       return "rexXYZ";
1911     case 0x48:
1912       return "rex64";
1913     case 0x49:
1914       return "rex64Z";
1915     case 0x4a:
1916       return "rex64Y";
1917     case 0x4b:
1918       return "rex64YZ";
1919     case 0x4c:
1920       return "rex64X";
1921     case 0x4d:
1922       return "rex64XZ";
1923     case 0x4e:
1924       return "rex64XY";
1925     case 0x4f:
1926       return "rex64XYZ";
1927     case 0xf3:
1928       return "repz";
1929     case 0xf2:
1930       return "repnz";
1931     case 0xf0:
1932       return "lock";
1933     case 0x2e:
1934       return "cs";
1935     case 0x36:
1936       return "ss";
1937     case 0x3e:
1938       return "ds";
1939     case 0x26:
1940       return "es";
1941     case 0x64:
1942       return "fs";
1943     case 0x65:
1944       return "gs";
1945     case 0x66:
1946       return (sizeflag & DFLAG) ? "data16" : "data32";
1947     case 0x67:
1948       if (mode_64bit)
1949         return (sizeflag & AFLAG) ? "addr32" : "addr64";
1950       else
1951         return ((sizeflag & AFLAG) && !mode_64bit) ? "addr16" : "addr32";
1952     case FWAIT_OPCODE:
1953       return "fwait";
1954     default:
1955       return NULL;
1956     }
1957 }
1958
1959 static char op1out[100], op2out[100], op3out[100];
1960 static int op_ad, op_index[3];
1961 static bfd_vma op_address[3];
1962 static bfd_vma op_riprel[3];
1963 static bfd_vma start_pc;
1964 \f
1965 /*
1966  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
1967  *   (see topic "Redundant prefixes" in the "Differences from 8086"
1968  *   section of the "Virtual 8086 Mode" chapter.)
1969  * 'pc' should be the address of this instruction, it will
1970  *   be used to print the target address if this is a relative jump or call
1971  * The function returns the length of this instruction in bytes.
1972  */
1973
1974 static char intel_syntax;
1975 static char open_char;
1976 static char close_char;
1977 static char separator_char;
1978 static char scale_char;
1979
1980 /* Here for backwards compatibility.  When gdb stops using
1981    print_insn_i386_att and print_insn_i386_intel these functions can
1982    disappear, and print_insn_i386 be merged into print_insn.  */
1983 int
1984 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
1985 {
1986   intel_syntax = 0;
1987
1988   return print_insn (pc, info);
1989 }
1990
1991 int
1992 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
1993 {
1994   intel_syntax = 1;
1995
1996   return print_insn (pc, info);
1997 }
1998
1999 int
2000 print_insn_i386 (bfd_vma pc, disassemble_info *info)
2001 {
2002   intel_syntax = -1;
2003
2004   return print_insn (pc, info);
2005 }
2006
2007 static int
2008 print_insn (bfd_vma pc, disassemble_info *info)
2009 {
2010   const struct dis386 *dp;
2011   int i;
2012   int two_source_ops;
2013   char *first, *second, *third;
2014   int needcomma;
2015   unsigned char uses_SSE_prefix;
2016   int sizeflag;
2017   const char *p;
2018   struct dis_private priv;
2019
2020   mode_64bit = (info->mach == bfd_mach_x86_64_intel_syntax
2021                 || info->mach == bfd_mach_x86_64);
2022
2023   if (intel_syntax == (char) -1)
2024     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
2025                     || info->mach == bfd_mach_x86_64_intel_syntax);
2026
2027   if (info->mach == bfd_mach_i386_i386
2028       || info->mach == bfd_mach_x86_64
2029       || info->mach == bfd_mach_i386_i386_intel_syntax
2030       || info->mach == bfd_mach_x86_64_intel_syntax)
2031     priv.orig_sizeflag = AFLAG | DFLAG;
2032   else if (info->mach == bfd_mach_i386_i8086)
2033     priv.orig_sizeflag = 0;
2034   else
2035     abort ();
2036
2037   for (p = info->disassembler_options; p != NULL; )
2038     {
2039       if (strncmp (p, "x86-64", 6) == 0)
2040         {
2041           mode_64bit = 1;
2042           priv.orig_sizeflag = AFLAG | DFLAG;
2043         }
2044       else if (strncmp (p, "i386", 4) == 0)
2045         {
2046           mode_64bit = 0;
2047           priv.orig_sizeflag = AFLAG | DFLAG;
2048         }
2049       else if (strncmp (p, "i8086", 5) == 0)
2050         {
2051           mode_64bit = 0;
2052           priv.orig_sizeflag = 0;
2053         }
2054       else if (strncmp (p, "intel", 5) == 0)
2055         {
2056           intel_syntax = 1;
2057         }
2058       else if (strncmp (p, "att", 3) == 0)
2059         {
2060           intel_syntax = 0;
2061         }
2062       else if (strncmp (p, "addr", 4) == 0)
2063         {
2064           if (p[4] == '1' && p[5] == '6')
2065             priv.orig_sizeflag &= ~AFLAG;
2066           else if (p[4] == '3' && p[5] == '2')
2067             priv.orig_sizeflag |= AFLAG;
2068         }
2069       else if (strncmp (p, "data", 4) == 0)
2070         {
2071           if (p[4] == '1' && p[5] == '6')
2072             priv.orig_sizeflag &= ~DFLAG;
2073           else if (p[4] == '3' && p[5] == '2')
2074             priv.orig_sizeflag |= DFLAG;
2075         }
2076       else if (strncmp (p, "suffix", 6) == 0)
2077         priv.orig_sizeflag |= SUFFIX_ALWAYS;
2078
2079       p = strchr (p, ',');
2080       if (p != NULL)
2081         p++;
2082     }
2083
2084   if (intel_syntax)
2085     {
2086       names64 = intel_names64;
2087       names32 = intel_names32;
2088       names16 = intel_names16;
2089       names8 = intel_names8;
2090       names8rex = intel_names8rex;
2091       names_seg = intel_names_seg;
2092       index16 = intel_index16;
2093       open_char = '[';
2094       close_char = ']';
2095       separator_char = '+';
2096       scale_char = '*';
2097     }
2098   else
2099     {
2100       names64 = att_names64;
2101       names32 = att_names32;
2102       names16 = att_names16;
2103       names8 = att_names8;
2104       names8rex = att_names8rex;
2105       names_seg = att_names_seg;
2106       index16 = att_index16;
2107       open_char = '(';
2108       close_char =  ')';
2109       separator_char = ',';
2110       scale_char = ',';
2111     }
2112
2113   /* The output looks better if we put 7 bytes on a line, since that
2114      puts most long word instructions on a single line.  */
2115   info->bytes_per_line = 7;
2116
2117   info->private_data = &priv;
2118   priv.max_fetched = priv.the_buffer;
2119   priv.insn_start = pc;
2120
2121   obuf[0] = 0;
2122   op1out[0] = 0;
2123   op2out[0] = 0;
2124   op3out[0] = 0;
2125
2126   op_index[0] = op_index[1] = op_index[2] = -1;
2127
2128   the_info = info;
2129   start_pc = pc;
2130   start_codep = priv.the_buffer;
2131   codep = priv.the_buffer;
2132
2133   if (setjmp (priv.bailout) != 0)
2134     {
2135       const char *name;
2136
2137       /* Getting here means we tried for data but didn't get it.  That
2138          means we have an incomplete instruction of some sort.  Just
2139          print the first byte as a prefix or a .byte pseudo-op.  */
2140       if (codep > priv.the_buffer)
2141         {
2142           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
2143           if (name != NULL)
2144             (*info->fprintf_func) (info->stream, "%s", name);
2145           else
2146             {
2147               /* Just print the first byte as a .byte instruction.  */
2148               (*info->fprintf_func) (info->stream, ".byte 0x%x",
2149                                      (unsigned int) priv.the_buffer[0]);
2150             }
2151
2152           return 1;
2153         }
2154
2155       return -1;
2156     }
2157
2158   obufp = obuf;
2159   ckprefix ();
2160
2161   insn_codep = codep;
2162   sizeflag = priv.orig_sizeflag;
2163
2164   FETCH_DATA (info, codep + 1);
2165   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
2166
2167   if ((prefixes & PREFIX_FWAIT)
2168       && ((*codep < 0xd8) || (*codep > 0xdf)))
2169     {
2170       const char *name;
2171
2172       /* fwait not followed by floating point instruction.  Print the
2173          first prefix, which is probably fwait itself.  */
2174       name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
2175       if (name == NULL)
2176         name = INTERNAL_DISASSEMBLER_ERROR;
2177       (*info->fprintf_func) (info->stream, "%s", name);
2178       return 1;
2179     }
2180
2181   if (*codep == 0x0f)
2182     {
2183       FETCH_DATA (info, codep + 2);
2184       dp = &dis386_twobyte[*++codep];
2185       need_modrm = twobyte_has_modrm[*codep];
2186       uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
2187     }
2188   else
2189     {
2190       dp = &dis386[*codep];
2191       need_modrm = onebyte_has_modrm[*codep];
2192       uses_SSE_prefix = 0;
2193     }
2194   codep++;
2195
2196   if (!uses_SSE_prefix && (prefixes & PREFIX_REPZ))
2197     {
2198       oappend ("repz ");
2199       used_prefixes |= PREFIX_REPZ;
2200     }
2201   if (!uses_SSE_prefix && (prefixes & PREFIX_REPNZ))
2202     {
2203       oappend ("repnz ");
2204       used_prefixes |= PREFIX_REPNZ;
2205     }
2206   if (prefixes & PREFIX_LOCK)
2207     {
2208       oappend ("lock ");
2209       used_prefixes |= PREFIX_LOCK;
2210     }
2211
2212   if (prefixes & PREFIX_ADDR)
2213     {
2214       sizeflag ^= AFLAG;
2215       if (dp->bytemode3 != loop_jcxz_mode || intel_syntax)
2216         {
2217           if ((sizeflag & AFLAG) || mode_64bit)
2218             oappend ("addr32 ");
2219           else
2220             oappend ("addr16 ");
2221           used_prefixes |= PREFIX_ADDR;
2222         }
2223     }
2224
2225   if (!uses_SSE_prefix && (prefixes & PREFIX_DATA))
2226     {
2227       sizeflag ^= DFLAG;
2228       if (dp->bytemode3 == cond_jump_mode
2229           && dp->bytemode1 == v_mode
2230           && !intel_syntax)
2231         {
2232           if (sizeflag & DFLAG)
2233             oappend ("data32 ");
2234           else
2235             oappend ("data16 ");
2236           used_prefixes |= PREFIX_DATA;
2237         }
2238     }
2239
2240   if (dp->name == NULL && dp->bytemode1 == IS_3BYTE_OPCODE)
2241     {
2242       FETCH_DATA (info, codep + 2);
2243       dp = &three_byte_table[dp->bytemode2][*codep++];
2244       mod = (*codep >> 6) & 3;
2245       reg = (*codep >> 3) & 7;
2246       rm = *codep & 7;
2247     }
2248   else if (need_modrm)
2249     {
2250       FETCH_DATA (info, codep + 1);
2251       mod = (*codep >> 6) & 3;
2252       reg = (*codep >> 3) & 7;
2253       rm = *codep & 7;
2254     }
2255
2256   if (dp->name == NULL && dp->bytemode1 == FLOATCODE)
2257     {
2258       dofloat (sizeflag);
2259     }
2260   else
2261     {
2262       int index;
2263       if (dp->name == NULL)
2264         {
2265           switch (dp->bytemode1)
2266             {
2267             case USE_GROUPS:
2268               dp = &grps[dp->bytemode2][reg];
2269               break;
2270
2271             case USE_PREFIX_USER_TABLE:
2272               index = 0;
2273               used_prefixes |= (prefixes & PREFIX_REPZ);
2274               if (prefixes & PREFIX_REPZ)
2275                 index = 1;
2276               else
2277                 {
2278                   used_prefixes |= (prefixes & PREFIX_DATA);
2279                   if (prefixes & PREFIX_DATA)
2280                     index = 2;
2281                   else
2282                     {
2283                       used_prefixes |= (prefixes & PREFIX_REPNZ);
2284                       if (prefixes & PREFIX_REPNZ)
2285                         index = 3;
2286                     }
2287                 }
2288               dp = &prefix_user_table[dp->bytemode2][index];
2289               break;
2290
2291             case X86_64_SPECIAL:
2292               dp = &x86_64_table[dp->bytemode2][mode_64bit];
2293               break;
2294
2295             default:
2296               oappend (INTERNAL_DISASSEMBLER_ERROR);
2297               break;
2298             }
2299         }
2300
2301       if (putop (dp->name, sizeflag) == 0)
2302         {
2303           obufp = op1out;
2304           op_ad = 2;
2305           if (dp->op1)
2306             (*dp->op1) (dp->bytemode1, sizeflag);
2307
2308           obufp = op2out;
2309           op_ad = 1;
2310           if (dp->op2)
2311             (*dp->op2) (dp->bytemode2, sizeflag);
2312
2313           obufp = op3out;
2314           op_ad = 0;
2315           if (dp->op3)
2316             (*dp->op3) (dp->bytemode3, sizeflag);
2317         }
2318     }
2319
2320   /* See if any prefixes were not used.  If so, print the first one
2321      separately.  If we don't do this, we'll wind up printing an
2322      instruction stream which does not precisely correspond to the
2323      bytes we are disassembling.  */
2324   if ((prefixes & ~used_prefixes) != 0)
2325     {
2326       const char *name;
2327
2328       name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
2329       if (name == NULL)
2330         name = INTERNAL_DISASSEMBLER_ERROR;
2331       (*info->fprintf_func) (info->stream, "%s", name);
2332       return 1;
2333     }
2334   if (rex & ~rex_used)
2335     {
2336       const char *name;
2337       name = prefix_name (rex | 0x40, priv.orig_sizeflag);
2338       if (name == NULL)
2339         name = INTERNAL_DISASSEMBLER_ERROR;
2340       (*info->fprintf_func) (info->stream, "%s ", name);
2341     }
2342
2343   obufp = obuf + strlen (obuf);
2344   for (i = strlen (obuf); i < 6; i++)
2345     oappend (" ");
2346   oappend (" ");
2347   (*info->fprintf_func) (info->stream, "%s", obuf);
2348
2349   /* The enter and bound instructions are printed with operands in the same
2350      order as the intel book; everything else is printed in reverse order.  */
2351   if (intel_syntax || two_source_ops)
2352     {
2353       first = op1out;
2354       second = op2out;
2355       third = op3out;
2356       op_ad = op_index[0];
2357       op_index[0] = op_index[2];
2358       op_index[2] = op_ad;
2359     }
2360   else
2361     {
2362       first = op3out;
2363       second = op2out;
2364       third = op1out;
2365     }
2366   needcomma = 0;
2367   if (*first)
2368     {
2369       if (op_index[0] != -1 && !op_riprel[0])
2370         (*info->print_address_func) ((bfd_vma) op_address[op_index[0]], info);
2371       else
2372         (*info->fprintf_func) (info->stream, "%s", first);
2373       needcomma = 1;
2374     }
2375   if (*second)
2376     {
2377       if (needcomma)
2378         (*info->fprintf_func) (info->stream, ",");
2379       if (op_index[1] != -1 && !op_riprel[1])
2380         (*info->print_address_func) ((bfd_vma) op_address[op_index[1]], info);
2381       else
2382         (*info->fprintf_func) (info->stream, "%s", second);
2383       needcomma = 1;
2384     }
2385   if (*third)
2386     {
2387       if (needcomma)
2388         (*info->fprintf_func) (info->stream, ",");
2389       if (op_index[2] != -1 && !op_riprel[2])
2390         (*info->print_address_func) ((bfd_vma) op_address[op_index[2]], info);
2391       else
2392         (*info->fprintf_func) (info->stream, "%s", third);
2393     }
2394   for (i = 0; i < 3; i++)
2395     if (op_index[i] != -1 && op_riprel[i])
2396       {
2397         (*info->fprintf_func) (info->stream, "        # ");
2398         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
2399                                                 + op_address[op_index[i]]), info);
2400       }
2401   return codep - priv.the_buffer;
2402 }
2403
2404 static const char *float_mem[] = {
2405   /* d8 */
2406   "fadd{s||s|}",
2407   "fmul{s||s|}",
2408   "fcom{s||s|}",
2409   "fcomp{s||s|}",
2410   "fsub{s||s|}",
2411   "fsubr{s||s|}",
2412   "fdiv{s||s|}",
2413   "fdivr{s||s|}",
2414   /* d9 */
2415   "fld{s||s|}",
2416   "(bad)",
2417   "fst{s||s|}",
2418   "fstp{s||s|}",
2419   "fldenv",
2420   "fldcw",
2421   "fNstenv",
2422   "fNstcw",
2423   /* da */
2424   "fiadd{l||l|}",
2425   "fimul{l||l|}",
2426   "ficom{l||l|}",
2427   "ficomp{l||l|}",
2428   "fisub{l||l|}",
2429   "fisubr{l||l|}",
2430   "fidiv{l||l|}",
2431   "fidivr{l||l|}",
2432   /* db */
2433   "fild{l||l|}",
2434   "fisttp{l||l|}",
2435   "fist{l||l|}",
2436   "fistp{l||l|}",
2437   "(bad)",
2438   "fld{t||t|}",
2439   "(bad)",
2440   "fstp{t||t|}",
2441   /* dc */
2442   "fadd{l||l|}",
2443   "fmul{l||l|}",
2444   "fcom{l||l|}",
2445   "fcomp{l||l|}",
2446   "fsub{l||l|}",
2447   "fsubr{l||l|}",
2448   "fdiv{l||l|}",
2449   "fdivr{l||l|}",
2450   /* dd */
2451   "fld{l||l|}",
2452   "fisttpll",
2453   "fst{l||l|}",
2454   "fstp{l||l|}",
2455   "frstor",
2456   "(bad)",
2457   "fNsave",
2458   "fNstsw",
2459   /* de */
2460   "fiadd",
2461   "fimul",
2462   "ficom",
2463   "ficomp",
2464   "fisub",
2465   "fisubr",
2466   "fidiv",
2467   "fidivr",
2468   /* df */
2469   "fild",
2470   "fisttp",
2471   "fist",
2472   "fistp",
2473   "fbld",
2474   "fild{ll||ll|}",
2475   "fbstp",
2476   "fistpll",
2477 };
2478
2479 #define ST OP_ST, 0
2480 #define STi OP_STi, 0
2481
2482 #define FGRPd9_2 NULL, NULL, 0, NULL, 0, NULL, 0
2483 #define FGRPd9_4 NULL, NULL, 1, NULL, 0, NULL, 0
2484 #define FGRPd9_5 NULL, NULL, 2, NULL, 0, NULL, 0
2485 #define FGRPd9_6 NULL, NULL, 3, NULL, 0, NULL, 0
2486 #define FGRPd9_7 NULL, NULL, 4, NULL, 0, NULL, 0
2487 #define FGRPda_5 NULL, NULL, 5, NULL, 0, NULL, 0
2488 #define FGRPdb_4 NULL, NULL, 6, NULL, 0, NULL, 0
2489 #define FGRPde_3 NULL, NULL, 7, NULL, 0, NULL, 0
2490 #define FGRPdf_4 NULL, NULL, 8, NULL, 0, NULL, 0
2491
2492 static const struct dis386 float_reg[][8] = {
2493   /* d8 */
2494   {
2495     { "fadd",   ST, STi, XX },
2496     { "fmul",   ST, STi, XX },
2497     { "fcom",   STi, XX, XX },
2498     { "fcomp",  STi, XX, XX },
2499     { "fsub",   ST, STi, XX },
2500     { "fsubr",  ST, STi, XX },
2501     { "fdiv",   ST, STi, XX },
2502     { "fdivr",  ST, STi, XX },
2503   },
2504   /* d9 */
2505   {
2506     { "fld",    STi, XX, XX },
2507     { "fxch",   STi, XX, XX },
2508     { FGRPd9_2 },
2509     { "(bad)",  XX, XX, XX },
2510     { FGRPd9_4 },
2511     { FGRPd9_5 },
2512     { FGRPd9_6 },
2513     { FGRPd9_7 },
2514   },
2515   /* da */
2516   {
2517     { "fcmovb", ST, STi, XX },
2518     { "fcmove", ST, STi, XX },
2519     { "fcmovbe",ST, STi, XX },
2520     { "fcmovu", ST, STi, XX },
2521     { "(bad)",  XX, XX, XX },
2522     { FGRPda_5 },
2523     { "(bad)",  XX, XX, XX },
2524     { "(bad)",  XX, XX, XX },
2525   },
2526   /* db */
2527   {
2528     { "fcmovnb",ST, STi, XX },
2529     { "fcmovne",ST, STi, XX },
2530     { "fcmovnbe",ST, STi, XX },
2531     { "fcmovnu",ST, STi, XX },
2532     { FGRPdb_4 },
2533     { "fucomi", ST, STi, XX },
2534     { "fcomi",  ST, STi, XX },
2535     { "(bad)",  XX, XX, XX },
2536   },
2537   /* dc */
2538   {
2539     { "fadd",   STi, ST, XX },
2540     { "fmul",   STi, ST, XX },
2541     { "(bad)",  XX, XX, XX },
2542     { "(bad)",  XX, XX, XX },
2543 #if UNIXWARE_COMPAT
2544     { "fsub",   STi, ST, XX },
2545     { "fsubr",  STi, ST, XX },
2546     { "fdiv",   STi, ST, XX },
2547     { "fdivr",  STi, ST, XX },
2548 #else
2549     { "fsubr",  STi, ST, XX },
2550     { "fsub",   STi, ST, XX },
2551     { "fdivr",  STi, ST, XX },
2552     { "fdiv",   STi, ST, XX },
2553 #endif
2554   },
2555   /* dd */
2556   {
2557     { "ffree",  STi, XX, XX },
2558     { "(bad)",  XX, XX, XX },
2559     { "fst",    STi, XX, XX },
2560     { "fstp",   STi, XX, XX },
2561     { "fucom",  STi, XX, XX },
2562     { "fucomp", STi, XX, XX },
2563     { "(bad)",  XX, XX, XX },
2564     { "(bad)",  XX, XX, XX },
2565   },
2566   /* de */
2567   {
2568     { "faddp",  STi, ST, XX },
2569     { "fmulp",  STi, ST, XX },
2570     { "(bad)",  XX, XX, XX },
2571     { FGRPde_3 },
2572 #if UNIXWARE_COMPAT
2573     { "fsubp",  STi, ST, XX },
2574     { "fsubrp", STi, ST, XX },
2575     { "fdivp",  STi, ST, XX },
2576     { "fdivrp", STi, ST, XX },
2577 #else
2578     { "fsubrp", STi, ST, XX },
2579     { "fsubp",  STi, ST, XX },
2580     { "fdivrp", STi, ST, XX },
2581     { "fdivp",  STi, ST, XX },
2582 #endif
2583   },
2584   /* df */
2585   {
2586     { "ffreep", STi, XX, XX },
2587     { "(bad)",  XX, XX, XX },
2588     { "(bad)",  XX, XX, XX },
2589     { "(bad)",  XX, XX, XX },
2590     { FGRPdf_4 },
2591     { "fucomip",ST, STi, XX },
2592     { "fcomip", ST, STi, XX },
2593     { "(bad)",  XX, XX, XX },
2594   },
2595 };
2596
2597 static char *fgrps[][8] = {
2598   /* d9_2  0 */
2599   {
2600     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2601   },
2602
2603   /* d9_4  1 */
2604   {
2605     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
2606   },
2607
2608   /* d9_5  2 */
2609   {
2610     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
2611   },
2612
2613   /* d9_6  3 */
2614   {
2615     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
2616   },
2617
2618   /* d9_7  4 */
2619   {
2620     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
2621   },
2622
2623   /* da_5  5 */
2624   {
2625     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2626   },
2627
2628   /* db_4  6 */
2629   {
2630     "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
2631     "fNsetpm(287 only)","(bad)","(bad)","(bad)",
2632   },
2633
2634   /* de_3  7 */
2635   {
2636     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2637   },
2638
2639   /* df_4  8 */
2640   {
2641     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2642   },
2643 };
2644
2645 static void
2646 dofloat (int sizeflag)
2647 {
2648   const struct dis386 *dp;
2649   unsigned char floatop;
2650
2651   floatop = codep[-1];
2652
2653   if (mod != 3)
2654     {
2655       putop (float_mem[(floatop - 0xd8) * 8 + reg], sizeflag);
2656       obufp = op1out;
2657       if (floatop == 0xdb)
2658         OP_E (x_mode, sizeflag);
2659       else if (floatop == 0xdd)
2660         OP_E (d_mode, sizeflag);
2661       else
2662         OP_E (v_mode, sizeflag);
2663       return;
2664     }
2665   /* Skip mod/rm byte.  */
2666   MODRM_CHECK;
2667   codep++;
2668
2669   dp = &float_reg[floatop - 0xd8][reg];
2670   if (dp->name == NULL)
2671     {
2672       putop (fgrps[dp->bytemode1][rm], sizeflag);
2673
2674       /* Instruction fnstsw is only one with strange arg.  */
2675       if (floatop == 0xdf && codep[-1] == 0xe0)
2676         strcpy (op1out, names16[0]);
2677     }
2678   else
2679     {
2680       putop (dp->name, sizeflag);
2681
2682       obufp = op1out;
2683       if (dp->op1)
2684         (*dp->op1) (dp->bytemode1, sizeflag);
2685       obufp = op2out;
2686       if (dp->op2)
2687         (*dp->op2) (dp->bytemode2, sizeflag);
2688     }
2689 }
2690
2691 static void
2692 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
2693 {
2694   oappend ("%st");
2695 }
2696
2697 static void
2698 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
2699 {
2700   sprintf (scratchbuf, "%%st(%d)", rm);
2701   oappend (scratchbuf + intel_syntax);
2702 }
2703
2704 /* Capital letters in template are macros.  */
2705 static int
2706 putop (const char *template, int sizeflag)
2707 {
2708   const char *p;
2709   int alt;
2710
2711   for (p = template; *p; p++)
2712     {
2713       switch (*p)
2714         {
2715         default:
2716           *obufp++ = *p;
2717           break;
2718         case '{':
2719           alt = 0;
2720           if (intel_syntax)
2721             alt += 1;
2722           if (mode_64bit)
2723             alt += 2;
2724           while (alt != 0)
2725             {
2726               while (*++p != '|')
2727                 {
2728                   if (*p == '}')
2729                     {
2730                       /* Alternative not valid.  */
2731                       strcpy (obuf, "(bad)");
2732                       obufp = obuf + 5;
2733                       return 1;
2734                     }
2735                   else if (*p == '\0')
2736                     abort ();
2737                 }
2738               alt--;
2739             }
2740           break;
2741         case '|':
2742           while (*++p != '}')
2743             {
2744               if (*p == '\0')
2745                 abort ();
2746             }
2747           break;
2748         case '}':
2749           break;
2750         case 'A':
2751           if (intel_syntax)
2752             break;
2753           if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
2754             *obufp++ = 'b';
2755           break;
2756         case 'B':
2757           if (intel_syntax)
2758             break;
2759           if (sizeflag & SUFFIX_ALWAYS)
2760             *obufp++ = 'b';
2761           break;
2762         case 'E':               /* For jcxz/jecxz */
2763           if (mode_64bit)
2764             {
2765               if (sizeflag & AFLAG)
2766                 *obufp++ = 'r';
2767               else
2768                 *obufp++ = 'e';
2769             }
2770           else
2771             if (sizeflag & AFLAG)
2772               *obufp++ = 'e';
2773           used_prefixes |= (prefixes & PREFIX_ADDR);
2774           break;
2775         case 'F':
2776           if (intel_syntax)
2777             break;
2778           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
2779             {
2780               if (sizeflag & AFLAG)
2781                 *obufp++ = mode_64bit ? 'q' : 'l';
2782               else
2783                 *obufp++ = mode_64bit ? 'l' : 'w';
2784               used_prefixes |= (prefixes & PREFIX_ADDR);
2785             }
2786           break;
2787         case 'H':
2788           if (intel_syntax)
2789             break;
2790           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
2791               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
2792             {
2793               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
2794               *obufp++ = ',';
2795               *obufp++ = 'p';
2796               if (prefixes & PREFIX_DS)
2797                 *obufp++ = 't';
2798               else
2799                 *obufp++ = 'n';
2800             }
2801           break;
2802         case 'L':
2803           if (intel_syntax)
2804             break;
2805           if (sizeflag & SUFFIX_ALWAYS)
2806             *obufp++ = 'l';
2807           break;
2808         case 'N':
2809           if ((prefixes & PREFIX_FWAIT) == 0)
2810             *obufp++ = 'n';
2811           else
2812             used_prefixes |= PREFIX_FWAIT;
2813           break;
2814         case 'O':
2815           USED_REX (REX_MODE64);
2816           if (rex & REX_MODE64)
2817             *obufp++ = 'o';
2818           else
2819             *obufp++ = 'd';
2820           break;
2821         case 'T':
2822           if (intel_syntax)
2823             break;
2824           if (mode_64bit)
2825             {
2826               *obufp++ = 'q';
2827               break;
2828             }
2829           /* Fall through.  */
2830         case 'P':
2831           if (intel_syntax)
2832             break;
2833           if ((prefixes & PREFIX_DATA)
2834               || (rex & REX_MODE64)
2835               || (sizeflag & SUFFIX_ALWAYS))
2836             {
2837               USED_REX (REX_MODE64);
2838               if (rex & REX_MODE64)
2839                 *obufp++ = 'q';
2840               else
2841                 {
2842                    if (sizeflag & DFLAG)
2843                       *obufp++ = 'l';
2844                    else
2845                      *obufp++ = 'w';
2846                    used_prefixes |= (prefixes & PREFIX_DATA);
2847                 }
2848             }
2849           break;
2850         case 'U':
2851           if (intel_syntax)
2852             break;
2853           if (mode_64bit)
2854             {
2855               *obufp++ = 'q';
2856               break;
2857             }
2858           /* Fall through.  */
2859         case 'Q':
2860           if (intel_syntax)
2861             break;
2862           USED_REX (REX_MODE64);
2863           if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
2864             {
2865               if (rex & REX_MODE64)
2866                 *obufp++ = 'q';
2867               else
2868                 {
2869                   if (sizeflag & DFLAG)
2870                     *obufp++ = 'l';
2871                   else
2872                     *obufp++ = 'w';
2873                   used_prefixes |= (prefixes & PREFIX_DATA);
2874                 }
2875             }
2876           break;
2877         case 'R':
2878           USED_REX (REX_MODE64);
2879           if (intel_syntax)
2880             {
2881               if (rex & REX_MODE64)
2882                 {
2883                   *obufp++ = 'q';
2884                   *obufp++ = 't';
2885                 }
2886               else if (sizeflag & DFLAG)
2887                 {
2888                   *obufp++ = 'd';
2889                   *obufp++ = 'q';
2890                 }
2891               else
2892                 {
2893                   *obufp++ = 'w';
2894                   *obufp++ = 'd';
2895                 }
2896             }
2897           else
2898             {
2899               if (rex & REX_MODE64)
2900                 *obufp++ = 'q';
2901               else if (sizeflag & DFLAG)
2902                 *obufp++ = 'l';
2903               else
2904                 *obufp++ = 'w';
2905             }
2906           if (!(rex & REX_MODE64))
2907             used_prefixes |= (prefixes & PREFIX_DATA);
2908           break;
2909         case 'S':
2910           if (intel_syntax)
2911             break;
2912           if (sizeflag & SUFFIX_ALWAYS)
2913             {
2914               if (rex & REX_MODE64)
2915                 *obufp++ = 'q';
2916               else
2917                 {
2918                   if (sizeflag & DFLAG)
2919                     *obufp++ = 'l';
2920                   else
2921                     *obufp++ = 'w';
2922                   used_prefixes |= (prefixes & PREFIX_DATA);
2923                 }
2924             }
2925           break;
2926         case 'X':
2927           if (prefixes & PREFIX_DATA)
2928             *obufp++ = 'd';
2929           else
2930             *obufp++ = 's';
2931           used_prefixes |= (prefixes & PREFIX_DATA);
2932           break;
2933         case 'Y':
2934           if (intel_syntax)
2935             break;
2936           if (rex & REX_MODE64)
2937             {
2938               USED_REX (REX_MODE64);
2939               *obufp++ = 'q';
2940             }
2941           break;
2942           /* implicit operand size 'l' for i386 or 'q' for x86-64 */
2943         case 'W':
2944           /* operand size flag for cwtl, cbtw */
2945           USED_REX (0);
2946           if (rex)
2947             *obufp++ = 'l';
2948           else if (sizeflag & DFLAG)
2949             *obufp++ = 'w';
2950           else
2951             *obufp++ = 'b';
2952           if (intel_syntax)
2953             {
2954               if (rex)
2955                 {
2956                   *obufp++ = 'q';
2957                   *obufp++ = 'e';
2958                 }
2959               if (sizeflag & DFLAG)
2960                 {
2961                   *obufp++ = 'd';
2962                   *obufp++ = 'e';
2963                 }
2964               else
2965                 {
2966                   *obufp++ = 'w';
2967                 }
2968             }
2969           if (!rex)
2970             used_prefixes |= (prefixes & PREFIX_DATA);
2971           break;
2972         }
2973     }
2974   *obufp = 0;
2975   return 0;
2976 }
2977
2978 static void
2979 oappend (const char *s)
2980 {
2981   strcpy (obufp, s);
2982   obufp += strlen (s);
2983 }
2984
2985 static void
2986 append_seg (void)
2987 {
2988   if (prefixes & PREFIX_CS)
2989     {
2990       used_prefixes |= PREFIX_CS;
2991       oappend ("%cs:" + intel_syntax);
2992     }
2993   if (prefixes & PREFIX_DS)
2994     {
2995       used_prefixes |= PREFIX_DS;
2996       oappend ("%ds:" + intel_syntax);
2997     }
2998   if (prefixes & PREFIX_SS)
2999     {
3000       used_prefixes |= PREFIX_SS;
3001       oappend ("%ss:" + intel_syntax);
3002     }
3003   if (prefixes & PREFIX_ES)
3004     {
3005       used_prefixes |= PREFIX_ES;
3006       oappend ("%es:" + intel_syntax);
3007     }
3008   if (prefixes & PREFIX_FS)
3009     {
3010       used_prefixes |= PREFIX_FS;
3011       oappend ("%fs:" + intel_syntax);
3012     }
3013   if (prefixes & PREFIX_GS)
3014     {
3015       used_prefixes |= PREFIX_GS;
3016       oappend ("%gs:" + intel_syntax);
3017     }
3018 }
3019
3020 static void
3021 OP_indirE (int bytemode, int sizeflag)
3022 {
3023   if (!intel_syntax)
3024     oappend ("*");
3025   OP_E (bytemode, sizeflag);
3026 }
3027
3028 static void
3029 print_operand_value (char *buf, int hex, bfd_vma disp)
3030 {
3031   if (mode_64bit)
3032     {
3033       if (hex)
3034         {
3035           char tmp[30];
3036           int i;
3037           buf[0] = '0';
3038           buf[1] = 'x';
3039           sprintf_vma (tmp, disp);
3040           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
3041           strcpy (buf + 2, tmp + i);
3042         }
3043       else
3044         {
3045           bfd_signed_vma v = disp;
3046           char tmp[30];
3047           int i;
3048           if (v < 0)
3049             {
3050               *(buf++) = '-';
3051               v = -disp;
3052               /* Check for possible overflow on 0x8000000000000000.  */
3053               if (v < 0)
3054                 {
3055                   strcpy (buf, "9223372036854775808");
3056                   return;
3057                 }
3058             }
3059           if (!v)
3060             {
3061               strcpy (buf, "0");
3062               return;
3063             }
3064
3065           i = 0;
3066           tmp[29] = 0;
3067           while (v)
3068             {
3069               tmp[28 - i] = (v % 10) + '0';
3070               v /= 10;
3071               i++;
3072             }
3073           strcpy (buf, tmp + 29 - i);
3074         }
3075     }
3076   else
3077     {
3078       if (hex)
3079         sprintf (buf, "0x%x", (unsigned int) disp);
3080       else
3081         sprintf (buf, "%d", (int) disp);
3082     }
3083 }
3084
3085 static void
3086 OP_E (int bytemode, int sizeflag)
3087 {
3088   bfd_vma disp;
3089   int add = 0;
3090   int riprel = 0;
3091   USED_REX (REX_EXTZ);
3092   if (rex & REX_EXTZ)
3093     add += 8;
3094
3095   /* Skip mod/rm byte.  */
3096   MODRM_CHECK;
3097   codep++;
3098
3099   if (mod == 3)
3100     {
3101       switch (bytemode)
3102         {
3103         case b_mode:
3104           USED_REX (0);
3105           if (rex)
3106             oappend (names8rex[rm + add]);
3107           else
3108             oappend (names8[rm + add]);
3109           break;
3110         case w_mode:
3111           oappend (names16[rm + add]);
3112           break;
3113         case d_mode:
3114           oappend (names32[rm + add]);
3115           break;
3116         case q_mode:
3117           oappend (names64[rm + add]);
3118           break;
3119         case m_mode:
3120           if (mode_64bit)
3121             oappend (names64[rm + add]);
3122           else
3123             oappend (names32[rm + add]);
3124           break;
3125         case v_mode:
3126         case dq_mode:
3127           USED_REX (REX_MODE64);
3128           if (rex & REX_MODE64)
3129             oappend (names64[rm + add]);
3130           else if ((sizeflag & DFLAG) || bytemode == dq_mode)
3131             oappend (names32[rm + add]);
3132           else
3133             oappend (names16[rm + add]);
3134           used_prefixes |= (prefixes & PREFIX_DATA);
3135           break;
3136         case 0:
3137           break;
3138         default:
3139           oappend (INTERNAL_DISASSEMBLER_ERROR);
3140           break;
3141         }
3142       return;
3143     }
3144
3145   disp = 0;
3146   append_seg ();
3147
3148   if ((sizeflag & AFLAG) || mode_64bit) /* 32 bit address mode */
3149     {
3150       int havesib;
3151       int havebase;
3152       int base;
3153       int index = 0;
3154       int scale = 0;
3155
3156       havesib = 0;
3157       havebase = 1;
3158       base = rm;
3159
3160       if (base == 4)
3161         {
3162           havesib = 1;
3163           FETCH_DATA (the_info, codep + 1);
3164           scale = (*codep >> 6) & 3;
3165           index = (*codep >> 3) & 7;
3166           base = *codep & 7;
3167           USED_REX (REX_EXTY);
3168           USED_REX (REX_EXTZ);
3169           if (rex & REX_EXTY)
3170             index += 8;
3171           if (rex & REX_EXTZ)
3172             base += 8;
3173           codep++;
3174         }
3175
3176       switch (mod)
3177         {
3178         case 0:
3179           if ((base & 7) == 5)
3180             {
3181               havebase = 0;
3182               if (mode_64bit && !havesib && (sizeflag & AFLAG))
3183                 riprel = 1;
3184               disp = get32s ();
3185             }
3186           break;
3187         case 1:
3188           FETCH_DATA (the_info, codep + 1);
3189           disp = *codep++;
3190           if ((disp & 0x80) != 0)
3191             disp -= 0x100;
3192           break;
3193         case 2:
3194           disp = get32s ();
3195           break;
3196         }
3197
3198       if (!intel_syntax)
3199         if (mod != 0 || (base & 7) == 5)
3200           {
3201             print_operand_value (scratchbuf, !riprel, disp);
3202             oappend (scratchbuf);
3203             if (riprel)
3204               {
3205                 set_op (disp, 1);
3206                 oappend ("(%rip)");
3207               }
3208           }
3209
3210       if (havebase || (havesib && (index != 4 || scale != 0)))
3211         {
3212           if (intel_syntax)
3213             {
3214               switch (bytemode)
3215                 {
3216                 case b_mode:
3217                   oappend ("BYTE PTR ");
3218                   break;
3219                 case w_mode:
3220                   oappend ("WORD PTR ");
3221                   break;
3222                 case v_mode:
3223                   oappend ("DWORD PTR ");
3224                   break;
3225                 case d_mode:
3226                   oappend ("QWORD PTR ");
3227                   break;
3228                 case m_mode:
3229                   if (mode_64bit)
3230                     oappend ("DWORD PTR ");
3231                   else
3232                     oappend ("QWORD PTR ");
3233                   break;
3234                 case x_mode:
3235                   oappend ("XWORD PTR ");
3236                   break;
3237                 default:
3238                   break;
3239                 }
3240              }
3241           *obufp++ = open_char;
3242           if (intel_syntax && riprel)
3243             oappend ("rip + ");
3244           *obufp = '\0';
3245           USED_REX (REX_EXTZ);
3246           if (!havesib && (rex & REX_EXTZ))
3247             base += 8;
3248           if (havebase)
3249             oappend (mode_64bit && (sizeflag & AFLAG)
3250                      ? names64[base] : names32[base]);
3251           if (havesib)
3252             {
3253               if (index != 4)
3254                 {
3255                   if (intel_syntax)
3256                     {
3257                       if (havebase)
3258                         {
3259                           *obufp++ = separator_char;
3260                           *obufp = '\0';
3261                         }
3262                       sprintf (scratchbuf, "%s",
3263                                mode_64bit && (sizeflag & AFLAG)
3264                                ? names64[index] : names32[index]);
3265                     }
3266                   else
3267                     sprintf (scratchbuf, ",%s",
3268                              mode_64bit && (sizeflag & AFLAG)
3269                              ? names64[index] : names32[index]);
3270                   oappend (scratchbuf);
3271                 }
3272               if (scale != 0 || (!intel_syntax && index != 4))
3273                 {
3274                   *obufp++ = scale_char;
3275                   *obufp = '\0';
3276                   sprintf (scratchbuf, "%d", 1 << scale);
3277                   oappend (scratchbuf);
3278                 }
3279             }
3280           if (intel_syntax)
3281             if (mod != 0 || (base & 7) == 5)
3282               {
3283                 /* Don't print zero displacements.  */
3284                 if (disp != 0)
3285                   {
3286                     if ((bfd_signed_vma) disp > 0)
3287                       {
3288                         *obufp++ = '+';
3289                         *obufp = '\0';
3290                       }
3291
3292                     print_operand_value (scratchbuf, 0, disp);
3293                     oappend (scratchbuf);
3294                   }
3295               }
3296
3297           *obufp++ = close_char;
3298           *obufp = '\0';
3299         }
3300       else if (intel_syntax)
3301         {
3302           if (mod != 0 || (base & 7) == 5)
3303             {
3304               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
3305                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
3306                 ;
3307               else
3308                 {
3309                   oappend (names_seg[ds_reg - es_reg]);
3310                   oappend (":");
3311                 }
3312               print_operand_value (scratchbuf, 1, disp);
3313               oappend (scratchbuf);
3314             }
3315         }
3316     }
3317   else
3318     { /* 16 bit address mode */
3319       switch (mod)
3320         {
3321         case 0:
3322           if ((rm & 7) == 6)
3323             {
3324               disp = get16 ();
3325               if ((disp & 0x8000) != 0)
3326                 disp -= 0x10000;
3327             }
3328           break;
3329         case 1:
3330           FETCH_DATA (the_info, codep + 1);
3331           disp = *codep++;
3332           if ((disp & 0x80) != 0)
3333             disp -= 0x100;
3334           break;
3335         case 2:
3336           disp = get16 ();
3337           if ((disp & 0x8000) != 0)
3338             disp -= 0x10000;
3339           break;
3340         }
3341
3342       if (!intel_syntax)
3343         if (mod != 0 || (rm & 7) == 6)
3344           {
3345             print_operand_value (scratchbuf, 0, disp);
3346             oappend (scratchbuf);
3347           }
3348
3349       if (mod != 0 || (rm & 7) != 6)
3350         {
3351           *obufp++ = open_char;
3352           *obufp = '\0';
3353           oappend (index16[rm + add]);
3354           *obufp++ = close_char;
3355           *obufp = '\0';
3356         }
3357     }
3358 }
3359
3360 static void
3361 OP_G (int bytemode, int sizeflag)
3362 {
3363   int add = 0;
3364   USED_REX (REX_EXTX);
3365   if (rex & REX_EXTX)
3366     add += 8;
3367   switch (bytemode)
3368     {
3369     case b_mode:
3370       USED_REX (0);
3371       if (rex)
3372         oappend (names8rex[reg + add]);
3373       else
3374         oappend (names8[reg + add]);
3375       break;
3376     case w_mode:
3377       oappend (names16[reg + add]);
3378       break;
3379     case d_mode:
3380       oappend (names32[reg + add]);
3381       break;
3382     case q_mode:
3383       oappend (names64[reg + add]);
3384       break;
3385     case v_mode:
3386       USED_REX (REX_MODE64);
3387       if (rex & REX_MODE64)
3388         oappend (names64[reg + add]);
3389       else if (sizeflag & DFLAG)
3390         oappend (names32[reg + add]);
3391       else
3392         oappend (names16[reg + add]);
3393       used_prefixes |= (prefixes & PREFIX_DATA);
3394       break;
3395     default:
3396       oappend (INTERNAL_DISASSEMBLER_ERROR);
3397       break;
3398     }
3399 }
3400
3401 static bfd_vma
3402 get64 (void)
3403 {
3404   bfd_vma x;
3405 #ifdef BFD64
3406   unsigned int a;
3407   unsigned int b;
3408
3409   FETCH_DATA (the_info, codep + 8);
3410   a = *codep++ & 0xff;
3411   a |= (*codep++ & 0xff) << 8;
3412   a |= (*codep++ & 0xff) << 16;
3413   a |= (*codep++ & 0xff) << 24;
3414   b = *codep++ & 0xff;
3415   b |= (*codep++ & 0xff) << 8;
3416   b |= (*codep++ & 0xff) << 16;
3417   b |= (*codep++ & 0xff) << 24;
3418   x = a + ((bfd_vma) b << 32);
3419 #else
3420   abort ();
3421   x = 0;
3422 #endif
3423   return x;
3424 }
3425
3426 static bfd_signed_vma
3427 get32 (void)
3428 {
3429   bfd_signed_vma x = 0;
3430
3431   FETCH_DATA (the_info, codep + 4);
3432   x = *codep++ & (bfd_signed_vma) 0xff;
3433   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
3434   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
3435   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
3436   return x;
3437 }
3438
3439 static bfd_signed_vma
3440 get32s (void)
3441 {
3442   bfd_signed_vma x = 0;
3443
3444   FETCH_DATA (the_info, codep + 4);
3445   x = *codep++ & (bfd_signed_vma) 0xff;
3446   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
3447   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
3448   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
3449
3450   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
3451
3452   return x;
3453 }
3454
3455 static int
3456 get16 (void)
3457 {
3458   int x = 0;
3459
3460   FETCH_DATA (the_info, codep + 2);
3461   x = *codep++ & 0xff;
3462   x |= (*codep++ & 0xff) << 8;
3463   return x;
3464 }
3465
3466 static void
3467 set_op (bfd_vma op, int riprel)
3468 {
3469   op_index[op_ad] = op_ad;
3470   if (mode_64bit)
3471     {
3472       op_address[op_ad] = op;
3473       op_riprel[op_ad] = riprel;
3474     }
3475   else
3476     {
3477       /* Mask to get a 32-bit address.  */
3478       op_address[op_ad] = op & 0xffffffff;
3479       op_riprel[op_ad] = riprel & 0xffffffff;
3480     }
3481 }
3482
3483 static void
3484 OP_REG (int code, int sizeflag)
3485 {
3486   const char *s;
3487   int add = 0;
3488   USED_REX (REX_EXTZ);
3489   if (rex & REX_EXTZ)
3490     add = 8;
3491
3492   switch (code)
3493     {
3494     case indir_dx_reg:
3495       if (intel_syntax)
3496         s = "[dx]";
3497       else
3498         s = "(%dx)";
3499       break;
3500     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
3501     case sp_reg: case bp_reg: case si_reg: case di_reg:
3502       s = names16[code - ax_reg + add];
3503       break;
3504     case es_reg: case ss_reg: case cs_reg:
3505     case ds_reg: case fs_reg: case gs_reg:
3506       s = names_seg[code - es_reg + add];
3507       break;
3508     case al_reg: case ah_reg: case cl_reg: case ch_reg:
3509     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
3510       USED_REX (0);
3511       if (rex)
3512         s = names8rex[code - al_reg + add];
3513       else
3514         s = names8[code - al_reg];
3515       break;
3516     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
3517     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
3518       if (mode_64bit)
3519         {
3520           s = names64[code - rAX_reg + add];
3521           break;
3522         }
3523       code += eAX_reg - rAX_reg;
3524       /* Fall through.  */
3525     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
3526     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
3527       USED_REX (REX_MODE64);
3528       if (rex & REX_MODE64)
3529         s = names64[code - eAX_reg + add];
3530       else if (sizeflag & DFLAG)
3531         s = names32[code - eAX_reg + add];
3532       else
3533         s = names16[code - eAX_reg + add];
3534       used_prefixes |= (prefixes & PREFIX_DATA);
3535       break;
3536     default:
3537       s = INTERNAL_DISASSEMBLER_ERROR;
3538       break;
3539     }
3540   oappend (s);
3541 }
3542
3543 static void
3544 OP_IMREG (int code, int sizeflag)
3545 {
3546   const char *s;
3547
3548   switch (code)
3549     {
3550     case indir_dx_reg:
3551       if (intel_syntax)
3552         s = "[dx]";
3553       else
3554         s = "(%dx)";
3555       break;
3556     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
3557     case sp_reg: case bp_reg: case si_reg: case di_reg:
3558       s = names16[code - ax_reg];
3559       break;
3560     case es_reg: case ss_reg: case cs_reg:
3561     case ds_reg: case fs_reg: case gs_reg:
3562       s = names_seg[code - es_reg];
3563       break;
3564     case al_reg: case ah_reg: case cl_reg: case ch_reg:
3565     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
3566       USED_REX (0);
3567       if (rex)
3568         s = names8rex[code - al_reg];
3569       else
3570         s = names8[code - al_reg];
3571       break;
3572     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
3573     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
3574       USED_REX (REX_MODE64);
3575       if (rex & REX_MODE64)
3576         s = names64[code - eAX_reg];
3577       else if (sizeflag & DFLAG)
3578         s = names32[code - eAX_reg];
3579       else
3580         s = names16[code - eAX_reg];
3581       used_prefixes |= (prefixes & PREFIX_DATA);
3582       break;
3583     default:
3584       s = INTERNAL_DISASSEMBLER_ERROR;
3585       break;
3586     }
3587   oappend (s);
3588 }
3589
3590 static void
3591 OP_I (int bytemode, int sizeflag)
3592 {
3593   bfd_signed_vma op;
3594   bfd_signed_vma mask = -1;
3595
3596   switch (bytemode)
3597     {
3598     case b_mode:
3599       FETCH_DATA (the_info, codep + 1);
3600       op = *codep++;
3601       mask = 0xff;
3602       break;
3603     case q_mode:
3604       if (mode_64bit)
3605         {
3606           op = get32s ();
3607           break;
3608         }
3609       /* Fall through.  */
3610     case v_mode:
3611       USED_REX (REX_MODE64);
3612       if (rex & REX_MODE64)
3613         op = get32s ();
3614       else if (sizeflag & DFLAG)
3615         {
3616           op = get32 ();
3617           mask = 0xffffffff;
3618         }
3619       else
3620         {
3621           op = get16 ();
3622           mask = 0xfffff;
3623         }
3624       used_prefixes |= (prefixes & PREFIX_DATA);
3625       break;
3626     case w_mode:
3627       mask = 0xfffff;
3628       op = get16 ();
3629       break;
3630     default:
3631       oappend (INTERNAL_DISASSEMBLER_ERROR);
3632       return;
3633     }
3634
3635   op &= mask;
3636   scratchbuf[0] = '$';
3637   print_operand_value (scratchbuf + 1, 1, op);
3638   oappend (scratchbuf + intel_syntax);
3639   scratchbuf[0] = '\0';
3640 }
3641
3642 static void
3643 OP_I64 (int bytemode, int sizeflag)
3644 {
3645   bfd_signed_vma op;
3646   bfd_signed_vma mask = -1;
3647
3648   if (!mode_64bit)
3649     {
3650       OP_I (bytemode, sizeflag);
3651       return;
3652     }
3653
3654   switch (bytemode)
3655     {
3656     case b_mode:
3657       FETCH_DATA (the_info, codep + 1);
3658       op = *codep++;
3659       mask = 0xff;
3660       break;
3661     case v_mode:
3662       USED_REX (REX_MODE64);
3663       if (rex & REX_MODE64)
3664         op = get64 ();
3665       else if (sizeflag & DFLAG)
3666         {
3667           op = get32 ();
3668           mask = 0xffffffff;
3669         }
3670       else
3671         {
3672           op = get16 ();
3673           mask = 0xfffff;
3674         }
3675       used_prefixes |= (prefixes & PREFIX_DATA);
3676       break;
3677     case w_mode:
3678       mask = 0xfffff;
3679       op = get16 ();
3680       break;
3681     default:
3682       oappend (INTERNAL_DISASSEMBLER_ERROR);
3683       return;
3684     }
3685
3686   op &= mask;
3687   scratchbuf[0] = '$';
3688   print_operand_value (scratchbuf + 1, 1, op);
3689   oappend (scratchbuf + intel_syntax);
3690   scratchbuf[0] = '\0';
3691 }
3692
3693 static void
3694 OP_sI (int bytemode, int sizeflag)
3695 {
3696   bfd_signed_vma op;
3697   bfd_signed_vma mask = -1;
3698
3699   switch (bytemode)
3700     {
3701     case b_mode:
3702       FETCH_DATA (the_info, codep + 1);
3703       op = *codep++;
3704       if ((op & 0x80) != 0)
3705         op -= 0x100;
3706       mask = 0xffffffff;
3707       break;
3708     case v_mode:
3709       USED_REX (REX_MODE64);
3710       if (rex & REX_MODE64)
3711         op = get32s ();
3712       else if (sizeflag & DFLAG)
3713         {
3714           op = get32s ();
3715           mask = 0xffffffff;
3716         }
3717       else
3718         {
3719           mask = 0xffffffff;
3720           op = get16 ();
3721           if ((op & 0x8000) != 0)
3722             op -= 0x10000;
3723         }
3724       used_prefixes |= (prefixes & PREFIX_DATA);
3725       break;
3726     case w_mode:
3727       op = get16 ();
3728       mask = 0xffffffff;
3729       if ((op & 0x8000) != 0)
3730         op -= 0x10000;
3731       break;
3732     default:
3733       oappend (INTERNAL_DISASSEMBLER_ERROR);
3734       return;
3735     }
3736
3737   scratchbuf[0] = '$';
3738   print_operand_value (scratchbuf + 1, 1, op);
3739   oappend (scratchbuf + intel_syntax);
3740 }
3741
3742 static void
3743 OP_J (int bytemode, int sizeflag)
3744 {
3745   bfd_vma disp;
3746   bfd_vma mask = -1;
3747
3748   switch (bytemode)
3749     {
3750     case b_mode:
3751       FETCH_DATA (the_info, codep + 1);
3752       disp = *codep++;
3753       if ((disp & 0x80) != 0)
3754         disp -= 0x100;
3755       break;
3756     case v_mode:
3757       if (sizeflag & DFLAG)
3758         disp = get32s ();
3759       else
3760         {
3761           disp = get16 ();
3762           /* For some reason, a data16 prefix on a jump instruction
3763              means that the pc is masked to 16 bits after the
3764              displacement is added!  */
3765           mask = 0xffff;
3766         }
3767       break;
3768     default:
3769       oappend (INTERNAL_DISASSEMBLER_ERROR);
3770       return;
3771     }
3772   disp = (start_pc + codep - start_codep + disp) & mask;
3773   set_op (disp, 0);
3774   print_operand_value (scratchbuf, 1, disp);
3775   oappend (scratchbuf);
3776 }
3777
3778 static void
3779 OP_SEG (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
3780 {
3781   oappend (names_seg[reg]);
3782 }
3783
3784 static void
3785 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
3786 {
3787   int seg, offset;
3788
3789   if (sizeflag & DFLAG)
3790     {
3791       offset = get32 ();
3792       seg = get16 ();
3793     }
3794   else
3795     {
3796       offset = get16 ();
3797       seg = get16 ();
3798     }
3799   used_prefixes |= (prefixes & PREFIX_DATA);
3800   if (intel_syntax)
3801     sprintf (scratchbuf, "0x%x,0x%x", seg, offset);
3802   else
3803     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
3804   oappend (scratchbuf);
3805 }
3806
3807 static void
3808 OP_OFF (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
3809 {
3810   bfd_vma off;
3811
3812   append_seg ();
3813
3814   if ((sizeflag & AFLAG) || mode_64bit)
3815     off = get32 ();
3816   else
3817     off = get16 ();
3818
3819   if (intel_syntax)
3820     {
3821       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
3822                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
3823         {
3824           oappend (names_seg[ds_reg - es_reg]);
3825           oappend (":");
3826         }
3827     }
3828   print_operand_value (scratchbuf, 1, off);
3829   oappend (scratchbuf);
3830 }
3831
3832 static void
3833 OP_OFF64 (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
3834 {
3835   bfd_vma off;
3836
3837   if (!mode_64bit)
3838     {
3839       OP_OFF (bytemode, sizeflag);
3840       return;
3841     }
3842
3843   append_seg ();
3844
3845   off = get64 ();
3846
3847   if (intel_syntax)
3848     {
3849       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
3850                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
3851         {
3852           oappend (names_seg[ds_reg - es_reg]);
3853           oappend (":");
3854         }
3855     }
3856   print_operand_value (scratchbuf, 1, off);
3857   oappend (scratchbuf);
3858 }
3859
3860 static void
3861 ptr_reg (int code, int sizeflag)
3862 {
3863   const char *s;
3864   if (intel_syntax)
3865     oappend ("[");
3866   else
3867     oappend ("(");
3868
3869   USED_REX (REX_MODE64);
3870   if (rex & REX_MODE64)
3871     {
3872       if (!(sizeflag & AFLAG))
3873         s = names32[code - eAX_reg];
3874       else
3875         s = names64[code - eAX_reg];
3876     }
3877   else if (sizeflag & AFLAG)
3878     s = names32[code - eAX_reg];
3879   else
3880     s = names16[code - eAX_reg];
3881   oappend (s);
3882   if (intel_syntax)
3883     oappend ("]");
3884   else
3885     oappend (")");
3886 }
3887
3888 static void
3889 OP_ESreg (int code, int sizeflag)
3890 {
3891   oappend ("%es:" + intel_syntax);
3892   ptr_reg (code, sizeflag);
3893 }
3894
3895 static void
3896 OP_DSreg (int code, int sizeflag)
3897 {
3898   if ((prefixes
3899        & (PREFIX_CS
3900           | PREFIX_DS
3901           | PREFIX_SS
3902           | PREFIX_ES
3903           | PREFIX_FS
3904           | PREFIX_GS)) == 0)
3905     prefixes |= PREFIX_DS;
3906   append_seg ();
3907   ptr_reg (code, sizeflag);
3908 }
3909
3910 static void
3911 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
3912 {
3913   int add = 0;
3914   USED_REX (REX_EXTX);
3915   if (rex & REX_EXTX)
3916     add = 8;
3917   sprintf (scratchbuf, "%%cr%d", reg + add);
3918   oappend (scratchbuf + intel_syntax);
3919 }
3920
3921 static void
3922 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
3923 {
3924   int add = 0;
3925   USED_REX (REX_EXTX);
3926   if (rex & REX_EXTX)
3927     add = 8;
3928   if (intel_syntax)
3929     sprintf (scratchbuf, "db%d", reg + add);
3930   else
3931     sprintf (scratchbuf, "%%db%d", reg + add);
3932   oappend (scratchbuf);
3933 }
3934
3935 static void
3936 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
3937 {
3938   sprintf (scratchbuf, "%%tr%d", reg);
3939   oappend (scratchbuf + intel_syntax);
3940 }
3941
3942 static void
3943 OP_Rd (int bytemode, int sizeflag)
3944 {
3945   if (mod == 3)
3946     OP_E (bytemode, sizeflag);
3947   else
3948     BadOp ();
3949 }
3950
3951 static void
3952 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
3953 {
3954   int add = 0;
3955   USED_REX (REX_EXTX);
3956   if (rex & REX_EXTX)
3957     add = 8;
3958   used_prefixes |= (prefixes & PREFIX_DATA);
3959   if (prefixes & PREFIX_DATA)
3960     sprintf (scratchbuf, "%%xmm%d", reg + add);
3961   else
3962     sprintf (scratchbuf, "%%mm%d", reg + add);
3963   oappend (scratchbuf + intel_syntax);
3964 }
3965
3966 static void
3967 OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
3968 {
3969   int add = 0;
3970   USED_REX (REX_EXTX);
3971   if (rex & REX_EXTX)
3972     add = 8;
3973   sprintf (scratchbuf, "%%xmm%d", reg + add);
3974   oappend (scratchbuf + intel_syntax);
3975 }
3976
3977 static void
3978 OP_EM (int bytemode, int sizeflag)
3979 {
3980   int add = 0;
3981   if (mod != 3)
3982     {
3983       OP_E (bytemode, sizeflag);
3984       return;
3985     }
3986   USED_REX (REX_EXTZ);
3987   if (rex & REX_EXTZ)
3988     add = 8;
3989
3990   /* Skip mod/rm byte.  */
3991   MODRM_CHECK;
3992   codep++;
3993   used_prefixes |= (prefixes & PREFIX_DATA);
3994   if (prefixes & PREFIX_DATA)
3995     sprintf (scratchbuf, "%%xmm%d", rm + add);
3996   else
3997     sprintf (scratchbuf, "%%mm%d", rm + add);
3998   oappend (scratchbuf + intel_syntax);
3999 }
4000
4001 static void
4002 OP_EX (int bytemode, int sizeflag)
4003 {
4004   int add = 0;
4005   if (mod != 3)
4006     {
4007       OP_E (bytemode, sizeflag);
4008       return;
4009     }
4010   USED_REX (REX_EXTZ);
4011   if (rex & REX_EXTZ)
4012     add = 8;
4013
4014   /* Skip mod/rm byte.  */
4015   MODRM_CHECK;
4016   codep++;
4017   sprintf (scratchbuf, "%%xmm%d", rm + add);
4018   oappend (scratchbuf + intel_syntax);
4019 }
4020
4021 static void
4022 OP_MS (int bytemode, int sizeflag)
4023 {
4024   if (mod == 3)
4025     OP_EM (bytemode, sizeflag);
4026   else
4027     BadOp ();
4028 }
4029
4030 static void
4031 OP_XS (int bytemode, int sizeflag)
4032 {
4033   if (mod == 3)
4034     OP_EX (bytemode, sizeflag);
4035   else
4036     BadOp ();
4037 }
4038
4039 static void
4040 OP_M (int bytemode, int sizeflag)
4041 {
4042   if (mod == 3)
4043     BadOp ();   /* bad lea,lds,les,lfs,lgs,lss modrm */
4044   else
4045     OP_E (bytemode, sizeflag);
4046 }
4047
4048 static void
4049 OP_0f07 (int bytemode, int sizeflag)
4050 {
4051   if (mod != 3 || rm != 0)
4052     BadOp ();
4053   else
4054     OP_E (bytemode, sizeflag);
4055 }
4056
4057 static void
4058 OP_0fae (int bytemode, int sizeflag)
4059 {
4060   if (mod == 3)
4061     {
4062       if (reg == 7)
4063         strcpy (obuf + strlen (obuf) - sizeof ("clflush") + 1, "sfence");
4064
4065       if (reg < 5 || rm != 0)
4066         {
4067           BadOp ();     /* bad sfence, mfence, or lfence */
4068           return;
4069         }
4070     }
4071   else if (reg != 7)
4072     {
4073       BadOp ();         /* bad clflush */
4074       return;
4075     }
4076
4077   OP_E (bytemode, sizeflag);
4078 }
4079
4080 static void
4081 NOP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
4082 {
4083   /* NOP with REPZ prefix is called PAUSE.  */
4084   if (prefixes == PREFIX_REPZ)
4085     strcpy (obuf, "pause");
4086 }
4087
4088 static const char *const Suffix3DNow[] = {
4089 /* 00 */        NULL,           NULL,           NULL,           NULL,
4090 /* 04 */        NULL,           NULL,           NULL,           NULL,
4091 /* 08 */        NULL,           NULL,           NULL,           NULL,
4092 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
4093 /* 10 */        NULL,           NULL,           NULL,           NULL,
4094 /* 14 */        NULL,           NULL,           NULL,           NULL,
4095 /* 18 */        NULL,           NULL,           NULL,           NULL,
4096 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
4097 /* 20 */        NULL,           NULL,           NULL,           NULL,
4098 /* 24 */        NULL,           NULL,           NULL,           NULL,
4099 /* 28 */        NULL,           NULL,           NULL,           NULL,
4100 /* 2C */        NULL,           NULL,           NULL,           NULL,
4101 /* 30 */        NULL,           NULL,           NULL,           NULL,
4102 /* 34 */        NULL,           NULL,           NULL,           NULL,
4103 /* 38 */        NULL,           NULL,           NULL,           NULL,
4104 /* 3C */        NULL,           NULL,           NULL,           NULL,
4105 /* 40 */        NULL,           NULL,           NULL,           NULL,
4106 /* 44 */        NULL,           NULL,           NULL,           NULL,
4107 /* 48 */        NULL,           NULL,           NULL,           NULL,
4108 /* 4C */        NULL,           NULL,           NULL,           NULL,
4109 /* 50 */        NULL,           NULL,           NULL,           NULL,
4110 /* 54 */        NULL,           NULL,           NULL,           NULL,
4111 /* 58 */        NULL,           NULL,           NULL,           NULL,
4112 /* 5C */        NULL,           NULL,           NULL,           NULL,
4113 /* 60 */        NULL,           NULL,           NULL,           NULL,
4114 /* 64 */        NULL,           NULL,           NULL,           NULL,
4115 /* 68 */        NULL,           NULL,           NULL,           NULL,
4116 /* 6C */        NULL,           NULL,           NULL,           NULL,
4117 /* 70 */        NULL,           NULL,           NULL,           NULL,
4118 /* 74 */        NULL,           NULL,           NULL,           NULL,
4119 /* 78 */        NULL,           NULL,           NULL,           NULL,
4120 /* 7C */        NULL,           NULL,           NULL,           NULL,
4121 /* 80 */        NULL,           NULL,           NULL,           NULL,
4122 /* 84 */        NULL,           NULL,           NULL,           NULL,
4123 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
4124 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
4125 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
4126 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
4127 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
4128 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
4129 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
4130 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
4131 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
4132 /* AC */        NULL,           NULL,           "pfacc",        NULL,
4133 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
4134 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pfmulhrw",
4135 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
4136 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
4137 /* C0 */        NULL,           NULL,           NULL,           NULL,
4138 /* C4 */        NULL,           NULL,           NULL,           NULL,
4139 /* C8 */        NULL,           NULL,           NULL,           NULL,
4140 /* CC */        NULL,           NULL,           NULL,           NULL,
4141 /* D0 */        NULL,           NULL,           NULL,           NULL,
4142 /* D4 */        NULL,           NULL,           NULL,           NULL,
4143 /* D8 */        NULL,           NULL,           NULL,           NULL,
4144 /* DC */        NULL,           NULL,           NULL,           NULL,
4145 /* E0 */        NULL,           NULL,           NULL,           NULL,
4146 /* E4 */        NULL,           NULL,           NULL,           NULL,
4147 /* E8 */        NULL,           NULL,           NULL,           NULL,
4148 /* EC */        NULL,           NULL,           NULL,           NULL,
4149 /* F0 */        NULL,           NULL,           NULL,           NULL,
4150 /* F4 */        NULL,           NULL,           NULL,           NULL,
4151 /* F8 */        NULL,           NULL,           NULL,           NULL,
4152 /* FC */        NULL,           NULL,           NULL,           NULL,
4153 };
4154
4155 static void
4156 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
4157 {
4158   const char *mnemonic;
4159
4160   FETCH_DATA (the_info, codep + 1);
4161   /* AMD 3DNow! instructions are specified by an opcode suffix in the
4162      place where an 8-bit immediate would normally go.  ie. the last
4163      byte of the instruction.  */
4164   obufp = obuf + strlen (obuf);
4165   mnemonic = Suffix3DNow[*codep++ & 0xff];
4166   if (mnemonic)
4167     oappend (mnemonic);
4168   else
4169     {
4170       /* Since a variable sized modrm/sib chunk is between the start
4171          of the opcode (0x0f0f) and the opcode suffix, we need to do
4172          all the modrm processing first, and don't know until now that
4173          we have a bad opcode.  This necessitates some cleaning up.  */
4174       op1out[0] = '\0';
4175       op2out[0] = '\0';
4176       BadOp ();
4177     }
4178 }
4179
4180 static const char *simd_cmp_op[] = {
4181   "eq",
4182   "lt",
4183   "le",
4184   "unord",
4185   "neq",
4186   "nlt",
4187   "nle",
4188   "ord"
4189 };
4190
4191 static void
4192 OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
4193 {
4194   unsigned int cmp_type;
4195
4196   FETCH_DATA (the_info, codep + 1);
4197   obufp = obuf + strlen (obuf);
4198   cmp_type = *codep++ & 0xff;
4199   if (cmp_type < 8)
4200     {
4201       char suffix1 = 'p', suffix2 = 's';
4202       used_prefixes |= (prefixes & PREFIX_REPZ);
4203       if (prefixes & PREFIX_REPZ)
4204         suffix1 = 's';
4205       else
4206         {
4207           used_prefixes |= (prefixes & PREFIX_DATA);
4208           if (prefixes & PREFIX_DATA)
4209             suffix2 = 'd';
4210           else
4211             {
4212               used_prefixes |= (prefixes & PREFIX_REPNZ);
4213               if (prefixes & PREFIX_REPNZ)
4214                 suffix1 = 's', suffix2 = 'd';
4215             }
4216         }
4217       sprintf (scratchbuf, "cmp%s%c%c",
4218                simd_cmp_op[cmp_type], suffix1, suffix2);
4219       used_prefixes |= (prefixes & PREFIX_REPZ);
4220       oappend (scratchbuf);
4221     }
4222   else
4223     {
4224       /* We have a bad extension byte.  Clean up.  */
4225       op1out[0] = '\0';
4226       op2out[0] = '\0';
4227       BadOp ();
4228     }
4229 }
4230
4231 static void
4232 SIMD_Fixup (int extrachar, int sizeflag ATTRIBUTE_UNUSED)
4233 {
4234   /* Change movlps/movhps to movhlps/movlhps for 2 register operand
4235      forms of these instructions.  */
4236   if (mod == 3)
4237     {
4238       char *p = obuf + strlen (obuf);
4239       *(p + 1) = '\0';
4240       *p       = *(p - 1);
4241       *(p - 1) = *(p - 2);
4242       *(p - 2) = *(p - 3);
4243       *(p - 3) = extrachar;
4244     }
4245 }
4246
4247 static void
4248 PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
4249 {
4250   if (mod == 3 && reg == 1)
4251     {
4252       char *p = obuf + strlen (obuf);
4253
4254       /* Override "sidt".  */
4255       if (rm)
4256         {
4257           /* mwait %eax,%ecx  */
4258           strcpy (p - 4, "mwait   %eax,%ecx");
4259         }
4260       else
4261         {
4262           /* monitor %eax,%ecx,%edx"  */
4263           strcpy (p - 4, "monitor %eax,%ecx,%edx");
4264         }
4265
4266       codep++;
4267     }
4268   else
4269     OP_E (0, sizeflag);
4270 }
4271
4272 static void
4273 INVLPG_Fixup (int bytemode, int sizeflag)
4274 {
4275   if (*codep == 0xf8)
4276     {
4277       char *p = obuf + strlen (obuf);
4278
4279       /* Override "invlpg".  */
4280       strcpy (p - 6, "swapgs");
4281       codep++;
4282     }
4283   else
4284     OP_E (bytemode, sizeflag);
4285 }
4286
4287 static void
4288 BadOp (void)
4289 {
4290   /* Throw away prefixes and 1st. opcode byte.  */
4291   codep = insn_codep + 1;
4292   oappend ("(bad)");
4293 }