2007-11-07 Markus Deuling <deuling@de.ibm.com>
[platform/upstream/binutils.git] / 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, 2005, 2006, 2007 Free Software Foundation, Inc.
4
5    This file is part of the GNU opcodes library.
6
7    This library 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 3, or (at your option)
10    any later version.
11
12    It is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    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., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22
23 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24    July 1988
25     modified by John Hassey (hassey@dg-rtp.dg.com)
26     x86-64 support added by Jan Hubicka (jh@suse.cz)
27     VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
28
29 /* The main tables describing the instructions is essentially a copy
30    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
31    Programmers Manual.  Usually, there is a capital letter, followed
32    by a small letter.  The capital letter tell the addressing mode,
33    and the small letter tells about the operand size.  Refer to
34    the Intel manual for details.  */
35
36 #include "sysdep.h"
37 #include "dis-asm.h"
38 #include "opintl.h"
39 #include "opcode/i386.h"
40 #include "libiberty.h"
41
42 #include <setjmp.h>
43
44 static int fetch_data (struct disassemble_info *, bfd_byte *);
45 static void ckprefix (void);
46 static const char *prefix_name (int, int);
47 static int print_insn (bfd_vma, disassemble_info *);
48 static void dofloat (int);
49 static void OP_ST (int, int);
50 static void OP_STi (int, int);
51 static int putop (const char *, int);
52 static void oappend (const char *);
53 static void append_seg (void);
54 static void OP_indirE (int, int);
55 static void print_operand_value (char *, int, bfd_vma);
56 static void OP_E_extended (int, int, int);
57 static void print_displacement (char *, bfd_vma);
58 static void OP_E (int, int);
59 static void OP_G (int, int);
60 static bfd_vma get64 (void);
61 static bfd_signed_vma get32 (void);
62 static bfd_signed_vma get32s (void);
63 static int get16 (void);
64 static void set_op (bfd_vma, int);
65 static void OP_Skip_MODRM (int, int);
66 static void OP_REG (int, int);
67 static void OP_IMREG (int, int);
68 static void OP_I (int, int);
69 static void OP_I64 (int, int);
70 static void OP_sI (int, int);
71 static void OP_J (int, int);
72 static void OP_SEG (int, int);
73 static void OP_DIR (int, int);
74 static void OP_OFF (int, int);
75 static void OP_OFF64 (int, int);
76 static void ptr_reg (int, int);
77 static void OP_ESreg (int, int);
78 static void OP_DSreg (int, int);
79 static void OP_C (int, int);
80 static void OP_D (int, int);
81 static void OP_T (int, int);
82 static void OP_R (int, int);
83 static void OP_MMX (int, int);
84 static void OP_XMM (int, int);
85 static void OP_EM (int, int);
86 static void OP_EX (int, int);
87 static void OP_EMC (int,int);
88 static void OP_MXC (int,int);
89 static void OP_MS (int, int);
90 static void OP_XS (int, int);
91 static void OP_M (int, int);
92 static void OP_0f07 (int, int);
93 static void OP_Monitor (int, int);
94 static void OP_Mwait (int, int);
95 static void NOP_Fixup1 (int, int);
96 static void NOP_Fixup2 (int, int);
97 static void OP_3DNowSuffix (int, int);
98 static void CMP_Fixup (int, int);
99 static void BadOp (void);
100 static void REP_Fixup (int, int);
101 static void CMPXCHG8B_Fixup (int, int);
102 static void XMM_Fixup (int, int);
103 static void CRC32_Fixup (int, int);
104 static void print_drex_arg (unsigned int, int, int);
105 static void OP_DREX4 (int, int);
106 static void OP_DREX3 (int, int);
107 static void OP_DREX_ICMP (int, int);
108 static void OP_DREX_FCMP (int, int);
109
110 struct dis_private {
111   /* Points to first byte not fetched.  */
112   bfd_byte *max_fetched;
113   bfd_byte the_buffer[MAX_MNEM_SIZE];
114   bfd_vma insn_start;
115   int orig_sizeflag;
116   jmp_buf bailout;
117 };
118
119 enum address_mode
120 {
121   mode_16bit,
122   mode_32bit,
123   mode_64bit
124 };
125
126 enum address_mode address_mode;
127
128 /* Flags for the prefixes for the current instruction.  See below.  */
129 static int prefixes;
130
131 /* REX prefix the current instruction.  See below.  */
132 static int rex;
133 /* Bits of REX we've already used.  */
134 static int rex_used;
135 /* Mark parts used in the REX prefix.  When we are testing for
136    empty prefix (for 8bit register REX extension), just mask it
137    out.  Otherwise test for REX bit is excuse for existence of REX
138    only in case value is nonzero.  */
139 #define USED_REX(value)                                 \
140   {                                                     \
141     if (value)                                          \
142       {                                                 \
143         if ((rex & value))                              \
144           rex_used |= (value) | REX_OPCODE;             \
145       }                                                 \
146     else                                                \
147       rex_used |= REX_OPCODE;                           \
148   }
149
150 /* Special 'registers' for DREX handling */
151 #define DREX_REG_UNKNOWN        1000    /* not initialized */
152 #define DREX_REG_MEMORY         1001    /* use MODRM/SIB/OFFSET memory */
153
154 /* The DREX byte has the following fields:
155    Bits 7-4 -- DREX.Dest, xmm destination register
156    Bit 3    -- DREX.OC0, operand config bit defines operand order
157    Bit 2    -- DREX.R, equivalent to REX_R bit, to extend ModRM register
158    Bit 1    -- DREX.X, equivalent to REX_X bit, to extend SIB index field
159    Bit 0    -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
160                SIB base field, or opcode reg field.  */
161 #define DREX_XMM(drex) ((drex >> 4) & 0xf)
162 #define DREX_OC0(drex) ((drex >> 3) & 0x1)
163
164 /* Flags for prefixes which we somehow handled when printing the
165    current instruction.  */
166 static int used_prefixes;
167
168 /* Flags stored in PREFIXES.  */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
172 #define PREFIX_CS 8
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
181
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
184    on error.  */
185 #define FETCH_DATA(info, addr) \
186   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187    ? 1 : fetch_data ((info), (addr)))
188
189 static int
190 fetch_data (struct disassemble_info *info, bfd_byte *addr)
191 {
192   int status;
193   struct dis_private *priv = (struct dis_private *) info->private_data;
194   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
195
196   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
197     status = (*info->read_memory_func) (start,
198                                         priv->max_fetched,
199                                         addr - priv->max_fetched,
200                                         info);
201   else
202     status = -1;
203   if (status != 0)
204     {
205       /* If we did manage to read at least one byte, then
206          print_insn_i386 will do something sensible.  Otherwise, print
207          an error.  We do that here because this is where we know
208          STATUS.  */
209       if (priv->max_fetched == priv->the_buffer)
210         (*info->memory_error_func) (status, start, info);
211       longjmp (priv->bailout, 1);
212     }
213   else
214     priv->max_fetched = addr;
215   return 1;
216 }
217
218 #define XX { NULL, 0 }
219
220 #define Eb { OP_E, b_mode }
221 #define Ev { OP_E, v_mode }
222 #define Ed { OP_E, d_mode }
223 #define Edq { OP_E, dq_mode }
224 #define Edqw { OP_E, dqw_mode }
225 #define Edqb { OP_E, dqb_mode }
226 #define Edqd { OP_E, dqd_mode }
227 #define Eq { OP_E, q_mode }
228 #define indirEv { OP_indirE, stack_v_mode }
229 #define indirEp { OP_indirE, f_mode }
230 #define stackEv { OP_E, stack_v_mode }
231 #define Em { OP_E, m_mode }
232 #define Ew { OP_E, w_mode }
233 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
234 #define Ma { OP_M, v_mode }
235 #define Mb { OP_M, b_mode }
236 #define Md { OP_M, d_mode }
237 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
238 #define Mq { OP_M, q_mode }
239 #define Gb { OP_G, b_mode }
240 #define Gv { OP_G, v_mode }
241 #define Gd { OP_G, d_mode }
242 #define Gdq { OP_G, dq_mode }
243 #define Gm { OP_G, m_mode }
244 #define Gw { OP_G, w_mode }
245 #define Rd { OP_R, d_mode }
246 #define Rm { OP_R, m_mode }
247 #define Ib { OP_I, b_mode }
248 #define sIb { OP_sI, b_mode }   /* sign extened byte */
249 #define Iv { OP_I, v_mode }
250 #define Iq { OP_I, q_mode }
251 #define Iv64 { OP_I64, v_mode }
252 #define Iw { OP_I, w_mode }
253 #define I1 { OP_I, const_1_mode }
254 #define Jb { OP_J, b_mode }
255 #define Jv { OP_J, v_mode }
256 #define Cm { OP_C, m_mode }
257 #define Dm { OP_D, m_mode }
258 #define Td { OP_T, d_mode }
259 #define Skip_MODRM { OP_Skip_MODRM, 0 }
260
261 #define RMeAX { OP_REG, eAX_reg }
262 #define RMeBX { OP_REG, eBX_reg }
263 #define RMeCX { OP_REG, eCX_reg }
264 #define RMeDX { OP_REG, eDX_reg }
265 #define RMeSP { OP_REG, eSP_reg }
266 #define RMeBP { OP_REG, eBP_reg }
267 #define RMeSI { OP_REG, eSI_reg }
268 #define RMeDI { OP_REG, eDI_reg }
269 #define RMrAX { OP_REG, rAX_reg }
270 #define RMrBX { OP_REG, rBX_reg }
271 #define RMrCX { OP_REG, rCX_reg }
272 #define RMrDX { OP_REG, rDX_reg }
273 #define RMrSP { OP_REG, rSP_reg }
274 #define RMrBP { OP_REG, rBP_reg }
275 #define RMrSI { OP_REG, rSI_reg }
276 #define RMrDI { OP_REG, rDI_reg }
277 #define RMAL { OP_REG, al_reg }
278 #define RMAL { OP_REG, al_reg }
279 #define RMCL { OP_REG, cl_reg }
280 #define RMDL { OP_REG, dl_reg }
281 #define RMBL { OP_REG, bl_reg }
282 #define RMAH { OP_REG, ah_reg }
283 #define RMCH { OP_REG, ch_reg }
284 #define RMDH { OP_REG, dh_reg }
285 #define RMBH { OP_REG, bh_reg }
286 #define RMAX { OP_REG, ax_reg }
287 #define RMDX { OP_REG, dx_reg }
288
289 #define eAX { OP_IMREG, eAX_reg }
290 #define eBX { OP_IMREG, eBX_reg }
291 #define eCX { OP_IMREG, eCX_reg }
292 #define eDX { OP_IMREG, eDX_reg }
293 #define eSP { OP_IMREG, eSP_reg }
294 #define eBP { OP_IMREG, eBP_reg }
295 #define eSI { OP_IMREG, eSI_reg }
296 #define eDI { OP_IMREG, eDI_reg }
297 #define AL { OP_IMREG, al_reg }
298 #define CL { OP_IMREG, cl_reg }
299 #define DL { OP_IMREG, dl_reg }
300 #define BL { OP_IMREG, bl_reg }
301 #define AH { OP_IMREG, ah_reg }
302 #define CH { OP_IMREG, ch_reg }
303 #define DH { OP_IMREG, dh_reg }
304 #define BH { OP_IMREG, bh_reg }
305 #define AX { OP_IMREG, ax_reg }
306 #define DX { OP_IMREG, dx_reg }
307 #define zAX { OP_IMREG, z_mode_ax_reg }
308 #define indirDX { OP_IMREG, indir_dx_reg }
309
310 #define Sw { OP_SEG, w_mode }
311 #define Sv { OP_SEG, v_mode }
312 #define Ap { OP_DIR, 0 }
313 #define Ob { OP_OFF64, b_mode }
314 #define Ov { OP_OFF64, v_mode }
315 #define Xb { OP_DSreg, eSI_reg }
316 #define Xv { OP_DSreg, eSI_reg }
317 #define Xz { OP_DSreg, eSI_reg }
318 #define Yb { OP_ESreg, eDI_reg }
319 #define Yv { OP_ESreg, eDI_reg }
320 #define DSBX { OP_DSreg, eBX_reg }
321
322 #define es { OP_REG, es_reg }
323 #define ss { OP_REG, ss_reg }
324 #define cs { OP_REG, cs_reg }
325 #define ds { OP_REG, ds_reg }
326 #define fs { OP_REG, fs_reg }
327 #define gs { OP_REG, gs_reg }
328
329 #define MX { OP_MMX, 0 }
330 #define XM { OP_XMM, 0 }
331 #define EM { OP_EM, v_mode }
332 #define EMd { OP_EM, d_mode }
333 #define EMx { OP_EM, x_mode }
334 #define EXw { OP_EX, w_mode }
335 #define EXd { OP_EX, d_mode }
336 #define EXq { OP_EX, q_mode }
337 #define EXx { OP_EX, x_mode }
338 #define MS { OP_MS, v_mode }
339 #define XS { OP_XS, v_mode }
340 #define EMCq { OP_EMC, q_mode }
341 #define MXC { OP_MXC, 0 }
342 #define OPSUF { OP_3DNowSuffix, 0 }
343 #define CMP { CMP_Fixup, 0 }
344 #define XMM0 { XMM_Fixup, 0 }
345
346 /* Used handle "rep" prefix for string instructions.  */
347 #define Xbr { REP_Fixup, eSI_reg }
348 #define Xvr { REP_Fixup, eSI_reg }
349 #define Ybr { REP_Fixup, eDI_reg }
350 #define Yvr { REP_Fixup, eDI_reg }
351 #define Yzr { REP_Fixup, eDI_reg }
352 #define indirDXr { REP_Fixup, indir_dx_reg }
353 #define ALr { REP_Fixup, al_reg }
354 #define eAXr { REP_Fixup, eAX_reg }
355
356 #define cond_jump_flag { NULL, cond_jump_mode }
357 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
358
359 /* bits in sizeflag */
360 #define SUFFIX_ALWAYS 4
361 #define AFLAG 2
362 #define DFLAG 1
363
364 /* byte operand */
365 #define b_mode                  1
366 /* operand size depends on prefixes */
367 #define v_mode                  (b_mode + 1)
368 /* word operand */
369 #define w_mode                  (v_mode + 1)
370 /* double word operand  */
371 #define d_mode                  (w_mode + 1)
372 /* quad word operand */
373 #define q_mode                  (d_mode + 1)
374 /* ten-byte operand */
375 #define t_mode                  (q_mode + 1)
376 /* 16-byte XMM operand */
377 #define x_mode                  (t_mode + 1)
378 /* d_mode in 32bit, q_mode in 64bit mode.  */
379 #define m_mode                  (x_mode + 1)
380 #define cond_jump_mode          (m_mode + 1)
381 #define loop_jcxz_mode          (cond_jump_mode + 1)
382 /* operand size depends on REX prefixes.  */
383 #define dq_mode                 (loop_jcxz_mode + 1)
384 /* registers like dq_mode, memory like w_mode.  */
385 #define dqw_mode                (dq_mode + 1)
386 /* 4- or 6-byte pointer operand */
387 #define f_mode                  (dqw_mode + 1)
388 #define const_1_mode            (f_mode + 1)
389 /* v_mode for stack-related opcodes.  */
390 #define stack_v_mode            (const_1_mode + 1)
391 /* non-quad operand size depends on prefixes */
392 #define z_mode                  (stack_v_mode + 1)
393 /* 16-byte operand */
394 #define o_mode                  (z_mode + 1)
395 /* registers like dq_mode, memory like b_mode.  */
396 #define dqb_mode                (o_mode + 1)
397 /* registers like dq_mode, memory like d_mode.  */
398 #define dqd_mode                (dqb_mode + 1)
399
400 #define es_reg                  (dqd_mode + 1)
401 #define cs_reg                  (es_reg + 1)
402 #define ss_reg                  (cs_reg + 1)
403 #define ds_reg                  (ss_reg + 1)
404 #define fs_reg                  (ds_reg + 1)
405 #define gs_reg                  (fs_reg + 1)
406
407 #define eAX_reg                 (gs_reg + 1)
408 #define eCX_reg                 (eAX_reg + 1)
409 #define eDX_reg                 (eCX_reg + 1)
410 #define eBX_reg                 (eDX_reg + 1)
411 #define eSP_reg                 (eBX_reg + 1)
412 #define eBP_reg                 (eSP_reg + 1)
413 #define eSI_reg                 (eBP_reg + 1)
414 #define eDI_reg                 (eSI_reg + 1)
415
416 #define al_reg                  (eDI_reg + 1)
417 #define cl_reg                  (al_reg + 1)
418 #define dl_reg                  (cl_reg + 1)
419 #define bl_reg                  (dl_reg + 1)
420 #define ah_reg                  (bl_reg + 1)
421 #define ch_reg                  (ah_reg + 1)
422 #define dh_reg                  (ch_reg + 1)
423 #define bh_reg                  (dh_reg + 1)
424
425 #define ax_reg                  (bh_reg + 1)
426 #define cx_reg                  (ax_reg + 1)
427 #define dx_reg                  (cx_reg + 1)
428 #define bx_reg                  (dx_reg + 1)
429 #define sp_reg                  (bx_reg + 1)
430 #define bp_reg                  (sp_reg + 1)
431 #define si_reg                  (bp_reg + 1)
432 #define di_reg                  (si_reg + 1)
433
434 #define rAX_reg                 (di_reg + 1)
435 #define rCX_reg                 (rAX_reg + 1)
436 #define rDX_reg                 (rCX_reg + 1)
437 #define rBX_reg                 (rDX_reg + 1)
438 #define rSP_reg                 (rBX_reg + 1)
439 #define rBP_reg                 (rSP_reg + 1)
440 #define rSI_reg                 (rBP_reg + 1)
441 #define rDI_reg                 (rSI_reg + 1)
442
443 #define z_mode_ax_reg           (rDI_reg + 1)
444 #define indir_dx_reg            (z_mode_ax_reg + 1)
445
446 #define MAX_BYTEMODE    indir_dx_reg
447
448 /* Flags that are OR'ed into the bytemode field to pass extra
449    information.  */
450 #define DREX_OC1                0x10000 /* OC1 bit set */
451 #define DREX_NO_OC0             0x20000 /* OC0 bit not used */
452 #define DREX_MASK               0x40000 /* mask to delete */
453
454 #if MAX_BYTEMODE >= DREX_OC1
455 #error MAX_BYTEMODE must be less than DREX_OC1
456 #endif
457
458 #define FLOATCODE               1
459 #define USE_REG_TABLE           (FLOATCODE + 1)
460 #define USE_MOD_TABLE           (USE_REG_TABLE + 1)
461 #define USE_RM_TABLE            (USE_MOD_TABLE + 1)
462 #define USE_PREFIX_TABLE        (USE_RM_TABLE + 1)
463 #define USE_X86_64_TABLE        (USE_PREFIX_TABLE + 1)
464 #define USE_3BYTE_TABLE         (USE_X86_64_TABLE + 1)
465
466 #define FLOAT                   NULL, { { NULL, FLOATCODE } }
467
468 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
469 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
470 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
471 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
472 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
473 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
474 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
475
476 #define REG_80                  0
477 #define REG_81                  (REG_80 + 1)
478 #define REG_82                  (REG_81 + 1)
479 #define REG_8F                  (REG_82 + 1)
480 #define REG_C0                  (REG_8F + 1)
481 #define REG_C1                  (REG_C0 + 1)
482 #define REG_C6                  (REG_C1 + 1)
483 #define REG_C7                  (REG_C6 + 1)
484 #define REG_D0                  (REG_C7 + 1)
485 #define REG_D1                  (REG_D0 + 1)
486 #define REG_D2                  (REG_D1 + 1)
487 #define REG_D3                  (REG_D2 + 1)
488 #define REG_F6                  (REG_D3 + 1)
489 #define REG_F7                  (REG_F6 + 1)
490 #define REG_FE                  (REG_F7 + 1)
491 #define REG_FF                  (REG_FE + 1)
492 #define REG_0F00                (REG_FF + 1)
493 #define REG_0F01                (REG_0F00 + 1)
494 #define REG_0F0E                (REG_0F01 + 1)
495 #define REG_0F18                (REG_0F0E + 1)
496 #define REG_0F71                (REG_0F18 + 1)
497 #define REG_0F72                (REG_0F71 + 1)
498 #define REG_0F73                (REG_0F72 + 1)
499 #define REG_0FA6                (REG_0F73 + 1)
500 #define REG_0FA7                (REG_0FA6 + 1)
501 #define REG_0FAE                (REG_0FA7 + 1)
502 #define REG_0FBA                (REG_0FAE + 1)
503 #define REG_0FC7                (REG_0FBA + 1)
504
505 #define MOD_8D                  0
506 #define MOD_0F01_REG_0          (MOD_8D + 1)
507 #define MOD_0F01_REG_1          (MOD_0F01_REG_0 + 1)
508 #define MOD_0F01_REG_2          (MOD_0F01_REG_1 + 1)
509 #define MOD_0F01_REG_3          (MOD_0F01_REG_2 + 1)
510 #define MOD_0F01_REG_7          (MOD_0F01_REG_3 + 1)
511 #define MOD_0F12_PREFIX_0       (MOD_0F01_REG_7 + 1)
512 #define MOD_0F13                (MOD_0F12_PREFIX_0 + 1)
513 #define MOD_0F16_PREFIX_0       (MOD_0F13 + 1)
514 #define MOD_0F17                (MOD_0F16_PREFIX_0 + 1)
515 #define MOD_0F18_REG_0          (MOD_0F17 + 1)
516 #define MOD_0F18_REG_1          (MOD_0F18_REG_0 + 1)
517 #define MOD_0F18_REG_2          (MOD_0F18_REG_1 + 1)
518 #define MOD_0F18_REG_3          (MOD_0F18_REG_2 + 1)
519 #define MOD_0F20                (MOD_0F18_REG_3 + 1)
520 #define MOD_0F21                (MOD_0F20 + 1)
521 #define MOD_0F22                (MOD_0F21 + 1)
522 #define MOD_0F23                (MOD_0F22 + 1)
523 #define MOD_0F24                (MOD_0F23 + 1)
524 #define MOD_0F26                (MOD_0F24 + 1)
525 #define MOD_0F2B_PREFIX_0       (MOD_0F26 + 1)
526 #define MOD_0F2B_PREFIX_1       (MOD_0F2B_PREFIX_0 + 1)
527 #define MOD_0F2B_PREFIX_2       (MOD_0F2B_PREFIX_1 + 1)
528 #define MOD_0F2B_PREFIX_3       (MOD_0F2B_PREFIX_2 + 1)
529 #define MOD_0F51                (MOD_0F2B_PREFIX_3 + 1)
530 #define MOD_0F71_REG_2          (MOD_0F51 + 1)
531 #define MOD_0F71_REG_4          (MOD_0F71_REG_2 + 1)
532 #define MOD_0F71_REG_6          (MOD_0F71_REG_4 + 1)
533 #define MOD_0F72_REG_2          (MOD_0F71_REG_6 + 1)
534 #define MOD_0F72_REG_4          (MOD_0F72_REG_2 + 1)
535 #define MOD_0F72_REG_6          (MOD_0F72_REG_4 + 1)
536 #define MOD_0F73_REG_2          (MOD_0F72_REG_6 + 1)
537 #define MOD_0F73_REG_3          (MOD_0F73_REG_2 + 1)
538 #define MOD_0F73_REG_6          (MOD_0F73_REG_3 + 1)
539 #define MOD_0F73_REG_7          (MOD_0F73_REG_6 + 1)
540 #define MOD_0FAE_REG_0          (MOD_0F73_REG_7 + 1)
541 #define MOD_0FAE_REG_1          (MOD_0FAE_REG_0 + 1)
542 #define MOD_0FAE_REG_2          (MOD_0FAE_REG_1 + 1)
543 #define MOD_0FAE_REG_3          (MOD_0FAE_REG_2 + 1)
544 #define MOD_0FAE_REG_5          (MOD_0FAE_REG_3 + 1)
545 #define MOD_0FAE_REG_6          (MOD_0FAE_REG_5 + 1)
546 #define MOD_0FAE_REG_7          (MOD_0FAE_REG_6 + 1)
547 #define MOD_0FB2                (MOD_0FAE_REG_7 + 1)
548 #define MOD_0FB4                (MOD_0FB2 + 1)
549 #define MOD_0FB5                (MOD_0FB4 + 1)
550 #define MOD_0FC7_REG_6          (MOD_0FB5 + 1)
551 #define MOD_0FC7_REG_7          (MOD_0FC7_REG_6 + 1)
552 #define MOD_0FD7                (MOD_0FC7_REG_7 + 1)
553 #define MOD_0FE7_PREFIX_2       (MOD_0FD7 + 1)
554 #define MOD_0FF0_PREFIX_3       (MOD_0FE7_PREFIX_2 + 1)
555 #define MOD_0F382A_PREFIX_2     (MOD_0FF0_PREFIX_3 + 1)
556 #define MOD_62_32BIT            (MOD_0F382A_PREFIX_2 + 1)
557 #define MOD_C4_32BIT            (MOD_62_32BIT + 1)
558 #define MOD_C5_32BIT            (MOD_C4_32BIT + 1)
559
560 #define RM_0F01_REG_0           0
561 #define RM_0F01_REG_1           (RM_0F01_REG_0 + 1)
562 #define RM_0F01_REG_3           (RM_0F01_REG_1 + 1)
563 #define RM_0F01_REG_7           (RM_0F01_REG_3 + 1)
564 #define RM_0FAE_REG_5           (RM_0F01_REG_7 + 1)
565 #define RM_0FAE_REG_6           (RM_0FAE_REG_5 + 1)
566 #define RM_0FAE_REG_7           (RM_0FAE_REG_6 + 1)
567
568 #define PREFIX_90               0
569 #define PREFIX_0F10             (PREFIX_90 + 1)
570 #define PREFIX_0F11             (PREFIX_0F10 + 1)
571 #define PREFIX_0F12             (PREFIX_0F11 + 1)
572 #define PREFIX_0F16             (PREFIX_0F12 + 1)
573 #define PREFIX_0F2A             (PREFIX_0F16 + 1)
574 #define PREFIX_0F2B             (PREFIX_0F2A + 1)
575 #define PREFIX_0F2C             (PREFIX_0F2B + 1)
576 #define PREFIX_0F2D             (PREFIX_0F2C + 1)
577 #define PREFIX_0F2E             (PREFIX_0F2D + 1)
578 #define PREFIX_0F2F             (PREFIX_0F2E + 1)
579 #define PREFIX_0F51             (PREFIX_0F2F + 1)
580 #define PREFIX_0F52             (PREFIX_0F51 + 1)
581 #define PREFIX_0F53             (PREFIX_0F52 + 1)
582 #define PREFIX_0F58             (PREFIX_0F53 + 1)
583 #define PREFIX_0F59             (PREFIX_0F58 + 1)
584 #define PREFIX_0F5A             (PREFIX_0F59 + 1)
585 #define PREFIX_0F5B             (PREFIX_0F5A + 1)
586 #define PREFIX_0F5C             (PREFIX_0F5B + 1)
587 #define PREFIX_0F5D             (PREFIX_0F5C + 1)
588 #define PREFIX_0F5E             (PREFIX_0F5D + 1)
589 #define PREFIX_0F5F             (PREFIX_0F5E + 1)
590 #define PREFIX_0F60             (PREFIX_0F5F + 1)
591 #define PREFIX_0F61             (PREFIX_0F60 + 1)
592 #define PREFIX_0F62             (PREFIX_0F61 + 1)
593 #define PREFIX_0F6C             (PREFIX_0F62 + 1)
594 #define PREFIX_0F6D             (PREFIX_0F6C + 1)
595 #define PREFIX_0F6F             (PREFIX_0F6D + 1)
596 #define PREFIX_0F70             (PREFIX_0F6F + 1)
597 #define PREFIX_0F73_REG_3       (PREFIX_0F70 + 1)
598 #define PREFIX_0F73_REG_7       (PREFIX_0F73_REG_3 + 1)
599 #define PREFIX_0F78             (PREFIX_0F73_REG_7 + 1)
600 #define PREFIX_0F79             (PREFIX_0F78 + 1)
601 #define PREFIX_0F7C             (PREFIX_0F79 + 1)
602 #define PREFIX_0F7D             (PREFIX_0F7C + 1)
603 #define PREFIX_0F7E             (PREFIX_0F7D + 1)
604 #define PREFIX_0F7F             (PREFIX_0F7E + 1)
605 #define PREFIX_0FB8             (PREFIX_0F7F + 1)
606 #define PREFIX_0FBD             (PREFIX_0FB8 + 1)
607 #define PREFIX_0FC2             (PREFIX_0FBD + 1)
608 #define PREFIX_0FC7_REG_6       (PREFIX_0FC2 + 1)
609 #define PREFIX_0FD0             (PREFIX_0FC7_REG_6 + 1)
610 #define PREFIX_0FD6             (PREFIX_0FD0 + 1)
611 #define PREFIX_0FE6             (PREFIX_0FD6 + 1)
612 #define PREFIX_0FE7             (PREFIX_0FE6 + 1)
613 #define PREFIX_0FF0             (PREFIX_0FE7 + 1)
614 #define PREFIX_0FF7             (PREFIX_0FF0 + 1)
615 #define PREFIX_0F3810           (PREFIX_0FF7 + 1)
616 #define PREFIX_0F3814           (PREFIX_0F3810 + 1)
617 #define PREFIX_0F3815           (PREFIX_0F3814 + 1)
618 #define PREFIX_0F3817           (PREFIX_0F3815 + 1)
619 #define PREFIX_0F3820           (PREFIX_0F3817 + 1)
620 #define PREFIX_0F3821           (PREFIX_0F3820 + 1)
621 #define PREFIX_0F3822           (PREFIX_0F3821 + 1)
622 #define PREFIX_0F3823           (PREFIX_0F3822 + 1)
623 #define PREFIX_0F3824           (PREFIX_0F3823 + 1)
624 #define PREFIX_0F3825           (PREFIX_0F3824 + 1)
625 #define PREFIX_0F3828           (PREFIX_0F3825 + 1)
626 #define PREFIX_0F3829           (PREFIX_0F3828 + 1)
627 #define PREFIX_0F382A           (PREFIX_0F3829 + 1)
628 #define PREFIX_0F382B           (PREFIX_0F382A + 1)
629 #define PREFIX_0F3830           (PREFIX_0F382B + 1)
630 #define PREFIX_0F3831           (PREFIX_0F3830 + 1)
631 #define PREFIX_0F3832           (PREFIX_0F3831 + 1)
632 #define PREFIX_0F3833           (PREFIX_0F3832 + 1)
633 #define PREFIX_0F3834           (PREFIX_0F3833 + 1)
634 #define PREFIX_0F3835           (PREFIX_0F3834 + 1)
635 #define PREFIX_0F3837           (PREFIX_0F3835 + 1)
636 #define PREFIX_0F3838           (PREFIX_0F3837 + 1)
637 #define PREFIX_0F3839           (PREFIX_0F3838 + 1)
638 #define PREFIX_0F383A           (PREFIX_0F3839 + 1)
639 #define PREFIX_0F383B           (PREFIX_0F383A + 1)
640 #define PREFIX_0F383C           (PREFIX_0F383B + 1)
641 #define PREFIX_0F383D           (PREFIX_0F383C + 1)
642 #define PREFIX_0F383E           (PREFIX_0F383D + 1)
643 #define PREFIX_0F383F           (PREFIX_0F383E + 1)
644 #define PREFIX_0F3840           (PREFIX_0F383F + 1)
645 #define PREFIX_0F3841           (PREFIX_0F3840 + 1)
646 #define PREFIX_0F38F0           (PREFIX_0F3841 + 1)
647 #define PREFIX_0F38F1           (PREFIX_0F38F0 + 1)
648 #define PREFIX_0F3A08           (PREFIX_0F38F1 + 1)
649 #define PREFIX_0F3A09           (PREFIX_0F3A08 + 1)
650 #define PREFIX_0F3A0A           (PREFIX_0F3A09 + 1)
651 #define PREFIX_0F3A0B           (PREFIX_0F3A0A + 1)
652 #define PREFIX_0F3A0C           (PREFIX_0F3A0B + 1)
653 #define PREFIX_0F3A0D           (PREFIX_0F3A0C + 1)
654 #define PREFIX_0F3A0E           (PREFIX_0F3A0D + 1)
655 #define PREFIX_0F3A14           (PREFIX_0F3A0E + 1)
656 #define PREFIX_0F3A15           (PREFIX_0F3A14 + 1)
657 #define PREFIX_0F3A16           (PREFIX_0F3A15 + 1)
658 #define PREFIX_0F3A17           (PREFIX_0F3A16 + 1)
659 #define PREFIX_0F3A20           (PREFIX_0F3A17 + 1)
660 #define PREFIX_0F3A21           (PREFIX_0F3A20 + 1)
661 #define PREFIX_0F3A22           (PREFIX_0F3A21 + 1)
662 #define PREFIX_0F3A40           (PREFIX_0F3A22 + 1)
663 #define PREFIX_0F3A41           (PREFIX_0F3A40 + 1)
664 #define PREFIX_0F3A42           (PREFIX_0F3A41 + 1)
665 #define PREFIX_0F3A60           (PREFIX_0F3A42 + 1)
666 #define PREFIX_0F3A61           (PREFIX_0F3A60 + 1)
667 #define PREFIX_0F3A62           (PREFIX_0F3A61 + 1)
668 #define PREFIX_0F3A63           (PREFIX_0F3A62 + 1)
669
670 #define X86_64_06               0
671 #define X86_64_07               (X86_64_06 + 1)
672 #define X86_64_0D               (X86_64_07 + 1)
673 #define X86_64_16               (X86_64_0D + 1)
674 #define X86_64_17               (X86_64_16 + 1)
675 #define X86_64_1E               (X86_64_17 + 1)
676 #define X86_64_1F               (X86_64_1E + 1)
677 #define X86_64_27               (X86_64_1F + 1)
678 #define X86_64_2F               (X86_64_27 + 1)
679 #define X86_64_37               (X86_64_2F + 1)
680 #define X86_64_3F               (X86_64_37 + 1)
681 #define X86_64_60               (X86_64_3F + 1)
682 #define X86_64_61               (X86_64_60 + 1)
683 #define X86_64_62               (X86_64_61 + 1)
684 #define X86_64_63               (X86_64_62 + 1)
685 #define X86_64_6D               (X86_64_63 + 1)
686 #define X86_64_6F               (X86_64_6D + 1)
687 #define X86_64_9A               (X86_64_6F + 1)
688 #define X86_64_C4               (X86_64_9A + 1)
689 #define X86_64_C5               (X86_64_C4 + 1)
690 #define X86_64_CE               (X86_64_C5 + 1)
691 #define X86_64_D4               (X86_64_CE + 1)
692 #define X86_64_D5               (X86_64_D4 + 1)
693 #define X86_64_EA               (X86_64_D5 + 1)
694 #define X86_64_0F01_REG_0       (X86_64_EA + 1)
695 #define X86_64_0F01_REG_1       (X86_64_0F01_REG_0 + 1)
696 #define X86_64_0F01_REG_2       (X86_64_0F01_REG_1 + 1)
697 #define X86_64_0F01_REG_3       (X86_64_0F01_REG_2 + 1)
698
699 #define THREE_BYTE_0F24         0
700 #define THREE_BYTE_0F25         (THREE_BYTE_0F24 + 1)
701 #define THREE_BYTE_0F38         (THREE_BYTE_0F25 + 1)
702 #define THREE_BYTE_0F3A         (THREE_BYTE_0F38 + 1)
703 #define THREE_BYTE_0F7A         (THREE_BYTE_0F3A + 1)
704 #define THREE_BYTE_0F7B         (THREE_BYTE_0F7A + 1)
705
706 typedef void (*op_rtn) (int bytemode, int sizeflag);
707
708 struct dis386 {
709   const char *name;
710   struct
711     {
712       op_rtn rtn;
713       int bytemode;
714     } op[MAX_OPERANDS];
715 };
716
717 /* Upper case letters in the instruction names here are macros.
718    'A' => print 'b' if no register operands or suffix_always is true
719    'B' => print 'b' if suffix_always is true
720    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
721    .      size prefix
722    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
723    .      suffix_always is true
724    'E' => print 'e' if 32-bit form of jcxz
725    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
726    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
727    'H' => print ",pt" or ",pn" branch hint
728    'I' => honor following macro letter even in Intel mode (implemented only
729    .      for some of the macro letters)
730    'J' => print 'l'
731    'K' => print 'd' or 'q' if rex prefix is present.
732    'L' => print 'l' if suffix_always is true
733    'N' => print 'n' if instruction has no wait "prefix"
734    'O' => print 'd' or 'o' (or 'q' in Intel mode)
735    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
736    .      or suffix_always is true.  print 'q' if rex prefix is present.
737    'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
738    .      is true
739    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
740    'S' => print 'w', 'l' or 'q' if suffix_always is true
741    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
742    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
743    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
744    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
745    'X' => print 's', 'd' depending on data16 prefix (for XMM)
746    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
747           suffix_always is true.
748    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
749
750    Many of the above letters print nothing in Intel mode.  See "putop"
751    for the details.
752
753    Braces '{' and '}', and vertical bars '|', indicate alternative
754    mnemonic strings for AT&T and Intel.  */
755
756 static const struct dis386 dis386[] = {
757   /* 00 */
758   { "addB",             { Eb, Gb } },
759   { "addS",             { Ev, Gv } },
760   { "addB",             { Gb, Eb } },
761   { "addS",             { Gv, Ev } },
762   { "addB",             { AL, Ib } },
763   { "addS",             { eAX, Iv } },
764   { X86_64_TABLE (X86_64_06) },
765   { X86_64_TABLE (X86_64_07) },
766   /* 08 */
767   { "orB",              { Eb, Gb } },
768   { "orS",              { Ev, Gv } },
769   { "orB",              { Gb, Eb } },
770   { "orS",              { Gv, Ev } },
771   { "orB",              { AL, Ib } },
772   { "orS",              { eAX, Iv } },
773   { X86_64_TABLE (X86_64_0D) },
774   { "(bad)",            { XX } },       /* 0x0f extended opcode escape */
775   /* 10 */
776   { "adcB",             { Eb, Gb } },
777   { "adcS",             { Ev, Gv } },
778   { "adcB",             { Gb, Eb } },
779   { "adcS",             { Gv, Ev } },
780   { "adcB",             { AL, Ib } },
781   { "adcS",             { eAX, Iv } },
782   { X86_64_TABLE (X86_64_16) },
783   { X86_64_TABLE (X86_64_17) },
784   /* 18 */
785   { "sbbB",             { Eb, Gb } },
786   { "sbbS",             { Ev, Gv } },
787   { "sbbB",             { Gb, Eb } },
788   { "sbbS",             { Gv, Ev } },
789   { "sbbB",             { AL, Ib } },
790   { "sbbS",             { eAX, Iv } },
791   { X86_64_TABLE (X86_64_1E) },
792   { X86_64_TABLE (X86_64_1F) },
793   /* 20 */
794   { "andB",             { Eb, Gb } },
795   { "andS",             { Ev, Gv } },
796   { "andB",             { Gb, Eb } },
797   { "andS",             { Gv, Ev } },
798   { "andB",             { AL, Ib } },
799   { "andS",             { eAX, Iv } },
800   { "(bad)",            { XX } },       /* SEG ES prefix */
801   { X86_64_TABLE (X86_64_27) },
802   /* 28 */
803   { "subB",             { Eb, Gb } },
804   { "subS",             { Ev, Gv } },
805   { "subB",             { Gb, Eb } },
806   { "subS",             { Gv, Ev } },
807   { "subB",             { AL, Ib } },
808   { "subS",             { eAX, Iv } },
809   { "(bad)",            { XX } },       /* SEG CS prefix */
810   { X86_64_TABLE (X86_64_2F) },
811   /* 30 */
812   { "xorB",             { Eb, Gb } },
813   { "xorS",             { Ev, Gv } },
814   { "xorB",             { Gb, Eb } },
815   { "xorS",             { Gv, Ev } },
816   { "xorB",             { AL, Ib } },
817   { "xorS",             { eAX, Iv } },
818   { "(bad)",            { XX } },       /* SEG SS prefix */
819   { X86_64_TABLE (X86_64_37) },
820   /* 38 */
821   { "cmpB",             { Eb, Gb } },
822   { "cmpS",             { Ev, Gv } },
823   { "cmpB",             { Gb, Eb } },
824   { "cmpS",             { Gv, Ev } },
825   { "cmpB",             { AL, Ib } },
826   { "cmpS",             { eAX, Iv } },
827   { "(bad)",            { XX } },       /* SEG DS prefix */
828   { X86_64_TABLE (X86_64_3F) },
829   /* 40 */
830   { "inc{S|}",          { RMeAX } },
831   { "inc{S|}",          { RMeCX } },
832   { "inc{S|}",          { RMeDX } },
833   { "inc{S|}",          { RMeBX } },
834   { "inc{S|}",          { RMeSP } },
835   { "inc{S|}",          { RMeBP } },
836   { "inc{S|}",          { RMeSI } },
837   { "inc{S|}",          { RMeDI } },
838   /* 48 */
839   { "dec{S|}",          { RMeAX } },
840   { "dec{S|}",          { RMeCX } },
841   { "dec{S|}",          { RMeDX } },
842   { "dec{S|}",          { RMeBX } },
843   { "dec{S|}",          { RMeSP } },
844   { "dec{S|}",          { RMeBP } },
845   { "dec{S|}",          { RMeSI } },
846   { "dec{S|}",          { RMeDI } },
847   /* 50 */
848   { "pushV",            { RMrAX } },
849   { "pushV",            { RMrCX } },
850   { "pushV",            { RMrDX } },
851   { "pushV",            { RMrBX } },
852   { "pushV",            { RMrSP } },
853   { "pushV",            { RMrBP } },
854   { "pushV",            { RMrSI } },
855   { "pushV",            { RMrDI } },
856   /* 58 */
857   { "popV",             { RMrAX } },
858   { "popV",             { RMrCX } },
859   { "popV",             { RMrDX } },
860   { "popV",             { RMrBX } },
861   { "popV",             { RMrSP } },
862   { "popV",             { RMrBP } },
863   { "popV",             { RMrSI } },
864   { "popV",             { RMrDI } },
865   /* 60 */
866   { X86_64_TABLE (X86_64_60) },
867   { X86_64_TABLE (X86_64_61) },
868   { X86_64_TABLE (X86_64_62) },
869   { X86_64_TABLE (X86_64_63) },
870   { "(bad)",            { XX } },       /* seg fs */
871   { "(bad)",            { XX } },       /* seg gs */
872   { "(bad)",            { XX } },       /* op size prefix */
873   { "(bad)",            { XX } },       /* adr size prefix */
874   /* 68 */
875   { "pushT",            { Iq } },
876   { "imulS",            { Gv, Ev, Iv } },
877   { "pushT",            { sIb } },
878   { "imulS",            { Gv, Ev, sIb } },
879   { "ins{b|}",          { Ybr, indirDX } },
880   { X86_64_TABLE (X86_64_6D) },
881   { "outs{b|}",         { indirDXr, Xb } },
882   { X86_64_TABLE (X86_64_6F) },
883   /* 70 */
884   { "joH",              { Jb, XX, cond_jump_flag } },
885   { "jnoH",             { Jb, XX, cond_jump_flag } },
886   { "jbH",              { Jb, XX, cond_jump_flag } },
887   { "jaeH",             { Jb, XX, cond_jump_flag } },
888   { "jeH",              { Jb, XX, cond_jump_flag } },
889   { "jneH",             { Jb, XX, cond_jump_flag } },
890   { "jbeH",             { Jb, XX, cond_jump_flag } },
891   { "jaH",              { Jb, XX, cond_jump_flag } },
892   /* 78 */
893   { "jsH",              { Jb, XX, cond_jump_flag } },
894   { "jnsH",             { Jb, XX, cond_jump_flag } },
895   { "jpH",              { Jb, XX, cond_jump_flag } },
896   { "jnpH",             { Jb, XX, cond_jump_flag } },
897   { "jlH",              { Jb, XX, cond_jump_flag } },
898   { "jgeH",             { Jb, XX, cond_jump_flag } },
899   { "jleH",             { Jb, XX, cond_jump_flag } },
900   { "jgH",              { Jb, XX, cond_jump_flag } },
901   /* 80 */
902   { REG_TABLE (REG_80) },
903   { REG_TABLE (REG_81) },
904   { "(bad)",            { XX } },
905   { REG_TABLE (REG_82) },
906   { "testB",            { Eb, Gb } },
907   { "testS",            { Ev, Gv } },
908   { "xchgB",            { Eb, Gb } },
909   { "xchgS",            { Ev, Gv } },
910   /* 88 */
911   { "movB",             { Eb, Gb } },
912   { "movS",             { Ev, Gv } },
913   { "movB",             { Gb, Eb } },
914   { "movS",             { Gv, Ev } },
915   { "movD",             { Sv, Sw } },
916   { MOD_TABLE (MOD_8D) },
917   { "movD",             { Sw, Sv } },
918   { REG_TABLE (REG_8F) },
919   /* 90 */
920   { PREFIX_TABLE (PREFIX_90) },
921   { "xchgS",            { RMeCX, eAX } },
922   { "xchgS",            { RMeDX, eAX } },
923   { "xchgS",            { RMeBX, eAX } },
924   { "xchgS",            { RMeSP, eAX } },
925   { "xchgS",            { RMeBP, eAX } },
926   { "xchgS",            { RMeSI, eAX } },
927   { "xchgS",            { RMeDI, eAX } },
928   /* 98 */
929   { "cW{t|}R",          { XX } },
930   { "cR{t|}O",          { XX } },
931   { X86_64_TABLE (X86_64_9A) },
932   { "(bad)",            { XX } },       /* fwait */
933   { "pushfT",           { XX } },
934   { "popfT",            { XX } },
935   { "sahf",             { XX } },
936   { "lahf",             { XX } },
937   /* a0 */
938   { "movB",             { AL, Ob } },
939   { "movS",             { eAX, Ov } },
940   { "movB",             { Ob, AL } },
941   { "movS",             { Ov, eAX } },
942   { "movs{b|}",         { Ybr, Xb } },
943   { "movs{R|}",         { Yvr, Xv } },
944   { "cmps{b|}",         { Xb, Yb } },
945   { "cmps{R|}",         { Xv, Yv } },
946   /* a8 */
947   { "testB",            { AL, Ib } },
948   { "testS",            { eAX, Iv } },
949   { "stosB",            { Ybr, AL } },
950   { "stosS",            { Yvr, eAX } },
951   { "lodsB",            { ALr, Xb } },
952   { "lodsS",            { eAXr, Xv } },
953   { "scasB",            { AL, Yb } },
954   { "scasS",            { eAX, Yv } },
955   /* b0 */
956   { "movB",             { RMAL, Ib } },
957   { "movB",             { RMCL, Ib } },
958   { "movB",             { RMDL, Ib } },
959   { "movB",             { RMBL, Ib } },
960   { "movB",             { RMAH, Ib } },
961   { "movB",             { RMCH, Ib } },
962   { "movB",             { RMDH, Ib } },
963   { "movB",             { RMBH, Ib } },
964   /* b8 */
965   { "movS",             { RMeAX, Iv64 } },
966   { "movS",             { RMeCX, Iv64 } },
967   { "movS",             { RMeDX, Iv64 } },
968   { "movS",             { RMeBX, Iv64 } },
969   { "movS",             { RMeSP, Iv64 } },
970   { "movS",             { RMeBP, Iv64 } },
971   { "movS",             { RMeSI, Iv64 } },
972   { "movS",             { RMeDI, Iv64 } },
973   /* c0 */
974   { REG_TABLE (REG_C0) },
975   { REG_TABLE (REG_C1) },
976   { "retT",             { Iw } },
977   { "retT",             { XX } },
978   { X86_64_TABLE (X86_64_C4) },
979   { X86_64_TABLE (X86_64_C5) },
980   { REG_TABLE (REG_C6) },
981   { REG_TABLE (REG_C7) },
982   /* c8 */
983   { "enterT",           { Iw, Ib } },
984   { "leaveT",           { XX } },
985   { "lretP",            { Iw } },
986   { "lretP",            { XX } },
987   { "int3",             { XX } },
988   { "int",              { Ib } },
989   { X86_64_TABLE (X86_64_CE) },
990   { "iretP",            { XX } },
991   /* d0 */
992   { REG_TABLE (REG_D0) },
993   { REG_TABLE (REG_D1) },
994   { REG_TABLE (REG_D2) },
995   { REG_TABLE (REG_D3) },
996   { X86_64_TABLE (X86_64_D4) },
997   { X86_64_TABLE (X86_64_D5) },
998   { "(bad)",            { XX } },
999   { "xlat",             { DSBX } },
1000   /* d8 */
1001   { FLOAT },
1002   { FLOAT },
1003   { FLOAT },
1004   { FLOAT },
1005   { FLOAT },
1006   { FLOAT },
1007   { FLOAT },
1008   { FLOAT },
1009   /* e0 */
1010   { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1011   { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1012   { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1013   { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1014   { "inB",              { AL, Ib } },
1015   { "inG",              { zAX, Ib } },
1016   { "outB",             { Ib, AL } },
1017   { "outG",             { Ib, zAX } },
1018   /* e8 */
1019   { "callT",            { Jv } },
1020   { "jmpT",             { Jv } },
1021   { X86_64_TABLE (X86_64_EA) },
1022   { "jmp",              { Jb } },
1023   { "inB",              { AL, indirDX } },
1024   { "inG",              { zAX, indirDX } },
1025   { "outB",             { indirDX, AL } },
1026   { "outG",             { indirDX, zAX } },
1027   /* f0 */
1028   { "(bad)",            { XX } },       /* lock prefix */
1029   { "icebp",            { XX } },
1030   { "(bad)",            { XX } },       /* repne */
1031   { "(bad)",            { XX } },       /* repz */
1032   { "hlt",              { XX } },
1033   { "cmc",              { XX } },
1034   { REG_TABLE (REG_F6) },
1035   { REG_TABLE (REG_F7) },
1036   /* f8 */
1037   { "clc",              { XX } },
1038   { "stc",              { XX } },
1039   { "cli",              { XX } },
1040   { "sti",              { XX } },
1041   { "cld",              { XX } },
1042   { "std",              { XX } },
1043   { REG_TABLE (REG_FE) },
1044   { REG_TABLE (REG_FF) },
1045 };
1046
1047 static const struct dis386 dis386_twobyte[] = {
1048   /* 00 */
1049   { REG_TABLE (REG_0F00 ) },
1050   { REG_TABLE (REG_0F01 ) },
1051   { "larS",             { Gv, Ew } },
1052   { "lslS",             { Gv, Ew } },
1053   { "(bad)",            { XX } },
1054   { "syscall",          { XX } },
1055   { "clts",             { XX } },
1056   { "sysretP",          { XX } },
1057   /* 08 */
1058   { "invd",             { XX } },
1059   { "wbinvd",           { XX } },
1060   { "(bad)",            { XX } },
1061   { "ud2a",             { XX } },
1062   { "(bad)",            { XX } },
1063   { REG_TABLE (REG_0F0E) },
1064   { "femms",            { XX } },
1065   { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1066   /* 10 */
1067   { PREFIX_TABLE (PREFIX_0F10) },
1068   { PREFIX_TABLE (PREFIX_0F11) },
1069   { PREFIX_TABLE (PREFIX_0F12) },
1070   { MOD_TABLE (MOD_0F13) },
1071   { "unpcklpX",         { XM, EXx } },
1072   { "unpckhpX",         { XM, EXx } },
1073   { PREFIX_TABLE (PREFIX_0F16) },
1074   { MOD_TABLE (MOD_0F17) },
1075   /* 18 */
1076   { REG_TABLE (REG_0F18) },
1077   { "(bad)",            { XX } },
1078   { "(bad)",            { XX } },
1079   { "(bad)",            { XX } },
1080   { "(bad)",            { XX } },
1081   { "(bad)",            { XX } },
1082   { "(bad)",            { XX } },
1083   { "nopQ",             { Ev } },
1084   /* 20 */
1085   { MOD_TABLE (MOD_0F20) },
1086   { MOD_TABLE (MOD_0F21) },
1087   { MOD_TABLE (MOD_0F22) },
1088   { MOD_TABLE (MOD_0F23) },
1089   { MOD_TABLE (MOD_0F24) },
1090   { THREE_BYTE_TABLE (THREE_BYTE_0F25) },
1091   { MOD_TABLE (MOD_0F26) },
1092   { "(bad)",            { XX } },
1093   /* 28 */
1094   { "movapX",           { XM, EXx } },
1095   { "movapX",           { EXx, XM } },
1096   { PREFIX_TABLE (PREFIX_0F2A) },
1097   { PREFIX_TABLE (PREFIX_0F2B) },
1098   { PREFIX_TABLE (PREFIX_0F2C) },
1099   { PREFIX_TABLE (PREFIX_0F2D) },
1100   { PREFIX_TABLE (PREFIX_0F2E) },
1101   { PREFIX_TABLE (PREFIX_0F2F) },
1102   /* 30 */
1103   { "wrmsr",            { XX } },
1104   { "rdtsc",            { XX } },
1105   { "rdmsr",            { XX } },
1106   { "rdpmc",            { XX } },
1107   { "sysenter",         { XX } },
1108   { "sysexit",          { XX } },
1109   { "(bad)",            { XX } },
1110   { "getsec",           { XX } },
1111   /* 38 */
1112   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1113   { "(bad)",            { XX } },
1114   { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1115   { "(bad)",            { XX } },
1116   { "(bad)",            { XX } },
1117   { "(bad)",            { XX } },
1118   { "(bad)",            { XX } },
1119   { "(bad)",            { XX } },
1120   /* 40 */
1121   { "cmovo",            { Gv, Ev } },
1122   { "cmovno",           { Gv, Ev } },
1123   { "cmovb",            { Gv, Ev } },
1124   { "cmovae",           { Gv, Ev } },
1125   { "cmove",            { Gv, Ev } },
1126   { "cmovne",           { Gv, Ev } },
1127   { "cmovbe",           { Gv, Ev } },
1128   { "cmova",            { Gv, Ev } },
1129   /* 48 */
1130   { "cmovs",            { Gv, Ev } },
1131   { "cmovns",           { Gv, Ev } },
1132   { "cmovp",            { Gv, Ev } },
1133   { "cmovnp",           { Gv, Ev } },
1134   { "cmovl",            { Gv, Ev } },
1135   { "cmovge",           { Gv, Ev } },
1136   { "cmovle",           { Gv, Ev } },
1137   { "cmovg",            { Gv, Ev } },
1138   /* 50 */
1139   { MOD_TABLE (MOD_0F51) },
1140   { PREFIX_TABLE (PREFIX_0F51) },
1141   { PREFIX_TABLE (PREFIX_0F52) },
1142   { PREFIX_TABLE (PREFIX_0F53) },
1143   { "andpX",            { XM, EXx } },
1144   { "andnpX",           { XM, EXx } },
1145   { "orpX",             { XM, EXx } },
1146   { "xorpX",            { XM, EXx } },
1147   /* 58 */
1148   { PREFIX_TABLE (PREFIX_0F58) },
1149   { PREFIX_TABLE (PREFIX_0F59) },
1150   { PREFIX_TABLE (PREFIX_0F5A) },
1151   { PREFIX_TABLE (PREFIX_0F5B) },
1152   { PREFIX_TABLE (PREFIX_0F5C) },
1153   { PREFIX_TABLE (PREFIX_0F5D) },
1154   { PREFIX_TABLE (PREFIX_0F5E) },
1155   { PREFIX_TABLE (PREFIX_0F5F) },
1156   /* 60 */
1157   { PREFIX_TABLE (PREFIX_0F60) },
1158   { PREFIX_TABLE (PREFIX_0F61) },
1159   { PREFIX_TABLE (PREFIX_0F62) },
1160   { "packsswb",         { MX, EM } },
1161   { "pcmpgtb",          { MX, EM } },
1162   { "pcmpgtw",          { MX, EM } },
1163   { "pcmpgtd",          { MX, EM } },
1164   { "packuswb",         { MX, EM } },
1165   /* 68 */
1166   { "punpckhbw",        { MX, EM } },
1167   { "punpckhwd",        { MX, EM } },
1168   { "punpckhdq",        { MX, EM } },
1169   { "packssdw",         { MX, EM } },
1170   { PREFIX_TABLE (PREFIX_0F6C) },
1171   { PREFIX_TABLE (PREFIX_0F6D) },
1172   { "movK",             { MX, Edq } },
1173   { PREFIX_TABLE (PREFIX_0F6F) },
1174   /* 70 */
1175   { PREFIX_TABLE (PREFIX_0F70) },
1176   { REG_TABLE (REG_0F71) },
1177   { REG_TABLE (REG_0F72) },
1178   { REG_TABLE (REG_0F73) },
1179   { "pcmpeqb",          { MX, EM } },
1180   { "pcmpeqw",          { MX, EM } },
1181   { "pcmpeqd",          { MX, EM } },
1182   { "emms",             { XX } },
1183   /* 78 */
1184   { PREFIX_TABLE (PREFIX_0F78) },
1185   { PREFIX_TABLE (PREFIX_0F79) },
1186   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1187   { THREE_BYTE_TABLE (THREE_BYTE_0F7B) },
1188   { PREFIX_TABLE (PREFIX_0F7C) },
1189   { PREFIX_TABLE (PREFIX_0F7D) },
1190   { PREFIX_TABLE (PREFIX_0F7E) },
1191   { PREFIX_TABLE (PREFIX_0F7F) },
1192   /* 80 */
1193   { "joH",              { Jv, XX, cond_jump_flag } },
1194   { "jnoH",             { Jv, XX, cond_jump_flag } },
1195   { "jbH",              { Jv, XX, cond_jump_flag } },
1196   { "jaeH",             { Jv, XX, cond_jump_flag } },
1197   { "jeH",              { Jv, XX, cond_jump_flag } },
1198   { "jneH",             { Jv, XX, cond_jump_flag } },
1199   { "jbeH",             { Jv, XX, cond_jump_flag } },
1200   { "jaH",              { Jv, XX, cond_jump_flag } },
1201   /* 88 */
1202   { "jsH",              { Jv, XX, cond_jump_flag } },
1203   { "jnsH",             { Jv, XX, cond_jump_flag } },
1204   { "jpH",              { Jv, XX, cond_jump_flag } },
1205   { "jnpH",             { Jv, XX, cond_jump_flag } },
1206   { "jlH",              { Jv, XX, cond_jump_flag } },
1207   { "jgeH",             { Jv, XX, cond_jump_flag } },
1208   { "jleH",             { Jv, XX, cond_jump_flag } },
1209   { "jgH",              { Jv, XX, cond_jump_flag } },
1210   /* 90 */
1211   { "seto",             { Eb } },
1212   { "setno",            { Eb } },
1213   { "setb",             { Eb } },
1214   { "setae",            { Eb } },
1215   { "sete",             { Eb } },
1216   { "setne",            { Eb } },
1217   { "setbe",            { Eb } },
1218   { "seta",             { Eb } },
1219   /* 98 */
1220   { "sets",             { Eb } },
1221   { "setns",            { Eb } },
1222   { "setp",             { Eb } },
1223   { "setnp",            { Eb } },
1224   { "setl",             { Eb } },
1225   { "setge",            { Eb } },
1226   { "setle",            { Eb } },
1227   { "setg",             { Eb } },
1228   /* a0 */
1229   { "pushT",            { fs } },
1230   { "popT",             { fs } },
1231   { "cpuid",            { XX } },
1232   { "btS",              { Ev, Gv } },
1233   { "shldS",            { Ev, Gv, Ib } },
1234   { "shldS",            { Ev, Gv, CL } },
1235   { REG_TABLE (REG_0FA6) },
1236   { REG_TABLE (REG_0FA7) },
1237   /* a8 */
1238   { "pushT",            { gs } },
1239   { "popT",             { gs } },
1240   { "rsm",              { XX } },
1241   { "btsS",             { Ev, Gv } },
1242   { "shrdS",            { Ev, Gv, Ib } },
1243   { "shrdS",            { Ev, Gv, CL } },
1244   { REG_TABLE (REG_0FAE) },
1245   { "imulS",            { Gv, Ev } },
1246   /* b0 */
1247   { "cmpxchgB",         { Eb, Gb } },
1248   { "cmpxchgS",         { Ev, Gv } },
1249   { MOD_TABLE (MOD_0FB2) },
1250   { "btrS",             { Ev, Gv } },
1251   { MOD_TABLE (MOD_0FB4) },
1252   { MOD_TABLE (MOD_0FB5) },
1253   { "movz{bR|x}",       { Gv, Eb } },
1254   { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
1255   /* b8 */
1256   { PREFIX_TABLE (PREFIX_0FB8) },
1257   { "ud2b",             { XX } },
1258   { REG_TABLE (REG_0FBA) },
1259   { "btcS",             { Ev, Gv } },
1260   { "bsfS",             { Gv, Ev } },
1261   { PREFIX_TABLE (PREFIX_0FBD) },
1262   { "movs{bR|x}",       { Gv, Eb } },
1263   { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
1264   /* c0 */
1265   { "xaddB",            { Eb, Gb } },
1266   { "xaddS",            { Ev, Gv } },
1267   { PREFIX_TABLE (PREFIX_0FC2) },
1268   { "movntiS",          { Ev, Gv } },
1269   { "pinsrw",           { MX, Edqw, Ib } },
1270   { "pextrw",           { Gdq, MS, Ib } },
1271   { "shufpX",           { XM, EXx, Ib } },
1272   { REG_TABLE (REG_0FC7) },
1273   /* c8 */
1274   { "bswap",            { RMeAX } },
1275   { "bswap",            { RMeCX } },
1276   { "bswap",            { RMeDX } },
1277   { "bswap",            { RMeBX } },
1278   { "bswap",            { RMeSP } },
1279   { "bswap",            { RMeBP } },
1280   { "bswap",            { RMeSI } },
1281   { "bswap",            { RMeDI } },
1282   /* d0 */
1283   { PREFIX_TABLE (PREFIX_0FD0) },
1284   { "psrlw",            { MX, EM } },
1285   { "psrld",            { MX, EM } },
1286   { "psrlq",            { MX, EM } },
1287   { "paddq",            { MX, EM } },
1288   { "pmullw",           { MX, EM } },
1289   { PREFIX_TABLE (PREFIX_0FD6) },
1290   { MOD_TABLE (MOD_0FD7) },
1291   /* d8 */
1292   { "psubusb",          { MX, EM } },
1293   { "psubusw",          { MX, EM } },
1294   { "pminub",           { MX, EM } },
1295   { "pand",             { MX, EM } },
1296   { "paddusb",          { MX, EM } },
1297   { "paddusw",          { MX, EM } },
1298   { "pmaxub",           { MX, EM } },
1299   { "pandn",            { MX, EM } },
1300   /* e0 */
1301   { "pavgb",            { MX, EM } },
1302   { "psraw",            { MX, EM } },
1303   { "psrad",            { MX, EM } },
1304   { "pavgw",            { MX, EM } },
1305   { "pmulhuw",          { MX, EM } },
1306   { "pmulhw",           { MX, EM } },
1307   { PREFIX_TABLE (PREFIX_0FE6) },
1308   { PREFIX_TABLE (PREFIX_0FE7) },
1309   /* e8 */
1310   { "psubsb",           { MX, EM } },
1311   { "psubsw",           { MX, EM } },
1312   { "pminsw",           { MX, EM } },
1313   { "por",              { MX, EM } },
1314   { "paddsb",           { MX, EM } },
1315   { "paddsw",           { MX, EM } },
1316   { "pmaxsw",           { MX, EM } },
1317   { "pxor",             { MX, EM } },
1318   /* f0 */
1319   { PREFIX_TABLE (PREFIX_0FF0) },
1320   { "psllw",            { MX, EM } },
1321   { "pslld",            { MX, EM } },
1322   { "psllq",            { MX, EM } },
1323   { "pmuludq",          { MX, EM } },
1324   { "pmaddwd",          { MX, EM } },
1325   { "psadbw",           { MX, EM } },
1326   { PREFIX_TABLE (PREFIX_0FF7) },
1327   /* f8 */
1328   { "psubb",            { MX, EM } },
1329   { "psubw",            { MX, EM } },
1330   { "psubd",            { MX, EM } },
1331   { "psubq",            { MX, EM } },
1332   { "paddb",            { MX, EM } },
1333   { "paddw",            { MX, EM } },
1334   { "paddd",            { MX, EM } },
1335   { "(bad)",            { XX } },
1336 };
1337
1338 static const unsigned char onebyte_has_modrm[256] = {
1339   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1340   /*       -------------------------------        */
1341   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1342   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1343   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1344   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1345   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1346   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1347   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1348   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1349   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1350   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1351   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1352   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1353   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1354   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1355   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1356   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1357   /*       -------------------------------        */
1358   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1359 };
1360
1361 static const unsigned char twobyte_has_modrm[256] = {
1362   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1363   /*       -------------------------------        */
1364   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1365   /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
1366   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1367   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1368   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1369   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1370   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1371   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1372   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1373   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1374   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1375   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1376   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1377   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1378   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1379   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
1380   /*       -------------------------------        */
1381   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1382 };
1383
1384 static char obuf[100];
1385 static char *obufp;
1386 static char scratchbuf[100];
1387 static unsigned char *start_codep;
1388 static unsigned char *insn_codep;
1389 static unsigned char *codep;
1390 static const char *lock_prefix;
1391 static const char *data_prefix;
1392 static const char *addr_prefix;
1393 static const char *repz_prefix;
1394 static const char *repnz_prefix;
1395 static disassemble_info *the_info;
1396 static struct
1397   {
1398     int mod;
1399     int reg;
1400     int rm;
1401   }
1402 modrm;
1403 static unsigned char need_modrm;
1404
1405 /* If we are accessing mod/rm/reg without need_modrm set, then the
1406    values are stale.  Hitting this abort likely indicates that you
1407    need to update onebyte_has_modrm or twobyte_has_modrm.  */
1408 #define MODRM_CHECK  if (!need_modrm) abort ()
1409
1410 static const char **names64;
1411 static const char **names32;
1412 static const char **names16;
1413 static const char **names8;
1414 static const char **names8rex;
1415 static const char **names_seg;
1416 static const char *index64;
1417 static const char *index32;
1418 static const char **index16;
1419
1420 static const char *intel_names64[] = {
1421   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1422   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1423 };
1424 static const char *intel_names32[] = {
1425   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1426   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1427 };
1428 static const char *intel_names16[] = {
1429   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1430   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1431 };
1432 static const char *intel_names8[] = {
1433   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1434 };
1435 static const char *intel_names8rex[] = {
1436   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1437   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1438 };
1439 static const char *intel_names_seg[] = {
1440   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1441 };
1442 static const char *intel_index64 = "riz";
1443 static const char *intel_index32 = "eiz";
1444 static const char *intel_index16[] = {
1445   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1446 };
1447
1448 static const char *att_names64[] = {
1449   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1450   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1451 };
1452 static const char *att_names32[] = {
1453   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1454   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1455 };
1456 static const char *att_names16[] = {
1457   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1458   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1459 };
1460 static const char *att_names8[] = {
1461   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1462 };
1463 static const char *att_names8rex[] = {
1464   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1465   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1466 };
1467 static const char *att_names_seg[] = {
1468   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1469 };
1470 static const char *att_index64 = "%riz";
1471 static const char *att_index32 = "%eiz";
1472 static const char *att_index16[] = {
1473   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1474 };
1475
1476 static const struct dis386 reg_table[][8] = {
1477   /* REG_80 */
1478   {
1479     { "addA",   { Eb, Ib } },
1480     { "orA",    { Eb, Ib } },
1481     { "adcA",   { Eb, Ib } },
1482     { "sbbA",   { Eb, Ib } },
1483     { "andA",   { Eb, Ib } },
1484     { "subA",   { Eb, Ib } },
1485     { "xorA",   { Eb, Ib } },
1486     { "cmpA",   { Eb, Ib } },
1487   },
1488   /* REG_81 */
1489   {
1490     { "addQ",   { Ev, Iv } },
1491     { "orQ",    { Ev, Iv } },
1492     { "adcQ",   { Ev, Iv } },
1493     { "sbbQ",   { Ev, Iv } },
1494     { "andQ",   { Ev, Iv } },
1495     { "subQ",   { Ev, Iv } },
1496     { "xorQ",   { Ev, Iv } },
1497     { "cmpQ",   { Ev, Iv } },
1498   },
1499   /* REG_82 */
1500   {
1501     { "addQ",   { Ev, sIb } },
1502     { "orQ",    { Ev, sIb } },
1503     { "adcQ",   { Ev, sIb } },
1504     { "sbbQ",   { Ev, sIb } },
1505     { "andQ",   { Ev, sIb } },
1506     { "subQ",   { Ev, sIb } },
1507     { "xorQ",   { Ev, sIb } },
1508     { "cmpQ",   { Ev, sIb } },
1509   },
1510   /* REG_8F */
1511   {
1512     { "popU",   { stackEv } },
1513     { "(bad)",  { XX } },
1514     { "(bad)",  { XX } },
1515     { "(bad)",  { XX } },
1516     { "(bad)",  { XX } },
1517     { "(bad)",  { XX } },
1518     { "(bad)",  { XX } },
1519     { "(bad)",  { XX } },
1520   },
1521   /* REG_C0 */
1522   {
1523     { "rolA",   { Eb, Ib } },
1524     { "rorA",   { Eb, Ib } },
1525     { "rclA",   { Eb, Ib } },
1526     { "rcrA",   { Eb, Ib } },
1527     { "shlA",   { Eb, Ib } },
1528     { "shrA",   { Eb, Ib } },
1529     { "(bad)",  { XX } },
1530     { "sarA",   { Eb, Ib } },
1531   },
1532   /* REG_C1 */
1533   {
1534     { "rolQ",   { Ev, Ib } },
1535     { "rorQ",   { Ev, Ib } },
1536     { "rclQ",   { Ev, Ib } },
1537     { "rcrQ",   { Ev, Ib } },
1538     { "shlQ",   { Ev, Ib } },
1539     { "shrQ",   { Ev, Ib } },
1540     { "(bad)",  { XX } },
1541     { "sarQ",   { Ev, Ib } },
1542   },
1543   /* REG_C6 */
1544   {
1545     { "movA",   { Eb, Ib } },
1546     { "(bad)",  { XX } },
1547     { "(bad)",  { XX } },
1548     { "(bad)",  { XX } },
1549     { "(bad)",  { XX } },
1550     { "(bad)",  { XX } },
1551     { "(bad)",  { XX } },
1552     { "(bad)",  { XX } },
1553   },
1554   /* REG_C7 */
1555   {
1556     { "movQ",   { Ev, Iv } },
1557     { "(bad)",  { XX } },
1558     { "(bad)",  { XX } },
1559     { "(bad)",  { XX } },
1560     { "(bad)",  { XX } },
1561     { "(bad)",  { XX } },
1562     { "(bad)",  { XX } },
1563     { "(bad)",  { XX } },
1564   },
1565   /* REG_D0 */
1566   {
1567     { "rolA",   { Eb, I1 } },
1568     { "rorA",   { Eb, I1 } },
1569     { "rclA",   { Eb, I1 } },
1570     { "rcrA",   { Eb, I1 } },
1571     { "shlA",   { Eb, I1 } },
1572     { "shrA",   { Eb, I1 } },
1573     { "(bad)",  { XX } },
1574     { "sarA",   { Eb, I1 } },
1575   },
1576   /* REG_D1 */
1577   {
1578     { "rolQ",   { Ev, I1 } },
1579     { "rorQ",   { Ev, I1 } },
1580     { "rclQ",   { Ev, I1 } },
1581     { "rcrQ",   { Ev, I1 } },
1582     { "shlQ",   { Ev, I1 } },
1583     { "shrQ",   { Ev, I1 } },
1584     { "(bad)",  { XX } },
1585     { "sarQ",   { Ev, I1 } },
1586   },
1587   /* REG_D2 */
1588   {
1589     { "rolA",   { Eb, CL } },
1590     { "rorA",   { Eb, CL } },
1591     { "rclA",   { Eb, CL } },
1592     { "rcrA",   { Eb, CL } },
1593     { "shlA",   { Eb, CL } },
1594     { "shrA",   { Eb, CL } },
1595     { "(bad)",  { XX } },
1596     { "sarA",   { Eb, CL } },
1597   },
1598   /* REG_D3 */
1599   {
1600     { "rolQ",   { Ev, CL } },
1601     { "rorQ",   { Ev, CL } },
1602     { "rclQ",   { Ev, CL } },
1603     { "rcrQ",   { Ev, CL } },
1604     { "shlQ",   { Ev, CL } },
1605     { "shrQ",   { Ev, CL } },
1606     { "(bad)",  { XX } },
1607     { "sarQ",   { Ev, CL } },
1608   },
1609   /* REG_F6 */
1610   {
1611     { "testA",  { Eb, Ib } },
1612     { "(bad)",  { XX } },
1613     { "notA",   { Eb } },
1614     { "negA",   { Eb } },
1615     { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
1616     { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
1617     { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
1618     { "idivA",  { Eb } },       /* and idiv for consistency.               */
1619   },
1620   /* REG_F7 */
1621   {
1622     { "testQ",  { Ev, Iv } },
1623     { "(bad)",  { XX } },
1624     { "notQ",   { Ev } },
1625     { "negQ",   { Ev } },
1626     { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
1627     { "imulQ",  { Ev } },
1628     { "divQ",   { Ev } },
1629     { "idivQ",  { Ev } },
1630   },
1631   /* REG_FE */
1632   {
1633     { "incA",   { Eb } },
1634     { "decA",   { Eb } },
1635     { "(bad)",  { XX } },
1636     { "(bad)",  { XX } },
1637     { "(bad)",  { XX } },
1638     { "(bad)",  { XX } },
1639     { "(bad)",  { XX } },
1640     { "(bad)",  { XX } },
1641   },
1642   /* REG_FF */
1643   {
1644     { "incQ",   { Ev } },
1645     { "decQ",   { Ev } },
1646     { "callT",  { indirEv } },
1647     { "JcallT", { indirEp } },
1648     { "jmpT",   { indirEv } },
1649     { "JjmpT",  { indirEp } },
1650     { "pushU",  { stackEv } },
1651     { "(bad)",  { XX } },
1652   },
1653   /* REG_0F00 */
1654   {
1655     { "sldtD",  { Sv } },
1656     { "strD",   { Sv } },
1657     { "lldt",   { Ew } },
1658     { "ltr",    { Ew } },
1659     { "verr",   { Ew } },
1660     { "verw",   { Ew } },
1661     { "(bad)",  { XX } },
1662     { "(bad)",  { XX } },
1663   },
1664   /* REG_0F01 */
1665   {
1666     { MOD_TABLE (MOD_0F01_REG_0) },
1667     { MOD_TABLE (MOD_0F01_REG_1) },
1668     { MOD_TABLE (MOD_0F01_REG_2) },
1669     { MOD_TABLE (MOD_0F01_REG_3) },
1670     { "smswD",  { Sv } },
1671     { "(bad)",  { XX } },
1672     { "lmsw",   { Ew } },
1673     { MOD_TABLE (MOD_0F01_REG_7) },
1674   },
1675   /* REG_0F0E */
1676   {
1677     { "prefetch",       { Eb } },
1678     { "prefetchw",      { Eb } },
1679     { "(bad)",          { XX } },
1680     { "(bad)",          { XX } },
1681     { "(bad)",          { XX } },
1682     { "(bad)",          { XX } },
1683     { "(bad)",          { XX } },
1684     { "(bad)",          { XX } },
1685   },
1686   /* REG_0F18 */
1687   {
1688     { MOD_TABLE (MOD_0F18_REG_0) },
1689     { MOD_TABLE (MOD_0F18_REG_1) },
1690     { MOD_TABLE (MOD_0F18_REG_2) },
1691     { MOD_TABLE (MOD_0F18_REG_3) },
1692     { "(bad)",  { XX } },
1693     { "(bad)",  { XX } },
1694     { "(bad)",  { XX } },
1695     { "(bad)",  { XX } },
1696   },
1697   /* REG_0F71 */
1698   {
1699     { "(bad)",  { XX } },
1700     { "(bad)",  { XX } },
1701     { MOD_TABLE (MOD_0F71_REG_2) },
1702     { "(bad)",  { XX } },
1703     { MOD_TABLE (MOD_0F71_REG_4) },
1704     { "(bad)",  { XX } },
1705     { MOD_TABLE (MOD_0F71_REG_6) },
1706     { "(bad)",  { XX } },
1707   },
1708   /* REG_0F72 */
1709   {
1710     { "(bad)",  { XX } },
1711     { "(bad)",  { XX } },
1712     { MOD_TABLE (MOD_0F72_REG_2) },
1713     { "(bad)",  { XX } },
1714     { MOD_TABLE (MOD_0F72_REG_4) },
1715     { "(bad)",  { XX } },
1716     { MOD_TABLE (MOD_0F72_REG_6) },
1717     { "(bad)",  { XX } },
1718   },
1719   /* REG_0F73 */
1720   {
1721     { "(bad)",  { XX } },
1722     { "(bad)",  { XX } },
1723     { MOD_TABLE (MOD_0F73_REG_2) },
1724     { MOD_TABLE (MOD_0F73_REG_3) },
1725     { "(bad)",  { XX } },
1726     { "(bad)",  { XX } },
1727     { MOD_TABLE (MOD_0F73_REG_6) },
1728     { MOD_TABLE (MOD_0F73_REG_7) },
1729   },
1730   /* REG_0FA6 */
1731   {
1732     { "montmul",        { { OP_0f07, 0 } } },
1733     { "xsha1",          { { OP_0f07, 0 } } },
1734     { "xsha256",        { { OP_0f07, 0 } } },
1735     { "(bad)",          { { OP_0f07, 0 } } },
1736     { "(bad)",          { { OP_0f07, 0 } } },
1737     { "(bad)",          { { OP_0f07, 0 } } },
1738     { "(bad)",          { { OP_0f07, 0 } } },
1739     { "(bad)",          { { OP_0f07, 0 } } },
1740   },
1741   /* REG_0FA7 */
1742   {
1743     { "xstore-rng",     { { OP_0f07, 0 } } },
1744     { "xcrypt-ecb",     { { OP_0f07, 0 } } },
1745     { "xcrypt-cbc",     { { OP_0f07, 0 } } },
1746     { "xcrypt-ctr",     { { OP_0f07, 0 } } },
1747     { "xcrypt-cfb",     { { OP_0f07, 0 } } },
1748     { "xcrypt-ofb",     { { OP_0f07, 0 } } },
1749     { "(bad)",          { { OP_0f07, 0 } } },
1750     { "(bad)",          { { OP_0f07, 0 } } },
1751   },
1752   /* REG_0FAE */
1753   {
1754     { MOD_TABLE (MOD_0FAE_REG_0) },
1755     { MOD_TABLE (MOD_0FAE_REG_1) },
1756     { MOD_TABLE (MOD_0FAE_REG_2) },
1757     { MOD_TABLE (MOD_0FAE_REG_3) },
1758     { "(bad)",  { XX } },
1759     { MOD_TABLE (MOD_0FAE_REG_5) },
1760     { MOD_TABLE (MOD_0FAE_REG_6) },
1761     { MOD_TABLE (MOD_0FAE_REG_7) },
1762   },
1763   /* REG_0FBA */
1764   {
1765     { "(bad)",  { XX } },
1766     { "(bad)",  { XX } },
1767     { "(bad)",  { XX } },
1768     { "(bad)",  { XX } },
1769     { "btQ",    { Ev, Ib } },
1770     { "btsQ",   { Ev, Ib } },
1771     { "btrQ",   { Ev, Ib } },
1772     { "btcQ",   { Ev, Ib } },
1773   },
1774   /* REG_0FC7 */
1775   {
1776     { "(bad)",  { XX } },
1777     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
1778     { "(bad)",  { XX } },
1779     { "(bad)",  { XX } },
1780     { "(bad)",  { XX } },
1781     { "(bad)",  { XX } },
1782     { MOD_TABLE (MOD_0FC7_REG_6) },
1783     { MOD_TABLE (MOD_0FC7_REG_7) },
1784   },
1785 };
1786
1787 static const struct dis386 prefix_table[][4] = {
1788   /* PREFIX_90 */
1789   {
1790     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1791     { "pause", { XX } },
1792     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1793     { "(bad)", { XX } },
1794   },
1795
1796   /* PREFIX_0F10 */
1797   {
1798     { "movups", { XM, EXx } },
1799     { "movss",  { XM, EXd } },
1800     { "movupd", { XM, EXx } },
1801     { "movsd",  { XM, EXq } },
1802   },
1803
1804   /* PREFIX_0F11 */
1805   {
1806     { "movups", { EXx, XM } },
1807     { "movss",  { EXd, XM } },
1808     { "movupd", { EXx, XM } },
1809     { "movsd",  { EXq, XM } },
1810   },
1811
1812   /* PREFIX_0F12 */
1813   {
1814     { MOD_TABLE (MOD_0F12_PREFIX_0) },
1815     { "movsldup", { XM, EXx } },
1816     { "movlpd", { XM, EXq } },
1817     { "movddup", { XM, EXq } },
1818   },
1819
1820   /* PREFIX_0F16 */
1821   {
1822     { MOD_TABLE (MOD_0F16_PREFIX_0) },
1823     { "movshdup", { XM, EXx } },
1824     { "movhpd", { XM, EXq } },
1825     { "(bad)",  { XX } },
1826   },
1827
1828   /* PREFIX_0F2A */
1829   {
1830     { "cvtpi2ps", { XM, EMCq } },
1831     { "cvtsi2ssY", { XM, Ev } },
1832     { "cvtpi2pd", { XM, EMCq } },
1833     { "cvtsi2sdY", { XM, Ev } },
1834   },
1835
1836   /* PREFIX_0F2B */
1837   {
1838     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
1839     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
1840     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
1841     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
1842   },
1843
1844   /* PREFIX_0F2C */
1845   {
1846     { "cvttps2pi", { MXC, EXq } },
1847     { "cvttss2siY", { Gv, EXd } },
1848     { "cvttpd2pi", { MXC, EXx } },
1849     { "cvttsd2siY", { Gv, EXq } },
1850   },
1851
1852   /* PREFIX_0F2D */
1853   {
1854     { "cvtps2pi", { MXC, EXq } },
1855     { "cvtss2siY", { Gv, EXd } },
1856     { "cvtpd2pi", { MXC, EXx } },
1857     { "cvtsd2siY", { Gv, EXq } },
1858   },
1859
1860   /* PREFIX_0F2E */
1861   {
1862     { "ucomiss",{ XM, EXd } }, 
1863     { "(bad)",  { XX } },
1864     { "ucomisd",{ XM, EXq } }, 
1865     { "(bad)",  { XX } },
1866   },
1867
1868   /* PREFIX_0F2F */
1869   {
1870     { "comiss", { XM, EXd } },
1871     { "(bad)",  { XX } },
1872     { "comisd", { XM, EXq } },
1873     { "(bad)",  { XX } },
1874   },
1875
1876   /* PREFIX_0F51 */
1877   {
1878     { "sqrtps", { XM, EXx } },
1879     { "sqrtss", { XM, EXd } },
1880     { "sqrtpd", { XM, EXx } },
1881     { "sqrtsd", { XM, EXq } },
1882   },
1883
1884   /* PREFIX_0F52 */
1885   {
1886     { "rsqrtps",{ XM, EXx } },
1887     { "rsqrtss",{ XM, EXd } },
1888     { "(bad)",  { XX } },
1889     { "(bad)",  { XX } },
1890   },
1891
1892   /* PREFIX_0F53 */
1893   {
1894     { "rcpps",  { XM, EXx } },
1895     { "rcpss",  { XM, EXd } },
1896     { "(bad)",  { XX } },
1897     { "(bad)",  { XX } },
1898   },
1899
1900   /* PREFIX_0F58 */
1901   {
1902     { "addps", { XM, EXx } },
1903     { "addss", { XM, EXd } },
1904     { "addpd", { XM, EXx } },
1905     { "addsd", { XM, EXq } },
1906   },
1907
1908   /* PREFIX_0F59 */
1909   {
1910     { "mulps",  { XM, EXx } },
1911     { "mulss",  { XM, EXd } },
1912     { "mulpd",  { XM, EXx } },
1913     { "mulsd",  { XM, EXq } },
1914   },
1915
1916   /* PREFIX_0F5A */
1917   {
1918     { "cvtps2pd", { XM, EXq } },
1919     { "cvtss2sd", { XM, EXd } },
1920     { "cvtpd2ps", { XM, EXx } },
1921     { "cvtsd2ss", { XM, EXq } },
1922   },
1923
1924   /* PREFIX_0F5B */
1925   {
1926     { "cvtdq2ps", { XM, EXx } },
1927     { "cvttps2dq", { XM, EXx } },
1928     { "cvtps2dq", { XM, EXx } },
1929     { "(bad)",  { XX } },
1930   },
1931
1932   /* PREFIX_0F5C */
1933   {
1934     { "subps",  { XM, EXx } },
1935     { "subss",  { XM, EXd } },
1936     { "subpd",  { XM, EXx } },
1937     { "subsd",  { XM, EXq } },
1938   },
1939
1940   /* PREFIX_0F5D */
1941   {
1942     { "minps",  { XM, EXx } },
1943     { "minss",  { XM, EXd } },
1944     { "minpd",  { XM, EXx } },
1945     { "minsd",  { XM, EXq } },
1946   },
1947
1948   /* PREFIX_0F5E */
1949   {
1950     { "divps",  { XM, EXx } },
1951     { "divss",  { XM, EXd } },
1952     { "divpd",  { XM, EXx } },
1953     { "divsd",  { XM, EXq } },
1954   },
1955
1956   /* PREFIX_0F5F */
1957   {
1958     { "maxps",  { XM, EXx } },
1959     { "maxss",  { XM, EXd } },
1960     { "maxpd",  { XM, EXx } },
1961     { "maxsd",  { XM, EXq } },
1962   },
1963
1964   /* PREFIX_0F60 */
1965   {
1966     { "punpcklbw",{ MX, EMd } },
1967     { "(bad)",  { XX } },
1968     { "punpcklbw",{ MX, EMx } },
1969     { "(bad)",  { XX } },
1970   },
1971
1972   /* PREFIX_0F61 */
1973   {
1974     { "punpcklwd",{ MX, EMd } },
1975     { "(bad)",  { XX } },
1976     { "punpcklwd",{ MX, EMx } },
1977     { "(bad)",  { XX } },
1978   },
1979
1980   /* PREFIX_0F62 */
1981   {
1982     { "punpckldq",{ MX, EMd } },
1983     { "(bad)",  { XX } },
1984     { "punpckldq",{ MX, EMx } },
1985     { "(bad)",  { XX } },
1986   },
1987
1988   /* PREFIX_0F6C */
1989   {
1990     { "(bad)",  { XX } },
1991     { "(bad)",  { XX } },
1992     { "punpcklqdq", { XM, EXx } },
1993     { "(bad)",  { XX } },
1994   },
1995
1996   /* PREFIX_0F6D */
1997   {
1998     { "(bad)",  { XX } },
1999     { "(bad)",  { XX } },
2000     { "punpckhqdq", { XM, EXx } },
2001     { "(bad)",  { XX } },
2002   },
2003
2004   /* PREFIX_0F6F */
2005   {
2006     { "movq",   { MX, EM } },
2007     { "movdqu", { XM, EXx } },
2008     { "movdqa", { XM, EXx } },
2009     { "(bad)",  { XX } },
2010   },
2011
2012   /* PREFIX_0F70 */
2013   {
2014     { "pshufw", { MX, EM, Ib } },
2015     { "pshufhw",{ XM, EXx, Ib } },
2016     { "pshufd", { XM, EXx, Ib } },
2017     { "pshuflw",{ XM, EXx, Ib } },
2018   },
2019
2020   /* PREFIX_0F73_REG_3 */
2021   {
2022     { "(bad)",  { XX } },
2023     { "(bad)",  { XX } },
2024     { "psrldq", { XS, Ib } },
2025     { "(bad)",  { XX } },
2026   },
2027
2028   /* PREFIX_0F73_REG_7 */
2029   {
2030     { "(bad)",  { XX } },
2031     { "(bad)",  { XX } },
2032     { "pslldq", { XS, Ib } },
2033     { "(bad)",  { XX } },
2034   },
2035
2036   /* PREFIX_0F78 */
2037   {
2038     {"vmread",  { Em, Gm } },
2039     {"(bad)",   { XX } },
2040     {"extrq",   { XS, Ib, Ib } },
2041     {"insertq", { XM, XS, Ib, Ib } },
2042   },
2043
2044   /* PREFIX_0F79 */
2045   {
2046     {"vmwrite", { Gm, Em } },
2047     {"(bad)",   { XX } },
2048     {"extrq",   { XM, XS } },
2049     {"insertq", { XM, XS } },
2050   },
2051
2052   /* PREFIX_0F7C */
2053   {
2054     { "(bad)",  { XX } },
2055     { "(bad)",  { XX } },
2056     { "haddpd", { XM, EXx } },
2057     { "haddps", { XM, EXx } },
2058   },
2059
2060   /* PREFIX_0F7D */
2061   {
2062     { "(bad)",  { XX } },
2063     { "(bad)",  { XX } },
2064     { "hsubpd", { XM, EXx } },
2065     { "hsubps", { XM, EXx } },
2066   },
2067
2068   /* PREFIX_0F7E */
2069   {
2070     { "movK",   { Edq, MX } },
2071     { "movq",   { XM, EXq } },
2072     { "movK",   { Edq, XM } },
2073     { "(bad)",  { XX } },
2074   },
2075
2076   /* PREFIX_0F7F */
2077   {
2078     { "movq",   { EM, MX } },
2079     { "movdqu", { EXx, XM } },
2080     { "movdqa", { EXx, XM } },
2081     { "(bad)",  { XX } },
2082   },
2083
2084   /* PREFIX_0FB8 */
2085   {
2086     { "(bad)", { XX } },
2087     { "popcntS", { Gv, Ev } },
2088     { "(bad)", { XX } },
2089     { "(bad)", { XX } },
2090   },
2091
2092   /* PREFIX_0FBD */
2093   {
2094     { "bsrS",   { Gv, Ev } },
2095     { "lzcntS", { Gv, Ev } },
2096     { "bsrS",   { Gv, Ev } },
2097     { "(bad)",  { XX } },
2098   },
2099
2100   /* PREFIX_0FC2 */
2101   {
2102     { "cmpps",  { XM, EXx, CMP } },
2103     { "cmpss",  { XM, EXd, CMP } },
2104     { "cmppd",  { XM, EXx, CMP } },
2105     { "cmpsd",  { XM, EXq, CMP } },
2106   },
2107
2108   /* PREFIX_0FC7_REG_6 */
2109   {
2110     { "vmptrld",{ Mq } },
2111     { "vmxon",  { Mq } },
2112     { "vmclear",{ Mq } },
2113     { "(bad)",  { XX } },
2114   },
2115
2116   /* PREFIX_0FD0 */
2117   {
2118     { "(bad)",  { XX } },
2119     { "(bad)",  { XX } },
2120     { "addsubpd", { XM, EXx } },
2121     { "addsubps", { XM, EXx } },
2122   },
2123
2124   /* PREFIX_0FD6 */
2125   {
2126     { "(bad)",  { XX } },
2127     { "movq2dq",{ XM, MS } },
2128     { "movq",   { EXq, XM } },
2129     { "movdq2q",{ MX, XS } },
2130   },
2131
2132   /* PREFIX_0FE6 */
2133   {
2134     { "(bad)",  { XX } },
2135     { "cvtdq2pd", { XM, EXq } },
2136     { "cvttpd2dq", { XM, EXx } },
2137     { "cvtpd2dq", { XM, EXx } },
2138   },
2139
2140   /* PREFIX_0FE7 */
2141   {
2142     { "movntq", { EM, MX } },
2143     { "(bad)",  { XX } },
2144     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2145     { "(bad)",  { XX } },
2146   },
2147
2148   /* PREFIX_0FF0 */
2149   {
2150     { "(bad)",  { XX } },
2151     { "(bad)",  { XX } },
2152     { "(bad)",  { XX } },
2153     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2154   },
2155
2156   /* PREFIX_0FF7 */
2157   {
2158     { "maskmovq", { MX, MS } },
2159     { "(bad)",  { XX } },
2160     { "maskmovdqu", { XM, XS } },
2161     { "(bad)",  { XX } },
2162   },
2163
2164   /* PREFIX_0F3810 */
2165   {
2166     { "(bad)",  { XX } },
2167     { "(bad)",  { XX } },
2168     { "pblendvb", { XM, EXx, XMM0 } },
2169     { "(bad)",  { XX } },
2170   },
2171
2172   /* PREFIX_0F3814 */
2173   {
2174     { "(bad)",  { XX } },
2175     { "(bad)",  { XX } },
2176     { "blendvps", { XM, EXx, XMM0 } },
2177     { "(bad)",  { XX } },
2178   },
2179
2180   /* PREFIX_0F3815 */
2181   {
2182     { "(bad)",  { XX } },
2183     { "(bad)",  { XX } },
2184     { "blendvpd", { XM, EXx, XMM0 } },
2185     { "(bad)",  { XX } },
2186   },
2187
2188   /* PREFIX_0F3817 */
2189   {
2190     { "(bad)",  { XX } },
2191     { "(bad)",  { XX } },
2192     { "ptest",  { XM, EXx } },
2193     { "(bad)",  { XX } },
2194   },
2195
2196   /* PREFIX_0F3820 */
2197   {
2198     { "(bad)",  { XX } },
2199     { "(bad)",  { XX } },
2200     { "pmovsxbw", { XM, EXq } },
2201     { "(bad)",  { XX } },
2202   },
2203
2204   /* PREFIX_0F3821 */
2205   {
2206     { "(bad)",  { XX } },
2207     { "(bad)",  { XX } },
2208     { "pmovsxbd", { XM, EXd } },
2209     { "(bad)",  { XX } },
2210   },
2211
2212   /* PREFIX_0F3822 */
2213   {
2214     { "(bad)",  { XX } },
2215     { "(bad)",  { XX } },
2216     { "pmovsxbq", { XM, EXw } },
2217     { "(bad)",  { XX } },
2218   },
2219
2220   /* PREFIX_0F3823 */
2221   {
2222     { "(bad)",  { XX } },
2223     { "(bad)",  { XX } },
2224     { "pmovsxwd", { XM, EXq } },
2225     { "(bad)",  { XX } },
2226   },
2227
2228   /* PREFIX_0F3824 */
2229   {
2230     { "(bad)",  { XX } },
2231     { "(bad)",  { XX } },
2232     { "pmovsxwq", { XM, EXd } },
2233     { "(bad)",  { XX } },
2234   },
2235
2236   /* PREFIX_0F3825 */
2237   {
2238     { "(bad)",  { XX } },
2239     { "(bad)",  { XX } },
2240     { "pmovsxdq", { XM, EXq } },
2241     { "(bad)",  { XX } },
2242   },
2243
2244   /* PREFIX_0F3828 */
2245   {
2246     { "(bad)",  { XX } },
2247     { "(bad)",  { XX } },
2248     { "pmuldq", { XM, EXx } },
2249     { "(bad)",  { XX } },
2250   },
2251
2252   /* PREFIX_0F3829 */
2253   {
2254     { "(bad)",  { XX } },
2255     { "(bad)",  { XX } },
2256     { "pcmpeqq", { XM, EXx } },
2257     { "(bad)",  { XX } },
2258   },
2259
2260   /* PREFIX_0F382A */
2261   {
2262     { "(bad)",  { XX } },
2263     { "(bad)",  { XX } },
2264     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2265     { "(bad)",  { XX } },
2266   },
2267
2268   /* PREFIX_0F382B */
2269   {
2270     { "(bad)",  { XX } },
2271     { "(bad)",  { XX } },
2272     { "packusdw", { XM, EXx } },
2273     { "(bad)",  { XX } },
2274   },
2275
2276   /* PREFIX_0F3830 */
2277   {
2278     { "(bad)",  { XX } },
2279     { "(bad)",  { XX } },
2280     { "pmovzxbw", { XM, EXq } },
2281     { "(bad)",  { XX } },
2282   },
2283
2284   /* PREFIX_0F3831 */
2285   {
2286     { "(bad)",  { XX } },
2287     { "(bad)",  { XX } },
2288     { "pmovzxbd", { XM, EXd } },
2289     { "(bad)",  { XX } },
2290   },
2291
2292   /* PREFIX_0F3832 */
2293   {
2294     { "(bad)",  { XX } },
2295     { "(bad)",  { XX } },
2296     { "pmovzxbq", { XM, EXw } },
2297     { "(bad)",  { XX } },
2298   },
2299
2300   /* PREFIX_0F3833 */
2301   {
2302     { "(bad)",  { XX } },
2303     { "(bad)",  { XX } },
2304     { "pmovzxwd", { XM, EXq } },
2305     { "(bad)",  { XX } },
2306   },
2307
2308   /* PREFIX_0F3834 */
2309   {
2310     { "(bad)",  { XX } },
2311     { "(bad)",  { XX } },
2312     { "pmovzxwq", { XM, EXd } },
2313     { "(bad)",  { XX } },
2314   },
2315
2316   /* PREFIX_0F3835 */
2317   {
2318     { "(bad)",  { XX } },
2319     { "(bad)",  { XX } },
2320     { "pmovzxdq", { XM, EXq } },
2321     { "(bad)",  { XX } },
2322   },
2323
2324   /* PREFIX_0F3837 */
2325   {
2326     { "(bad)",  { XX } },
2327     { "(bad)",  { XX } },
2328     { "pcmpgtq", { XM, EXx } },
2329     { "(bad)",  { XX } },
2330   },
2331
2332   /* PREFIX_0F3838 */
2333   {
2334     { "(bad)",  { XX } },
2335     { "(bad)",  { XX } },
2336     { "pminsb", { XM, EXx } },
2337     { "(bad)",  { XX } },
2338   },
2339
2340   /* PREFIX_0F3839 */
2341   {
2342     { "(bad)",  { XX } },
2343     { "(bad)",  { XX } },
2344     { "pminsd", { XM, EXx } },
2345     { "(bad)",  { XX } },
2346   },
2347
2348   /* PREFIX_0F383A */
2349   {
2350     { "(bad)",  { XX } },
2351     { "(bad)",  { XX } },
2352     { "pminuw", { XM, EXx } },
2353     { "(bad)",  { XX } },
2354   },
2355
2356   /* PREFIX_0F383B */
2357   {
2358     { "(bad)",  { XX } },
2359     { "(bad)",  { XX } },
2360     { "pminud", { XM, EXx } },
2361     { "(bad)",  { XX } },
2362   },
2363
2364   /* PREFIX_0F383C */
2365   {
2366     { "(bad)",  { XX } },
2367     { "(bad)",  { XX } },
2368     { "pmaxsb", { XM, EXx } },
2369     { "(bad)",  { XX } },
2370   },
2371
2372   /* PREFIX_0F383D */
2373   {
2374     { "(bad)",  { XX } },
2375     { "(bad)",  { XX } },
2376     { "pmaxsd", { XM, EXx } },
2377     { "(bad)",  { XX } },
2378   },
2379
2380   /* PREFIX_0F383E */
2381   {
2382     { "(bad)",  { XX } },
2383     { "(bad)",  { XX } },
2384     { "pmaxuw", { XM, EXx } },
2385     { "(bad)",  { XX } },
2386   },
2387
2388   /* PREFIX_0F383F */
2389   {
2390     { "(bad)",  { XX } },
2391     { "(bad)",  { XX } },
2392     { "pmaxud", { XM, EXx } },
2393     { "(bad)",  { XX } },
2394   },
2395
2396   /* PREFIX_0F3840 */
2397   {
2398     { "(bad)",  { XX } },
2399     { "(bad)",  { XX } },
2400     { "pmulld", { XM, EXx } },
2401     { "(bad)",  { XX } },
2402   },
2403
2404   /* PREFIX_0F3841 */
2405   {
2406     { "(bad)",  { XX } },
2407     { "(bad)",  { XX } },
2408     { "phminposuw", { XM, EXx } },
2409     { "(bad)",  { XX } },
2410   },
2411
2412   /* PREFIX_0F38F0 */
2413   {
2414     { "(bad)",  { XX } },
2415     { "(bad)",  { XX } },
2416     { "(bad)",  { XX } },
2417     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },     
2418   },
2419
2420   /* PREFIX_0F38F1 */
2421   {
2422     { "(bad)",  { XX } },
2423     { "(bad)",  { XX } },
2424     { "(bad)",  { XX } },
2425     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },     
2426   },
2427
2428   /* PREFIX_0F3A08 */
2429   {
2430     { "(bad)",  { XX } },
2431     { "(bad)",  { XX } },
2432     { "roundps", { XM, EXx, Ib } },
2433     { "(bad)",  { XX } },
2434   },
2435
2436   /* PREFIX_0F3A09 */
2437   {
2438     { "(bad)",  { XX } },
2439     { "(bad)",  { XX } },
2440     { "roundpd", { XM, EXx, Ib } },
2441     { "(bad)",  { XX } },
2442   },
2443
2444   /* PREFIX_0F3A0A */
2445   {
2446     { "(bad)",  { XX } },
2447     { "(bad)",  { XX } },
2448     { "roundss", { XM, EXd, Ib } },
2449     { "(bad)",  { XX } },
2450   },
2451
2452   /* PREFIX_0F3A0B */
2453   {
2454     { "(bad)",  { XX } },
2455     { "(bad)",  { XX } },
2456     { "roundsd", { XM, EXq, Ib } },
2457     { "(bad)",  { XX } },
2458   },
2459
2460   /* PREFIX_0F3A0C */
2461   {
2462     { "(bad)",  { XX } },
2463     { "(bad)",  { XX } },
2464     { "blendps", { XM, EXx, Ib } },
2465     { "(bad)",  { XX } },
2466   },
2467
2468   /* PREFIX_0F3A0D */
2469   {
2470     { "(bad)",  { XX } },
2471     { "(bad)",  { XX } },
2472     { "blendpd", { XM, EXx, Ib } },
2473     { "(bad)",  { XX } },
2474   },
2475
2476   /* PREFIX_0F3A0E */
2477   {
2478     { "(bad)",  { XX } },
2479     { "(bad)",  { XX } },
2480     { "pblendw", { XM, EXx, Ib } },
2481     { "(bad)",  { XX } },
2482   },
2483
2484   /* PREFIX_0F3A14 */
2485   {
2486     { "(bad)",  { XX } },
2487     { "(bad)",  { XX } },
2488     { "pextrb", { Edqb, XM, Ib } },
2489     { "(bad)",  { XX } },
2490   },
2491
2492   /* PREFIX_0F3A15 */
2493   {
2494     { "(bad)",  { XX } },
2495     { "(bad)",  { XX } },
2496     { "pextrw", { Edqw, XM, Ib } },
2497     { "(bad)",  { XX } },
2498   },
2499
2500   /* PREFIX_0F3A16 */
2501   {
2502     { "(bad)",  { XX } },
2503     { "(bad)",  { XX } },
2504     { "pextrK", { Edq, XM, Ib } },
2505     { "(bad)",  { XX } },
2506   },
2507
2508   /* PREFIX_0F3A17 */
2509   {
2510     { "(bad)",  { XX } },
2511     { "(bad)",  { XX } },
2512     { "extractps", { Edqd, XM, Ib } },
2513     { "(bad)",  { XX } },
2514   },
2515
2516   /* PREFIX_0F3A20 */
2517   {
2518     { "(bad)",  { XX } },
2519     { "(bad)",  { XX } },
2520     { "pinsrb", { XM, Edqb, Ib } },
2521     { "(bad)",  { XX } },
2522   },
2523
2524   /* PREFIX_0F3A21 */
2525   {
2526     { "(bad)",  { XX } },
2527     { "(bad)",  { XX } },
2528     { "insertps", { XM, EXd, Ib } },
2529     { "(bad)",  { XX } },
2530   },
2531
2532   /* PREFIX_0F3A22 */
2533   {
2534     { "(bad)",  { XX } },
2535     { "(bad)",  { XX } },
2536     { "pinsrK", { XM, Edq, Ib } },
2537     { "(bad)",  { XX } },
2538   },
2539
2540   /* PREFIX_0F3A40 */
2541   {
2542     { "(bad)",  { XX } },
2543     { "(bad)",  { XX } },
2544     { "dpps",   { XM, EXx, Ib } },
2545     { "(bad)",  { XX } },
2546   },
2547
2548   /* PREFIX_0F3A41 */
2549   {
2550     { "(bad)",  { XX } },
2551     { "(bad)",  { XX } },
2552     { "dppd",   { XM, EXx, Ib } },
2553     { "(bad)",  { XX } },
2554   },
2555
2556   /* PREFIX_0F3A42 */
2557   {
2558     { "(bad)",  { XX } },
2559     { "(bad)",  { XX } },
2560     { "mpsadbw", { XM, EXx, Ib } },
2561     { "(bad)",  { XX } },
2562   },
2563
2564   /* PREFIX_0F3A60 */
2565   {
2566     { "(bad)",  { XX } },
2567     { "(bad)",  { XX } },
2568     { "pcmpestrm", { XM, EXx, Ib } },
2569     { "(bad)",  { XX } },
2570   },
2571
2572   /* PREFIX_0F3A61 */
2573   {
2574     { "(bad)",  { XX } },
2575     { "(bad)",  { XX } },
2576     { "pcmpestri", { XM, EXx, Ib } },
2577     { "(bad)",  { XX } },
2578   },
2579
2580   /* PREFIX_0F3A62 */
2581   {
2582     { "(bad)",  { XX } },
2583     { "(bad)",  { XX } },
2584     { "pcmpistrm", { XM, EXx, Ib } },
2585     { "(bad)",  { XX } },
2586   },
2587
2588   /* PREFIX_0F3A63 */
2589   {
2590     { "(bad)",  { XX } },
2591     { "(bad)",  { XX } },
2592     { "pcmpistri", { XM, EXx, Ib } },
2593     { "(bad)",  { XX } },
2594   },
2595 };
2596
2597 static const struct dis386 x86_64_table[][2] = {
2598   /* X86_64_06 */
2599   {
2600     { "push{T|}", { es } },
2601     { "(bad)", { XX } },
2602   },
2603
2604   /* X86_64_07 */
2605   {
2606     { "pop{T|}", { es } },
2607     { "(bad)", { XX } },
2608   },
2609
2610   /* X86_64_0D */
2611   {
2612     { "push{T|}", { cs } },
2613     { "(bad)", { XX } },
2614   },
2615
2616   /* X86_64_16 */
2617   {
2618     { "push{T|}", { ss } },
2619     { "(bad)", { XX } },
2620   },
2621
2622   /* X86_64_17 */
2623   {
2624     { "pop{T|}", { ss } },
2625     { "(bad)", { XX } },
2626   },
2627
2628   /* X86_64_1E */
2629   {
2630     { "push{T|}", { ds } },
2631     { "(bad)", { XX } },
2632   },
2633
2634   /* X86_64_1F */
2635   {
2636     { "pop{T|}", { ds } },
2637     { "(bad)", { XX } },
2638   },
2639
2640   /* X86_64_27 */
2641   {
2642     { "daa", { XX } },
2643     { "(bad)", { XX } },
2644   },
2645
2646   /* X86_64_2F */
2647   {
2648     { "das", { XX } },
2649     { "(bad)", { XX } },
2650   },
2651
2652   /* X86_64_37 */
2653   {
2654     { "aaa", { XX } },
2655     { "(bad)", { XX } },
2656   },
2657
2658   /* X86_64_3F */
2659   {
2660     { "aas", { XX } },
2661     { "(bad)", { XX } },
2662   },
2663
2664   /* X86_64_60 */
2665   {
2666     { "pusha{P|}", { XX } },
2667     { "(bad)", { XX } },
2668   },
2669
2670   /* X86_64_61 */
2671   {
2672     { "popa{P|}", { XX } },
2673     { "(bad)", { XX } },
2674   },
2675
2676   /* X86_64_62 */
2677   {
2678     { MOD_TABLE (MOD_62_32BIT) },
2679     { "(bad)", { XX } },
2680   },
2681
2682   /* X86_64_63 */
2683   {
2684     { "arpl", { Ew, Gw } },
2685     { "movs{lq|xd}", { Gv, Ed } },
2686   },
2687
2688   /* X86_64_6D */
2689   {
2690     { "ins{R|}", { Yzr, indirDX } },
2691     { "ins{G|}", { Yzr, indirDX } },
2692   },
2693
2694   /* X86_64_6F */
2695   {
2696     { "outs{R|}", { indirDXr, Xz } },
2697     { "outs{G|}", { indirDXr, Xz } },
2698   },
2699
2700   /* X86_64_9A */
2701   {
2702     { "Jcall{T|}", { Ap } },
2703     { "(bad)", { XX } },
2704   },
2705
2706   /* X86_64_C4 */
2707   {
2708     { MOD_TABLE (MOD_C4_32BIT) },
2709     { "(bad)", { XX } },
2710   },
2711
2712   /* X86_64_C5 */
2713   {
2714     { MOD_TABLE (MOD_C5_32BIT) },
2715     { "(bad)", { XX } },
2716   },
2717
2718   /* X86_64_CE */
2719   {
2720     { "into", { XX } },
2721     { "(bad)", { XX } },
2722   },
2723
2724   /* X86_64_D4 */
2725   {
2726     { "aam", { sIb } },
2727     { "(bad)", { XX } },
2728   },
2729
2730   /* X86_64_D5 */
2731   {
2732     { "aad", { sIb } },
2733     { "(bad)", { XX } },
2734   },
2735
2736   /* X86_64_EA */
2737   {
2738     { "Jjmp{T|}", { Ap } },
2739     { "(bad)", { XX } },
2740   },
2741
2742   /* X86_64_0F01_REG_0 */
2743   {
2744     { "sgdt{Q|IQ}", { M } },
2745     { "sgdt", { M } },
2746   },
2747
2748   /* X86_64_0F01_REG_1 */
2749   {
2750     { "sidt{Q|IQ}", { M } },
2751     { "sidt", { M } },
2752   },
2753
2754   /* X86_64_0F01_REG_2 */
2755   {
2756     { "lgdt{Q|Q}", { M } },
2757     { "lgdt", { M } },
2758   },
2759
2760   /* X86_64_0F01_REG_3 */
2761   {
2762     { "lidt{Q|Q}", { M } },
2763     { "lidt", { M } },
2764   },
2765 };
2766
2767 static const struct dis386 three_byte_table[][256] = {
2768   /* THREE_BYTE_0F24 */
2769   {
2770     /* 00 */
2771     { "fmaddps",        { { OP_DREX4, q_mode } } },
2772     { "fmaddpd",        { { OP_DREX4, q_mode } } },
2773     { "fmaddss",        { { OP_DREX4, w_mode } } },
2774     { "fmaddsd",        { { OP_DREX4, d_mode } } },
2775     { "fmaddps",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2776     { "fmaddpd",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2777     { "fmaddss",        { { OP_DREX4, DREX_OC1 + w_mode } } },
2778     { "fmaddsd",        { { OP_DREX4, DREX_OC1 + d_mode } } },
2779     /* 08 */
2780     { "fmsubps",        { { OP_DREX4, q_mode } } },
2781     { "fmsubpd",        { { OP_DREX4, q_mode } } },
2782     { "fmsubss",        { { OP_DREX4, w_mode } } },
2783     { "fmsubsd",        { { OP_DREX4, d_mode } } },
2784     { "fmsubps",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2785     { "fmsubpd",        { { OP_DREX4, DREX_OC1 + q_mode } } },
2786     { "fmsubss",        { { OP_DREX4, DREX_OC1 + w_mode } } },
2787     { "fmsubsd",        { { OP_DREX4, DREX_OC1 + d_mode } } },
2788     /* 10 */
2789     { "fnmaddps",       { { OP_DREX4, q_mode } } },
2790     { "fnmaddpd",       { { OP_DREX4, q_mode } } },
2791     { "fnmaddss",       { { OP_DREX4, w_mode } } },
2792     { "fnmaddsd",       { { OP_DREX4, d_mode } } },
2793     { "fnmaddps",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2794     { "fnmaddpd",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2795     { "fnmaddss",       { { OP_DREX4, DREX_OC1 + w_mode } } },
2796     { "fnmaddsd",       { { OP_DREX4, DREX_OC1 + d_mode } } },
2797     /* 18 */
2798     { "fnmsubps",       { { OP_DREX4, q_mode } } },
2799     { "fnmsubpd",       { { OP_DREX4, q_mode } } },
2800     { "fnmsubss",       { { OP_DREX4, w_mode } } },
2801     { "fnmsubsd",       { { OP_DREX4, d_mode } } },
2802     { "fnmsubps",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2803     { "fnmsubpd",       { { OP_DREX4, DREX_OC1 + q_mode } } },
2804     { "fnmsubss",       { { OP_DREX4, DREX_OC1 + w_mode } } },
2805     { "fnmsubsd",       { { OP_DREX4, DREX_OC1 + d_mode } } },
2806     /* 20 */
2807     { "permps",         { { OP_DREX4, q_mode } } },
2808     { "permpd",         { { OP_DREX4, q_mode } } },
2809     { "pcmov",          { { OP_DREX4, q_mode } } },
2810     { "pperm",          { { OP_DREX4, q_mode } } },
2811     { "permps",         { { OP_DREX4, DREX_OC1 + q_mode } } },
2812     { "permpd",         { { OP_DREX4, DREX_OC1 + q_mode } } },
2813     { "pcmov",          { { OP_DREX4, DREX_OC1 + w_mode } } },
2814     { "pperm",          { { OP_DREX4, DREX_OC1 + d_mode } } },
2815     /* 28 */
2816     { "(bad)",          { XX } },
2817     { "(bad)",          { XX } },
2818     { "(bad)",          { XX } },
2819     { "(bad)",          { XX } },
2820     { "(bad)",          { XX } },
2821     { "(bad)",          { XX } },
2822     { "(bad)",          { XX } },
2823     { "(bad)",          { XX } },
2824     /* 30 */
2825     { "(bad)",          { XX } },
2826     { "(bad)",          { XX } },
2827     { "(bad)",          { XX } },
2828     { "(bad)",          { XX } },
2829     { "(bad)",          { XX } },
2830     { "(bad)",          { XX } },
2831     { "(bad)",          { XX } },
2832     { "(bad)",          { XX } },
2833     /* 38 */
2834     { "(bad)",          { XX } },
2835     { "(bad)",          { XX } },
2836     { "(bad)",          { XX } },
2837     { "(bad)",          { XX } },
2838     { "(bad)",          { XX } },
2839     { "(bad)",          { XX } },
2840     { "(bad)",          { XX } },
2841     { "(bad)",          { XX } },
2842     /* 40 */
2843     { "protb",          { { OP_DREX3, q_mode } } },
2844     { "protw",          { { OP_DREX3, q_mode } } },
2845     { "protd",          { { OP_DREX3, q_mode } } },
2846     { "protq",          { { OP_DREX3, q_mode } } },
2847     { "pshlb",          { { OP_DREX3, q_mode } } },
2848     { "pshlw",          { { OP_DREX3, q_mode } } },
2849     { "pshld",          { { OP_DREX3, q_mode } } },
2850     { "pshlq",          { { OP_DREX3, q_mode } } },
2851     /* 48 */
2852     { "pshab",          { { OP_DREX3, q_mode } } },
2853     { "pshaw",          { { OP_DREX3, q_mode } } },
2854     { "pshad",          { { OP_DREX3, q_mode } } },
2855     { "pshaq",          { { OP_DREX3, q_mode } } },
2856     { "(bad)",          { XX } },
2857     { "(bad)",          { XX } },
2858     { "(bad)",          { XX } },
2859     { "(bad)",          { XX } },
2860     /* 50 */
2861     { "(bad)",          { XX } },
2862     { "(bad)",          { XX } },
2863     { "(bad)",          { XX } },
2864     { "(bad)",          { XX } },
2865     { "(bad)",          { XX } },
2866     { "(bad)",          { XX } },
2867     { "(bad)",          { XX } },
2868     { "(bad)",          { XX } },
2869     /* 58 */
2870     { "(bad)",          { XX } },
2871     { "(bad)",          { XX } },
2872     { "(bad)",          { XX } },
2873     { "(bad)",          { XX } },
2874     { "(bad)",          { XX } },
2875     { "(bad)",          { XX } },
2876     { "(bad)",          { XX } },
2877     { "(bad)",          { XX } },
2878     /* 60 */
2879     { "(bad)",          { XX } },
2880     { "(bad)",          { XX } },
2881     { "(bad)",          { XX } },
2882     { "(bad)",          { XX } },
2883     { "(bad)",          { XX } },
2884     { "(bad)",          { XX } },
2885     { "(bad)",          { XX } },
2886     { "(bad)",          { XX } },
2887     /* 68 */
2888     { "(bad)",          { XX } },
2889     { "(bad)",          { XX } },
2890     { "(bad)",          { XX } },
2891     { "(bad)",          { XX } },
2892     { "(bad)",          { XX } },
2893     { "(bad)",          { XX } },
2894     { "(bad)",          { XX } },
2895     { "(bad)",          { XX } },
2896     /* 70 */
2897     { "(bad)",          { XX } },
2898     { "(bad)",          { XX } },
2899     { "(bad)",          { XX } },
2900     { "(bad)",          { XX } },
2901     { "(bad)",          { XX } },
2902     { "(bad)",          { XX } },
2903     { "(bad)",          { XX } },
2904     { "(bad)",          { XX } },
2905     /* 78 */
2906     { "(bad)",          { XX } },
2907     { "(bad)",          { XX } },
2908     { "(bad)",          { XX } },
2909     { "(bad)",          { XX } },
2910     { "(bad)",          { XX } },
2911     { "(bad)",          { XX } },
2912     { "(bad)",          { XX } },
2913     { "(bad)",          { XX } },
2914     /* 80 */
2915     { "(bad)",          { XX } },
2916     { "(bad)",          { XX } },
2917     { "(bad)",          { XX } },
2918     { "(bad)",          { XX } },
2919     { "(bad)",          { XX } },
2920     { "pmacssww",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2921     { "pmacsswd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2922     { "pmacssdql",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2923     /* 88 */
2924     { "(bad)",          { XX } },
2925     { "(bad)",          { XX } },
2926     { "(bad)",          { XX } },
2927     { "(bad)",          { XX } },
2928     { "(bad)",          { XX } },
2929     { "(bad)",          { XX } },
2930     { "pmacssdd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2931     { "pmacssdqh",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2932     /* 90 */
2933     { "(bad)",          { XX } },
2934     { "(bad)",          { XX } },
2935     { "(bad)",          { XX } },
2936     { "(bad)",          { XX } },
2937     { "(bad)",          { XX } },
2938     { "pmacsww",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2939     { "pmacswd",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2940     { "pmacsdql",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2941     /* 98 */
2942     { "(bad)",          { XX } },
2943     { "(bad)",          { XX } },
2944     { "(bad)",          { XX } },
2945     { "(bad)",          { XX } },
2946     { "(bad)",          { XX } },
2947     { "(bad)",          { XX } },
2948     { "pmacsdd",        { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2949     { "pmacsdqh",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2950     /* a0 */
2951     { "(bad)",          { XX } },
2952     { "(bad)",          { XX } },
2953     { "(bad)",          { XX } },
2954     { "(bad)",          { XX } },
2955     { "(bad)",          { XX } },
2956     { "(bad)",          { XX } },
2957     { "pmadcsswd",      { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2958     { "(bad)",          { XX } },
2959     /* a8 */
2960     { "(bad)",          { XX } },
2961     { "(bad)",          { XX } },
2962     { "(bad)",          { XX } },
2963     { "(bad)",          { XX } },
2964     { "(bad)",          { XX } },
2965     { "(bad)",          { XX } },
2966     { "(bad)",          { XX } },
2967     { "(bad)",          { XX } },
2968     /* b0 */
2969     { "(bad)",          { XX } },
2970     { "(bad)",          { XX } },
2971     { "(bad)",          { XX } },
2972     { "(bad)",          { XX } },
2973     { "(bad)",          { XX } },
2974     { "(bad)",          { XX } },
2975     { "pmadcswd",       { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
2976     { "(bad)",          { XX } },
2977     /* b8 */
2978     { "(bad)",          { XX } },
2979     { "(bad)",          { XX } },
2980     { "(bad)",          { XX } },
2981     { "(bad)",          { XX } },
2982     { "(bad)",          { XX } },
2983     { "(bad)",          { XX } },
2984     { "(bad)",          { XX } },
2985     { "(bad)",          { XX } },
2986     /* c0 */
2987     { "(bad)",          { XX } },
2988     { "(bad)",          { XX } },
2989     { "(bad)",          { XX } },
2990     { "(bad)",          { XX } },
2991     { "(bad)",          { XX } },
2992     { "(bad)",          { XX } },
2993     { "(bad)",          { XX } },
2994     { "(bad)",          { XX } },
2995     /* c8 */
2996     { "(bad)",          { XX } },
2997     { "(bad)",          { XX } },
2998     { "(bad)",          { XX } },
2999     { "(bad)",          { XX } },
3000     { "(bad)",          { XX } },
3001     { "(bad)",          { XX } },
3002     { "(bad)",          { XX } },
3003     { "(bad)",          { XX } },
3004     /* d0 */
3005     { "(bad)",          { XX } },
3006     { "(bad)",          { XX } },
3007     { "(bad)",          { XX } },
3008     { "(bad)",          { XX } },
3009     { "(bad)",          { XX } },
3010     { "(bad)",          { XX } },
3011     { "(bad)",          { XX } },
3012     { "(bad)",          { XX } },
3013     /* d8 */
3014     { "(bad)",          { XX } },
3015     { "(bad)",          { XX } },
3016     { "(bad)",          { XX } },
3017     { "(bad)",          { XX } },
3018     { "(bad)",          { XX } },
3019     { "(bad)",          { XX } },
3020     { "(bad)",          { XX } },
3021     { "(bad)",          { XX } },
3022     /* e0 */
3023     { "(bad)",          { XX } },
3024     { "(bad)",          { XX } },
3025     { "(bad)",          { XX } },
3026     { "(bad)",          { XX } },
3027     { "(bad)",          { XX } },
3028     { "(bad)",          { XX } },
3029     { "(bad)",          { XX } },
3030     { "(bad)",          { XX } },
3031     /* e8 */
3032     { "(bad)",          { XX } },
3033     { "(bad)",          { XX } },
3034     { "(bad)",          { XX } },
3035     { "(bad)",          { XX } },
3036     { "(bad)",          { XX } },
3037     { "(bad)",          { XX } },
3038     { "(bad)",          { XX } },
3039     { "(bad)",          { XX } },
3040     /* f0 */
3041     { "(bad)",          { XX } },
3042     { "(bad)",          { XX } },
3043     { "(bad)",          { XX } },
3044     { "(bad)",          { XX } },
3045     { "(bad)",          { XX } },
3046     { "(bad)",          { XX } },
3047     { "(bad)",          { XX } },
3048     { "(bad)",          { XX } },
3049     /* f8 */
3050     { "(bad)",          { XX } },
3051     { "(bad)",          { XX } },
3052     { "(bad)",          { XX } },
3053     { "(bad)",          { XX } },
3054     { "(bad)",          { XX } },
3055     { "(bad)",          { XX } },
3056     { "(bad)",          { XX } },
3057     { "(bad)",          { XX } },
3058   },
3059   /* THREE_BYTE_0F25 */
3060   {
3061     /* 00 */
3062     { "(bad)",          { XX } },
3063     { "(bad)",          { XX } },
3064     { "(bad)",          { XX } },
3065     { "(bad)",          { XX } },
3066     { "(bad)",          { XX } },
3067     { "(bad)",          { XX } },
3068     { "(bad)",          { XX } },
3069     { "(bad)",          { XX } },
3070     /* 08 */
3071     { "(bad)",          { XX } },
3072     { "(bad)",          { XX } },
3073     { "(bad)",          { XX } },
3074     { "(bad)",          { XX } },
3075     { "(bad)",          { XX } },
3076     { "(bad)",          { XX } },
3077     { "(bad)",          { XX } },
3078     { "(bad)",          { XX } },
3079     /* 10 */
3080     { "(bad)",          { XX } },
3081     { "(bad)",          { XX } },
3082     { "(bad)",          { XX } },
3083     { "(bad)",          { XX } },
3084     { "(bad)",          { XX } },
3085     { "(bad)",          { XX } },
3086     { "(bad)",          { XX } },
3087     { "(bad)",          { XX } },
3088     /* 18 */
3089     { "(bad)",          { XX } },
3090     { "(bad)",          { XX } },
3091     { "(bad)",          { XX } },
3092     { "(bad)",          { XX } },
3093     { "(bad)",          { XX } },
3094     { "(bad)",          { XX } },
3095     { "(bad)",          { XX } },
3096     { "(bad)",          { XX } },
3097     /* 20 */
3098     { "(bad)",          { XX } },
3099     { "(bad)",          { XX } },
3100     { "(bad)",          { XX } },
3101     { "(bad)",          { XX } },
3102     { "(bad)",          { XX } },
3103     { "(bad)",          { XX } },
3104     { "(bad)",          { XX } },
3105     { "(bad)",          { XX } },
3106     /* 28 */
3107     { "(bad)",          { XX } },
3108     { "(bad)",          { XX } },
3109     { "(bad)",          { XX } },
3110     { "(bad)",          { XX } },
3111     { "comps",          { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
3112     { "compd",          { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
3113     { "comss",          { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
3114     { "comsd",          { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
3115     /* 30 */
3116     { "(bad)",          { XX } },
3117     { "(bad)",          { XX } },
3118     { "(bad)",          { XX } },
3119     { "(bad)",          { XX } },
3120     { "(bad)",          { XX } },
3121     { "(bad)",          { XX } },
3122     { "(bad)",          { XX } },
3123     { "(bad)",          { XX } },
3124     /* 38 */
3125     { "(bad)",          { XX } },
3126     { "(bad)",          { XX } },
3127     { "(bad)",          { XX } },
3128     { "(bad)",          { XX } },
3129     { "(bad)",          { XX } },
3130     { "(bad)",          { XX } },
3131     { "(bad)",          { XX } },
3132     { "(bad)",          { XX } },
3133     /* 40 */
3134     { "(bad)",          { XX } },
3135     { "(bad)",          { XX } },
3136     { "(bad)",          { XX } },
3137     { "(bad)",          { XX } },
3138     { "(bad)",          { XX } },
3139     { "(bad)",          { XX } },
3140     { "(bad)",          { XX } },
3141     { "(bad)",          { XX } },
3142     /* 48 */
3143     { "(bad)",          { XX } },
3144     { "(bad)",          { XX } },
3145     { "(bad)",          { XX } },
3146     { "(bad)",          { XX } },
3147     { "pcomb",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3148     { "pcomw",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3149     { "pcomd",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3150     { "pcomq",          { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3151     /* 50 */
3152     { "(bad)",          { XX } },
3153     { "(bad)",          { XX } },
3154     { "(bad)",          { XX } },
3155     { "(bad)",          { XX } },
3156     { "(bad)",          { XX } },
3157     { "(bad)",          { XX } },
3158     { "(bad)",          { XX } },
3159     { "(bad)",          { XX } },
3160     /* 58 */
3161     { "(bad)",          { XX } },
3162     { "(bad)",          { XX } },
3163     { "(bad)",          { XX } },
3164     { "(bad)",          { XX } },
3165     { "(bad)",          { XX } },
3166     { "(bad)",          { XX } },
3167     { "(bad)",          { XX } },
3168     { "(bad)",          { XX } },
3169     /* 60 */
3170     { "(bad)",          { XX } },
3171     { "(bad)",          { XX } },
3172     { "(bad)",          { XX } },
3173     { "(bad)",          { XX } },
3174     { "(bad)",          { XX } },
3175     { "(bad)",          { XX } },
3176     { "(bad)",          { XX } },
3177     { "(bad)",          { XX } },
3178     /* 68 */
3179     { "(bad)",          { XX } },
3180     { "(bad)",          { XX } },
3181     { "(bad)",          { XX } },
3182     { "(bad)",          { XX } },
3183     { "pcomub",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3184     { "pcomuw",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3185     { "pcomud",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3186     { "pcomuq",         { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3187     /* 70 */
3188     { "(bad)",          { XX } },
3189     { "(bad)",          { XX } },
3190     { "(bad)",          { XX } },
3191     { "(bad)",          { XX } },
3192     { "(bad)",          { XX } },
3193     { "(bad)",          { XX } },
3194     { "(bad)",          { XX } },
3195     { "(bad)",          { XX } },
3196     /* 78 */
3197     { "(bad)",          { XX } },
3198     { "(bad)",          { XX } },
3199     { "(bad)",          { XX } },
3200     { "(bad)",          { XX } },
3201     { "(bad)",          { XX } },
3202     { "(bad)",          { XX } },
3203     { "(bad)",          { XX } },
3204     { "(bad)",          { XX } },
3205     /* 80 */
3206     { "(bad)",          { XX } },
3207     { "(bad)",          { XX } },
3208     { "(bad)",          { XX } },
3209     { "(bad)",          { XX } },
3210     { "(bad)",          { XX } },
3211     { "(bad)",          { XX } },
3212     { "(bad)",          { XX } },
3213     { "(bad)",          { XX } },
3214     /* 88 */
3215     { "(bad)",          { XX } },
3216     { "(bad)",          { XX } },
3217     { "(bad)",          { XX } },
3218     { "(bad)",          { XX } },
3219     { "(bad)",          { XX } },
3220     { "(bad)",          { XX } },
3221     { "(bad)",          { XX } },
3222     { "(bad)",          { XX } },
3223     /* 90 */
3224     { "(bad)",          { XX } },
3225     { "(bad)",          { XX } },
3226     { "(bad)",          { XX } },
3227     { "(bad)",          { XX } },
3228     { "(bad)",          { XX } },
3229     { "(bad)",          { XX } },
3230     { "(bad)",          { XX } },
3231     { "(bad)",          { XX } },
3232     /* 98 */
3233     { "(bad)",          { XX } },
3234     { "(bad)",          { XX } },
3235     { "(bad)",          { XX } },
3236     { "(bad)",          { XX } },
3237     { "(bad)",          { XX } },
3238     { "(bad)",          { XX } },
3239     { "(bad)",          { XX } },
3240     { "(bad)",          { XX } },
3241     /* a0 */
3242     { "(bad)",          { XX } },
3243     { "(bad)",          { XX } },
3244     { "(bad)",          { XX } },
3245     { "(bad)",          { XX } },
3246     { "(bad)",          { XX } },
3247     { "(bad)",          { XX } },
3248     { "(bad)",          { XX } },
3249     { "(bad)",          { XX } },
3250     /* a8 */
3251     { "(bad)",          { XX } },
3252     { "(bad)",          { XX } },
3253     { "(bad)",          { XX } },
3254     { "(bad)",          { XX } },
3255     { "(bad)",          { XX } },
3256     { "(bad)",          { XX } },
3257     { "(bad)",          { XX } },
3258     { "(bad)",          { XX } },
3259     /* b0 */
3260     { "(bad)",          { XX } },
3261     { "(bad)",          { XX } },
3262     { "(bad)",          { XX } },
3263     { "(bad)",          { XX } },
3264     { "(bad)",          { XX } },
3265     { "(bad)",          { XX } },
3266     { "(bad)",          { XX } },
3267     { "(bad)",          { XX } },
3268     /* b8 */
3269     { "(bad)",          { XX } },
3270     { "(bad)",          { XX } },
3271     { "(bad)",          { XX } },
3272     { "(bad)",          { XX } },
3273     { "(bad)",          { XX } },
3274     { "(bad)",          { XX } },
3275     { "(bad)",          { XX } },
3276     { "(bad)",          { XX } },
3277     /* c0 */
3278     { "(bad)",          { XX } },
3279     { "(bad)",          { XX } },
3280     { "(bad)",          { XX } },
3281     { "(bad)",          { XX } },
3282     { "(bad)",          { XX } },
3283     { "(bad)",          { XX } },
3284     { "(bad)",          { XX } },
3285     { "(bad)",          { XX } },
3286     /* c8 */
3287     { "(bad)",          { XX } },
3288     { "(bad)",          { XX } },
3289     { "(bad)",          { XX } },
3290     { "(bad)",          { XX } },
3291     { "(bad)",          { XX } },
3292     { "(bad)",          { XX } },
3293     { "(bad)",          { XX } },
3294     { "(bad)",          { XX } },
3295     /* d0 */
3296     { "(bad)",          { XX } },
3297     { "(bad)",          { XX } },
3298     { "(bad)",          { XX } },
3299     { "(bad)",          { XX } },
3300     { "(bad)",          { XX } },
3301     { "(bad)",          { XX } },
3302     { "(bad)",          { XX } },
3303     { "(bad)",          { XX } },
3304     /* d8 */
3305     { "(bad)",          { XX } },
3306     { "(bad)",          { XX } },
3307     { "(bad)",          { XX } },
3308     { "(bad)",          { XX } },
3309     { "(bad)",          { XX } },
3310     { "(bad)",          { XX } },
3311     { "(bad)",          { XX } },
3312     { "(bad)",          { XX } },
3313     /* e0 */
3314     { "(bad)",          { XX } },
3315     { "(bad)",          { XX } },
3316     { "(bad)",          { XX } },
3317     { "(bad)",          { XX } },
3318     { "(bad)",          { XX } },
3319     { "(bad)",          { XX } },
3320     { "(bad)",          { XX } },
3321     { "(bad)",          { XX } },
3322     /* e8 */
3323     { "(bad)",          { XX } },
3324     { "(bad)",          { XX } },
3325     { "(bad)",          { XX } },
3326     { "(bad)",          { XX } },
3327     { "(bad)",          { XX } },
3328     { "(bad)",          { XX } },
3329     { "(bad)",          { XX } },
3330     { "(bad)",          { XX } },
3331     /* f0 */
3332     { "(bad)",          { XX } },
3333     { "(bad)",          { XX } },
3334     { "(bad)",          { XX } },
3335     { "(bad)",          { XX } },
3336     { "(bad)",          { XX } },
3337     { "(bad)",          { XX } },
3338     { "(bad)",          { XX } },
3339     { "(bad)",          { XX } },
3340     /* f8 */
3341     { "(bad)",          { XX } },
3342     { "(bad)",          { XX } },
3343     { "(bad)",          { XX } },
3344     { "(bad)",          { XX } },
3345     { "(bad)",          { XX } },
3346     { "(bad)",          { XX } },
3347     { "(bad)",          { XX } },
3348     { "(bad)",          { XX } },
3349   },
3350   /* THREE_BYTE_0F38 */
3351   {
3352     /* 00 */
3353     { "pshufb",         { MX, EM } },
3354     { "phaddw",         { MX, EM } },
3355     { "phaddd",         { MX, EM } },
3356     { "phaddsw",        { MX, EM } },
3357     { "pmaddubsw",      { MX, EM } },
3358     { "phsubw",         { MX, EM } },
3359     { "phsubd",         { MX, EM } },
3360     { "phsubsw",        { MX, EM } },
3361     /* 08 */
3362     { "psignb",         { MX, EM } },
3363     { "psignw",         { MX, EM } },
3364     { "psignd",         { MX, EM } },
3365     { "pmulhrsw",       { MX, EM } },
3366     { "(bad)",          { XX } },
3367     { "(bad)",          { XX } },
3368     { "(bad)",          { XX } },
3369     { "(bad)",          { XX } },
3370     /* 10 */
3371     { PREFIX_TABLE (PREFIX_0F3810) },
3372     { "(bad)",          { XX } },
3373     { "(bad)",          { XX } },
3374     { "(bad)",          { XX } },
3375     { PREFIX_TABLE (PREFIX_0F3814) },
3376     { PREFIX_TABLE (PREFIX_0F3815) },
3377     { "(bad)",          { XX } },
3378     { PREFIX_TABLE (PREFIX_0F3817) },
3379     /* 18 */
3380     { "(bad)",          { XX } },
3381     { "(bad)",          { XX } },
3382     { "(bad)",          { XX } },
3383     { "(bad)",          { XX } },
3384     { "pabsb",          { MX, EM } },
3385     { "pabsw",          { MX, EM } },
3386     { "pabsd",          { MX, EM } },
3387     { "(bad)",          { XX } },
3388     /* 20 */
3389     { PREFIX_TABLE (PREFIX_0F3820) },
3390     { PREFIX_TABLE (PREFIX_0F3821) },
3391     { PREFIX_TABLE (PREFIX_0F3822) },
3392     { PREFIX_TABLE (PREFIX_0F3823) },
3393     { PREFIX_TABLE (PREFIX_0F3824) },
3394     { PREFIX_TABLE (PREFIX_0F3825) },
3395     { "(bad)",          { XX } },
3396     { "(bad)",          { XX } },
3397     /* 28 */
3398     { PREFIX_TABLE (PREFIX_0F3828) },
3399     { PREFIX_TABLE (PREFIX_0F3829) },
3400     { PREFIX_TABLE (PREFIX_0F382A) },
3401     { PREFIX_TABLE (PREFIX_0F382B) },
3402     { "(bad)",          { XX } },
3403     { "(bad)",          { XX } },
3404     { "(bad)",          { XX } },
3405     { "(bad)",          { XX } },
3406     /* 30 */
3407     { PREFIX_TABLE (PREFIX_0F3830) },
3408     { PREFIX_TABLE (PREFIX_0F3831) },
3409     { PREFIX_TABLE (PREFIX_0F3832) },
3410     { PREFIX_TABLE (PREFIX_0F3833) },
3411     { PREFIX_TABLE (PREFIX_0F3834) },
3412     { PREFIX_TABLE (PREFIX_0F3835) },
3413     { "(bad)",          { XX } },
3414     { PREFIX_TABLE (PREFIX_0F3837) },
3415     /* 38 */
3416     { PREFIX_TABLE (PREFIX_0F3838) },
3417     { PREFIX_TABLE (PREFIX_0F3839) },
3418     { PREFIX_TABLE (PREFIX_0F383A) },
3419     { PREFIX_TABLE (PREFIX_0F383B) },
3420     { PREFIX_TABLE (PREFIX_0F383C) },
3421     { PREFIX_TABLE (PREFIX_0F383D) },
3422     { PREFIX_TABLE (PREFIX_0F383E) },
3423     { PREFIX_TABLE (PREFIX_0F383F) },
3424     /* 40 */
3425     { PREFIX_TABLE (PREFIX_0F3840) },
3426     { PREFIX_TABLE (PREFIX_0F3841) },
3427     { "(bad)",          { XX } },
3428     { "(bad)",          { XX } },
3429     { "(bad)",          { XX } },
3430     { "(bad)",          { XX } },
3431     { "(bad)",          { XX } },
3432     { "(bad)",          { XX } },
3433     /* 48 */
3434     { "(bad)",          { XX } },
3435     { "(bad)",          { XX } },
3436     { "(bad)",          { XX } },
3437     { "(bad)",          { XX } },
3438     { "(bad)",          { XX } },
3439     { "(bad)",          { XX } },
3440     { "(bad)",          { XX } },
3441     { "(bad)",          { XX } },
3442     /* 50 */
3443     { "(bad)",          { XX } },
3444     { "(bad)",          { XX } },
3445     { "(bad)",          { XX } },
3446     { "(bad)",          { XX } },
3447     { "(bad)",          { XX } },
3448     { "(bad)",          { XX } },
3449     { "(bad)",          { XX } },
3450     { "(bad)",          { XX } },
3451     /* 58 */
3452     { "(bad)",          { XX } },
3453     { "(bad)",          { XX } },
3454     { "(bad)",          { XX } },
3455     { "(bad)",          { XX } },
3456     { "(bad)",          { XX } },
3457     { "(bad)",          { XX } },
3458     { "(bad)",          { XX } },
3459     { "(bad)",          { XX } },
3460     /* 60 */
3461     { "(bad)",          { XX } },
3462     { "(bad)",          { XX } },
3463     { "(bad)",          { XX } },
3464     { "(bad)",          { XX } },
3465     { "(bad)",          { XX } },
3466     { "(bad)",          { XX } },
3467     { "(bad)",          { XX } },
3468     { "(bad)",          { XX } },
3469     /* 68 */
3470     { "(bad)",          { XX } },
3471     { "(bad)",          { XX } },
3472     { "(bad)",          { XX } },
3473     { "(bad)",          { XX } },
3474     { "(bad)",          { XX } },
3475     { "(bad)",          { XX } },
3476     { "(bad)",          { XX } },
3477     { "(bad)",          { XX } },
3478     /* 70 */
3479     { "(bad)",          { XX } },
3480     { "(bad)",          { XX } },
3481     { "(bad)",          { XX } },
3482     { "(bad)",          { XX } },
3483     { "(bad)",          { XX } },
3484     { "(bad)",          { XX } },
3485     { "(bad)",          { XX } },
3486     { "(bad)",          { XX } },
3487     /* 78 */
3488     { "(bad)",          { XX } },
3489     { "(bad)",          { XX } },
3490     { "(bad)",          { XX } },
3491     { "(bad)",          { XX } },
3492     { "(bad)",          { XX } },
3493     { "(bad)",          { XX } },
3494     { "(bad)",          { XX } },
3495     { "(bad)",          { XX } },
3496     /* 80 */
3497     { "(bad)",          { XX } },
3498     { "(bad)",          { XX } },
3499     { "(bad)",          { XX } },
3500     { "(bad)",          { XX } },
3501     { "(bad)",          { XX } },
3502     { "(bad)",          { XX } },
3503     { "(bad)",          { XX } },
3504     { "(bad)",          { XX } },
3505     /* 88 */
3506     { "(bad)",          { XX } },
3507     { "(bad)",          { XX } },
3508     { "(bad)",          { XX } },
3509     { "(bad)",          { XX } },
3510     { "(bad)",          { XX } },
3511     { "(bad)",          { XX } },
3512     { "(bad)",          { XX } },
3513     { "(bad)",          { XX } },
3514     /* 90 */
3515     { "(bad)",          { XX } },
3516     { "(bad)",          { XX } },
3517     { "(bad)",          { XX } },
3518     { "(bad)",          { XX } },
3519     { "(bad)",          { XX } },
3520     { "(bad)",          { XX } },
3521     { "(bad)",          { XX } },
3522     { "(bad)",          { XX } },
3523     /* 98 */
3524     { "(bad)",          { XX } },
3525     { "(bad)",          { XX } },
3526     { "(bad)",          { XX } },
3527     { "(bad)",          { XX } },
3528     { "(bad)",          { XX } },
3529     { "(bad)",          { XX } },
3530     { "(bad)",          { XX } },
3531     { "(bad)",          { XX } },
3532     /* a0 */
3533     { "(bad)",          { XX } },
3534     { "(bad)",          { XX } },
3535     { "(bad)",          { XX } },
3536     { "(bad)",          { XX } },
3537     { "(bad)",          { XX } },
3538     { "(bad)",          { XX } },
3539     { "(bad)",          { XX } },
3540     { "(bad)",          { XX } },
3541     /* a8 */
3542     { "(bad)",          { XX } },
3543     { "(bad)",          { XX } },
3544     { "(bad)",          { XX } },
3545     { "(bad)",          { XX } },
3546     { "(bad)",          { XX } },
3547     { "(bad)",          { XX } },
3548     { "(bad)",          { XX } },
3549     { "(bad)",          { XX } },
3550     /* b0 */
3551     { "(bad)",          { XX } },
3552     { "(bad)",          { XX } },
3553     { "(bad)",          { XX } },
3554     { "(bad)",          { XX } },
3555     { "(bad)",          { XX } },
3556     { "(bad)",          { XX } },
3557     { "(bad)",          { XX } },
3558     { "(bad)",          { XX } },
3559     /* b8 */
3560     { "(bad)",          { XX } },
3561     { "(bad)",          { XX } },
3562     { "(bad)",          { XX } },
3563     { "(bad)",          { XX } },
3564     { "(bad)",          { XX } },
3565     { "(bad)",          { XX } },
3566     { "(bad)",          { XX } },
3567     { "(bad)",          { XX } },
3568     /* c0 */
3569     { "(bad)",          { XX } },
3570     { "(bad)",          { XX } },
3571     { "(bad)",          { XX } },
3572     { "(bad)",          { XX } },
3573     { "(bad)",          { XX } },
3574     { "(bad)",          { XX } },
3575     { "(bad)",          { XX } },
3576     { "(bad)",          { XX } },
3577     /* c8 */
3578     { "(bad)",          { XX } },
3579     { "(bad)",          { XX } },
3580     { "(bad)",          { XX } },
3581     { "(bad)",          { XX } },
3582     { "(bad)",          { XX } },
3583     { "(bad)",          { XX } },
3584     { "(bad)",          { XX } },
3585     { "(bad)",          { XX } },
3586     /* d0 */
3587     { "(bad)",          { XX } },
3588     { "(bad)",          { XX } },
3589     { "(bad)",          { XX } },
3590     { "(bad)",          { XX } },
3591     { "(bad)",          { XX } },
3592     { "(bad)",          { XX } },
3593     { "(bad)",          { XX } },
3594     { "(bad)",          { XX } },
3595     /* d8 */
3596     { "(bad)",          { XX } },
3597     { "(bad)",          { XX } },
3598     { "(bad)",          { XX } },
3599     { "(bad)",          { XX } },
3600     { "(bad)",          { XX } },
3601     { "(bad)",          { XX } },
3602     { "(bad)",          { XX } },
3603     { "(bad)",          { XX } },
3604     /* e0 */
3605     { "(bad)",          { XX } },
3606     { "(bad)",          { XX } },
3607     { "(bad)",          { XX } },
3608     { "(bad)",          { XX } },
3609     { "(bad)",          { XX } },
3610     { "(bad)",          { XX } },
3611     { "(bad)",          { XX } },
3612     { "(bad)",          { XX } },
3613     /* e8 */
3614     { "(bad)",          { XX } },
3615     { "(bad)",          { XX } },
3616     { "(bad)",          { XX } },
3617     { "(bad)",          { XX } },
3618     { "(bad)",          { XX } },
3619     { "(bad)",          { XX } },
3620     { "(bad)",          { XX } },
3621     { "(bad)",          { XX } },
3622     /* f0 */
3623     { PREFIX_TABLE (PREFIX_0F38F0) },
3624     { PREFIX_TABLE (PREFIX_0F38F1) },
3625     { "(bad)",          { XX } },
3626     { "(bad)",          { XX } },
3627     { "(bad)",          { XX } },
3628     { "(bad)",          { XX } },
3629     { "(bad)",          { XX } },
3630     { "(bad)",          { XX } },
3631     /* f8 */
3632     { "(bad)",          { XX } },
3633     { "(bad)",          { XX } },
3634     { "(bad)",          { XX } },
3635     { "(bad)",          { XX } },
3636     { "(bad)",          { XX } },
3637     { "(bad)",          { XX } },
3638     { "(bad)",          { XX } },
3639     { "(bad)",          { XX } },
3640   },
3641   /* THREE_BYTE_0F3A */
3642   {
3643     /* 00 */
3644     { "(bad)",          { XX } },
3645     { "(bad)",          { XX } },
3646     { "(bad)",          { XX } },
3647     { "(bad)",          { XX } },
3648     { "(bad)",          { XX } },
3649     { "(bad)",          { XX } },
3650     { "(bad)",          { XX } },
3651     { "(bad)",          { XX } },
3652     /* 08 */
3653     { PREFIX_TABLE (PREFIX_0F3A08) },
3654     { PREFIX_TABLE (PREFIX_0F3A09) },
3655     { PREFIX_TABLE (PREFIX_0F3A0A) },
3656     { PREFIX_TABLE (PREFIX_0F3A0B) },
3657     { PREFIX_TABLE (PREFIX_0F3A0C) },
3658     { PREFIX_TABLE (PREFIX_0F3A0D) },
3659     { PREFIX_TABLE (PREFIX_0F3A0E) },
3660     { "palignr",        { MX, EM, Ib } },
3661     /* 10 */
3662     { "(bad)",          { XX } },
3663     { "(bad)",          { XX } },
3664     { "(bad)",          { XX } },
3665     { "(bad)",          { XX } },
3666     { PREFIX_TABLE (PREFIX_0F3A14) },
3667     { PREFIX_TABLE (PREFIX_0F3A15) },
3668     { PREFIX_TABLE (PREFIX_0F3A16) },
3669     { PREFIX_TABLE (PREFIX_0F3A17) },
3670     /* 18 */
3671     { "(bad)",          { XX } },
3672     { "(bad)",          { XX } },
3673     { "(bad)",          { XX } },
3674     { "(bad)",          { XX } },
3675     { "(bad)",          { XX } },
3676     { "(bad)",          { XX } },
3677     { "(bad)",          { XX } },
3678     { "(bad)",          { XX } },
3679     /* 20 */
3680     { PREFIX_TABLE (PREFIX_0F3A20) },
3681     { PREFIX_TABLE (PREFIX_0F3A21) },
3682     { PREFIX_TABLE (PREFIX_0F3A22) },
3683     { "(bad)",          { XX } },
3684     { "(bad)",          { XX } },
3685     { "(bad)",          { XX } },
3686     { "(bad)",          { XX } },
3687     { "(bad)",          { XX } },
3688     /* 28 */
3689     { "(bad)",          { XX } },
3690     { "(bad)",          { XX } },
3691     { "(bad)",          { XX } },
3692     { "(bad)",          { XX } },
3693     { "(bad)",          { XX } },
3694     { "(bad)",          { XX } },
3695     { "(bad)",          { XX } },
3696     { "(bad)",          { XX } },
3697     /* 30 */
3698     { "(bad)",          { XX } },
3699     { "(bad)",          { XX } },
3700     { "(bad)",          { XX } },
3701     { "(bad)",          { XX } },
3702     { "(bad)",          { XX } },
3703     { "(bad)",          { XX } },
3704     { "(bad)",          { XX } },
3705     { "(bad)",          { XX } },
3706     /* 38 */
3707     { "(bad)",          { XX } },
3708     { "(bad)",          { XX } },
3709     { "(bad)",          { XX } },
3710     { "(bad)",          { XX } },
3711     { "(bad)",          { XX } },
3712     { "(bad)",          { XX } },
3713     { "(bad)",          { XX } },
3714     { "(bad)",          { XX } },
3715     /* 40 */
3716     { PREFIX_TABLE (PREFIX_0F3A40) },
3717     { PREFIX_TABLE (PREFIX_0F3A41) },
3718     { PREFIX_TABLE (PREFIX_0F3A42) },
3719     { "(bad)",          { XX } },
3720     { "(bad)",          { XX } },
3721     { "(bad)",          { XX } },
3722     { "(bad)",          { XX } },
3723     { "(bad)",          { XX } },
3724     /* 48 */
3725     { "(bad)",          { XX } },
3726     { "(bad)",          { XX } },
3727     { "(bad)",          { XX } },
3728     { "(bad)",          { XX } },
3729     { "(bad)",          { XX } },
3730     { "(bad)",          { XX } },
3731     { "(bad)",          { XX } },
3732     { "(bad)",          { XX } },
3733     /* 50 */
3734     { "(bad)",          { XX } },
3735     { "(bad)",          { XX } },
3736     { "(bad)",          { XX } },
3737     { "(bad)",          { XX } },
3738     { "(bad)",          { XX } },
3739     { "(bad)",          { XX } },
3740     { "(bad)",          { XX } },
3741     { "(bad)",          { XX } },
3742     /* 58 */
3743     { "(bad)",          { XX } },
3744     { "(bad)",          { XX } },
3745     { "(bad)",          { XX } },
3746     { "(bad)",          { XX } },
3747     { "(bad)",          { XX } },
3748     { "(bad)",          { XX } },
3749     { "(bad)",          { XX } },
3750     { "(bad)",          { XX } },
3751     /* 60 */
3752     { PREFIX_TABLE (PREFIX_0F3A60) },
3753     { PREFIX_TABLE (PREFIX_0F3A61) },
3754     { PREFIX_TABLE (PREFIX_0F3A62) },
3755     { PREFIX_TABLE (PREFIX_0F3A63) },
3756     { "(bad)",          { XX } },
3757     { "(bad)",          { XX } },
3758     { "(bad)",          { XX } },
3759     { "(bad)",          { XX } },
3760     /* 68 */
3761     { "(bad)",          { XX } },
3762     { "(bad)",          { XX } },
3763     { "(bad)",          { XX } },
3764     { "(bad)",          { XX } },
3765     { "(bad)",          { XX } },
3766     { "(bad)",          { XX } },
3767     { "(bad)",          { XX } },
3768     { "(bad)",          { XX } },
3769     /* 70 */
3770     { "(bad)",          { XX } },
3771     { "(bad)",          { XX } },
3772     { "(bad)",          { XX } },
3773     { "(bad)",          { XX } },
3774     { "(bad)",          { XX } },
3775     { "(bad)",          { XX } },
3776     { "(bad)",          { XX } },
3777     { "(bad)",          { XX } },
3778     /* 78 */
3779     { "(bad)",          { XX } },
3780     { "(bad)",          { XX } },
3781     { "(bad)",          { XX } },
3782     { "(bad)",          { XX } },
3783     { "(bad)",          { XX } },
3784     { "(bad)",          { XX } },
3785     { "(bad)",          { XX } },
3786     { "(bad)",          { XX } },
3787     /* 80 */
3788     { "(bad)",          { XX } },
3789     { "(bad)",          { XX } },
3790     { "(bad)",          { XX } },
3791     { "(bad)",          { XX } },
3792     { "(bad)",          { XX } },
3793     { "(bad)",          { XX } },
3794     { "(bad)",          { XX } },
3795     { "(bad)",          { XX } },
3796     /* 88 */
3797     { "(bad)",          { XX } },
3798     { "(bad)",          { XX } },
3799     { "(bad)",          { XX } },
3800     { "(bad)",          { XX } },
3801     { "(bad)",          { XX } },
3802     { "(bad)",          { XX } },
3803     { "(bad)",          { XX } },
3804     { "(bad)",          { XX } },
3805     /* 90 */
3806     { "(bad)",          { XX } },
3807     { "(bad)",          { XX } },
3808     { "(bad)",          { XX } },
3809     { "(bad)",          { XX } },
3810     { "(bad)",          { XX } },
3811     { "(bad)",          { XX } },
3812     { "(bad)",          { XX } },
3813     { "(bad)",          { XX } },
3814     /* 98 */
3815     { "(bad)",          { XX } },
3816     { "(bad)",          { XX } },
3817     { "(bad)",          { XX } },
3818     { "(bad)",          { XX } },
3819     { "(bad)",          { XX } },
3820     { "(bad)",          { XX } },
3821     { "(bad)",          { XX } },
3822     { "(bad)",          { XX } },
3823     /* a0 */
3824     { "(bad)",          { XX } },
3825     { "(bad)",          { XX } },
3826     { "(bad)",          { XX } },
3827     { "(bad)",          { XX } },
3828     { "(bad)",          { XX } },
3829     { "(bad)",          { XX } },
3830     { "(bad)",          { XX } },
3831     { "(bad)",          { XX } },
3832     /* a8 */
3833     { "(bad)",          { XX } },
3834     { "(bad)",          { XX } },
3835     { "(bad)",          { XX } },
3836     { "(bad)",          { XX } },
3837     { "(bad)",          { XX } },
3838     { "(bad)",          { XX } },
3839     { "(bad)",          { XX } },
3840     { "(bad)",          { XX } },
3841     /* b0 */
3842     { "(bad)",          { XX } },
3843     { "(bad)",          { XX } },
3844     { "(bad)",          { XX } },
3845     { "(bad)",          { XX } },
3846     { "(bad)",          { XX } },
3847     { "(bad)",          { XX } },
3848     { "(bad)",          { XX } },
3849     { "(bad)",          { XX } },
3850     /* b8 */
3851     { "(bad)",          { XX } },
3852     { "(bad)",          { XX } },
3853     { "(bad)",          { XX } },
3854     { "(bad)",          { XX } },
3855     { "(bad)",          { XX } },
3856     { "(bad)",          { XX } },
3857     { "(bad)",          { XX } },
3858     { "(bad)",          { XX } },
3859     /* c0 */
3860     { "(bad)",          { XX } },
3861     { "(bad)",          { XX } },
3862     { "(bad)",          { XX } },
3863     { "(bad)",          { XX } },
3864     { "(bad)",          { XX } },
3865     { "(bad)",          { XX } },
3866     { "(bad)",          { XX } },
3867     { "(bad)",          { XX } },
3868     /* c8 */
3869     { "(bad)",          { XX } },
3870     { "(bad)",          { XX } },
3871     { "(bad)",          { XX } },
3872     { "(bad)",          { XX } },
3873     { "(bad)",          { XX } },
3874     { "(bad)",          { XX } },
3875     { "(bad)",          { XX } },
3876     { "(bad)",          { XX } },
3877     /* d0 */
3878     { "(bad)",          { XX } },
3879     { "(bad)",          { XX } },
3880     { "(bad)",          { XX } },
3881     { "(bad)",          { XX } },
3882     { "(bad)",          { XX } },
3883     { "(bad)",          { XX } },
3884     { "(bad)",          { XX } },
3885     { "(bad)",          { XX } },
3886     /* d8 */
3887     { "(bad)",          { XX } },
3888     { "(bad)",          { XX } },
3889     { "(bad)",          { XX } },
3890     { "(bad)",          { XX } },
3891     { "(bad)",          { XX } },
3892     { "(bad)",          { XX } },
3893     { "(bad)",          { XX } },
3894     { "(bad)",          { XX } },
3895     /* e0 */
3896     { "(bad)",          { XX } },
3897     { "(bad)",          { XX } },
3898     { "(bad)",          { XX } },
3899     { "(bad)",          { XX } },
3900     { "(bad)",          { XX } },
3901     { "(bad)",          { XX } },
3902     { "(bad)",          { XX } },
3903     { "(bad)",          { XX } },
3904     /* e8 */
3905     { "(bad)",          { XX } },
3906     { "(bad)",          { XX } },
3907     { "(bad)",          { XX } },
3908     { "(bad)",          { XX } },
3909     { "(bad)",          { XX } },
3910     { "(bad)",          { XX } },
3911     { "(bad)",          { XX } },
3912     { "(bad)",          { XX } },
3913     /* f0 */
3914     { "(bad)",          { XX } },
3915     { "(bad)",          { XX } },
3916     { "(bad)",          { XX } },
3917     { "(bad)",          { XX } },
3918     { "(bad)",          { XX } },
3919     { "(bad)",          { XX } },
3920     { "(bad)",          { XX } },
3921     { "(bad)",          { XX } },
3922     /* f8 */
3923     { "(bad)",          { XX } },
3924     { "(bad)",          { XX } },
3925     { "(bad)",          { XX } },
3926     { "(bad)",          { XX } },
3927     { "(bad)",          { XX } },
3928     { "(bad)",          { XX } },
3929     { "(bad)",          { XX } },
3930     { "(bad)",          { XX } },
3931   },
3932   /* THREE_BYTE_0F7A */
3933   {
3934     /* 00 */
3935     { "(bad)",          { XX } },
3936     { "(bad)",          { XX } },
3937     { "(bad)",          { XX } },
3938     { "(bad)",          { XX } },
3939     { "(bad)",          { XX } },
3940     { "(bad)",          { XX } },
3941     { "(bad)",          { XX } },
3942     { "(bad)",          { XX } },
3943     /* 08 */
3944     { "(bad)",          { XX } },
3945     { "(bad)",          { XX } },
3946     { "(bad)",          { XX } },
3947     { "(bad)",          { XX } },
3948     { "(bad)",          { XX } },
3949     { "(bad)",          { XX } },
3950     { "(bad)",          { XX } },
3951     { "(bad)",          { XX } },
3952     /* 10 */
3953     { "frczps",         { XM, EXq } },
3954     { "frczpd",         { XM, EXq } },
3955     { "frczss",         { XM, EXq } },
3956     { "frczsd",         { XM, EXq } },
3957     { "(bad)",          { XX } },
3958     { "(bad)",          { XX } },
3959     { "(bad)",          { XX } },
3960     { "(bad)",          { XX } },
3961     /* 18 */
3962     { "(bad)",          { XX } },
3963     { "(bad)",          { XX } },
3964     { "(bad)",          { XX } },
3965     { "(bad)",          { XX } },
3966     { "(bad)",          { XX } },
3967     { "(bad)",          { XX } },
3968     { "(bad)",          { XX } },
3969     { "(bad)",          { XX } },
3970     /* 20 */
3971     { "ptest",          { XX } },
3972     { "(bad)",          { XX } },
3973     { "(bad)",          { XX } },
3974     { "(bad)",          { XX } },
3975     { "(bad)",          { XX } },
3976     { "(bad)",          { XX } },
3977     { "(bad)",          { XX } },
3978     { "(bad)",          { XX } },
3979     /* 28 */
3980     { "(bad)",          { XX } },
3981     { "(bad)",          { XX } },
3982     { "(bad)",          { XX } },
3983     { "(bad)",          { XX } },
3984     { "(bad)",          { XX } },
3985     { "(bad)",          { XX } },
3986     { "(bad)",          { XX } },
3987     { "(bad)",          { XX } },
3988     /* 30 */
3989     { "cvtph2ps",       { XM, EXd } },
3990     { "cvtps2ph",       { EXd, XM } },
3991     { "(bad)",          { XX } },
3992     { "(bad)",          { XX } },
3993     { "(bad)",          { XX } },
3994     { "(bad)",          { XX } },
3995     { "(bad)",          { XX } },
3996     { "(bad)",          { XX } },
3997     /* 38 */
3998     { "(bad)",          { XX } },
3999     { "(bad)",          { XX } },
4000     { "(bad)",          { XX } },
4001     { "(bad)",          { XX } },
4002     { "(bad)",          { XX } },
4003     { "(bad)",          { XX } },
4004     { "(bad)",          { XX } },
4005     { "(bad)",          { XX } },
4006     /* 40 */
4007     { "(bad)",          { XX } },
4008     { "phaddbw",        { XM, EXq } },
4009     { "phaddbd",        { XM, EXq } },
4010     { "phaddbq",        { XM, EXq } },
4011     { "(bad)",          { XX } },
4012     { "(bad)",          { XX } },
4013     { "phaddwd",        { XM, EXq } },
4014     { "phaddwq",        { XM, EXq } },
4015     /* 48 */
4016     { "(bad)",          { XX } },
4017     { "(bad)",          { XX } },
4018     { "(bad)",          { XX } },
4019     { "phadddq",        { XM, EXq } },
4020     { "(bad)",          { XX } },
4021     { "(bad)",          { XX } },
4022     { "(bad)",          { XX } },
4023     { "(bad)",          { XX } },
4024     /* 50 */
4025     { "(bad)",          { XX } },
4026     { "phaddubw",       { XM, EXq } },
4027     { "phaddubd",       { XM, EXq } },
4028     { "phaddubq",       { XM, EXq } },
4029     { "(bad)",          { XX } },
4030     { "(bad)",          { XX } },
4031     { "phadduwd",       { XM, EXq } },
4032     { "phadduwq",       { XM, EXq } },
4033     /* 58 */
4034     { "(bad)",          { XX } },
4035     { "(bad)",          { XX } },
4036     { "(bad)",          { XX } },
4037     { "phaddudq",       { XM, EXq } },
4038     { "(bad)",          { XX } },
4039     { "(bad)",          { XX } },
4040     { "(bad)",          { XX } },
4041     { "(bad)",          { XX } },
4042     /* 60 */
4043     { "(bad)",          { XX } },
4044     { "phsubbw",        { XM, EXq } },
4045     { "phsubbd",        { XM, EXq } },
4046     { "phsubbq",        { XM, EXq } },
4047     { "(bad)",          { XX } },
4048     { "(bad)",          { XX } },
4049     { "(bad)",          { XX } },
4050     { "(bad)",          { XX } },
4051     /* 68 */
4052     { "(bad)",          { XX } },
4053     { "(bad)",          { XX } },
4054     { "(bad)",          { XX } },
4055     { "(bad)",          { XX } },
4056     { "(bad)",          { XX } },
4057     { "(bad)",          { XX } },
4058     { "(bad)",          { XX } },
4059     { "(bad)",          { XX } },
4060     /* 70 */
4061     { "(bad)",          { XX } },
4062     { "(bad)",          { XX } },
4063     { "(bad)",          { XX } },
4064     { "(bad)",          { XX } },
4065     { "(bad)",          { XX } },
4066     { "(bad)",          { XX } },
4067     { "(bad)",          { XX } },
4068     { "(bad)",          { XX } },
4069     /* 78 */
4070     { "(bad)",          { XX } },
4071     { "(bad)",          { XX } },
4072     { "(bad)",          { XX } },
4073     { "(bad)",          { XX } },
4074     { "(bad)",          { XX } },
4075     { "(bad)",          { XX } },
4076     { "(bad)",          { XX } },
4077     { "(bad)",          { XX } },
4078     /* 80 */
4079     { "(bad)",          { XX } },
4080     { "(bad)",          { XX } },
4081     { "(bad)",          { XX } },
4082     { "(bad)",          { XX } },
4083     { "(bad)",          { XX } },
4084     { "(bad)",          { XX } },
4085     { "(bad)",          { XX } },
4086     { "(bad)",          { XX } },
4087     /* 88 */
4088     { "(bad)",          { XX } },
4089     { "(bad)",          { XX } },
4090     { "(bad)",          { XX } },
4091     { "(bad)",          { XX } },
4092     { "(bad)",          { XX } },
4093     { "(bad)",          { XX } },
4094     { "(bad)",          { XX } },
4095     { "(bad)",          { XX } },
4096     /* 90 */
4097     { "(bad)",          { XX } },
4098     { "(bad)",          { XX } },
4099     { "(bad)",          { XX } },
4100     { "(bad)",          { XX } },
4101     { "(bad)",          { XX } },
4102     { "(bad)",          { XX } },
4103     { "(bad)",          { XX } },
4104     { "(bad)",          { XX } },
4105     /* 98 */
4106     { "(bad)",          { XX } },
4107     { "(bad)",          { XX } },
4108     { "(bad)",          { XX } },
4109     { "(bad)",          { XX } },
4110     { "(bad)",          { XX } },
4111     { "(bad)",          { XX } },
4112     { "(bad)",          { XX } },
4113     { "(bad)",          { XX } },
4114     /* a0 */
4115     { "(bad)",          { XX } },
4116     { "(bad)",          { XX } },
4117     { "(bad)",          { XX } },
4118     { "(bad)",          { XX } },
4119     { "(bad)",          { XX } },
4120     { "(bad)",          { XX } },
4121     { "(bad)",          { XX } },
4122     { "(bad)",          { XX } },
4123     /* a8 */
4124     { "(bad)",          { XX } },
4125     { "(bad)",          { XX } },
4126     { "(bad)",          { XX } },
4127     { "(bad)",          { XX } },
4128     { "(bad)",          { XX } },
4129     { "(bad)",          { XX } },
4130     { "(bad)",          { XX } },
4131     { "(bad)",          { XX } },
4132     /* b0 */
4133     { "(bad)",          { XX } },
4134     { "(bad)",          { XX } },
4135     { "(bad)",          { XX } },
4136     { "(bad)",          { XX } },
4137     { "(bad)",          { XX } },
4138     { "(bad)",          { XX } },
4139     { "(bad)",          { XX } },
4140     { "(bad)",          { XX } },
4141     /* b8 */
4142     { "(bad)",          { XX } },
4143     { "(bad)",          { XX } },
4144     { "(bad)",          { XX } },
4145     { "(bad)",          { XX } },
4146     { "(bad)",          { XX } },
4147     { "(bad)",          { XX } },
4148     { "(bad)",          { XX } },
4149     { "(bad)",          { XX } },
4150     /* c0 */
4151     { "(bad)",          { XX } },
4152     { "(bad)",          { XX } },
4153     { "(bad)",          { XX } },
4154     { "(bad)",          { XX } },
4155     { "(bad)",          { XX } },
4156     { "(bad)",          { XX } },
4157     { "(bad)",          { XX } },
4158     { "(bad)",          { XX } },
4159     /* c8 */
4160     { "(bad)",          { XX } },
4161     { "(bad)",          { XX } },
4162     { "(bad)",          { XX } },
4163     { "(bad)",          { XX } },
4164     { "(bad)",          { XX } },
4165     { "(bad)",          { XX } },
4166     { "(bad)",          { XX } },
4167     { "(bad)",          { XX } },
4168     /* d0 */
4169     { "(bad)",          { XX } },
4170     { "(bad)",          { XX } },
4171     { "(bad)",          { XX } },
4172     { "(bad)",          { XX } },
4173     { "(bad)",          { XX } },
4174     { "(bad)",          { XX } },
4175     { "(bad)",          { XX } },
4176     { "(bad)",          { XX } },
4177     /* d8 */
4178     { "(bad)",          { XX } },
4179     { "(bad)",          { XX } },
4180     { "(bad)",          { XX } },
4181     { "(bad)",          { XX } },
4182     { "(bad)",          { XX } },
4183     { "(bad)",          { XX } },
4184     { "(bad)",          { XX } },
4185     { "(bad)",          { XX } },
4186     /* e0 */
4187     { "(bad)",          { XX } },
4188     { "(bad)",          { XX } },
4189     { "(bad)",          { XX } },
4190     { "(bad)",          { XX } },
4191     { "(bad)",          { XX } },
4192     { "(bad)",          { XX } },
4193     { "(bad)",          { XX } },
4194     { "(bad)",          { XX } },
4195     /* e8 */
4196     { "(bad)",          { XX } },
4197     { "(bad)",          { XX } },
4198     { "(bad)",          { XX } },
4199     { "(bad)",          { XX } },
4200     { "(bad)",          { XX } },
4201     { "(bad)",          { XX } },
4202     { "(bad)",          { XX } },
4203     { "(bad)",          { XX } },
4204     /* f0 */
4205     { "(bad)",          { XX } },
4206     { "(bad)",          { XX } },
4207     { "(bad)",          { XX } },
4208     { "(bad)",          { XX } },
4209     { "(bad)",          { XX } },
4210     { "(bad)",          { XX } },
4211     { "(bad)",          { XX } },
4212     { "(bad)",          { XX } },
4213     /* f8 */
4214     { "(bad)",          { XX } },
4215     { "(bad)",          { XX } },
4216     { "(bad)",          { XX } },
4217     { "(bad)",          { XX } },
4218     { "(bad)",          { XX } },
4219     { "(bad)",          { XX } },
4220     { "(bad)",          { XX } },
4221     { "(bad)",          { XX } },
4222   },
4223   /* THREE_BYTE_0F7B */
4224   {
4225     /* 00 */
4226     { "(bad)",          { XX } },
4227     { "(bad)",          { XX } },
4228     { "(bad)",          { XX } },
4229     { "(bad)",          { XX } },
4230     { "(bad)",          { XX } },
4231     { "(bad)",          { XX } },
4232     { "(bad)",          { XX } },
4233     { "(bad)",          { XX } },
4234     /* 08 */
4235     { "(bad)",          { XX } },
4236     { "(bad)",          { XX } },
4237     { "(bad)",          { XX } },
4238     { "(bad)",          { XX } },
4239     { "(bad)",          { XX } },
4240     { "(bad)",          { XX } },
4241     { "(bad)",          { XX } },
4242     { "(bad)",          { XX } },
4243     /* 10 */
4244     { "(bad)",          { XX } },
4245     { "(bad)",          { XX } },
4246     { "(bad)",          { XX } },
4247     { "(bad)",          { XX } },
4248     { "(bad)",          { XX } },
4249     { "(bad)",          { XX } },
4250     { "(bad)",          { XX } },
4251     { "(bad)",          { XX } },
4252     /* 18 */
4253     { "(bad)",          { XX } },
4254     { "(bad)",          { XX } },
4255     { "(bad)",          { XX } },
4256     { "(bad)",          { XX } },
4257     { "(bad)",          { XX } },
4258     { "(bad)",          { XX } },
4259     { "(bad)",          { XX } },
4260     { "(bad)",          { XX } },
4261     /* 20 */
4262     { "(bad)",          { XX } },
4263     { "(bad)",          { XX } },
4264     { "(bad)",          { XX } },
4265     { "(bad)",          { XX } },
4266     { "(bad)",          { XX } },
4267     { "(bad)",          { XX } },
4268     { "(bad)",          { XX } },
4269     { "(bad)",          { XX } },
4270     /* 28 */
4271     { "(bad)",          { XX } },
4272     { "(bad)",          { XX } },
4273     { "(bad)",          { XX } },
4274     { "(bad)",          { XX } },
4275     { "(bad)",          { XX } },
4276     { "(bad)",          { XX } },
4277     { "(bad)",          { XX } },
4278     { "(bad)",          { XX } },
4279     /* 30 */
4280     { "(bad)",          { XX } },
4281     { "(bad)",          { XX } },
4282     { "(bad)",          { XX } },
4283     { "(bad)",          { XX } },
4284     { "(bad)",          { XX } },
4285     { "(bad)",          { XX } },
4286     { "(bad)",          { XX } },
4287     { "(bad)",          { XX } },
4288     /* 38 */
4289     { "(bad)",          { XX } },
4290     { "(bad)",          { XX } },
4291     { "(bad)",          { XX } },
4292     { "(bad)",          { XX } },
4293     { "(bad)",          { XX } },
4294     { "(bad)",          { XX } },
4295     { "(bad)",          { XX } },
4296     { "(bad)",          { XX } },
4297     /* 40 */
4298     { "protb",          { XM, EXq, Ib } },
4299     { "protw",          { XM, EXq, Ib } },
4300     { "protd",          { XM, EXq, Ib } },
4301     { "protq",          { XM, EXq, Ib } },
4302     { "pshlb",          { XM, EXq, Ib } },
4303     { "pshlw",          { XM, EXq, Ib } },
4304     { "pshld",          { XM, EXq, Ib } },
4305     { "pshlq",          { XM, EXq, Ib } },
4306     /* 48 */
4307     { "pshab",          { XM, EXq, Ib } },
4308     { "pshaw",          { XM, EXq, Ib } },
4309     { "pshad",          { XM, EXq, Ib } },
4310     { "pshaq",          { XM, EXq, Ib } },
4311     { "(bad)",          { XX } },
4312     { "(bad)",          { XX } },
4313     { "(bad)",          { XX } },
4314     { "(bad)",          { XX } },
4315     /* 50 */
4316     { "(bad)",          { XX } },
4317     { "(bad)",          { XX } },
4318     { "(bad)",          { XX } },
4319     { "(bad)",          { XX } },
4320     { "(bad)",          { XX } },
4321     { "(bad)",          { XX } },
4322     { "(bad)",          { XX } },
4323     { "(bad)",          { XX } },
4324     /* 58 */
4325     { "(bad)",          { XX } },
4326     { "(bad)",          { XX } },
4327     { "(bad)",          { XX } },
4328     { "(bad)",          { XX } },
4329     { "(bad)",          { XX } },
4330     { "(bad)",          { XX } },
4331     { "(bad)",          { XX } },
4332     { "(bad)",          { XX } },
4333     /* 60 */
4334     { "(bad)",          { XX } },
4335     { "(bad)",          { XX } },
4336     { "(bad)",          { XX } },
4337     { "(bad)",          { XX } },
4338     { "(bad)",          { XX } },
4339     { "(bad)",          { XX } },
4340     { "(bad)",          { XX } },
4341     { "(bad)",          { XX } },
4342     /* 68 */
4343     { "(bad)",          { XX } },
4344     { "(bad)",          { XX } },
4345     { "(bad)",          { XX } },
4346     { "(bad)",          { XX } },
4347     { "(bad)",          { XX } },
4348     { "(bad)",          { XX } },
4349     { "(bad)",          { XX } },
4350     { "(bad)",          { XX } },
4351     /* 70 */
4352     { "(bad)",          { XX } },
4353     { "(bad)",          { XX } },
4354     { "(bad)",          { XX } },
4355     { "(bad)",          { XX } },
4356     { "(bad)",          { XX } },
4357     { "(bad)",          { XX } },
4358     { "(bad)",          { XX } },
4359     { "(bad)",          { XX } },
4360     /* 78 */
4361     { "(bad)",          { XX } },
4362     { "(bad)",          { XX } },
4363     { "(bad)",          { XX } },
4364     { "(bad)",          { XX } },
4365     { "(bad)",          { XX } },
4366     { "(bad)",          { XX } },
4367     { "(bad)",          { XX } },
4368     { "(bad)",          { XX } },
4369     /* 80 */
4370     { "(bad)",          { XX } },
4371     { "(bad)",          { XX } },
4372     { "(bad)",          { XX } },
4373     { "(bad)",          { XX } },
4374     { "(bad)",          { XX } },
4375     { "(bad)",          { XX } },
4376     { "(bad)",          { XX } },
4377     { "(bad)",          { XX } },
4378     /* 88 */
4379     { "(bad)",          { XX } },
4380     { "(bad)",          { XX } },
4381     { "(bad)",          { XX } },
4382     { "(bad)",          { XX } },
4383     { "(bad)",          { XX } },
4384     { "(bad)",          { XX } },
4385     { "(bad)",          { XX } },
4386     { "(bad)",          { XX } },
4387     /* 90 */
4388     { "(bad)",          { XX } },
4389     { "(bad)",          { XX } },
4390     { "(bad)",          { XX } },
4391     { "(bad)",          { XX } },
4392     { "(bad)",          { XX } },
4393     { "(bad)",          { XX } },
4394     { "(bad)",          { XX } },
4395     { "(bad)",          { XX } },
4396     /* 98 */
4397     { "(bad)",          { XX } },
4398     { "(bad)",          { XX } },
4399     { "(bad)",          { XX } },
4400     { "(bad)",          { XX } },
4401     { "(bad)",          { XX } },
4402     { "(bad)",          { XX } },
4403     { "(bad)",          { XX } },
4404     { "(bad)",          { XX } },
4405     /* a0 */
4406     { "(bad)",          { XX } },
4407     { "(bad)",          { XX } },
4408     { "(bad)",          { XX } },
4409     { "(bad)",          { XX } },
4410     { "(bad)",          { XX } },
4411     { "(bad)",          { XX } },
4412     { "(bad)",          { XX } },
4413     { "(bad)",          { XX } },
4414     /* a8 */
4415     { "(bad)",          { XX } },
4416     { "(bad)",          { XX } },
4417     { "(bad)",          { XX } },
4418     { "(bad)",          { XX } },
4419     { "(bad)",          { XX } },
4420     { "(bad)",          { XX } },
4421     { "(bad)",          { XX } },
4422     { "(bad)",          { XX } },
4423     /* b0 */
4424     { "(bad)",          { XX } },
4425     { "(bad)",          { XX } },
4426     { "(bad)",          { XX } },
4427     { "(bad)",          { XX } },
4428     { "(bad)",          { XX } },
4429     { "(bad)",          { XX } },
4430     { "(bad)",          { XX } },
4431     { "(bad)",          { XX } },
4432     /* b8 */
4433     { "(bad)",          { XX } },
4434     { "(bad)",          { XX } },
4435     { "(bad)",          { XX } },
4436     { "(bad)",          { XX } },
4437     { "(bad)",          { XX } },
4438     { "(bad)",          { XX } },
4439     { "(bad)",          { XX } },
4440     { "(bad)",          { XX } },
4441     /* c0 */
4442     { "(bad)",          { XX } },
4443     { "(bad)",          { XX } },
4444     { "(bad)",          { XX } },
4445     { "(bad)",          { XX } },
4446     { "(bad)",          { XX } },
4447     { "(bad)",          { XX } },
4448     { "(bad)",          { XX } },
4449     { "(bad)",          { XX } },
4450     /* c8 */
4451     { "(bad)",          { XX } },
4452     { "(bad)",          { XX } },
4453     { "(bad)",          { XX } },
4454     { "(bad)",          { XX } },
4455     { "(bad)",          { XX } },
4456     { "(bad)",          { XX } },
4457     { "(bad)",          { XX } },
4458     { "(bad)",          { XX } },
4459     /* d0 */
4460     { "(bad)",          { XX } },
4461     { "(bad)",          { XX } },
4462     { "(bad)",          { XX } },
4463     { "(bad)",          { XX } },
4464     { "(bad)",          { XX } },
4465     { "(bad)",          { XX } },
4466     { "(bad)",          { XX } },
4467     { "(bad)",          { XX } },
4468     /* d8 */
4469     { "(bad)",          { XX } },
4470     { "(bad)",          { XX } },
4471     { "(bad)",          { XX } },
4472     { "(bad)",          { XX } },
4473     { "(bad)",          { XX } },
4474     { "(bad)",          { XX } },
4475     { "(bad)",          { XX } },
4476     { "(bad)",          { XX } },
4477     /* e0 */
4478     { "(bad)",          { XX } },
4479     { "(bad)",          { XX } },
4480     { "(bad)",          { XX } },
4481     { "(bad)",          { XX } },
4482     { "(bad)",          { XX } },
4483     { "(bad)",          { XX } },
4484     { "(bad)",          { XX } },
4485     { "(bad)",          { XX } },
4486     /* e8 */
4487     { "(bad)",          { XX } },
4488     { "(bad)",          { XX } },
4489     { "(bad)",          { XX } },
4490     { "(bad)",          { XX } },
4491     { "(bad)",          { XX } },
4492     { "(bad)",          { XX } },
4493     { "(bad)",          { XX } },
4494     { "(bad)",          { XX } },
4495     /* f0 */
4496     { "(bad)",          { XX } },
4497     { "(bad)",          { XX } },
4498     { "(bad)",          { XX } },
4499     { "(bad)",          { XX } },
4500     { "(bad)",          { XX } },
4501     { "(bad)",          { XX } },
4502     { "(bad)",          { XX } },
4503     { "(bad)",          { XX } },
4504     /* f8 */
4505     { "(bad)",          { XX } },
4506     { "(bad)",          { XX } },
4507     { "(bad)",          { XX } },
4508     { "(bad)",          { XX } },
4509     { "(bad)",          { XX } },
4510     { "(bad)",          { XX } },
4511     { "(bad)",          { XX } },
4512     { "(bad)",          { XX } },
4513   }
4514 };
4515
4516 static const struct dis386 mod_table[][2] = {
4517   {
4518     /* MOD_8D */
4519     { "leaS",           { Gv, M } },
4520     { "(bad)",          { XX } },
4521   },
4522   {
4523     /* MOD_0F01_REG_0 */
4524     { X86_64_TABLE (X86_64_0F01_REG_0) },
4525     { RM_TABLE (RM_0F01_REG_0) },
4526   },
4527   {
4528     /* MOD_0F01_REG_1 */
4529     { X86_64_TABLE (X86_64_0F01_REG_1) },
4530     { RM_TABLE (RM_0F01_REG_1) },
4531   },
4532   {
4533     /* MOD_0F01_REG_2 */
4534     { X86_64_TABLE (X86_64_0F01_REG_2) },
4535     { "(bad)",          { XX } },
4536   },
4537   {
4538     /* MOD_0F01_REG_3 */
4539     { X86_64_TABLE (X86_64_0F01_REG_3) },
4540     { RM_TABLE (RM_0F01_REG_3) },
4541   },
4542   {
4543     /* MOD_0F01_REG_7 */
4544     { "invlpg",         { Mb } },
4545     { RM_TABLE (RM_0F01_REG_7) },
4546   },
4547   {
4548     /* MOD_0F12_PREFIX_0 */
4549     { "movlps",         { XM, EXq } },
4550     { "movhlps",        { XM, EXq } },
4551   },
4552   {
4553     /* MOD_0F13 */
4554     { "movlpX",         { EXq, XM } },
4555     { "(bad)",          { XX } },
4556   },
4557   {
4558     /* MOD_0F16_PREFIX_0 */
4559     { "movhps",         { XM, EXq } },
4560     { "movlhps",        { XM, EXq } },
4561   },
4562   {
4563     /* MOD_0F17 */
4564     { "movhpX",         { EXq, XM } },
4565     { "(bad)",          { XX } },
4566   },
4567   {
4568     /* MOD_0F18_REG_0 */
4569     { "prefetchnta",    { Mb } },
4570     { "(bad)",          { XX } },
4571   },
4572   {
4573     /* MOD_0F18_REG_1 */
4574     { "prefetcht0",     { Mb } },
4575     { "(bad)",          { XX } },
4576   },
4577   {
4578     /* MOD_0F18_REG_2 */
4579     { "prefetcht1",     { Mb } },
4580     { "(bad)",          { XX } },
4581   },
4582   {
4583     /* MOD_0F18_REG_3 */
4584     { "prefetcht2",     { Mb } },
4585     { "(bad)",          { XX } },
4586   },
4587   {
4588     /* MOD_0F20 */
4589     { "(bad)",          { XX } },
4590     { "movZ",           { Rm, Cm } },
4591   },
4592   {
4593     /* MOD_0F21 */
4594     { "(bad)",          { XX } },
4595     { "movZ",           { Rm, Dm } },
4596   },
4597   {
4598     /* MOD_0F22 */
4599     { "(bad)",          { XX } },
4600     { "movZ",           { Cm, Rm } },
4601   },
4602   {
4603     /* MOD_0F23 */
4604     { "(bad)",          { XX } },
4605     { "movZ",           { Dm, Rm } },
4606   },
4607   {
4608     /* MOD_0F24 */
4609     { THREE_BYTE_TABLE (THREE_BYTE_0F24) },
4610     { "movL",           { Rd, Td } },
4611   },
4612   {
4613     /* MOD_0F26 */
4614     { "(bad)",          { XX } },
4615     { "movL",           { Td, Rd } },
4616   },
4617   {
4618     /* MOD_0F2B_PREFIX_0 */
4619     {"movntps",         { Ev, XM } },
4620     { "(bad)",          { XX } },
4621   },
4622   {
4623     /* MOD_0F2B_PREFIX_1 */
4624     {"movntss",         { Ed, XM } },
4625     { "(bad)",          { XX } },
4626   },
4627   {
4628     /* MOD_0F2B_PREFIX_2 */
4629     {"movntpd",         { Ev, XM } },
4630     { "(bad)",          { XX } },
4631   },
4632   {
4633     /* MOD_0F2B_PREFIX_3 */
4634     {"movntsd",         { Eq, XM } },
4635     { "(bad)",          { XX } },
4636   },
4637   {
4638     /* MOD_0F51 */
4639     { "(bad)",          { XX } },
4640     { "movmskpX",       { Gdq, XS } },
4641   },
4642   {
4643     /* MOD_0F71_REG_2 */
4644     { "(bad)",          { XX } },
4645     { "psrlw",          { MS, Ib } },
4646   },
4647   {
4648     /* MOD_0F71_REG_4 */
4649     { "(bad)",          { XX } },
4650     { "psraw",          { MS, Ib } },
4651   },
4652   {
4653     /* MOD_0F71_REG_6 */
4654     { "(bad)",          { XX } },
4655     { "psllw",          { MS, Ib } },
4656   },
4657   {
4658     /* MOD_0F72_REG_2 */
4659     { "(bad)",          { XX } },
4660     { "psrld",          { MS, Ib } },
4661   },
4662   {
4663     /* MOD_0F72_REG_4 */
4664     { "(bad)",          { XX } },
4665     { "psrad",          { MS, Ib } },
4666   },
4667   {
4668     /* MOD_0F72_REG_6 */
4669     { "(bad)",          { XX } },
4670     { "pslld",          { MS, Ib } },
4671   },
4672   {
4673     /* MOD_0F73_REG_2 */
4674     { "(bad)",          { XX } },
4675     { "psrlq",          { MS, Ib } },
4676   },
4677   {
4678     /* MOD_0F73_REG_3 */
4679     { "(bad)",          { XX } },
4680     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
4681   },
4682   {
4683     /* MOD_0F73_REG_6 */
4684     { "(bad)",          { XX } },
4685     { "psllq",          { MS, Ib } },
4686   },
4687   {
4688     /* MOD_0F73_REG_7 */
4689     { "(bad)",          { XX } },
4690     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
4691   },
4692   {
4693     /* MOD_0FAE_REG_0 */
4694     { "fxsave",         { M } },
4695     { "(bad)",          { XX } },
4696   },
4697   {
4698     /* MOD_0FAE_REG_1 */
4699     { "fxrstor",        { M } },
4700     { "(bad)",          { XX } },
4701   },
4702   {
4703     /* MOD_0FAE_REG_2 */
4704     { "ldmxcsr",        { Md } },
4705     { "(bad)",          { XX } },
4706   },
4707   {
4708     /* MOD_0FAE_REG_3 */
4709     { "stmxcsr",        { Md } },
4710     { "(bad)",          { XX } },
4711   },
4712   {
4713     /* MOD_0FAE_REG_5 */
4714     { "(bad)",          { XX } },
4715     { RM_TABLE (RM_0FAE_REG_5) },
4716   },
4717   {
4718     /* MOD_0FAE_REG_6 */
4719     { "(bad)",          { XX } },
4720     { RM_TABLE (RM_0FAE_REG_6) },
4721   },
4722   {
4723     /* MOD_0FAE_REG_7 */
4724     { "clflush",        { Mb } },
4725     { RM_TABLE (RM_0FAE_REG_7) },
4726   },
4727   {
4728     /* MOD_0FB2 */
4729     { "lssS",           { Gv, Mp } },
4730     { "(bad)",          { XX } },
4731   },
4732   {
4733     /* MOD_0FB4 */
4734     { "lfsS",           { Gv, Mp } },
4735     { "(bad)",          { XX } },
4736   },
4737   {
4738     /* MOD_0FB5 */
4739     { "lgsS",           { Gv, Mp } },
4740     { "(bad)",          { XX } },
4741   },
4742   {
4743     /* MOD_0FC7_REG_6 */
4744     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
4745     { "(bad)",          { XX } },
4746   },
4747   {
4748     /* MOD_0FC7_REG_7 */
4749     { "vmptrst",        { Mq } },
4750     { "(bad)",          { XX } },
4751   },
4752   {
4753     /* MOD_0FD7 */
4754     { "(bad)",          { XX } },
4755     { "pmovmskb",       { Gdq, MS } },
4756   },
4757   {
4758     /* MOD_0FE7_PREFIX_2 */
4759     { "movntdq",        { EM, XM } },
4760     { "(bad)",          { XX } },
4761   },
4762   {
4763     /* MOD_0FF0_PREFIX_3 */
4764     { "lddqu",          { XM, M } },
4765     { "(bad)",          { XX } },
4766   },
4767   {
4768     /* MOD_0F382A_PREFIX_2 */
4769     { "movntdqa",       { XM, EM } },
4770     { "(bad)",          { XX } },
4771   },
4772   {
4773     /* MOD_62_32BIT */
4774     { "bound{S|}",      { Gv, Ma } },
4775     { "(bad)",          { XX } },
4776   },
4777   {
4778     /* MOD_C4_32BIT */
4779     { "lesS",           { Gv, Mp } },
4780     { "(bad)",          { XX } },
4781   },
4782   {
4783     /* MOD_C5_32BIT */
4784     { "ldsS",           { Gv, Mp } },
4785     { "(bad)",          { XX } },
4786   },
4787 };
4788
4789 static const struct dis386 rm_table[][8] = {
4790   {
4791     /* RM_0F01_REG_0 */
4792     { "(bad)",          { XX } },
4793     { "vmcall",         { Skip_MODRM } },
4794     { "vmlaunch",       { Skip_MODRM } },
4795     { "vmresume",       { Skip_MODRM } },
4796     { "vmxoff",         { Skip_MODRM } },
4797     { "(bad)",          { XX } },
4798     { "(bad)",          { XX } },
4799     { "(bad)",          { XX } },
4800   },
4801   {
4802     /* RM_0F01_REG_1 */
4803     { "monitor",        { { OP_Monitor, 0 } } },
4804     { "mwait",          { { OP_Mwait, 0 } } },
4805     { "(bad)",          { XX } },
4806     { "(bad)",          { XX } },
4807     { "(bad)",          { XX } },
4808     { "(bad)",          { XX } },
4809     { "(bad)",          { XX } },
4810     { "(bad)",          { XX } },
4811   },
4812   {
4813     /* RM_0F01_REG_3 */
4814     { "vmrun",          { Skip_MODRM } },
4815     { "vmmcall",        { Skip_MODRM } },
4816     { "vmload",         { Skip_MODRM } },
4817     { "vmsave",         { Skip_MODRM } },
4818     { "stgi",           { Skip_MODRM } },
4819     { "clgi",           { Skip_MODRM } },
4820     { "skinit",         { Skip_MODRM } },
4821     { "invlpga",        { Skip_MODRM } },
4822   },
4823   {
4824     /* RM_0F01_REG_7 */
4825     { "swapgs",         { Skip_MODRM } },
4826     { "rdtscp",         { Skip_MODRM } },
4827     { "(bad)",          { XX } },
4828     { "(bad)",          { XX } },
4829     { "(bad)",          { XX } },
4830     { "(bad)",          { XX } },
4831     { "(bad)",          { XX } },
4832     { "(bad)",          { XX } },
4833   },
4834   {
4835     /* RM_0FAE_REG_5 */
4836     { "lfence",         { Skip_MODRM } },
4837     { "(bad)",          { XX } },
4838     { "(bad)",          { XX } },
4839     { "(bad)",          { XX } },
4840     { "(bad)",          { XX } },
4841     { "(bad)",          { XX } },
4842     { "(bad)",          { XX } },
4843     { "(bad)",          { XX } },
4844   },
4845   {
4846     /* RM_0FAE_REG_6 */
4847     { "mfence",         { Skip_MODRM } },
4848     { "(bad)",          { XX } },
4849     { "(bad)",          { XX } },
4850     { "(bad)",          { XX } },
4851     { "(bad)",          { XX } },
4852     { "(bad)",          { XX } },
4853     { "(bad)",          { XX } },
4854     { "(bad)",          { XX } },
4855   },
4856   {
4857     /* RM_0FAE_REG_7 */
4858     { "sfence",         { Skip_MODRM } },
4859     { "(bad)",          { XX } },
4860     { "(bad)",          { XX } },
4861     { "(bad)",          { XX } },
4862     { "(bad)",          { XX } },
4863     { "(bad)",          { XX } },
4864     { "(bad)",          { XX } },
4865     { "(bad)",          { XX } },
4866   },
4867 };
4868
4869 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
4870
4871 static void
4872 ckprefix (void)
4873 {
4874   int newrex;
4875   rex = 0;
4876   prefixes = 0;
4877   used_prefixes = 0;
4878   rex_used = 0;
4879   while (1)
4880     {
4881       FETCH_DATA (the_info, codep + 1);
4882       newrex = 0;
4883       switch (*codep)
4884         {
4885         /* REX prefixes family.  */
4886         case 0x40:
4887         case 0x41:
4888         case 0x42:
4889         case 0x43:
4890         case 0x44:
4891         case 0x45:
4892         case 0x46:
4893         case 0x47:
4894         case 0x48:
4895         case 0x49:
4896         case 0x4a:
4897         case 0x4b:
4898         case 0x4c:
4899         case 0x4d:
4900         case 0x4e:
4901         case 0x4f:
4902             if (address_mode == mode_64bit)
4903               newrex = *codep;
4904             else
4905               return;
4906           break;
4907         case 0xf3:
4908           prefixes |= PREFIX_REPZ;
4909           break;
4910         case 0xf2:
4911           prefixes |= PREFIX_REPNZ;
4912           break;
4913         case 0xf0:
4914           prefixes |= PREFIX_LOCK;
4915           break;
4916         case 0x2e:
4917           prefixes |= PREFIX_CS;
4918           break;
4919         case 0x36:
4920           prefixes |= PREFIX_SS;
4921           break;
4922         case 0x3e:
4923           prefixes |= PREFIX_DS;
4924           break;
4925         case 0x26:
4926           prefixes |= PREFIX_ES;
4927           break;
4928         case 0x64:
4929           prefixes |= PREFIX_FS;
4930           break;
4931         case 0x65:
4932           prefixes |= PREFIX_GS;
4933           break;
4934         case 0x66:
4935           prefixes |= PREFIX_DATA;
4936           break;
4937         case 0x67:
4938           prefixes |= PREFIX_ADDR;
4939           break;
4940         case FWAIT_OPCODE:
4941           /* fwait is really an instruction.  If there are prefixes
4942              before the fwait, they belong to the fwait, *not* to the
4943              following instruction.  */
4944           if (prefixes || rex)
4945             {
4946               prefixes |= PREFIX_FWAIT;
4947               codep++;
4948               return;
4949             }
4950           prefixes = PREFIX_FWAIT;
4951           break;
4952         default:
4953           return;
4954         }
4955       /* Rex is ignored when followed by another prefix.  */
4956       if (rex)
4957         {
4958           rex_used = rex;
4959           return;
4960         }
4961       rex = newrex;
4962       codep++;
4963     }
4964 }
4965
4966 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
4967    prefix byte.  */
4968
4969 static const char *
4970 prefix_name (int pref, int sizeflag)
4971 {
4972   static const char *rexes [16] =
4973     {
4974       "rex",            /* 0x40 */
4975       "rex.B",          /* 0x41 */
4976       "rex.X",          /* 0x42 */
4977       "rex.XB",         /* 0x43 */
4978       "rex.R",          /* 0x44 */
4979       "rex.RB",         /* 0x45 */
4980       "rex.RX",         /* 0x46 */
4981       "rex.RXB",        /* 0x47 */
4982       "rex.W",          /* 0x48 */
4983       "rex.WB",         /* 0x49 */
4984       "rex.WX",         /* 0x4a */
4985       "rex.WXB",        /* 0x4b */
4986       "rex.WR",         /* 0x4c */
4987       "rex.WRB",        /* 0x4d */
4988       "rex.WRX",        /* 0x4e */
4989       "rex.WRXB",       /* 0x4f */
4990     };
4991
4992   switch (pref)
4993     {
4994     /* REX prefixes family.  */
4995     case 0x40:
4996     case 0x41:
4997     case 0x42:
4998     case 0x43:
4999     case 0x44:
5000     case 0x45:
5001     case 0x46:
5002     case 0x47:
5003     case 0x48:
5004     case 0x49:
5005     case 0x4a:
5006     case 0x4b:
5007     case 0x4c:
5008     case 0x4d:
5009     case 0x4e:
5010     case 0x4f:
5011       return rexes [pref - 0x40];
5012     case 0xf3:
5013       return "repz";
5014     case 0xf2:
5015       return "repnz";
5016     case 0xf0:
5017       return "lock";
5018     case 0x2e:
5019       return "cs";
5020     case 0x36:
5021       return "ss";
5022     case 0x3e:
5023       return "ds";
5024     case 0x26:
5025       return "es";
5026     case 0x64:
5027       return "fs";
5028     case 0x65:
5029       return "gs";
5030     case 0x66:
5031       return (sizeflag & DFLAG) ? "data16" : "data32";
5032     case 0x67:
5033       if (address_mode == mode_64bit)
5034         return (sizeflag & AFLAG) ? "addr32" : "addr64";
5035       else
5036         return (sizeflag & AFLAG) ? "addr16" : "addr32";
5037     case FWAIT_OPCODE:
5038       return "fwait";
5039     default:
5040       return NULL;
5041     }
5042 }
5043
5044 static char op_out[MAX_OPERANDS][100];
5045 static int op_ad, op_index[MAX_OPERANDS];
5046 static int two_source_ops;
5047 static bfd_vma op_address[MAX_OPERANDS];
5048 static bfd_vma op_riprel[MAX_OPERANDS];
5049 static bfd_vma start_pc;
5050
5051 /*
5052  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
5053  *   (see topic "Redundant prefixes" in the "Differences from 8086"
5054  *   section of the "Virtual 8086 Mode" chapter.)
5055  * 'pc' should be the address of this instruction, it will
5056  *   be used to print the target address if this is a relative jump or call
5057  * The function returns the length of this instruction in bytes.
5058  */
5059
5060 static char intel_syntax;
5061 static char open_char;
5062 static char close_char;
5063 static char separator_char;
5064 static char scale_char;
5065
5066 /* Here for backwards compatibility.  When gdb stops using
5067    print_insn_i386_att and print_insn_i386_intel these functions can
5068    disappear, and print_insn_i386 be merged into print_insn.  */
5069 int
5070 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
5071 {
5072   intel_syntax = 0;
5073
5074   return print_insn (pc, info);
5075 }
5076
5077 int
5078 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
5079 {
5080   intel_syntax = 1;
5081
5082   return print_insn (pc, info);
5083 }
5084
5085 int
5086 print_insn_i386 (bfd_vma pc, disassemble_info *info)
5087 {
5088   intel_syntax = -1;
5089
5090   return print_insn (pc, info);
5091 }
5092
5093 void
5094 print_i386_disassembler_options (FILE *stream)
5095 {
5096   fprintf (stream, _("\n\
5097 The following i386/x86-64 specific disassembler options are supported for use\n\
5098 with the -M switch (multiple options should be separated by commas):\n"));
5099
5100   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
5101   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
5102   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
5103   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
5104   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
5105   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
5106   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
5107   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
5108   fprintf (stream, _("  data32      Assume 32bit data size\n"));
5109   fprintf (stream, _("  data16      Assume 16bit data size\n"));
5110   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
5111 }
5112
5113 /* Get a pointer to struct dis386 with a valid name.  */
5114
5115 static const struct dis386 *
5116 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
5117 {
5118   int index;
5119
5120   if (dp->name != NULL)
5121     return dp;
5122
5123   switch (dp->op[0].bytemode)
5124     {
5125     case USE_REG_TABLE:
5126       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
5127       break;
5128
5129     case USE_MOD_TABLE:
5130       index = modrm.mod == 0x3 ? 1 : 0;
5131       dp = &mod_table[dp->op[1].bytemode][index];
5132       break;
5133
5134     case USE_RM_TABLE:
5135       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
5136       break;
5137
5138     case USE_PREFIX_TABLE:
5139       index = 0;
5140       used_prefixes |= (prefixes & PREFIX_REPZ);
5141       if (prefixes & PREFIX_REPZ)
5142         {
5143           index = 1;
5144           repz_prefix = NULL;
5145         }
5146       else
5147         {
5148           /* We should check PREFIX_REPNZ and PREFIX_REPZ before
5149              PREFIX_DATA.  */
5150           used_prefixes |= (prefixes & PREFIX_REPNZ);
5151           if (prefixes & PREFIX_REPNZ)
5152             {
5153               index = 3;
5154               repnz_prefix = NULL;
5155             }
5156           else
5157             {
5158               used_prefixes |= (prefixes & PREFIX_DATA);
5159               if (prefixes & PREFIX_DATA)
5160                 {
5161                   index = 2;
5162                   data_prefix = NULL;
5163                 }
5164             }
5165         }
5166       dp = &prefix_table[dp->op[1].bytemode][index];
5167       break;
5168
5169     case USE_X86_64_TABLE:
5170       index = address_mode == mode_64bit ? 1 : 0;
5171       dp = &x86_64_table[dp->op[1].bytemode][index];
5172       break;
5173
5174     case USE_3BYTE_TABLE:
5175       FETCH_DATA (info, codep + 2);
5176       index = *codep++;
5177       dp = &three_byte_table[dp->op[1].bytemode][index];
5178       modrm.mod = (*codep >> 6) & 3;
5179       modrm.reg = (*codep >> 3) & 7;
5180       modrm.rm = *codep & 7;
5181       break;
5182
5183     default:
5184       oappend (INTERNAL_DISASSEMBLER_ERROR);
5185       return NULL;
5186     }
5187
5188   if (dp->name != NULL)
5189     return dp;
5190   else
5191     return get_valid_dis386 (dp, info);
5192 }
5193
5194 static int
5195 print_insn (bfd_vma pc, disassemble_info *info)
5196 {
5197   const struct dis386 *dp;
5198   int i;
5199   char *op_txt[MAX_OPERANDS];
5200   int needcomma;
5201   int sizeflag;
5202   const char *p;
5203   struct dis_private priv;
5204   unsigned char op;
5205   char prefix_obuf[32];
5206   char *prefix_obufp;
5207
5208   if (info->mach == bfd_mach_x86_64_intel_syntax
5209       || info->mach == bfd_mach_x86_64)
5210     address_mode = mode_64bit;
5211   else
5212     address_mode = mode_32bit;
5213
5214   if (intel_syntax == (char) -1)
5215     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
5216                     || info->mach == bfd_mach_x86_64_intel_syntax);
5217
5218   if (info->mach == bfd_mach_i386_i386
5219       || info->mach == bfd_mach_x86_64
5220       || info->mach == bfd_mach_i386_i386_intel_syntax
5221       || info->mach == bfd_mach_x86_64_intel_syntax)
5222     priv.orig_sizeflag = AFLAG | DFLAG;
5223   else if (info->mach == bfd_mach_i386_i8086)
5224     priv.orig_sizeflag = 0;
5225   else
5226     abort ();
5227
5228   for (p = info->disassembler_options; p != NULL; )
5229     {
5230       if (CONST_STRNEQ (p, "x86-64"))
5231         {
5232           address_mode = mode_64bit;
5233           priv.orig_sizeflag = AFLAG | DFLAG;
5234         }
5235       else if (CONST_STRNEQ (p, "i386"))
5236         {
5237           address_mode = mode_32bit;
5238           priv.orig_sizeflag = AFLAG | DFLAG;
5239         }
5240       else if (CONST_STRNEQ (p, "i8086"))
5241         {
5242           address_mode = mode_16bit;
5243           priv.orig_sizeflag = 0;
5244         }
5245       else if (CONST_STRNEQ (p, "intel"))
5246         {
5247           intel_syntax = 1;
5248         }
5249       else if (CONST_STRNEQ (p, "att"))
5250         {
5251           intel_syntax = 0;
5252         }
5253       else if (CONST_STRNEQ (p, "addr"))
5254         {
5255           if (address_mode == mode_64bit)
5256             {
5257               if (p[4] == '3' && p[5] == '2')
5258                 priv.orig_sizeflag &= ~AFLAG;
5259               else if (p[4] == '6' && p[5] == '4')
5260                 priv.orig_sizeflag |= AFLAG;
5261             }
5262           else
5263             {
5264               if (p[4] == '1' && p[5] == '6')
5265                 priv.orig_sizeflag &= ~AFLAG;
5266               else if (p[4] == '3' && p[5] == '2')
5267                 priv.orig_sizeflag |= AFLAG;
5268             }
5269         }
5270       else if (CONST_STRNEQ (p, "data"))
5271         {
5272           if (p[4] == '1' && p[5] == '6')
5273             priv.orig_sizeflag &= ~DFLAG;
5274           else if (p[4] == '3' && p[5] == '2')
5275             priv.orig_sizeflag |= DFLAG;
5276         }
5277       else if (CONST_STRNEQ (p, "suffix"))
5278         priv.orig_sizeflag |= SUFFIX_ALWAYS;
5279
5280       p = strchr (p, ',');
5281       if (p != NULL)
5282         p++;
5283     }
5284
5285   if (intel_syntax)
5286     {
5287       names64 = intel_names64;
5288       names32 = intel_names32;
5289       names16 = intel_names16;
5290       names8 = intel_names8;
5291       names8rex = intel_names8rex;
5292       names_seg = intel_names_seg;
5293       index64 = intel_index64;
5294       index32 = intel_index32;
5295       index16 = intel_index16;
5296       open_char = '[';
5297       close_char = ']';
5298       separator_char = '+';
5299       scale_char = '*';
5300     }
5301   else
5302     {
5303       names64 = att_names64;
5304       names32 = att_names32;
5305       names16 = att_names16;
5306       names8 = att_names8;
5307       names8rex = att_names8rex;
5308       names_seg = att_names_seg;
5309       index64 = att_index64;
5310       index32 = att_index32;
5311       index16 = att_index16;
5312       open_char = '(';
5313       close_char =  ')';
5314       separator_char = ',';
5315       scale_char = ',';
5316     }
5317
5318   /* The output looks better if we put 7 bytes on a line, since that
5319      puts most long word instructions on a single line.  */
5320   info->bytes_per_line = 7;
5321
5322   info->private_data = &priv;
5323   priv.max_fetched = priv.the_buffer;
5324   priv.insn_start = pc;
5325
5326   obuf[0] = 0;
5327   for (i = 0; i < MAX_OPERANDS; ++i)
5328     {
5329       op_out[i][0] = 0;
5330       op_index[i] = -1;
5331     }
5332
5333   the_info = info;
5334   start_pc = pc;
5335   start_codep = priv.the_buffer;
5336   codep = priv.the_buffer;
5337
5338   if (setjmp (priv.bailout) != 0)
5339     {
5340       const char *name;
5341
5342       /* Getting here means we tried for data but didn't get it.  That
5343          means we have an incomplete instruction of some sort.  Just
5344          print the first byte as a prefix or a .byte pseudo-op.  */
5345       if (codep > priv.the_buffer)
5346         {
5347           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5348           if (name != NULL)
5349             (*info->fprintf_func) (info->stream, "%s", name);
5350           else
5351             {
5352               /* Just print the first byte as a .byte instruction.  */
5353               (*info->fprintf_func) (info->stream, ".byte 0x%x",
5354                                      (unsigned int) priv.the_buffer[0]);
5355             }
5356
5357           return 1;
5358         }
5359
5360       return -1;
5361     }
5362
5363   obufp = obuf;
5364   ckprefix ();
5365
5366   insn_codep = codep;
5367   sizeflag = priv.orig_sizeflag;
5368
5369   FETCH_DATA (info, codep + 1);
5370   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
5371
5372   if (((prefixes & PREFIX_FWAIT)
5373        && ((*codep < 0xd8) || (*codep > 0xdf)))
5374       || (rex && rex_used))
5375     {
5376       const char *name;
5377
5378       /* fwait not followed by floating point instruction, or rex followed
5379          by other prefixes.  Print the first prefix.  */
5380       name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5381       if (name == NULL)
5382         name = INTERNAL_DISASSEMBLER_ERROR;
5383       (*info->fprintf_func) (info->stream, "%s", name);
5384       return 1;
5385     }
5386
5387   op = 0;
5388   if (*codep == 0x0f)
5389     {
5390       unsigned char threebyte;
5391       FETCH_DATA (info, codep + 2);
5392       threebyte = *++codep;
5393       dp = &dis386_twobyte[threebyte];
5394       need_modrm = twobyte_has_modrm[*codep];
5395       codep++;
5396     }
5397   else
5398     {
5399       dp = &dis386[*codep];
5400       need_modrm = onebyte_has_modrm[*codep];
5401       codep++;
5402     }
5403
5404   if ((prefixes & PREFIX_REPZ))
5405     {
5406       repz_prefix = "repz ";
5407       used_prefixes |= PREFIX_REPZ;
5408     }
5409   else
5410     repz_prefix = NULL;
5411
5412   if ((prefixes & PREFIX_REPNZ))
5413     {
5414       repnz_prefix = "repnz ";
5415       used_prefixes |= PREFIX_REPNZ;
5416     }
5417   else
5418     repnz_prefix = NULL;
5419
5420   if ((prefixes & PREFIX_LOCK))
5421     {
5422       lock_prefix = "lock ";
5423       used_prefixes |= PREFIX_LOCK;
5424     }
5425   else
5426     lock_prefix = NULL;
5427
5428   addr_prefix = NULL;
5429   if (prefixes & PREFIX_ADDR)
5430     {
5431       sizeflag ^= AFLAG;
5432       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
5433         {
5434           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
5435             addr_prefix = "addr32 ";
5436           else
5437             addr_prefix = "addr16 ";
5438           used_prefixes |= PREFIX_ADDR;
5439         }
5440     }
5441
5442   data_prefix = NULL;
5443   if ((prefixes & PREFIX_DATA))
5444     {
5445       sizeflag ^= DFLAG;
5446       if (dp->op[2].bytemode == cond_jump_mode
5447           && dp->op[0].bytemode == v_mode
5448           && !intel_syntax)
5449         {
5450           if (sizeflag & DFLAG)
5451             data_prefix = "data32 ";
5452           else
5453             data_prefix = "data16 ";
5454           used_prefixes |= PREFIX_DATA;
5455         }
5456     }
5457
5458   if (need_modrm)
5459     {
5460       FETCH_DATA (info, codep + 1);
5461       modrm.mod = (*codep >> 6) & 3;
5462       modrm.reg = (*codep >> 3) & 7;
5463       modrm.rm = *codep & 7;
5464     }
5465
5466   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
5467     {
5468       dofloat (sizeflag);
5469     }
5470   else
5471     {
5472       dp = get_valid_dis386 (dp, info);
5473       if (dp != NULL && putop (dp->name, sizeflag) == 0)
5474         {
5475           for (i = 0; i < MAX_OPERANDS; ++i)
5476             {
5477               obufp = op_out[i];
5478               op_ad = MAX_OPERANDS - 1 - i;
5479               if (dp->op[i].rtn)
5480                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
5481             }
5482         }
5483     }
5484
5485   /* See if any prefixes were not used.  If so, print the first one
5486      separately.  If we don't do this, we'll wind up printing an
5487      instruction stream which does not precisely correspond to the
5488      bytes we are disassembling.  */
5489   if ((prefixes & ~used_prefixes) != 0)
5490     {
5491       const char *name;
5492
5493       name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5494       if (name == NULL)
5495         name = INTERNAL_DISASSEMBLER_ERROR;
5496       (*info->fprintf_func) (info->stream, "%s", name);
5497       return 1;
5498     }
5499   if (rex & ~rex_used)
5500     {
5501       const char *name;
5502       name = prefix_name (rex | 0x40, priv.orig_sizeflag);
5503       if (name == NULL)
5504         name = INTERNAL_DISASSEMBLER_ERROR;
5505       (*info->fprintf_func) (info->stream, "%s ", name);
5506     }
5507
5508   prefix_obuf[0] = 0;
5509   prefix_obufp = prefix_obuf;
5510   if (lock_prefix)
5511     prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
5512   if (repz_prefix)
5513     prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
5514   if (repnz_prefix)
5515     prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
5516   if (addr_prefix)
5517     prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
5518   if (data_prefix)
5519     prefix_obufp = stpcpy (prefix_obufp, data_prefix);
5520
5521   if (prefix_obuf[0] != 0)
5522     (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
5523
5524   obufp = obuf + strlen (obuf);
5525   for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
5526     oappend (" ");
5527   oappend (" ");
5528   (*info->fprintf_func) (info->stream, "%s", obuf);
5529
5530   /* The enter and bound instructions are printed with operands in the same
5531      order as the intel book; everything else is printed in reverse order.  */
5532   if (intel_syntax || two_source_ops)
5533     {
5534       bfd_vma riprel;
5535
5536       for (i = 0; i < MAX_OPERANDS; ++i)
5537         op_txt[i] = op_out[i];
5538
5539       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
5540         {
5541           op_ad = op_index[i];
5542           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
5543           op_index[MAX_OPERANDS - 1 - i] = op_ad;
5544           riprel = op_riprel[i];
5545           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
5546           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
5547         }
5548     }
5549   else
5550     {
5551       for (i = 0; i < MAX_OPERANDS; ++i)
5552         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
5553     }
5554
5555   needcomma = 0;
5556   for (i = 0; i < MAX_OPERANDS; ++i)
5557     if (*op_txt[i])
5558       {
5559         if (needcomma)
5560           (*info->fprintf_func) (info->stream, ",");
5561         if (op_index[i] != -1 && !op_riprel[i])
5562           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
5563         else
5564           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
5565         needcomma = 1;
5566       }
5567
5568   for (i = 0; i < MAX_OPERANDS; i++)
5569     if (op_index[i] != -1 && op_riprel[i])
5570       {
5571         (*info->fprintf_func) (info->stream, "        # ");
5572         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
5573                                                 + op_address[op_index[i]]), info);
5574         break;
5575       }
5576   return codep - priv.the_buffer;
5577 }
5578
5579 static const char *float_mem[] = {
5580   /* d8 */
5581   "fadd{s|}",
5582   "fmul{s|}",
5583   "fcom{s|}",
5584   "fcomp{s|}",
5585   "fsub{s|}",
5586   "fsubr{s|}",
5587   "fdiv{s|}",
5588   "fdivr{s|}",
5589   /* d9 */
5590   "fld{s|}",
5591   "(bad)",
5592   "fst{s|}",
5593   "fstp{s|}",
5594   "fldenvIC",
5595   "fldcw",
5596   "fNstenvIC",
5597   "fNstcw",
5598   /* da */
5599   "fiadd{l|}",
5600   "fimul{l|}",
5601   "ficom{l|}",
5602   "ficomp{l|}",
5603   "fisub{l|}",
5604   "fisubr{l|}",
5605   "fidiv{l|}",
5606   "fidivr{l|}",
5607   /* db */
5608   "fild{l|}",
5609   "fisttp{l|}",
5610   "fist{l|}",
5611   "fistp{l|}",
5612   "(bad)",
5613   "fld{t||t|}",
5614   "(bad)",
5615   "fstp{t||t|}",
5616   /* dc */
5617   "fadd{l|}",
5618   "fmul{l|}",
5619   "fcom{l|}",
5620   "fcomp{l|}",
5621   "fsub{l|}",
5622   "fsubr{l|}",
5623   "fdiv{l|}",
5624   "fdivr{l|}",
5625   /* dd */
5626   "fld{l|}",
5627   "fisttp{ll|}",
5628   "fst{l||}",
5629   "fstp{l|}",
5630   "frstorIC",
5631   "(bad)",
5632   "fNsaveIC",
5633   "fNstsw",
5634   /* de */
5635   "fiadd",
5636   "fimul",
5637   "ficom",
5638   "ficomp",
5639   "fisub",
5640   "fisubr",
5641   "fidiv",
5642   "fidivr",
5643   /* df */
5644   "fild",
5645   "fisttp",
5646   "fist",
5647   "fistp",
5648   "fbld",
5649   "fild{ll|}",
5650   "fbstp",
5651   "fistp{ll|}",
5652 };
5653
5654 static const unsigned char float_mem_mode[] = {
5655   /* d8 */
5656   d_mode,
5657   d_mode,
5658   d_mode,
5659   d_mode,
5660   d_mode,
5661   d_mode,
5662   d_mode,
5663   d_mode,
5664   /* d9 */
5665   d_mode,
5666   0,
5667   d_mode,
5668   d_mode,
5669   0,
5670   w_mode,
5671   0,
5672   w_mode,
5673   /* da */
5674   d_mode,
5675   d_mode,
5676   d_mode,
5677   d_mode,
5678   d_mode,
5679   d_mode,
5680   d_mode,
5681   d_mode,
5682   /* db */
5683   d_mode,
5684   d_mode,
5685   d_mode,
5686   d_mode,
5687   0,
5688   t_mode,
5689   0,
5690   t_mode,
5691   /* dc */
5692   q_mode,
5693   q_mode,
5694   q_mode,
5695   q_mode,
5696   q_mode,
5697   q_mode,
5698   q_mode,
5699   q_mode,
5700   /* dd */
5701   q_mode,
5702   q_mode,
5703   q_mode,
5704   q_mode,
5705   0,
5706   0,
5707   0,
5708   w_mode,
5709   /* de */
5710   w_mode,
5711   w_mode,
5712   w_mode,
5713   w_mode,
5714   w_mode,
5715   w_mode,
5716   w_mode,
5717   w_mode,
5718   /* df */
5719   w_mode,
5720   w_mode,
5721   w_mode,
5722   w_mode,
5723   t_mode,
5724   q_mode,
5725   t_mode,
5726   q_mode
5727 };
5728
5729 #define ST { OP_ST, 0 }
5730 #define STi { OP_STi, 0 }
5731
5732 #define FGRPd9_2 NULL, { { NULL, 0 } }
5733 #define FGRPd9_4 NULL, { { NULL, 1 } }
5734 #define FGRPd9_5 NULL, { { NULL, 2 } }
5735 #define FGRPd9_6 NULL, { { NULL, 3 } }
5736 #define FGRPd9_7 NULL, { { NULL, 4 } }
5737 #define FGRPda_5 NULL, { { NULL, 5 } }
5738 #define FGRPdb_4 NULL, { { NULL, 6 } }
5739 #define FGRPde_3 NULL, { { NULL, 7 } }
5740 #define FGRPdf_4 NULL, { { NULL, 8 } }
5741
5742 static const struct dis386 float_reg[][8] = {
5743   /* d8 */
5744   {
5745     { "fadd",   { ST, STi } },
5746     { "fmul",   { ST, STi } },
5747     { "fcom",   { STi } },
5748     { "fcomp",  { STi } },
5749     { "fsub",   { ST, STi } },
5750     { "fsubr",  { ST, STi } },
5751     { "fdiv",   { ST, STi } },
5752     { "fdivr",  { ST, STi } },
5753   },
5754   /* d9 */
5755   {
5756     { "fld",    { STi } },
5757     { "fxch",   { STi } },
5758     { FGRPd9_2 },
5759     { "(bad)",  { XX } },
5760     { FGRPd9_4 },
5761     { FGRPd9_5 },
5762     { FGRPd9_6 },
5763     { FGRPd9_7 },
5764   },
5765   /* da */
5766   {
5767     { "fcmovb", { ST, STi } },
5768     { "fcmove", { ST, STi } },
5769     { "fcmovbe",{ ST, STi } },
5770     { "fcmovu", { ST, STi } },
5771     { "(bad)",  { XX } },
5772     { FGRPda_5 },
5773     { "(bad)",  { XX } },
5774     { "(bad)",  { XX } },
5775   },
5776   /* db */
5777   {
5778     { "fcmovnb",{ ST, STi } },
5779     { "fcmovne",{ ST, STi } },
5780     { "fcmovnbe",{ ST, STi } },
5781     { "fcmovnu",{ ST, STi } },
5782     { FGRPdb_4 },
5783     { "fucomi", { ST, STi } },
5784     { "fcomi",  { ST, STi } },
5785     { "(bad)",  { XX } },
5786   },
5787   /* dc */
5788   {
5789     { "fadd",   { STi, ST } },
5790     { "fmul",   { STi, ST } },
5791     { "(bad)",  { XX } },
5792     { "(bad)",  { XX } },
5793 #if SYSV386_COMPAT
5794     { "fsub",   { STi, ST } },
5795     { "fsubr",  { STi, ST } },
5796     { "fdiv",   { STi, ST } },
5797     { "fdivr",  { STi, ST } },
5798 #else
5799     { "fsubr",  { STi, ST } },
5800     { "fsub",   { STi, ST } },
5801     { "fdivr",  { STi, ST } },
5802     { "fdiv",   { STi, ST } },
5803 #endif
5804   },
5805   /* dd */
5806   {
5807     { "ffree",  { STi } },
5808     { "(bad)",  { XX } },
5809     { "fst",    { STi } },
5810     { "fstp",   { STi } },
5811     { "fucom",  { STi } },
5812     { "fucomp", { STi } },
5813     { "(bad)",  { XX } },
5814     { "(bad)",  { XX } },
5815   },
5816   /* de */
5817   {
5818     { "faddp",  { STi, ST } },
5819     { "fmulp",  { STi, ST } },
5820     { "(bad)",  { XX } },
5821     { FGRPde_3 },
5822 #if SYSV386_COMPAT
5823     { "fsubp",  { STi, ST } },
5824     { "fsubrp", { STi, ST } },
5825     { "fdivp",  { STi, ST } },
5826     { "fdivrp", { STi, ST } },
5827 #else
5828     { "fsubrp", { STi, ST } },
5829     { "fsubp",  { STi, ST } },
5830     { "fdivrp", { STi, ST } },
5831     { "fdivp",  { STi, ST } },
5832 #endif
5833   },
5834   /* df */
5835   {
5836     { "ffreep", { STi } },
5837     { "(bad)",  { XX } },
5838     { "(bad)",  { XX } },
5839     { "(bad)",  { XX } },
5840     { FGRPdf_4 },
5841     { "fucomip", { ST, STi } },
5842     { "fcomip", { ST, STi } },
5843     { "(bad)",  { XX } },
5844   },
5845 };
5846
5847 static char *fgrps[][8] = {
5848   /* d9_2  0 */
5849   {
5850     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5851   },
5852
5853   /* d9_4  1 */
5854   {
5855     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
5856   },
5857
5858   /* d9_5  2 */
5859   {
5860     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
5861   },
5862
5863   /* d9_6  3 */
5864   {
5865     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
5866   },
5867
5868   /* d9_7  4 */
5869   {
5870     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
5871   },
5872
5873   /* da_5  5 */
5874   {
5875     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5876   },
5877
5878   /* db_4  6 */
5879   {
5880     "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
5881     "fNsetpm(287 only)","(bad)","(bad)","(bad)",
5882   },
5883
5884   /* de_3  7 */
5885   {
5886     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5887   },
5888
5889   /* df_4  8 */
5890   {
5891     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5892   },
5893 };
5894
5895 static void
5896 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
5897                int sizeflag ATTRIBUTE_UNUSED)
5898 {
5899   /* Skip mod/rm byte.  */
5900   MODRM_CHECK;
5901   codep++;
5902 }
5903
5904 static void
5905 dofloat (int sizeflag)
5906 {
5907   const struct dis386 *dp;
5908   unsigned char floatop;
5909
5910   floatop = codep[-1];
5911
5912   if (modrm.mod != 3)
5913     {
5914       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
5915
5916       putop (float_mem[fp_indx], sizeflag);
5917       obufp = op_out[0];
5918       op_ad = 2;
5919       OP_E (float_mem_mode[fp_indx], sizeflag);
5920       return;
5921     }
5922   /* Skip mod/rm byte.  */
5923   MODRM_CHECK;
5924   codep++;
5925
5926   dp = &float_reg[floatop - 0xd8][modrm.reg];
5927   if (dp->name == NULL)
5928     {
5929       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
5930
5931       /* Instruction fnstsw is only one with strange arg.  */
5932       if (floatop == 0xdf && codep[-1] == 0xe0)
5933         strcpy (op_out[0], names16[0]);
5934     }
5935   else
5936     {
5937       putop (dp->name, sizeflag);
5938
5939       obufp = op_out[0];
5940       op_ad = 2;
5941       if (dp->op[0].rtn)
5942         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
5943
5944       obufp = op_out[1];
5945       op_ad = 1;
5946       if (dp->op[1].rtn)
5947         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
5948     }
5949 }
5950
5951 static void
5952 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5953 {
5954   oappend ("%st" + intel_syntax);
5955 }
5956
5957 static void
5958 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5959 {
5960   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
5961   oappend (scratchbuf + intel_syntax);
5962 }
5963
5964 /* Capital letters in template are macros.  */
5965 static int
5966 putop (const char *template, int sizeflag)
5967 {
5968   const char *p;
5969   int alt = 0;
5970
5971   for (p = template; *p; p++)
5972     {
5973       switch (*p)
5974         {
5975         default:
5976           *obufp++ = *p;
5977           break;
5978         case '{':
5979           alt = 0;
5980           if (intel_syntax)
5981             {
5982               while (*++p != '|')
5983                 if (*p == '}' || *p == '\0')
5984                   abort ();
5985             }
5986           /* Fall through.  */
5987         case 'I':
5988           alt = 1;
5989           continue;
5990         case '|':
5991           while (*++p != '}')
5992             {
5993               if (*p == '\0')
5994                 abort ();
5995             }
5996           break;
5997         case '}':
5998           break;
5999         case 'A':
6000           if (intel_syntax)
6001             break;
6002           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
6003             *obufp++ = 'b';
6004           break;
6005         case 'B':
6006           if (intel_syntax)
6007             break;
6008           if (sizeflag & SUFFIX_ALWAYS)
6009             *obufp++ = 'b';
6010           break;
6011         case 'C':
6012           if (intel_syntax && !alt)
6013             break;
6014           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
6015             {
6016               if (sizeflag & DFLAG)
6017                 *obufp++ = intel_syntax ? 'd' : 'l';
6018               else
6019                 *obufp++ = intel_syntax ? 'w' : 's';
6020               used_prefixes |= (prefixes & PREFIX_DATA);
6021             }
6022           break;
6023         case 'D':
6024           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
6025             break;
6026           USED_REX (REX_W);
6027           if (modrm.mod == 3)
6028             {
6029               if (rex & REX_W)
6030                 *obufp++ = 'q';
6031               else if (sizeflag & DFLAG)
6032                 *obufp++ = intel_syntax ? 'd' : 'l';
6033               else
6034                 *obufp++ = 'w';
6035               used_prefixes |= (prefixes & PREFIX_DATA);
6036             }
6037           else
6038             *obufp++ = 'w';
6039           break;
6040         case 'E':               /* For jcxz/jecxz */
6041           if (address_mode == mode_64bit)
6042             {
6043               if (sizeflag & AFLAG)
6044                 *obufp++ = 'r';
6045               else
6046                 *obufp++ = 'e';
6047             }
6048           else
6049             if (sizeflag & AFLAG)
6050               *obufp++ = 'e';
6051           used_prefixes |= (prefixes & PREFIX_ADDR);
6052           break;
6053         case 'F':
6054           if (intel_syntax)
6055             break;
6056           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
6057             {
6058               if (sizeflag & AFLAG)
6059                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
6060               else
6061                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
6062               used_prefixes |= (prefixes & PREFIX_ADDR);
6063             }
6064           break;
6065         case 'G':
6066           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
6067             break;
6068           if ((rex & REX_W) || (sizeflag & DFLAG))
6069             *obufp++ = 'l';
6070           else
6071             *obufp++ = 'w';
6072           if (!(rex & REX_W))
6073             used_prefixes |= (prefixes & PREFIX_DATA);
6074           break;
6075         case 'H':
6076           if (intel_syntax)
6077             break;
6078           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
6079               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
6080             {
6081               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
6082               *obufp++ = ',';
6083               *obufp++ = 'p';
6084               if (prefixes & PREFIX_DS)
6085                 *obufp++ = 't';
6086               else
6087                 *obufp++ = 'n';
6088             }
6089           break;
6090         case 'J':
6091           if (intel_syntax)
6092             break;
6093           *obufp++ = 'l';
6094           break;
6095         case 'K':
6096           USED_REX (REX_W);
6097           if (rex & REX_W)
6098             *obufp++ = 'q';
6099           else
6100             *obufp++ = 'd';
6101           break;
6102         case 'Z':
6103           if (intel_syntax)
6104             break;
6105           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
6106             {
6107               *obufp++ = 'q';
6108               break;
6109             }
6110           /* Fall through.  */
6111         case 'L':
6112           if (intel_syntax)
6113             break;
6114           if (sizeflag & SUFFIX_ALWAYS)
6115             *obufp++ = 'l';
6116           break;
6117         case 'N':
6118           if ((prefixes & PREFIX_FWAIT) == 0)
6119             *obufp++ = 'n';
6120           else
6121             used_prefixes |= PREFIX_FWAIT;
6122           break;
6123         case 'O':
6124           USED_REX (REX_W);
6125           if (rex & REX_W)
6126             *obufp++ = 'o';
6127           else if (intel_syntax && (sizeflag & DFLAG))
6128             *obufp++ = 'q';
6129           else
6130             *obufp++ = 'd';
6131           if (!(rex & REX_W))
6132             used_prefixes |= (prefixes & PREFIX_DATA);
6133           break;
6134         case 'T':
6135           if (intel_syntax)
6136             break;
6137           if (address_mode == mode_64bit && (sizeflag & DFLAG))
6138             {
6139               *obufp++ = 'q';
6140               break;
6141             }
6142           /* Fall through.  */
6143         case 'P':
6144           if (intel_syntax)
6145             break;
6146           if ((prefixes & PREFIX_DATA)
6147               || (rex & REX_W)
6148               || (sizeflag & SUFFIX_ALWAYS))
6149             {
6150               USED_REX (REX_W);
6151               if (rex & REX_W)
6152                 *obufp++ = 'q';
6153               else
6154                 {
6155                    if (sizeflag & DFLAG)
6156                       *obufp++ = 'l';
6157                    else
6158                      *obufp++ = 'w';
6159                 }
6160               used_prefixes |= (prefixes & PREFIX_DATA);
6161             }
6162           break;
6163         case 'U':
6164           if (intel_syntax)
6165             break;
6166           if (address_mode == mode_64bit && (sizeflag & DFLAG))
6167             {
6168               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
6169                 *obufp++ = 'q';
6170               break;
6171             }
6172           /* Fall through.  */
6173         case 'Q':
6174           if (intel_syntax && !alt)
6175             break;
6176           USED_REX (REX_W);
6177           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
6178             {
6179               if (rex & REX_W)
6180                 *obufp++ = 'q';
6181               else
6182                 {
6183                   if (sizeflag & DFLAG)
6184                     *obufp++ = intel_syntax ? 'd' : 'l';
6185                   else
6186                     *obufp++ = 'w';
6187                 }
6188               used_prefixes |= (prefixes & PREFIX_DATA);
6189             }
6190           break;
6191         case 'R':
6192           USED_REX (REX_W);
6193           if (rex & REX_W)
6194             *obufp++ = 'q';
6195           else if (sizeflag & DFLAG)
6196             {
6197               if (intel_syntax)
6198                   *obufp++ = 'd';
6199               else
6200                   *obufp++ = 'l';
6201             }
6202           else
6203             *obufp++ = 'w';
6204           if (intel_syntax && !p[1]
6205               && ((rex & REX_W) || (sizeflag & DFLAG)))
6206             *obufp++ = 'e';
6207           if (!(rex & REX_W))
6208             used_prefixes |= (prefixes & PREFIX_DATA);
6209           break;
6210         case 'V':
6211           if (intel_syntax)
6212             break;
6213           if (address_mode == mode_64bit && (sizeflag & DFLAG))
6214             {
6215               if (sizeflag & SUFFIX_ALWAYS)
6216                 *obufp++ = 'q';
6217               break;
6218             }
6219           /* Fall through.  */
6220         case 'S':
6221           if (intel_syntax)
6222             break;
6223           if (sizeflag & SUFFIX_ALWAYS)
6224             {
6225               if (rex & REX_W)
6226                 *obufp++ = 'q';
6227               else
6228                 {
6229                   if (sizeflag & DFLAG)
6230                     *obufp++ = 'l';
6231                   else
6232                     *obufp++ = 'w';
6233                   used_prefixes |= (prefixes & PREFIX_DATA);
6234                 }
6235             }
6236           break;
6237         case 'X':
6238           if (prefixes & PREFIX_DATA)
6239             *obufp++ = 'd';
6240           else
6241             *obufp++ = 's';
6242           used_prefixes |= (prefixes & PREFIX_DATA);
6243           break;
6244         case 'Y':
6245           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
6246             break;
6247           if (rex & REX_W)
6248             {
6249               USED_REX (REX_W);
6250               *obufp++ = 'q';
6251             }
6252           break;
6253           /* implicit operand size 'l' for i386 or 'q' for x86-64 */
6254         case 'W':
6255           /* operand size flag for cwtl, cbtw */
6256           USED_REX (REX_W);
6257           if (rex & REX_W)
6258             {
6259               if (intel_syntax)
6260                 *obufp++ = 'd';
6261               else
6262                 *obufp++ = 'l';
6263             }
6264           else if (sizeflag & DFLAG)
6265             *obufp++ = 'w';
6266           else
6267             *obufp++ = 'b';
6268           if (!(rex & REX_W))
6269             used_prefixes |= (prefixes & PREFIX_DATA);
6270           break;
6271         }
6272       alt = 0;
6273     }
6274   *obufp = 0;
6275   return 0;
6276 }
6277
6278 static void
6279 oappend (const char *s)
6280 {
6281   strcpy (obufp, s);
6282   obufp += strlen (s);
6283 }
6284
6285 static void
6286 append_seg (void)
6287 {
6288   if (prefixes & PREFIX_CS)
6289     {
6290       used_prefixes |= PREFIX_CS;
6291       oappend ("%cs:" + intel_syntax);
6292     }
6293   if (prefixes & PREFIX_DS)
6294     {
6295       used_prefixes |= PREFIX_DS;
6296       oappend ("%ds:" + intel_syntax);
6297     }
6298   if (prefixes & PREFIX_SS)
6299     {
6300       used_prefixes |= PREFIX_SS;
6301       oappend ("%ss:" + intel_syntax);
6302     }
6303   if (prefixes & PREFIX_ES)
6304     {
6305       used_prefixes |= PREFIX_ES;
6306       oappend ("%es:" + intel_syntax);
6307     }
6308   if (prefixes & PREFIX_FS)
6309     {
6310       used_prefixes |= PREFIX_FS;
6311       oappend ("%fs:" + intel_syntax);
6312     }
6313   if (prefixes & PREFIX_GS)
6314     {
6315       used_prefixes |= PREFIX_GS;
6316       oappend ("%gs:" + intel_syntax);
6317     }
6318 }
6319
6320 static void
6321 OP_indirE (int bytemode, int sizeflag)
6322 {
6323   if (!intel_syntax)
6324     oappend ("*");
6325   OP_E (bytemode, sizeflag);
6326 }
6327
6328 static void
6329 print_operand_value (char *buf, int hex, bfd_vma disp)
6330 {
6331   if (address_mode == mode_64bit)
6332     {
6333       if (hex)
6334         {
6335           char tmp[30];
6336           int i;
6337           buf[0] = '0';
6338           buf[1] = 'x';
6339           sprintf_vma (tmp, disp);
6340           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
6341           strcpy (buf + 2, tmp + i);
6342         }
6343       else
6344         {
6345           bfd_signed_vma v = disp;
6346           char tmp[30];
6347           int i;
6348           if (v < 0)
6349             {
6350               *(buf++) = '-';
6351               v = -disp;
6352               /* Check for possible overflow on 0x8000000000000000.  */
6353               if (v < 0)
6354                 {
6355                   strcpy (buf, "9223372036854775808");
6356                   return;
6357                 }
6358             }
6359           if (!v)
6360             {
6361               strcpy (buf, "0");
6362               return;
6363             }
6364
6365           i = 0;
6366           tmp[29] = 0;
6367           while (v)
6368             {
6369               tmp[28 - i] = (v % 10) + '0';
6370               v /= 10;
6371               i++;
6372             }
6373           strcpy (buf, tmp + 29 - i);
6374         }
6375     }
6376   else
6377     {
6378       if (hex)
6379         sprintf (buf, "0x%x", (unsigned int) disp);
6380       else
6381         sprintf (buf, "%d", (int) disp);
6382     }
6383 }
6384
6385 /* Put DISP in BUF as signed hex number.  */
6386
6387 static void
6388 print_displacement (char *buf, bfd_vma disp)
6389 {
6390   bfd_signed_vma val = disp;
6391   char tmp[30];
6392   int i, j = 0;
6393
6394   if (val < 0)
6395     {
6396       buf[j++] = '-';
6397       val = -disp;
6398
6399       /* Check for possible overflow.  */
6400       if (val < 0)
6401         {
6402           switch (address_mode)
6403             {
6404             case mode_64bit:
6405               strcpy (buf + j, "0x8000000000000000");
6406               break;
6407             case mode_32bit:
6408               strcpy (buf + j, "0x80000000");
6409               break;
6410             case mode_16bit:
6411               strcpy (buf + j, "0x8000");
6412               break;
6413             }
6414           return;
6415         }
6416     }
6417
6418   buf[j++] = '0';
6419   buf[j++] = 'x';
6420
6421   sprintf_vma (tmp, val);
6422   for (i = 0; tmp[i] == '0'; i++)
6423     continue;
6424   if (tmp[i] == '\0')
6425     i--;
6426   strcpy (buf + j, tmp + i);
6427 }
6428
6429 static void
6430 intel_operand_size (int bytemode, int sizeflag)
6431 {
6432   switch (bytemode)
6433     {
6434     case b_mode:
6435     case dqb_mode:
6436       oappend ("BYTE PTR ");
6437       break;
6438     case w_mode:
6439     case dqw_mode:
6440       oappend ("WORD PTR ");
6441       break;
6442     case stack_v_mode:
6443       if (address_mode == mode_64bit && (sizeflag & DFLAG))
6444         {
6445           oappend ("QWORD PTR ");
6446           used_prefixes |= (prefixes & PREFIX_DATA);
6447           break;
6448         }
6449       /* FALLTHRU */
6450     case v_mode:
6451     case dq_mode:
6452       USED_REX (REX_W);
6453       if (rex & REX_W)
6454         oappend ("QWORD PTR ");
6455       else if ((sizeflag & DFLAG) || bytemode == dq_mode)
6456         oappend ("DWORD PTR ");
6457       else
6458         oappend ("WORD PTR ");
6459       used_prefixes |= (prefixes & PREFIX_DATA);
6460       break;
6461     case z_mode:
6462       if ((rex & REX_W) || (sizeflag & DFLAG))
6463         *obufp++ = 'D';
6464       oappend ("WORD PTR ");
6465       if (!(rex & REX_W))
6466         used_prefixes |= (prefixes & PREFIX_DATA);
6467       break;
6468     case d_mode:
6469     case dqd_mode:
6470       oappend ("DWORD PTR ");
6471       break;
6472     case q_mode:
6473       oappend ("QWORD PTR ");
6474       break;
6475     case m_mode:
6476       if (address_mode == mode_64bit)
6477         oappend ("QWORD PTR ");
6478       else
6479         oappend ("DWORD PTR ");
6480       break;
6481     case f_mode:
6482       if (sizeflag & DFLAG)
6483         oappend ("FWORD PTR ");
6484       else
6485         oappend ("DWORD PTR ");
6486       used_prefixes |= (prefixes & PREFIX_DATA);
6487       break;
6488     case t_mode:
6489       oappend ("TBYTE PTR ");
6490       break;
6491     case x_mode:
6492       oappend ("XMMWORD PTR ");
6493       break;
6494     case o_mode:
6495       oappend ("OWORD PTR ");
6496       break;
6497     default:
6498       break;
6499     }
6500 }
6501
6502 static void
6503 OP_E_extended (int bytemode, int sizeflag, int has_drex)
6504 {
6505   bfd_vma disp;
6506   int add = 0;
6507   int riprel = 0;
6508   USED_REX (REX_B);
6509   if (rex & REX_B)
6510     add += 8;
6511
6512   /* Skip mod/rm byte.  */
6513   MODRM_CHECK;
6514   codep++;
6515
6516   if (modrm.mod == 3)
6517     {
6518       switch (bytemode)
6519         {
6520         case b_mode:
6521           USED_REX (0);
6522           if (rex)
6523             oappend (names8rex[modrm.rm + add]);
6524           else
6525             oappend (names8[modrm.rm + add]);
6526           break;
6527         case w_mode:
6528           oappend (names16[modrm.rm + add]);
6529           break;
6530         case d_mode:
6531           oappend (names32[modrm.rm + add]);
6532           break;
6533         case q_mode:
6534           oappend (names64[modrm.rm + add]);
6535           break;
6536         case m_mode:
6537           if (address_mode == mode_64bit)
6538             oappend (names64[modrm.rm + add]);
6539           else
6540             oappend (names32[modrm.rm + add]);
6541           break;
6542         case stack_v_mode:
6543           if (address_mode == mode_64bit && (sizeflag & DFLAG))
6544             {
6545               oappend (names64[modrm.rm + add]);
6546               used_prefixes |= (prefixes & PREFIX_DATA);
6547               break;
6548             }
6549           bytemode = v_mode;
6550           /* FALLTHRU */
6551         case v_mode:
6552         case dq_mode:
6553         case dqb_mode:
6554         case dqd_mode:
6555         case dqw_mode:
6556           USED_REX (REX_W);
6557           if (rex & REX_W)
6558             oappend (names64[modrm.rm + add]);
6559           else if ((sizeflag & DFLAG) || bytemode != v_mode)
6560             oappend (names32[modrm.rm + add]);
6561           else
6562             oappend (names16[modrm.rm + add]);
6563           used_prefixes |= (prefixes & PREFIX_DATA);
6564           break;
6565         case 0:
6566           break;
6567         default:
6568           oappend (INTERNAL_DISASSEMBLER_ERROR);
6569           break;
6570         }
6571       return;
6572     }
6573
6574   disp = 0;
6575   if (intel_syntax)
6576     intel_operand_size (bytemode, sizeflag);
6577   append_seg ();
6578
6579   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
6580     {
6581       /* 32/64 bit address mode */
6582       int havedisp;
6583       int havesib;
6584       int havebase;
6585       int haveindex;
6586       int needindex;
6587       int base;
6588       int index = 0;
6589       int scale = 0;
6590
6591       havesib = 0;
6592       havebase = 1;
6593       haveindex = 0;
6594       base = modrm.rm;
6595
6596       if (base == 4)
6597         {
6598           havesib = 1;
6599           FETCH_DATA (the_info, codep + 1);
6600           index = (*codep >> 3) & 7;
6601           scale = (*codep >> 6) & 3;
6602           base = *codep & 7;
6603           USED_REX (REX_X);
6604           if (rex & REX_X)
6605             index += 8;
6606           haveindex = index != 4;
6607           codep++;
6608         }
6609       base += add;
6610
6611       /* If we have a DREX byte, skip it now 
6612          (it has already been handled) */
6613       if (has_drex)
6614         {
6615           FETCH_DATA (the_info, codep + 1);
6616           codep++;
6617         }
6618
6619       switch (modrm.mod)
6620         {
6621         case 0:
6622           if ((base & 7) == 5)
6623             {
6624               havebase = 0;
6625               if (address_mode == mode_64bit && !havesib)
6626                 riprel = 1;
6627               disp = get32s ();
6628             }
6629           break;
6630         case 1:
6631           FETCH_DATA (the_info, codep + 1);
6632           disp = *codep++;
6633           if ((disp & 0x80) != 0)
6634             disp -= 0x100;
6635           break;
6636         case 2:
6637           disp = get32s ();
6638           break;
6639         }
6640
6641       /* In 32bit mode, we need index register to tell [offset] from
6642          [eiz*1 + offset].  */
6643       needindex = (havesib
6644                    && !havebase
6645                    && !haveindex
6646                    && address_mode == mode_32bit);
6647       havedisp = (havebase
6648                   || needindex
6649                   || (havesib && (haveindex || scale != 0)));
6650
6651       if (!intel_syntax)
6652         if (modrm.mod != 0 || (base & 7) == 5)
6653           {
6654             if (havedisp || riprel)
6655               print_displacement (scratchbuf, disp);
6656             else
6657               print_operand_value (scratchbuf, 1, disp);
6658             oappend (scratchbuf);
6659             if (riprel)
6660               {
6661                 set_op (disp, 1);
6662                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
6663               }
6664           }
6665
6666       if (havebase || haveindex || riprel)
6667         used_prefixes |= PREFIX_ADDR;
6668
6669       if (havedisp || (intel_syntax && riprel))
6670         {
6671           *obufp++ = open_char;
6672           if (intel_syntax && riprel)
6673             {
6674               set_op (disp, 1);
6675               oappend (sizeflag & AFLAG ? "rip" : "eip");
6676             }
6677           *obufp = '\0';
6678           if (havebase)
6679             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
6680                      ? names64[base] : names32[base]);
6681           if (havesib)
6682             {
6683               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
6684                  print index to tell base + index from base.  */
6685               if (scale != 0
6686                   || needindex
6687                   || haveindex
6688                   || (havebase && base != ESP_REG_NUM))
6689                 {
6690                   if (!intel_syntax || havebase)
6691                     {
6692                       *obufp++ = separator_char;
6693                       *obufp = '\0';
6694                     }
6695                   if (haveindex)
6696                     oappend (address_mode == mode_64bit 
6697                              && (sizeflag & AFLAG)
6698                              ? names64[index] : names32[index]);
6699                   else
6700                     oappend (address_mode == mode_64bit 
6701                              && (sizeflag & AFLAG)
6702                              ? index64 : index32);
6703
6704                   *obufp++ = scale_char;
6705                   *obufp = '\0';
6706                   sprintf (scratchbuf, "%d", 1 << scale);
6707                   oappend (scratchbuf);
6708                 }
6709             }
6710           if (intel_syntax
6711               && (disp || modrm.mod != 0 || (base & 7) == 5))
6712             {
6713               if (!havedisp || (bfd_signed_vma) disp >= 0)
6714                 {
6715                   *obufp++ = '+';
6716                   *obufp = '\0';
6717                 }
6718               else if (modrm.mod != 1)
6719                 {
6720                   *obufp++ = '-';
6721                   *obufp = '\0';
6722                   disp = - (bfd_signed_vma) disp;
6723                 }
6724
6725               if (havedisp)
6726                 print_displacement (scratchbuf, disp);
6727               else
6728                 print_operand_value (scratchbuf, 1, disp);
6729               oappend (scratchbuf);
6730             }
6731
6732           *obufp++ = close_char;
6733           *obufp = '\0';
6734         }
6735       else if (intel_syntax)
6736         {
6737           if (modrm.mod != 0 || (base & 7) == 5)
6738             {
6739               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
6740                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
6741                 ;
6742               else
6743                 {
6744                   oappend (names_seg[ds_reg - es_reg]);
6745                   oappend (":");
6746                 }
6747               print_operand_value (scratchbuf, 1, disp);
6748               oappend (scratchbuf);
6749             }
6750         }
6751     }
6752   else
6753     { /* 16 bit address mode */
6754       switch (modrm.mod)
6755         {
6756         case 0:
6757           if (modrm.rm == 6)
6758             {
6759               disp = get16 ();
6760               if ((disp & 0x8000) != 0)
6761                 disp -= 0x10000;
6762             }
6763           break;
6764         case 1:
6765           FETCH_DATA (the_info, codep + 1);
6766           disp = *codep++;
6767           if ((disp & 0x80) != 0)
6768             disp -= 0x100;
6769           break;
6770         case 2:
6771           disp = get16 ();
6772           if ((disp & 0x8000) != 0)
6773             disp -= 0x10000;
6774           break;
6775         }
6776
6777       if (!intel_syntax)
6778         if (modrm.mod != 0 || modrm.rm == 6)
6779           {
6780             print_displacement (scratchbuf, disp);
6781             oappend (scratchbuf);
6782           }
6783
6784       if (modrm.mod != 0 || modrm.rm != 6)
6785         {
6786           *obufp++ = open_char;
6787           *obufp = '\0';
6788           oappend (index16[modrm.rm]);
6789           if (intel_syntax
6790               && (disp || modrm.mod != 0 || modrm.rm == 6))
6791             {
6792               if ((bfd_signed_vma) disp >= 0)
6793                 {
6794                   *obufp++ = '+';
6795                   *obufp = '\0';
6796                 }
6797               else if (modrm.mod != 1)
6798                 {
6799                   *obufp++ = '-';
6800                   *obufp = '\0';
6801                   disp = - (bfd_signed_vma) disp;
6802                 }
6803
6804               print_displacement (scratchbuf, disp);
6805               oappend (scratchbuf);
6806             }
6807
6808           *obufp++ = close_char;
6809           *obufp = '\0';
6810         }
6811       else if (intel_syntax)
6812         {
6813           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
6814                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
6815             ;
6816           else
6817             {
6818               oappend (names_seg[ds_reg - es_reg]);
6819               oappend (":");
6820             }
6821           print_operand_value (scratchbuf, 1, disp & 0xffff);
6822           oappend (scratchbuf);
6823         }
6824     }
6825 }
6826
6827 static void
6828 OP_E (int bytemode, int sizeflag)
6829 {
6830   OP_E_extended (bytemode, sizeflag, 0);
6831 }
6832
6833
6834 static void
6835 OP_G (int bytemode, int sizeflag)
6836 {
6837   int add = 0;
6838   USED_REX (REX_R);
6839   if (rex & REX_R)
6840     add += 8;
6841   switch (bytemode)
6842     {
6843     case b_mode:
6844       USED_REX (0);
6845       if (rex)
6846         oappend (names8rex[modrm.reg + add]);
6847       else
6848         oappend (names8[modrm.reg + add]);
6849       break;
6850     case w_mode:
6851       oappend (names16[modrm.reg + add]);
6852       break;
6853     case d_mode:
6854       oappend (names32[modrm.reg + add]);
6855       break;
6856     case q_mode:
6857       oappend (names64[modrm.reg + add]);
6858       break;
6859     case v_mode:
6860     case dq_mode:
6861     case dqb_mode:
6862     case dqd_mode:
6863     case dqw_mode:
6864       USED_REX (REX_W);
6865       if (rex & REX_W)
6866         oappend (names64[modrm.reg + add]);
6867       else if ((sizeflag & DFLAG) || bytemode != v_mode)
6868         oappend (names32[modrm.reg + add]);
6869       else
6870         oappend (names16[modrm.reg + add]);
6871       used_prefixes |= (prefixes & PREFIX_DATA);
6872       break;
6873     case m_mode:
6874       if (address_mode == mode_64bit)
6875         oappend (names64[modrm.reg + add]);
6876       else
6877         oappend (names32[modrm.reg + add]);
6878       break;
6879     default:
6880       oappend (INTERNAL_DISASSEMBLER_ERROR);
6881       break;
6882     }
6883 }
6884
6885 static bfd_vma
6886 get64 (void)
6887 {
6888   bfd_vma x;
6889 #ifdef BFD64
6890   unsigned int a;
6891   unsigned int b;
6892
6893   FETCH_DATA (the_info, codep + 8);
6894   a = *codep++ & 0xff;
6895   a |= (*codep++ & 0xff) << 8;
6896   a |= (*codep++ & 0xff) << 16;
6897   a |= (*codep++ & 0xff) << 24;
6898   b = *codep++ & 0xff;
6899   b |= (*codep++ & 0xff) << 8;
6900   b |= (*codep++ & 0xff) << 16;
6901   b |= (*codep++ & 0xff) << 24;
6902   x = a + ((bfd_vma) b << 32);
6903 #else
6904   abort ();
6905   x = 0;
6906 #endif
6907   return x;
6908 }
6909
6910 static bfd_signed_vma
6911 get32 (void)
6912 {
6913   bfd_signed_vma x = 0;
6914
6915   FETCH_DATA (the_info, codep + 4);
6916   x = *codep++ & (bfd_signed_vma) 0xff;
6917   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
6918   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
6919   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
6920   return x;
6921 }
6922
6923 static bfd_signed_vma
6924 get32s (void)
6925 {
6926   bfd_signed_vma x = 0;
6927
6928   FETCH_DATA (the_info, codep + 4);
6929   x = *codep++ & (bfd_signed_vma) 0xff;
6930   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
6931   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
6932   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
6933
6934   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
6935
6936   return x;
6937 }
6938
6939 static int
6940 get16 (void)
6941 {
6942   int x = 0;
6943
6944   FETCH_DATA (the_info, codep + 2);
6945   x = *codep++ & 0xff;
6946   x |= (*codep++ & 0xff) << 8;
6947   return x;
6948 }
6949
6950 static void
6951 set_op (bfd_vma op, int riprel)
6952 {
6953   op_index[op_ad] = op_ad;
6954   if (address_mode == mode_64bit)
6955     {
6956       op_address[op_ad] = op;
6957       op_riprel[op_ad] = riprel;
6958     }
6959   else
6960     {
6961       /* Mask to get a 32-bit address.  */
6962       op_address[op_ad] = op & 0xffffffff;
6963       op_riprel[op_ad] = riprel & 0xffffffff;
6964     }
6965 }
6966
6967 static void
6968 OP_REG (int code, int sizeflag)
6969 {
6970   const char *s;
6971   int add;
6972   USED_REX (REX_B);
6973   if (rex & REX_B)
6974     add = 8;
6975   else
6976     add = 0;
6977
6978   switch (code)
6979     {
6980     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
6981     case sp_reg: case bp_reg: case si_reg: case di_reg:
6982       s = names16[code - ax_reg + add];
6983       break;
6984     case es_reg: case ss_reg: case cs_reg:
6985     case ds_reg: case fs_reg: case gs_reg:
6986       s = names_seg[code - es_reg + add];
6987       break;
6988     case al_reg: case ah_reg: case cl_reg: case ch_reg:
6989     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
6990       USED_REX (0);
6991       if (rex)
6992         s = names8rex[code - al_reg + add];
6993       else
6994         s = names8[code - al_reg];
6995       break;
6996     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
6997     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
6998       if (address_mode == mode_64bit && (sizeflag & DFLAG))
6999         {
7000           s = names64[code - rAX_reg + add];
7001           break;
7002         }
7003       code += eAX_reg - rAX_reg;
7004       /* Fall through.  */
7005     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
7006     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
7007       USED_REX (REX_W);
7008       if (rex & REX_W)
7009         s = names64[code - eAX_reg + add];
7010       else if (sizeflag & DFLAG)
7011         s = names32[code - eAX_reg + add];
7012       else
7013         s = names16[code - eAX_reg + add];
7014       used_prefixes |= (prefixes & PREFIX_DATA);
7015       break;
7016     default:
7017       s = INTERNAL_DISASSEMBLER_ERROR;
7018       break;
7019     }
7020   oappend (s);
7021 }
7022
7023 static void
7024 OP_IMREG (int code, int sizeflag)
7025 {
7026   const char *s;
7027
7028   switch (code)
7029     {
7030     case indir_dx_reg:
7031       if (intel_syntax)
7032         s = "dx";
7033       else
7034         s = "(%dx)";
7035       break;
7036     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
7037     case sp_reg: case bp_reg: case si_reg: case di_reg:
7038       s = names16[code - ax_reg];
7039       break;
7040     case es_reg: case ss_reg: case cs_reg:
7041     case ds_reg: case fs_reg: case gs_reg:
7042       s = names_seg[code - es_reg];
7043       break;
7044     case al_reg: case ah_reg: case cl_reg: case ch_reg:
7045     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
7046       USED_REX (0);
7047       if (rex)
7048         s = names8rex[code - al_reg];
7049       else
7050         s = names8[code - al_reg];
7051       break;
7052     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
7053     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
7054       USED_REX (REX_W);
7055       if (rex & REX_W)
7056         s = names64[code - eAX_reg];
7057       else if (sizeflag & DFLAG)
7058         s = names32[code - eAX_reg];
7059       else
7060         s = names16[code - eAX_reg];
7061       used_prefixes |= (prefixes & PREFIX_DATA);
7062       break;
7063     case z_mode_ax_reg:
7064       if ((rex & REX_W) || (sizeflag & DFLAG))
7065         s = *names32;
7066       else
7067         s = *names16;
7068       if (!(rex & REX_W))
7069         used_prefixes |= (prefixes & PREFIX_DATA);
7070       break;
7071     default:
7072       s = INTERNAL_DISASSEMBLER_ERROR;
7073       break;
7074     }
7075   oappend (s);
7076 }
7077
7078 static void
7079 OP_I (int bytemode, int sizeflag)
7080 {
7081   bfd_signed_vma op;
7082   bfd_signed_vma mask = -1;
7083
7084   switch (bytemode)
7085     {
7086     case b_mode:
7087       FETCH_DATA (the_info, codep + 1);
7088       op = *codep++;
7089       mask = 0xff;
7090       break;
7091     case q_mode:
7092       if (address_mode == mode_64bit)
7093         {
7094           op = get32s ();
7095           break;
7096         }
7097       /* Fall through.  */
7098     case v_mode:
7099       USED_REX (REX_W);
7100       if (rex & REX_W)
7101         op = get32s ();
7102       else if (sizeflag & DFLAG)
7103         {
7104           op = get32 ();
7105           mask = 0xffffffff;
7106         }
7107       else
7108         {
7109           op = get16 ();
7110           mask = 0xfffff;
7111         }
7112       used_prefixes |= (prefixes & PREFIX_DATA);
7113       break;
7114     case w_mode:
7115       mask = 0xfffff;
7116       op = get16 ();
7117       break;
7118     case const_1_mode:
7119       if (intel_syntax)
7120         oappend ("1");
7121       return;
7122     default:
7123       oappend (INTERNAL_DISASSEMBLER_ERROR);
7124       return;
7125     }
7126
7127   op &= mask;
7128   scratchbuf[0] = '$';
7129   print_operand_value (scratchbuf + 1, 1, op);
7130   oappend (scratchbuf + intel_syntax);
7131   scratchbuf[0] = '\0';
7132 }
7133
7134 static void
7135 OP_I64 (int bytemode, int sizeflag)
7136 {
7137   bfd_signed_vma op;
7138   bfd_signed_vma mask = -1;
7139
7140   if (address_mode != mode_64bit)
7141     {
7142       OP_I (bytemode, sizeflag);
7143       return;
7144     }
7145
7146   switch (bytemode)
7147     {
7148     case b_mode:
7149       FETCH_DATA (the_info, codep + 1);
7150       op = *codep++;
7151       mask = 0xff;
7152       break;
7153     case v_mode:
7154       USED_REX (REX_W);
7155       if (rex & REX_W)
7156         op = get64 ();
7157       else if (sizeflag & DFLAG)
7158         {
7159           op = get32 ();
7160           mask = 0xffffffff;
7161         }
7162       else
7163         {
7164           op = get16 ();
7165           mask = 0xfffff;
7166         }
7167       used_prefixes |= (prefixes & PREFIX_DATA);
7168       break;
7169     case w_mode:
7170       mask = 0xfffff;
7171       op = get16 ();
7172       break;
7173     default:
7174       oappend (INTERNAL_DISASSEMBLER_ERROR);
7175       return;
7176     }
7177
7178   op &= mask;
7179   scratchbuf[0] = '$';
7180   print_operand_value (scratchbuf + 1, 1, op);
7181   oappend (scratchbuf + intel_syntax);
7182   scratchbuf[0] = '\0';
7183 }
7184
7185 static void
7186 OP_sI (int bytemode, int sizeflag)
7187 {
7188   bfd_signed_vma op;
7189   bfd_signed_vma mask = -1;
7190
7191   switch (bytemode)
7192     {
7193     case b_mode:
7194       FETCH_DATA (the_info, codep + 1);
7195       op = *codep++;
7196       if ((op & 0x80) != 0)
7197         op -= 0x100;
7198       mask = 0xffffffff;
7199       break;
7200     case v_mode:
7201       USED_REX (REX_W);
7202       if (rex & REX_W)
7203         op = get32s ();
7204       else if (sizeflag & DFLAG)
7205         {
7206           op = get32s ();
7207           mask = 0xffffffff;
7208         }
7209       else
7210         {
7211           mask = 0xffffffff;
7212           op = get16 ();
7213           if ((op & 0x8000) != 0)
7214             op -= 0x10000;
7215         }
7216       used_prefixes |= (prefixes & PREFIX_DATA);
7217       break;
7218     case w_mode:
7219       op = get16 ();
7220       mask = 0xffffffff;
7221       if ((op & 0x8000) != 0)
7222         op -= 0x10000;
7223       break;
7224     default:
7225       oappend (INTERNAL_DISASSEMBLER_ERROR);
7226       return;
7227     }
7228
7229   scratchbuf[0] = '$';
7230   print_operand_value (scratchbuf + 1, 1, op);
7231   oappend (scratchbuf + intel_syntax);
7232 }
7233
7234 static void
7235 OP_J (int bytemode, int sizeflag)
7236 {
7237   bfd_vma disp;
7238   bfd_vma mask = -1;
7239   bfd_vma segment = 0;
7240
7241   switch (bytemode)
7242     {
7243     case b_mode:
7244       FETCH_DATA (the_info, codep + 1);
7245       disp = *codep++;
7246       if ((disp & 0x80) != 0)
7247         disp -= 0x100;
7248       break;
7249     case v_mode:
7250       if ((sizeflag & DFLAG) || (rex & REX_W))
7251         disp = get32s ();
7252       else
7253         {
7254           disp = get16 ();
7255           if ((disp & 0x8000) != 0)
7256             disp -= 0x10000;
7257           /* In 16bit mode, address is wrapped around at 64k within
7258              the same segment.  Otherwise, a data16 prefix on a jump
7259              instruction means that the pc is masked to 16 bits after
7260              the displacement is added!  */
7261           mask = 0xffff;
7262           if ((prefixes & PREFIX_DATA) == 0)
7263             segment = ((start_pc + codep - start_codep)
7264                        & ~((bfd_vma) 0xffff));
7265         }
7266       used_prefixes |= (prefixes & PREFIX_DATA);
7267       break;
7268     default:
7269       oappend (INTERNAL_DISASSEMBLER_ERROR);
7270       return;
7271     }
7272   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
7273   set_op (disp, 0);
7274   print_operand_value (scratchbuf, 1, disp);
7275   oappend (scratchbuf);
7276 }
7277
7278 static void
7279 OP_SEG (int bytemode, int sizeflag)
7280 {
7281   if (bytemode == w_mode)
7282     oappend (names_seg[modrm.reg]);
7283   else
7284     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
7285 }
7286
7287 static void
7288 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
7289 {
7290   int seg, offset;
7291
7292   if (sizeflag & DFLAG)
7293     {
7294       offset = get32 ();
7295       seg = get16 ();
7296     }
7297   else
7298     {
7299       offset = get16 ();
7300       seg = get16 ();
7301     }
7302   used_prefixes |= (prefixes & PREFIX_DATA);
7303   if (intel_syntax)
7304     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
7305   else
7306     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
7307   oappend (scratchbuf);
7308 }
7309
7310 static void
7311 OP_OFF (int bytemode, int sizeflag)
7312 {
7313   bfd_vma off;
7314
7315   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
7316     intel_operand_size (bytemode, sizeflag);
7317   append_seg ();
7318
7319   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
7320     off = get32 ();
7321   else
7322     off = get16 ();
7323
7324   if (intel_syntax)
7325     {
7326       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
7327                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
7328         {
7329           oappend (names_seg[ds_reg - es_reg]);
7330           oappend (":");
7331         }
7332     }
7333   print_operand_value (scratchbuf, 1, off);
7334   oappend (scratchbuf);
7335 }
7336
7337 static void
7338 OP_OFF64 (int bytemode, int sizeflag)
7339 {
7340   bfd_vma off;
7341
7342   if (address_mode != mode_64bit
7343       || (prefixes & PREFIX_ADDR))
7344     {
7345       OP_OFF (bytemode, sizeflag);
7346       return;
7347     }
7348
7349   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
7350     intel_operand_size (bytemode, sizeflag);
7351   append_seg ();
7352
7353   off = get64 ();
7354
7355   if (intel_syntax)
7356     {
7357       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
7358                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
7359         {
7360           oappend (names_seg[ds_reg - es_reg]);
7361           oappend (":");
7362         }
7363     }
7364   print_operand_value (scratchbuf, 1, off);
7365   oappend (scratchbuf);
7366 }
7367
7368 static void
7369 ptr_reg (int code, int sizeflag)
7370 {
7371   const char *s;
7372
7373   *obufp++ = open_char;
7374   used_prefixes |= (prefixes & PREFIX_ADDR);
7375   if (address_mode == mode_64bit)
7376     {
7377       if (!(sizeflag & AFLAG))
7378         s = names32[code - eAX_reg];
7379       else
7380         s = names64[code - eAX_reg];
7381     }
7382   else if (sizeflag & AFLAG)
7383     s = names32[code - eAX_reg];
7384   else
7385     s = names16[code - eAX_reg];
7386   oappend (s);
7387   *obufp++ = close_char;
7388   *obufp = 0;
7389 }
7390
7391 static void
7392 OP_ESreg (int code, int sizeflag)
7393 {
7394   if (intel_syntax)
7395     {
7396       switch (codep[-1])
7397         {
7398         case 0x6d:      /* insw/insl */
7399           intel_operand_size (z_mode, sizeflag);
7400           break;
7401         case 0xa5:      /* movsw/movsl/movsq */
7402         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
7403         case 0xab:      /* stosw/stosl */
7404         case 0xaf:      /* scasw/scasl */
7405           intel_operand_size (v_mode, sizeflag);
7406           break;
7407         default:
7408           intel_operand_size (b_mode, sizeflag);
7409         }
7410     }
7411   oappend ("%es:" + intel_syntax);
7412   ptr_reg (code, sizeflag);
7413 }
7414
7415 static void
7416 OP_DSreg (int code, int sizeflag)
7417 {
7418   if (intel_syntax)
7419     {
7420       switch (codep[-1])
7421         {
7422         case 0x6f:      /* outsw/outsl */
7423           intel_operand_size (z_mode, sizeflag);
7424           break;
7425         case 0xa5:      /* movsw/movsl/movsq */
7426         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
7427         case 0xad:      /* lodsw/lodsl/lodsq */
7428           intel_operand_size (v_mode, sizeflag);
7429           break;
7430         default:
7431           intel_operand_size (b_mode, sizeflag);
7432         }
7433     }
7434   if ((prefixes
7435        & (PREFIX_CS
7436           | PREFIX_DS
7437           | PREFIX_SS
7438           | PREFIX_ES
7439           | PREFIX_FS
7440           | PREFIX_GS)) == 0)
7441     prefixes |= PREFIX_DS;
7442   append_seg ();
7443   ptr_reg (code, sizeflag);
7444 }
7445
7446 static void
7447 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7448 {
7449   int add;
7450   if (rex & REX_R)
7451     {
7452       USED_REX (REX_R);
7453       add = 8;
7454     }
7455   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
7456     {
7457       lock_prefix = NULL;
7458       used_prefixes |= PREFIX_LOCK;
7459       add = 8;
7460     }
7461   else
7462     add = 0;
7463   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
7464   oappend (scratchbuf + intel_syntax);
7465 }
7466
7467 static void
7468 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7469 {
7470   int add;
7471   USED_REX (REX_R);
7472   if (rex & REX_R)
7473     add = 8;
7474   else
7475     add = 0;
7476   if (intel_syntax)
7477     sprintf (scratchbuf, "db%d", modrm.reg + add);
7478   else
7479     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
7480   oappend (scratchbuf);
7481 }
7482
7483 static void
7484 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7485 {
7486   sprintf (scratchbuf, "%%tr%d", modrm.reg);
7487   oappend (scratchbuf + intel_syntax);
7488 }
7489
7490 static void
7491 OP_R (int bytemode, int sizeflag)
7492 {
7493   if (modrm.mod == 3)
7494     OP_E (bytemode, sizeflag);
7495   else
7496     BadOp ();
7497 }
7498
7499 static void
7500 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7501 {
7502   used_prefixes |= (prefixes & PREFIX_DATA);
7503   if (prefixes & PREFIX_DATA)
7504     {
7505       int add;
7506       USED_REX (REX_R);
7507       if (rex & REX_R)
7508         add = 8;
7509       else
7510         add = 0;
7511       sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
7512     }
7513   else
7514     sprintf (scratchbuf, "%%mm%d", modrm.reg);
7515   oappend (scratchbuf + intel_syntax);
7516 }
7517
7518 static void
7519 OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7520 {
7521   int add;
7522   USED_REX (REX_R);
7523   if (rex & REX_R)
7524     add = 8;
7525   else
7526     add = 0;
7527   sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
7528   oappend (scratchbuf + intel_syntax);
7529 }
7530
7531 static void
7532 OP_EM (int bytemode, int sizeflag)
7533 {
7534   if (modrm.mod != 3)
7535     {
7536       if (intel_syntax && bytemode == v_mode)
7537         {
7538           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
7539           used_prefixes |= (prefixes & PREFIX_DATA);
7540         }
7541       OP_E (bytemode, sizeflag);
7542       return;
7543     }
7544
7545   /* Skip mod/rm byte.  */
7546   MODRM_CHECK;
7547   codep++;
7548   used_prefixes |= (prefixes & PREFIX_DATA);
7549   if (prefixes & PREFIX_DATA)
7550     {
7551       int add;
7552
7553       USED_REX (REX_B);
7554       if (rex & REX_B)
7555         add = 8;
7556       else
7557         add = 0;
7558       sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
7559     }
7560   else
7561     sprintf (scratchbuf, "%%mm%d", modrm.rm);
7562   oappend (scratchbuf + intel_syntax);
7563 }
7564
7565 /* cvt* are the only instructions in sse2 which have
7566    both SSE and MMX operands and also have 0x66 prefix
7567    in their opcode. 0x66 was originally used to differentiate
7568    between SSE and MMX instruction(operands). So we have to handle the
7569    cvt* separately using OP_EMC and OP_MXC */
7570 static void
7571 OP_EMC (int bytemode, int sizeflag)
7572 {
7573   if (modrm.mod != 3)
7574     {
7575       if (intel_syntax && bytemode == v_mode)
7576         {
7577           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
7578           used_prefixes |= (prefixes & PREFIX_DATA);
7579         }
7580       OP_E (bytemode, sizeflag);
7581       return;
7582     }
7583
7584   /* Skip mod/rm byte.  */
7585   MODRM_CHECK;
7586   codep++;
7587   used_prefixes |= (prefixes & PREFIX_DATA);
7588   sprintf (scratchbuf, "%%mm%d", modrm.rm);
7589   oappend (scratchbuf + intel_syntax);
7590 }
7591
7592 static void
7593 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7594 {
7595   used_prefixes |= (prefixes & PREFIX_DATA);
7596   sprintf (scratchbuf, "%%mm%d", modrm.reg);
7597   oappend (scratchbuf + intel_syntax);
7598 }
7599
7600 static void
7601 OP_EX (int bytemode, int sizeflag)
7602 {
7603   int add;
7604   if (modrm.mod != 3)
7605     {
7606       OP_E (bytemode, sizeflag);
7607       return;
7608     }
7609   USED_REX (REX_B);
7610   if (rex & REX_B)
7611     add = 8;
7612   else
7613     add = 0;
7614
7615   /* Skip mod/rm byte.  */
7616   MODRM_CHECK;
7617   codep++;
7618   sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
7619   oappend (scratchbuf + intel_syntax);
7620 }
7621
7622 static void
7623 OP_MS (int bytemode, int sizeflag)
7624 {
7625   if (modrm.mod == 3)
7626     OP_EM (bytemode, sizeflag);
7627   else
7628     BadOp ();
7629 }
7630
7631 static void
7632 OP_XS (int bytemode, int sizeflag)
7633 {
7634   if (modrm.mod == 3)
7635     OP_EX (bytemode, sizeflag);
7636   else
7637     BadOp ();
7638 }
7639
7640 static void
7641 OP_M (int bytemode, int sizeflag)
7642 {
7643   if (modrm.mod == 3)
7644     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
7645     BadOp ();
7646   else
7647     OP_E (bytemode, sizeflag);
7648 }
7649
7650 static void
7651 OP_0f07 (int bytemode, int sizeflag)
7652 {
7653   if (modrm.mod != 3 || modrm.rm != 0)
7654     BadOp ();
7655   else
7656     OP_E (bytemode, sizeflag);
7657 }
7658
7659 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
7660    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
7661
7662 static void
7663 NOP_Fixup1 (int bytemode, int sizeflag)
7664 {
7665   if ((prefixes & PREFIX_DATA) != 0
7666       || (rex != 0
7667           && rex != 0x48
7668           && address_mode == mode_64bit))
7669     OP_REG (bytemode, sizeflag);
7670   else
7671     strcpy (obuf, "nop");
7672 }
7673
7674 static void
7675 NOP_Fixup2 (int bytemode, int sizeflag)
7676 {
7677   if ((prefixes & PREFIX_DATA) != 0
7678       || (rex != 0
7679           && rex != 0x48
7680           && address_mode == mode_64bit))
7681     OP_IMREG (bytemode, sizeflag);
7682 }
7683
7684 static const char *const Suffix3DNow[] = {
7685 /* 00 */        NULL,           NULL,           NULL,           NULL,
7686 /* 04 */        NULL,           NULL,           NULL,           NULL,
7687 /* 08 */        NULL,           NULL,           NULL,           NULL,
7688 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
7689 /* 10 */        NULL,           NULL,           NULL,           NULL,
7690 /* 14 */        NULL,           NULL,           NULL,           NULL,
7691 /* 18 */        NULL,           NULL,           NULL,           NULL,
7692 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
7693 /* 20 */        NULL,           NULL,           NULL,           NULL,
7694 /* 24 */        NULL,           NULL,           NULL,           NULL,
7695 /* 28 */        NULL,           NULL,           NULL,           NULL,
7696 /* 2C */        NULL,           NULL,           NULL,           NULL,
7697 /* 30 */        NULL,           NULL,           NULL,           NULL,
7698 /* 34 */        NULL,           NULL,           NULL,           NULL,
7699 /* 38 */        NULL,           NULL,           NULL,           NULL,
7700 /* 3C */        NULL,           NULL,           NULL,           NULL,
7701 /* 40 */        NULL,           NULL,           NULL,           NULL,
7702 /* 44 */        NULL,           NULL,           NULL,           NULL,
7703 /* 48 */        NULL,           NULL,           NULL,           NULL,
7704 /* 4C */        NULL,           NULL,           NULL,           NULL,
7705 /* 50 */        NULL,           NULL,           NULL,           NULL,
7706 /* 54 */        NULL,           NULL,           NULL,           NULL,
7707 /* 58 */        NULL,           NULL,           NULL,           NULL,
7708 /* 5C */        NULL,           NULL,           NULL,           NULL,
7709 /* 60 */        NULL,           NULL,           NULL,           NULL,
7710 /* 64 */        NULL,           NULL,           NULL,           NULL,
7711 /* 68 */        NULL,           NULL,           NULL,           NULL,
7712 /* 6C */        NULL,           NULL,           NULL,           NULL,
7713 /* 70 */        NULL,           NULL,           NULL,           NULL,
7714 /* 74 */        NULL,           NULL,           NULL,           NULL,
7715 /* 78 */        NULL,           NULL,           NULL,           NULL,
7716 /* 7C */        NULL,           NULL,           NULL,           NULL,
7717 /* 80 */        NULL,           NULL,           NULL,           NULL,
7718 /* 84 */        NULL,           NULL,           NULL,           NULL,
7719 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
7720 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
7721 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
7722 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
7723 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
7724 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
7725 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
7726 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
7727 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
7728 /* AC */        NULL,           NULL,           "pfacc",        NULL,
7729 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
7730 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
7731 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
7732 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
7733 /* C0 */        NULL,           NULL,           NULL,           NULL,
7734 /* C4 */        NULL,           NULL,           NULL,           NULL,
7735 /* C8 */        NULL,           NULL,           NULL,           NULL,
7736 /* CC */        NULL,           NULL,           NULL,           NULL,
7737 /* D0 */        NULL,           NULL,           NULL,           NULL,
7738 /* D4 */        NULL,           NULL,           NULL,           NULL,
7739 /* D8 */        NULL,           NULL,           NULL,           NULL,
7740 /* DC */        NULL,           NULL,           NULL,           NULL,
7741 /* E0 */        NULL,           NULL,           NULL,           NULL,
7742 /* E4 */        NULL,           NULL,           NULL,           NULL,
7743 /* E8 */        NULL,           NULL,           NULL,           NULL,
7744 /* EC */        NULL,           NULL,           NULL,           NULL,
7745 /* F0 */        NULL,           NULL,           NULL,           NULL,
7746 /* F4 */        NULL,           NULL,           NULL,           NULL,
7747 /* F8 */        NULL,           NULL,           NULL,           NULL,
7748 /* FC */        NULL,           NULL,           NULL,           NULL,
7749 };
7750
7751 static void
7752 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7753 {
7754   const char *mnemonic;
7755
7756   FETCH_DATA (the_info, codep + 1);
7757   /* AMD 3DNow! instructions are specified by an opcode suffix in the
7758      place where an 8-bit immediate would normally go.  ie. the last
7759      byte of the instruction.  */
7760   obufp = obuf + strlen (obuf);
7761   mnemonic = Suffix3DNow[*codep++ & 0xff];
7762   if (mnemonic)
7763     oappend (mnemonic);
7764   else
7765     {
7766       /* Since a variable sized modrm/sib chunk is between the start
7767          of the opcode (0x0f0f) and the opcode suffix, we need to do
7768          all the modrm processing first, and don't know until now that
7769          we have a bad opcode.  This necessitates some cleaning up.  */
7770       op_out[0][0] = '\0';
7771       op_out[1][0] = '\0';
7772       BadOp ();
7773     }
7774 }
7775
7776 static const char *simd_cmp_op[] = {
7777   "eq",
7778   "lt",
7779   "le",
7780   "unord",
7781   "neq",
7782   "nlt",
7783   "nle",
7784   "ord"
7785 };
7786
7787 static void
7788 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7789 {
7790   unsigned int cmp_type;
7791
7792   FETCH_DATA (the_info, codep + 1);
7793   cmp_type = *codep++ & 0xff;
7794   if (cmp_type < 8)
7795     {
7796       char suffix [3];
7797       char *p = obuf + strlen (obuf) - 2;
7798       suffix[0] = p[0];
7799       suffix[1] = p[1];
7800       suffix[2] = '\0';
7801       sprintf (p, "%s%s", simd_cmp_op[cmp_type], suffix);
7802     }
7803   else
7804     {
7805       /* We have a reserved extension byte.  Output it directly.  */
7806       scratchbuf[0] = '$';
7807       print_operand_value (scratchbuf + 1, 1, cmp_type);
7808       oappend (scratchbuf + intel_syntax);
7809       scratchbuf[0] = '\0';
7810     }
7811 }
7812
7813 static void
7814 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
7815           int sizeflag ATTRIBUTE_UNUSED)
7816 {
7817   /* mwait %eax,%ecx  */
7818   if (!intel_syntax)
7819     {
7820       const char **names = (address_mode == mode_64bit
7821                             ? names64 : names32);
7822       strcpy (op_out[0], names[0]);
7823       strcpy (op_out[1], names[1]);
7824       two_source_ops = 1;
7825     }
7826   /* Skip mod/rm byte.  */
7827   MODRM_CHECK;
7828   codep++;
7829 }
7830
7831 static void
7832 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
7833             int sizeflag ATTRIBUTE_UNUSED)
7834 {
7835   /* monitor %eax,%ecx,%edx"  */
7836   if (!intel_syntax)
7837     {
7838       const char **op1_names;
7839       const char **names = (address_mode == mode_64bit
7840                             ? names64 : names32);
7841
7842       if (!(prefixes & PREFIX_ADDR))
7843         op1_names = (address_mode == mode_16bit
7844                      ? names16 : names);
7845       else
7846         {
7847           /* Remove "addr16/addr32".  */
7848           addr_prefix = NULL;
7849           op1_names = (address_mode != mode_32bit
7850                        ? names32 : names16);
7851           used_prefixes |= PREFIX_ADDR;
7852         }
7853       strcpy (op_out[0], op1_names[0]);
7854       strcpy (op_out[1], names[1]);
7855       strcpy (op_out[2], names[2]);
7856       two_source_ops = 1;
7857     }
7858   /* Skip mod/rm byte.  */
7859   MODRM_CHECK;
7860   codep++;
7861 }
7862
7863 static void
7864 BadOp (void)
7865 {
7866   /* Throw away prefixes and 1st. opcode byte.  */
7867   codep = insn_codep + 1;
7868   oappend ("(bad)");
7869 }
7870
7871 static void
7872 REP_Fixup (int bytemode, int sizeflag)
7873 {
7874   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
7875      lods and stos.  */
7876   if (prefixes & PREFIX_REPZ)
7877     repz_prefix = "rep ";
7878
7879   switch (bytemode)
7880     {
7881     case al_reg:
7882     case eAX_reg:
7883     case indir_dx_reg:
7884       OP_IMREG (bytemode, sizeflag);
7885       break;
7886     case eDI_reg:
7887       OP_ESreg (bytemode, sizeflag);
7888       break;
7889     case eSI_reg:
7890       OP_DSreg (bytemode, sizeflag);
7891       break;
7892     default:
7893       abort ();
7894       break;
7895     }
7896 }
7897
7898 static void
7899 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
7900 {
7901   USED_REX (REX_W);
7902   if (rex & REX_W)
7903     {
7904       /* Change cmpxchg8b to cmpxchg16b.  */
7905       char *p = obuf + strlen (obuf) - 2;
7906       strcpy (p, "16b");
7907       bytemode = o_mode;
7908     }
7909   OP_M (bytemode, sizeflag);
7910 }
7911
7912 static void
7913 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
7914 {
7915   sprintf (scratchbuf, "%%xmm%d", reg);
7916   oappend (scratchbuf + intel_syntax);
7917 }
7918
7919 static void
7920 CRC32_Fixup (int bytemode, int sizeflag)
7921 {
7922   /* Add proper suffix to "crc32".  */
7923   char *p = obuf + strlen (obuf);
7924
7925   switch (bytemode)
7926     {
7927     case b_mode:
7928       if (intel_syntax)
7929         break;
7930
7931       *p++ = 'b';
7932       break;
7933     case v_mode:
7934       if (intel_syntax)
7935         break;
7936
7937       USED_REX (REX_W);
7938       if (rex & REX_W)
7939         *p++ = 'q';
7940       else if (sizeflag & DFLAG)
7941         *p++ = 'l';
7942       else
7943         *p++ = 'w';
7944       used_prefixes |= (prefixes & PREFIX_DATA);
7945       break;
7946     default:
7947       oappend (INTERNAL_DISASSEMBLER_ERROR);
7948       break;
7949     }
7950   *p = '\0';
7951
7952   if (modrm.mod == 3)
7953     {
7954       int add;
7955
7956       /* Skip mod/rm byte.  */
7957       MODRM_CHECK;
7958       codep++;
7959
7960       USED_REX (REX_B);
7961       add = (rex & REX_B) ? 8 : 0;
7962       if (bytemode == b_mode)
7963         {
7964           USED_REX (0);
7965           if (rex)
7966             oappend (names8rex[modrm.rm + add]);
7967           else
7968             oappend (names8[modrm.rm + add]);
7969         }
7970       else
7971         {
7972           USED_REX (REX_W);
7973           if (rex & REX_W)
7974             oappend (names64[modrm.rm + add]);
7975           else if ((prefixes & PREFIX_DATA))
7976             oappend (names16[modrm.rm + add]);
7977           else
7978             oappend (names32[modrm.rm + add]);
7979         }
7980     }
7981   else
7982     OP_E (bytemode, sizeflag);
7983 }
7984
7985 /* Print a DREX argument as either a register or memory operation.  */
7986 static void
7987 print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
7988 {
7989   if (reg == DREX_REG_UNKNOWN)
7990     BadOp ();
7991
7992   else if (reg != DREX_REG_MEMORY)
7993     {
7994       sprintf (scratchbuf, "%%xmm%d", reg);
7995       oappend (scratchbuf + intel_syntax);
7996     }
7997
7998   else
7999     OP_E_extended (bytemode, sizeflag, 1);
8000 }
8001
8002 /* SSE5 instructions that have 4 arguments are encoded as:
8003    0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
8004
8005    The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
8006    the DREX field (0x8) to determine how the arguments are laid out.  
8007    The destination register must be the same register as one of the 
8008    inputs, and it is encoded in the DREX byte.  No REX prefix is used 
8009    for these instructions, since the DREX field contains the 3 extension
8010    bits provided by the REX prefix.
8011
8012    The bytemode argument adds 2 extra bits for passing extra information:
8013         DREX_OC1        -- Set the OC1 bit to indicate dest == 1st arg
8014         DREX_NO_OC0     -- OC0 in DREX is invalid 
8015         (but pretend it is set).  */
8016
8017 static void
8018 OP_DREX4 (int flag_bytemode, int sizeflag)
8019 {
8020   unsigned int drex_byte;
8021   unsigned int regs[4];
8022   unsigned int modrm_regmem;
8023   unsigned int modrm_reg;
8024   unsigned int drex_reg;
8025   int bytemode;
8026   int rex_save = rex;
8027   int rex_used_save = rex_used;
8028   int has_sib = 0;
8029   int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
8030   int oc0;
8031   int i;
8032
8033   bytemode = flag_bytemode & ~ DREX_MASK;
8034
8035   for (i = 0; i < 4; i++)
8036     regs[i] = DREX_REG_UNKNOWN;
8037
8038   /* Determine if we have a SIB byte in addition to MODRM before the 
8039      DREX byte.  */
8040   if (((sizeflag & AFLAG) || address_mode == mode_64bit)
8041       && (modrm.mod != 3)
8042       && (modrm.rm == 4))
8043     has_sib = 1;
8044
8045   /* Get the DREX byte.  */
8046   FETCH_DATA (the_info, codep + 2 + has_sib);
8047   drex_byte = codep[has_sib+1];
8048   drex_reg = DREX_XMM (drex_byte);
8049   modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
8050
8051   /* Is OC0 legal?  If not, hardwire oc0 == 1.  */
8052   if (flag_bytemode & DREX_NO_OC0)
8053     {
8054       oc0 = 1;
8055       if (DREX_OC0 (drex_byte))
8056         BadOp ();
8057     }
8058   else
8059     oc0 = DREX_OC0 (drex_byte);
8060
8061   if (modrm.mod == 3)
8062     {                   
8063       /* regmem == register  */
8064       modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
8065       rex = rex_used = 0;
8066       /* skip modrm/drex since we don't call OP_E_extended  */
8067       codep += 2;
8068     }
8069   else
8070     {                   
8071       /* regmem == memory, fill in appropriate REX bits  */
8072       modrm_regmem = DREX_REG_MEMORY;
8073       rex = drex_byte & (REX_B | REX_X | REX_R);
8074       if (rex)
8075         rex |= REX_OPCODE;
8076       rex_used = rex;
8077     }
8078   
8079   /* Based on the OC1/OC0 bits, lay out the arguments in the correct 
8080      order.  */
8081   switch (oc0 + oc1)
8082     {
8083     default:
8084       BadOp ();
8085       return;
8086
8087     case 0:
8088       regs[0] = modrm_regmem;
8089       regs[1] = modrm_reg;
8090       regs[2] = drex_reg;
8091       regs[3] = drex_reg;
8092       break;
8093
8094     case 1:
8095       regs[0] = modrm_reg;
8096       regs[1] = modrm_regmem;
8097       regs[2] = drex_reg;
8098       regs[3] = drex_reg;
8099       break;
8100
8101     case 2:
8102       regs[0] = drex_reg;
8103       regs[1] = modrm_regmem;
8104       regs[2] = modrm_reg;
8105       regs[3] = drex_reg;
8106       break;
8107
8108     case 3:
8109       regs[0] = drex_reg;
8110       regs[1] = modrm_reg;
8111       regs[2] = modrm_regmem;
8112       regs[3] = drex_reg;
8113       break;
8114     }
8115
8116   /* Print out the arguments.  */
8117   for (i = 0; i < 4; i++)
8118     {
8119       int j = (intel_syntax) ? 3 - i : i;
8120       if (i > 0)
8121         {
8122           *obufp++ = ',';
8123           *obufp = '\0';
8124         }
8125
8126       print_drex_arg (regs[j], bytemode, sizeflag);
8127     }
8128
8129   rex = rex_save;
8130   rex_used = rex_used_save;
8131 }
8132
8133 /* SSE5 instructions that have 3 arguments, and are encoded as:
8134    0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>    (or)
8135    0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
8136
8137    The DREX field has 1 bit (0x8) to determine how the arguments are 
8138    laid out. The destination register is encoded in the DREX byte.  
8139    No REX prefix is used for these instructions, since the DREX field 
8140    contains the 3 extension bits provided by the REX prefix.  */
8141
8142 static void
8143 OP_DREX3 (int flag_bytemode, int sizeflag)
8144 {
8145   unsigned int drex_byte;
8146   unsigned int regs[3];
8147   unsigned int modrm_regmem;
8148   unsigned int modrm_reg;
8149   unsigned int drex_reg;
8150   int bytemode;
8151   int rex_save = rex;
8152   int rex_used_save = rex_used;
8153   int has_sib = 0;
8154   int oc0;
8155   int i;
8156
8157   bytemode = flag_bytemode & ~ DREX_MASK;
8158
8159   for (i = 0; i < 3; i++)
8160     regs[i] = DREX_REG_UNKNOWN;
8161
8162   /* Determine if we have a SIB byte in addition to MODRM before the 
8163      DREX byte.  */
8164   if (((sizeflag & AFLAG) || address_mode == mode_64bit)
8165       && (modrm.mod != 3)
8166       && (modrm.rm == 4))
8167     has_sib = 1;
8168
8169   /* Get the DREX byte.  */
8170   FETCH_DATA (the_info, codep + 2 + has_sib);
8171   drex_byte = codep[has_sib+1];
8172   drex_reg = DREX_XMM (drex_byte);
8173   modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
8174
8175   /* Is OC0 legal?  If not, hardwire oc0 == 0 */
8176   oc0 = DREX_OC0 (drex_byte);
8177   if ((flag_bytemode & DREX_NO_OC0) && oc0)
8178     BadOp ();
8179
8180   if (modrm.mod == 3)
8181     {                   
8182       /* regmem == register */
8183       modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
8184       rex = rex_used = 0;
8185       /* skip modrm/drex since we don't call OP_E_extended.  */
8186       codep += 2;
8187     }
8188   else
8189     {                   
8190       /* regmem == memory, fill in appropriate REX bits.  */
8191       modrm_regmem = DREX_REG_MEMORY;
8192       rex = drex_byte & (REX_B | REX_X | REX_R);
8193       if (rex)
8194         rex |= REX_OPCODE;
8195       rex_used = rex;
8196     }
8197
8198   /* Based on the OC1/OC0 bits, lay out the arguments in the correct 
8199      order.  */
8200   switch (oc0)
8201     {
8202     default:
8203       BadOp ();
8204       return;
8205
8206     case 0:
8207       regs[0] = modrm_regmem;
8208       regs[1] = modrm_reg;
8209       regs[2] = drex_reg;
8210       break;
8211
8212     case 1:
8213       regs[0] = modrm_reg;
8214       regs[1] = modrm_regmem;
8215       regs[2] = drex_reg;
8216       break;
8217     }
8218
8219   /* Print out the arguments.  */
8220   for (i = 0; i < 3; i++)
8221     {
8222       int j = (intel_syntax) ? 2 - i : i;
8223       if (i > 0)
8224         {
8225           *obufp++ = ',';
8226           *obufp = '\0';
8227         }
8228
8229       print_drex_arg (regs[j], bytemode, sizeflag);
8230     }
8231
8232   rex = rex_save;
8233   rex_used = rex_used_save;
8234 }
8235
8236 /* Emit a floating point comparison for comp<xx> instructions.  */
8237
8238 static void
8239 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED, 
8240               int sizeflag ATTRIBUTE_UNUSED)
8241 {
8242   unsigned char byte;
8243
8244   static const char *const cmp_test[] = {
8245     "eq",
8246     "lt",
8247     "le",
8248     "unord",
8249     "ne",
8250     "nlt",
8251     "nle",
8252     "ord",
8253     "ueq",
8254     "ult",
8255     "ule",
8256     "false",
8257     "une",
8258     "unlt",
8259     "unle",
8260     "true"
8261   };
8262
8263   FETCH_DATA (the_info, codep + 1);
8264   byte = *codep & 0xff;
8265
8266   if (byte >= ARRAY_SIZE (cmp_test)
8267       || obuf[0] != 'c'
8268       || obuf[1] != 'o'
8269       || obuf[2] != 'm')
8270     {
8271       /* The instruction isn't one we know about, so just append the 
8272          extension byte as a numeric value.  */
8273       OP_I (b_mode, 0);
8274     }
8275
8276   else
8277     {
8278       sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
8279       strcpy (obuf, scratchbuf);
8280       codep++;
8281     }
8282 }
8283
8284 /* Emit an integer point comparison for pcom<xx> instructions, 
8285    rewriting the instruction to have the test inside of it.  */
8286
8287 static void
8288 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED, 
8289               int sizeflag ATTRIBUTE_UNUSED)
8290 {
8291   unsigned char byte;
8292
8293   static const char *const cmp_test[] = {
8294     "lt",
8295     "le",
8296     "gt",
8297     "ge",
8298     "eq",
8299     "ne",
8300     "false",
8301     "true"
8302   };
8303
8304   FETCH_DATA (the_info, codep + 1);
8305   byte = *codep & 0xff;
8306
8307   if (byte >= ARRAY_SIZE (cmp_test)
8308       || obuf[0] != 'p'
8309       || obuf[1] != 'c'
8310       || obuf[2] != 'o'
8311       || obuf[3] != 'm')
8312     {
8313       /* The instruction isn't one we know about, so just print the 
8314          comparison test byte as a numeric value.  */
8315       OP_I (b_mode, 0);
8316     }
8317
8318   else
8319     {
8320       sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
8321       strcpy (obuf, scratchbuf);
8322       codep++;
8323     }
8324 }