Check rex_ignored.
[external/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, 2008, 2009
4    Free Software Foundation, Inc.
5
6    This file is part of the GNU opcodes library.
7
8    This library is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    It is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22
23
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25    July 1988
26     modified by John Hassey (hassey@dg-rtp.dg.com)
27     x86-64 support added by Jan Hubicka (jh@suse.cz)
28     VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
29
30 /* The main tables describing the instructions is essentially a copy
31    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32    Programmers Manual.  Usually, there is a capital letter, followed
33    by a small letter.  The capital letter tell the addressing mode,
34    and the small letter tells about the operand size.  Refer to
35    the Intel manual for details.  */
36
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
42
43 #include <setjmp.h>
44
45 static int print_insn (bfd_vma, disassemble_info *);
46 static void dofloat (int);
47 static void OP_ST (int, int);
48 static void OP_STi (int, int);
49 static int putop (const char *, int);
50 static void oappend (const char *);
51 static void append_seg (void);
52 static void OP_indirE (int, int);
53 static void print_operand_value (char *, int, bfd_vma);
54 static void OP_E_register (int, int);
55 static void OP_E_memory (int, int);
56 static void OP_E_extended (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_VEX (int, int);
93 static void OP_EX_Vex (int, int);
94 static void OP_EX_VexW (int, int);
95 static void OP_XMM_Vex (int, int);
96 static void OP_XMM_VexW (int, int);
97 static void OP_REG_VexI4 (int, int);
98 static void PCLMUL_Fixup (int, int);
99 static void VEXI4_Fixup (int, int);
100 static void VZERO_Fixup (int, int);
101 static void VCMP_Fixup (int, int);
102 static void OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void CMPXCHG8B_Fixup (int, int);
112 static void XMM_Fixup (int, int);
113 static void CRC32_Fixup (int, int);
114 static void OP_LWPCB_E (int, int);
115 static void OP_LWP_E (int, int);
116 static void OP_LWP_I (int, int);
117
118 static void MOVBE_Fixup (int, int);
119
120 struct dis_private {
121   /* Points to first byte not fetched.  */
122   bfd_byte *max_fetched;
123   bfd_byte the_buffer[MAX_MNEM_SIZE];
124   bfd_vma insn_start;
125   int orig_sizeflag;
126   jmp_buf bailout;
127 };
128
129 enum address_mode
130 {
131   mode_16bit,
132   mode_32bit,
133   mode_64bit
134 };
135
136 enum address_mode address_mode;
137
138 /* Flags for the prefixes for the current instruction.  See below.  */
139 static int prefixes;
140
141 /* REX prefix the current instruction.  See below.  */
142 static int rex;
143 /* Bits of REX we've already used.  */
144 static int rex_used;
145 /* Original REX prefix.  */
146 static int rex_original;
147 /* REX bits in original REX prefix ignored.  It may not be the same
148    as rex_original since some bits may not be ignored.  */
149 static int rex_ignored;
150 /* Mark parts used in the REX prefix.  When we are testing for
151    empty prefix (for 8bit register REX extension), just mask it
152    out.  Otherwise test for REX bit is excuse for existence of REX
153    only in case value is nonzero.  */
154 #define USED_REX(value)                                 \
155   {                                                     \
156     if (value)                                          \
157       {                                                 \
158         if ((rex & value))                              \
159           rex_used |= (value) | REX_OPCODE;             \
160       }                                                 \
161     else                                                \
162       rex_used |= REX_OPCODE;                           \
163   }
164
165 /* Flags for prefixes which we somehow handled when printing the
166    current instruction.  */
167 static int used_prefixes;
168
169 /* Flags stored in PREFIXES.  */
170 #define PREFIX_REPZ 1
171 #define PREFIX_REPNZ 2
172 #define PREFIX_LOCK 4
173 #define PREFIX_CS 8
174 #define PREFIX_SS 0x10
175 #define PREFIX_DS 0x20
176 #define PREFIX_ES 0x40
177 #define PREFIX_FS 0x80
178 #define PREFIX_GS 0x100
179 #define PREFIX_DATA 0x200
180 #define PREFIX_ADDR 0x400
181 #define PREFIX_FWAIT 0x800
182
183 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
184    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
185    on error.  */
186 #define FETCH_DATA(info, addr) \
187   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
188    ? 1 : fetch_data ((info), (addr)))
189
190 static int
191 fetch_data (struct disassemble_info *info, bfd_byte *addr)
192 {
193   int status;
194   struct dis_private *priv = (struct dis_private *) info->private_data;
195   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
196
197   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
198     status = (*info->read_memory_func) (start,
199                                         priv->max_fetched,
200                                         addr - priv->max_fetched,
201                                         info);
202   else
203     status = -1;
204   if (status != 0)
205     {
206       /* If we did manage to read at least one byte, then
207          print_insn_i386 will do something sensible.  Otherwise, print
208          an error.  We do that here because this is where we know
209          STATUS.  */
210       if (priv->max_fetched == priv->the_buffer)
211         (*info->memory_error_func) (status, start, info);
212       longjmp (priv->bailout, 1);
213     }
214   else
215     priv->max_fetched = addr;
216   return 1;
217 }
218
219 #define XX { NULL, 0 }
220
221 #define Eb { OP_E, b_mode }
222 #define EbS { OP_E, b_swap_mode }
223 #define Ev { OP_E, v_mode }
224 #define EvS { OP_E, v_swap_mode }
225 #define Ed { OP_E, d_mode }
226 #define Edq { OP_E, dq_mode }
227 #define Edqw { OP_E, dqw_mode }
228 #define Edqb { OP_E, dqb_mode }
229 #define Edqd { OP_E, dqd_mode }
230 #define Eq { OP_E, q_mode }
231 #define indirEv { OP_indirE, stack_v_mode }
232 #define indirEp { OP_indirE, f_mode }
233 #define stackEv { OP_E, stack_v_mode }
234 #define Em { OP_E, m_mode }
235 #define Ew { OP_E, w_mode }
236 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
237 #define Ma { OP_M, a_mode }
238 #define Mb { OP_M, b_mode }
239 #define Md { OP_M, d_mode }
240 #define Mo { OP_M, o_mode }
241 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
242 #define Mq { OP_M, q_mode }
243 #define Mx { OP_M, x_mode }
244 #define Mxmm { OP_M, xmm_mode }
245 #define Gb { OP_G, b_mode }
246 #define Gv { OP_G, v_mode }
247 #define Gd { OP_G, d_mode }
248 #define Gdq { OP_G, dq_mode }
249 #define Gm { OP_G, m_mode }
250 #define Gw { OP_G, w_mode }
251 #define Rd { OP_R, d_mode }
252 #define Rm { OP_R, m_mode }
253 #define Ib { OP_I, b_mode }
254 #define sIb { OP_sI, b_mode }   /* sign extened byte */
255 #define Iv { OP_I, v_mode }
256 #define Iq { OP_I, q_mode }
257 #define Iv64 { OP_I64, v_mode }
258 #define Iw { OP_I, w_mode }
259 #define I1 { OP_I, const_1_mode }
260 #define Jb { OP_J, b_mode }
261 #define Jv { OP_J, v_mode }
262 #define Cm { OP_C, m_mode }
263 #define Dm { OP_D, m_mode }
264 #define Td { OP_T, d_mode }
265 #define Skip_MODRM { OP_Skip_MODRM, 0 }
266
267 #define RMeAX { OP_REG, eAX_reg }
268 #define RMeBX { OP_REG, eBX_reg }
269 #define RMeCX { OP_REG, eCX_reg }
270 #define RMeDX { OP_REG, eDX_reg }
271 #define RMeSP { OP_REG, eSP_reg }
272 #define RMeBP { OP_REG, eBP_reg }
273 #define RMeSI { OP_REG, eSI_reg }
274 #define RMeDI { OP_REG, eDI_reg }
275 #define RMrAX { OP_REG, rAX_reg }
276 #define RMrBX { OP_REG, rBX_reg }
277 #define RMrCX { OP_REG, rCX_reg }
278 #define RMrDX { OP_REG, rDX_reg }
279 #define RMrSP { OP_REG, rSP_reg }
280 #define RMrBP { OP_REG, rBP_reg }
281 #define RMrSI { OP_REG, rSI_reg }
282 #define RMrDI { OP_REG, rDI_reg }
283 #define RMAL { OP_REG, al_reg }
284 #define RMAL { OP_REG, al_reg }
285 #define RMCL { OP_REG, cl_reg }
286 #define RMDL { OP_REG, dl_reg }
287 #define RMBL { OP_REG, bl_reg }
288 #define RMAH { OP_REG, ah_reg }
289 #define RMCH { OP_REG, ch_reg }
290 #define RMDH { OP_REG, dh_reg }
291 #define RMBH { OP_REG, bh_reg }
292 #define RMAX { OP_REG, ax_reg }
293 #define RMDX { OP_REG, dx_reg }
294
295 #define eAX { OP_IMREG, eAX_reg }
296 #define eBX { OP_IMREG, eBX_reg }
297 #define eCX { OP_IMREG, eCX_reg }
298 #define eDX { OP_IMREG, eDX_reg }
299 #define eSP { OP_IMREG, eSP_reg }
300 #define eBP { OP_IMREG, eBP_reg }
301 #define eSI { OP_IMREG, eSI_reg }
302 #define eDI { OP_IMREG, eDI_reg }
303 #define AL { OP_IMREG, al_reg }
304 #define CL { OP_IMREG, cl_reg }
305 #define DL { OP_IMREG, dl_reg }
306 #define BL { OP_IMREG, bl_reg }
307 #define AH { OP_IMREG, ah_reg }
308 #define CH { OP_IMREG, ch_reg }
309 #define DH { OP_IMREG, dh_reg }
310 #define BH { OP_IMREG, bh_reg }
311 #define AX { OP_IMREG, ax_reg }
312 #define DX { OP_IMREG, dx_reg }
313 #define zAX { OP_IMREG, z_mode_ax_reg }
314 #define indirDX { OP_IMREG, indir_dx_reg }
315
316 #define Sw { OP_SEG, w_mode }
317 #define Sv { OP_SEG, v_mode }
318 #define Ap { OP_DIR, 0 }
319 #define Ob { OP_OFF64, b_mode }
320 #define Ov { OP_OFF64, v_mode }
321 #define Xb { OP_DSreg, eSI_reg }
322 #define Xv { OP_DSreg, eSI_reg }
323 #define Xz { OP_DSreg, eSI_reg }
324 #define Yb { OP_ESreg, eDI_reg }
325 #define Yv { OP_ESreg, eDI_reg }
326 #define DSBX { OP_DSreg, eBX_reg }
327
328 #define es { OP_REG, es_reg }
329 #define ss { OP_REG, ss_reg }
330 #define cs { OP_REG, cs_reg }
331 #define ds { OP_REG, ds_reg }
332 #define fs { OP_REG, fs_reg }
333 #define gs { OP_REG, gs_reg }
334
335 #define MX { OP_MMX, 0 }
336 #define XM { OP_XMM, 0 }
337 #define XMM { OP_XMM, xmm_mode }
338 #define EM { OP_EM, v_mode }
339 #define EMS { OP_EM, v_swap_mode }
340 #define EMd { OP_EM, d_mode }
341 #define EMx { OP_EM, x_mode }
342 #define EXw { OP_EX, w_mode }
343 #define EXd { OP_EX, d_mode }
344 #define EXdS { OP_EX, d_swap_mode }
345 #define EXq { OP_EX, q_mode }
346 #define EXqS { OP_EX, q_swap_mode }
347 #define EXx { OP_EX, x_mode }
348 #define EXxS { OP_EX, x_swap_mode }
349 #define EXxmm { OP_EX, xmm_mode }
350 #define EXxmmq { OP_EX, xmmq_mode }
351 #define EXymmq { OP_EX, ymmq_mode }
352 #define EXVexWdq { OP_EX, vex_w_dq_mode }
353 #define MS { OP_MS, v_mode }
354 #define XS { OP_XS, v_mode }
355 #define EMCq { OP_EMC, q_mode }
356 #define MXC { OP_MXC, 0 }
357 #define OPSUF { OP_3DNowSuffix, 0 }
358 #define CMP { CMP_Fixup, 0 }
359 #define XMM0 { XMM_Fixup, 0 }
360
361 #define Vex { OP_VEX, vex_mode }
362 #define Vex128 { OP_VEX, vex128_mode }
363 #define Vex256 { OP_VEX, vex256_mode }
364 #define VexI4 { VEXI4_Fixup, 0}
365 #define EXdVex { OP_EX_Vex, d_mode }
366 #define EXdVexS { OP_EX_Vex, d_swap_mode }
367 #define EXqVex { OP_EX_Vex, q_mode }
368 #define EXqVexS { OP_EX_Vex, q_swap_mode }
369 #define EXVexW { OP_EX_VexW, x_mode }
370 #define EXdVexW { OP_EX_VexW, d_mode }
371 #define EXqVexW { OP_EX_VexW, q_mode }
372 #define XMVex { OP_XMM_Vex, 0 }
373 #define XMVexW { OP_XMM_VexW, 0 }
374 #define XMVexI4 { OP_REG_VexI4, x_mode }
375 #define PCLMUL { PCLMUL_Fixup, 0 }
376 #define VZERO { VZERO_Fixup, 0 }
377 #define VCMP { VCMP_Fixup, 0 }
378
379 /* Used handle "rep" prefix for string instructions.  */
380 #define Xbr { REP_Fixup, eSI_reg }
381 #define Xvr { REP_Fixup, eSI_reg }
382 #define Ybr { REP_Fixup, eDI_reg }
383 #define Yvr { REP_Fixup, eDI_reg }
384 #define Yzr { REP_Fixup, eDI_reg }
385 #define indirDXr { REP_Fixup, indir_dx_reg }
386 #define ALr { REP_Fixup, al_reg }
387 #define eAXr { REP_Fixup, eAX_reg }
388
389 #define cond_jump_flag { NULL, cond_jump_mode }
390 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
391
392 /* bits in sizeflag */
393 #define SUFFIX_ALWAYS 4
394 #define AFLAG 2
395 #define DFLAG 1
396
397 enum
398 {
399   /* byte operand */
400   b_mode = 1,
401   /* byte operand with operand swapped */
402   b_swap_mode,
403   /* operand size depends on prefixes */
404   v_mode,
405   /* operand size depends on prefixes with operand swapped */
406   v_swap_mode,
407   /* word operand */
408   w_mode,
409   /* double word operand  */
410   d_mode,
411   /* double word operand with operand swapped */
412   d_swap_mode,
413   /* quad word operand */
414   q_mode,
415   /* quad word operand with operand swapped */
416   q_swap_mode,
417   /* ten-byte operand */
418   t_mode,
419   /* 16-byte XMM or 32-byte YMM operand */
420   x_mode,
421   /* 16-byte XMM or 32-byte YMM operand with operand swapped */
422   x_swap_mode,
423   /* 16-byte XMM operand */
424   xmm_mode,
425   /* 16-byte XMM or quad word operand */
426   xmmq_mode,
427   /* 32-byte YMM or quad word operand */
428   ymmq_mode,
429   /* d_mode in 32bit, q_mode in 64bit mode.  */
430   m_mode,
431   /* pair of v_mode operands */
432   a_mode,
433   cond_jump_mode,
434   loop_jcxz_mode,
435   /* operand size depends on REX prefixes.  */
436   dq_mode,
437   /* registers like dq_mode, memory like w_mode.  */
438   dqw_mode,
439   /* 4- or 6-byte pointer operand */
440   f_mode,
441   const_1_mode,
442   /* v_mode for stack-related opcodes.  */
443   stack_v_mode,
444   /* non-quad operand size depends on prefixes */
445   z_mode,
446   /* 16-byte operand */
447   o_mode,
448   /* registers like dq_mode, memory like b_mode.  */
449   dqb_mode,
450   /* registers like dq_mode, memory like d_mode.  */
451   dqd_mode,
452   /* normal vex mode */
453   vex_mode,
454   /* 128bit vex mode */
455   vex128_mode,
456   /* 256bit vex mode */
457   vex256_mode,
458   /* operand size depends on the VEX.W bit.  */
459   vex_w_dq_mode,
460
461   es_reg,
462   cs_reg,
463   ss_reg,
464   ds_reg,
465   fs_reg,
466   gs_reg,
467
468   eAX_reg,
469   eCX_reg,
470   eDX_reg,
471   eBX_reg,
472   eSP_reg,
473   eBP_reg,
474   eSI_reg,
475   eDI_reg,
476
477   al_reg,
478   cl_reg,
479   dl_reg,
480   bl_reg,
481   ah_reg,
482   ch_reg,
483   dh_reg,
484   bh_reg,
485
486   ax_reg,
487   cx_reg,
488   dx_reg,
489   bx_reg,
490   sp_reg,
491   bp_reg,
492   si_reg,
493   di_reg,
494
495   rAX_reg,
496   rCX_reg,
497   rDX_reg,
498   rBX_reg,
499   rSP_reg,
500   rBP_reg,
501   rSI_reg,
502   rDI_reg,
503
504   z_mode_ax_reg,
505   indir_dx_reg
506 };
507
508 enum
509 {
510   FLOATCODE = 1,
511   USE_REG_TABLE,
512   USE_MOD_TABLE,
513   USE_RM_TABLE,
514   USE_PREFIX_TABLE,
515   USE_X86_64_TABLE,
516   USE_3BYTE_TABLE,
517   USE_XOP_8F_TABLE,
518   USE_VEX_C4_TABLE,
519   USE_VEX_C5_TABLE,
520   USE_VEX_LEN_TABLE
521 };
522
523 #define FLOAT                   NULL, { { NULL, FLOATCODE } }
524
525 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
526 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
527 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
528 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
529 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
530 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
531 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
532 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
533 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
534 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
535 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
536
537 enum
538 {
539   REG_80 = 0,
540   REG_81,
541   REG_82,
542   REG_8F,
543   REG_C0,
544   REG_C1,
545   REG_C6,
546   REG_C7,
547   REG_D0,
548   REG_D1,
549   REG_D2,
550   REG_D3,
551   REG_F6,
552   REG_F7,
553   REG_FE,
554   REG_FF,
555   REG_0F00,
556   REG_0F01,
557   REG_0F0D,
558   REG_0F18,
559   REG_0F71,
560   REG_0F72,
561   REG_0F73,
562   REG_0FA6,
563   REG_0FA7,
564   REG_0FAE,
565   REG_0FBA,
566   REG_0FC7,
567   REG_VEX_71,
568   REG_VEX_72,
569   REG_VEX_73,
570   REG_VEX_AE,
571   REG_XOP_LWPCB,
572   REG_XOP_LWP
573 };
574
575 enum
576 {
577   MOD_8D = 0,
578   MOD_0F01_REG_0,
579   MOD_0F01_REG_1,
580   MOD_0F01_REG_2,
581   MOD_0F01_REG_3,
582   MOD_0F01_REG_7,
583   MOD_0F12_PREFIX_0,
584   MOD_0F13,
585   MOD_0F16_PREFIX_0,
586   MOD_0F17,
587   MOD_0F18_REG_0,
588   MOD_0F18_REG_1,
589   MOD_0F18_REG_2,
590   MOD_0F18_REG_3,
591   MOD_0F20,
592   MOD_0F21,
593   MOD_0F22,
594   MOD_0F23,
595   MOD_0F24,
596   MOD_0F26,
597   MOD_0F2B_PREFIX_0,
598   MOD_0F2B_PREFIX_1,
599   MOD_0F2B_PREFIX_2,
600   MOD_0F2B_PREFIX_3,
601   MOD_0F51,
602   MOD_0F71_REG_2,
603   MOD_0F71_REG_4,
604   MOD_0F71_REG_6,
605   MOD_0F72_REG_2,
606   MOD_0F72_REG_4,
607   MOD_0F72_REG_6,
608   MOD_0F73_REG_2,
609   MOD_0F73_REG_3,
610   MOD_0F73_REG_6,
611   MOD_0F73_REG_7,
612   MOD_0FAE_REG_0,
613   MOD_0FAE_REG_1,
614   MOD_0FAE_REG_2,
615   MOD_0FAE_REG_3,
616   MOD_0FAE_REG_4,
617   MOD_0FAE_REG_5,
618   MOD_0FAE_REG_6,
619   MOD_0FAE_REG_7,
620   MOD_0FB2,
621   MOD_0FB4,
622   MOD_0FB5,
623   MOD_0FC7_REG_6,
624   MOD_0FC7_REG_7,
625   MOD_0FD7,
626   MOD_0FE7_PREFIX_2,
627   MOD_0FF0_PREFIX_3,
628   MOD_0F382A_PREFIX_2,
629   MOD_62_32BIT,
630   MOD_C4_32BIT,
631   MOD_C5_32BIT,
632   MOD_VEX_12_PREFIX_0,
633   MOD_VEX_13,
634   MOD_VEX_16_PREFIX_0,
635   MOD_VEX_17,
636   MOD_VEX_2B,
637   MOD_VEX_51,
638   MOD_VEX_71_REG_2,
639   MOD_VEX_71_REG_4,
640   MOD_VEX_71_REG_6,
641   MOD_VEX_72_REG_2,
642   MOD_VEX_72_REG_4,
643   MOD_VEX_72_REG_6,
644   MOD_VEX_73_REG_2,
645   MOD_VEX_73_REG_3,
646   MOD_VEX_73_REG_6,
647   MOD_VEX_73_REG_7,
648   MOD_VEX_AE_REG_2,
649   MOD_VEX_AE_REG_3,
650   MOD_VEX_D7_PREFIX_2,
651   MOD_VEX_E7_PREFIX_2,
652   MOD_VEX_F0_PREFIX_3,
653   MOD_VEX_3818_PREFIX_2,
654   MOD_VEX_3819_PREFIX_2,
655   MOD_VEX_381A_PREFIX_2,
656   MOD_VEX_382A_PREFIX_2,
657   MOD_VEX_382C_PREFIX_2,
658   MOD_VEX_382D_PREFIX_2,
659   MOD_VEX_382E_PREFIX_2,
660   MOD_VEX_382F_PREFIX_2
661 };
662
663 enum
664 {
665   RM_0F01_REG_0 = 0,
666   RM_0F01_REG_1,
667   RM_0F01_REG_2,
668   RM_0F01_REG_3,
669   RM_0F01_REG_7,
670   RM_0FAE_REG_5,
671   RM_0FAE_REG_6,
672   RM_0FAE_REG_7
673 };
674
675 enum
676 {
677   PREFIX_90 = 0,
678   PREFIX_0F10,
679   PREFIX_0F11,
680   PREFIX_0F12,
681   PREFIX_0F16,
682   PREFIX_0F2A,
683   PREFIX_0F2B,
684   PREFIX_0F2C,
685   PREFIX_0F2D,
686   PREFIX_0F2E,
687   PREFIX_0F2F,
688   PREFIX_0F51,
689   PREFIX_0F52,
690   PREFIX_0F53,
691   PREFIX_0F58,
692   PREFIX_0F59,
693   PREFIX_0F5A,
694   PREFIX_0F5B,
695   PREFIX_0F5C,
696   PREFIX_0F5D,
697   PREFIX_0F5E,
698   PREFIX_0F5F,
699   PREFIX_0F60,
700   PREFIX_0F61,
701   PREFIX_0F62,
702   PREFIX_0F6C,
703   PREFIX_0F6D,
704   PREFIX_0F6F,
705   PREFIX_0F70,
706   PREFIX_0F73_REG_3,
707   PREFIX_0F73_REG_7,
708   PREFIX_0F78,
709   PREFIX_0F79,
710   PREFIX_0F7C,
711   PREFIX_0F7D,
712   PREFIX_0F7E,
713   PREFIX_0F7F,
714   PREFIX_0FB8,
715   PREFIX_0FBD,
716   PREFIX_0FC2,
717   PREFIX_0FC3,
718   PREFIX_0FC7_REG_6,
719   PREFIX_0FD0,
720   PREFIX_0FD6,
721   PREFIX_0FE6,
722   PREFIX_0FE7,
723   PREFIX_0FF0,
724   PREFIX_0FF7,
725   PREFIX_0F3810,
726   PREFIX_0F3814,
727   PREFIX_0F3815,
728   PREFIX_0F3817,
729   PREFIX_0F3820,
730   PREFIX_0F3821,
731   PREFIX_0F3822,
732   PREFIX_0F3823,
733   PREFIX_0F3824,
734   PREFIX_0F3825,
735   PREFIX_0F3828,
736   PREFIX_0F3829,
737   PREFIX_0F382A,
738   PREFIX_0F382B,
739   PREFIX_0F3830,
740   PREFIX_0F3831,
741   PREFIX_0F3832,
742   PREFIX_0F3833,
743   PREFIX_0F3834,
744   PREFIX_0F3835,
745   PREFIX_0F3837,
746   PREFIX_0F3838,
747   PREFIX_0F3839,
748   PREFIX_0F383A,
749   PREFIX_0F383B,
750   PREFIX_0F383C,
751   PREFIX_0F383D,
752   PREFIX_0F383E,
753   PREFIX_0F383F,
754   PREFIX_0F3840,
755   PREFIX_0F3841,
756   PREFIX_0F3880,
757   PREFIX_0F3881,
758   PREFIX_0F38DB,
759   PREFIX_0F38DC,
760   PREFIX_0F38DD,
761   PREFIX_0F38DE,
762   PREFIX_0F38DF,
763   PREFIX_0F38F0,
764   PREFIX_0F38F1,
765   PREFIX_0F3A08,
766   PREFIX_0F3A09,
767   PREFIX_0F3A0A,
768   PREFIX_0F3A0B,
769   PREFIX_0F3A0C,
770   PREFIX_0F3A0D,
771   PREFIX_0F3A0E,
772   PREFIX_0F3A14,
773   PREFIX_0F3A15,
774   PREFIX_0F3A16,
775   PREFIX_0F3A17,
776   PREFIX_0F3A20,
777   PREFIX_0F3A21,
778   PREFIX_0F3A22,
779   PREFIX_0F3A40,
780   PREFIX_0F3A41,
781   PREFIX_0F3A42,
782   PREFIX_0F3A44,
783   PREFIX_0F3A60,
784   PREFIX_0F3A61,
785   PREFIX_0F3A62,
786   PREFIX_0F3A63,
787   PREFIX_0F3ADF,
788   PREFIX_VEX_10,
789   PREFIX_VEX_11,
790   PREFIX_VEX_12,
791   PREFIX_VEX_16,
792   PREFIX_VEX_2A,
793   PREFIX_VEX_2C,
794   PREFIX_VEX_2D,
795   PREFIX_VEX_2E,
796   PREFIX_VEX_2F,
797   PREFIX_VEX_51,
798   PREFIX_VEX_52,
799   PREFIX_VEX_53,
800   PREFIX_VEX_58,
801   PREFIX_VEX_59,
802   PREFIX_VEX_5A,
803   PREFIX_VEX_5B,
804   PREFIX_VEX_5C,
805   PREFIX_VEX_5D,
806   PREFIX_VEX_5E,
807   PREFIX_VEX_5F,
808   PREFIX_VEX_60,
809   PREFIX_VEX_61,
810   PREFIX_VEX_62,
811   PREFIX_VEX_63,
812   PREFIX_VEX_64,
813   PREFIX_VEX_65,
814   PREFIX_VEX_66,
815   PREFIX_VEX_67,
816   PREFIX_VEX_68,
817   PREFIX_VEX_69,
818   PREFIX_VEX_6A,
819   PREFIX_VEX_6B,
820   PREFIX_VEX_6C,
821   PREFIX_VEX_6D,
822   PREFIX_VEX_6E,
823   PREFIX_VEX_6F,
824   PREFIX_VEX_70,
825   PREFIX_VEX_71_REG_2,
826   PREFIX_VEX_71_REG_4,
827   PREFIX_VEX_71_REG_6,
828   PREFIX_VEX_72_REG_2,
829   PREFIX_VEX_72_REG_4,
830   PREFIX_VEX_72_REG_6,
831   PREFIX_VEX_73_REG_2,
832   PREFIX_VEX_73_REG_3,
833   PREFIX_VEX_73_REG_6,
834   PREFIX_VEX_73_REG_7,
835   PREFIX_VEX_74,
836   PREFIX_VEX_75,
837   PREFIX_VEX_76,
838   PREFIX_VEX_77,
839   PREFIX_VEX_7C,
840   PREFIX_VEX_7D,
841   PREFIX_VEX_7E,
842   PREFIX_VEX_7F,
843   PREFIX_VEX_C2,
844   PREFIX_VEX_C4,
845   PREFIX_VEX_C5,
846   PREFIX_VEX_D0,
847   PREFIX_VEX_D1,
848   PREFIX_VEX_D2,
849   PREFIX_VEX_D3,
850   PREFIX_VEX_D4,
851   PREFIX_VEX_D5,
852   PREFIX_VEX_D6,
853   PREFIX_VEX_D7,
854   PREFIX_VEX_D8,
855   PREFIX_VEX_D9,
856   PREFIX_VEX_DA,
857   PREFIX_VEX_DB,
858   PREFIX_VEX_DC,
859   PREFIX_VEX_DD,
860   PREFIX_VEX_DE,
861   PREFIX_VEX_DF,
862   PREFIX_VEX_E0,
863   PREFIX_VEX_E1,
864   PREFIX_VEX_E2,
865   PREFIX_VEX_E3,
866   PREFIX_VEX_E4,
867   PREFIX_VEX_E5,
868   PREFIX_VEX_E6,
869   PREFIX_VEX_E7,
870   PREFIX_VEX_E8,
871   PREFIX_VEX_E9,
872   PREFIX_VEX_EA,
873   PREFIX_VEX_EB,
874   PREFIX_VEX_EC,
875   PREFIX_VEX_ED,
876   PREFIX_VEX_EE,
877   PREFIX_VEX_EF,
878   PREFIX_VEX_F0,
879   PREFIX_VEX_F1,
880   PREFIX_VEX_F2,
881   PREFIX_VEX_F3,
882   PREFIX_VEX_F4,
883   PREFIX_VEX_F5,
884   PREFIX_VEX_F6,
885   PREFIX_VEX_F7,
886   PREFIX_VEX_F8,
887   PREFIX_VEX_F9,
888   PREFIX_VEX_FA,
889   PREFIX_VEX_FB,
890   PREFIX_VEX_FC,
891   PREFIX_VEX_FD,
892   PREFIX_VEX_FE,
893   PREFIX_VEX_3800,
894   PREFIX_VEX_3801,
895   PREFIX_VEX_3802,
896   PREFIX_VEX_3803,
897   PREFIX_VEX_3804,
898   PREFIX_VEX_3805,
899   PREFIX_VEX_3806,
900   PREFIX_VEX_3807,
901   PREFIX_VEX_3808,
902   PREFIX_VEX_3809,
903   PREFIX_VEX_380A,
904   PREFIX_VEX_380B,
905   PREFIX_VEX_380C,
906   PREFIX_VEX_380D,
907   PREFIX_VEX_380E,
908   PREFIX_VEX_380F,
909   PREFIX_VEX_3817,
910   PREFIX_VEX_3818,
911   PREFIX_VEX_3819,
912   PREFIX_VEX_381A,
913   PREFIX_VEX_381C,
914   PREFIX_VEX_381D,
915   PREFIX_VEX_381E,
916   PREFIX_VEX_3820,
917   PREFIX_VEX_3821,
918   PREFIX_VEX_3822,
919   PREFIX_VEX_3823,
920   PREFIX_VEX_3824,
921   PREFIX_VEX_3825,
922   PREFIX_VEX_3828,
923   PREFIX_VEX_3829,
924   PREFIX_VEX_382A,
925   PREFIX_VEX_382B,
926   PREFIX_VEX_382C,
927   PREFIX_VEX_382D,
928   PREFIX_VEX_382E,
929   PREFIX_VEX_382F,
930   PREFIX_VEX_3830,
931   PREFIX_VEX_3831,
932   PREFIX_VEX_3832,
933   PREFIX_VEX_3833,
934   PREFIX_VEX_3834,
935   PREFIX_VEX_3835,
936   PREFIX_VEX_3837,
937   PREFIX_VEX_3838,
938   PREFIX_VEX_3839,
939   PREFIX_VEX_383A,
940   PREFIX_VEX_383B,
941   PREFIX_VEX_383C,
942   PREFIX_VEX_383D,
943   PREFIX_VEX_383E,
944   PREFIX_VEX_383F,
945   PREFIX_VEX_3840,
946   PREFIX_VEX_3841,
947   PREFIX_VEX_3896,
948   PREFIX_VEX_3897,
949   PREFIX_VEX_3898,
950   PREFIX_VEX_3899,
951   PREFIX_VEX_389A,
952   PREFIX_VEX_389B,
953   PREFIX_VEX_389C,
954   PREFIX_VEX_389D,
955   PREFIX_VEX_389E,
956   PREFIX_VEX_389F,
957   PREFIX_VEX_38A6,
958   PREFIX_VEX_38A7,
959   PREFIX_VEX_38A8,
960   PREFIX_VEX_38A9,
961   PREFIX_VEX_38AA,
962   PREFIX_VEX_38AB,
963   PREFIX_VEX_38AC,
964   PREFIX_VEX_38AD,
965   PREFIX_VEX_38AE,
966   PREFIX_VEX_38AF,
967   PREFIX_VEX_38B6,
968   PREFIX_VEX_38B7,
969   PREFIX_VEX_38B8,
970   PREFIX_VEX_38B9,
971   PREFIX_VEX_38BA,
972   PREFIX_VEX_38BB,
973   PREFIX_VEX_38BC,
974   PREFIX_VEX_38BD,
975   PREFIX_VEX_38BE,
976   PREFIX_VEX_38BF,
977   PREFIX_VEX_38DB,
978   PREFIX_VEX_38DC,
979   PREFIX_VEX_38DD,
980   PREFIX_VEX_38DE,
981   PREFIX_VEX_38DF,
982   PREFIX_VEX_3A04,
983   PREFIX_VEX_3A05,
984   PREFIX_VEX_3A06,
985   PREFIX_VEX_3A08,
986   PREFIX_VEX_3A09,
987   PREFIX_VEX_3A0A,
988   PREFIX_VEX_3A0B,
989   PREFIX_VEX_3A0C,
990   PREFIX_VEX_3A0D,
991   PREFIX_VEX_3A0E,
992   PREFIX_VEX_3A0F,
993   PREFIX_VEX_3A14,
994   PREFIX_VEX_3A15,
995   PREFIX_VEX_3A16,
996   PREFIX_VEX_3A17,
997   PREFIX_VEX_3A18,
998   PREFIX_VEX_3A19,
999   PREFIX_VEX_3A20,
1000   PREFIX_VEX_3A21,
1001   PREFIX_VEX_3A22,
1002   PREFIX_VEX_3A40,
1003   PREFIX_VEX_3A41,
1004   PREFIX_VEX_3A42,
1005   PREFIX_VEX_3A44,
1006   PREFIX_VEX_3A4A,
1007   PREFIX_VEX_3A4B,
1008   PREFIX_VEX_3A4C,
1009   PREFIX_VEX_3A5C,
1010   PREFIX_VEX_3A5D,
1011   PREFIX_VEX_3A5E,
1012   PREFIX_VEX_3A5F,
1013   PREFIX_VEX_3A60,
1014   PREFIX_VEX_3A61,
1015   PREFIX_VEX_3A62,
1016   PREFIX_VEX_3A63,
1017   PREFIX_VEX_3A68,
1018   PREFIX_VEX_3A69,
1019   PREFIX_VEX_3A6A,
1020   PREFIX_VEX_3A6B,
1021   PREFIX_VEX_3A6C,
1022   PREFIX_VEX_3A6D,
1023   PREFIX_VEX_3A6E,
1024   PREFIX_VEX_3A6F,
1025   PREFIX_VEX_3A78,
1026   PREFIX_VEX_3A79,
1027   PREFIX_VEX_3A7A,
1028   PREFIX_VEX_3A7B,
1029   PREFIX_VEX_3A7C,
1030   PREFIX_VEX_3A7D,
1031   PREFIX_VEX_3A7E,
1032   PREFIX_VEX_3A7F,
1033   PREFIX_VEX_3ADF
1034 };
1035
1036 enum
1037 {
1038   X86_64_06 = 0,
1039   X86_64_07,
1040   X86_64_0D,
1041   X86_64_16,
1042   X86_64_17,
1043   X86_64_1E,
1044   X86_64_1F,
1045   X86_64_27,
1046   X86_64_2F,
1047   X86_64_37,
1048   X86_64_3F,
1049   X86_64_60,
1050   X86_64_61,
1051   X86_64_62,
1052   X86_64_63,
1053   X86_64_6D,
1054   X86_64_6F,
1055   X86_64_9A,
1056   X86_64_C4,
1057   X86_64_C5,
1058   X86_64_CE,
1059   X86_64_D4,
1060   X86_64_D5,
1061   X86_64_EA,
1062   X86_64_0F01_REG_0,
1063   X86_64_0F01_REG_1,
1064   X86_64_0F01_REG_2,
1065   X86_64_0F01_REG_3
1066 };
1067
1068 enum
1069 {
1070   THREE_BYTE_0F38 = 0,
1071   THREE_BYTE_0F3A,
1072   THREE_BYTE_0F7A
1073 };
1074
1075 enum
1076 {
1077   XOP_09 = 0,
1078   XOP_0A
1079 };
1080
1081 enum
1082 {
1083   VEX_0F = 0,
1084   VEX_0F38,
1085   VEX_0F3A
1086 };
1087
1088 enum
1089 {
1090   VEX_LEN_10_P_1 = 0,
1091   VEX_LEN_10_P_3,
1092   VEX_LEN_11_P_1,
1093   VEX_LEN_11_P_3,
1094   VEX_LEN_12_P_0_M_0,
1095   VEX_LEN_12_P_0_M_1,
1096   VEX_LEN_12_P_2,
1097   VEX_LEN_13_M_0,
1098   VEX_LEN_16_P_0_M_0,
1099   VEX_LEN_16_P_0_M_1,
1100   VEX_LEN_16_P_2,
1101   VEX_LEN_17_M_0,
1102   VEX_LEN_2A_P_1,
1103   VEX_LEN_2A_P_3,
1104   VEX_LEN_2C_P_1,
1105   VEX_LEN_2C_P_3,
1106   VEX_LEN_2D_P_1,
1107   VEX_LEN_2D_P_3,
1108   VEX_LEN_2E_P_0,
1109   VEX_LEN_2E_P_2,
1110   VEX_LEN_2F_P_0,
1111   VEX_LEN_2F_P_2,
1112   VEX_LEN_51_P_1,
1113   VEX_LEN_51_P_3,
1114   VEX_LEN_52_P_1,
1115   VEX_LEN_53_P_1,
1116   VEX_LEN_58_P_1,
1117   VEX_LEN_58_P_3,
1118   VEX_LEN_59_P_1,
1119   VEX_LEN_59_P_3,
1120   VEX_LEN_5A_P_1,
1121   VEX_LEN_5A_P_3,
1122   VEX_LEN_5C_P_1,
1123   VEX_LEN_5C_P_3,
1124   VEX_LEN_5D_P_1,
1125   VEX_LEN_5D_P_3,
1126   VEX_LEN_5E_P_1,
1127   VEX_LEN_5E_P_3,
1128   VEX_LEN_5F_P_1,
1129   VEX_LEN_5F_P_3,
1130   VEX_LEN_60_P_2,
1131   VEX_LEN_61_P_2,
1132   VEX_LEN_62_P_2,
1133   VEX_LEN_63_P_2,
1134   VEX_LEN_64_P_2,
1135   VEX_LEN_65_P_2,
1136   VEX_LEN_66_P_2,
1137   VEX_LEN_67_P_2,
1138   VEX_LEN_68_P_2,
1139   VEX_LEN_69_P_2,
1140   VEX_LEN_6A_P_2,
1141   VEX_LEN_6B_P_2,
1142   VEX_LEN_6C_P_2,
1143   VEX_LEN_6D_P_2,
1144   VEX_LEN_6E_P_2,
1145   VEX_LEN_70_P_1,
1146   VEX_LEN_70_P_2,
1147   VEX_LEN_70_P_3,
1148   VEX_LEN_71_R_2_P_2,
1149   VEX_LEN_71_R_4_P_2,
1150   VEX_LEN_71_R_6_P_2,
1151   VEX_LEN_72_R_2_P_2,
1152   VEX_LEN_72_R_4_P_2,
1153   VEX_LEN_72_R_6_P_2,
1154   VEX_LEN_73_R_2_P_2,
1155   VEX_LEN_73_R_3_P_2,
1156   VEX_LEN_73_R_6_P_2,
1157   VEX_LEN_73_R_7_P_2,
1158   VEX_LEN_74_P_2,
1159   VEX_LEN_75_P_2,
1160   VEX_LEN_76_P_2,
1161   VEX_LEN_7E_P_1,
1162   VEX_LEN_7E_P_2,
1163   VEX_LEN_AE_R_2_M_0,
1164   VEX_LEN_AE_R_3_M_0,
1165   VEX_LEN_C2_P_1,
1166   VEX_LEN_C2_P_3,
1167   VEX_LEN_C4_P_2,
1168   VEX_LEN_C5_P_2,
1169   VEX_LEN_D1_P_2,
1170   VEX_LEN_D2_P_2,
1171   VEX_LEN_D3_P_2,
1172   VEX_LEN_D4_P_2,
1173   VEX_LEN_D5_P_2,
1174   VEX_LEN_D6_P_2,
1175   VEX_LEN_D7_P_2_M_1,
1176   VEX_LEN_D8_P_2,
1177   VEX_LEN_D9_P_2,
1178   VEX_LEN_DA_P_2,
1179   VEX_LEN_DB_P_2,
1180   VEX_LEN_DC_P_2,
1181   VEX_LEN_DD_P_2,
1182   VEX_LEN_DE_P_2,
1183   VEX_LEN_DF_P_2,
1184   VEX_LEN_E0_P_2,
1185   VEX_LEN_E1_P_2,
1186   VEX_LEN_E2_P_2,
1187   VEX_LEN_E3_P_2,
1188   VEX_LEN_E4_P_2,
1189   VEX_LEN_E5_P_2,
1190   VEX_LEN_E8_P_2,
1191   VEX_LEN_E9_P_2,
1192   VEX_LEN_EA_P_2,
1193   VEX_LEN_EB_P_2,
1194   VEX_LEN_EC_P_2,
1195   VEX_LEN_ED_P_2,
1196   VEX_LEN_EE_P_2,
1197   VEX_LEN_EF_P_2,
1198   VEX_LEN_F1_P_2,
1199   VEX_LEN_F2_P_2,
1200   VEX_LEN_F3_P_2,
1201   VEX_LEN_F4_P_2,
1202   VEX_LEN_F5_P_2,
1203   VEX_LEN_F6_P_2,
1204   VEX_LEN_F7_P_2,
1205   VEX_LEN_F8_P_2,
1206   VEX_LEN_F9_P_2,
1207   VEX_LEN_FA_P_2,
1208   VEX_LEN_FB_P_2,
1209   VEX_LEN_FC_P_2,
1210   VEX_LEN_FD_P_2,
1211   VEX_LEN_FE_P_2,
1212   VEX_LEN_3800_P_2,
1213   VEX_LEN_3801_P_2,
1214   VEX_LEN_3802_P_2,
1215   VEX_LEN_3803_P_2,
1216   VEX_LEN_3804_P_2,
1217   VEX_LEN_3805_P_2,
1218   VEX_LEN_3806_P_2,
1219   VEX_LEN_3807_P_2,
1220   VEX_LEN_3808_P_2,
1221   VEX_LEN_3809_P_2,
1222   VEX_LEN_380A_P_2,
1223   VEX_LEN_380B_P_2,
1224   VEX_LEN_3819_P_2_M_0,
1225   VEX_LEN_381A_P_2_M_0,
1226   VEX_LEN_381C_P_2,
1227   VEX_LEN_381D_P_2,
1228   VEX_LEN_381E_P_2,
1229   VEX_LEN_3820_P_2,
1230   VEX_LEN_3821_P_2,
1231   VEX_LEN_3822_P_2,
1232   VEX_LEN_3823_P_2,
1233   VEX_LEN_3824_P_2,
1234   VEX_LEN_3825_P_2,
1235   VEX_LEN_3828_P_2,
1236   VEX_LEN_3829_P_2,
1237   VEX_LEN_382A_P_2_M_0,
1238   VEX_LEN_382B_P_2,
1239   VEX_LEN_3830_P_2,
1240   VEX_LEN_3831_P_2,
1241   VEX_LEN_3832_P_2,
1242   VEX_LEN_3833_P_2,
1243   VEX_LEN_3834_P_2,
1244   VEX_LEN_3835_P_2,
1245   VEX_LEN_3837_P_2,
1246   VEX_LEN_3838_P_2,
1247   VEX_LEN_3839_P_2,
1248   VEX_LEN_383A_P_2,
1249   VEX_LEN_383B_P_2,
1250   VEX_LEN_383C_P_2,
1251   VEX_LEN_383D_P_2,
1252   VEX_LEN_383E_P_2,
1253   VEX_LEN_383F_P_2,
1254   VEX_LEN_3840_P_2,
1255   VEX_LEN_3841_P_2,
1256   VEX_LEN_38DB_P_2,
1257   VEX_LEN_38DC_P_2,
1258   VEX_LEN_38DD_P_2,
1259   VEX_LEN_38DE_P_2,
1260   VEX_LEN_38DF_P_2,
1261   VEX_LEN_3A06_P_2,
1262   VEX_LEN_3A0A_P_2,
1263   VEX_LEN_3A0B_P_2,
1264   VEX_LEN_3A0E_P_2,
1265   VEX_LEN_3A0F_P_2,
1266   VEX_LEN_3A14_P_2,
1267   VEX_LEN_3A15_P_2,
1268   VEX_LEN_3A16_P_2,
1269   VEX_LEN_3A17_P_2,
1270   VEX_LEN_3A18_P_2,
1271   VEX_LEN_3A19_P_2,
1272   VEX_LEN_3A20_P_2,
1273   VEX_LEN_3A21_P_2,
1274   VEX_LEN_3A22_P_2,
1275   VEX_LEN_3A41_P_2,
1276   VEX_LEN_3A42_P_2,
1277   VEX_LEN_3A44_P_2,
1278   VEX_LEN_3A4C_P_2,
1279   VEX_LEN_3A60_P_2,
1280   VEX_LEN_3A61_P_2,
1281   VEX_LEN_3A62_P_2,
1282   VEX_LEN_3A63_P_2,
1283   VEX_LEN_3A6A_P_2,
1284   VEX_LEN_3A6B_P_2,
1285   VEX_LEN_3A6E_P_2,
1286   VEX_LEN_3A6F_P_2,
1287   VEX_LEN_3A7A_P_2,
1288   VEX_LEN_3A7B_P_2,
1289   VEX_LEN_3A7E_P_2,
1290   VEX_LEN_3A7F_P_2,
1291   VEX_LEN_3ADF_P_2
1292 };
1293
1294 typedef void (*op_rtn) (int bytemode, int sizeflag);
1295
1296 struct dis386 {
1297   const char *name;
1298   struct
1299     {
1300       op_rtn rtn;
1301       int bytemode;
1302     } op[MAX_OPERANDS];
1303 };
1304
1305 /* Upper case letters in the instruction names here are macros.
1306    'A' => print 'b' if no register operands or suffix_always is true
1307    'B' => print 'b' if suffix_always is true
1308    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1309           size prefix
1310    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1311           suffix_always is true
1312    'E' => print 'e' if 32-bit form of jcxz
1313    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1314    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1315    'H' => print ",pt" or ",pn" branch hint
1316    'I' => honor following macro letter even in Intel mode (implemented only
1317           for some of the macro letters)
1318    'J' => print 'l'
1319    'K' => print 'd' or 'q' if rex prefix is present.
1320    'L' => print 'l' if suffix_always is true
1321    'M' => print 'r' if intel_mnemonic is false.
1322    'N' => print 'n' if instruction has no wait "prefix"
1323    'O' => print 'd' or 'o' (or 'q' in Intel mode)
1324    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1325           or suffix_always is true.  print 'q' if rex prefix is present.
1326    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1327           is true
1328    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1329    'S' => print 'w', 'l' or 'q' if suffix_always is true
1330    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1331    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1332    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1333    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1334    'X' => print 's', 'd' depending on data16 prefix (for XMM)
1335    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1336           suffix_always is true.
1337    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1338    '!' => change condition from true to false or from false to true.
1339    '%' => add 1 upper case letter to the macro.
1340
1341    2 upper case letter macros:
1342    "XY" => print 'x' or 'y' if no register operands or suffix_always
1343            is true.
1344    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1345    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1346            or suffix_always is true
1347    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1348    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1349    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1350
1351    Many of the above letters print nothing in Intel mode.  See "putop"
1352    for the details.
1353
1354    Braces '{' and '}', and vertical bars '|', indicate alternative
1355    mnemonic strings for AT&T and Intel.  */
1356
1357 static const struct dis386 dis386[] = {
1358   /* 00 */
1359   { "addB",             { Eb, Gb } },
1360   { "addS",             { Ev, Gv } },
1361   { "addB",             { Gb, EbS } },
1362   { "addS",             { Gv, EvS } },
1363   { "addB",             { AL, Ib } },
1364   { "addS",             { eAX, Iv } },
1365   { X86_64_TABLE (X86_64_06) },
1366   { X86_64_TABLE (X86_64_07) },
1367   /* 08 */
1368   { "orB",              { Eb, Gb } },
1369   { "orS",              { Ev, Gv } },
1370   { "orB",              { Gb, EbS } },
1371   { "orS",              { Gv, EvS } },
1372   { "orB",              { AL, Ib } },
1373   { "orS",              { eAX, Iv } },
1374   { X86_64_TABLE (X86_64_0D) },
1375   { "(bad)",            { XX } },       /* 0x0f extended opcode escape */
1376   /* 10 */
1377   { "adcB",             { Eb, Gb } },
1378   { "adcS",             { Ev, Gv } },
1379   { "adcB",             { Gb, EbS } },
1380   { "adcS",             { Gv, EvS } },
1381   { "adcB",             { AL, Ib } },
1382   { "adcS",             { eAX, Iv } },
1383   { X86_64_TABLE (X86_64_16) },
1384   { X86_64_TABLE (X86_64_17) },
1385   /* 18 */
1386   { "sbbB",             { Eb, Gb } },
1387   { "sbbS",             { Ev, Gv } },
1388   { "sbbB",             { Gb, EbS } },
1389   { "sbbS",             { Gv, EvS } },
1390   { "sbbB",             { AL, Ib } },
1391   { "sbbS",             { eAX, Iv } },
1392   { X86_64_TABLE (X86_64_1E) },
1393   { X86_64_TABLE (X86_64_1F) },
1394   /* 20 */
1395   { "andB",             { Eb, Gb } },
1396   { "andS",             { Ev, Gv } },
1397   { "andB",             { Gb, EbS } },
1398   { "andS",             { Gv, EvS } },
1399   { "andB",             { AL, Ib } },
1400   { "andS",             { eAX, Iv } },
1401   { "(bad)",            { XX } },       /* SEG ES prefix */
1402   { X86_64_TABLE (X86_64_27) },
1403   /* 28 */
1404   { "subB",             { Eb, Gb } },
1405   { "subS",             { Ev, Gv } },
1406   { "subB",             { Gb, EbS } },
1407   { "subS",             { Gv, EvS } },
1408   { "subB",             { AL, Ib } },
1409   { "subS",             { eAX, Iv } },
1410   { "(bad)",            { XX } },       /* SEG CS prefix */
1411   { X86_64_TABLE (X86_64_2F) },
1412   /* 30 */
1413   { "xorB",             { Eb, Gb } },
1414   { "xorS",             { Ev, Gv } },
1415   { "xorB",             { Gb, EbS } },
1416   { "xorS",             { Gv, EvS } },
1417   { "xorB",             { AL, Ib } },
1418   { "xorS",             { eAX, Iv } },
1419   { "(bad)",            { XX } },       /* SEG SS prefix */
1420   { X86_64_TABLE (X86_64_37) },
1421   /* 38 */
1422   { "cmpB",             { Eb, Gb } },
1423   { "cmpS",             { Ev, Gv } },
1424   { "cmpB",             { Gb, EbS } },
1425   { "cmpS",             { Gv, EvS } },
1426   { "cmpB",             { AL, Ib } },
1427   { "cmpS",             { eAX, Iv } },
1428   { "(bad)",            { XX } },       /* SEG DS prefix */
1429   { X86_64_TABLE (X86_64_3F) },
1430   /* 40 */
1431   { "inc{S|}",          { RMeAX } },
1432   { "inc{S|}",          { RMeCX } },
1433   { "inc{S|}",          { RMeDX } },
1434   { "inc{S|}",          { RMeBX } },
1435   { "inc{S|}",          { RMeSP } },
1436   { "inc{S|}",          { RMeBP } },
1437   { "inc{S|}",          { RMeSI } },
1438   { "inc{S|}",          { RMeDI } },
1439   /* 48 */
1440   { "dec{S|}",          { RMeAX } },
1441   { "dec{S|}",          { RMeCX } },
1442   { "dec{S|}",          { RMeDX } },
1443   { "dec{S|}",          { RMeBX } },
1444   { "dec{S|}",          { RMeSP } },
1445   { "dec{S|}",          { RMeBP } },
1446   { "dec{S|}",          { RMeSI } },
1447   { "dec{S|}",          { RMeDI } },
1448   /* 50 */
1449   { "pushV",            { RMrAX } },
1450   { "pushV",            { RMrCX } },
1451   { "pushV",            { RMrDX } },
1452   { "pushV",            { RMrBX } },
1453   { "pushV",            { RMrSP } },
1454   { "pushV",            { RMrBP } },
1455   { "pushV",            { RMrSI } },
1456   { "pushV",            { RMrDI } },
1457   /* 58 */
1458   { "popV",             { RMrAX } },
1459   { "popV",             { RMrCX } },
1460   { "popV",             { RMrDX } },
1461   { "popV",             { RMrBX } },
1462   { "popV",             { RMrSP } },
1463   { "popV",             { RMrBP } },
1464   { "popV",             { RMrSI } },
1465   { "popV",             { RMrDI } },
1466   /* 60 */
1467   { X86_64_TABLE (X86_64_60) },
1468   { X86_64_TABLE (X86_64_61) },
1469   { X86_64_TABLE (X86_64_62) },
1470   { X86_64_TABLE (X86_64_63) },
1471   { "(bad)",            { XX } },       /* seg fs */
1472   { "(bad)",            { XX } },       /* seg gs */
1473   { "(bad)",            { XX } },       /* op size prefix */
1474   { "(bad)",            { XX } },       /* adr size prefix */
1475   /* 68 */
1476   { "pushT",            { Iq } },
1477   { "imulS",            { Gv, Ev, Iv } },
1478   { "pushT",            { sIb } },
1479   { "imulS",            { Gv, Ev, sIb } },
1480   { "ins{b|}",          { Ybr, indirDX } },
1481   { X86_64_TABLE (X86_64_6D) },
1482   { "outs{b|}",         { indirDXr, Xb } },
1483   { X86_64_TABLE (X86_64_6F) },
1484   /* 70 */
1485   { "joH",              { Jb, XX, cond_jump_flag } },
1486   { "jnoH",             { Jb, XX, cond_jump_flag } },
1487   { "jbH",              { Jb, XX, cond_jump_flag } },
1488   { "jaeH",             { Jb, XX, cond_jump_flag } },
1489   { "jeH",              { Jb, XX, cond_jump_flag } },
1490   { "jneH",             { Jb, XX, cond_jump_flag } },
1491   { "jbeH",             { Jb, XX, cond_jump_flag } },
1492   { "jaH",              { Jb, XX, cond_jump_flag } },
1493   /* 78 */
1494   { "jsH",              { Jb, XX, cond_jump_flag } },
1495   { "jnsH",             { Jb, XX, cond_jump_flag } },
1496   { "jpH",              { Jb, XX, cond_jump_flag } },
1497   { "jnpH",             { Jb, XX, cond_jump_flag } },
1498   { "jlH",              { Jb, XX, cond_jump_flag } },
1499   { "jgeH",             { Jb, XX, cond_jump_flag } },
1500   { "jleH",             { Jb, XX, cond_jump_flag } },
1501   { "jgH",              { Jb, XX, cond_jump_flag } },
1502   /* 80 */
1503   { REG_TABLE (REG_80) },
1504   { REG_TABLE (REG_81) },
1505   { "(bad)",            { XX } },
1506   { REG_TABLE (REG_82) },
1507   { "testB",            { Eb, Gb } },
1508   { "testS",            { Ev, Gv } },
1509   { "xchgB",            { Eb, Gb } },
1510   { "xchgS",            { Ev, Gv } },
1511   /* 88 */
1512   { "movB",             { Eb, Gb } },
1513   { "movS",             { Ev, Gv } },
1514   { "movB",             { Gb, EbS } },
1515   { "movS",             { Gv, EvS } },
1516   { "movD",             { Sv, Sw } },
1517   { MOD_TABLE (MOD_8D) },
1518   { "movD",             { Sw, Sv } },
1519   { REG_TABLE (REG_8F) },
1520   /* 90 */
1521   { PREFIX_TABLE (PREFIX_90) },
1522   { "xchgS",            { RMeCX, eAX } },
1523   { "xchgS",            { RMeDX, eAX } },
1524   { "xchgS",            { RMeBX, eAX } },
1525   { "xchgS",            { RMeSP, eAX } },
1526   { "xchgS",            { RMeBP, eAX } },
1527   { "xchgS",            { RMeSI, eAX } },
1528   { "xchgS",            { RMeDI, eAX } },
1529   /* 98 */
1530   { "cW{t|}R",          { XX } },
1531   { "cR{t|}O",          { XX } },
1532   { X86_64_TABLE (X86_64_9A) },
1533   { "(bad)",            { XX } },       /* fwait */
1534   { "pushfT",           { XX } },
1535   { "popfT",            { XX } },
1536   { "sahf",             { XX } },
1537   { "lahf",             { XX } },
1538   /* a0 */
1539   { "mov%LB",           { AL, Ob } },
1540   { "mov%LS",           { eAX, Ov } },
1541   { "mov%LB",           { Ob, AL } },
1542   { "mov%LS",           { Ov, eAX } },
1543   { "movs{b|}",         { Ybr, Xb } },
1544   { "movs{R|}",         { Yvr, Xv } },
1545   { "cmps{b|}",         { Xb, Yb } },
1546   { "cmps{R|}",         { Xv, Yv } },
1547   /* a8 */
1548   { "testB",            { AL, Ib } },
1549   { "testS",            { eAX, Iv } },
1550   { "stosB",            { Ybr, AL } },
1551   { "stosS",            { Yvr, eAX } },
1552   { "lodsB",            { ALr, Xb } },
1553   { "lodsS",            { eAXr, Xv } },
1554   { "scasB",            { AL, Yb } },
1555   { "scasS",            { eAX, Yv } },
1556   /* b0 */
1557   { "movB",             { RMAL, Ib } },
1558   { "movB",             { RMCL, Ib } },
1559   { "movB",             { RMDL, Ib } },
1560   { "movB",             { RMBL, Ib } },
1561   { "movB",             { RMAH, Ib } },
1562   { "movB",             { RMCH, Ib } },
1563   { "movB",             { RMDH, Ib } },
1564   { "movB",             { RMBH, Ib } },
1565   /* b8 */
1566   { "mov%LV",           { RMeAX, Iv64 } },
1567   { "mov%LV",           { RMeCX, Iv64 } },
1568   { "mov%LV",           { RMeDX, Iv64 } },
1569   { "mov%LV",           { RMeBX, Iv64 } },
1570   { "mov%LV",           { RMeSP, Iv64 } },
1571   { "mov%LV",           { RMeBP, Iv64 } },
1572   { "mov%LV",           { RMeSI, Iv64 } },
1573   { "mov%LV",           { RMeDI, Iv64 } },
1574   /* c0 */
1575   { REG_TABLE (REG_C0) },
1576   { REG_TABLE (REG_C1) },
1577   { "retT",             { Iw } },
1578   { "retT",             { XX } },
1579   { X86_64_TABLE (X86_64_C4) },
1580   { X86_64_TABLE (X86_64_C5) },
1581   { REG_TABLE (REG_C6) },
1582   { REG_TABLE (REG_C7) },
1583   /* c8 */
1584   { "enterT",           { Iw, Ib } },
1585   { "leaveT",           { XX } },
1586   { "Jret{|f}P",        { Iw } },
1587   { "Jret{|f}P",        { XX } },
1588   { "int3",             { XX } },
1589   { "int",              { Ib } },
1590   { X86_64_TABLE (X86_64_CE) },
1591   { "iretP",            { XX } },
1592   /* d0 */
1593   { REG_TABLE (REG_D0) },
1594   { REG_TABLE (REG_D1) },
1595   { REG_TABLE (REG_D2) },
1596   { REG_TABLE (REG_D3) },
1597   { X86_64_TABLE (X86_64_D4) },
1598   { X86_64_TABLE (X86_64_D5) },
1599   { "(bad)",            { XX } },
1600   { "xlat",             { DSBX } },
1601   /* d8 */
1602   { FLOAT },
1603   { FLOAT },
1604   { FLOAT },
1605   { FLOAT },
1606   { FLOAT },
1607   { FLOAT },
1608   { FLOAT },
1609   { FLOAT },
1610   /* e0 */
1611   { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1612   { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1613   { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1614   { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1615   { "inB",              { AL, Ib } },
1616   { "inG",              { zAX, Ib } },
1617   { "outB",             { Ib, AL } },
1618   { "outG",             { Ib, zAX } },
1619   /* e8 */
1620   { "callT",            { Jv } },
1621   { "jmpT",             { Jv } },
1622   { X86_64_TABLE (X86_64_EA) },
1623   { "jmp",              { Jb } },
1624   { "inB",              { AL, indirDX } },
1625   { "inG",              { zAX, indirDX } },
1626   { "outB",             { indirDX, AL } },
1627   { "outG",             { indirDX, zAX } },
1628   /* f0 */
1629   { "(bad)",            { XX } },       /* lock prefix */
1630   { "icebp",            { XX } },
1631   { "(bad)",            { XX } },       /* repne */
1632   { "(bad)",            { XX } },       /* repz */
1633   { "hlt",              { XX } },
1634   { "cmc",              { XX } },
1635   { REG_TABLE (REG_F6) },
1636   { REG_TABLE (REG_F7) },
1637   /* f8 */
1638   { "clc",              { XX } },
1639   { "stc",              { XX } },
1640   { "cli",              { XX } },
1641   { "sti",              { XX } },
1642   { "cld",              { XX } },
1643   { "std",              { XX } },
1644   { REG_TABLE (REG_FE) },
1645   { REG_TABLE (REG_FF) },
1646 };
1647
1648 static const struct dis386 dis386_twobyte[] = {
1649   /* 00 */
1650   { REG_TABLE (REG_0F00 ) },
1651   { REG_TABLE (REG_0F01 ) },
1652   { "larS",             { Gv, Ew } },
1653   { "lslS",             { Gv, Ew } },
1654   { "(bad)",            { XX } },
1655   { "syscall",          { XX } },
1656   { "clts",             { XX } },
1657   { "sysretP",          { XX } },
1658   /* 08 */
1659   { "invd",             { XX } },
1660   { "wbinvd",           { XX } },
1661   { "(bad)",            { XX } },
1662   { "ud2a",             { XX } },
1663   { "(bad)",            { XX } },
1664   { REG_TABLE (REG_0F0D) },
1665   { "femms",            { XX } },
1666   { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1667   /* 10 */
1668   { PREFIX_TABLE (PREFIX_0F10) },
1669   { PREFIX_TABLE (PREFIX_0F11) },
1670   { PREFIX_TABLE (PREFIX_0F12) },
1671   { MOD_TABLE (MOD_0F13) },
1672   { "unpcklpX",         { XM, EXx } },
1673   { "unpckhpX",         { XM, EXx } },
1674   { PREFIX_TABLE (PREFIX_0F16) },
1675   { MOD_TABLE (MOD_0F17) },
1676   /* 18 */
1677   { REG_TABLE (REG_0F18) },
1678   { "nopQ",             { Ev } },
1679   { "nopQ",             { Ev } },
1680   { "nopQ",             { Ev } },
1681   { "nopQ",             { Ev } },
1682   { "nopQ",             { Ev } },
1683   { "nopQ",             { Ev } },
1684   { "nopQ",             { Ev } },
1685   /* 20 */
1686   { MOD_TABLE (MOD_0F20) },
1687   { MOD_TABLE (MOD_0F21) },
1688   { MOD_TABLE (MOD_0F22) },
1689   { MOD_TABLE (MOD_0F23) },
1690   { MOD_TABLE (MOD_0F24) },
1691   { "(bad)",            { XX } },
1692   { MOD_TABLE (MOD_0F26) },
1693   { "(bad)",            { XX } },
1694   /* 28 */
1695   { "movapX",           { XM, EXx } },
1696   { "movapX",           { EXxS, XM } },
1697   { PREFIX_TABLE (PREFIX_0F2A) },
1698   { PREFIX_TABLE (PREFIX_0F2B) },
1699   { PREFIX_TABLE (PREFIX_0F2C) },
1700   { PREFIX_TABLE (PREFIX_0F2D) },
1701   { PREFIX_TABLE (PREFIX_0F2E) },
1702   { PREFIX_TABLE (PREFIX_0F2F) },
1703   /* 30 */
1704   { "wrmsr",            { XX } },
1705   { "rdtsc",            { XX } },
1706   { "rdmsr",            { XX } },
1707   { "rdpmc",            { XX } },
1708   { "sysenter",         { XX } },
1709   { "sysexit",          { XX } },
1710   { "(bad)",            { XX } },
1711   { "getsec",           { XX } },
1712   /* 38 */
1713   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1714   { "(bad)",            { XX } },
1715   { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1716   { "(bad)",            { XX } },
1717   { "(bad)",            { XX } },
1718   { "(bad)",            { XX } },
1719   { "(bad)",            { XX } },
1720   { "(bad)",            { XX } },
1721   /* 40 */
1722   { "cmovoS",           { Gv, Ev } },
1723   { "cmovnoS",          { Gv, Ev } },
1724   { "cmovbS",           { Gv, Ev } },
1725   { "cmovaeS",          { Gv, Ev } },
1726   { "cmoveS",           { Gv, Ev } },
1727   { "cmovneS",          { Gv, Ev } },
1728   { "cmovbeS",          { Gv, Ev } },
1729   { "cmovaS",           { Gv, Ev } },
1730   /* 48 */
1731   { "cmovsS",           { Gv, Ev } },
1732   { "cmovnsS",          { Gv, Ev } },
1733   { "cmovpS",           { Gv, Ev } },
1734   { "cmovnpS",          { Gv, Ev } },
1735   { "cmovlS",           { Gv, Ev } },
1736   { "cmovgeS",          { Gv, Ev } },
1737   { "cmovleS",          { Gv, Ev } },
1738   { "cmovgS",           { Gv, Ev } },
1739   /* 50 */
1740   { MOD_TABLE (MOD_0F51) },
1741   { PREFIX_TABLE (PREFIX_0F51) },
1742   { PREFIX_TABLE (PREFIX_0F52) },
1743   { PREFIX_TABLE (PREFIX_0F53) },
1744   { "andpX",            { XM, EXx } },
1745   { "andnpX",           { XM, EXx } },
1746   { "orpX",             { XM, EXx } },
1747   { "xorpX",            { XM, EXx } },
1748   /* 58 */
1749   { PREFIX_TABLE (PREFIX_0F58) },
1750   { PREFIX_TABLE (PREFIX_0F59) },
1751   { PREFIX_TABLE (PREFIX_0F5A) },
1752   { PREFIX_TABLE (PREFIX_0F5B) },
1753   { PREFIX_TABLE (PREFIX_0F5C) },
1754   { PREFIX_TABLE (PREFIX_0F5D) },
1755   { PREFIX_TABLE (PREFIX_0F5E) },
1756   { PREFIX_TABLE (PREFIX_0F5F) },
1757   /* 60 */
1758   { PREFIX_TABLE (PREFIX_0F60) },
1759   { PREFIX_TABLE (PREFIX_0F61) },
1760   { PREFIX_TABLE (PREFIX_0F62) },
1761   { "packsswb",         { MX, EM } },
1762   { "pcmpgtb",          { MX, EM } },
1763   { "pcmpgtw",          { MX, EM } },
1764   { "pcmpgtd",          { MX, EM } },
1765   { "packuswb",         { MX, EM } },
1766   /* 68 */
1767   { "punpckhbw",        { MX, EM } },
1768   { "punpckhwd",        { MX, EM } },
1769   { "punpckhdq",        { MX, EM } },
1770   { "packssdw",         { MX, EM } },
1771   { PREFIX_TABLE (PREFIX_0F6C) },
1772   { PREFIX_TABLE (PREFIX_0F6D) },
1773   { "movK",             { MX, Edq } },
1774   { PREFIX_TABLE (PREFIX_0F6F) },
1775   /* 70 */
1776   { PREFIX_TABLE (PREFIX_0F70) },
1777   { REG_TABLE (REG_0F71) },
1778   { REG_TABLE (REG_0F72) },
1779   { REG_TABLE (REG_0F73) },
1780   { "pcmpeqb",          { MX, EM } },
1781   { "pcmpeqw",          { MX, EM } },
1782   { "pcmpeqd",          { MX, EM } },
1783   { "emms",             { XX } },
1784   /* 78 */
1785   { PREFIX_TABLE (PREFIX_0F78) },
1786   { PREFIX_TABLE (PREFIX_0F79) },
1787   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1788   { "(bad)",            { XX } },
1789   { PREFIX_TABLE (PREFIX_0F7C) },
1790   { PREFIX_TABLE (PREFIX_0F7D) },
1791   { PREFIX_TABLE (PREFIX_0F7E) },
1792   { PREFIX_TABLE (PREFIX_0F7F) },
1793   /* 80 */
1794   { "joH",              { Jv, XX, cond_jump_flag } },
1795   { "jnoH",             { Jv, XX, cond_jump_flag } },
1796   { "jbH",              { Jv, XX, cond_jump_flag } },
1797   { "jaeH",             { Jv, XX, cond_jump_flag } },
1798   { "jeH",              { Jv, XX, cond_jump_flag } },
1799   { "jneH",             { Jv, XX, cond_jump_flag } },
1800   { "jbeH",             { Jv, XX, cond_jump_flag } },
1801   { "jaH",              { Jv, XX, cond_jump_flag } },
1802   /* 88 */
1803   { "jsH",              { Jv, XX, cond_jump_flag } },
1804   { "jnsH",             { Jv, XX, cond_jump_flag } },
1805   { "jpH",              { Jv, XX, cond_jump_flag } },
1806   { "jnpH",             { Jv, XX, cond_jump_flag } },
1807   { "jlH",              { Jv, XX, cond_jump_flag } },
1808   { "jgeH",             { Jv, XX, cond_jump_flag } },
1809   { "jleH",             { Jv, XX, cond_jump_flag } },
1810   { "jgH",              { Jv, XX, cond_jump_flag } },
1811   /* 90 */
1812   { "seto",             { Eb } },
1813   { "setno",            { Eb } },
1814   { "setb",             { Eb } },
1815   { "setae",            { Eb } },
1816   { "sete",             { Eb } },
1817   { "setne",            { Eb } },
1818   { "setbe",            { Eb } },
1819   { "seta",             { Eb } },
1820   /* 98 */
1821   { "sets",             { Eb } },
1822   { "setns",            { Eb } },
1823   { "setp",             { Eb } },
1824   { "setnp",            { Eb } },
1825   { "setl",             { Eb } },
1826   { "setge",            { Eb } },
1827   { "setle",            { Eb } },
1828   { "setg",             { Eb } },
1829   /* a0 */
1830   { "pushT",            { fs } },
1831   { "popT",             { fs } },
1832   { "cpuid",            { XX } },
1833   { "btS",              { Ev, Gv } },
1834   { "shldS",            { Ev, Gv, Ib } },
1835   { "shldS",            { Ev, Gv, CL } },
1836   { REG_TABLE (REG_0FA6) },
1837   { REG_TABLE (REG_0FA7) },
1838   /* a8 */
1839   { "pushT",            { gs } },
1840   { "popT",             { gs } },
1841   { "rsm",              { XX } },
1842   { "btsS",             { Ev, Gv } },
1843   { "shrdS",            { Ev, Gv, Ib } },
1844   { "shrdS",            { Ev, Gv, CL } },
1845   { REG_TABLE (REG_0FAE) },
1846   { "imulS",            { Gv, Ev } },
1847   /* b0 */
1848   { "cmpxchgB",         { Eb, Gb } },
1849   { "cmpxchgS",         { Ev, Gv } },
1850   { MOD_TABLE (MOD_0FB2) },
1851   { "btrS",             { Ev, Gv } },
1852   { MOD_TABLE (MOD_0FB4) },
1853   { MOD_TABLE (MOD_0FB5) },
1854   { "movz{bR|x}",       { Gv, Eb } },
1855   { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
1856   /* b8 */
1857   { PREFIX_TABLE (PREFIX_0FB8) },
1858   { "ud2b",             { XX } },
1859   { REG_TABLE (REG_0FBA) },
1860   { "btcS",             { Ev, Gv } },
1861   { "bsfS",             { Gv, Ev } },
1862   { PREFIX_TABLE (PREFIX_0FBD) },
1863   { "movs{bR|x}",       { Gv, Eb } },
1864   { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
1865   /* c0 */
1866   { "xaddB",            { Eb, Gb } },
1867   { "xaddS",            { Ev, Gv } },
1868   { PREFIX_TABLE (PREFIX_0FC2) },
1869   { PREFIX_TABLE (PREFIX_0FC3) },
1870   { "pinsrw",           { MX, Edqw, Ib } },
1871   { "pextrw",           { Gdq, MS, Ib } },
1872   { "shufpX",           { XM, EXx, Ib } },
1873   { REG_TABLE (REG_0FC7) },
1874   /* c8 */
1875   { "bswap",            { RMeAX } },
1876   { "bswap",            { RMeCX } },
1877   { "bswap",            { RMeDX } },
1878   { "bswap",            { RMeBX } },
1879   { "bswap",            { RMeSP } },
1880   { "bswap",            { RMeBP } },
1881   { "bswap",            { RMeSI } },
1882   { "bswap",            { RMeDI } },
1883   /* d0 */
1884   { PREFIX_TABLE (PREFIX_0FD0) },
1885   { "psrlw",            { MX, EM } },
1886   { "psrld",            { MX, EM } },
1887   { "psrlq",            { MX, EM } },
1888   { "paddq",            { MX, EM } },
1889   { "pmullw",           { MX, EM } },
1890   { PREFIX_TABLE (PREFIX_0FD6) },
1891   { MOD_TABLE (MOD_0FD7) },
1892   /* d8 */
1893   { "psubusb",          { MX, EM } },
1894   { "psubusw",          { MX, EM } },
1895   { "pminub",           { MX, EM } },
1896   { "pand",             { MX, EM } },
1897   { "paddusb",          { MX, EM } },
1898   { "paddusw",          { MX, EM } },
1899   { "pmaxub",           { MX, EM } },
1900   { "pandn",            { MX, EM } },
1901   /* e0 */
1902   { "pavgb",            { MX, EM } },
1903   { "psraw",            { MX, EM } },
1904   { "psrad",            { MX, EM } },
1905   { "pavgw",            { MX, EM } },
1906   { "pmulhuw",          { MX, EM } },
1907   { "pmulhw",           { MX, EM } },
1908   { PREFIX_TABLE (PREFIX_0FE6) },
1909   { PREFIX_TABLE (PREFIX_0FE7) },
1910   /* e8 */
1911   { "psubsb",           { MX, EM } },
1912   { "psubsw",           { MX, EM } },
1913   { "pminsw",           { MX, EM } },
1914   { "por",              { MX, EM } },
1915   { "paddsb",           { MX, EM } },
1916   { "paddsw",           { MX, EM } },
1917   { "pmaxsw",           { MX, EM } },
1918   { "pxor",             { MX, EM } },
1919   /* f0 */
1920   { PREFIX_TABLE (PREFIX_0FF0) },
1921   { "psllw",            { MX, EM } },
1922   { "pslld",            { MX, EM } },
1923   { "psllq",            { MX, EM } },
1924   { "pmuludq",          { MX, EM } },
1925   { "pmaddwd",          { MX, EM } },
1926   { "psadbw",           { MX, EM } },
1927   { PREFIX_TABLE (PREFIX_0FF7) },
1928   /* f8 */
1929   { "psubb",            { MX, EM } },
1930   { "psubw",            { MX, EM } },
1931   { "psubd",            { MX, EM } },
1932   { "psubq",            { MX, EM } },
1933   { "paddb",            { MX, EM } },
1934   { "paddw",            { MX, EM } },
1935   { "paddd",            { MX, EM } },
1936   { "(bad)",            { XX } },
1937 };
1938
1939 static const unsigned char onebyte_has_modrm[256] = {
1940   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1941   /*       -------------------------------        */
1942   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1943   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1944   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1945   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1946   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1947   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1948   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1949   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1950   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1951   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1952   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1953   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1954   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1955   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1956   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1957   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1958   /*       -------------------------------        */
1959   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1960 };
1961
1962 static const unsigned char twobyte_has_modrm[256] = {
1963   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1964   /*       -------------------------------        */
1965   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1966   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1967   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1968   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1969   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1970   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1971   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1972   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1973   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1974   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1975   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1976   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1977   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1978   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1979   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1980   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
1981   /*       -------------------------------        */
1982   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1983 };
1984
1985 static char obuf[100];
1986 static char *obufp;
1987 static char *mnemonicendp;
1988 static char scratchbuf[100];
1989 static unsigned char *start_codep;
1990 static unsigned char *insn_codep;
1991 static unsigned char *codep;
1992 static int last_lock_prefix;
1993 static int last_repz_prefix;
1994 static int last_repnz_prefix;
1995 static int last_data_prefix;
1996 static int last_addr_prefix;
1997 static int last_rex_prefix;
1998 static int last_seg_prefix;
1999 #define MAX_CODE_LENGTH 15
2000 /* We can up to 14 prefixes since the maximum instruction length is
2001    15bytes.  */
2002 static int all_prefixes[MAX_CODE_LENGTH - 1];
2003 static disassemble_info *the_info;
2004 static struct
2005   {
2006     int mod;
2007     int reg;
2008     int rm;
2009   }
2010 modrm;
2011 static unsigned char need_modrm;
2012 static struct
2013   {
2014     int register_specifier;
2015     int length;
2016     int prefix;
2017     int w;
2018   }
2019 vex;
2020 static unsigned char need_vex;
2021 static unsigned char need_vex_reg;
2022 static unsigned char vex_w_done;
2023
2024 struct op
2025   {
2026     const char *name;
2027     unsigned int len;
2028   };
2029
2030 /* If we are accessing mod/rm/reg without need_modrm set, then the
2031    values are stale.  Hitting this abort likely indicates that you
2032    need to update onebyte_has_modrm or twobyte_has_modrm.  */
2033 #define MODRM_CHECK  if (!need_modrm) abort ()
2034
2035 static const char **names64;
2036 static const char **names32;
2037 static const char **names16;
2038 static const char **names8;
2039 static const char **names8rex;
2040 static const char **names_seg;
2041 static const char *index64;
2042 static const char *index32;
2043 static const char **index16;
2044
2045 static const char *intel_names64[] = {
2046   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2047   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2048 };
2049 static const char *intel_names32[] = {
2050   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2051   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2052 };
2053 static const char *intel_names16[] = {
2054   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2055   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2056 };
2057 static const char *intel_names8[] = {
2058   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2059 };
2060 static const char *intel_names8rex[] = {
2061   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2062   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2063 };
2064 static const char *intel_names_seg[] = {
2065   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2066 };
2067 static const char *intel_index64 = "riz";
2068 static const char *intel_index32 = "eiz";
2069 static const char *intel_index16[] = {
2070   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2071 };
2072
2073 static const char *att_names64[] = {
2074   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2075   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2076 };
2077 static const char *att_names32[] = {
2078   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2079   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2080 };
2081 static const char *att_names16[] = {
2082   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2083   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2084 };
2085 static const char *att_names8[] = {
2086   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2087 };
2088 static const char *att_names8rex[] = {
2089   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2090   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2091 };
2092 static const char *att_names_seg[] = {
2093   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2094 };
2095 static const char *att_index64 = "%riz";
2096 static const char *att_index32 = "%eiz";
2097 static const char *att_index16[] = {
2098   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2099 };
2100
2101 static const struct dis386 reg_table[][8] = {
2102   /* REG_80 */
2103   {
2104     { "addA",   { Eb, Ib } },
2105     { "orA",    { Eb, Ib } },
2106     { "adcA",   { Eb, Ib } },
2107     { "sbbA",   { Eb, Ib } },
2108     { "andA",   { Eb, Ib } },
2109     { "subA",   { Eb, Ib } },
2110     { "xorA",   { Eb, Ib } },
2111     { "cmpA",   { Eb, Ib } },
2112   },
2113   /* REG_81 */
2114   {
2115     { "addQ",   { Ev, Iv } },
2116     { "orQ",    { Ev, Iv } },
2117     { "adcQ",   { Ev, Iv } },
2118     { "sbbQ",   { Ev, Iv } },
2119     { "andQ",   { Ev, Iv } },
2120     { "subQ",   { Ev, Iv } },
2121     { "xorQ",   { Ev, Iv } },
2122     { "cmpQ",   { Ev, Iv } },
2123   },
2124   /* REG_82 */
2125   {
2126     { "addQ",   { Ev, sIb } },
2127     { "orQ",    { Ev, sIb } },
2128     { "adcQ",   { Ev, sIb } },
2129     { "sbbQ",   { Ev, sIb } },
2130     { "andQ",   { Ev, sIb } },
2131     { "subQ",   { Ev, sIb } },
2132     { "xorQ",   { Ev, sIb } },
2133     { "cmpQ",   { Ev, sIb } },
2134   },
2135   /* REG_8F */
2136   {
2137     { "popU",   { stackEv } },
2138     { XOP_8F_TABLE (XOP_09) },
2139     { "(bad)",  { XX } },
2140     { "(bad)",  { XX } },
2141     { "(bad)",  { XX } },
2142     { XOP_8F_TABLE (XOP_09) },
2143     { "(bad)",  { XX } },
2144     { "(bad)",  { XX } },
2145   },
2146   /* REG_C0 */
2147   {
2148     { "rolA",   { Eb, Ib } },
2149     { "rorA",   { Eb, Ib } },
2150     { "rclA",   { Eb, Ib } },
2151     { "rcrA",   { Eb, Ib } },
2152     { "shlA",   { Eb, Ib } },
2153     { "shrA",   { Eb, Ib } },
2154     { "(bad)",  { XX } },
2155     { "sarA",   { Eb, Ib } },
2156   },
2157   /* REG_C1 */
2158   {
2159     { "rolQ",   { Ev, Ib } },
2160     { "rorQ",   { Ev, Ib } },
2161     { "rclQ",   { Ev, Ib } },
2162     { "rcrQ",   { Ev, Ib } },
2163     { "shlQ",   { Ev, Ib } },
2164     { "shrQ",   { Ev, Ib } },
2165     { "(bad)",  { XX } },
2166     { "sarQ",   { Ev, Ib } },
2167   },
2168   /* REG_C6 */
2169   {
2170     { "movA",   { Eb, Ib } },
2171     { "(bad)",  { XX } },
2172     { "(bad)",  { XX } },
2173     { "(bad)",  { XX } },
2174     { "(bad)",  { XX } },
2175     { "(bad)",  { XX } },
2176     { "(bad)",  { XX } },
2177     { "(bad)",  { XX } },
2178   },
2179   /* REG_C7 */
2180   {
2181     { "movQ",   { Ev, Iv } },
2182     { "(bad)",  { XX } },
2183     { "(bad)",  { XX } },
2184     { "(bad)",  { XX } },
2185     { "(bad)",  { XX } },
2186     { "(bad)",  { XX } },
2187     { "(bad)",  { XX } },
2188     { "(bad)",  { XX } },
2189   },
2190   /* REG_D0 */
2191   {
2192     { "rolA",   { Eb, I1 } },
2193     { "rorA",   { Eb, I1 } },
2194     { "rclA",   { Eb, I1 } },
2195     { "rcrA",   { Eb, I1 } },
2196     { "shlA",   { Eb, I1 } },
2197     { "shrA",   { Eb, I1 } },
2198     { "(bad)",  { XX } },
2199     { "sarA",   { Eb, I1 } },
2200   },
2201   /* REG_D1 */
2202   {
2203     { "rolQ",   { Ev, I1 } },
2204     { "rorQ",   { Ev, I1 } },
2205     { "rclQ",   { Ev, I1 } },
2206     { "rcrQ",   { Ev, I1 } },
2207     { "shlQ",   { Ev, I1 } },
2208     { "shrQ",   { Ev, I1 } },
2209     { "(bad)",  { XX } },
2210     { "sarQ",   { Ev, I1 } },
2211   },
2212   /* REG_D2 */
2213   {
2214     { "rolA",   { Eb, CL } },
2215     { "rorA",   { Eb, CL } },
2216     { "rclA",   { Eb, CL } },
2217     { "rcrA",   { Eb, CL } },
2218     { "shlA",   { Eb, CL } },
2219     { "shrA",   { Eb, CL } },
2220     { "(bad)",  { XX } },
2221     { "sarA",   { Eb, CL } },
2222   },
2223   /* REG_D3 */
2224   {
2225     { "rolQ",   { Ev, CL } },
2226     { "rorQ",   { Ev, CL } },
2227     { "rclQ",   { Ev, CL } },
2228     { "rcrQ",   { Ev, CL } },
2229     { "shlQ",   { Ev, CL } },
2230     { "shrQ",   { Ev, CL } },
2231     { "(bad)",  { XX } },
2232     { "sarQ",   { Ev, CL } },
2233   },
2234   /* REG_F6 */
2235   {
2236     { "testA",  { Eb, Ib } },
2237     { "(bad)",  { XX } },
2238     { "notA",   { Eb } },
2239     { "negA",   { Eb } },
2240     { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
2241     { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
2242     { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
2243     { "idivA",  { Eb } },       /* and idiv for consistency.               */
2244   },
2245   /* REG_F7 */
2246   {
2247     { "testQ",  { Ev, Iv } },
2248     { "(bad)",  { XX } },
2249     { "notQ",   { Ev } },
2250     { "negQ",   { Ev } },
2251     { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
2252     { "imulQ",  { Ev } },
2253     { "divQ",   { Ev } },
2254     { "idivQ",  { Ev } },
2255   },
2256   /* REG_FE */
2257   {
2258     { "incA",   { Eb } },
2259     { "decA",   { Eb } },
2260     { "(bad)",  { XX } },
2261     { "(bad)",  { XX } },
2262     { "(bad)",  { XX } },
2263     { "(bad)",  { XX } },
2264     { "(bad)",  { XX } },
2265     { "(bad)",  { XX } },
2266   },
2267   /* REG_FF */
2268   {
2269     { "incQ",   { Ev } },
2270     { "decQ",   { Ev } },
2271     { "callT",  { indirEv } },
2272     { "JcallT", { indirEp } },
2273     { "jmpT",   { indirEv } },
2274     { "JjmpT",  { indirEp } },
2275     { "pushU",  { stackEv } },
2276     { "(bad)",  { XX } },
2277   },
2278   /* REG_0F00 */
2279   {
2280     { "sldtD",  { Sv } },
2281     { "strD",   { Sv } },
2282     { "lldt",   { Ew } },
2283     { "ltr",    { Ew } },
2284     { "verr",   { Ew } },
2285     { "verw",   { Ew } },
2286     { "(bad)",  { XX } },
2287     { "(bad)",  { XX } },
2288   },
2289   /* REG_0F01 */
2290   {
2291     { MOD_TABLE (MOD_0F01_REG_0) },
2292     { MOD_TABLE (MOD_0F01_REG_1) },
2293     { MOD_TABLE (MOD_0F01_REG_2) },
2294     { MOD_TABLE (MOD_0F01_REG_3) },
2295     { "smswD",  { Sv } },
2296     { "(bad)",  { XX } },
2297     { "lmsw",   { Ew } },
2298     { MOD_TABLE (MOD_0F01_REG_7) },
2299   },
2300   /* REG_0F0D */
2301   {
2302     { "prefetch",       { Eb } },
2303     { "prefetchw",      { Eb } },
2304     { "(bad)",          { XX } },
2305     { "(bad)",          { XX } },
2306     { "(bad)",          { XX } },
2307     { "(bad)",          { XX } },
2308     { "(bad)",          { XX } },
2309     { "(bad)",          { XX } },
2310   },
2311   /* REG_0F18 */
2312   {
2313     { MOD_TABLE (MOD_0F18_REG_0) },
2314     { MOD_TABLE (MOD_0F18_REG_1) },
2315     { MOD_TABLE (MOD_0F18_REG_2) },
2316     { MOD_TABLE (MOD_0F18_REG_3) },
2317     { "(bad)",  { XX } },
2318     { "(bad)",  { XX } },
2319     { "(bad)",  { XX } },
2320     { "(bad)",  { XX } },
2321   },
2322   /* REG_0F71 */
2323   {
2324     { "(bad)",  { XX } },
2325     { "(bad)",  { XX } },
2326     { MOD_TABLE (MOD_0F71_REG_2) },
2327     { "(bad)",  { XX } },
2328     { MOD_TABLE (MOD_0F71_REG_4) },
2329     { "(bad)",  { XX } },
2330     { MOD_TABLE (MOD_0F71_REG_6) },
2331     { "(bad)",  { XX } },
2332   },
2333   /* REG_0F72 */
2334   {
2335     { "(bad)",  { XX } },
2336     { "(bad)",  { XX } },
2337     { MOD_TABLE (MOD_0F72_REG_2) },
2338     { "(bad)",  { XX } },
2339     { MOD_TABLE (MOD_0F72_REG_4) },
2340     { "(bad)",  { XX } },
2341     { MOD_TABLE (MOD_0F72_REG_6) },
2342     { "(bad)",  { XX } },
2343   },
2344   /* REG_0F73 */
2345   {
2346     { "(bad)",  { XX } },
2347     { "(bad)",  { XX } },
2348     { MOD_TABLE (MOD_0F73_REG_2) },
2349     { MOD_TABLE (MOD_0F73_REG_3) },
2350     { "(bad)",  { XX } },
2351     { "(bad)",  { XX } },
2352     { MOD_TABLE (MOD_0F73_REG_6) },
2353     { MOD_TABLE (MOD_0F73_REG_7) },
2354   },
2355   /* REG_0FA6 */
2356   {
2357     { "montmul",        { { OP_0f07, 0 } } },
2358     { "xsha1",          { { OP_0f07, 0 } } },
2359     { "xsha256",        { { OP_0f07, 0 } } },
2360     { "(bad)",          { { OP_0f07, 0 } } },
2361     { "(bad)",          { { OP_0f07, 0 } } },
2362     { "(bad)",          { { OP_0f07, 0 } } },
2363     { "(bad)",          { { OP_0f07, 0 } } },
2364     { "(bad)",          { { OP_0f07, 0 } } },
2365   },
2366   /* REG_0FA7 */
2367   {
2368     { "xstore-rng",     { { OP_0f07, 0 } } },
2369     { "xcrypt-ecb",     { { OP_0f07, 0 } } },
2370     { "xcrypt-cbc",     { { OP_0f07, 0 } } },
2371     { "xcrypt-ctr",     { { OP_0f07, 0 } } },
2372     { "xcrypt-cfb",     { { OP_0f07, 0 } } },
2373     { "xcrypt-ofb",     { { OP_0f07, 0 } } },
2374     { "(bad)",          { { OP_0f07, 0 } } },
2375     { "(bad)",          { { OP_0f07, 0 } } },
2376   },
2377   /* REG_0FAE */
2378   {
2379     { MOD_TABLE (MOD_0FAE_REG_0) },
2380     { MOD_TABLE (MOD_0FAE_REG_1) },
2381     { MOD_TABLE (MOD_0FAE_REG_2) },
2382     { MOD_TABLE (MOD_0FAE_REG_3) },
2383     { MOD_TABLE (MOD_0FAE_REG_4) },
2384     { MOD_TABLE (MOD_0FAE_REG_5) },
2385     { MOD_TABLE (MOD_0FAE_REG_6) },
2386     { MOD_TABLE (MOD_0FAE_REG_7) },
2387   },
2388   /* REG_0FBA */
2389   {
2390     { "(bad)",  { XX } },
2391     { "(bad)",  { XX } },
2392     { "(bad)",  { XX } },
2393     { "(bad)",  { XX } },
2394     { "btQ",    { Ev, Ib } },
2395     { "btsQ",   { Ev, Ib } },
2396     { "btrQ",   { Ev, Ib } },
2397     { "btcQ",   { Ev, Ib } },
2398   },
2399   /* REG_0FC7 */
2400   {
2401     { "(bad)",  { XX } },
2402     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2403     { "(bad)",  { XX } },
2404     { "(bad)",  { XX } },
2405     { "(bad)",  { XX } },
2406     { "(bad)",  { XX } },
2407     { MOD_TABLE (MOD_0FC7_REG_6) },
2408     { MOD_TABLE (MOD_0FC7_REG_7) },
2409   },
2410   /* REG_VEX_71 */
2411   {
2412     { "(bad)",  { XX } },
2413     { "(bad)",  { XX } },
2414     { MOD_TABLE (MOD_VEX_71_REG_2) },
2415     { "(bad)",  { XX } },
2416     { MOD_TABLE (MOD_VEX_71_REG_4) },
2417     { "(bad)",  { XX } },
2418     { MOD_TABLE (MOD_VEX_71_REG_6) },
2419     { "(bad)",  { XX } },
2420   },
2421   /* REG_VEX_72 */
2422   {
2423     { "(bad)",  { XX } },
2424     { "(bad)",  { XX } },
2425     { MOD_TABLE (MOD_VEX_72_REG_2) },
2426     { "(bad)",  { XX } },
2427     { MOD_TABLE (MOD_VEX_72_REG_4) },
2428     { "(bad)",  { XX } },
2429     { MOD_TABLE (MOD_VEX_72_REG_6) },
2430     { "(bad)",  { XX } },
2431   },
2432   /* REG_VEX_73 */
2433   {
2434     { "(bad)",  { XX } },
2435     { "(bad)",  { XX } },
2436     { MOD_TABLE (MOD_VEX_73_REG_2) },
2437     { MOD_TABLE (MOD_VEX_73_REG_3) },
2438     { "(bad)",  { XX } },
2439     { "(bad)",  { XX } },
2440     { MOD_TABLE (MOD_VEX_73_REG_6) },
2441     { MOD_TABLE (MOD_VEX_73_REG_7) },
2442   },
2443   /* REG_VEX_AE */
2444   {
2445     { "(bad)",  { XX } },
2446     { "(bad)",  { XX } },
2447     { MOD_TABLE (MOD_VEX_AE_REG_2) },
2448     { MOD_TABLE (MOD_VEX_AE_REG_3) },
2449     { "(bad)",  { XX } },
2450     { "(bad)",  { XX } },
2451     { "(bad)",  { XX } },
2452     { "(bad)",  { XX } },
2453   },
2454   /* REG_XOP_LWPCB */
2455   {
2456     { "llwpcb", { { OP_LWPCB_E, 0 } } },
2457     { "slwpcb", { { OP_LWPCB_E, 0 } } },
2458     { "(bad)",  { XX } },
2459     { "(bad)",  { XX } },
2460     { "(bad)",  { XX } },
2461     { "(bad)",  { XX } },
2462     { "(bad)",  { XX } },
2463     { "(bad)",  { XX } },
2464   },
2465   /* REG_XOP_LWP */
2466   {
2467     { "lwpins", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2468     { "lwpval", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2469     { "(bad)",  { XX } },
2470     { "(bad)",  { XX } },
2471     { "(bad)",  { XX } },
2472     { "(bad)",  { XX } },
2473     { "(bad)",  { XX } },
2474     { "(bad)",  { XX } },
2475   },
2476 };
2477
2478 static const struct dis386 prefix_table[][4] = {
2479   /* PREFIX_90 */
2480   {
2481     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2482     { "pause", { XX } },
2483     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2484     { "(bad)", { XX } },
2485   },
2486
2487   /* PREFIX_0F10 */
2488   {
2489     { "movups", { XM, EXx } },
2490     { "movss",  { XM, EXd } },
2491     { "movupd", { XM, EXx } },
2492     { "movsd",  { XM, EXq } },
2493   },
2494
2495   /* PREFIX_0F11 */
2496   {
2497     { "movups", { EXxS, XM } },
2498     { "movss",  { EXdS, XM } },
2499     { "movupd", { EXxS, XM } },
2500     { "movsd",  { EXqS, XM } },
2501   },
2502
2503   /* PREFIX_0F12 */
2504   {
2505     { MOD_TABLE (MOD_0F12_PREFIX_0) },
2506     { "movsldup", { XM, EXx } },
2507     { "movlpd", { XM, EXq } },
2508     { "movddup", { XM, EXq } },
2509   },
2510
2511   /* PREFIX_0F16 */
2512   {
2513     { MOD_TABLE (MOD_0F16_PREFIX_0) },
2514     { "movshdup", { XM, EXx } },
2515     { "movhpd", { XM, EXq } },
2516     { "(bad)",  { XX } },
2517   },
2518
2519   /* PREFIX_0F2A */
2520   {
2521     { "cvtpi2ps", { XM, EMCq } },
2522     { "cvtsi2ss%LQ", { XM, Ev } },
2523     { "cvtpi2pd", { XM, EMCq } },
2524     { "cvtsi2sd%LQ", { XM, Ev } },
2525   },
2526
2527   /* PREFIX_0F2B */
2528   {
2529     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2530     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2531     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2532     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2533   },
2534
2535   /* PREFIX_0F2C */
2536   {
2537     { "cvttps2pi", { MXC, EXq } },
2538     { "cvttss2siY", { Gv, EXd } },
2539     { "cvttpd2pi", { MXC, EXx } },
2540     { "cvttsd2siY", { Gv, EXq } },
2541   },
2542
2543   /* PREFIX_0F2D */
2544   {
2545     { "cvtps2pi", { MXC, EXq } },
2546     { "cvtss2siY", { Gv, EXd } },
2547     { "cvtpd2pi", { MXC, EXx } },
2548     { "cvtsd2siY", { Gv, EXq } },
2549   },
2550
2551   /* PREFIX_0F2E */
2552   {
2553     { "ucomiss",{ XM, EXd } }, 
2554     { "(bad)",  { XX } },
2555     { "ucomisd",{ XM, EXq } }, 
2556     { "(bad)",  { XX } },
2557   },
2558
2559   /* PREFIX_0F2F */
2560   {
2561     { "comiss", { XM, EXd } },
2562     { "(bad)",  { XX } },
2563     { "comisd", { XM, EXq } },
2564     { "(bad)",  { XX } },
2565   },
2566
2567   /* PREFIX_0F51 */
2568   {
2569     { "sqrtps", { XM, EXx } },
2570     { "sqrtss", { XM, EXd } },
2571     { "sqrtpd", { XM, EXx } },
2572     { "sqrtsd", { XM, EXq } },
2573   },
2574
2575   /* PREFIX_0F52 */
2576   {
2577     { "rsqrtps",{ XM, EXx } },
2578     { "rsqrtss",{ XM, EXd } },
2579     { "(bad)",  { XX } },
2580     { "(bad)",  { XX } },
2581   },
2582
2583   /* PREFIX_0F53 */
2584   {
2585     { "rcpps",  { XM, EXx } },
2586     { "rcpss",  { XM, EXd } },
2587     { "(bad)",  { XX } },
2588     { "(bad)",  { XX } },
2589   },
2590
2591   /* PREFIX_0F58 */
2592   {
2593     { "addps", { XM, EXx } },
2594     { "addss", { XM, EXd } },
2595     { "addpd", { XM, EXx } },
2596     { "addsd", { XM, EXq } },
2597   },
2598
2599   /* PREFIX_0F59 */
2600   {
2601     { "mulps",  { XM, EXx } },
2602     { "mulss",  { XM, EXd } },
2603     { "mulpd",  { XM, EXx } },
2604     { "mulsd",  { XM, EXq } },
2605   },
2606
2607   /* PREFIX_0F5A */
2608   {
2609     { "cvtps2pd", { XM, EXq } },
2610     { "cvtss2sd", { XM, EXd } },
2611     { "cvtpd2ps", { XM, EXx } },
2612     { "cvtsd2ss", { XM, EXq } },
2613   },
2614
2615   /* PREFIX_0F5B */
2616   {
2617     { "cvtdq2ps", { XM, EXx } },
2618     { "cvttps2dq", { XM, EXx } },
2619     { "cvtps2dq", { XM, EXx } },
2620     { "(bad)",  { XX } },
2621   },
2622
2623   /* PREFIX_0F5C */
2624   {
2625     { "subps",  { XM, EXx } },
2626     { "subss",  { XM, EXd } },
2627     { "subpd",  { XM, EXx } },
2628     { "subsd",  { XM, EXq } },
2629   },
2630
2631   /* PREFIX_0F5D */
2632   {
2633     { "minps",  { XM, EXx } },
2634     { "minss",  { XM, EXd } },
2635     { "minpd",  { XM, EXx } },
2636     { "minsd",  { XM, EXq } },
2637   },
2638
2639   /* PREFIX_0F5E */
2640   {
2641     { "divps",  { XM, EXx } },
2642     { "divss",  { XM, EXd } },
2643     { "divpd",  { XM, EXx } },
2644     { "divsd",  { XM, EXq } },
2645   },
2646
2647   /* PREFIX_0F5F */
2648   {
2649     { "maxps",  { XM, EXx } },
2650     { "maxss",  { XM, EXd } },
2651     { "maxpd",  { XM, EXx } },
2652     { "maxsd",  { XM, EXq } },
2653   },
2654
2655   /* PREFIX_0F60 */
2656   {
2657     { "punpcklbw",{ MX, EMd } },
2658     { "(bad)",  { XX } },
2659     { "punpcklbw",{ MX, EMx } },
2660     { "(bad)",  { XX } },
2661   },
2662
2663   /* PREFIX_0F61 */
2664   {
2665     { "punpcklwd",{ MX, EMd } },
2666     { "(bad)",  { XX } },
2667     { "punpcklwd",{ MX, EMx } },
2668     { "(bad)",  { XX } },
2669   },
2670
2671   /* PREFIX_0F62 */
2672   {
2673     { "punpckldq",{ MX, EMd } },
2674     { "(bad)",  { XX } },
2675     { "punpckldq",{ MX, EMx } },
2676     { "(bad)",  { XX } },
2677   },
2678
2679   /* PREFIX_0F6C */
2680   {
2681     { "(bad)",  { XX } },
2682     { "(bad)",  { XX } },
2683     { "punpcklqdq", { XM, EXx } },
2684     { "(bad)",  { XX } },
2685   },
2686
2687   /* PREFIX_0F6D */
2688   {
2689     { "(bad)",  { XX } },
2690     { "(bad)",  { XX } },
2691     { "punpckhqdq", { XM, EXx } },
2692     { "(bad)",  { XX } },
2693   },
2694
2695   /* PREFIX_0F6F */
2696   {
2697     { "movq",   { MX, EM } },
2698     { "movdqu", { XM, EXx } },
2699     { "movdqa", { XM, EXx } },
2700     { "(bad)",  { XX } },
2701   },
2702
2703   /* PREFIX_0F70 */
2704   {
2705     { "pshufw", { MX, EM, Ib } },
2706     { "pshufhw",{ XM, EXx, Ib } },
2707     { "pshufd", { XM, EXx, Ib } },
2708     { "pshuflw",{ XM, EXx, Ib } },
2709   },
2710
2711   /* PREFIX_0F73_REG_3 */
2712   {
2713     { "(bad)",  { XX } },
2714     { "(bad)",  { XX } },
2715     { "psrldq", { XS, Ib } },
2716     { "(bad)",  { XX } },
2717   },
2718
2719   /* PREFIX_0F73_REG_7 */
2720   {
2721     { "(bad)",  { XX } },
2722     { "(bad)",  { XX } },
2723     { "pslldq", { XS, Ib } },
2724     { "(bad)",  { XX } },
2725   },
2726
2727   /* PREFIX_0F78 */
2728   {
2729     {"vmread",  { Em, Gm } },
2730     {"(bad)",   { XX } },
2731     {"extrq",   { XS, Ib, Ib } },
2732     {"insertq", { XM, XS, Ib, Ib } },
2733   },
2734
2735   /* PREFIX_0F79 */
2736   {
2737     {"vmwrite", { Gm, Em } },
2738     {"(bad)",   { XX } },
2739     {"extrq",   { XM, XS } },
2740     {"insertq", { XM, XS } },
2741   },
2742
2743   /* PREFIX_0F7C */
2744   {
2745     { "(bad)",  { XX } },
2746     { "(bad)",  { XX } },
2747     { "haddpd", { XM, EXx } },
2748     { "haddps", { XM, EXx } },
2749   },
2750
2751   /* PREFIX_0F7D */
2752   {
2753     { "(bad)",  { XX } },
2754     { "(bad)",  { XX } },
2755     { "hsubpd", { XM, EXx } },
2756     { "hsubps", { XM, EXx } },
2757   },
2758
2759   /* PREFIX_0F7E */
2760   {
2761     { "movK",   { Edq, MX } },
2762     { "movq",   { XM, EXq } },
2763     { "movK",   { Edq, XM } },
2764     { "(bad)",  { XX } },
2765   },
2766
2767   /* PREFIX_0F7F */
2768   {
2769     { "movq",   { EMS, MX } },
2770     { "movdqu", { EXxS, XM } },
2771     { "movdqa", { EXxS, XM } },
2772     { "(bad)",  { XX } },
2773   },
2774
2775   /* PREFIX_0FB8 */
2776   {
2777     { "(bad)", { XX } },
2778     { "popcntS", { Gv, Ev } },
2779     { "(bad)", { XX } },
2780     { "(bad)", { XX } },
2781   },
2782
2783   /* PREFIX_0FBD */
2784   {
2785     { "bsrS",   { Gv, Ev } },
2786     { "lzcntS", { Gv, Ev } },
2787     { "bsrS",   { Gv, Ev } },
2788     { "(bad)",  { XX } },
2789   },
2790
2791   /* PREFIX_0FC2 */
2792   {
2793     { "cmpps",  { XM, EXx, CMP } },
2794     { "cmpss",  { XM, EXd, CMP } },
2795     { "cmppd",  { XM, EXx, CMP } },
2796     { "cmpsd",  { XM, EXq, CMP } },
2797   },
2798
2799   /* PREFIX_0FC3 */
2800   {
2801     { "movntiS", { Ma, Gv } },
2802     { "(bad)",  { XX } },
2803     { "(bad)",  { XX } },
2804     { "(bad)",  { XX } },
2805   },
2806
2807   /* PREFIX_0FC7_REG_6 */
2808   {
2809     { "vmptrld",{ Mq } },
2810     { "vmxon",  { Mq } },
2811     { "vmclear",{ Mq } },
2812     { "(bad)",  { XX } },
2813   },
2814
2815   /* PREFIX_0FD0 */
2816   {
2817     { "(bad)",  { XX } },
2818     { "(bad)",  { XX } },
2819     { "addsubpd", { XM, EXx } },
2820     { "addsubps", { XM, EXx } },
2821   },
2822
2823   /* PREFIX_0FD6 */
2824   {
2825     { "(bad)",  { XX } },
2826     { "movq2dq",{ XM, MS } },
2827     { "movq",   { EXqS, XM } },
2828     { "movdq2q",{ MX, XS } },
2829   },
2830
2831   /* PREFIX_0FE6 */
2832   {
2833     { "(bad)",  { XX } },
2834     { "cvtdq2pd", { XM, EXq } },
2835     { "cvttpd2dq", { XM, EXx } },
2836     { "cvtpd2dq", { XM, EXx } },
2837   },
2838
2839   /* PREFIX_0FE7 */
2840   {
2841     { "movntq", { Mq, MX } },
2842     { "(bad)",  { XX } },
2843     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2844     { "(bad)",  { XX } },
2845   },
2846
2847   /* PREFIX_0FF0 */
2848   {
2849     { "(bad)",  { XX } },
2850     { "(bad)",  { XX } },
2851     { "(bad)",  { XX } },
2852     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2853   },
2854
2855   /* PREFIX_0FF7 */
2856   {
2857     { "maskmovq", { MX, MS } },
2858     { "(bad)",  { XX } },
2859     { "maskmovdqu", { XM, XS } },
2860     { "(bad)",  { XX } },
2861   },
2862
2863   /* PREFIX_0F3810 */
2864   {
2865     { "(bad)",  { XX } },
2866     { "(bad)",  { XX } },
2867     { "pblendvb", { XM, EXx, XMM0 } },
2868     { "(bad)",  { XX } },
2869   },
2870
2871   /* PREFIX_0F3814 */
2872   {
2873     { "(bad)",  { XX } },
2874     { "(bad)",  { XX } },
2875     { "blendvps", { XM, EXx, XMM0 } },
2876     { "(bad)",  { XX } },
2877   },
2878
2879   /* PREFIX_0F3815 */
2880   {
2881     { "(bad)",  { XX } },
2882     { "(bad)",  { XX } },
2883     { "blendvpd", { XM, EXx, XMM0 } },
2884     { "(bad)",  { XX } },
2885   },
2886
2887   /* PREFIX_0F3817 */
2888   {
2889     { "(bad)",  { XX } },
2890     { "(bad)",  { XX } },
2891     { "ptest",  { XM, EXx } },
2892     { "(bad)",  { XX } },
2893   },
2894
2895   /* PREFIX_0F3820 */
2896   {
2897     { "(bad)",  { XX } },
2898     { "(bad)",  { XX } },
2899     { "pmovsxbw", { XM, EXq } },
2900     { "(bad)",  { XX } },
2901   },
2902
2903   /* PREFIX_0F3821 */
2904   {
2905     { "(bad)",  { XX } },
2906     { "(bad)",  { XX } },
2907     { "pmovsxbd", { XM, EXd } },
2908     { "(bad)",  { XX } },
2909   },
2910
2911   /* PREFIX_0F3822 */
2912   {
2913     { "(bad)",  { XX } },
2914     { "(bad)",  { XX } },
2915     { "pmovsxbq", { XM, EXw } },
2916     { "(bad)",  { XX } },
2917   },
2918
2919   /* PREFIX_0F3823 */
2920   {
2921     { "(bad)",  { XX } },
2922     { "(bad)",  { XX } },
2923     { "pmovsxwd", { XM, EXq } },
2924     { "(bad)",  { XX } },
2925   },
2926
2927   /* PREFIX_0F3824 */
2928   {
2929     { "(bad)",  { XX } },
2930     { "(bad)",  { XX } },
2931     { "pmovsxwq", { XM, EXd } },
2932     { "(bad)",  { XX } },
2933   },
2934
2935   /* PREFIX_0F3825 */
2936   {
2937     { "(bad)",  { XX } },
2938     { "(bad)",  { XX } },
2939     { "pmovsxdq", { XM, EXq } },
2940     { "(bad)",  { XX } },
2941   },
2942
2943   /* PREFIX_0F3828 */
2944   {
2945     { "(bad)",  { XX } },
2946     { "(bad)",  { XX } },
2947     { "pmuldq", { XM, EXx } },
2948     { "(bad)",  { XX } },
2949   },
2950
2951   /* PREFIX_0F3829 */
2952   {
2953     { "(bad)",  { XX } },
2954     { "(bad)",  { XX } },
2955     { "pcmpeqq", { XM, EXx } },
2956     { "(bad)",  { XX } },
2957   },
2958
2959   /* PREFIX_0F382A */
2960   {
2961     { "(bad)",  { XX } },
2962     { "(bad)",  { XX } },
2963     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2964     { "(bad)",  { XX } },
2965   },
2966
2967   /* PREFIX_0F382B */
2968   {
2969     { "(bad)",  { XX } },
2970     { "(bad)",  { XX } },
2971     { "packusdw", { XM, EXx } },
2972     { "(bad)",  { XX } },
2973   },
2974
2975   /* PREFIX_0F3830 */
2976   {
2977     { "(bad)",  { XX } },
2978     { "(bad)",  { XX } },
2979     { "pmovzxbw", { XM, EXq } },
2980     { "(bad)",  { XX } },
2981   },
2982
2983   /* PREFIX_0F3831 */
2984   {
2985     { "(bad)",  { XX } },
2986     { "(bad)",  { XX } },
2987     { "pmovzxbd", { XM, EXd } },
2988     { "(bad)",  { XX } },
2989   },
2990
2991   /* PREFIX_0F3832 */
2992   {
2993     { "(bad)",  { XX } },
2994     { "(bad)",  { XX } },
2995     { "pmovzxbq", { XM, EXw } },
2996     { "(bad)",  { XX } },
2997   },
2998
2999   /* PREFIX_0F3833 */
3000   {
3001     { "(bad)",  { XX } },
3002     { "(bad)",  { XX } },
3003     { "pmovzxwd", { XM, EXq } },
3004     { "(bad)",  { XX } },
3005   },
3006
3007   /* PREFIX_0F3834 */
3008   {
3009     { "(bad)",  { XX } },
3010     { "(bad)",  { XX } },
3011     { "pmovzxwq", { XM, EXd } },
3012     { "(bad)",  { XX } },
3013   },
3014
3015   /* PREFIX_0F3835 */
3016   {
3017     { "(bad)",  { XX } },
3018     { "(bad)",  { XX } },
3019     { "pmovzxdq", { XM, EXq } },
3020     { "(bad)",  { XX } },
3021   },
3022
3023   /* PREFIX_0F3837 */
3024   {
3025     { "(bad)",  { XX } },
3026     { "(bad)",  { XX } },
3027     { "pcmpgtq", { XM, EXx } },
3028     { "(bad)",  { XX } },
3029   },
3030
3031   /* PREFIX_0F3838 */
3032   {
3033     { "(bad)",  { XX } },
3034     { "(bad)",  { XX } },
3035     { "pminsb", { XM, EXx } },
3036     { "(bad)",  { XX } },
3037   },
3038
3039   /* PREFIX_0F3839 */
3040   {
3041     { "(bad)",  { XX } },
3042     { "(bad)",  { XX } },
3043     { "pminsd", { XM, EXx } },
3044     { "(bad)",  { XX } },
3045   },
3046
3047   /* PREFIX_0F383A */
3048   {
3049     { "(bad)",  { XX } },
3050     { "(bad)",  { XX } },
3051     { "pminuw", { XM, EXx } },
3052     { "(bad)",  { XX } },
3053   },
3054
3055   /* PREFIX_0F383B */
3056   {
3057     { "(bad)",  { XX } },
3058     { "(bad)",  { XX } },
3059     { "pminud", { XM, EXx } },
3060     { "(bad)",  { XX } },
3061   },
3062
3063   /* PREFIX_0F383C */
3064   {
3065     { "(bad)",  { XX } },
3066     { "(bad)",  { XX } },
3067     { "pmaxsb", { XM, EXx } },
3068     { "(bad)",  { XX } },
3069   },
3070
3071   /* PREFIX_0F383D */
3072   {
3073     { "(bad)",  { XX } },
3074     { "(bad)",  { XX } },
3075     { "pmaxsd", { XM, EXx } },
3076     { "(bad)",  { XX } },
3077   },
3078
3079   /* PREFIX_0F383E */
3080   {
3081     { "(bad)",  { XX } },
3082     { "(bad)",  { XX } },
3083     { "pmaxuw", { XM, EXx } },
3084     { "(bad)",  { XX } },
3085   },
3086
3087   /* PREFIX_0F383F */
3088   {
3089     { "(bad)",  { XX } },
3090     { "(bad)",  { XX } },
3091     { "pmaxud", { XM, EXx } },
3092     { "(bad)",  { XX } },
3093   },
3094
3095   /* PREFIX_0F3840 */
3096   {
3097     { "(bad)",  { XX } },
3098     { "(bad)",  { XX } },
3099     { "pmulld", { XM, EXx } },
3100     { "(bad)",  { XX } },
3101   },
3102
3103   /* PREFIX_0F3841 */
3104   {
3105     { "(bad)",  { XX } },
3106     { "(bad)",  { XX } },
3107     { "phminposuw", { XM, EXx } },
3108     { "(bad)",  { XX } },
3109   },
3110
3111   /* PREFIX_0F3880 */
3112   {
3113     { "(bad)",  { XX } },
3114     { "(bad)",  { XX } },
3115     { "invept", { Gm, Mo } },
3116     { "(bad)",  { XX } },
3117   },
3118
3119   /* PREFIX_0F3881 */
3120   {
3121     { "(bad)",  { XX } },
3122     { "(bad)",  { XX } },
3123     { "invvpid", { Gm, Mo } },
3124     { "(bad)",  { XX } },
3125   },
3126
3127   /* PREFIX_0F38DB */
3128   {
3129     { "(bad)",  { XX } },
3130     { "(bad)",  { XX } },
3131     { "aesimc", { XM, EXx } },
3132     { "(bad)",  { XX } },
3133   },
3134
3135   /* PREFIX_0F38DC */
3136   {
3137     { "(bad)",  { XX } },
3138     { "(bad)",  { XX } },
3139     { "aesenc", { XM, EXx } },
3140     { "(bad)",  { XX } },
3141   },
3142
3143   /* PREFIX_0F38DD */
3144   {
3145     { "(bad)",  { XX } },
3146     { "(bad)",  { XX } },
3147     { "aesenclast", { XM, EXx } },
3148     { "(bad)",  { XX } },
3149   },
3150
3151   /* PREFIX_0F38DE */
3152   {
3153     { "(bad)",  { XX } },
3154     { "(bad)",  { XX } },
3155     { "aesdec", { XM, EXx } },
3156     { "(bad)",  { XX } },
3157   },
3158
3159   /* PREFIX_0F38DF */
3160   {
3161     { "(bad)",  { XX } },
3162     { "(bad)",  { XX } },
3163     { "aesdeclast", { XM, EXx } },
3164     { "(bad)",  { XX } },
3165   },
3166
3167   /* PREFIX_0F38F0 */
3168   {
3169     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3170     { "(bad)",  { XX } },
3171     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3172     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },     
3173   },
3174
3175   /* PREFIX_0F38F1 */
3176   {
3177     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3178     { "(bad)",  { XX } },
3179     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3180     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },     
3181   },
3182
3183   /* PREFIX_0F3A08 */
3184   {
3185     { "(bad)",  { XX } },
3186     { "(bad)",  { XX } },
3187     { "roundps", { XM, EXx, Ib } },
3188     { "(bad)",  { XX } },
3189   },
3190
3191   /* PREFIX_0F3A09 */
3192   {
3193     { "(bad)",  { XX } },
3194     { "(bad)",  { XX } },
3195     { "roundpd", { XM, EXx, Ib } },
3196     { "(bad)",  { XX } },
3197   },
3198
3199   /* PREFIX_0F3A0A */
3200   {
3201     { "(bad)",  { XX } },
3202     { "(bad)",  { XX } },
3203     { "roundss", { XM, EXd, Ib } },
3204     { "(bad)",  { XX } },
3205   },
3206
3207   /* PREFIX_0F3A0B */
3208   {
3209     { "(bad)",  { XX } },
3210     { "(bad)",  { XX } },
3211     { "roundsd", { XM, EXq, Ib } },
3212     { "(bad)",  { XX } },
3213   },
3214
3215   /* PREFIX_0F3A0C */
3216   {
3217     { "(bad)",  { XX } },
3218     { "(bad)",  { XX } },
3219     { "blendps", { XM, EXx, Ib } },
3220     { "(bad)",  { XX } },
3221   },
3222
3223   /* PREFIX_0F3A0D */
3224   {
3225     { "(bad)",  { XX } },
3226     { "(bad)",  { XX } },
3227     { "blendpd", { XM, EXx, Ib } },
3228     { "(bad)",  { XX } },
3229   },
3230
3231   /* PREFIX_0F3A0E */
3232   {
3233     { "(bad)",  { XX } },
3234     { "(bad)",  { XX } },
3235     { "pblendw", { XM, EXx, Ib } },
3236     { "(bad)",  { XX } },
3237   },
3238
3239   /* PREFIX_0F3A14 */
3240   {
3241     { "(bad)",  { XX } },
3242     { "(bad)",  { XX } },
3243     { "pextrb", { Edqb, XM, Ib } },
3244     { "(bad)",  { XX } },
3245   },
3246
3247   /* PREFIX_0F3A15 */
3248   {
3249     { "(bad)",  { XX } },
3250     { "(bad)",  { XX } },
3251     { "pextrw", { Edqw, XM, Ib } },
3252     { "(bad)",  { XX } },
3253   },
3254
3255   /* PREFIX_0F3A16 */
3256   {
3257     { "(bad)",  { XX } },
3258     { "(bad)",  { XX } },
3259     { "pextrK", { Edq, XM, Ib } },
3260     { "(bad)",  { XX } },
3261   },
3262
3263   /* PREFIX_0F3A17 */
3264   {
3265     { "(bad)",  { XX } },
3266     { "(bad)",  { XX } },
3267     { "extractps", { Edqd, XM, Ib } },
3268     { "(bad)",  { XX } },
3269   },
3270
3271   /* PREFIX_0F3A20 */
3272   {
3273     { "(bad)",  { XX } },
3274     { "(bad)",  { XX } },
3275     { "pinsrb", { XM, Edqb, Ib } },
3276     { "(bad)",  { XX } },
3277   },
3278
3279   /* PREFIX_0F3A21 */
3280   {
3281     { "(bad)",  { XX } },
3282     { "(bad)",  { XX } },
3283     { "insertps", { XM, EXd, Ib } },
3284     { "(bad)",  { XX } },
3285   },
3286
3287   /* PREFIX_0F3A22 */
3288   {
3289     { "(bad)",  { XX } },
3290     { "(bad)",  { XX } },
3291     { "pinsrK", { XM, Edq, Ib } },
3292     { "(bad)",  { XX } },
3293   },
3294
3295   /* PREFIX_0F3A40 */
3296   {
3297     { "(bad)",  { XX } },
3298     { "(bad)",  { XX } },
3299     { "dpps",   { XM, EXx, Ib } },
3300     { "(bad)",  { XX } },
3301   },
3302
3303   /* PREFIX_0F3A41 */
3304   {
3305     { "(bad)",  { XX } },
3306     { "(bad)",  { XX } },
3307     { "dppd",   { XM, EXx, Ib } },
3308     { "(bad)",  { XX } },
3309   },
3310
3311   /* PREFIX_0F3A42 */
3312   {
3313     { "(bad)",  { XX } },
3314     { "(bad)",  { XX } },
3315     { "mpsadbw", { XM, EXx, Ib } },
3316     { "(bad)",  { XX } },
3317   },
3318
3319   /* PREFIX_0F3A44 */
3320   {
3321     { "(bad)",  { XX } },
3322     { "(bad)",  { XX } },
3323     { "pclmulqdq", { XM, EXx, PCLMUL } },
3324     { "(bad)",  { XX } },
3325   },
3326
3327   /* PREFIX_0F3A60 */
3328   {
3329     { "(bad)",  { XX } },
3330     { "(bad)",  { XX } },
3331     { "pcmpestrm", { XM, EXx, Ib } },
3332     { "(bad)",  { XX } },
3333   },
3334
3335   /* PREFIX_0F3A61 */
3336   {
3337     { "(bad)",  { XX } },
3338     { "(bad)",  { XX } },
3339     { "pcmpestri", { XM, EXx, Ib } },
3340     { "(bad)",  { XX } },
3341   },
3342
3343   /* PREFIX_0F3A62 */
3344   {
3345     { "(bad)",  { XX } },
3346     { "(bad)",  { XX } },
3347     { "pcmpistrm", { XM, EXx, Ib } },
3348     { "(bad)",  { XX } },
3349   },
3350
3351   /* PREFIX_0F3A63 */
3352   {
3353     { "(bad)",  { XX } },
3354     { "(bad)",  { XX } },
3355     { "pcmpistri", { XM, EXx, Ib } },
3356     { "(bad)",  { XX } },
3357   },
3358
3359   /* PREFIX_0F3ADF */
3360   {
3361     { "(bad)",  { XX } },
3362     { "(bad)",  { XX } },
3363     { "aeskeygenassist", { XM, EXx, Ib } },
3364     { "(bad)",  { XX } },
3365   },
3366
3367   /* PREFIX_VEX_10 */
3368   {
3369     { "vmovups", { XM, EXx } },
3370     { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3371     { "vmovupd", { XM, EXx } },
3372     { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3373   },
3374
3375   /* PREFIX_VEX_11 */
3376   {
3377     { "vmovups", { EXxS, XM } },
3378     { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3379     { "vmovupd", { EXxS, XM } },
3380     { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3381   },
3382
3383   /* PREFIX_VEX_12 */
3384   {
3385     { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3386     { "vmovsldup", { XM, EXx } },
3387     { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3388     { "vmovddup", { XM, EXymmq } },
3389   },
3390
3391   /* PREFIX_VEX_16 */
3392   {
3393     { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3394     { "vmovshdup", { XM, EXx } },
3395     { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3396     { "(bad)",  { XX } },
3397   },
3398
3399   /* PREFIX_VEX_2A */
3400   {
3401     { "(bad)",  { XX } },
3402     { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3403     { "(bad)",  { XX } },
3404     { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3405   },
3406
3407   /* PREFIX_VEX_2C */
3408   {
3409     { "(bad)",  { XX } },
3410     { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3411     { "(bad)",  { XX } },
3412     { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3413   },
3414
3415   /* PREFIX_VEX_2D */
3416   {
3417     { "(bad)",  { XX } },
3418     { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3419     { "(bad)",  { XX } },
3420     { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3421   },
3422
3423   /* PREFIX_VEX_2E */
3424   {
3425     { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3426     { "(bad)",  { XX } },
3427     { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3428     { "(bad)",  { XX } },
3429   },
3430
3431   /* PREFIX_VEX_2F */
3432   {
3433     { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3434     { "(bad)",  { XX } },
3435     { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3436     { "(bad)",  { XX } },
3437   },
3438
3439   /* PREFIX_VEX_51 */
3440   {
3441     { "vsqrtps", { XM, EXx } },
3442     { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3443     { "vsqrtpd", { XM, EXx } },
3444     { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3445   },
3446
3447   /* PREFIX_VEX_52 */
3448   {
3449     { "vrsqrtps", { XM, EXx } },
3450     { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3451     { "(bad)",  { XX } },
3452     { "(bad)",  { XX } },
3453   },
3454
3455   /* PREFIX_VEX_53 */
3456   {
3457     { "vrcpps", { XM, EXx } },
3458     { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3459     { "(bad)",  { XX } },
3460     { "(bad)",  { XX } },
3461   },
3462
3463   /* PREFIX_VEX_58 */
3464   {
3465     { "vaddps", { XM, Vex, EXx } },
3466     { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3467     { "vaddpd", { XM, Vex, EXx } },
3468     { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3469   },
3470
3471   /* PREFIX_VEX_59 */
3472   {
3473     { "vmulps", { XM, Vex, EXx } },
3474     { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3475     { "vmulpd", { XM, Vex, EXx } },
3476     { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3477   },
3478
3479   /* PREFIX_VEX_5A */
3480   {
3481     { "vcvtps2pd", { XM, EXxmmq } },
3482     { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3483     { "vcvtpd2ps%XY", { XMM, EXx } },
3484     { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3485   },
3486
3487   /* PREFIX_VEX_5B */
3488   {
3489     { "vcvtdq2ps", { XM, EXx } },
3490     { "vcvttps2dq", { XM, EXx } },
3491     { "vcvtps2dq", { XM, EXx } },
3492     { "(bad)",  { XX } },
3493   },
3494
3495   /* PREFIX_VEX_5C */
3496   {
3497     { "vsubps", { XM, Vex, EXx } },
3498     { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3499     { "vsubpd", { XM, Vex, EXx } },
3500     { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3501   },
3502
3503   /* PREFIX_VEX_5D */
3504   {
3505     { "vminps", { XM, Vex, EXx } },
3506     { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3507     { "vminpd", { XM, Vex, EXx } },
3508     { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3509   },
3510
3511   /* PREFIX_VEX_5E */
3512   {
3513     { "vdivps", { XM, Vex, EXx } },
3514     { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3515     { "vdivpd", { XM, Vex, EXx } },
3516     { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3517   },
3518
3519   /* PREFIX_VEX_5F */
3520   {
3521     { "vmaxps", { XM, Vex, EXx } },
3522     { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3523     { "vmaxpd", { XM, Vex, EXx } },
3524     { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3525   },
3526
3527   /* PREFIX_VEX_60 */
3528   {
3529     { "(bad)",  { XX } },
3530     { "(bad)",  { XX } },
3531     { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3532     { "(bad)",  { XX } },
3533   },
3534
3535   /* PREFIX_VEX_61 */
3536   {
3537     { "(bad)",  { XX } },
3538     { "(bad)",  { XX } },
3539     { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3540     { "(bad)",  { XX } },
3541   },
3542
3543   /* PREFIX_VEX_62 */
3544   {
3545     { "(bad)",  { XX } },
3546     { "(bad)",  { XX } },
3547     { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3548     { "(bad)",  { XX } },
3549   },
3550
3551   /* PREFIX_VEX_63 */
3552   {
3553     { "(bad)",  { XX } },
3554     { "(bad)",  { XX } },
3555     { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3556     { "(bad)",  { XX } },
3557   },
3558
3559   /* PREFIX_VEX_64 */
3560   {
3561     { "(bad)",  { XX } },
3562     { "(bad)",  { XX } },
3563     { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3564     { "(bad)",  { XX } },
3565   },
3566
3567   /* PREFIX_VEX_65 */
3568   {
3569     { "(bad)",  { XX } },
3570     { "(bad)",  { XX } },
3571     { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3572     { "(bad)",  { XX } },
3573   },
3574
3575   /* PREFIX_VEX_66 */
3576   {
3577     { "(bad)",  { XX } },
3578     { "(bad)",  { XX } },
3579     { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3580     { "(bad)",  { XX } },
3581   },
3582
3583   /* PREFIX_VEX_67 */
3584   {
3585     { "(bad)",  { XX } },
3586     { "(bad)",  { XX } },
3587     { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3588     { "(bad)",  { XX } },
3589   },
3590
3591   /* PREFIX_VEX_68 */
3592   {
3593     { "(bad)",  { XX } },
3594     { "(bad)",  { XX } },
3595     { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3596     { "(bad)",  { XX } },
3597   },
3598
3599   /* PREFIX_VEX_69 */
3600   {
3601     { "(bad)",  { XX } },
3602     { "(bad)",  { XX } },
3603     { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3604     { "(bad)",  { XX } },
3605   },
3606
3607   /* PREFIX_VEX_6A */
3608   {
3609     { "(bad)",  { XX } },
3610     { "(bad)",  { XX } },
3611     { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3612     { "(bad)",  { XX } },
3613   },
3614
3615   /* PREFIX_VEX_6B */
3616   {
3617     { "(bad)",  { XX } },
3618     { "(bad)",  { XX } },
3619     { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3620     { "(bad)",  { XX } },
3621   },
3622
3623   /* PREFIX_VEX_6C */
3624   {
3625     { "(bad)",  { XX } },
3626     { "(bad)",  { XX } },
3627     { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3628     { "(bad)",  { XX } },
3629   },
3630
3631   /* PREFIX_VEX_6D */
3632   {
3633     { "(bad)",  { XX } },
3634     { "(bad)",  { XX } },
3635     { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3636     { "(bad)",  { XX } },
3637   },
3638
3639   /* PREFIX_VEX_6E */
3640   {
3641     { "(bad)",  { XX } },
3642     { "(bad)",  { XX } },
3643     { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3644     { "(bad)",  { XX } },
3645   },
3646
3647   /* PREFIX_VEX_6F */
3648   {
3649     { "(bad)",  { XX } },
3650     { "vmovdqu", { XM, EXx } },
3651     { "vmovdqa", { XM, EXx } },
3652     { "(bad)",  { XX } },
3653   },
3654
3655   /* PREFIX_VEX_70 */
3656   {
3657     { "(bad)",  { XX } },
3658     { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3659     { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3660     { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3661   },
3662
3663   /* PREFIX_VEX_71_REG_2 */
3664   {
3665     { "(bad)",  { XX } },
3666     { "(bad)",  { XX } },
3667     { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3668     { "(bad)",  { XX } },
3669   },
3670
3671   /* PREFIX_VEX_71_REG_4 */
3672   {
3673     { "(bad)",  { XX } },
3674     { "(bad)",  { XX } },
3675     { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3676     { "(bad)",  { XX } },
3677   },
3678
3679   /* PREFIX_VEX_71_REG_6 */
3680   {
3681     { "(bad)",  { XX } },
3682     { "(bad)",  { XX } },
3683     { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3684     { "(bad)",  { XX } },
3685   },
3686
3687   /* PREFIX_VEX_72_REG_2 */
3688   {
3689     { "(bad)",  { XX } },
3690     { "(bad)",  { XX } },
3691     { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3692     { "(bad)",  { XX } },
3693   },
3694
3695   /* PREFIX_VEX_72_REG_4 */
3696   {
3697     { "(bad)",  { XX } },
3698     { "(bad)",  { XX } },
3699     { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3700     { "(bad)",  { XX } },
3701   },
3702
3703   /* PREFIX_VEX_72_REG_6 */
3704   {
3705     { "(bad)",  { XX } },
3706     { "(bad)",  { XX } },
3707     { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3708     { "(bad)",  { XX } },
3709   },
3710
3711   /* PREFIX_VEX_73_REG_2 */
3712   {
3713     { "(bad)",  { XX } },
3714     { "(bad)",  { XX } },
3715     { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3716     { "(bad)",  { XX } },
3717   },
3718
3719   /* PREFIX_VEX_73_REG_3 */
3720   {
3721     { "(bad)",  { XX } },
3722     { "(bad)",  { XX } },
3723     { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3724     { "(bad)",  { XX } },
3725   },
3726
3727   /* PREFIX_VEX_73_REG_6 */
3728   {
3729     { "(bad)",  { XX } },
3730     { "(bad)",  { XX } },
3731     { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3732     { "(bad)",  { XX } },
3733   },
3734
3735   /* PREFIX_VEX_73_REG_7 */
3736   {
3737     { "(bad)",  { XX } },
3738     { "(bad)",  { XX } },
3739     { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3740     { "(bad)",  { XX } },
3741   },
3742
3743   /* PREFIX_VEX_74 */
3744   {
3745     { "(bad)",  { XX } },
3746     { "(bad)",  { XX } },
3747     { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3748     { "(bad)",  { XX } },
3749   },
3750
3751   /* PREFIX_VEX_75 */
3752   {
3753     { "(bad)",  { XX } },
3754     { "(bad)",  { XX } },
3755     { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3756     { "(bad)",  { XX } },
3757   },
3758
3759   /* PREFIX_VEX_76 */
3760   {
3761     { "(bad)",  { XX } },
3762     { "(bad)",  { XX } },
3763     { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3764     { "(bad)",  { XX } },
3765   },
3766
3767   /* PREFIX_VEX_77 */
3768   {
3769     { "",       { VZERO } },
3770     { "(bad)",  { XX } },
3771     { "(bad)",  { XX } },
3772     { "(bad)",  { XX } },
3773   },
3774
3775   /* PREFIX_VEX_7C */
3776   {
3777     { "(bad)",  { XX } },
3778     { "(bad)",  { XX } },
3779     { "vhaddpd", { XM, Vex, EXx } },
3780     { "vhaddps", { XM, Vex, EXx } },
3781   },
3782
3783   /* PREFIX_VEX_7D */
3784   {
3785     { "(bad)",  { XX } },
3786     { "(bad)",  { XX } },
3787     { "vhsubpd", { XM, Vex, EXx } },
3788     { "vhsubps", { XM, Vex, EXx } },
3789   },
3790
3791   /* PREFIX_VEX_7E */
3792   {
3793     { "(bad)",  { XX } },
3794     { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3795     { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3796     { "(bad)",  { XX } },
3797   },
3798
3799   /* PREFIX_VEX_7F */
3800   {
3801     { "(bad)",  { XX } },
3802     { "vmovdqu", { EXxS, XM } },
3803     { "vmovdqa", { EXxS, XM } },
3804     { "(bad)",  { XX } },
3805   },
3806
3807   /* PREFIX_VEX_C2 */
3808   {
3809     { "vcmpps", { XM, Vex, EXx, VCMP } },
3810     { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3811     { "vcmppd", { XM, Vex, EXx, VCMP } },
3812     { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3813   },
3814
3815   /* PREFIX_VEX_C4 */
3816   {
3817     { "(bad)",  { XX } },
3818     { "(bad)",  { XX } },
3819     { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3820     { "(bad)",  { XX } },
3821   },
3822
3823   /* PREFIX_VEX_C5 */
3824   {
3825     { "(bad)",  { XX } },
3826     { "(bad)",  { XX } },
3827     { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3828     { "(bad)",  { XX } },
3829   },
3830
3831   /* PREFIX_VEX_D0 */
3832   {
3833     { "(bad)",  { XX } },
3834     { "(bad)",  { XX } },
3835     { "vaddsubpd", { XM, Vex, EXx } },
3836     { "vaddsubps", { XM, Vex, EXx } },
3837   },
3838
3839   /* PREFIX_VEX_D1 */
3840   {
3841     { "(bad)",  { XX } },
3842     { "(bad)",  { XX } },
3843     { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3844     { "(bad)",  { XX } },
3845   },
3846
3847   /* PREFIX_VEX_D2 */
3848   {
3849     { "(bad)",  { XX } },
3850     { "(bad)",  { XX } },
3851     { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3852     { "(bad)",  { XX } },
3853   },
3854
3855   /* PREFIX_VEX_D3 */
3856   {
3857     { "(bad)",  { XX } },
3858     { "(bad)",  { XX } },
3859     { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3860     { "(bad)",  { XX } },
3861   },
3862
3863   /* PREFIX_VEX_D4 */
3864   {
3865     { "(bad)",  { XX } },
3866     { "(bad)",  { XX } },
3867     { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3868     { "(bad)",  { XX } },
3869   },
3870
3871   /* PREFIX_VEX_D5 */
3872   {
3873     { "(bad)",  { XX } },
3874     { "(bad)",  { XX } },
3875     { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3876     { "(bad)",  { XX } },
3877   },
3878
3879   /* PREFIX_VEX_D6 */
3880   {
3881     { "(bad)",  { XX } },
3882     { "(bad)",  { XX } },
3883     { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3884     { "(bad)",  { XX } },
3885   },
3886
3887   /* PREFIX_VEX_D7 */
3888   {
3889     { "(bad)",  { XX } },
3890     { "(bad)",  { XX } },
3891     { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3892     { "(bad)",  { XX } },
3893   },
3894
3895   /* PREFIX_VEX_D8 */
3896   {
3897     { "(bad)",  { XX } },
3898     { "(bad)",  { XX } },
3899     { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3900     { "(bad)",  { XX } },
3901   },
3902
3903   /* PREFIX_VEX_D9 */
3904   {
3905     { "(bad)",  { XX } },
3906     { "(bad)",  { XX } },
3907     { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3908     { "(bad)",  { XX } },
3909   },
3910
3911   /* PREFIX_VEX_DA */
3912   {
3913     { "(bad)",  { XX } },
3914     { "(bad)",  { XX } },
3915     { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3916     { "(bad)",  { XX } },
3917   },
3918
3919   /* PREFIX_VEX_DB */
3920   {
3921     { "(bad)",  { XX } },
3922     { "(bad)",  { XX } },
3923     { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3924     { "(bad)",  { XX } },
3925   },
3926
3927   /* PREFIX_VEX_DC */
3928   {
3929     { "(bad)",  { XX } },
3930     { "(bad)",  { XX } },
3931     { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3932     { "(bad)",  { XX } },
3933   },
3934
3935   /* PREFIX_VEX_DD */
3936   {
3937     { "(bad)",  { XX } },
3938     { "(bad)",  { XX } },
3939     { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3940     { "(bad)",  { XX } },
3941   },
3942
3943   /* PREFIX_VEX_DE */
3944   {
3945     { "(bad)",  { XX } },
3946     { "(bad)",  { XX } },
3947     { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3948     { "(bad)",  { XX } },
3949   },
3950
3951   /* PREFIX_VEX_DF */
3952   {
3953     { "(bad)",  { XX } },
3954     { "(bad)",  { XX } },
3955     { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3956     { "(bad)",  { XX } },
3957   },
3958
3959   /* PREFIX_VEX_E0 */
3960   {
3961     { "(bad)",  { XX } },
3962     { "(bad)",  { XX } },
3963     { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3964     { "(bad)",  { XX } },
3965   },
3966
3967   /* PREFIX_VEX_E1 */
3968   {
3969     { "(bad)",  { XX } },
3970     { "(bad)",  { XX } },
3971     { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3972     { "(bad)",  { XX } },
3973   },
3974
3975   /* PREFIX_VEX_E2 */
3976   {
3977     { "(bad)",  { XX } },
3978     { "(bad)",  { XX } },
3979     { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3980     { "(bad)",  { XX } },
3981   },
3982
3983   /* PREFIX_VEX_E3 */
3984   {
3985     { "(bad)",  { XX } },
3986     { "(bad)",  { XX } },
3987     { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3988     { "(bad)",  { XX } },
3989   },
3990
3991   /* PREFIX_VEX_E4 */
3992   {
3993     { "(bad)",  { XX } },
3994     { "(bad)",  { XX } },
3995     { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
3996     { "(bad)",  { XX } },
3997   },
3998
3999   /* PREFIX_VEX_E5 */
4000   {
4001     { "(bad)",  { XX } },
4002     { "(bad)",  { XX } },
4003     { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4004     { "(bad)",  { XX } },
4005   },
4006
4007   /* PREFIX_VEX_E6 */
4008   {
4009     { "(bad)",  { XX } },
4010     { "vcvtdq2pd", { XM, EXxmmq } },
4011     { "vcvttpd2dq%XY", { XMM, EXx } },
4012     { "vcvtpd2dq%XY", { XMM, EXx } },
4013   },
4014
4015   /* PREFIX_VEX_E7 */
4016   {
4017     { "(bad)",  { XX } },
4018     { "(bad)",  { XX } },
4019     { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4020     { "(bad)",  { XX } },
4021   },
4022
4023   /* PREFIX_VEX_E8 */
4024   {
4025     { "(bad)",  { XX } },
4026     { "(bad)",  { XX } },
4027     { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4028     { "(bad)",  { XX } },
4029   },
4030
4031   /* PREFIX_VEX_E9 */
4032   {
4033     { "(bad)",  { XX } },
4034     { "(bad)",  { XX } },
4035     { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4036     { "(bad)",  { XX } },
4037   },
4038
4039   /* PREFIX_VEX_EA */
4040   {
4041     { "(bad)",  { XX } },
4042     { "(bad)",  { XX } },
4043     { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4044     { "(bad)",  { XX } },
4045   },
4046
4047   /* PREFIX_VEX_EB */
4048   {
4049     { "(bad)",  { XX } },
4050     { "(bad)",  { XX } },
4051     { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4052     { "(bad)",  { XX } },
4053   },
4054
4055   /* PREFIX_VEX_EC */
4056   {
4057     { "(bad)",  { XX } },
4058     { "(bad)",  { XX } },
4059     { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4060     { "(bad)",  { XX } },
4061   },
4062
4063   /* PREFIX_VEX_ED */
4064   {
4065     { "(bad)",  { XX } },
4066     { "(bad)",  { XX } },
4067     { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4068     { "(bad)",  { XX } },
4069   },
4070
4071   /* PREFIX_VEX_EE */
4072   {
4073     { "(bad)",  { XX } },
4074     { "(bad)",  { XX } },
4075     { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4076     { "(bad)",  { XX } },
4077   },
4078
4079   /* PREFIX_VEX_EF */
4080   {
4081     { "(bad)",  { XX } },
4082     { "(bad)",  { XX } },
4083     { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4084     { "(bad)",  { XX } },
4085   },
4086
4087   /* PREFIX_VEX_F0 */
4088   {
4089     { "(bad)",  { XX } },
4090     { "(bad)",  { XX } },
4091     { "(bad)",  { XX } },
4092     { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4093   },
4094
4095   /* PREFIX_VEX_F1 */
4096   {
4097     { "(bad)",  { XX } },
4098     { "(bad)",  { XX } },
4099     { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4100     { "(bad)",  { XX } },
4101   },
4102
4103   /* PREFIX_VEX_F2 */
4104   {
4105     { "(bad)",  { XX } },
4106     { "(bad)",  { XX } },
4107     { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4108     { "(bad)",  { XX } },
4109   },
4110
4111   /* PREFIX_VEX_F3 */
4112   {
4113     { "(bad)",  { XX } },
4114     { "(bad)",  { XX } },
4115     { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4116     { "(bad)",  { XX } },
4117   },
4118
4119   /* PREFIX_VEX_F4 */
4120   {
4121     { "(bad)",  { XX } },
4122     { "(bad)",  { XX } },
4123     { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4124     { "(bad)",  { XX } },
4125   },
4126
4127   /* PREFIX_VEX_F5 */
4128   {
4129     { "(bad)",  { XX } },
4130     { "(bad)",  { XX } },
4131     { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4132     { "(bad)",  { XX } },
4133   },
4134
4135   /* PREFIX_VEX_F6 */
4136   {
4137     { "(bad)",  { XX } },
4138     { "(bad)",  { XX } },
4139     { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4140     { "(bad)",  { XX } },
4141   },
4142
4143   /* PREFIX_VEX_F7 */
4144   {
4145     { "(bad)",  { XX } },
4146     { "(bad)",  { XX } },
4147     { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4148     { "(bad)",  { XX } },
4149   },
4150
4151   /* PREFIX_VEX_F8 */
4152   {
4153     { "(bad)",  { XX } },
4154     { "(bad)",  { XX } },
4155     { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4156     { "(bad)",  { XX } },
4157   },
4158
4159   /* PREFIX_VEX_F9 */
4160   {
4161     { "(bad)",  { XX } },
4162     { "(bad)",  { XX } },
4163     { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4164     { "(bad)",  { XX } },
4165   },
4166
4167   /* PREFIX_VEX_FA */
4168   {
4169     { "(bad)",  { XX } },
4170     { "(bad)",  { XX } },
4171     { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4172     { "(bad)",  { XX } },
4173   },
4174
4175   /* PREFIX_VEX_FB */
4176   {
4177     { "(bad)",  { XX } },
4178     { "(bad)",  { XX } },
4179     { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4180     { "(bad)",  { XX } },
4181   },
4182
4183   /* PREFIX_VEX_FC */
4184   {
4185     { "(bad)",  { XX } },
4186     { "(bad)",  { XX } },
4187     { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4188     { "(bad)",  { XX } },
4189   },
4190
4191   /* PREFIX_VEX_FD */
4192   {
4193     { "(bad)",  { XX } },
4194     { "(bad)",  { XX } },
4195     { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4196     { "(bad)",  { XX } },
4197   },
4198
4199   /* PREFIX_VEX_FE */
4200   {
4201     { "(bad)",  { XX } },
4202     { "(bad)",  { XX } },
4203     { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4204     { "(bad)",  { XX } },
4205   },
4206
4207   /* PREFIX_VEX_3800 */
4208   {
4209     { "(bad)",  { XX } },
4210     { "(bad)",  { XX } },
4211     { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4212     { "(bad)",  { XX } },
4213   },
4214
4215   /* PREFIX_VEX_3801 */
4216   {
4217     { "(bad)",  { XX } },
4218     { "(bad)",  { XX } },
4219     { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4220     { "(bad)",  { XX } },
4221   },
4222
4223   /* PREFIX_VEX_3802 */
4224   {
4225     { "(bad)",  { XX } },
4226     { "(bad)",  { XX } },
4227     { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4228     { "(bad)",  { XX } },
4229   },
4230
4231   /* PREFIX_VEX_3803 */
4232   {
4233     { "(bad)",  { XX } },
4234     { "(bad)",  { XX } },
4235     { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4236     { "(bad)",  { XX } },
4237   },
4238
4239   /* PREFIX_VEX_3804 */
4240   {
4241     { "(bad)",  { XX } },
4242     { "(bad)",  { XX } },
4243     { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4244     { "(bad)",  { XX } },
4245   },
4246
4247   /* PREFIX_VEX_3805 */
4248   {
4249     { "(bad)",  { XX } },
4250     { "(bad)",  { XX } },
4251     { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4252     { "(bad)",  { XX } },
4253   },
4254
4255   /* PREFIX_VEX_3806 */
4256   {
4257     { "(bad)",  { XX } },
4258     { "(bad)",  { XX } },
4259     { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4260     { "(bad)",  { XX } },
4261   },
4262
4263   /* PREFIX_VEX_3807 */
4264   {
4265     { "(bad)",  { XX } },
4266     { "(bad)",  { XX } },
4267     { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4268     { "(bad)",  { XX } },
4269   },
4270
4271   /* PREFIX_VEX_3808 */
4272   {
4273     { "(bad)",  { XX } },
4274     { "(bad)",  { XX } },
4275     { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4276     { "(bad)",  { XX } },
4277   },
4278
4279   /* PREFIX_VEX_3809 */
4280   {
4281     { "(bad)",  { XX } },
4282     { "(bad)",  { XX } },
4283     { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4284     { "(bad)",  { XX } },
4285   },
4286
4287   /* PREFIX_VEX_380A */
4288   {
4289     { "(bad)",  { XX } },
4290     { "(bad)",  { XX } },
4291     { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4292     { "(bad)",  { XX } },
4293   },
4294
4295   /* PREFIX_VEX_380B */
4296   {
4297     { "(bad)",  { XX } },
4298     { "(bad)",  { XX } },
4299     { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4300     { "(bad)",  { XX } },
4301   },
4302
4303   /* PREFIX_VEX_380C */
4304   {
4305     { "(bad)",  { XX } },
4306     { "(bad)",  { XX } },
4307     { "vpermilps", { XM, Vex, EXx } },
4308     { "(bad)",  { XX } },
4309   },
4310
4311   /* PREFIX_VEX_380D */
4312   {
4313     { "(bad)",  { XX } },
4314     { "(bad)",  { XX } },
4315     { "vpermilpd", { XM, Vex, EXx } },
4316     { "(bad)",  { XX } },
4317   },
4318
4319   /* PREFIX_VEX_380E */
4320   {
4321     { "(bad)",  { XX } },
4322     { "(bad)",  { XX } },
4323     { "vtestps", { XM, EXx } },
4324     { "(bad)",  { XX } },
4325   },
4326
4327   /* PREFIX_VEX_380F */
4328   {
4329     { "(bad)",  { XX } },
4330     { "(bad)",  { XX } },
4331     { "vtestpd", { XM, EXx } },
4332     { "(bad)",  { XX } },
4333   },
4334
4335   /* PREFIX_VEX_3817 */
4336   {
4337     { "(bad)",  { XX } },
4338     { "(bad)",  { XX } },
4339     { "vptest", { XM, EXx } },
4340     { "(bad)",  { XX } },
4341   },
4342
4343   /* PREFIX_VEX_3818 */
4344   {
4345     { "(bad)",  { XX } },
4346     { "(bad)",  { XX } },
4347     { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4348     { "(bad)",  { XX } },
4349   },
4350
4351   /* PREFIX_VEX_3819 */
4352   {
4353     { "(bad)",  { XX } },
4354     { "(bad)",  { XX } },
4355     { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4356     { "(bad)",  { XX } },
4357   },
4358
4359   /* PREFIX_VEX_381A */
4360   {
4361     { "(bad)",  { XX } },
4362     { "(bad)",  { XX } },
4363     { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4364     { "(bad)",  { XX } },
4365   },
4366
4367   /* PREFIX_VEX_381C */
4368   {
4369     { "(bad)",  { XX } },
4370     { "(bad)",  { XX } },
4371     { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4372     { "(bad)",  { XX } },
4373   },
4374
4375   /* PREFIX_VEX_381D */
4376   {
4377     { "(bad)",  { XX } },
4378     { "(bad)",  { XX } },
4379     { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4380     { "(bad)",  { XX } },
4381   },
4382
4383   /* PREFIX_VEX_381E */
4384   {
4385     { "(bad)",  { XX } },
4386     { "(bad)",  { XX } },
4387     { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4388     { "(bad)",  { XX } },
4389   },
4390
4391   /* PREFIX_VEX_3820 */
4392   {
4393     { "(bad)",  { XX } },
4394     { "(bad)",  { XX } },
4395     { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4396     { "(bad)",  { XX } },
4397   },
4398
4399   /* PREFIX_VEX_3821 */
4400   {
4401     { "(bad)",  { XX } },
4402     { "(bad)",  { XX } },
4403     { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4404     { "(bad)",  { XX } },
4405   },
4406
4407   /* PREFIX_VEX_3822 */
4408   {
4409     { "(bad)",  { XX } },
4410     { "(bad)",  { XX } },
4411     { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4412     { "(bad)",  { XX } },
4413   },
4414
4415   /* PREFIX_VEX_3823 */
4416   {
4417     { "(bad)",  { XX } },
4418     { "(bad)",  { XX } },
4419     { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4420     { "(bad)",  { XX } },
4421   },
4422
4423   /* PREFIX_VEX_3824 */
4424   {
4425     { "(bad)",  { XX } },
4426     { "(bad)",  { XX } },
4427     { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4428     { "(bad)",  { XX } },
4429   },
4430
4431   /* PREFIX_VEX_3825 */
4432   {
4433     { "(bad)",  { XX } },
4434     { "(bad)",  { XX } },
4435     { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4436     { "(bad)",  { XX } },
4437   },
4438
4439   /* PREFIX_VEX_3828 */
4440   {
4441     { "(bad)",  { XX } },
4442     { "(bad)",  { XX } },
4443     { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4444     { "(bad)",  { XX } },
4445   },
4446
4447   /* PREFIX_VEX_3829 */
4448   {
4449     { "(bad)",  { XX } },
4450     { "(bad)",  { XX } },
4451     { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4452     { "(bad)",  { XX } },
4453   },
4454
4455   /* PREFIX_VEX_382A */
4456   {
4457     { "(bad)",  { XX } },
4458     { "(bad)",  { XX } },
4459     { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4460     { "(bad)",  { XX } },
4461   },
4462
4463   /* PREFIX_VEX_382B */
4464   {
4465     { "(bad)",  { XX } },
4466     { "(bad)",  { XX } },
4467     { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4468     { "(bad)",  { XX } },
4469   },
4470
4471   /* PREFIX_VEX_382C */
4472   {
4473     { "(bad)",  { XX } },
4474     { "(bad)",  { XX } },
4475      { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4476     { "(bad)",  { XX } },
4477   },
4478
4479   /* PREFIX_VEX_382D */
4480   {
4481     { "(bad)",  { XX } },
4482     { "(bad)",  { XX } },
4483      { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4484     { "(bad)",  { XX } },
4485   },
4486
4487   /* PREFIX_VEX_382E */
4488   {
4489     { "(bad)",  { XX } },
4490     { "(bad)",  { XX } },
4491      { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4492     { "(bad)",  { XX } },
4493   },
4494
4495   /* PREFIX_VEX_382F */
4496   {
4497     { "(bad)",  { XX } },
4498     { "(bad)",  { XX } },
4499      { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4500     { "(bad)",  { XX } },
4501   },
4502
4503   /* PREFIX_VEX_3830 */
4504   {
4505     { "(bad)",  { XX } },
4506     { "(bad)",  { XX } },
4507     { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4508     { "(bad)",  { XX } },
4509   },
4510
4511   /* PREFIX_VEX_3831 */
4512   {
4513     { "(bad)",  { XX } },
4514     { "(bad)",  { XX } },
4515     { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4516     { "(bad)",  { XX } },
4517   },
4518
4519   /* PREFIX_VEX_3832 */
4520   {
4521     { "(bad)",  { XX } },
4522     { "(bad)",  { XX } },
4523     { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4524     { "(bad)",  { XX } },
4525   },
4526
4527   /* PREFIX_VEX_3833 */
4528   {
4529     { "(bad)",  { XX } },
4530     { "(bad)",  { XX } },
4531     { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4532     { "(bad)",  { XX } },
4533   },
4534
4535   /* PREFIX_VEX_3834 */
4536   {
4537     { "(bad)",  { XX } },
4538     { "(bad)",  { XX } },
4539     { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4540     { "(bad)",  { XX } },
4541   },
4542
4543   /* PREFIX_VEX_3835 */
4544   {
4545     { "(bad)",  { XX } },
4546     { "(bad)",  { XX } },
4547     { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4548     { "(bad)",  { XX } },
4549   },
4550
4551   /* PREFIX_VEX_3837 */
4552   {
4553     { "(bad)",  { XX } },
4554     { "(bad)",  { XX } },
4555     { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4556     { "(bad)",  { XX } },
4557   },
4558
4559   /* PREFIX_VEX_3838 */
4560   {
4561     { "(bad)",  { XX } },
4562     { "(bad)",  { XX } },
4563     { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4564     { "(bad)",  { XX } },
4565   },
4566
4567   /* PREFIX_VEX_3839 */
4568   {
4569     { "(bad)",  { XX } },
4570     { "(bad)",  { XX } },
4571     { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4572     { "(bad)",  { XX } },
4573   },
4574
4575   /* PREFIX_VEX_383A */
4576   {
4577     { "(bad)",  { XX } },
4578     { "(bad)",  { XX } },
4579     { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4580     { "(bad)",  { XX } },
4581   },
4582
4583   /* PREFIX_VEX_383B */
4584   {
4585     { "(bad)",  { XX } },
4586     { "(bad)",  { XX } },
4587     { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4588     { "(bad)",  { XX } },
4589   },
4590
4591   /* PREFIX_VEX_383C */
4592   {
4593     { "(bad)",  { XX } },
4594     { "(bad)",  { XX } },
4595     { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4596     { "(bad)",  { XX } },
4597   },
4598
4599   /* PREFIX_VEX_383D */
4600   {
4601     { "(bad)",  { XX } },
4602     { "(bad)",  { XX } },
4603     { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4604     { "(bad)",  { XX } },
4605   },
4606
4607   /* PREFIX_VEX_383E */
4608   {
4609     { "(bad)",  { XX } },
4610     { "(bad)",  { XX } },
4611     { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4612     { "(bad)",  { XX } },
4613   },
4614
4615   /* PREFIX_VEX_383F */
4616   {
4617     { "(bad)",  { XX } },
4618     { "(bad)",  { XX } },
4619     { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4620     { "(bad)",  { XX } },
4621   },
4622
4623   /* PREFIX_VEX_3840 */
4624   {
4625     { "(bad)",  { XX } },
4626     { "(bad)",  { XX } },
4627     { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4628     { "(bad)",  { XX } },
4629   },
4630
4631   /* PREFIX_VEX_3841 */
4632   {
4633     { "(bad)",  { XX } },
4634     { "(bad)",  { XX } },
4635     { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4636     { "(bad)",  { XX } },
4637   },
4638
4639   /* PREFIX_VEX_3896 */
4640   {
4641     { "(bad)",  { XX } },
4642     { "(bad)",  { XX } },
4643     { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4644     { "(bad)",  { XX } },
4645   },
4646
4647   /* PREFIX_VEX_3897 */
4648   {
4649     { "(bad)",  { XX } },
4650     { "(bad)",  { XX } },
4651     { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4652     { "(bad)",  { XX } },
4653   },
4654
4655   /* PREFIX_VEX_3898 */
4656   {
4657     { "(bad)",  { XX } },
4658     { "(bad)",  { XX } },
4659     { "vfmadd132p%XW", { XM, Vex, EXx } },
4660     { "(bad)",  { XX } },
4661   },
4662
4663   /* PREFIX_VEX_3899 */
4664   {
4665     { "(bad)",  { XX } },
4666     { "(bad)",  { XX } },
4667     { "vfmadd132s%XW", { XM, Vex, EXVexWdq } },
4668     { "(bad)",  { XX } },
4669   },
4670
4671   /* PREFIX_VEX_389A */
4672   {
4673     { "(bad)",  { XX } },
4674     { "(bad)",  { XX } },
4675     { "vfmsub132p%XW", { XM, Vex, EXx } },
4676     { "(bad)",  { XX } },
4677   },
4678
4679   /* PREFIX_VEX_389B */
4680   {
4681     { "(bad)",  { XX } },
4682     { "(bad)",  { XX } },
4683     { "vfmsub132s%XW", { XM, Vex, EXVexWdq } },
4684     { "(bad)",  { XX } },
4685   },
4686
4687   /* PREFIX_VEX_389C */
4688   {
4689     { "(bad)",  { XX } },
4690     { "(bad)",  { XX } },
4691     { "vfnmadd132p%XW", { XM, Vex, EXx } },
4692     { "(bad)",  { XX } },
4693   },
4694
4695   /* PREFIX_VEX_389D */
4696   {
4697     { "(bad)",  { XX } },
4698     { "(bad)",  { XX } },
4699     { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } },
4700     { "(bad)",  { XX } },
4701   },
4702
4703   /* PREFIX_VEX_389E */
4704   {
4705     { "(bad)",  { XX } },
4706     { "(bad)",  { XX } },
4707     { "vfnmsub132p%XW", { XM, Vex, EXx } },
4708     { "(bad)",  { XX } },
4709   },
4710
4711   /* PREFIX_VEX_389F */
4712   {
4713     { "(bad)",  { XX } },
4714     { "(bad)",  { XX } },
4715     { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } },
4716     { "(bad)",  { XX } },
4717   },
4718
4719   /* PREFIX_VEX_38A6 */
4720   {
4721     { "(bad)",  { XX } },
4722     { "(bad)",  { XX } },
4723     { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4724     { "(bad)",  { XX } },
4725   },
4726
4727   /* PREFIX_VEX_38A7 */
4728   {
4729     { "(bad)",  { XX } },
4730     { "(bad)",  { XX } },
4731     { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4732     { "(bad)",  { XX } },
4733   },
4734
4735   /* PREFIX_VEX_38A8 */
4736   {
4737     { "(bad)",  { XX } },
4738     { "(bad)",  { XX } },
4739     { "vfmadd213p%XW", { XM, Vex, EXx } },
4740     { "(bad)",  { XX } },
4741   },
4742
4743   /* PREFIX_VEX_38A9 */
4744   {
4745     { "(bad)",  { XX } },
4746     { "(bad)",  { XX } },
4747     { "vfmadd213s%XW", { XM, Vex, EXVexWdq } },
4748     { "(bad)",  { XX } },
4749   },
4750
4751   /* PREFIX_VEX_38AA */
4752   {
4753     { "(bad)",  { XX } },
4754     { "(bad)",  { XX } },
4755     { "vfmsub213p%XW", { XM, Vex, EXx } },
4756     { "(bad)",  { XX } },
4757   },
4758
4759   /* PREFIX_VEX_38AB */
4760   {
4761     { "(bad)",  { XX } },
4762     { "(bad)",  { XX } },
4763     { "vfmsub213s%XW", { XM, Vex, EXVexWdq } },
4764     { "(bad)",  { XX } },
4765   },
4766
4767   /* PREFIX_VEX_38AC */
4768   {
4769     { "(bad)",  { XX } },
4770     { "(bad)",  { XX } },
4771     { "vfnmadd213p%XW", { XM, Vex, EXx } },
4772     { "(bad)",  { XX } },
4773   },
4774
4775   /* PREFIX_VEX_38AD */
4776   {
4777     { "(bad)",  { XX } },
4778     { "(bad)",  { XX } },
4779     { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } },
4780     { "(bad)",  { XX } },
4781   },
4782
4783   /* PREFIX_VEX_38AE */
4784   {
4785     { "(bad)",  { XX } },
4786     { "(bad)",  { XX } },
4787     { "vfnmsub213p%XW", { XM, Vex, EXx } },
4788     { "(bad)",  { XX } },
4789   },
4790
4791   /* PREFIX_VEX_38AF */
4792   {
4793     { "(bad)",  { XX } },
4794     { "(bad)",  { XX } },
4795     { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } },
4796     { "(bad)",  { XX } },
4797   },
4798
4799   /* PREFIX_VEX_38B6 */
4800   {
4801     { "(bad)",  { XX } },
4802     { "(bad)",  { XX } },
4803     { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4804     { "(bad)",  { XX } },
4805   },
4806
4807   /* PREFIX_VEX_38B7 */
4808   {
4809     { "(bad)",  { XX } },
4810     { "(bad)",  { XX } },
4811     { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4812     { "(bad)",  { XX } },
4813   },
4814
4815   /* PREFIX_VEX_38B8 */
4816   {
4817     { "(bad)",  { XX } },
4818     { "(bad)",  { XX } },
4819     { "vfmadd231p%XW", { XM, Vex, EXx } },
4820     { "(bad)",  { XX } },
4821   },
4822
4823   /* PREFIX_VEX_38B9 */
4824   {
4825     { "(bad)",  { XX } },
4826     { "(bad)",  { XX } },
4827     { "vfmadd231s%XW", { XM, Vex, EXVexWdq } },
4828     { "(bad)",  { XX } },
4829   },
4830
4831   /* PREFIX_VEX_38BA */
4832   {
4833     { "(bad)",  { XX } },
4834     { "(bad)",  { XX } },
4835     { "vfmsub231p%XW", { XM, Vex, EXx } },
4836     { "(bad)",  { XX } },
4837   },
4838
4839   /* PREFIX_VEX_38BB */
4840   {
4841     { "(bad)",  { XX } },
4842     { "(bad)",  { XX } },
4843     { "vfmsub231s%XW", { XM, Vex, EXVexWdq } },
4844     { "(bad)",  { XX } },
4845   },
4846
4847   /* PREFIX_VEX_38BC */
4848   {
4849     { "(bad)",  { XX } },
4850     { "(bad)",  { XX } },
4851     { "vfnmadd231p%XW", { XM, Vex, EXx } },
4852     { "(bad)",  { XX } },
4853   },
4854
4855   /* PREFIX_VEX_38BD */
4856   {
4857     { "(bad)",  { XX } },
4858     { "(bad)",  { XX } },
4859     { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } },
4860     { "(bad)",  { XX } },
4861   },
4862
4863   /* PREFIX_VEX_38BE */
4864   {
4865     { "(bad)",  { XX } },
4866     { "(bad)",  { XX } },
4867     { "vfnmsub231p%XW", { XM, Vex, EXx } },
4868     { "(bad)",  { XX } },
4869   },
4870
4871   /* PREFIX_VEX_38BF */
4872   {
4873     { "(bad)",  { XX } },
4874     { "(bad)",  { XX } },
4875     { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } },
4876     { "(bad)",  { XX } },
4877   },
4878
4879   /* PREFIX_VEX_38DB */
4880   {
4881     { "(bad)",  { XX } },
4882     { "(bad)",  { XX } },
4883     { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4884     { "(bad)",  { XX } },
4885   },
4886
4887   /* PREFIX_VEX_38DC */
4888   {
4889     { "(bad)",  { XX } },
4890     { "(bad)",  { XX } },
4891     { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4892     { "(bad)",  { XX } },
4893   },
4894
4895   /* PREFIX_VEX_38DD */
4896   {
4897     { "(bad)",  { XX } },
4898     { "(bad)",  { XX } },
4899     { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4900     { "(bad)",  { XX } },
4901   },
4902
4903   /* PREFIX_VEX_38DE */
4904   {
4905     { "(bad)",  { XX } },
4906     { "(bad)",  { XX } },
4907     { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4908     { "(bad)",  { XX } },
4909   },
4910
4911   /* PREFIX_VEX_38DF */
4912   {
4913     { "(bad)",  { XX } },
4914     { "(bad)",  { XX } },
4915     { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4916     { "(bad)",  { XX } },
4917   },
4918
4919   /* PREFIX_VEX_3A04 */
4920   {
4921     { "(bad)",  { XX } },
4922     { "(bad)",  { XX } },
4923     { "vpermilps", { XM, EXx, Ib } },
4924     { "(bad)",  { XX } },
4925   },
4926
4927   /* PREFIX_VEX_3A05 */
4928   {
4929     { "(bad)",  { XX } },
4930     { "(bad)",  { XX } },
4931     { "vpermilpd", { XM, EXx, Ib } },
4932     { "(bad)",  { XX } },
4933   },
4934
4935   /* PREFIX_VEX_3A06 */
4936   {
4937     { "(bad)",  { XX } },
4938     { "(bad)",  { XX } },
4939     { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4940     { "(bad)",  { XX } },
4941   },
4942
4943   /* PREFIX_VEX_3A08 */
4944   {
4945     { "(bad)",  { XX } },
4946     { "(bad)",  { XX } },
4947     { "vroundps", { XM, EXx, Ib } },
4948     { "(bad)",  { XX } },
4949   },
4950
4951   /* PREFIX_VEX_3A09 */
4952   {
4953     { "(bad)",  { XX } },
4954     { "(bad)",  { XX } },
4955     { "vroundpd", { XM, EXx, Ib } },
4956     { "(bad)",  { XX } },
4957   },
4958
4959   /* PREFIX_VEX_3A0A */
4960   {
4961     { "(bad)",  { XX } },
4962     { "(bad)",  { XX } },
4963     { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4964     { "(bad)",  { XX } },
4965   },
4966
4967   /* PREFIX_VEX_3A0B */
4968   {
4969     { "(bad)",  { XX } },
4970     { "(bad)",  { XX } },
4971     { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4972     { "(bad)",  { XX } },
4973   },
4974
4975   /* PREFIX_VEX_3A0C */
4976   {
4977     { "(bad)",  { XX } },
4978     { "(bad)",  { XX } },
4979     { "vblendps", { XM, Vex, EXx, Ib } },
4980     { "(bad)",  { XX } },
4981   },
4982
4983   /* PREFIX_VEX_3A0D */
4984   {
4985     { "(bad)",  { XX } },
4986     { "(bad)",  { XX } },
4987     { "vblendpd", { XM, Vex, EXx, Ib } },
4988     { "(bad)",  { XX } },
4989   },
4990
4991   /* PREFIX_VEX_3A0E */
4992   {
4993     { "(bad)",  { XX } },
4994     { "(bad)",  { XX } },
4995     { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4996     { "(bad)",  { XX } },
4997   },
4998
4999   /* PREFIX_VEX_3A0F */
5000   {
5001     { "(bad)",  { XX } },
5002     { "(bad)",  { XX } },
5003     { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5004     { "(bad)",  { XX } },
5005   },
5006
5007   /* PREFIX_VEX_3A14 */
5008   {
5009     { "(bad)",  { XX } },
5010     { "(bad)",  { XX } },
5011     { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5012     { "(bad)",  { XX } },
5013   },
5014
5015   /* PREFIX_VEX_3A15 */
5016   {
5017     { "(bad)",  { XX } },
5018     { "(bad)",  { XX } },
5019     { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5020     { "(bad)",  { XX } },
5021   },
5022
5023   /* PREFIX_VEX_3A16 */
5024   {
5025     { "(bad)",  { XX } },
5026     { "(bad)",  { XX } },
5027     { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
5028     { "(bad)",  { XX } },
5029   },
5030
5031   /* PREFIX_VEX_3A17 */
5032   {
5033     { "(bad)",  { XX } },
5034     { "(bad)",  { XX } },
5035     { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
5036     { "(bad)",  { XX } },
5037   },
5038
5039   /* PREFIX_VEX_3A18 */
5040   {
5041     { "(bad)",  { XX } },
5042     { "(bad)",  { XX } },
5043     { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
5044     { "(bad)",  { XX } },
5045   },
5046
5047   /* PREFIX_VEX_3A19 */
5048   {
5049     { "(bad)",  { XX } },
5050     { "(bad)",  { XX } },
5051     { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
5052     { "(bad)",  { XX } },
5053   },
5054
5055   /* PREFIX_VEX_3A20 */
5056   {
5057     { "(bad)",  { XX } },
5058     { "(bad)",  { XX } },
5059     { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
5060     { "(bad)",  { XX } },
5061   },
5062
5063   /* PREFIX_VEX_3A21 */
5064   {
5065     { "(bad)",  { XX } },
5066     { "(bad)",  { XX } },
5067     { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
5068     { "(bad)",  { XX } },
5069   },
5070
5071   /* PREFIX_VEX_3A22 */
5072   {
5073     { "(bad)",  { XX } },
5074     { "(bad)",  { XX } },
5075     { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5076     { "(bad)",  { XX } },
5077   },
5078
5079   /* PREFIX_VEX_3A40 */
5080   {
5081     { "(bad)",  { XX } },
5082     { "(bad)",  { XX } },
5083     { "vdpps",  { XM, Vex, EXx, Ib } },
5084     { "(bad)",  { XX } },
5085   },
5086
5087   /* PREFIX_VEX_3A41 */
5088   {
5089     { "(bad)",  { XX } },
5090     { "(bad)",  { XX } },
5091     { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5092     { "(bad)",  { XX } },
5093   },
5094
5095   /* PREFIX_VEX_3A42 */
5096   {
5097     { "(bad)",  { XX } },
5098     { "(bad)",  { XX } },
5099     { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5100     { "(bad)",  { XX } },
5101   },
5102
5103   /* PREFIX_VEX_3A44 */
5104   {
5105     { "(bad)",  { XX } },
5106     { "(bad)",  { XX } },
5107     { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5108     { "(bad)",  { XX } },
5109   },
5110
5111   /* PREFIX_VEX_3A4A */
5112   {
5113     { "(bad)",  { XX } },
5114     { "(bad)",  { XX } },
5115     { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
5116     { "(bad)",  { XX } },
5117   },
5118
5119   /* PREFIX_VEX_3A4B */
5120   {
5121     { "(bad)",  { XX } },
5122     { "(bad)",  { XX } },
5123     { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
5124     { "(bad)",  { XX } },
5125   },
5126
5127   /* PREFIX_VEX_3A4C */
5128   {
5129     { "(bad)",  { XX } },
5130     { "(bad)",  { XX } },
5131     { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5132     { "(bad)",  { XX } },
5133   },
5134
5135   /* PREFIX_VEX_3A5C */
5136   {
5137     { "(bad)",  { XX } },
5138     { "(bad)",  { XX } },
5139     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5140     { "(bad)",  { XX } },
5141   },
5142
5143   /* PREFIX_VEX_3A5D */
5144   {
5145     { "(bad)",  { XX } },
5146     { "(bad)",  { XX } },
5147     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5148     { "(bad)",  { XX } },
5149   },
5150
5151   /* PREFIX_VEX_3A5E */
5152   {
5153     { "(bad)",  { XX } },
5154     { "(bad)",  { XX } },
5155     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5156     { "(bad)",  { XX } },
5157   },
5158
5159   /* PREFIX_VEX_3A5F */
5160   {
5161     { "(bad)",  { XX } },
5162     { "(bad)",  { XX } },
5163     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5164     { "(bad)",  { XX } },
5165   },
5166
5167   /* PREFIX_VEX_3A60 */
5168   {
5169     { "(bad)",  { XX } },
5170     { "(bad)",  { XX } },
5171     { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5172     { "(bad)",  { XX } },
5173   },
5174
5175   /* PREFIX_VEX_3A61 */
5176   {
5177     { "(bad)",  { XX } },
5178     { "(bad)",  { XX } },
5179     { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5180     { "(bad)",  { XX } },
5181   },
5182
5183   /* PREFIX_VEX_3A62 */
5184   {
5185     { "(bad)",  { XX } },
5186     { "(bad)",  { XX } },
5187     { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5188     { "(bad)",  { XX } },
5189   },
5190
5191   /* PREFIX_VEX_3A63 */
5192   {
5193     { "(bad)",  { XX } },
5194     { "(bad)",  { XX } },
5195     { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5196     { "(bad)",  { XX } },
5197   },
5198
5199   /* PREFIX_VEX_3A68 */
5200   {
5201     { "(bad)",  { XX } },
5202     { "(bad)",  { XX } },
5203     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5204     { "(bad)",  { XX } },
5205   },
5206
5207   /* PREFIX_VEX_3A69 */
5208   {
5209     { "(bad)",  { XX } },
5210     { "(bad)",  { XX } },
5211     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5212     { "(bad)",  { XX } },
5213   },
5214
5215   /* PREFIX_VEX_3A6A */
5216   {
5217     { "(bad)",  { XX } },
5218     { "(bad)",  { XX } },
5219     { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5220     { "(bad)",  { XX } },
5221   },
5222
5223   /* PREFIX_VEX_3A6B */
5224   {
5225     { "(bad)",  { XX } },
5226     { "(bad)",  { XX } },
5227     { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5228     { "(bad)",  { XX } },
5229   },
5230
5231   /* PREFIX_VEX_3A6C */
5232   {
5233     { "(bad)",  { XX } },
5234     { "(bad)",  { XX } },
5235     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5236     { "(bad)",  { XX } },
5237   },
5238
5239   /* PREFIX_VEX_3A6D */
5240   {
5241     { "(bad)",  { XX } },
5242     { "(bad)",  { XX } },
5243     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5244     { "(bad)",  { XX } },
5245   },
5246
5247   /* PREFIX_VEX_3A6E */
5248   {
5249     { "(bad)",  { XX } },
5250     { "(bad)",  { XX } },
5251     { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5252     { "(bad)",  { XX } },
5253   },
5254
5255   /* PREFIX_VEX_3A6F */
5256   {
5257     { "(bad)",  { XX } },
5258     { "(bad)",  { XX } },
5259     { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5260     { "(bad)",  { XX } },
5261   },
5262
5263   /* PREFIX_VEX_3A78 */
5264   {
5265     { "(bad)",  { XX } },
5266     { "(bad)",  { XX } },
5267     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5268     { "(bad)",  { XX } },
5269   },
5270
5271   /* PREFIX_VEX_3A79 */
5272   {
5273     { "(bad)",  { XX } },
5274     { "(bad)",  { XX } },
5275     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5276     { "(bad)",  { XX } },
5277   },
5278
5279   /* PREFIX_VEX_3A7A */
5280   {
5281     { "(bad)",  { XX } },
5282     { "(bad)",  { XX } },
5283     { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5284     { "(bad)",  { XX } },
5285   },
5286
5287   /* PREFIX_VEX_3A7B */
5288   {
5289     { "(bad)",  { XX } },
5290     { "(bad)",  { XX } },
5291     { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5292     { "(bad)",  { XX } },
5293   },
5294
5295   /* PREFIX_VEX_3A7C */
5296   {
5297     { "(bad)",  { XX } },
5298     { "(bad)",  { XX } },
5299     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5300     { "(bad)",  { XX } },
5301   },
5302
5303   /* PREFIX_VEX_3A7D */
5304   {
5305     { "(bad)",  { XX } },
5306     { "(bad)",  { XX } },
5307     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5308     { "(bad)",  { XX } },
5309   },
5310
5311   /* PREFIX_VEX_3A7E */
5312   {
5313     { "(bad)",  { XX } },
5314     { "(bad)",  { XX } },
5315     { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5316     { "(bad)",  { XX } },
5317   },
5318
5319   /* PREFIX_VEX_3A7F */
5320   {
5321     { "(bad)",  { XX } },
5322     { "(bad)",  { XX } },
5323     { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5324     { "(bad)",  { XX } },
5325   },
5326
5327   /* PREFIX_VEX_3ADF */
5328   {
5329     { "(bad)",  { XX } },
5330     { "(bad)",  { XX } },
5331     { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5332     { "(bad)",  { XX } },
5333   },
5334 };
5335
5336 static const struct dis386 x86_64_table[][2] = {
5337   /* X86_64_06 */
5338   {
5339     { "push{T|}", { es } },
5340     { "(bad)", { XX } },
5341   },
5342
5343   /* X86_64_07 */
5344   {
5345     { "pop{T|}", { es } },
5346     { "(bad)", { XX } },
5347   },
5348
5349   /* X86_64_0D */
5350   {
5351     { "push{T|}", { cs } },
5352     { "(bad)", { XX } },
5353   },
5354
5355   /* X86_64_16 */
5356   {
5357     { "push{T|}", { ss } },
5358     { "(bad)", { XX } },
5359   },
5360
5361   /* X86_64_17 */
5362   {
5363     { "pop{T|}", { ss } },
5364     { "(bad)", { XX } },
5365   },
5366
5367   /* X86_64_1E */
5368   {
5369     { "push{T|}", { ds } },
5370     { "(bad)", { XX } },
5371   },
5372
5373   /* X86_64_1F */
5374   {
5375     { "pop{T|}", { ds } },
5376     { "(bad)", { XX } },
5377   },
5378
5379   /* X86_64_27 */
5380   {
5381     { "daa", { XX } },
5382     { "(bad)", { XX } },
5383   },
5384
5385   /* X86_64_2F */
5386   {
5387     { "das", { XX } },
5388     { "(bad)", { XX } },
5389   },
5390
5391   /* X86_64_37 */
5392   {
5393     { "aaa", { XX } },
5394     { "(bad)", { XX } },
5395   },
5396
5397   /* X86_64_3F */
5398   {
5399     { "aas", { XX } },
5400     { "(bad)", { XX } },
5401   },
5402
5403   /* X86_64_60 */
5404   {
5405     { "pusha{P|}", { XX } },
5406     { "(bad)", { XX } },
5407   },
5408
5409   /* X86_64_61 */
5410   {
5411     { "popa{P|}", { XX } },
5412     { "(bad)", { XX } },
5413   },
5414
5415   /* X86_64_62 */
5416   {
5417     { MOD_TABLE (MOD_62_32BIT) },
5418     { "(bad)", { XX } },
5419   },
5420
5421   /* X86_64_63 */
5422   {
5423     { "arpl", { Ew, Gw } },
5424     { "movs{lq|xd}", { Gv, Ed } },
5425   },
5426
5427   /* X86_64_6D */
5428   {
5429     { "ins{R|}", { Yzr, indirDX } },
5430     { "ins{G|}", { Yzr, indirDX } },
5431   },
5432
5433   /* X86_64_6F */
5434   {
5435     { "outs{R|}", { indirDXr, Xz } },
5436     { "outs{G|}", { indirDXr, Xz } },
5437   },
5438
5439   /* X86_64_9A */
5440   {
5441     { "Jcall{T|}", { Ap } },
5442     { "(bad)", { XX } },
5443   },
5444
5445   /* X86_64_C4 */
5446   {
5447     { MOD_TABLE (MOD_C4_32BIT) },
5448     { VEX_C4_TABLE (VEX_0F) },
5449   },
5450
5451   /* X86_64_C5 */
5452   {
5453     { MOD_TABLE (MOD_C5_32BIT) },
5454     { VEX_C5_TABLE (VEX_0F) },
5455   },
5456
5457   /* X86_64_CE */
5458   {
5459     { "into", { XX } },
5460     { "(bad)", { XX } },
5461   },
5462
5463   /* X86_64_D4 */
5464   {
5465     { "aam", { sIb } },
5466     { "(bad)", { XX } },
5467   },
5468
5469   /* X86_64_D5 */
5470   {
5471     { "aad", { sIb } },
5472     { "(bad)", { XX } },
5473   },
5474
5475   /* X86_64_EA */
5476   {
5477     { "Jjmp{T|}", { Ap } },
5478     { "(bad)", { XX } },
5479   },
5480
5481   /* X86_64_0F01_REG_0 */
5482   {
5483     { "sgdt{Q|IQ}", { M } },
5484     { "sgdt", { M } },
5485   },
5486
5487   /* X86_64_0F01_REG_1 */
5488   {
5489     { "sidt{Q|IQ}", { M } },
5490     { "sidt", { M } },
5491   },
5492
5493   /* X86_64_0F01_REG_2 */
5494   {
5495     { "lgdt{Q|Q}", { M } },
5496     { "lgdt", { M } },
5497   },
5498
5499   /* X86_64_0F01_REG_3 */
5500   {
5501     { "lidt{Q|Q}", { M } },
5502     { "lidt", { M } },
5503   },
5504 };
5505
5506 static const struct dis386 three_byte_table[][256] = {
5507
5508   /* THREE_BYTE_0F38 */
5509   {
5510     /* 00 */
5511     { "pshufb",         { MX, EM } },
5512     { "phaddw",         { MX, EM } },
5513     { "phaddd",         { MX, EM } },
5514     { "phaddsw",        { MX, EM } },
5515     { "pmaddubsw",      { MX, EM } },
5516     { "phsubw",         { MX, EM } },
5517     { "phsubd",         { MX, EM } },
5518     { "phsubsw",        { MX, EM } },
5519     /* 08 */
5520     { "psignb",         { MX, EM } },
5521     { "psignw",         { MX, EM } },
5522     { "psignd",         { MX, EM } },
5523     { "pmulhrsw",       { MX, EM } },
5524     { "(bad)",          { XX } },
5525     { "(bad)",          { XX } },
5526     { "(bad)",          { XX } },
5527     { "(bad)",          { XX } },
5528     /* 10 */
5529     { PREFIX_TABLE (PREFIX_0F3810) },
5530     { "(bad)",          { XX } },
5531     { "(bad)",          { XX } },
5532     { "(bad)",          { XX } },
5533     { PREFIX_TABLE (PREFIX_0F3814) },
5534     { PREFIX_TABLE (PREFIX_0F3815) },
5535     { "(bad)",          { XX } },
5536     { PREFIX_TABLE (PREFIX_0F3817) },
5537     /* 18 */
5538     { "(bad)",          { XX } },
5539     { "(bad)",          { XX } },
5540     { "(bad)",          { XX } },
5541     { "(bad)",          { XX } },
5542     { "pabsb",          { MX, EM } },
5543     { "pabsw",          { MX, EM } },
5544     { "pabsd",          { MX, EM } },
5545     { "(bad)",          { XX } },
5546     /* 20 */
5547     { PREFIX_TABLE (PREFIX_0F3820) },
5548     { PREFIX_TABLE (PREFIX_0F3821) },
5549     { PREFIX_TABLE (PREFIX_0F3822) },
5550     { PREFIX_TABLE (PREFIX_0F3823) },
5551     { PREFIX_TABLE (PREFIX_0F3824) },
5552     { PREFIX_TABLE (PREFIX_0F3825) },
5553     { "(bad)",          { XX } },
5554     { "(bad)",          { XX } },
5555     /* 28 */
5556     { PREFIX_TABLE (PREFIX_0F3828) },
5557     { PREFIX_TABLE (PREFIX_0F3829) },
5558     { PREFIX_TABLE (PREFIX_0F382A) },
5559     { PREFIX_TABLE (PREFIX_0F382B) },
5560     { "(bad)",          { XX } },
5561     { "(bad)",          { XX } },
5562     { "(bad)",          { XX } },
5563     { "(bad)",          { XX } },
5564     /* 30 */
5565     { PREFIX_TABLE (PREFIX_0F3830) },
5566     { PREFIX_TABLE (PREFIX_0F3831) },
5567     { PREFIX_TABLE (PREFIX_0F3832) },
5568     { PREFIX_TABLE (PREFIX_0F3833) },
5569     { PREFIX_TABLE (PREFIX_0F3834) },
5570     { PREFIX_TABLE (PREFIX_0F3835) },
5571     { "(bad)",          { XX } },
5572     { PREFIX_TABLE (PREFIX_0F3837) },
5573     /* 38 */
5574     { PREFIX_TABLE (PREFIX_0F3838) },
5575     { PREFIX_TABLE (PREFIX_0F3839) },
5576     { PREFIX_TABLE (PREFIX_0F383A) },
5577     { PREFIX_TABLE (PREFIX_0F383B) },
5578     { PREFIX_TABLE (PREFIX_0F383C) },
5579     { PREFIX_TABLE (PREFIX_0F383D) },
5580     { PREFIX_TABLE (PREFIX_0F383E) },
5581     { PREFIX_TABLE (PREFIX_0F383F) },
5582     /* 40 */
5583     { PREFIX_TABLE (PREFIX_0F3840) },
5584     { PREFIX_TABLE (PREFIX_0F3841) },
5585     { "(bad)",          { XX } },
5586     { "(bad)",          { XX } },
5587     { "(bad)",          { XX } },
5588     { "(bad)",          { XX } },
5589     { "(bad)",          { XX } },
5590     { "(bad)",          { XX } },
5591     /* 48 */
5592     { "(bad)",          { XX } },
5593     { "(bad)",          { XX } },
5594     { "(bad)",          { XX } },
5595     { "(bad)",          { XX } },
5596     { "(bad)",          { XX } },
5597     { "(bad)",          { XX } },
5598     { "(bad)",          { XX } },
5599     { "(bad)",          { XX } },
5600     /* 50 */
5601     { "(bad)",          { XX } },
5602     { "(bad)",          { XX } },
5603     { "(bad)",          { XX } },
5604     { "(bad)",          { XX } },
5605     { "(bad)",          { XX } },
5606     { "(bad)",          { XX } },
5607     { "(bad)",          { XX } },
5608     { "(bad)",          { XX } },
5609     /* 58 */
5610     { "(bad)",          { XX } },
5611     { "(bad)",          { XX } },
5612     { "(bad)",          { XX } },
5613     { "(bad)",          { XX } },
5614     { "(bad)",          { XX } },
5615     { "(bad)",          { XX } },
5616     { "(bad)",          { XX } },
5617     { "(bad)",          { XX } },
5618     /* 60 */
5619     { "(bad)",          { XX } },
5620     { "(bad)",          { XX } },
5621     { "(bad)",          { XX } },
5622     { "(bad)",          { XX } },
5623     { "(bad)",          { XX } },
5624     { "(bad)",          { XX } },
5625     { "(bad)",          { XX } },
5626     { "(bad)",          { XX } },
5627     /* 68 */
5628     { "(bad)",          { XX } },
5629     { "(bad)",          { XX } },
5630     { "(bad)",          { XX } },
5631     { "(bad)",          { XX } },
5632     { "(bad)",          { XX } },
5633     { "(bad)",          { XX } },
5634     { "(bad)",          { XX } },
5635     { "(bad)",          { XX } },
5636     /* 70 */
5637     { "(bad)",          { XX } },
5638     { "(bad)",          { XX } },
5639     { "(bad)",          { XX } },
5640     { "(bad)",          { XX } },
5641     { "(bad)",          { XX } },
5642     { "(bad)",          { XX } },
5643     { "(bad)",          { XX } },
5644     { "(bad)",          { XX } },
5645     /* 78 */
5646     { "(bad)",          { XX } },
5647     { "(bad)",          { XX } },
5648     { "(bad)",          { XX } },
5649     { "(bad)",          { XX } },
5650     { "(bad)",          { XX } },
5651     { "(bad)",          { XX } },
5652     { "(bad)",          { XX } },
5653     { "(bad)",          { XX } },
5654     /* 80 */
5655     { PREFIX_TABLE (PREFIX_0F3880) },
5656     { PREFIX_TABLE (PREFIX_0F3881) },
5657     { "(bad)",          { XX } },
5658     { "(bad)",          { XX } },
5659     { "(bad)",          { XX } },
5660     { "(bad)",          { XX } },
5661     { "(bad)",          { XX } },
5662     { "(bad)",          { XX } },
5663     /* 88 */
5664     { "(bad)",          { XX } },
5665     { "(bad)",          { XX } },
5666     { "(bad)",          { XX } },
5667     { "(bad)",          { XX } },
5668     { "(bad)",          { XX } },
5669     { "(bad)",          { XX } },
5670     { "(bad)",          { XX } },
5671     { "(bad)",          { XX } },
5672     /* 90 */
5673     { "(bad)",          { XX } },
5674     { "(bad)",          { XX } },
5675     { "(bad)",          { XX } },
5676     { "(bad)",          { XX } },
5677     { "(bad)",          { XX } },
5678     { "(bad)",          { XX } },
5679     { "(bad)",          { XX } },
5680     { "(bad)",          { XX } },
5681     /* 98 */
5682     { "(bad)",          { XX } },
5683     { "(bad)",          { XX } },
5684     { "(bad)",          { XX } },
5685     { "(bad)",          { XX } },
5686     { "(bad)",          { XX } },
5687     { "(bad)",          { XX } },
5688     { "(bad)",          { XX } },
5689     { "(bad)",          { XX } },
5690     /* a0 */
5691     { "(bad)",          { XX } },
5692     { "(bad)",          { XX } },
5693     { "(bad)",          { XX } },
5694     { "(bad)",          { XX } },
5695     { "(bad)",          { XX } },
5696     { "(bad)",          { XX } },
5697     { "(bad)",          { XX } },
5698     { "(bad)",          { XX } },
5699     /* a8 */
5700     { "(bad)",          { XX } },
5701     { "(bad)",          { XX } },
5702     { "(bad)",          { XX } },
5703     { "(bad)",          { XX } },
5704     { "(bad)",          { XX } },
5705     { "(bad)",          { XX } },
5706     { "(bad)",          { XX } },
5707     { "(bad)",          { XX } },
5708     /* b0 */
5709     { "(bad)",          { XX } },
5710     { "(bad)",          { XX } },
5711     { "(bad)",          { XX } },
5712     { "(bad)",          { XX } },
5713     { "(bad)",          { XX } },
5714     { "(bad)",          { XX } },
5715     { "(bad)",          { XX } },
5716     { "(bad)",          { XX } },
5717     /* b8 */
5718     { "(bad)",          { XX } },
5719     { "(bad)",          { XX } },
5720     { "(bad)",          { XX } },
5721     { "(bad)",          { XX } },
5722     { "(bad)",          { XX } },
5723     { "(bad)",          { XX } },
5724     { "(bad)",          { XX } },
5725     { "(bad)",          { XX } },
5726     /* c0 */
5727     { "(bad)",          { XX } },
5728     { "(bad)",          { XX } },
5729     { "(bad)",          { XX } },
5730     { "(bad)",          { XX } },
5731     { "(bad)",          { XX } },
5732     { "(bad)",          { XX } },
5733     { "(bad)",          { XX } },
5734     { "(bad)",          { XX } },
5735     /* c8 */
5736     { "(bad)",          { XX } },
5737     { "(bad)",          { XX } },
5738     { "(bad)",          { XX } },
5739     { "(bad)",          { XX } },
5740     { "(bad)",          { XX } },
5741     { "(bad)",          { XX } },
5742     { "(bad)",          { XX } },
5743     { "(bad)",          { XX } },
5744     /* d0 */
5745     { "(bad)",          { XX } },
5746     { "(bad)",          { XX } },
5747     { "(bad)",          { XX } },
5748     { "(bad)",          { XX } },
5749     { "(bad)",          { XX } },
5750     { "(bad)",          { XX } },
5751     { "(bad)",          { XX } },
5752     { "(bad)",          { XX } },
5753     /* d8 */
5754     { "(bad)",          { XX } },
5755     { "(bad)",          { XX } },
5756     { "(bad)",          { XX } },
5757     { PREFIX_TABLE (PREFIX_0F38DB) },
5758     { PREFIX_TABLE (PREFIX_0F38DC) },
5759     { PREFIX_TABLE (PREFIX_0F38DD) },
5760     { PREFIX_TABLE (PREFIX_0F38DE) },
5761     { PREFIX_TABLE (PREFIX_0F38DF) },
5762     /* e0 */
5763     { "(bad)",          { XX } },
5764     { "(bad)",          { XX } },
5765     { "(bad)",          { XX } },
5766     { "(bad)",          { XX } },
5767     { "(bad)",          { XX } },
5768     { "(bad)",          { XX } },
5769     { "(bad)",          { XX } },
5770     { "(bad)",          { XX } },
5771     /* e8 */
5772     { "(bad)",          { XX } },
5773     { "(bad)",          { XX } },
5774     { "(bad)",          { XX } },
5775     { "(bad)",          { XX } },
5776     { "(bad)",          { XX } },
5777     { "(bad)",          { XX } },
5778     { "(bad)",          { XX } },
5779     { "(bad)",          { XX } },
5780     /* f0 */
5781     { PREFIX_TABLE (PREFIX_0F38F0) },
5782     { PREFIX_TABLE (PREFIX_0F38F1) },
5783     { "(bad)",          { XX } },
5784     { "(bad)",          { XX } },
5785     { "(bad)",          { XX } },
5786     { "(bad)",          { XX } },
5787     { "(bad)",          { XX } },
5788     { "(bad)",          { XX } },
5789     /* f8 */
5790     { "(bad)",          { XX } },
5791     { "(bad)",          { XX } },
5792     { "(bad)",          { XX } },
5793     { "(bad)",          { XX } },
5794     { "(bad)",          { XX } },
5795     { "(bad)",          { XX } },
5796     { "(bad)",          { XX } },
5797     { "(bad)",          { XX } },
5798   },
5799   /* THREE_BYTE_0F3A */
5800   {
5801     /* 00 */
5802     { "(bad)",          { XX } },
5803     { "(bad)",          { XX } },
5804     { "(bad)",          { XX } },
5805     { "(bad)",          { XX } },
5806     { "(bad)",          { XX } },
5807     { "(bad)",          { XX } },
5808     { "(bad)",          { XX } },
5809     { "(bad)",          { XX } },
5810     /* 08 */
5811     { PREFIX_TABLE (PREFIX_0F3A08) },
5812     { PREFIX_TABLE (PREFIX_0F3A09) },
5813     { PREFIX_TABLE (PREFIX_0F3A0A) },
5814     { PREFIX_TABLE (PREFIX_0F3A0B) },
5815     { PREFIX_TABLE (PREFIX_0F3A0C) },
5816     { PREFIX_TABLE (PREFIX_0F3A0D) },
5817     { PREFIX_TABLE (PREFIX_0F3A0E) },
5818     { "palignr",        { MX, EM, Ib } },
5819     /* 10 */
5820     { "(bad)",          { XX } },
5821     { "(bad)",          { XX } },
5822     { "(bad)",          { XX } },
5823     { "(bad)",          { XX } },
5824     { PREFIX_TABLE (PREFIX_0F3A14) },
5825     { PREFIX_TABLE (PREFIX_0F3A15) },
5826     { PREFIX_TABLE (PREFIX_0F3A16) },
5827     { PREFIX_TABLE (PREFIX_0F3A17) },
5828     /* 18 */
5829     { "(bad)",          { XX } },
5830     { "(bad)",          { XX } },
5831     { "(bad)",          { XX } },
5832     { "(bad)",          { XX } },
5833     { "(bad)",          { XX } },
5834     { "(bad)",          { XX } },
5835     { "(bad)",          { XX } },
5836     { "(bad)",          { XX } },
5837     /* 20 */
5838     { PREFIX_TABLE (PREFIX_0F3A20) },
5839     { PREFIX_TABLE (PREFIX_0F3A21) },
5840     { PREFIX_TABLE (PREFIX_0F3A22) },
5841     { "(bad)",          { XX } },
5842     { "(bad)",          { XX } },
5843     { "(bad)",          { XX } },
5844     { "(bad)",          { XX } },
5845     { "(bad)",          { XX } },
5846     /* 28 */
5847     { "(bad)",          { XX } },
5848     { "(bad)",          { XX } },
5849     { "(bad)",          { XX } },
5850     { "(bad)",          { XX } },
5851     { "(bad)",          { XX } },
5852     { "(bad)",          { XX } },
5853     { "(bad)",          { XX } },
5854     { "(bad)",          { XX } },
5855     /* 30 */
5856     { "(bad)",          { XX } },
5857     { "(bad)",          { XX } },
5858     { "(bad)",          { XX } },
5859     { "(bad)",          { XX } },
5860     { "(bad)",          { XX } },
5861     { "(bad)",          { XX } },
5862     { "(bad)",          { XX } },
5863     { "(bad)",          { XX } },
5864     /* 38 */
5865     { "(bad)",          { XX } },
5866     { "(bad)",          { XX } },
5867     { "(bad)",          { XX } },
5868     { "(bad)",          { XX } },
5869     { "(bad)",          { XX } },
5870     { "(bad)",          { XX } },
5871     { "(bad)",          { XX } },
5872     { "(bad)",          { XX } },
5873     /* 40 */
5874     { PREFIX_TABLE (PREFIX_0F3A40) },
5875     { PREFIX_TABLE (PREFIX_0F3A41) },
5876     { PREFIX_TABLE (PREFIX_0F3A42) },
5877     { "(bad)",          { XX } },
5878     { PREFIX_TABLE (PREFIX_0F3A44) },
5879     { "(bad)",          { XX } },
5880     { "(bad)",          { XX } },
5881     { "(bad)",          { XX } },
5882     /* 48 */
5883     { "(bad)",          { XX } },
5884     { "(bad)",          { XX } },
5885     { "(bad)",          { XX } },
5886     { "(bad)",          { XX } },
5887     { "(bad)",          { XX } },
5888     { "(bad)",          { XX } },
5889     { "(bad)",          { XX } },
5890     { "(bad)",          { XX } },
5891     /* 50 */
5892     { "(bad)",          { XX } },
5893     { "(bad)",          { XX } },
5894     { "(bad)",          { XX } },
5895     { "(bad)",          { XX } },
5896     { "(bad)",          { XX } },
5897     { "(bad)",          { XX } },
5898     { "(bad)",          { XX } },
5899     { "(bad)",          { XX } },
5900     /* 58 */
5901     { "(bad)",          { XX } },
5902     { "(bad)",          { XX } },
5903     { "(bad)",          { XX } },
5904     { "(bad)",          { XX } },
5905     { "(bad)",          { XX } },
5906     { "(bad)",          { XX } },
5907     { "(bad)",          { XX } },
5908     { "(bad)",          { XX } },
5909     /* 60 */
5910     { PREFIX_TABLE (PREFIX_0F3A60) },
5911     { PREFIX_TABLE (PREFIX_0F3A61) },
5912     { PREFIX_TABLE (PREFIX_0F3A62) },
5913     { PREFIX_TABLE (PREFIX_0F3A63) },
5914     { "(bad)",          { XX } },
5915     { "(bad)",          { XX } },
5916     { "(bad)",          { XX } },
5917     { "(bad)",          { XX } },
5918     /* 68 */
5919     { "(bad)",          { XX } },
5920     { "(bad)",          { XX } },
5921     { "(bad)",          { XX } },
5922     { "(bad)",          { XX } },
5923     { "(bad)",          { XX } },
5924     { "(bad)",          { XX } },
5925     { "(bad)",          { XX } },
5926     { "(bad)",          { XX } },
5927     /* 70 */
5928     { "(bad)",          { XX } },
5929     { "(bad)",          { XX } },
5930     { "(bad)",          { XX } },
5931     { "(bad)",          { XX } },
5932     { "(bad)",          { XX } },
5933     { "(bad)",          { XX } },
5934     { "(bad)",          { XX } },
5935     { "(bad)",          { XX } },
5936     /* 78 */
5937     { "(bad)",          { XX } },
5938     { "(bad)",          { XX } },
5939     { "(bad)",          { XX } },
5940     { "(bad)",          { XX } },
5941     { "(bad)",          { XX } },
5942     { "(bad)",          { XX } },
5943     { "(bad)",          { XX } },
5944     { "(bad)",          { XX } },
5945     /* 80 */
5946     { "(bad)",          { XX } },
5947     { "(bad)",          { XX } },
5948     { "(bad)",          { XX } },
5949     { "(bad)",          { XX } },
5950     { "(bad)",          { XX } },
5951     { "(bad)",          { XX } },
5952     { "(bad)",          { XX } },
5953     { "(bad)",          { XX } },
5954     /* 88 */
5955     { "(bad)",          { XX } },
5956     { "(bad)",          { XX } },
5957     { "(bad)",          { XX } },
5958     { "(bad)",          { XX } },
5959     { "(bad)",          { XX } },
5960     { "(bad)",          { XX } },
5961     { "(bad)",          { XX } },
5962     { "(bad)",          { XX } },
5963     /* 90 */
5964     { "(bad)",          { XX } },
5965     { "(bad)",          { XX } },
5966     { "(bad)",          { XX } },
5967     { "(bad)",          { XX } },
5968     { "(bad)",          { XX } },
5969     { "(bad)",          { XX } },
5970     { "(bad)",          { XX } },
5971     { "(bad)",          { XX } },
5972     /* 98 */
5973     { "(bad)",          { XX } },
5974     { "(bad)",          { XX } },
5975     { "(bad)",          { XX } },
5976     { "(bad)",          { XX } },
5977     { "(bad)",          { XX } },
5978     { "(bad)",          { XX } },
5979     { "(bad)",          { XX } },
5980     { "(bad)",          { XX } },
5981     /* a0 */
5982     { "(bad)",          { XX } },
5983     { "(bad)",          { XX } },
5984     { "(bad)",          { XX } },
5985     { "(bad)",          { XX } },
5986     { "(bad)",          { XX } },
5987     { "(bad)",          { XX } },
5988     { "(bad)",          { XX } },
5989     { "(bad)",          { XX } },
5990     /* a8 */
5991     { "(bad)",          { XX } },
5992     { "(bad)",          { XX } },
5993     { "(bad)",          { XX } },
5994     { "(bad)",          { XX } },
5995     { "(bad)",          { XX } },
5996     { "(bad)",          { XX } },
5997     { "(bad)",          { XX } },
5998     { "(bad)",          { XX } },
5999     /* b0 */
6000     { "(bad)",          { XX } },
6001     { "(bad)",          { XX } },
6002     { "(bad)",          { XX } },
6003     { "(bad)",          { XX } },
6004     { "(bad)",          { XX } },
6005     { "(bad)",          { XX } },
6006     { "(bad)",          { XX } },
6007     { "(bad)",          { XX } },
6008     /* b8 */
6009     { "(bad)",          { XX } },
6010     { "(bad)",          { XX } },
6011     { "(bad)",          { XX } },
6012     { "(bad)",          { XX } },
6013     { "(bad)",          { XX } },
6014     { "(bad)",          { XX } },
6015     { "(bad)",          { XX } },
6016     { "(bad)",          { XX } },
6017     /* c0 */
6018     { "(bad)",          { XX } },
6019     { "(bad)",          { XX } },
6020     { "(bad)",          { XX } },
6021     { "(bad)",          { XX } },
6022     { "(bad)",          { XX } },
6023     { "(bad)",          { XX } },
6024     { "(bad)",          { XX } },
6025     { "(bad)",          { XX } },
6026     /* c8 */
6027     { "(bad)",          { XX } },
6028     { "(bad)",          { XX } },
6029     { "(bad)",          { XX } },
6030     { "(bad)",          { XX } },
6031     { "(bad)",          { XX } },
6032     { "(bad)",          { XX } },
6033     { "(bad)",          { XX } },
6034     { "(bad)",          { XX } },
6035     /* d0 */
6036     { "(bad)",          { XX } },
6037     { "(bad)",          { XX } },
6038     { "(bad)",          { XX } },
6039     { "(bad)",          { XX } },
6040     { "(bad)",          { XX } },
6041     { "(bad)",          { XX } },
6042     { "(bad)",          { XX } },
6043     { "(bad)",          { XX } },
6044     /* d8 */
6045     { "(bad)",          { XX } },
6046     { "(bad)",          { XX } },
6047     { "(bad)",          { XX } },
6048     { "(bad)",          { XX } },
6049     { "(bad)",          { XX } },
6050     { "(bad)",          { XX } },
6051     { "(bad)",          { XX } },
6052     { PREFIX_TABLE (PREFIX_0F3ADF) },
6053     /* e0 */
6054     { "(bad)",          { XX } },
6055     { "(bad)",          { XX } },
6056     { "(bad)",          { XX } },
6057     { "(bad)",          { XX } },
6058     { "(bad)",          { XX } },
6059     { "(bad)",          { XX } },
6060     { "(bad)",          { XX } },
6061     { "(bad)",          { XX } },
6062     /* e8 */
6063     { "(bad)",          { XX } },
6064     { "(bad)",          { XX } },
6065     { "(bad)",          { XX } },
6066     { "(bad)",          { XX } },
6067     { "(bad)",          { XX } },
6068     { "(bad)",          { XX } },
6069     { "(bad)",          { XX } },
6070     { "(bad)",          { XX } },
6071     /* f0 */
6072     { "(bad)",          { XX } },
6073     { "(bad)",          { XX } },
6074     { "(bad)",          { XX } },
6075     { "(bad)",          { XX } },
6076     { "(bad)",          { XX } },
6077     { "(bad)",          { XX } },
6078     { "(bad)",          { XX } },
6079     { "(bad)",          { XX } },
6080     /* f8 */
6081     { "(bad)",          { XX } },
6082     { "(bad)",          { XX } },
6083     { "(bad)",          { XX } },
6084     { "(bad)",          { XX } },
6085     { "(bad)",          { XX } },
6086     { "(bad)",          { XX } },
6087     { "(bad)",          { XX } },
6088     { "(bad)",          { XX } },
6089   },
6090
6091   /* THREE_BYTE_0F7A */
6092   {
6093     /* 00 */
6094     { "(bad)",          { XX } },
6095     { "(bad)",          { XX } },
6096     { "(bad)",          { XX } },
6097     { "(bad)",          { XX } },
6098     { "(bad)",          { XX } },
6099     { "(bad)",          { XX } },
6100     { "(bad)",          { XX } },
6101     { "(bad)",          { XX } },
6102     /* 08 */
6103     { "(bad)",          { XX } },
6104     { "(bad)",          { XX } },
6105     { "(bad)",          { XX } },
6106     { "(bad)",          { XX } },
6107     { "(bad)",          { XX } },
6108     { "(bad)",          { XX } },
6109     { "(bad)",          { XX } },
6110     { "(bad)",          { XX } },
6111     /* 10 */
6112     { "(bad)",          { XX } },
6113     { "(bad)",          { XX } },
6114     { "(bad)",          { XX } },
6115     { "(bad)",          { XX } },
6116     { "(bad)",          { XX } },
6117     { "(bad)",          { XX } },
6118     { "(bad)",          { XX } },
6119     { "(bad)",          { XX } },
6120     /* 18 */
6121     { "(bad)",          { XX } },
6122     { "(bad)",          { XX } },
6123     { "(bad)",          { XX } },
6124     { "(bad)",          { XX } },
6125     { "(bad)",          { XX } },
6126     { "(bad)",          { XX } },
6127     { "(bad)",          { XX } },
6128     { "(bad)",          { XX } },
6129     /* 20 */
6130     { "ptest",          { XX } },
6131     { "(bad)",          { XX } },
6132     { "(bad)",          { XX } },
6133     { "(bad)",          { XX } },
6134     { "(bad)",          { XX } },
6135     { "(bad)",          { XX } },
6136     { "(bad)",          { XX } },
6137     { "(bad)",          { XX } },
6138     /* 28 */
6139     { "(bad)",          { XX } },
6140     { "(bad)",          { XX } },
6141     { "(bad)",          { XX } },
6142     { "(bad)",          { XX } },
6143     { "(bad)",          { XX } },
6144     { "(bad)",          { XX } },
6145     { "(bad)",          { XX } },
6146     { "(bad)",          { XX } },
6147     /* 30 */
6148     { "(bad)",          { XX } },
6149     { "(bad)",          { XX } },
6150     { "(bad)",          { XX } },
6151     { "(bad)",          { XX } },
6152     { "(bad)",          { XX } },
6153     { "(bad)",          { XX } },
6154     { "(bad)",          { XX } },
6155     { "(bad)",          { XX } },
6156     /* 38 */
6157     { "(bad)",          { XX } },
6158     { "(bad)",          { XX } },
6159     { "(bad)",          { XX } },
6160     { "(bad)",          { XX } },
6161     { "(bad)",          { XX } },
6162     { "(bad)",          { XX } },
6163     { "(bad)",          { XX } },
6164     { "(bad)",          { XX } },
6165     /* 40 */
6166     { "(bad)",          { XX } },
6167     { "phaddbw",        { XM, EXq } },
6168     { "phaddbd",        { XM, EXq } },
6169     { "phaddbq",        { XM, EXq } },
6170     { "(bad)",          { XX } },
6171     { "(bad)",          { XX } },
6172     { "phaddwd",        { XM, EXq } },
6173     { "phaddwq",        { XM, EXq } },
6174     /* 48 */
6175     { "(bad)",          { XX } },
6176     { "(bad)",          { XX } },
6177     { "(bad)",          { XX } },
6178     { "phadddq",        { XM, EXq } },
6179     { "(bad)",          { XX } },
6180     { "(bad)",          { XX } },
6181     { "(bad)",          { XX } },
6182     { "(bad)",          { XX } },
6183     /* 50 */
6184     { "(bad)",          { XX } },
6185     { "phaddubw",       { XM, EXq } },
6186     { "phaddubd",       { XM, EXq } },
6187     { "phaddubq",       { XM, EXq } },
6188     { "(bad)",          { XX } },
6189     { "(bad)",          { XX } },
6190     { "phadduwd",       { XM, EXq } },
6191     { "phadduwq",       { XM, EXq } },
6192     /* 58 */
6193     { "(bad)",          { XX } },
6194     { "(bad)",          { XX } },
6195     { "(bad)",          { XX } },
6196     { "phaddudq",       { XM, EXq } },
6197     { "(bad)",          { XX } },
6198     { "(bad)",          { XX } },
6199     { "(bad)",          { XX } },
6200     { "(bad)",          { XX } },
6201     /* 60 */
6202     { "(bad)",          { XX } },
6203     { "phsubbw",        { XM, EXq } },
6204     { "phsubbd",        { XM, EXq } },
6205     { "phsubbq",        { XM, EXq } },
6206     { "(bad)",          { XX } },
6207     { "(bad)",          { XX } },
6208     { "(bad)",          { XX } },
6209     { "(bad)",          { XX } },
6210     /* 68 */
6211     { "(bad)",          { XX } },
6212     { "(bad)",          { XX } },
6213     { "(bad)",          { XX } },
6214     { "(bad)",          { XX } },
6215     { "(bad)",          { XX } },
6216     { "(bad)",          { XX } },
6217     { "(bad)",          { XX } },
6218     { "(bad)",          { XX } },
6219     /* 70 */
6220     { "(bad)",          { XX } },
6221     { "(bad)",          { XX } },
6222     { "(bad)",          { XX } },
6223     { "(bad)",          { XX } },
6224     { "(bad)",          { XX } },
6225     { "(bad)",          { XX } },
6226     { "(bad)",          { XX } },
6227     { "(bad)",          { XX } },
6228     /* 78 */
6229     { "(bad)",          { XX } },
6230     { "(bad)",          { XX } },
6231     { "(bad)",          { XX } },
6232     { "(bad)",          { XX } },
6233     { "(bad)",          { XX } },
6234     { "(bad)",          { XX } },
6235     { "(bad)",          { XX } },
6236     { "(bad)",          { XX } },
6237     /* 80 */
6238     { "(bad)",          { XX } },
6239     { "(bad)",          { XX } },
6240     { "(bad)",          { XX } },
6241     { "(bad)",          { XX } },
6242     { "(bad)",          { XX } },
6243     { "(bad)",          { XX } },
6244     { "(bad)",          { XX } },
6245     { "(bad)",          { XX } },
6246     /* 88 */
6247     { "(bad)",          { XX } },
6248     { "(bad)",          { XX } },
6249     { "(bad)",          { XX } },
6250     { "(bad)",          { XX } },
6251     { "(bad)",          { XX } },
6252     { "(bad)",          { XX } },
6253     { "(bad)",          { XX } },
6254     { "(bad)",          { XX } },
6255     /* 90 */
6256     { "(bad)",          { XX } },
6257     { "(bad)",          { XX } },
6258     { "(bad)",          { XX } },
6259     { "(bad)",          { XX } },
6260     { "(bad)",          { XX } },
6261     { "(bad)",          { XX } },
6262     { "(bad)",          { XX } },
6263     { "(bad)",          { XX } },
6264     /* 98 */
6265     { "(bad)",          { XX } },
6266     { "(bad)",          { XX } },
6267     { "(bad)",          { XX } },
6268     { "(bad)",          { XX } },
6269     { "(bad)",          { XX } },
6270     { "(bad)",          { XX } },
6271     { "(bad)",          { XX } },
6272     { "(bad)",          { XX } },
6273     /* a0 */
6274     { "(bad)",          { XX } },
6275     { "(bad)",          { XX } },
6276     { "(bad)",          { XX } },
6277     { "(bad)",          { XX } },
6278     { "(bad)",          { XX } },
6279     { "(bad)",          { XX } },
6280     { "(bad)",          { XX } },
6281     { "(bad)",          { XX } },
6282     /* a8 */
6283     { "(bad)",          { XX } },
6284     { "(bad)",          { XX } },
6285     { "(bad)",          { XX } },
6286     { "(bad)",          { XX } },
6287     { "(bad)",          { XX } },
6288     { "(bad)",          { XX } },
6289     { "(bad)",          { XX } },
6290     { "(bad)",          { XX } },
6291     /* b0 */
6292     { "(bad)",          { XX } },
6293     { "(bad)",          { XX } },
6294     { "(bad)",          { XX } },
6295     { "(bad)",          { XX } },
6296     { "(bad)",          { XX } },
6297     { "(bad)",          { XX } },
6298     { "(bad)",          { XX } },
6299     { "(bad)",          { XX } },
6300     /* b8 */
6301     { "(bad)",          { XX } },
6302     { "(bad)",          { XX } },
6303     { "(bad)",          { XX } },
6304     { "(bad)",          { XX } },
6305     { "(bad)",          { XX } },
6306     { "(bad)",          { XX } },
6307     { "(bad)",          { XX } },
6308     { "(bad)",          { XX } },
6309     /* c0 */
6310     { "(bad)",          { XX } },
6311     { "(bad)",          { XX } },
6312     { "(bad)",          { XX } },
6313     { "(bad)",          { XX } },
6314     { "(bad)",          { XX } },
6315     { "(bad)",          { XX } },
6316     { "(bad)",          { XX } },
6317     { "(bad)",          { XX } },
6318     /* c8 */
6319     { "(bad)",          { XX } },
6320     { "(bad)",          { XX } },
6321     { "(bad)",          { XX } },
6322     { "(bad)",          { XX } },
6323     { "(bad)",          { XX } },
6324     { "(bad)",          { XX } },
6325     { "(bad)",          { XX } },
6326     { "(bad)",          { XX } },
6327     /* d0 */
6328     { "(bad)",          { XX } },
6329     { "(bad)",          { XX } },
6330     { "(bad)",          { XX } },
6331     { "(bad)",          { XX } },
6332     { "(bad)",          { XX } },
6333     { "(bad)",          { XX } },
6334     { "(bad)",          { XX } },
6335     { "(bad)",          { XX } },
6336     /* d8 */
6337     { "(bad)",          { XX } },
6338     { "(bad)",          { XX } },
6339     { "(bad)",          { XX } },
6340     { "(bad)",          { XX } },
6341     { "(bad)",          { XX } },
6342     { "(bad)",          { XX } },
6343     { "(bad)",          { XX } },
6344     { "(bad)",          { XX } },
6345     /* e0 */
6346     { "(bad)",          { XX } },
6347     { "(bad)",          { XX } },
6348     { "(bad)",          { XX } },
6349     { "(bad)",          { XX } },
6350     { "(bad)",          { XX } },
6351     { "(bad)",          { XX } },
6352     { "(bad)",          { XX } },
6353     { "(bad)",          { XX } },
6354     /* e8 */
6355     { "(bad)",          { XX } },
6356     { "(bad)",          { XX } },
6357     { "(bad)",          { XX } },
6358     { "(bad)",          { XX } },
6359     { "(bad)",          { XX } },
6360     { "(bad)",          { XX } },
6361     { "(bad)",          { XX } },
6362     { "(bad)",          { XX } },
6363     /* f0 */
6364     { "(bad)",          { XX } },
6365     { "(bad)",          { XX } },
6366     { "(bad)",          { XX } },
6367     { "(bad)",          { XX } },
6368     { "(bad)",          { XX } },
6369     { "(bad)",          { XX } },
6370     { "(bad)",          { XX } },
6371     { "(bad)",          { XX } },
6372     /* f8 */
6373     { "(bad)",          { XX } },
6374     { "(bad)",          { XX } },
6375     { "(bad)",          { XX } },
6376     { "(bad)",          { XX } },
6377     { "(bad)",          { XX } },
6378     { "(bad)",          { XX } },
6379     { "(bad)",          { XX } },
6380     { "(bad)",          { XX } },
6381   },
6382 };
6383
6384 static const struct dis386 xop_table[][256] = {
6385   /* XOP_09 */
6386   {
6387     /* 00 */
6388     { "(bad)",          { XX } },
6389     { "(bad)",          { XX } },
6390     { "(bad)",          { XX } },
6391     { "(bad)",          { XX } },
6392     { "(bad)",          { XX } },
6393     { "(bad)",          { XX } },
6394     { "(bad)",          { XX } },
6395     { "(bad)",          { XX } },
6396     /* 08 */
6397     { "(bad)",          { XX } },
6398     { "(bad)",          { XX } },
6399     { "(bad)",          { XX } },
6400     { "(bad)",          { XX } },
6401     { "(bad)",          { XX } },
6402     { "(bad)",          { XX } },
6403     { "(bad)",          { XX } },
6404     { "(bad)",          { XX } },
6405     /* 10 */
6406     { "(bad)",          { XX } },
6407     { "(bad)",          { XX } },
6408     { REG_TABLE (REG_XOP_LWPCB) },
6409     { "(bad)",          { XX } },
6410     { "(bad)",          { XX } },
6411     { "(bad)",          { XX } },
6412     { "(bad)",          { XX } },
6413     { "(bad)",          { XX } },
6414     /* 18 */
6415     { "(bad)",          { XX } },
6416     { "(bad)",          { XX } },
6417     { "(bad)",          { XX } },
6418     { "(bad)",          { XX } },
6419     { "(bad)",          { XX } },
6420     { "(bad)",          { XX } },
6421     { "(bad)",          { XX } },
6422     { "(bad)",          { XX } },
6423     /* 20 */
6424     { "(bad)",          { XX } },
6425     { "(bad)",          { XX } },
6426     { "(bad)",          { XX } },
6427     { "(bad)",          { XX } },
6428     { "(bad)",          { XX } },
6429     { "(bad)",          { XX } },
6430     { "(bad)",          { XX } },
6431     { "(bad)",          { XX } },
6432     /* 28 */
6433     { "(bad)",          { XX } },
6434     { "(bad)",          { XX } },
6435     { "(bad)",          { XX } },
6436     { "(bad)",          { XX } },
6437     { "(bad)",          { XX } },
6438     { "(bad)",          { XX } },
6439     { "(bad)",          { XX } },
6440     { "(bad)",          { XX } },
6441     /* 30 */
6442     { "(bad)",          { XX } },
6443     { "(bad)",          { XX } },
6444     { "(bad)",          { XX } },
6445     { "(bad)",          { XX } },
6446     { "(bad)",          { XX } },
6447     { "(bad)",          { XX } },
6448     { "(bad)",          { XX } },
6449     { "(bad)",          { XX } },
6450     /* 38 */
6451     { "(bad)",          { XX } },
6452     { "(bad)",          { XX } },
6453     { "(bad)",          { XX } },
6454     { "(bad)",          { XX } },
6455     { "(bad)",          { XX } },
6456     { "(bad)",          { XX } },
6457     { "(bad)",          { XX } },
6458     { "(bad)",          { XX } },
6459     /* 40 */
6460     { "(bad)",          { XX } },
6461     { "(bad)",          { XX } },
6462     { "(bad)",          { XX } },
6463     { "(bad)",          { XX } },
6464     { "(bad)",          { XX } },
6465     { "(bad)",          { XX } },
6466     { "(bad)",          { XX } },
6467     { "(bad)",          { XX } },
6468     /* 48 */
6469     { "(bad)",          { XX } },
6470     { "(bad)",          { XX } },
6471     { "(bad)",          { XX } },
6472     { "(bad)",          { XX } },
6473     { "(bad)",          { XX } },
6474     { "(bad)",          { XX } },
6475     { "(bad)",          { XX } },
6476     { "(bad)",          { XX } },
6477     /* 50 */
6478     { "(bad)",          { XX } },
6479     { "(bad)",          { XX } },
6480     { "(bad)",          { XX } },
6481     { "(bad)",          { XX } },
6482     { "(bad)",          { XX } },
6483     { "(bad)",          { XX } },
6484     { "(bad)",          { XX } },
6485     { "(bad)",          { XX } },
6486     /* 58 */
6487     { "(bad)",          { XX } },
6488     { "(bad)",          { XX } },
6489     { "(bad)",          { XX } },
6490     { "(bad)",          { XX } },
6491     { "(bad)",          { XX } },
6492     { "(bad)",          { XX } },
6493     { "(bad)",          { XX } },
6494     { "(bad)",          { XX } },
6495     /* 60 */
6496     { "(bad)",          { XX } },
6497     { "(bad)",          { XX } },
6498     { "(bad)",          { XX } },
6499     { "(bad)",          { XX } },
6500     { "(bad)",          { XX } },
6501     { "(bad)",          { XX } },
6502     { "(bad)",          { XX } },
6503     { "(bad)",          { XX } },
6504     /* 68 */
6505     { "(bad)",          { XX } },
6506     { "(bad)",          { XX } },
6507     { "(bad)",          { XX } },
6508     { "(bad)",          { XX } },
6509     { "(bad)",          { XX } },
6510     { "(bad)",          { XX } },
6511     { "(bad)",          { XX } },
6512     { "(bad)",          { XX } },
6513     /* 70 */
6514     { "(bad)",          { XX } },
6515     { "(bad)",          { XX } },
6516     { "(bad)",          { XX } },
6517     { "(bad)",          { XX } },
6518     { "(bad)",          { XX } },
6519     { "(bad)",          { XX } },
6520     { "(bad)",          { XX } },
6521     { "(bad)",          { XX } },
6522     /* 78 */
6523     { "(bad)",          { XX } },
6524     { "(bad)",          { XX } },
6525     { "(bad)",          { XX } },
6526     { "(bad)",          { XX } },
6527     { "(bad)",          { XX } },
6528     { "(bad)",          { XX } },
6529     { "(bad)",          { XX } },
6530     { "(bad)",          { XX } },
6531     /* 80 */
6532     { "(bad)",          { XX } },
6533     { "(bad)",          { XX } },
6534     { "(bad)",          { XX } },
6535     { "(bad)",          { XX } },
6536     { "(bad)",          { XX } },
6537     { "(bad)",          { XX } },
6538     { "(bad)",          { XX } },
6539     { "(bad)",          { XX } },
6540     /* 88 */
6541     { "(bad)",          { XX } },
6542     { "(bad)",          { XX } },
6543     { "(bad)",          { XX } },
6544     { "(bad)",          { XX } },
6545     { "(bad)",          { XX } },
6546     { "(bad)",          { XX } },
6547     { "(bad)",          { XX } },
6548     { "(bad)",          { XX } },
6549     /* 90 */
6550     { "(bad)",          { XX } },
6551     { "(bad)",          { XX } },
6552     { "(bad)",          { XX } },
6553     { "(bad)",          { XX } },
6554     { "(bad)",          { XX } },
6555     { "(bad)",          { XX } },
6556     { "(bad)",          { XX } },
6557     { "(bad)",          { XX } },
6558     /* 98 */
6559     { "(bad)",          { XX } },
6560     { "(bad)",          { XX } },
6561     { "(bad)",          { XX } },
6562     { "(bad)",          { XX } },
6563     { "(bad)",          { XX } },
6564     { "(bad)",          { XX } },
6565     { "(bad)",          { XX } },
6566     { "(bad)",          { XX } },
6567     /* a0 */
6568     { "(bad)",          { XX } },
6569     { "(bad)",          { XX } },
6570     { "(bad)",          { XX } },
6571     { "(bad)",          { XX } },
6572     { "(bad)",          { XX } },
6573     { "(bad)",          { XX } },
6574     { "(bad)",          { XX } },
6575     { "(bad)",          { XX } },
6576     /* a8 */
6577     { "(bad)",          { XX } },
6578     { "(bad)",          { XX } },
6579     { "(bad)",          { XX } },
6580     { "(bad)",          { XX } },
6581     { "(bad)",          { XX } },
6582     { "(bad)",          { XX } },
6583     { "(bad)",          { XX } },
6584     { "(bad)",          { XX } },
6585     /* b0 */
6586     { "(bad)",          { XX } },
6587     { "(bad)",          { XX } },
6588     { "(bad)",          { XX } },
6589     { "(bad)",          { XX } },
6590     { "(bad)",          { XX } },
6591     { "(bad)",          { XX } },
6592     { "(bad)",          { XX } },
6593     { "(bad)",          { XX } },
6594     /* b8 */
6595     { "(bad)",          { XX } },
6596     { "(bad)",          { XX } },
6597     { "(bad)",          { XX } },
6598     { "(bad)",          { XX } },
6599     { "(bad)",          { XX } },
6600     { "(bad)",          { XX } },
6601     { "(bad)",          { XX } },
6602     { "(bad)",          { XX } },
6603     /* c0 */
6604     { "(bad)",          { XX } },
6605     { "(bad)",          { XX } },
6606     { "(bad)",          { XX } },
6607     { "(bad)",          { XX } },
6608     { "(bad)",          { XX } },
6609     { "(bad)",          { XX } },
6610     { "(bad)",          { XX } },
6611     { "(bad)",          { XX } },
6612     /* c8 */
6613     { "(bad)",          { XX } },
6614     { "(bad)",          { XX } },
6615     { "(bad)",          { XX } },
6616     { "(bad)",          { XX } },
6617     { "(bad)",          { XX } },
6618     { "(bad)",          { XX } },
6619     { "(bad)",          { XX } },
6620     { "(bad)",          { XX } },
6621     /* d0 */
6622     { "(bad)",          { XX } },
6623     { "(bad)",          { XX } },
6624     { "(bad)",          { XX } },
6625     { "(bad)",          { XX } },
6626     { "(bad)",          { XX } },
6627     { "(bad)",          { XX } },
6628     { "(bad)",          { XX } },
6629     { "(bad)",          { XX } },
6630     /* d8 */
6631     { "(bad)",          { XX } },
6632     { "(bad)",          { XX } },
6633     { "(bad)",          { XX } },
6634     { "(bad)",          { XX } },
6635     { "(bad)",          { XX } },
6636     { "(bad)",          { XX } },
6637     { "(bad)",          { XX } },
6638     { "(bad)",          { XX } },
6639     /* e0 */
6640     { "(bad)",          { XX } },
6641     { "(bad)",          { XX } },
6642     { "(bad)",          { XX } },
6643     { "(bad)",          { XX } },
6644     { "(bad)",          { XX } },
6645     { "(bad)",          { XX } },
6646     { "(bad)",          { XX } },
6647     { "(bad)",          { XX } },
6648     /* e8 */
6649     { "(bad)",          { XX } },
6650     { "(bad)",          { XX } },
6651     { "(bad)",          { XX } },
6652     { "(bad)",          { XX } },
6653     { "(bad)",          { XX } },
6654     { "(bad)",          { XX } },
6655     { "(bad)",          { XX } },
6656     { "(bad)",          { XX } },
6657     /* f0 */
6658     { "(bad)",          { XX } },
6659     { "(bad)",          { XX } },
6660     { "(bad)",          { XX } },
6661     { "(bad)",          { XX } },
6662     { "(bad)",          { XX } },
6663     { "(bad)",          { XX } },
6664     { "(bad)",          { XX } },
6665     { "(bad)",          { XX } },
6666     /* f8 */
6667     { "(bad)",          { XX } },
6668     { "(bad)",          { XX } },
6669     { "(bad)",          { XX } },
6670     { "(bad)",          { XX } },
6671     { "(bad)",          { XX } },
6672     { "(bad)",          { XX } },
6673     { "(bad)",          { XX } },
6674     { "(bad)",          { XX } },
6675   },
6676   /* XOP_0A */
6677   {
6678     /* 00 */
6679     { "(bad)",          { XX } },
6680     { "(bad)",          { XX } },
6681     { "(bad)",          { XX } },
6682     { "(bad)",          { XX } },
6683     { "(bad)",          { XX } },
6684     { "(bad)",          { XX } },
6685     { "(bad)",          { XX } },
6686     { "(bad)",          { XX } },
6687     /* 08 */
6688     { "(bad)",          { XX } },
6689     { "(bad)",          { XX } },
6690     { "(bad)",          { XX } },
6691     { "(bad)",          { XX } },
6692     { "(bad)",          { XX } },
6693     { "(bad)",          { XX } },
6694     { "(bad)",          { XX } },
6695     { "(bad)",          { XX } },
6696     /* 10 */
6697     { "(bad)",          { XX } },
6698     { "(bad)",          { XX } },
6699     { REG_TABLE (REG_XOP_LWP) },
6700     { "(bad)",          { XX } },
6701     { "(bad)",          { XX } },
6702     { "(bad)",          { XX } },
6703     { "(bad)",          { XX } },
6704     { "(bad)",          { XX } },
6705     /* 18 */
6706     { "(bad)",          { XX } },
6707     { "(bad)",          { XX } },
6708     { "(bad)",          { XX } },
6709     { "(bad)",          { XX } },
6710     { "(bad)",          { XX } },
6711     { "(bad)",          { XX } },
6712     { "(bad)",          { XX } },
6713     { "(bad)",          { XX } },
6714     /* 20 */
6715     { "(bad)",          { XX } },
6716     { "(bad)",          { XX } },
6717     { "(bad)",          { XX } },
6718     { "(bad)",          { XX } },
6719     { "(bad)",          { XX } },
6720     { "(bad)",          { XX } },
6721     { "(bad)",          { XX } },
6722     { "(bad)",          { XX } },
6723     /* 28 */
6724     { "(bad)",          { XX } },
6725     { "(bad)",          { XX } },
6726     { "(bad)",          { XX } },
6727     { "(bad)",          { XX } },
6728     { "(bad)",          { XX } },
6729     { "(bad)",          { XX } },
6730     { "(bad)",          { XX } },
6731     { "(bad)",          { XX } },
6732     /* 30 */
6733     { "(bad)",          { XX } },
6734     { "(bad)",          { XX } },
6735     { "(bad)",          { XX } },
6736     { "(bad)",          { XX } },
6737     { "(bad)",          { XX } },
6738     { "(bad)",          { XX } },
6739     { "(bad)",          { XX } },
6740     { "(bad)",          { XX } },
6741     /* 38 */
6742     { "(bad)",          { XX } },
6743     { "(bad)",          { XX } },
6744     { "(bad)",          { XX } },
6745     { "(bad)",          { XX } },
6746     { "(bad)",          { XX } },
6747     { "(bad)",          { XX } },
6748     { "(bad)",          { XX } },
6749     { "(bad)",          { XX } },
6750     /* 40 */
6751     { "(bad)",          { XX } },
6752     { "(bad)",          { XX } },
6753     { "(bad)",          { XX } },
6754     { "(bad)",          { XX } },
6755     { "(bad)",          { XX } },
6756     { "(bad)",          { XX } },
6757     { "(bad)",          { XX } },
6758     { "(bad)",          { XX } },
6759     /* 48 */
6760     { "(bad)",          { XX } },
6761     { "(bad)",          { XX } },
6762     { "(bad)",          { XX } },
6763     { "(bad)",          { XX } },
6764     { "(bad)",          { XX } },
6765     { "(bad)",          { XX } },
6766     { "(bad)",          { XX } },
6767     { "(bad)",          { XX } },
6768     /* 50 */
6769     { "(bad)",          { XX } },
6770     { "(bad)",          { XX } },
6771     { "(bad)",          { XX } },
6772     { "(bad)",          { XX } },
6773     { "(bad)",          { XX } },
6774     { "(bad)",          { XX } },
6775     { "(bad)",          { XX } },
6776     { "(bad)",          { XX } },
6777     /* 58 */
6778     { "(bad)",          { XX } },
6779     { "(bad)",          { XX } },
6780     { "(bad)",          { XX } },
6781     { "(bad)",          { XX } },
6782     { "(bad)",          { XX } },
6783     { "(bad)",          { XX } },
6784     { "(bad)",          { XX } },
6785     { "(bad)",          { XX } },
6786     /* 60 */
6787     { "(bad)",          { XX } },
6788     { "(bad)",          { XX } },
6789     { "(bad)",          { XX } },
6790     { "(bad)",          { XX } },
6791     { "(bad)",          { XX } },
6792     { "(bad)",          { XX } },
6793     { "(bad)",          { XX } },
6794     { "(bad)",          { XX } },
6795     /* 68 */
6796     { "(bad)",          { XX } },
6797     { "(bad)",          { XX } },
6798     { "(bad)",          { XX } },
6799     { "(bad)",          { XX } },
6800     { "(bad)",          { XX } },
6801     { "(bad)",          { XX } },
6802     { "(bad)",          { XX } },
6803     { "(bad)",          { XX } },
6804     /* 70 */
6805     { "(bad)",          { XX } },
6806     { "(bad)",          { XX } },
6807     { "(bad)",          { XX } },
6808     { "(bad)",          { XX } },
6809     { "(bad)",          { XX } },
6810     { "(bad)",          { XX } },
6811     { "(bad)",          { XX } },
6812     { "(bad)",          { XX } },
6813     /* 78 */
6814     { "(bad)",          { XX } },
6815     { "(bad)",          { XX } },
6816     { "(bad)",          { XX } },
6817     { "(bad)",          { XX } },
6818     { "(bad)",          { XX } },
6819     { "(bad)",          { XX } },
6820     { "(bad)",          { XX } },
6821     { "(bad)",          { XX } },
6822     /* 80 */
6823     { "(bad)",          { XX } },
6824     { "(bad)",          { XX } },
6825     { "(bad)",          { XX } },
6826     { "(bad)",          { XX } },
6827     { "(bad)",          { XX } },
6828     { "(bad)",          { XX } },
6829     { "(bad)",          { XX } },
6830     { "(bad)",          { XX } },
6831     /* 88 */
6832     { "(bad)",          { XX } },
6833     { "(bad)",          { XX } },
6834     { "(bad)",          { XX } },
6835     { "(bad)",          { XX } },
6836     { "(bad)",          { XX } },
6837     { "(bad)",          { XX } },
6838     { "(bad)",          { XX } },
6839     { "(bad)",          { XX } },
6840     /* 90 */
6841     { "(bad)",          { XX } },
6842     { "(bad)",          { XX } },
6843     { "(bad)",          { XX } },
6844     { "(bad)",          { XX } },
6845     { "(bad)",          { XX } },
6846     { "(bad)",          { XX } },
6847     { "(bad)",          { XX } },
6848     { "(bad)",          { XX } },
6849     /* 98 */
6850     { "(bad)",          { XX } },
6851     { "(bad)",          { XX } },
6852     { "(bad)",          { XX } },
6853     { "(bad)",          { XX } },
6854     { "(bad)",          { XX } },
6855     { "(bad)",          { XX } },
6856     { "(bad)",          { XX } },
6857     { "(bad)",          { XX } },
6858     /* a0 */
6859     { "(bad)",          { XX } },
6860     { "(bad)",          { XX } },
6861     { "(bad)",          { XX } },
6862     { "(bad)",          { XX } },
6863     { "(bad)",          { XX } },
6864     { "(bad)",          { XX } },
6865     { "(bad)",          { XX } },
6866     { "(bad)",          { XX } },
6867     /* a8 */
6868     { "(bad)",          { XX } },
6869     { "(bad)",          { XX } },
6870     { "(bad)",          { XX } },
6871     { "(bad)",          { XX } },
6872     { "(bad)",          { XX } },
6873     { "(bad)",          { XX } },
6874     { "(bad)",          { XX } },
6875     { "(bad)",          { XX } },
6876     /* b0 */
6877     { "(bad)",          { XX } },
6878     { "(bad)",          { XX } },
6879     { "(bad)",          { XX } },
6880     { "(bad)",          { XX } },
6881     { "(bad)",          { XX } },
6882     { "(bad)",          { XX } },
6883     { "(bad)",          { XX } },
6884     { "(bad)",          { XX } },
6885     /* b8 */
6886     { "(bad)",          { XX } },
6887     { "(bad)",          { XX } },
6888     { "(bad)",          { XX } },
6889     { "(bad)",          { XX } },
6890     { "(bad)",          { XX } },
6891     { "(bad)",          { XX } },
6892     { "(bad)",          { XX } },
6893     { "(bad)",          { XX } },
6894     /* c0 */
6895     { "(bad)",          { XX } },
6896     { "(bad)",          { XX } },
6897     { "(bad)",          { XX } },
6898     { "(bad)",          { XX } },
6899     { "(bad)",          { XX } },
6900     { "(bad)",          { XX } },
6901     { "(bad)",          { XX } },
6902     { "(bad)",          { XX } },
6903     /* c8 */
6904     { "(bad)",          { XX } },
6905     { "(bad)",          { XX } },
6906     { "(bad)",          { XX } },
6907     { "(bad)",          { XX } },
6908     { "(bad)",          { XX } },
6909     { "(bad)",          { XX } },
6910     { "(bad)",          { XX } },
6911     { "(bad)",          { XX } },
6912     /* d0 */
6913     { "(bad)",          { XX } },
6914     { "(bad)",          { XX } },
6915     { "(bad)",          { XX } },
6916     { "(bad)",          { XX } },
6917     { "(bad)",          { XX } },
6918     { "(bad)",          { XX } },
6919     { "(bad)",          { XX } },
6920     { "(bad)",          { XX } },
6921     /* d8 */
6922     { "(bad)",          { XX } },
6923     { "(bad)",          { XX } },
6924     { "(bad)",          { XX } },
6925     { "(bad)",          { XX } },
6926     { "(bad)",          { XX } },
6927     { "(bad)",          { XX } },
6928     { "(bad)",          { XX } },
6929     { "(bad)",          { XX } },
6930     /* e0 */
6931     { "(bad)",          { XX } },
6932     { "(bad)",          { XX } },
6933     { "(bad)",          { XX } },
6934     { "(bad)",          { XX } },
6935     { "(bad)",          { XX } },
6936     { "(bad)",          { XX } },
6937     { "(bad)",          { XX } },
6938     { "(bad)",          { XX } },
6939     /* e8 */
6940     { "(bad)",          { XX } },
6941     { "(bad)",          { XX } },
6942     { "(bad)",          { XX } },
6943     { "(bad)",          { XX } },
6944     { "(bad)",          { XX } },
6945     { "(bad)",          { XX } },
6946     { "(bad)",          { XX } },
6947     { "(bad)",          { XX } },
6948     /* f0 */
6949     { "(bad)",          { XX } },
6950     { "(bad)",          { XX } },
6951     { "(bad)",          { XX } },
6952     { "(bad)",          { XX } },
6953     { "(bad)",          { XX } },
6954     { "(bad)",          { XX } },
6955     { "(bad)",          { XX } },
6956     { "(bad)",          { XX } },
6957     /* f8 */
6958     { "(bad)",          { XX } },
6959     { "(bad)",          { XX } },
6960     { "(bad)",          { XX } },
6961     { "(bad)",          { XX } },
6962     { "(bad)",          { XX } },
6963     { "(bad)",          { XX } },
6964     { "(bad)",          { XX } },
6965     { "(bad)",          { XX } },
6966   },
6967 };
6968
6969 static const struct dis386 vex_table[][256] = {
6970   /* VEX_0F */
6971   {
6972     /* 00 */
6973     { "(bad)",          { XX } },
6974     { "(bad)",          { XX } },
6975     { "(bad)",          { XX } },
6976     { "(bad)",          { XX } },
6977     { "(bad)",          { XX } },
6978     { "(bad)",          { XX } },
6979     { "(bad)",          { XX } },
6980     { "(bad)",          { XX } },
6981     /* 08 */
6982     { "(bad)",          { XX } },
6983     { "(bad)",          { XX } },
6984     { "(bad)",          { XX } },
6985     { "(bad)",          { XX } },
6986     { "(bad)",          { XX } },
6987     { "(bad)",          { XX } },
6988     { "(bad)",          { XX } },
6989     { "(bad)",          { XX } },
6990     /* 10 */
6991     { PREFIX_TABLE (PREFIX_VEX_10) },
6992     { PREFIX_TABLE (PREFIX_VEX_11) },
6993     { PREFIX_TABLE (PREFIX_VEX_12) },
6994     { MOD_TABLE (MOD_VEX_13) },
6995     { "vunpcklpX",      { XM, Vex, EXx } },
6996     { "vunpckhpX",      { XM, Vex, EXx } },
6997     { PREFIX_TABLE (PREFIX_VEX_16) },
6998     { MOD_TABLE (MOD_VEX_17) },
6999     /* 18 */
7000     { "(bad)",          { XX } },
7001     { "(bad)",          { XX } },
7002     { "(bad)",          { XX } },
7003     { "(bad)",          { XX } },
7004     { "(bad)",          { XX } },
7005     { "(bad)",          { XX } },
7006     { "(bad)",          { XX } },
7007     { "(bad)",          { XX } },
7008     /* 20 */
7009     { "(bad)",          { XX } },
7010     { "(bad)",          { XX } },
7011     { "(bad)",          { XX } },
7012     { "(bad)",          { XX } },
7013     { "(bad)",          { XX } },
7014     { "(bad)",          { XX } },
7015     { "(bad)",          { XX } },
7016     { "(bad)",          { XX } },
7017     /* 28 */
7018     { "vmovapX",        { XM, EXx } },
7019     { "vmovapX",        { EXxS, XM } },
7020     { PREFIX_TABLE (PREFIX_VEX_2A) },
7021     { MOD_TABLE (MOD_VEX_2B) },
7022     { PREFIX_TABLE (PREFIX_VEX_2C) },
7023     { PREFIX_TABLE (PREFIX_VEX_2D) },
7024     { PREFIX_TABLE (PREFIX_VEX_2E) },
7025     { PREFIX_TABLE (PREFIX_VEX_2F) },
7026     /* 30 */
7027     { "(bad)",          { XX } },
7028     { "(bad)",          { XX } },
7029     { "(bad)",          { XX } },
7030     { "(bad)",          { XX } },
7031     { "(bad)",          { XX } },
7032     { "(bad)",          { XX } },
7033     { "(bad)",          { XX } },
7034     { "(bad)",          { XX } },
7035     /* 38 */
7036     { "(bad)",          { XX } },
7037     { "(bad)",          { XX } },
7038     { "(bad)",          { XX } },
7039     { "(bad)",          { XX } },
7040     { "(bad)",          { XX } },
7041     { "(bad)",          { XX } },
7042     { "(bad)",          { XX } },
7043     { "(bad)",          { XX } },
7044     /* 40 */
7045     { "(bad)",          { XX } },
7046     { "(bad)",          { XX } },
7047     { "(bad)",          { XX } },
7048     { "(bad)",          { XX } },
7049     { "(bad)",          { XX } },
7050     { "(bad)",          { XX } },
7051     { "(bad)",          { XX } },
7052     { "(bad)",          { XX } },
7053     /* 48 */
7054     { "(bad)",          { XX } },
7055     { "(bad)",          { XX } },
7056     { "(bad)",          { XX } },
7057     { "(bad)",          { XX } },
7058     { "(bad)",          { XX } },
7059     { "(bad)",          { XX } },
7060     { "(bad)",          { XX } },
7061     { "(bad)",          { XX } },
7062     /* 50 */
7063     { MOD_TABLE (MOD_VEX_51) },
7064     { PREFIX_TABLE (PREFIX_VEX_51) },
7065     { PREFIX_TABLE (PREFIX_VEX_52) },
7066     { PREFIX_TABLE (PREFIX_VEX_53) },
7067     { "vandpX",         { XM, Vex, EXx } },
7068     { "vandnpX",        { XM, Vex, EXx } },
7069     { "vorpX",          { XM, Vex, EXx } },
7070     { "vxorpX",         { XM, Vex, EXx } },
7071     /* 58 */
7072     { PREFIX_TABLE (PREFIX_VEX_58) },
7073     { PREFIX_TABLE (PREFIX_VEX_59) },
7074     { PREFIX_TABLE (PREFIX_VEX_5A) },
7075     { PREFIX_TABLE (PREFIX_VEX_5B) },
7076     { PREFIX_TABLE (PREFIX_VEX_5C) },
7077     { PREFIX_TABLE (PREFIX_VEX_5D) },
7078     { PREFIX_TABLE (PREFIX_VEX_5E) },
7079     { PREFIX_TABLE (PREFIX_VEX_5F) },
7080     /* 60 */
7081     { PREFIX_TABLE (PREFIX_VEX_60) },
7082     { PREFIX_TABLE (PREFIX_VEX_61) },
7083     { PREFIX_TABLE (PREFIX_VEX_62) },
7084     { PREFIX_TABLE (PREFIX_VEX_63) },
7085     { PREFIX_TABLE (PREFIX_VEX_64) },
7086     { PREFIX_TABLE (PREFIX_VEX_65) },
7087     { PREFIX_TABLE (PREFIX_VEX_66) },
7088     { PREFIX_TABLE (PREFIX_VEX_67) },
7089     /* 68 */
7090     { PREFIX_TABLE (PREFIX_VEX_68) },
7091     { PREFIX_TABLE (PREFIX_VEX_69) },
7092     { PREFIX_TABLE (PREFIX_VEX_6A) },
7093     { PREFIX_TABLE (PREFIX_VEX_6B) },
7094     { PREFIX_TABLE (PREFIX_VEX_6C) },
7095     { PREFIX_TABLE (PREFIX_VEX_6D) },
7096     { PREFIX_TABLE (PREFIX_VEX_6E) },
7097     { PREFIX_TABLE (PREFIX_VEX_6F) },
7098     /* 70 */
7099     { PREFIX_TABLE (PREFIX_VEX_70) },
7100     { REG_TABLE (REG_VEX_71) },
7101     { REG_TABLE (REG_VEX_72) },
7102     { REG_TABLE (REG_VEX_73) },
7103     { PREFIX_TABLE (PREFIX_VEX_74) },
7104     { PREFIX_TABLE (PREFIX_VEX_75) },
7105     { PREFIX_TABLE (PREFIX_VEX_76) },
7106     { PREFIX_TABLE (PREFIX_VEX_77) },
7107     /* 78 */
7108     { "(bad)",          { XX } },
7109     { "(bad)",          { XX } },
7110     { "(bad)",          { XX } },
7111     { "(bad)",          { XX } },
7112     { PREFIX_TABLE (PREFIX_VEX_7C) },
7113     { PREFIX_TABLE (PREFIX_VEX_7D) },
7114     { PREFIX_TABLE (PREFIX_VEX_7E) },
7115     { PREFIX_TABLE (PREFIX_VEX_7F) },
7116     /* 80 */
7117     { "(bad)",          { XX } },
7118     { "(bad)",          { XX } },
7119     { "(bad)",          { XX } },
7120     { "(bad)",          { XX } },
7121     { "(bad)",          { XX } },
7122     { "(bad)",          { XX } },
7123     { "(bad)",          { XX } },
7124     { "(bad)",          { XX } },
7125     /* 88 */
7126     { "(bad)",          { XX } },
7127     { "(bad)",          { XX } },
7128     { "(bad)",          { XX } },
7129     { "(bad)",          { XX } },
7130     { "(bad)",          { XX } },
7131     { "(bad)",          { XX } },
7132     { "(bad)",          { XX } },
7133     { "(bad)",          { XX } },
7134     /* 90 */
7135     { "(bad)",          { XX } },
7136     { "(bad)",          { XX } },
7137     { "(bad)",          { XX } },
7138     { "(bad)",          { XX } },
7139     { "(bad)",          { XX } },
7140     { "(bad)",          { XX } },
7141     { "(bad)",          { XX } },
7142     { "(bad)",          { XX } },
7143     /* 98 */
7144     { "(bad)",          { XX } },
7145     { "(bad)",          { XX } },
7146     { "(bad)",          { XX } },
7147     { "(bad)",          { XX } },
7148     { "(bad)",          { XX } },
7149     { "(bad)",          { XX } },
7150     { "(bad)",          { XX } },
7151     { "(bad)",          { XX } },
7152     /* a0 */
7153     { "(bad)",          { XX } },
7154     { "(bad)",          { XX } },
7155     { "(bad)",          { XX } },
7156     { "(bad)",          { XX } },
7157     { "(bad)",          { XX } },
7158     { "(bad)",          { XX } },
7159     { "(bad)",          { XX } },
7160     { "(bad)",          { XX } },
7161     /* a8 */
7162     { "(bad)",          { XX } },
7163     { "(bad)",          { XX } },
7164     { "(bad)",          { XX } },
7165     { "(bad)",          { XX } },
7166     { "(bad)",          { XX } },
7167     { "(bad)",          { XX } },
7168     { REG_TABLE (REG_VEX_AE) },
7169     { "(bad)",          { XX } },
7170     /* b0 */
7171     { "(bad)",          { XX } },
7172     { "(bad)",          { XX } },
7173     { "(bad)",          { XX } },
7174     { "(bad)",          { XX } },
7175     { "(bad)",          { XX } },
7176     { "(bad)",          { XX } },
7177     { "(bad)",          { XX } },
7178     { "(bad)",          { XX } },
7179     /* b8 */
7180     { "(bad)",          { XX } },
7181     { "(bad)",          { XX } },
7182     { "(bad)",          { XX } },
7183     { "(bad)",          { XX } },
7184     { "(bad)",          { XX } },
7185     { "(bad)",          { XX } },
7186     { "(bad)",          { XX } },
7187     { "(bad)",          { XX } },
7188     /* c0 */
7189     { "(bad)",          { XX } },
7190     { "(bad)",          { XX } },
7191     { PREFIX_TABLE (PREFIX_VEX_C2) },
7192     { "(bad)",          { XX } },
7193     { PREFIX_TABLE (PREFIX_VEX_C4) },
7194     { PREFIX_TABLE (PREFIX_VEX_C5) },
7195     { "vshufpX",        { XM, Vex, EXx, Ib } },
7196     { "(bad)",          { XX } },
7197     /* c8 */
7198     { "(bad)",          { XX } },
7199     { "(bad)",          { XX } },
7200     { "(bad)",          { XX } },
7201     { "(bad)",          { XX } },
7202     { "(bad)",          { XX } },
7203     { "(bad)",          { XX } },
7204     { "(bad)",          { XX } },
7205     { "(bad)",          { XX } },
7206     /* d0 */
7207     { PREFIX_TABLE (PREFIX_VEX_D0) },
7208     { PREFIX_TABLE (PREFIX_VEX_D1) },
7209     { PREFIX_TABLE (PREFIX_VEX_D2) },
7210     { PREFIX_TABLE (PREFIX_VEX_D3) },
7211     { PREFIX_TABLE (PREFIX_VEX_D4) },
7212     { PREFIX_TABLE (PREFIX_VEX_D5) },
7213     { PREFIX_TABLE (PREFIX_VEX_D6) },
7214     { PREFIX_TABLE (PREFIX_VEX_D7) },
7215     /* d8 */
7216     { PREFIX_TABLE (PREFIX_VEX_D8) },
7217     { PREFIX_TABLE (PREFIX_VEX_D9) },
7218     { PREFIX_TABLE (PREFIX_VEX_DA) },
7219     { PREFIX_TABLE (PREFIX_VEX_DB) },
7220     { PREFIX_TABLE (PREFIX_VEX_DC) },
7221     { PREFIX_TABLE (PREFIX_VEX_DD) },
7222     { PREFIX_TABLE (PREFIX_VEX_DE) },
7223     { PREFIX_TABLE (PREFIX_VEX_DF) },
7224     /* e0 */
7225     { PREFIX_TABLE (PREFIX_VEX_E0) },
7226     { PREFIX_TABLE (PREFIX_VEX_E1) },
7227     { PREFIX_TABLE (PREFIX_VEX_E2) },
7228     { PREFIX_TABLE (PREFIX_VEX_E3) },
7229     { PREFIX_TABLE (PREFIX_VEX_E4) },
7230     { PREFIX_TABLE (PREFIX_VEX_E5) },
7231     { PREFIX_TABLE (PREFIX_VEX_E6) },
7232     { PREFIX_TABLE (PREFIX_VEX_E7) },
7233     /* e8 */
7234     { PREFIX_TABLE (PREFIX_VEX_E8) },
7235     { PREFIX_TABLE (PREFIX_VEX_E9) },
7236     { PREFIX_TABLE (PREFIX_VEX_EA) },
7237     { PREFIX_TABLE (PREFIX_VEX_EB) },
7238     { PREFIX_TABLE (PREFIX_VEX_EC) },
7239     { PREFIX_TABLE (PREFIX_VEX_ED) },
7240     { PREFIX_TABLE (PREFIX_VEX_EE) },
7241     { PREFIX_TABLE (PREFIX_VEX_EF) },
7242     /* f0 */
7243     { PREFIX_TABLE (PREFIX_VEX_F0) },
7244     { PREFIX_TABLE (PREFIX_VEX_F1) },
7245     { PREFIX_TABLE (PREFIX_VEX_F2) },
7246     { PREFIX_TABLE (PREFIX_VEX_F3) },
7247     { PREFIX_TABLE (PREFIX_VEX_F4) },
7248     { PREFIX_TABLE (PREFIX_VEX_F5) },
7249     { PREFIX_TABLE (PREFIX_VEX_F6) },
7250     { PREFIX_TABLE (PREFIX_VEX_F7) },
7251     /* f8 */
7252     { PREFIX_TABLE (PREFIX_VEX_F8) },
7253     { PREFIX_TABLE (PREFIX_VEX_F9) },
7254     { PREFIX_TABLE (PREFIX_VEX_FA) },
7255     { PREFIX_TABLE (PREFIX_VEX_FB) },
7256     { PREFIX_TABLE (PREFIX_VEX_FC) },
7257     { PREFIX_TABLE (PREFIX_VEX_FD) },
7258     { PREFIX_TABLE (PREFIX_VEX_FE) },
7259     { "(bad)",          { XX } },
7260   },
7261   /* VEX_0F38 */
7262   {
7263     /* 00 */
7264     { PREFIX_TABLE (PREFIX_VEX_3800) },
7265     { PREFIX_TABLE (PREFIX_VEX_3801) },
7266     { PREFIX_TABLE (PREFIX_VEX_3802) },
7267     { PREFIX_TABLE (PREFIX_VEX_3803) },
7268     { PREFIX_TABLE (PREFIX_VEX_3804) },
7269     { PREFIX_TABLE (PREFIX_VEX_3805) },
7270     { PREFIX_TABLE (PREFIX_VEX_3806) },
7271     { PREFIX_TABLE (PREFIX_VEX_3807) },
7272     /* 08 */
7273     { PREFIX_TABLE (PREFIX_VEX_3808) },
7274     { PREFIX_TABLE (PREFIX_VEX_3809) },
7275     { PREFIX_TABLE (PREFIX_VEX_380A) },
7276     { PREFIX_TABLE (PREFIX_VEX_380B) },
7277     { PREFIX_TABLE (PREFIX_VEX_380C) },
7278     { PREFIX_TABLE (PREFIX_VEX_380D) },
7279     { PREFIX_TABLE (PREFIX_VEX_380E) },
7280     { PREFIX_TABLE (PREFIX_VEX_380F) },
7281     /* 10 */
7282     { "(bad)",          { XX } },
7283     { "(bad)",          { XX } },
7284     { "(bad)",          { XX } },
7285     { "(bad)",          { XX } },
7286     { "(bad)",          { XX } },
7287     { "(bad)",          { XX } },
7288     { "(bad)",          { XX } },
7289     { PREFIX_TABLE (PREFIX_VEX_3817) },
7290     /* 18 */
7291     { PREFIX_TABLE (PREFIX_VEX_3818) },
7292     { PREFIX_TABLE (PREFIX_VEX_3819) },
7293     { PREFIX_TABLE (PREFIX_VEX_381A) },
7294     { "(bad)",          { XX } },
7295     { PREFIX_TABLE (PREFIX_VEX_381C) },
7296     { PREFIX_TABLE (PREFIX_VEX_381D) },
7297     { PREFIX_TABLE (PREFIX_VEX_381E) },
7298     { "(bad)",          { XX } },
7299     /* 20 */
7300     { PREFIX_TABLE (PREFIX_VEX_3820) },
7301     { PREFIX_TABLE (PREFIX_VEX_3821) },
7302     { PREFIX_TABLE (PREFIX_VEX_3822) },
7303     { PREFIX_TABLE (PREFIX_VEX_3823) },
7304     { PREFIX_TABLE (PREFIX_VEX_3824) },
7305     { PREFIX_TABLE (PREFIX_VEX_3825) },
7306     { "(bad)",          { XX } },
7307     { "(bad)",          { XX } },
7308     /* 28 */
7309     { PREFIX_TABLE (PREFIX_VEX_3828) },
7310     { PREFIX_TABLE (PREFIX_VEX_3829) },
7311     { PREFIX_TABLE (PREFIX_VEX_382A) },
7312     { PREFIX_TABLE (PREFIX_VEX_382B) },
7313     { PREFIX_TABLE (PREFIX_VEX_382C) },
7314     { PREFIX_TABLE (PREFIX_VEX_382D) },
7315     { PREFIX_TABLE (PREFIX_VEX_382E) },
7316     { PREFIX_TABLE (PREFIX_VEX_382F) },
7317     /* 30 */
7318     { PREFIX_TABLE (PREFIX_VEX_3830) },
7319     { PREFIX_TABLE (PREFIX_VEX_3831) },
7320     { PREFIX_TABLE (PREFIX_VEX_3832) },
7321     { PREFIX_TABLE (PREFIX_VEX_3833) },
7322     { PREFIX_TABLE (PREFIX_VEX_3834) },
7323     { PREFIX_TABLE (PREFIX_VEX_3835) },
7324     { "(bad)",          { XX } },
7325     { PREFIX_TABLE (PREFIX_VEX_3837) },
7326     /* 38 */
7327     { PREFIX_TABLE (PREFIX_VEX_3838) },
7328     { PREFIX_TABLE (PREFIX_VEX_3839) },
7329     { PREFIX_TABLE (PREFIX_VEX_383A) },
7330     { PREFIX_TABLE (PREFIX_VEX_383B) },
7331     { PREFIX_TABLE (PREFIX_VEX_383C) },
7332     { PREFIX_TABLE (PREFIX_VEX_383D) },
7333     { PREFIX_TABLE (PREFIX_VEX_383E) },
7334     { PREFIX_TABLE (PREFIX_VEX_383F) },
7335     /* 40 */
7336     { PREFIX_TABLE (PREFIX_VEX_3840) },
7337     { PREFIX_TABLE (PREFIX_VEX_3841) },
7338     { "(bad)",          { XX } },
7339     { "(bad)",          { XX } },
7340     { "(bad)",          { XX } },
7341     { "(bad)",          { XX } },
7342     { "(bad)",          { XX } },
7343     { "(bad)",          { XX } },
7344     /* 48 */
7345     { "(bad)",          { XX } },
7346     { "(bad)",          { XX } },
7347     { "(bad)",          { XX } },
7348     { "(bad)",          { XX } },
7349     { "(bad)",          { XX } },
7350     { "(bad)",          { XX } },
7351     { "(bad)",          { XX } },
7352     { "(bad)",          { XX } },
7353     /* 50 */
7354     { "(bad)",          { XX } },
7355     { "(bad)",          { XX } },
7356     { "(bad)",          { XX } },
7357     { "(bad)",          { XX } },
7358     { "(bad)",          { XX } },
7359     { "(bad)",          { XX } },
7360     { "(bad)",          { XX } },
7361     { "(bad)",          { XX } },
7362     /* 58 */
7363     { "(bad)",          { XX } },
7364     { "(bad)",          { XX } },
7365     { "(bad)",          { XX } },
7366     { "(bad)",          { XX } },
7367     { "(bad)",          { XX } },
7368     { "(bad)",          { XX } },
7369     { "(bad)",          { XX } },
7370     { "(bad)",          { XX } },
7371     /* 60 */
7372     { "(bad)",          { XX } },
7373     { "(bad)",          { XX } },
7374     { "(bad)",          { XX } },
7375     { "(bad)",          { XX } },
7376     { "(bad)",          { XX } },
7377     { "(bad)",          { XX } },
7378     { "(bad)",          { XX } },
7379     { "(bad)",          { XX } },
7380     /* 68 */
7381     { "(bad)",          { XX } },
7382     { "(bad)",          { XX } },
7383     { "(bad)",          { XX } },
7384     { "(bad)",          { XX } },
7385     { "(bad)",          { XX } },
7386     { "(bad)",          { XX } },
7387     { "(bad)",          { XX } },
7388     { "(bad)",          { XX } },
7389     /* 70 */
7390     { "(bad)",          { XX } },
7391     { "(bad)",          { XX } },
7392     { "(bad)",          { XX } },
7393     { "(bad)",          { XX } },
7394     { "(bad)",          { XX } },
7395     { "(bad)",          { XX } },
7396     { "(bad)",          { XX } },
7397     { "(bad)",          { XX } },
7398     /* 78 */
7399     { "(bad)",          { XX } },
7400     { "(bad)",          { XX } },
7401     { "(bad)",          { XX } },
7402     { "(bad)",          { XX } },
7403     { "(bad)",          { XX } },
7404     { "(bad)",          { XX } },
7405     { "(bad)",          { XX } },
7406     { "(bad)",          { XX } },
7407     /* 80 */
7408     { "(bad)",          { XX } },
7409     { "(bad)",          { XX } },
7410     { "(bad)",          { XX } },
7411     { "(bad)",          { XX } },
7412     { "(bad)",          { XX } },
7413     { "(bad)",          { XX } },
7414     { "(bad)",          { XX } },
7415     { "(bad)",          { XX } },
7416     /* 88 */
7417     { "(bad)",          { XX } },
7418     { "(bad)",          { XX } },
7419     { "(bad)",          { XX } },
7420     { "(bad)",          { XX } },
7421     { "(bad)",          { XX } },
7422     { "(bad)",          { XX } },
7423     { "(bad)",          { XX } },
7424     { "(bad)",          { XX } },
7425     /* 90 */
7426     { "(bad)",          { XX } },
7427     { "(bad)",          { XX } },
7428     { "(bad)",          { XX } },
7429     { "(bad)",          { XX } },
7430     { "(bad)",          { XX } },
7431     { "(bad)",          { XX } },
7432     { PREFIX_TABLE (PREFIX_VEX_3896) },
7433     { PREFIX_TABLE (PREFIX_VEX_3897) },
7434     /* 98 */
7435     { PREFIX_TABLE (PREFIX_VEX_3898) },
7436     { PREFIX_TABLE (PREFIX_VEX_3899) },
7437     { PREFIX_TABLE (PREFIX_VEX_389A) },
7438     { PREFIX_TABLE (PREFIX_VEX_389B) },
7439     { PREFIX_TABLE (PREFIX_VEX_389C) },
7440     { PREFIX_TABLE (PREFIX_VEX_389D) },
7441     { PREFIX_TABLE (PREFIX_VEX_389E) },
7442     { PREFIX_TABLE (PREFIX_VEX_389F) },
7443     /* a0 */
7444     { "(bad)",          { XX } },
7445     { "(bad)",          { XX } },
7446     { "(bad)",          { XX } },
7447     { "(bad)",          { XX } },
7448     { "(bad)",          { XX } },
7449     { "(bad)",          { XX } },
7450     { PREFIX_TABLE (PREFIX_VEX_38A6) },
7451     { PREFIX_TABLE (PREFIX_VEX_38A7) },
7452     /* a8 */
7453     { PREFIX_TABLE (PREFIX_VEX_38A8) },
7454     { PREFIX_TABLE (PREFIX_VEX_38A9) },
7455     { PREFIX_TABLE (PREFIX_VEX_38AA) },
7456     { PREFIX_TABLE (PREFIX_VEX_38AB) },
7457     { PREFIX_TABLE (PREFIX_VEX_38AC) },
7458     { PREFIX_TABLE (PREFIX_VEX_38AD) },
7459     { PREFIX_TABLE (PREFIX_VEX_38AE) },
7460     { PREFIX_TABLE (PREFIX_VEX_38AF) },
7461     /* b0 */
7462     { "(bad)",          { XX } },
7463     { "(bad)",          { XX } },
7464     { "(bad)",          { XX } },
7465     { "(bad)",          { XX } },
7466     { "(bad)",          { XX } },
7467     { "(bad)",          { XX } },
7468     { PREFIX_TABLE (PREFIX_VEX_38B6) },
7469     { PREFIX_TABLE (PREFIX_VEX_38B7) },
7470     /* b8 */
7471     { PREFIX_TABLE (PREFIX_VEX_38B8) },
7472     { PREFIX_TABLE (PREFIX_VEX_38B9) },
7473     { PREFIX_TABLE (PREFIX_VEX_38BA) },
7474     { PREFIX_TABLE (PREFIX_VEX_38BB) },
7475     { PREFIX_TABLE (PREFIX_VEX_38BC) },
7476     { PREFIX_TABLE (PREFIX_VEX_38BD) },
7477     { PREFIX_TABLE (PREFIX_VEX_38BE) },
7478     { PREFIX_TABLE (PREFIX_VEX_38BF) },
7479     /* c0 */
7480     { "(bad)",          { XX } },
7481     { "(bad)",          { XX } },
7482     { "(bad)",          { XX } },
7483     { "(bad)",          { XX } },
7484     { "(bad)",          { XX } },
7485     { "(bad)",          { XX } },
7486     { "(bad)",          { XX } },
7487     { "(bad)",          { XX } },
7488     /* c8 */
7489     { "(bad)",          { XX } },
7490     { "(bad)",          { XX } },
7491     { "(bad)",          { XX } },
7492     { "(bad)",          { XX } },
7493     { "(bad)",          { XX } },
7494     { "(bad)",          { XX } },
7495     { "(bad)",          { XX } },
7496     { "(bad)",          { XX } },
7497     /* d0 */
7498     { "(bad)",          { XX } },
7499     { "(bad)",          { XX } },
7500     { "(bad)",          { XX } },
7501     { "(bad)",          { XX } },
7502     { "(bad)",          { XX } },
7503     { "(bad)",          { XX } },
7504     { "(bad)",          { XX } },
7505     { "(bad)",          { XX } },
7506     /* d8 */
7507     { "(bad)",          { XX } },
7508     { "(bad)",          { XX } },
7509     { "(bad)",          { XX } },
7510     { PREFIX_TABLE (PREFIX_VEX_38DB) },
7511     { PREFIX_TABLE (PREFIX_VEX_38DC) },
7512     { PREFIX_TABLE (PREFIX_VEX_38DD) },
7513     { PREFIX_TABLE (PREFIX_VEX_38DE) },
7514     { PREFIX_TABLE (PREFIX_VEX_38DF) },
7515     /* e0 */
7516     { "(bad)",          { XX } },
7517     { "(bad)",          { XX } },
7518     { "(bad)",          { XX } },
7519     { "(bad)",          { XX } },
7520     { "(bad)",          { XX } },
7521     { "(bad)",          { XX } },
7522     { "(bad)",          { XX } },
7523     { "(bad)",          { XX } },
7524     /* e8 */
7525     { "(bad)",          { XX } },
7526     { "(bad)",          { XX } },
7527     { "(bad)",          { XX } },
7528     { "(bad)",          { XX } },
7529     { "(bad)",          { XX } },
7530     { "(bad)",          { XX } },
7531     { "(bad)",          { XX } },
7532     { "(bad)",          { XX } },
7533     /* f0 */
7534     { "(bad)",          { XX } },
7535     { "(bad)",          { XX } },
7536     { "(bad)",          { XX } },
7537     { "(bad)",          { XX } },
7538     { "(bad)",          { XX } },
7539     { "(bad)",          { XX } },
7540     { "(bad)",          { XX } },
7541     { "(bad)",          { XX } },
7542     /* f8 */
7543     { "(bad)",          { XX } },
7544     { "(bad)",          { XX } },
7545     { "(bad)",          { XX } },
7546     { "(bad)",          { XX } },
7547     { "(bad)",          { XX } },
7548     { "(bad)",          { XX } },
7549     { "(bad)",          { XX } },
7550     { "(bad)",          { XX } },
7551   },
7552   /* VEX_0F3A */
7553   {
7554     /* 00 */
7555     { "(bad)",          { XX } },
7556     { "(bad)",          { XX } },
7557     { "(bad)",          { XX } },
7558     { "(bad)",          { XX } },
7559     { PREFIX_TABLE (PREFIX_VEX_3A04) },
7560     { PREFIX_TABLE (PREFIX_VEX_3A05) },
7561     { PREFIX_TABLE (PREFIX_VEX_3A06) },
7562     { "(bad)",          { XX } },
7563     /* 08 */
7564     { PREFIX_TABLE (PREFIX_VEX_3A08) },
7565     { PREFIX_TABLE (PREFIX_VEX_3A09) },
7566     { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7567     { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7568     { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7569     { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7570     { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7571     { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7572     /* 10 */
7573     { "(bad)",          { XX } },
7574     { "(bad)",          { XX } },
7575     { "(bad)",          { XX } },
7576     { "(bad)",          { XX } },
7577     { PREFIX_TABLE (PREFIX_VEX_3A14) },
7578     { PREFIX_TABLE (PREFIX_VEX_3A15) },
7579     { PREFIX_TABLE (PREFIX_VEX_3A16) },
7580     { PREFIX_TABLE (PREFIX_VEX_3A17) },
7581     /* 18 */
7582     { PREFIX_TABLE (PREFIX_VEX_3A18) },
7583     { PREFIX_TABLE (PREFIX_VEX_3A19) },
7584     { "(bad)",          { XX } },
7585     { "(bad)",          { XX } },
7586     { "(bad)",          { XX } },
7587     { "(bad)",          { XX } },
7588     { "(bad)",          { XX } },
7589     { "(bad)",          { XX } },
7590     /* 20 */
7591     { PREFIX_TABLE (PREFIX_VEX_3A20) },
7592     { PREFIX_TABLE (PREFIX_VEX_3A21) },
7593     { PREFIX_TABLE (PREFIX_VEX_3A22) },
7594     { "(bad)",          { XX } },
7595     { "(bad)",          { XX } },
7596     { "(bad)",          { XX } },
7597     { "(bad)",          { XX } },
7598     { "(bad)",          { XX } },
7599     /* 28 */
7600     { "(bad)",          { XX } },
7601     { "(bad)",          { XX } },
7602     { "(bad)",          { XX } },
7603     { "(bad)",          { XX } },
7604     { "(bad)",          { XX } },
7605     { "(bad)",          { XX } },
7606     { "(bad)",          { XX } },
7607     { "(bad)",          { XX } },
7608     /* 30 */
7609     { "(bad)",          { XX } },
7610     { "(bad)",          { XX } },
7611     { "(bad)",          { XX } },
7612     { "(bad)",          { XX } },
7613     { "(bad)",          { XX } },
7614     { "(bad)",          { XX } },
7615     { "(bad)",          { XX } },
7616     { "(bad)",          { XX } },
7617     /* 38 */
7618     { "(bad)",          { XX } },
7619     { "(bad)",          { XX } },
7620     { "(bad)",          { XX } },
7621     { "(bad)",          { XX } },
7622     { "(bad)",          { XX } },
7623     { "(bad)",          { XX } },
7624     { "(bad)",          { XX } },
7625     { "(bad)",          { XX } },
7626     /* 40 */
7627     { PREFIX_TABLE (PREFIX_VEX_3A40) },
7628     { PREFIX_TABLE (PREFIX_VEX_3A41) },
7629     { PREFIX_TABLE (PREFIX_VEX_3A42) },
7630     { "(bad)",          { XX } },
7631     { PREFIX_TABLE (PREFIX_VEX_3A44) },
7632     { "(bad)",          { XX } },
7633     { "(bad)",          { XX } },
7634     { "(bad)",          { XX } },
7635     /* 48 */
7636     { "(bad)",          { XX } },
7637     { "(bad)",          { XX } },
7638     { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7639     { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7640     { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7641     { "(bad)",          { XX } },
7642     { "(bad)",          { XX } },
7643     { "(bad)",          { XX } },
7644     /* 50 */
7645     { "(bad)",          { XX } },
7646     { "(bad)",          { XX } },
7647     { "(bad)",          { XX } },
7648     { "(bad)",          { XX } },
7649     { "(bad)",          { XX } },
7650     { "(bad)",          { XX } },
7651     { "(bad)",          { XX } },
7652     { "(bad)",          { XX } },
7653     /* 58 */
7654     { "(bad)",          { XX } },
7655     { "(bad)",          { XX } },
7656     { "(bad)",          { XX } },
7657     { "(bad)",          { XX } },
7658     { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7659     { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7660     { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7661     { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7662     /* 60 */
7663     { PREFIX_TABLE (PREFIX_VEX_3A60) },
7664     { PREFIX_TABLE (PREFIX_VEX_3A61) },
7665     { PREFIX_TABLE (PREFIX_VEX_3A62) },
7666     { PREFIX_TABLE (PREFIX_VEX_3A63) },
7667     { "(bad)",          { XX } },
7668     { "(bad)",          { XX } },
7669     { "(bad)",          { XX } },
7670     { "(bad)",          { XX } },
7671     /* 68 */
7672     { PREFIX_TABLE (PREFIX_VEX_3A68) },
7673     { PREFIX_TABLE (PREFIX_VEX_3A69) },
7674     { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7675     { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7676     { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7677     { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7678     { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7679     { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7680     /* 70 */
7681     { "(bad)",          { XX } },
7682     { "(bad)",          { XX } },
7683     { "(bad)",          { XX } },
7684     { "(bad)",          { XX } },
7685     { "(bad)",          { XX } },
7686     { "(bad)",          { XX } },
7687     { "(bad)",          { XX } },
7688     { "(bad)",          { XX } },
7689     /* 78 */
7690     { PREFIX_TABLE (PREFIX_VEX_3A78) },
7691     { PREFIX_TABLE (PREFIX_VEX_3A79) },
7692     { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7693     { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7694     { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7695     { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7696     { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7697     { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7698     /* 80 */
7699     { "(bad)",          { XX } },
7700     { "(bad)",          { XX } },
7701     { "(bad)",          { XX } },
7702     { "(bad)",          { XX } },
7703     { "(bad)",          { XX } },
7704     { "(bad)",          { XX } },
7705     { "(bad)",          { XX } },
7706     { "(bad)",          { XX } },
7707     /* 88 */
7708     { "(bad)",          { XX } },
7709     { "(bad)",          { XX } },
7710     { "(bad)",          { XX } },
7711     { "(bad)",          { XX } },
7712     { "(bad)",          { XX } },
7713     { "(bad)",          { XX } },
7714     { "(bad)",          { XX } },
7715     { "(bad)",          { XX } },
7716     /* 90 */
7717     { "(bad)",          { XX } },
7718     { "(bad)",          { XX } },
7719     { "(bad)",          { XX } },
7720     { "(bad)",          { XX } },
7721     { "(bad)",          { XX } },
7722     { "(bad)",          { XX } },
7723     { "(bad)",          { XX } },
7724     { "(bad)",          { XX } },
7725     /* 98 */
7726     { "(bad)",          { XX } },
7727     { "(bad)",          { XX } },
7728     { "(bad)",          { XX } },
7729     { "(bad)",          { XX } },
7730     { "(bad)",          { XX } },
7731     { "(bad)",          { XX } },
7732     { "(bad)",          { XX } },
7733     { "(bad)",          { XX } },
7734     /* a0 */
7735     { "(bad)",          { XX } },
7736     { "(bad)",          { XX } },
7737     { "(bad)",          { XX } },
7738     { "(bad)",          { XX } },
7739     { "(bad)",          { XX } },
7740     { "(bad)",          { XX } },
7741     { "(bad)",          { XX } },
7742     { "(bad)",          { XX } },
7743     /* a8 */
7744     { "(bad)",          { XX } },
7745     { "(bad)",          { XX } },
7746     { "(bad)",          { XX } },
7747     { "(bad)",          { XX } },
7748     { "(bad)",          { XX } },
7749     { "(bad)",          { XX } },
7750     { "(bad)",          { XX } },
7751     { "(bad)",          { XX } },
7752     /* b0 */
7753     { "(bad)",          { XX } },
7754     { "(bad)",          { XX } },
7755     { "(bad)",          { XX } },
7756     { "(bad)",          { XX } },
7757     { "(bad)",          { XX } },
7758     { "(bad)",          { XX } },
7759     { "(bad)",          { XX } },
7760     { "(bad)",          { XX } },
7761     /* b8 */
7762     { "(bad)",          { XX } },
7763     { "(bad)",          { XX } },
7764     { "(bad)",          { XX } },
7765     { "(bad)",          { XX } },
7766     { "(bad)",          { XX } },
7767     { "(bad)",          { XX } },
7768     { "(bad)",          { XX } },
7769     { "(bad)",          { XX } },
7770     /* c0 */
7771     { "(bad)",          { XX } },
7772     { "(bad)",          { XX } },
7773     { "(bad)",          { XX } },
7774     { "(bad)",          { XX } },
7775     { "(bad)",          { XX } },
7776     { "(bad)",          { XX } },
7777     { "(bad)",          { XX } },
7778     { "(bad)",          { XX } },
7779     /* c8 */
7780     { "(bad)",          { XX } },
7781     { "(bad)",          { XX } },
7782     { "(bad)",          { XX } },
7783     { "(bad)",          { XX } },
7784     { "(bad)",          { XX } },
7785     { "(bad)",          { XX } },
7786     { "(bad)",          { XX } },
7787     { "(bad)",          { XX } },
7788     /* d0 */
7789     { "(bad)",          { XX } },
7790     { "(bad)",          { XX } },
7791     { "(bad)",          { XX } },
7792     { "(bad)",          { XX } },
7793     { "(bad)",          { XX } },
7794     { "(bad)",          { XX } },
7795     { "(bad)",          { XX } },
7796     { "(bad)",          { XX } },
7797     /* d8 */
7798     { "(bad)",          { XX } },
7799     { "(bad)",          { XX } },
7800     { "(bad)",          { XX } },
7801     { "(bad)",          { XX } },
7802     { "(bad)",          { XX } },
7803     { "(bad)",          { XX } },
7804     { "(bad)",          { XX } },
7805     { PREFIX_TABLE (PREFIX_VEX_3ADF) },
7806     /* e0 */
7807     { "(bad)",          { XX } },
7808     { "(bad)",          { XX } },
7809     { "(bad)",          { XX } },
7810     { "(bad)",          { XX } },
7811     { "(bad)",          { XX } },
7812     { "(bad)",          { XX } },
7813     { "(bad)",          { XX } },
7814     { "(bad)",          { XX } },
7815     /* e8 */
7816     { "(bad)",          { XX } },
7817     { "(bad)",          { XX } },
7818     { "(bad)",          { XX } },
7819     { "(bad)",          { XX } },
7820     { "(bad)",          { XX } },
7821     { "(bad)",          { XX } },
7822     { "(bad)",          { XX } },
7823     { "(bad)",          { XX } },
7824     /* f0 */
7825     { "(bad)",          { XX } },
7826     { "(bad)",          { XX } },
7827     { "(bad)",          { XX } },
7828     { "(bad)",          { XX } },
7829     { "(bad)",          { XX } },
7830     { "(bad)",          { XX } },
7831     { "(bad)",          { XX } },
7832     { "(bad)",          { XX } },
7833     /* f8 */
7834     { "(bad)",          { XX } },
7835     { "(bad)",          { XX } },
7836     { "(bad)",          { XX } },
7837     { "(bad)",          { XX } },
7838     { "(bad)",          { XX } },
7839     { "(bad)",          { XX } },
7840     { "(bad)",          { XX } },
7841     { "(bad)",          { XX } },
7842   },
7843 };
7844
7845 static const struct dis386 vex_len_table[][2] = {
7846   /* VEX_LEN_10_P_1 */
7847   {
7848     { "vmovss",         { XMVex, Vex128, EXd } },
7849     { "(bad)",          { XX } },
7850   },
7851
7852   /* VEX_LEN_10_P_3 */
7853   {
7854     { "vmovsd",         { XMVex, Vex128, EXq } },
7855     { "(bad)",          { XX } },
7856   },
7857
7858   /* VEX_LEN_11_P_1 */
7859   {
7860     { "vmovss",         { EXdVexS, Vex128, XM } },
7861     { "(bad)",          { XX } },
7862   },
7863
7864   /* VEX_LEN_11_P_3 */
7865   {
7866     { "vmovsd",         { EXqVexS, Vex128, XM } },
7867     { "(bad)",          { XX } },
7868   },
7869
7870   /* VEX_LEN_12_P_0_M_0 */
7871   {
7872     { "vmovlps",        { XM, Vex128, EXq } },
7873     { "(bad)",          { XX } },
7874   },
7875
7876   /* VEX_LEN_12_P_0_M_1 */
7877   {
7878     { "vmovhlps",       { XM, Vex128, EXq } },
7879     { "(bad)",          { XX } },
7880   },
7881
7882   /* VEX_LEN_12_P_2 */
7883   {
7884     { "vmovlpd",        { XM, Vex128, EXq } },
7885     { "(bad)",          { XX } },
7886   },
7887
7888   /* VEX_LEN_13_M_0 */
7889   {
7890     { "vmovlpX",        { EXq, XM } },
7891     { "(bad)",          { XX } },
7892   },
7893
7894   /* VEX_LEN_16_P_0_M_0 */
7895   {
7896     { "vmovhps",        { XM, Vex128, EXq } },
7897     { "(bad)",          { XX } },
7898   },
7899
7900   /* VEX_LEN_16_P_0_M_1 */
7901   {
7902     { "vmovlhps",       { XM, Vex128, EXq } },
7903     { "(bad)",          { XX } },
7904   },
7905
7906   /* VEX_LEN_16_P_2 */
7907   {
7908     { "vmovhpd",        { XM, Vex128, EXq } },
7909     { "(bad)",          { XX } },
7910   },
7911
7912   /* VEX_LEN_17_M_0 */
7913   {
7914     { "vmovhpX",        { EXq, XM } },
7915     { "(bad)",          { XX } },
7916   },
7917
7918   /* VEX_LEN_2A_P_1 */
7919   {
7920     { "vcvtsi2ss%LQ",   { XM, Vex128, Ev } },
7921     { "(bad)",          { XX } },
7922   },
7923
7924   /* VEX_LEN_2A_P_3 */
7925   {
7926     { "vcvtsi2sd%LQ",   { XM, Vex128, Ev } },
7927     { "(bad)",          { XX } },
7928   },
7929
7930   /* VEX_LEN_2C_P_1 */
7931   {
7932     { "vcvttss2siY",    { Gv, EXd } },
7933     { "(bad)",          { XX } },
7934   },
7935
7936   /* VEX_LEN_2C_P_3 */
7937   {
7938     { "vcvttsd2siY",    { Gv, EXq } },
7939     { "(bad)",          { XX } },
7940   },
7941
7942   /* VEX_LEN_2D_P_1 */
7943   {
7944     { "vcvtss2siY",     { Gv, EXd } },
7945     { "(bad)",          { XX } },
7946   },
7947
7948   /* VEX_LEN_2D_P_3 */
7949   {
7950     { "vcvtsd2siY",     { Gv, EXq } },
7951     { "(bad)",          { XX } },
7952   },
7953
7954   /* VEX_LEN_2E_P_0 */
7955   {
7956     { "vucomiss",       { XM, EXd } }, 
7957     { "(bad)",          { XX } },
7958   },
7959
7960   /* VEX_LEN_2E_P_2 */
7961   {
7962     { "vucomisd",       { XM, EXq } }, 
7963     { "(bad)",          { XX } },
7964   },
7965
7966   /* VEX_LEN_2F_P_0 */
7967   {
7968     { "vcomiss",        { XM, EXd } },
7969     { "(bad)",          { XX } },
7970   },
7971
7972   /* VEX_LEN_2F_P_2 */
7973   {
7974     { "vcomisd",        { XM, EXq } },
7975     { "(bad)",          { XX } },
7976   },
7977
7978   /* VEX_LEN_51_P_1 */
7979   {
7980     { "vsqrtss",        { XM, Vex128, EXd } },
7981     { "(bad)",          { XX } },
7982   },
7983
7984   /* VEX_LEN_51_P_3 */
7985   {
7986     { "vsqrtsd",        { XM, Vex128, EXq } },
7987     { "(bad)",          { XX } },
7988   },
7989
7990   /* VEX_LEN_52_P_1 */
7991   {
7992     { "vrsqrtss",       { XM, Vex128, EXd } },
7993     { "(bad)",          { XX } },
7994   },
7995
7996   /* VEX_LEN_53_P_1 */
7997   {
7998     { "vrcpss",         { XM, Vex128, EXd } },
7999     { "(bad)",          { XX } },
8000   },
8001
8002   /* VEX_LEN_58_P_1 */
8003   {
8004     { "vaddss",         { XM, Vex128, EXd } },
8005     { "(bad)",          { XX } },
8006   },
8007
8008   /* VEX_LEN_58_P_3 */
8009   {
8010     { "vaddsd",         { XM, Vex128, EXq } },
8011     { "(bad)",          { XX } },
8012   },
8013
8014   /* VEX_LEN_59_P_1 */
8015   {
8016     { "vmulss",         { XM, Vex128, EXd } },
8017     { "(bad)",          { XX } },
8018   },
8019
8020   /* VEX_LEN_59_P_3 */
8021   {
8022     { "vmulsd",         { XM, Vex128, EXq } },
8023     { "(bad)",          { XX } },
8024   },
8025
8026   /* VEX_LEN_5A_P_1 */
8027   {
8028     { "vcvtss2sd",      { XM, Vex128, EXd } },
8029     { "(bad)",          { XX } },
8030   },
8031
8032   /* VEX_LEN_5A_P_3 */
8033   {
8034     { "vcvtsd2ss",      { XM, Vex128, EXq } },
8035     { "(bad)",          { XX } },
8036   },
8037
8038   /* VEX_LEN_5C_P_1 */
8039   {
8040     { "vsubss",         { XM, Vex128, EXd } },
8041     { "(bad)",          { XX } },
8042   },
8043
8044   /* VEX_LEN_5C_P_3 */
8045   {
8046     { "vsubsd",         { XM, Vex128, EXq } },
8047     { "(bad)",          { XX } },
8048   },
8049
8050   /* VEX_LEN_5D_P_1 */
8051   {
8052     { "vminss",         { XM, Vex128, EXd } },
8053     { "(bad)",          { XX } },
8054   },
8055
8056   /* VEX_LEN_5D_P_3 */
8057   {
8058     { "vminsd",         { XM, Vex128, EXq } },
8059     { "(bad)",          { XX } },
8060   },
8061
8062   /* VEX_LEN_5E_P_1 */
8063   {
8064     { "vdivss",         { XM, Vex128, EXd } },
8065     { "(bad)",          { XX } },
8066   },
8067
8068   /* VEX_LEN_5E_P_3 */
8069   {
8070     { "vdivsd",         { XM, Vex128, EXq } },
8071     { "(bad)",          { XX } },
8072   },
8073
8074   /* VEX_LEN_5F_P_1 */
8075   {
8076     { "vmaxss",         { XM, Vex128, EXd } },
8077     { "(bad)",          { XX } },
8078   },
8079
8080   /* VEX_LEN_5F_P_3 */
8081   {
8082     { "vmaxsd",         { XM, Vex128, EXq } },
8083     { "(bad)",          { XX } },
8084   },
8085
8086   /* VEX_LEN_60_P_2 */
8087   {
8088     { "vpunpcklbw",     { XM, Vex128, EXx } },
8089     { "(bad)",          { XX } },
8090   },
8091
8092   /* VEX_LEN_61_P_2 */
8093   {
8094     { "vpunpcklwd",     { XM, Vex128, EXx } },
8095     { "(bad)",          { XX } },
8096   },
8097
8098   /* VEX_LEN_62_P_2 */
8099   {
8100     { "vpunpckldq",     { XM, Vex128, EXx } },
8101     { "(bad)",          { XX } },
8102   },
8103
8104   /* VEX_LEN_63_P_2 */
8105   {
8106     { "vpacksswb",      { XM, Vex128, EXx } },
8107     { "(bad)",          { XX } },
8108   },
8109
8110   /* VEX_LEN_64_P_2 */
8111   {
8112     { "vpcmpgtb",       { XM, Vex128, EXx } },
8113     { "(bad)",          { XX } },
8114   },
8115
8116   /* VEX_LEN_65_P_2 */
8117   {
8118     { "vpcmpgtw",       { XM, Vex128, EXx } },
8119     { "(bad)",          { XX } },
8120   },
8121
8122   /* VEX_LEN_66_P_2 */
8123   {
8124     { "vpcmpgtd",       { XM, Vex128, EXx } },
8125     { "(bad)",          { XX } },
8126   },
8127
8128   /* VEX_LEN_67_P_2 */
8129   {
8130     { "vpackuswb",      { XM, Vex128, EXx } },
8131     { "(bad)",          { XX } },
8132   },
8133
8134   /* VEX_LEN_68_P_2 */
8135   {
8136     { "vpunpckhbw",     { XM, Vex128, EXx } },
8137     { "(bad)",          { XX } },
8138   },
8139
8140   /* VEX_LEN_69_P_2 */
8141   {
8142     { "vpunpckhwd",     { XM, Vex128, EXx } },
8143     { "(bad)",          { XX } },
8144   },
8145
8146   /* VEX_LEN_6A_P_2 */
8147   {
8148     { "vpunpckhdq",     { XM, Vex128, EXx } },
8149     { "(bad)",          { XX } },
8150   },
8151
8152   /* VEX_LEN_6B_P_2 */
8153   {
8154     { "vpackssdw",      { XM, Vex128, EXx } },
8155     { "(bad)",          { XX } },
8156   },
8157
8158   /* VEX_LEN_6C_P_2 */
8159   {
8160     { "vpunpcklqdq",    { XM, Vex128, EXx } },
8161     { "(bad)",          { XX } },
8162   },
8163
8164   /* VEX_LEN_6D_P_2 */
8165   {
8166     { "vpunpckhqdq",    { XM, Vex128, EXx } },
8167     { "(bad)",          { XX } },
8168   },
8169
8170   /* VEX_LEN_6E_P_2 */
8171   {
8172     { "vmovK",          { XM, Edq } },
8173     { "(bad)",          { XX } },
8174   },
8175
8176   /* VEX_LEN_70_P_1 */
8177   {
8178     { "vpshufhw",       { XM, EXx, Ib } },
8179     { "(bad)",          { XX } },
8180   },
8181
8182   /* VEX_LEN_70_P_2 */
8183   {
8184     { "vpshufd",        { XM, EXx, Ib } },
8185     { "(bad)",          { XX } },
8186   },
8187
8188   /* VEX_LEN_70_P_3 */
8189   {
8190     { "vpshuflw",       { XM, EXx, Ib } },
8191     { "(bad)",          { XX } },
8192   },
8193
8194   /* VEX_LEN_71_R_2_P_2 */
8195   {
8196     { "vpsrlw",         { Vex128, XS, Ib } },
8197     { "(bad)",          { XX } },
8198   },
8199
8200   /* VEX_LEN_71_R_4_P_2 */
8201   {
8202     { "vpsraw",         { Vex128, XS, Ib } },
8203     { "(bad)",          { XX } },
8204   },
8205
8206   /* VEX_LEN_71_R_6_P_2 */
8207   {
8208     { "vpsllw",         { Vex128, XS, Ib } },
8209     { "(bad)",          { XX } },
8210   },
8211
8212   /* VEX_LEN_72_R_2_P_2 */
8213   {
8214     { "vpsrld",         { Vex128, XS, Ib } },
8215     { "(bad)",          { XX } },
8216   },
8217
8218   /* VEX_LEN_72_R_4_P_2 */
8219   {
8220     { "vpsrad",         { Vex128, XS, Ib } },
8221     { "(bad)",          { XX } },
8222   },
8223
8224   /* VEX_LEN_72_R_6_P_2 */
8225   {
8226     { "vpslld",         { Vex128, XS, Ib } },
8227     { "(bad)",          { XX } },
8228   },
8229
8230   /* VEX_LEN_73_R_2_P_2 */
8231   {
8232     { "vpsrlq",         { Vex128, XS, Ib } },
8233     { "(bad)",          { XX } },
8234   },
8235
8236   /* VEX_LEN_73_R_3_P_2 */
8237   {
8238     { "vpsrldq",        { Vex128, XS, Ib } },
8239     { "(bad)",          { XX } },
8240   },
8241
8242   /* VEX_LEN_73_R_6_P_2 */
8243   {
8244     { "vpsllq",         { Vex128, XS, Ib } },
8245     { "(bad)",          { XX } },
8246   },
8247
8248   /* VEX_LEN_73_R_7_P_2 */
8249   {
8250     { "vpslldq",        { Vex128, XS, Ib } },
8251     { "(bad)",          { XX } },
8252   },
8253
8254   /* VEX_LEN_74_P_2 */
8255   {
8256     { "vpcmpeqb",       { XM, Vex128, EXx } },
8257     { "(bad)",          { XX } },
8258   },
8259
8260   /* VEX_LEN_75_P_2 */
8261   {
8262     { "vpcmpeqw",       { XM, Vex128, EXx } },
8263     { "(bad)",          { XX } },
8264   },
8265
8266   /* VEX_LEN_76_P_2 */
8267   {
8268     { "vpcmpeqd",       { XM, Vex128, EXx } },
8269     { "(bad)",          { XX } },
8270   },
8271
8272   /* VEX_LEN_7E_P_1 */
8273   {
8274     { "vmovq",          { XM, EXq } },
8275     { "(bad)",          { XX } },
8276   },
8277
8278   /* VEX_LEN_7E_P_2 */
8279   {
8280     { "vmovK",          { Edq, XM } },
8281     { "(bad)",          { XX } },
8282   },
8283
8284   /* VEX_LEN_AE_R_2_M_0 */
8285   {
8286     { "vldmxcsr",       { Md } },
8287     { "(bad)",          { XX } },
8288   },
8289
8290   /* VEX_LEN_AE_R_3_M_0 */
8291   {
8292     { "vstmxcsr",       { Md } },
8293     { "(bad)",          { XX } },
8294   },
8295
8296   /* VEX_LEN_C2_P_1 */
8297   {
8298     { "vcmpss",         { XM, Vex128, EXd, VCMP } },
8299     { "(bad)",          { XX } },
8300   },
8301
8302   /* VEX_LEN_C2_P_3 */
8303   {
8304     { "vcmpsd",         { XM, Vex128, EXq, VCMP } },
8305     { "(bad)",          { XX } },
8306   },
8307
8308   /* VEX_LEN_C4_P_2 */
8309   {
8310     { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
8311     { "(bad)",          { XX } },
8312   },
8313
8314   /* VEX_LEN_C5_P_2 */
8315   {
8316     { "vpextrw",        { Gdq, XS, Ib } },
8317     { "(bad)",          { XX } },
8318   },
8319
8320   /* VEX_LEN_D1_P_2 */
8321   {
8322     { "vpsrlw",         { XM, Vex128, EXx } },
8323     { "(bad)",          { XX } },
8324   },
8325
8326   /* VEX_LEN_D2_P_2 */
8327   {
8328     { "vpsrld",         { XM, Vex128, EXx } },
8329     { "(bad)",          { XX } },
8330   },
8331
8332   /* VEX_LEN_D3_P_2 */
8333   {
8334     { "vpsrlq",         { XM, Vex128, EXx } },
8335     { "(bad)",          { XX } },
8336   },
8337
8338   /* VEX_LEN_D4_P_2 */
8339   {
8340     { "vpaddq",         { XM, Vex128, EXx } },
8341     { "(bad)",          { XX } },
8342   },
8343
8344   /* VEX_LEN_D5_P_2 */
8345   {
8346     { "vpmullw",        { XM, Vex128, EXx } },
8347     { "(bad)",          { XX } },
8348   },
8349
8350   /* VEX_LEN_D6_P_2 */
8351   {
8352     { "vmovq",          { EXqS, XM } },
8353     { "(bad)",          { XX } },
8354   },
8355
8356   /* VEX_LEN_D7_P_2_M_1 */
8357   {
8358     { "vpmovmskb",      { Gdq, XS } },
8359     { "(bad)",          { XX } },
8360   },
8361
8362   /* VEX_LEN_D8_P_2 */
8363   {
8364     { "vpsubusb",       { XM, Vex128, EXx } },
8365     { "(bad)",          { XX } },
8366   },
8367
8368   /* VEX_LEN_D9_P_2 */
8369   {
8370     { "vpsubusw",       { XM, Vex128, EXx } },
8371     { "(bad)",          { XX } },
8372   },
8373
8374   /* VEX_LEN_DA_P_2 */
8375   {
8376     { "vpminub",        { XM, Vex128, EXx } },
8377     { "(bad)",          { XX } },
8378   },
8379
8380   /* VEX_LEN_DB_P_2 */
8381   {
8382     { "vpand",          { XM, Vex128, EXx } },
8383     { "(bad)",          { XX } },
8384   },
8385
8386   /* VEX_LEN_DC_P_2 */
8387   {
8388     { "vpaddusb",       { XM, Vex128, EXx } },
8389     { "(bad)",          { XX } },
8390   },
8391
8392   /* VEX_LEN_DD_P_2 */
8393   {
8394     { "vpaddusw",       { XM, Vex128, EXx } },
8395     { "(bad)",          { XX } },
8396   },
8397
8398   /* VEX_LEN_DE_P_2 */
8399   {
8400     { "vpmaxub",        { XM, Vex128, EXx } },
8401     { "(bad)",          { XX } },
8402   },
8403
8404   /* VEX_LEN_DF_P_2 */
8405   {
8406     { "vpandn",         { XM, Vex128, EXx } },
8407     { "(bad)",          { XX } },
8408   },
8409
8410   /* VEX_LEN_E0_P_2 */
8411   {
8412     { "vpavgb",         { XM, Vex128, EXx } },
8413     { "(bad)",          { XX } },
8414   },
8415
8416   /* VEX_LEN_E1_P_2 */
8417   {
8418     { "vpsraw",         { XM, Vex128, EXx } },
8419     { "(bad)",          { XX } },
8420   },
8421
8422   /* VEX_LEN_E2_P_2 */
8423   {
8424     { "vpsrad",         { XM, Vex128, EXx } },
8425     { "(bad)",          { XX } },
8426   },
8427
8428   /* VEX_LEN_E3_P_2 */
8429   {
8430     { "vpavgw",         { XM, Vex128, EXx } },
8431     { "(bad)",          { XX } },
8432   },
8433
8434   /* VEX_LEN_E4_P_2 */
8435   {
8436     { "vpmulhuw",       { XM, Vex128, EXx } },
8437     { "(bad)",          { XX } },
8438   },
8439
8440   /* VEX_LEN_E5_P_2 */
8441   {
8442     { "vpmulhw",        { XM, Vex128, EXx } },
8443     { "(bad)",          { XX } },
8444   },
8445
8446   /* VEX_LEN_E8_P_2 */
8447   {
8448     { "vpsubsb",        { XM, Vex128, EXx } },
8449     { "(bad)",          { XX } },
8450   },
8451
8452   /* VEX_LEN_E9_P_2 */
8453   {
8454     { "vpsubsw",        { XM, Vex128, EXx } },
8455     { "(bad)",          { XX } },
8456   },
8457
8458   /* VEX_LEN_EA_P_2 */
8459   {
8460     { "vpminsw",        { XM, Vex128, EXx } },
8461     { "(bad)",          { XX } },
8462   },
8463
8464   /* VEX_LEN_EB_P_2 */
8465   {
8466     { "vpor",           { XM, Vex128, EXx } },
8467     { "(bad)",          { XX } },
8468   },
8469
8470   /* VEX_LEN_EC_P_2 */
8471   {
8472     { "vpaddsb",        { XM, Vex128, EXx } },
8473     { "(bad)",          { XX } },
8474   },
8475
8476   /* VEX_LEN_ED_P_2 */
8477   {
8478     { "vpaddsw",        { XM, Vex128, EXx } },
8479     { "(bad)",          { XX } },
8480   },
8481
8482   /* VEX_LEN_EE_P_2 */
8483   {
8484     { "vpmaxsw",        { XM, Vex128, EXx } },
8485     { "(bad)",          { XX } },
8486   },
8487
8488   /* VEX_LEN_EF_P_2 */
8489   {
8490     { "vpxor",          { XM, Vex128, EXx } },
8491     { "(bad)",          { XX } },
8492   },
8493
8494   /* VEX_LEN_F1_P_2 */
8495   {
8496     { "vpsllw",         { XM, Vex128, EXx } },
8497     { "(bad)",          { XX } },
8498   },
8499
8500   /* VEX_LEN_F2_P_2 */
8501   {
8502     { "vpslld",         { XM, Vex128, EXx } },
8503     { "(bad)",          { XX } },
8504   },
8505
8506   /* VEX_LEN_F3_P_2 */
8507   {
8508     { "vpsllq",         { XM, Vex128, EXx } },
8509     { "(bad)",          { XX } },
8510   },
8511
8512   /* VEX_LEN_F4_P_2 */
8513   {
8514     { "vpmuludq",       { XM, Vex128, EXx } },
8515     { "(bad)",          { XX } },
8516   },
8517
8518   /* VEX_LEN_F5_P_2 */
8519   {
8520     { "vpmaddwd",       { XM, Vex128, EXx } },
8521     { "(bad)",          { XX } },
8522   },
8523
8524   /* VEX_LEN_F6_P_2 */
8525   {
8526     { "vpsadbw",        { XM, Vex128, EXx } },
8527     { "(bad)",          { XX } },
8528   },
8529
8530   /* VEX_LEN_F7_P_2 */
8531   {
8532     { "vmaskmovdqu",    { XM, XS } },
8533     { "(bad)",          { XX } },
8534   },
8535
8536   /* VEX_LEN_F8_P_2 */
8537   {
8538     { "vpsubb",         { XM, Vex128, EXx } },
8539     { "(bad)",          { XX } },
8540   },
8541
8542   /* VEX_LEN_F9_P_2 */
8543   {
8544     { "vpsubw",         { XM, Vex128, EXx } },
8545     { "(bad)",          { XX } },
8546   },
8547
8548   /* VEX_LEN_FA_P_2 */
8549   {
8550     { "vpsubd",         { XM, Vex128, EXx } },
8551     { "(bad)",          { XX } },
8552   },
8553
8554   /* VEX_LEN_FB_P_2 */
8555   {
8556     { "vpsubq",         { XM, Vex128, EXx } },
8557     { "(bad)",          { XX } },
8558   },
8559
8560   /* VEX_LEN_FC_P_2 */
8561   {
8562     { "vpaddb",         { XM, Vex128, EXx } },
8563     { "(bad)",          { XX } },
8564   },
8565
8566   /* VEX_LEN_FD_P_2 */
8567   {
8568     { "vpaddw",         { XM, Vex128, EXx } },
8569     { "(bad)",          { XX } },
8570   },
8571
8572   /* VEX_LEN_FE_P_2 */
8573   {
8574     { "vpaddd",         { XM, Vex128, EXx } },
8575     { "(bad)",          { XX } },
8576   },
8577
8578   /* VEX_LEN_3800_P_2 */
8579   {
8580     { "vpshufb",        { XM, Vex128, EXx } },
8581     { "(bad)",          { XX } },
8582   },
8583
8584   /* VEX_LEN_3801_P_2 */
8585   {
8586     { "vphaddw",        { XM, Vex128, EXx } },
8587     { "(bad)",          { XX } },
8588   },
8589
8590   /* VEX_LEN_3802_P_2 */
8591   {
8592     { "vphaddd",        { XM, Vex128, EXx } },
8593     { "(bad)",          { XX } },
8594   },
8595
8596   /* VEX_LEN_3803_P_2 */
8597   {
8598     { "vphaddsw",       { XM, Vex128, EXx } },
8599     { "(bad)",          { XX } },
8600   },
8601
8602   /* VEX_LEN_3804_P_2 */
8603   {
8604     { "vpmaddubsw",     { XM, Vex128, EXx } },
8605     { "(bad)",          { XX } },
8606   },
8607
8608   /* VEX_LEN_3805_P_2 */
8609   {
8610     { "vphsubw",        { XM, Vex128, EXx } },
8611     { "(bad)",          { XX } },
8612   },
8613
8614   /* VEX_LEN_3806_P_2 */
8615   {
8616     { "vphsubd",        { XM, Vex128, EXx } },
8617     { "(bad)",          { XX } },
8618   },
8619
8620   /* VEX_LEN_3807_P_2 */
8621   {
8622     { "vphsubsw",       { XM, Vex128, EXx } },
8623     { "(bad)",          { XX } },
8624   },
8625
8626   /* VEX_LEN_3808_P_2 */
8627   {
8628     { "vpsignb",        { XM, Vex128, EXx } },
8629     { "(bad)",          { XX } },
8630   },
8631
8632   /* VEX_LEN_3809_P_2 */
8633   {
8634     { "vpsignw",        { XM, Vex128, EXx } },
8635     { "(bad)",          { XX } },
8636   },
8637
8638   /* VEX_LEN_380A_P_2 */
8639   {
8640     { "vpsignd",        { XM, Vex128, EXx } },
8641     { "(bad)",          { XX } },
8642   },
8643
8644   /* VEX_LEN_380B_P_2 */
8645   {
8646     { "vpmulhrsw",      { XM, Vex128, EXx } },
8647     { "(bad)",          { XX } },
8648   },
8649
8650   /* VEX_LEN_3819_P_2_M_0 */
8651   {
8652     { "(bad)",          { XX } },
8653     { "vbroadcastsd",   { XM, Mq } },
8654   },
8655
8656   /* VEX_LEN_381A_P_2_M_0 */
8657   {
8658     { "(bad)",          { XX } },
8659     { "vbroadcastf128", { XM, Mxmm } },
8660   },
8661
8662   /* VEX_LEN_381C_P_2 */
8663   {
8664     { "vpabsb",         { XM, EXx } },
8665     { "(bad)",          { XX } },
8666   },
8667
8668   /* VEX_LEN_381D_P_2 */
8669   {
8670     { "vpabsw",         { XM, EXx } },
8671     { "(bad)",          { XX } },
8672   },
8673
8674   /* VEX_LEN_381E_P_2 */
8675   {
8676     { "vpabsd",         { XM, EXx } },
8677     { "(bad)",          { XX } },
8678   },
8679
8680   /* VEX_LEN_3820_P_2 */
8681   {
8682     { "vpmovsxbw",      { XM, EXq } },
8683     { "(bad)",          { XX } },
8684   },
8685
8686   /* VEX_LEN_3821_P_2 */
8687   {
8688     { "vpmovsxbd",      { XM, EXd } },
8689     { "(bad)",          { XX } },
8690   },
8691
8692   /* VEX_LEN_3822_P_2 */
8693   {
8694     { "vpmovsxbq",      { XM, EXw } },
8695     { "(bad)",          { XX } },
8696   },
8697
8698   /* VEX_LEN_3823_P_2 */
8699   {
8700     { "vpmovsxwd",      { XM, EXq } },
8701     { "(bad)",          { XX } },
8702   },
8703
8704   /* VEX_LEN_3824_P_2 */
8705   {
8706     { "vpmovsxwq",      { XM, EXd } },
8707     { "(bad)",          { XX } },
8708   },
8709
8710   /* VEX_LEN_3825_P_2 */
8711   {
8712     { "vpmovsxdq",      { XM, EXq } },
8713     { "(bad)",          { XX } },
8714   },
8715
8716   /* VEX_LEN_3828_P_2 */
8717   {
8718     { "vpmuldq",        { XM, Vex128, EXx } },
8719     { "(bad)",          { XX } },
8720   },
8721
8722   /* VEX_LEN_3829_P_2 */
8723   {
8724     { "vpcmpeqq",       { XM, Vex128, EXx } },
8725     { "(bad)",          { XX } },
8726   },
8727
8728   /* VEX_LEN_382A_P_2_M_0 */
8729   {
8730     { "vmovntdqa",      { XM, Mx } },
8731     { "(bad)",          { XX } },
8732   },
8733
8734   /* VEX_LEN_382B_P_2 */
8735   {
8736     { "vpackusdw",      { XM, Vex128, EXx } },
8737     { "(bad)",          { XX } },
8738   },
8739
8740   /* VEX_LEN_3830_P_2 */
8741   {
8742     { "vpmovzxbw",      { XM, EXq } },
8743     { "(bad)",          { XX } },
8744   },
8745
8746   /* VEX_LEN_3831_P_2 */
8747   {
8748     { "vpmovzxbd",      { XM, EXd } },
8749     { "(bad)",          { XX } },
8750   },
8751
8752   /* VEX_LEN_3832_P_2 */
8753   {
8754     { "vpmovzxbq",      { XM, EXw } },
8755     { "(bad)",          { XX } },
8756   },
8757
8758   /* VEX_LEN_3833_P_2 */
8759   {
8760     { "vpmovzxwd",      { XM, EXq } },
8761     { "(bad)",          { XX } },
8762   },
8763
8764   /* VEX_LEN_3834_P_2 */
8765   {
8766     { "vpmovzxwq",      { XM, EXd } },
8767     { "(bad)",          { XX } },
8768   },
8769
8770   /* VEX_LEN_3835_P_2 */
8771   {
8772     { "vpmovzxdq",      { XM, EXq } },
8773     { "(bad)",          { XX } },
8774   },
8775
8776   /* VEX_LEN_3837_P_2 */
8777   {
8778     { "vpcmpgtq",       { XM, Vex128, EXx } },
8779     { "(bad)",          { XX } },
8780   },
8781
8782   /* VEX_LEN_3838_P_2 */
8783   {
8784     { "vpminsb",        { XM, Vex128, EXx } },
8785     { "(bad)",          { XX } },
8786   },
8787
8788   /* VEX_LEN_3839_P_2 */
8789   {
8790     { "vpminsd",        { XM, Vex128, EXx } },
8791     { "(bad)",          { XX } },
8792   },
8793
8794   /* VEX_LEN_383A_P_2 */
8795   {
8796     { "vpminuw",        { XM, Vex128, EXx } },
8797     { "(bad)",          { XX } },
8798   },
8799
8800   /* VEX_LEN_383B_P_2 */
8801   {
8802     { "vpminud",        { XM, Vex128, EXx } },
8803     { "(bad)",          { XX } },
8804   },
8805
8806   /* VEX_LEN_383C_P_2 */
8807   {
8808     { "vpmaxsb",        { XM, Vex128, EXx } },
8809     { "(bad)",          { XX } },
8810   },
8811
8812   /* VEX_LEN_383D_P_2 */
8813   {
8814     { "vpmaxsd",        { XM, Vex128, EXx } },
8815     { "(bad)",          { XX } },
8816   },
8817
8818   /* VEX_LEN_383E_P_2 */
8819   {
8820     { "vpmaxuw",        { XM, Vex128, EXx } },
8821     { "(bad)",          { XX } },
8822   },
8823
8824   /* VEX_LEN_383F_P_2 */
8825   {
8826     { "vpmaxud",        { XM, Vex128, EXx } },
8827     { "(bad)",          { XX } },
8828   },
8829
8830   /* VEX_LEN_3840_P_2 */
8831   {
8832     { "vpmulld",        { XM, Vex128, EXx } },
8833     { "(bad)",          { XX } },
8834   },
8835
8836   /* VEX_LEN_3841_P_2 */
8837   {
8838     { "vphminposuw",    { XM, EXx } },
8839     { "(bad)",          { XX } },
8840   },
8841
8842   /* VEX_LEN_38DB_P_2 */
8843   {
8844     { "vaesimc",        { XM, EXx } },
8845     { "(bad)",          { XX } },
8846   },
8847
8848   /* VEX_LEN_38DC_P_2 */
8849   {
8850     { "vaesenc",        { XM, Vex128, EXx } },
8851     { "(bad)",          { XX } },
8852   },
8853
8854   /* VEX_LEN_38DD_P_2 */
8855   {
8856     { "vaesenclast",    { XM, Vex128, EXx } },
8857     { "(bad)",          { XX } },
8858   },
8859
8860   /* VEX_LEN_38DE_P_2 */
8861   {
8862     { "vaesdec",        { XM, Vex128, EXx } },
8863     { "(bad)",          { XX } },
8864   },
8865
8866   /* VEX_LEN_38DF_P_2 */
8867   {
8868     { "vaesdeclast",    { XM, Vex128, EXx } },
8869     { "(bad)",          { XX } },
8870   },
8871
8872   /* VEX_LEN_3A06_P_2 */
8873   {
8874     { "(bad)",          { XX } },
8875     { "vperm2f128",     { XM, Vex256, EXx, Ib } },
8876   },
8877
8878   /* VEX_LEN_3A0A_P_2 */
8879   {
8880     { "vroundss",       { XM, Vex128, EXd, Ib } },
8881     { "(bad)",          { XX } },
8882   },
8883
8884   /* VEX_LEN_3A0B_P_2 */
8885   {
8886     { "vroundsd",       { XM, Vex128, EXq, Ib } },
8887     { "(bad)",          { XX } },
8888   },
8889
8890   /* VEX_LEN_3A0E_P_2 */
8891   {
8892     { "vpblendw",       { XM, Vex128, EXx, Ib } },
8893     { "(bad)",          { XX } },
8894   },
8895
8896   /* VEX_LEN_3A0F_P_2 */
8897   {
8898     { "vpalignr",       { XM, Vex128, EXx, Ib } },
8899     { "(bad)",          { XX } },
8900   },
8901
8902   /* VEX_LEN_3A14_P_2 */
8903   {
8904     { "vpextrb",        { Edqb, XM, Ib } },
8905     { "(bad)",          { XX } },
8906   },
8907
8908   /* VEX_LEN_3A15_P_2 */
8909   {
8910     { "vpextrw",        { Edqw, XM, Ib } },
8911     { "(bad)",          { XX } },
8912   },
8913
8914   /* VEX_LEN_3A16_P_2  */
8915   {
8916     { "vpextrK",        { Edq, XM, Ib } },
8917     { "(bad)",          { XX } },
8918   },
8919
8920   /* VEX_LEN_3A17_P_2 */
8921   {
8922     { "vextractps",     { Edqd, XM, Ib } },
8923     { "(bad)",          { XX } },
8924   },
8925
8926   /* VEX_LEN_3A18_P_2 */
8927   {
8928     { "(bad)",          { XX } },
8929     { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
8930   },
8931
8932   /* VEX_LEN_3A19_P_2 */
8933   {
8934     { "(bad)",          { XX } },
8935     { "vextractf128",   { EXxmm, XM, Ib } },
8936   },
8937
8938   /* VEX_LEN_3A20_P_2 */
8939   {
8940     { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
8941     { "(bad)",          { XX } },
8942   },
8943
8944   /* VEX_LEN_3A21_P_2 */
8945   {
8946     { "vinsertps",      { XM, Vex128, EXd, Ib } },
8947     { "(bad)",          { XX } },
8948   },
8949
8950   /* VEX_LEN_3A22_P_2 */
8951   {
8952     { "vpinsrK",        { XM, Vex128, Edq, Ib } },
8953     { "(bad)",          { XX } },
8954   },
8955
8956   /* VEX_LEN_3A41_P_2 */
8957   {
8958     { "vdppd",          { XM, Vex128, EXx, Ib } },
8959     { "(bad)",          { XX } },
8960   },
8961
8962   /* VEX_LEN_3A42_P_2 */
8963   {
8964     { "vmpsadbw",       { XM, Vex128, EXx, Ib } },
8965     { "(bad)",          { XX } },
8966   },
8967
8968   /* VEX_LEN_3A44_P_2 */
8969   {
8970     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL } },
8971     { "(bad)",          { XX } },
8972   },
8973
8974   /* VEX_LEN_3A4C_P_2 */
8975   {
8976     { "vpblendvb",      { XM, Vex128, EXx, XMVexI4 } },
8977     { "(bad)",          { XX } },
8978   },
8979
8980   /* VEX_LEN_3A60_P_2 */
8981   {
8982     { "vpcmpestrm",     { XM, EXx, Ib } },
8983     { "(bad)",          { XX } },
8984   },
8985
8986   /* VEX_LEN_3A61_P_2 */
8987   {
8988     { "vpcmpestri",     { XM, EXx, Ib } },
8989     { "(bad)",          { XX } },
8990   },
8991
8992   /* VEX_LEN_3A62_P_2 */
8993   {
8994     { "vpcmpistrm",     { XM, EXx, Ib } },
8995     { "(bad)",          { XX } },
8996   },
8997
8998   /* VEX_LEN_3A63_P_2 */
8999   {
9000     { "vpcmpistri",     { XM, EXx, Ib } },
9001     { "(bad)",          { XX } },
9002   },
9003
9004   /* VEX_LEN_3A6A_P_2 */
9005   {
9006     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9007     { "(bad)",          { XX } },
9008   },
9009
9010   /* VEX_LEN_3A6B_P_2 */
9011   {
9012     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9013     { "(bad)",          { XX } },
9014   },
9015
9016   /* VEX_LEN_3A6E_P_2 */
9017   {
9018     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9019     { "(bad)",          { XX } },
9020   },
9021
9022   /* VEX_LEN_3A6F_P_2 */
9023   {
9024     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9025     { "(bad)",          { XX } },
9026   },
9027
9028   /* VEX_LEN_3A7A_P_2 */
9029   {
9030     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9031     { "(bad)",          { XX } },
9032   },
9033
9034   /* VEX_LEN_3A7B_P_2 */
9035   {
9036     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9037     { "(bad)",          { XX } },
9038   },
9039
9040   /* VEX_LEN_3A7E_P_2 */
9041   {
9042     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9043     { "(bad)",          { XX } },
9044   },
9045
9046   /* VEX_LEN_3A7F_P_2 */
9047   {
9048     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9049     { "(bad)",          { XX } },
9050   },
9051
9052   /* VEX_LEN_3ADF_P_2 */
9053   {
9054     { "vaeskeygenassist", { XM, EXx, Ib } },
9055     { "(bad)",          { XX } },
9056   },
9057 };
9058
9059 static const struct dis386 mod_table[][2] = {
9060   {
9061     /* MOD_8D */
9062     { "leaS",           { Gv, M } },
9063     { "(bad)",          { XX } },
9064   },
9065   {
9066     /* MOD_0F01_REG_0 */
9067     { X86_64_TABLE (X86_64_0F01_REG_0) },
9068     { RM_TABLE (RM_0F01_REG_0) },
9069   },
9070   {
9071     /* MOD_0F01_REG_1 */
9072     { X86_64_TABLE (X86_64_0F01_REG_1) },
9073     { RM_TABLE (RM_0F01_REG_1) },
9074   },
9075   {
9076     /* MOD_0F01_REG_2 */
9077     { X86_64_TABLE (X86_64_0F01_REG_2) },
9078     { RM_TABLE (RM_0F01_REG_2) },
9079   },
9080   {
9081     /* MOD_0F01_REG_3 */
9082     { X86_64_TABLE (X86_64_0F01_REG_3) },
9083     { RM_TABLE (RM_0F01_REG_3) },
9084   },
9085   {
9086     /* MOD_0F01_REG_7 */
9087     { "invlpg",         { Mb } },
9088     { RM_TABLE (RM_0F01_REG_7) },
9089   },
9090   {
9091     /* MOD_0F12_PREFIX_0 */
9092     { "movlps",         { XM, EXq } },
9093     { "movhlps",        { XM, EXq } },
9094   },
9095   {
9096     /* MOD_0F13 */
9097     { "movlpX",         { EXq, XM } },
9098     { "(bad)",          { XX } },
9099   },
9100   {
9101     /* MOD_0F16_PREFIX_0 */
9102     { "movhps",         { XM, EXq } },
9103     { "movlhps",        { XM, EXq } },
9104   },
9105   {
9106     /* MOD_0F17 */
9107     { "movhpX",         { EXq, XM } },
9108     { "(bad)",          { XX } },
9109   },
9110   {
9111     /* MOD_0F18_REG_0 */
9112     { "prefetchnta",    { Mb } },
9113     { "(bad)",          { XX } },
9114   },
9115   {
9116     /* MOD_0F18_REG_1 */
9117     { "prefetcht0",     { Mb } },
9118     { "(bad)",          { XX } },
9119   },
9120   {
9121     /* MOD_0F18_REG_2 */
9122     { "prefetcht1",     { Mb } },
9123     { "(bad)",          { XX } },
9124   },
9125   {
9126     /* MOD_0F18_REG_3 */
9127     { "prefetcht2",     { Mb } },
9128     { "(bad)",          { XX } },
9129   },
9130   {
9131     /* MOD_0F20 */
9132     { "(bad)",          { XX } },
9133     { "movZ",           { Rm, Cm } },
9134   },
9135   {
9136     /* MOD_0F21 */
9137     { "(bad)",          { XX } },
9138     { "movZ",           { Rm, Dm } },
9139   },
9140   {
9141     /* MOD_0F22 */
9142     { "(bad)",          { XX } },
9143     { "movZ",           { Cm, Rm } },
9144   },
9145   {
9146     /* MOD_0F23 */
9147     { "(bad)",          { XX } },
9148     { "movZ",           { Dm, Rm } },
9149   },
9150   {
9151     /* MOD_0F24 */
9152     { "(bad)",          { XX } },    
9153     { "movL",           { Rd, Td } },
9154   },
9155   {
9156     /* MOD_0F26 */
9157     { "(bad)",          { XX } },
9158     { "movL",           { Td, Rd } },
9159   },
9160   {
9161     /* MOD_0F2B_PREFIX_0 */
9162     {"movntps",         { Mx, XM } },
9163     { "(bad)",          { XX } },
9164   },
9165   {
9166     /* MOD_0F2B_PREFIX_1 */
9167     {"movntss",         { Md, XM } },
9168     { "(bad)",          { XX } },
9169   },
9170   {
9171     /* MOD_0F2B_PREFIX_2 */
9172     {"movntpd",         { Mx, XM } },
9173     { "(bad)",          { XX } },
9174   },
9175   {
9176     /* MOD_0F2B_PREFIX_3 */
9177     {"movntsd",         { Mq, XM } },
9178     { "(bad)",          { XX } },
9179   },
9180   {
9181     /* MOD_0F51 */
9182     { "(bad)",          { XX } },
9183     { "movmskpX",       { Gdq, XS } },
9184   },
9185   {
9186     /* MOD_0F71_REG_2 */
9187     { "(bad)",          { XX } },
9188     { "psrlw",          { MS, Ib } },
9189   },
9190   {
9191     /* MOD_0F71_REG_4 */
9192     { "(bad)",          { XX } },
9193     { "psraw",          { MS, Ib } },
9194   },
9195   {
9196     /* MOD_0F71_REG_6 */
9197     { "(bad)",          { XX } },
9198     { "psllw",          { MS, Ib } },
9199   },
9200   {
9201     /* MOD_0F72_REG_2 */
9202     { "(bad)",          { XX } },
9203     { "psrld",          { MS, Ib } },
9204   },
9205   {
9206     /* MOD_0F72_REG_4 */
9207     { "(bad)",          { XX } },
9208     { "psrad",          { MS, Ib } },
9209   },
9210   {
9211     /* MOD_0F72_REG_6 */
9212     { "(bad)",          { XX } },
9213     { "pslld",          { MS, Ib } },
9214   },
9215   {
9216     /* MOD_0F73_REG_2 */
9217     { "(bad)",          { XX } },
9218     { "psrlq",          { MS, Ib } },
9219   },
9220   {
9221     /* MOD_0F73_REG_3 */
9222     { "(bad)",          { XX } },
9223     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9224   },
9225   {
9226     /* MOD_0F73_REG_6 */
9227     { "(bad)",          { XX } },
9228     { "psllq",          { MS, Ib } },
9229   },
9230   {
9231     /* MOD_0F73_REG_7 */
9232     { "(bad)",          { XX } },
9233     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9234   },
9235   {
9236     /* MOD_0FAE_REG_0 */
9237     { "fxsave",         { M } },
9238     { "(bad)",          { XX } },
9239   },
9240   {
9241     /* MOD_0FAE_REG_1 */
9242     { "fxrstor",        { M } },
9243     { "(bad)",          { XX } },
9244   },
9245   {
9246     /* MOD_0FAE_REG_2 */
9247     { "ldmxcsr",        { Md } },
9248     { "(bad)",          { XX } },
9249   },
9250   {
9251     /* MOD_0FAE_REG_3 */
9252     { "stmxcsr",        { Md } },
9253     { "(bad)",          { XX } },
9254   },
9255   {
9256     /* MOD_0FAE_REG_4 */
9257     { "xsave",          { M } },
9258     { "(bad)",          { XX } },
9259   },
9260   {
9261     /* MOD_0FAE_REG_5 */
9262     { "xrstor",         { M } },
9263     { RM_TABLE (RM_0FAE_REG_5) },
9264   },
9265   {
9266     /* MOD_0FAE_REG_6 */
9267     { "xsaveopt",       { M } },
9268     { RM_TABLE (RM_0FAE_REG_6) },
9269   },
9270   {
9271     /* MOD_0FAE_REG_7 */
9272     { "clflush",        { Mb } },
9273     { RM_TABLE (RM_0FAE_REG_7) },
9274   },
9275   {
9276     /* MOD_0FB2 */
9277     { "lssS",           { Gv, Mp } },
9278     { "(bad)",          { XX } },
9279   },
9280   {
9281     /* MOD_0FB4 */
9282     { "lfsS",           { Gv, Mp } },
9283     { "(bad)",          { XX } },
9284   },
9285   {
9286     /* MOD_0FB5 */
9287     { "lgsS",           { Gv, Mp } },
9288     { "(bad)",          { XX } },
9289   },
9290   {
9291     /* MOD_0FC7_REG_6 */
9292     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9293     { "(bad)",          { XX } },
9294   },
9295   {
9296     /* MOD_0FC7_REG_7 */
9297     { "vmptrst",        { Mq } },
9298     { "(bad)",          { XX } },
9299   },
9300   {
9301     /* MOD_0FD7 */
9302     { "(bad)",          { XX } },
9303     { "pmovmskb",       { Gdq, MS } },
9304   },
9305   {
9306     /* MOD_0FE7_PREFIX_2 */
9307     { "movntdq",        { Mx, XM } },
9308     { "(bad)",          { XX } },
9309   },
9310   {
9311     /* MOD_0FF0_PREFIX_3 */
9312     { "lddqu",          { XM, M } },
9313     { "(bad)",          { XX } },
9314   },
9315   {
9316     /* MOD_0F382A_PREFIX_2 */
9317     { "movntdqa",       { XM, Mx } },
9318     { "(bad)",          { XX } },
9319   },
9320   {
9321     /* MOD_62_32BIT */
9322     { "bound{S|}",      { Gv, Ma } },
9323     { "(bad)",          { XX } },
9324   },
9325   {
9326     /* MOD_C4_32BIT */
9327     { "lesS",           { Gv, Mp } },
9328     { VEX_C4_TABLE (VEX_0F) },
9329   },
9330   {
9331     /* MOD_C5_32BIT */
9332     { "ldsS",           { Gv, Mp } },
9333     { VEX_C5_TABLE (VEX_0F) },
9334   },
9335   {
9336     /* MOD_VEX_12_PREFIX_0 */
9337     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9338     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9339   },
9340   {
9341     /* MOD_VEX_13 */
9342     { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9343     { "(bad)",          { XX } },
9344   },
9345   {
9346     /* MOD_VEX_16_PREFIX_0 */
9347     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9348     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9349   },
9350   {
9351     /* MOD_VEX_17 */
9352     { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9353     { "(bad)",          { XX } },
9354   },
9355   {
9356     /* MOD_VEX_2B */
9357     { "vmovntpX",       { Mx, XM } },
9358     { "(bad)",          { XX } },
9359   },
9360   {
9361     /* MOD_VEX_51 */
9362     { "(bad)",          { XX } },
9363     { "vmovmskpX",      { Gdq, XS } },
9364   },
9365   {
9366     /* MOD_VEX_71_REG_2 */
9367     { "(bad)",          { XX } },
9368     { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9369   },
9370   {
9371     /* MOD_VEX_71_REG_4 */
9372     { "(bad)",          { XX } },
9373     { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9374   },
9375   {
9376     /* MOD_VEX_71_REG_6 */
9377     { "(bad)",          { XX } },
9378     { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9379   },
9380   {
9381     /* MOD_VEX_72_REG_2 */
9382     { "(bad)",          { XX } },
9383     { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9384   },
9385   {
9386     /* MOD_VEX_72_REG_4 */
9387     { "(bad)",          { XX } },
9388     { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9389   },
9390   {
9391     /* MOD_VEX_72_REG_6 */
9392     { "(bad)",          { XX } },
9393     { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9394   },
9395   {
9396     /* MOD_VEX_73_REG_2 */
9397     { "(bad)",          { XX } },
9398     { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9399   },
9400   {
9401     /* MOD_VEX_73_REG_3 */
9402     { "(bad)",          { XX } },
9403     { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9404   },
9405   {
9406     /* MOD_VEX_73_REG_6 */
9407     { "(bad)",          { XX } },
9408     { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9409   },
9410   {
9411     /* MOD_VEX_73_REG_7 */
9412     { "(bad)",          { XX } },
9413     { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9414   },
9415   {
9416     /* MOD_VEX_AE_REG_2 */
9417     { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9418     { "(bad)",          { XX } },
9419   },
9420   {
9421     /* MOD_VEX_AE_REG_3 */
9422     { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9423     { "(bad)",          { XX } },
9424   },
9425   {
9426     /* MOD_VEX_D7_PREFIX_2 */
9427     { "(bad)",          { XX } },
9428     { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9429   },
9430   {
9431     /* MOD_VEX_E7_PREFIX_2 */
9432     { "vmovntdq",       { Mx, XM } },
9433     { "(bad)",          { XX } },
9434   },
9435   {
9436     /* MOD_VEX_F0_PREFIX_3 */
9437     { "vlddqu",         { XM, M } },
9438     { "(bad)",          { XX } },
9439   },
9440   {
9441     /* MOD_VEX_3818_PREFIX_2 */
9442     { "vbroadcastss",   { XM, Md } },
9443     { "(bad)",          { XX } },
9444   },
9445   {
9446     /* MOD_VEX_3819_PREFIX_2 */
9447     { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9448     { "(bad)",          { XX } },
9449   },
9450   {
9451     /* MOD_VEX_381A_PREFIX_2 */
9452     { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9453     { "(bad)",          { XX } },
9454   },
9455   {
9456     /* MOD_VEX_382A_PREFIX_2 */
9457     { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9458     { "(bad)",          { XX } },
9459   },
9460   {
9461     /* MOD_VEX_382C_PREFIX_2 */
9462     { "vmaskmovps",     { XM, Vex, Mx } },
9463     { "(bad)",          { XX } },
9464   },
9465   {
9466     /* MOD_VEX_382D_PREFIX_2 */
9467     { "vmaskmovpd",     { XM, Vex, Mx } },
9468     { "(bad)",          { XX } },
9469   },
9470   {
9471     /* MOD_VEX_382E_PREFIX_2 */
9472     { "vmaskmovps",     { Mx, Vex, XM } },
9473     { "(bad)",          { XX } },
9474   },
9475   {
9476     /* MOD_VEX_382F_PREFIX_2 */
9477     { "vmaskmovpd",     { Mx, Vex, XM } },
9478     { "(bad)",          { XX } },
9479   },
9480 };
9481
9482 static const struct dis386 rm_table[][8] = {
9483   {
9484     /* RM_0F01_REG_0 */
9485     { "(bad)",          { XX } },
9486     { "vmcall",         { Skip_MODRM } },
9487     { "vmlaunch",       { Skip_MODRM } },
9488     { "vmresume",       { Skip_MODRM } },
9489     { "vmxoff",         { Skip_MODRM } },
9490     { "(bad)",          { XX } },
9491     { "(bad)",          { XX } },
9492     { "(bad)",          { XX } },
9493   },
9494   {
9495     /* RM_0F01_REG_1 */
9496     { "monitor",        { { OP_Monitor, 0 } } },
9497     { "mwait",          { { OP_Mwait, 0 } } },
9498     { "(bad)",          { XX } },
9499     { "(bad)",          { XX } },
9500     { "(bad)",          { XX } },
9501     { "(bad)",          { XX } },
9502     { "(bad)",          { XX } },
9503     { "(bad)",          { XX } },
9504   },
9505   {
9506     /* RM_0F01_REG_2 */
9507     { "xgetbv",         { Skip_MODRM } },
9508     { "xsetbv",         { Skip_MODRM } },
9509     { "(bad)",          { XX } },
9510     { "(bad)",          { XX } },
9511     { "(bad)",          { XX } },
9512     { "(bad)",          { XX } },
9513     { "(bad)",          { XX } },
9514     { "(bad)",          { XX } },
9515   },
9516   {
9517     /* RM_0F01_REG_3 */
9518     { "vmrun",          { Skip_MODRM } },
9519     { "vmmcall",        { Skip_MODRM } },
9520     { "vmload",         { Skip_MODRM } },
9521     { "vmsave",         { Skip_MODRM } },
9522     { "stgi",           { Skip_MODRM } },
9523     { "clgi",           { Skip_MODRM } },
9524     { "skinit",         { Skip_MODRM } },
9525     { "invlpga",        { Skip_MODRM } },
9526   },
9527   {
9528     /* RM_0F01_REG_7 */
9529     { "swapgs",         { Skip_MODRM } },
9530     { "rdtscp",         { Skip_MODRM } },
9531     { "(bad)",          { XX } },
9532     { "(bad)",          { XX } },
9533     { "(bad)",          { XX } },
9534     { "(bad)",          { XX } },
9535     { "(bad)",          { XX } },
9536     { "(bad)",          { XX } },
9537   },
9538   {
9539     /* RM_0FAE_REG_5 */
9540     { "lfence",         { Skip_MODRM } },
9541     { "(bad)",          { XX } },
9542     { "(bad)",          { XX } },
9543     { "(bad)",          { XX } },
9544     { "(bad)",          { XX } },
9545     { "(bad)",          { XX } },
9546     { "(bad)",          { XX } },
9547     { "(bad)",          { XX } },
9548   },
9549   {
9550     /* RM_0FAE_REG_6 */
9551     { "mfence",         { Skip_MODRM } },
9552     { "(bad)",          { XX } },
9553     { "(bad)",          { XX } },
9554     { "(bad)",          { XX } },
9555     { "(bad)",          { XX } },
9556     { "(bad)",          { XX } },
9557     { "(bad)",          { XX } },
9558     { "(bad)",          { XX } },
9559   },
9560   {
9561     /* RM_0FAE_REG_7 */
9562     { "sfence",         { Skip_MODRM } },
9563     { "(bad)",          { XX } },
9564     { "(bad)",          { XX } },
9565     { "(bad)",          { XX } },
9566     { "(bad)",          { XX } },
9567     { "(bad)",          { XX } },
9568     { "(bad)",          { XX } },
9569     { "(bad)",          { XX } },
9570   },
9571 };
9572
9573 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9574
9575 /* We use the high bit to indicate different name for the same
9576    prefix.  */
9577 #define ADDR16_PREFIX   (0x67 | 0x100)
9578 #define ADDR32_PREFIX   (0x67 | 0x200)
9579 #define DATA16_PREFIX   (0x66 | 0x100)
9580 #define DATA32_PREFIX   (0x66 | 0x200)
9581 #define REP_PREFIX      (0xf3 | 0x100)
9582
9583 static int
9584 ckprefix (void)
9585 {
9586   int newrex, i, length;
9587   rex = 0;
9588   rex_original = 0;
9589   rex_ignored = 0;
9590   prefixes = 0;
9591   used_prefixes = 0;
9592   rex_used = 0;
9593   last_lock_prefix = -1;
9594   last_repz_prefix = -1;
9595   last_repnz_prefix = -1;
9596   last_data_prefix = -1;
9597   last_addr_prefix = -1;
9598   last_rex_prefix = -1;
9599   last_seg_prefix = -1;
9600   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
9601     all_prefixes[i] = 0;
9602   i = 0;
9603   length = 0;
9604   /* The maximum instruction length is 15bytes.  */
9605   while (length < MAX_CODE_LENGTH - 1)
9606     {
9607       FETCH_DATA (the_info, codep + 1);
9608       newrex = 0;
9609       switch (*codep)
9610         {
9611         /* REX prefixes family.  */
9612         case 0x40:
9613         case 0x41:
9614         case 0x42:
9615         case 0x43:
9616         case 0x44:
9617         case 0x45:
9618         case 0x46:
9619         case 0x47:
9620         case 0x48:
9621         case 0x49:
9622         case 0x4a:
9623         case 0x4b:
9624         case 0x4c:
9625         case 0x4d:
9626         case 0x4e:
9627         case 0x4f:
9628           if (address_mode == mode_64bit)
9629             newrex = *codep;
9630           else
9631             return 1;
9632           last_rex_prefix = i;
9633           break;
9634         case 0xf3:
9635           prefixes |= PREFIX_REPZ;
9636           last_repz_prefix = i;
9637           break;
9638         case 0xf2:
9639           prefixes |= PREFIX_REPNZ;
9640           last_repnz_prefix = i;
9641           break;
9642         case 0xf0:
9643           prefixes |= PREFIX_LOCK;
9644           last_lock_prefix = i;
9645           break;
9646         case 0x2e:
9647           prefixes |= PREFIX_CS;
9648           last_seg_prefix = i;
9649           break;
9650         case 0x36:
9651           prefixes |= PREFIX_SS;
9652           last_seg_prefix = i;
9653           break;
9654         case 0x3e:
9655           prefixes |= PREFIX_DS;
9656           last_seg_prefix = i;
9657           break;
9658         case 0x26:
9659           prefixes |= PREFIX_ES;
9660           last_seg_prefix = i;
9661           break;
9662         case 0x64:
9663           prefixes |= PREFIX_FS;
9664           last_seg_prefix = i;
9665           break;
9666         case 0x65:
9667           prefixes |= PREFIX_GS;
9668           last_seg_prefix = i;
9669           break;
9670         case 0x66:
9671           prefixes |= PREFIX_DATA;
9672           last_data_prefix = i;
9673           break;
9674         case 0x67:
9675           prefixes |= PREFIX_ADDR;
9676           last_addr_prefix = i;
9677           break;
9678         case FWAIT_OPCODE:
9679           /* fwait is really an instruction.  If there are prefixes
9680              before the fwait, they belong to the fwait, *not* to the
9681              following instruction.  */
9682           if (prefixes || rex)
9683             {
9684               prefixes |= PREFIX_FWAIT;
9685               codep++;
9686               return 1;
9687             }
9688           prefixes = PREFIX_FWAIT;
9689           break;
9690         default:
9691           return 1;
9692         }
9693       /* Rex is ignored when followed by another prefix.  */
9694       if (rex)
9695         {
9696           rex_used = rex;
9697           return 1;
9698         }
9699       if (*codep != FWAIT_OPCODE)
9700         all_prefixes[i++] = *codep;
9701       rex = newrex;
9702       rex_original = rex;
9703       codep++;
9704       length++;
9705     }
9706   return 0;
9707 }
9708
9709 static int
9710 seg_prefix (int pref)
9711 {
9712   switch (pref)
9713     {
9714     case 0x2e:
9715       return PREFIX_CS;
9716     case 0x36:
9717       return PREFIX_SS;
9718     case 0x3e:
9719       return PREFIX_DS;
9720     case 0x26:
9721       return PREFIX_ES;
9722     case 0x64:
9723       return PREFIX_FS;
9724     case 0x65:
9725       return PREFIX_GS;
9726     default:
9727       return 0;
9728     }
9729 }
9730
9731 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9732    prefix byte.  */
9733
9734 static const char *
9735 prefix_name (int pref, int sizeflag)
9736 {
9737   static const char *rexes [16] =
9738     {
9739       "rex",            /* 0x40 */
9740       "rex.B",          /* 0x41 */
9741       "rex.X",          /* 0x42 */
9742       "rex.XB",         /* 0x43 */
9743       "rex.R",          /* 0x44 */
9744       "rex.RB",         /* 0x45 */
9745       "rex.RX",         /* 0x46 */
9746       "rex.RXB",        /* 0x47 */
9747       "rex.W",          /* 0x48 */
9748       "rex.WB",         /* 0x49 */
9749       "rex.WX",         /* 0x4a */
9750       "rex.WXB",        /* 0x4b */
9751       "rex.WR",         /* 0x4c */
9752       "rex.WRB",        /* 0x4d */
9753       "rex.WRX",        /* 0x4e */
9754       "rex.WRXB",       /* 0x4f */
9755     };
9756
9757   switch (pref)
9758     {
9759     /* REX prefixes family.  */
9760     case 0x40:
9761     case 0x41:
9762     case 0x42:
9763     case 0x43:
9764     case 0x44:
9765     case 0x45:
9766     case 0x46:
9767     case 0x47:
9768     case 0x48:
9769     case 0x49:
9770     case 0x4a:
9771     case 0x4b:
9772     case 0x4c:
9773     case 0x4d:
9774     case 0x4e:
9775     case 0x4f:
9776       return rexes [pref - 0x40];
9777     case 0xf3:
9778       return "repz";
9779     case 0xf2:
9780       return "repnz";
9781     case 0xf0:
9782       return "lock";
9783     case 0x2e:
9784       return "cs";
9785     case 0x36:
9786       return "ss";
9787     case 0x3e:
9788       return "ds";
9789     case 0x26:
9790       return "es";
9791     case 0x64:
9792       return "fs";
9793     case 0x65:
9794       return "gs";
9795     case 0x66:
9796       return (sizeflag & DFLAG) ? "data16" : "data32";
9797     case 0x67:
9798       if (address_mode == mode_64bit)
9799         return (sizeflag & AFLAG) ? "addr32" : "addr64";
9800       else
9801         return (sizeflag & AFLAG) ? "addr16" : "addr32";
9802     case FWAIT_OPCODE:
9803       return "fwait";
9804     case ADDR16_PREFIX:
9805       return "addr16";
9806     case ADDR32_PREFIX:
9807       return "addr32";
9808     case DATA16_PREFIX:
9809       return "data16";
9810     case DATA32_PREFIX:
9811       return "data32";
9812     case REP_PREFIX:
9813       return "rep";
9814     default:
9815       return NULL;
9816     }
9817 }
9818
9819 static char op_out[MAX_OPERANDS][100];
9820 static int op_ad, op_index[MAX_OPERANDS];
9821 static int two_source_ops;
9822 static bfd_vma op_address[MAX_OPERANDS];
9823 static bfd_vma op_riprel[MAX_OPERANDS];
9824 static bfd_vma start_pc;
9825
9826 /*
9827  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
9828  *   (see topic "Redundant prefixes" in the "Differences from 8086"
9829  *   section of the "Virtual 8086 Mode" chapter.)
9830  * 'pc' should be the address of this instruction, it will
9831  *   be used to print the target address if this is a relative jump or call
9832  * The function returns the length of this instruction in bytes.
9833  */
9834
9835 static char intel_syntax;
9836 static char intel_mnemonic = !SYSV386_COMPAT;
9837 static char open_char;
9838 static char close_char;
9839 static char separator_char;
9840 static char scale_char;
9841
9842 /* Here for backwards compatibility.  When gdb stops using
9843    print_insn_i386_att and print_insn_i386_intel these functions can
9844    disappear, and print_insn_i386 be merged into print_insn.  */
9845 int
9846 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
9847 {
9848   intel_syntax = 0;
9849
9850   return print_insn (pc, info);
9851 }
9852
9853 int
9854 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
9855 {
9856   intel_syntax = 1;
9857
9858   return print_insn (pc, info);
9859 }
9860
9861 int
9862 print_insn_i386 (bfd_vma pc, disassemble_info *info)
9863 {
9864   intel_syntax = -1;
9865
9866   return print_insn (pc, info);
9867 }
9868
9869 void
9870 print_i386_disassembler_options (FILE *stream)
9871 {
9872   fprintf (stream, _("\n\
9873 The following i386/x86-64 specific disassembler options are supported for use\n\
9874 with the -M switch (multiple options should be separated by commas):\n"));
9875
9876   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
9877   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
9878   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
9879   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
9880   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
9881   fprintf (stream, _("  att-mnemonic\n"
9882                      "              Display instruction in AT&T mnemonic\n"));
9883   fprintf (stream, _("  intel-mnemonic\n"
9884                      "              Display instruction in Intel mnemonic\n"));
9885   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
9886   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
9887   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
9888   fprintf (stream, _("  data32      Assume 32bit data size\n"));
9889   fprintf (stream, _("  data16      Assume 16bit data size\n"));
9890   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
9891 }
9892
9893 /* Get a pointer to struct dis386 with a valid name.  */
9894
9895 static const struct dis386 *
9896 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
9897 {
9898   int index, vex_table_index;
9899
9900   if (dp->name != NULL)
9901     return dp;
9902
9903   switch (dp->op[0].bytemode)
9904     {
9905     case USE_REG_TABLE:
9906       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
9907       break;
9908
9909     case USE_MOD_TABLE:
9910       index = modrm.mod == 0x3 ? 1 : 0;
9911       dp = &mod_table[dp->op[1].bytemode][index];
9912       break;
9913
9914     case USE_RM_TABLE:
9915       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
9916       break;
9917
9918     case USE_PREFIX_TABLE:
9919       if (need_vex)
9920         {
9921           /* The prefix in VEX is implicit.  */
9922           switch (vex.prefix)
9923             {
9924             case 0:
9925               index = 0;
9926               break;
9927             case REPE_PREFIX_OPCODE:
9928               index = 1;
9929               break;
9930             case DATA_PREFIX_OPCODE:
9931               index = 2;
9932               break;
9933             case REPNE_PREFIX_OPCODE:
9934               index = 3;
9935               break;
9936             default:
9937               abort ();
9938               break;
9939             }
9940         }
9941       else 
9942         {
9943           index = 0;
9944           used_prefixes |= (prefixes & PREFIX_REPZ);
9945           if (prefixes & PREFIX_REPZ)
9946             {
9947               index = 1;
9948               all_prefixes[last_repz_prefix] = 0;
9949             }
9950           else
9951             {
9952               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
9953                  PREFIX_DATA.  */
9954               used_prefixes |= (prefixes & PREFIX_REPNZ);
9955               if (prefixes & PREFIX_REPNZ)
9956                 {
9957                   index = 3;
9958                   all_prefixes[last_repnz_prefix] = 0;
9959                 }
9960               else
9961                 {
9962                   used_prefixes |= (prefixes & PREFIX_DATA);
9963                   if (prefixes & PREFIX_DATA)
9964                     {
9965                       index = 2;
9966                       all_prefixes[last_data_prefix] = 0;
9967                     }
9968                 }
9969             }
9970         }
9971       dp = &prefix_table[dp->op[1].bytemode][index];
9972       break;
9973
9974     case USE_X86_64_TABLE:
9975       index = address_mode == mode_64bit ? 1 : 0;
9976       dp = &x86_64_table[dp->op[1].bytemode][index];
9977       break;
9978
9979     case USE_3BYTE_TABLE:
9980       FETCH_DATA (info, codep + 2);
9981       index = *codep++;
9982       dp = &three_byte_table[dp->op[1].bytemode][index];
9983       modrm.mod = (*codep >> 6) & 3;
9984       modrm.reg = (*codep >> 3) & 7;
9985       modrm.rm = *codep & 7;
9986       break;
9987
9988     case USE_VEX_LEN_TABLE:
9989       if (!need_vex)
9990         abort ();
9991
9992       switch (vex.length)
9993         {
9994         case 128:
9995           index = 0;
9996           break;
9997         case 256:
9998           index = 1;
9999           break;
10000         default:
10001           abort ();
10002           break;
10003         }
10004
10005       dp = &vex_len_table[dp->op[1].bytemode][index];
10006       break;
10007
10008     case USE_XOP_8F_TABLE:
10009       FETCH_DATA (info, codep + 3);
10010       /* All bits in the REX prefix are ignored.  */
10011       rex_ignored = rex;
10012       rex = ~(*codep >> 5) & 0x7;
10013
10014       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
10015       switch ((*codep & 0x1f))
10016         {
10017         default:
10018           BadOp ();
10019         case 0x9:
10020           vex_table_index = XOP_09;
10021           break;
10022         case 0xa:
10023           vex_table_index = XOP_0A;
10024           break;
10025         }
10026       codep++;
10027       vex.w = *codep & 0x80;
10028       if (vex.w && address_mode == mode_64bit)
10029         rex |= REX_W;
10030
10031       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10032       if (address_mode != mode_64bit
10033           && vex.register_specifier > 0x7)
10034         BadOp ();
10035
10036       vex.length = (*codep & 0x4) ? 256 : 128;
10037       switch ((*codep & 0x3))
10038         {
10039         case 0:
10040           vex.prefix = 0;
10041           break;
10042         case 1:
10043           vex.prefix = DATA_PREFIX_OPCODE;
10044           break;
10045         case 2:
10046           vex.prefix = REPE_PREFIX_OPCODE;
10047           break;
10048         case 3:
10049           vex.prefix = REPNE_PREFIX_OPCODE;
10050           break;
10051         }
10052       need_vex = 1;
10053       need_vex_reg = 1;
10054       codep++;
10055       index = *codep++;
10056       dp = &xop_table[vex_table_index][index];
10057
10058       FETCH_DATA (info, codep + 1);
10059       modrm.mod = (*codep >> 6) & 3;
10060       modrm.reg = (*codep >> 3) & 7;
10061       modrm.rm = *codep & 7;
10062       break;
10063
10064     case USE_VEX_C4_TABLE:
10065       FETCH_DATA (info, codep + 3);
10066       /* All bits in the REX prefix are ignored.  */
10067       rex_ignored = rex;
10068       rex = ~(*codep >> 5) & 0x7;
10069       switch ((*codep & 0x1f))
10070         {
10071         default:
10072           BadOp ();
10073         case 0x1:
10074           vex_table_index = VEX_0F;
10075           break;
10076         case 0x2:
10077           vex_table_index = VEX_0F38;
10078           break;
10079         case 0x3:
10080           vex_table_index = VEX_0F3A;
10081           break;
10082         }
10083       codep++;
10084       vex.w = *codep & 0x80;
10085       if (vex.w && address_mode == mode_64bit)
10086         rex |= REX_W;
10087
10088       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10089       if (address_mode != mode_64bit
10090           && vex.register_specifier > 0x7)
10091         BadOp ();
10092
10093       vex.length = (*codep & 0x4) ? 256 : 128;
10094       switch ((*codep & 0x3))
10095         {
10096         case 0:
10097           vex.prefix = 0;
10098           break;
10099         case 1:
10100           vex.prefix = DATA_PREFIX_OPCODE;
10101           break;
10102         case 2:
10103           vex.prefix = REPE_PREFIX_OPCODE;
10104           break;
10105         case 3:
10106           vex.prefix = REPNE_PREFIX_OPCODE;
10107           break;
10108         }
10109       need_vex = 1;
10110       need_vex_reg = 1;
10111       codep++;
10112       index = *codep++;
10113       dp = &vex_table[vex_table_index][index];
10114       /* There is no MODRM byte for VEX [82|77].  */
10115       if (index != 0x77 && index != 0x82)
10116         {
10117           FETCH_DATA (info, codep + 1);
10118           modrm.mod = (*codep >> 6) & 3;
10119           modrm.reg = (*codep >> 3) & 7;
10120           modrm.rm = *codep & 7;
10121         }
10122       break;
10123
10124     case USE_VEX_C5_TABLE:
10125       FETCH_DATA (info, codep + 2);
10126       /* All bits in the REX prefix are ignored.  */
10127       rex_ignored = rex;
10128       rex = (*codep & 0x80) ? 0 : REX_R;
10129
10130       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10131       if (address_mode != mode_64bit
10132           && vex.register_specifier > 0x7)
10133         BadOp ();
10134
10135       vex.length = (*codep & 0x4) ? 256 : 128;
10136       switch ((*codep & 0x3))
10137         {
10138         case 0:
10139           vex.prefix = 0;
10140           break;
10141         case 1:
10142           vex.prefix = DATA_PREFIX_OPCODE;
10143           break;
10144         case 2:
10145           vex.prefix = REPE_PREFIX_OPCODE;
10146           break;
10147         case 3:
10148           vex.prefix = REPNE_PREFIX_OPCODE;
10149           break;
10150         }
10151       need_vex = 1;
10152       need_vex_reg = 1;
10153       codep++;
10154       index = *codep++;
10155       dp = &vex_table[dp->op[1].bytemode][index];
10156       /* There is no MODRM byte for VEX [82|77].  */
10157       if (index != 0x77 && index != 0x82)
10158         {
10159           FETCH_DATA (info, codep + 1);
10160           modrm.mod = (*codep >> 6) & 3;
10161           modrm.reg = (*codep >> 3) & 7;
10162           modrm.rm = *codep & 7;
10163         }
10164       break;
10165
10166     default:
10167       abort ();
10168     }
10169
10170   if (dp->name != NULL)
10171     return dp;
10172   else
10173     return get_valid_dis386 (dp, info);
10174 }
10175
10176 static int
10177 print_insn (bfd_vma pc, disassemble_info *info)
10178 {
10179   const struct dis386 *dp;
10180   int i;
10181   char *op_txt[MAX_OPERANDS];
10182   int needcomma;
10183   int sizeflag;
10184   const char *p;
10185   struct dis_private priv;
10186   unsigned char op;
10187   int prefix_length;
10188   int default_prefixes;
10189
10190   if (info->mach == bfd_mach_x86_64_intel_syntax
10191       || info->mach == bfd_mach_x86_64
10192       || info->mach == bfd_mach_l1om
10193       || info->mach == bfd_mach_l1om_intel_syntax)
10194     address_mode = mode_64bit;
10195   else
10196     address_mode = mode_32bit;
10197
10198   if (intel_syntax == (char) -1)
10199     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10200                     || info->mach == bfd_mach_x86_64_intel_syntax
10201                     || info->mach == bfd_mach_l1om_intel_syntax);
10202
10203   if (info->mach == bfd_mach_i386_i386
10204       || info->mach == bfd_mach_x86_64
10205       || info->mach == bfd_mach_l1om
10206       || info->mach == bfd_mach_i386_i386_intel_syntax
10207       || info->mach == bfd_mach_x86_64_intel_syntax
10208       || info->mach == bfd_mach_l1om_intel_syntax)
10209     priv.orig_sizeflag = AFLAG | DFLAG;
10210   else if (info->mach == bfd_mach_i386_i8086)
10211     priv.orig_sizeflag = 0;
10212   else
10213     abort ();
10214
10215   for (p = info->disassembler_options; p != NULL; )
10216     {
10217       if (CONST_STRNEQ (p, "x86-64"))
10218         {
10219           address_mode = mode_64bit;
10220           priv.orig_sizeflag = AFLAG | DFLAG;
10221         }
10222       else if (CONST_STRNEQ (p, "i386"))
10223         {
10224           address_mode = mode_32bit;
10225           priv.orig_sizeflag = AFLAG | DFLAG;
10226         }
10227       else if (CONST_STRNEQ (p, "i8086"))
10228         {
10229           address_mode = mode_16bit;
10230           priv.orig_sizeflag = 0;
10231         }
10232       else if (CONST_STRNEQ (p, "intel"))
10233         {
10234           intel_syntax = 1;
10235           if (CONST_STRNEQ (p + 5, "-mnemonic"))
10236             intel_mnemonic = 1;
10237         }
10238       else if (CONST_STRNEQ (p, "att"))
10239         {
10240           intel_syntax = 0;
10241           if (CONST_STRNEQ (p + 3, "-mnemonic"))
10242             intel_mnemonic = 0;
10243         }
10244       else if (CONST_STRNEQ (p, "addr"))
10245         {
10246           if (address_mode == mode_64bit)
10247             {
10248               if (p[4] == '3' && p[5] == '2')
10249                 priv.orig_sizeflag &= ~AFLAG;
10250               else if (p[4] == '6' && p[5] == '4')
10251                 priv.orig_sizeflag |= AFLAG;
10252             }
10253           else
10254             {
10255               if (p[4] == '1' && p[5] == '6')
10256                 priv.orig_sizeflag &= ~AFLAG;
10257               else if (p[4] == '3' && p[5] == '2')
10258                 priv.orig_sizeflag |= AFLAG;
10259             }
10260         }
10261       else if (CONST_STRNEQ (p, "data"))
10262         {
10263           if (p[4] == '1' && p[5] == '6')
10264             priv.orig_sizeflag &= ~DFLAG;
10265           else if (p[4] == '3' && p[5] == '2')
10266             priv.orig_sizeflag |= DFLAG;
10267         }
10268       else if (CONST_STRNEQ (p, "suffix"))
10269         priv.orig_sizeflag |= SUFFIX_ALWAYS;
10270
10271       p = strchr (p, ',');
10272       if (p != NULL)
10273         p++;
10274     }
10275
10276   if (intel_syntax)
10277     {
10278       names64 = intel_names64;
10279       names32 = intel_names32;
10280       names16 = intel_names16;
10281       names8 = intel_names8;
10282       names8rex = intel_names8rex;
10283       names_seg = intel_names_seg;
10284       index64 = intel_index64;
10285       index32 = intel_index32;
10286       index16 = intel_index16;
10287       open_char = '[';
10288       close_char = ']';
10289       separator_char = '+';
10290       scale_char = '*';
10291     }
10292   else
10293     {
10294       names64 = att_names64;
10295       names32 = att_names32;
10296       names16 = att_names16;
10297       names8 = att_names8;
10298       names8rex = att_names8rex;
10299       names_seg = att_names_seg;
10300       index64 = att_index64;
10301       index32 = att_index32;
10302       index16 = att_index16;
10303       open_char = '(';
10304       close_char =  ')';
10305       separator_char = ',';
10306       scale_char = ',';
10307     }
10308
10309   /* The output looks better if we put 7 bytes on a line, since that
10310      puts most long word instructions on a single line.  Use 8 bytes
10311      for Intel L1OM.  */
10312   if (info->mach == bfd_mach_l1om
10313       || info->mach == bfd_mach_l1om_intel_syntax)
10314     info->bytes_per_line = 8;
10315   else
10316     info->bytes_per_line = 7;
10317
10318   info->private_data = &priv;
10319   priv.max_fetched = priv.the_buffer;
10320   priv.insn_start = pc;
10321
10322   obuf[0] = 0;
10323   for (i = 0; i < MAX_OPERANDS; ++i)
10324     {
10325       op_out[i][0] = 0;
10326       op_index[i] = -1;
10327     }
10328
10329   the_info = info;
10330   start_pc = pc;
10331   start_codep = priv.the_buffer;
10332   codep = priv.the_buffer;
10333
10334   if (setjmp (priv.bailout) != 0)
10335     {
10336       const char *name;
10337
10338       /* Getting here means we tried for data but didn't get it.  That
10339          means we have an incomplete instruction of some sort.  Just
10340          print the first byte as a prefix or a .byte pseudo-op.  */
10341       if (codep > priv.the_buffer)
10342         {
10343           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10344           if (name != NULL)
10345             (*info->fprintf_func) (info->stream, "%s", name);
10346           else
10347             {
10348               /* Just print the first byte as a .byte instruction.  */
10349               (*info->fprintf_func) (info->stream, ".byte 0x%x",
10350                                      (unsigned int) priv.the_buffer[0]);
10351             }
10352
10353           return 1;
10354         }
10355
10356       return -1;
10357     }
10358
10359   obufp = obuf;
10360   sizeflag = priv.orig_sizeflag;
10361
10362   if (!ckprefix () || rex_used)
10363     {
10364       /* Too many prefixes or unused REX prefixes.  */
10365       for (i = 0;
10366            all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
10367            i++)
10368         (*info->fprintf_func) (info->stream, "%s",
10369                                prefix_name (all_prefixes[i], sizeflag));
10370       return 1;
10371     }
10372
10373   insn_codep = codep;
10374
10375   FETCH_DATA (info, codep + 1);
10376   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10377
10378   if (((prefixes & PREFIX_FWAIT)
10379        && ((*codep < 0xd8) || (*codep > 0xdf))))
10380     {
10381       (*info->fprintf_func) (info->stream, "fwait");
10382       return 1;
10383     }
10384
10385   op = 0;
10386
10387   if (*codep == 0x0f)
10388     {
10389       unsigned char threebyte;
10390       FETCH_DATA (info, codep + 2);
10391       threebyte = *++codep;
10392       dp = &dis386_twobyte[threebyte];
10393       need_modrm = twobyte_has_modrm[*codep];
10394       codep++;
10395     }
10396   else
10397     {
10398       dp = &dis386[*codep];
10399       need_modrm = onebyte_has_modrm[*codep];
10400       codep++;
10401     }
10402
10403   if ((prefixes & PREFIX_REPZ))
10404     used_prefixes |= PREFIX_REPZ;
10405   if ((prefixes & PREFIX_REPNZ))
10406     used_prefixes |= PREFIX_REPNZ;
10407   if ((prefixes & PREFIX_LOCK))
10408     used_prefixes |= PREFIX_LOCK;
10409
10410   default_prefixes = 0;
10411   if (prefixes & PREFIX_ADDR)
10412     {
10413       sizeflag ^= AFLAG;
10414       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10415         {
10416           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10417             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
10418           else
10419             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
10420           default_prefixes |= PREFIX_ADDR;
10421         }
10422     }
10423
10424   if ((prefixes & PREFIX_DATA))
10425     {
10426       sizeflag ^= DFLAG;
10427       if (dp->op[2].bytemode == cond_jump_mode
10428           && dp->op[0].bytemode == v_mode
10429           && !intel_syntax)
10430         {
10431           if (sizeflag & DFLAG)
10432             all_prefixes[last_data_prefix] = DATA32_PREFIX;
10433           else
10434             all_prefixes[last_data_prefix] = DATA16_PREFIX;
10435           default_prefixes |= PREFIX_DATA;
10436         }
10437       else if (rex & REX_W)
10438         {
10439           /* REX_W will override PREFIX_DATA.  */
10440           default_prefixes |= PREFIX_DATA;
10441         }
10442     }
10443
10444   if (need_modrm)
10445     {
10446       FETCH_DATA (info, codep + 1);
10447       modrm.mod = (*codep >> 6) & 3;
10448       modrm.reg = (*codep >> 3) & 7;
10449       modrm.rm = *codep & 7;
10450     }
10451
10452    need_vex = 0;
10453    need_vex_reg = 0;
10454    vex_w_done = 0;
10455
10456   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10457     {
10458       dofloat (sizeflag);
10459     }
10460   else
10461     {
10462       dp = get_valid_dis386 (dp, info);
10463       if (dp != NULL && putop (dp->name, sizeflag) == 0)
10464         {
10465           for (i = 0; i < MAX_OPERANDS; ++i)
10466             {
10467               obufp = op_out[i];
10468               op_ad = MAX_OPERANDS - 1 - i;
10469               if (dp->op[i].rtn)
10470                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10471             }
10472         }
10473     }
10474
10475   /* See if any prefixes were not used.  If so, print the first one
10476      separately.  If we don't do this, we'll wind up printing an
10477      instruction stream which does not precisely correspond to the
10478      bytes we are disassembling.  */
10479   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
10480     {
10481       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10482         if (all_prefixes[i])
10483           {
10484             const char *name;
10485             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
10486             if (name == NULL)
10487               name = INTERNAL_DISASSEMBLER_ERROR;
10488             (*info->fprintf_func) (info->stream, "%s", name);
10489             return 1;
10490           }
10491     }
10492
10493   /* Check if the REX prefix used.  */
10494   if (rex_ignored == 0 && (rex ^ rex_used) == 0)
10495     all_prefixes[last_rex_prefix] = 0;
10496
10497   /* Check if the SEG prefix used.  */
10498   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10499                    | PREFIX_FS | PREFIX_GS)) != 0
10500       && (used_prefixes
10501           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
10502     all_prefixes[last_seg_prefix] = 0;
10503
10504   /* Check if the ADDR prefix used.  */
10505   if ((prefixes & PREFIX_ADDR) != 0
10506       && (used_prefixes & PREFIX_ADDR) != 0)
10507     all_prefixes[last_addr_prefix] = 0;
10508
10509   /* Check if the DATA prefix used.  */
10510   if ((prefixes & PREFIX_DATA) != 0
10511       && (used_prefixes & PREFIX_DATA) != 0)
10512     all_prefixes[last_data_prefix] = 0;
10513
10514   prefix_length = 0;
10515   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10516     if (all_prefixes[i])
10517       {
10518         const char *name;
10519         name = prefix_name (all_prefixes[i], sizeflag);
10520         if (name == NULL)
10521           abort ();
10522         prefix_length += strlen (name) + 1;
10523         (*info->fprintf_func) (info->stream, "%s ", name);
10524       }
10525
10526   /* Check maximum code length.  */
10527   if ((codep - start_codep) > MAX_CODE_LENGTH)
10528     {
10529       (*info->fprintf_func) (info->stream, "(bad)");
10530       return MAX_CODE_LENGTH;
10531     }
10532
10533   obufp = mnemonicendp;
10534   for (i = strlen (obuf) + prefix_length; i < 6; i++)
10535     oappend (" ");
10536   oappend (" ");
10537   (*info->fprintf_func) (info->stream, "%s", obuf);
10538
10539   /* The enter and bound instructions are printed with operands in the same
10540      order as the intel book; everything else is printed in reverse order.  */
10541   if (intel_syntax || two_source_ops)
10542     {
10543       bfd_vma riprel;
10544
10545       for (i = 0; i < MAX_OPERANDS; ++i)
10546         op_txt[i] = op_out[i];
10547
10548       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10549         {
10550           op_ad = op_index[i];
10551           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10552           op_index[MAX_OPERANDS - 1 - i] = op_ad;
10553           riprel = op_riprel[i];
10554           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10555           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10556         }
10557     }
10558   else
10559     {
10560       for (i = 0; i < MAX_OPERANDS; ++i)
10561         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10562     }
10563
10564   needcomma = 0;
10565   for (i = 0; i < MAX_OPERANDS; ++i)
10566     if (*op_txt[i])
10567       {
10568         if (needcomma)
10569           (*info->fprintf_func) (info->stream, ",");
10570         if (op_index[i] != -1 && !op_riprel[i])
10571           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10572         else
10573           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10574         needcomma = 1;
10575       }
10576
10577   for (i = 0; i < MAX_OPERANDS; i++)
10578     if (op_index[i] != -1 && op_riprel[i])
10579       {
10580         (*info->fprintf_func) (info->stream, "        # ");
10581         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10582                                                 + op_address[op_index[i]]), info);
10583         break;
10584       }
10585   return codep - priv.the_buffer;
10586 }
10587
10588 static const char *float_mem[] = {
10589   /* d8 */
10590   "fadd{s|}",
10591   "fmul{s|}",
10592   "fcom{s|}",
10593   "fcomp{s|}",
10594   "fsub{s|}",
10595   "fsubr{s|}",
10596   "fdiv{s|}",
10597   "fdivr{s|}",
10598   /* d9 */
10599   "fld{s|}",
10600   "(bad)",
10601   "fst{s|}",
10602   "fstp{s|}",
10603   "fldenvIC",
10604   "fldcw",
10605   "fNstenvIC",
10606   "fNstcw",
10607   /* da */
10608   "fiadd{l|}",
10609   "fimul{l|}",
10610   "ficom{l|}",
10611   "ficomp{l|}",
10612   "fisub{l|}",
10613   "fisubr{l|}",
10614   "fidiv{l|}",
10615   "fidivr{l|}",
10616   /* db */
10617   "fild{l|}",
10618   "fisttp{l|}",
10619   "fist{l|}",
10620   "fistp{l|}",
10621   "(bad)",
10622   "fld{t||t|}",
10623   "(bad)",
10624   "fstp{t||t|}",
10625   /* dc */
10626   "fadd{l|}",
10627   "fmul{l|}",
10628   "fcom{l|}",
10629   "fcomp{l|}",
10630   "fsub{l|}",
10631   "fsubr{l|}",
10632   "fdiv{l|}",
10633   "fdivr{l|}",
10634   /* dd */
10635   "fld{l|}",
10636   "fisttp{ll|}",
10637   "fst{l||}",
10638   "fstp{l|}",
10639   "frstorIC",
10640   "(bad)",
10641   "fNsaveIC",
10642   "fNstsw",
10643   /* de */
10644   "fiadd",
10645   "fimul",
10646   "ficom",
10647   "ficomp",
10648   "fisub",
10649   "fisubr",
10650   "fidiv",
10651   "fidivr",
10652   /* df */
10653   "fild",
10654   "fisttp",
10655   "fist",
10656   "fistp",
10657   "fbld",
10658   "fild{ll|}",
10659   "fbstp",
10660   "fistp{ll|}",
10661 };
10662
10663 static const unsigned char float_mem_mode[] = {
10664   /* d8 */
10665   d_mode,
10666   d_mode,
10667   d_mode,
10668   d_mode,
10669   d_mode,
10670   d_mode,
10671   d_mode,
10672   d_mode,
10673   /* d9 */
10674   d_mode,
10675   0,
10676   d_mode,
10677   d_mode,
10678   0,
10679   w_mode,
10680   0,
10681   w_mode,
10682   /* da */
10683   d_mode,
10684   d_mode,
10685   d_mode,
10686   d_mode,
10687   d_mode,
10688   d_mode,
10689   d_mode,
10690   d_mode,
10691   /* db */
10692   d_mode,
10693   d_mode,
10694   d_mode,
10695   d_mode,
10696   0,
10697   t_mode,
10698   0,
10699   t_mode,
10700   /* dc */
10701   q_mode,
10702   q_mode,
10703   q_mode,
10704   q_mode,
10705   q_mode,
10706   q_mode,
10707   q_mode,
10708   q_mode,
10709   /* dd */
10710   q_mode,
10711   q_mode,
10712   q_mode,
10713   q_mode,
10714   0,
10715   0,
10716   0,
10717   w_mode,
10718   /* de */
10719   w_mode,
10720   w_mode,
10721   w_mode,
10722   w_mode,
10723   w_mode,
10724   w_mode,
10725   w_mode,
10726   w_mode,
10727   /* df */
10728   w_mode,
10729   w_mode,
10730   w_mode,
10731   w_mode,
10732   t_mode,
10733   q_mode,
10734   t_mode,
10735   q_mode
10736 };
10737
10738 #define ST { OP_ST, 0 }
10739 #define STi { OP_STi, 0 }
10740
10741 #define FGRPd9_2 NULL, { { NULL, 0 } }
10742 #define FGRPd9_4 NULL, { { NULL, 1 } }
10743 #define FGRPd9_5 NULL, { { NULL, 2 } }
10744 #define FGRPd9_6 NULL, { { NULL, 3 } }
10745 #define FGRPd9_7 NULL, { { NULL, 4 } }
10746 #define FGRPda_5 NULL, { { NULL, 5 } }
10747 #define FGRPdb_4 NULL, { { NULL, 6 } }
10748 #define FGRPde_3 NULL, { { NULL, 7 } }
10749 #define FGRPdf_4 NULL, { { NULL, 8 } }
10750
10751 static const struct dis386 float_reg[][8] = {
10752   /* d8 */
10753   {
10754     { "fadd",   { ST, STi } },
10755     { "fmul",   { ST, STi } },
10756     { "fcom",   { STi } },
10757     { "fcomp",  { STi } },
10758     { "fsub",   { ST, STi } },
10759     { "fsubr",  { ST, STi } },
10760     { "fdiv",   { ST, STi } },
10761     { "fdivr",  { ST, STi } },
10762   },
10763   /* d9 */
10764   {
10765     { "fld",    { STi } },
10766     { "fxch",   { STi } },
10767     { FGRPd9_2 },
10768     { "(bad)",  { XX } },
10769     { FGRPd9_4 },
10770     { FGRPd9_5 },
10771     { FGRPd9_6 },
10772     { FGRPd9_7 },
10773   },
10774   /* da */
10775   {
10776     { "fcmovb", { ST, STi } },
10777     { "fcmove", { ST, STi } },
10778     { "fcmovbe",{ ST, STi } },
10779     { "fcmovu", { ST, STi } },
10780     { "(bad)",  { XX } },
10781     { FGRPda_5 },
10782     { "(bad)",  { XX } },
10783     { "(bad)",  { XX } },
10784   },
10785   /* db */
10786   {
10787     { "fcmovnb",{ ST, STi } },
10788     { "fcmovne",{ ST, STi } },
10789     { "fcmovnbe",{ ST, STi } },
10790     { "fcmovnu",{ ST, STi } },
10791     { FGRPdb_4 },
10792     { "fucomi", { ST, STi } },
10793     { "fcomi",  { ST, STi } },
10794     { "(bad)",  { XX } },
10795   },
10796   /* dc */
10797   {
10798     { "fadd",   { STi, ST } },
10799     { "fmul",   { STi, ST } },
10800     { "(bad)",  { XX } },
10801     { "(bad)",  { XX } },
10802     { "fsub!M", { STi, ST } },
10803     { "fsubM",  { STi, ST } },
10804     { "fdiv!M", { STi, ST } },
10805     { "fdivM",  { STi, ST } },
10806   },
10807   /* dd */
10808   {
10809     { "ffree",  { STi } },
10810     { "(bad)",  { XX } },
10811     { "fst",    { STi } },
10812     { "fstp",   { STi } },
10813     { "fucom",  { STi } },
10814     { "fucomp", { STi } },
10815     { "(bad)",  { XX } },
10816     { "(bad)",  { XX } },
10817   },
10818   /* de */
10819   {
10820     { "faddp",  { STi, ST } },
10821     { "fmulp",  { STi, ST } },
10822     { "(bad)",  { XX } },
10823     { FGRPde_3 },
10824     { "fsub!Mp", { STi, ST } },
10825     { "fsubMp", { STi, ST } },
10826     { "fdiv!Mp", { STi, ST } },
10827     { "fdivMp", { STi, ST } },
10828   },
10829   /* df */
10830   {
10831     { "ffreep", { STi } },
10832     { "(bad)",  { XX } },
10833     { "(bad)",  { XX } },
10834     { "(bad)",  { XX } },
10835     { FGRPdf_4 },
10836     { "fucomip", { ST, STi } },
10837     { "fcomip", { ST, STi } },
10838     { "(bad)",  { XX } },
10839   },
10840 };
10841
10842 static char *fgrps[][8] = {
10843   /* d9_2  0 */
10844   {
10845     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10846   },
10847
10848   /* d9_4  1 */
10849   {
10850     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10851   },
10852
10853   /* d9_5  2 */
10854   {
10855     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10856   },
10857
10858   /* d9_6  3 */
10859   {
10860     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10861   },
10862
10863   /* d9_7  4 */
10864   {
10865     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10866   },
10867
10868   /* da_5  5 */
10869   {
10870     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10871   },
10872
10873   /* db_4  6 */
10874   {
10875     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10876     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10877   },
10878
10879   /* de_3  7 */
10880   {
10881     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10882   },
10883
10884   /* df_4  8 */
10885   {
10886     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10887   },
10888 };
10889
10890 static void
10891 swap_operand (void)
10892 {
10893   mnemonicendp[0] = '.';
10894   mnemonicendp[1] = 's';
10895   mnemonicendp += 2;
10896 }
10897
10898 static void
10899 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
10900                int sizeflag ATTRIBUTE_UNUSED)
10901 {
10902   /* Skip mod/rm byte.  */
10903   MODRM_CHECK;
10904   codep++;
10905 }
10906
10907 static void
10908 dofloat (int sizeflag)
10909 {
10910   const struct dis386 *dp;
10911   unsigned char floatop;
10912
10913   floatop = codep[-1];
10914
10915   if (modrm.mod != 3)
10916     {
10917       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
10918
10919       putop (float_mem[fp_indx], sizeflag);
10920       obufp = op_out[0];
10921       op_ad = 2;
10922       OP_E (float_mem_mode[fp_indx], sizeflag);
10923       return;
10924     }
10925   /* Skip mod/rm byte.  */
10926   MODRM_CHECK;
10927   codep++;
10928
10929   dp = &float_reg[floatop - 0xd8][modrm.reg];
10930   if (dp->name == NULL)
10931     {
10932       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
10933
10934       /* Instruction fnstsw is only one with strange arg.  */
10935       if (floatop == 0xdf && codep[-1] == 0xe0)
10936         strcpy (op_out[0], names16[0]);
10937     }
10938   else
10939     {
10940       putop (dp->name, sizeflag);
10941
10942       obufp = op_out[0];
10943       op_ad = 2;
10944       if (dp->op[0].rtn)
10945         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
10946
10947       obufp = op_out[1];
10948       op_ad = 1;
10949       if (dp->op[1].rtn)
10950         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
10951     }
10952 }
10953
10954 static void
10955 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10956 {
10957   oappend ("%st" + intel_syntax);
10958 }
10959
10960 static void
10961 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
10962 {
10963   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
10964   oappend (scratchbuf + intel_syntax);
10965 }
10966
10967 /* Capital letters in template are macros.  */
10968 static int
10969 putop (const char *in_template, int sizeflag)
10970 {
10971   const char *p;
10972   int alt = 0;
10973   int cond = 1;
10974   unsigned int l = 0, len = 1;
10975   char last[4];
10976
10977 #define SAVE_LAST(c)                    \
10978   if (l < len && l < sizeof (last))     \
10979     last[l++] = c;                      \
10980   else                                  \
10981     abort ();
10982
10983   for (p = in_template; *p; p++)
10984     {
10985       switch (*p)
10986         {
10987         default:
10988           *obufp++ = *p;
10989           break;
10990         case '%':
10991           len++;
10992           break;
10993         case '!':
10994           cond = 0;
10995           break;
10996         case '{':
10997           alt = 0;
10998           if (intel_syntax)
10999             {
11000               while (*++p != '|')
11001                 if (*p == '}' || *p == '\0')
11002                   abort ();
11003             }
11004           /* Fall through.  */
11005         case 'I':
11006           alt = 1;
11007           continue;
11008         case '|':
11009           while (*++p != '}')
11010             {
11011               if (*p == '\0')
11012                 abort ();
11013             }
11014           break;
11015         case '}':
11016           break;
11017         case 'A':
11018           if (intel_syntax)
11019             break;
11020           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11021             *obufp++ = 'b';
11022           break;
11023         case 'B':
11024           if (l == 0 && len == 1)
11025             {
11026 case_B:
11027               if (intel_syntax)
11028                 break;
11029               if (sizeflag & SUFFIX_ALWAYS)
11030                 *obufp++ = 'b';
11031             }
11032           else
11033             {
11034               if (l != 1
11035                   || len != 2
11036                   || last[0] != 'L')
11037                 {
11038                   SAVE_LAST (*p);
11039                   break;
11040                 }
11041
11042               if (address_mode == mode_64bit
11043                   && !(prefixes & PREFIX_ADDR))
11044                 {
11045                   *obufp++ = 'a';
11046                   *obufp++ = 'b';
11047                   *obufp++ = 's';
11048                 }
11049
11050               goto case_B;
11051             }
11052           break;
11053         case 'C':
11054           if (intel_syntax && !alt)
11055             break;
11056           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11057             {
11058               if (sizeflag & DFLAG)
11059                 *obufp++ = intel_syntax ? 'd' : 'l';
11060               else
11061                 *obufp++ = intel_syntax ? 'w' : 's';
11062               used_prefixes |= (prefixes & PREFIX_DATA);
11063             }
11064           break;
11065         case 'D':
11066           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11067             break;
11068           USED_REX (REX_W);
11069           if (modrm.mod == 3)
11070             {
11071               if (rex & REX_W)
11072                 *obufp++ = 'q';
11073               else
11074                 {
11075                   if (sizeflag & DFLAG)
11076                     *obufp++ = intel_syntax ? 'd' : 'l';
11077                   else
11078                     *obufp++ = 'w';
11079                   used_prefixes |= (prefixes & PREFIX_DATA);
11080                 }
11081             }
11082           else
11083             *obufp++ = 'w';
11084           break;
11085         case 'E':               /* For jcxz/jecxz */
11086           if (address_mode == mode_64bit)
11087             {
11088               if (sizeflag & AFLAG)
11089                 *obufp++ = 'r';
11090               else
11091                 *obufp++ = 'e';
11092             }
11093           else
11094             if (sizeflag & AFLAG)
11095               *obufp++ = 'e';
11096           used_prefixes |= (prefixes & PREFIX_ADDR);
11097           break;
11098         case 'F':
11099           if (intel_syntax)
11100             break;
11101           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11102             {
11103               if (sizeflag & AFLAG)
11104                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
11105               else
11106                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
11107               used_prefixes |= (prefixes & PREFIX_ADDR);
11108             }
11109           break;
11110         case 'G':
11111           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
11112             break;
11113           if ((rex & REX_W) || (sizeflag & DFLAG))
11114             *obufp++ = 'l';
11115           else
11116             *obufp++ = 'w';
11117           if (!(rex & REX_W))
11118             used_prefixes |= (prefixes & PREFIX_DATA);
11119           break;
11120         case 'H':
11121           if (intel_syntax)
11122             break;
11123           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11124               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11125             {
11126               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
11127               *obufp++ = ',';
11128               *obufp++ = 'p';
11129               if (prefixes & PREFIX_DS)
11130                 *obufp++ = 't';
11131               else
11132                 *obufp++ = 'n';
11133             }
11134           break;
11135         case 'J':
11136           if (intel_syntax)
11137             break;
11138           *obufp++ = 'l';
11139           break;
11140         case 'K':
11141           USED_REX (REX_W);
11142           if (rex & REX_W)
11143             *obufp++ = 'q';
11144           else
11145             *obufp++ = 'd';
11146           break;
11147         case 'Z':
11148           if (intel_syntax)
11149             break;
11150           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
11151             {
11152               *obufp++ = 'q';
11153               break;
11154             }
11155           /* Fall through.  */
11156           goto case_L;
11157         case 'L':
11158           if (l != 0 || len != 1)
11159             {
11160               SAVE_LAST (*p);
11161               break;
11162             }
11163 case_L:
11164           if (intel_syntax)
11165             break;
11166           if (sizeflag & SUFFIX_ALWAYS)
11167             *obufp++ = 'l';
11168           break;
11169         case 'M':
11170           if (intel_mnemonic != cond)
11171             *obufp++ = 'r';
11172           break;
11173         case 'N':
11174           if ((prefixes & PREFIX_FWAIT) == 0)
11175             *obufp++ = 'n';
11176           else
11177             used_prefixes |= PREFIX_FWAIT;
11178           break;
11179         case 'O':
11180           USED_REX (REX_W);
11181           if (rex & REX_W)
11182             *obufp++ = 'o';
11183           else if (intel_syntax && (sizeflag & DFLAG))
11184             *obufp++ = 'q';
11185           else
11186             *obufp++ = 'd';
11187           if (!(rex & REX_W))
11188             used_prefixes |= (prefixes & PREFIX_DATA);
11189           break;
11190         case 'T':
11191           if (intel_syntax)
11192             break;
11193           if (address_mode == mode_64bit && (sizeflag & DFLAG))
11194             {
11195               *obufp++ = 'q';
11196               break;
11197             }
11198           /* Fall through.  */
11199         case 'P':
11200           if (intel_syntax)
11201             break;
11202           if ((prefixes & PREFIX_DATA)
11203               || (rex & REX_W)
11204               || (sizeflag & SUFFIX_ALWAYS))
11205             {
11206               USED_REX (REX_W);
11207               if (rex & REX_W)
11208                 *obufp++ = 'q';
11209               else
11210                 {
11211                    if (sizeflag & DFLAG)
11212                       *obufp++ = 'l';
11213                    else
11214                      *obufp++ = 'w';
11215                    used_prefixes |= (prefixes & PREFIX_DATA);
11216                 }
11217             }
11218           break;
11219         case 'U':
11220           if (intel_syntax)
11221             break;
11222           if (address_mode == mode_64bit && (sizeflag & DFLAG))
11223             {
11224               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11225                 *obufp++ = 'q';
11226               break;
11227             }
11228           /* Fall through.  */
11229           goto case_Q;
11230         case 'Q':
11231           if (l == 0 && len == 1)
11232             {
11233 case_Q:
11234               if (intel_syntax && !alt)
11235                 break;
11236               USED_REX (REX_W);
11237               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11238                 {
11239                   if (rex & REX_W)
11240                     *obufp++ = 'q';
11241                   else
11242                     {
11243                       if (sizeflag & DFLAG)
11244                         *obufp++ = intel_syntax ? 'd' : 'l';
11245                       else
11246                         *obufp++ = 'w';
11247                       used_prefixes |= (prefixes & PREFIX_DATA);
11248                     }
11249                 }
11250             }
11251           else
11252             {
11253               if (l != 1 || len != 2 || last[0] != 'L')
11254                 {
11255                   SAVE_LAST (*p);
11256                   break;
11257                 }
11258               if (intel_syntax
11259                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11260                 break;
11261               if ((rex & REX_W))
11262                 {
11263                   USED_REX (REX_W);
11264                   *obufp++ = 'q';
11265                 }
11266               else
11267                 *obufp++ = 'l';
11268             }
11269           break;
11270         case 'R':
11271           USED_REX (REX_W);
11272           if (rex & REX_W)
11273             *obufp++ = 'q';
11274           else if (sizeflag & DFLAG)
11275             {
11276               if (intel_syntax)
11277                   *obufp++ = 'd';
11278               else
11279                   *obufp++ = 'l';
11280             }
11281           else
11282             *obufp++ = 'w';
11283           if (intel_syntax && !p[1]
11284               && ((rex & REX_W) || (sizeflag & DFLAG)))
11285             *obufp++ = 'e';
11286           if (!(rex & REX_W))
11287             used_prefixes |= (prefixes & PREFIX_DATA);
11288           break;
11289         case 'V':
11290           if (l == 0 && len == 1)
11291             {
11292               if (intel_syntax)
11293                 break;
11294               if (address_mode == mode_64bit && (sizeflag & DFLAG))
11295                 {
11296                   if (sizeflag & SUFFIX_ALWAYS)
11297                     *obufp++ = 'q';
11298                   break;
11299                 }
11300             }
11301           else
11302             {
11303               if (l != 1
11304                   || len != 2
11305                   || last[0] != 'L')
11306                 {
11307                   SAVE_LAST (*p);
11308                   break;
11309                 }
11310
11311               if (rex & REX_W)
11312                 {
11313                   *obufp++ = 'a';
11314                   *obufp++ = 'b';
11315                   *obufp++ = 's';
11316                 }
11317             }
11318           /* Fall through.  */
11319           goto case_S;
11320         case 'S':
11321           if (l == 0 && len == 1)
11322             {
11323 case_S:
11324               if (intel_syntax)
11325                 break;
11326               if (sizeflag & SUFFIX_ALWAYS)
11327                 {
11328                   if (rex & REX_W)
11329                     *obufp++ = 'q';
11330                   else
11331                     {
11332                       if (sizeflag & DFLAG)
11333                         *obufp++ = 'l';
11334                       else
11335                         *obufp++ = 'w';
11336                       used_prefixes |= (prefixes & PREFIX_DATA);
11337                     }
11338                 }
11339             }
11340           else
11341             {
11342               if (l != 1
11343                   || len != 2
11344                   || last[0] != 'L')
11345                 {
11346                   SAVE_LAST (*p);
11347                   break;
11348                 }
11349
11350               if (address_mode == mode_64bit
11351                   && !(prefixes & PREFIX_ADDR))
11352                 {
11353                   *obufp++ = 'a';
11354                   *obufp++ = 'b';
11355                   *obufp++ = 's';
11356                 }
11357
11358               goto case_S;
11359             }
11360           break;
11361         case 'X':
11362           if (l != 0 || len != 1)
11363             {
11364               SAVE_LAST (*p);
11365               break;
11366             }
11367           if (need_vex && vex.prefix)
11368             {
11369               if (vex.prefix == DATA_PREFIX_OPCODE)
11370                 *obufp++ = 'd';
11371               else
11372                 *obufp++ = 's';
11373             }
11374           else
11375             {
11376               if (prefixes & PREFIX_DATA)
11377                 *obufp++ = 'd';
11378               else
11379                 *obufp++ = 's';
11380               used_prefixes |= (prefixes & PREFIX_DATA);
11381             }
11382           break;
11383         case 'Y':
11384           if (l == 0 && len == 1)
11385             {
11386               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11387                 break;
11388               if (rex & REX_W)
11389                 {
11390                   USED_REX (REX_W);
11391                   *obufp++ = 'q';
11392                 }
11393               break;
11394             }
11395           else
11396             {
11397               if (l != 1 || len != 2 || last[0] != 'X')
11398                 {
11399                   SAVE_LAST (*p);
11400                   break;
11401                 }
11402               if (!need_vex)
11403                 abort ();
11404               if (intel_syntax
11405                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11406                 break;
11407               switch (vex.length)
11408                 {
11409                 case 128:
11410                   *obufp++ = 'x';
11411                   break;
11412                 case 256:
11413                   *obufp++ = 'y';
11414                   break;
11415                 default:
11416                   abort ();
11417                 }
11418             }
11419           break;
11420         case 'W':
11421           if (l == 0 && len == 1)
11422             {
11423               /* operand size flag for cwtl, cbtw */
11424               USED_REX (REX_W);
11425               if (rex & REX_W)
11426                 {
11427                   if (intel_syntax)
11428                     *obufp++ = 'd';
11429                   else
11430                     *obufp++ = 'l';
11431                 }
11432               else if (sizeflag & DFLAG)
11433                 *obufp++ = 'w';
11434               else
11435                 *obufp++ = 'b';
11436               if (!(rex & REX_W))
11437                 used_prefixes |= (prefixes & PREFIX_DATA);
11438             }
11439           else
11440             {
11441               if (l != 1 || len != 2 || last[0] != 'X')
11442                 {
11443                   SAVE_LAST (*p);
11444                   break;
11445                 }
11446               if (!need_vex)
11447                 abort ();
11448               *obufp++ = vex.w ? 'd': 's';
11449             }
11450           break;
11451         }
11452       alt = 0;
11453     }
11454   *obufp = 0;
11455   mnemonicendp = obufp;
11456   return 0;
11457 }
11458
11459 static void
11460 oappend (const char *s)
11461 {
11462   obufp = stpcpy (obufp, s);
11463 }
11464
11465 static void
11466 append_seg (void)
11467 {
11468   if (prefixes & PREFIX_CS)
11469     {
11470       used_prefixes |= PREFIX_CS;
11471       oappend ("%cs:" + intel_syntax);
11472     }
11473   if (prefixes & PREFIX_DS)
11474     {
11475       used_prefixes |= PREFIX_DS;
11476       oappend ("%ds:" + intel_syntax);
11477     }
11478   if (prefixes & PREFIX_SS)
11479     {
11480       used_prefixes |= PREFIX_SS;
11481       oappend ("%ss:" + intel_syntax);
11482     }
11483   if (prefixes & PREFIX_ES)
11484     {
11485       used_prefixes |= PREFIX_ES;
11486       oappend ("%es:" + intel_syntax);
11487     }
11488   if (prefixes & PREFIX_FS)
11489     {
11490       used_prefixes |= PREFIX_FS;
11491       oappend ("%fs:" + intel_syntax);
11492     }
11493   if (prefixes & PREFIX_GS)
11494     {
11495       used_prefixes |= PREFIX_GS;
11496       oappend ("%gs:" + intel_syntax);
11497     }
11498 }
11499
11500 static void
11501 OP_indirE (int bytemode, int sizeflag)
11502 {
11503   if (!intel_syntax)
11504     oappend ("*");
11505   OP_E (bytemode, sizeflag);
11506 }
11507
11508 static void
11509 print_operand_value (char *buf, int hex, bfd_vma disp)
11510 {
11511   if (address_mode == mode_64bit)
11512     {
11513       if (hex)
11514         {
11515           char tmp[30];
11516           int i;
11517           buf[0] = '0';
11518           buf[1] = 'x';
11519           sprintf_vma (tmp, disp);
11520           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11521           strcpy (buf + 2, tmp + i);
11522         }
11523       else
11524         {
11525           bfd_signed_vma v = disp;
11526           char tmp[30];
11527           int i;
11528           if (v < 0)
11529             {
11530               *(buf++) = '-';
11531               v = -disp;
11532               /* Check for possible overflow on 0x8000000000000000.  */
11533               if (v < 0)
11534                 {
11535                   strcpy (buf, "9223372036854775808");
11536                   return;
11537                 }
11538             }
11539           if (!v)
11540             {
11541               strcpy (buf, "0");
11542               return;
11543             }
11544
11545           i = 0;
11546           tmp[29] = 0;
11547           while (v)
11548             {
11549               tmp[28 - i] = (v % 10) + '0';
11550               v /= 10;
11551               i++;
11552             }
11553           strcpy (buf, tmp + 29 - i);
11554         }
11555     }
11556   else
11557     {
11558       if (hex)
11559         sprintf (buf, "0x%x", (unsigned int) disp);
11560       else
11561         sprintf (buf, "%d", (int) disp);
11562     }
11563 }
11564
11565 /* Put DISP in BUF as signed hex number.  */
11566
11567 static void
11568 print_displacement (char *buf, bfd_vma disp)
11569 {
11570   bfd_signed_vma val = disp;
11571   char tmp[30];
11572   int i, j = 0;
11573
11574   if (val < 0)
11575     {
11576       buf[j++] = '-';
11577       val = -disp;
11578
11579       /* Check for possible overflow.  */
11580       if (val < 0)
11581         {
11582           switch (address_mode)
11583             {
11584             case mode_64bit:
11585               strcpy (buf + j, "0x8000000000000000");
11586               break;
11587             case mode_32bit:
11588               strcpy (buf + j, "0x80000000");
11589               break;
11590             case mode_16bit:
11591               strcpy (buf + j, "0x8000");
11592               break;
11593             }
11594           return;
11595         }
11596     }
11597
11598   buf[j++] = '0';
11599   buf[j++] = 'x';
11600
11601   sprintf_vma (tmp, (bfd_vma) val);
11602   for (i = 0; tmp[i] == '0'; i++)
11603     continue;
11604   if (tmp[i] == '\0')
11605     i--;
11606   strcpy (buf + j, tmp + i);
11607 }
11608
11609 static void
11610 intel_operand_size (int bytemode, int sizeflag)
11611 {
11612   switch (bytemode)
11613     {
11614     case b_mode:
11615     case b_swap_mode:
11616     case dqb_mode:
11617       oappend ("BYTE PTR ");
11618       break;
11619     case w_mode:
11620     case dqw_mode:
11621       oappend ("WORD PTR ");
11622       break;
11623     case stack_v_mode:
11624       if (address_mode == mode_64bit && (sizeflag & DFLAG))
11625         {
11626           oappend ("QWORD PTR ");
11627           break;
11628         }
11629       /* FALLTHRU */
11630     case v_mode:
11631     case v_swap_mode:
11632     case dq_mode:
11633       USED_REX (REX_W);
11634       if (rex & REX_W)
11635         oappend ("QWORD PTR ");
11636       else
11637         {
11638           if ((sizeflag & DFLAG) || bytemode == dq_mode)
11639             oappend ("DWORD PTR ");
11640           else
11641             oappend ("WORD PTR ");
11642           used_prefixes |= (prefixes & PREFIX_DATA);
11643         }
11644       break;
11645     case z_mode:
11646       if ((rex & REX_W) || (sizeflag & DFLAG))
11647         *obufp++ = 'D';
11648       oappend ("WORD PTR ");
11649       if (!(rex & REX_W))
11650         used_prefixes |= (prefixes & PREFIX_DATA);
11651       break;
11652     case a_mode:
11653       if (sizeflag & DFLAG)
11654         oappend ("QWORD PTR ");
11655       else
11656         oappend ("DWORD PTR ");
11657       used_prefixes |= (prefixes & PREFIX_DATA);
11658       break;
11659     case d_mode:
11660     case d_swap_mode:
11661     case dqd_mode:
11662       oappend ("DWORD PTR ");
11663       break;
11664     case q_mode:
11665     case q_swap_mode:
11666       oappend ("QWORD PTR ");
11667       break;
11668     case m_mode:
11669       if (address_mode == mode_64bit)
11670         oappend ("QWORD PTR ");
11671       else
11672         oappend ("DWORD PTR ");
11673       break;
11674     case f_mode:
11675       if (sizeflag & DFLAG)
11676         oappend ("FWORD PTR ");
11677       else
11678         oappend ("DWORD PTR ");
11679       used_prefixes |= (prefixes & PREFIX_DATA);
11680       break;
11681     case t_mode:
11682       oappend ("TBYTE PTR ");
11683       break;
11684     case x_mode:
11685     case x_swap_mode:
11686       if (need_vex)
11687         {
11688           switch (vex.length)
11689             {
11690             case 128:
11691               oappend ("XMMWORD PTR ");
11692               break;
11693             case 256:
11694               oappend ("YMMWORD PTR ");
11695               break;
11696             default:
11697               abort ();
11698             }
11699         }
11700       else
11701         oappend ("XMMWORD PTR ");
11702       break;
11703     case xmm_mode:
11704       oappend ("XMMWORD PTR ");
11705       break;
11706     case xmmq_mode:
11707       if (!need_vex)
11708         abort ();
11709
11710       switch (vex.length)
11711         {
11712         case 128:
11713           oappend ("QWORD PTR ");
11714           break;
11715         case 256:
11716           oappend ("XMMWORD PTR ");
11717           break;
11718         default:
11719           abort ();
11720         }
11721       break;
11722     case ymmq_mode:
11723       if (!need_vex)
11724         abort ();
11725
11726       switch (vex.length)
11727         {
11728         case 128:
11729           oappend ("QWORD PTR ");
11730           break;
11731         case 256:
11732           oappend ("YMMWORD PTR ");
11733           break;
11734         default:
11735           abort ();
11736         }
11737       break;
11738     case o_mode:
11739       oappend ("OWORD PTR ");
11740       break;
11741     case vex_w_dq_mode:
11742       if (!need_vex)
11743         abort ();
11744
11745       if (vex.w)
11746         oappend ("QWORD PTR ");
11747       else
11748         oappend ("DWORD PTR ");
11749       break;
11750     default:
11751       break;
11752     }
11753 }
11754
11755 static void
11756 OP_E_register (int bytemode, int sizeflag)
11757 {
11758   int reg = modrm.rm;
11759   const char **names;
11760
11761   USED_REX (REX_B);
11762   if ((rex & REX_B))
11763     reg += 8;
11764
11765   if ((sizeflag & SUFFIX_ALWAYS)
11766       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
11767     swap_operand ();
11768
11769   switch (bytemode)
11770     {
11771     case b_mode:
11772     case b_swap_mode:
11773       USED_REX (0);
11774       if (rex)
11775         names = names8rex;
11776       else
11777         names = names8;
11778       break;
11779     case w_mode:
11780       names = names16;
11781       break;
11782     case d_mode:
11783       names = names32;
11784       break;
11785     case q_mode:
11786       names = names64;
11787       break;
11788     case m_mode:
11789       names = address_mode == mode_64bit ? names64 : names32;
11790       break;
11791     case stack_v_mode:
11792       if (address_mode == mode_64bit && (sizeflag & DFLAG))
11793         {
11794           names = names64;
11795           break;
11796         }
11797       bytemode = v_mode;
11798       /* FALLTHRU */
11799     case v_mode:
11800     case v_swap_mode:
11801     case dq_mode:
11802     case dqb_mode:
11803     case dqd_mode:
11804     case dqw_mode:
11805       USED_REX (REX_W);
11806       if (rex & REX_W)
11807         names = names64;
11808       else
11809         {
11810           if ((sizeflag & DFLAG) 
11811               || (bytemode != v_mode
11812                   && bytemode != v_swap_mode))
11813             names = names32;
11814           else
11815             names = names16;
11816           used_prefixes |= (prefixes & PREFIX_DATA);
11817         }
11818       break;
11819     case 0:
11820       return;
11821     default:
11822       oappend (INTERNAL_DISASSEMBLER_ERROR);
11823       return;
11824     }
11825   oappend (names[reg]);
11826 }
11827
11828 static void
11829 OP_E_memory (int bytemode, int sizeflag)
11830 {
11831   bfd_vma disp = 0;
11832   int add = (rex & REX_B) ? 8 : 0;
11833   int riprel = 0;
11834
11835   USED_REX (REX_B);
11836   if (intel_syntax)
11837     intel_operand_size (bytemode, sizeflag);
11838   append_seg ();
11839
11840   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11841     {
11842       /* 32/64 bit address mode */
11843       int havedisp;
11844       int havesib;
11845       int havebase;
11846       int haveindex;
11847       int needindex;
11848       int base, rbase;
11849       int index = 0;
11850       int scale = 0;
11851
11852       havesib = 0;
11853       havebase = 1;
11854       haveindex = 0;
11855       base = modrm.rm;
11856
11857       if (base == 4)
11858         {
11859           havesib = 1;
11860           FETCH_DATA (the_info, codep + 1);
11861           index = (*codep >> 3) & 7;
11862           scale = (*codep >> 6) & 3;
11863           base = *codep & 7;
11864           USED_REX (REX_X);
11865           if (rex & REX_X)
11866             index += 8;
11867           haveindex = index != 4;
11868           codep++;
11869         }
11870       rbase = base + add;
11871
11872       switch (modrm.mod)
11873         {
11874         case 0:
11875           if (base == 5)
11876             {
11877               havebase = 0;
11878               if (address_mode == mode_64bit && !havesib)
11879                 riprel = 1;
11880               disp = get32s ();
11881             }
11882           break;
11883         case 1:
11884           FETCH_DATA (the_info, codep + 1);
11885           disp = *codep++;
11886           if ((disp & 0x80) != 0)
11887             disp -= 0x100;
11888           break;
11889         case 2:
11890           disp = get32s ();
11891           break;
11892         }
11893
11894       /* In 32bit mode, we need index register to tell [offset] from
11895          [eiz*1 + offset].  */
11896       needindex = (havesib
11897                    && !havebase
11898                    && !haveindex
11899                    && address_mode == mode_32bit);
11900       havedisp = (havebase
11901                   || needindex
11902                   || (havesib && (haveindex || scale != 0)));
11903
11904       if (!intel_syntax)
11905         if (modrm.mod != 0 || base == 5)
11906           {
11907             if (havedisp || riprel)
11908               print_displacement (scratchbuf, disp);
11909             else
11910               print_operand_value (scratchbuf, 1, disp);
11911             oappend (scratchbuf);
11912             if (riprel)
11913               {
11914                 set_op (disp, 1);
11915                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
11916               }
11917           }
11918
11919       if (havebase || haveindex || riprel)
11920         used_prefixes |= PREFIX_ADDR;
11921
11922       if (havedisp || (intel_syntax && riprel))
11923         {
11924           *obufp++ = open_char;
11925           if (intel_syntax && riprel)
11926             {
11927               set_op (disp, 1);
11928               oappend (sizeflag & AFLAG ? "rip" : "eip");
11929             }
11930           *obufp = '\0';
11931           if (havebase)
11932             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
11933                      ? names64[rbase] : names32[rbase]);
11934           if (havesib)
11935             {
11936               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
11937                  print index to tell base + index from base.  */
11938               if (scale != 0
11939                   || needindex
11940                   || haveindex
11941                   || (havebase && base != ESP_REG_NUM))
11942                 {
11943                   if (!intel_syntax || havebase)
11944                     {
11945                       *obufp++ = separator_char;
11946                       *obufp = '\0';
11947                     }
11948                   if (haveindex)
11949                     oappend (address_mode == mode_64bit 
11950                              && (sizeflag & AFLAG)
11951                              ? names64[index] : names32[index]);
11952                   else
11953                     oappend (address_mode == mode_64bit 
11954                              && (sizeflag & AFLAG)
11955                              ? index64 : index32);
11956
11957                   *obufp++ = scale_char;
11958                   *obufp = '\0';
11959                   sprintf (scratchbuf, "%d", 1 << scale);
11960                   oappend (scratchbuf);
11961                 }
11962             }
11963           if (intel_syntax
11964               && (disp || modrm.mod != 0 || base == 5))
11965             {
11966               if (!havedisp || (bfd_signed_vma) disp >= 0)
11967                 {
11968                   *obufp++ = '+';
11969                   *obufp = '\0';
11970                 }
11971               else if (modrm.mod != 1 && disp != -disp)
11972                 {
11973                   *obufp++ = '-';
11974                   *obufp = '\0';
11975                   disp = - (bfd_signed_vma) disp;
11976                 }
11977
11978               if (havedisp)
11979                 print_displacement (scratchbuf, disp);
11980               else
11981                 print_operand_value (scratchbuf, 1, disp);
11982               oappend (scratchbuf);
11983             }
11984
11985           *obufp++ = close_char;
11986           *obufp = '\0';
11987         }
11988       else if (intel_syntax)
11989         {
11990           if (modrm.mod != 0 || base == 5)
11991             {
11992               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
11993                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
11994                 ;
11995               else
11996                 {
11997                   oappend (names_seg[ds_reg - es_reg]);
11998                   oappend (":");
11999                 }
12000               print_operand_value (scratchbuf, 1, disp);
12001               oappend (scratchbuf);
12002             }
12003         }
12004     }
12005   else
12006     {
12007       /* 16 bit address mode */
12008       used_prefixes |= prefixes & PREFIX_ADDR;
12009       switch (modrm.mod)
12010         {
12011         case 0:
12012           if (modrm.rm == 6)
12013             {
12014               disp = get16 ();
12015               if ((disp & 0x8000) != 0)
12016                 disp -= 0x10000;
12017             }
12018           break;
12019         case 1:
12020           FETCH_DATA (the_info, codep + 1);
12021           disp = *codep++;
12022           if ((disp & 0x80) != 0)
12023             disp -= 0x100;
12024           break;
12025         case 2:
12026           disp = get16 ();
12027           if ((disp & 0x8000) != 0)
12028             disp -= 0x10000;
12029           break;
12030         }
12031
12032       if (!intel_syntax)
12033         if (modrm.mod != 0 || modrm.rm == 6)
12034           {
12035             print_displacement (scratchbuf, disp);
12036             oappend (scratchbuf);
12037           }
12038
12039       if (modrm.mod != 0 || modrm.rm != 6)
12040         {
12041           *obufp++ = open_char;
12042           *obufp = '\0';
12043           oappend (index16[modrm.rm]);
12044           if (intel_syntax
12045               && (disp || modrm.mod != 0 || modrm.rm == 6))
12046             {
12047               if ((bfd_signed_vma) disp >= 0)
12048                 {
12049                   *obufp++ = '+';
12050                   *obufp = '\0';
12051                 }
12052               else if (modrm.mod != 1)
12053                 {
12054                   *obufp++ = '-';
12055                   *obufp = '\0';
12056                   disp = - (bfd_signed_vma) disp;
12057                 }
12058
12059               print_displacement (scratchbuf, disp);
12060               oappend (scratchbuf);
12061             }
12062
12063           *obufp++ = close_char;
12064           *obufp = '\0';
12065         }
12066       else if (intel_syntax)
12067         {
12068           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12069                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12070             ;
12071           else
12072             {
12073               oappend (names_seg[ds_reg - es_reg]);
12074               oappend (":");
12075             }
12076           print_operand_value (scratchbuf, 1, disp & 0xffff);
12077           oappend (scratchbuf);
12078         }
12079     }
12080 }
12081
12082 static void
12083 OP_E_extended (int bytemode, int sizeflag)
12084 {
12085   /* Skip mod/rm byte.  */
12086   MODRM_CHECK;
12087   codep++;
12088
12089   if (modrm.mod == 3)
12090     OP_E_register (bytemode, sizeflag);
12091   else
12092     OP_E_memory (bytemode, sizeflag);
12093 }
12094
12095 static void
12096 OP_E (int bytemode, int sizeflag)
12097 {
12098   OP_E_extended (bytemode, sizeflag);
12099 }
12100
12101
12102 static void
12103 OP_G (int bytemode, int sizeflag)
12104 {
12105   int add = 0;
12106   USED_REX (REX_R);
12107   if (rex & REX_R)
12108     add += 8;
12109   switch (bytemode)
12110     {
12111     case b_mode:
12112       USED_REX (0);
12113       if (rex)
12114         oappend (names8rex[modrm.reg + add]);
12115       else
12116         oappend (names8[modrm.reg + add]);
12117       break;
12118     case w_mode:
12119       oappend (names16[modrm.reg + add]);
12120       break;
12121     case d_mode:
12122       oappend (names32[modrm.reg + add]);
12123       break;
12124     case q_mode:
12125       oappend (names64[modrm.reg + add]);
12126       break;
12127     case v_mode:
12128     case dq_mode:
12129     case dqb_mode:
12130     case dqd_mode:
12131     case dqw_mode:
12132       USED_REX (REX_W);
12133       if (rex & REX_W)
12134         oappend (names64[modrm.reg + add]);
12135       else
12136         {
12137           if ((sizeflag & DFLAG) || bytemode != v_mode)
12138             oappend (names32[modrm.reg + add]);
12139           else
12140             oappend (names16[modrm.reg + add]);
12141           used_prefixes |= (prefixes & PREFIX_DATA);
12142         }
12143       break;
12144     case m_mode:
12145       if (address_mode == mode_64bit)
12146         oappend (names64[modrm.reg + add]);
12147       else
12148         oappend (names32[modrm.reg + add]);
12149       break;
12150     default:
12151       oappend (INTERNAL_DISASSEMBLER_ERROR);
12152       break;
12153     }
12154 }
12155
12156 static bfd_vma
12157 get64 (void)
12158 {
12159   bfd_vma x;
12160 #ifdef BFD64
12161   unsigned int a;
12162   unsigned int b;
12163
12164   FETCH_DATA (the_info, codep + 8);
12165   a = *codep++ & 0xff;
12166   a |= (*codep++ & 0xff) << 8;
12167   a |= (*codep++ & 0xff) << 16;
12168   a |= (*codep++ & 0xff) << 24;
12169   b = *codep++ & 0xff;
12170   b |= (*codep++ & 0xff) << 8;
12171   b |= (*codep++ & 0xff) << 16;
12172   b |= (*codep++ & 0xff) << 24;
12173   x = a + ((bfd_vma) b << 32);
12174 #else
12175   abort ();
12176   x = 0;
12177 #endif
12178   return x;
12179 }
12180
12181 static bfd_signed_vma
12182 get32 (void)
12183 {
12184   bfd_signed_vma x = 0;
12185
12186   FETCH_DATA (the_info, codep + 4);
12187   x = *codep++ & (bfd_signed_vma) 0xff;
12188   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12189   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12190   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12191   return x;
12192 }
12193
12194 static bfd_signed_vma
12195 get32s (void)
12196 {
12197   bfd_signed_vma x = 0;
12198
12199   FETCH_DATA (the_info, codep + 4);
12200   x = *codep++ & (bfd_signed_vma) 0xff;
12201   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12202   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12203   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12204
12205   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12206
12207   return x;
12208 }
12209
12210 static int
12211 get16 (void)
12212 {
12213   int x = 0;
12214
12215   FETCH_DATA (the_info, codep + 2);
12216   x = *codep++ & 0xff;
12217   x |= (*codep++ & 0xff) << 8;
12218   return x;
12219 }
12220
12221 static void
12222 set_op (bfd_vma op, int riprel)
12223 {
12224   op_index[op_ad] = op_ad;
12225   if (address_mode == mode_64bit)
12226     {
12227       op_address[op_ad] = op;
12228       op_riprel[op_ad] = riprel;
12229     }
12230   else
12231     {
12232       /* Mask to get a 32-bit address.  */
12233       op_address[op_ad] = op & 0xffffffff;
12234       op_riprel[op_ad] = riprel & 0xffffffff;
12235     }
12236 }
12237
12238 static void
12239 OP_REG (int code, int sizeflag)
12240 {
12241   const char *s;
12242   int add;
12243   USED_REX (REX_B);
12244   if (rex & REX_B)
12245     add = 8;
12246   else
12247     add = 0;
12248
12249   switch (code)
12250     {
12251     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12252     case sp_reg: case bp_reg: case si_reg: case di_reg:
12253       s = names16[code - ax_reg + add];
12254       break;
12255     case es_reg: case ss_reg: case cs_reg:
12256     case ds_reg: case fs_reg: case gs_reg:
12257       s = names_seg[code - es_reg + add];
12258       break;
12259     case al_reg: case ah_reg: case cl_reg: case ch_reg:
12260     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12261       USED_REX (0);
12262       if (rex)
12263         s = names8rex[code - al_reg + add];
12264       else
12265         s = names8[code - al_reg];
12266       break;
12267     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12268     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12269       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12270         {
12271           s = names64[code - rAX_reg + add];
12272           break;
12273         }
12274       code += eAX_reg - rAX_reg;
12275       /* Fall through.  */
12276     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12277     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12278       USED_REX (REX_W);
12279       if (rex & REX_W)
12280         s = names64[code - eAX_reg + add];
12281       else
12282         {
12283           if (sizeflag & DFLAG)
12284             s = names32[code - eAX_reg + add];
12285           else
12286             s = names16[code - eAX_reg + add];
12287           used_prefixes |= (prefixes & PREFIX_DATA);
12288         }
12289       break;
12290     default:
12291       s = INTERNAL_DISASSEMBLER_ERROR;
12292       break;
12293     }
12294   oappend (s);
12295 }
12296
12297 static void
12298 OP_IMREG (int code, int sizeflag)
12299 {
12300   const char *s;
12301
12302   switch (code)
12303     {
12304     case indir_dx_reg:
12305       if (intel_syntax)
12306         s = "dx";
12307       else
12308         s = "(%dx)";
12309       break;
12310     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12311     case sp_reg: case bp_reg: case si_reg: case di_reg:
12312       s = names16[code - ax_reg];
12313       break;
12314     case es_reg: case ss_reg: case cs_reg:
12315     case ds_reg: case fs_reg: case gs_reg:
12316       s = names_seg[code - es_reg];
12317       break;
12318     case al_reg: case ah_reg: case cl_reg: case ch_reg:
12319     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12320       USED_REX (0);
12321       if (rex)
12322         s = names8rex[code - al_reg];
12323       else
12324         s = names8[code - al_reg];
12325       break;
12326     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12327     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12328       USED_REX (REX_W);
12329       if (rex & REX_W)
12330         s = names64[code - eAX_reg];
12331       else
12332         {
12333           if (sizeflag & DFLAG)
12334             s = names32[code - eAX_reg];
12335           else
12336             s = names16[code - eAX_reg];
12337           used_prefixes |= (prefixes & PREFIX_DATA);
12338         }
12339       break;
12340     case z_mode_ax_reg:
12341       if ((rex & REX_W) || (sizeflag & DFLAG))
12342         s = *names32;
12343       else
12344         s = *names16;
12345       if (!(rex & REX_W))
12346         used_prefixes |= (prefixes & PREFIX_DATA);
12347       break;
12348     default:
12349       s = INTERNAL_DISASSEMBLER_ERROR;
12350       break;
12351     }
12352   oappend (s);
12353 }
12354
12355 static void
12356 OP_I (int bytemode, int sizeflag)
12357 {
12358   bfd_signed_vma op;
12359   bfd_signed_vma mask = -1;
12360
12361   switch (bytemode)
12362     {
12363     case b_mode:
12364       FETCH_DATA (the_info, codep + 1);
12365       op = *codep++;
12366       mask = 0xff;
12367       break;
12368     case q_mode:
12369       if (address_mode == mode_64bit)
12370         {
12371           op = get32s ();
12372           break;
12373         }
12374       /* Fall through.  */
12375     case v_mode:
12376       USED_REX (REX_W);
12377       if (rex & REX_W)
12378         op = get32s ();
12379       else
12380         {
12381           if (sizeflag & DFLAG)
12382             {
12383               op = get32 ();
12384               mask = 0xffffffff;
12385             }
12386           else
12387             {
12388               op = get16 ();
12389               mask = 0xfffff;
12390             }
12391           used_prefixes |= (prefixes & PREFIX_DATA);
12392         }
12393       break;
12394     case w_mode:
12395       mask = 0xfffff;
12396       op = get16 ();
12397       break;
12398     case const_1_mode:
12399       if (intel_syntax)
12400         oappend ("1");
12401       return;
12402     default:
12403       oappend (INTERNAL_DISASSEMBLER_ERROR);
12404       return;
12405     }
12406
12407   op &= mask;
12408   scratchbuf[0] = '$';
12409   print_operand_value (scratchbuf + 1, 1, op);
12410   oappend (scratchbuf + intel_syntax);
12411   scratchbuf[0] = '\0';
12412 }
12413
12414 static void
12415 OP_I64 (int bytemode, int sizeflag)
12416 {
12417   bfd_signed_vma op;
12418   bfd_signed_vma mask = -1;
12419
12420   if (address_mode != mode_64bit)
12421     {
12422       OP_I (bytemode, sizeflag);
12423       return;
12424     }
12425
12426   switch (bytemode)
12427     {
12428     case b_mode:
12429       FETCH_DATA (the_info, codep + 1);
12430       op = *codep++;
12431       mask = 0xff;
12432       break;
12433     case v_mode:
12434       USED_REX (REX_W);
12435       if (rex & REX_W)
12436         op = get64 ();
12437       else
12438         {
12439           if (sizeflag & DFLAG)
12440             {
12441               op = get32 ();
12442               mask = 0xffffffff;
12443             }
12444           else
12445             {
12446               op = get16 ();
12447               mask = 0xfffff;
12448             }
12449           used_prefixes |= (prefixes & PREFIX_DATA);
12450         }
12451       break;
12452     case w_mode:
12453       mask = 0xfffff;
12454       op = get16 ();
12455       break;
12456     default:
12457       oappend (INTERNAL_DISASSEMBLER_ERROR);
12458       return;
12459     }
12460
12461   op &= mask;
12462   scratchbuf[0] = '$';
12463   print_operand_value (scratchbuf + 1, 1, op);
12464   oappend (scratchbuf + intel_syntax);
12465   scratchbuf[0] = '\0';
12466 }
12467
12468 static void
12469 OP_sI (int bytemode, int sizeflag)
12470 {
12471   bfd_signed_vma op;
12472   bfd_signed_vma mask = -1;
12473
12474   switch (bytemode)
12475     {
12476     case b_mode:
12477       FETCH_DATA (the_info, codep + 1);
12478       op = *codep++;
12479       if ((op & 0x80) != 0)
12480         op -= 0x100;
12481       mask = 0xffffffff;
12482       break;
12483     case v_mode:
12484       USED_REX (REX_W);
12485       if (rex & REX_W)
12486         op = get32s ();
12487       else
12488         {
12489           if (sizeflag & DFLAG)
12490             {
12491               op = get32s ();
12492               mask = 0xffffffff;
12493             }
12494           else
12495             {
12496               mask = 0xffffffff;
12497               op = get16 ();
12498               if ((op & 0x8000) != 0)
12499                 op -= 0x10000;
12500             }
12501           used_prefixes |= (prefixes & PREFIX_DATA);
12502         }
12503       break;
12504     case w_mode:
12505       op = get16 ();
12506       mask = 0xffffffff;
12507       if ((op & 0x8000) != 0)
12508         op -= 0x10000;
12509       break;
12510     default:
12511       oappend (INTERNAL_DISASSEMBLER_ERROR);
12512       return;
12513     }
12514
12515   scratchbuf[0] = '$';
12516   print_operand_value (scratchbuf + 1, 1, op);
12517   oappend (scratchbuf + intel_syntax);
12518 }
12519
12520 static void
12521 OP_J (int bytemode, int sizeflag)
12522 {
12523   bfd_vma disp;
12524   bfd_vma mask = -1;
12525   bfd_vma segment = 0;
12526
12527   switch (bytemode)
12528     {
12529     case b_mode:
12530       FETCH_DATA (the_info, codep + 1);
12531       disp = *codep++;
12532       if ((disp & 0x80) != 0)
12533         disp -= 0x100;
12534       break;
12535     case v_mode:
12536       USED_REX (REX_W);
12537       if ((sizeflag & DFLAG) || (rex & REX_W))
12538         disp = get32s ();
12539       else
12540         {
12541           disp = get16 ();
12542           if ((disp & 0x8000) != 0)
12543             disp -= 0x10000;
12544           /* In 16bit mode, address is wrapped around at 64k within
12545              the same segment.  Otherwise, a data16 prefix on a jump
12546              instruction means that the pc is masked to 16 bits after
12547              the displacement is added!  */
12548           mask = 0xffff;
12549           if ((prefixes & PREFIX_DATA) == 0)
12550             segment = ((start_pc + codep - start_codep)
12551                        & ~((bfd_vma) 0xffff));
12552         }
12553       if (!(rex & REX_W))
12554         used_prefixes |= (prefixes & PREFIX_DATA);
12555       break;
12556     default:
12557       oappend (INTERNAL_DISASSEMBLER_ERROR);
12558       return;
12559     }
12560   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12561   set_op (disp, 0);
12562   print_operand_value (scratchbuf, 1, disp);
12563   oappend (scratchbuf);
12564 }
12565
12566 static void
12567 OP_SEG (int bytemode, int sizeflag)
12568 {
12569   if (bytemode == w_mode)
12570     oappend (names_seg[modrm.reg]);
12571   else
12572     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12573 }
12574
12575 static void
12576 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12577 {
12578   int seg, offset;
12579
12580   if (sizeflag & DFLAG)
12581     {
12582       offset = get32 ();
12583       seg = get16 ();
12584     }
12585   else
12586     {
12587       offset = get16 ();
12588       seg = get16 ();
12589     }
12590   used_prefixes |= (prefixes & PREFIX_DATA);
12591   if (intel_syntax)
12592     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12593   else
12594     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12595   oappend (scratchbuf);
12596 }
12597
12598 static void
12599 OP_OFF (int bytemode, int sizeflag)
12600 {
12601   bfd_vma off;
12602
12603   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12604     intel_operand_size (bytemode, sizeflag);
12605   append_seg ();
12606
12607   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12608     off = get32 ();
12609   else
12610     off = get16 ();
12611
12612   if (intel_syntax)
12613     {
12614       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12615                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12616         {
12617           oappend (names_seg[ds_reg - es_reg]);
12618           oappend (":");
12619         }
12620     }
12621   print_operand_value (scratchbuf, 1, off);
12622   oappend (scratchbuf);
12623 }
12624
12625 static void
12626 OP_OFF64 (int bytemode, int sizeflag)
12627 {
12628   bfd_vma off;
12629
12630   if (address_mode != mode_64bit
12631       || (prefixes & PREFIX_ADDR))
12632     {
12633       OP_OFF (bytemode, sizeflag);
12634       return;
12635     }
12636
12637   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12638     intel_operand_size (bytemode, sizeflag);
12639   append_seg ();
12640
12641   off = get64 ();
12642
12643   if (intel_syntax)
12644     {
12645       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12646                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12647         {
12648           oappend (names_seg[ds_reg - es_reg]);
12649           oappend (":");
12650         }
12651     }
12652   print_operand_value (scratchbuf, 1, off);
12653   oappend (scratchbuf);
12654 }
12655
12656 static void
12657 ptr_reg (int code, int sizeflag)
12658 {
12659   const char *s;
12660
12661   *obufp++ = open_char;
12662   used_prefixes |= (prefixes & PREFIX_ADDR);
12663   if (address_mode == mode_64bit)
12664     {
12665       if (!(sizeflag & AFLAG))
12666         s = names32[code - eAX_reg];
12667       else
12668         s = names64[code - eAX_reg];
12669     }
12670   else if (sizeflag & AFLAG)
12671     s = names32[code - eAX_reg];
12672   else
12673     s = names16[code - eAX_reg];
12674   oappend (s);
12675   *obufp++ = close_char;
12676   *obufp = 0;
12677 }
12678
12679 static void
12680 OP_ESreg (int code, int sizeflag)
12681 {
12682   if (intel_syntax)
12683     {
12684       switch (codep[-1])
12685         {
12686         case 0x6d:      /* insw/insl */
12687           intel_operand_size (z_mode, sizeflag);
12688           break;
12689         case 0xa5:      /* movsw/movsl/movsq */
12690         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
12691         case 0xab:      /* stosw/stosl */
12692         case 0xaf:      /* scasw/scasl */
12693           intel_operand_size (v_mode, sizeflag);
12694           break;
12695         default:
12696           intel_operand_size (b_mode, sizeflag);
12697         }
12698     }
12699   oappend ("%es:" + intel_syntax);
12700   ptr_reg (code, sizeflag);
12701 }
12702
12703 static void
12704 OP_DSreg (int code, int sizeflag)
12705 {
12706   if (intel_syntax)
12707     {
12708       switch (codep[-1])
12709         {
12710         case 0x6f:      /* outsw/outsl */
12711           intel_operand_size (z_mode, sizeflag);
12712           break;
12713         case 0xa5:      /* movsw/movsl/movsq */
12714         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
12715         case 0xad:      /* lodsw/lodsl/lodsq */
12716           intel_operand_size (v_mode, sizeflag);
12717           break;
12718         default:
12719           intel_operand_size (b_mode, sizeflag);
12720         }
12721     }
12722   if ((prefixes
12723        & (PREFIX_CS
12724           | PREFIX_DS
12725           | PREFIX_SS
12726           | PREFIX_ES
12727           | PREFIX_FS
12728           | PREFIX_GS)) == 0)
12729     prefixes |= PREFIX_DS;
12730   append_seg ();
12731   ptr_reg (code, sizeflag);
12732 }
12733
12734 static void
12735 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12736 {
12737   int add;
12738   if (rex & REX_R)
12739     {
12740       USED_REX (REX_R);
12741       add = 8;
12742     }
12743   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12744     {
12745       all_prefixes[last_lock_prefix] = 0;
12746       used_prefixes |= PREFIX_LOCK;
12747       add = 8;
12748     }
12749   else
12750     add = 0;
12751   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12752   oappend (scratchbuf + intel_syntax);
12753 }
12754
12755 static void
12756 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12757 {
12758   int add;
12759   USED_REX (REX_R);
12760   if (rex & REX_R)
12761     add = 8;
12762   else
12763     add = 0;
12764   if (intel_syntax)
12765     sprintf (scratchbuf, "db%d", modrm.reg + add);
12766   else
12767     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12768   oappend (scratchbuf);
12769 }
12770
12771 static void
12772 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12773 {
12774   sprintf (scratchbuf, "%%tr%d", modrm.reg);
12775   oappend (scratchbuf + intel_syntax);
12776 }
12777
12778 static void
12779 OP_R (int bytemode, int sizeflag)
12780 {
12781   if (modrm.mod == 3)
12782     OP_E (bytemode, sizeflag);
12783   else
12784     BadOp ();
12785 }
12786
12787 static void
12788 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12789 {
12790   used_prefixes |= (prefixes & PREFIX_DATA);
12791   if (prefixes & PREFIX_DATA)
12792     {
12793       int add;
12794       USED_REX (REX_R);
12795       if (rex & REX_R)
12796         add = 8;
12797       else
12798         add = 0;
12799       sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12800     }
12801   else
12802     sprintf (scratchbuf, "%%mm%d", modrm.reg);
12803   oappend (scratchbuf + intel_syntax);
12804 }
12805
12806 static void
12807 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12808 {
12809   int add;
12810   USED_REX (REX_R);
12811   if (rex & REX_R)
12812     add = 8;
12813   else
12814     add = 0;
12815   if (need_vex && bytemode != xmm_mode)
12816     {
12817       switch (vex.length)
12818         {
12819         case 128:
12820           sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12821           break;
12822         case 256:
12823           sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
12824           break;
12825         default:
12826           abort ();
12827         }
12828     }
12829   else
12830     sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
12831   oappend (scratchbuf + intel_syntax);
12832 }
12833
12834 static void
12835 OP_EM (int bytemode, int sizeflag)
12836 {
12837   if (modrm.mod != 3)
12838     {
12839       if (intel_syntax
12840           && (bytemode == v_mode || bytemode == v_swap_mode))
12841         {
12842           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12843           used_prefixes |= (prefixes & PREFIX_DATA);
12844         }
12845       OP_E (bytemode, sizeflag);
12846       return;
12847     }
12848
12849   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12850     swap_operand ();
12851
12852   /* Skip mod/rm byte.  */
12853   MODRM_CHECK;
12854   codep++;
12855   used_prefixes |= (prefixes & PREFIX_DATA);
12856   if (prefixes & PREFIX_DATA)
12857     {
12858       int add;
12859
12860       USED_REX (REX_B);
12861       if (rex & REX_B)
12862         add = 8;
12863       else
12864         add = 0;
12865       sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12866     }
12867   else
12868     sprintf (scratchbuf, "%%mm%d", modrm.rm);
12869   oappend (scratchbuf + intel_syntax);
12870 }
12871
12872 /* cvt* are the only instructions in sse2 which have
12873    both SSE and MMX operands and also have 0x66 prefix
12874    in their opcode. 0x66 was originally used to differentiate
12875    between SSE and MMX instruction(operands). So we have to handle the
12876    cvt* separately using OP_EMC and OP_MXC */
12877 static void
12878 OP_EMC (int bytemode, int sizeflag)
12879 {
12880   if (modrm.mod != 3)
12881     {
12882       if (intel_syntax && bytemode == v_mode)
12883         {
12884           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12885           used_prefixes |= (prefixes & PREFIX_DATA);
12886         }
12887       OP_E (bytemode, sizeflag);
12888       return;
12889     }
12890
12891   /* Skip mod/rm byte.  */
12892   MODRM_CHECK;
12893   codep++;
12894   used_prefixes |= (prefixes & PREFIX_DATA);
12895   sprintf (scratchbuf, "%%mm%d", modrm.rm);
12896   oappend (scratchbuf + intel_syntax);
12897 }
12898
12899 static void
12900 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12901 {
12902   used_prefixes |= (prefixes & PREFIX_DATA);
12903   sprintf (scratchbuf, "%%mm%d", modrm.reg);
12904   oappend (scratchbuf + intel_syntax);
12905 }
12906
12907 static void
12908 OP_EX (int bytemode, int sizeflag)
12909 {
12910   int add;
12911
12912   /* Skip mod/rm byte.  */
12913   MODRM_CHECK;
12914   codep++;
12915
12916   if (modrm.mod != 3)
12917     {
12918       OP_E_memory (bytemode, sizeflag);
12919       return;
12920     }
12921
12922   USED_REX (REX_B);
12923   if (rex & REX_B)
12924     add = 8;
12925   else
12926     add = 0;
12927
12928   if ((sizeflag & SUFFIX_ALWAYS)
12929       && (bytemode == x_swap_mode
12930           || bytemode == d_swap_mode
12931           || bytemode == q_swap_mode))
12932     swap_operand ();
12933
12934   if (need_vex
12935       && bytemode != xmm_mode
12936       && bytemode != xmmq_mode)
12937     {
12938       switch (vex.length)
12939         {
12940         case 128:
12941           sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12942           break;
12943         case 256:
12944           sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
12945           break;
12946         default:
12947           abort ();
12948         }
12949     }
12950   else
12951     sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
12952   oappend (scratchbuf + intel_syntax);
12953 }
12954
12955 static void
12956 OP_MS (int bytemode, int sizeflag)
12957 {
12958   if (modrm.mod == 3)
12959     OP_EM (bytemode, sizeflag);
12960   else
12961     BadOp ();
12962 }
12963
12964 static void
12965 OP_XS (int bytemode, int sizeflag)
12966 {
12967   if (modrm.mod == 3)
12968     OP_EX (bytemode, sizeflag);
12969   else
12970     BadOp ();
12971 }
12972
12973 static void
12974 OP_M (int bytemode, int sizeflag)
12975 {
12976   if (modrm.mod == 3)
12977     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12978     BadOp ();
12979   else
12980     OP_E (bytemode, sizeflag);
12981 }
12982
12983 static void
12984 OP_0f07 (int bytemode, int sizeflag)
12985 {
12986   if (modrm.mod != 3 || modrm.rm != 0)
12987     BadOp ();
12988   else
12989     OP_E (bytemode, sizeflag);
12990 }
12991
12992 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12993    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
12994
12995 static void
12996 NOP_Fixup1 (int bytemode, int sizeflag)
12997 {
12998   if ((prefixes & PREFIX_DATA) != 0
12999       || (rex != 0
13000           && rex != 0x48
13001           && address_mode == mode_64bit))
13002     OP_REG (bytemode, sizeflag);
13003   else
13004     strcpy (obuf, "nop");
13005 }
13006
13007 static void
13008 NOP_Fixup2 (int bytemode, int sizeflag)
13009 {
13010   if ((prefixes & PREFIX_DATA) != 0
13011       || (rex != 0
13012           && rex != 0x48
13013           && address_mode == mode_64bit))
13014     OP_IMREG (bytemode, sizeflag);
13015 }
13016
13017 static const char *const Suffix3DNow[] = {
13018 /* 00 */        NULL,           NULL,           NULL,           NULL,
13019 /* 04 */        NULL,           NULL,           NULL,           NULL,
13020 /* 08 */        NULL,           NULL,           NULL,           NULL,
13021 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
13022 /* 10 */        NULL,           NULL,           NULL,           NULL,
13023 /* 14 */        NULL,           NULL,           NULL,           NULL,
13024 /* 18 */        NULL,           NULL,           NULL,           NULL,
13025 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
13026 /* 20 */        NULL,           NULL,           NULL,           NULL,
13027 /* 24 */        NULL,           NULL,           NULL,           NULL,
13028 /* 28 */        NULL,           NULL,           NULL,           NULL,
13029 /* 2C */        NULL,           NULL,           NULL,           NULL,
13030 /* 30 */        NULL,           NULL,           NULL,           NULL,
13031 /* 34 */        NULL,           NULL,           NULL,           NULL,
13032 /* 38 */        NULL,           NULL,           NULL,           NULL,
13033 /* 3C */        NULL,           NULL,           NULL,           NULL,
13034 /* 40 */        NULL,           NULL,           NULL,           NULL,
13035 /* 44 */        NULL,           NULL,           NULL,           NULL,
13036 /* 48 */        NULL,           NULL,           NULL,           NULL,
13037 /* 4C */        NULL,           NULL,           NULL,           NULL,
13038 /* 50 */        NULL,           NULL,           NULL,           NULL,
13039 /* 54 */        NULL,           NULL,           NULL,           NULL,
13040 /* 58 */        NULL,           NULL,           NULL,           NULL,
13041 /* 5C */        NULL,           NULL,           NULL,           NULL,
13042 /* 60 */        NULL,           NULL,           NULL,           NULL,
13043 /* 64 */        NULL,           NULL,           NULL,           NULL,
13044 /* 68 */        NULL,           NULL,           NULL,           NULL,
13045 /* 6C */        NULL,           NULL,           NULL,           NULL,
13046 /* 70 */        NULL,           NULL,           NULL,           NULL,
13047 /* 74 */        NULL,           NULL,           NULL,           NULL,
13048 /* 78 */        NULL,           NULL,           NULL,           NULL,
13049 /* 7C */        NULL,           NULL,           NULL,           NULL,
13050 /* 80 */        NULL,           NULL,           NULL,           NULL,
13051 /* 84 */        NULL,           NULL,           NULL,           NULL,
13052 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
13053 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
13054 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
13055 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
13056 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
13057 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
13058 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
13059 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
13060 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
13061 /* AC */        NULL,           NULL,           "pfacc",        NULL,
13062 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
13063 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
13064 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
13065 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
13066 /* C0 */        NULL,           NULL,           NULL,           NULL,
13067 /* C4 */        NULL,           NULL,           NULL,           NULL,
13068 /* C8 */        NULL,           NULL,           NULL,           NULL,
13069 /* CC */        NULL,           NULL,           NULL,           NULL,
13070 /* D0 */        NULL,           NULL,           NULL,           NULL,
13071 /* D4 */        NULL,           NULL,           NULL,           NULL,
13072 /* D8 */        NULL,           NULL,           NULL,           NULL,
13073 /* DC */        NULL,           NULL,           NULL,           NULL,
13074 /* E0 */        NULL,           NULL,           NULL,           NULL,
13075 /* E4 */        NULL,           NULL,           NULL,           NULL,
13076 /* E8 */        NULL,           NULL,           NULL,           NULL,
13077 /* EC */        NULL,           NULL,           NULL,           NULL,
13078 /* F0 */        NULL,           NULL,           NULL,           NULL,
13079 /* F4 */        NULL,           NULL,           NULL,           NULL,
13080 /* F8 */        NULL,           NULL,           NULL,           NULL,
13081 /* FC */        NULL,           NULL,           NULL,           NULL,
13082 };
13083
13084 static void
13085 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13086 {
13087   const char *mnemonic;
13088
13089   FETCH_DATA (the_info, codep + 1);
13090   /* AMD 3DNow! instructions are specified by an opcode suffix in the
13091      place where an 8-bit immediate would normally go.  ie. the last
13092      byte of the instruction.  */
13093   obufp = mnemonicendp;
13094   mnemonic = Suffix3DNow[*codep++ & 0xff];
13095   if (mnemonic)
13096     oappend (mnemonic);
13097   else
13098     {
13099       /* Since a variable sized modrm/sib chunk is between the start
13100          of the opcode (0x0f0f) and the opcode suffix, we need to do
13101          all the modrm processing first, and don't know until now that
13102          we have a bad opcode.  This necessitates some cleaning up.  */
13103       op_out[0][0] = '\0';
13104       op_out[1][0] = '\0';
13105       BadOp ();
13106     }
13107   mnemonicendp = obufp;
13108 }
13109
13110 static struct op simd_cmp_op[] =
13111 {
13112   { STRING_COMMA_LEN ("eq") },
13113   { STRING_COMMA_LEN ("lt") },
13114   { STRING_COMMA_LEN ("le") },
13115   { STRING_COMMA_LEN ("unord") },
13116   { STRING_COMMA_LEN ("neq") },
13117   { STRING_COMMA_LEN ("nlt") },
13118   { STRING_COMMA_LEN ("nle") },
13119   { STRING_COMMA_LEN ("ord") }
13120 };
13121
13122 static void
13123 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13124 {
13125   unsigned int cmp_type;
13126
13127   FETCH_DATA (the_info, codep + 1);
13128   cmp_type = *codep++ & 0xff;
13129   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13130     {
13131       char suffix [3];
13132       char *p = mnemonicendp - 2;
13133       suffix[0] = p[0];
13134       suffix[1] = p[1];
13135       suffix[2] = '\0';
13136       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13137       mnemonicendp += simd_cmp_op[cmp_type].len;
13138     }
13139   else
13140     {
13141       /* We have a reserved extension byte.  Output it directly.  */
13142       scratchbuf[0] = '$';
13143       print_operand_value (scratchbuf + 1, 1, cmp_type);
13144       oappend (scratchbuf + intel_syntax);
13145       scratchbuf[0] = '\0';
13146     }
13147 }
13148
13149 static void
13150 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
13151           int sizeflag ATTRIBUTE_UNUSED)
13152 {
13153   /* mwait %eax,%ecx  */
13154   if (!intel_syntax)
13155     {
13156       const char **names = (address_mode == mode_64bit
13157                             ? names64 : names32);
13158       strcpy (op_out[0], names[0]);
13159       strcpy (op_out[1], names[1]);
13160       two_source_ops = 1;
13161     }
13162   /* Skip mod/rm byte.  */
13163   MODRM_CHECK;
13164   codep++;
13165 }
13166
13167 static void
13168 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13169             int sizeflag ATTRIBUTE_UNUSED)
13170 {
13171   /* monitor %eax,%ecx,%edx"  */
13172   if (!intel_syntax)
13173     {
13174       const char **op1_names;
13175       const char **names = (address_mode == mode_64bit
13176                             ? names64 : names32);
13177
13178       if (!(prefixes & PREFIX_ADDR))
13179         op1_names = (address_mode == mode_16bit
13180                      ? names16 : names);
13181       else
13182         {
13183           /* Remove "addr16/addr32".  */
13184           all_prefixes[last_addr_prefix] = 0;
13185           op1_names = (address_mode != mode_32bit
13186                        ? names32 : names16);
13187           used_prefixes |= PREFIX_ADDR;
13188         }
13189       strcpy (op_out[0], op1_names[0]);
13190       strcpy (op_out[1], names[1]);
13191       strcpy (op_out[2], names[2]);
13192       two_source_ops = 1;
13193     }
13194   /* Skip mod/rm byte.  */
13195   MODRM_CHECK;
13196   codep++;
13197 }
13198
13199 static void
13200 BadOp (void)
13201 {
13202   /* Throw away prefixes and 1st. opcode byte.  */
13203   codep = insn_codep + 1;
13204   oappend ("(bad)");
13205 }
13206
13207 static void
13208 REP_Fixup (int bytemode, int sizeflag)
13209 {
13210   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13211      lods and stos.  */
13212   if (prefixes & PREFIX_REPZ)
13213     all_prefixes[last_repz_prefix] = REP_PREFIX;
13214
13215   switch (bytemode)
13216     {
13217     case al_reg:
13218     case eAX_reg:
13219     case indir_dx_reg:
13220       OP_IMREG (bytemode, sizeflag);
13221       break;
13222     case eDI_reg:
13223       OP_ESreg (bytemode, sizeflag);
13224       break;
13225     case eSI_reg:
13226       OP_DSreg (bytemode, sizeflag);
13227       break;
13228     default:
13229       abort ();
13230       break;
13231     }
13232 }
13233
13234 static void
13235 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13236 {
13237   USED_REX (REX_W);
13238   if (rex & REX_W)
13239     {
13240       /* Change cmpxchg8b to cmpxchg16b.  */
13241       char *p = mnemonicendp - 2;
13242       mnemonicendp = stpcpy (p, "16b");
13243       bytemode = o_mode;
13244     }
13245   OP_M (bytemode, sizeflag);
13246 }
13247
13248 static void
13249 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13250 {
13251   if (need_vex)
13252     {
13253       switch (vex.length)
13254         {
13255         case 128:
13256           sprintf (scratchbuf, "%%xmm%d", reg);
13257           break;
13258         case 256:
13259           sprintf (scratchbuf, "%%ymm%d", reg);
13260           break;
13261         default:
13262           abort ();
13263         }
13264     }
13265   else
13266     sprintf (scratchbuf, "%%xmm%d", reg);
13267   oappend (scratchbuf + intel_syntax);
13268 }
13269
13270 static void
13271 CRC32_Fixup (int bytemode, int sizeflag)
13272 {
13273   /* Add proper suffix to "crc32".  */
13274   char *p = mnemonicendp;
13275
13276   switch (bytemode)
13277     {
13278     case b_mode:
13279       if (intel_syntax)
13280         goto skip;
13281
13282       *p++ = 'b';
13283       break;
13284     case v_mode:
13285       if (intel_syntax)
13286         goto skip;
13287
13288       USED_REX (REX_W);
13289       if (rex & REX_W)
13290         *p++ = 'q';
13291       else 
13292         {
13293           if (sizeflag & DFLAG)
13294             *p++ = 'l';
13295           else
13296             *p++ = 'w';
13297           used_prefixes |= (prefixes & PREFIX_DATA);
13298         }
13299       break;
13300     default:
13301       oappend (INTERNAL_DISASSEMBLER_ERROR);
13302       break;
13303     }
13304   mnemonicendp = p;
13305   *p = '\0';
13306
13307 skip:
13308   if (modrm.mod == 3)
13309     {
13310       int add;
13311
13312       /* Skip mod/rm byte.  */
13313       MODRM_CHECK;
13314       codep++;
13315
13316       USED_REX (REX_B);
13317       add = (rex & REX_B) ? 8 : 0;
13318       if (bytemode == b_mode)
13319         {
13320           USED_REX (0);
13321           if (rex)
13322             oappend (names8rex[modrm.rm + add]);
13323           else
13324             oappend (names8[modrm.rm + add]);
13325         }
13326       else
13327         {
13328           USED_REX (REX_W);
13329           if (rex & REX_W)
13330             oappend (names64[modrm.rm + add]);
13331           else if ((prefixes & PREFIX_DATA))
13332             oappend (names16[modrm.rm + add]);
13333           else
13334             oappend (names32[modrm.rm + add]);
13335         }
13336     }
13337   else
13338     OP_E (bytemode, sizeflag);
13339 }
13340
13341 /* Display the destination register operand for instructions with
13342    VEX. */
13343
13344 static void
13345 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13346 {
13347   if (!need_vex)
13348     abort ();
13349
13350   if (!need_vex_reg)
13351     return;
13352
13353   switch (vex.length)
13354     {
13355     case 128:
13356       switch (bytemode)
13357         {
13358         case vex_mode:
13359         case vex128_mode:
13360           break;
13361         default:
13362           abort ();
13363           return;
13364         }
13365
13366       sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13367       break;
13368     case 256:
13369       switch (bytemode)
13370         {
13371         case vex_mode:
13372         case vex256_mode:
13373           break;
13374         default:
13375           abort ();
13376           return;
13377         }
13378
13379       sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13380       break;
13381     default:
13382       abort ();
13383       break;
13384     }
13385   oappend (scratchbuf + intel_syntax);
13386 }
13387
13388 /* Get the VEX immediate byte without moving codep.  */
13389
13390 static unsigned char
13391 get_vex_imm8 (int sizeflag)
13392 {
13393   int bytes_before_imm = 0;
13394
13395   /* Skip mod/rm byte.   */
13396   MODRM_CHECK;
13397   codep++;
13398
13399   if (modrm.mod != 3)
13400     {
13401       /* There are SIB/displacement bytes.  */
13402       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13403         {
13404           /* 32/64 bit address mode */
13405           int base = modrm.rm;
13406
13407           /* Check SIB byte.  */
13408           if (base == 4)
13409             {
13410               FETCH_DATA (the_info, codep + 1);
13411               base = *codep & 7;
13412               bytes_before_imm++;
13413             }
13414
13415           switch (modrm.mod)
13416             {
13417             case 0:
13418               /* When modrm.rm == 5 or modrm.rm == 4 and base in
13419                  SIB == 5, there is a 4 byte displacement.  */
13420               if (base != 5)
13421                 /* No displacement. */
13422                 break;
13423             case 2:
13424               /* 4 byte displacement.  */
13425               bytes_before_imm += 4;
13426               break;
13427             case 1:
13428               /* 1 byte displacement.  */
13429               bytes_before_imm++;
13430               break;
13431             }
13432         }
13433       else
13434         { /* 16 bit address mode */
13435           switch (modrm.mod)
13436             {
13437             case 0:
13438               /* When modrm.rm == 6, there is a 2 byte displacement.  */
13439               if (modrm.rm != 6)
13440                 /* No displacement. */
13441                 break;
13442             case 2:
13443               /* 2 byte displacement.  */
13444               bytes_before_imm += 2;
13445               break;
13446             case 1:
13447               /* 1 byte displacement.  */
13448               bytes_before_imm++;
13449               break;
13450             }
13451         }
13452     }
13453
13454   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13455   return codep [bytes_before_imm];
13456 }
13457
13458 static void
13459 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13460 {
13461   if (reg == -1 && modrm.mod != 3)
13462     {
13463       OP_E_memory (bytemode, sizeflag);
13464       return;
13465     }
13466   else
13467     {
13468       if (reg == -1)
13469         {
13470           reg = modrm.rm;
13471           USED_REX (REX_B);
13472           if (rex & REX_B)
13473             reg += 8;
13474         }
13475       else if (reg > 7 && address_mode != mode_64bit)
13476         BadOp ();
13477     }
13478
13479   switch (vex.length)
13480     {
13481     case 128:
13482       sprintf (scratchbuf, "%%xmm%d", reg);
13483       break;
13484     case 256:
13485       sprintf (scratchbuf, "%%ymm%d", reg);
13486       break;
13487     default:
13488       abort ();
13489     }
13490   oappend (scratchbuf + intel_syntax);
13491 }
13492
13493 static void
13494 OP_EX_VexW (int bytemode, int sizeflag)
13495 {
13496   int reg = -1;
13497
13498   if (!vex_w_done)
13499     {
13500       vex_w_done = 1;
13501       if (vex.w)
13502         reg = get_vex_imm8 (sizeflag) >> 4;
13503     }
13504   else
13505     {
13506       if (!vex.w)
13507         reg = get_vex_imm8 (sizeflag) >> 4;
13508     }
13509
13510   OP_EX_VexReg (bytemode, sizeflag, reg);
13511 }
13512
13513 static void
13514 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13515              int sizeflag ATTRIBUTE_UNUSED)
13516 {
13517   /* Skip the immediate byte and check for invalid bits.  */
13518   FETCH_DATA (the_info, codep + 1);
13519   if (*codep++ & 0xf)
13520     BadOp ();
13521 }
13522
13523 static void
13524 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13525 {
13526   int reg;
13527   FETCH_DATA (the_info, codep + 1);
13528   reg = *codep++;
13529
13530   if (bytemode != x_mode)
13531     abort ();
13532
13533   if (reg & 0xf)
13534       BadOp ();
13535
13536   reg >>= 4;
13537   if (reg > 7 && address_mode != mode_64bit)
13538     BadOp ();
13539
13540   switch (vex.length)
13541     {
13542     case 128:
13543       sprintf (scratchbuf, "%%xmm%d", reg);
13544       break;
13545     case 256:
13546       sprintf (scratchbuf, "%%ymm%d", reg);
13547       break;
13548     default:
13549       abort ();
13550     }
13551   oappend (scratchbuf + intel_syntax);
13552 }
13553
13554 static void
13555 OP_XMM_VexW (int bytemode, int sizeflag)
13556 {
13557   /* Turn off the REX.W bit since it is used for swapping operands
13558      now.  */
13559   rex &= ~REX_W;
13560   OP_XMM (bytemode, sizeflag);
13561 }
13562
13563 static void
13564 OP_EX_Vex (int bytemode, int sizeflag)
13565 {
13566   if (modrm.mod != 3)
13567     {
13568       if (vex.register_specifier != 0)
13569         BadOp ();
13570       need_vex_reg = 0;
13571     }
13572   OP_EX (bytemode, sizeflag);
13573 }
13574
13575 static void
13576 OP_XMM_Vex (int bytemode, int sizeflag)
13577 {
13578   if (modrm.mod != 3)
13579     {
13580       if (vex.register_specifier != 0)
13581         BadOp ();
13582       need_vex_reg = 0;
13583     }
13584   OP_XMM (bytemode, sizeflag);
13585 }
13586
13587 static void
13588 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13589 {
13590   switch (vex.length)
13591     {
13592     case 128:
13593       mnemonicendp = stpcpy (obuf, "vzeroupper");
13594       break;
13595     case 256:
13596       mnemonicendp = stpcpy (obuf, "vzeroall");
13597       break;
13598     default:
13599       abort ();
13600     }
13601 }
13602
13603 static struct op vex_cmp_op[] =
13604 {
13605   { STRING_COMMA_LEN ("eq") },
13606   { STRING_COMMA_LEN ("lt") },
13607   { STRING_COMMA_LEN ("le") },
13608   { STRING_COMMA_LEN ("unord") },
13609   { STRING_COMMA_LEN ("neq") },
13610   { STRING_COMMA_LEN ("nlt") },
13611   { STRING_COMMA_LEN ("nle") },
13612   { STRING_COMMA_LEN ("ord") },
13613   { STRING_COMMA_LEN ("eq_uq") },
13614   { STRING_COMMA_LEN ("nge") },
13615   { STRING_COMMA_LEN ("ngt") },
13616   { STRING_COMMA_LEN ("false") },
13617   { STRING_COMMA_LEN ("neq_oq") },
13618   { STRING_COMMA_LEN ("ge") },
13619   { STRING_COMMA_LEN ("gt") },
13620   { STRING_COMMA_LEN ("true") },
13621   { STRING_COMMA_LEN ("eq_os") },
13622   { STRING_COMMA_LEN ("lt_oq") },
13623   { STRING_COMMA_LEN ("le_oq") },
13624   { STRING_COMMA_LEN ("unord_s") },
13625   { STRING_COMMA_LEN ("neq_us") },
13626   { STRING_COMMA_LEN ("nlt_uq") },
13627   { STRING_COMMA_LEN ("nle_uq") },
13628   { STRING_COMMA_LEN ("ord_s") },
13629   { STRING_COMMA_LEN ("eq_us") },
13630   { STRING_COMMA_LEN ("nge_uq") },
13631   { STRING_COMMA_LEN ("ngt_uq") },
13632   { STRING_COMMA_LEN ("false_os") },
13633   { STRING_COMMA_LEN ("neq_os") },
13634   { STRING_COMMA_LEN ("ge_oq") },
13635   { STRING_COMMA_LEN ("gt_oq") },
13636   { STRING_COMMA_LEN ("true_us") },
13637 };
13638
13639 static void
13640 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13641 {
13642   unsigned int cmp_type;
13643
13644   FETCH_DATA (the_info, codep + 1);
13645   cmp_type = *codep++ & 0xff;
13646   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
13647     {
13648       char suffix [3];
13649       char *p = mnemonicendp - 2;
13650       suffix[0] = p[0];
13651       suffix[1] = p[1];
13652       suffix[2] = '\0';
13653       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13654       mnemonicendp += vex_cmp_op[cmp_type].len;
13655     }
13656   else
13657     {
13658       /* We have a reserved extension byte.  Output it directly.  */
13659       scratchbuf[0] = '$';
13660       print_operand_value (scratchbuf + 1, 1, cmp_type);
13661       oappend (scratchbuf + intel_syntax);
13662       scratchbuf[0] = '\0';
13663     }
13664 }
13665
13666 static const struct op pclmul_op[] =
13667 {
13668   { STRING_COMMA_LEN ("lql") },
13669   { STRING_COMMA_LEN ("hql") },
13670   { STRING_COMMA_LEN ("lqh") },
13671   { STRING_COMMA_LEN ("hqh") }
13672 };
13673
13674 static void
13675 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13676               int sizeflag ATTRIBUTE_UNUSED)
13677 {
13678   unsigned int pclmul_type;
13679
13680   FETCH_DATA (the_info, codep + 1);
13681   pclmul_type = *codep++ & 0xff;
13682   switch (pclmul_type)
13683     {
13684     case 0x10:
13685       pclmul_type = 2;
13686       break;
13687     case 0x11:
13688       pclmul_type = 3;
13689       break;
13690     default:
13691       break;
13692     } 
13693   if (pclmul_type < ARRAY_SIZE (pclmul_op))
13694     {
13695       char suffix [4];
13696       char *p = mnemonicendp - 3;
13697       suffix[0] = p[0];
13698       suffix[1] = p[1];
13699       suffix[2] = p[2];
13700       suffix[3] = '\0';
13701       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13702       mnemonicendp += pclmul_op[pclmul_type].len;
13703     }
13704   else
13705     {
13706       /* We have a reserved extension byte.  Output it directly.  */
13707       scratchbuf[0] = '$';
13708       print_operand_value (scratchbuf + 1, 1, pclmul_type);
13709       oappend (scratchbuf + intel_syntax);
13710       scratchbuf[0] = '\0';
13711     }
13712 }
13713
13714 static void
13715 MOVBE_Fixup (int bytemode, int sizeflag)
13716 {
13717   /* Add proper suffix to "movbe".  */
13718   char *p = mnemonicendp;
13719
13720   switch (bytemode)
13721     {
13722     case v_mode:
13723       if (intel_syntax)
13724         goto skip;
13725
13726       USED_REX (REX_W);
13727       if (sizeflag & SUFFIX_ALWAYS)
13728         {
13729           if (rex & REX_W)
13730             *p++ = 'q';
13731           else
13732             {
13733               if (sizeflag & DFLAG)
13734                 *p++ = 'l';
13735               else
13736                 *p++ = 'w';
13737               used_prefixes |= (prefixes & PREFIX_DATA);
13738             }
13739         }
13740       break;
13741     default:
13742       oappend (INTERNAL_DISASSEMBLER_ERROR);
13743       break;
13744     }
13745   mnemonicendp = p;
13746   *p = '\0';
13747
13748 skip:
13749   OP_M (bytemode, sizeflag);
13750 }
13751
13752 static void
13753 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13754 {
13755   int reg;
13756   const char **names;
13757
13758   /* Skip mod/rm byte.  */
13759   MODRM_CHECK;
13760   codep++;
13761
13762   if (vex.w)
13763     names = names64;
13764   else if (vex.length == 256)
13765     names = names32;
13766   else
13767     names = names16;
13768
13769   reg = modrm.rm;
13770   USED_REX (REX_B);
13771   if (rex & REX_B)
13772     reg += 8;
13773
13774   oappend (names[reg]);
13775 }
13776
13777 static void
13778 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13779 {
13780   const char **names;
13781
13782   if (vex.w)
13783     names = names64;
13784   else if (vex.length == 256)
13785     names = names32;
13786   else
13787     names = names16;
13788
13789   oappend (names[vex.register_specifier]);
13790 }
13791
13792 static void
13793 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
13794 {
13795   if (vex.w || vex.length == 256)
13796     OP_I (q_mode, sizeflag);
13797   else
13798     OP_I (w_mode, sizeflag);
13799 }
13800