Reformat vex_len_table.
[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 print_displacement (char *, bfd_vma);
57 static void OP_E (int, int);
58 static void OP_G (int, int);
59 static bfd_vma get64 (void);
60 static bfd_signed_vma get32 (void);
61 static bfd_signed_vma get32s (void);
62 static int get16 (void);
63 static void set_op (bfd_vma, int);
64 static void OP_Skip_MODRM (int, int);
65 static void OP_REG (int, int);
66 static void OP_IMREG (int, int);
67 static void OP_I (int, int);
68 static void OP_I64 (int, int);
69 static void OP_sI (int, int);
70 static void OP_J (int, int);
71 static void OP_SEG (int, int);
72 static void OP_DIR (int, int);
73 static void OP_OFF (int, int);
74 static void OP_OFF64 (int, int);
75 static void ptr_reg (int, int);
76 static void OP_ESreg (int, int);
77 static void OP_DSreg (int, int);
78 static void OP_C (int, int);
79 static void OP_D (int, int);
80 static void OP_T (int, int);
81 static void OP_R (int, int);
82 static void OP_MMX (int, int);
83 static void OP_XMM (int, int);
84 static void OP_EM (int, int);
85 static void OP_EX (int, int);
86 static void OP_EMC (int,int);
87 static void OP_MXC (int,int);
88 static void OP_MS (int, int);
89 static void OP_XS (int, int);
90 static void OP_M (int, int);
91 static void OP_VEX (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_EX_VexW (int, int);
94 static void OP_XMM_Vex (int, int);
95 static void OP_XMM_VexW (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VEXI4_Fixup (int, int);
99 static void VZERO_Fixup (int, int);
100 static void VCMP_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void NOP_Fixup1 (int, int);
105 static void NOP_Fixup2 (int, int);
106 static void OP_3DNowSuffix (int, int);
107 static void CMP_Fixup (int, int);
108 static void BadOp (void);
109 static void REP_Fixup (int, int);
110 static void CMPXCHG8B_Fixup (int, int);
111 static void XMM_Fixup (int, int);
112 static void CRC32_Fixup (int, int);
113 static void FXSAVE_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 static void OP_Vex_2src_1 (int, int);
118 static void OP_Vex_2src_2 (int, int);
119
120 static void MOVBE_Fixup (int, int);
121
122 struct dis_private {
123   /* Points to first byte not fetched.  */
124   bfd_byte *max_fetched;
125   bfd_byte the_buffer[MAX_MNEM_SIZE];
126   bfd_vma insn_start;
127   int orig_sizeflag;
128   jmp_buf bailout;
129 };
130
131 enum address_mode
132 {
133   mode_16bit,
134   mode_32bit,
135   mode_64bit
136 };
137
138 enum address_mode address_mode;
139
140 /* Flags for the prefixes for the current instruction.  See below.  */
141 static int prefixes;
142
143 /* REX prefix the current instruction.  See below.  */
144 static int rex;
145 /* Bits of REX we've already used.  */
146 static int rex_used;
147 /* Original REX prefix.  */
148 static int rex_original;
149 /* REX bits in original REX prefix ignored.  It may not be the same
150    as rex_original since some bits may not be ignored.  */
151 static int rex_ignored;
152 /* Mark parts used in the REX prefix.  When we are testing for
153    empty prefix (for 8bit register REX extension), just mask it
154    out.  Otherwise test for REX bit is excuse for existence of REX
155    only in case value is nonzero.  */
156 #define USED_REX(value)                                 \
157   {                                                     \
158     if (value)                                          \
159       {                                                 \
160         if ((rex & value))                              \
161           rex_used |= (value) | REX_OPCODE;             \
162       }                                                 \
163     else                                                \
164       rex_used |= REX_OPCODE;                           \
165   }
166
167 /* Flags for prefixes which we somehow handled when printing the
168    current instruction.  */
169 static int used_prefixes;
170
171 /* Flags stored in PREFIXES.  */
172 #define PREFIX_REPZ 1
173 #define PREFIX_REPNZ 2
174 #define PREFIX_LOCK 4
175 #define PREFIX_CS 8
176 #define PREFIX_SS 0x10
177 #define PREFIX_DS 0x20
178 #define PREFIX_ES 0x40
179 #define PREFIX_FS 0x80
180 #define PREFIX_GS 0x100
181 #define PREFIX_DATA 0x200
182 #define PREFIX_ADDR 0x400
183 #define PREFIX_FWAIT 0x800
184
185 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
186    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
187    on error.  */
188 #define FETCH_DATA(info, addr) \
189   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
190    ? 1 : fetch_data ((info), (addr)))
191
192 static int
193 fetch_data (struct disassemble_info *info, bfd_byte *addr)
194 {
195   int status;
196   struct dis_private *priv = (struct dis_private *) info->private_data;
197   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
198
199   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
200     status = (*info->read_memory_func) (start,
201                                         priv->max_fetched,
202                                         addr - priv->max_fetched,
203                                         info);
204   else
205     status = -1;
206   if (status != 0)
207     {
208       /* If we did manage to read at least one byte, then
209          print_insn_i386 will do something sensible.  Otherwise, print
210          an error.  We do that here because this is where we know
211          STATUS.  */
212       if (priv->max_fetched == priv->the_buffer)
213         (*info->memory_error_func) (status, start, info);
214       longjmp (priv->bailout, 1);
215     }
216   else
217     priv->max_fetched = addr;
218   return 1;
219 }
220
221 #define XX { NULL, 0 }
222
223 #define Eb { OP_E, b_mode }
224 #define EbS { OP_E, b_swap_mode }
225 #define Ev { OP_E, v_mode }
226 #define EvS { OP_E, v_swap_mode }
227 #define Ed { OP_E, d_mode }
228 #define Edq { OP_E, dq_mode }
229 #define Edqw { OP_E, dqw_mode }
230 #define Edqb { OP_E, dqb_mode }
231 #define Edqd { OP_E, dqd_mode }
232 #define Eq { OP_E, q_mode }
233 #define indirEv { OP_indirE, stack_v_mode }
234 #define indirEp { OP_indirE, f_mode }
235 #define stackEv { OP_E, stack_v_mode }
236 #define Em { OP_E, m_mode }
237 #define Ew { OP_E, w_mode }
238 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
239 #define Ma { OP_M, a_mode }
240 #define Mb { OP_M, b_mode }
241 #define Md { OP_M, d_mode }
242 #define Mo { OP_M, o_mode }
243 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
244 #define Mq { OP_M, q_mode }
245 #define Mx { OP_M, x_mode }
246 #define Mxmm { OP_M, xmm_mode }
247 #define Gb { OP_G, b_mode }
248 #define Gv { OP_G, v_mode }
249 #define Gd { OP_G, d_mode }
250 #define Gdq { OP_G, dq_mode }
251 #define Gm { OP_G, m_mode }
252 #define Gw { OP_G, w_mode }
253 #define Rd { OP_R, d_mode }
254 #define Rm { OP_R, m_mode }
255 #define Ib { OP_I, b_mode }
256 #define sIb { OP_sI, b_mode }   /* sign extened byte */
257 #define Iv { OP_I, v_mode }
258 #define Iq { OP_I, q_mode }
259 #define Iv64 { OP_I64, v_mode }
260 #define Iw { OP_I, w_mode }
261 #define I1 { OP_I, const_1_mode }
262 #define Jb { OP_J, b_mode }
263 #define Jv { OP_J, v_mode }
264 #define Cm { OP_C, m_mode }
265 #define Dm { OP_D, m_mode }
266 #define Td { OP_T, d_mode }
267 #define Skip_MODRM { OP_Skip_MODRM, 0 }
268
269 #define RMeAX { OP_REG, eAX_reg }
270 #define RMeBX { OP_REG, eBX_reg }
271 #define RMeCX { OP_REG, eCX_reg }
272 #define RMeDX { OP_REG, eDX_reg }
273 #define RMeSP { OP_REG, eSP_reg }
274 #define RMeBP { OP_REG, eBP_reg }
275 #define RMeSI { OP_REG, eSI_reg }
276 #define RMeDI { OP_REG, eDI_reg }
277 #define RMrAX { OP_REG, rAX_reg }
278 #define RMrBX { OP_REG, rBX_reg }
279 #define RMrCX { OP_REG, rCX_reg }
280 #define RMrDX { OP_REG, rDX_reg }
281 #define RMrSP { OP_REG, rSP_reg }
282 #define RMrBP { OP_REG, rBP_reg }
283 #define RMrSI { OP_REG, rSI_reg }
284 #define RMrDI { OP_REG, rDI_reg }
285 #define RMAL { OP_REG, al_reg }
286 #define RMAL { OP_REG, al_reg }
287 #define RMCL { OP_REG, cl_reg }
288 #define RMDL { OP_REG, dl_reg }
289 #define RMBL { OP_REG, bl_reg }
290 #define RMAH { OP_REG, ah_reg }
291 #define RMCH { OP_REG, ch_reg }
292 #define RMDH { OP_REG, dh_reg }
293 #define RMBH { OP_REG, bh_reg }
294 #define RMAX { OP_REG, ax_reg }
295 #define RMDX { OP_REG, dx_reg }
296
297 #define eAX { OP_IMREG, eAX_reg }
298 #define eBX { OP_IMREG, eBX_reg }
299 #define eCX { OP_IMREG, eCX_reg }
300 #define eDX { OP_IMREG, eDX_reg }
301 #define eSP { OP_IMREG, eSP_reg }
302 #define eBP { OP_IMREG, eBP_reg }
303 #define eSI { OP_IMREG, eSI_reg }
304 #define eDI { OP_IMREG, eDI_reg }
305 #define AL { OP_IMREG, al_reg }
306 #define CL { OP_IMREG, cl_reg }
307 #define DL { OP_IMREG, dl_reg }
308 #define BL { OP_IMREG, bl_reg }
309 #define AH { OP_IMREG, ah_reg }
310 #define CH { OP_IMREG, ch_reg }
311 #define DH { OP_IMREG, dh_reg }
312 #define BH { OP_IMREG, bh_reg }
313 #define AX { OP_IMREG, ax_reg }
314 #define DX { OP_IMREG, dx_reg }
315 #define zAX { OP_IMREG, z_mode_ax_reg }
316 #define indirDX { OP_IMREG, indir_dx_reg }
317
318 #define Sw { OP_SEG, w_mode }
319 #define Sv { OP_SEG, v_mode }
320 #define Ap { OP_DIR, 0 }
321 #define Ob { OP_OFF64, b_mode }
322 #define Ov { OP_OFF64, v_mode }
323 #define Xb { OP_DSreg, eSI_reg }
324 #define Xv { OP_DSreg, eSI_reg }
325 #define Xz { OP_DSreg, eSI_reg }
326 #define Yb { OP_ESreg, eDI_reg }
327 #define Yv { OP_ESreg, eDI_reg }
328 #define DSBX { OP_DSreg, eBX_reg }
329
330 #define es { OP_REG, es_reg }
331 #define ss { OP_REG, ss_reg }
332 #define cs { OP_REG, cs_reg }
333 #define ds { OP_REG, ds_reg }
334 #define fs { OP_REG, fs_reg }
335 #define gs { OP_REG, gs_reg }
336
337 #define MX { OP_MMX, 0 }
338 #define XM { OP_XMM, 0 }
339 #define XMM { OP_XMM, xmm_mode }
340 #define EM { OP_EM, v_mode }
341 #define EMS { OP_EM, v_swap_mode }
342 #define EMd { OP_EM, d_mode }
343 #define EMx { OP_EM, x_mode }
344 #define EXw { OP_EX, w_mode }
345 #define EXd { OP_EX, d_mode }
346 #define EXdS { OP_EX, d_swap_mode }
347 #define EXq { OP_EX, q_mode }
348 #define EXqS { OP_EX, q_swap_mode }
349 #define EXx { OP_EX, x_mode }
350 #define EXxS { OP_EX, x_swap_mode }
351 #define EXxmm { OP_EX, xmm_mode }
352 #define EXxmmq { OP_EX, xmmq_mode }
353 #define EXymmq { OP_EX, ymmq_mode }
354 #define EXVexWdq { OP_EX, vex_w_dq_mode }
355 #define MS { OP_MS, v_mode }
356 #define XS { OP_XS, v_mode }
357 #define EMCq { OP_EMC, q_mode }
358 #define MXC { OP_MXC, 0 }
359 #define OPSUF { OP_3DNowSuffix, 0 }
360 #define CMP { CMP_Fixup, 0 }
361 #define XMM0 { XMM_Fixup, 0 }
362 #define FXSAVE { FXSAVE_Fixup, 0 }
363 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
364 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
365
366 #define Vex { OP_VEX, vex_mode }
367 #define Vex128 { OP_VEX, vex128_mode }
368 #define Vex256 { OP_VEX, vex256_mode }
369 #define VexI4 { VEXI4_Fixup, 0}
370 #define EXdVex { OP_EX_Vex, d_mode }
371 #define EXdVexS { OP_EX_Vex, d_swap_mode }
372 #define EXqVex { OP_EX_Vex, q_mode }
373 #define EXqVexS { OP_EX_Vex, q_swap_mode }
374 #define EXVexW { OP_EX_VexW, x_mode }
375 #define EXdVexW { OP_EX_VexW, d_mode }
376 #define EXqVexW { OP_EX_VexW, q_mode }
377 #define XMVex { OP_XMM_Vex, 0 }
378 #define XMVexW { OP_XMM_VexW, 0 }
379 #define XMVexI4 { OP_REG_VexI4, x_mode }
380 #define PCLMUL { PCLMUL_Fixup, 0 }
381 #define VZERO { VZERO_Fixup, 0 }
382 #define VCMP { VCMP_Fixup, 0 }
383
384 /* Used handle "rep" prefix for string instructions.  */
385 #define Xbr { REP_Fixup, eSI_reg }
386 #define Xvr { REP_Fixup, eSI_reg }
387 #define Ybr { REP_Fixup, eDI_reg }
388 #define Yvr { REP_Fixup, eDI_reg }
389 #define Yzr { REP_Fixup, eDI_reg }
390 #define indirDXr { REP_Fixup, indir_dx_reg }
391 #define ALr { REP_Fixup, al_reg }
392 #define eAXr { REP_Fixup, eAX_reg }
393
394 #define cond_jump_flag { NULL, cond_jump_mode }
395 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
396
397 /* bits in sizeflag */
398 #define SUFFIX_ALWAYS 4
399 #define AFLAG 2
400 #define DFLAG 1
401
402 enum
403 {
404   /* byte operand */
405   b_mode = 1,
406   /* byte operand with operand swapped */
407   b_swap_mode,
408   /* operand size depends on prefixes */
409   v_mode,
410   /* operand size depends on prefixes with operand swapped */
411   v_swap_mode,
412   /* word operand */
413   w_mode,
414   /* double word operand  */
415   d_mode,
416   /* double word operand with operand swapped */
417   d_swap_mode,
418   /* quad word operand */
419   q_mode,
420   /* quad word operand with operand swapped */
421   q_swap_mode,
422   /* ten-byte operand */
423   t_mode,
424   /* 16-byte XMM or 32-byte YMM operand */
425   x_mode,
426   /* 16-byte XMM or 32-byte YMM operand with operand swapped */
427   x_swap_mode,
428   /* 16-byte XMM operand */
429   xmm_mode,
430   /* 16-byte XMM or quad word operand */
431   xmmq_mode,
432   /* 32-byte YMM or quad word operand */
433   ymmq_mode,
434   /* d_mode in 32bit, q_mode in 64bit mode.  */
435   m_mode,
436   /* pair of v_mode operands */
437   a_mode,
438   cond_jump_mode,
439   loop_jcxz_mode,
440   /* operand size depends on REX prefixes.  */
441   dq_mode,
442   /* registers like dq_mode, memory like w_mode.  */
443   dqw_mode,
444   /* 4- or 6-byte pointer operand */
445   f_mode,
446   const_1_mode,
447   /* v_mode for stack-related opcodes.  */
448   stack_v_mode,
449   /* non-quad operand size depends on prefixes */
450   z_mode,
451   /* 16-byte operand */
452   o_mode,
453   /* registers like dq_mode, memory like b_mode.  */
454   dqb_mode,
455   /* registers like dq_mode, memory like d_mode.  */
456   dqd_mode,
457   /* normal vex mode */
458   vex_mode,
459   /* 128bit vex mode */
460   vex128_mode,
461   /* 256bit vex mode */
462   vex256_mode,
463   /* operand size depends on the VEX.W bit.  */
464   vex_w_dq_mode,
465
466   es_reg,
467   cs_reg,
468   ss_reg,
469   ds_reg,
470   fs_reg,
471   gs_reg,
472
473   eAX_reg,
474   eCX_reg,
475   eDX_reg,
476   eBX_reg,
477   eSP_reg,
478   eBP_reg,
479   eSI_reg,
480   eDI_reg,
481
482   al_reg,
483   cl_reg,
484   dl_reg,
485   bl_reg,
486   ah_reg,
487   ch_reg,
488   dh_reg,
489   bh_reg,
490
491   ax_reg,
492   cx_reg,
493   dx_reg,
494   bx_reg,
495   sp_reg,
496   bp_reg,
497   si_reg,
498   di_reg,
499
500   rAX_reg,
501   rCX_reg,
502   rDX_reg,
503   rBX_reg,
504   rSP_reg,
505   rBP_reg,
506   rSI_reg,
507   rDI_reg,
508
509   z_mode_ax_reg,
510   indir_dx_reg
511 };
512
513 enum
514 {
515   FLOATCODE = 1,
516   USE_REG_TABLE,
517   USE_MOD_TABLE,
518   USE_RM_TABLE,
519   USE_PREFIX_TABLE,
520   USE_X86_64_TABLE,
521   USE_3BYTE_TABLE,
522   USE_XOP_8F_TABLE,
523   USE_VEX_C4_TABLE,
524   USE_VEX_C5_TABLE,
525   USE_VEX_LEN_TABLE
526 };
527
528 #define FLOAT                   NULL, { { NULL, FLOATCODE } }
529
530 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
531 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
532 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
533 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
534 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
535 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
536 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
537 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
538 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
539 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
540 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
541
542 enum
543 {
544   REG_80 = 0,
545   REG_81,
546   REG_82,
547   REG_8F,
548   REG_C0,
549   REG_C1,
550   REG_C6,
551   REG_C7,
552   REG_D0,
553   REG_D1,
554   REG_D2,
555   REG_D3,
556   REG_F6,
557   REG_F7,
558   REG_FE,
559   REG_FF,
560   REG_0F00,
561   REG_0F01,
562   REG_0F0D,
563   REG_0F18,
564   REG_0F71,
565   REG_0F72,
566   REG_0F73,
567   REG_0FA6,
568   REG_0FA7,
569   REG_0FAE,
570   REG_0FBA,
571   REG_0FC7,
572   REG_VEX_71,
573   REG_VEX_72,
574   REG_VEX_73,
575   REG_VEX_AE,
576   REG_XOP_LWPCB,
577   REG_XOP_LWP
578 };
579
580 enum
581 {
582   MOD_8D = 0,
583   MOD_0F01_REG_0,
584   MOD_0F01_REG_1,
585   MOD_0F01_REG_2,
586   MOD_0F01_REG_3,
587   MOD_0F01_REG_7,
588   MOD_0F12_PREFIX_0,
589   MOD_0F13,
590   MOD_0F16_PREFIX_0,
591   MOD_0F17,
592   MOD_0F18_REG_0,
593   MOD_0F18_REG_1,
594   MOD_0F18_REG_2,
595   MOD_0F18_REG_3,
596   MOD_0F20,
597   MOD_0F21,
598   MOD_0F22,
599   MOD_0F23,
600   MOD_0F24,
601   MOD_0F26,
602   MOD_0F2B_PREFIX_0,
603   MOD_0F2B_PREFIX_1,
604   MOD_0F2B_PREFIX_2,
605   MOD_0F2B_PREFIX_3,
606   MOD_0F51,
607   MOD_0F71_REG_2,
608   MOD_0F71_REG_4,
609   MOD_0F71_REG_6,
610   MOD_0F72_REG_2,
611   MOD_0F72_REG_4,
612   MOD_0F72_REG_6,
613   MOD_0F73_REG_2,
614   MOD_0F73_REG_3,
615   MOD_0F73_REG_6,
616   MOD_0F73_REG_7,
617   MOD_0FAE_REG_0,
618   MOD_0FAE_REG_1,
619   MOD_0FAE_REG_2,
620   MOD_0FAE_REG_3,
621   MOD_0FAE_REG_4,
622   MOD_0FAE_REG_5,
623   MOD_0FAE_REG_6,
624   MOD_0FAE_REG_7,
625   MOD_0FB2,
626   MOD_0FB4,
627   MOD_0FB5,
628   MOD_0FC7_REG_6,
629   MOD_0FC7_REG_7,
630   MOD_0FD7,
631   MOD_0FE7_PREFIX_2,
632   MOD_0FF0_PREFIX_3,
633   MOD_0F382A_PREFIX_2,
634   MOD_62_32BIT,
635   MOD_C4_32BIT,
636   MOD_C5_32BIT,
637   MOD_VEX_12_PREFIX_0,
638   MOD_VEX_13,
639   MOD_VEX_16_PREFIX_0,
640   MOD_VEX_17,
641   MOD_VEX_2B,
642   MOD_VEX_50,
643   MOD_VEX_71_REG_2,
644   MOD_VEX_71_REG_4,
645   MOD_VEX_71_REG_6,
646   MOD_VEX_72_REG_2,
647   MOD_VEX_72_REG_4,
648   MOD_VEX_72_REG_6,
649   MOD_VEX_73_REG_2,
650   MOD_VEX_73_REG_3,
651   MOD_VEX_73_REG_6,
652   MOD_VEX_73_REG_7,
653   MOD_VEX_AE_REG_2,
654   MOD_VEX_AE_REG_3,
655   MOD_VEX_D7_PREFIX_2,
656   MOD_VEX_E7_PREFIX_2,
657   MOD_VEX_F0_PREFIX_3,
658   MOD_VEX_3818_PREFIX_2,
659   MOD_VEX_3819_PREFIX_2,
660   MOD_VEX_381A_PREFIX_2,
661   MOD_VEX_382A_PREFIX_2,
662   MOD_VEX_382C_PREFIX_2,
663   MOD_VEX_382D_PREFIX_2,
664   MOD_VEX_382E_PREFIX_2,
665   MOD_VEX_382F_PREFIX_2
666 };
667
668 enum
669 {
670   RM_0F01_REG_0 = 0,
671   RM_0F01_REG_1,
672   RM_0F01_REG_2,
673   RM_0F01_REG_3,
674   RM_0F01_REG_7,
675   RM_0FAE_REG_5,
676   RM_0FAE_REG_6,
677   RM_0FAE_REG_7
678 };
679
680 enum
681 {
682   PREFIX_90 = 0,
683   PREFIX_0F10,
684   PREFIX_0F11,
685   PREFIX_0F12,
686   PREFIX_0F16,
687   PREFIX_0F2A,
688   PREFIX_0F2B,
689   PREFIX_0F2C,
690   PREFIX_0F2D,
691   PREFIX_0F2E,
692   PREFIX_0F2F,
693   PREFIX_0F51,
694   PREFIX_0F52,
695   PREFIX_0F53,
696   PREFIX_0F58,
697   PREFIX_0F59,
698   PREFIX_0F5A,
699   PREFIX_0F5B,
700   PREFIX_0F5C,
701   PREFIX_0F5D,
702   PREFIX_0F5E,
703   PREFIX_0F5F,
704   PREFIX_0F60,
705   PREFIX_0F61,
706   PREFIX_0F62,
707   PREFIX_0F6C,
708   PREFIX_0F6D,
709   PREFIX_0F6F,
710   PREFIX_0F70,
711   PREFIX_0F73_REG_3,
712   PREFIX_0F73_REG_7,
713   PREFIX_0F78,
714   PREFIX_0F79,
715   PREFIX_0F7C,
716   PREFIX_0F7D,
717   PREFIX_0F7E,
718   PREFIX_0F7F,
719   PREFIX_0FB8,
720   PREFIX_0FBD,
721   PREFIX_0FC2,
722   PREFIX_0FC3,
723   PREFIX_0FC7_REG_6,
724   PREFIX_0FD0,
725   PREFIX_0FD6,
726   PREFIX_0FE6,
727   PREFIX_0FE7,
728   PREFIX_0FF0,
729   PREFIX_0FF7,
730   PREFIX_0F3810,
731   PREFIX_0F3814,
732   PREFIX_0F3815,
733   PREFIX_0F3817,
734   PREFIX_0F3820,
735   PREFIX_0F3821,
736   PREFIX_0F3822,
737   PREFIX_0F3823,
738   PREFIX_0F3824,
739   PREFIX_0F3825,
740   PREFIX_0F3828,
741   PREFIX_0F3829,
742   PREFIX_0F382A,
743   PREFIX_0F382B,
744   PREFIX_0F3830,
745   PREFIX_0F3831,
746   PREFIX_0F3832,
747   PREFIX_0F3833,
748   PREFIX_0F3834,
749   PREFIX_0F3835,
750   PREFIX_0F3837,
751   PREFIX_0F3838,
752   PREFIX_0F3839,
753   PREFIX_0F383A,
754   PREFIX_0F383B,
755   PREFIX_0F383C,
756   PREFIX_0F383D,
757   PREFIX_0F383E,
758   PREFIX_0F383F,
759   PREFIX_0F3840,
760   PREFIX_0F3841,
761   PREFIX_0F3880,
762   PREFIX_0F3881,
763   PREFIX_0F38DB,
764   PREFIX_0F38DC,
765   PREFIX_0F38DD,
766   PREFIX_0F38DE,
767   PREFIX_0F38DF,
768   PREFIX_0F38F0,
769   PREFIX_0F38F1,
770   PREFIX_0F3A08,
771   PREFIX_0F3A09,
772   PREFIX_0F3A0A,
773   PREFIX_0F3A0B,
774   PREFIX_0F3A0C,
775   PREFIX_0F3A0D,
776   PREFIX_0F3A0E,
777   PREFIX_0F3A14,
778   PREFIX_0F3A15,
779   PREFIX_0F3A16,
780   PREFIX_0F3A17,
781   PREFIX_0F3A20,
782   PREFIX_0F3A21,
783   PREFIX_0F3A22,
784   PREFIX_0F3A40,
785   PREFIX_0F3A41,
786   PREFIX_0F3A42,
787   PREFIX_0F3A44,
788   PREFIX_0F3A60,
789   PREFIX_0F3A61,
790   PREFIX_0F3A62,
791   PREFIX_0F3A63,
792   PREFIX_0F3ADF,
793   PREFIX_VEX_10,
794   PREFIX_VEX_11,
795   PREFIX_VEX_12,
796   PREFIX_VEX_16,
797   PREFIX_VEX_2A,
798   PREFIX_VEX_2C,
799   PREFIX_VEX_2D,
800   PREFIX_VEX_2E,
801   PREFIX_VEX_2F,
802   PREFIX_VEX_51,
803   PREFIX_VEX_52,
804   PREFIX_VEX_53,
805   PREFIX_VEX_58,
806   PREFIX_VEX_59,
807   PREFIX_VEX_5A,
808   PREFIX_VEX_5B,
809   PREFIX_VEX_5C,
810   PREFIX_VEX_5D,
811   PREFIX_VEX_5E,
812   PREFIX_VEX_5F,
813   PREFIX_VEX_60,
814   PREFIX_VEX_61,
815   PREFIX_VEX_62,
816   PREFIX_VEX_63,
817   PREFIX_VEX_64,
818   PREFIX_VEX_65,
819   PREFIX_VEX_66,
820   PREFIX_VEX_67,
821   PREFIX_VEX_68,
822   PREFIX_VEX_69,
823   PREFIX_VEX_6A,
824   PREFIX_VEX_6B,
825   PREFIX_VEX_6C,
826   PREFIX_VEX_6D,
827   PREFIX_VEX_6E,
828   PREFIX_VEX_6F,
829   PREFIX_VEX_70,
830   PREFIX_VEX_71_REG_2,
831   PREFIX_VEX_71_REG_4,
832   PREFIX_VEX_71_REG_6,
833   PREFIX_VEX_72_REG_2,
834   PREFIX_VEX_72_REG_4,
835   PREFIX_VEX_72_REG_6,
836   PREFIX_VEX_73_REG_2,
837   PREFIX_VEX_73_REG_3,
838   PREFIX_VEX_73_REG_6,
839   PREFIX_VEX_73_REG_7,
840   PREFIX_VEX_74,
841   PREFIX_VEX_75,
842   PREFIX_VEX_76,
843   PREFIX_VEX_77,
844   PREFIX_VEX_7C,
845   PREFIX_VEX_7D,
846   PREFIX_VEX_7E,
847   PREFIX_VEX_7F,
848   PREFIX_VEX_C2,
849   PREFIX_VEX_C4,
850   PREFIX_VEX_C5,
851   PREFIX_VEX_D0,
852   PREFIX_VEX_D1,
853   PREFIX_VEX_D2,
854   PREFIX_VEX_D3,
855   PREFIX_VEX_D4,
856   PREFIX_VEX_D5,
857   PREFIX_VEX_D6,
858   PREFIX_VEX_D7,
859   PREFIX_VEX_D8,
860   PREFIX_VEX_D9,
861   PREFIX_VEX_DA,
862   PREFIX_VEX_DB,
863   PREFIX_VEX_DC,
864   PREFIX_VEX_DD,
865   PREFIX_VEX_DE,
866   PREFIX_VEX_DF,
867   PREFIX_VEX_E0,
868   PREFIX_VEX_E1,
869   PREFIX_VEX_E2,
870   PREFIX_VEX_E3,
871   PREFIX_VEX_E4,
872   PREFIX_VEX_E5,
873   PREFIX_VEX_E6,
874   PREFIX_VEX_E7,
875   PREFIX_VEX_E8,
876   PREFIX_VEX_E9,
877   PREFIX_VEX_EA,
878   PREFIX_VEX_EB,
879   PREFIX_VEX_EC,
880   PREFIX_VEX_ED,
881   PREFIX_VEX_EE,
882   PREFIX_VEX_EF,
883   PREFIX_VEX_F0,
884   PREFIX_VEX_F1,
885   PREFIX_VEX_F2,
886   PREFIX_VEX_F3,
887   PREFIX_VEX_F4,
888   PREFIX_VEX_F5,
889   PREFIX_VEX_F6,
890   PREFIX_VEX_F7,
891   PREFIX_VEX_F8,
892   PREFIX_VEX_F9,
893   PREFIX_VEX_FA,
894   PREFIX_VEX_FB,
895   PREFIX_VEX_FC,
896   PREFIX_VEX_FD,
897   PREFIX_VEX_FE,
898   PREFIX_VEX_3800,
899   PREFIX_VEX_3801,
900   PREFIX_VEX_3802,
901   PREFIX_VEX_3803,
902   PREFIX_VEX_3804,
903   PREFIX_VEX_3805,
904   PREFIX_VEX_3806,
905   PREFIX_VEX_3807,
906   PREFIX_VEX_3808,
907   PREFIX_VEX_3809,
908   PREFIX_VEX_380A,
909   PREFIX_VEX_380B,
910   PREFIX_VEX_380C,
911   PREFIX_VEX_380D,
912   PREFIX_VEX_380E,
913   PREFIX_VEX_380F,
914   PREFIX_VEX_3817,
915   PREFIX_VEX_3818,
916   PREFIX_VEX_3819,
917   PREFIX_VEX_381A,
918   PREFIX_VEX_381C,
919   PREFIX_VEX_381D,
920   PREFIX_VEX_381E,
921   PREFIX_VEX_3820,
922   PREFIX_VEX_3821,
923   PREFIX_VEX_3822,
924   PREFIX_VEX_3823,
925   PREFIX_VEX_3824,
926   PREFIX_VEX_3825,
927   PREFIX_VEX_3828,
928   PREFIX_VEX_3829,
929   PREFIX_VEX_382A,
930   PREFIX_VEX_382B,
931   PREFIX_VEX_382C,
932   PREFIX_VEX_382D,
933   PREFIX_VEX_382E,
934   PREFIX_VEX_382F,
935   PREFIX_VEX_3830,
936   PREFIX_VEX_3831,
937   PREFIX_VEX_3832,
938   PREFIX_VEX_3833,
939   PREFIX_VEX_3834,
940   PREFIX_VEX_3835,
941   PREFIX_VEX_3837,
942   PREFIX_VEX_3838,
943   PREFIX_VEX_3839,
944   PREFIX_VEX_383A,
945   PREFIX_VEX_383B,
946   PREFIX_VEX_383C,
947   PREFIX_VEX_383D,
948   PREFIX_VEX_383E,
949   PREFIX_VEX_383F,
950   PREFIX_VEX_3840,
951   PREFIX_VEX_3841,
952   PREFIX_VEX_3896,
953   PREFIX_VEX_3897,
954   PREFIX_VEX_3898,
955   PREFIX_VEX_3899,
956   PREFIX_VEX_389A,
957   PREFIX_VEX_389B,
958   PREFIX_VEX_389C,
959   PREFIX_VEX_389D,
960   PREFIX_VEX_389E,
961   PREFIX_VEX_389F,
962   PREFIX_VEX_38A6,
963   PREFIX_VEX_38A7,
964   PREFIX_VEX_38A8,
965   PREFIX_VEX_38A9,
966   PREFIX_VEX_38AA,
967   PREFIX_VEX_38AB,
968   PREFIX_VEX_38AC,
969   PREFIX_VEX_38AD,
970   PREFIX_VEX_38AE,
971   PREFIX_VEX_38AF,
972   PREFIX_VEX_38B6,
973   PREFIX_VEX_38B7,
974   PREFIX_VEX_38B8,
975   PREFIX_VEX_38B9,
976   PREFIX_VEX_38BA,
977   PREFIX_VEX_38BB,
978   PREFIX_VEX_38BC,
979   PREFIX_VEX_38BD,
980   PREFIX_VEX_38BE,
981   PREFIX_VEX_38BF,
982   PREFIX_VEX_38DB,
983   PREFIX_VEX_38DC,
984   PREFIX_VEX_38DD,
985   PREFIX_VEX_38DE,
986   PREFIX_VEX_38DF,
987   PREFIX_VEX_3A04,
988   PREFIX_VEX_3A05,
989   PREFIX_VEX_3A06,
990   PREFIX_VEX_3A08,
991   PREFIX_VEX_3A09,
992   PREFIX_VEX_3A0A,
993   PREFIX_VEX_3A0B,
994   PREFIX_VEX_3A0C,
995   PREFIX_VEX_3A0D,
996   PREFIX_VEX_3A0E,
997   PREFIX_VEX_3A0F,
998   PREFIX_VEX_3A14,
999   PREFIX_VEX_3A15,
1000   PREFIX_VEX_3A16,
1001   PREFIX_VEX_3A17,
1002   PREFIX_VEX_3A18,
1003   PREFIX_VEX_3A19,
1004   PREFIX_VEX_3A20,
1005   PREFIX_VEX_3A21,
1006   PREFIX_VEX_3A22,
1007   PREFIX_VEX_3A40,
1008   PREFIX_VEX_3A41,
1009   PREFIX_VEX_3A42,
1010   PREFIX_VEX_3A44,
1011   PREFIX_VEX_3A4A,
1012   PREFIX_VEX_3A4B,
1013   PREFIX_VEX_3A4C,
1014   PREFIX_VEX_3A5C,
1015   PREFIX_VEX_3A5D,
1016   PREFIX_VEX_3A5E,
1017   PREFIX_VEX_3A5F,
1018   PREFIX_VEX_3A60,
1019   PREFIX_VEX_3A61,
1020   PREFIX_VEX_3A62,
1021   PREFIX_VEX_3A63,
1022   PREFIX_VEX_3A68,
1023   PREFIX_VEX_3A69,
1024   PREFIX_VEX_3A6A,
1025   PREFIX_VEX_3A6B,
1026   PREFIX_VEX_3A6C,
1027   PREFIX_VEX_3A6D,
1028   PREFIX_VEX_3A6E,
1029   PREFIX_VEX_3A6F,
1030   PREFIX_VEX_3A78,
1031   PREFIX_VEX_3A79,
1032   PREFIX_VEX_3A7A,
1033   PREFIX_VEX_3A7B,
1034   PREFIX_VEX_3A7C,
1035   PREFIX_VEX_3A7D,
1036   PREFIX_VEX_3A7E,
1037   PREFIX_VEX_3A7F,
1038   PREFIX_VEX_3ADF
1039 };
1040
1041 enum
1042 {
1043   X86_64_06 = 0,
1044   X86_64_07,
1045   X86_64_0D,
1046   X86_64_16,
1047   X86_64_17,
1048   X86_64_1E,
1049   X86_64_1F,
1050   X86_64_27,
1051   X86_64_2F,
1052   X86_64_37,
1053   X86_64_3F,
1054   X86_64_60,
1055   X86_64_61,
1056   X86_64_62,
1057   X86_64_63,
1058   X86_64_6D,
1059   X86_64_6F,
1060   X86_64_9A,
1061   X86_64_C4,
1062   X86_64_C5,
1063   X86_64_CE,
1064   X86_64_D4,
1065   X86_64_D5,
1066   X86_64_EA,
1067   X86_64_0F01_REG_0,
1068   X86_64_0F01_REG_1,
1069   X86_64_0F01_REG_2,
1070   X86_64_0F01_REG_3
1071 };
1072
1073 enum
1074 {
1075   THREE_BYTE_0F38 = 0,
1076   THREE_BYTE_0F3A,
1077   THREE_BYTE_0F7A
1078 };
1079
1080 enum
1081 {
1082   XOP_08 = 0,
1083   XOP_09,
1084   XOP_0A
1085 };
1086
1087 enum
1088 {
1089   VEX_0F = 0,
1090   VEX_0F38,
1091   VEX_0F3A
1092 };
1093
1094 enum
1095 {
1096   VEX_LEN_10_P_1 = 0,
1097   VEX_LEN_10_P_3,
1098   VEX_LEN_11_P_1,
1099   VEX_LEN_11_P_3,
1100   VEX_LEN_12_P_0_M_0,
1101   VEX_LEN_12_P_0_M_1,
1102   VEX_LEN_12_P_2,
1103   VEX_LEN_13_M_0,
1104   VEX_LEN_16_P_0_M_0,
1105   VEX_LEN_16_P_0_M_1,
1106   VEX_LEN_16_P_2,
1107   VEX_LEN_17_M_0,
1108   VEX_LEN_2A_P_1,
1109   VEX_LEN_2A_P_3,
1110   VEX_LEN_2C_P_1,
1111   VEX_LEN_2C_P_3,
1112   VEX_LEN_2D_P_1,
1113   VEX_LEN_2D_P_3,
1114   VEX_LEN_2E_P_0,
1115   VEX_LEN_2E_P_2,
1116   VEX_LEN_2F_P_0,
1117   VEX_LEN_2F_P_2,
1118   VEX_LEN_51_P_1,
1119   VEX_LEN_51_P_3,
1120   VEX_LEN_52_P_1,
1121   VEX_LEN_53_P_1,
1122   VEX_LEN_58_P_1,
1123   VEX_LEN_58_P_3,
1124   VEX_LEN_59_P_1,
1125   VEX_LEN_59_P_3,
1126   VEX_LEN_5A_P_1,
1127   VEX_LEN_5A_P_3,
1128   VEX_LEN_5C_P_1,
1129   VEX_LEN_5C_P_3,
1130   VEX_LEN_5D_P_1,
1131   VEX_LEN_5D_P_3,
1132   VEX_LEN_5E_P_1,
1133   VEX_LEN_5E_P_3,
1134   VEX_LEN_5F_P_1,
1135   VEX_LEN_5F_P_3,
1136   VEX_LEN_60_P_2,
1137   VEX_LEN_61_P_2,
1138   VEX_LEN_62_P_2,
1139   VEX_LEN_63_P_2,
1140   VEX_LEN_64_P_2,
1141   VEX_LEN_65_P_2,
1142   VEX_LEN_66_P_2,
1143   VEX_LEN_67_P_2,
1144   VEX_LEN_68_P_2,
1145   VEX_LEN_69_P_2,
1146   VEX_LEN_6A_P_2,
1147   VEX_LEN_6B_P_2,
1148   VEX_LEN_6C_P_2,
1149   VEX_LEN_6D_P_2,
1150   VEX_LEN_6E_P_2,
1151   VEX_LEN_70_P_1,
1152   VEX_LEN_70_P_2,
1153   VEX_LEN_70_P_3,
1154   VEX_LEN_71_R_2_P_2,
1155   VEX_LEN_71_R_4_P_2,
1156   VEX_LEN_71_R_6_P_2,
1157   VEX_LEN_72_R_2_P_2,
1158   VEX_LEN_72_R_4_P_2,
1159   VEX_LEN_72_R_6_P_2,
1160   VEX_LEN_73_R_2_P_2,
1161   VEX_LEN_73_R_3_P_2,
1162   VEX_LEN_73_R_6_P_2,
1163   VEX_LEN_73_R_7_P_2,
1164   VEX_LEN_74_P_2,
1165   VEX_LEN_75_P_2,
1166   VEX_LEN_76_P_2,
1167   VEX_LEN_7E_P_1,
1168   VEX_LEN_7E_P_2,
1169   VEX_LEN_AE_R_2_M_0,
1170   VEX_LEN_AE_R_3_M_0,
1171   VEX_LEN_C2_P_1,
1172   VEX_LEN_C2_P_3,
1173   VEX_LEN_C4_P_2,
1174   VEX_LEN_C5_P_2,
1175   VEX_LEN_D1_P_2,
1176   VEX_LEN_D2_P_2,
1177   VEX_LEN_D3_P_2,
1178   VEX_LEN_D4_P_2,
1179   VEX_LEN_D5_P_2,
1180   VEX_LEN_D6_P_2,
1181   VEX_LEN_D7_P_2_M_1,
1182   VEX_LEN_D8_P_2,
1183   VEX_LEN_D9_P_2,
1184   VEX_LEN_DA_P_2,
1185   VEX_LEN_DB_P_2,
1186   VEX_LEN_DC_P_2,
1187   VEX_LEN_DD_P_2,
1188   VEX_LEN_DE_P_2,
1189   VEX_LEN_DF_P_2,
1190   VEX_LEN_E0_P_2,
1191   VEX_LEN_E1_P_2,
1192   VEX_LEN_E2_P_2,
1193   VEX_LEN_E3_P_2,
1194   VEX_LEN_E4_P_2,
1195   VEX_LEN_E5_P_2,
1196   VEX_LEN_E8_P_2,
1197   VEX_LEN_E9_P_2,
1198   VEX_LEN_EA_P_2,
1199   VEX_LEN_EB_P_2,
1200   VEX_LEN_EC_P_2,
1201   VEX_LEN_ED_P_2,
1202   VEX_LEN_EE_P_2,
1203   VEX_LEN_EF_P_2,
1204   VEX_LEN_F1_P_2,
1205   VEX_LEN_F2_P_2,
1206   VEX_LEN_F3_P_2,
1207   VEX_LEN_F4_P_2,
1208   VEX_LEN_F5_P_2,
1209   VEX_LEN_F6_P_2,
1210   VEX_LEN_F7_P_2,
1211   VEX_LEN_F8_P_2,
1212   VEX_LEN_F9_P_2,
1213   VEX_LEN_FA_P_2,
1214   VEX_LEN_FB_P_2,
1215   VEX_LEN_FC_P_2,
1216   VEX_LEN_FD_P_2,
1217   VEX_LEN_FE_P_2,
1218   VEX_LEN_3800_P_2,
1219   VEX_LEN_3801_P_2,
1220   VEX_LEN_3802_P_2,
1221   VEX_LEN_3803_P_2,
1222   VEX_LEN_3804_P_2,
1223   VEX_LEN_3805_P_2,
1224   VEX_LEN_3806_P_2,
1225   VEX_LEN_3807_P_2,
1226   VEX_LEN_3808_P_2,
1227   VEX_LEN_3809_P_2,
1228   VEX_LEN_380A_P_2,
1229   VEX_LEN_380B_P_2,
1230   VEX_LEN_3819_P_2_M_0,
1231   VEX_LEN_381A_P_2_M_0,
1232   VEX_LEN_381C_P_2,
1233   VEX_LEN_381D_P_2,
1234   VEX_LEN_381E_P_2,
1235   VEX_LEN_3820_P_2,
1236   VEX_LEN_3821_P_2,
1237   VEX_LEN_3822_P_2,
1238   VEX_LEN_3823_P_2,
1239   VEX_LEN_3824_P_2,
1240   VEX_LEN_3825_P_2,
1241   VEX_LEN_3828_P_2,
1242   VEX_LEN_3829_P_2,
1243   VEX_LEN_382A_P_2_M_0,
1244   VEX_LEN_382B_P_2,
1245   VEX_LEN_3830_P_2,
1246   VEX_LEN_3831_P_2,
1247   VEX_LEN_3832_P_2,
1248   VEX_LEN_3833_P_2,
1249   VEX_LEN_3834_P_2,
1250   VEX_LEN_3835_P_2,
1251   VEX_LEN_3837_P_2,
1252   VEX_LEN_3838_P_2,
1253   VEX_LEN_3839_P_2,
1254   VEX_LEN_383A_P_2,
1255   VEX_LEN_383B_P_2,
1256   VEX_LEN_383C_P_2,
1257   VEX_LEN_383D_P_2,
1258   VEX_LEN_383E_P_2,
1259   VEX_LEN_383F_P_2,
1260   VEX_LEN_3840_P_2,
1261   VEX_LEN_3841_P_2,
1262   VEX_LEN_38DB_P_2,
1263   VEX_LEN_38DC_P_2,
1264   VEX_LEN_38DD_P_2,
1265   VEX_LEN_38DE_P_2,
1266   VEX_LEN_38DF_P_2,
1267   VEX_LEN_3A06_P_2,
1268   VEX_LEN_3A0A_P_2,
1269   VEX_LEN_3A0B_P_2,
1270   VEX_LEN_3A0E_P_2,
1271   VEX_LEN_3A0F_P_2,
1272   VEX_LEN_3A14_P_2,
1273   VEX_LEN_3A15_P_2,
1274   VEX_LEN_3A16_P_2,
1275   VEX_LEN_3A17_P_2,
1276   VEX_LEN_3A18_P_2,
1277   VEX_LEN_3A19_P_2,
1278   VEX_LEN_3A20_P_2,
1279   VEX_LEN_3A21_P_2,
1280   VEX_LEN_3A22_P_2,
1281   VEX_LEN_3A41_P_2,
1282   VEX_LEN_3A42_P_2,
1283   VEX_LEN_3A44_P_2,
1284   VEX_LEN_3A4C_P_2,
1285   VEX_LEN_3A60_P_2,
1286   VEX_LEN_3A61_P_2,
1287   VEX_LEN_3A62_P_2,
1288   VEX_LEN_3A63_P_2,
1289   VEX_LEN_3A6A_P_2,
1290   VEX_LEN_3A6B_P_2,
1291   VEX_LEN_3A6E_P_2,
1292   VEX_LEN_3A6F_P_2,
1293   VEX_LEN_3A7A_P_2,
1294   VEX_LEN_3A7B_P_2,
1295   VEX_LEN_3A7E_P_2,
1296   VEX_LEN_3A7F_P_2,
1297   VEX_LEN_3ADF_P_2,
1298   VEX_LEN_XOP_09_80,
1299   VEX_LEN_XOP_09_81
1300 };
1301
1302 typedef void (*op_rtn) (int bytemode, int sizeflag);
1303
1304 struct dis386 {
1305   const char *name;
1306   struct
1307     {
1308       op_rtn rtn;
1309       int bytemode;
1310     } op[MAX_OPERANDS];
1311 };
1312
1313 /* Upper case letters in the instruction names here are macros.
1314    'A' => print 'b' if no register operands or suffix_always is true
1315    'B' => print 'b' if suffix_always is true
1316    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1317           size prefix
1318    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1319           suffix_always is true
1320    'E' => print 'e' if 32-bit form of jcxz
1321    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1322    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1323    'H' => print ",pt" or ",pn" branch hint
1324    'I' => honor following macro letter even in Intel mode (implemented only
1325           for some of the macro letters)
1326    'J' => print 'l'
1327    'K' => print 'd' or 'q' if rex prefix is present.
1328    'L' => print 'l' if suffix_always is true
1329    'M' => print 'r' if intel_mnemonic is false.
1330    'N' => print 'n' if instruction has no wait "prefix"
1331    'O' => print 'd' or 'o' (or 'q' in Intel mode)
1332    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1333           or suffix_always is true.  print 'q' if rex prefix is present.
1334    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1335           is true
1336    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1337    'S' => print 'w', 'l' or 'q' if suffix_always is true
1338    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1339    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1340    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1341    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1342    'X' => print 's', 'd' depending on data16 prefix (for XMM)
1343    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1344           suffix_always is true.
1345    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1346    '!' => change condition from true to false or from false to true.
1347    '%' => add 1 upper case letter to the macro.
1348
1349    2 upper case letter macros:
1350    "XY" => print 'x' or 'y' if no register operands or suffix_always
1351            is true.
1352    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1353    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1354            or suffix_always is true
1355    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1356    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1357    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1358
1359    Many of the above letters print nothing in Intel mode.  See "putop"
1360    for the details.
1361
1362    Braces '{' and '}', and vertical bars '|', indicate alternative
1363    mnemonic strings for AT&T and Intel.  */
1364
1365 static const struct dis386 dis386[] = {
1366   /* 00 */
1367   { "addB",             { Eb, Gb } },
1368   { "addS",             { Ev, Gv } },
1369   { "addB",             { Gb, EbS } },
1370   { "addS",             { Gv, EvS } },
1371   { "addB",             { AL, Ib } },
1372   { "addS",             { eAX, Iv } },
1373   { X86_64_TABLE (X86_64_06) },
1374   { X86_64_TABLE (X86_64_07) },
1375   /* 08 */
1376   { "orB",              { Eb, Gb } },
1377   { "orS",              { Ev, Gv } },
1378   { "orB",              { Gb, EbS } },
1379   { "orS",              { Gv, EvS } },
1380   { "orB",              { AL, Ib } },
1381   { "orS",              { eAX, Iv } },
1382   { X86_64_TABLE (X86_64_0D) },
1383   { "(bad)",            { XX } },       /* 0x0f extended opcode escape */
1384   /* 10 */
1385   { "adcB",             { Eb, Gb } },
1386   { "adcS",             { Ev, Gv } },
1387   { "adcB",             { Gb, EbS } },
1388   { "adcS",             { Gv, EvS } },
1389   { "adcB",             { AL, Ib } },
1390   { "adcS",             { eAX, Iv } },
1391   { X86_64_TABLE (X86_64_16) },
1392   { X86_64_TABLE (X86_64_17) },
1393   /* 18 */
1394   { "sbbB",             { Eb, Gb } },
1395   { "sbbS",             { Ev, Gv } },
1396   { "sbbB",             { Gb, EbS } },
1397   { "sbbS",             { Gv, EvS } },
1398   { "sbbB",             { AL, Ib } },
1399   { "sbbS",             { eAX, Iv } },
1400   { X86_64_TABLE (X86_64_1E) },
1401   { X86_64_TABLE (X86_64_1F) },
1402   /* 20 */
1403   { "andB",             { Eb, Gb } },
1404   { "andS",             { Ev, Gv } },
1405   { "andB",             { Gb, EbS } },
1406   { "andS",             { Gv, EvS } },
1407   { "andB",             { AL, Ib } },
1408   { "andS",             { eAX, Iv } },
1409   { "(bad)",            { XX } },       /* SEG ES prefix */
1410   { X86_64_TABLE (X86_64_27) },
1411   /* 28 */
1412   { "subB",             { Eb, Gb } },
1413   { "subS",             { Ev, Gv } },
1414   { "subB",             { Gb, EbS } },
1415   { "subS",             { Gv, EvS } },
1416   { "subB",             { AL, Ib } },
1417   { "subS",             { eAX, Iv } },
1418   { "(bad)",            { XX } },       /* SEG CS prefix */
1419   { X86_64_TABLE (X86_64_2F) },
1420   /* 30 */
1421   { "xorB",             { Eb, Gb } },
1422   { "xorS",             { Ev, Gv } },
1423   { "xorB",             { Gb, EbS } },
1424   { "xorS",             { Gv, EvS } },
1425   { "xorB",             { AL, Ib } },
1426   { "xorS",             { eAX, Iv } },
1427   { "(bad)",            { XX } },       /* SEG SS prefix */
1428   { X86_64_TABLE (X86_64_37) },
1429   /* 38 */
1430   { "cmpB",             { Eb, Gb } },
1431   { "cmpS",             { Ev, Gv } },
1432   { "cmpB",             { Gb, EbS } },
1433   { "cmpS",             { Gv, EvS } },
1434   { "cmpB",             { AL, Ib } },
1435   { "cmpS",             { eAX, Iv } },
1436   { "(bad)",            { XX } },       /* SEG DS prefix */
1437   { X86_64_TABLE (X86_64_3F) },
1438   /* 40 */
1439   { "inc{S|}",          { RMeAX } },
1440   { "inc{S|}",          { RMeCX } },
1441   { "inc{S|}",          { RMeDX } },
1442   { "inc{S|}",          { RMeBX } },
1443   { "inc{S|}",          { RMeSP } },
1444   { "inc{S|}",          { RMeBP } },
1445   { "inc{S|}",          { RMeSI } },
1446   { "inc{S|}",          { RMeDI } },
1447   /* 48 */
1448   { "dec{S|}",          { RMeAX } },
1449   { "dec{S|}",          { RMeCX } },
1450   { "dec{S|}",          { RMeDX } },
1451   { "dec{S|}",          { RMeBX } },
1452   { "dec{S|}",          { RMeSP } },
1453   { "dec{S|}",          { RMeBP } },
1454   { "dec{S|}",          { RMeSI } },
1455   { "dec{S|}",          { RMeDI } },
1456   /* 50 */
1457   { "pushV",            { RMrAX } },
1458   { "pushV",            { RMrCX } },
1459   { "pushV",            { RMrDX } },
1460   { "pushV",            { RMrBX } },
1461   { "pushV",            { RMrSP } },
1462   { "pushV",            { RMrBP } },
1463   { "pushV",            { RMrSI } },
1464   { "pushV",            { RMrDI } },
1465   /* 58 */
1466   { "popV",             { RMrAX } },
1467   { "popV",             { RMrCX } },
1468   { "popV",             { RMrDX } },
1469   { "popV",             { RMrBX } },
1470   { "popV",             { RMrSP } },
1471   { "popV",             { RMrBP } },
1472   { "popV",             { RMrSI } },
1473   { "popV",             { RMrDI } },
1474   /* 60 */
1475   { X86_64_TABLE (X86_64_60) },
1476   { X86_64_TABLE (X86_64_61) },
1477   { X86_64_TABLE (X86_64_62) },
1478   { X86_64_TABLE (X86_64_63) },
1479   { "(bad)",            { XX } },       /* seg fs */
1480   { "(bad)",            { XX } },       /* seg gs */
1481   { "(bad)",            { XX } },       /* op size prefix */
1482   { "(bad)",            { XX } },       /* adr size prefix */
1483   /* 68 */
1484   { "pushT",            { Iq } },
1485   { "imulS",            { Gv, Ev, Iv } },
1486   { "pushT",            { sIb } },
1487   { "imulS",            { Gv, Ev, sIb } },
1488   { "ins{b|}",          { Ybr, indirDX } },
1489   { X86_64_TABLE (X86_64_6D) },
1490   { "outs{b|}",         { indirDXr, Xb } },
1491   { X86_64_TABLE (X86_64_6F) },
1492   /* 70 */
1493   { "joH",              { Jb, XX, cond_jump_flag } },
1494   { "jnoH",             { Jb, XX, cond_jump_flag } },
1495   { "jbH",              { Jb, XX, cond_jump_flag } },
1496   { "jaeH",             { Jb, XX, cond_jump_flag } },
1497   { "jeH",              { Jb, XX, cond_jump_flag } },
1498   { "jneH",             { Jb, XX, cond_jump_flag } },
1499   { "jbeH",             { Jb, XX, cond_jump_flag } },
1500   { "jaH",              { Jb, XX, cond_jump_flag } },
1501   /* 78 */
1502   { "jsH",              { Jb, XX, cond_jump_flag } },
1503   { "jnsH",             { Jb, XX, cond_jump_flag } },
1504   { "jpH",              { Jb, XX, cond_jump_flag } },
1505   { "jnpH",             { Jb, XX, cond_jump_flag } },
1506   { "jlH",              { Jb, XX, cond_jump_flag } },
1507   { "jgeH",             { Jb, XX, cond_jump_flag } },
1508   { "jleH",             { Jb, XX, cond_jump_flag } },
1509   { "jgH",              { Jb, XX, cond_jump_flag } },
1510   /* 80 */
1511   { REG_TABLE (REG_80) },
1512   { REG_TABLE (REG_81) },
1513   { "(bad)",            { XX } },
1514   { REG_TABLE (REG_82) },
1515   { "testB",            { Eb, Gb } },
1516   { "testS",            { Ev, Gv } },
1517   { "xchgB",            { Eb, Gb } },
1518   { "xchgS",            { Ev, Gv } },
1519   /* 88 */
1520   { "movB",             { Eb, Gb } },
1521   { "movS",             { Ev, Gv } },
1522   { "movB",             { Gb, EbS } },
1523   { "movS",             { Gv, EvS } },
1524   { "movD",             { Sv, Sw } },
1525   { MOD_TABLE (MOD_8D) },
1526   { "movD",             { Sw, Sv } },
1527   { REG_TABLE (REG_8F) },
1528   /* 90 */
1529   { PREFIX_TABLE (PREFIX_90) },
1530   { "xchgS",            { RMeCX, eAX } },
1531   { "xchgS",            { RMeDX, eAX } },
1532   { "xchgS",            { RMeBX, eAX } },
1533   { "xchgS",            { RMeSP, eAX } },
1534   { "xchgS",            { RMeBP, eAX } },
1535   { "xchgS",            { RMeSI, eAX } },
1536   { "xchgS",            { RMeDI, eAX } },
1537   /* 98 */
1538   { "cW{t|}R",          { XX } },
1539   { "cR{t|}O",          { XX } },
1540   { X86_64_TABLE (X86_64_9A) },
1541   { "(bad)",            { XX } },       /* fwait */
1542   { "pushfT",           { XX } },
1543   { "popfT",            { XX } },
1544   { "sahf",             { XX } },
1545   { "lahf",             { XX } },
1546   /* a0 */
1547   { "mov%LB",           { AL, Ob } },
1548   { "mov%LS",           { eAX, Ov } },
1549   { "mov%LB",           { Ob, AL } },
1550   { "mov%LS",           { Ov, eAX } },
1551   { "movs{b|}",         { Ybr, Xb } },
1552   { "movs{R|}",         { Yvr, Xv } },
1553   { "cmps{b|}",         { Xb, Yb } },
1554   { "cmps{R|}",         { Xv, Yv } },
1555   /* a8 */
1556   { "testB",            { AL, Ib } },
1557   { "testS",            { eAX, Iv } },
1558   { "stosB",            { Ybr, AL } },
1559   { "stosS",            { Yvr, eAX } },
1560   { "lodsB",            { ALr, Xb } },
1561   { "lodsS",            { eAXr, Xv } },
1562   { "scasB",            { AL, Yb } },
1563   { "scasS",            { eAX, Yv } },
1564   /* b0 */
1565   { "movB",             { RMAL, Ib } },
1566   { "movB",             { RMCL, Ib } },
1567   { "movB",             { RMDL, Ib } },
1568   { "movB",             { RMBL, Ib } },
1569   { "movB",             { RMAH, Ib } },
1570   { "movB",             { RMCH, Ib } },
1571   { "movB",             { RMDH, Ib } },
1572   { "movB",             { RMBH, Ib } },
1573   /* b8 */
1574   { "mov%LV",           { RMeAX, Iv64 } },
1575   { "mov%LV",           { RMeCX, Iv64 } },
1576   { "mov%LV",           { RMeDX, Iv64 } },
1577   { "mov%LV",           { RMeBX, Iv64 } },
1578   { "mov%LV",           { RMeSP, Iv64 } },
1579   { "mov%LV",           { RMeBP, Iv64 } },
1580   { "mov%LV",           { RMeSI, Iv64 } },
1581   { "mov%LV",           { RMeDI, Iv64 } },
1582   /* c0 */
1583   { REG_TABLE (REG_C0) },
1584   { REG_TABLE (REG_C1) },
1585   { "retT",             { Iw } },
1586   { "retT",             { XX } },
1587   { X86_64_TABLE (X86_64_C4) },
1588   { X86_64_TABLE (X86_64_C5) },
1589   { REG_TABLE (REG_C6) },
1590   { REG_TABLE (REG_C7) },
1591   /* c8 */
1592   { "enterT",           { Iw, Ib } },
1593   { "leaveT",           { XX } },
1594   { "Jret{|f}P",        { Iw } },
1595   { "Jret{|f}P",        { XX } },
1596   { "int3",             { XX } },
1597   { "int",              { Ib } },
1598   { X86_64_TABLE (X86_64_CE) },
1599   { "iretP",            { XX } },
1600   /* d0 */
1601   { REG_TABLE (REG_D0) },
1602   { REG_TABLE (REG_D1) },
1603   { REG_TABLE (REG_D2) },
1604   { REG_TABLE (REG_D3) },
1605   { X86_64_TABLE (X86_64_D4) },
1606   { X86_64_TABLE (X86_64_D5) },
1607   { "(bad)",            { XX } },
1608   { "xlat",             { DSBX } },
1609   /* d8 */
1610   { FLOAT },
1611   { FLOAT },
1612   { FLOAT },
1613   { FLOAT },
1614   { FLOAT },
1615   { FLOAT },
1616   { FLOAT },
1617   { FLOAT },
1618   /* e0 */
1619   { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1620   { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1621   { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1622   { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1623   { "inB",              { AL, Ib } },
1624   { "inG",              { zAX, Ib } },
1625   { "outB",             { Ib, AL } },
1626   { "outG",             { Ib, zAX } },
1627   /* e8 */
1628   { "callT",            { Jv } },
1629   { "jmpT",             { Jv } },
1630   { X86_64_TABLE (X86_64_EA) },
1631   { "jmp",              { Jb } },
1632   { "inB",              { AL, indirDX } },
1633   { "inG",              { zAX, indirDX } },
1634   { "outB",             { indirDX, AL } },
1635   { "outG",             { indirDX, zAX } },
1636   /* f0 */
1637   { "(bad)",            { XX } },       /* lock prefix */
1638   { "icebp",            { XX } },
1639   { "(bad)",            { XX } },       /* repne */
1640   { "(bad)",            { XX } },       /* repz */
1641   { "hlt",              { XX } },
1642   { "cmc",              { XX } },
1643   { REG_TABLE (REG_F6) },
1644   { REG_TABLE (REG_F7) },
1645   /* f8 */
1646   { "clc",              { XX } },
1647   { "stc",              { XX } },
1648   { "cli",              { XX } },
1649   { "sti",              { XX } },
1650   { "cld",              { XX } },
1651   { "std",              { XX } },
1652   { REG_TABLE (REG_FE) },
1653   { REG_TABLE (REG_FF) },
1654 };
1655
1656 static const struct dis386 dis386_twobyte[] = {
1657   /* 00 */
1658   { REG_TABLE (REG_0F00 ) },
1659   { REG_TABLE (REG_0F01 ) },
1660   { "larS",             { Gv, Ew } },
1661   { "lslS",             { Gv, Ew } },
1662   { "(bad)",            { XX } },
1663   { "syscall",          { XX } },
1664   { "clts",             { XX } },
1665   { "sysretP",          { XX } },
1666   /* 08 */
1667   { "invd",             { XX } },
1668   { "wbinvd",           { XX } },
1669   { "(bad)",            { XX } },
1670   { "ud2a",             { XX } },
1671   { "(bad)",            { XX } },
1672   { REG_TABLE (REG_0F0D) },
1673   { "femms",            { XX } },
1674   { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1675   /* 10 */
1676   { PREFIX_TABLE (PREFIX_0F10) },
1677   { PREFIX_TABLE (PREFIX_0F11) },
1678   { PREFIX_TABLE (PREFIX_0F12) },
1679   { MOD_TABLE (MOD_0F13) },
1680   { "unpcklpX",         { XM, EXx } },
1681   { "unpckhpX",         { XM, EXx } },
1682   { PREFIX_TABLE (PREFIX_0F16) },
1683   { MOD_TABLE (MOD_0F17) },
1684   /* 18 */
1685   { REG_TABLE (REG_0F18) },
1686   { "nopQ",             { Ev } },
1687   { "nopQ",             { Ev } },
1688   { "nopQ",             { Ev } },
1689   { "nopQ",             { Ev } },
1690   { "nopQ",             { Ev } },
1691   { "nopQ",             { Ev } },
1692   { "nopQ",             { Ev } },
1693   /* 20 */
1694   { MOD_TABLE (MOD_0F20) },
1695   { MOD_TABLE (MOD_0F21) },
1696   { MOD_TABLE (MOD_0F22) },
1697   { MOD_TABLE (MOD_0F23) },
1698   { MOD_TABLE (MOD_0F24) },
1699   { "(bad)",            { XX } },
1700   { MOD_TABLE (MOD_0F26) },
1701   { "(bad)",            { XX } },
1702   /* 28 */
1703   { "movapX",           { XM, EXx } },
1704   { "movapX",           { EXxS, XM } },
1705   { PREFIX_TABLE (PREFIX_0F2A) },
1706   { PREFIX_TABLE (PREFIX_0F2B) },
1707   { PREFIX_TABLE (PREFIX_0F2C) },
1708   { PREFIX_TABLE (PREFIX_0F2D) },
1709   { PREFIX_TABLE (PREFIX_0F2E) },
1710   { PREFIX_TABLE (PREFIX_0F2F) },
1711   /* 30 */
1712   { "wrmsr",            { XX } },
1713   { "rdtsc",            { XX } },
1714   { "rdmsr",            { XX } },
1715   { "rdpmc",            { XX } },
1716   { "sysenter",         { XX } },
1717   { "sysexit",          { XX } },
1718   { "(bad)",            { XX } },
1719   { "getsec",           { XX } },
1720   /* 38 */
1721   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1722   { "(bad)",            { XX } },
1723   { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1724   { "(bad)",            { XX } },
1725   { "(bad)",            { XX } },
1726   { "(bad)",            { XX } },
1727   { "(bad)",            { XX } },
1728   { "(bad)",            { XX } },
1729   /* 40 */
1730   { "cmovoS",           { Gv, Ev } },
1731   { "cmovnoS",          { Gv, Ev } },
1732   { "cmovbS",           { Gv, Ev } },
1733   { "cmovaeS",          { Gv, Ev } },
1734   { "cmoveS",           { Gv, Ev } },
1735   { "cmovneS",          { Gv, Ev } },
1736   { "cmovbeS",          { Gv, Ev } },
1737   { "cmovaS",           { Gv, Ev } },
1738   /* 48 */
1739   { "cmovsS",           { Gv, Ev } },
1740   { "cmovnsS",          { Gv, Ev } },
1741   { "cmovpS",           { Gv, Ev } },
1742   { "cmovnpS",          { Gv, Ev } },
1743   { "cmovlS",           { Gv, Ev } },
1744   { "cmovgeS",          { Gv, Ev } },
1745   { "cmovleS",          { Gv, Ev } },
1746   { "cmovgS",           { Gv, Ev } },
1747   /* 50 */
1748   { MOD_TABLE (MOD_0F51) },
1749   { PREFIX_TABLE (PREFIX_0F51) },
1750   { PREFIX_TABLE (PREFIX_0F52) },
1751   { PREFIX_TABLE (PREFIX_0F53) },
1752   { "andpX",            { XM, EXx } },
1753   { "andnpX",           { XM, EXx } },
1754   { "orpX",             { XM, EXx } },
1755   { "xorpX",            { XM, EXx } },
1756   /* 58 */
1757   { PREFIX_TABLE (PREFIX_0F58) },
1758   { PREFIX_TABLE (PREFIX_0F59) },
1759   { PREFIX_TABLE (PREFIX_0F5A) },
1760   { PREFIX_TABLE (PREFIX_0F5B) },
1761   { PREFIX_TABLE (PREFIX_0F5C) },
1762   { PREFIX_TABLE (PREFIX_0F5D) },
1763   { PREFIX_TABLE (PREFIX_0F5E) },
1764   { PREFIX_TABLE (PREFIX_0F5F) },
1765   /* 60 */
1766   { PREFIX_TABLE (PREFIX_0F60) },
1767   { PREFIX_TABLE (PREFIX_0F61) },
1768   { PREFIX_TABLE (PREFIX_0F62) },
1769   { "packsswb",         { MX, EM } },
1770   { "pcmpgtb",          { MX, EM } },
1771   { "pcmpgtw",          { MX, EM } },
1772   { "pcmpgtd",          { MX, EM } },
1773   { "packuswb",         { MX, EM } },
1774   /* 68 */
1775   { "punpckhbw",        { MX, EM } },
1776   { "punpckhwd",        { MX, EM } },
1777   { "punpckhdq",        { MX, EM } },
1778   { "packssdw",         { MX, EM } },
1779   { PREFIX_TABLE (PREFIX_0F6C) },
1780   { PREFIX_TABLE (PREFIX_0F6D) },
1781   { "movK",             { MX, Edq } },
1782   { PREFIX_TABLE (PREFIX_0F6F) },
1783   /* 70 */
1784   { PREFIX_TABLE (PREFIX_0F70) },
1785   { REG_TABLE (REG_0F71) },
1786   { REG_TABLE (REG_0F72) },
1787   { REG_TABLE (REG_0F73) },
1788   { "pcmpeqb",          { MX, EM } },
1789   { "pcmpeqw",          { MX, EM } },
1790   { "pcmpeqd",          { MX, EM } },
1791   { "emms",             { XX } },
1792   /* 78 */
1793   { PREFIX_TABLE (PREFIX_0F78) },
1794   { PREFIX_TABLE (PREFIX_0F79) },
1795   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
1796   { "(bad)",            { XX } },
1797   { PREFIX_TABLE (PREFIX_0F7C) },
1798   { PREFIX_TABLE (PREFIX_0F7D) },
1799   { PREFIX_TABLE (PREFIX_0F7E) },
1800   { PREFIX_TABLE (PREFIX_0F7F) },
1801   /* 80 */
1802   { "joH",              { Jv, XX, cond_jump_flag } },
1803   { "jnoH",             { Jv, XX, cond_jump_flag } },
1804   { "jbH",              { Jv, XX, cond_jump_flag } },
1805   { "jaeH",             { Jv, XX, cond_jump_flag } },
1806   { "jeH",              { Jv, XX, cond_jump_flag } },
1807   { "jneH",             { Jv, XX, cond_jump_flag } },
1808   { "jbeH",             { Jv, XX, cond_jump_flag } },
1809   { "jaH",              { Jv, XX, cond_jump_flag } },
1810   /* 88 */
1811   { "jsH",              { Jv, XX, cond_jump_flag } },
1812   { "jnsH",             { Jv, XX, cond_jump_flag } },
1813   { "jpH",              { Jv, XX, cond_jump_flag } },
1814   { "jnpH",             { Jv, XX, cond_jump_flag } },
1815   { "jlH",              { Jv, XX, cond_jump_flag } },
1816   { "jgeH",             { Jv, XX, cond_jump_flag } },
1817   { "jleH",             { Jv, XX, cond_jump_flag } },
1818   { "jgH",              { Jv, XX, cond_jump_flag } },
1819   /* 90 */
1820   { "seto",             { Eb } },
1821   { "setno",            { Eb } },
1822   { "setb",             { Eb } },
1823   { "setae",            { Eb } },
1824   { "sete",             { Eb } },
1825   { "setne",            { Eb } },
1826   { "setbe",            { Eb } },
1827   { "seta",             { Eb } },
1828   /* 98 */
1829   { "sets",             { Eb } },
1830   { "setns",            { Eb } },
1831   { "setp",             { Eb } },
1832   { "setnp",            { Eb } },
1833   { "setl",             { Eb } },
1834   { "setge",            { Eb } },
1835   { "setle",            { Eb } },
1836   { "setg",             { Eb } },
1837   /* a0 */
1838   { "pushT",            { fs } },
1839   { "popT",             { fs } },
1840   { "cpuid",            { XX } },
1841   { "btS",              { Ev, Gv } },
1842   { "shldS",            { Ev, Gv, Ib } },
1843   { "shldS",            { Ev, Gv, CL } },
1844   { REG_TABLE (REG_0FA6) },
1845   { REG_TABLE (REG_0FA7) },
1846   /* a8 */
1847   { "pushT",            { gs } },
1848   { "popT",             { gs } },
1849   { "rsm",              { XX } },
1850   { "btsS",             { Ev, Gv } },
1851   { "shrdS",            { Ev, Gv, Ib } },
1852   { "shrdS",            { Ev, Gv, CL } },
1853   { REG_TABLE (REG_0FAE) },
1854   { "imulS",            { Gv, Ev } },
1855   /* b0 */
1856   { "cmpxchgB",         { Eb, Gb } },
1857   { "cmpxchgS",         { Ev, Gv } },
1858   { MOD_TABLE (MOD_0FB2) },
1859   { "btrS",             { Ev, Gv } },
1860   { MOD_TABLE (MOD_0FB4) },
1861   { MOD_TABLE (MOD_0FB5) },
1862   { "movz{bR|x}",       { Gv, Eb } },
1863   { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
1864   /* b8 */
1865   { PREFIX_TABLE (PREFIX_0FB8) },
1866   { "ud2b",             { XX } },
1867   { REG_TABLE (REG_0FBA) },
1868   { "btcS",             { Ev, Gv } },
1869   { "bsfS",             { Gv, Ev } },
1870   { PREFIX_TABLE (PREFIX_0FBD) },
1871   { "movs{bR|x}",       { Gv, Eb } },
1872   { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
1873   /* c0 */
1874   { "xaddB",            { Eb, Gb } },
1875   { "xaddS",            { Ev, Gv } },
1876   { PREFIX_TABLE (PREFIX_0FC2) },
1877   { PREFIX_TABLE (PREFIX_0FC3) },
1878   { "pinsrw",           { MX, Edqw, Ib } },
1879   { "pextrw",           { Gdq, MS, Ib } },
1880   { "shufpX",           { XM, EXx, Ib } },
1881   { REG_TABLE (REG_0FC7) },
1882   /* c8 */
1883   { "bswap",            { RMeAX } },
1884   { "bswap",            { RMeCX } },
1885   { "bswap",            { RMeDX } },
1886   { "bswap",            { RMeBX } },
1887   { "bswap",            { RMeSP } },
1888   { "bswap",            { RMeBP } },
1889   { "bswap",            { RMeSI } },
1890   { "bswap",            { RMeDI } },
1891   /* d0 */
1892   { PREFIX_TABLE (PREFIX_0FD0) },
1893   { "psrlw",            { MX, EM } },
1894   { "psrld",            { MX, EM } },
1895   { "psrlq",            { MX, EM } },
1896   { "paddq",            { MX, EM } },
1897   { "pmullw",           { MX, EM } },
1898   { PREFIX_TABLE (PREFIX_0FD6) },
1899   { MOD_TABLE (MOD_0FD7) },
1900   /* d8 */
1901   { "psubusb",          { MX, EM } },
1902   { "psubusw",          { MX, EM } },
1903   { "pminub",           { MX, EM } },
1904   { "pand",             { MX, EM } },
1905   { "paddusb",          { MX, EM } },
1906   { "paddusw",          { MX, EM } },
1907   { "pmaxub",           { MX, EM } },
1908   { "pandn",            { MX, EM } },
1909   /* e0 */
1910   { "pavgb",            { MX, EM } },
1911   { "psraw",            { MX, EM } },
1912   { "psrad",            { MX, EM } },
1913   { "pavgw",            { MX, EM } },
1914   { "pmulhuw",          { MX, EM } },
1915   { "pmulhw",           { MX, EM } },
1916   { PREFIX_TABLE (PREFIX_0FE6) },
1917   { PREFIX_TABLE (PREFIX_0FE7) },
1918   /* e8 */
1919   { "psubsb",           { MX, EM } },
1920   { "psubsw",           { MX, EM } },
1921   { "pminsw",           { MX, EM } },
1922   { "por",              { MX, EM } },
1923   { "paddsb",           { MX, EM } },
1924   { "paddsw",           { MX, EM } },
1925   { "pmaxsw",           { MX, EM } },
1926   { "pxor",             { MX, EM } },
1927   /* f0 */
1928   { PREFIX_TABLE (PREFIX_0FF0) },
1929   { "psllw",            { MX, EM } },
1930   { "pslld",            { MX, EM } },
1931   { "psllq",            { MX, EM } },
1932   { "pmuludq",          { MX, EM } },
1933   { "pmaddwd",          { MX, EM } },
1934   { "psadbw",           { MX, EM } },
1935   { PREFIX_TABLE (PREFIX_0FF7) },
1936   /* f8 */
1937   { "psubb",            { MX, EM } },
1938   { "psubw",            { MX, EM } },
1939   { "psubd",            { MX, EM } },
1940   { "psubq",            { MX, EM } },
1941   { "paddb",            { MX, EM } },
1942   { "paddw",            { MX, EM } },
1943   { "paddd",            { MX, EM } },
1944   { "(bad)",            { XX } },
1945 };
1946
1947 static const unsigned char onebyte_has_modrm[256] = {
1948   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1949   /*       -------------------------------        */
1950   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1951   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1952   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1953   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1954   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1955   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1956   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1957   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1958   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1959   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1960   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1961   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1962   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1963   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1964   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1965   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1966   /*       -------------------------------        */
1967   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1968 };
1969
1970 static const unsigned char twobyte_has_modrm[256] = {
1971   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1972   /*       -------------------------------        */
1973   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1974   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
1975   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1976   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1977   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1978   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1979   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1980   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1981   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1982   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1983   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1984   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1985   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1986   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1987   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1988   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
1989   /*       -------------------------------        */
1990   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1991 };
1992
1993 static char obuf[100];
1994 static char *obufp;
1995 static char *mnemonicendp;
1996 static char scratchbuf[100];
1997 static unsigned char *start_codep;
1998 static unsigned char *insn_codep;
1999 static unsigned char *codep;
2000 static int last_lock_prefix;
2001 static int last_repz_prefix;
2002 static int last_repnz_prefix;
2003 static int last_data_prefix;
2004 static int last_addr_prefix;
2005 static int last_rex_prefix;
2006 static int last_seg_prefix;
2007 #define MAX_CODE_LENGTH 15
2008 /* We can up to 14 prefixes since the maximum instruction length is
2009    15bytes.  */
2010 static int all_prefixes[MAX_CODE_LENGTH - 1];
2011 static disassemble_info *the_info;
2012 static struct
2013   {
2014     int mod;
2015     int reg;
2016     int rm;
2017   }
2018 modrm;
2019 static unsigned char need_modrm;
2020 static struct
2021   {
2022     int register_specifier;
2023     int length;
2024     int prefix;
2025     int w;
2026   }
2027 vex;
2028 static unsigned char need_vex;
2029 static unsigned char need_vex_reg;
2030 static unsigned char vex_w_done;
2031
2032 struct op
2033   {
2034     const char *name;
2035     unsigned int len;
2036   };
2037
2038 /* If we are accessing mod/rm/reg without need_modrm set, then the
2039    values are stale.  Hitting this abort likely indicates that you
2040    need to update onebyte_has_modrm or twobyte_has_modrm.  */
2041 #define MODRM_CHECK  if (!need_modrm) abort ()
2042
2043 static const char **names64;
2044 static const char **names32;
2045 static const char **names16;
2046 static const char **names8;
2047 static const char **names8rex;
2048 static const char **names_seg;
2049 static const char *index64;
2050 static const char *index32;
2051 static const char **index16;
2052
2053 static const char *intel_names64[] = {
2054   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2055   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2056 };
2057 static const char *intel_names32[] = {
2058   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2059   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2060 };
2061 static const char *intel_names16[] = {
2062   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2063   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2064 };
2065 static const char *intel_names8[] = {
2066   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2067 };
2068 static const char *intel_names8rex[] = {
2069   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2070   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2071 };
2072 static const char *intel_names_seg[] = {
2073   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2074 };
2075 static const char *intel_index64 = "riz";
2076 static const char *intel_index32 = "eiz";
2077 static const char *intel_index16[] = {
2078   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2079 };
2080
2081 static const char *att_names64[] = {
2082   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2083   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2084 };
2085 static const char *att_names32[] = {
2086   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2087   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2088 };
2089 static const char *att_names16[] = {
2090   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2091   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2092 };
2093 static const char *att_names8[] = {
2094   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2095 };
2096 static const char *att_names8rex[] = {
2097   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2098   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2099 };
2100 static const char *att_names_seg[] = {
2101   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2102 };
2103 static const char *att_index64 = "%riz";
2104 static const char *att_index32 = "%eiz";
2105 static const char *att_index16[] = {
2106   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2107 };
2108
2109 static const struct dis386 reg_table[][8] = {
2110   /* REG_80 */
2111   {
2112     { "addA",   { Eb, Ib } },
2113     { "orA",    { Eb, Ib } },
2114     { "adcA",   { Eb, Ib } },
2115     { "sbbA",   { Eb, Ib } },
2116     { "andA",   { Eb, Ib } },
2117     { "subA",   { Eb, Ib } },
2118     { "xorA",   { Eb, Ib } },
2119     { "cmpA",   { Eb, Ib } },
2120   },
2121   /* REG_81 */
2122   {
2123     { "addQ",   { Ev, Iv } },
2124     { "orQ",    { Ev, Iv } },
2125     { "adcQ",   { Ev, Iv } },
2126     { "sbbQ",   { Ev, Iv } },
2127     { "andQ",   { Ev, Iv } },
2128     { "subQ",   { Ev, Iv } },
2129     { "xorQ",   { Ev, Iv } },
2130     { "cmpQ",   { Ev, Iv } },
2131   },
2132   /* REG_82 */
2133   {
2134     { "addQ",   { Ev, sIb } },
2135     { "orQ",    { Ev, sIb } },
2136     { "adcQ",   { Ev, sIb } },
2137     { "sbbQ",   { Ev, sIb } },
2138     { "andQ",   { Ev, sIb } },
2139     { "subQ",   { Ev, sIb } },
2140     { "xorQ",   { Ev, sIb } },
2141     { "cmpQ",   { Ev, sIb } },
2142   },
2143   /* REG_8F */
2144   {
2145     { "popU",   { stackEv } },
2146     { XOP_8F_TABLE (XOP_09) },
2147     { "(bad)",  { XX } },
2148     { "(bad)",  { XX } },
2149     { "(bad)",  { XX } },
2150     { XOP_8F_TABLE (XOP_09) },
2151     { "(bad)",  { XX } },
2152     { "(bad)",  { XX } },
2153   },
2154   /* REG_C0 */
2155   {
2156     { "rolA",   { Eb, Ib } },
2157     { "rorA",   { Eb, Ib } },
2158     { "rclA",   { Eb, Ib } },
2159     { "rcrA",   { Eb, Ib } },
2160     { "shlA",   { Eb, Ib } },
2161     { "shrA",   { Eb, Ib } },
2162     { "(bad)",  { XX } },
2163     { "sarA",   { Eb, Ib } },
2164   },
2165   /* REG_C1 */
2166   {
2167     { "rolQ",   { Ev, Ib } },
2168     { "rorQ",   { Ev, Ib } },
2169     { "rclQ",   { Ev, Ib } },
2170     { "rcrQ",   { Ev, Ib } },
2171     { "shlQ",   { Ev, Ib } },
2172     { "shrQ",   { Ev, Ib } },
2173     { "(bad)",  { XX } },
2174     { "sarQ",   { Ev, Ib } },
2175   },
2176   /* REG_C6 */
2177   {
2178     { "movA",   { Eb, Ib } },
2179     { "(bad)",  { XX } },
2180     { "(bad)",  { XX } },
2181     { "(bad)",  { XX } },
2182     { "(bad)",  { XX } },
2183     { "(bad)",  { XX } },
2184     { "(bad)",  { XX } },
2185     { "(bad)",  { XX } },
2186   },
2187   /* REG_C7 */
2188   {
2189     { "movQ",   { Ev, Iv } },
2190     { "(bad)",  { XX } },
2191     { "(bad)",  { XX } },
2192     { "(bad)",  { XX } },
2193     { "(bad)",  { XX } },
2194     { "(bad)",  { XX } },
2195     { "(bad)",  { XX } },
2196     { "(bad)",  { XX } },
2197   },
2198   /* REG_D0 */
2199   {
2200     { "rolA",   { Eb, I1 } },
2201     { "rorA",   { Eb, I1 } },
2202     { "rclA",   { Eb, I1 } },
2203     { "rcrA",   { Eb, I1 } },
2204     { "shlA",   { Eb, I1 } },
2205     { "shrA",   { Eb, I1 } },
2206     { "(bad)",  { XX } },
2207     { "sarA",   { Eb, I1 } },
2208   },
2209   /* REG_D1 */
2210   {
2211     { "rolQ",   { Ev, I1 } },
2212     { "rorQ",   { Ev, I1 } },
2213     { "rclQ",   { Ev, I1 } },
2214     { "rcrQ",   { Ev, I1 } },
2215     { "shlQ",   { Ev, I1 } },
2216     { "shrQ",   { Ev, I1 } },
2217     { "(bad)",  { XX } },
2218     { "sarQ",   { Ev, I1 } },
2219   },
2220   /* REG_D2 */
2221   {
2222     { "rolA",   { Eb, CL } },
2223     { "rorA",   { Eb, CL } },
2224     { "rclA",   { Eb, CL } },
2225     { "rcrA",   { Eb, CL } },
2226     { "shlA",   { Eb, CL } },
2227     { "shrA",   { Eb, CL } },
2228     { "(bad)",  { XX } },
2229     { "sarA",   { Eb, CL } },
2230   },
2231   /* REG_D3 */
2232   {
2233     { "rolQ",   { Ev, CL } },
2234     { "rorQ",   { Ev, CL } },
2235     { "rclQ",   { Ev, CL } },
2236     { "rcrQ",   { Ev, CL } },
2237     { "shlQ",   { Ev, CL } },
2238     { "shrQ",   { Ev, CL } },
2239     { "(bad)",  { XX } },
2240     { "sarQ",   { Ev, CL } },
2241   },
2242   /* REG_F6 */
2243   {
2244     { "testA",  { Eb, Ib } },
2245     { "(bad)",  { XX } },
2246     { "notA",   { Eb } },
2247     { "negA",   { Eb } },
2248     { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
2249     { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
2250     { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
2251     { "idivA",  { Eb } },       /* and idiv for consistency.               */
2252   },
2253   /* REG_F7 */
2254   {
2255     { "testQ",  { Ev, Iv } },
2256     { "(bad)",  { XX } },
2257     { "notQ",   { Ev } },
2258     { "negQ",   { Ev } },
2259     { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
2260     { "imulQ",  { Ev } },
2261     { "divQ",   { Ev } },
2262     { "idivQ",  { Ev } },
2263   },
2264   /* REG_FE */
2265   {
2266     { "incA",   { Eb } },
2267     { "decA",   { Eb } },
2268     { "(bad)",  { XX } },
2269     { "(bad)",  { XX } },
2270     { "(bad)",  { XX } },
2271     { "(bad)",  { XX } },
2272     { "(bad)",  { XX } },
2273     { "(bad)",  { XX } },
2274   },
2275   /* REG_FF */
2276   {
2277     { "incQ",   { Ev } },
2278     { "decQ",   { Ev } },
2279     { "callT",  { indirEv } },
2280     { "JcallT", { indirEp } },
2281     { "jmpT",   { indirEv } },
2282     { "JjmpT",  { indirEp } },
2283     { "pushU",  { stackEv } },
2284     { "(bad)",  { XX } },
2285   },
2286   /* REG_0F00 */
2287   {
2288     { "sldtD",  { Sv } },
2289     { "strD",   { Sv } },
2290     { "lldt",   { Ew } },
2291     { "ltr",    { Ew } },
2292     { "verr",   { Ew } },
2293     { "verw",   { Ew } },
2294     { "(bad)",  { XX } },
2295     { "(bad)",  { XX } },
2296   },
2297   /* REG_0F01 */
2298   {
2299     { MOD_TABLE (MOD_0F01_REG_0) },
2300     { MOD_TABLE (MOD_0F01_REG_1) },
2301     { MOD_TABLE (MOD_0F01_REG_2) },
2302     { MOD_TABLE (MOD_0F01_REG_3) },
2303     { "smswD",  { Sv } },
2304     { "(bad)",  { XX } },
2305     { "lmsw",   { Ew } },
2306     { MOD_TABLE (MOD_0F01_REG_7) },
2307   },
2308   /* REG_0F0D */
2309   {
2310     { "prefetch",       { Eb } },
2311     { "prefetchw",      { Eb } },
2312     { "(bad)",          { XX } },
2313     { "(bad)",          { XX } },
2314     { "(bad)",          { XX } },
2315     { "(bad)",          { XX } },
2316     { "(bad)",          { XX } },
2317     { "(bad)",          { XX } },
2318   },
2319   /* REG_0F18 */
2320   {
2321     { MOD_TABLE (MOD_0F18_REG_0) },
2322     { MOD_TABLE (MOD_0F18_REG_1) },
2323     { MOD_TABLE (MOD_0F18_REG_2) },
2324     { MOD_TABLE (MOD_0F18_REG_3) },
2325     { "(bad)",  { XX } },
2326     { "(bad)",  { XX } },
2327     { "(bad)",  { XX } },
2328     { "(bad)",  { XX } },
2329   },
2330   /* REG_0F71 */
2331   {
2332     { "(bad)",  { XX } },
2333     { "(bad)",  { XX } },
2334     { MOD_TABLE (MOD_0F71_REG_2) },
2335     { "(bad)",  { XX } },
2336     { MOD_TABLE (MOD_0F71_REG_4) },
2337     { "(bad)",  { XX } },
2338     { MOD_TABLE (MOD_0F71_REG_6) },
2339     { "(bad)",  { XX } },
2340   },
2341   /* REG_0F72 */
2342   {
2343     { "(bad)",  { XX } },
2344     { "(bad)",  { XX } },
2345     { MOD_TABLE (MOD_0F72_REG_2) },
2346     { "(bad)",  { XX } },
2347     { MOD_TABLE (MOD_0F72_REG_4) },
2348     { "(bad)",  { XX } },
2349     { MOD_TABLE (MOD_0F72_REG_6) },
2350     { "(bad)",  { XX } },
2351   },
2352   /* REG_0F73 */
2353   {
2354     { "(bad)",  { XX } },
2355     { "(bad)",  { XX } },
2356     { MOD_TABLE (MOD_0F73_REG_2) },
2357     { MOD_TABLE (MOD_0F73_REG_3) },
2358     { "(bad)",  { XX } },
2359     { "(bad)",  { XX } },
2360     { MOD_TABLE (MOD_0F73_REG_6) },
2361     { MOD_TABLE (MOD_0F73_REG_7) },
2362   },
2363   /* REG_0FA6 */
2364   {
2365     { "montmul",        { { OP_0f07, 0 } } },
2366     { "xsha1",          { { OP_0f07, 0 } } },
2367     { "xsha256",        { { OP_0f07, 0 } } },
2368     { "(bad)",          { { OP_0f07, 0 } } },
2369     { "(bad)",          { { OP_0f07, 0 } } },
2370     { "(bad)",          { { OP_0f07, 0 } } },
2371     { "(bad)",          { { OP_0f07, 0 } } },
2372     { "(bad)",          { { OP_0f07, 0 } } },
2373   },
2374   /* REG_0FA7 */
2375   {
2376     { "xstore-rng",     { { OP_0f07, 0 } } },
2377     { "xcrypt-ecb",     { { OP_0f07, 0 } } },
2378     { "xcrypt-cbc",     { { OP_0f07, 0 } } },
2379     { "xcrypt-ctr",     { { OP_0f07, 0 } } },
2380     { "xcrypt-cfb",     { { OP_0f07, 0 } } },
2381     { "xcrypt-ofb",     { { OP_0f07, 0 } } },
2382     { "(bad)",          { { OP_0f07, 0 } } },
2383     { "(bad)",          { { OP_0f07, 0 } } },
2384   },
2385   /* REG_0FAE */
2386   {
2387     { MOD_TABLE (MOD_0FAE_REG_0) },
2388     { MOD_TABLE (MOD_0FAE_REG_1) },
2389     { MOD_TABLE (MOD_0FAE_REG_2) },
2390     { MOD_TABLE (MOD_0FAE_REG_3) },
2391     { MOD_TABLE (MOD_0FAE_REG_4) },
2392     { MOD_TABLE (MOD_0FAE_REG_5) },
2393     { MOD_TABLE (MOD_0FAE_REG_6) },
2394     { MOD_TABLE (MOD_0FAE_REG_7) },
2395   },
2396   /* REG_0FBA */
2397   {
2398     { "(bad)",  { XX } },
2399     { "(bad)",  { XX } },
2400     { "(bad)",  { XX } },
2401     { "(bad)",  { XX } },
2402     { "btQ",    { Ev, Ib } },
2403     { "btsQ",   { Ev, Ib } },
2404     { "btrQ",   { Ev, Ib } },
2405     { "btcQ",   { Ev, Ib } },
2406   },
2407   /* REG_0FC7 */
2408   {
2409     { "(bad)",  { XX } },
2410     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2411     { "(bad)",  { XX } },
2412     { "(bad)",  { XX } },
2413     { "(bad)",  { XX } },
2414     { "(bad)",  { XX } },
2415     { MOD_TABLE (MOD_0FC7_REG_6) },
2416     { MOD_TABLE (MOD_0FC7_REG_7) },
2417   },
2418   /* REG_VEX_71 */
2419   {
2420     { "(bad)",  { XX } },
2421     { "(bad)",  { XX } },
2422     { MOD_TABLE (MOD_VEX_71_REG_2) },
2423     { "(bad)",  { XX } },
2424     { MOD_TABLE (MOD_VEX_71_REG_4) },
2425     { "(bad)",  { XX } },
2426     { MOD_TABLE (MOD_VEX_71_REG_6) },
2427     { "(bad)",  { XX } },
2428   },
2429   /* REG_VEX_72 */
2430   {
2431     { "(bad)",  { XX } },
2432     { "(bad)",  { XX } },
2433     { MOD_TABLE (MOD_VEX_72_REG_2) },
2434     { "(bad)",  { XX } },
2435     { MOD_TABLE (MOD_VEX_72_REG_4) },
2436     { "(bad)",  { XX } },
2437     { MOD_TABLE (MOD_VEX_72_REG_6) },
2438     { "(bad)",  { XX } },
2439   },
2440   /* REG_VEX_73 */
2441   {
2442     { "(bad)",  { XX } },
2443     { "(bad)",  { XX } },
2444     { MOD_TABLE (MOD_VEX_73_REG_2) },
2445     { MOD_TABLE (MOD_VEX_73_REG_3) },
2446     { "(bad)",  { XX } },
2447     { "(bad)",  { XX } },
2448     { MOD_TABLE (MOD_VEX_73_REG_6) },
2449     { MOD_TABLE (MOD_VEX_73_REG_7) },
2450   },
2451   /* REG_VEX_AE */
2452   {
2453     { "(bad)",  { XX } },
2454     { "(bad)",  { XX } },
2455     { MOD_TABLE (MOD_VEX_AE_REG_2) },
2456     { MOD_TABLE (MOD_VEX_AE_REG_3) },
2457     { "(bad)",  { XX } },
2458     { "(bad)",  { XX } },
2459     { "(bad)",  { XX } },
2460     { "(bad)",  { XX } },
2461   },
2462   /* REG_XOP_LWPCB */
2463   {
2464     { "llwpcb", { { OP_LWPCB_E, 0 } } },
2465     { "slwpcb", { { OP_LWPCB_E, 0 } } },
2466     { "(bad)",  { XX } },
2467     { "(bad)",  { XX } },
2468     { "(bad)",  { XX } },
2469     { "(bad)",  { XX } },
2470     { "(bad)",  { XX } },
2471     { "(bad)",  { XX } },
2472   },
2473   /* REG_XOP_LWP */
2474   {
2475     { "lwpins", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2476     { "lwpval", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2477     { "(bad)",  { XX } },
2478     { "(bad)",  { XX } },
2479     { "(bad)",  { XX } },
2480     { "(bad)",  { XX } },
2481     { "(bad)",  { XX } },
2482     { "(bad)",  { XX } },
2483   },
2484 };
2485
2486 static const struct dis386 prefix_table[][4] = {
2487   /* PREFIX_90 */
2488   {
2489     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2490     { "pause", { XX } },
2491     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2492     { "(bad)", { XX } },
2493   },
2494
2495   /* PREFIX_0F10 */
2496   {
2497     { "movups", { XM, EXx } },
2498     { "movss",  { XM, EXd } },
2499     { "movupd", { XM, EXx } },
2500     { "movsd",  { XM, EXq } },
2501   },
2502
2503   /* PREFIX_0F11 */
2504   {
2505     { "movups", { EXxS, XM } },
2506     { "movss",  { EXdS, XM } },
2507     { "movupd", { EXxS, XM } },
2508     { "movsd",  { EXqS, XM } },
2509   },
2510
2511   /* PREFIX_0F12 */
2512   {
2513     { MOD_TABLE (MOD_0F12_PREFIX_0) },
2514     { "movsldup", { XM, EXx } },
2515     { "movlpd", { XM, EXq } },
2516     { "movddup", { XM, EXq } },
2517   },
2518
2519   /* PREFIX_0F16 */
2520   {
2521     { MOD_TABLE (MOD_0F16_PREFIX_0) },
2522     { "movshdup", { XM, EXx } },
2523     { "movhpd", { XM, EXq } },
2524     { "(bad)",  { XX } },
2525   },
2526
2527   /* PREFIX_0F2A */
2528   {
2529     { "cvtpi2ps", { XM, EMCq } },
2530     { "cvtsi2ss%LQ", { XM, Ev } },
2531     { "cvtpi2pd", { XM, EMCq } },
2532     { "cvtsi2sd%LQ", { XM, Ev } },
2533   },
2534
2535   /* PREFIX_0F2B */
2536   {
2537     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2538     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2539     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2540     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2541   },
2542
2543   /* PREFIX_0F2C */
2544   {
2545     { "cvttps2pi", { MXC, EXq } },
2546     { "cvttss2siY", { Gv, EXd } },
2547     { "cvttpd2pi", { MXC, EXx } },
2548     { "cvttsd2siY", { Gv, EXq } },
2549   },
2550
2551   /* PREFIX_0F2D */
2552   {
2553     { "cvtps2pi", { MXC, EXq } },
2554     { "cvtss2siY", { Gv, EXd } },
2555     { "cvtpd2pi", { MXC, EXx } },
2556     { "cvtsd2siY", { Gv, EXq } },
2557   },
2558
2559   /* PREFIX_0F2E */
2560   {
2561     { "ucomiss",{ XM, EXd } }, 
2562     { "(bad)",  { XX } },
2563     { "ucomisd",{ XM, EXq } }, 
2564     { "(bad)",  { XX } },
2565   },
2566
2567   /* PREFIX_0F2F */
2568   {
2569     { "comiss", { XM, EXd } },
2570     { "(bad)",  { XX } },
2571     { "comisd", { XM, EXq } },
2572     { "(bad)",  { XX } },
2573   },
2574
2575   /* PREFIX_0F51 */
2576   {
2577     { "sqrtps", { XM, EXx } },
2578     { "sqrtss", { XM, EXd } },
2579     { "sqrtpd", { XM, EXx } },
2580     { "sqrtsd", { XM, EXq } },
2581   },
2582
2583   /* PREFIX_0F52 */
2584   {
2585     { "rsqrtps",{ XM, EXx } },
2586     { "rsqrtss",{ XM, EXd } },
2587     { "(bad)",  { XX } },
2588     { "(bad)",  { XX } },
2589   },
2590
2591   /* PREFIX_0F53 */
2592   {
2593     { "rcpps",  { XM, EXx } },
2594     { "rcpss",  { XM, EXd } },
2595     { "(bad)",  { XX } },
2596     { "(bad)",  { XX } },
2597   },
2598
2599   /* PREFIX_0F58 */
2600   {
2601     { "addps", { XM, EXx } },
2602     { "addss", { XM, EXd } },
2603     { "addpd", { XM, EXx } },
2604     { "addsd", { XM, EXq } },
2605   },
2606
2607   /* PREFIX_0F59 */
2608   {
2609     { "mulps",  { XM, EXx } },
2610     { "mulss",  { XM, EXd } },
2611     { "mulpd",  { XM, EXx } },
2612     { "mulsd",  { XM, EXq } },
2613   },
2614
2615   /* PREFIX_0F5A */
2616   {
2617     { "cvtps2pd", { XM, EXq } },
2618     { "cvtss2sd", { XM, EXd } },
2619     { "cvtpd2ps", { XM, EXx } },
2620     { "cvtsd2ss", { XM, EXq } },
2621   },
2622
2623   /* PREFIX_0F5B */
2624   {
2625     { "cvtdq2ps", { XM, EXx } },
2626     { "cvttps2dq", { XM, EXx } },
2627     { "cvtps2dq", { XM, EXx } },
2628     { "(bad)",  { XX } },
2629   },
2630
2631   /* PREFIX_0F5C */
2632   {
2633     { "subps",  { XM, EXx } },
2634     { "subss",  { XM, EXd } },
2635     { "subpd",  { XM, EXx } },
2636     { "subsd",  { XM, EXq } },
2637   },
2638
2639   /* PREFIX_0F5D */
2640   {
2641     { "minps",  { XM, EXx } },
2642     { "minss",  { XM, EXd } },
2643     { "minpd",  { XM, EXx } },
2644     { "minsd",  { XM, EXq } },
2645   },
2646
2647   /* PREFIX_0F5E */
2648   {
2649     { "divps",  { XM, EXx } },
2650     { "divss",  { XM, EXd } },
2651     { "divpd",  { XM, EXx } },
2652     { "divsd",  { XM, EXq } },
2653   },
2654
2655   /* PREFIX_0F5F */
2656   {
2657     { "maxps",  { XM, EXx } },
2658     { "maxss",  { XM, EXd } },
2659     { "maxpd",  { XM, EXx } },
2660     { "maxsd",  { XM, EXq } },
2661   },
2662
2663   /* PREFIX_0F60 */
2664   {
2665     { "punpcklbw",{ MX, EMd } },
2666     { "(bad)",  { XX } },
2667     { "punpcklbw",{ MX, EMx } },
2668     { "(bad)",  { XX } },
2669   },
2670
2671   /* PREFIX_0F61 */
2672   {
2673     { "punpcklwd",{ MX, EMd } },
2674     { "(bad)",  { XX } },
2675     { "punpcklwd",{ MX, EMx } },
2676     { "(bad)",  { XX } },
2677   },
2678
2679   /* PREFIX_0F62 */
2680   {
2681     { "punpckldq",{ MX, EMd } },
2682     { "(bad)",  { XX } },
2683     { "punpckldq",{ MX, EMx } },
2684     { "(bad)",  { XX } },
2685   },
2686
2687   /* PREFIX_0F6C */
2688   {
2689     { "(bad)",  { XX } },
2690     { "(bad)",  { XX } },
2691     { "punpcklqdq", { XM, EXx } },
2692     { "(bad)",  { XX } },
2693   },
2694
2695   /* PREFIX_0F6D */
2696   {
2697     { "(bad)",  { XX } },
2698     { "(bad)",  { XX } },
2699     { "punpckhqdq", { XM, EXx } },
2700     { "(bad)",  { XX } },
2701   },
2702
2703   /* PREFIX_0F6F */
2704   {
2705     { "movq",   { MX, EM } },
2706     { "movdqu", { XM, EXx } },
2707     { "movdqa", { XM, EXx } },
2708     { "(bad)",  { XX } },
2709   },
2710
2711   /* PREFIX_0F70 */
2712   {
2713     { "pshufw", { MX, EM, Ib } },
2714     { "pshufhw",{ XM, EXx, Ib } },
2715     { "pshufd", { XM, EXx, Ib } },
2716     { "pshuflw",{ XM, EXx, Ib } },
2717   },
2718
2719   /* PREFIX_0F73_REG_3 */
2720   {
2721     { "(bad)",  { XX } },
2722     { "(bad)",  { XX } },
2723     { "psrldq", { XS, Ib } },
2724     { "(bad)",  { XX } },
2725   },
2726
2727   /* PREFIX_0F73_REG_7 */
2728   {
2729     { "(bad)",  { XX } },
2730     { "(bad)",  { XX } },
2731     { "pslldq", { XS, Ib } },
2732     { "(bad)",  { XX } },
2733   },
2734
2735   /* PREFIX_0F78 */
2736   {
2737     {"vmread",  { Em, Gm } },
2738     {"(bad)",   { XX } },
2739     {"extrq",   { XS, Ib, Ib } },
2740     {"insertq", { XM, XS, Ib, Ib } },
2741   },
2742
2743   /* PREFIX_0F79 */
2744   {
2745     {"vmwrite", { Gm, Em } },
2746     {"(bad)",   { XX } },
2747     {"extrq",   { XM, XS } },
2748     {"insertq", { XM, XS } },
2749   },
2750
2751   /* PREFIX_0F7C */
2752   {
2753     { "(bad)",  { XX } },
2754     { "(bad)",  { XX } },
2755     { "haddpd", { XM, EXx } },
2756     { "haddps", { XM, EXx } },
2757   },
2758
2759   /* PREFIX_0F7D */
2760   {
2761     { "(bad)",  { XX } },
2762     { "(bad)",  { XX } },
2763     { "hsubpd", { XM, EXx } },
2764     { "hsubps", { XM, EXx } },
2765   },
2766
2767   /* PREFIX_0F7E */
2768   {
2769     { "movK",   { Edq, MX } },
2770     { "movq",   { XM, EXq } },
2771     { "movK",   { Edq, XM } },
2772     { "(bad)",  { XX } },
2773   },
2774
2775   /* PREFIX_0F7F */
2776   {
2777     { "movq",   { EMS, MX } },
2778     { "movdqu", { EXxS, XM } },
2779     { "movdqa", { EXxS, XM } },
2780     { "(bad)",  { XX } },
2781   },
2782
2783   /* PREFIX_0FB8 */
2784   {
2785     { "(bad)", { XX } },
2786     { "popcntS", { Gv, Ev } },
2787     { "(bad)", { XX } },
2788     { "(bad)", { XX } },
2789   },
2790
2791   /* PREFIX_0FBD */
2792   {
2793     { "bsrS",   { Gv, Ev } },
2794     { "lzcntS", { Gv, Ev } },
2795     { "bsrS",   { Gv, Ev } },
2796     { "(bad)",  { XX } },
2797   },
2798
2799   /* PREFIX_0FC2 */
2800   {
2801     { "cmpps",  { XM, EXx, CMP } },
2802     { "cmpss",  { XM, EXd, CMP } },
2803     { "cmppd",  { XM, EXx, CMP } },
2804     { "cmpsd",  { XM, EXq, CMP } },
2805   },
2806
2807   /* PREFIX_0FC3 */
2808   {
2809     { "movntiS", { Ma, Gv } },
2810     { "(bad)",  { XX } },
2811     { "(bad)",  { XX } },
2812     { "(bad)",  { XX } },
2813   },
2814
2815   /* PREFIX_0FC7_REG_6 */
2816   {
2817     { "vmptrld",{ Mq } },
2818     { "vmxon",  { Mq } },
2819     { "vmclear",{ Mq } },
2820     { "(bad)",  { XX } },
2821   },
2822
2823   /* PREFIX_0FD0 */
2824   {
2825     { "(bad)",  { XX } },
2826     { "(bad)",  { XX } },
2827     { "addsubpd", { XM, EXx } },
2828     { "addsubps", { XM, EXx } },
2829   },
2830
2831   /* PREFIX_0FD6 */
2832   {
2833     { "(bad)",  { XX } },
2834     { "movq2dq",{ XM, MS } },
2835     { "movq",   { EXqS, XM } },
2836     { "movdq2q",{ MX, XS } },
2837   },
2838
2839   /* PREFIX_0FE6 */
2840   {
2841     { "(bad)",  { XX } },
2842     { "cvtdq2pd", { XM, EXq } },
2843     { "cvttpd2dq", { XM, EXx } },
2844     { "cvtpd2dq", { XM, EXx } },
2845   },
2846
2847   /* PREFIX_0FE7 */
2848   {
2849     { "movntq", { Mq, MX } },
2850     { "(bad)",  { XX } },
2851     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
2852     { "(bad)",  { XX } },
2853   },
2854
2855   /* PREFIX_0FF0 */
2856   {
2857     { "(bad)",  { XX } },
2858     { "(bad)",  { XX } },
2859     { "(bad)",  { XX } },
2860     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
2861   },
2862
2863   /* PREFIX_0FF7 */
2864   {
2865     { "maskmovq", { MX, MS } },
2866     { "(bad)",  { XX } },
2867     { "maskmovdqu", { XM, XS } },
2868     { "(bad)",  { XX } },
2869   },
2870
2871   /* PREFIX_0F3810 */
2872   {
2873     { "(bad)",  { XX } },
2874     { "(bad)",  { XX } },
2875     { "pblendvb", { XM, EXx, XMM0 } },
2876     { "(bad)",  { XX } },
2877   },
2878
2879   /* PREFIX_0F3814 */
2880   {
2881     { "(bad)",  { XX } },
2882     { "(bad)",  { XX } },
2883     { "blendvps", { XM, EXx, XMM0 } },
2884     { "(bad)",  { XX } },
2885   },
2886
2887   /* PREFIX_0F3815 */
2888   {
2889     { "(bad)",  { XX } },
2890     { "(bad)",  { XX } },
2891     { "blendvpd", { XM, EXx, XMM0 } },
2892     { "(bad)",  { XX } },
2893   },
2894
2895   /* PREFIX_0F3817 */
2896   {
2897     { "(bad)",  { XX } },
2898     { "(bad)",  { XX } },
2899     { "ptest",  { XM, EXx } },
2900     { "(bad)",  { XX } },
2901   },
2902
2903   /* PREFIX_0F3820 */
2904   {
2905     { "(bad)",  { XX } },
2906     { "(bad)",  { XX } },
2907     { "pmovsxbw", { XM, EXq } },
2908     { "(bad)",  { XX } },
2909   },
2910
2911   /* PREFIX_0F3821 */
2912   {
2913     { "(bad)",  { XX } },
2914     { "(bad)",  { XX } },
2915     { "pmovsxbd", { XM, EXd } },
2916     { "(bad)",  { XX } },
2917   },
2918
2919   /* PREFIX_0F3822 */
2920   {
2921     { "(bad)",  { XX } },
2922     { "(bad)",  { XX } },
2923     { "pmovsxbq", { XM, EXw } },
2924     { "(bad)",  { XX } },
2925   },
2926
2927   /* PREFIX_0F3823 */
2928   {
2929     { "(bad)",  { XX } },
2930     { "(bad)",  { XX } },
2931     { "pmovsxwd", { XM, EXq } },
2932     { "(bad)",  { XX } },
2933   },
2934
2935   /* PREFIX_0F3824 */
2936   {
2937     { "(bad)",  { XX } },
2938     { "(bad)",  { XX } },
2939     { "pmovsxwq", { XM, EXd } },
2940     { "(bad)",  { XX } },
2941   },
2942
2943   /* PREFIX_0F3825 */
2944   {
2945     { "(bad)",  { XX } },
2946     { "(bad)",  { XX } },
2947     { "pmovsxdq", { XM, EXq } },
2948     { "(bad)",  { XX } },
2949   },
2950
2951   /* PREFIX_0F3828 */
2952   {
2953     { "(bad)",  { XX } },
2954     { "(bad)",  { XX } },
2955     { "pmuldq", { XM, EXx } },
2956     { "(bad)",  { XX } },
2957   },
2958
2959   /* PREFIX_0F3829 */
2960   {
2961     { "(bad)",  { XX } },
2962     { "(bad)",  { XX } },
2963     { "pcmpeqq", { XM, EXx } },
2964     { "(bad)",  { XX } },
2965   },
2966
2967   /* PREFIX_0F382A */
2968   {
2969     { "(bad)",  { XX } },
2970     { "(bad)",  { XX } },
2971     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
2972     { "(bad)",  { XX } },
2973   },
2974
2975   /* PREFIX_0F382B */
2976   {
2977     { "(bad)",  { XX } },
2978     { "(bad)",  { XX } },
2979     { "packusdw", { XM, EXx } },
2980     { "(bad)",  { XX } },
2981   },
2982
2983   /* PREFIX_0F3830 */
2984   {
2985     { "(bad)",  { XX } },
2986     { "(bad)",  { XX } },
2987     { "pmovzxbw", { XM, EXq } },
2988     { "(bad)",  { XX } },
2989   },
2990
2991   /* PREFIX_0F3831 */
2992   {
2993     { "(bad)",  { XX } },
2994     { "(bad)",  { XX } },
2995     { "pmovzxbd", { XM, EXd } },
2996     { "(bad)",  { XX } },
2997   },
2998
2999   /* PREFIX_0F3832 */
3000   {
3001     { "(bad)",  { XX } },
3002     { "(bad)",  { XX } },
3003     { "pmovzxbq", { XM, EXw } },
3004     { "(bad)",  { XX } },
3005   },
3006
3007   /* PREFIX_0F3833 */
3008   {
3009     { "(bad)",  { XX } },
3010     { "(bad)",  { XX } },
3011     { "pmovzxwd", { XM, EXq } },
3012     { "(bad)",  { XX } },
3013   },
3014
3015   /* PREFIX_0F3834 */
3016   {
3017     { "(bad)",  { XX } },
3018     { "(bad)",  { XX } },
3019     { "pmovzxwq", { XM, EXd } },
3020     { "(bad)",  { XX } },
3021   },
3022
3023   /* PREFIX_0F3835 */
3024   {
3025     { "(bad)",  { XX } },
3026     { "(bad)",  { XX } },
3027     { "pmovzxdq", { XM, EXq } },
3028     { "(bad)",  { XX } },
3029   },
3030
3031   /* PREFIX_0F3837 */
3032   {
3033     { "(bad)",  { XX } },
3034     { "(bad)",  { XX } },
3035     { "pcmpgtq", { XM, EXx } },
3036     { "(bad)",  { XX } },
3037   },
3038
3039   /* PREFIX_0F3838 */
3040   {
3041     { "(bad)",  { XX } },
3042     { "(bad)",  { XX } },
3043     { "pminsb", { XM, EXx } },
3044     { "(bad)",  { XX } },
3045   },
3046
3047   /* PREFIX_0F3839 */
3048   {
3049     { "(bad)",  { XX } },
3050     { "(bad)",  { XX } },
3051     { "pminsd", { XM, EXx } },
3052     { "(bad)",  { XX } },
3053   },
3054
3055   /* PREFIX_0F383A */
3056   {
3057     { "(bad)",  { XX } },
3058     { "(bad)",  { XX } },
3059     { "pminuw", { XM, EXx } },
3060     { "(bad)",  { XX } },
3061   },
3062
3063   /* PREFIX_0F383B */
3064   {
3065     { "(bad)",  { XX } },
3066     { "(bad)",  { XX } },
3067     { "pminud", { XM, EXx } },
3068     { "(bad)",  { XX } },
3069   },
3070
3071   /* PREFIX_0F383C */
3072   {
3073     { "(bad)",  { XX } },
3074     { "(bad)",  { XX } },
3075     { "pmaxsb", { XM, EXx } },
3076     { "(bad)",  { XX } },
3077   },
3078
3079   /* PREFIX_0F383D */
3080   {
3081     { "(bad)",  { XX } },
3082     { "(bad)",  { XX } },
3083     { "pmaxsd", { XM, EXx } },
3084     { "(bad)",  { XX } },
3085   },
3086
3087   /* PREFIX_0F383E */
3088   {
3089     { "(bad)",  { XX } },
3090     { "(bad)",  { XX } },
3091     { "pmaxuw", { XM, EXx } },
3092     { "(bad)",  { XX } },
3093   },
3094
3095   /* PREFIX_0F383F */
3096   {
3097     { "(bad)",  { XX } },
3098     { "(bad)",  { XX } },
3099     { "pmaxud", { XM, EXx } },
3100     { "(bad)",  { XX } },
3101   },
3102
3103   /* PREFIX_0F3840 */
3104   {
3105     { "(bad)",  { XX } },
3106     { "(bad)",  { XX } },
3107     { "pmulld", { XM, EXx } },
3108     { "(bad)",  { XX } },
3109   },
3110
3111   /* PREFIX_0F3841 */
3112   {
3113     { "(bad)",  { XX } },
3114     { "(bad)",  { XX } },
3115     { "phminposuw", { XM, EXx } },
3116     { "(bad)",  { XX } },
3117   },
3118
3119   /* PREFIX_0F3880 */
3120   {
3121     { "(bad)",  { XX } },
3122     { "(bad)",  { XX } },
3123     { "invept", { Gm, Mo } },
3124     { "(bad)",  { XX } },
3125   },
3126
3127   /* PREFIX_0F3881 */
3128   {
3129     { "(bad)",  { XX } },
3130     { "(bad)",  { XX } },
3131     { "invvpid", { Gm, Mo } },
3132     { "(bad)",  { XX } },
3133   },
3134
3135   /* PREFIX_0F38DB */
3136   {
3137     { "(bad)",  { XX } },
3138     { "(bad)",  { XX } },
3139     { "aesimc", { XM, EXx } },
3140     { "(bad)",  { XX } },
3141   },
3142
3143   /* PREFIX_0F38DC */
3144   {
3145     { "(bad)",  { XX } },
3146     { "(bad)",  { XX } },
3147     { "aesenc", { XM, EXx } },
3148     { "(bad)",  { XX } },
3149   },
3150
3151   /* PREFIX_0F38DD */
3152   {
3153     { "(bad)",  { XX } },
3154     { "(bad)",  { XX } },
3155     { "aesenclast", { XM, EXx } },
3156     { "(bad)",  { XX } },
3157   },
3158
3159   /* PREFIX_0F38DE */
3160   {
3161     { "(bad)",  { XX } },
3162     { "(bad)",  { XX } },
3163     { "aesdec", { XM, EXx } },
3164     { "(bad)",  { XX } },
3165   },
3166
3167   /* PREFIX_0F38DF */
3168   {
3169     { "(bad)",  { XX } },
3170     { "(bad)",  { XX } },
3171     { "aesdeclast", { XM, EXx } },
3172     { "(bad)",  { XX } },
3173   },
3174
3175   /* PREFIX_0F38F0 */
3176   {
3177     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3178     { "(bad)",  { XX } },
3179     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3180     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },     
3181   },
3182
3183   /* PREFIX_0F38F1 */
3184   {
3185     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3186     { "(bad)",  { XX } },
3187     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3188     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },     
3189   },
3190
3191   /* PREFIX_0F3A08 */
3192   {
3193     { "(bad)",  { XX } },
3194     { "(bad)",  { XX } },
3195     { "roundps", { XM, EXx, Ib } },
3196     { "(bad)",  { XX } },
3197   },
3198
3199   /* PREFIX_0F3A09 */
3200   {
3201     { "(bad)",  { XX } },
3202     { "(bad)",  { XX } },
3203     { "roundpd", { XM, EXx, Ib } },
3204     { "(bad)",  { XX } },
3205   },
3206
3207   /* PREFIX_0F3A0A */
3208   {
3209     { "(bad)",  { XX } },
3210     { "(bad)",  { XX } },
3211     { "roundss", { XM, EXd, Ib } },
3212     { "(bad)",  { XX } },
3213   },
3214
3215   /* PREFIX_0F3A0B */
3216   {
3217     { "(bad)",  { XX } },
3218     { "(bad)",  { XX } },
3219     { "roundsd", { XM, EXq, Ib } },
3220     { "(bad)",  { XX } },
3221   },
3222
3223   /* PREFIX_0F3A0C */
3224   {
3225     { "(bad)",  { XX } },
3226     { "(bad)",  { XX } },
3227     { "blendps", { XM, EXx, Ib } },
3228     { "(bad)",  { XX } },
3229   },
3230
3231   /* PREFIX_0F3A0D */
3232   {
3233     { "(bad)",  { XX } },
3234     { "(bad)",  { XX } },
3235     { "blendpd", { XM, EXx, Ib } },
3236     { "(bad)",  { XX } },
3237   },
3238
3239   /* PREFIX_0F3A0E */
3240   {
3241     { "(bad)",  { XX } },
3242     { "(bad)",  { XX } },
3243     { "pblendw", { XM, EXx, Ib } },
3244     { "(bad)",  { XX } },
3245   },
3246
3247   /* PREFIX_0F3A14 */
3248   {
3249     { "(bad)",  { XX } },
3250     { "(bad)",  { XX } },
3251     { "pextrb", { Edqb, XM, Ib } },
3252     { "(bad)",  { XX } },
3253   },
3254
3255   /* PREFIX_0F3A15 */
3256   {
3257     { "(bad)",  { XX } },
3258     { "(bad)",  { XX } },
3259     { "pextrw", { Edqw, XM, Ib } },
3260     { "(bad)",  { XX } },
3261   },
3262
3263   /* PREFIX_0F3A16 */
3264   {
3265     { "(bad)",  { XX } },
3266     { "(bad)",  { XX } },
3267     { "pextrK", { Edq, XM, Ib } },
3268     { "(bad)",  { XX } },
3269   },
3270
3271   /* PREFIX_0F3A17 */
3272   {
3273     { "(bad)",  { XX } },
3274     { "(bad)",  { XX } },
3275     { "extractps", { Edqd, XM, Ib } },
3276     { "(bad)",  { XX } },
3277   },
3278
3279   /* PREFIX_0F3A20 */
3280   {
3281     { "(bad)",  { XX } },
3282     { "(bad)",  { XX } },
3283     { "pinsrb", { XM, Edqb, Ib } },
3284     { "(bad)",  { XX } },
3285   },
3286
3287   /* PREFIX_0F3A21 */
3288   {
3289     { "(bad)",  { XX } },
3290     { "(bad)",  { XX } },
3291     { "insertps", { XM, EXd, Ib } },
3292     { "(bad)",  { XX } },
3293   },
3294
3295   /* PREFIX_0F3A22 */
3296   {
3297     { "(bad)",  { XX } },
3298     { "(bad)",  { XX } },
3299     { "pinsrK", { XM, Edq, Ib } },
3300     { "(bad)",  { XX } },
3301   },
3302
3303   /* PREFIX_0F3A40 */
3304   {
3305     { "(bad)",  { XX } },
3306     { "(bad)",  { XX } },
3307     { "dpps",   { XM, EXx, Ib } },
3308     { "(bad)",  { XX } },
3309   },
3310
3311   /* PREFIX_0F3A41 */
3312   {
3313     { "(bad)",  { XX } },
3314     { "(bad)",  { XX } },
3315     { "dppd",   { XM, EXx, Ib } },
3316     { "(bad)",  { XX } },
3317   },
3318
3319   /* PREFIX_0F3A42 */
3320   {
3321     { "(bad)",  { XX } },
3322     { "(bad)",  { XX } },
3323     { "mpsadbw", { XM, EXx, Ib } },
3324     { "(bad)",  { XX } },
3325   },
3326
3327   /* PREFIX_0F3A44 */
3328   {
3329     { "(bad)",  { XX } },
3330     { "(bad)",  { XX } },
3331     { "pclmulqdq", { XM, EXx, PCLMUL } },
3332     { "(bad)",  { XX } },
3333   },
3334
3335   /* PREFIX_0F3A60 */
3336   {
3337     { "(bad)",  { XX } },
3338     { "(bad)",  { XX } },
3339     { "pcmpestrm", { XM, EXx, Ib } },
3340     { "(bad)",  { XX } },
3341   },
3342
3343   /* PREFIX_0F3A61 */
3344   {
3345     { "(bad)",  { XX } },
3346     { "(bad)",  { XX } },
3347     { "pcmpestri", { XM, EXx, Ib } },
3348     { "(bad)",  { XX } },
3349   },
3350
3351   /* PREFIX_0F3A62 */
3352   {
3353     { "(bad)",  { XX } },
3354     { "(bad)",  { XX } },
3355     { "pcmpistrm", { XM, EXx, Ib } },
3356     { "(bad)",  { XX } },
3357   },
3358
3359   /* PREFIX_0F3A63 */
3360   {
3361     { "(bad)",  { XX } },
3362     { "(bad)",  { XX } },
3363     { "pcmpistri", { XM, EXx, Ib } },
3364     { "(bad)",  { XX } },
3365   },
3366
3367   /* PREFIX_0F3ADF */
3368   {
3369     { "(bad)",  { XX } },
3370     { "(bad)",  { XX } },
3371     { "aeskeygenassist", { XM, EXx, Ib } },
3372     { "(bad)",  { XX } },
3373   },
3374
3375   /* PREFIX_VEX_10 */
3376   {
3377     { "vmovups", { XM, EXx } },
3378     { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3379     { "vmovupd", { XM, EXx } },
3380     { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3381   },
3382
3383   /* PREFIX_VEX_11 */
3384   {
3385     { "vmovups", { EXxS, XM } },
3386     { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3387     { "vmovupd", { EXxS, XM } },
3388     { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3389   },
3390
3391   /* PREFIX_VEX_12 */
3392   {
3393     { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3394     { "vmovsldup", { XM, EXx } },
3395     { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3396     { "vmovddup", { XM, EXymmq } },
3397   },
3398
3399   /* PREFIX_VEX_16 */
3400   {
3401     { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3402     { "vmovshdup", { XM, EXx } },
3403     { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3404     { "(bad)",  { XX } },
3405   },
3406
3407   /* PREFIX_VEX_2A */
3408   {
3409     { "(bad)",  { XX } },
3410     { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3411     { "(bad)",  { XX } },
3412     { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3413   },
3414
3415   /* PREFIX_VEX_2C */
3416   {
3417     { "(bad)",  { XX } },
3418     { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3419     { "(bad)",  { XX } },
3420     { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3421   },
3422
3423   /* PREFIX_VEX_2D */
3424   {
3425     { "(bad)",  { XX } },
3426     { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3427     { "(bad)",  { XX } },
3428     { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3429   },
3430
3431   /* PREFIX_VEX_2E */
3432   {
3433     { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3434     { "(bad)",  { XX } },
3435     { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3436     { "(bad)",  { XX } },
3437   },
3438
3439   /* PREFIX_VEX_2F */
3440   {
3441     { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3442     { "(bad)",  { XX } },
3443     { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3444     { "(bad)",  { XX } },
3445   },
3446
3447   /* PREFIX_VEX_51 */
3448   {
3449     { "vsqrtps", { XM, EXx } },
3450     { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3451     { "vsqrtpd", { XM, EXx } },
3452     { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3453   },
3454
3455   /* PREFIX_VEX_52 */
3456   {
3457     { "vrsqrtps", { XM, EXx } },
3458     { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3459     { "(bad)",  { XX } },
3460     { "(bad)",  { XX } },
3461   },
3462
3463   /* PREFIX_VEX_53 */
3464   {
3465     { "vrcpps", { XM, EXx } },
3466     { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3467     { "(bad)",  { XX } },
3468     { "(bad)",  { XX } },
3469   },
3470
3471   /* PREFIX_VEX_58 */
3472   {
3473     { "vaddps", { XM, Vex, EXx } },
3474     { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3475     { "vaddpd", { XM, Vex, EXx } },
3476     { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3477   },
3478
3479   /* PREFIX_VEX_59 */
3480   {
3481     { "vmulps", { XM, Vex, EXx } },
3482     { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3483     { "vmulpd", { XM, Vex, EXx } },
3484     { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3485   },
3486
3487   /* PREFIX_VEX_5A */
3488   {
3489     { "vcvtps2pd", { XM, EXxmmq } },
3490     { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3491     { "vcvtpd2ps%XY", { XMM, EXx } },
3492     { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3493   },
3494
3495   /* PREFIX_VEX_5B */
3496   {
3497     { "vcvtdq2ps", { XM, EXx } },
3498     { "vcvttps2dq", { XM, EXx } },
3499     { "vcvtps2dq", { XM, EXx } },
3500     { "(bad)",  { XX } },
3501   },
3502
3503   /* PREFIX_VEX_5C */
3504   {
3505     { "vsubps", { XM, Vex, EXx } },
3506     { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3507     { "vsubpd", { XM, Vex, EXx } },
3508     { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3509   },
3510
3511   /* PREFIX_VEX_5D */
3512   {
3513     { "vminps", { XM, Vex, EXx } },
3514     { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3515     { "vminpd", { XM, Vex, EXx } },
3516     { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3517   },
3518
3519   /* PREFIX_VEX_5E */
3520   {
3521     { "vdivps", { XM, Vex, EXx } },
3522     { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3523     { "vdivpd", { XM, Vex, EXx } },
3524     { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3525   },
3526
3527   /* PREFIX_VEX_5F */
3528   {
3529     { "vmaxps", { XM, Vex, EXx } },
3530     { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3531     { "vmaxpd", { XM, Vex, EXx } },
3532     { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3533   },
3534
3535   /* PREFIX_VEX_60 */
3536   {
3537     { "(bad)",  { XX } },
3538     { "(bad)",  { XX } },
3539     { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3540     { "(bad)",  { XX } },
3541   },
3542
3543   /* PREFIX_VEX_61 */
3544   {
3545     { "(bad)",  { XX } },
3546     { "(bad)",  { XX } },
3547     { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3548     { "(bad)",  { XX } },
3549   },
3550
3551   /* PREFIX_VEX_62 */
3552   {
3553     { "(bad)",  { XX } },
3554     { "(bad)",  { XX } },
3555     { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3556     { "(bad)",  { XX } },
3557   },
3558
3559   /* PREFIX_VEX_63 */
3560   {
3561     { "(bad)",  { XX } },
3562     { "(bad)",  { XX } },
3563     { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3564     { "(bad)",  { XX } },
3565   },
3566
3567   /* PREFIX_VEX_64 */
3568   {
3569     { "(bad)",  { XX } },
3570     { "(bad)",  { XX } },
3571     { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3572     { "(bad)",  { XX } },
3573   },
3574
3575   /* PREFIX_VEX_65 */
3576   {
3577     { "(bad)",  { XX } },
3578     { "(bad)",  { XX } },
3579     { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3580     { "(bad)",  { XX } },
3581   },
3582
3583   /* PREFIX_VEX_66 */
3584   {
3585     { "(bad)",  { XX } },
3586     { "(bad)",  { XX } },
3587     { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3588     { "(bad)",  { XX } },
3589   },
3590
3591   /* PREFIX_VEX_67 */
3592   {
3593     { "(bad)",  { XX } },
3594     { "(bad)",  { XX } },
3595     { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3596     { "(bad)",  { XX } },
3597   },
3598
3599   /* PREFIX_VEX_68 */
3600   {
3601     { "(bad)",  { XX } },
3602     { "(bad)",  { XX } },
3603     { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3604     { "(bad)",  { XX } },
3605   },
3606
3607   /* PREFIX_VEX_69 */
3608   {
3609     { "(bad)",  { XX } },
3610     { "(bad)",  { XX } },
3611     { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3612     { "(bad)",  { XX } },
3613   },
3614
3615   /* PREFIX_VEX_6A */
3616   {
3617     { "(bad)",  { XX } },
3618     { "(bad)",  { XX } },
3619     { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3620     { "(bad)",  { XX } },
3621   },
3622
3623   /* PREFIX_VEX_6B */
3624   {
3625     { "(bad)",  { XX } },
3626     { "(bad)",  { XX } },
3627     { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3628     { "(bad)",  { XX } },
3629   },
3630
3631   /* PREFIX_VEX_6C */
3632   {
3633     { "(bad)",  { XX } },
3634     { "(bad)",  { XX } },
3635     { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3636     { "(bad)",  { XX } },
3637   },
3638
3639   /* PREFIX_VEX_6D */
3640   {
3641     { "(bad)",  { XX } },
3642     { "(bad)",  { XX } },
3643     { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3644     { "(bad)",  { XX } },
3645   },
3646
3647   /* PREFIX_VEX_6E */
3648   {
3649     { "(bad)",  { XX } },
3650     { "(bad)",  { XX } },
3651     { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3652     { "(bad)",  { XX } },
3653   },
3654
3655   /* PREFIX_VEX_6F */
3656   {
3657     { "(bad)",  { XX } },
3658     { "vmovdqu", { XM, EXx } },
3659     { "vmovdqa", { XM, EXx } },
3660     { "(bad)",  { XX } },
3661   },
3662
3663   /* PREFIX_VEX_70 */
3664   {
3665     { "(bad)",  { XX } },
3666     { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3667     { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3668     { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3669   },
3670
3671   /* PREFIX_VEX_71_REG_2 */
3672   {
3673     { "(bad)",  { XX } },
3674     { "(bad)",  { XX } },
3675     { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3676     { "(bad)",  { XX } },
3677   },
3678
3679   /* PREFIX_VEX_71_REG_4 */
3680   {
3681     { "(bad)",  { XX } },
3682     { "(bad)",  { XX } },
3683     { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3684     { "(bad)",  { XX } },
3685   },
3686
3687   /* PREFIX_VEX_71_REG_6 */
3688   {
3689     { "(bad)",  { XX } },
3690     { "(bad)",  { XX } },
3691     { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3692     { "(bad)",  { XX } },
3693   },
3694
3695   /* PREFIX_VEX_72_REG_2 */
3696   {
3697     { "(bad)",  { XX } },
3698     { "(bad)",  { XX } },
3699     { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3700     { "(bad)",  { XX } },
3701   },
3702
3703   /* PREFIX_VEX_72_REG_4 */
3704   {
3705     { "(bad)",  { XX } },
3706     { "(bad)",  { XX } },
3707     { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3708     { "(bad)",  { XX } },
3709   },
3710
3711   /* PREFIX_VEX_72_REG_6 */
3712   {
3713     { "(bad)",  { XX } },
3714     { "(bad)",  { XX } },
3715     { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3716     { "(bad)",  { XX } },
3717   },
3718
3719   /* PREFIX_VEX_73_REG_2 */
3720   {
3721     { "(bad)",  { XX } },
3722     { "(bad)",  { XX } },
3723     { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3724     { "(bad)",  { XX } },
3725   },
3726
3727   /* PREFIX_VEX_73_REG_3 */
3728   {
3729     { "(bad)",  { XX } },
3730     { "(bad)",  { XX } },
3731     { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3732     { "(bad)",  { XX } },
3733   },
3734
3735   /* PREFIX_VEX_73_REG_6 */
3736   {
3737     { "(bad)",  { XX } },
3738     { "(bad)",  { XX } },
3739     { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3740     { "(bad)",  { XX } },
3741   },
3742
3743   /* PREFIX_VEX_73_REG_7 */
3744   {
3745     { "(bad)",  { XX } },
3746     { "(bad)",  { XX } },
3747     { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3748     { "(bad)",  { XX } },
3749   },
3750
3751   /* PREFIX_VEX_74 */
3752   {
3753     { "(bad)",  { XX } },
3754     { "(bad)",  { XX } },
3755     { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3756     { "(bad)",  { XX } },
3757   },
3758
3759   /* PREFIX_VEX_75 */
3760   {
3761     { "(bad)",  { XX } },
3762     { "(bad)",  { XX } },
3763     { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3764     { "(bad)",  { XX } },
3765   },
3766
3767   /* PREFIX_VEX_76 */
3768   {
3769     { "(bad)",  { XX } },
3770     { "(bad)",  { XX } },
3771     { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3772     { "(bad)",  { XX } },
3773   },
3774
3775   /* PREFIX_VEX_77 */
3776   {
3777     { "",       { VZERO } },
3778     { "(bad)",  { XX } },
3779     { "(bad)",  { XX } },
3780     { "(bad)",  { XX } },
3781   },
3782
3783   /* PREFIX_VEX_7C */
3784   {
3785     { "(bad)",  { XX } },
3786     { "(bad)",  { XX } },
3787     { "vhaddpd", { XM, Vex, EXx } },
3788     { "vhaddps", { XM, Vex, EXx } },
3789   },
3790
3791   /* PREFIX_VEX_7D */
3792   {
3793     { "(bad)",  { XX } },
3794     { "(bad)",  { XX } },
3795     { "vhsubpd", { XM, Vex, EXx } },
3796     { "vhsubps", { XM, Vex, EXx } },
3797   },
3798
3799   /* PREFIX_VEX_7E */
3800   {
3801     { "(bad)",  { XX } },
3802     { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3803     { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3804     { "(bad)",  { XX } },
3805   },
3806
3807   /* PREFIX_VEX_7F */
3808   {
3809     { "(bad)",  { XX } },
3810     { "vmovdqu", { EXxS, XM } },
3811     { "vmovdqa", { EXxS, XM } },
3812     { "(bad)",  { XX } },
3813   },
3814
3815   /* PREFIX_VEX_C2 */
3816   {
3817     { "vcmpps", { XM, Vex, EXx, VCMP } },
3818     { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3819     { "vcmppd", { XM, Vex, EXx, VCMP } },
3820     { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3821   },
3822
3823   /* PREFIX_VEX_C4 */
3824   {
3825     { "(bad)",  { XX } },
3826     { "(bad)",  { XX } },
3827     { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3828     { "(bad)",  { XX } },
3829   },
3830
3831   /* PREFIX_VEX_C5 */
3832   {
3833     { "(bad)",  { XX } },
3834     { "(bad)",  { XX } },
3835     { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3836     { "(bad)",  { XX } },
3837   },
3838
3839   /* PREFIX_VEX_D0 */
3840   {
3841     { "(bad)",  { XX } },
3842     { "(bad)",  { XX } },
3843     { "vaddsubpd", { XM, Vex, EXx } },
3844     { "vaddsubps", { XM, Vex, EXx } },
3845   },
3846
3847   /* PREFIX_VEX_D1 */
3848   {
3849     { "(bad)",  { XX } },
3850     { "(bad)",  { XX } },
3851     { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3852     { "(bad)",  { XX } },
3853   },
3854
3855   /* PREFIX_VEX_D2 */
3856   {
3857     { "(bad)",  { XX } },
3858     { "(bad)",  { XX } },
3859     { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3860     { "(bad)",  { XX } },
3861   },
3862
3863   /* PREFIX_VEX_D3 */
3864   {
3865     { "(bad)",  { XX } },
3866     { "(bad)",  { XX } },
3867     { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3868     { "(bad)",  { XX } },
3869   },
3870
3871   /* PREFIX_VEX_D4 */
3872   {
3873     { "(bad)",  { XX } },
3874     { "(bad)",  { XX } },
3875     { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
3876     { "(bad)",  { XX } },
3877   },
3878
3879   /* PREFIX_VEX_D5 */
3880   {
3881     { "(bad)",  { XX } },
3882     { "(bad)",  { XX } },
3883     { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
3884     { "(bad)",  { XX } },
3885   },
3886
3887   /* PREFIX_VEX_D6 */
3888   {
3889     { "(bad)",  { XX } },
3890     { "(bad)",  { XX } },
3891     { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
3892     { "(bad)",  { XX } },
3893   },
3894
3895   /* PREFIX_VEX_D7 */
3896   {
3897     { "(bad)",  { XX } },
3898     { "(bad)",  { XX } },
3899     { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
3900     { "(bad)",  { XX } },
3901   },
3902
3903   /* PREFIX_VEX_D8 */
3904   {
3905     { "(bad)",  { XX } },
3906     { "(bad)",  { XX } },
3907     { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
3908     { "(bad)",  { XX } },
3909   },
3910
3911   /* PREFIX_VEX_D9 */
3912   {
3913     { "(bad)",  { XX } },
3914     { "(bad)",  { XX } },
3915     { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
3916     { "(bad)",  { XX } },
3917   },
3918
3919   /* PREFIX_VEX_DA */
3920   {
3921     { "(bad)",  { XX } },
3922     { "(bad)",  { XX } },
3923     { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
3924     { "(bad)",  { XX } },
3925   },
3926
3927   /* PREFIX_VEX_DB */
3928   {
3929     { "(bad)",  { XX } },
3930     { "(bad)",  { XX } },
3931     { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
3932     { "(bad)",  { XX } },
3933   },
3934
3935   /* PREFIX_VEX_DC */
3936   {
3937     { "(bad)",  { XX } },
3938     { "(bad)",  { XX } },
3939     { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
3940     { "(bad)",  { XX } },
3941   },
3942
3943   /* PREFIX_VEX_DD */
3944   {
3945     { "(bad)",  { XX } },
3946     { "(bad)",  { XX } },
3947     { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
3948     { "(bad)",  { XX } },
3949   },
3950
3951   /* PREFIX_VEX_DE */
3952   {
3953     { "(bad)",  { XX } },
3954     { "(bad)",  { XX } },
3955     { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
3956     { "(bad)",  { XX } },
3957   },
3958
3959   /* PREFIX_VEX_DF */
3960   {
3961     { "(bad)",  { XX } },
3962     { "(bad)",  { XX } },
3963     { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
3964     { "(bad)",  { XX } },
3965   },
3966
3967   /* PREFIX_VEX_E0 */
3968   {
3969     { "(bad)",  { XX } },
3970     { "(bad)",  { XX } },
3971     { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
3972     { "(bad)",  { XX } },
3973   },
3974
3975   /* PREFIX_VEX_E1 */
3976   {
3977     { "(bad)",  { XX } },
3978     { "(bad)",  { XX } },
3979     { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
3980     { "(bad)",  { XX } },
3981   },
3982
3983   /* PREFIX_VEX_E2 */
3984   {
3985     { "(bad)",  { XX } },
3986     { "(bad)",  { XX } },
3987     { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
3988     { "(bad)",  { XX } },
3989   },
3990
3991   /* PREFIX_VEX_E3 */
3992   {
3993     { "(bad)",  { XX } },
3994     { "(bad)",  { XX } },
3995     { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
3996     { "(bad)",  { XX } },
3997   },
3998
3999   /* PREFIX_VEX_E4 */
4000   {
4001     { "(bad)",  { XX } },
4002     { "(bad)",  { XX } },
4003     { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
4004     { "(bad)",  { XX } },
4005   },
4006
4007   /* PREFIX_VEX_E5 */
4008   {
4009     { "(bad)",  { XX } },
4010     { "(bad)",  { XX } },
4011     { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4012     { "(bad)",  { XX } },
4013   },
4014
4015   /* PREFIX_VEX_E6 */
4016   {
4017     { "(bad)",  { XX } },
4018     { "vcvtdq2pd", { XM, EXxmmq } },
4019     { "vcvttpd2dq%XY", { XMM, EXx } },
4020     { "vcvtpd2dq%XY", { XMM, EXx } },
4021   },
4022
4023   /* PREFIX_VEX_E7 */
4024   {
4025     { "(bad)",  { XX } },
4026     { "(bad)",  { XX } },
4027     { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4028     { "(bad)",  { XX } },
4029   },
4030
4031   /* PREFIX_VEX_E8 */
4032   {
4033     { "(bad)",  { XX } },
4034     { "(bad)",  { XX } },
4035     { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4036     { "(bad)",  { XX } },
4037   },
4038
4039   /* PREFIX_VEX_E9 */
4040   {
4041     { "(bad)",  { XX } },
4042     { "(bad)",  { XX } },
4043     { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4044     { "(bad)",  { XX } },
4045   },
4046
4047   /* PREFIX_VEX_EA */
4048   {
4049     { "(bad)",  { XX } },
4050     { "(bad)",  { XX } },
4051     { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4052     { "(bad)",  { XX } },
4053   },
4054
4055   /* PREFIX_VEX_EB */
4056   {
4057     { "(bad)",  { XX } },
4058     { "(bad)",  { XX } },
4059     { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4060     { "(bad)",  { XX } },
4061   },
4062
4063   /* PREFIX_VEX_EC */
4064   {
4065     { "(bad)",  { XX } },
4066     { "(bad)",  { XX } },
4067     { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4068     { "(bad)",  { XX } },
4069   },
4070
4071   /* PREFIX_VEX_ED */
4072   {
4073     { "(bad)",  { XX } },
4074     { "(bad)",  { XX } },
4075     { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4076     { "(bad)",  { XX } },
4077   },
4078
4079   /* PREFIX_VEX_EE */
4080   {
4081     { "(bad)",  { XX } },
4082     { "(bad)",  { XX } },
4083     { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4084     { "(bad)",  { XX } },
4085   },
4086
4087   /* PREFIX_VEX_EF */
4088   {
4089     { "(bad)",  { XX } },
4090     { "(bad)",  { XX } },
4091     { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4092     { "(bad)",  { XX } },
4093   },
4094
4095   /* PREFIX_VEX_F0 */
4096   {
4097     { "(bad)",  { XX } },
4098     { "(bad)",  { XX } },
4099     { "(bad)",  { XX } },
4100     { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4101   },
4102
4103   /* PREFIX_VEX_F1 */
4104   {
4105     { "(bad)",  { XX } },
4106     { "(bad)",  { XX } },
4107     { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4108     { "(bad)",  { XX } },
4109   },
4110
4111   /* PREFIX_VEX_F2 */
4112   {
4113     { "(bad)",  { XX } },
4114     { "(bad)",  { XX } },
4115     { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4116     { "(bad)",  { XX } },
4117   },
4118
4119   /* PREFIX_VEX_F3 */
4120   {
4121     { "(bad)",  { XX } },
4122     { "(bad)",  { XX } },
4123     { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4124     { "(bad)",  { XX } },
4125   },
4126
4127   /* PREFIX_VEX_F4 */
4128   {
4129     { "(bad)",  { XX } },
4130     { "(bad)",  { XX } },
4131     { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4132     { "(bad)",  { XX } },
4133   },
4134
4135   /* PREFIX_VEX_F5 */
4136   {
4137     { "(bad)",  { XX } },
4138     { "(bad)",  { XX } },
4139     { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4140     { "(bad)",  { XX } },
4141   },
4142
4143   /* PREFIX_VEX_F6 */
4144   {
4145     { "(bad)",  { XX } },
4146     { "(bad)",  { XX } },
4147     { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4148     { "(bad)",  { XX } },
4149   },
4150
4151   /* PREFIX_VEX_F7 */
4152   {
4153     { "(bad)",  { XX } },
4154     { "(bad)",  { XX } },
4155     { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4156     { "(bad)",  { XX } },
4157   },
4158
4159   /* PREFIX_VEX_F8 */
4160   {
4161     { "(bad)",  { XX } },
4162     { "(bad)",  { XX } },
4163     { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4164     { "(bad)",  { XX } },
4165   },
4166
4167   /* PREFIX_VEX_F9 */
4168   {
4169     { "(bad)",  { XX } },
4170     { "(bad)",  { XX } },
4171     { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4172     { "(bad)",  { XX } },
4173   },
4174
4175   /* PREFIX_VEX_FA */
4176   {
4177     { "(bad)",  { XX } },
4178     { "(bad)",  { XX } },
4179     { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4180     { "(bad)",  { XX } },
4181   },
4182
4183   /* PREFIX_VEX_FB */
4184   {
4185     { "(bad)",  { XX } },
4186     { "(bad)",  { XX } },
4187     { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4188     { "(bad)",  { XX } },
4189   },
4190
4191   /* PREFIX_VEX_FC */
4192   {
4193     { "(bad)",  { XX } },
4194     { "(bad)",  { XX } },
4195     { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4196     { "(bad)",  { XX } },
4197   },
4198
4199   /* PREFIX_VEX_FD */
4200   {
4201     { "(bad)",  { XX } },
4202     { "(bad)",  { XX } },
4203     { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4204     { "(bad)",  { XX } },
4205   },
4206
4207   /* PREFIX_VEX_FE */
4208   {
4209     { "(bad)",  { XX } },
4210     { "(bad)",  { XX } },
4211     { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4212     { "(bad)",  { XX } },
4213   },
4214
4215   /* PREFIX_VEX_3800 */
4216   {
4217     { "(bad)",  { XX } },
4218     { "(bad)",  { XX } },
4219     { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4220     { "(bad)",  { XX } },
4221   },
4222
4223   /* PREFIX_VEX_3801 */
4224   {
4225     { "(bad)",  { XX } },
4226     { "(bad)",  { XX } },
4227     { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4228     { "(bad)",  { XX } },
4229   },
4230
4231   /* PREFIX_VEX_3802 */
4232   {
4233     { "(bad)",  { XX } },
4234     { "(bad)",  { XX } },
4235     { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4236     { "(bad)",  { XX } },
4237   },
4238
4239   /* PREFIX_VEX_3803 */
4240   {
4241     { "(bad)",  { XX } },
4242     { "(bad)",  { XX } },
4243     { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4244     { "(bad)",  { XX } },
4245   },
4246
4247   /* PREFIX_VEX_3804 */
4248   {
4249     { "(bad)",  { XX } },
4250     { "(bad)",  { XX } },
4251     { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4252     { "(bad)",  { XX } },
4253   },
4254
4255   /* PREFIX_VEX_3805 */
4256   {
4257     { "(bad)",  { XX } },
4258     { "(bad)",  { XX } },
4259     { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4260     { "(bad)",  { XX } },
4261   },
4262
4263   /* PREFIX_VEX_3806 */
4264   {
4265     { "(bad)",  { XX } },
4266     { "(bad)",  { XX } },
4267     { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4268     { "(bad)",  { XX } },
4269   },
4270
4271   /* PREFIX_VEX_3807 */
4272   {
4273     { "(bad)",  { XX } },
4274     { "(bad)",  { XX } },
4275     { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4276     { "(bad)",  { XX } },
4277   },
4278
4279   /* PREFIX_VEX_3808 */
4280   {
4281     { "(bad)",  { XX } },
4282     { "(bad)",  { XX } },
4283     { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4284     { "(bad)",  { XX } },
4285   },
4286
4287   /* PREFIX_VEX_3809 */
4288   {
4289     { "(bad)",  { XX } },
4290     { "(bad)",  { XX } },
4291     { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4292     { "(bad)",  { XX } },
4293   },
4294
4295   /* PREFIX_VEX_380A */
4296   {
4297     { "(bad)",  { XX } },
4298     { "(bad)",  { XX } },
4299     { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4300     { "(bad)",  { XX } },
4301   },
4302
4303   /* PREFIX_VEX_380B */
4304   {
4305     { "(bad)",  { XX } },
4306     { "(bad)",  { XX } },
4307     { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4308     { "(bad)",  { XX } },
4309   },
4310
4311   /* PREFIX_VEX_380C */
4312   {
4313     { "(bad)",  { XX } },
4314     { "(bad)",  { XX } },
4315     { "vpermilps", { XM, Vex, EXx } },
4316     { "(bad)",  { XX } },
4317   },
4318
4319   /* PREFIX_VEX_380D */
4320   {
4321     { "(bad)",  { XX } },
4322     { "(bad)",  { XX } },
4323     { "vpermilpd", { XM, Vex, EXx } },
4324     { "(bad)",  { XX } },
4325   },
4326
4327   /* PREFIX_VEX_380E */
4328   {
4329     { "(bad)",  { XX } },
4330     { "(bad)",  { XX } },
4331     { "vtestps", { XM, EXx } },
4332     { "(bad)",  { XX } },
4333   },
4334
4335   /* PREFIX_VEX_380F */
4336   {
4337     { "(bad)",  { XX } },
4338     { "(bad)",  { XX } },
4339     { "vtestpd", { XM, EXx } },
4340     { "(bad)",  { XX } },
4341   },
4342
4343   /* PREFIX_VEX_3817 */
4344   {
4345     { "(bad)",  { XX } },
4346     { "(bad)",  { XX } },
4347     { "vptest", { XM, EXx } },
4348     { "(bad)",  { XX } },
4349   },
4350
4351   /* PREFIX_VEX_3818 */
4352   {
4353     { "(bad)",  { XX } },
4354     { "(bad)",  { XX } },
4355     { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4356     { "(bad)",  { XX } },
4357   },
4358
4359   /* PREFIX_VEX_3819 */
4360   {
4361     { "(bad)",  { XX } },
4362     { "(bad)",  { XX } },
4363     { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4364     { "(bad)",  { XX } },
4365   },
4366
4367   /* PREFIX_VEX_381A */
4368   {
4369     { "(bad)",  { XX } },
4370     { "(bad)",  { XX } },
4371     { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4372     { "(bad)",  { XX } },
4373   },
4374
4375   /* PREFIX_VEX_381C */
4376   {
4377     { "(bad)",  { XX } },
4378     { "(bad)",  { XX } },
4379     { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4380     { "(bad)",  { XX } },
4381   },
4382
4383   /* PREFIX_VEX_381D */
4384   {
4385     { "(bad)",  { XX } },
4386     { "(bad)",  { XX } },
4387     { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4388     { "(bad)",  { XX } },
4389   },
4390
4391   /* PREFIX_VEX_381E */
4392   {
4393     { "(bad)",  { XX } },
4394     { "(bad)",  { XX } },
4395     { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4396     { "(bad)",  { XX } },
4397   },
4398
4399   /* PREFIX_VEX_3820 */
4400   {
4401     { "(bad)",  { XX } },
4402     { "(bad)",  { XX } },
4403     { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4404     { "(bad)",  { XX } },
4405   },
4406
4407   /* PREFIX_VEX_3821 */
4408   {
4409     { "(bad)",  { XX } },
4410     { "(bad)",  { XX } },
4411     { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4412     { "(bad)",  { XX } },
4413   },
4414
4415   /* PREFIX_VEX_3822 */
4416   {
4417     { "(bad)",  { XX } },
4418     { "(bad)",  { XX } },
4419     { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4420     { "(bad)",  { XX } },
4421   },
4422
4423   /* PREFIX_VEX_3823 */
4424   {
4425     { "(bad)",  { XX } },
4426     { "(bad)",  { XX } },
4427     { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4428     { "(bad)",  { XX } },
4429   },
4430
4431   /* PREFIX_VEX_3824 */
4432   {
4433     { "(bad)",  { XX } },
4434     { "(bad)",  { XX } },
4435     { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4436     { "(bad)",  { XX } },
4437   },
4438
4439   /* PREFIX_VEX_3825 */
4440   {
4441     { "(bad)",  { XX } },
4442     { "(bad)",  { XX } },
4443     { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4444     { "(bad)",  { XX } },
4445   },
4446
4447   /* PREFIX_VEX_3828 */
4448   {
4449     { "(bad)",  { XX } },
4450     { "(bad)",  { XX } },
4451     { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4452     { "(bad)",  { XX } },
4453   },
4454
4455   /* PREFIX_VEX_3829 */
4456   {
4457     { "(bad)",  { XX } },
4458     { "(bad)",  { XX } },
4459     { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4460     { "(bad)",  { XX } },
4461   },
4462
4463   /* PREFIX_VEX_382A */
4464   {
4465     { "(bad)",  { XX } },
4466     { "(bad)",  { XX } },
4467     { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4468     { "(bad)",  { XX } },
4469   },
4470
4471   /* PREFIX_VEX_382B */
4472   {
4473     { "(bad)",  { XX } },
4474     { "(bad)",  { XX } },
4475     { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4476     { "(bad)",  { XX } },
4477   },
4478
4479   /* PREFIX_VEX_382C */
4480   {
4481     { "(bad)",  { XX } },
4482     { "(bad)",  { XX } },
4483      { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4484     { "(bad)",  { XX } },
4485   },
4486
4487   /* PREFIX_VEX_382D */
4488   {
4489     { "(bad)",  { XX } },
4490     { "(bad)",  { XX } },
4491      { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4492     { "(bad)",  { XX } },
4493   },
4494
4495   /* PREFIX_VEX_382E */
4496   {
4497     { "(bad)",  { XX } },
4498     { "(bad)",  { XX } },
4499      { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4500     { "(bad)",  { XX } },
4501   },
4502
4503   /* PREFIX_VEX_382F */
4504   {
4505     { "(bad)",  { XX } },
4506     { "(bad)",  { XX } },
4507      { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4508     { "(bad)",  { XX } },
4509   },
4510
4511   /* PREFIX_VEX_3830 */
4512   {
4513     { "(bad)",  { XX } },
4514     { "(bad)",  { XX } },
4515     { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4516     { "(bad)",  { XX } },
4517   },
4518
4519   /* PREFIX_VEX_3831 */
4520   {
4521     { "(bad)",  { XX } },
4522     { "(bad)",  { XX } },
4523     { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4524     { "(bad)",  { XX } },
4525   },
4526
4527   /* PREFIX_VEX_3832 */
4528   {
4529     { "(bad)",  { XX } },
4530     { "(bad)",  { XX } },
4531     { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4532     { "(bad)",  { XX } },
4533   },
4534
4535   /* PREFIX_VEX_3833 */
4536   {
4537     { "(bad)",  { XX } },
4538     { "(bad)",  { XX } },
4539     { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4540     { "(bad)",  { XX } },
4541   },
4542
4543   /* PREFIX_VEX_3834 */
4544   {
4545     { "(bad)",  { XX } },
4546     { "(bad)",  { XX } },
4547     { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4548     { "(bad)",  { XX } },
4549   },
4550
4551   /* PREFIX_VEX_3835 */
4552   {
4553     { "(bad)",  { XX } },
4554     { "(bad)",  { XX } },
4555     { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4556     { "(bad)",  { XX } },
4557   },
4558
4559   /* PREFIX_VEX_3837 */
4560   {
4561     { "(bad)",  { XX } },
4562     { "(bad)",  { XX } },
4563     { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4564     { "(bad)",  { XX } },
4565   },
4566
4567   /* PREFIX_VEX_3838 */
4568   {
4569     { "(bad)",  { XX } },
4570     { "(bad)",  { XX } },
4571     { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4572     { "(bad)",  { XX } },
4573   },
4574
4575   /* PREFIX_VEX_3839 */
4576   {
4577     { "(bad)",  { XX } },
4578     { "(bad)",  { XX } },
4579     { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4580     { "(bad)",  { XX } },
4581   },
4582
4583   /* PREFIX_VEX_383A */
4584   {
4585     { "(bad)",  { XX } },
4586     { "(bad)",  { XX } },
4587     { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4588     { "(bad)",  { XX } },
4589   },
4590
4591   /* PREFIX_VEX_383B */
4592   {
4593     { "(bad)",  { XX } },
4594     { "(bad)",  { XX } },
4595     { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4596     { "(bad)",  { XX } },
4597   },
4598
4599   /* PREFIX_VEX_383C */
4600   {
4601     { "(bad)",  { XX } },
4602     { "(bad)",  { XX } },
4603     { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4604     { "(bad)",  { XX } },
4605   },
4606
4607   /* PREFIX_VEX_383D */
4608   {
4609     { "(bad)",  { XX } },
4610     { "(bad)",  { XX } },
4611     { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4612     { "(bad)",  { XX } },
4613   },
4614
4615   /* PREFIX_VEX_383E */
4616   {
4617     { "(bad)",  { XX } },
4618     { "(bad)",  { XX } },
4619     { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4620     { "(bad)",  { XX } },
4621   },
4622
4623   /* PREFIX_VEX_383F */
4624   {
4625     { "(bad)",  { XX } },
4626     { "(bad)",  { XX } },
4627     { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4628     { "(bad)",  { XX } },
4629   },
4630
4631   /* PREFIX_VEX_3840 */
4632   {
4633     { "(bad)",  { XX } },
4634     { "(bad)",  { XX } },
4635     { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4636     { "(bad)",  { XX } },
4637   },
4638
4639   /* PREFIX_VEX_3841 */
4640   {
4641     { "(bad)",  { XX } },
4642     { "(bad)",  { XX } },
4643     { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4644     { "(bad)",  { XX } },
4645   },
4646
4647   /* PREFIX_VEX_3896 */
4648   {
4649     { "(bad)",  { XX } },
4650     { "(bad)",  { XX } },
4651     { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4652     { "(bad)",  { XX } },
4653   },
4654
4655   /* PREFIX_VEX_3897 */
4656   {
4657     { "(bad)",  { XX } },
4658     { "(bad)",  { XX } },
4659     { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4660     { "(bad)",  { XX } },
4661   },
4662
4663   /* PREFIX_VEX_3898 */
4664   {
4665     { "(bad)",  { XX } },
4666     { "(bad)",  { XX } },
4667     { "vfmadd132p%XW", { XM, Vex, EXx } },
4668     { "(bad)",  { XX } },
4669   },
4670
4671   /* PREFIX_VEX_3899 */
4672   {
4673     { "(bad)",  { XX } },
4674     { "(bad)",  { XX } },
4675     { "vfmadd132s%XW", { XM, Vex, EXVexWdq } },
4676     { "(bad)",  { XX } },
4677   },
4678
4679   /* PREFIX_VEX_389A */
4680   {
4681     { "(bad)",  { XX } },
4682     { "(bad)",  { XX } },
4683     { "vfmsub132p%XW", { XM, Vex, EXx } },
4684     { "(bad)",  { XX } },
4685   },
4686
4687   /* PREFIX_VEX_389B */
4688   {
4689     { "(bad)",  { XX } },
4690     { "(bad)",  { XX } },
4691     { "vfmsub132s%XW", { XM, Vex, EXVexWdq } },
4692     { "(bad)",  { XX } },
4693   },
4694
4695   /* PREFIX_VEX_389C */
4696   {
4697     { "(bad)",  { XX } },
4698     { "(bad)",  { XX } },
4699     { "vfnmadd132p%XW", { XM, Vex, EXx } },
4700     { "(bad)",  { XX } },
4701   },
4702
4703   /* PREFIX_VEX_389D */
4704   {
4705     { "(bad)",  { XX } },
4706     { "(bad)",  { XX } },
4707     { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } },
4708     { "(bad)",  { XX } },
4709   },
4710
4711   /* PREFIX_VEX_389E */
4712   {
4713     { "(bad)",  { XX } },
4714     { "(bad)",  { XX } },
4715     { "vfnmsub132p%XW", { XM, Vex, EXx } },
4716     { "(bad)",  { XX } },
4717   },
4718
4719   /* PREFIX_VEX_389F */
4720   {
4721     { "(bad)",  { XX } },
4722     { "(bad)",  { XX } },
4723     { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } },
4724     { "(bad)",  { XX } },
4725   },
4726
4727   /* PREFIX_VEX_38A6 */
4728   {
4729     { "(bad)",  { XX } },
4730     { "(bad)",  { XX } },
4731     { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4732     { "(bad)",  { XX } },
4733   },
4734
4735   /* PREFIX_VEX_38A7 */
4736   {
4737     { "(bad)",  { XX } },
4738     { "(bad)",  { XX } },
4739     { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4740     { "(bad)",  { XX } },
4741   },
4742
4743   /* PREFIX_VEX_38A8 */
4744   {
4745     { "(bad)",  { XX } },
4746     { "(bad)",  { XX } },
4747     { "vfmadd213p%XW", { XM, Vex, EXx } },
4748     { "(bad)",  { XX } },
4749   },
4750
4751   /* PREFIX_VEX_38A9 */
4752   {
4753     { "(bad)",  { XX } },
4754     { "(bad)",  { XX } },
4755     { "vfmadd213s%XW", { XM, Vex, EXVexWdq } },
4756     { "(bad)",  { XX } },
4757   },
4758
4759   /* PREFIX_VEX_38AA */
4760   {
4761     { "(bad)",  { XX } },
4762     { "(bad)",  { XX } },
4763     { "vfmsub213p%XW", { XM, Vex, EXx } },
4764     { "(bad)",  { XX } },
4765   },
4766
4767   /* PREFIX_VEX_38AB */
4768   {
4769     { "(bad)",  { XX } },
4770     { "(bad)",  { XX } },
4771     { "vfmsub213s%XW", { XM, Vex, EXVexWdq } },
4772     { "(bad)",  { XX } },
4773   },
4774
4775   /* PREFIX_VEX_38AC */
4776   {
4777     { "(bad)",  { XX } },
4778     { "(bad)",  { XX } },
4779     { "vfnmadd213p%XW", { XM, Vex, EXx } },
4780     { "(bad)",  { XX } },
4781   },
4782
4783   /* PREFIX_VEX_38AD */
4784   {
4785     { "(bad)",  { XX } },
4786     { "(bad)",  { XX } },
4787     { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } },
4788     { "(bad)",  { XX } },
4789   },
4790
4791   /* PREFIX_VEX_38AE */
4792   {
4793     { "(bad)",  { XX } },
4794     { "(bad)",  { XX } },
4795     { "vfnmsub213p%XW", { XM, Vex, EXx } },
4796     { "(bad)",  { XX } },
4797   },
4798
4799   /* PREFIX_VEX_38AF */
4800   {
4801     { "(bad)",  { XX } },
4802     { "(bad)",  { XX } },
4803     { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } },
4804     { "(bad)",  { XX } },
4805   },
4806
4807   /* PREFIX_VEX_38B6 */
4808   {
4809     { "(bad)",  { XX } },
4810     { "(bad)",  { XX } },
4811     { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4812     { "(bad)",  { XX } },
4813   },
4814
4815   /* PREFIX_VEX_38B7 */
4816   {
4817     { "(bad)",  { XX } },
4818     { "(bad)",  { XX } },
4819     { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4820     { "(bad)",  { XX } },
4821   },
4822
4823   /* PREFIX_VEX_38B8 */
4824   {
4825     { "(bad)",  { XX } },
4826     { "(bad)",  { XX } },
4827     { "vfmadd231p%XW", { XM, Vex, EXx } },
4828     { "(bad)",  { XX } },
4829   },
4830
4831   /* PREFIX_VEX_38B9 */
4832   {
4833     { "(bad)",  { XX } },
4834     { "(bad)",  { XX } },
4835     { "vfmadd231s%XW", { XM, Vex, EXVexWdq } },
4836     { "(bad)",  { XX } },
4837   },
4838
4839   /* PREFIX_VEX_38BA */
4840   {
4841     { "(bad)",  { XX } },
4842     { "(bad)",  { XX } },
4843     { "vfmsub231p%XW", { XM, Vex, EXx } },
4844     { "(bad)",  { XX } },
4845   },
4846
4847   /* PREFIX_VEX_38BB */
4848   {
4849     { "(bad)",  { XX } },
4850     { "(bad)",  { XX } },
4851     { "vfmsub231s%XW", { XM, Vex, EXVexWdq } },
4852     { "(bad)",  { XX } },
4853   },
4854
4855   /* PREFIX_VEX_38BC */
4856   {
4857     { "(bad)",  { XX } },
4858     { "(bad)",  { XX } },
4859     { "vfnmadd231p%XW", { XM, Vex, EXx } },
4860     { "(bad)",  { XX } },
4861   },
4862
4863   /* PREFIX_VEX_38BD */
4864   {
4865     { "(bad)",  { XX } },
4866     { "(bad)",  { XX } },
4867     { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } },
4868     { "(bad)",  { XX } },
4869   },
4870
4871   /* PREFIX_VEX_38BE */
4872   {
4873     { "(bad)",  { XX } },
4874     { "(bad)",  { XX } },
4875     { "vfnmsub231p%XW", { XM, Vex, EXx } },
4876     { "(bad)",  { XX } },
4877   },
4878
4879   /* PREFIX_VEX_38BF */
4880   {
4881     { "(bad)",  { XX } },
4882     { "(bad)",  { XX } },
4883     { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } },
4884     { "(bad)",  { XX } },
4885   },
4886
4887   /* PREFIX_VEX_38DB */
4888   {
4889     { "(bad)",  { XX } },
4890     { "(bad)",  { XX } },
4891     { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4892     { "(bad)",  { XX } },
4893   },
4894
4895   /* PREFIX_VEX_38DC */
4896   {
4897     { "(bad)",  { XX } },
4898     { "(bad)",  { XX } },
4899     { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4900     { "(bad)",  { XX } },
4901   },
4902
4903   /* PREFIX_VEX_38DD */
4904   {
4905     { "(bad)",  { XX } },
4906     { "(bad)",  { XX } },
4907     { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4908     { "(bad)",  { XX } },
4909   },
4910
4911   /* PREFIX_VEX_38DE */
4912   {
4913     { "(bad)",  { XX } },
4914     { "(bad)",  { XX } },
4915     { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4916     { "(bad)",  { XX } },
4917   },
4918
4919   /* PREFIX_VEX_38DF */
4920   {
4921     { "(bad)",  { XX } },
4922     { "(bad)",  { XX } },
4923     { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4924     { "(bad)",  { XX } },
4925   },
4926
4927   /* PREFIX_VEX_3A04 */
4928   {
4929     { "(bad)",  { XX } },
4930     { "(bad)",  { XX } },
4931     { "vpermilps", { XM, EXx, Ib } },
4932     { "(bad)",  { XX } },
4933   },
4934
4935   /* PREFIX_VEX_3A05 */
4936   {
4937     { "(bad)",  { XX } },
4938     { "(bad)",  { XX } },
4939     { "vpermilpd", { XM, EXx, Ib } },
4940     { "(bad)",  { XX } },
4941   },
4942
4943   /* PREFIX_VEX_3A06 */
4944   {
4945     { "(bad)",  { XX } },
4946     { "(bad)",  { XX } },
4947     { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4948     { "(bad)",  { XX } },
4949   },
4950
4951   /* PREFIX_VEX_3A08 */
4952   {
4953     { "(bad)",  { XX } },
4954     { "(bad)",  { XX } },
4955     { "vroundps", { XM, EXx, Ib } },
4956     { "(bad)",  { XX } },
4957   },
4958
4959   /* PREFIX_VEX_3A09 */
4960   {
4961     { "(bad)",  { XX } },
4962     { "(bad)",  { XX } },
4963     { "vroundpd", { XM, EXx, Ib } },
4964     { "(bad)",  { XX } },
4965   },
4966
4967   /* PREFIX_VEX_3A0A */
4968   {
4969     { "(bad)",  { XX } },
4970     { "(bad)",  { XX } },
4971     { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4972     { "(bad)",  { XX } },
4973   },
4974
4975   /* PREFIX_VEX_3A0B */
4976   {
4977     { "(bad)",  { XX } },
4978     { "(bad)",  { XX } },
4979     { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4980     { "(bad)",  { XX } },
4981   },
4982
4983   /* PREFIX_VEX_3A0C */
4984   {
4985     { "(bad)",  { XX } },
4986     { "(bad)",  { XX } },
4987     { "vblendps", { XM, Vex, EXx, Ib } },
4988     { "(bad)",  { XX } },
4989   },
4990
4991   /* PREFIX_VEX_3A0D */
4992   {
4993     { "(bad)",  { XX } },
4994     { "(bad)",  { XX } },
4995     { "vblendpd", { XM, Vex, EXx, Ib } },
4996     { "(bad)",  { XX } },
4997   },
4998
4999   /* PREFIX_VEX_3A0E */
5000   {
5001     { "(bad)",  { XX } },
5002     { "(bad)",  { XX } },
5003     { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
5004     { "(bad)",  { XX } },
5005   },
5006
5007   /* PREFIX_VEX_3A0F */
5008   {
5009     { "(bad)",  { XX } },
5010     { "(bad)",  { XX } },
5011     { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5012     { "(bad)",  { XX } },
5013   },
5014
5015   /* PREFIX_VEX_3A14 */
5016   {
5017     { "(bad)",  { XX } },
5018     { "(bad)",  { XX } },
5019     { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5020     { "(bad)",  { XX } },
5021   },
5022
5023   /* PREFIX_VEX_3A15 */
5024   {
5025     { "(bad)",  { XX } },
5026     { "(bad)",  { XX } },
5027     { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5028     { "(bad)",  { XX } },
5029   },
5030
5031   /* PREFIX_VEX_3A16 */
5032   {
5033     { "(bad)",  { XX } },
5034     { "(bad)",  { XX } },
5035     { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
5036     { "(bad)",  { XX } },
5037   },
5038
5039   /* PREFIX_VEX_3A17 */
5040   {
5041     { "(bad)",  { XX } },
5042     { "(bad)",  { XX } },
5043     { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
5044     { "(bad)",  { XX } },
5045   },
5046
5047   /* PREFIX_VEX_3A18 */
5048   {
5049     { "(bad)",  { XX } },
5050     { "(bad)",  { XX } },
5051     { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
5052     { "(bad)",  { XX } },
5053   },
5054
5055   /* PREFIX_VEX_3A19 */
5056   {
5057     { "(bad)",  { XX } },
5058     { "(bad)",  { XX } },
5059     { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
5060     { "(bad)",  { XX } },
5061   },
5062
5063   /* PREFIX_VEX_3A20 */
5064   {
5065     { "(bad)",  { XX } },
5066     { "(bad)",  { XX } },
5067     { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
5068     { "(bad)",  { XX } },
5069   },
5070
5071   /* PREFIX_VEX_3A21 */
5072   {
5073     { "(bad)",  { XX } },
5074     { "(bad)",  { XX } },
5075     { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
5076     { "(bad)",  { XX } },
5077   },
5078
5079   /* PREFIX_VEX_3A22 */
5080   {
5081     { "(bad)",  { XX } },
5082     { "(bad)",  { XX } },
5083     { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5084     { "(bad)",  { XX } },
5085   },
5086
5087   /* PREFIX_VEX_3A40 */
5088   {
5089     { "(bad)",  { XX } },
5090     { "(bad)",  { XX } },
5091     { "vdpps",  { XM, Vex, EXx, Ib } },
5092     { "(bad)",  { XX } },
5093   },
5094
5095   /* PREFIX_VEX_3A41 */
5096   {
5097     { "(bad)",  { XX } },
5098     { "(bad)",  { XX } },
5099     { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5100     { "(bad)",  { XX } },
5101   },
5102
5103   /* PREFIX_VEX_3A42 */
5104   {
5105     { "(bad)",  { XX } },
5106     { "(bad)",  { XX } },
5107     { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5108     { "(bad)",  { XX } },
5109   },
5110
5111   /* PREFIX_VEX_3A44 */
5112   {
5113     { "(bad)",  { XX } },
5114     { "(bad)",  { XX } },
5115     { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5116     { "(bad)",  { XX } },
5117   },
5118
5119   /* PREFIX_VEX_3A4A */
5120   {
5121     { "(bad)",  { XX } },
5122     { "(bad)",  { XX } },
5123     { "vblendvps", { XM, Vex, EXx, XMVexI4 } },
5124     { "(bad)",  { XX } },
5125   },
5126
5127   /* PREFIX_VEX_3A4B */
5128   {
5129     { "(bad)",  { XX } },
5130     { "(bad)",  { XX } },
5131     { "vblendvpd", { XM, Vex, EXx, XMVexI4 } },
5132     { "(bad)",  { XX } },
5133   },
5134
5135   /* PREFIX_VEX_3A4C */
5136   {
5137     { "(bad)",  { XX } },
5138     { "(bad)",  { XX } },
5139     { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5140     { "(bad)",  { XX } },
5141   },
5142
5143   /* PREFIX_VEX_3A5C */
5144   {
5145     { "(bad)",  { XX } },
5146     { "(bad)",  { XX } },
5147     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5148     { "(bad)",  { XX } },
5149   },
5150
5151   /* PREFIX_VEX_3A5D */
5152   {
5153     { "(bad)",  { XX } },
5154     { "(bad)",  { XX } },
5155     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5156     { "(bad)",  { XX } },
5157   },
5158
5159   /* PREFIX_VEX_3A5E */
5160   {
5161     { "(bad)",  { XX } },
5162     { "(bad)",  { XX } },
5163     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5164     { "(bad)",  { XX } },
5165   },
5166
5167   /* PREFIX_VEX_3A5F */
5168   {
5169     { "(bad)",  { XX } },
5170     { "(bad)",  { XX } },
5171     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5172     { "(bad)",  { XX } },
5173   },
5174
5175   /* PREFIX_VEX_3A60 */
5176   {
5177     { "(bad)",  { XX } },
5178     { "(bad)",  { XX } },
5179     { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5180     { "(bad)",  { XX } },
5181   },
5182
5183   /* PREFIX_VEX_3A61 */
5184   {
5185     { "(bad)",  { XX } },
5186     { "(bad)",  { XX } },
5187     { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5188     { "(bad)",  { XX } },
5189   },
5190
5191   /* PREFIX_VEX_3A62 */
5192   {
5193     { "(bad)",  { XX } },
5194     { "(bad)",  { XX } },
5195     { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5196     { "(bad)",  { XX } },
5197   },
5198
5199   /* PREFIX_VEX_3A63 */
5200   {
5201     { "(bad)",  { XX } },
5202     { "(bad)",  { XX } },
5203     { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5204     { "(bad)",  { XX } },
5205   },
5206
5207   /* PREFIX_VEX_3A68 */
5208   {
5209     { "(bad)",  { XX } },
5210     { "(bad)",  { XX } },
5211     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5212     { "(bad)",  { XX } },
5213   },
5214
5215   /* PREFIX_VEX_3A69 */
5216   {
5217     { "(bad)",  { XX } },
5218     { "(bad)",  { XX } },
5219     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5220     { "(bad)",  { XX } },
5221   },
5222
5223   /* PREFIX_VEX_3A6A */
5224   {
5225     { "(bad)",  { XX } },
5226     { "(bad)",  { XX } },
5227     { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5228     { "(bad)",  { XX } },
5229   },
5230
5231   /* PREFIX_VEX_3A6B */
5232   {
5233     { "(bad)",  { XX } },
5234     { "(bad)",  { XX } },
5235     { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5236     { "(bad)",  { XX } },
5237   },
5238
5239   /* PREFIX_VEX_3A6C */
5240   {
5241     { "(bad)",  { XX } },
5242     { "(bad)",  { XX } },
5243     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5244     { "(bad)",  { XX } },
5245   },
5246
5247   /* PREFIX_VEX_3A6D */
5248   {
5249     { "(bad)",  { XX } },
5250     { "(bad)",  { XX } },
5251     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5252     { "(bad)",  { XX } },
5253   },
5254
5255   /* PREFIX_VEX_3A6E */
5256   {
5257     { "(bad)",  { XX } },
5258     { "(bad)",  { XX } },
5259     { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5260     { "(bad)",  { XX } },
5261   },
5262
5263   /* PREFIX_VEX_3A6F */
5264   {
5265     { "(bad)",  { XX } },
5266     { "(bad)",  { XX } },
5267     { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5268     { "(bad)",  { XX } },
5269   },
5270
5271   /* PREFIX_VEX_3A78 */
5272   {
5273     { "(bad)",  { XX } },
5274     { "(bad)",  { XX } },
5275     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5276     { "(bad)",  { XX } },
5277   },
5278
5279   /* PREFIX_VEX_3A79 */
5280   {
5281     { "(bad)",  { XX } },
5282     { "(bad)",  { XX } },
5283     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5284     { "(bad)",  { XX } },
5285   },
5286
5287   /* PREFIX_VEX_3A7A */
5288   {
5289     { "(bad)",  { XX } },
5290     { "(bad)",  { XX } },
5291     { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5292     { "(bad)",  { XX } },
5293   },
5294
5295   /* PREFIX_VEX_3A7B */
5296   {
5297     { "(bad)",  { XX } },
5298     { "(bad)",  { XX } },
5299     { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5300     { "(bad)",  { XX } },
5301   },
5302
5303   /* PREFIX_VEX_3A7C */
5304   {
5305     { "(bad)",  { XX } },
5306     { "(bad)",  { XX } },
5307     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5308     { "(bad)",  { XX } },
5309   },
5310
5311   /* PREFIX_VEX_3A7D */
5312   {
5313     { "(bad)",  { XX } },
5314     { "(bad)",  { XX } },
5315     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5316     { "(bad)",  { XX } },
5317   },
5318
5319   /* PREFIX_VEX_3A7E */
5320   {
5321     { "(bad)",  { XX } },
5322     { "(bad)",  { XX } },
5323     { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5324     { "(bad)",  { XX } },
5325   },
5326
5327   /* PREFIX_VEX_3A7F */
5328   {
5329     { "(bad)",  { XX } },
5330     { "(bad)",  { XX } },
5331     { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5332     { "(bad)",  { XX } },
5333   },
5334
5335   /* PREFIX_VEX_3ADF */
5336   {
5337     { "(bad)",  { XX } },
5338     { "(bad)",  { XX } },
5339     { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5340     { "(bad)",  { XX } },
5341   },
5342 };
5343
5344 static const struct dis386 x86_64_table[][2] = {
5345   /* X86_64_06 */
5346   {
5347     { "push{T|}", { es } },
5348     { "(bad)", { XX } },
5349   },
5350
5351   /* X86_64_07 */
5352   {
5353     { "pop{T|}", { es } },
5354     { "(bad)", { XX } },
5355   },
5356
5357   /* X86_64_0D */
5358   {
5359     { "push{T|}", { cs } },
5360     { "(bad)", { XX } },
5361   },
5362
5363   /* X86_64_16 */
5364   {
5365     { "push{T|}", { ss } },
5366     { "(bad)", { XX } },
5367   },
5368
5369   /* X86_64_17 */
5370   {
5371     { "pop{T|}", { ss } },
5372     { "(bad)", { XX } },
5373   },
5374
5375   /* X86_64_1E */
5376   {
5377     { "push{T|}", { ds } },
5378     { "(bad)", { XX } },
5379   },
5380
5381   /* X86_64_1F */
5382   {
5383     { "pop{T|}", { ds } },
5384     { "(bad)", { XX } },
5385   },
5386
5387   /* X86_64_27 */
5388   {
5389     { "daa", { XX } },
5390     { "(bad)", { XX } },
5391   },
5392
5393   /* X86_64_2F */
5394   {
5395     { "das", { XX } },
5396     { "(bad)", { XX } },
5397   },
5398
5399   /* X86_64_37 */
5400   {
5401     { "aaa", { XX } },
5402     { "(bad)", { XX } },
5403   },
5404
5405   /* X86_64_3F */
5406   {
5407     { "aas", { XX } },
5408     { "(bad)", { XX } },
5409   },
5410
5411   /* X86_64_60 */
5412   {
5413     { "pusha{P|}", { XX } },
5414     { "(bad)", { XX } },
5415   },
5416
5417   /* X86_64_61 */
5418   {
5419     { "popa{P|}", { XX } },
5420     { "(bad)", { XX } },
5421   },
5422
5423   /* X86_64_62 */
5424   {
5425     { MOD_TABLE (MOD_62_32BIT) },
5426     { "(bad)", { XX } },
5427   },
5428
5429   /* X86_64_63 */
5430   {
5431     { "arpl", { Ew, Gw } },
5432     { "movs{lq|xd}", { Gv, Ed } },
5433   },
5434
5435   /* X86_64_6D */
5436   {
5437     { "ins{R|}", { Yzr, indirDX } },
5438     { "ins{G|}", { Yzr, indirDX } },
5439   },
5440
5441   /* X86_64_6F */
5442   {
5443     { "outs{R|}", { indirDXr, Xz } },
5444     { "outs{G|}", { indirDXr, Xz } },
5445   },
5446
5447   /* X86_64_9A */
5448   {
5449     { "Jcall{T|}", { Ap } },
5450     { "(bad)", { XX } },
5451   },
5452
5453   /* X86_64_C4 */
5454   {
5455     { MOD_TABLE (MOD_C4_32BIT) },
5456     { VEX_C4_TABLE (VEX_0F) },
5457   },
5458
5459   /* X86_64_C5 */
5460   {
5461     { MOD_TABLE (MOD_C5_32BIT) },
5462     { VEX_C5_TABLE (VEX_0F) },
5463   },
5464
5465   /* X86_64_CE */
5466   {
5467     { "into", { XX } },
5468     { "(bad)", { XX } },
5469   },
5470
5471   /* X86_64_D4 */
5472   {
5473     { "aam", { sIb } },
5474     { "(bad)", { XX } },
5475   },
5476
5477   /* X86_64_D5 */
5478   {
5479     { "aad", { sIb } },
5480     { "(bad)", { XX } },
5481   },
5482
5483   /* X86_64_EA */
5484   {
5485     { "Jjmp{T|}", { Ap } },
5486     { "(bad)", { XX } },
5487   },
5488
5489   /* X86_64_0F01_REG_0 */
5490   {
5491     { "sgdt{Q|IQ}", { M } },
5492     { "sgdt", { M } },
5493   },
5494
5495   /* X86_64_0F01_REG_1 */
5496   {
5497     { "sidt{Q|IQ}", { M } },
5498     { "sidt", { M } },
5499   },
5500
5501   /* X86_64_0F01_REG_2 */
5502   {
5503     { "lgdt{Q|Q}", { M } },
5504     { "lgdt", { M } },
5505   },
5506
5507   /* X86_64_0F01_REG_3 */
5508   {
5509     { "lidt{Q|Q}", { M } },
5510     { "lidt", { M } },
5511   },
5512 };
5513
5514 static const struct dis386 three_byte_table[][256] = {
5515
5516   /* THREE_BYTE_0F38 */
5517   {
5518     /* 00 */
5519     { "pshufb",         { MX, EM } },
5520     { "phaddw",         { MX, EM } },
5521     { "phaddd",         { MX, EM } },
5522     { "phaddsw",        { MX, EM } },
5523     { "pmaddubsw",      { MX, EM } },
5524     { "phsubw",         { MX, EM } },
5525     { "phsubd",         { MX, EM } },
5526     { "phsubsw",        { MX, EM } },
5527     /* 08 */
5528     { "psignb",         { MX, EM } },
5529     { "psignw",         { MX, EM } },
5530     { "psignd",         { MX, EM } },
5531     { "pmulhrsw",       { MX, EM } },
5532     { "(bad)",          { XX } },
5533     { "(bad)",          { XX } },
5534     { "(bad)",          { XX } },
5535     { "(bad)",          { XX } },
5536     /* 10 */
5537     { PREFIX_TABLE (PREFIX_0F3810) },
5538     { "(bad)",          { XX } },
5539     { "(bad)",          { XX } },
5540     { "(bad)",          { XX } },
5541     { PREFIX_TABLE (PREFIX_0F3814) },
5542     { PREFIX_TABLE (PREFIX_0F3815) },
5543     { "(bad)",          { XX } },
5544     { PREFIX_TABLE (PREFIX_0F3817) },
5545     /* 18 */
5546     { "(bad)",          { XX } },
5547     { "(bad)",          { XX } },
5548     { "(bad)",          { XX } },
5549     { "(bad)",          { XX } },
5550     { "pabsb",          { MX, EM } },
5551     { "pabsw",          { MX, EM } },
5552     { "pabsd",          { MX, EM } },
5553     { "(bad)",          { XX } },
5554     /* 20 */
5555     { PREFIX_TABLE (PREFIX_0F3820) },
5556     { PREFIX_TABLE (PREFIX_0F3821) },
5557     { PREFIX_TABLE (PREFIX_0F3822) },
5558     { PREFIX_TABLE (PREFIX_0F3823) },
5559     { PREFIX_TABLE (PREFIX_0F3824) },
5560     { PREFIX_TABLE (PREFIX_0F3825) },
5561     { "(bad)",          { XX } },
5562     { "(bad)",          { XX } },
5563     /* 28 */
5564     { PREFIX_TABLE (PREFIX_0F3828) },
5565     { PREFIX_TABLE (PREFIX_0F3829) },
5566     { PREFIX_TABLE (PREFIX_0F382A) },
5567     { PREFIX_TABLE (PREFIX_0F382B) },
5568     { "(bad)",          { XX } },
5569     { "(bad)",          { XX } },
5570     { "(bad)",          { XX } },
5571     { "(bad)",          { XX } },
5572     /* 30 */
5573     { PREFIX_TABLE (PREFIX_0F3830) },
5574     { PREFIX_TABLE (PREFIX_0F3831) },
5575     { PREFIX_TABLE (PREFIX_0F3832) },
5576     { PREFIX_TABLE (PREFIX_0F3833) },
5577     { PREFIX_TABLE (PREFIX_0F3834) },
5578     { PREFIX_TABLE (PREFIX_0F3835) },
5579     { "(bad)",          { XX } },
5580     { PREFIX_TABLE (PREFIX_0F3837) },
5581     /* 38 */
5582     { PREFIX_TABLE (PREFIX_0F3838) },
5583     { PREFIX_TABLE (PREFIX_0F3839) },
5584     { PREFIX_TABLE (PREFIX_0F383A) },
5585     { PREFIX_TABLE (PREFIX_0F383B) },
5586     { PREFIX_TABLE (PREFIX_0F383C) },
5587     { PREFIX_TABLE (PREFIX_0F383D) },
5588     { PREFIX_TABLE (PREFIX_0F383E) },
5589     { PREFIX_TABLE (PREFIX_0F383F) },
5590     /* 40 */
5591     { PREFIX_TABLE (PREFIX_0F3840) },
5592     { PREFIX_TABLE (PREFIX_0F3841) },
5593     { "(bad)",          { XX } },
5594     { "(bad)",          { XX } },
5595     { "(bad)",          { XX } },
5596     { "(bad)",          { XX } },
5597     { "(bad)",          { XX } },
5598     { "(bad)",          { XX } },
5599     /* 48 */
5600     { "(bad)",          { XX } },
5601     { "(bad)",          { XX } },
5602     { "(bad)",          { XX } },
5603     { "(bad)",          { XX } },
5604     { "(bad)",          { XX } },
5605     { "(bad)",          { XX } },
5606     { "(bad)",          { XX } },
5607     { "(bad)",          { XX } },
5608     /* 50 */
5609     { "(bad)",          { XX } },
5610     { "(bad)",          { XX } },
5611     { "(bad)",          { XX } },
5612     { "(bad)",          { XX } },
5613     { "(bad)",          { XX } },
5614     { "(bad)",          { XX } },
5615     { "(bad)",          { XX } },
5616     { "(bad)",          { XX } },
5617     /* 58 */
5618     { "(bad)",          { XX } },
5619     { "(bad)",          { XX } },
5620     { "(bad)",          { XX } },
5621     { "(bad)",          { XX } },
5622     { "(bad)",          { XX } },
5623     { "(bad)",          { XX } },
5624     { "(bad)",          { XX } },
5625     { "(bad)",          { XX } },
5626     /* 60 */
5627     { "(bad)",          { XX } },
5628     { "(bad)",          { XX } },
5629     { "(bad)",          { XX } },
5630     { "(bad)",          { XX } },
5631     { "(bad)",          { XX } },
5632     { "(bad)",          { XX } },
5633     { "(bad)",          { XX } },
5634     { "(bad)",          { XX } },
5635     /* 68 */
5636     { "(bad)",          { XX } },
5637     { "(bad)",          { XX } },
5638     { "(bad)",          { XX } },
5639     { "(bad)",          { XX } },
5640     { "(bad)",          { XX } },
5641     { "(bad)",          { XX } },
5642     { "(bad)",          { XX } },
5643     { "(bad)",          { XX } },
5644     /* 70 */
5645     { "(bad)",          { XX } },
5646     { "(bad)",          { XX } },
5647     { "(bad)",          { XX } },
5648     { "(bad)",          { XX } },
5649     { "(bad)",          { XX } },
5650     { "(bad)",          { XX } },
5651     { "(bad)",          { XX } },
5652     { "(bad)",          { XX } },
5653     /* 78 */
5654     { "(bad)",          { XX } },
5655     { "(bad)",          { XX } },
5656     { "(bad)",          { XX } },
5657     { "(bad)",          { XX } },
5658     { "(bad)",          { XX } },
5659     { "(bad)",          { XX } },
5660     { "(bad)",          { XX } },
5661     { "(bad)",          { XX } },
5662     /* 80 */
5663     { PREFIX_TABLE (PREFIX_0F3880) },
5664     { PREFIX_TABLE (PREFIX_0F3881) },
5665     { "(bad)",          { XX } },
5666     { "(bad)",          { XX } },
5667     { "(bad)",          { XX } },
5668     { "(bad)",          { XX } },
5669     { "(bad)",          { XX } },
5670     { "(bad)",          { XX } },
5671     /* 88 */
5672     { "(bad)",          { XX } },
5673     { "(bad)",          { XX } },
5674     { "(bad)",          { XX } },
5675     { "(bad)",          { XX } },
5676     { "(bad)",          { XX } },
5677     { "(bad)",          { XX } },
5678     { "(bad)",          { XX } },
5679     { "(bad)",          { XX } },
5680     /* 90 */
5681     { "(bad)",          { XX } },
5682     { "(bad)",          { XX } },
5683     { "(bad)",          { XX } },
5684     { "(bad)",          { XX } },
5685     { "(bad)",          { XX } },
5686     { "(bad)",          { XX } },
5687     { "(bad)",          { XX } },
5688     { "(bad)",          { XX } },
5689     /* 98 */
5690     { "(bad)",          { XX } },
5691     { "(bad)",          { XX } },
5692     { "(bad)",          { XX } },
5693     { "(bad)",          { XX } },
5694     { "(bad)",          { XX } },
5695     { "(bad)",          { XX } },
5696     { "(bad)",          { XX } },
5697     { "(bad)",          { XX } },
5698     /* a0 */
5699     { "(bad)",          { XX } },
5700     { "(bad)",          { XX } },
5701     { "(bad)",          { XX } },
5702     { "(bad)",          { XX } },
5703     { "(bad)",          { XX } },
5704     { "(bad)",          { XX } },
5705     { "(bad)",          { XX } },
5706     { "(bad)",          { XX } },
5707     /* a8 */
5708     { "(bad)",          { XX } },
5709     { "(bad)",          { XX } },
5710     { "(bad)",          { XX } },
5711     { "(bad)",          { XX } },
5712     { "(bad)",          { XX } },
5713     { "(bad)",          { XX } },
5714     { "(bad)",          { XX } },
5715     { "(bad)",          { XX } },
5716     /* b0 */
5717     { "(bad)",          { XX } },
5718     { "(bad)",          { XX } },
5719     { "(bad)",          { XX } },
5720     { "(bad)",          { XX } },
5721     { "(bad)",          { XX } },
5722     { "(bad)",          { XX } },
5723     { "(bad)",          { XX } },
5724     { "(bad)",          { XX } },
5725     /* b8 */
5726     { "(bad)",          { XX } },
5727     { "(bad)",          { XX } },
5728     { "(bad)",          { XX } },
5729     { "(bad)",          { XX } },
5730     { "(bad)",          { XX } },
5731     { "(bad)",          { XX } },
5732     { "(bad)",          { XX } },
5733     { "(bad)",          { XX } },
5734     /* c0 */
5735     { "(bad)",          { XX } },
5736     { "(bad)",          { XX } },
5737     { "(bad)",          { XX } },
5738     { "(bad)",          { XX } },
5739     { "(bad)",          { XX } },
5740     { "(bad)",          { XX } },
5741     { "(bad)",          { XX } },
5742     { "(bad)",          { XX } },
5743     /* c8 */
5744     { "(bad)",          { XX } },
5745     { "(bad)",          { XX } },
5746     { "(bad)",          { XX } },
5747     { "(bad)",          { XX } },
5748     { "(bad)",          { XX } },
5749     { "(bad)",          { XX } },
5750     { "(bad)",          { XX } },
5751     { "(bad)",          { XX } },
5752     /* d0 */
5753     { "(bad)",          { XX } },
5754     { "(bad)",          { XX } },
5755     { "(bad)",          { XX } },
5756     { "(bad)",          { XX } },
5757     { "(bad)",          { XX } },
5758     { "(bad)",          { XX } },
5759     { "(bad)",          { XX } },
5760     { "(bad)",          { XX } },
5761     /* d8 */
5762     { "(bad)",          { XX } },
5763     { "(bad)",          { XX } },
5764     { "(bad)",          { XX } },
5765     { PREFIX_TABLE (PREFIX_0F38DB) },
5766     { PREFIX_TABLE (PREFIX_0F38DC) },
5767     { PREFIX_TABLE (PREFIX_0F38DD) },
5768     { PREFIX_TABLE (PREFIX_0F38DE) },
5769     { PREFIX_TABLE (PREFIX_0F38DF) },
5770     /* e0 */
5771     { "(bad)",          { XX } },
5772     { "(bad)",          { XX } },
5773     { "(bad)",          { XX } },
5774     { "(bad)",          { XX } },
5775     { "(bad)",          { XX } },
5776     { "(bad)",          { XX } },
5777     { "(bad)",          { XX } },
5778     { "(bad)",          { XX } },
5779     /* e8 */
5780     { "(bad)",          { XX } },
5781     { "(bad)",          { XX } },
5782     { "(bad)",          { XX } },
5783     { "(bad)",          { XX } },
5784     { "(bad)",          { XX } },
5785     { "(bad)",          { XX } },
5786     { "(bad)",          { XX } },
5787     { "(bad)",          { XX } },
5788     /* f0 */
5789     { PREFIX_TABLE (PREFIX_0F38F0) },
5790     { PREFIX_TABLE (PREFIX_0F38F1) },
5791     { "(bad)",          { XX } },
5792     { "(bad)",          { XX } },
5793     { "(bad)",          { XX } },
5794     { "(bad)",          { XX } },
5795     { "(bad)",          { XX } },
5796     { "(bad)",          { XX } },
5797     /* f8 */
5798     { "(bad)",          { XX } },
5799     { "(bad)",          { XX } },
5800     { "(bad)",          { XX } },
5801     { "(bad)",          { XX } },
5802     { "(bad)",          { XX } },
5803     { "(bad)",          { XX } },
5804     { "(bad)",          { XX } },
5805     { "(bad)",          { XX } },
5806   },
5807   /* THREE_BYTE_0F3A */
5808   {
5809     /* 00 */
5810     { "(bad)",          { XX } },
5811     { "(bad)",          { XX } },
5812     { "(bad)",          { XX } },
5813     { "(bad)",          { XX } },
5814     { "(bad)",          { XX } },
5815     { "(bad)",          { XX } },
5816     { "(bad)",          { XX } },
5817     { "(bad)",          { XX } },
5818     /* 08 */
5819     { PREFIX_TABLE (PREFIX_0F3A08) },
5820     { PREFIX_TABLE (PREFIX_0F3A09) },
5821     { PREFIX_TABLE (PREFIX_0F3A0A) },
5822     { PREFIX_TABLE (PREFIX_0F3A0B) },
5823     { PREFIX_TABLE (PREFIX_0F3A0C) },
5824     { PREFIX_TABLE (PREFIX_0F3A0D) },
5825     { PREFIX_TABLE (PREFIX_0F3A0E) },
5826     { "palignr",        { MX, EM, Ib } },
5827     /* 10 */
5828     { "(bad)",          { XX } },
5829     { "(bad)",          { XX } },
5830     { "(bad)",          { XX } },
5831     { "(bad)",          { XX } },
5832     { PREFIX_TABLE (PREFIX_0F3A14) },
5833     { PREFIX_TABLE (PREFIX_0F3A15) },
5834     { PREFIX_TABLE (PREFIX_0F3A16) },
5835     { PREFIX_TABLE (PREFIX_0F3A17) },
5836     /* 18 */
5837     { "(bad)",          { XX } },
5838     { "(bad)",          { XX } },
5839     { "(bad)",          { XX } },
5840     { "(bad)",          { XX } },
5841     { "(bad)",          { XX } },
5842     { "(bad)",          { XX } },
5843     { "(bad)",          { XX } },
5844     { "(bad)",          { XX } },
5845     /* 20 */
5846     { PREFIX_TABLE (PREFIX_0F3A20) },
5847     { PREFIX_TABLE (PREFIX_0F3A21) },
5848     { PREFIX_TABLE (PREFIX_0F3A22) },
5849     { "(bad)",          { XX } },
5850     { "(bad)",          { XX } },
5851     { "(bad)",          { XX } },
5852     { "(bad)",          { XX } },
5853     { "(bad)",          { XX } },
5854     /* 28 */
5855     { "(bad)",          { XX } },
5856     { "(bad)",          { XX } },
5857     { "(bad)",          { XX } },
5858     { "(bad)",          { XX } },
5859     { "(bad)",          { XX } },
5860     { "(bad)",          { XX } },
5861     { "(bad)",          { XX } },
5862     { "(bad)",          { XX } },
5863     /* 30 */
5864     { "(bad)",          { XX } },
5865     { "(bad)",          { XX } },
5866     { "(bad)",          { XX } },
5867     { "(bad)",          { XX } },
5868     { "(bad)",          { XX } },
5869     { "(bad)",          { XX } },
5870     { "(bad)",          { XX } },
5871     { "(bad)",          { XX } },
5872     /* 38 */
5873     { "(bad)",          { XX } },
5874     { "(bad)",          { XX } },
5875     { "(bad)",          { XX } },
5876     { "(bad)",          { XX } },
5877     { "(bad)",          { XX } },
5878     { "(bad)",          { XX } },
5879     { "(bad)",          { XX } },
5880     { "(bad)",          { XX } },
5881     /* 40 */
5882     { PREFIX_TABLE (PREFIX_0F3A40) },
5883     { PREFIX_TABLE (PREFIX_0F3A41) },
5884     { PREFIX_TABLE (PREFIX_0F3A42) },
5885     { "(bad)",          { XX } },
5886     { PREFIX_TABLE (PREFIX_0F3A44) },
5887     { "(bad)",          { XX } },
5888     { "(bad)",          { XX } },
5889     { "(bad)",          { XX } },
5890     /* 48 */
5891     { "(bad)",          { XX } },
5892     { "(bad)",          { XX } },
5893     { "(bad)",          { XX } },
5894     { "(bad)",          { XX } },
5895     { "(bad)",          { XX } },
5896     { "(bad)",          { XX } },
5897     { "(bad)",          { XX } },
5898     { "(bad)",          { XX } },
5899     /* 50 */
5900     { "(bad)",          { XX } },
5901     { "(bad)",          { XX } },
5902     { "(bad)",          { XX } },
5903     { "(bad)",          { XX } },
5904     { "(bad)",          { XX } },
5905     { "(bad)",          { XX } },
5906     { "(bad)",          { XX } },
5907     { "(bad)",          { XX } },
5908     /* 58 */
5909     { "(bad)",          { XX } },
5910     { "(bad)",          { XX } },
5911     { "(bad)",          { XX } },
5912     { "(bad)",          { XX } },
5913     { "(bad)",          { XX } },
5914     { "(bad)",          { XX } },
5915     { "(bad)",          { XX } },
5916     { "(bad)",          { XX } },
5917     /* 60 */
5918     { PREFIX_TABLE (PREFIX_0F3A60) },
5919     { PREFIX_TABLE (PREFIX_0F3A61) },
5920     { PREFIX_TABLE (PREFIX_0F3A62) },
5921     { PREFIX_TABLE (PREFIX_0F3A63) },
5922     { "(bad)",          { XX } },
5923     { "(bad)",          { XX } },
5924     { "(bad)",          { XX } },
5925     { "(bad)",          { XX } },
5926     /* 68 */
5927     { "(bad)",          { XX } },
5928     { "(bad)",          { XX } },
5929     { "(bad)",          { XX } },
5930     { "(bad)",          { XX } },
5931     { "(bad)",          { XX } },
5932     { "(bad)",          { XX } },
5933     { "(bad)",          { XX } },
5934     { "(bad)",          { XX } },
5935     /* 70 */
5936     { "(bad)",          { XX } },
5937     { "(bad)",          { XX } },
5938     { "(bad)",          { XX } },
5939     { "(bad)",          { XX } },
5940     { "(bad)",          { XX } },
5941     { "(bad)",          { XX } },
5942     { "(bad)",          { XX } },
5943     { "(bad)",          { XX } },
5944     /* 78 */
5945     { "(bad)",          { XX } },
5946     { "(bad)",          { XX } },
5947     { "(bad)",          { XX } },
5948     { "(bad)",          { XX } },
5949     { "(bad)",          { XX } },
5950     { "(bad)",          { XX } },
5951     { "(bad)",          { XX } },
5952     { "(bad)",          { XX } },
5953     /* 80 */
5954     { "(bad)",          { XX } },
5955     { "(bad)",          { XX } },
5956     { "(bad)",          { XX } },
5957     { "(bad)",          { XX } },
5958     { "(bad)",          { XX } },
5959     { "(bad)",          { XX } },
5960     { "(bad)",          { XX } },
5961     { "(bad)",          { XX } },
5962     /* 88 */
5963     { "(bad)",          { XX } },
5964     { "(bad)",          { XX } },
5965     { "(bad)",          { XX } },
5966     { "(bad)",          { XX } },
5967     { "(bad)",          { XX } },
5968     { "(bad)",          { XX } },
5969     { "(bad)",          { XX } },
5970     { "(bad)",          { XX } },
5971     /* 90 */
5972     { "(bad)",          { XX } },
5973     { "(bad)",          { XX } },
5974     { "(bad)",          { XX } },
5975     { "(bad)",          { XX } },
5976     { "(bad)",          { XX } },
5977     { "(bad)",          { XX } },
5978     { "(bad)",          { XX } },
5979     { "(bad)",          { XX } },
5980     /* 98 */
5981     { "(bad)",          { XX } },
5982     { "(bad)",          { XX } },
5983     { "(bad)",          { XX } },
5984     { "(bad)",          { XX } },
5985     { "(bad)",          { XX } },
5986     { "(bad)",          { XX } },
5987     { "(bad)",          { XX } },
5988     { "(bad)",          { XX } },
5989     /* a0 */
5990     { "(bad)",          { XX } },
5991     { "(bad)",          { XX } },
5992     { "(bad)",          { XX } },
5993     { "(bad)",          { XX } },
5994     { "(bad)",          { XX } },
5995     { "(bad)",          { XX } },
5996     { "(bad)",          { XX } },
5997     { "(bad)",          { XX } },
5998     /* a8 */
5999     { "(bad)",          { XX } },
6000     { "(bad)",          { XX } },
6001     { "(bad)",          { XX } },
6002     { "(bad)",          { XX } },
6003     { "(bad)",          { XX } },
6004     { "(bad)",          { XX } },
6005     { "(bad)",          { XX } },
6006     { "(bad)",          { XX } },
6007     /* b0 */
6008     { "(bad)",          { XX } },
6009     { "(bad)",          { XX } },
6010     { "(bad)",          { XX } },
6011     { "(bad)",          { XX } },
6012     { "(bad)",          { XX } },
6013     { "(bad)",          { XX } },
6014     { "(bad)",          { XX } },
6015     { "(bad)",          { XX } },
6016     /* b8 */
6017     { "(bad)",          { XX } },
6018     { "(bad)",          { XX } },
6019     { "(bad)",          { XX } },
6020     { "(bad)",          { XX } },
6021     { "(bad)",          { XX } },
6022     { "(bad)",          { XX } },
6023     { "(bad)",          { XX } },
6024     { "(bad)",          { XX } },
6025     /* c0 */
6026     { "(bad)",          { XX } },
6027     { "(bad)",          { XX } },
6028     { "(bad)",          { XX } },
6029     { "(bad)",          { XX } },
6030     { "(bad)",          { XX } },
6031     { "(bad)",          { XX } },
6032     { "(bad)",          { XX } },
6033     { "(bad)",          { XX } },
6034     /* c8 */
6035     { "(bad)",          { XX } },
6036     { "(bad)",          { XX } },
6037     { "(bad)",          { XX } },
6038     { "(bad)",          { XX } },
6039     { "(bad)",          { XX } },
6040     { "(bad)",          { XX } },
6041     { "(bad)",          { XX } },
6042     { "(bad)",          { XX } },
6043     /* d0 */
6044     { "(bad)",          { XX } },
6045     { "(bad)",          { XX } },
6046     { "(bad)",          { XX } },
6047     { "(bad)",          { XX } },
6048     { "(bad)",          { XX } },
6049     { "(bad)",          { XX } },
6050     { "(bad)",          { XX } },
6051     { "(bad)",          { XX } },
6052     /* d8 */
6053     { "(bad)",          { XX } },
6054     { "(bad)",          { XX } },
6055     { "(bad)",          { XX } },
6056     { "(bad)",          { XX } },
6057     { "(bad)",          { XX } },
6058     { "(bad)",          { XX } },
6059     { "(bad)",          { XX } },
6060     { PREFIX_TABLE (PREFIX_0F3ADF) },
6061     /* e0 */
6062     { "(bad)",          { XX } },
6063     { "(bad)",          { XX } },
6064     { "(bad)",          { XX } },
6065     { "(bad)",          { XX } },
6066     { "(bad)",          { XX } },
6067     { "(bad)",          { XX } },
6068     { "(bad)",          { XX } },
6069     { "(bad)",          { XX } },
6070     /* e8 */
6071     { "(bad)",          { XX } },
6072     { "(bad)",          { XX } },
6073     { "(bad)",          { XX } },
6074     { "(bad)",          { XX } },
6075     { "(bad)",          { XX } },
6076     { "(bad)",          { XX } },
6077     { "(bad)",          { XX } },
6078     { "(bad)",          { XX } },
6079     /* f0 */
6080     { "(bad)",          { XX } },
6081     { "(bad)",          { XX } },
6082     { "(bad)",          { XX } },
6083     { "(bad)",          { XX } },
6084     { "(bad)",          { XX } },
6085     { "(bad)",          { XX } },
6086     { "(bad)",          { XX } },
6087     { "(bad)",          { XX } },
6088     /* f8 */
6089     { "(bad)",          { XX } },
6090     { "(bad)",          { XX } },
6091     { "(bad)",          { XX } },
6092     { "(bad)",          { XX } },
6093     { "(bad)",          { XX } },
6094     { "(bad)",          { XX } },
6095     { "(bad)",          { XX } },
6096     { "(bad)",          { XX } },
6097   },
6098
6099   /* THREE_BYTE_0F7A */
6100   {
6101     /* 00 */
6102     { "(bad)",          { XX } },
6103     { "(bad)",          { XX } },
6104     { "(bad)",          { XX } },
6105     { "(bad)",          { XX } },
6106     { "(bad)",          { XX } },
6107     { "(bad)",          { XX } },
6108     { "(bad)",          { XX } },
6109     { "(bad)",          { XX } },
6110     /* 08 */
6111     { "(bad)",          { XX } },
6112     { "(bad)",          { XX } },
6113     { "(bad)",          { XX } },
6114     { "(bad)",          { XX } },
6115     { "(bad)",          { XX } },
6116     { "(bad)",          { XX } },
6117     { "(bad)",          { XX } },
6118     { "(bad)",          { XX } },
6119     /* 10 */
6120     { "(bad)",          { XX } },
6121     { "(bad)",          { XX } },
6122     { "(bad)",          { XX } },
6123     { "(bad)",          { XX } },
6124     { "(bad)",          { XX } },
6125     { "(bad)",          { XX } },
6126     { "(bad)",          { XX } },
6127     { "(bad)",          { XX } },
6128     /* 18 */
6129     { "(bad)",          { XX } },
6130     { "(bad)",          { XX } },
6131     { "(bad)",          { XX } },
6132     { "(bad)",          { XX } },
6133     { "(bad)",          { XX } },
6134     { "(bad)",          { XX } },
6135     { "(bad)",          { XX } },
6136     { "(bad)",          { XX } },
6137     /* 20 */
6138     { "ptest",          { XX } },
6139     { "(bad)",          { XX } },
6140     { "(bad)",          { XX } },
6141     { "(bad)",          { XX } },
6142     { "(bad)",          { XX } },
6143     { "(bad)",          { XX } },
6144     { "(bad)",          { XX } },
6145     { "(bad)",          { XX } },
6146     /* 28 */
6147     { "(bad)",          { XX } },
6148     { "(bad)",          { XX } },
6149     { "(bad)",          { XX } },
6150     { "(bad)",          { XX } },
6151     { "(bad)",          { XX } },
6152     { "(bad)",          { XX } },
6153     { "(bad)",          { XX } },
6154     { "(bad)",          { XX } },
6155     /* 30 */
6156     { "(bad)",          { XX } },
6157     { "(bad)",          { XX } },
6158     { "(bad)",          { XX } },
6159     { "(bad)",          { XX } },
6160     { "(bad)",          { XX } },
6161     { "(bad)",          { XX } },
6162     { "(bad)",          { XX } },
6163     { "(bad)",          { XX } },
6164     /* 38 */
6165     { "(bad)",          { XX } },
6166     { "(bad)",          { XX } },
6167     { "(bad)",          { XX } },
6168     { "(bad)",          { XX } },
6169     { "(bad)",          { XX } },
6170     { "(bad)",          { XX } },
6171     { "(bad)",          { XX } },
6172     { "(bad)",          { XX } },
6173     /* 40 */
6174     { "(bad)",          { XX } },
6175     { "phaddbw",        { XM, EXq } },
6176     { "phaddbd",        { XM, EXq } },
6177     { "phaddbq",        { XM, EXq } },
6178     { "(bad)",          { XX } },
6179     { "(bad)",          { XX } },
6180     { "phaddwd",        { XM, EXq } },
6181     { "phaddwq",        { XM, EXq } },
6182     /* 48 */
6183     { "(bad)",          { XX } },
6184     { "(bad)",          { XX } },
6185     { "(bad)",          { XX } },
6186     { "phadddq",        { XM, EXq } },
6187     { "(bad)",          { XX } },
6188     { "(bad)",          { XX } },
6189     { "(bad)",          { XX } },
6190     { "(bad)",          { XX } },
6191     /* 50 */
6192     { "(bad)",          { XX } },
6193     { "phaddubw",       { XM, EXq } },
6194     { "phaddubd",       { XM, EXq } },
6195     { "phaddubq",       { XM, EXq } },
6196     { "(bad)",          { XX } },
6197     { "(bad)",          { XX } },
6198     { "phadduwd",       { XM, EXq } },
6199     { "phadduwq",       { XM, EXq } },
6200     /* 58 */
6201     { "(bad)",          { XX } },
6202     { "(bad)",          { XX } },
6203     { "(bad)",          { XX } },
6204     { "phaddudq",       { XM, EXq } },
6205     { "(bad)",          { XX } },
6206     { "(bad)",          { XX } },
6207     { "(bad)",          { XX } },
6208     { "(bad)",          { XX } },
6209     /* 60 */
6210     { "(bad)",          { XX } },
6211     { "phsubbw",        { XM, EXq } },
6212     { "phsubbd",        { XM, EXq } },
6213     { "phsubbq",        { XM, EXq } },
6214     { "(bad)",          { XX } },
6215     { "(bad)",          { XX } },
6216     { "(bad)",          { XX } },
6217     { "(bad)",          { XX } },
6218     /* 68 */
6219     { "(bad)",          { XX } },
6220     { "(bad)",          { XX } },
6221     { "(bad)",          { XX } },
6222     { "(bad)",          { XX } },
6223     { "(bad)",          { XX } },
6224     { "(bad)",          { XX } },
6225     { "(bad)",          { XX } },
6226     { "(bad)",          { XX } },
6227     /* 70 */
6228     { "(bad)",          { XX } },
6229     { "(bad)",          { XX } },
6230     { "(bad)",          { XX } },
6231     { "(bad)",          { XX } },
6232     { "(bad)",          { XX } },
6233     { "(bad)",          { XX } },
6234     { "(bad)",          { XX } },
6235     { "(bad)",          { XX } },
6236     /* 78 */
6237     { "(bad)",          { XX } },
6238     { "(bad)",          { XX } },
6239     { "(bad)",          { XX } },
6240     { "(bad)",          { XX } },
6241     { "(bad)",          { XX } },
6242     { "(bad)",          { XX } },
6243     { "(bad)",          { XX } },
6244     { "(bad)",          { XX } },
6245     /* 80 */
6246     { "(bad)",          { XX } },
6247     { "(bad)",          { XX } },
6248     { "(bad)",          { XX } },
6249     { "(bad)",          { XX } },
6250     { "(bad)",          { XX } },
6251     { "(bad)",          { XX } },
6252     { "(bad)",          { XX } },
6253     { "(bad)",          { XX } },
6254     /* 88 */
6255     { "(bad)",          { XX } },
6256     { "(bad)",          { XX } },
6257     { "(bad)",          { XX } },
6258     { "(bad)",          { XX } },
6259     { "(bad)",          { XX } },
6260     { "(bad)",          { XX } },
6261     { "(bad)",          { XX } },
6262     { "(bad)",          { XX } },
6263     /* 90 */
6264     { "(bad)",          { XX } },
6265     { "(bad)",          { XX } },
6266     { "(bad)",          { XX } },
6267     { "(bad)",          { XX } },
6268     { "(bad)",          { XX } },
6269     { "(bad)",          { XX } },
6270     { "(bad)",          { XX } },
6271     { "(bad)",          { XX } },
6272     /* 98 */
6273     { "(bad)",          { XX } },
6274     { "(bad)",          { XX } },
6275     { "(bad)",          { XX } },
6276     { "(bad)",          { XX } },
6277     { "(bad)",          { XX } },
6278     { "(bad)",          { XX } },
6279     { "(bad)",          { XX } },
6280     { "(bad)",          { XX } },
6281     /* a0 */
6282     { "(bad)",          { XX } },
6283     { "(bad)",          { XX } },
6284     { "(bad)",          { XX } },
6285     { "(bad)",          { XX } },
6286     { "(bad)",          { XX } },
6287     { "(bad)",          { XX } },
6288     { "(bad)",          { XX } },
6289     { "(bad)",          { XX } },
6290     /* a8 */
6291     { "(bad)",          { XX } },
6292     { "(bad)",          { XX } },
6293     { "(bad)",          { XX } },
6294     { "(bad)",          { XX } },
6295     { "(bad)",          { XX } },
6296     { "(bad)",          { XX } },
6297     { "(bad)",          { XX } },
6298     { "(bad)",          { XX } },
6299     /* b0 */
6300     { "(bad)",          { XX } },
6301     { "(bad)",          { XX } },
6302     { "(bad)",          { XX } },
6303     { "(bad)",          { XX } },
6304     { "(bad)",          { XX } },
6305     { "(bad)",          { XX } },
6306     { "(bad)",          { XX } },
6307     { "(bad)",          { XX } },
6308     /* b8 */
6309     { "(bad)",          { XX } },
6310     { "(bad)",          { XX } },
6311     { "(bad)",          { XX } },
6312     { "(bad)",          { XX } },
6313     { "(bad)",          { XX } },
6314     { "(bad)",          { XX } },
6315     { "(bad)",          { XX } },
6316     { "(bad)",          { XX } },
6317     /* c0 */
6318     { "(bad)",          { XX } },
6319     { "(bad)",          { XX } },
6320     { "(bad)",          { XX } },
6321     { "(bad)",          { XX } },
6322     { "(bad)",          { XX } },
6323     { "(bad)",          { XX } },
6324     { "(bad)",          { XX } },
6325     { "(bad)",          { XX } },
6326     /* c8 */
6327     { "(bad)",          { XX } },
6328     { "(bad)",          { XX } },
6329     { "(bad)",          { XX } },
6330     { "(bad)",          { XX } },
6331     { "(bad)",          { XX } },
6332     { "(bad)",          { XX } },
6333     { "(bad)",          { XX } },
6334     { "(bad)",          { XX } },
6335     /* d0 */
6336     { "(bad)",          { XX } },
6337     { "(bad)",          { XX } },
6338     { "(bad)",          { XX } },
6339     { "(bad)",          { XX } },
6340     { "(bad)",          { XX } },
6341     { "(bad)",          { XX } },
6342     { "(bad)",          { XX } },
6343     { "(bad)",          { XX } },
6344     /* d8 */
6345     { "(bad)",          { XX } },
6346     { "(bad)",          { XX } },
6347     { "(bad)",          { XX } },
6348     { "(bad)",          { XX } },
6349     { "(bad)",          { XX } },
6350     { "(bad)",          { XX } },
6351     { "(bad)",          { XX } },
6352     { "(bad)",          { XX } },
6353     /* e0 */
6354     { "(bad)",          { XX } },
6355     { "(bad)",          { XX } },
6356     { "(bad)",          { XX } },
6357     { "(bad)",          { XX } },
6358     { "(bad)",          { XX } },
6359     { "(bad)",          { XX } },
6360     { "(bad)",          { XX } },
6361     { "(bad)",          { XX } },
6362     /* e8 */
6363     { "(bad)",          { XX } },
6364     { "(bad)",          { XX } },
6365     { "(bad)",          { XX } },
6366     { "(bad)",          { XX } },
6367     { "(bad)",          { XX } },
6368     { "(bad)",          { XX } },
6369     { "(bad)",          { XX } },
6370     { "(bad)",          { XX } },
6371     /* f0 */
6372     { "(bad)",          { XX } },
6373     { "(bad)",          { XX } },
6374     { "(bad)",          { XX } },
6375     { "(bad)",          { XX } },
6376     { "(bad)",          { XX } },
6377     { "(bad)",          { XX } },
6378     { "(bad)",          { XX } },
6379     { "(bad)",          { XX } },
6380     /* f8 */
6381     { "(bad)",          { XX } },
6382     { "(bad)",          { XX } },
6383     { "(bad)",          { XX } },
6384     { "(bad)",          { XX } },
6385     { "(bad)",          { XX } },
6386     { "(bad)",          { XX } },
6387     { "(bad)",          { XX } },
6388     { "(bad)",          { XX } },
6389   },
6390 };
6391
6392 static const struct dis386 xop_table[][256] = {
6393   /* XOP_08 */
6394   {
6395     /* 00 */
6396     { "(bad)",          { XX } },
6397     { "(bad)",          { XX } },
6398     { "(bad)",          { XX } },
6399     { "(bad)",          { XX } },
6400     { "(bad)",          { XX } },
6401     { "(bad)",          { XX } },
6402     { "(bad)",          { XX } },
6403     { "(bad)",          { XX } },
6404     /* 08 */
6405     { "(bad)",          { XX } },
6406     { "(bad)",          { XX } },
6407     { "(bad)",          { XX } },
6408     { "(bad)",          { XX } },
6409     { "(bad)",          { XX } },
6410     { "(bad)",          { XX } },
6411     { "(bad)",          { XX } },
6412     { "(bad)",          { XX } },
6413     /* 10 */
6414     { "(bad)",          { XX } },
6415     { "(bad)",          { XX } },
6416     { "(bad)",          { XX } },
6417     { "(bad)",          { XX } },
6418     { "(bad)",          { XX } },
6419     { "(bad)",          { XX } },
6420     { "(bad)",          { XX } },
6421     { "(bad)",          { XX } },
6422     /* 18 */
6423     { "(bad)",          { XX } },
6424     { "(bad)",          { XX } },
6425     { "(bad)",          { XX } },
6426     { "(bad)",          { XX } },
6427     { "(bad)",          { XX } },
6428     { "(bad)",          { XX } },
6429     { "(bad)",          { XX } },
6430     { "(bad)",          { XX } },
6431     /* 20 */
6432     { "(bad)",          { XX } },
6433     { "(bad)",          { XX } },
6434     { "(bad)",          { XX } },
6435     { "(bad)",          { XX } },
6436     { "(bad)",          { XX } },
6437     { "(bad)",          { XX } },
6438     { "(bad)",          { XX } },
6439     { "(bad)",          { XX } },
6440     /* 28 */
6441     { "(bad)",          { XX } },
6442     { "(bad)",          { XX } },
6443     { "(bad)",          { XX } },
6444     { "(bad)",          { XX } },
6445     { "(bad)",          { XX } },
6446     { "(bad)",          { XX } },
6447     { "(bad)",          { XX } },
6448     { "(bad)",          { XX } },
6449     /* 30 */
6450     { "(bad)",          { XX } },
6451     { "(bad)",          { XX } },
6452     { "(bad)",          { XX } },
6453     { "(bad)",          { XX } },
6454     { "(bad)",          { XX } },
6455     { "(bad)",          { XX } },
6456     { "(bad)",          { XX } },
6457     { "(bad)",          { XX } },
6458     /* 38 */
6459     { "(bad)",          { XX } },
6460     { "(bad)",          { XX } },
6461     { "(bad)",          { XX } },
6462     { "(bad)",          { XX } },
6463     { "(bad)",          { XX } },
6464     { "(bad)",          { XX } },
6465     { "(bad)",          { XX } },
6466     { "(bad)",          { XX } },
6467     /* 40 */
6468     { "(bad)",          { XX } },
6469     { "(bad)",          { XX } },
6470     { "(bad)",          { XX } },
6471     { "(bad)",          { XX } },
6472     { "(bad)",          { XX } },
6473     { "(bad)",          { XX } },
6474     { "(bad)",          { XX } },
6475     { "(bad)",          { XX } },
6476     /* 48 */
6477     { "(bad)",          { XX } },
6478     { "(bad)",          { XX } },
6479     { "(bad)",          { XX } },
6480     { "(bad)",          { XX } },
6481     { "(bad)",          { XX } },
6482     { "(bad)",          { XX } },
6483     { "(bad)",          { XX } },
6484     { "(bad)",          { XX } },
6485     /* 50 */
6486     { "(bad)",          { XX } },
6487     { "(bad)",          { XX } },
6488     { "(bad)",          { XX } },
6489     { "(bad)",          { XX } },
6490     { "(bad)",          { XX } },
6491     { "(bad)",          { XX } },
6492     { "(bad)",          { XX } },
6493     { "(bad)",          { XX } },
6494     /* 58 */
6495     { "(bad)",          { XX } },
6496     { "(bad)",          { XX } },
6497     { "(bad)",          { XX } },
6498     { "(bad)",          { XX } },
6499     { "(bad)",          { XX } },
6500     { "(bad)",          { XX } },
6501     { "(bad)",          { XX } },
6502     { "(bad)",          { XX } },
6503     /* 60 */
6504     { "(bad)",          { XX } },
6505     { "(bad)",          { XX } },
6506     { "(bad)",          { XX } },
6507     { "(bad)",          { XX } },
6508     { "(bad)",          { XX } },
6509     { "(bad)",          { XX } },
6510     { "(bad)",          { XX } },
6511     { "(bad)",          { XX } },
6512     /* 68 */
6513     { "(bad)",          { XX } },
6514     { "(bad)",          { XX } },
6515     { "(bad)",          { XX } },
6516     { "(bad)",          { XX } },
6517     { "(bad)",          { XX } },
6518     { "(bad)",          { XX } },
6519     { "(bad)",          { XX } },
6520     { "(bad)",          { XX } },
6521     /* 70 */
6522     { "(bad)",          { XX } },
6523     { "(bad)",          { XX } },
6524     { "(bad)",          { XX } },
6525     { "(bad)",          { XX } },
6526     { "(bad)",          { XX } },
6527     { "(bad)",          { XX } },
6528     { "(bad)",          { XX } },
6529     { "(bad)",          { XX } },
6530     /* 78 */
6531     { "(bad)",          { XX } },
6532     { "(bad)",          { XX } },
6533     { "(bad)",          { XX } },
6534     { "(bad)",          { XX } },
6535     { "(bad)",          { XX } },
6536     { "(bad)",          { XX } },
6537     { "(bad)",          { XX } },
6538     { "(bad)",          { XX } },
6539     /* 80 */
6540     { "(bad)",          { XX } },
6541     { "(bad)",          { XX } },
6542     { "(bad)",          { XX } },
6543     { "(bad)",          { XX } },
6544     { "(bad)",          { XX } },
6545     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6546     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6547     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6548     /* 88 */
6549     { "(bad)",          { XX } },
6550     { "(bad)",          { XX } },
6551     { "(bad)",          { XX } },
6552     { "(bad)",          { XX } },
6553     { "(bad)",          { XX } },
6554     { "(bad)",          { XX } },
6555     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6556     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6557     /* 90 */
6558     { "(bad)",          { XX } },
6559     { "(bad)",          { XX } },
6560     { "(bad)",          { XX } },
6561     { "(bad)",          { XX } },
6562     { "(bad)",          { XX } },
6563     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6564     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6565     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6566     /* 98 */
6567     { "(bad)",          { XX } },
6568     { "(bad)",          { XX } },
6569     { "(bad)",          { XX } },
6570     { "(bad)",          { XX } },
6571     { "(bad)",          { XX } },
6572     { "(bad)",          { XX } },
6573     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6574     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6575     /* a0 */
6576     { "(bad)",          { XX } },
6577     { "(bad)",          { XX } },
6578     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6579     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6580     { "(bad)",          { XX } },
6581     { "(bad)",          { XX } },
6582     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6583     { "(bad)",          { XX } },
6584     /* a8 */
6585     { "(bad)",          { XX } },
6586     { "(bad)",          { XX } },
6587     { "(bad)",          { XX } },
6588     { "(bad)",          { XX } },
6589     { "(bad)",          { XX } },
6590     { "(bad)",          { XX } },
6591     { "(bad)",          { XX } },
6592     { "(bad)",          { XX } },
6593     /* b0 */
6594     { "(bad)",          { XX } },
6595     { "(bad)",          { XX } },
6596     { "(bad)",          { XX } },
6597     { "(bad)",          { XX } },
6598     { "(bad)",          { XX } },
6599     { "(bad)",          { XX } },
6600     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6601     { "(bad)",          { XX } },
6602     /* b8 */
6603     { "(bad)",          { XX } },
6604     { "(bad)",          { XX } },
6605     { "(bad)",          { XX } },
6606     { "(bad)",          { XX } },
6607     { "(bad)",          { XX } },
6608     { "(bad)",          { XX } },
6609     { "(bad)",          { XX } },
6610     { "(bad)",          { XX } },
6611     /* c0 */
6612     { "vprotb",         { XM, Vex_2src_1, Ib } },
6613     { "vprotw",         { XM, Vex_2src_1, Ib } },
6614     { "vprotd",         { XM, Vex_2src_1, Ib } },
6615     { "vprotq",         { XM, Vex_2src_1, Ib } },
6616     { "(bad)",          { XX } },
6617     { "(bad)",          { XX } },
6618     { "(bad)",          { XX } },
6619     { "(bad)",          { XX } },
6620     /* c8 */
6621     { "(bad)",          { XX } },
6622     { "(bad)",          { XX } },
6623     { "(bad)",          { XX } },
6624     { "(bad)",          { XX } },
6625     { "vpcomb",         { XM, Vex128, EXx, Ib } },
6626     { "vpcomw",         { XM, Vex128, EXx, Ib } },
6627     { "vpcomd",         { XM, Vex128, EXx, Ib } },
6628     { "vpcomq",         { XM, Vex128, EXx, Ib } },
6629     /* d0 */
6630     { "(bad)",          { XX } },
6631     { "(bad)",          { XX } },
6632     { "(bad)",          { XX } },
6633     { "(bad)",          { XX } },
6634     { "(bad)",          { XX } },
6635     { "(bad)",          { XX } },
6636     { "(bad)",          { XX } },
6637     { "(bad)",          { XX } },
6638     /* d8 */
6639     { "(bad)",          { XX } },
6640     { "(bad)",          { XX } },
6641     { "(bad)",          { XX } },
6642     { "(bad)",          { XX } },
6643     { "(bad)",          { XX } },
6644     { "(bad)",          { XX } },
6645     { "(bad)",          { XX } },
6646     { "(bad)",          { XX } },
6647     /* e0 */
6648     { "(bad)",          { XX } },
6649     { "(bad)",          { XX } },
6650     { "(bad)",          { XX } },
6651     { "(bad)",          { XX } },
6652     { "(bad)",          { XX } },
6653     { "(bad)",          { XX } },
6654     { "(bad)",          { XX } },
6655     { "(bad)",          { XX } },
6656     /* e8 */
6657     { "(bad)",          { XX } },
6658     { "(bad)",          { XX } },
6659     { "(bad)",          { XX } },
6660     { "(bad)",          { XX } },
6661     { "vpcomub",        { XM, Vex128, EXx, Ib } },
6662     { "vpcomuw",        { XM, Vex128, EXx, Ib } },
6663     { "vpcomud",        { XM, Vex128, EXx, Ib } },
6664     { "vpcomuq",        { XM, Vex128, EXx, Ib } },
6665     /* f0 */
6666     { "(bad)",          { XX } },
6667     { "(bad)",          { XX } },
6668     { "(bad)",          { XX } },
6669     { "(bad)",          { XX } },
6670     { "(bad)",          { XX } },
6671     { "(bad)",          { XX } },
6672     { "(bad)",          { XX } },
6673     { "(bad)",          { XX } },
6674     /* f8 */
6675     { "(bad)",          { XX } },
6676     { "(bad)",          { XX } },
6677     { "(bad)",          { XX } },
6678     { "(bad)",          { XX } },
6679     { "(bad)",          { XX } },
6680     { "(bad)",          { XX } },
6681     { "(bad)",          { XX } },
6682     { "(bad)",          { XX } },
6683   },
6684   /* XOP_09 */
6685   {
6686     /* 00 */
6687     { "(bad)",          { XX } },
6688     { "(bad)",          { XX } },
6689     { "(bad)",          { XX } },
6690     { "(bad)",          { XX } },
6691     { "(bad)",          { XX } },
6692     { "(bad)",          { XX } },
6693     { "(bad)",          { XX } },
6694     { "(bad)",          { XX } },
6695     /* 08 */
6696     { "(bad)",          { XX } },
6697     { "(bad)",          { XX } },
6698     { "(bad)",          { XX } },
6699     { "(bad)",          { XX } },
6700     { "(bad)",          { XX } },
6701     { "(bad)",          { XX } },
6702     { "(bad)",          { XX } },
6703     { "(bad)",          { XX } },
6704     /* 10 */
6705     { "(bad)",          { XX } },
6706     { "(bad)",          { XX } },
6707     { REG_TABLE (REG_XOP_LWPCB) },
6708     { "(bad)",          { XX } },
6709     { "(bad)",          { XX } },
6710     { "(bad)",          { XX } },
6711     { "(bad)",          { XX } },
6712     { "(bad)",          { XX } },
6713     /* 18 */
6714     { "(bad)",          { XX } },
6715     { "(bad)",          { XX } },
6716     { "(bad)",          { XX } },
6717     { "(bad)",          { XX } },
6718     { "(bad)",          { XX } },
6719     { "(bad)",          { XX } },
6720     { "(bad)",          { XX } },
6721     { "(bad)",          { XX } },
6722     /* 20 */
6723     { "(bad)",          { XX } },
6724     { "(bad)",          { XX } },
6725     { "(bad)",          { XX } },
6726     { "(bad)",          { XX } },
6727     { "(bad)",          { XX } },
6728     { "(bad)",          { XX } },
6729     { "(bad)",          { XX } },
6730     { "(bad)",          { XX } },
6731     /* 28 */
6732     { "(bad)",          { XX } },
6733     { "(bad)",          { XX } },
6734     { "(bad)",          { XX } },
6735     { "(bad)",          { XX } },
6736     { "(bad)",          { XX } },
6737     { "(bad)",          { XX } },
6738     { "(bad)",          { XX } },
6739     { "(bad)",          { XX } },
6740     /* 30 */
6741     { "(bad)",          { XX } },
6742     { "(bad)",          { XX } },
6743     { "(bad)",          { XX } },
6744     { "(bad)",          { XX } },
6745     { "(bad)",          { XX } },
6746     { "(bad)",          { XX } },
6747     { "(bad)",          { XX } },
6748     { "(bad)",          { XX } },
6749     /* 38 */
6750     { "(bad)",          { XX } },
6751     { "(bad)",          { XX } },
6752     { "(bad)",          { XX } },
6753     { "(bad)",          { XX } },
6754     { "(bad)",          { XX } },
6755     { "(bad)",          { XX } },
6756     { "(bad)",          { XX } },
6757     { "(bad)",          { XX } },
6758     /* 40 */
6759     { "(bad)",          { XX } },
6760     { "(bad)",          { XX } },
6761     { "(bad)",          { XX } },
6762     { "(bad)",          { XX } },
6763     { "(bad)",          { XX } },
6764     { "(bad)",          { XX } },
6765     { "(bad)",          { XX } },
6766     { "(bad)",          { XX } },
6767     /* 48 */
6768     { "(bad)",          { XX } },
6769     { "(bad)",          { XX } },
6770     { "(bad)",          { XX } },
6771     { "(bad)",          { XX } },
6772     { "(bad)",          { XX } },
6773     { "(bad)",          { XX } },
6774     { "(bad)",          { XX } },
6775     { "(bad)",          { XX } },
6776     /* 50 */
6777     { "(bad)",          { XX } },
6778     { "(bad)",          { XX } },
6779     { "(bad)",          { XX } },
6780     { "(bad)",          { XX } },
6781     { "(bad)",          { XX } },
6782     { "(bad)",          { XX } },
6783     { "(bad)",          { XX } },
6784     { "(bad)",          { XX } },
6785     /* 58 */
6786     { "(bad)",          { XX } },
6787     { "(bad)",          { XX } },
6788     { "(bad)",          { XX } },
6789     { "(bad)",          { XX } },
6790     { "(bad)",          { XX } },
6791     { "(bad)",          { XX } },
6792     { "(bad)",          { XX } },
6793     { "(bad)",          { XX } },
6794     /* 60 */
6795     { "(bad)",          { XX } },
6796     { "(bad)",          { XX } },
6797     { "(bad)",          { XX } },
6798     { "(bad)",          { XX } },
6799     { "(bad)",          { XX } },
6800     { "(bad)",          { XX } },
6801     { "(bad)",          { XX } },
6802     { "(bad)",          { XX } },
6803     /* 68 */
6804     { "(bad)",          { XX } },
6805     { "(bad)",          { XX } },
6806     { "(bad)",          { XX } },
6807     { "(bad)",          { XX } },
6808     { "(bad)",          { XX } },
6809     { "(bad)",          { XX } },
6810     { "(bad)",          { XX } },
6811     { "(bad)",          { XX } },
6812     /* 70 */
6813     { "(bad)",          { XX } },
6814     { "(bad)",          { XX } },
6815     { "(bad)",          { XX } },
6816     { "(bad)",          { XX } },
6817     { "(bad)",          { XX } },
6818     { "(bad)",          { XX } },
6819     { "(bad)",          { XX } },
6820     { "(bad)",          { XX } },
6821     /* 78 */
6822     { "(bad)",          { XX } },
6823     { "(bad)",          { XX } },
6824     { "(bad)",          { XX } },
6825     { "(bad)",          { XX } },
6826     { "(bad)",          { XX } },
6827     { "(bad)",          { XX } },
6828     { "(bad)",          { XX } },
6829     { "(bad)",          { XX } },
6830     /* 80 */
6831     { VEX_LEN_TABLE (VEX_LEN_XOP_09_80) },
6832     { VEX_LEN_TABLE (VEX_LEN_XOP_09_81) },
6833     { "vfrczss",        { XM, EXd } },
6834     { "vfrczsd",        { XM, EXq } },
6835     { "(bad)",          { XX } },
6836     { "(bad)",          { XX } },
6837     { "(bad)",          { XX } },
6838     { "(bad)",          { XX } },
6839     /* 88 */
6840     { "(bad)",          { XX } },
6841     { "(bad)",          { XX } },
6842     { "(bad)",          { XX } },
6843     { "(bad)",          { XX } },
6844     { "(bad)",          { XX } },
6845     { "(bad)",          { XX } },
6846     { "(bad)",          { XX } },
6847     { "(bad)",          { XX } },
6848     /* 90 */
6849     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 } },
6850     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 } },
6851     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 } },
6852     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 } },
6853     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 } },
6854     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 } },
6855     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 } },
6856     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 } },
6857     /* 98 */
6858     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 } },
6859     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 } },
6860     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 } },
6861     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 } },
6862     { "(bad)",          { XX } },
6863     { "(bad)",          { XX } },
6864     { "(bad)",          { XX } },
6865     { "(bad)",          { XX } },
6866     /* a0 */
6867     { "(bad)",          { XX } },
6868     { "(bad)",          { XX } },
6869     { "(bad)",          { XX } },
6870     { "(bad)",          { XX } },
6871     { "(bad)",          { XX } },
6872     { "(bad)",          { XX } },
6873     { "(bad)",          { XX } },
6874     { "(bad)",          { XX } },
6875     /* a8 */
6876     { "(bad)",          { XX } },
6877     { "(bad)",          { XX } },
6878     { "(bad)",          { XX } },
6879     { "(bad)",          { XX } },
6880     { "(bad)",          { XX } },
6881     { "(bad)",          { XX } },
6882     { "(bad)",          { XX } },
6883     { "(bad)",          { XX } },
6884     /* b0 */
6885     { "(bad)",          { XX } },
6886     { "(bad)",          { XX } },
6887     { "(bad)",          { XX } },
6888     { "(bad)",          { XX } },
6889     { "(bad)",          { XX } },
6890     { "(bad)",          { XX } },
6891     { "(bad)",          { XX } },
6892     { "(bad)",          { XX } },
6893     /* b8 */
6894     { "(bad)",          { XX } },
6895     { "(bad)",          { XX } },
6896     { "(bad)",          { XX } },
6897     { "(bad)",          { XX } },
6898     { "(bad)",          { XX } },
6899     { "(bad)",          { XX } },
6900     { "(bad)",          { XX } },
6901     { "(bad)",          { XX } },
6902     /* c0 */
6903     { "(bad)",          { XX } },
6904     { "vphaddbw",       { XM, EXxmm } },
6905     { "vphaddbd",       { XM, EXxmm } },
6906     { "vphaddbq",       { XM, EXxmm } },
6907     { "(bad)",          { XX } },
6908     { "(bad)",          { XX } },
6909     { "vphaddwd",       { XM, EXxmm } },
6910     { "vphaddwq",       { XM, EXxmm } },
6911     /* c8 */
6912     { "(bad)",          { XX } },
6913     { "(bad)",          { XX } },
6914     { "(bad)",          { XX } },
6915     { "vphadddq",       { XM, EXxmm } },
6916     { "(bad)",          { XX } },
6917     { "(bad)",          { XX } },
6918     { "(bad)",          { XX } },
6919     { "(bad)",          { XX } },
6920     /* d0 */
6921     { "(bad)",          { XX } },
6922     { "vphaddubw",      { XM, EXxmm } },
6923     { "vphaddubd",      { XM, EXxmm } },
6924     { "vphaddubq",      { XM, EXxmm } },
6925     { "(bad)",          { XX } },
6926     { "(bad)",          { XX } },
6927     { "vphadduwd",      { XM, EXxmm } },
6928     { "vphadduwq",      { XM, EXxmm } },
6929     /* d8 */
6930     { "(bad)",          { XX } },
6931     { "(bad)",          { XX } },
6932     { "(bad)",          { XX } },
6933     { "vphaddudq",      { XM, EXxmm } },
6934     { "(bad)",          { XX } },
6935     { "(bad)",          { XX } },
6936     { "(bad)",          { XX } },
6937     { "(bad)",          { XX } },
6938     /* e0 */
6939     { "(bad)",          { XX } },
6940     { "vphsubbw",       { XM, EXxmm } },
6941     { "vphsubwd",       { XM, EXxmm } },
6942     { "vphsubdq",       { XM, EXxmm } },
6943     { "(bad)",          { XX } },
6944     { "(bad)",          { XX } },
6945     { "(bad)",          { XX } },
6946     { "(bad)",          { XX } },
6947     /* e8 */
6948     { "(bad)",          { XX } },
6949     { "(bad)",          { XX } },
6950     { "(bad)",          { XX } },
6951     { "(bad)",          { XX } },
6952     { "(bad)",          { XX } },
6953     { "(bad)",          { XX } },
6954     { "(bad)",          { XX } },
6955     { "(bad)",          { XX } },
6956     /* f0 */
6957     { "(bad)",          { XX } },
6958     { "(bad)",          { XX } },
6959     { "(bad)",          { XX } },
6960     { "(bad)",          { XX } },
6961     { "(bad)",          { XX } },
6962     { "(bad)",          { XX } },
6963     { "(bad)",          { XX } },
6964     { "(bad)",          { XX } },
6965     /* f8 */
6966     { "(bad)",          { XX } },
6967     { "(bad)",          { XX } },
6968     { "(bad)",          { XX } },
6969     { "(bad)",          { XX } },
6970     { "(bad)",          { XX } },
6971     { "(bad)",          { XX } },
6972     { "(bad)",          { XX } },
6973     { "(bad)",          { XX } },
6974   },
6975   /* XOP_0A */
6976   {
6977     /* 00 */
6978     { "(bad)",          { XX } },
6979     { "(bad)",          { XX } },
6980     { "(bad)",          { XX } },
6981     { "(bad)",          { XX } },
6982     { "(bad)",          { XX } },
6983     { "(bad)",          { XX } },
6984     { "(bad)",          { XX } },
6985     { "(bad)",          { XX } },
6986     /* 08 */
6987     { "(bad)",          { XX } },
6988     { "(bad)",          { XX } },
6989     { "(bad)",          { XX } },
6990     { "(bad)",          { XX } },
6991     { "(bad)",          { XX } },
6992     { "(bad)",          { XX } },
6993     { "(bad)",          { XX } },
6994     { "(bad)",          { XX } },
6995     /* 10 */
6996     { "(bad)",          { XX } },
6997     { "(bad)",          { XX } },
6998     { REG_TABLE (REG_XOP_LWP) },
6999     { "(bad)",          { XX } },
7000     { "(bad)",          { XX } },
7001     { "(bad)",          { XX } },
7002     { "(bad)",          { XX } },
7003     { "(bad)",          { XX } },
7004     /* 18 */
7005     { "(bad)",          { XX } },
7006     { "(bad)",          { XX } },
7007     { "(bad)",          { XX } },
7008     { "(bad)",          { XX } },
7009     { "(bad)",          { XX } },
7010     { "(bad)",          { XX } },
7011     { "(bad)",          { XX } },
7012     { "(bad)",          { XX } },
7013     /* 20 */
7014     { "(bad)",          { XX } },
7015     { "(bad)",          { XX } },
7016     { "(bad)",          { XX } },
7017     { "(bad)",          { XX } },
7018     { "(bad)",          { XX } },
7019     { "(bad)",          { XX } },
7020     { "(bad)",          { XX } },
7021     { "(bad)",          { XX } },
7022     /* 28 */
7023     { "(bad)",          { XX } },
7024     { "(bad)",          { XX } },
7025     { "(bad)",          { XX } },
7026     { "(bad)",          { XX } },
7027     { "(bad)",          { XX } },
7028     { "(bad)",          { XX } },
7029     { "(bad)",          { XX } },
7030     { "(bad)",          { XX } },
7031     /* 30 */
7032     { "(bad)",          { XX } },
7033     { "(bad)",          { XX } },
7034     { "(bad)",          { XX } },
7035     { "(bad)",          { XX } },
7036     { "(bad)",          { XX } },
7037     { "(bad)",          { XX } },
7038     { "(bad)",          { XX } },
7039     { "(bad)",          { XX } },
7040     /* 38 */
7041     { "(bad)",          { XX } },
7042     { "(bad)",          { XX } },
7043     { "(bad)",          { XX } },
7044     { "(bad)",          { XX } },
7045     { "(bad)",          { XX } },
7046     { "(bad)",          { XX } },
7047     { "(bad)",          { XX } },
7048     { "(bad)",          { XX } },
7049     /* 40 */
7050     { "(bad)",          { XX } },
7051     { "(bad)",          { XX } },
7052     { "(bad)",          { XX } },
7053     { "(bad)",          { XX } },
7054     { "(bad)",          { XX } },
7055     { "(bad)",          { XX } },
7056     { "(bad)",          { XX } },
7057     { "(bad)",          { XX } },
7058     /* 48 */
7059     { "(bad)",          { XX } },
7060     { "(bad)",          { XX } },
7061     { "(bad)",          { XX } },
7062     { "(bad)",          { XX } },
7063     { "(bad)",          { XX } },
7064     { "(bad)",          { XX } },
7065     { "(bad)",          { XX } },
7066     { "(bad)",          { XX } },
7067     /* 50 */
7068     { "(bad)",          { XX } },
7069     { "(bad)",          { XX } },
7070     { "(bad)",          { XX } },
7071     { "(bad)",          { XX } },
7072     { "(bad)",          { XX } },
7073     { "(bad)",          { XX } },
7074     { "(bad)",          { XX } },
7075     { "(bad)",          { XX } },
7076     /* 58 */
7077     { "(bad)",          { XX } },
7078     { "(bad)",          { XX } },
7079     { "(bad)",          { XX } },
7080     { "(bad)",          { XX } },
7081     { "(bad)",          { XX } },
7082     { "(bad)",          { XX } },
7083     { "(bad)",          { XX } },
7084     { "(bad)",          { XX } },
7085     /* 60 */
7086     { "(bad)",          { XX } },
7087     { "(bad)",          { XX } },
7088     { "(bad)",          { XX } },
7089     { "(bad)",          { XX } },
7090     { "(bad)",          { XX } },
7091     { "(bad)",          { XX } },
7092     { "(bad)",          { XX } },
7093     { "(bad)",          { XX } },
7094     /* 68 */
7095     { "(bad)",          { XX } },
7096     { "(bad)",          { XX } },
7097     { "(bad)",          { XX } },
7098     { "(bad)",          { XX } },
7099     { "(bad)",          { XX } },
7100     { "(bad)",          { XX } },
7101     { "(bad)",          { XX } },
7102     { "(bad)",          { XX } },
7103     /* 70 */
7104     { "(bad)",          { XX } },
7105     { "(bad)",          { XX } },
7106     { "(bad)",          { XX } },
7107     { "(bad)",          { XX } },
7108     { "(bad)",          { XX } },
7109     { "(bad)",          { XX } },
7110     { "(bad)",          { XX } },
7111     { "(bad)",          { XX } },
7112     /* 78 */
7113     { "(bad)",          { XX } },
7114     { "(bad)",          { XX } },
7115     { "(bad)",          { XX } },
7116     { "(bad)",          { XX } },
7117     { "(bad)",          { XX } },
7118     { "(bad)",          { XX } },
7119     { "(bad)",          { XX } },
7120     { "(bad)",          { XX } },
7121     /* 80 */
7122     { "(bad)",          { XX } },
7123     { "(bad)",          { XX } },
7124     { "(bad)",          { XX } },
7125     { "(bad)",          { XX } },
7126     { "(bad)",          { XX } },
7127     { "(bad)",          { XX } },
7128     { "(bad)",          { XX } },
7129     { "(bad)",          { XX } },
7130     /* 88 */
7131     { "(bad)",          { XX } },
7132     { "(bad)",          { XX } },
7133     { "(bad)",          { XX } },
7134     { "(bad)",          { XX } },
7135     { "(bad)",          { XX } },
7136     { "(bad)",          { XX } },
7137     { "(bad)",          { XX } },
7138     { "(bad)",          { XX } },
7139     /* 90 */
7140     { "(bad)",          { XX } },
7141     { "(bad)",          { XX } },
7142     { "(bad)",          { XX } },
7143     { "(bad)",          { XX } },
7144     { "(bad)",          { XX } },
7145     { "(bad)",          { XX } },
7146     { "(bad)",          { XX } },
7147     { "(bad)",          { XX } },
7148     /* 98 */
7149     { "(bad)",          { XX } },
7150     { "(bad)",          { XX } },
7151     { "(bad)",          { XX } },
7152     { "(bad)",          { XX } },
7153     { "(bad)",          { XX } },
7154     { "(bad)",          { XX } },
7155     { "(bad)",          { XX } },
7156     { "(bad)",          { XX } },
7157     /* a0 */
7158     { "(bad)",          { XX } },
7159     { "(bad)",          { XX } },
7160     { "(bad)",          { XX } },
7161     { "(bad)",          { XX } },
7162     { "(bad)",          { XX } },
7163     { "(bad)",          { XX } },
7164     { "(bad)",          { XX } },
7165     { "(bad)",          { XX } },
7166     /* a8 */
7167     { "(bad)",          { XX } },
7168     { "(bad)",          { XX } },
7169     { "(bad)",          { XX } },
7170     { "(bad)",          { XX } },
7171     { "(bad)",          { XX } },
7172     { "(bad)",          { XX } },
7173     { "(bad)",          { XX } },
7174     { "(bad)",          { XX } },
7175     /* b0 */
7176     { "(bad)",          { XX } },
7177     { "(bad)",          { XX } },
7178     { "(bad)",          { XX } },
7179     { "(bad)",          { XX } },
7180     { "(bad)",          { XX } },
7181     { "(bad)",          { XX } },
7182     { "(bad)",          { XX } },
7183     { "(bad)",          { XX } },
7184     /* b8 */
7185     { "(bad)",          { XX } },
7186     { "(bad)",          { XX } },
7187     { "(bad)",          { XX } },
7188     { "(bad)",          { XX } },
7189     { "(bad)",          { XX } },
7190     { "(bad)",          { XX } },
7191     { "(bad)",          { XX } },
7192     { "(bad)",          { XX } },
7193     /* c0 */
7194     { "(bad)",          { XX } },
7195     { "(bad)",          { XX } },
7196     { "(bad)",          { XX } },
7197     { "(bad)",          { XX } },
7198     { "(bad)",          { XX } },
7199     { "(bad)",          { XX } },
7200     { "(bad)",          { XX } },
7201     { "(bad)",          { XX } },
7202     /* c8 */
7203     { "(bad)",          { XX } },
7204     { "(bad)",          { XX } },
7205     { "(bad)",          { XX } },
7206     { "(bad)",          { XX } },
7207     { "(bad)",          { XX } },
7208     { "(bad)",          { XX } },
7209     { "(bad)",          { XX } },
7210     { "(bad)",          { XX } },
7211     /* d0 */
7212     { "(bad)",          { XX } },
7213     { "(bad)",          { XX } },
7214     { "(bad)",          { XX } },
7215     { "(bad)",          { XX } },
7216     { "(bad)",          { XX } },
7217     { "(bad)",          { XX } },
7218     { "(bad)",          { XX } },
7219     { "(bad)",          { XX } },
7220     /* d8 */
7221     { "(bad)",          { XX } },
7222     { "(bad)",          { XX } },
7223     { "(bad)",          { XX } },
7224     { "(bad)",          { XX } },
7225     { "(bad)",          { XX } },
7226     { "(bad)",          { XX } },
7227     { "(bad)",          { XX } },
7228     { "(bad)",          { XX } },
7229     /* e0 */
7230     { "(bad)",          { XX } },
7231     { "(bad)",          { XX } },
7232     { "(bad)",          { XX } },
7233     { "(bad)",          { XX } },
7234     { "(bad)",          { XX } },
7235     { "(bad)",          { XX } },
7236     { "(bad)",          { XX } },
7237     { "(bad)",          { XX } },
7238     /* e8 */
7239     { "(bad)",          { XX } },
7240     { "(bad)",          { XX } },
7241     { "(bad)",          { XX } },
7242     { "(bad)",          { XX } },
7243     { "(bad)",          { XX } },
7244     { "(bad)",          { XX } },
7245     { "(bad)",          { XX } },
7246     { "(bad)",          { XX } },
7247     /* f0 */
7248     { "(bad)",          { XX } },
7249     { "(bad)",          { XX } },
7250     { "(bad)",          { XX } },
7251     { "(bad)",          { XX } },
7252     { "(bad)",          { XX } },
7253     { "(bad)",          { XX } },
7254     { "(bad)",          { XX } },
7255     { "(bad)",          { XX } },
7256     /* f8 */
7257     { "(bad)",          { XX } },
7258     { "(bad)",          { XX } },
7259     { "(bad)",          { XX } },
7260     { "(bad)",          { XX } },
7261     { "(bad)",          { XX } },
7262     { "(bad)",          { XX } },
7263     { "(bad)",          { XX } },
7264     { "(bad)",          { XX } },
7265   },
7266 };
7267
7268 static const struct dis386 vex_table[][256] = {
7269   /* VEX_0F */
7270   {
7271     /* 00 */
7272     { "(bad)",          { XX } },
7273     { "(bad)",          { XX } },
7274     { "(bad)",          { XX } },
7275     { "(bad)",          { XX } },
7276     { "(bad)",          { XX } },
7277     { "(bad)",          { XX } },
7278     { "(bad)",          { XX } },
7279     { "(bad)",          { XX } },
7280     /* 08 */
7281     { "(bad)",          { XX } },
7282     { "(bad)",          { XX } },
7283     { "(bad)",          { XX } },
7284     { "(bad)",          { XX } },
7285     { "(bad)",          { XX } },
7286     { "(bad)",          { XX } },
7287     { "(bad)",          { XX } },
7288     { "(bad)",          { XX } },
7289     /* 10 */
7290     { PREFIX_TABLE (PREFIX_VEX_10) },
7291     { PREFIX_TABLE (PREFIX_VEX_11) },
7292     { PREFIX_TABLE (PREFIX_VEX_12) },
7293     { MOD_TABLE (MOD_VEX_13) },
7294     { "vunpcklpX",      { XM, Vex, EXx } },
7295     { "vunpckhpX",      { XM, Vex, EXx } },
7296     { PREFIX_TABLE (PREFIX_VEX_16) },
7297     { MOD_TABLE (MOD_VEX_17) },
7298     /* 18 */
7299     { "(bad)",          { XX } },
7300     { "(bad)",          { XX } },
7301     { "(bad)",          { XX } },
7302     { "(bad)",          { XX } },
7303     { "(bad)",          { XX } },
7304     { "(bad)",          { XX } },
7305     { "(bad)",          { XX } },
7306     { "(bad)",          { XX } },
7307     /* 20 */
7308     { "(bad)",          { XX } },
7309     { "(bad)",          { XX } },
7310     { "(bad)",          { XX } },
7311     { "(bad)",          { XX } },
7312     { "(bad)",          { XX } },
7313     { "(bad)",          { XX } },
7314     { "(bad)",          { XX } },
7315     { "(bad)",          { XX } },
7316     /* 28 */
7317     { "vmovapX",        { XM, EXx } },
7318     { "vmovapX",        { EXxS, XM } },
7319     { PREFIX_TABLE (PREFIX_VEX_2A) },
7320     { MOD_TABLE (MOD_VEX_2B) },
7321     { PREFIX_TABLE (PREFIX_VEX_2C) },
7322     { PREFIX_TABLE (PREFIX_VEX_2D) },
7323     { PREFIX_TABLE (PREFIX_VEX_2E) },
7324     { PREFIX_TABLE (PREFIX_VEX_2F) },
7325     /* 30 */
7326     { "(bad)",          { XX } },
7327     { "(bad)",          { XX } },
7328     { "(bad)",          { XX } },
7329     { "(bad)",          { XX } },
7330     { "(bad)",          { XX } },
7331     { "(bad)",          { XX } },
7332     { "(bad)",          { XX } },
7333     { "(bad)",          { XX } },
7334     /* 38 */
7335     { "(bad)",          { XX } },
7336     { "(bad)",          { XX } },
7337     { "(bad)",          { XX } },
7338     { "(bad)",          { XX } },
7339     { "(bad)",          { XX } },
7340     { "(bad)",          { XX } },
7341     { "(bad)",          { XX } },
7342     { "(bad)",          { XX } },
7343     /* 40 */
7344     { "(bad)",          { XX } },
7345     { "(bad)",          { XX } },
7346     { "(bad)",          { XX } },
7347     { "(bad)",          { XX } },
7348     { "(bad)",          { XX } },
7349     { "(bad)",          { XX } },
7350     { "(bad)",          { XX } },
7351     { "(bad)",          { XX } },
7352     /* 48 */
7353     { "(bad)",          { XX } },
7354     { "(bad)",          { XX } },
7355     { "(bad)",          { XX } },
7356     { "(bad)",          { XX } },
7357     { "(bad)",          { XX } },
7358     { "(bad)",          { XX } },
7359     { "(bad)",          { XX } },
7360     { "(bad)",          { XX } },
7361     /* 50 */
7362     { MOD_TABLE (MOD_VEX_50) },
7363     { PREFIX_TABLE (PREFIX_VEX_51) },
7364     { PREFIX_TABLE (PREFIX_VEX_52) },
7365     { PREFIX_TABLE (PREFIX_VEX_53) },
7366     { "vandpX",         { XM, Vex, EXx } },
7367     { "vandnpX",        { XM, Vex, EXx } },
7368     { "vorpX",          { XM, Vex, EXx } },
7369     { "vxorpX",         { XM, Vex, EXx } },
7370     /* 58 */
7371     { PREFIX_TABLE (PREFIX_VEX_58) },
7372     { PREFIX_TABLE (PREFIX_VEX_59) },
7373     { PREFIX_TABLE (PREFIX_VEX_5A) },
7374     { PREFIX_TABLE (PREFIX_VEX_5B) },
7375     { PREFIX_TABLE (PREFIX_VEX_5C) },
7376     { PREFIX_TABLE (PREFIX_VEX_5D) },
7377     { PREFIX_TABLE (PREFIX_VEX_5E) },
7378     { PREFIX_TABLE (PREFIX_VEX_5F) },
7379     /* 60 */
7380     { PREFIX_TABLE (PREFIX_VEX_60) },
7381     { PREFIX_TABLE (PREFIX_VEX_61) },
7382     { PREFIX_TABLE (PREFIX_VEX_62) },
7383     { PREFIX_TABLE (PREFIX_VEX_63) },
7384     { PREFIX_TABLE (PREFIX_VEX_64) },
7385     { PREFIX_TABLE (PREFIX_VEX_65) },
7386     { PREFIX_TABLE (PREFIX_VEX_66) },
7387     { PREFIX_TABLE (PREFIX_VEX_67) },
7388     /* 68 */
7389     { PREFIX_TABLE (PREFIX_VEX_68) },
7390     { PREFIX_TABLE (PREFIX_VEX_69) },
7391     { PREFIX_TABLE (PREFIX_VEX_6A) },
7392     { PREFIX_TABLE (PREFIX_VEX_6B) },
7393     { PREFIX_TABLE (PREFIX_VEX_6C) },
7394     { PREFIX_TABLE (PREFIX_VEX_6D) },
7395     { PREFIX_TABLE (PREFIX_VEX_6E) },
7396     { PREFIX_TABLE (PREFIX_VEX_6F) },
7397     /* 70 */
7398     { PREFIX_TABLE (PREFIX_VEX_70) },
7399     { REG_TABLE (REG_VEX_71) },
7400     { REG_TABLE (REG_VEX_72) },
7401     { REG_TABLE (REG_VEX_73) },
7402     { PREFIX_TABLE (PREFIX_VEX_74) },
7403     { PREFIX_TABLE (PREFIX_VEX_75) },
7404     { PREFIX_TABLE (PREFIX_VEX_76) },
7405     { PREFIX_TABLE (PREFIX_VEX_77) },
7406     /* 78 */
7407     { "(bad)",          { XX } },
7408     { "(bad)",          { XX } },
7409     { "(bad)",          { XX } },
7410     { "(bad)",          { XX } },
7411     { PREFIX_TABLE (PREFIX_VEX_7C) },
7412     { PREFIX_TABLE (PREFIX_VEX_7D) },
7413     { PREFIX_TABLE (PREFIX_VEX_7E) },
7414     { PREFIX_TABLE (PREFIX_VEX_7F) },
7415     /* 80 */
7416     { "(bad)",          { XX } },
7417     { "(bad)",          { XX } },
7418     { "(bad)",          { XX } },
7419     { "(bad)",          { XX } },
7420     { "(bad)",          { XX } },
7421     { "(bad)",          { XX } },
7422     { "(bad)",          { XX } },
7423     { "(bad)",          { XX } },
7424     /* 88 */
7425     { "(bad)",          { XX } },
7426     { "(bad)",          { XX } },
7427     { "(bad)",          { XX } },
7428     { "(bad)",          { XX } },
7429     { "(bad)",          { XX } },
7430     { "(bad)",          { XX } },
7431     { "(bad)",          { XX } },
7432     { "(bad)",          { XX } },
7433     /* 90 */
7434     { "(bad)",          { XX } },
7435     { "(bad)",          { XX } },
7436     { "(bad)",          { XX } },
7437     { "(bad)",          { XX } },
7438     { "(bad)",          { XX } },
7439     { "(bad)",          { XX } },
7440     { "(bad)",          { XX } },
7441     { "(bad)",          { XX } },
7442     /* 98 */
7443     { "(bad)",          { XX } },
7444     { "(bad)",          { XX } },
7445     { "(bad)",          { XX } },
7446     { "(bad)",          { XX } },
7447     { "(bad)",          { XX } },
7448     { "(bad)",          { XX } },
7449     { "(bad)",          { XX } },
7450     { "(bad)",          { XX } },
7451     /* a0 */
7452     { "(bad)",          { XX } },
7453     { "(bad)",          { XX } },
7454     { "(bad)",          { XX } },
7455     { "(bad)",          { XX } },
7456     { "(bad)",          { XX } },
7457     { "(bad)",          { XX } },
7458     { "(bad)",          { XX } },
7459     { "(bad)",          { XX } },
7460     /* a8 */
7461     { "(bad)",          { XX } },
7462     { "(bad)",          { XX } },
7463     { "(bad)",          { XX } },
7464     { "(bad)",          { XX } },
7465     { "(bad)",          { XX } },
7466     { "(bad)",          { XX } },
7467     { REG_TABLE (REG_VEX_AE) },
7468     { "(bad)",          { XX } },
7469     /* b0 */
7470     { "(bad)",          { XX } },
7471     { "(bad)",          { XX } },
7472     { "(bad)",          { XX } },
7473     { "(bad)",          { XX } },
7474     { "(bad)",          { XX } },
7475     { "(bad)",          { XX } },
7476     { "(bad)",          { XX } },
7477     { "(bad)",          { XX } },
7478     /* b8 */
7479     { "(bad)",          { XX } },
7480     { "(bad)",          { XX } },
7481     { "(bad)",          { XX } },
7482     { "(bad)",          { XX } },
7483     { "(bad)",          { XX } },
7484     { "(bad)",          { XX } },
7485     { "(bad)",          { XX } },
7486     { "(bad)",          { XX } },
7487     /* c0 */
7488     { "(bad)",          { XX } },
7489     { "(bad)",          { XX } },
7490     { PREFIX_TABLE (PREFIX_VEX_C2) },
7491     { "(bad)",          { XX } },
7492     { PREFIX_TABLE (PREFIX_VEX_C4) },
7493     { PREFIX_TABLE (PREFIX_VEX_C5) },
7494     { "vshufpX",        { XM, Vex, EXx, Ib } },
7495     { "(bad)",          { XX } },
7496     /* c8 */
7497     { "(bad)",          { XX } },
7498     { "(bad)",          { XX } },
7499     { "(bad)",          { XX } },
7500     { "(bad)",          { XX } },
7501     { "(bad)",          { XX } },
7502     { "(bad)",          { XX } },
7503     { "(bad)",          { XX } },
7504     { "(bad)",          { XX } },
7505     /* d0 */
7506     { PREFIX_TABLE (PREFIX_VEX_D0) },
7507     { PREFIX_TABLE (PREFIX_VEX_D1) },
7508     { PREFIX_TABLE (PREFIX_VEX_D2) },
7509     { PREFIX_TABLE (PREFIX_VEX_D3) },
7510     { PREFIX_TABLE (PREFIX_VEX_D4) },
7511     { PREFIX_TABLE (PREFIX_VEX_D5) },
7512     { PREFIX_TABLE (PREFIX_VEX_D6) },
7513     { PREFIX_TABLE (PREFIX_VEX_D7) },
7514     /* d8 */
7515     { PREFIX_TABLE (PREFIX_VEX_D8) },
7516     { PREFIX_TABLE (PREFIX_VEX_D9) },
7517     { PREFIX_TABLE (PREFIX_VEX_DA) },
7518     { PREFIX_TABLE (PREFIX_VEX_DB) },
7519     { PREFIX_TABLE (PREFIX_VEX_DC) },
7520     { PREFIX_TABLE (PREFIX_VEX_DD) },
7521     { PREFIX_TABLE (PREFIX_VEX_DE) },
7522     { PREFIX_TABLE (PREFIX_VEX_DF) },
7523     /* e0 */
7524     { PREFIX_TABLE (PREFIX_VEX_E0) },
7525     { PREFIX_TABLE (PREFIX_VEX_E1) },
7526     { PREFIX_TABLE (PREFIX_VEX_E2) },
7527     { PREFIX_TABLE (PREFIX_VEX_E3) },
7528     { PREFIX_TABLE (PREFIX_VEX_E4) },
7529     { PREFIX_TABLE (PREFIX_VEX_E5) },
7530     { PREFIX_TABLE (PREFIX_VEX_E6) },
7531     { PREFIX_TABLE (PREFIX_VEX_E7) },
7532     /* e8 */
7533     { PREFIX_TABLE (PREFIX_VEX_E8) },
7534     { PREFIX_TABLE (PREFIX_VEX_E9) },
7535     { PREFIX_TABLE (PREFIX_VEX_EA) },
7536     { PREFIX_TABLE (PREFIX_VEX_EB) },
7537     { PREFIX_TABLE (PREFIX_VEX_EC) },
7538     { PREFIX_TABLE (PREFIX_VEX_ED) },
7539     { PREFIX_TABLE (PREFIX_VEX_EE) },
7540     { PREFIX_TABLE (PREFIX_VEX_EF) },
7541     /* f0 */
7542     { PREFIX_TABLE (PREFIX_VEX_F0) },
7543     { PREFIX_TABLE (PREFIX_VEX_F1) },
7544     { PREFIX_TABLE (PREFIX_VEX_F2) },
7545     { PREFIX_TABLE (PREFIX_VEX_F3) },
7546     { PREFIX_TABLE (PREFIX_VEX_F4) },
7547     { PREFIX_TABLE (PREFIX_VEX_F5) },
7548     { PREFIX_TABLE (PREFIX_VEX_F6) },
7549     { PREFIX_TABLE (PREFIX_VEX_F7) },
7550     /* f8 */
7551     { PREFIX_TABLE (PREFIX_VEX_F8) },
7552     { PREFIX_TABLE (PREFIX_VEX_F9) },
7553     { PREFIX_TABLE (PREFIX_VEX_FA) },
7554     { PREFIX_TABLE (PREFIX_VEX_FB) },
7555     { PREFIX_TABLE (PREFIX_VEX_FC) },
7556     { PREFIX_TABLE (PREFIX_VEX_FD) },
7557     { PREFIX_TABLE (PREFIX_VEX_FE) },
7558     { "(bad)",          { XX } },
7559   },
7560   /* VEX_0F38 */
7561   {
7562     /* 00 */
7563     { PREFIX_TABLE (PREFIX_VEX_3800) },
7564     { PREFIX_TABLE (PREFIX_VEX_3801) },
7565     { PREFIX_TABLE (PREFIX_VEX_3802) },
7566     { PREFIX_TABLE (PREFIX_VEX_3803) },
7567     { PREFIX_TABLE (PREFIX_VEX_3804) },
7568     { PREFIX_TABLE (PREFIX_VEX_3805) },
7569     { PREFIX_TABLE (PREFIX_VEX_3806) },
7570     { PREFIX_TABLE (PREFIX_VEX_3807) },
7571     /* 08 */
7572     { PREFIX_TABLE (PREFIX_VEX_3808) },
7573     { PREFIX_TABLE (PREFIX_VEX_3809) },
7574     { PREFIX_TABLE (PREFIX_VEX_380A) },
7575     { PREFIX_TABLE (PREFIX_VEX_380B) },
7576     { PREFIX_TABLE (PREFIX_VEX_380C) },
7577     { PREFIX_TABLE (PREFIX_VEX_380D) },
7578     { PREFIX_TABLE (PREFIX_VEX_380E) },
7579     { PREFIX_TABLE (PREFIX_VEX_380F) },
7580     /* 10 */
7581     { "(bad)",          { XX } },
7582     { "(bad)",          { XX } },
7583     { "(bad)",          { XX } },
7584     { "(bad)",          { XX } },
7585     { "(bad)",          { XX } },
7586     { "(bad)",          { XX } },
7587     { "(bad)",          { XX } },
7588     { PREFIX_TABLE (PREFIX_VEX_3817) },
7589     /* 18 */
7590     { PREFIX_TABLE (PREFIX_VEX_3818) },
7591     { PREFIX_TABLE (PREFIX_VEX_3819) },
7592     { PREFIX_TABLE (PREFIX_VEX_381A) },
7593     { "(bad)",          { XX } },
7594     { PREFIX_TABLE (PREFIX_VEX_381C) },
7595     { PREFIX_TABLE (PREFIX_VEX_381D) },
7596     { PREFIX_TABLE (PREFIX_VEX_381E) },
7597     { "(bad)",          { XX } },
7598     /* 20 */
7599     { PREFIX_TABLE (PREFIX_VEX_3820) },
7600     { PREFIX_TABLE (PREFIX_VEX_3821) },
7601     { PREFIX_TABLE (PREFIX_VEX_3822) },
7602     { PREFIX_TABLE (PREFIX_VEX_3823) },
7603     { PREFIX_TABLE (PREFIX_VEX_3824) },
7604     { PREFIX_TABLE (PREFIX_VEX_3825) },
7605     { "(bad)",          { XX } },
7606     { "(bad)",          { XX } },
7607     /* 28 */
7608     { PREFIX_TABLE (PREFIX_VEX_3828) },
7609     { PREFIX_TABLE (PREFIX_VEX_3829) },
7610     { PREFIX_TABLE (PREFIX_VEX_382A) },
7611     { PREFIX_TABLE (PREFIX_VEX_382B) },
7612     { PREFIX_TABLE (PREFIX_VEX_382C) },
7613     { PREFIX_TABLE (PREFIX_VEX_382D) },
7614     { PREFIX_TABLE (PREFIX_VEX_382E) },
7615     { PREFIX_TABLE (PREFIX_VEX_382F) },
7616     /* 30 */
7617     { PREFIX_TABLE (PREFIX_VEX_3830) },
7618     { PREFIX_TABLE (PREFIX_VEX_3831) },
7619     { PREFIX_TABLE (PREFIX_VEX_3832) },
7620     { PREFIX_TABLE (PREFIX_VEX_3833) },
7621     { PREFIX_TABLE (PREFIX_VEX_3834) },
7622     { PREFIX_TABLE (PREFIX_VEX_3835) },
7623     { "(bad)",          { XX } },
7624     { PREFIX_TABLE (PREFIX_VEX_3837) },
7625     /* 38 */
7626     { PREFIX_TABLE (PREFIX_VEX_3838) },
7627     { PREFIX_TABLE (PREFIX_VEX_3839) },
7628     { PREFIX_TABLE (PREFIX_VEX_383A) },
7629     { PREFIX_TABLE (PREFIX_VEX_383B) },
7630     { PREFIX_TABLE (PREFIX_VEX_383C) },
7631     { PREFIX_TABLE (PREFIX_VEX_383D) },
7632     { PREFIX_TABLE (PREFIX_VEX_383E) },
7633     { PREFIX_TABLE (PREFIX_VEX_383F) },
7634     /* 40 */
7635     { PREFIX_TABLE (PREFIX_VEX_3840) },
7636     { PREFIX_TABLE (PREFIX_VEX_3841) },
7637     { "(bad)",          { XX } },
7638     { "(bad)",          { XX } },
7639     { "(bad)",          { XX } },
7640     { "(bad)",          { XX } },
7641     { "(bad)",          { XX } },
7642     { "(bad)",          { XX } },
7643     /* 48 */
7644     { "(bad)",          { XX } },
7645     { "(bad)",          { XX } },
7646     { "(bad)",          { XX } },
7647     { "(bad)",          { XX } },
7648     { "(bad)",          { XX } },
7649     { "(bad)",          { XX } },
7650     { "(bad)",          { XX } },
7651     { "(bad)",          { XX } },
7652     /* 50 */
7653     { "(bad)",          { XX } },
7654     { "(bad)",          { XX } },
7655     { "(bad)",          { XX } },
7656     { "(bad)",          { XX } },
7657     { "(bad)",          { XX } },
7658     { "(bad)",          { XX } },
7659     { "(bad)",          { XX } },
7660     { "(bad)",          { XX } },
7661     /* 58 */
7662     { "(bad)",          { XX } },
7663     { "(bad)",          { XX } },
7664     { "(bad)",          { XX } },
7665     { "(bad)",          { XX } },
7666     { "(bad)",          { XX } },
7667     { "(bad)",          { XX } },
7668     { "(bad)",          { XX } },
7669     { "(bad)",          { XX } },
7670     /* 60 */
7671     { "(bad)",          { XX } },
7672     { "(bad)",          { XX } },
7673     { "(bad)",          { XX } },
7674     { "(bad)",          { XX } },
7675     { "(bad)",          { XX } },
7676     { "(bad)",          { XX } },
7677     { "(bad)",          { XX } },
7678     { "(bad)",          { XX } },
7679     /* 68 */
7680     { "(bad)",          { XX } },
7681     { "(bad)",          { XX } },
7682     { "(bad)",          { XX } },
7683     { "(bad)",          { XX } },
7684     { "(bad)",          { XX } },
7685     { "(bad)",          { XX } },
7686     { "(bad)",          { XX } },
7687     { "(bad)",          { XX } },
7688     /* 70 */
7689     { "(bad)",          { XX } },
7690     { "(bad)",          { XX } },
7691     { "(bad)",          { XX } },
7692     { "(bad)",          { XX } },
7693     { "(bad)",          { XX } },
7694     { "(bad)",          { XX } },
7695     { "(bad)",          { XX } },
7696     { "(bad)",          { XX } },
7697     /* 78 */
7698     { "(bad)",          { XX } },
7699     { "(bad)",          { XX } },
7700     { "(bad)",          { XX } },
7701     { "(bad)",          { XX } },
7702     { "(bad)",          { XX } },
7703     { "(bad)",          { XX } },
7704     { "(bad)",          { XX } },
7705     { "(bad)",          { XX } },
7706     /* 80 */
7707     { "(bad)",          { XX } },
7708     { "(bad)",          { XX } },
7709     { "(bad)",          { XX } },
7710     { "(bad)",          { XX } },
7711     { "(bad)",          { XX } },
7712     { "(bad)",          { XX } },
7713     { "(bad)",          { XX } },
7714     { "(bad)",          { XX } },
7715     /* 88 */
7716     { "(bad)",          { XX } },
7717     { "(bad)",          { XX } },
7718     { "(bad)",          { XX } },
7719     { "(bad)",          { XX } },
7720     { "(bad)",          { XX } },
7721     { "(bad)",          { XX } },
7722     { "(bad)",          { XX } },
7723     { "(bad)",          { XX } },
7724     /* 90 */
7725     { "(bad)",          { XX } },
7726     { "(bad)",          { XX } },
7727     { "(bad)",          { XX } },
7728     { "(bad)",          { XX } },
7729     { "(bad)",          { XX } },
7730     { "(bad)",          { XX } },
7731     { PREFIX_TABLE (PREFIX_VEX_3896) },
7732     { PREFIX_TABLE (PREFIX_VEX_3897) },
7733     /* 98 */
7734     { PREFIX_TABLE (PREFIX_VEX_3898) },
7735     { PREFIX_TABLE (PREFIX_VEX_3899) },
7736     { PREFIX_TABLE (PREFIX_VEX_389A) },
7737     { PREFIX_TABLE (PREFIX_VEX_389B) },
7738     { PREFIX_TABLE (PREFIX_VEX_389C) },
7739     { PREFIX_TABLE (PREFIX_VEX_389D) },
7740     { PREFIX_TABLE (PREFIX_VEX_389E) },
7741     { PREFIX_TABLE (PREFIX_VEX_389F) },
7742     /* a0 */
7743     { "(bad)",          { XX } },
7744     { "(bad)",          { XX } },
7745     { "(bad)",          { XX } },
7746     { "(bad)",          { XX } },
7747     { "(bad)",          { XX } },
7748     { "(bad)",          { XX } },
7749     { PREFIX_TABLE (PREFIX_VEX_38A6) },
7750     { PREFIX_TABLE (PREFIX_VEX_38A7) },
7751     /* a8 */
7752     { PREFIX_TABLE (PREFIX_VEX_38A8) },
7753     { PREFIX_TABLE (PREFIX_VEX_38A9) },
7754     { PREFIX_TABLE (PREFIX_VEX_38AA) },
7755     { PREFIX_TABLE (PREFIX_VEX_38AB) },
7756     { PREFIX_TABLE (PREFIX_VEX_38AC) },
7757     { PREFIX_TABLE (PREFIX_VEX_38AD) },
7758     { PREFIX_TABLE (PREFIX_VEX_38AE) },
7759     { PREFIX_TABLE (PREFIX_VEX_38AF) },
7760     /* b0 */
7761     { "(bad)",          { XX } },
7762     { "(bad)",          { XX } },
7763     { "(bad)",          { XX } },
7764     { "(bad)",          { XX } },
7765     { "(bad)",          { XX } },
7766     { "(bad)",          { XX } },
7767     { PREFIX_TABLE (PREFIX_VEX_38B6) },
7768     { PREFIX_TABLE (PREFIX_VEX_38B7) },
7769     /* b8 */
7770     { PREFIX_TABLE (PREFIX_VEX_38B8) },
7771     { PREFIX_TABLE (PREFIX_VEX_38B9) },
7772     { PREFIX_TABLE (PREFIX_VEX_38BA) },
7773     { PREFIX_TABLE (PREFIX_VEX_38BB) },
7774     { PREFIX_TABLE (PREFIX_VEX_38BC) },
7775     { PREFIX_TABLE (PREFIX_VEX_38BD) },
7776     { PREFIX_TABLE (PREFIX_VEX_38BE) },
7777     { PREFIX_TABLE (PREFIX_VEX_38BF) },
7778     /* c0 */
7779     { "(bad)",          { XX } },
7780     { "(bad)",          { XX } },
7781     { "(bad)",          { XX } },
7782     { "(bad)",          { XX } },
7783     { "(bad)",          { XX } },
7784     { "(bad)",          { XX } },
7785     { "(bad)",          { XX } },
7786     { "(bad)",          { XX } },
7787     /* c8 */
7788     { "(bad)",          { XX } },
7789     { "(bad)",          { XX } },
7790     { "(bad)",          { XX } },
7791     { "(bad)",          { XX } },
7792     { "(bad)",          { XX } },
7793     { "(bad)",          { XX } },
7794     { "(bad)",          { XX } },
7795     { "(bad)",          { XX } },
7796     /* d0 */
7797     { "(bad)",          { XX } },
7798     { "(bad)",          { XX } },
7799     { "(bad)",          { XX } },
7800     { "(bad)",          { XX } },
7801     { "(bad)",          { XX } },
7802     { "(bad)",          { XX } },
7803     { "(bad)",          { XX } },
7804     { "(bad)",          { XX } },
7805     /* d8 */
7806     { "(bad)",          { XX } },
7807     { "(bad)",          { XX } },
7808     { "(bad)",          { XX } },
7809     { PREFIX_TABLE (PREFIX_VEX_38DB) },
7810     { PREFIX_TABLE (PREFIX_VEX_38DC) },
7811     { PREFIX_TABLE (PREFIX_VEX_38DD) },
7812     { PREFIX_TABLE (PREFIX_VEX_38DE) },
7813     { PREFIX_TABLE (PREFIX_VEX_38DF) },
7814     /* e0 */
7815     { "(bad)",          { XX } },
7816     { "(bad)",          { XX } },
7817     { "(bad)",          { XX } },
7818     { "(bad)",          { XX } },
7819     { "(bad)",          { XX } },
7820     { "(bad)",          { XX } },
7821     { "(bad)",          { XX } },
7822     { "(bad)",          { XX } },
7823     /* e8 */
7824     { "(bad)",          { XX } },
7825     { "(bad)",          { XX } },
7826     { "(bad)",          { XX } },
7827     { "(bad)",          { XX } },
7828     { "(bad)",          { XX } },
7829     { "(bad)",          { XX } },
7830     { "(bad)",          { XX } },
7831     { "(bad)",          { XX } },
7832     /* f0 */
7833     { "(bad)",          { XX } },
7834     { "(bad)",          { XX } },
7835     { "(bad)",          { XX } },
7836     { "(bad)",          { XX } },
7837     { "(bad)",          { XX } },
7838     { "(bad)",          { XX } },
7839     { "(bad)",          { XX } },
7840     { "(bad)",          { XX } },
7841     /* f8 */
7842     { "(bad)",          { XX } },
7843     { "(bad)",          { XX } },
7844     { "(bad)",          { XX } },
7845     { "(bad)",          { XX } },
7846     { "(bad)",          { XX } },
7847     { "(bad)",          { XX } },
7848     { "(bad)",          { XX } },
7849     { "(bad)",          { XX } },
7850   },
7851   /* VEX_0F3A */
7852   {
7853     /* 00 */
7854     { "(bad)",          { XX } },
7855     { "(bad)",          { XX } },
7856     { "(bad)",          { XX } },
7857     { "(bad)",          { XX } },
7858     { PREFIX_TABLE (PREFIX_VEX_3A04) },
7859     { PREFIX_TABLE (PREFIX_VEX_3A05) },
7860     { PREFIX_TABLE (PREFIX_VEX_3A06) },
7861     { "(bad)",          { XX } },
7862     /* 08 */
7863     { PREFIX_TABLE (PREFIX_VEX_3A08) },
7864     { PREFIX_TABLE (PREFIX_VEX_3A09) },
7865     { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7866     { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7867     { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7868     { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7869     { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7870     { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7871     /* 10 */
7872     { "(bad)",          { XX } },
7873     { "(bad)",          { XX } },
7874     { "(bad)",          { XX } },
7875     { "(bad)",          { XX } },
7876     { PREFIX_TABLE (PREFIX_VEX_3A14) },
7877     { PREFIX_TABLE (PREFIX_VEX_3A15) },
7878     { PREFIX_TABLE (PREFIX_VEX_3A16) },
7879     { PREFIX_TABLE (PREFIX_VEX_3A17) },
7880     /* 18 */
7881     { PREFIX_TABLE (PREFIX_VEX_3A18) },
7882     { PREFIX_TABLE (PREFIX_VEX_3A19) },
7883     { "(bad)",          { XX } },
7884     { "(bad)",          { XX } },
7885     { "(bad)",          { XX } },
7886     { "(bad)",          { XX } },
7887     { "(bad)",          { XX } },
7888     { "(bad)",          { XX } },
7889     /* 20 */
7890     { PREFIX_TABLE (PREFIX_VEX_3A20) },
7891     { PREFIX_TABLE (PREFIX_VEX_3A21) },
7892     { PREFIX_TABLE (PREFIX_VEX_3A22) },
7893     { "(bad)",          { XX } },
7894     { "(bad)",          { XX } },
7895     { "(bad)",          { XX } },
7896     { "(bad)",          { XX } },
7897     { "(bad)",          { XX } },
7898     /* 28 */
7899     { "(bad)",          { XX } },
7900     { "(bad)",          { XX } },
7901     { "(bad)",          { XX } },
7902     { "(bad)",          { XX } },
7903     { "(bad)",          { XX } },
7904     { "(bad)",          { XX } },
7905     { "(bad)",          { XX } },
7906     { "(bad)",          { XX } },
7907     /* 30 */
7908     { "(bad)",          { XX } },
7909     { "(bad)",          { XX } },
7910     { "(bad)",          { XX } },
7911     { "(bad)",          { XX } },
7912     { "(bad)",          { XX } },
7913     { "(bad)",          { XX } },
7914     { "(bad)",          { XX } },
7915     { "(bad)",          { XX } },
7916     /* 38 */
7917     { "(bad)",          { XX } },
7918     { "(bad)",          { XX } },
7919     { "(bad)",          { XX } },
7920     { "(bad)",          { XX } },
7921     { "(bad)",          { XX } },
7922     { "(bad)",          { XX } },
7923     { "(bad)",          { XX } },
7924     { "(bad)",          { XX } },
7925     /* 40 */
7926     { PREFIX_TABLE (PREFIX_VEX_3A40) },
7927     { PREFIX_TABLE (PREFIX_VEX_3A41) },
7928     { PREFIX_TABLE (PREFIX_VEX_3A42) },
7929     { "(bad)",          { XX } },
7930     { PREFIX_TABLE (PREFIX_VEX_3A44) },
7931     { "(bad)",          { XX } },
7932     { "(bad)",          { XX } },
7933     { "(bad)",          { XX } },
7934     /* 48 */
7935     { "(bad)",          { XX } },
7936     { "(bad)",          { XX } },
7937     { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7938     { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7939     { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7940     { "(bad)",          { XX } },
7941     { "(bad)",          { XX } },
7942     { "(bad)",          { XX } },
7943     /* 50 */
7944     { "(bad)",          { XX } },
7945     { "(bad)",          { XX } },
7946     { "(bad)",          { XX } },
7947     { "(bad)",          { XX } },
7948     { "(bad)",          { XX } },
7949     { "(bad)",          { XX } },
7950     { "(bad)",          { XX } },
7951     { "(bad)",          { XX } },
7952     /* 58 */
7953     { "(bad)",          { XX } },
7954     { "(bad)",          { XX } },
7955     { "(bad)",          { XX } },
7956     { "(bad)",          { XX } },
7957     { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7958     { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7959     { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7960     { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7961     /* 60 */
7962     { PREFIX_TABLE (PREFIX_VEX_3A60) },
7963     { PREFIX_TABLE (PREFIX_VEX_3A61) },
7964     { PREFIX_TABLE (PREFIX_VEX_3A62) },
7965     { PREFIX_TABLE (PREFIX_VEX_3A63) },
7966     { "(bad)",          { XX } },
7967     { "(bad)",          { XX } },
7968     { "(bad)",          { XX } },
7969     { "(bad)",          { XX } },
7970     /* 68 */
7971     { PREFIX_TABLE (PREFIX_VEX_3A68) },
7972     { PREFIX_TABLE (PREFIX_VEX_3A69) },
7973     { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7974     { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7975     { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7976     { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7977     { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7978     { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7979     /* 70 */
7980     { "(bad)",          { XX } },
7981     { "(bad)",          { XX } },
7982     { "(bad)",          { XX } },
7983     { "(bad)",          { XX } },
7984     { "(bad)",          { XX } },
7985     { "(bad)",          { XX } },
7986     { "(bad)",          { XX } },
7987     { "(bad)",          { XX } },
7988     /* 78 */
7989     { PREFIX_TABLE (PREFIX_VEX_3A78) },
7990     { PREFIX_TABLE (PREFIX_VEX_3A79) },
7991     { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7992     { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7993     { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7994     { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7995     { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7996     { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7997     /* 80 */
7998     { "(bad)",          { XX } },
7999     { "(bad)",          { XX } },
8000     { "(bad)",          { XX } },
8001     { "(bad)",          { XX } },
8002     { "(bad)",          { XX } },
8003     { "(bad)",          { XX } },
8004     { "(bad)",          { XX } },
8005     { "(bad)",          { XX } },
8006     /* 88 */
8007     { "(bad)",          { XX } },
8008     { "(bad)",          { XX } },
8009     { "(bad)",          { XX } },
8010     { "(bad)",          { XX } },
8011     { "(bad)",          { XX } },
8012     { "(bad)",          { XX } },
8013     { "(bad)",          { XX } },
8014     { "(bad)",          { XX } },
8015     /* 90 */
8016     { "(bad)",          { XX } },
8017     { "(bad)",          { XX } },
8018     { "(bad)",          { XX } },
8019     { "(bad)",          { XX } },
8020     { "(bad)",          { XX } },
8021     { "(bad)",          { XX } },
8022     { "(bad)",          { XX } },
8023     { "(bad)",          { XX } },
8024     /* 98 */
8025     { "(bad)",          { XX } },
8026     { "(bad)",          { XX } },
8027     { "(bad)",          { XX } },
8028     { "(bad)",          { XX } },
8029     { "(bad)",          { XX } },
8030     { "(bad)",          { XX } },
8031     { "(bad)",          { XX } },
8032     { "(bad)",          { XX } },
8033     /* a0 */
8034     { "(bad)",          { XX } },
8035     { "(bad)",          { XX } },
8036     { "(bad)",          { XX } },
8037     { "(bad)",          { XX } },
8038     { "(bad)",          { XX } },
8039     { "(bad)",          { XX } },
8040     { "(bad)",          { XX } },
8041     { "(bad)",          { XX } },
8042     /* a8 */
8043     { "(bad)",          { XX } },
8044     { "(bad)",          { XX } },
8045     { "(bad)",          { XX } },
8046     { "(bad)",          { XX } },
8047     { "(bad)",          { XX } },
8048     { "(bad)",          { XX } },
8049     { "(bad)",          { XX } },
8050     { "(bad)",          { XX } },
8051     /* b0 */
8052     { "(bad)",          { XX } },
8053     { "(bad)",          { XX } },
8054     { "(bad)",          { XX } },
8055     { "(bad)",          { XX } },
8056     { "(bad)",          { XX } },
8057     { "(bad)",          { XX } },
8058     { "(bad)",          { XX } },
8059     { "(bad)",          { XX } },
8060     /* b8 */
8061     { "(bad)",          { XX } },
8062     { "(bad)",          { XX } },
8063     { "(bad)",          { XX } },
8064     { "(bad)",          { XX } },
8065     { "(bad)",          { XX } },
8066     { "(bad)",          { XX } },
8067     { "(bad)",          { XX } },
8068     { "(bad)",          { XX } },
8069     /* c0 */
8070     { "(bad)",          { XX } },
8071     { "(bad)",          { XX } },
8072     { "(bad)",          { XX } },
8073     { "(bad)",          { XX } },
8074     { "(bad)",          { XX } },
8075     { "(bad)",          { XX } },
8076     { "(bad)",          { XX } },
8077     { "(bad)",          { XX } },
8078     /* c8 */
8079     { "(bad)",          { XX } },
8080     { "(bad)",          { XX } },
8081     { "(bad)",          { XX } },
8082     { "(bad)",          { XX } },
8083     { "(bad)",          { XX } },
8084     { "(bad)",          { XX } },
8085     { "(bad)",          { XX } },
8086     { "(bad)",          { XX } },
8087     /* d0 */
8088     { "(bad)",          { XX } },
8089     { "(bad)",          { XX } },
8090     { "(bad)",          { XX } },
8091     { "(bad)",          { XX } },
8092     { "(bad)",          { XX } },
8093     { "(bad)",          { XX } },
8094     { "(bad)",          { XX } },
8095     { "(bad)",          { XX } },
8096     /* d8 */
8097     { "(bad)",          { XX } },
8098     { "(bad)",          { XX } },
8099     { "(bad)",          { XX } },
8100     { "(bad)",          { XX } },
8101     { "(bad)",          { XX } },
8102     { "(bad)",          { XX } },
8103     { "(bad)",          { XX } },
8104     { PREFIX_TABLE (PREFIX_VEX_3ADF) },
8105     /* e0 */
8106     { "(bad)",          { XX } },
8107     { "(bad)",          { XX } },
8108     { "(bad)",          { XX } },
8109     { "(bad)",          { XX } },
8110     { "(bad)",          { XX } },
8111     { "(bad)",          { XX } },
8112     { "(bad)",          { XX } },
8113     { "(bad)",          { XX } },
8114     /* e8 */
8115     { "(bad)",          { XX } },
8116     { "(bad)",          { XX } },
8117     { "(bad)",          { XX } },
8118     { "(bad)",          { XX } },
8119     { "(bad)",          { XX } },
8120     { "(bad)",          { XX } },
8121     { "(bad)",          { XX } },
8122     { "(bad)",          { XX } },
8123     /* f0 */
8124     { "(bad)",          { XX } },
8125     { "(bad)",          { XX } },
8126     { "(bad)",          { XX } },
8127     { "(bad)",          { XX } },
8128     { "(bad)",          { XX } },
8129     { "(bad)",          { XX } },
8130     { "(bad)",          { XX } },
8131     { "(bad)",          { XX } },
8132     /* f8 */
8133     { "(bad)",          { XX } },
8134     { "(bad)",          { XX } },
8135     { "(bad)",          { XX } },
8136     { "(bad)",          { XX } },
8137     { "(bad)",          { XX } },
8138     { "(bad)",          { XX } },
8139     { "(bad)",          { XX } },
8140     { "(bad)",          { XX } },
8141   },
8142 };
8143
8144 static const struct dis386 vex_len_table[][2] = {
8145   /* VEX_LEN_10_P_1 */
8146   {
8147     { "vmovss",         { XMVex, Vex128, EXd } },
8148     { "(bad)",          { XX } },
8149   },
8150
8151   /* VEX_LEN_10_P_3 */
8152   {
8153     { "vmovsd",         { XMVex, Vex128, EXq } },
8154     { "(bad)",          { XX } },
8155   },
8156
8157   /* VEX_LEN_11_P_1 */
8158   {
8159     { "vmovss",         { EXdVexS, Vex128, XM } },
8160     { "(bad)",          { XX } },
8161   },
8162
8163   /* VEX_LEN_11_P_3 */
8164   {
8165     { "vmovsd",         { EXqVexS, Vex128, XM } },
8166     { "(bad)",          { XX } },
8167   },
8168
8169   /* VEX_LEN_12_P_0_M_0 */
8170   {
8171     { "vmovlps",        { XM, Vex128, EXq } },
8172     { "(bad)",          { XX } },
8173   },
8174
8175   /* VEX_LEN_12_P_0_M_1 */
8176   {
8177     { "vmovhlps",       { XM, Vex128, EXq } },
8178     { "(bad)",          { XX } },
8179   },
8180
8181   /* VEX_LEN_12_P_2 */
8182   {
8183     { "vmovlpd",        { XM, Vex128, EXq } },
8184     { "(bad)",          { XX } },
8185   },
8186
8187   /* VEX_LEN_13_M_0 */
8188   {
8189     { "vmovlpX",        { EXq, XM } },
8190     { "(bad)",          { XX } },
8191   },
8192
8193   /* VEX_LEN_16_P_0_M_0 */
8194   {
8195     { "vmovhps",        { XM, Vex128, EXq } },
8196     { "(bad)",          { XX } },
8197   },
8198
8199   /* VEX_LEN_16_P_0_M_1 */
8200   {
8201     { "vmovlhps",       { XM, Vex128, EXq } },
8202     { "(bad)",          { XX } },
8203   },
8204
8205   /* VEX_LEN_16_P_2 */
8206   {
8207     { "vmovhpd",        { XM, Vex128, EXq } },
8208     { "(bad)",          { XX } },
8209   },
8210
8211   /* VEX_LEN_17_M_0 */
8212   {
8213     { "vmovhpX",        { EXq, XM } },
8214     { "(bad)",          { XX } },
8215   },
8216
8217   /* VEX_LEN_2A_P_1 */
8218   {
8219     { "vcvtsi2ss%LQ",   { XM, Vex128, Ev } },
8220     { "(bad)",          { XX } },
8221   },
8222
8223   /* VEX_LEN_2A_P_3 */
8224   {
8225     { "vcvtsi2sd%LQ",   { XM, Vex128, Ev } },
8226     { "(bad)",          { XX } },
8227   },
8228
8229   /* VEX_LEN_2C_P_1 */
8230   {
8231     { "vcvttss2siY",    { Gv, EXd } },
8232     { "(bad)",          { XX } },
8233   },
8234
8235   /* VEX_LEN_2C_P_3 */
8236   {
8237     { "vcvttsd2siY",    { Gv, EXq } },
8238     { "(bad)",          { XX } },
8239   },
8240
8241   /* VEX_LEN_2D_P_1 */
8242   {
8243     { "vcvtss2siY",     { Gv, EXd } },
8244     { "(bad)",          { XX } },
8245   },
8246
8247   /* VEX_LEN_2D_P_3 */
8248   {
8249     { "vcvtsd2siY",     { Gv, EXq } },
8250     { "(bad)",          { XX } },
8251   },
8252
8253   /* VEX_LEN_2E_P_0 */
8254   {
8255     { "vucomiss",       { XM, EXd } }, 
8256     { "(bad)",          { XX } },
8257   },
8258
8259   /* VEX_LEN_2E_P_2 */
8260   {
8261     { "vucomisd",       { XM, EXq } }, 
8262     { "(bad)",          { XX } },
8263   },
8264
8265   /* VEX_LEN_2F_P_0 */
8266   {
8267     { "vcomiss",        { XM, EXd } },
8268     { "(bad)",          { XX } },
8269   },
8270
8271   /* VEX_LEN_2F_P_2 */
8272   {
8273     { "vcomisd",        { XM, EXq } },
8274     { "(bad)",          { XX } },
8275   },
8276
8277   /* VEX_LEN_51_P_1 */
8278   {
8279     { "vsqrtss",        { XM, Vex128, EXd } },
8280     { "(bad)",          { XX } },
8281   },
8282
8283   /* VEX_LEN_51_P_3 */
8284   {
8285     { "vsqrtsd",        { XM, Vex128, EXq } },
8286     { "(bad)",          { XX } },
8287   },
8288
8289   /* VEX_LEN_52_P_1 */
8290   {
8291     { "vrsqrtss",       { XM, Vex128, EXd } },
8292     { "(bad)",          { XX } },
8293   },
8294
8295   /* VEX_LEN_53_P_1 */
8296   {
8297     { "vrcpss",         { XM, Vex128, EXd } },
8298     { "(bad)",          { XX } },
8299   },
8300
8301   /* VEX_LEN_58_P_1 */
8302   {
8303     { "vaddss",         { XM, Vex128, EXd } },
8304     { "(bad)",          { XX } },
8305   },
8306
8307   /* VEX_LEN_58_P_3 */
8308   {
8309     { "vaddsd",         { XM, Vex128, EXq } },
8310     { "(bad)",          { XX } },
8311   },
8312
8313   /* VEX_LEN_59_P_1 */
8314   {
8315     { "vmulss",         { XM, Vex128, EXd } },
8316     { "(bad)",          { XX } },
8317   },
8318
8319   /* VEX_LEN_59_P_3 */
8320   {
8321     { "vmulsd",         { XM, Vex128, EXq } },
8322     { "(bad)",          { XX } },
8323   },
8324
8325   /* VEX_LEN_5A_P_1 */
8326   {
8327     { "vcvtss2sd",      { XM, Vex128, EXd } },
8328     { "(bad)",          { XX } },
8329   },
8330
8331   /* VEX_LEN_5A_P_3 */
8332   {
8333     { "vcvtsd2ss",      { XM, Vex128, EXq } },
8334     { "(bad)",          { XX } },
8335   },
8336
8337   /* VEX_LEN_5C_P_1 */
8338   {
8339     { "vsubss",         { XM, Vex128, EXd } },
8340     { "(bad)",          { XX } },
8341   },
8342
8343   /* VEX_LEN_5C_P_3 */
8344   {
8345     { "vsubsd",         { XM, Vex128, EXq } },
8346     { "(bad)",          { XX } },
8347   },
8348
8349   /* VEX_LEN_5D_P_1 */
8350   {
8351     { "vminss",         { XM, Vex128, EXd } },
8352     { "(bad)",          { XX } },
8353   },
8354
8355   /* VEX_LEN_5D_P_3 */
8356   {
8357     { "vminsd",         { XM, Vex128, EXq } },
8358     { "(bad)",          { XX } },
8359   },
8360
8361   /* VEX_LEN_5E_P_1 */
8362   {
8363     { "vdivss",         { XM, Vex128, EXd } },
8364     { "(bad)",          { XX } },
8365   },
8366
8367   /* VEX_LEN_5E_P_3 */
8368   {
8369     { "vdivsd",         { XM, Vex128, EXq } },
8370     { "(bad)",          { XX } },
8371   },
8372
8373   /* VEX_LEN_5F_P_1 */
8374   {
8375     { "vmaxss",         { XM, Vex128, EXd } },
8376     { "(bad)",          { XX } },
8377   },
8378
8379   /* VEX_LEN_5F_P_3 */
8380   {
8381     { "vmaxsd",         { XM, Vex128, EXq } },
8382     { "(bad)",          { XX } },
8383   },
8384
8385   /* VEX_LEN_60_P_2 */
8386   {
8387     { "vpunpcklbw",     { XM, Vex128, EXx } },
8388     { "(bad)",          { XX } },
8389   },
8390
8391   /* VEX_LEN_61_P_2 */
8392   {
8393     { "vpunpcklwd",     { XM, Vex128, EXx } },
8394     { "(bad)",          { XX } },
8395   },
8396
8397   /* VEX_LEN_62_P_2 */
8398   {
8399     { "vpunpckldq",     { XM, Vex128, EXx } },
8400     { "(bad)",          { XX } },
8401   },
8402
8403   /* VEX_LEN_63_P_2 */
8404   {
8405     { "vpacksswb",      { XM, Vex128, EXx } },
8406     { "(bad)",          { XX } },
8407   },
8408
8409   /* VEX_LEN_64_P_2 */
8410   {
8411     { "vpcmpgtb",       { XM, Vex128, EXx } },
8412     { "(bad)",          { XX } },
8413   },
8414
8415   /* VEX_LEN_65_P_2 */
8416   {
8417     { "vpcmpgtw",       { XM, Vex128, EXx } },
8418     { "(bad)",          { XX } },
8419   },
8420
8421   /* VEX_LEN_66_P_2 */
8422   {
8423     { "vpcmpgtd",       { XM, Vex128, EXx } },
8424     { "(bad)",          { XX } },
8425   },
8426
8427   /* VEX_LEN_67_P_2 */
8428   {
8429     { "vpackuswb",      { XM, Vex128, EXx } },
8430     { "(bad)",          { XX } },
8431   },
8432
8433   /* VEX_LEN_68_P_2 */
8434   {
8435     { "vpunpckhbw",     { XM, Vex128, EXx } },
8436     { "(bad)",          { XX } },
8437   },
8438
8439   /* VEX_LEN_69_P_2 */
8440   {
8441     { "vpunpckhwd",     { XM, Vex128, EXx } },
8442     { "(bad)",          { XX } },
8443   },
8444
8445   /* VEX_LEN_6A_P_2 */
8446   {
8447     { "vpunpckhdq",     { XM, Vex128, EXx } },
8448     { "(bad)",          { XX } },
8449   },
8450
8451   /* VEX_LEN_6B_P_2 */
8452   {
8453     { "vpackssdw",      { XM, Vex128, EXx } },
8454     { "(bad)",          { XX } },
8455   },
8456
8457   /* VEX_LEN_6C_P_2 */
8458   {
8459     { "vpunpcklqdq",    { XM, Vex128, EXx } },
8460     { "(bad)",          { XX } },
8461   },
8462
8463   /* VEX_LEN_6D_P_2 */
8464   {
8465     { "vpunpckhqdq",    { XM, Vex128, EXx } },
8466     { "(bad)",          { XX } },
8467   },
8468
8469   /* VEX_LEN_6E_P_2 */
8470   {
8471     { "vmovK",          { XM, Edq } },
8472     { "(bad)",          { XX } },
8473   },
8474
8475   /* VEX_LEN_70_P_1 */
8476   {
8477     { "vpshufhw",       { XM, EXx, Ib } },
8478     { "(bad)",          { XX } },
8479   },
8480
8481   /* VEX_LEN_70_P_2 */
8482   {
8483     { "vpshufd",        { XM, EXx, Ib } },
8484     { "(bad)",          { XX } },
8485   },
8486
8487   /* VEX_LEN_70_P_3 */
8488   {
8489     { "vpshuflw",       { XM, EXx, Ib } },
8490     { "(bad)",          { XX } },
8491   },
8492
8493   /* VEX_LEN_71_R_2_P_2 */
8494   {
8495     { "vpsrlw",         { Vex128, XS, Ib } },
8496     { "(bad)",          { XX } },
8497   },
8498
8499   /* VEX_LEN_71_R_4_P_2 */
8500   {
8501     { "vpsraw",         { Vex128, XS, Ib } },
8502     { "(bad)",          { XX } },
8503   },
8504
8505   /* VEX_LEN_71_R_6_P_2 */
8506   {
8507     { "vpsllw",         { Vex128, XS, Ib } },
8508     { "(bad)",          { XX } },
8509   },
8510
8511   /* VEX_LEN_72_R_2_P_2 */
8512   {
8513     { "vpsrld",         { Vex128, XS, Ib } },
8514     { "(bad)",          { XX } },
8515   },
8516
8517   /* VEX_LEN_72_R_4_P_2 */
8518   {
8519     { "vpsrad",         { Vex128, XS, Ib } },
8520     { "(bad)",          { XX } },
8521   },
8522
8523   /* VEX_LEN_72_R_6_P_2 */
8524   {
8525     { "vpslld",         { Vex128, XS, Ib } },
8526     { "(bad)",          { XX } },
8527   },
8528
8529   /* VEX_LEN_73_R_2_P_2 */
8530   {
8531     { "vpsrlq",         { Vex128, XS, Ib } },
8532     { "(bad)",          { XX } },
8533   },
8534
8535   /* VEX_LEN_73_R_3_P_2 */
8536   {
8537     { "vpsrldq",        { Vex128, XS, Ib } },
8538     { "(bad)",          { XX } },
8539   },
8540
8541   /* VEX_LEN_73_R_6_P_2 */
8542   {
8543     { "vpsllq",         { Vex128, XS, Ib } },
8544     { "(bad)",          { XX } },
8545   },
8546
8547   /* VEX_LEN_73_R_7_P_2 */
8548   {
8549     { "vpslldq",        { Vex128, XS, Ib } },
8550     { "(bad)",          { XX } },
8551   },
8552
8553   /* VEX_LEN_74_P_2 */
8554   {
8555     { "vpcmpeqb",       { XM, Vex128, EXx } },
8556     { "(bad)",          { XX } },
8557   },
8558
8559   /* VEX_LEN_75_P_2 */
8560   {
8561     { "vpcmpeqw",       { XM, Vex128, EXx } },
8562     { "(bad)",          { XX } },
8563   },
8564
8565   /* VEX_LEN_76_P_2 */
8566   {
8567     { "vpcmpeqd",       { XM, Vex128, EXx } },
8568     { "(bad)",          { XX } },
8569   },
8570
8571   /* VEX_LEN_7E_P_1 */
8572   {
8573     { "vmovq",          { XM, EXq } },
8574     { "(bad)",          { XX } },
8575   },
8576
8577   /* VEX_LEN_7E_P_2 */
8578   {
8579     { "vmovK",          { Edq, XM } },
8580     { "(bad)",          { XX } },
8581   },
8582
8583   /* VEX_LEN_AE_R_2_M_0 */
8584   {
8585     { "vldmxcsr",       { Md } },
8586     { "(bad)",          { XX } },
8587   },
8588
8589   /* VEX_LEN_AE_R_3_M_0 */
8590   {
8591     { "vstmxcsr",       { Md } },
8592     { "(bad)",          { XX } },
8593   },
8594
8595   /* VEX_LEN_C2_P_1 */
8596   {
8597     { "vcmpss",         { XM, Vex128, EXd, VCMP } },
8598     { "(bad)",          { XX } },
8599   },
8600
8601   /* VEX_LEN_C2_P_3 */
8602   {
8603     { "vcmpsd",         { XM, Vex128, EXq, VCMP } },
8604     { "(bad)",          { XX } },
8605   },
8606
8607   /* VEX_LEN_C4_P_2 */
8608   {
8609     { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
8610     { "(bad)",          { XX } },
8611   },
8612
8613   /* VEX_LEN_C5_P_2 */
8614   {
8615     { "vpextrw",        { Gdq, XS, Ib } },
8616     { "(bad)",          { XX } },
8617   },
8618
8619   /* VEX_LEN_D1_P_2 */
8620   {
8621     { "vpsrlw",         { XM, Vex128, EXx } },
8622     { "(bad)",          { XX } },
8623   },
8624
8625   /* VEX_LEN_D2_P_2 */
8626   {
8627     { "vpsrld",         { XM, Vex128, EXx } },
8628     { "(bad)",          { XX } },
8629   },
8630
8631   /* VEX_LEN_D3_P_2 */
8632   {
8633     { "vpsrlq",         { XM, Vex128, EXx } },
8634     { "(bad)",          { XX } },
8635   },
8636
8637   /* VEX_LEN_D4_P_2 */
8638   {
8639     { "vpaddq",         { XM, Vex128, EXx } },
8640     { "(bad)",          { XX } },
8641   },
8642
8643   /* VEX_LEN_D5_P_2 */
8644   {
8645     { "vpmullw",        { XM, Vex128, EXx } },
8646     { "(bad)",          { XX } },
8647   },
8648
8649   /* VEX_LEN_D6_P_2 */
8650   {
8651     { "vmovq",          { EXqS, XM } },
8652     { "(bad)",          { XX } },
8653   },
8654
8655   /* VEX_LEN_D7_P_2_M_1 */
8656   {
8657     { "vpmovmskb",      { Gdq, XS } },
8658     { "(bad)",          { XX } },
8659   },
8660
8661   /* VEX_LEN_D8_P_2 */
8662   {
8663     { "vpsubusb",       { XM, Vex128, EXx } },
8664     { "(bad)",          { XX } },
8665   },
8666
8667   /* VEX_LEN_D9_P_2 */
8668   {
8669     { "vpsubusw",       { XM, Vex128, EXx } },
8670     { "(bad)",          { XX } },
8671   },
8672
8673   /* VEX_LEN_DA_P_2 */
8674   {
8675     { "vpminub",        { XM, Vex128, EXx } },
8676     { "(bad)",          { XX } },
8677   },
8678
8679   /* VEX_LEN_DB_P_2 */
8680   {
8681     { "vpand",          { XM, Vex128, EXx } },
8682     { "(bad)",          { XX } },
8683   },
8684
8685   /* VEX_LEN_DC_P_2 */
8686   {
8687     { "vpaddusb",       { XM, Vex128, EXx } },
8688     { "(bad)",          { XX } },
8689   },
8690
8691   /* VEX_LEN_DD_P_2 */
8692   {
8693     { "vpaddusw",       { XM, Vex128, EXx } },
8694     { "(bad)",          { XX } },
8695   },
8696
8697   /* VEX_LEN_DE_P_2 */
8698   {
8699     { "vpmaxub",        { XM, Vex128, EXx } },
8700     { "(bad)",          { XX } },
8701   },
8702
8703   /* VEX_LEN_DF_P_2 */
8704   {
8705     { "vpandn",         { XM, Vex128, EXx } },
8706     { "(bad)",          { XX } },
8707   },
8708
8709   /* VEX_LEN_E0_P_2 */
8710   {
8711     { "vpavgb",         { XM, Vex128, EXx } },
8712     { "(bad)",          { XX } },
8713   },
8714
8715   /* VEX_LEN_E1_P_2 */
8716   {
8717     { "vpsraw",         { XM, Vex128, EXx } },
8718     { "(bad)",          { XX } },
8719   },
8720
8721   /* VEX_LEN_E2_P_2 */
8722   {
8723     { "vpsrad",         { XM, Vex128, EXx } },
8724     { "(bad)",          { XX } },
8725   },
8726
8727   /* VEX_LEN_E3_P_2 */
8728   {
8729     { "vpavgw",         { XM, Vex128, EXx } },
8730     { "(bad)",          { XX } },
8731   },
8732
8733   /* VEX_LEN_E4_P_2 */
8734   {
8735     { "vpmulhuw",       { XM, Vex128, EXx } },
8736     { "(bad)",          { XX } },
8737   },
8738
8739   /* VEX_LEN_E5_P_2 */
8740   {
8741     { "vpmulhw",        { XM, Vex128, EXx } },
8742     { "(bad)",          { XX } },
8743   },
8744
8745   /* VEX_LEN_E8_P_2 */
8746   {
8747     { "vpsubsb",        { XM, Vex128, EXx } },
8748     { "(bad)",          { XX } },
8749   },
8750
8751   /* VEX_LEN_E9_P_2 */
8752   {
8753     { "vpsubsw",        { XM, Vex128, EXx } },
8754     { "(bad)",          { XX } },
8755   },
8756
8757   /* VEX_LEN_EA_P_2 */
8758   {
8759     { "vpminsw",        { XM, Vex128, EXx } },
8760     { "(bad)",          { XX } },
8761   },
8762
8763   /* VEX_LEN_EB_P_2 */
8764   {
8765     { "vpor",           { XM, Vex128, EXx } },
8766     { "(bad)",          { XX } },
8767   },
8768
8769   /* VEX_LEN_EC_P_2 */
8770   {
8771     { "vpaddsb",        { XM, Vex128, EXx } },
8772     { "(bad)",          { XX } },
8773   },
8774
8775   /* VEX_LEN_ED_P_2 */
8776   {
8777     { "vpaddsw",        { XM, Vex128, EXx } },
8778     { "(bad)",          { XX } },
8779   },
8780
8781   /* VEX_LEN_EE_P_2 */
8782   {
8783     { "vpmaxsw",        { XM, Vex128, EXx } },
8784     { "(bad)",          { XX } },
8785   },
8786
8787   /* VEX_LEN_EF_P_2 */
8788   {
8789     { "vpxor",          { XM, Vex128, EXx } },
8790     { "(bad)",          { XX } },
8791   },
8792
8793   /* VEX_LEN_F1_P_2 */
8794   {
8795     { "vpsllw",         { XM, Vex128, EXx } },
8796     { "(bad)",          { XX } },
8797   },
8798
8799   /* VEX_LEN_F2_P_2 */
8800   {
8801     { "vpslld",         { XM, Vex128, EXx } },
8802     { "(bad)",          { XX } },
8803   },
8804
8805   /* VEX_LEN_F3_P_2 */
8806   {
8807     { "vpsllq",         { XM, Vex128, EXx } },
8808     { "(bad)",          { XX } },
8809   },
8810
8811   /* VEX_LEN_F4_P_2 */
8812   {
8813     { "vpmuludq",       { XM, Vex128, EXx } },
8814     { "(bad)",          { XX } },
8815   },
8816
8817   /* VEX_LEN_F5_P_2 */
8818   {
8819     { "vpmaddwd",       { XM, Vex128, EXx } },
8820     { "(bad)",          { XX } },
8821   },
8822
8823   /* VEX_LEN_F6_P_2 */
8824   {
8825     { "vpsadbw",        { XM, Vex128, EXx } },
8826     { "(bad)",          { XX } },
8827   },
8828
8829   /* VEX_LEN_F7_P_2 */
8830   {
8831     { "vmaskmovdqu",    { XM, XS } },
8832     { "(bad)",          { XX } },
8833   },
8834
8835   /* VEX_LEN_F8_P_2 */
8836   {
8837     { "vpsubb",         { XM, Vex128, EXx } },
8838     { "(bad)",          { XX } },
8839   },
8840
8841   /* VEX_LEN_F9_P_2 */
8842   {
8843     { "vpsubw",         { XM, Vex128, EXx } },
8844     { "(bad)",          { XX } },
8845   },
8846
8847   /* VEX_LEN_FA_P_2 */
8848   {
8849     { "vpsubd",         { XM, Vex128, EXx } },
8850     { "(bad)",          { XX } },
8851   },
8852
8853   /* VEX_LEN_FB_P_2 */
8854   {
8855     { "vpsubq",         { XM, Vex128, EXx } },
8856     { "(bad)",          { XX } },
8857   },
8858
8859   /* VEX_LEN_FC_P_2 */
8860   {
8861     { "vpaddb",         { XM, Vex128, EXx } },
8862     { "(bad)",          { XX } },
8863   },
8864
8865   /* VEX_LEN_FD_P_2 */
8866   {
8867     { "vpaddw",         { XM, Vex128, EXx } },
8868     { "(bad)",          { XX } },
8869   },
8870
8871   /* VEX_LEN_FE_P_2 */
8872   {
8873     { "vpaddd",         { XM, Vex128, EXx } },
8874     { "(bad)",          { XX } },
8875   },
8876
8877   /* VEX_LEN_3800_P_2 */
8878   {
8879     { "vpshufb",        { XM, Vex128, EXx } },
8880     { "(bad)",          { XX } },
8881   },
8882
8883   /* VEX_LEN_3801_P_2 */
8884   {
8885     { "vphaddw",        { XM, Vex128, EXx } },
8886     { "(bad)",          { XX } },
8887   },
8888
8889   /* VEX_LEN_3802_P_2 */
8890   {
8891     { "vphaddd",        { XM, Vex128, EXx } },
8892     { "(bad)",          { XX } },
8893   },
8894
8895   /* VEX_LEN_3803_P_2 */
8896   {
8897     { "vphaddsw",       { XM, Vex128, EXx } },
8898     { "(bad)",          { XX } },
8899   },
8900
8901   /* VEX_LEN_3804_P_2 */
8902   {
8903     { "vpmaddubsw",     { XM, Vex128, EXx } },
8904     { "(bad)",          { XX } },
8905   },
8906
8907   /* VEX_LEN_3805_P_2 */
8908   {
8909     { "vphsubw",        { XM, Vex128, EXx } },
8910     { "(bad)",          { XX } },
8911   },
8912
8913   /* VEX_LEN_3806_P_2 */
8914   {
8915     { "vphsubd",        { XM, Vex128, EXx } },
8916     { "(bad)",          { XX } },
8917   },
8918
8919   /* VEX_LEN_3807_P_2 */
8920   {
8921     { "vphsubsw",       { XM, Vex128, EXx } },
8922     { "(bad)",          { XX } },
8923   },
8924
8925   /* VEX_LEN_3808_P_2 */
8926   {
8927     { "vpsignb",        { XM, Vex128, EXx } },
8928     { "(bad)",          { XX } },
8929   },
8930
8931   /* VEX_LEN_3809_P_2 */
8932   {
8933     { "vpsignw",        { XM, Vex128, EXx } },
8934     { "(bad)",          { XX } },
8935   },
8936
8937   /* VEX_LEN_380A_P_2 */
8938   {
8939     { "vpsignd",        { XM, Vex128, EXx } },
8940     { "(bad)",          { XX } },
8941   },
8942
8943   /* VEX_LEN_380B_P_2 */
8944   {
8945     { "vpmulhrsw",      { XM, Vex128, EXx } },
8946     { "(bad)",          { XX } },
8947   },
8948
8949   /* VEX_LEN_3819_P_2_M_0 */
8950   {
8951     { "(bad)",          { XX } },
8952     { "vbroadcastsd",   { XM, Mq } },
8953   },
8954
8955   /* VEX_LEN_381A_P_2_M_0 */
8956   {
8957     { "(bad)",          { XX } },
8958     { "vbroadcastf128", { XM, Mxmm } },
8959   },
8960
8961   /* VEX_LEN_381C_P_2 */
8962   {
8963     { "vpabsb",         { XM, EXx } },
8964     { "(bad)",          { XX } },
8965   },
8966
8967   /* VEX_LEN_381D_P_2 */
8968   {
8969     { "vpabsw",         { XM, EXx } },
8970     { "(bad)",          { XX } },
8971   },
8972
8973   /* VEX_LEN_381E_P_2 */
8974   {
8975     { "vpabsd",         { XM, EXx } },
8976     { "(bad)",          { XX } },
8977   },
8978
8979   /* VEX_LEN_3820_P_2 */
8980   {
8981     { "vpmovsxbw",      { XM, EXq } },
8982     { "(bad)",          { XX } },
8983   },
8984
8985   /* VEX_LEN_3821_P_2 */
8986   {
8987     { "vpmovsxbd",      { XM, EXd } },
8988     { "(bad)",          { XX } },
8989   },
8990
8991   /* VEX_LEN_3822_P_2 */
8992   {
8993     { "vpmovsxbq",      { XM, EXw } },
8994     { "(bad)",          { XX } },
8995   },
8996
8997   /* VEX_LEN_3823_P_2 */
8998   {
8999     { "vpmovsxwd",      { XM, EXq } },
9000     { "(bad)",          { XX } },
9001   },
9002
9003   /* VEX_LEN_3824_P_2 */
9004   {
9005     { "vpmovsxwq",      { XM, EXd } },
9006     { "(bad)",          { XX } },
9007   },
9008
9009   /* VEX_LEN_3825_P_2 */
9010   {
9011     { "vpmovsxdq",      { XM, EXq } },
9012     { "(bad)",          { XX } },
9013   },
9014
9015   /* VEX_LEN_3828_P_2 */
9016   {
9017     { "vpmuldq",        { XM, Vex128, EXx } },
9018     { "(bad)",          { XX } },
9019   },
9020
9021   /* VEX_LEN_3829_P_2 */
9022   {
9023     { "vpcmpeqq",       { XM, Vex128, EXx } },
9024     { "(bad)",          { XX } },
9025   },
9026
9027   /* VEX_LEN_382A_P_2_M_0 */
9028   {
9029     { "vmovntdqa",      { XM, Mx } },
9030     { "(bad)",          { XX } },
9031   },
9032
9033   /* VEX_LEN_382B_P_2 */
9034   {
9035     { "vpackusdw",      { XM, Vex128, EXx } },
9036     { "(bad)",          { XX } },
9037   },
9038
9039   /* VEX_LEN_3830_P_2 */
9040   {
9041     { "vpmovzxbw",      { XM, EXq } },
9042     { "(bad)",          { XX } },
9043   },
9044
9045   /* VEX_LEN_3831_P_2 */
9046   {
9047     { "vpmovzxbd",      { XM, EXd } },
9048     { "(bad)",          { XX } },
9049   },
9050
9051   /* VEX_LEN_3832_P_2 */
9052   {
9053     { "vpmovzxbq",      { XM, EXw } },
9054     { "(bad)",          { XX } },
9055   },
9056
9057   /* VEX_LEN_3833_P_2 */
9058   {
9059     { "vpmovzxwd",      { XM, EXq } },
9060     { "(bad)",          { XX } },
9061   },
9062
9063   /* VEX_LEN_3834_P_2 */
9064   {
9065     { "vpmovzxwq",      { XM, EXd } },
9066     { "(bad)",          { XX } },
9067   },
9068
9069   /* VEX_LEN_3835_P_2 */
9070   {
9071     { "vpmovzxdq",      { XM, EXq } },
9072     { "(bad)",          { XX } },
9073   },
9074
9075   /* VEX_LEN_3837_P_2 */
9076   {
9077     { "vpcmpgtq",       { XM, Vex128, EXx } },
9078     { "(bad)",          { XX } },
9079   },
9080
9081   /* VEX_LEN_3838_P_2 */
9082   {
9083     { "vpminsb",        { XM, Vex128, EXx } },
9084     { "(bad)",          { XX } },
9085   },
9086
9087   /* VEX_LEN_3839_P_2 */
9088   {
9089     { "vpminsd",        { XM, Vex128, EXx } },
9090     { "(bad)",          { XX } },
9091   },
9092
9093   /* VEX_LEN_383A_P_2 */
9094   {
9095     { "vpminuw",        { XM, Vex128, EXx } },
9096     { "(bad)",          { XX } },
9097   },
9098
9099   /* VEX_LEN_383B_P_2 */
9100   {
9101     { "vpminud",        { XM, Vex128, EXx } },
9102     { "(bad)",          { XX } },
9103   },
9104
9105   /* VEX_LEN_383C_P_2 */
9106   {
9107     { "vpmaxsb",        { XM, Vex128, EXx } },
9108     { "(bad)",          { XX } },
9109   },
9110
9111   /* VEX_LEN_383D_P_2 */
9112   {
9113     { "vpmaxsd",        { XM, Vex128, EXx } },
9114     { "(bad)",          { XX } },
9115   },
9116
9117   /* VEX_LEN_383E_P_2 */
9118   {
9119     { "vpmaxuw",        { XM, Vex128, EXx } },
9120     { "(bad)",          { XX } },
9121   },
9122
9123   /* VEX_LEN_383F_P_2 */
9124   {
9125     { "vpmaxud",        { XM, Vex128, EXx } },
9126     { "(bad)",          { XX } },
9127   },
9128
9129   /* VEX_LEN_3840_P_2 */
9130   {
9131     { "vpmulld",        { XM, Vex128, EXx } },
9132     { "(bad)",          { XX } },
9133   },
9134
9135   /* VEX_LEN_3841_P_2 */
9136   {
9137     { "vphminposuw",    { XM, EXx } },
9138     { "(bad)",          { XX } },
9139   },
9140
9141   /* VEX_LEN_38DB_P_2 */
9142   {
9143     { "vaesimc",        { XM, EXx } },
9144     { "(bad)",          { XX } },
9145   },
9146
9147   /* VEX_LEN_38DC_P_2 */
9148   {
9149     { "vaesenc",        { XM, Vex128, EXx } },
9150     { "(bad)",          { XX } },
9151   },
9152
9153   /* VEX_LEN_38DD_P_2 */
9154   {
9155     { "vaesenclast",    { XM, Vex128, EXx } },
9156     { "(bad)",          { XX } },
9157   },
9158
9159   /* VEX_LEN_38DE_P_2 */
9160   {
9161     { "vaesdec",        { XM, Vex128, EXx } },
9162     { "(bad)",          { XX } },
9163   },
9164
9165   /* VEX_LEN_38DF_P_2 */
9166   {
9167     { "vaesdeclast",    { XM, Vex128, EXx } },
9168     { "(bad)",          { XX } },
9169   },
9170
9171   /* VEX_LEN_3A06_P_2 */
9172   {
9173     { "(bad)",          { XX } },
9174     { "vperm2f128",     { XM, Vex256, EXx, Ib } },
9175   },
9176
9177   /* VEX_LEN_3A0A_P_2 */
9178   {
9179     { "vroundss",       { XM, Vex128, EXd, Ib } },
9180     { "(bad)",          { XX } },
9181   },
9182
9183   /* VEX_LEN_3A0B_P_2 */
9184   {
9185     { "vroundsd",       { XM, Vex128, EXq, Ib } },
9186     { "(bad)",          { XX } },
9187   },
9188
9189   /* VEX_LEN_3A0E_P_2 */
9190   {
9191     { "vpblendw",       { XM, Vex128, EXx, Ib } },
9192     { "(bad)",          { XX } },
9193   },
9194
9195   /* VEX_LEN_3A0F_P_2 */
9196   {
9197     { "vpalignr",       { XM, Vex128, EXx, Ib } },
9198     { "(bad)",          { XX } },
9199   },
9200
9201   /* VEX_LEN_3A14_P_2 */
9202   {
9203     { "vpextrb",        { Edqb, XM, Ib } },
9204     { "(bad)",          { XX } },
9205   },
9206
9207   /* VEX_LEN_3A15_P_2 */
9208   {
9209     { "vpextrw",        { Edqw, XM, Ib } },
9210     { "(bad)",          { XX } },
9211   },
9212
9213   /* VEX_LEN_3A16_P_2  */
9214   {
9215     { "vpextrK",        { Edq, XM, Ib } },
9216     { "(bad)",          { XX } },
9217   },
9218
9219   /* VEX_LEN_3A17_P_2 */
9220   {
9221     { "vextractps",     { Edqd, XM, Ib } },
9222     { "(bad)",          { XX } },
9223   },
9224
9225   /* VEX_LEN_3A18_P_2 */
9226   {
9227     { "(bad)",          { XX } },
9228     { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
9229   },
9230
9231   /* VEX_LEN_3A19_P_2 */
9232   {
9233     { "(bad)",          { XX } },
9234     { "vextractf128",   { EXxmm, XM, Ib } },
9235   },
9236
9237   /* VEX_LEN_3A20_P_2 */
9238   {
9239     { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
9240     { "(bad)",          { XX } },
9241   },
9242
9243   /* VEX_LEN_3A21_P_2 */
9244   {
9245     { "vinsertps",      { XM, Vex128, EXd, Ib } },
9246     { "(bad)",          { XX } },
9247   },
9248
9249   /* VEX_LEN_3A22_P_2 */
9250   {
9251     { "vpinsrK",        { XM, Vex128, Edq, Ib } },
9252     { "(bad)",          { XX } },
9253   },
9254
9255   /* VEX_LEN_3A41_P_2 */
9256   {
9257     { "vdppd",          { XM, Vex128, EXx, Ib } },
9258     { "(bad)",          { XX } },
9259   },
9260
9261   /* VEX_LEN_3A42_P_2 */
9262   {
9263     { "vmpsadbw",       { XM, Vex128, EXx, Ib } },
9264     { "(bad)",          { XX } },
9265   },
9266
9267   /* VEX_LEN_3A44_P_2 */
9268   {
9269     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL } },
9270     { "(bad)",          { XX } },
9271   },
9272
9273   /* VEX_LEN_3A4C_P_2 */
9274   {
9275     { "vpblendvb",      { XM, Vex128, EXx, XMVexI4 } },
9276     { "(bad)",          { XX } },
9277   },
9278
9279   /* VEX_LEN_3A60_P_2 */
9280   {
9281     { "vpcmpestrm",     { XM, EXx, Ib } },
9282     { "(bad)",          { XX } },
9283   },
9284
9285   /* VEX_LEN_3A61_P_2 */
9286   {
9287     { "vpcmpestri",     { XM, EXx, Ib } },
9288     { "(bad)",          { XX } },
9289   },
9290
9291   /* VEX_LEN_3A62_P_2 */
9292   {
9293     { "vpcmpistrm",     { XM, EXx, Ib } },
9294     { "(bad)",          { XX } },
9295   },
9296
9297   /* VEX_LEN_3A63_P_2 */
9298   {
9299     { "vpcmpistri",     { XM, EXx, Ib } },
9300     { "(bad)",          { XX } },
9301   },
9302
9303   /* VEX_LEN_3A6A_P_2 */
9304   {
9305     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9306     { "(bad)",          { XX } },
9307   },
9308
9309   /* VEX_LEN_3A6B_P_2 */
9310   {
9311     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9312     { "(bad)",          { XX } },
9313   },
9314
9315   /* VEX_LEN_3A6E_P_2 */
9316   {
9317     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9318     { "(bad)",          { XX } },
9319   },
9320
9321   /* VEX_LEN_3A6F_P_2 */
9322   {
9323     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9324     { "(bad)",          { XX } },
9325   },
9326
9327   /* VEX_LEN_3A7A_P_2 */
9328   {
9329     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9330     { "(bad)",          { XX } },
9331   },
9332
9333   /* VEX_LEN_3A7B_P_2 */
9334   {
9335     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9336     { "(bad)",          { XX } },
9337   },
9338
9339   /* VEX_LEN_3A7E_P_2 */
9340   {
9341     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9342     { "(bad)",          { XX } },
9343   },
9344
9345   /* VEX_LEN_3A7F_P_2 */
9346   {
9347     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9348     { "(bad)",          { XX } },
9349   },
9350
9351   /* VEX_LEN_3ADF_P_2 */
9352   {
9353     { "vaeskeygenassist", { XM, EXx, Ib } },
9354     { "(bad)",          { XX } },
9355   },
9356
9357   /* VEX_LEN_XOP_09_80 */
9358   {
9359     { "vfrczps",        { XM, EXxmm } },
9360     { "vfrczps",        { XM, EXymmq } },
9361   },
9362
9363   /* VEX_LEN_XOP_09_81 */
9364   {
9365     { "vfrczpd",        { XM, EXxmm } },
9366     { "vfrczpd",        { XM, EXymmq } },
9367   },
9368 };
9369
9370 static const struct dis386 mod_table[][2] = {
9371   {
9372     /* MOD_8D */
9373     { "leaS",           { Gv, M } },
9374     { "(bad)",          { XX } },
9375   },
9376   {
9377     /* MOD_0F01_REG_0 */
9378     { X86_64_TABLE (X86_64_0F01_REG_0) },
9379     { RM_TABLE (RM_0F01_REG_0) },
9380   },
9381   {
9382     /* MOD_0F01_REG_1 */
9383     { X86_64_TABLE (X86_64_0F01_REG_1) },
9384     { RM_TABLE (RM_0F01_REG_1) },
9385   },
9386   {
9387     /* MOD_0F01_REG_2 */
9388     { X86_64_TABLE (X86_64_0F01_REG_2) },
9389     { RM_TABLE (RM_0F01_REG_2) },
9390   },
9391   {
9392     /* MOD_0F01_REG_3 */
9393     { X86_64_TABLE (X86_64_0F01_REG_3) },
9394     { RM_TABLE (RM_0F01_REG_3) },
9395   },
9396   {
9397     /* MOD_0F01_REG_7 */
9398     { "invlpg",         { Mb } },
9399     { RM_TABLE (RM_0F01_REG_7) },
9400   },
9401   {
9402     /* MOD_0F12_PREFIX_0 */
9403     { "movlps",         { XM, EXq } },
9404     { "movhlps",        { XM, EXq } },
9405   },
9406   {
9407     /* MOD_0F13 */
9408     { "movlpX",         { EXq, XM } },
9409     { "(bad)",          { XX } },
9410   },
9411   {
9412     /* MOD_0F16_PREFIX_0 */
9413     { "movhps",         { XM, EXq } },
9414     { "movlhps",        { XM, EXq } },
9415   },
9416   {
9417     /* MOD_0F17 */
9418     { "movhpX",         { EXq, XM } },
9419     { "(bad)",          { XX } },
9420   },
9421   {
9422     /* MOD_0F18_REG_0 */
9423     { "prefetchnta",    { Mb } },
9424     { "(bad)",          { XX } },
9425   },
9426   {
9427     /* MOD_0F18_REG_1 */
9428     { "prefetcht0",     { Mb } },
9429     { "(bad)",          { XX } },
9430   },
9431   {
9432     /* MOD_0F18_REG_2 */
9433     { "prefetcht1",     { Mb } },
9434     { "(bad)",          { XX } },
9435   },
9436   {
9437     /* MOD_0F18_REG_3 */
9438     { "prefetcht2",     { Mb } },
9439     { "(bad)",          { XX } },
9440   },
9441   {
9442     /* MOD_0F20 */
9443     { "(bad)",          { XX } },
9444     { "movZ",           { Rm, Cm } },
9445   },
9446   {
9447     /* MOD_0F21 */
9448     { "(bad)",          { XX } },
9449     { "movZ",           { Rm, Dm } },
9450   },
9451   {
9452     /* MOD_0F22 */
9453     { "(bad)",          { XX } },
9454     { "movZ",           { Cm, Rm } },
9455   },
9456   {
9457     /* MOD_0F23 */
9458     { "(bad)",          { XX } },
9459     { "movZ",           { Dm, Rm } },
9460   },
9461   {
9462     /* MOD_0F24 */
9463     { "(bad)",          { XX } },    
9464     { "movL",           { Rd, Td } },
9465   },
9466   {
9467     /* MOD_0F26 */
9468     { "(bad)",          { XX } },
9469     { "movL",           { Td, Rd } },
9470   },
9471   {
9472     /* MOD_0F2B_PREFIX_0 */
9473     {"movntps",         { Mx, XM } },
9474     { "(bad)",          { XX } },
9475   },
9476   {
9477     /* MOD_0F2B_PREFIX_1 */
9478     {"movntss",         { Md, XM } },
9479     { "(bad)",          { XX } },
9480   },
9481   {
9482     /* MOD_0F2B_PREFIX_2 */
9483     {"movntpd",         { Mx, XM } },
9484     { "(bad)",          { XX } },
9485   },
9486   {
9487     /* MOD_0F2B_PREFIX_3 */
9488     {"movntsd",         { Mq, XM } },
9489     { "(bad)",          { XX } },
9490   },
9491   {
9492     /* MOD_0F51 */
9493     { "(bad)",          { XX } },
9494     { "movmskpX",       { Gdq, XS } },
9495   },
9496   {
9497     /* MOD_0F71_REG_2 */
9498     { "(bad)",          { XX } },
9499     { "psrlw",          { MS, Ib } },
9500   },
9501   {
9502     /* MOD_0F71_REG_4 */
9503     { "(bad)",          { XX } },
9504     { "psraw",          { MS, Ib } },
9505   },
9506   {
9507     /* MOD_0F71_REG_6 */
9508     { "(bad)",          { XX } },
9509     { "psllw",          { MS, Ib } },
9510   },
9511   {
9512     /* MOD_0F72_REG_2 */
9513     { "(bad)",          { XX } },
9514     { "psrld",          { MS, Ib } },
9515   },
9516   {
9517     /* MOD_0F72_REG_4 */
9518     { "(bad)",          { XX } },
9519     { "psrad",          { MS, Ib } },
9520   },
9521   {
9522     /* MOD_0F72_REG_6 */
9523     { "(bad)",          { XX } },
9524     { "pslld",          { MS, Ib } },
9525   },
9526   {
9527     /* MOD_0F73_REG_2 */
9528     { "(bad)",          { XX } },
9529     { "psrlq",          { MS, Ib } },
9530   },
9531   {
9532     /* MOD_0F73_REG_3 */
9533     { "(bad)",          { XX } },
9534     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9535   },
9536   {
9537     /* MOD_0F73_REG_6 */
9538     { "(bad)",          { XX } },
9539     { "psllq",          { MS, Ib } },
9540   },
9541   {
9542     /* MOD_0F73_REG_7 */
9543     { "(bad)",          { XX } },
9544     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9545   },
9546   {
9547     /* MOD_0FAE_REG_0 */
9548     { "fxsave",         { FXSAVE } },
9549     { "(bad)",          { XX } },
9550   },
9551   {
9552     /* MOD_0FAE_REG_1 */
9553     { "fxrstor",        { FXSAVE } },
9554     { "(bad)",          { XX } },
9555   },
9556   {
9557     /* MOD_0FAE_REG_2 */
9558     { "ldmxcsr",        { Md } },
9559     { "(bad)",          { XX } },
9560   },
9561   {
9562     /* MOD_0FAE_REG_3 */
9563     { "stmxcsr",        { Md } },
9564     { "(bad)",          { XX } },
9565   },
9566   {
9567     /* MOD_0FAE_REG_4 */
9568     { "xsave",          { M } },
9569     { "(bad)",          { XX } },
9570   },
9571   {
9572     /* MOD_0FAE_REG_5 */
9573     { "xrstor",         { M } },
9574     { RM_TABLE (RM_0FAE_REG_5) },
9575   },
9576   {
9577     /* MOD_0FAE_REG_6 */
9578     { "xsaveopt",       { M } },
9579     { RM_TABLE (RM_0FAE_REG_6) },
9580   },
9581   {
9582     /* MOD_0FAE_REG_7 */
9583     { "clflush",        { Mb } },
9584     { RM_TABLE (RM_0FAE_REG_7) },
9585   },
9586   {
9587     /* MOD_0FB2 */
9588     { "lssS",           { Gv, Mp } },
9589     { "(bad)",          { XX } },
9590   },
9591   {
9592     /* MOD_0FB4 */
9593     { "lfsS",           { Gv, Mp } },
9594     { "(bad)",          { XX } },
9595   },
9596   {
9597     /* MOD_0FB5 */
9598     { "lgsS",           { Gv, Mp } },
9599     { "(bad)",          { XX } },
9600   },
9601   {
9602     /* MOD_0FC7_REG_6 */
9603     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9604     { "(bad)",          { XX } },
9605   },
9606   {
9607     /* MOD_0FC7_REG_7 */
9608     { "vmptrst",        { Mq } },
9609     { "(bad)",          { XX } },
9610   },
9611   {
9612     /* MOD_0FD7 */
9613     { "(bad)",          { XX } },
9614     { "pmovmskb",       { Gdq, MS } },
9615   },
9616   {
9617     /* MOD_0FE7_PREFIX_2 */
9618     { "movntdq",        { Mx, XM } },
9619     { "(bad)",          { XX } },
9620   },
9621   {
9622     /* MOD_0FF0_PREFIX_3 */
9623     { "lddqu",          { XM, M } },
9624     { "(bad)",          { XX } },
9625   },
9626   {
9627     /* MOD_0F382A_PREFIX_2 */
9628     { "movntdqa",       { XM, Mx } },
9629     { "(bad)",          { XX } },
9630   },
9631   {
9632     /* MOD_62_32BIT */
9633     { "bound{S|}",      { Gv, Ma } },
9634     { "(bad)",          { XX } },
9635   },
9636   {
9637     /* MOD_C4_32BIT */
9638     { "lesS",           { Gv, Mp } },
9639     { VEX_C4_TABLE (VEX_0F) },
9640   },
9641   {
9642     /* MOD_C5_32BIT */
9643     { "ldsS",           { Gv, Mp } },
9644     { VEX_C5_TABLE (VEX_0F) },
9645   },
9646   {
9647     /* MOD_VEX_12_PREFIX_0 */
9648     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9649     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9650   },
9651   {
9652     /* MOD_VEX_13 */
9653     { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9654     { "(bad)",          { XX } },
9655   },
9656   {
9657     /* MOD_VEX_16_PREFIX_0 */
9658     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9659     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9660   },
9661   {
9662     /* MOD_VEX_17 */
9663     { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9664     { "(bad)",          { XX } },
9665   },
9666   {
9667     /* MOD_VEX_2B */
9668     { "vmovntpX",       { Mx, XM } },
9669     { "(bad)",          { XX } },
9670   },
9671   {
9672     /* MOD_VEX_50 */
9673     { "(bad)",          { XX } },
9674     { "vmovmskpX",      { Gdq, XS } },
9675   },
9676   {
9677     /* MOD_VEX_71_REG_2 */
9678     { "(bad)",          { XX } },
9679     { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9680   },
9681   {
9682     /* MOD_VEX_71_REG_4 */
9683     { "(bad)",          { XX } },
9684     { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9685   },
9686   {
9687     /* MOD_VEX_71_REG_6 */
9688     { "(bad)",          { XX } },
9689     { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9690   },
9691   {
9692     /* MOD_VEX_72_REG_2 */
9693     { "(bad)",          { XX } },
9694     { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9695   },
9696   {
9697     /* MOD_VEX_72_REG_4 */
9698     { "(bad)",          { XX } },
9699     { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9700   },
9701   {
9702     /* MOD_VEX_72_REG_6 */
9703     { "(bad)",          { XX } },
9704     { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9705   },
9706   {
9707     /* MOD_VEX_73_REG_2 */
9708     { "(bad)",          { XX } },
9709     { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9710   },
9711   {
9712     /* MOD_VEX_73_REG_3 */
9713     { "(bad)",          { XX } },
9714     { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9715   },
9716   {
9717     /* MOD_VEX_73_REG_6 */
9718     { "(bad)",          { XX } },
9719     { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9720   },
9721   {
9722     /* MOD_VEX_73_REG_7 */
9723     { "(bad)",          { XX } },
9724     { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9725   },
9726   {
9727     /* MOD_VEX_AE_REG_2 */
9728     { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9729     { "(bad)",          { XX } },
9730   },
9731   {
9732     /* MOD_VEX_AE_REG_3 */
9733     { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9734     { "(bad)",          { XX } },
9735   },
9736   {
9737     /* MOD_VEX_D7_PREFIX_2 */
9738     { "(bad)",          { XX } },
9739     { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9740   },
9741   {
9742     /* MOD_VEX_E7_PREFIX_2 */
9743     { "vmovntdq",       { Mx, XM } },
9744     { "(bad)",          { XX } },
9745   },
9746   {
9747     /* MOD_VEX_F0_PREFIX_3 */
9748     { "vlddqu",         { XM, M } },
9749     { "(bad)",          { XX } },
9750   },
9751   {
9752     /* MOD_VEX_3818_PREFIX_2 */
9753     { "vbroadcastss",   { XM, Md } },
9754     { "(bad)",          { XX } },
9755   },
9756   {
9757     /* MOD_VEX_3819_PREFIX_2 */
9758     { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9759     { "(bad)",          { XX } },
9760   },
9761   {
9762     /* MOD_VEX_381A_PREFIX_2 */
9763     { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9764     { "(bad)",          { XX } },
9765   },
9766   {
9767     /* MOD_VEX_382A_PREFIX_2 */
9768     { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9769     { "(bad)",          { XX } },
9770   },
9771   {
9772     /* MOD_VEX_382C_PREFIX_2 */
9773     { "vmaskmovps",     { XM, Vex, Mx } },
9774     { "(bad)",          { XX } },
9775   },
9776   {
9777     /* MOD_VEX_382D_PREFIX_2 */
9778     { "vmaskmovpd",     { XM, Vex, Mx } },
9779     { "(bad)",          { XX } },
9780   },
9781   {
9782     /* MOD_VEX_382E_PREFIX_2 */
9783     { "vmaskmovps",     { Mx, Vex, XM } },
9784     { "(bad)",          { XX } },
9785   },
9786   {
9787     /* MOD_VEX_382F_PREFIX_2 */
9788     { "vmaskmovpd",     { Mx, Vex, XM } },
9789     { "(bad)",          { XX } },
9790   },
9791 };
9792
9793 static const struct dis386 rm_table[][8] = {
9794   {
9795     /* RM_0F01_REG_0 */
9796     { "(bad)",          { XX } },
9797     { "vmcall",         { Skip_MODRM } },
9798     { "vmlaunch",       { Skip_MODRM } },
9799     { "vmresume",       { Skip_MODRM } },
9800     { "vmxoff",         { Skip_MODRM } },
9801     { "(bad)",          { XX } },
9802     { "(bad)",          { XX } },
9803     { "(bad)",          { XX } },
9804   },
9805   {
9806     /* RM_0F01_REG_1 */
9807     { "monitor",        { { OP_Monitor, 0 } } },
9808     { "mwait",          { { OP_Mwait, 0 } } },
9809     { "(bad)",          { XX } },
9810     { "(bad)",          { XX } },
9811     { "(bad)",          { XX } },
9812     { "(bad)",          { XX } },
9813     { "(bad)",          { XX } },
9814     { "(bad)",          { XX } },
9815   },
9816   {
9817     /* RM_0F01_REG_2 */
9818     { "xgetbv",         { Skip_MODRM } },
9819     { "xsetbv",         { Skip_MODRM } },
9820     { "(bad)",          { XX } },
9821     { "(bad)",          { XX } },
9822     { "(bad)",          { XX } },
9823     { "(bad)",          { XX } },
9824     { "(bad)",          { XX } },
9825     { "(bad)",          { XX } },
9826   },
9827   {
9828     /* RM_0F01_REG_3 */
9829     { "vmrun",          { Skip_MODRM } },
9830     { "vmmcall",        { Skip_MODRM } },
9831     { "vmload",         { Skip_MODRM } },
9832     { "vmsave",         { Skip_MODRM } },
9833     { "stgi",           { Skip_MODRM } },
9834     { "clgi",           { Skip_MODRM } },
9835     { "skinit",         { Skip_MODRM } },
9836     { "invlpga",        { Skip_MODRM } },
9837   },
9838   {
9839     /* RM_0F01_REG_7 */
9840     { "swapgs",         { Skip_MODRM } },
9841     { "rdtscp",         { Skip_MODRM } },
9842     { "(bad)",          { XX } },
9843     { "(bad)",          { XX } },
9844     { "(bad)",          { XX } },
9845     { "(bad)",          { XX } },
9846     { "(bad)",          { XX } },
9847     { "(bad)",          { XX } },
9848   },
9849   {
9850     /* RM_0FAE_REG_5 */
9851     { "lfence",         { Skip_MODRM } },
9852     { "(bad)",          { XX } },
9853     { "(bad)",          { XX } },
9854     { "(bad)",          { XX } },
9855     { "(bad)",          { XX } },
9856     { "(bad)",          { XX } },
9857     { "(bad)",          { XX } },
9858     { "(bad)",          { XX } },
9859   },
9860   {
9861     /* RM_0FAE_REG_6 */
9862     { "mfence",         { Skip_MODRM } },
9863     { "(bad)",          { XX } },
9864     { "(bad)",          { XX } },
9865     { "(bad)",          { XX } },
9866     { "(bad)",          { XX } },
9867     { "(bad)",          { XX } },
9868     { "(bad)",          { XX } },
9869     { "(bad)",          { XX } },
9870   },
9871   {
9872     /* RM_0FAE_REG_7 */
9873     { "sfence",         { Skip_MODRM } },
9874     { "(bad)",          { XX } },
9875     { "(bad)",          { XX } },
9876     { "(bad)",          { XX } },
9877     { "(bad)",          { XX } },
9878     { "(bad)",          { XX } },
9879     { "(bad)",          { XX } },
9880     { "(bad)",          { XX } },
9881   },
9882 };
9883
9884 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9885
9886 /* We use the high bit to indicate different name for the same
9887    prefix.  */
9888 #define ADDR16_PREFIX   (0x67 | 0x100)
9889 #define ADDR32_PREFIX   (0x67 | 0x200)
9890 #define DATA16_PREFIX   (0x66 | 0x100)
9891 #define DATA32_PREFIX   (0x66 | 0x200)
9892 #define REP_PREFIX      (0xf3 | 0x100)
9893
9894 static int
9895 ckprefix (void)
9896 {
9897   int newrex, i, length;
9898   rex = 0;
9899   rex_original = 0;
9900   rex_ignored = 0;
9901   prefixes = 0;
9902   used_prefixes = 0;
9903   rex_used = 0;
9904   last_lock_prefix = -1;
9905   last_repz_prefix = -1;
9906   last_repnz_prefix = -1;
9907   last_data_prefix = -1;
9908   last_addr_prefix = -1;
9909   last_rex_prefix = -1;
9910   last_seg_prefix = -1;
9911   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
9912     all_prefixes[i] = 0;
9913   i = 0;
9914   length = 0;
9915   /* The maximum instruction length is 15bytes.  */
9916   while (length < MAX_CODE_LENGTH - 1)
9917     {
9918       FETCH_DATA (the_info, codep + 1);
9919       newrex = 0;
9920       switch (*codep)
9921         {
9922         /* REX prefixes family.  */
9923         case 0x40:
9924         case 0x41:
9925         case 0x42:
9926         case 0x43:
9927         case 0x44:
9928         case 0x45:
9929         case 0x46:
9930         case 0x47:
9931         case 0x48:
9932         case 0x49:
9933         case 0x4a:
9934         case 0x4b:
9935         case 0x4c:
9936         case 0x4d:
9937         case 0x4e:
9938         case 0x4f:
9939           if (address_mode == mode_64bit)
9940             newrex = *codep;
9941           else
9942             return 1;
9943           last_rex_prefix = i;
9944           break;
9945         case 0xf3:
9946           prefixes |= PREFIX_REPZ;
9947           last_repz_prefix = i;
9948           break;
9949         case 0xf2:
9950           prefixes |= PREFIX_REPNZ;
9951           last_repnz_prefix = i;
9952           break;
9953         case 0xf0:
9954           prefixes |= PREFIX_LOCK;
9955           last_lock_prefix = i;
9956           break;
9957         case 0x2e:
9958           prefixes |= PREFIX_CS;
9959           last_seg_prefix = i;
9960           break;
9961         case 0x36:
9962           prefixes |= PREFIX_SS;
9963           last_seg_prefix = i;
9964           break;
9965         case 0x3e:
9966           prefixes |= PREFIX_DS;
9967           last_seg_prefix = i;
9968           break;
9969         case 0x26:
9970           prefixes |= PREFIX_ES;
9971           last_seg_prefix = i;
9972           break;
9973         case 0x64:
9974           prefixes |= PREFIX_FS;
9975           last_seg_prefix = i;
9976           break;
9977         case 0x65:
9978           prefixes |= PREFIX_GS;
9979           last_seg_prefix = i;
9980           break;
9981         case 0x66:
9982           prefixes |= PREFIX_DATA;
9983           last_data_prefix = i;
9984           break;
9985         case 0x67:
9986           prefixes |= PREFIX_ADDR;
9987           last_addr_prefix = i;
9988           break;
9989         case FWAIT_OPCODE:
9990           /* fwait is really an instruction.  If there are prefixes
9991              before the fwait, they belong to the fwait, *not* to the
9992              following instruction.  */
9993           if (prefixes || rex)
9994             {
9995               prefixes |= PREFIX_FWAIT;
9996               codep++;
9997               return 1;
9998             }
9999           prefixes = PREFIX_FWAIT;
10000           break;
10001         default:
10002           return 1;
10003         }
10004       /* Rex is ignored when followed by another prefix.  */
10005       if (rex)
10006         {
10007           rex_used = rex;
10008           return 1;
10009         }
10010       if (*codep != FWAIT_OPCODE)
10011         all_prefixes[i++] = *codep;
10012       rex = newrex;
10013       rex_original = rex;
10014       codep++;
10015       length++;
10016     }
10017   return 0;
10018 }
10019
10020 static int
10021 seg_prefix (int pref)
10022 {
10023   switch (pref)
10024     {
10025     case 0x2e:
10026       return PREFIX_CS;
10027     case 0x36:
10028       return PREFIX_SS;
10029     case 0x3e:
10030       return PREFIX_DS;
10031     case 0x26:
10032       return PREFIX_ES;
10033     case 0x64:
10034       return PREFIX_FS;
10035     case 0x65:
10036       return PREFIX_GS;
10037     default:
10038       return 0;
10039     }
10040 }
10041
10042 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10043    prefix byte.  */
10044
10045 static const char *
10046 prefix_name (int pref, int sizeflag)
10047 {
10048   static const char *rexes [16] =
10049     {
10050       "rex",            /* 0x40 */
10051       "rex.B",          /* 0x41 */
10052       "rex.X",          /* 0x42 */
10053       "rex.XB",         /* 0x43 */
10054       "rex.R",          /* 0x44 */
10055       "rex.RB",         /* 0x45 */
10056       "rex.RX",         /* 0x46 */
10057       "rex.RXB",        /* 0x47 */
10058       "rex.W",          /* 0x48 */
10059       "rex.WB",         /* 0x49 */
10060       "rex.WX",         /* 0x4a */
10061       "rex.WXB",        /* 0x4b */
10062       "rex.WR",         /* 0x4c */
10063       "rex.WRB",        /* 0x4d */
10064       "rex.WRX",        /* 0x4e */
10065       "rex.WRXB",       /* 0x4f */
10066     };
10067
10068   switch (pref)
10069     {
10070     /* REX prefixes family.  */
10071     case 0x40:
10072     case 0x41:
10073     case 0x42:
10074     case 0x43:
10075     case 0x44:
10076     case 0x45:
10077     case 0x46:
10078     case 0x47:
10079     case 0x48:
10080     case 0x49:
10081     case 0x4a:
10082     case 0x4b:
10083     case 0x4c:
10084     case 0x4d:
10085     case 0x4e:
10086     case 0x4f:
10087       return rexes [pref - 0x40];
10088     case 0xf3:
10089       return "repz";
10090     case 0xf2:
10091       return "repnz";
10092     case 0xf0:
10093       return "lock";
10094     case 0x2e:
10095       return "cs";
10096     case 0x36:
10097       return "ss";
10098     case 0x3e:
10099       return "ds";
10100     case 0x26:
10101       return "es";
10102     case 0x64:
10103       return "fs";
10104     case 0x65:
10105       return "gs";
10106     case 0x66:
10107       return (sizeflag & DFLAG) ? "data16" : "data32";
10108     case 0x67:
10109       if (address_mode == mode_64bit)
10110         return (sizeflag & AFLAG) ? "addr32" : "addr64";
10111       else
10112         return (sizeflag & AFLAG) ? "addr16" : "addr32";
10113     case FWAIT_OPCODE:
10114       return "fwait";
10115     case ADDR16_PREFIX:
10116       return "addr16";
10117     case ADDR32_PREFIX:
10118       return "addr32";
10119     case DATA16_PREFIX:
10120       return "data16";
10121     case DATA32_PREFIX:
10122       return "data32";
10123     case REP_PREFIX:
10124       return "rep";
10125     default:
10126       return NULL;
10127     }
10128 }
10129
10130 static char op_out[MAX_OPERANDS][100];
10131 static int op_ad, op_index[MAX_OPERANDS];
10132 static int two_source_ops;
10133 static bfd_vma op_address[MAX_OPERANDS];
10134 static bfd_vma op_riprel[MAX_OPERANDS];
10135 static bfd_vma start_pc;
10136
10137 /*
10138  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10139  *   (see topic "Redundant prefixes" in the "Differences from 8086"
10140  *   section of the "Virtual 8086 Mode" chapter.)
10141  * 'pc' should be the address of this instruction, it will
10142  *   be used to print the target address if this is a relative jump or call
10143  * The function returns the length of this instruction in bytes.
10144  */
10145
10146 static char intel_syntax;
10147 static char intel_mnemonic = !SYSV386_COMPAT;
10148 static char open_char;
10149 static char close_char;
10150 static char separator_char;
10151 static char scale_char;
10152
10153 /* Here for backwards compatibility.  When gdb stops using
10154    print_insn_i386_att and print_insn_i386_intel these functions can
10155    disappear, and print_insn_i386 be merged into print_insn.  */
10156 int
10157 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10158 {
10159   intel_syntax = 0;
10160
10161   return print_insn (pc, info);
10162 }
10163
10164 int
10165 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10166 {
10167   intel_syntax = 1;
10168
10169   return print_insn (pc, info);
10170 }
10171
10172 int
10173 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10174 {
10175   intel_syntax = -1;
10176
10177   return print_insn (pc, info);
10178 }
10179
10180 void
10181 print_i386_disassembler_options (FILE *stream)
10182 {
10183   fprintf (stream, _("\n\
10184 The following i386/x86-64 specific disassembler options are supported for use\n\
10185 with the -M switch (multiple options should be separated by commas):\n"));
10186
10187   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
10188   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
10189   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
10190   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
10191   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
10192   fprintf (stream, _("  att-mnemonic\n"
10193                      "              Display instruction in AT&T mnemonic\n"));
10194   fprintf (stream, _("  intel-mnemonic\n"
10195                      "              Display instruction in Intel mnemonic\n"));
10196   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
10197   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
10198   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
10199   fprintf (stream, _("  data32      Assume 32bit data size\n"));
10200   fprintf (stream, _("  data16      Assume 16bit data size\n"));
10201   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
10202 }
10203
10204 /* Get a pointer to struct dis386 with a valid name.  */
10205
10206 static const struct dis386 *
10207 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10208 {
10209   int vindex, vex_table_index;
10210
10211   if (dp->name != NULL)
10212     return dp;
10213
10214   switch (dp->op[0].bytemode)
10215     {
10216     case USE_REG_TABLE:
10217       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10218       break;
10219
10220     case USE_MOD_TABLE:
10221       vindex = modrm.mod == 0x3 ? 1 : 0;
10222       dp = &mod_table[dp->op[1].bytemode][vindex];
10223       break;
10224
10225     case USE_RM_TABLE:
10226       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10227       break;
10228
10229     case USE_PREFIX_TABLE:
10230       if (need_vex)
10231         {
10232           /* The prefix in VEX is implicit.  */
10233           switch (vex.prefix)
10234             {
10235             case 0:
10236               vindex = 0;
10237               break;
10238             case REPE_PREFIX_OPCODE:
10239               vindex = 1;
10240               break;
10241             case DATA_PREFIX_OPCODE:
10242               vindex = 2;
10243               break;
10244             case REPNE_PREFIX_OPCODE:
10245               vindex = 3;
10246               break;
10247             default:
10248               abort ();
10249               break;
10250             }
10251         }
10252       else 
10253         {
10254           vindex = 0;
10255           used_prefixes |= (prefixes & PREFIX_REPZ);
10256           if (prefixes & PREFIX_REPZ)
10257             {
10258               vindex = 1;
10259               all_prefixes[last_repz_prefix] = 0;
10260             }
10261           else
10262             {
10263               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10264                  PREFIX_DATA.  */
10265               used_prefixes |= (prefixes & PREFIX_REPNZ);
10266               if (prefixes & PREFIX_REPNZ)
10267                 {
10268                   vindex = 3;
10269                   all_prefixes[last_repnz_prefix] = 0;
10270                 }
10271               else
10272                 {
10273                   used_prefixes |= (prefixes & PREFIX_DATA);
10274                   if (prefixes & PREFIX_DATA)
10275                     {
10276                       vindex = 2;
10277                       all_prefixes[last_data_prefix] = 0;
10278                     }
10279                 }
10280             }
10281         }
10282       dp = &prefix_table[dp->op[1].bytemode][vindex];
10283       break;
10284
10285     case USE_X86_64_TABLE:
10286       vindex = address_mode == mode_64bit ? 1 : 0;
10287       dp = &x86_64_table[dp->op[1].bytemode][vindex];
10288       break;
10289
10290     case USE_3BYTE_TABLE:
10291       FETCH_DATA (info, codep + 2);
10292       vindex = *codep++;
10293       dp = &three_byte_table[dp->op[1].bytemode][vindex];
10294       modrm.mod = (*codep >> 6) & 3;
10295       modrm.reg = (*codep >> 3) & 7;
10296       modrm.rm = *codep & 7;
10297       break;
10298
10299     case USE_VEX_LEN_TABLE:
10300       if (!need_vex)
10301         abort ();
10302
10303       switch (vex.length)
10304         {
10305         case 128:
10306           vindex = 0;
10307           break;
10308         case 256:
10309           vindex = 1;
10310           break;
10311         default:
10312           abort ();
10313           break;
10314         }
10315
10316       dp = &vex_len_table[dp->op[1].bytemode][vindex];
10317       break;
10318
10319     case USE_XOP_8F_TABLE:
10320       FETCH_DATA (info, codep + 3);
10321       /* All bits in the REX prefix are ignored.  */
10322       rex_ignored = rex;
10323       rex = ~(*codep >> 5) & 0x7;
10324
10325       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
10326       switch ((*codep & 0x1f))
10327         {
10328         default:
10329           BadOp ();
10330         case 0x8:
10331           vex_table_index = XOP_08;
10332           break;
10333         case 0x9:
10334           vex_table_index = XOP_09;
10335           break;
10336         case 0xa:
10337           vex_table_index = XOP_0A;
10338           break;
10339         }
10340       codep++;
10341       vex.w = *codep & 0x80;
10342       if (vex.w && address_mode == mode_64bit)
10343         rex |= REX_W;
10344
10345       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10346       if (address_mode != mode_64bit
10347           && vex.register_specifier > 0x7)
10348         BadOp ();
10349
10350       vex.length = (*codep & 0x4) ? 256 : 128;
10351       switch ((*codep & 0x3))
10352         {
10353         case 0:
10354           vex.prefix = 0;
10355           break;
10356         case 1:
10357           vex.prefix = DATA_PREFIX_OPCODE;
10358           break;
10359         case 2:
10360           vex.prefix = REPE_PREFIX_OPCODE;
10361           break;
10362         case 3:
10363           vex.prefix = REPNE_PREFIX_OPCODE;
10364           break;
10365         }
10366       need_vex = 1;
10367       need_vex_reg = 1;
10368       codep++;
10369       vindex = *codep++;
10370       dp = &xop_table[vex_table_index][vindex];
10371
10372       FETCH_DATA (info, codep + 1);
10373       modrm.mod = (*codep >> 6) & 3;
10374       modrm.reg = (*codep >> 3) & 7;
10375       modrm.rm = *codep & 7;
10376       break;
10377
10378     case USE_VEX_C4_TABLE:
10379       FETCH_DATA (info, codep + 3);
10380       /* All bits in the REX prefix are ignored.  */
10381       rex_ignored = rex;
10382       rex = ~(*codep >> 5) & 0x7;
10383       switch ((*codep & 0x1f))
10384         {
10385         default:
10386           BadOp ();
10387         case 0x1:
10388           vex_table_index = VEX_0F;
10389           break;
10390         case 0x2:
10391           vex_table_index = VEX_0F38;
10392           break;
10393         case 0x3:
10394           vex_table_index = VEX_0F3A;
10395           break;
10396         }
10397       codep++;
10398       vex.w = *codep & 0x80;
10399       if (vex.w && address_mode == mode_64bit)
10400         rex |= REX_W;
10401
10402       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10403       if (address_mode != mode_64bit
10404           && vex.register_specifier > 0x7)
10405         BadOp ();
10406
10407       vex.length = (*codep & 0x4) ? 256 : 128;
10408       switch ((*codep & 0x3))
10409         {
10410         case 0:
10411           vex.prefix = 0;
10412           break;
10413         case 1:
10414           vex.prefix = DATA_PREFIX_OPCODE;
10415           break;
10416         case 2:
10417           vex.prefix = REPE_PREFIX_OPCODE;
10418           break;
10419         case 3:
10420           vex.prefix = REPNE_PREFIX_OPCODE;
10421           break;
10422         }
10423       need_vex = 1;
10424       need_vex_reg = 1;
10425       codep++;
10426       vindex = *codep++;
10427       dp = &vex_table[vex_table_index][vindex];
10428       /* There is no MODRM byte for VEX [82|77].  */
10429       if (vindex != 0x77 && vindex != 0x82)
10430         {
10431           FETCH_DATA (info, codep + 1);
10432           modrm.mod = (*codep >> 6) & 3;
10433           modrm.reg = (*codep >> 3) & 7;
10434           modrm.rm = *codep & 7;
10435         }
10436       break;
10437
10438     case USE_VEX_C5_TABLE:
10439       FETCH_DATA (info, codep + 2);
10440       /* All bits in the REX prefix are ignored.  */
10441       rex_ignored = rex;
10442       rex = (*codep & 0x80) ? 0 : REX_R;
10443
10444       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10445       if (address_mode != mode_64bit
10446           && vex.register_specifier > 0x7)
10447         BadOp ();
10448
10449       vex.w = 0;
10450
10451       vex.length = (*codep & 0x4) ? 256 : 128;
10452       switch ((*codep & 0x3))
10453         {
10454         case 0:
10455           vex.prefix = 0;
10456           break;
10457         case 1:
10458           vex.prefix = DATA_PREFIX_OPCODE;
10459           break;
10460         case 2:
10461           vex.prefix = REPE_PREFIX_OPCODE;
10462           break;
10463         case 3:
10464           vex.prefix = REPNE_PREFIX_OPCODE;
10465           break;
10466         }
10467       need_vex = 1;
10468       need_vex_reg = 1;
10469       codep++;
10470       vindex = *codep++;
10471       dp = &vex_table[dp->op[1].bytemode][vindex];
10472       /* There is no MODRM byte for VEX [82|77].  */
10473       if (vindex != 0x77 && vindex != 0x82)
10474         {
10475           FETCH_DATA (info, codep + 1);
10476           modrm.mod = (*codep >> 6) & 3;
10477           modrm.reg = (*codep >> 3) & 7;
10478           modrm.rm = *codep & 7;
10479         }
10480       break;
10481
10482     default:
10483       abort ();
10484     }
10485
10486   if (dp->name != NULL)
10487     return dp;
10488   else
10489     return get_valid_dis386 (dp, info);
10490 }
10491
10492 static int
10493 print_insn (bfd_vma pc, disassemble_info *info)
10494 {
10495   const struct dis386 *dp;
10496   int i;
10497   char *op_txt[MAX_OPERANDS];
10498   int needcomma;
10499   int sizeflag;
10500   const char *p;
10501   struct dis_private priv;
10502   unsigned char op;
10503   int prefix_length;
10504   int default_prefixes;
10505
10506   if (info->mach == bfd_mach_x86_64_intel_syntax
10507       || info->mach == bfd_mach_x86_64
10508       || info->mach == bfd_mach_l1om
10509       || info->mach == bfd_mach_l1om_intel_syntax)
10510     address_mode = mode_64bit;
10511   else
10512     address_mode = mode_32bit;
10513
10514   if (intel_syntax == (char) -1)
10515     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10516                     || info->mach == bfd_mach_x86_64_intel_syntax
10517                     || info->mach == bfd_mach_l1om_intel_syntax);
10518
10519   if (info->mach == bfd_mach_i386_i386
10520       || info->mach == bfd_mach_x86_64
10521       || info->mach == bfd_mach_l1om
10522       || info->mach == bfd_mach_i386_i386_intel_syntax
10523       || info->mach == bfd_mach_x86_64_intel_syntax
10524       || info->mach == bfd_mach_l1om_intel_syntax)
10525     priv.orig_sizeflag = AFLAG | DFLAG;
10526   else if (info->mach == bfd_mach_i386_i8086)
10527     priv.orig_sizeflag = 0;
10528   else
10529     abort ();
10530
10531   for (p = info->disassembler_options; p != NULL; )
10532     {
10533       if (CONST_STRNEQ (p, "x86-64"))
10534         {
10535           address_mode = mode_64bit;
10536           priv.orig_sizeflag = AFLAG | DFLAG;
10537         }
10538       else if (CONST_STRNEQ (p, "i386"))
10539         {
10540           address_mode = mode_32bit;
10541           priv.orig_sizeflag = AFLAG | DFLAG;
10542         }
10543       else if (CONST_STRNEQ (p, "i8086"))
10544         {
10545           address_mode = mode_16bit;
10546           priv.orig_sizeflag = 0;
10547         }
10548       else if (CONST_STRNEQ (p, "intel"))
10549         {
10550           intel_syntax = 1;
10551           if (CONST_STRNEQ (p + 5, "-mnemonic"))
10552             intel_mnemonic = 1;
10553         }
10554       else if (CONST_STRNEQ (p, "att"))
10555         {
10556           intel_syntax = 0;
10557           if (CONST_STRNEQ (p + 3, "-mnemonic"))
10558             intel_mnemonic = 0;
10559         }
10560       else if (CONST_STRNEQ (p, "addr"))
10561         {
10562           if (address_mode == mode_64bit)
10563             {
10564               if (p[4] == '3' && p[5] == '2')
10565                 priv.orig_sizeflag &= ~AFLAG;
10566               else if (p[4] == '6' && p[5] == '4')
10567                 priv.orig_sizeflag |= AFLAG;
10568             }
10569           else
10570             {
10571               if (p[4] == '1' && p[5] == '6')
10572                 priv.orig_sizeflag &= ~AFLAG;
10573               else if (p[4] == '3' && p[5] == '2')
10574                 priv.orig_sizeflag |= AFLAG;
10575             }
10576         }
10577       else if (CONST_STRNEQ (p, "data"))
10578         {
10579           if (p[4] == '1' && p[5] == '6')
10580             priv.orig_sizeflag &= ~DFLAG;
10581           else if (p[4] == '3' && p[5] == '2')
10582             priv.orig_sizeflag |= DFLAG;
10583         }
10584       else if (CONST_STRNEQ (p, "suffix"))
10585         priv.orig_sizeflag |= SUFFIX_ALWAYS;
10586
10587       p = strchr (p, ',');
10588       if (p != NULL)
10589         p++;
10590     }
10591
10592   if (intel_syntax)
10593     {
10594       names64 = intel_names64;
10595       names32 = intel_names32;
10596       names16 = intel_names16;
10597       names8 = intel_names8;
10598       names8rex = intel_names8rex;
10599       names_seg = intel_names_seg;
10600       index64 = intel_index64;
10601       index32 = intel_index32;
10602       index16 = intel_index16;
10603       open_char = '[';
10604       close_char = ']';
10605       separator_char = '+';
10606       scale_char = '*';
10607     }
10608   else
10609     {
10610       names64 = att_names64;
10611       names32 = att_names32;
10612       names16 = att_names16;
10613       names8 = att_names8;
10614       names8rex = att_names8rex;
10615       names_seg = att_names_seg;
10616       index64 = att_index64;
10617       index32 = att_index32;
10618       index16 = att_index16;
10619       open_char = '(';
10620       close_char =  ')';
10621       separator_char = ',';
10622       scale_char = ',';
10623     }
10624
10625   /* The output looks better if we put 7 bytes on a line, since that
10626      puts most long word instructions on a single line.  Use 8 bytes
10627      for Intel L1OM.  */
10628   if (info->mach == bfd_mach_l1om
10629       || info->mach == bfd_mach_l1om_intel_syntax)
10630     info->bytes_per_line = 8;
10631   else
10632     info->bytes_per_line = 7;
10633
10634   info->private_data = &priv;
10635   priv.max_fetched = priv.the_buffer;
10636   priv.insn_start = pc;
10637
10638   obuf[0] = 0;
10639   for (i = 0; i < MAX_OPERANDS; ++i)
10640     {
10641       op_out[i][0] = 0;
10642       op_index[i] = -1;
10643     }
10644
10645   the_info = info;
10646   start_pc = pc;
10647   start_codep = priv.the_buffer;
10648   codep = priv.the_buffer;
10649
10650   if (setjmp (priv.bailout) != 0)
10651     {
10652       const char *name;
10653
10654       /* Getting here means we tried for data but didn't get it.  That
10655          means we have an incomplete instruction of some sort.  Just
10656          print the first byte as a prefix or a .byte pseudo-op.  */
10657       if (codep > priv.the_buffer)
10658         {
10659           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10660           if (name != NULL)
10661             (*info->fprintf_func) (info->stream, "%s", name);
10662           else
10663             {
10664               /* Just print the first byte as a .byte instruction.  */
10665               (*info->fprintf_func) (info->stream, ".byte 0x%x",
10666                                      (unsigned int) priv.the_buffer[0]);
10667             }
10668
10669           return 1;
10670         }
10671
10672       return -1;
10673     }
10674
10675   obufp = obuf;
10676   sizeflag = priv.orig_sizeflag;
10677
10678   if (!ckprefix () || rex_used)
10679     {
10680       /* Too many prefixes or unused REX prefixes.  */
10681       for (i = 0;
10682            all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
10683            i++)
10684         (*info->fprintf_func) (info->stream, "%s",
10685                                prefix_name (all_prefixes[i], sizeflag));
10686       return 1;
10687     }
10688
10689   insn_codep = codep;
10690
10691   FETCH_DATA (info, codep + 1);
10692   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10693
10694   if (((prefixes & PREFIX_FWAIT)
10695        && ((*codep < 0xd8) || (*codep > 0xdf))))
10696     {
10697       (*info->fprintf_func) (info->stream, "fwait");
10698       return 1;
10699     }
10700
10701   op = 0;
10702
10703   if (*codep == 0x0f)
10704     {
10705       unsigned char threebyte;
10706       FETCH_DATA (info, codep + 2);
10707       threebyte = *++codep;
10708       dp = &dis386_twobyte[threebyte];
10709       need_modrm = twobyte_has_modrm[*codep];
10710       codep++;
10711     }
10712   else
10713     {
10714       dp = &dis386[*codep];
10715       need_modrm = onebyte_has_modrm[*codep];
10716       codep++;
10717     }
10718
10719   if ((prefixes & PREFIX_REPZ))
10720     used_prefixes |= PREFIX_REPZ;
10721   if ((prefixes & PREFIX_REPNZ))
10722     used_prefixes |= PREFIX_REPNZ;
10723   if ((prefixes & PREFIX_LOCK))
10724     used_prefixes |= PREFIX_LOCK;
10725
10726   default_prefixes = 0;
10727   if (prefixes & PREFIX_ADDR)
10728     {
10729       sizeflag ^= AFLAG;
10730       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10731         {
10732           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10733             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
10734           else
10735             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
10736           default_prefixes |= PREFIX_ADDR;
10737         }
10738     }
10739
10740   if ((prefixes & PREFIX_DATA))
10741     {
10742       sizeflag ^= DFLAG;
10743       if (dp->op[2].bytemode == cond_jump_mode
10744           && dp->op[0].bytemode == v_mode
10745           && !intel_syntax)
10746         {
10747           if (sizeflag & DFLAG)
10748             all_prefixes[last_data_prefix] = DATA32_PREFIX;
10749           else
10750             all_prefixes[last_data_prefix] = DATA16_PREFIX;
10751           default_prefixes |= PREFIX_DATA;
10752         }
10753       else if (rex & REX_W)
10754         {
10755           /* REX_W will override PREFIX_DATA.  */
10756           default_prefixes |= PREFIX_DATA;
10757         }
10758     }
10759
10760   if (need_modrm)
10761     {
10762       FETCH_DATA (info, codep + 1);
10763       modrm.mod = (*codep >> 6) & 3;
10764       modrm.reg = (*codep >> 3) & 7;
10765       modrm.rm = *codep & 7;
10766     }
10767
10768    need_vex = 0;
10769    need_vex_reg = 0;
10770    vex_w_done = 0;
10771
10772   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10773     {
10774       dofloat (sizeflag);
10775     }
10776   else
10777     {
10778       dp = get_valid_dis386 (dp, info);
10779       if (dp != NULL && putop (dp->name, sizeflag) == 0)
10780         {
10781           for (i = 0; i < MAX_OPERANDS; ++i)
10782             {
10783               obufp = op_out[i];
10784               op_ad = MAX_OPERANDS - 1 - i;
10785               if (dp->op[i].rtn)
10786                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10787             }
10788         }
10789     }
10790
10791   /* See if any prefixes were not used.  If so, print the first one
10792      separately.  If we don't do this, we'll wind up printing an
10793      instruction stream which does not precisely correspond to the
10794      bytes we are disassembling.  */
10795   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
10796     {
10797       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10798         if (all_prefixes[i])
10799           {
10800             const char *name;
10801             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
10802             if (name == NULL)
10803               name = INTERNAL_DISASSEMBLER_ERROR;
10804             (*info->fprintf_func) (info->stream, "%s", name);
10805             return 1;
10806           }
10807     }
10808
10809   /* Check if the REX prefix used.  */
10810   if (rex_ignored == 0 && (rex ^ rex_used) == 0)
10811     all_prefixes[last_rex_prefix] = 0;
10812
10813   /* Check if the SEG prefix used.  */
10814   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10815                    | PREFIX_FS | PREFIX_GS)) != 0
10816       && (used_prefixes
10817           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
10818     all_prefixes[last_seg_prefix] = 0;
10819
10820   /* Check if the ADDR prefix used.  */
10821   if ((prefixes & PREFIX_ADDR) != 0
10822       && (used_prefixes & PREFIX_ADDR) != 0)
10823     all_prefixes[last_addr_prefix] = 0;
10824
10825   /* Check if the DATA prefix used.  */
10826   if ((prefixes & PREFIX_DATA) != 0
10827       && (used_prefixes & PREFIX_DATA) != 0)
10828     all_prefixes[last_data_prefix] = 0;
10829
10830   prefix_length = 0;
10831   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10832     if (all_prefixes[i])
10833       {
10834         const char *name;
10835         name = prefix_name (all_prefixes[i], sizeflag);
10836         if (name == NULL)
10837           abort ();
10838         prefix_length += strlen (name) + 1;
10839         (*info->fprintf_func) (info->stream, "%s ", name);
10840       }
10841
10842   /* Check maximum code length.  */
10843   if ((codep - start_codep) > MAX_CODE_LENGTH)
10844     {
10845       (*info->fprintf_func) (info->stream, "(bad)");
10846       return MAX_CODE_LENGTH;
10847     }
10848
10849   obufp = mnemonicendp;
10850   for (i = strlen (obuf) + prefix_length; i < 6; i++)
10851     oappend (" ");
10852   oappend (" ");
10853   (*info->fprintf_func) (info->stream, "%s", obuf);
10854
10855   /* The enter and bound instructions are printed with operands in the same
10856      order as the intel book; everything else is printed in reverse order.  */
10857   if (intel_syntax || two_source_ops)
10858     {
10859       bfd_vma riprel;
10860
10861       for (i = 0; i < MAX_OPERANDS; ++i)
10862         op_txt[i] = op_out[i];
10863
10864       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10865         {
10866           op_ad = op_index[i];
10867           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10868           op_index[MAX_OPERANDS - 1 - i] = op_ad;
10869           riprel = op_riprel[i];
10870           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10871           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10872         }
10873     }
10874   else
10875     {
10876       for (i = 0; i < MAX_OPERANDS; ++i)
10877         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10878     }
10879
10880   needcomma = 0;
10881   for (i = 0; i < MAX_OPERANDS; ++i)
10882     if (*op_txt[i])
10883       {
10884         if (needcomma)
10885           (*info->fprintf_func) (info->stream, ",");
10886         if (op_index[i] != -1 && !op_riprel[i])
10887           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10888         else
10889           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10890         needcomma = 1;
10891       }
10892
10893   for (i = 0; i < MAX_OPERANDS; i++)
10894     if (op_index[i] != -1 && op_riprel[i])
10895       {
10896         (*info->fprintf_func) (info->stream, "        # ");
10897         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10898                                                 + op_address[op_index[i]]), info);
10899         break;
10900       }
10901   return codep - priv.the_buffer;
10902 }
10903
10904 static const char *float_mem[] = {
10905   /* d8 */
10906   "fadd{s|}",
10907   "fmul{s|}",
10908   "fcom{s|}",
10909   "fcomp{s|}",
10910   "fsub{s|}",
10911   "fsubr{s|}",
10912   "fdiv{s|}",
10913   "fdivr{s|}",
10914   /* d9 */
10915   "fld{s|}",
10916   "(bad)",
10917   "fst{s|}",
10918   "fstp{s|}",
10919   "fldenvIC",
10920   "fldcw",
10921   "fNstenvIC",
10922   "fNstcw",
10923   /* da */
10924   "fiadd{l|}",
10925   "fimul{l|}",
10926   "ficom{l|}",
10927   "ficomp{l|}",
10928   "fisub{l|}",
10929   "fisubr{l|}",
10930   "fidiv{l|}",
10931   "fidivr{l|}",
10932   /* db */
10933   "fild{l|}",
10934   "fisttp{l|}",
10935   "fist{l|}",
10936   "fistp{l|}",
10937   "(bad)",
10938   "fld{t||t|}",
10939   "(bad)",
10940   "fstp{t||t|}",
10941   /* dc */
10942   "fadd{l|}",
10943   "fmul{l|}",
10944   "fcom{l|}",
10945   "fcomp{l|}",
10946   "fsub{l|}",
10947   "fsubr{l|}",
10948   "fdiv{l|}",
10949   "fdivr{l|}",
10950   /* dd */
10951   "fld{l|}",
10952   "fisttp{ll|}",
10953   "fst{l||}",
10954   "fstp{l|}",
10955   "frstorIC",
10956   "(bad)",
10957   "fNsaveIC",
10958   "fNstsw",
10959   /* de */
10960   "fiadd",
10961   "fimul",
10962   "ficom",
10963   "ficomp",
10964   "fisub",
10965   "fisubr",
10966   "fidiv",
10967   "fidivr",
10968   /* df */
10969   "fild",
10970   "fisttp",
10971   "fist",
10972   "fistp",
10973   "fbld",
10974   "fild{ll|}",
10975   "fbstp",
10976   "fistp{ll|}",
10977 };
10978
10979 static const unsigned char float_mem_mode[] = {
10980   /* d8 */
10981   d_mode,
10982   d_mode,
10983   d_mode,
10984   d_mode,
10985   d_mode,
10986   d_mode,
10987   d_mode,
10988   d_mode,
10989   /* d9 */
10990   d_mode,
10991   0,
10992   d_mode,
10993   d_mode,
10994   0,
10995   w_mode,
10996   0,
10997   w_mode,
10998   /* da */
10999   d_mode,
11000   d_mode,
11001   d_mode,
11002   d_mode,
11003   d_mode,
11004   d_mode,
11005   d_mode,
11006   d_mode,
11007   /* db */
11008   d_mode,
11009   d_mode,
11010   d_mode,
11011   d_mode,
11012   0,
11013   t_mode,
11014   0,
11015   t_mode,
11016   /* dc */
11017   q_mode,
11018   q_mode,
11019   q_mode,
11020   q_mode,
11021   q_mode,
11022   q_mode,
11023   q_mode,
11024   q_mode,
11025   /* dd */
11026   q_mode,
11027   q_mode,
11028   q_mode,
11029   q_mode,
11030   0,
11031   0,
11032   0,
11033   w_mode,
11034   /* de */
11035   w_mode,
11036   w_mode,
11037   w_mode,
11038   w_mode,
11039   w_mode,
11040   w_mode,
11041   w_mode,
11042   w_mode,
11043   /* df */
11044   w_mode,
11045   w_mode,
11046   w_mode,
11047   w_mode,
11048   t_mode,
11049   q_mode,
11050   t_mode,
11051   q_mode
11052 };
11053
11054 #define ST { OP_ST, 0 }
11055 #define STi { OP_STi, 0 }
11056
11057 #define FGRPd9_2 NULL, { { NULL, 0 } }
11058 #define FGRPd9_4 NULL, { { NULL, 1 } }
11059 #define FGRPd9_5 NULL, { { NULL, 2 } }
11060 #define FGRPd9_6 NULL, { { NULL, 3 } }
11061 #define FGRPd9_7 NULL, { { NULL, 4 } }
11062 #define FGRPda_5 NULL, { { NULL, 5 } }
11063 #define FGRPdb_4 NULL, { { NULL, 6 } }
11064 #define FGRPde_3 NULL, { { NULL, 7 } }
11065 #define FGRPdf_4 NULL, { { NULL, 8 } }
11066
11067 static const struct dis386 float_reg[][8] = {
11068   /* d8 */
11069   {
11070     { "fadd",   { ST, STi } },
11071     { "fmul",   { ST, STi } },
11072     { "fcom",   { STi } },
11073     { "fcomp",  { STi } },
11074     { "fsub",   { ST, STi } },
11075     { "fsubr",  { ST, STi } },
11076     { "fdiv",   { ST, STi } },
11077     { "fdivr",  { ST, STi } },
11078   },
11079   /* d9 */
11080   {
11081     { "fld",    { STi } },
11082     { "fxch",   { STi } },
11083     { FGRPd9_2 },
11084     { "(bad)",  { XX } },
11085     { FGRPd9_4 },
11086     { FGRPd9_5 },
11087     { FGRPd9_6 },
11088     { FGRPd9_7 },
11089   },
11090   /* da */
11091   {
11092     { "fcmovb", { ST, STi } },
11093     { "fcmove", { ST, STi } },
11094     { "fcmovbe",{ ST, STi } },
11095     { "fcmovu", { ST, STi } },
11096     { "(bad)",  { XX } },
11097     { FGRPda_5 },
11098     { "(bad)",  { XX } },
11099     { "(bad)",  { XX } },
11100   },
11101   /* db */
11102   {
11103     { "fcmovnb",{ ST, STi } },
11104     { "fcmovne",{ ST, STi } },
11105     { "fcmovnbe",{ ST, STi } },
11106     { "fcmovnu",{ ST, STi } },
11107     { FGRPdb_4 },
11108     { "fucomi", { ST, STi } },
11109     { "fcomi",  { ST, STi } },
11110     { "(bad)",  { XX } },
11111   },
11112   /* dc */
11113   {
11114     { "fadd",   { STi, ST } },
11115     { "fmul",   { STi, ST } },
11116     { "(bad)",  { XX } },
11117     { "(bad)",  { XX } },
11118     { "fsub!M", { STi, ST } },
11119     { "fsubM",  { STi, ST } },
11120     { "fdiv!M", { STi, ST } },
11121     { "fdivM",  { STi, ST } },
11122   },
11123   /* dd */
11124   {
11125     { "ffree",  { STi } },
11126     { "(bad)",  { XX } },
11127     { "fst",    { STi } },
11128     { "fstp",   { STi } },
11129     { "fucom",  { STi } },
11130     { "fucomp", { STi } },
11131     { "(bad)",  { XX } },
11132     { "(bad)",  { XX } },
11133   },
11134   /* de */
11135   {
11136     { "faddp",  { STi, ST } },
11137     { "fmulp",  { STi, ST } },
11138     { "(bad)",  { XX } },
11139     { FGRPde_3 },
11140     { "fsub!Mp", { STi, ST } },
11141     { "fsubMp", { STi, ST } },
11142     { "fdiv!Mp", { STi, ST } },
11143     { "fdivMp", { STi, ST } },
11144   },
11145   /* df */
11146   {
11147     { "ffreep", { STi } },
11148     { "(bad)",  { XX } },
11149     { "(bad)",  { XX } },
11150     { "(bad)",  { XX } },
11151     { FGRPdf_4 },
11152     { "fucomip", { ST, STi } },
11153     { "fcomip", { ST, STi } },
11154     { "(bad)",  { XX } },
11155   },
11156 };
11157
11158 static char *fgrps[][8] = {
11159   /* d9_2  0 */
11160   {
11161     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11162   },
11163
11164   /* d9_4  1 */
11165   {
11166     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11167   },
11168
11169   /* d9_5  2 */
11170   {
11171     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11172   },
11173
11174   /* d9_6  3 */
11175   {
11176     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11177   },
11178
11179   /* d9_7  4 */
11180   {
11181     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11182   },
11183
11184   /* da_5  5 */
11185   {
11186     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11187   },
11188
11189   /* db_4  6 */
11190   {
11191     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11192     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11193   },
11194
11195   /* de_3  7 */
11196   {
11197     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11198   },
11199
11200   /* df_4  8 */
11201   {
11202     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11203   },
11204 };
11205
11206 static void
11207 swap_operand (void)
11208 {
11209   mnemonicendp[0] = '.';
11210   mnemonicendp[1] = 's';
11211   mnemonicendp += 2;
11212 }
11213
11214 static void
11215 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11216                int sizeflag ATTRIBUTE_UNUSED)
11217 {
11218   /* Skip mod/rm byte.  */
11219   MODRM_CHECK;
11220   codep++;
11221 }
11222
11223 static void
11224 dofloat (int sizeflag)
11225 {
11226   const struct dis386 *dp;
11227   unsigned char floatop;
11228
11229   floatop = codep[-1];
11230
11231   if (modrm.mod != 3)
11232     {
11233       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
11234
11235       putop (float_mem[fp_indx], sizeflag);
11236       obufp = op_out[0];
11237       op_ad = 2;
11238       OP_E (float_mem_mode[fp_indx], sizeflag);
11239       return;
11240     }
11241   /* Skip mod/rm byte.  */
11242   MODRM_CHECK;
11243   codep++;
11244
11245   dp = &float_reg[floatop - 0xd8][modrm.reg];
11246   if (dp->name == NULL)
11247     {
11248       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
11249
11250       /* Instruction fnstsw is only one with strange arg.  */
11251       if (floatop == 0xdf && codep[-1] == 0xe0)
11252         strcpy (op_out[0], names16[0]);
11253     }
11254   else
11255     {
11256       putop (dp->name, sizeflag);
11257
11258       obufp = op_out[0];
11259       op_ad = 2;
11260       if (dp->op[0].rtn)
11261         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
11262
11263       obufp = op_out[1];
11264       op_ad = 1;
11265       if (dp->op[1].rtn)
11266         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
11267     }
11268 }
11269
11270 static void
11271 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11272 {
11273   oappend ("%st" + intel_syntax);
11274 }
11275
11276 static void
11277 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11278 {
11279   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
11280   oappend (scratchbuf + intel_syntax);
11281 }
11282
11283 /* Capital letters in template are macros.  */
11284 static int
11285 putop (const char *in_template, int sizeflag)
11286 {
11287   const char *p;
11288   int alt = 0;
11289   int cond = 1;
11290   unsigned int l = 0, len = 1;
11291   char last[4];
11292
11293 #define SAVE_LAST(c)                    \
11294   if (l < len && l < sizeof (last))     \
11295     last[l++] = c;                      \
11296   else                                  \
11297     abort ();
11298
11299   for (p = in_template; *p; p++)
11300     {
11301       switch (*p)
11302         {
11303         default:
11304           *obufp++ = *p;
11305           break;
11306         case '%':
11307           len++;
11308           break;
11309         case '!':
11310           cond = 0;
11311           break;
11312         case '{':
11313           alt = 0;
11314           if (intel_syntax)
11315             {
11316               while (*++p != '|')
11317                 if (*p == '}' || *p == '\0')
11318                   abort ();
11319             }
11320           /* Fall through.  */
11321         case 'I':
11322           alt = 1;
11323           continue;
11324         case '|':
11325           while (*++p != '}')
11326             {
11327               if (*p == '\0')
11328                 abort ();
11329             }
11330           break;
11331         case '}':
11332           break;
11333         case 'A':
11334           if (intel_syntax)
11335             break;
11336           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11337             *obufp++ = 'b';
11338           break;
11339         case 'B':
11340           if (l == 0 && len == 1)
11341             {
11342 case_B:
11343               if (intel_syntax)
11344                 break;
11345               if (sizeflag & SUFFIX_ALWAYS)
11346                 *obufp++ = 'b';
11347             }
11348           else
11349             {
11350               if (l != 1
11351                   || len != 2
11352                   || last[0] != 'L')
11353                 {
11354                   SAVE_LAST (*p);
11355                   break;
11356                 }
11357
11358               if (address_mode == mode_64bit
11359                   && !(prefixes & PREFIX_ADDR))
11360                 {
11361                   *obufp++ = 'a';
11362                   *obufp++ = 'b';
11363                   *obufp++ = 's';
11364                 }
11365
11366               goto case_B;
11367             }
11368           break;
11369         case 'C':
11370           if (intel_syntax && !alt)
11371             break;
11372           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11373             {
11374               if (sizeflag & DFLAG)
11375                 *obufp++ = intel_syntax ? 'd' : 'l';
11376               else
11377                 *obufp++ = intel_syntax ? 'w' : 's';
11378               used_prefixes |= (prefixes & PREFIX_DATA);
11379             }
11380           break;
11381         case 'D':
11382           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11383             break;
11384           USED_REX (REX_W);
11385           if (modrm.mod == 3)
11386             {
11387               if (rex & REX_W)
11388                 *obufp++ = 'q';
11389               else
11390                 {
11391                   if (sizeflag & DFLAG)
11392                     *obufp++ = intel_syntax ? 'd' : 'l';
11393                   else
11394                     *obufp++ = 'w';
11395                   used_prefixes |= (prefixes & PREFIX_DATA);
11396                 }
11397             }
11398           else
11399             *obufp++ = 'w';
11400           break;
11401         case 'E':               /* For jcxz/jecxz */
11402           if (address_mode == mode_64bit)
11403             {
11404               if (sizeflag & AFLAG)
11405                 *obufp++ = 'r';
11406               else
11407                 *obufp++ = 'e';
11408             }
11409           else
11410             if (sizeflag & AFLAG)
11411               *obufp++ = 'e';
11412           used_prefixes |= (prefixes & PREFIX_ADDR);
11413           break;
11414         case 'F':
11415           if (intel_syntax)
11416             break;
11417           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11418             {
11419               if (sizeflag & AFLAG)
11420                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
11421               else
11422                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
11423               used_prefixes |= (prefixes & PREFIX_ADDR);
11424             }
11425           break;
11426         case 'G':
11427           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
11428             break;
11429           if ((rex & REX_W) || (sizeflag & DFLAG))
11430             *obufp++ = 'l';
11431           else
11432             *obufp++ = 'w';
11433           if (!(rex & REX_W))
11434             used_prefixes |= (prefixes & PREFIX_DATA);
11435           break;
11436         case 'H':
11437           if (intel_syntax)
11438             break;
11439           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11440               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11441             {
11442               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
11443               *obufp++ = ',';
11444               *obufp++ = 'p';
11445               if (prefixes & PREFIX_DS)
11446                 *obufp++ = 't';
11447               else
11448                 *obufp++ = 'n';
11449             }
11450           break;
11451         case 'J':
11452           if (intel_syntax)
11453             break;
11454           *obufp++ = 'l';
11455           break;
11456         case 'K':
11457           USED_REX (REX_W);
11458           if (rex & REX_W)
11459             *obufp++ = 'q';
11460           else
11461             *obufp++ = 'd';
11462           break;
11463         case 'Z':
11464           if (intel_syntax)
11465             break;
11466           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
11467             {
11468               *obufp++ = 'q';
11469               break;
11470             }
11471           /* Fall through.  */
11472           goto case_L;
11473         case 'L':
11474           if (l != 0 || len != 1)
11475             {
11476               SAVE_LAST (*p);
11477               break;
11478             }
11479 case_L:
11480           if (intel_syntax)
11481             break;
11482           if (sizeflag & SUFFIX_ALWAYS)
11483             *obufp++ = 'l';
11484           break;
11485         case 'M':
11486           if (intel_mnemonic != cond)
11487             *obufp++ = 'r';
11488           break;
11489         case 'N':
11490           if ((prefixes & PREFIX_FWAIT) == 0)
11491             *obufp++ = 'n';
11492           else
11493             used_prefixes |= PREFIX_FWAIT;
11494           break;
11495         case 'O':
11496           USED_REX (REX_W);
11497           if (rex & REX_W)
11498             *obufp++ = 'o';
11499           else if (intel_syntax && (sizeflag & DFLAG))
11500             *obufp++ = 'q';
11501           else
11502             *obufp++ = 'd';
11503           if (!(rex & REX_W))
11504             used_prefixes |= (prefixes & PREFIX_DATA);
11505           break;
11506         case 'T':
11507           if (intel_syntax)
11508             break;
11509           if (address_mode == mode_64bit && (sizeflag & DFLAG))
11510             {
11511               *obufp++ = 'q';
11512               break;
11513             }
11514           /* Fall through.  */
11515         case 'P':
11516           if (intel_syntax)
11517             break;
11518           if ((prefixes & PREFIX_DATA)
11519               || (rex & REX_W)
11520               || (sizeflag & SUFFIX_ALWAYS))
11521             {
11522               USED_REX (REX_W);
11523               if (rex & REX_W)
11524                 *obufp++ = 'q';
11525               else
11526                 {
11527                    if (sizeflag & DFLAG)
11528                       *obufp++ = 'l';
11529                    else
11530                      *obufp++ = 'w';
11531                    used_prefixes |= (prefixes & PREFIX_DATA);
11532                 }
11533             }
11534           break;
11535         case 'U':
11536           if (intel_syntax)
11537             break;
11538           if (address_mode == mode_64bit && (sizeflag & DFLAG))
11539             {
11540               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11541                 *obufp++ = 'q';
11542               break;
11543             }
11544           /* Fall through.  */
11545           goto case_Q;
11546         case 'Q':
11547           if (l == 0 && len == 1)
11548             {
11549 case_Q:
11550               if (intel_syntax && !alt)
11551                 break;
11552               USED_REX (REX_W);
11553               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11554                 {
11555                   if (rex & REX_W)
11556                     *obufp++ = 'q';
11557                   else
11558                     {
11559                       if (sizeflag & DFLAG)
11560                         *obufp++ = intel_syntax ? 'd' : 'l';
11561                       else
11562                         *obufp++ = 'w';
11563                       used_prefixes |= (prefixes & PREFIX_DATA);
11564                     }
11565                 }
11566             }
11567           else
11568             {
11569               if (l != 1 || len != 2 || last[0] != 'L')
11570                 {
11571                   SAVE_LAST (*p);
11572                   break;
11573                 }
11574               if (intel_syntax
11575                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11576                 break;
11577               if ((rex & REX_W))
11578                 {
11579                   USED_REX (REX_W);
11580                   *obufp++ = 'q';
11581                 }
11582               else
11583                 *obufp++ = 'l';
11584             }
11585           break;
11586         case 'R':
11587           USED_REX (REX_W);
11588           if (rex & REX_W)
11589             *obufp++ = 'q';
11590           else if (sizeflag & DFLAG)
11591             {
11592               if (intel_syntax)
11593                   *obufp++ = 'd';
11594               else
11595                   *obufp++ = 'l';
11596             }
11597           else
11598             *obufp++ = 'w';
11599           if (intel_syntax && !p[1]
11600               && ((rex & REX_W) || (sizeflag & DFLAG)))
11601             *obufp++ = 'e';
11602           if (!(rex & REX_W))
11603             used_prefixes |= (prefixes & PREFIX_DATA);
11604           break;
11605         case 'V':
11606           if (l == 0 && len == 1)
11607             {
11608               if (intel_syntax)
11609                 break;
11610               if (address_mode == mode_64bit && (sizeflag & DFLAG))
11611                 {
11612                   if (sizeflag & SUFFIX_ALWAYS)
11613                     *obufp++ = 'q';
11614                   break;
11615                 }
11616             }
11617           else
11618             {
11619               if (l != 1
11620                   || len != 2
11621                   || last[0] != 'L')
11622                 {
11623                   SAVE_LAST (*p);
11624                   break;
11625                 }
11626
11627               if (rex & REX_W)
11628                 {
11629                   *obufp++ = 'a';
11630                   *obufp++ = 'b';
11631                   *obufp++ = 's';
11632                 }
11633             }
11634           /* Fall through.  */
11635           goto case_S;
11636         case 'S':
11637           if (l == 0 && len == 1)
11638             {
11639 case_S:
11640               if (intel_syntax)
11641                 break;
11642               if (sizeflag & SUFFIX_ALWAYS)
11643                 {
11644                   if (rex & REX_W)
11645                     *obufp++ = 'q';
11646                   else
11647                     {
11648                       if (sizeflag & DFLAG)
11649                         *obufp++ = 'l';
11650                       else
11651                         *obufp++ = 'w';
11652                       used_prefixes |= (prefixes & PREFIX_DATA);
11653                     }
11654                 }
11655             }
11656           else
11657             {
11658               if (l != 1
11659                   || len != 2
11660                   || last[0] != 'L')
11661                 {
11662                   SAVE_LAST (*p);
11663                   break;
11664                 }
11665
11666               if (address_mode == mode_64bit
11667                   && !(prefixes & PREFIX_ADDR))
11668                 {
11669                   *obufp++ = 'a';
11670                   *obufp++ = 'b';
11671                   *obufp++ = 's';
11672                 }
11673
11674               goto case_S;
11675             }
11676           break;
11677         case 'X':
11678           if (l != 0 || len != 1)
11679             {
11680               SAVE_LAST (*p);
11681               break;
11682             }
11683           if (need_vex && vex.prefix)
11684             {
11685               if (vex.prefix == DATA_PREFIX_OPCODE)
11686                 *obufp++ = 'd';
11687               else
11688                 *obufp++ = 's';
11689             }
11690           else
11691             {
11692               if (prefixes & PREFIX_DATA)
11693                 *obufp++ = 'd';
11694               else
11695                 *obufp++ = 's';
11696               used_prefixes |= (prefixes & PREFIX_DATA);
11697             }
11698           break;
11699         case 'Y':
11700           if (l == 0 && len == 1)
11701             {
11702               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11703                 break;
11704               if (rex & REX_W)
11705                 {
11706                   USED_REX (REX_W);
11707                   *obufp++ = 'q';
11708                 }
11709               break;
11710             }
11711           else
11712             {
11713               if (l != 1 || len != 2 || last[0] != 'X')
11714                 {
11715                   SAVE_LAST (*p);
11716                   break;
11717                 }
11718               if (!need_vex)
11719                 abort ();
11720               if (intel_syntax
11721                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11722                 break;
11723               switch (vex.length)
11724                 {
11725                 case 128:
11726                   *obufp++ = 'x';
11727                   break;
11728                 case 256:
11729                   *obufp++ = 'y';
11730                   break;
11731                 default:
11732                   abort ();
11733                 }
11734             }
11735           break;
11736         case 'W':
11737           if (l == 0 && len == 1)
11738             {
11739               /* operand size flag for cwtl, cbtw */
11740               USED_REX (REX_W);
11741               if (rex & REX_W)
11742                 {
11743                   if (intel_syntax)
11744                     *obufp++ = 'd';
11745                   else
11746                     *obufp++ = 'l';
11747                 }
11748               else if (sizeflag & DFLAG)
11749                 *obufp++ = 'w';
11750               else
11751                 *obufp++ = 'b';
11752               if (!(rex & REX_W))
11753                 used_prefixes |= (prefixes & PREFIX_DATA);
11754             }
11755           else
11756             {
11757               if (l != 1 || len != 2 || last[0] != 'X')
11758                 {
11759                   SAVE_LAST (*p);
11760                   break;
11761                 }
11762               if (!need_vex)
11763                 abort ();
11764               *obufp++ = vex.w ? 'd': 's';
11765             }
11766           break;
11767         }
11768       alt = 0;
11769     }
11770   *obufp = 0;
11771   mnemonicendp = obufp;
11772   return 0;
11773 }
11774
11775 static void
11776 oappend (const char *s)
11777 {
11778   obufp = stpcpy (obufp, s);
11779 }
11780
11781 static void
11782 append_seg (void)
11783 {
11784   if (prefixes & PREFIX_CS)
11785     {
11786       used_prefixes |= PREFIX_CS;
11787       oappend ("%cs:" + intel_syntax);
11788     }
11789   if (prefixes & PREFIX_DS)
11790     {
11791       used_prefixes |= PREFIX_DS;
11792       oappend ("%ds:" + intel_syntax);
11793     }
11794   if (prefixes & PREFIX_SS)
11795     {
11796       used_prefixes |= PREFIX_SS;
11797       oappend ("%ss:" + intel_syntax);
11798     }
11799   if (prefixes & PREFIX_ES)
11800     {
11801       used_prefixes |= PREFIX_ES;
11802       oappend ("%es:" + intel_syntax);
11803     }
11804   if (prefixes & PREFIX_FS)
11805     {
11806       used_prefixes |= PREFIX_FS;
11807       oappend ("%fs:" + intel_syntax);
11808     }
11809   if (prefixes & PREFIX_GS)
11810     {
11811       used_prefixes |= PREFIX_GS;
11812       oappend ("%gs:" + intel_syntax);
11813     }
11814 }
11815
11816 static void
11817 OP_indirE (int bytemode, int sizeflag)
11818 {
11819   if (!intel_syntax)
11820     oappend ("*");
11821   OP_E (bytemode, sizeflag);
11822 }
11823
11824 static void
11825 print_operand_value (char *buf, int hex, bfd_vma disp)
11826 {
11827   if (address_mode == mode_64bit)
11828     {
11829       if (hex)
11830         {
11831           char tmp[30];
11832           int i;
11833           buf[0] = '0';
11834           buf[1] = 'x';
11835           sprintf_vma (tmp, disp);
11836           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11837           strcpy (buf + 2, tmp + i);
11838         }
11839       else
11840         {
11841           bfd_signed_vma v = disp;
11842           char tmp[30];
11843           int i;
11844           if (v < 0)
11845             {
11846               *(buf++) = '-';
11847               v = -disp;
11848               /* Check for possible overflow on 0x8000000000000000.  */
11849               if (v < 0)
11850                 {
11851                   strcpy (buf, "9223372036854775808");
11852                   return;
11853                 }
11854             }
11855           if (!v)
11856             {
11857               strcpy (buf, "0");
11858               return;
11859             }
11860
11861           i = 0;
11862           tmp[29] = 0;
11863           while (v)
11864             {
11865               tmp[28 - i] = (v % 10) + '0';
11866               v /= 10;
11867               i++;
11868             }
11869           strcpy (buf, tmp + 29 - i);
11870         }
11871     }
11872   else
11873     {
11874       if (hex)
11875         sprintf (buf, "0x%x", (unsigned int) disp);
11876       else
11877         sprintf (buf, "%d", (int) disp);
11878     }
11879 }
11880
11881 /* Put DISP in BUF as signed hex number.  */
11882
11883 static void
11884 print_displacement (char *buf, bfd_vma disp)
11885 {
11886   bfd_signed_vma val = disp;
11887   char tmp[30];
11888   int i, j = 0;
11889
11890   if (val < 0)
11891     {
11892       buf[j++] = '-';
11893       val = -disp;
11894
11895       /* Check for possible overflow.  */
11896       if (val < 0)
11897         {
11898           switch (address_mode)
11899             {
11900             case mode_64bit:
11901               strcpy (buf + j, "0x8000000000000000");
11902               break;
11903             case mode_32bit:
11904               strcpy (buf + j, "0x80000000");
11905               break;
11906             case mode_16bit:
11907               strcpy (buf + j, "0x8000");
11908               break;
11909             }
11910           return;
11911         }
11912     }
11913
11914   buf[j++] = '0';
11915   buf[j++] = 'x';
11916
11917   sprintf_vma (tmp, (bfd_vma) val);
11918   for (i = 0; tmp[i] == '0'; i++)
11919     continue;
11920   if (tmp[i] == '\0')
11921     i--;
11922   strcpy (buf + j, tmp + i);
11923 }
11924
11925 static void
11926 intel_operand_size (int bytemode, int sizeflag)
11927 {
11928   switch (bytemode)
11929     {
11930     case b_mode:
11931     case b_swap_mode:
11932     case dqb_mode:
11933       oappend ("BYTE PTR ");
11934       break;
11935     case w_mode:
11936     case dqw_mode:
11937       oappend ("WORD PTR ");
11938       break;
11939     case stack_v_mode:
11940       if (address_mode == mode_64bit && (sizeflag & DFLAG))
11941         {
11942           oappend ("QWORD PTR ");
11943           break;
11944         }
11945       /* FALLTHRU */
11946     case v_mode:
11947     case v_swap_mode:
11948     case dq_mode:
11949       USED_REX (REX_W);
11950       if (rex & REX_W)
11951         oappend ("QWORD PTR ");
11952       else
11953         {
11954           if ((sizeflag & DFLAG) || bytemode == dq_mode)
11955             oappend ("DWORD PTR ");
11956           else
11957             oappend ("WORD PTR ");
11958           used_prefixes |= (prefixes & PREFIX_DATA);
11959         }
11960       break;
11961     case z_mode:
11962       if ((rex & REX_W) || (sizeflag & DFLAG))
11963         *obufp++ = 'D';
11964       oappend ("WORD PTR ");
11965       if (!(rex & REX_W))
11966         used_prefixes |= (prefixes & PREFIX_DATA);
11967       break;
11968     case a_mode:
11969       if (sizeflag & DFLAG)
11970         oappend ("QWORD PTR ");
11971       else
11972         oappend ("DWORD PTR ");
11973       used_prefixes |= (prefixes & PREFIX_DATA);
11974       break;
11975     case d_mode:
11976     case d_swap_mode:
11977     case dqd_mode:
11978       oappend ("DWORD PTR ");
11979       break;
11980     case q_mode:
11981     case q_swap_mode:
11982       oappend ("QWORD PTR ");
11983       break;
11984     case m_mode:
11985       if (address_mode == mode_64bit)
11986         oappend ("QWORD PTR ");
11987       else
11988         oappend ("DWORD PTR ");
11989       break;
11990     case f_mode:
11991       if (sizeflag & DFLAG)
11992         oappend ("FWORD PTR ");
11993       else
11994         oappend ("DWORD PTR ");
11995       used_prefixes |= (prefixes & PREFIX_DATA);
11996       break;
11997     case t_mode:
11998       oappend ("TBYTE PTR ");
11999       break;
12000     case x_mode:
12001     case x_swap_mode:
12002       if (need_vex)
12003         {
12004           switch (vex.length)
12005             {
12006             case 128:
12007               oappend ("XMMWORD PTR ");
12008               break;
12009             case 256:
12010               oappend ("YMMWORD PTR ");
12011               break;
12012             default:
12013               abort ();
12014             }
12015         }
12016       else
12017         oappend ("XMMWORD PTR ");
12018       break;
12019     case xmm_mode:
12020       oappend ("XMMWORD PTR ");
12021       break;
12022     case xmmq_mode:
12023       if (!need_vex)
12024         abort ();
12025
12026       switch (vex.length)
12027         {
12028         case 128:
12029           oappend ("QWORD PTR ");
12030           break;
12031         case 256:
12032           oappend ("XMMWORD PTR ");
12033           break;
12034         default:
12035           abort ();
12036         }
12037       break;
12038     case ymmq_mode:
12039       if (!need_vex)
12040         abort ();
12041
12042       switch (vex.length)
12043         {
12044         case 128:
12045           oappend ("QWORD PTR ");
12046           break;
12047         case 256:
12048           oappend ("YMMWORD PTR ");
12049           break;
12050         default:
12051           abort ();
12052         }
12053       break;
12054     case o_mode:
12055       oappend ("OWORD PTR ");
12056       break;
12057     case vex_w_dq_mode:
12058       if (!need_vex)
12059         abort ();
12060
12061       if (vex.w)
12062         oappend ("QWORD PTR ");
12063       else
12064         oappend ("DWORD PTR ");
12065       break;
12066     default:
12067       break;
12068     }
12069 }
12070
12071 static void
12072 OP_E_register (int bytemode, int sizeflag)
12073 {
12074   int reg = modrm.rm;
12075   const char **names;
12076
12077   USED_REX (REX_B);
12078   if ((rex & REX_B))
12079     reg += 8;
12080
12081   if ((sizeflag & SUFFIX_ALWAYS)
12082       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12083     swap_operand ();
12084
12085   switch (bytemode)
12086     {
12087     case b_mode:
12088     case b_swap_mode:
12089       USED_REX (0);
12090       if (rex)
12091         names = names8rex;
12092       else
12093         names = names8;
12094       break;
12095     case w_mode:
12096       names = names16;
12097       break;
12098     case d_mode:
12099       names = names32;
12100       break;
12101     case q_mode:
12102       names = names64;
12103       break;
12104     case m_mode:
12105       names = address_mode == mode_64bit ? names64 : names32;
12106       break;
12107     case stack_v_mode:
12108       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12109         {
12110           names = names64;
12111           break;
12112         }
12113       bytemode = v_mode;
12114       /* FALLTHRU */
12115     case v_mode:
12116     case v_swap_mode:
12117     case dq_mode:
12118     case dqb_mode:
12119     case dqd_mode:
12120     case dqw_mode:
12121       USED_REX (REX_W);
12122       if (rex & REX_W)
12123         names = names64;
12124       else
12125         {
12126           if ((sizeflag & DFLAG) 
12127               || (bytemode != v_mode
12128                   && bytemode != v_swap_mode))
12129             names = names32;
12130           else
12131             names = names16;
12132           used_prefixes |= (prefixes & PREFIX_DATA);
12133         }
12134       break;
12135     case 0:
12136       return;
12137     default:
12138       oappend (INTERNAL_DISASSEMBLER_ERROR);
12139       return;
12140     }
12141   oappend (names[reg]);
12142 }
12143
12144 static void
12145 OP_E_memory (int bytemode, int sizeflag)
12146 {
12147   bfd_vma disp = 0;
12148   int add = (rex & REX_B) ? 8 : 0;
12149   int riprel = 0;
12150
12151   USED_REX (REX_B);
12152   if (intel_syntax)
12153     intel_operand_size (bytemode, sizeflag);
12154   append_seg ();
12155
12156   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12157     {
12158       /* 32/64 bit address mode */
12159       int havedisp;
12160       int havesib;
12161       int havebase;
12162       int haveindex;
12163       int needindex;
12164       int base, rbase;
12165       int vindex = 0;
12166       int scale = 0;
12167
12168       havesib = 0;
12169       havebase = 1;
12170       haveindex = 0;
12171       base = modrm.rm;
12172
12173       if (base == 4)
12174         {
12175           havesib = 1;
12176           FETCH_DATA (the_info, codep + 1);
12177           vindex = (*codep >> 3) & 7;
12178           scale = (*codep >> 6) & 3;
12179           base = *codep & 7;
12180           USED_REX (REX_X);
12181           if (rex & REX_X)
12182             vindex += 8;
12183           haveindex = vindex != 4;
12184           codep++;
12185         }
12186       rbase = base + add;
12187
12188       switch (modrm.mod)
12189         {
12190         case 0:
12191           if (base == 5)
12192             {
12193               havebase = 0;
12194               if (address_mode == mode_64bit && !havesib)
12195                 riprel = 1;
12196               disp = get32s ();
12197             }
12198           break;
12199         case 1:
12200           FETCH_DATA (the_info, codep + 1);
12201           disp = *codep++;
12202           if ((disp & 0x80) != 0)
12203             disp -= 0x100;
12204           break;
12205         case 2:
12206           disp = get32s ();
12207           break;
12208         }
12209
12210       /* In 32bit mode, we need index register to tell [offset] from
12211          [eiz*1 + offset].  */
12212       needindex = (havesib
12213                    && !havebase
12214                    && !haveindex
12215                    && address_mode == mode_32bit);
12216       havedisp = (havebase
12217                   || needindex
12218                   || (havesib && (haveindex || scale != 0)));
12219
12220       if (!intel_syntax)
12221         if (modrm.mod != 0 || base == 5)
12222           {
12223             if (havedisp || riprel)
12224               print_displacement (scratchbuf, disp);
12225             else
12226               print_operand_value (scratchbuf, 1, disp);
12227             oappend (scratchbuf);
12228             if (riprel)
12229               {
12230                 set_op (disp, 1);
12231                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
12232               }
12233           }
12234
12235       if (havebase || haveindex || riprel)
12236         used_prefixes |= PREFIX_ADDR;
12237
12238       if (havedisp || (intel_syntax && riprel))
12239         {
12240           *obufp++ = open_char;
12241           if (intel_syntax && riprel)
12242             {
12243               set_op (disp, 1);
12244               oappend (sizeflag & AFLAG ? "rip" : "eip");
12245             }
12246           *obufp = '\0';
12247           if (havebase)
12248             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
12249                      ? names64[rbase] : names32[rbase]);
12250           if (havesib)
12251             {
12252               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12253                  print index to tell base + index from base.  */
12254               if (scale != 0
12255                   || needindex
12256                   || haveindex
12257                   || (havebase && base != ESP_REG_NUM))
12258                 {
12259                   if (!intel_syntax || havebase)
12260                     {
12261                       *obufp++ = separator_char;
12262                       *obufp = '\0';
12263                     }
12264                   if (haveindex)
12265                     oappend (address_mode == mode_64bit 
12266                              && (sizeflag & AFLAG)
12267                              ? names64[vindex] : names32[vindex]);
12268                   else
12269                     oappend (address_mode == mode_64bit 
12270                              && (sizeflag & AFLAG)
12271                              ? index64 : index32);
12272
12273                   *obufp++ = scale_char;
12274                   *obufp = '\0';
12275                   sprintf (scratchbuf, "%d", 1 << scale);
12276                   oappend (scratchbuf);
12277                 }
12278             }
12279           if (intel_syntax
12280               && (disp || modrm.mod != 0 || base == 5))
12281             {
12282               if (!havedisp || (bfd_signed_vma) disp >= 0)
12283                 {
12284                   *obufp++ = '+';
12285                   *obufp = '\0';
12286                 }
12287               else if (modrm.mod != 1 && disp != -disp)
12288                 {
12289                   *obufp++ = '-';
12290                   *obufp = '\0';
12291                   disp = - (bfd_signed_vma) disp;
12292                 }
12293
12294               if (havedisp)
12295                 print_displacement (scratchbuf, disp);
12296               else
12297                 print_operand_value (scratchbuf, 1, disp);
12298               oappend (scratchbuf);
12299             }
12300
12301           *obufp++ = close_char;
12302           *obufp = '\0';
12303         }
12304       else if (intel_syntax)
12305         {
12306           if (modrm.mod != 0 || base == 5)
12307             {
12308               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12309                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12310                 ;
12311               else
12312                 {
12313                   oappend (names_seg[ds_reg - es_reg]);
12314                   oappend (":");
12315                 }
12316               print_operand_value (scratchbuf, 1, disp);
12317               oappend (scratchbuf);
12318             }
12319         }
12320     }
12321   else
12322     {
12323       /* 16 bit address mode */
12324       used_prefixes |= prefixes & PREFIX_ADDR;
12325       switch (modrm.mod)
12326         {
12327         case 0:
12328           if (modrm.rm == 6)
12329             {
12330               disp = get16 ();
12331               if ((disp & 0x8000) != 0)
12332                 disp -= 0x10000;
12333             }
12334           break;
12335         case 1:
12336           FETCH_DATA (the_info, codep + 1);
12337           disp = *codep++;
12338           if ((disp & 0x80) != 0)
12339             disp -= 0x100;
12340           break;
12341         case 2:
12342           disp = get16 ();
12343           if ((disp & 0x8000) != 0)
12344             disp -= 0x10000;
12345           break;
12346         }
12347
12348       if (!intel_syntax)
12349         if (modrm.mod != 0 || modrm.rm == 6)
12350           {
12351             print_displacement (scratchbuf, disp);
12352             oappend (scratchbuf);
12353           }
12354
12355       if (modrm.mod != 0 || modrm.rm != 6)
12356         {
12357           *obufp++ = open_char;
12358           *obufp = '\0';
12359           oappend (index16[modrm.rm]);
12360           if (intel_syntax
12361               && (disp || modrm.mod != 0 || modrm.rm == 6))
12362             {
12363               if ((bfd_signed_vma) disp >= 0)
12364                 {
12365                   *obufp++ = '+';
12366                   *obufp = '\0';
12367                 }
12368               else if (modrm.mod != 1)
12369                 {
12370                   *obufp++ = '-';
12371                   *obufp = '\0';
12372                   disp = - (bfd_signed_vma) disp;
12373                 }
12374
12375               print_displacement (scratchbuf, disp);
12376               oappend (scratchbuf);
12377             }
12378
12379           *obufp++ = close_char;
12380           *obufp = '\0';
12381         }
12382       else if (intel_syntax)
12383         {
12384           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12385                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12386             ;
12387           else
12388             {
12389               oappend (names_seg[ds_reg - es_reg]);
12390               oappend (":");
12391             }
12392           print_operand_value (scratchbuf, 1, disp & 0xffff);
12393           oappend (scratchbuf);
12394         }
12395     }
12396 }
12397
12398 static void
12399 OP_E (int bytemode, int sizeflag)
12400 {
12401   /* Skip mod/rm byte.  */
12402   MODRM_CHECK;
12403   codep++;
12404
12405   if (modrm.mod == 3)
12406     OP_E_register (bytemode, sizeflag);
12407   else
12408     OP_E_memory (bytemode, sizeflag);
12409 }
12410
12411 static void
12412 OP_G (int bytemode, int sizeflag)
12413 {
12414   int add = 0;
12415   USED_REX (REX_R);
12416   if (rex & REX_R)
12417     add += 8;
12418   switch (bytemode)
12419     {
12420     case b_mode:
12421       USED_REX (0);
12422       if (rex)
12423         oappend (names8rex[modrm.reg + add]);
12424       else
12425         oappend (names8[modrm.reg + add]);
12426       break;
12427     case w_mode:
12428       oappend (names16[modrm.reg + add]);
12429       break;
12430     case d_mode:
12431       oappend (names32[modrm.reg + add]);
12432       break;
12433     case q_mode:
12434       oappend (names64[modrm.reg + add]);
12435       break;
12436     case v_mode:
12437     case dq_mode:
12438     case dqb_mode:
12439     case dqd_mode:
12440     case dqw_mode:
12441       USED_REX (REX_W);
12442       if (rex & REX_W)
12443         oappend (names64[modrm.reg + add]);
12444       else
12445         {
12446           if ((sizeflag & DFLAG) || bytemode != v_mode)
12447             oappend (names32[modrm.reg + add]);
12448           else
12449             oappend (names16[modrm.reg + add]);
12450           used_prefixes |= (prefixes & PREFIX_DATA);
12451         }
12452       break;
12453     case m_mode:
12454       if (address_mode == mode_64bit)
12455         oappend (names64[modrm.reg + add]);
12456       else
12457         oappend (names32[modrm.reg + add]);
12458       break;
12459     default:
12460       oappend (INTERNAL_DISASSEMBLER_ERROR);
12461       break;
12462     }
12463 }
12464
12465 static bfd_vma
12466 get64 (void)
12467 {
12468   bfd_vma x;
12469 #ifdef BFD64
12470   unsigned int a;
12471   unsigned int b;
12472
12473   FETCH_DATA (the_info, codep + 8);
12474   a = *codep++ & 0xff;
12475   a |= (*codep++ & 0xff) << 8;
12476   a |= (*codep++ & 0xff) << 16;
12477   a |= (*codep++ & 0xff) << 24;
12478   b = *codep++ & 0xff;
12479   b |= (*codep++ & 0xff) << 8;
12480   b |= (*codep++ & 0xff) << 16;
12481   b |= (*codep++ & 0xff) << 24;
12482   x = a + ((bfd_vma) b << 32);
12483 #else
12484   abort ();
12485   x = 0;
12486 #endif
12487   return x;
12488 }
12489
12490 static bfd_signed_vma
12491 get32 (void)
12492 {
12493   bfd_signed_vma x = 0;
12494
12495   FETCH_DATA (the_info, codep + 4);
12496   x = *codep++ & (bfd_signed_vma) 0xff;
12497   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12498   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12499   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12500   return x;
12501 }
12502
12503 static bfd_signed_vma
12504 get32s (void)
12505 {
12506   bfd_signed_vma x = 0;
12507
12508   FETCH_DATA (the_info, codep + 4);
12509   x = *codep++ & (bfd_signed_vma) 0xff;
12510   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12511   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12512   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12513
12514   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12515
12516   return x;
12517 }
12518
12519 static int
12520 get16 (void)
12521 {
12522   int x = 0;
12523
12524   FETCH_DATA (the_info, codep + 2);
12525   x = *codep++ & 0xff;
12526   x |= (*codep++ & 0xff) << 8;
12527   return x;
12528 }
12529
12530 static void
12531 set_op (bfd_vma op, int riprel)
12532 {
12533   op_index[op_ad] = op_ad;
12534   if (address_mode == mode_64bit)
12535     {
12536       op_address[op_ad] = op;
12537       op_riprel[op_ad] = riprel;
12538     }
12539   else
12540     {
12541       /* Mask to get a 32-bit address.  */
12542       op_address[op_ad] = op & 0xffffffff;
12543       op_riprel[op_ad] = riprel & 0xffffffff;
12544     }
12545 }
12546
12547 static void
12548 OP_REG (int code, int sizeflag)
12549 {
12550   const char *s;
12551   int add;
12552   USED_REX (REX_B);
12553   if (rex & REX_B)
12554     add = 8;
12555   else
12556     add = 0;
12557
12558   switch (code)
12559     {
12560     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12561     case sp_reg: case bp_reg: case si_reg: case di_reg:
12562       s = names16[code - ax_reg + add];
12563       break;
12564     case es_reg: case ss_reg: case cs_reg:
12565     case ds_reg: case fs_reg: case gs_reg:
12566       s = names_seg[code - es_reg + add];
12567       break;
12568     case al_reg: case ah_reg: case cl_reg: case ch_reg:
12569     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12570       USED_REX (0);
12571       if (rex)
12572         s = names8rex[code - al_reg + add];
12573       else
12574         s = names8[code - al_reg];
12575       break;
12576     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12577     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12578       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12579         {
12580           s = names64[code - rAX_reg + add];
12581           break;
12582         }
12583       code += eAX_reg - rAX_reg;
12584       /* Fall through.  */
12585     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12586     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12587       USED_REX (REX_W);
12588       if (rex & REX_W)
12589         s = names64[code - eAX_reg + add];
12590       else
12591         {
12592           if (sizeflag & DFLAG)
12593             s = names32[code - eAX_reg + add];
12594           else
12595             s = names16[code - eAX_reg + add];
12596           used_prefixes |= (prefixes & PREFIX_DATA);
12597         }
12598       break;
12599     default:
12600       s = INTERNAL_DISASSEMBLER_ERROR;
12601       break;
12602     }
12603   oappend (s);
12604 }
12605
12606 static void
12607 OP_IMREG (int code, int sizeflag)
12608 {
12609   const char *s;
12610
12611   switch (code)
12612     {
12613     case indir_dx_reg:
12614       if (intel_syntax)
12615         s = "dx";
12616       else
12617         s = "(%dx)";
12618       break;
12619     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12620     case sp_reg: case bp_reg: case si_reg: case di_reg:
12621       s = names16[code - ax_reg];
12622       break;
12623     case es_reg: case ss_reg: case cs_reg:
12624     case ds_reg: case fs_reg: case gs_reg:
12625       s = names_seg[code - es_reg];
12626       break;
12627     case al_reg: case ah_reg: case cl_reg: case ch_reg:
12628     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12629       USED_REX (0);
12630       if (rex)
12631         s = names8rex[code - al_reg];
12632       else
12633         s = names8[code - al_reg];
12634       break;
12635     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12636     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12637       USED_REX (REX_W);
12638       if (rex & REX_W)
12639         s = names64[code - eAX_reg];
12640       else
12641         {
12642           if (sizeflag & DFLAG)
12643             s = names32[code - eAX_reg];
12644           else
12645             s = names16[code - eAX_reg];
12646           used_prefixes |= (prefixes & PREFIX_DATA);
12647         }
12648       break;
12649     case z_mode_ax_reg:
12650       if ((rex & REX_W) || (sizeflag & DFLAG))
12651         s = *names32;
12652       else
12653         s = *names16;
12654       if (!(rex & REX_W))
12655         used_prefixes |= (prefixes & PREFIX_DATA);
12656       break;
12657     default:
12658       s = INTERNAL_DISASSEMBLER_ERROR;
12659       break;
12660     }
12661   oappend (s);
12662 }
12663
12664 static void
12665 OP_I (int bytemode, int sizeflag)
12666 {
12667   bfd_signed_vma op;
12668   bfd_signed_vma mask = -1;
12669
12670   switch (bytemode)
12671     {
12672     case b_mode:
12673       FETCH_DATA (the_info, codep + 1);
12674       op = *codep++;
12675       mask = 0xff;
12676       break;
12677     case q_mode:
12678       if (address_mode == mode_64bit)
12679         {
12680           op = get32s ();
12681           break;
12682         }
12683       /* Fall through.  */
12684     case v_mode:
12685       USED_REX (REX_W);
12686       if (rex & REX_W)
12687         op = get32s ();
12688       else
12689         {
12690           if (sizeflag & DFLAG)
12691             {
12692               op = get32 ();
12693               mask = 0xffffffff;
12694             }
12695           else
12696             {
12697               op = get16 ();
12698               mask = 0xfffff;
12699             }
12700           used_prefixes |= (prefixes & PREFIX_DATA);
12701         }
12702       break;
12703     case w_mode:
12704       mask = 0xfffff;
12705       op = get16 ();
12706       break;
12707     case const_1_mode:
12708       if (intel_syntax)
12709         oappend ("1");
12710       return;
12711     default:
12712       oappend (INTERNAL_DISASSEMBLER_ERROR);
12713       return;
12714     }
12715
12716   op &= mask;
12717   scratchbuf[0] = '$';
12718   print_operand_value (scratchbuf + 1, 1, op);
12719   oappend (scratchbuf + intel_syntax);
12720   scratchbuf[0] = '\0';
12721 }
12722
12723 static void
12724 OP_I64 (int bytemode, int sizeflag)
12725 {
12726   bfd_signed_vma op;
12727   bfd_signed_vma mask = -1;
12728
12729   if (address_mode != mode_64bit)
12730     {
12731       OP_I (bytemode, sizeflag);
12732       return;
12733     }
12734
12735   switch (bytemode)
12736     {
12737     case b_mode:
12738       FETCH_DATA (the_info, codep + 1);
12739       op = *codep++;
12740       mask = 0xff;
12741       break;
12742     case v_mode:
12743       USED_REX (REX_W);
12744       if (rex & REX_W)
12745         op = get64 ();
12746       else
12747         {
12748           if (sizeflag & DFLAG)
12749             {
12750               op = get32 ();
12751               mask = 0xffffffff;
12752             }
12753           else
12754             {
12755               op = get16 ();
12756               mask = 0xfffff;
12757             }
12758           used_prefixes |= (prefixes & PREFIX_DATA);
12759         }
12760       break;
12761     case w_mode:
12762       mask = 0xfffff;
12763       op = get16 ();
12764       break;
12765     default:
12766       oappend (INTERNAL_DISASSEMBLER_ERROR);
12767       return;
12768     }
12769
12770   op &= mask;
12771   scratchbuf[0] = '$';
12772   print_operand_value (scratchbuf + 1, 1, op);
12773   oappend (scratchbuf + intel_syntax);
12774   scratchbuf[0] = '\0';
12775 }
12776
12777 static void
12778 OP_sI (int bytemode, int sizeflag)
12779 {
12780   bfd_signed_vma op;
12781   bfd_signed_vma mask = -1;
12782
12783   switch (bytemode)
12784     {
12785     case b_mode:
12786       FETCH_DATA (the_info, codep + 1);
12787       op = *codep++;
12788       if ((op & 0x80) != 0)
12789         op -= 0x100;
12790       mask = 0xffffffff;
12791       break;
12792     case v_mode:
12793       USED_REX (REX_W);
12794       if (rex & REX_W)
12795         op = get32s ();
12796       else
12797         {
12798           if (sizeflag & DFLAG)
12799             {
12800               op = get32s ();
12801               mask = 0xffffffff;
12802             }
12803           else
12804             {
12805               mask = 0xffffffff;
12806               op = get16 ();
12807               if ((op & 0x8000) != 0)
12808                 op -= 0x10000;
12809             }
12810           used_prefixes |= (prefixes & PREFIX_DATA);
12811         }
12812       break;
12813     case w_mode:
12814       op = get16 ();
12815       mask = 0xffffffff;
12816       if ((op & 0x8000) != 0)
12817         op -= 0x10000;
12818       break;
12819     default:
12820       oappend (INTERNAL_DISASSEMBLER_ERROR);
12821       return;
12822     }
12823
12824   scratchbuf[0] = '$';
12825   print_operand_value (scratchbuf + 1, 1, op);
12826   oappend (scratchbuf + intel_syntax);
12827 }
12828
12829 static void
12830 OP_J (int bytemode, int sizeflag)
12831 {
12832   bfd_vma disp;
12833   bfd_vma mask = -1;
12834   bfd_vma segment = 0;
12835
12836   switch (bytemode)
12837     {
12838     case b_mode:
12839       FETCH_DATA (the_info, codep + 1);
12840       disp = *codep++;
12841       if ((disp & 0x80) != 0)
12842         disp -= 0x100;
12843       break;
12844     case v_mode:
12845       USED_REX (REX_W);
12846       if ((sizeflag & DFLAG) || (rex & REX_W))
12847         disp = get32s ();
12848       else
12849         {
12850           disp = get16 ();
12851           if ((disp & 0x8000) != 0)
12852             disp -= 0x10000;
12853           /* In 16bit mode, address is wrapped around at 64k within
12854              the same segment.  Otherwise, a data16 prefix on a jump
12855              instruction means that the pc is masked to 16 bits after
12856              the displacement is added!  */
12857           mask = 0xffff;
12858           if ((prefixes & PREFIX_DATA) == 0)
12859             segment = ((start_pc + codep - start_codep)
12860                        & ~((bfd_vma) 0xffff));
12861         }
12862       if (!(rex & REX_W))
12863         used_prefixes |= (prefixes & PREFIX_DATA);
12864       break;
12865     default:
12866       oappend (INTERNAL_DISASSEMBLER_ERROR);
12867       return;
12868     }
12869   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12870   set_op (disp, 0);
12871   print_operand_value (scratchbuf, 1, disp);
12872   oappend (scratchbuf);
12873 }
12874
12875 static void
12876 OP_SEG (int bytemode, int sizeflag)
12877 {
12878   if (bytemode == w_mode)
12879     oappend (names_seg[modrm.reg]);
12880   else
12881     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12882 }
12883
12884 static void
12885 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12886 {
12887   int seg, offset;
12888
12889   if (sizeflag & DFLAG)
12890     {
12891       offset = get32 ();
12892       seg = get16 ();
12893     }
12894   else
12895     {
12896       offset = get16 ();
12897       seg = get16 ();
12898     }
12899   used_prefixes |= (prefixes & PREFIX_DATA);
12900   if (intel_syntax)
12901     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12902   else
12903     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12904   oappend (scratchbuf);
12905 }
12906
12907 static void
12908 OP_OFF (int bytemode, int sizeflag)
12909 {
12910   bfd_vma off;
12911
12912   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12913     intel_operand_size (bytemode, sizeflag);
12914   append_seg ();
12915
12916   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12917     off = get32 ();
12918   else
12919     off = get16 ();
12920
12921   if (intel_syntax)
12922     {
12923       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12924                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12925         {
12926           oappend (names_seg[ds_reg - es_reg]);
12927           oappend (":");
12928         }
12929     }
12930   print_operand_value (scratchbuf, 1, off);
12931   oappend (scratchbuf);
12932 }
12933
12934 static void
12935 OP_OFF64 (int bytemode, int sizeflag)
12936 {
12937   bfd_vma off;
12938
12939   if (address_mode != mode_64bit
12940       || (prefixes & PREFIX_ADDR))
12941     {
12942       OP_OFF (bytemode, sizeflag);
12943       return;
12944     }
12945
12946   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12947     intel_operand_size (bytemode, sizeflag);
12948   append_seg ();
12949
12950   off = get64 ();
12951
12952   if (intel_syntax)
12953     {
12954       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12955                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12956         {
12957           oappend (names_seg[ds_reg - es_reg]);
12958           oappend (":");
12959         }
12960     }
12961   print_operand_value (scratchbuf, 1, off);
12962   oappend (scratchbuf);
12963 }
12964
12965 static void
12966 ptr_reg (int code, int sizeflag)
12967 {
12968   const char *s;
12969
12970   *obufp++ = open_char;
12971   used_prefixes |= (prefixes & PREFIX_ADDR);
12972   if (address_mode == mode_64bit)
12973     {
12974       if (!(sizeflag & AFLAG))
12975         s = names32[code - eAX_reg];
12976       else
12977         s = names64[code - eAX_reg];
12978     }
12979   else if (sizeflag & AFLAG)
12980     s = names32[code - eAX_reg];
12981   else
12982     s = names16[code - eAX_reg];
12983   oappend (s);
12984   *obufp++ = close_char;
12985   *obufp = 0;
12986 }
12987
12988 static void
12989 OP_ESreg (int code, int sizeflag)
12990 {
12991   if (intel_syntax)
12992     {
12993       switch (codep[-1])
12994         {
12995         case 0x6d:      /* insw/insl */
12996           intel_operand_size (z_mode, sizeflag);
12997           break;
12998         case 0xa5:      /* movsw/movsl/movsq */
12999         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13000         case 0xab:      /* stosw/stosl */
13001         case 0xaf:      /* scasw/scasl */
13002           intel_operand_size (v_mode, sizeflag);
13003           break;
13004         default:
13005           intel_operand_size (b_mode, sizeflag);
13006         }
13007     }
13008   oappend ("%es:" + intel_syntax);
13009   ptr_reg (code, sizeflag);
13010 }
13011
13012 static void
13013 OP_DSreg (int code, int sizeflag)
13014 {
13015   if (intel_syntax)
13016     {
13017       switch (codep[-1])
13018         {
13019         case 0x6f:      /* outsw/outsl */
13020           intel_operand_size (z_mode, sizeflag);
13021           break;
13022         case 0xa5:      /* movsw/movsl/movsq */
13023         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13024         case 0xad:      /* lodsw/lodsl/lodsq */
13025           intel_operand_size (v_mode, sizeflag);
13026           break;
13027         default:
13028           intel_operand_size (b_mode, sizeflag);
13029         }
13030     }
13031   if ((prefixes
13032        & (PREFIX_CS
13033           | PREFIX_DS
13034           | PREFIX_SS
13035           | PREFIX_ES
13036           | PREFIX_FS
13037           | PREFIX_GS)) == 0)
13038     prefixes |= PREFIX_DS;
13039   append_seg ();
13040   ptr_reg (code, sizeflag);
13041 }
13042
13043 static void
13044 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13045 {
13046   int add;
13047   if (rex & REX_R)
13048     {
13049       USED_REX (REX_R);
13050       add = 8;
13051     }
13052   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13053     {
13054       all_prefixes[last_lock_prefix] = 0;
13055       used_prefixes |= PREFIX_LOCK;
13056       add = 8;
13057     }
13058   else
13059     add = 0;
13060   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13061   oappend (scratchbuf + intel_syntax);
13062 }
13063
13064 static void
13065 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13066 {
13067   int add;
13068   USED_REX (REX_R);
13069   if (rex & REX_R)
13070     add = 8;
13071   else
13072     add = 0;
13073   if (intel_syntax)
13074     sprintf (scratchbuf, "db%d", modrm.reg + add);
13075   else
13076     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13077   oappend (scratchbuf);
13078 }
13079
13080 static void
13081 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13082 {
13083   sprintf (scratchbuf, "%%tr%d", modrm.reg);
13084   oappend (scratchbuf + intel_syntax);
13085 }
13086
13087 static void
13088 OP_R (int bytemode, int sizeflag)
13089 {
13090   if (modrm.mod == 3)
13091     OP_E (bytemode, sizeflag);
13092   else
13093     BadOp ();
13094 }
13095
13096 static void
13097 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13098 {
13099   used_prefixes |= (prefixes & PREFIX_DATA);
13100   if (prefixes & PREFIX_DATA)
13101     {
13102       int add;
13103       USED_REX (REX_R);
13104       if (rex & REX_R)
13105         add = 8;
13106       else
13107         add = 0;
13108       sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
13109     }
13110   else
13111     sprintf (scratchbuf, "%%mm%d", modrm.reg);
13112   oappend (scratchbuf + intel_syntax);
13113 }
13114
13115 static void
13116 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13117 {
13118   int add;
13119   USED_REX (REX_R);
13120   if (rex & REX_R)
13121     add = 8;
13122   else
13123     add = 0;
13124   if (need_vex && bytemode != xmm_mode)
13125     {
13126       switch (vex.length)
13127         {
13128         case 128:
13129           sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
13130           break;
13131         case 256:
13132           sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
13133           break;
13134         default:
13135           abort ();
13136         }
13137     }
13138   else
13139     sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
13140   oappend (scratchbuf + intel_syntax);
13141 }
13142
13143 static void
13144 OP_EM (int bytemode, int sizeflag)
13145 {
13146   if (modrm.mod != 3)
13147     {
13148       if (intel_syntax
13149           && (bytemode == v_mode || bytemode == v_swap_mode))
13150         {
13151           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13152           used_prefixes |= (prefixes & PREFIX_DATA);
13153         }
13154       OP_E (bytemode, sizeflag);
13155       return;
13156     }
13157
13158   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13159     swap_operand ();
13160
13161   /* Skip mod/rm byte.  */
13162   MODRM_CHECK;
13163   codep++;
13164   used_prefixes |= (prefixes & PREFIX_DATA);
13165   if (prefixes & PREFIX_DATA)
13166     {
13167       int add;
13168
13169       USED_REX (REX_B);
13170       if (rex & REX_B)
13171         add = 8;
13172       else
13173         add = 0;
13174       sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
13175     }
13176   else
13177     sprintf (scratchbuf, "%%mm%d", modrm.rm);
13178   oappend (scratchbuf + intel_syntax);
13179 }
13180
13181 /* cvt* are the only instructions in sse2 which have
13182    both SSE and MMX operands and also have 0x66 prefix
13183    in their opcode. 0x66 was originally used to differentiate
13184    between SSE and MMX instruction(operands). So we have to handle the
13185    cvt* separately using OP_EMC and OP_MXC */
13186 static void
13187 OP_EMC (int bytemode, int sizeflag)
13188 {
13189   if (modrm.mod != 3)
13190     {
13191       if (intel_syntax && bytemode == v_mode)
13192         {
13193           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13194           used_prefixes |= (prefixes & PREFIX_DATA);
13195         }
13196       OP_E (bytemode, sizeflag);
13197       return;
13198     }
13199
13200   /* Skip mod/rm byte.  */
13201   MODRM_CHECK;
13202   codep++;
13203   used_prefixes |= (prefixes & PREFIX_DATA);
13204   sprintf (scratchbuf, "%%mm%d", modrm.rm);
13205   oappend (scratchbuf + intel_syntax);
13206 }
13207
13208 static void
13209 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13210 {
13211   used_prefixes |= (prefixes & PREFIX_DATA);
13212   sprintf (scratchbuf, "%%mm%d", modrm.reg);
13213   oappend (scratchbuf + intel_syntax);
13214 }
13215
13216 static void
13217 OP_EX (int bytemode, int sizeflag)
13218 {
13219   int add;
13220
13221   /* Skip mod/rm byte.  */
13222   MODRM_CHECK;
13223   codep++;
13224
13225   if (modrm.mod != 3)
13226     {
13227       OP_E_memory (bytemode, sizeflag);
13228       return;
13229     }
13230
13231   USED_REX (REX_B);
13232   if (rex & REX_B)
13233     add = 8;
13234   else
13235     add = 0;
13236
13237   if ((sizeflag & SUFFIX_ALWAYS)
13238       && (bytemode == x_swap_mode
13239           || bytemode == d_swap_mode
13240           || bytemode == q_swap_mode))
13241     swap_operand ();
13242
13243   if (need_vex
13244       && bytemode != xmm_mode
13245       && bytemode != xmmq_mode)
13246     {
13247       switch (vex.length)
13248         {
13249         case 128:
13250           sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
13251           break;
13252         case 256:
13253           sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
13254           break;
13255         default:
13256           abort ();
13257         }
13258     }
13259   else
13260     sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
13261   oappend (scratchbuf + intel_syntax);
13262 }
13263
13264 static void
13265 OP_MS (int bytemode, int sizeflag)
13266 {
13267   if (modrm.mod == 3)
13268     OP_EM (bytemode, sizeflag);
13269   else
13270     BadOp ();
13271 }
13272
13273 static void
13274 OP_XS (int bytemode, int sizeflag)
13275 {
13276   if (modrm.mod == 3)
13277     OP_EX (bytemode, sizeflag);
13278   else
13279     BadOp ();
13280 }
13281
13282 static void
13283 OP_M (int bytemode, int sizeflag)
13284 {
13285   if (modrm.mod == 3)
13286     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13287     BadOp ();
13288   else
13289     OP_E (bytemode, sizeflag);
13290 }
13291
13292 static void
13293 OP_0f07 (int bytemode, int sizeflag)
13294 {
13295   if (modrm.mod != 3 || modrm.rm != 0)
13296     BadOp ();
13297   else
13298     OP_E (bytemode, sizeflag);
13299 }
13300
13301 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13302    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13303
13304 static void
13305 NOP_Fixup1 (int bytemode, int sizeflag)
13306 {
13307   if ((prefixes & PREFIX_DATA) != 0
13308       || (rex != 0
13309           && rex != 0x48
13310           && address_mode == mode_64bit))
13311     OP_REG (bytemode, sizeflag);
13312   else
13313     strcpy (obuf, "nop");
13314 }
13315
13316 static void
13317 NOP_Fixup2 (int bytemode, int sizeflag)
13318 {
13319   if ((prefixes & PREFIX_DATA) != 0
13320       || (rex != 0
13321           && rex != 0x48
13322           && address_mode == mode_64bit))
13323     OP_IMREG (bytemode, sizeflag);
13324 }
13325
13326 static const char *const Suffix3DNow[] = {
13327 /* 00 */        NULL,           NULL,           NULL,           NULL,
13328 /* 04 */        NULL,           NULL,           NULL,           NULL,
13329 /* 08 */        NULL,           NULL,           NULL,           NULL,
13330 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
13331 /* 10 */        NULL,           NULL,           NULL,           NULL,
13332 /* 14 */        NULL,           NULL,           NULL,           NULL,
13333 /* 18 */        NULL,           NULL,           NULL,           NULL,
13334 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
13335 /* 20 */        NULL,           NULL,           NULL,           NULL,
13336 /* 24 */        NULL,           NULL,           NULL,           NULL,
13337 /* 28 */        NULL,           NULL,           NULL,           NULL,
13338 /* 2C */        NULL,           NULL,           NULL,           NULL,
13339 /* 30 */        NULL,           NULL,           NULL,           NULL,
13340 /* 34 */        NULL,           NULL,           NULL,           NULL,
13341 /* 38 */        NULL,           NULL,           NULL,           NULL,
13342 /* 3C */        NULL,           NULL,           NULL,           NULL,
13343 /* 40 */        NULL,           NULL,           NULL,           NULL,
13344 /* 44 */        NULL,           NULL,           NULL,           NULL,
13345 /* 48 */        NULL,           NULL,           NULL,           NULL,
13346 /* 4C */        NULL,           NULL,           NULL,           NULL,
13347 /* 50 */        NULL,           NULL,           NULL,           NULL,
13348 /* 54 */        NULL,           NULL,           NULL,           NULL,
13349 /* 58 */        NULL,           NULL,           NULL,           NULL,
13350 /* 5C */        NULL,           NULL,           NULL,           NULL,
13351 /* 60 */        NULL,           NULL,           NULL,           NULL,
13352 /* 64 */        NULL,           NULL,           NULL,           NULL,
13353 /* 68 */        NULL,           NULL,           NULL,           NULL,
13354 /* 6C */        NULL,           NULL,           NULL,           NULL,
13355 /* 70 */        NULL,           NULL,           NULL,           NULL,
13356 /* 74 */        NULL,           NULL,           NULL,           NULL,
13357 /* 78 */        NULL,           NULL,           NULL,           NULL,
13358 /* 7C */        NULL,           NULL,           NULL,           NULL,
13359 /* 80 */        NULL,           NULL,           NULL,           NULL,
13360 /* 84 */        NULL,           NULL,           NULL,           NULL,
13361 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
13362 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
13363 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
13364 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
13365 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
13366 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
13367 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
13368 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
13369 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
13370 /* AC */        NULL,           NULL,           "pfacc",        NULL,
13371 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
13372 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
13373 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
13374 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
13375 /* C0 */        NULL,           NULL,           NULL,           NULL,
13376 /* C4 */        NULL,           NULL,           NULL,           NULL,
13377 /* C8 */        NULL,           NULL,           NULL,           NULL,
13378 /* CC */        NULL,           NULL,           NULL,           NULL,
13379 /* D0 */        NULL,           NULL,           NULL,           NULL,
13380 /* D4 */        NULL,           NULL,           NULL,           NULL,
13381 /* D8 */        NULL,           NULL,           NULL,           NULL,
13382 /* DC */        NULL,           NULL,           NULL,           NULL,
13383 /* E0 */        NULL,           NULL,           NULL,           NULL,
13384 /* E4 */        NULL,           NULL,           NULL,           NULL,
13385 /* E8 */        NULL,           NULL,           NULL,           NULL,
13386 /* EC */        NULL,           NULL,           NULL,           NULL,
13387 /* F0 */        NULL,           NULL,           NULL,           NULL,
13388 /* F4 */        NULL,           NULL,           NULL,           NULL,
13389 /* F8 */        NULL,           NULL,           NULL,           NULL,
13390 /* FC */        NULL,           NULL,           NULL,           NULL,
13391 };
13392
13393 static void
13394 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13395 {
13396   const char *mnemonic;
13397
13398   FETCH_DATA (the_info, codep + 1);
13399   /* AMD 3DNow! instructions are specified by an opcode suffix in the
13400      place where an 8-bit immediate would normally go.  ie. the last
13401      byte of the instruction.  */
13402   obufp = mnemonicendp;
13403   mnemonic = Suffix3DNow[*codep++ & 0xff];
13404   if (mnemonic)
13405     oappend (mnemonic);
13406   else
13407     {
13408       /* Since a variable sized modrm/sib chunk is between the start
13409          of the opcode (0x0f0f) and the opcode suffix, we need to do
13410          all the modrm processing first, and don't know until now that
13411          we have a bad opcode.  This necessitates some cleaning up.  */
13412       op_out[0][0] = '\0';
13413       op_out[1][0] = '\0';
13414       BadOp ();
13415     }
13416   mnemonicendp = obufp;
13417 }
13418
13419 static struct op simd_cmp_op[] =
13420 {
13421   { STRING_COMMA_LEN ("eq") },
13422   { STRING_COMMA_LEN ("lt") },
13423   { STRING_COMMA_LEN ("le") },
13424   { STRING_COMMA_LEN ("unord") },
13425   { STRING_COMMA_LEN ("neq") },
13426   { STRING_COMMA_LEN ("nlt") },
13427   { STRING_COMMA_LEN ("nle") },
13428   { STRING_COMMA_LEN ("ord") }
13429 };
13430
13431 static void
13432 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13433 {
13434   unsigned int cmp_type;
13435
13436   FETCH_DATA (the_info, codep + 1);
13437   cmp_type = *codep++ & 0xff;
13438   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13439     {
13440       char suffix [3];
13441       char *p = mnemonicendp - 2;
13442       suffix[0] = p[0];
13443       suffix[1] = p[1];
13444       suffix[2] = '\0';
13445       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13446       mnemonicendp += simd_cmp_op[cmp_type].len;
13447     }
13448   else
13449     {
13450       /* We have a reserved extension byte.  Output it directly.  */
13451       scratchbuf[0] = '$';
13452       print_operand_value (scratchbuf + 1, 1, cmp_type);
13453       oappend (scratchbuf + intel_syntax);
13454       scratchbuf[0] = '\0';
13455     }
13456 }
13457
13458 static void
13459 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
13460           int sizeflag ATTRIBUTE_UNUSED)
13461 {
13462   /* mwait %eax,%ecx  */
13463   if (!intel_syntax)
13464     {
13465       const char **names = (address_mode == mode_64bit
13466                             ? names64 : names32);
13467       strcpy (op_out[0], names[0]);
13468       strcpy (op_out[1], names[1]);
13469       two_source_ops = 1;
13470     }
13471   /* Skip mod/rm byte.  */
13472   MODRM_CHECK;
13473   codep++;
13474 }
13475
13476 static void
13477 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13478             int sizeflag ATTRIBUTE_UNUSED)
13479 {
13480   /* monitor %eax,%ecx,%edx"  */
13481   if (!intel_syntax)
13482     {
13483       const char **op1_names;
13484       const char **names = (address_mode == mode_64bit
13485                             ? names64 : names32);
13486
13487       if (!(prefixes & PREFIX_ADDR))
13488         op1_names = (address_mode == mode_16bit
13489                      ? names16 : names);
13490       else
13491         {
13492           /* Remove "addr16/addr32".  */
13493           all_prefixes[last_addr_prefix] = 0;
13494           op1_names = (address_mode != mode_32bit
13495                        ? names32 : names16);
13496           used_prefixes |= PREFIX_ADDR;
13497         }
13498       strcpy (op_out[0], op1_names[0]);
13499       strcpy (op_out[1], names[1]);
13500       strcpy (op_out[2], names[2]);
13501       two_source_ops = 1;
13502     }
13503   /* Skip mod/rm byte.  */
13504   MODRM_CHECK;
13505   codep++;
13506 }
13507
13508 static void
13509 BadOp (void)
13510 {
13511   /* Throw away prefixes and 1st. opcode byte.  */
13512   codep = insn_codep + 1;
13513   oappend ("(bad)");
13514 }
13515
13516 static void
13517 REP_Fixup (int bytemode, int sizeflag)
13518 {
13519   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13520      lods and stos.  */
13521   if (prefixes & PREFIX_REPZ)
13522     all_prefixes[last_repz_prefix] = REP_PREFIX;
13523
13524   switch (bytemode)
13525     {
13526     case al_reg:
13527     case eAX_reg:
13528     case indir_dx_reg:
13529       OP_IMREG (bytemode, sizeflag);
13530       break;
13531     case eDI_reg:
13532       OP_ESreg (bytemode, sizeflag);
13533       break;
13534     case eSI_reg:
13535       OP_DSreg (bytemode, sizeflag);
13536       break;
13537     default:
13538       abort ();
13539       break;
13540     }
13541 }
13542
13543 static void
13544 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13545 {
13546   USED_REX (REX_W);
13547   if (rex & REX_W)
13548     {
13549       /* Change cmpxchg8b to cmpxchg16b.  */
13550       char *p = mnemonicendp - 2;
13551       mnemonicendp = stpcpy (p, "16b");
13552       bytemode = o_mode;
13553     }
13554   OP_M (bytemode, sizeflag);
13555 }
13556
13557 static void
13558 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13559 {
13560   if (need_vex)
13561     {
13562       switch (vex.length)
13563         {
13564         case 128:
13565           sprintf (scratchbuf, "%%xmm%d", reg);
13566           break;
13567         case 256:
13568           sprintf (scratchbuf, "%%ymm%d", reg);
13569           break;
13570         default:
13571           abort ();
13572         }
13573     }
13574   else
13575     sprintf (scratchbuf, "%%xmm%d", reg);
13576   oappend (scratchbuf + intel_syntax);
13577 }
13578
13579 static void
13580 CRC32_Fixup (int bytemode, int sizeflag)
13581 {
13582   /* Add proper suffix to "crc32".  */
13583   char *p = mnemonicendp;
13584
13585   switch (bytemode)
13586     {
13587     case b_mode:
13588       if (intel_syntax)
13589         goto skip;
13590
13591       *p++ = 'b';
13592       break;
13593     case v_mode:
13594       if (intel_syntax)
13595         goto skip;
13596
13597       USED_REX (REX_W);
13598       if (rex & REX_W)
13599         *p++ = 'q';
13600       else 
13601         {
13602           if (sizeflag & DFLAG)
13603             *p++ = 'l';
13604           else
13605             *p++ = 'w';
13606           used_prefixes |= (prefixes & PREFIX_DATA);
13607         }
13608       break;
13609     default:
13610       oappend (INTERNAL_DISASSEMBLER_ERROR);
13611       break;
13612     }
13613   mnemonicendp = p;
13614   *p = '\0';
13615
13616 skip:
13617   if (modrm.mod == 3)
13618     {
13619       int add;
13620
13621       /* Skip mod/rm byte.  */
13622       MODRM_CHECK;
13623       codep++;
13624
13625       USED_REX (REX_B);
13626       add = (rex & REX_B) ? 8 : 0;
13627       if (bytemode == b_mode)
13628         {
13629           USED_REX (0);
13630           if (rex)
13631             oappend (names8rex[modrm.rm + add]);
13632           else
13633             oappend (names8[modrm.rm + add]);
13634         }
13635       else
13636         {
13637           USED_REX (REX_W);
13638           if (rex & REX_W)
13639             oappend (names64[modrm.rm + add]);
13640           else if ((prefixes & PREFIX_DATA))
13641             oappend (names16[modrm.rm + add]);
13642           else
13643             oappend (names32[modrm.rm + add]);
13644         }
13645     }
13646   else
13647     OP_E (bytemode, sizeflag);
13648 }
13649
13650 static void
13651 FXSAVE_Fixup (int bytemode, int sizeflag)
13652 {
13653   /* Add proper suffix to "fxsave" and "fxrstor".  */
13654   USED_REX (REX_W);
13655   if (rex & REX_W)
13656     {
13657       char *p = mnemonicendp;
13658       *p++ = '6';
13659       *p++ = '4';
13660       *p = '\0';
13661       mnemonicendp = p;
13662     }
13663   OP_M (bytemode, sizeflag);
13664 }
13665
13666 /* Display the destination register operand for instructions with
13667    VEX. */
13668
13669 static void
13670 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13671 {
13672   if (!need_vex)
13673     abort ();
13674
13675   if (!need_vex_reg)
13676     return;
13677
13678   switch (vex.length)
13679     {
13680     case 128:
13681       switch (bytemode)
13682         {
13683         case vex_mode:
13684         case vex128_mode:
13685           break;
13686         default:
13687           abort ();
13688           return;
13689         }
13690
13691       sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13692       break;
13693     case 256:
13694       switch (bytemode)
13695         {
13696         case vex_mode:
13697         case vex256_mode:
13698           break;
13699         default:
13700           abort ();
13701           return;
13702         }
13703
13704       sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13705       break;
13706     default:
13707       abort ();
13708       break;
13709     }
13710   oappend (scratchbuf + intel_syntax);
13711 }
13712
13713 /* Get the VEX immediate byte without moving codep.  */
13714
13715 static unsigned char
13716 get_vex_imm8 (int sizeflag, int opnum)
13717 {
13718   int bytes_before_imm = 0;
13719
13720   if (modrm.mod != 3)
13721     {
13722       /* There are SIB/displacement bytes.  */
13723       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13724         {
13725           /* 32/64 bit address mode */
13726           int base = modrm.rm;
13727
13728           /* Check SIB byte.  */
13729           if (base == 4)
13730             {
13731               FETCH_DATA (the_info, codep + 1);
13732               base = *codep & 7;
13733               /* When decoding the third source, don't increase
13734                  bytes_before_imm as this has already been incremented
13735                  by one in OP_E_memory while decoding the second
13736                  source operand.  */
13737               if (opnum == 0)
13738                 bytes_before_imm++;
13739             }
13740
13741           /* Don't increase bytes_before_imm when decoding the third source,
13742              it has already been incremented by OP_E_memory while decoding
13743              the second source operand.  */
13744           if (opnum == 0)
13745             {
13746               switch (modrm.mod)
13747                 {
13748                   case 0:
13749                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
13750                        SIB == 5, there is a 4 byte displacement.  */
13751                     if (base != 5)
13752                       /* No displacement. */
13753                       break;
13754                   case 2:
13755                     /* 4 byte displacement.  */
13756                     bytes_before_imm += 4;
13757                     break;
13758                   case 1:
13759                     /* 1 byte displacement.  */
13760                     bytes_before_imm++;
13761                     break;
13762                 }
13763             }
13764         }
13765       else
13766         {
13767           /* 16 bit address mode */
13768           /* Don't increase bytes_before_imm when decoding the third source,
13769              it has already been incremented by OP_E_memory while decoding
13770              the second source operand.  */
13771           if (opnum == 0)
13772             {
13773               switch (modrm.mod)
13774                 {
13775                 case 0:
13776                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
13777                   if (modrm.rm != 6)
13778                     /* No displacement. */
13779                     break;
13780                 case 2:
13781                   /* 2 byte displacement.  */
13782                   bytes_before_imm += 2;
13783                   break;
13784                 case 1:
13785                   /* 1 byte displacement: when decoding the third source,
13786                      don't increase bytes_before_imm as this has already
13787                      been incremented by one in OP_E_memory while decoding
13788                      the second source operand.  */
13789                   if (opnum == 0)
13790                     bytes_before_imm++;
13791
13792                   break;
13793                 }
13794             }
13795         }
13796     }
13797
13798   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13799   return codep [bytes_before_imm];
13800 }
13801
13802 static void
13803 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13804 {
13805   if (reg == -1 && modrm.mod != 3)
13806     {
13807       OP_E_memory (bytemode, sizeflag);
13808       return;
13809     }
13810   else
13811     {
13812       if (reg == -1)
13813         {
13814           reg = modrm.rm;
13815           USED_REX (REX_B);
13816           if (rex & REX_B)
13817             reg += 8;
13818         }
13819       else if (reg > 7 && address_mode != mode_64bit)
13820         BadOp ();
13821     }
13822
13823   switch (vex.length)
13824     {
13825     case 128:
13826       sprintf (scratchbuf, "%%xmm%d", reg);
13827       break;
13828     case 256:
13829       sprintf (scratchbuf, "%%ymm%d", reg);
13830       break;
13831     default:
13832       abort ();
13833     }
13834   oappend (scratchbuf + intel_syntax);
13835 }
13836
13837 static void
13838 OP_Vex_2src (int bytemode, int sizeflag)
13839 {
13840   if (modrm.mod == 3)
13841     {
13842       USED_REX (REX_B);
13843       sprintf (scratchbuf, "%%xmm%d", rex & REX_B ? modrm.rm + 8 : modrm.rm);
13844       oappend (scratchbuf + intel_syntax);
13845     }
13846   else
13847     {
13848       if (intel_syntax
13849           && (bytemode == v_mode || bytemode == v_swap_mode))
13850         {
13851           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13852           used_prefixes |= (prefixes & PREFIX_DATA);
13853         }
13854       OP_E (bytemode, sizeflag);
13855     }
13856 }
13857
13858 static void
13859 OP_Vex_2src_1 (int bytemode, int sizeflag)
13860 {
13861   if (modrm.mod == 3)
13862     {
13863       /* Skip mod/rm byte.   */
13864       MODRM_CHECK;
13865       codep++;
13866     }
13867
13868   if (vex.w)
13869     {
13870       sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13871       oappend (scratchbuf + intel_syntax);
13872     }
13873   else
13874     OP_Vex_2src (bytemode, sizeflag);
13875 }
13876
13877 static void
13878 OP_Vex_2src_2 (int bytemode, int sizeflag)
13879 {
13880   if (vex.w)
13881     OP_Vex_2src (bytemode, sizeflag);
13882   else
13883     {
13884       sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13885       oappend (scratchbuf + intel_syntax);
13886     }
13887 }
13888
13889 static void
13890 OP_EX_VexW (int bytemode, int sizeflag)
13891 {
13892   int reg = -1;
13893
13894   if (!vex_w_done)
13895     {
13896       vex_w_done = 1;
13897
13898       /* Skip mod/rm byte.  */
13899       MODRM_CHECK;
13900       codep++;
13901
13902       if (vex.w)
13903         reg = get_vex_imm8 (sizeflag, 0) >> 4;
13904     }
13905   else
13906     {
13907       if (!vex.w)
13908         reg = get_vex_imm8 (sizeflag, 1) >> 4;
13909     }
13910
13911   OP_EX_VexReg (bytemode, sizeflag, reg);
13912 }
13913
13914 static void
13915 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13916              int sizeflag ATTRIBUTE_UNUSED)
13917 {
13918   /* Skip the immediate byte and check for invalid bits.  */
13919   FETCH_DATA (the_info, codep + 1);
13920   if (*codep++ & 0xf)
13921     BadOp ();
13922 }
13923
13924 static void
13925 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13926 {
13927   int reg;
13928   FETCH_DATA (the_info, codep + 1);
13929   reg = *codep++;
13930
13931   if (bytemode != x_mode)
13932     abort ();
13933
13934   if (reg & 0xf)
13935       BadOp ();
13936
13937   reg >>= 4;
13938   if (reg > 7 && address_mode != mode_64bit)
13939     BadOp ();
13940
13941   switch (vex.length)
13942     {
13943     case 128:
13944       sprintf (scratchbuf, "%%xmm%d", reg);
13945       break;
13946     case 256:
13947       sprintf (scratchbuf, "%%ymm%d", reg);
13948       break;
13949     default:
13950       abort ();
13951     }
13952   oappend (scratchbuf + intel_syntax);
13953 }
13954
13955 static void
13956 OP_XMM_VexW (int bytemode, int sizeflag)
13957 {
13958   /* Turn off the REX.W bit since it is used for swapping operands
13959      now.  */
13960   rex &= ~REX_W;
13961   OP_XMM (bytemode, sizeflag);
13962 }
13963
13964 static void
13965 OP_EX_Vex (int bytemode, int sizeflag)
13966 {
13967   if (modrm.mod != 3)
13968     {
13969       if (vex.register_specifier != 0)
13970         BadOp ();
13971       need_vex_reg = 0;
13972     }
13973   OP_EX (bytemode, sizeflag);
13974 }
13975
13976 static void
13977 OP_XMM_Vex (int bytemode, int sizeflag)
13978 {
13979   if (modrm.mod != 3)
13980     {
13981       if (vex.register_specifier != 0)
13982         BadOp ();
13983       need_vex_reg = 0;
13984     }
13985   OP_XMM (bytemode, sizeflag);
13986 }
13987
13988 static void
13989 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13990 {
13991   switch (vex.length)
13992     {
13993     case 128:
13994       mnemonicendp = stpcpy (obuf, "vzeroupper");
13995       break;
13996     case 256:
13997       mnemonicendp = stpcpy (obuf, "vzeroall");
13998       break;
13999     default:
14000       abort ();
14001     }
14002 }
14003
14004 static struct op vex_cmp_op[] =
14005 {
14006   { STRING_COMMA_LEN ("eq") },
14007   { STRING_COMMA_LEN ("lt") },
14008   { STRING_COMMA_LEN ("le") },
14009   { STRING_COMMA_LEN ("unord") },
14010   { STRING_COMMA_LEN ("neq") },
14011   { STRING_COMMA_LEN ("nlt") },
14012   { STRING_COMMA_LEN ("nle") },
14013   { STRING_COMMA_LEN ("ord") },
14014   { STRING_COMMA_LEN ("eq_uq") },
14015   { STRING_COMMA_LEN ("nge") },
14016   { STRING_COMMA_LEN ("ngt") },
14017   { STRING_COMMA_LEN ("false") },
14018   { STRING_COMMA_LEN ("neq_oq") },
14019   { STRING_COMMA_LEN ("ge") },
14020   { STRING_COMMA_LEN ("gt") },
14021   { STRING_COMMA_LEN ("true") },
14022   { STRING_COMMA_LEN ("eq_os") },
14023   { STRING_COMMA_LEN ("lt_oq") },
14024   { STRING_COMMA_LEN ("le_oq") },
14025   { STRING_COMMA_LEN ("unord_s") },
14026   { STRING_COMMA_LEN ("neq_us") },
14027   { STRING_COMMA_LEN ("nlt_uq") },
14028   { STRING_COMMA_LEN ("nle_uq") },
14029   { STRING_COMMA_LEN ("ord_s") },
14030   { STRING_COMMA_LEN ("eq_us") },
14031   { STRING_COMMA_LEN ("nge_uq") },
14032   { STRING_COMMA_LEN ("ngt_uq") },
14033   { STRING_COMMA_LEN ("false_os") },
14034   { STRING_COMMA_LEN ("neq_os") },
14035   { STRING_COMMA_LEN ("ge_oq") },
14036   { STRING_COMMA_LEN ("gt_oq") },
14037   { STRING_COMMA_LEN ("true_us") },
14038 };
14039
14040 static void
14041 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14042 {
14043   unsigned int cmp_type;
14044
14045   FETCH_DATA (the_info, codep + 1);
14046   cmp_type = *codep++ & 0xff;
14047   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
14048     {
14049       char suffix [3];
14050       char *p = mnemonicendp - 2;
14051       suffix[0] = p[0];
14052       suffix[1] = p[1];
14053       suffix[2] = '\0';
14054       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
14055       mnemonicendp += vex_cmp_op[cmp_type].len;
14056     }
14057   else
14058     {
14059       /* We have a reserved extension byte.  Output it directly.  */
14060       scratchbuf[0] = '$';
14061       print_operand_value (scratchbuf + 1, 1, cmp_type);
14062       oappend (scratchbuf + intel_syntax);
14063       scratchbuf[0] = '\0';
14064     }
14065 }
14066
14067 static const struct op pclmul_op[] =
14068 {
14069   { STRING_COMMA_LEN ("lql") },
14070   { STRING_COMMA_LEN ("hql") },
14071   { STRING_COMMA_LEN ("lqh") },
14072   { STRING_COMMA_LEN ("hqh") }
14073 };
14074
14075 static void
14076 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14077               int sizeflag ATTRIBUTE_UNUSED)
14078 {
14079   unsigned int pclmul_type;
14080
14081   FETCH_DATA (the_info, codep + 1);
14082   pclmul_type = *codep++ & 0xff;
14083   switch (pclmul_type)
14084     {
14085     case 0x10:
14086       pclmul_type = 2;
14087       break;
14088     case 0x11:
14089       pclmul_type = 3;
14090       break;
14091     default:
14092       break;
14093     } 
14094   if (pclmul_type < ARRAY_SIZE (pclmul_op))
14095     {
14096       char suffix [4];
14097       char *p = mnemonicendp - 3;
14098       suffix[0] = p[0];
14099       suffix[1] = p[1];
14100       suffix[2] = p[2];
14101       suffix[3] = '\0';
14102       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14103       mnemonicendp += pclmul_op[pclmul_type].len;
14104     }
14105   else
14106     {
14107       /* We have a reserved extension byte.  Output it directly.  */
14108       scratchbuf[0] = '$';
14109       print_operand_value (scratchbuf + 1, 1, pclmul_type);
14110       oappend (scratchbuf + intel_syntax);
14111       scratchbuf[0] = '\0';
14112     }
14113 }
14114
14115 static void
14116 MOVBE_Fixup (int bytemode, int sizeflag)
14117 {
14118   /* Add proper suffix to "movbe".  */
14119   char *p = mnemonicendp;
14120
14121   switch (bytemode)
14122     {
14123     case v_mode:
14124       if (intel_syntax)
14125         goto skip;
14126
14127       USED_REX (REX_W);
14128       if (sizeflag & SUFFIX_ALWAYS)
14129         {
14130           if (rex & REX_W)
14131             *p++ = 'q';
14132           else
14133             {
14134               if (sizeflag & DFLAG)
14135                 *p++ = 'l';
14136               else
14137                 *p++ = 'w';
14138               used_prefixes |= (prefixes & PREFIX_DATA);
14139             }
14140         }
14141       break;
14142     default:
14143       oappend (INTERNAL_DISASSEMBLER_ERROR);
14144       break;
14145     }
14146   mnemonicendp = p;
14147   *p = '\0';
14148
14149 skip:
14150   OP_M (bytemode, sizeflag);
14151 }
14152
14153 static void
14154 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14155 {
14156   int reg;
14157   const char **names;
14158
14159   /* Skip mod/rm byte.  */
14160   MODRM_CHECK;
14161   codep++;
14162
14163   if (vex.w)
14164     names = names64;
14165   else if (vex.length == 256)
14166     names = names32;
14167   else
14168     names = names16;
14169
14170   reg = modrm.rm;
14171   USED_REX (REX_B);
14172   if (rex & REX_B)
14173     reg += 8;
14174
14175   oappend (names[reg]);
14176 }
14177
14178 static void
14179 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14180 {
14181   const char **names;
14182
14183   if (vex.w)
14184     names = names64;
14185   else if (vex.length == 256)
14186     names = names32;
14187   else
14188     names = names16;
14189
14190   oappend (names[vex.register_specifier]);
14191 }
14192
14193 static void
14194 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
14195 {
14196   if (vex.w || vex.length == 256)
14197     OP_I (q_mode, sizeflag);
14198   else
14199     OP_I (w_mode, sizeflag);
14200 }
14201