2009-11-17 Sebastian Pop <sebastian.pop@amd.com>
[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 OP_LWPCB_E (int, int);
114 static void OP_LWP_E (int, int);
115 static void OP_LWP_I (int, int);
116 static void OP_Vex_2src_1 (int, int);
117 static void OP_Vex_2src_2 (int, int);
118
119 static void MOVBE_Fixup (int, int);
120
121 struct dis_private {
122   /* Points to first byte not fetched.  */
123   bfd_byte *max_fetched;
124   bfd_byte the_buffer[MAX_MNEM_SIZE];
125   bfd_vma insn_start;
126   int orig_sizeflag;
127   jmp_buf bailout;
128 };
129
130 enum address_mode
131 {
132   mode_16bit,
133   mode_32bit,
134   mode_64bit
135 };
136
137 enum address_mode address_mode;
138
139 /* Flags for the prefixes for the current instruction.  See below.  */
140 static int prefixes;
141
142 /* REX prefix the current instruction.  See below.  */
143 static int rex;
144 /* Bits of REX we've already used.  */
145 static int rex_used;
146 /* Original REX prefix.  */
147 static int rex_original;
148 /* REX bits in original REX prefix ignored.  It may not be the same
149    as rex_original since some bits may not be ignored.  */
150 static int rex_ignored;
151 /* Mark parts used in the REX prefix.  When we are testing for
152    empty prefix (for 8bit register REX extension), just mask it
153    out.  Otherwise test for REX bit is excuse for existence of REX
154    only in case value is nonzero.  */
155 #define USED_REX(value)                                 \
156   {                                                     \
157     if (value)                                          \
158       {                                                 \
159         if ((rex & value))                              \
160           rex_used |= (value) | REX_OPCODE;             \
161       }                                                 \
162     else                                                \
163       rex_used |= REX_OPCODE;                           \
164   }
165
166 /* Flags for prefixes which we somehow handled when printing the
167    current instruction.  */
168 static int used_prefixes;
169
170 /* Flags stored in PREFIXES.  */
171 #define PREFIX_REPZ 1
172 #define PREFIX_REPNZ 2
173 #define PREFIX_LOCK 4
174 #define PREFIX_CS 8
175 #define PREFIX_SS 0x10
176 #define PREFIX_DS 0x20
177 #define PREFIX_ES 0x40
178 #define PREFIX_FS 0x80
179 #define PREFIX_GS 0x100
180 #define PREFIX_DATA 0x200
181 #define PREFIX_ADDR 0x400
182 #define PREFIX_FWAIT 0x800
183
184 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
185    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
186    on error.  */
187 #define FETCH_DATA(info, addr) \
188   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
189    ? 1 : fetch_data ((info), (addr)))
190
191 static int
192 fetch_data (struct disassemble_info *info, bfd_byte *addr)
193 {
194   int status;
195   struct dis_private *priv = (struct dis_private *) info->private_data;
196   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
197
198   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
199     status = (*info->read_memory_func) (start,
200                                         priv->max_fetched,
201                                         addr - priv->max_fetched,
202                                         info);
203   else
204     status = -1;
205   if (status != 0)
206     {
207       /* If we did manage to read at least one byte, then
208          print_insn_i386 will do something sensible.  Otherwise, print
209          an error.  We do that here because this is where we know
210          STATUS.  */
211       if (priv->max_fetched == priv->the_buffer)
212         (*info->memory_error_func) (status, start, info);
213       longjmp (priv->bailout, 1);
214     }
215   else
216     priv->max_fetched = addr;
217   return 1;
218 }
219
220 #define XX { NULL, 0 }
221
222 #define Eb { OP_E, b_mode }
223 #define EbS { OP_E, b_swap_mode }
224 #define Ev { OP_E, v_mode }
225 #define EvS { OP_E, v_swap_mode }
226 #define Ed { OP_E, d_mode }
227 #define Edq { OP_E, dq_mode }
228 #define Edqw { OP_E, dqw_mode }
229 #define Edqb { OP_E, dqb_mode }
230 #define Edqd { OP_E, dqd_mode }
231 #define Eq { OP_E, q_mode }
232 #define indirEv { OP_indirE, stack_v_mode }
233 #define indirEp { OP_indirE, f_mode }
234 #define stackEv { OP_E, stack_v_mode }
235 #define Em { OP_E, m_mode }
236 #define Ew { OP_E, w_mode }
237 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
238 #define Ma { OP_M, a_mode }
239 #define Mb { OP_M, b_mode }
240 #define Md { OP_M, d_mode }
241 #define Mo { OP_M, o_mode }
242 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
243 #define Mq { OP_M, q_mode }
244 #define Mx { OP_M, x_mode }
245 #define Mxmm { OP_M, xmm_mode }
246 #define Gb { OP_G, b_mode }
247 #define Gv { OP_G, v_mode }
248 #define Gd { OP_G, d_mode }
249 #define Gdq { OP_G, dq_mode }
250 #define Gm { OP_G, m_mode }
251 #define Gw { OP_G, w_mode }
252 #define Rd { OP_R, d_mode }
253 #define Rm { OP_R, m_mode }
254 #define Ib { OP_I, b_mode }
255 #define sIb { OP_sI, b_mode }   /* sign extened byte */
256 #define Iv { OP_I, v_mode }
257 #define Iq { OP_I, q_mode }
258 #define Iv64 { OP_I64, v_mode }
259 #define Iw { OP_I, w_mode }
260 #define I1 { OP_I, const_1_mode }
261 #define Jb { OP_J, b_mode }
262 #define Jv { OP_J, v_mode }
263 #define Cm { OP_C, m_mode }
264 #define Dm { OP_D, m_mode }
265 #define Td { OP_T, d_mode }
266 #define Skip_MODRM { OP_Skip_MODRM, 0 }
267
268 #define RMeAX { OP_REG, eAX_reg }
269 #define RMeBX { OP_REG, eBX_reg }
270 #define RMeCX { OP_REG, eCX_reg }
271 #define RMeDX { OP_REG, eDX_reg }
272 #define RMeSP { OP_REG, eSP_reg }
273 #define RMeBP { OP_REG, eBP_reg }
274 #define RMeSI { OP_REG, eSI_reg }
275 #define RMeDI { OP_REG, eDI_reg }
276 #define RMrAX { OP_REG, rAX_reg }
277 #define RMrBX { OP_REG, rBX_reg }
278 #define RMrCX { OP_REG, rCX_reg }
279 #define RMrDX { OP_REG, rDX_reg }
280 #define RMrSP { OP_REG, rSP_reg }
281 #define RMrBP { OP_REG, rBP_reg }
282 #define RMrSI { OP_REG, rSI_reg }
283 #define RMrDI { OP_REG, rDI_reg }
284 #define RMAL { OP_REG, al_reg }
285 #define RMAL { OP_REG, al_reg }
286 #define RMCL { OP_REG, cl_reg }
287 #define RMDL { OP_REG, dl_reg }
288 #define RMBL { OP_REG, bl_reg }
289 #define RMAH { OP_REG, ah_reg }
290 #define RMCH { OP_REG, ch_reg }
291 #define RMDH { OP_REG, dh_reg }
292 #define RMBH { OP_REG, bh_reg }
293 #define RMAX { OP_REG, ax_reg }
294 #define RMDX { OP_REG, dx_reg }
295
296 #define eAX { OP_IMREG, eAX_reg }
297 #define eBX { OP_IMREG, eBX_reg }
298 #define eCX { OP_IMREG, eCX_reg }
299 #define eDX { OP_IMREG, eDX_reg }
300 #define eSP { OP_IMREG, eSP_reg }
301 #define eBP { OP_IMREG, eBP_reg }
302 #define eSI { OP_IMREG, eSI_reg }
303 #define eDI { OP_IMREG, eDI_reg }
304 #define AL { OP_IMREG, al_reg }
305 #define CL { OP_IMREG, cl_reg }
306 #define DL { OP_IMREG, dl_reg }
307 #define BL { OP_IMREG, bl_reg }
308 #define AH { OP_IMREG, ah_reg }
309 #define CH { OP_IMREG, ch_reg }
310 #define DH { OP_IMREG, dh_reg }
311 #define BH { OP_IMREG, bh_reg }
312 #define AX { OP_IMREG, ax_reg }
313 #define DX { OP_IMREG, dx_reg }
314 #define zAX { OP_IMREG, z_mode_ax_reg }
315 #define indirDX { OP_IMREG, indir_dx_reg }
316
317 #define Sw { OP_SEG, w_mode }
318 #define Sv { OP_SEG, v_mode }
319 #define Ap { OP_DIR, 0 }
320 #define Ob { OP_OFF64, b_mode }
321 #define Ov { OP_OFF64, v_mode }
322 #define Xb { OP_DSreg, eSI_reg }
323 #define Xv { OP_DSreg, eSI_reg }
324 #define Xz { OP_DSreg, eSI_reg }
325 #define Yb { OP_ESreg, eDI_reg }
326 #define Yv { OP_ESreg, eDI_reg }
327 #define DSBX { OP_DSreg, eBX_reg }
328
329 #define es { OP_REG, es_reg }
330 #define ss { OP_REG, ss_reg }
331 #define cs { OP_REG, cs_reg }
332 #define ds { OP_REG, ds_reg }
333 #define fs { OP_REG, fs_reg }
334 #define gs { OP_REG, gs_reg }
335
336 #define MX { OP_MMX, 0 }
337 #define XM { OP_XMM, 0 }
338 #define XMM { OP_XMM, xmm_mode }
339 #define EM { OP_EM, v_mode }
340 #define EMS { OP_EM, v_swap_mode }
341 #define EMd { OP_EM, d_mode }
342 #define EMx { OP_EM, x_mode }
343 #define EXw { OP_EX, w_mode }
344 #define EXd { OP_EX, d_mode }
345 #define EXdS { OP_EX, d_swap_mode }
346 #define EXq { OP_EX, q_mode }
347 #define EXqS { OP_EX, q_swap_mode }
348 #define EXx { OP_EX, x_mode }
349 #define EXxS { OP_EX, x_swap_mode }
350 #define EXxmm { OP_EX, xmm_mode }
351 #define EXxmmq { OP_EX, xmmq_mode }
352 #define EXymmq { OP_EX, ymmq_mode }
353 #define EXVexWdq { OP_EX, vex_w_dq_mode }
354 #define MS { OP_MS, v_mode }
355 #define XS { OP_XS, v_mode }
356 #define EMCq { OP_EMC, q_mode }
357 #define MXC { OP_MXC, 0 }
358 #define OPSUF { OP_3DNowSuffix, 0 }
359 #define CMP { CMP_Fixup, 0 }
360 #define XMM0 { XMM_Fixup, 0 }
361 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
362 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
363
364 #define Vex { OP_VEX, vex_mode }
365 #define Vex128 { OP_VEX, vex128_mode }
366 #define Vex256 { OP_VEX, vex256_mode }
367 #define VexI4 { VEXI4_Fixup, 0}
368 #define EXdVex { OP_EX_Vex, d_mode }
369 #define EXdVexS { OP_EX_Vex, d_swap_mode }
370 #define EXqVex { OP_EX_Vex, q_mode }
371 #define EXqVexS { OP_EX_Vex, q_swap_mode }
372 #define EXVexW { OP_EX_VexW, x_mode }
373 #define EXdVexW { OP_EX_VexW, d_mode }
374 #define EXqVexW { OP_EX_VexW, q_mode }
375 #define XMVex { OP_XMM_Vex, 0 }
376 #define XMVexW { OP_XMM_VexW, 0 }
377 #define XMVexI4 { OP_REG_VexI4, x_mode }
378 #define PCLMUL { PCLMUL_Fixup, 0 }
379 #define VZERO { VZERO_Fixup, 0 }
380 #define VCMP { VCMP_Fixup, 0 }
381
382 /* Used handle "rep" prefix for string instructions.  */
383 #define Xbr { REP_Fixup, eSI_reg }
384 #define Xvr { REP_Fixup, eSI_reg }
385 #define Ybr { REP_Fixup, eDI_reg }
386 #define Yvr { REP_Fixup, eDI_reg }
387 #define Yzr { REP_Fixup, eDI_reg }
388 #define indirDXr { REP_Fixup, indir_dx_reg }
389 #define ALr { REP_Fixup, al_reg }
390 #define eAXr { REP_Fixup, eAX_reg }
391
392 #define cond_jump_flag { NULL, cond_jump_mode }
393 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
394
395 /* bits in sizeflag */
396 #define SUFFIX_ALWAYS 4
397 #define AFLAG 2
398 #define DFLAG 1
399
400 enum
401 {
402   /* byte operand */
403   b_mode = 1,
404   /* byte operand with operand swapped */
405   b_swap_mode,
406   /* operand size depends on prefixes */
407   v_mode,
408   /* operand size depends on prefixes with operand swapped */
409   v_swap_mode,
410   /* word operand */
411   w_mode,
412   /* double word operand  */
413   d_mode,
414   /* double word operand with operand swapped */
415   d_swap_mode,
416   /* quad word operand */
417   q_mode,
418   /* quad word operand with operand swapped */
419   q_swap_mode,
420   /* ten-byte operand */
421   t_mode,
422   /* 16-byte XMM or 32-byte YMM operand */
423   x_mode,
424   /* 16-byte XMM or 32-byte YMM operand with operand swapped */
425   x_swap_mode,
426   /* 16-byte XMM operand */
427   xmm_mode,
428   /* 16-byte XMM or quad word operand */
429   xmmq_mode,
430   /* 32-byte YMM or quad word operand */
431   ymmq_mode,
432   /* d_mode in 32bit, q_mode in 64bit mode.  */
433   m_mode,
434   /* pair of v_mode operands */
435   a_mode,
436   cond_jump_mode,
437   loop_jcxz_mode,
438   /* operand size depends on REX prefixes.  */
439   dq_mode,
440   /* registers like dq_mode, memory like w_mode.  */
441   dqw_mode,
442   /* 4- or 6-byte pointer operand */
443   f_mode,
444   const_1_mode,
445   /* v_mode for stack-related opcodes.  */
446   stack_v_mode,
447   /* non-quad operand size depends on prefixes */
448   z_mode,
449   /* 16-byte operand */
450   o_mode,
451   /* registers like dq_mode, memory like b_mode.  */
452   dqb_mode,
453   /* registers like dq_mode, memory like d_mode.  */
454   dqd_mode,
455   /* normal vex mode */
456   vex_mode,
457   /* 128bit vex mode */
458   vex128_mode,
459   /* 256bit vex mode */
460   vex256_mode,
461   /* operand size depends on the VEX.W bit.  */
462   vex_w_dq_mode,
463
464   es_reg,
465   cs_reg,
466   ss_reg,
467   ds_reg,
468   fs_reg,
469   gs_reg,
470
471   eAX_reg,
472   eCX_reg,
473   eDX_reg,
474   eBX_reg,
475   eSP_reg,
476   eBP_reg,
477   eSI_reg,
478   eDI_reg,
479
480   al_reg,
481   cl_reg,
482   dl_reg,
483   bl_reg,
484   ah_reg,
485   ch_reg,
486   dh_reg,
487   bh_reg,
488
489   ax_reg,
490   cx_reg,
491   dx_reg,
492   bx_reg,
493   sp_reg,
494   bp_reg,
495   si_reg,
496   di_reg,
497
498   rAX_reg,
499   rCX_reg,
500   rDX_reg,
501   rBX_reg,
502   rSP_reg,
503   rBP_reg,
504   rSI_reg,
505   rDI_reg,
506
507   z_mode_ax_reg,
508   indir_dx_reg
509 };
510
511 enum
512 {
513   FLOATCODE = 1,
514   USE_REG_TABLE,
515   USE_MOD_TABLE,
516   USE_RM_TABLE,
517   USE_PREFIX_TABLE,
518   USE_X86_64_TABLE,
519   USE_3BYTE_TABLE,
520   USE_XOP_8F_TABLE,
521   USE_VEX_C4_TABLE,
522   USE_VEX_C5_TABLE,
523   USE_VEX_LEN_TABLE
524 };
525
526 #define FLOAT                   NULL, { { NULL, FLOATCODE } }
527
528 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
529 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
530 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
531 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
532 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
533 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
534 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
535 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
536 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
537 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
538 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
539
540 enum
541 {
542   REG_80 = 0,
543   REG_81,
544   REG_82,
545   REG_8F,
546   REG_C0,
547   REG_C1,
548   REG_C6,
549   REG_C7,
550   REG_D0,
551   REG_D1,
552   REG_D2,
553   REG_D3,
554   REG_F6,
555   REG_F7,
556   REG_FE,
557   REG_FF,
558   REG_0F00,
559   REG_0F01,
560   REG_0F0D,
561   REG_0F18,
562   REG_0F71,
563   REG_0F72,
564   REG_0F73,
565   REG_0FA6,
566   REG_0FA7,
567   REG_0FAE,
568   REG_0FBA,
569   REG_0FC7,
570   REG_VEX_71,
571   REG_VEX_72,
572   REG_VEX_73,
573   REG_VEX_AE,
574   REG_XOP_LWPCB,
575   REG_XOP_LWP
576 };
577
578 enum
579 {
580   MOD_8D = 0,
581   MOD_0F01_REG_0,
582   MOD_0F01_REG_1,
583   MOD_0F01_REG_2,
584   MOD_0F01_REG_3,
585   MOD_0F01_REG_7,
586   MOD_0F12_PREFIX_0,
587   MOD_0F13,
588   MOD_0F16_PREFIX_0,
589   MOD_0F17,
590   MOD_0F18_REG_0,
591   MOD_0F18_REG_1,
592   MOD_0F18_REG_2,
593   MOD_0F18_REG_3,
594   MOD_0F20,
595   MOD_0F21,
596   MOD_0F22,
597   MOD_0F23,
598   MOD_0F24,
599   MOD_0F26,
600   MOD_0F2B_PREFIX_0,
601   MOD_0F2B_PREFIX_1,
602   MOD_0F2B_PREFIX_2,
603   MOD_0F2B_PREFIX_3,
604   MOD_0F51,
605   MOD_0F71_REG_2,
606   MOD_0F71_REG_4,
607   MOD_0F71_REG_6,
608   MOD_0F72_REG_2,
609   MOD_0F72_REG_4,
610   MOD_0F72_REG_6,
611   MOD_0F73_REG_2,
612   MOD_0F73_REG_3,
613   MOD_0F73_REG_6,
614   MOD_0F73_REG_7,
615   MOD_0FAE_REG_0,
616   MOD_0FAE_REG_1,
617   MOD_0FAE_REG_2,
618   MOD_0FAE_REG_3,
619   MOD_0FAE_REG_4,
620   MOD_0FAE_REG_5,
621   MOD_0FAE_REG_6,
622   MOD_0FAE_REG_7,
623   MOD_0FB2,
624   MOD_0FB4,
625   MOD_0FB5,
626   MOD_0FC7_REG_6,
627   MOD_0FC7_REG_7,
628   MOD_0FD7,
629   MOD_0FE7_PREFIX_2,
630   MOD_0FF0_PREFIX_3,
631   MOD_0F382A_PREFIX_2,
632   MOD_62_32BIT,
633   MOD_C4_32BIT,
634   MOD_C5_32BIT,
635   MOD_VEX_12_PREFIX_0,
636   MOD_VEX_13,
637   MOD_VEX_16_PREFIX_0,
638   MOD_VEX_17,
639   MOD_VEX_2B,
640   MOD_VEX_51,
641   MOD_VEX_71_REG_2,
642   MOD_VEX_71_REG_4,
643   MOD_VEX_71_REG_6,
644   MOD_VEX_72_REG_2,
645   MOD_VEX_72_REG_4,
646   MOD_VEX_72_REG_6,
647   MOD_VEX_73_REG_2,
648   MOD_VEX_73_REG_3,
649   MOD_VEX_73_REG_6,
650   MOD_VEX_73_REG_7,
651   MOD_VEX_AE_REG_2,
652   MOD_VEX_AE_REG_3,
653   MOD_VEX_D7_PREFIX_2,
654   MOD_VEX_E7_PREFIX_2,
655   MOD_VEX_F0_PREFIX_3,
656   MOD_VEX_3818_PREFIX_2,
657   MOD_VEX_3819_PREFIX_2,
658   MOD_VEX_381A_PREFIX_2,
659   MOD_VEX_382A_PREFIX_2,
660   MOD_VEX_382C_PREFIX_2,
661   MOD_VEX_382D_PREFIX_2,
662   MOD_VEX_382E_PREFIX_2,
663   MOD_VEX_382F_PREFIX_2
664 };
665
666 enum
667 {
668   RM_0F01_REG_0 = 0,
669   RM_0F01_REG_1,
670   RM_0F01_REG_2,
671   RM_0F01_REG_3,
672   RM_0F01_REG_7,
673   RM_0FAE_REG_5,
674   RM_0FAE_REG_6,
675   RM_0FAE_REG_7
676 };
677
678 enum
679 {
680   PREFIX_90 = 0,
681   PREFIX_0F10,
682   PREFIX_0F11,
683   PREFIX_0F12,
684   PREFIX_0F16,
685   PREFIX_0F2A,
686   PREFIX_0F2B,
687   PREFIX_0F2C,
688   PREFIX_0F2D,
689   PREFIX_0F2E,
690   PREFIX_0F2F,
691   PREFIX_0F51,
692   PREFIX_0F52,
693   PREFIX_0F53,
694   PREFIX_0F58,
695   PREFIX_0F59,
696   PREFIX_0F5A,
697   PREFIX_0F5B,
698   PREFIX_0F5C,
699   PREFIX_0F5D,
700   PREFIX_0F5E,
701   PREFIX_0F5F,
702   PREFIX_0F60,
703   PREFIX_0F61,
704   PREFIX_0F62,
705   PREFIX_0F6C,
706   PREFIX_0F6D,
707   PREFIX_0F6F,
708   PREFIX_0F70,
709   PREFIX_0F73_REG_3,
710   PREFIX_0F73_REG_7,
711   PREFIX_0F78,
712   PREFIX_0F79,
713   PREFIX_0F7C,
714   PREFIX_0F7D,
715   PREFIX_0F7E,
716   PREFIX_0F7F,
717   PREFIX_0FB8,
718   PREFIX_0FBD,
719   PREFIX_0FC2,
720   PREFIX_0FC3,
721   PREFIX_0FC7_REG_6,
722   PREFIX_0FD0,
723   PREFIX_0FD6,
724   PREFIX_0FE6,
725   PREFIX_0FE7,
726   PREFIX_0FF0,
727   PREFIX_0FF7,
728   PREFIX_0F3810,
729   PREFIX_0F3814,
730   PREFIX_0F3815,
731   PREFIX_0F3817,
732   PREFIX_0F3820,
733   PREFIX_0F3821,
734   PREFIX_0F3822,
735   PREFIX_0F3823,
736   PREFIX_0F3824,
737   PREFIX_0F3825,
738   PREFIX_0F3828,
739   PREFIX_0F3829,
740   PREFIX_0F382A,
741   PREFIX_0F382B,
742   PREFIX_0F3830,
743   PREFIX_0F3831,
744   PREFIX_0F3832,
745   PREFIX_0F3833,
746   PREFIX_0F3834,
747   PREFIX_0F3835,
748   PREFIX_0F3837,
749   PREFIX_0F3838,
750   PREFIX_0F3839,
751   PREFIX_0F383A,
752   PREFIX_0F383B,
753   PREFIX_0F383C,
754   PREFIX_0F383D,
755   PREFIX_0F383E,
756   PREFIX_0F383F,
757   PREFIX_0F3840,
758   PREFIX_0F3841,
759   PREFIX_0F3880,
760   PREFIX_0F3881,
761   PREFIX_0F38DB,
762   PREFIX_0F38DC,
763   PREFIX_0F38DD,
764   PREFIX_0F38DE,
765   PREFIX_0F38DF,
766   PREFIX_0F38F0,
767   PREFIX_0F38F1,
768   PREFIX_0F3A08,
769   PREFIX_0F3A09,
770   PREFIX_0F3A0A,
771   PREFIX_0F3A0B,
772   PREFIX_0F3A0C,
773   PREFIX_0F3A0D,
774   PREFIX_0F3A0E,
775   PREFIX_0F3A14,
776   PREFIX_0F3A15,
777   PREFIX_0F3A16,
778   PREFIX_0F3A17,
779   PREFIX_0F3A20,
780   PREFIX_0F3A21,
781   PREFIX_0F3A22,
782   PREFIX_0F3A40,
783   PREFIX_0F3A41,
784   PREFIX_0F3A42,
785   PREFIX_0F3A44,
786   PREFIX_0F3A60,
787   PREFIX_0F3A61,
788   PREFIX_0F3A62,
789   PREFIX_0F3A63,
790   PREFIX_0F3ADF,
791   PREFIX_VEX_10,
792   PREFIX_VEX_11,
793   PREFIX_VEX_12,
794   PREFIX_VEX_16,
795   PREFIX_VEX_2A,
796   PREFIX_VEX_2C,
797   PREFIX_VEX_2D,
798   PREFIX_VEX_2E,
799   PREFIX_VEX_2F,
800   PREFIX_VEX_51,
801   PREFIX_VEX_52,
802   PREFIX_VEX_53,
803   PREFIX_VEX_58,
804   PREFIX_VEX_59,
805   PREFIX_VEX_5A,
806   PREFIX_VEX_5B,
807   PREFIX_VEX_5C,
808   PREFIX_VEX_5D,
809   PREFIX_VEX_5E,
810   PREFIX_VEX_5F,
811   PREFIX_VEX_60,
812   PREFIX_VEX_61,
813   PREFIX_VEX_62,
814   PREFIX_VEX_63,
815   PREFIX_VEX_64,
816   PREFIX_VEX_65,
817   PREFIX_VEX_66,
818   PREFIX_VEX_67,
819   PREFIX_VEX_68,
820   PREFIX_VEX_69,
821   PREFIX_VEX_6A,
822   PREFIX_VEX_6B,
823   PREFIX_VEX_6C,
824   PREFIX_VEX_6D,
825   PREFIX_VEX_6E,
826   PREFIX_VEX_6F,
827   PREFIX_VEX_70,
828   PREFIX_VEX_71_REG_2,
829   PREFIX_VEX_71_REG_4,
830   PREFIX_VEX_71_REG_6,
831   PREFIX_VEX_72_REG_2,
832   PREFIX_VEX_72_REG_4,
833   PREFIX_VEX_72_REG_6,
834   PREFIX_VEX_73_REG_2,
835   PREFIX_VEX_73_REG_3,
836   PREFIX_VEX_73_REG_6,
837   PREFIX_VEX_73_REG_7,
838   PREFIX_VEX_74,
839   PREFIX_VEX_75,
840   PREFIX_VEX_76,
841   PREFIX_VEX_77,
842   PREFIX_VEX_7C,
843   PREFIX_VEX_7D,
844   PREFIX_VEX_7E,
845   PREFIX_VEX_7F,
846   PREFIX_VEX_C2,
847   PREFIX_VEX_C4,
848   PREFIX_VEX_C5,
849   PREFIX_VEX_D0,
850   PREFIX_VEX_D1,
851   PREFIX_VEX_D2,
852   PREFIX_VEX_D3,
853   PREFIX_VEX_D4,
854   PREFIX_VEX_D5,
855   PREFIX_VEX_D6,
856   PREFIX_VEX_D7,
857   PREFIX_VEX_D8,
858   PREFIX_VEX_D9,
859   PREFIX_VEX_DA,
860   PREFIX_VEX_DB,
861   PREFIX_VEX_DC,
862   PREFIX_VEX_DD,
863   PREFIX_VEX_DE,
864   PREFIX_VEX_DF,
865   PREFIX_VEX_E0,
866   PREFIX_VEX_E1,
867   PREFIX_VEX_E2,
868   PREFIX_VEX_E3,
869   PREFIX_VEX_E4,
870   PREFIX_VEX_E5,
871   PREFIX_VEX_E6,
872   PREFIX_VEX_E7,
873   PREFIX_VEX_E8,
874   PREFIX_VEX_E9,
875   PREFIX_VEX_EA,
876   PREFIX_VEX_EB,
877   PREFIX_VEX_EC,
878   PREFIX_VEX_ED,
879   PREFIX_VEX_EE,
880   PREFIX_VEX_EF,
881   PREFIX_VEX_F0,
882   PREFIX_VEX_F1,
883   PREFIX_VEX_F2,
884   PREFIX_VEX_F3,
885   PREFIX_VEX_F4,
886   PREFIX_VEX_F5,
887   PREFIX_VEX_F6,
888   PREFIX_VEX_F7,
889   PREFIX_VEX_F8,
890   PREFIX_VEX_F9,
891   PREFIX_VEX_FA,
892   PREFIX_VEX_FB,
893   PREFIX_VEX_FC,
894   PREFIX_VEX_FD,
895   PREFIX_VEX_FE,
896   PREFIX_VEX_3800,
897   PREFIX_VEX_3801,
898   PREFIX_VEX_3802,
899   PREFIX_VEX_3803,
900   PREFIX_VEX_3804,
901   PREFIX_VEX_3805,
902   PREFIX_VEX_3806,
903   PREFIX_VEX_3807,
904   PREFIX_VEX_3808,
905   PREFIX_VEX_3809,
906   PREFIX_VEX_380A,
907   PREFIX_VEX_380B,
908   PREFIX_VEX_380C,
909   PREFIX_VEX_380D,
910   PREFIX_VEX_380E,
911   PREFIX_VEX_380F,
912   PREFIX_VEX_3817,
913   PREFIX_VEX_3818,
914   PREFIX_VEX_3819,
915   PREFIX_VEX_381A,
916   PREFIX_VEX_381C,
917   PREFIX_VEX_381D,
918   PREFIX_VEX_381E,
919   PREFIX_VEX_3820,
920   PREFIX_VEX_3821,
921   PREFIX_VEX_3822,
922   PREFIX_VEX_3823,
923   PREFIX_VEX_3824,
924   PREFIX_VEX_3825,
925   PREFIX_VEX_3828,
926   PREFIX_VEX_3829,
927   PREFIX_VEX_382A,
928   PREFIX_VEX_382B,
929   PREFIX_VEX_382C,
930   PREFIX_VEX_382D,
931   PREFIX_VEX_382E,
932   PREFIX_VEX_382F,
933   PREFIX_VEX_3830,
934   PREFIX_VEX_3831,
935   PREFIX_VEX_3832,
936   PREFIX_VEX_3833,
937   PREFIX_VEX_3834,
938   PREFIX_VEX_3835,
939   PREFIX_VEX_3837,
940   PREFIX_VEX_3838,
941   PREFIX_VEX_3839,
942   PREFIX_VEX_383A,
943   PREFIX_VEX_383B,
944   PREFIX_VEX_383C,
945   PREFIX_VEX_383D,
946   PREFIX_VEX_383E,
947   PREFIX_VEX_383F,
948   PREFIX_VEX_3840,
949   PREFIX_VEX_3841,
950   PREFIX_VEX_3896,
951   PREFIX_VEX_3897,
952   PREFIX_VEX_3898,
953   PREFIX_VEX_3899,
954   PREFIX_VEX_389A,
955   PREFIX_VEX_389B,
956   PREFIX_VEX_389C,
957   PREFIX_VEX_389D,
958   PREFIX_VEX_389E,
959   PREFIX_VEX_389F,
960   PREFIX_VEX_38A6,
961   PREFIX_VEX_38A7,
962   PREFIX_VEX_38A8,
963   PREFIX_VEX_38A9,
964   PREFIX_VEX_38AA,
965   PREFIX_VEX_38AB,
966   PREFIX_VEX_38AC,
967   PREFIX_VEX_38AD,
968   PREFIX_VEX_38AE,
969   PREFIX_VEX_38AF,
970   PREFIX_VEX_38B6,
971   PREFIX_VEX_38B7,
972   PREFIX_VEX_38B8,
973   PREFIX_VEX_38B9,
974   PREFIX_VEX_38BA,
975   PREFIX_VEX_38BB,
976   PREFIX_VEX_38BC,
977   PREFIX_VEX_38BD,
978   PREFIX_VEX_38BE,
979   PREFIX_VEX_38BF,
980   PREFIX_VEX_38DB,
981   PREFIX_VEX_38DC,
982   PREFIX_VEX_38DD,
983   PREFIX_VEX_38DE,
984   PREFIX_VEX_38DF,
985   PREFIX_VEX_3A04,
986   PREFIX_VEX_3A05,
987   PREFIX_VEX_3A06,
988   PREFIX_VEX_3A08,
989   PREFIX_VEX_3A09,
990   PREFIX_VEX_3A0A,
991   PREFIX_VEX_3A0B,
992   PREFIX_VEX_3A0C,
993   PREFIX_VEX_3A0D,
994   PREFIX_VEX_3A0E,
995   PREFIX_VEX_3A0F,
996   PREFIX_VEX_3A14,
997   PREFIX_VEX_3A15,
998   PREFIX_VEX_3A16,
999   PREFIX_VEX_3A17,
1000   PREFIX_VEX_3A18,
1001   PREFIX_VEX_3A19,
1002   PREFIX_VEX_3A20,
1003   PREFIX_VEX_3A21,
1004   PREFIX_VEX_3A22,
1005   PREFIX_VEX_3A40,
1006   PREFIX_VEX_3A41,
1007   PREFIX_VEX_3A42,
1008   PREFIX_VEX_3A44,
1009   PREFIX_VEX_3A4A,
1010   PREFIX_VEX_3A4B,
1011   PREFIX_VEX_3A4C,
1012   PREFIX_VEX_3A5C,
1013   PREFIX_VEX_3A5D,
1014   PREFIX_VEX_3A5E,
1015   PREFIX_VEX_3A5F,
1016   PREFIX_VEX_3A60,
1017   PREFIX_VEX_3A61,
1018   PREFIX_VEX_3A62,
1019   PREFIX_VEX_3A63,
1020   PREFIX_VEX_3A68,
1021   PREFIX_VEX_3A69,
1022   PREFIX_VEX_3A6A,
1023   PREFIX_VEX_3A6B,
1024   PREFIX_VEX_3A6C,
1025   PREFIX_VEX_3A6D,
1026   PREFIX_VEX_3A6E,
1027   PREFIX_VEX_3A6F,
1028   PREFIX_VEX_3A78,
1029   PREFIX_VEX_3A79,
1030   PREFIX_VEX_3A7A,
1031   PREFIX_VEX_3A7B,
1032   PREFIX_VEX_3A7C,
1033   PREFIX_VEX_3A7D,
1034   PREFIX_VEX_3A7E,
1035   PREFIX_VEX_3A7F,
1036   PREFIX_VEX_3ADF
1037 };
1038
1039 enum
1040 {
1041   X86_64_06 = 0,
1042   X86_64_07,
1043   X86_64_0D,
1044   X86_64_16,
1045   X86_64_17,
1046   X86_64_1E,
1047   X86_64_1F,
1048   X86_64_27,
1049   X86_64_2F,
1050   X86_64_37,
1051   X86_64_3F,
1052   X86_64_60,
1053   X86_64_61,
1054   X86_64_62,
1055   X86_64_63,
1056   X86_64_6D,
1057   X86_64_6F,
1058   X86_64_9A,
1059   X86_64_C4,
1060   X86_64_C5,
1061   X86_64_CE,
1062   X86_64_D4,
1063   X86_64_D5,
1064   X86_64_EA,
1065   X86_64_0F01_REG_0,
1066   X86_64_0F01_REG_1,
1067   X86_64_0F01_REG_2,
1068   X86_64_0F01_REG_3
1069 };
1070
1071 enum
1072 {
1073   THREE_BYTE_0F38 = 0,
1074   THREE_BYTE_0F3A,
1075   THREE_BYTE_0F7A
1076 };
1077
1078 enum
1079 {
1080   XOP_08 = 0,
1081   XOP_09,
1082   XOP_0A
1083 };
1084
1085 enum
1086 {
1087   VEX_0F = 0,
1088   VEX_0F38,
1089   VEX_0F3A
1090 };
1091
1092 enum
1093 {
1094   VEX_LEN_10_P_1 = 0,
1095   VEX_LEN_10_P_3,
1096   VEX_LEN_11_P_1,
1097   VEX_LEN_11_P_3,
1098   VEX_LEN_12_P_0_M_0,
1099   VEX_LEN_12_P_0_M_1,
1100   VEX_LEN_12_P_2,
1101   VEX_LEN_13_M_0,
1102   VEX_LEN_16_P_0_M_0,
1103   VEX_LEN_16_P_0_M_1,
1104   VEX_LEN_16_P_2,
1105   VEX_LEN_17_M_0,
1106   VEX_LEN_2A_P_1,
1107   VEX_LEN_2A_P_3,
1108   VEX_LEN_2C_P_1,
1109   VEX_LEN_2C_P_3,
1110   VEX_LEN_2D_P_1,
1111   VEX_LEN_2D_P_3,
1112   VEX_LEN_2E_P_0,
1113   VEX_LEN_2E_P_2,
1114   VEX_LEN_2F_P_0,
1115   VEX_LEN_2F_P_2,
1116   VEX_LEN_51_P_1,
1117   VEX_LEN_51_P_3,
1118   VEX_LEN_52_P_1,
1119   VEX_LEN_53_P_1,
1120   VEX_LEN_58_P_1,
1121   VEX_LEN_58_P_3,
1122   VEX_LEN_59_P_1,
1123   VEX_LEN_59_P_3,
1124   VEX_LEN_5A_P_1,
1125   VEX_LEN_5A_P_3,
1126   VEX_LEN_5C_P_1,
1127   VEX_LEN_5C_P_3,
1128   VEX_LEN_5D_P_1,
1129   VEX_LEN_5D_P_3,
1130   VEX_LEN_5E_P_1,
1131   VEX_LEN_5E_P_3,
1132   VEX_LEN_5F_P_1,
1133   VEX_LEN_5F_P_3,
1134   VEX_LEN_60_P_2,
1135   VEX_LEN_61_P_2,
1136   VEX_LEN_62_P_2,
1137   VEX_LEN_63_P_2,
1138   VEX_LEN_64_P_2,
1139   VEX_LEN_65_P_2,
1140   VEX_LEN_66_P_2,
1141   VEX_LEN_67_P_2,
1142   VEX_LEN_68_P_2,
1143   VEX_LEN_69_P_2,
1144   VEX_LEN_6A_P_2,
1145   VEX_LEN_6B_P_2,
1146   VEX_LEN_6C_P_2,
1147   VEX_LEN_6D_P_2,
1148   VEX_LEN_6E_P_2,
1149   VEX_LEN_70_P_1,
1150   VEX_LEN_70_P_2,
1151   VEX_LEN_70_P_3,
1152   VEX_LEN_71_R_2_P_2,
1153   VEX_LEN_71_R_4_P_2,
1154   VEX_LEN_71_R_6_P_2,
1155   VEX_LEN_72_R_2_P_2,
1156   VEX_LEN_72_R_4_P_2,
1157   VEX_LEN_72_R_6_P_2,
1158   VEX_LEN_73_R_2_P_2,
1159   VEX_LEN_73_R_3_P_2,
1160   VEX_LEN_73_R_6_P_2,
1161   VEX_LEN_73_R_7_P_2,
1162   VEX_LEN_74_P_2,
1163   VEX_LEN_75_P_2,
1164   VEX_LEN_76_P_2,
1165   VEX_LEN_7E_P_1,
1166   VEX_LEN_7E_P_2,
1167   VEX_LEN_AE_R_2_M_0,
1168   VEX_LEN_AE_R_3_M_0,
1169   VEX_LEN_C2_P_1,
1170   VEX_LEN_C2_P_3,
1171   VEX_LEN_C4_P_2,
1172   VEX_LEN_C5_P_2,
1173   VEX_LEN_D1_P_2,
1174   VEX_LEN_D2_P_2,
1175   VEX_LEN_D3_P_2,
1176   VEX_LEN_D4_P_2,
1177   VEX_LEN_D5_P_2,
1178   VEX_LEN_D6_P_2,
1179   VEX_LEN_D7_P_2_M_1,
1180   VEX_LEN_D8_P_2,
1181   VEX_LEN_D9_P_2,
1182   VEX_LEN_DA_P_2,
1183   VEX_LEN_DB_P_2,
1184   VEX_LEN_DC_P_2,
1185   VEX_LEN_DD_P_2,
1186   VEX_LEN_DE_P_2,
1187   VEX_LEN_DF_P_2,
1188   VEX_LEN_E0_P_2,
1189   VEX_LEN_E1_P_2,
1190   VEX_LEN_E2_P_2,
1191   VEX_LEN_E3_P_2,
1192   VEX_LEN_E4_P_2,
1193   VEX_LEN_E5_P_2,
1194   VEX_LEN_E8_P_2,
1195   VEX_LEN_E9_P_2,
1196   VEX_LEN_EA_P_2,
1197   VEX_LEN_EB_P_2,
1198   VEX_LEN_EC_P_2,
1199   VEX_LEN_ED_P_2,
1200   VEX_LEN_EE_P_2,
1201   VEX_LEN_EF_P_2,
1202   VEX_LEN_F1_P_2,
1203   VEX_LEN_F2_P_2,
1204   VEX_LEN_F3_P_2,
1205   VEX_LEN_F4_P_2,
1206   VEX_LEN_F5_P_2,
1207   VEX_LEN_F6_P_2,
1208   VEX_LEN_F7_P_2,
1209   VEX_LEN_F8_P_2,
1210   VEX_LEN_F9_P_2,
1211   VEX_LEN_FA_P_2,
1212   VEX_LEN_FB_P_2,
1213   VEX_LEN_FC_P_2,
1214   VEX_LEN_FD_P_2,
1215   VEX_LEN_FE_P_2,
1216   VEX_LEN_3800_P_2,
1217   VEX_LEN_3801_P_2,
1218   VEX_LEN_3802_P_2,
1219   VEX_LEN_3803_P_2,
1220   VEX_LEN_3804_P_2,
1221   VEX_LEN_3805_P_2,
1222   VEX_LEN_3806_P_2,
1223   VEX_LEN_3807_P_2,
1224   VEX_LEN_3808_P_2,
1225   VEX_LEN_3809_P_2,
1226   VEX_LEN_380A_P_2,
1227   VEX_LEN_380B_P_2,
1228   VEX_LEN_3819_P_2_M_0,
1229   VEX_LEN_381A_P_2_M_0,
1230   VEX_LEN_381C_P_2,
1231   VEX_LEN_381D_P_2,
1232   VEX_LEN_381E_P_2,
1233   VEX_LEN_3820_P_2,
1234   VEX_LEN_3821_P_2,
1235   VEX_LEN_3822_P_2,
1236   VEX_LEN_3823_P_2,
1237   VEX_LEN_3824_P_2,
1238   VEX_LEN_3825_P_2,
1239   VEX_LEN_3828_P_2,
1240   VEX_LEN_3829_P_2,
1241   VEX_LEN_382A_P_2_M_0,
1242   VEX_LEN_382B_P_2,
1243   VEX_LEN_3830_P_2,
1244   VEX_LEN_3831_P_2,
1245   VEX_LEN_3832_P_2,
1246   VEX_LEN_3833_P_2,
1247   VEX_LEN_3834_P_2,
1248   VEX_LEN_3835_P_2,
1249   VEX_LEN_3837_P_2,
1250   VEX_LEN_3838_P_2,
1251   VEX_LEN_3839_P_2,
1252   VEX_LEN_383A_P_2,
1253   VEX_LEN_383B_P_2,
1254   VEX_LEN_383C_P_2,
1255   VEX_LEN_383D_P_2,
1256   VEX_LEN_383E_P_2,
1257   VEX_LEN_383F_P_2,
1258   VEX_LEN_3840_P_2,
1259   VEX_LEN_3841_P_2,
1260   VEX_LEN_38DB_P_2,
1261   VEX_LEN_38DC_P_2,
1262   VEX_LEN_38DD_P_2,
1263   VEX_LEN_38DE_P_2,
1264   VEX_LEN_38DF_P_2,
1265   VEX_LEN_3A06_P_2,
1266   VEX_LEN_3A0A_P_2,
1267   VEX_LEN_3A0B_P_2,
1268   VEX_LEN_3A0E_P_2,
1269   VEX_LEN_3A0F_P_2,
1270   VEX_LEN_3A14_P_2,
1271   VEX_LEN_3A15_P_2,
1272   VEX_LEN_3A16_P_2,
1273   VEX_LEN_3A17_P_2,
1274   VEX_LEN_3A18_P_2,
1275   VEX_LEN_3A19_P_2,
1276   VEX_LEN_3A20_P_2,
1277   VEX_LEN_3A21_P_2,
1278   VEX_LEN_3A22_P_2,
1279   VEX_LEN_3A41_P_2,
1280   VEX_LEN_3A42_P_2,
1281   VEX_LEN_3A44_P_2,
1282   VEX_LEN_3A4C_P_2,
1283   VEX_LEN_3A60_P_2,
1284   VEX_LEN_3A61_P_2,
1285   VEX_LEN_3A62_P_2,
1286   VEX_LEN_3A63_P_2,
1287   VEX_LEN_3A6A_P_2,
1288   VEX_LEN_3A6B_P_2,
1289   VEX_LEN_3A6E_P_2,
1290   VEX_LEN_3A6F_P_2,
1291   VEX_LEN_3A7A_P_2,
1292   VEX_LEN_3A7B_P_2,
1293   VEX_LEN_3A7E_P_2,
1294   VEX_LEN_3A7F_P_2,
1295   VEX_LEN_3ADF_P_2,
1296   VEX_LEN_XOP_08_A0,
1297   VEX_LEN_XOP_08_A1,
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     { VEX_LEN_TABLE (VEX_LEN_XOP_08_A0) },
6577     { VEX_LEN_TABLE (VEX_LEN_XOP_08_A1) },
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_51) },
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   /* VEX_LEN_XOP_08_A0 */
9357   {
9358     { "vcvtph2ps", { XM, EXq, Ib } },
9359     { "vcvtph2ps", { XM, EXxmm, Ib } },
9360   },
9361   /* VEX_LEN_XOP_08_A1 */
9362   {
9363     { "vcvtps2ph", { EXq, XM, Ib } },
9364     { "vcvtps2ph", { EXxmm, XM, Ib } },
9365   },
9366   /* VEX_LEN_XOP_09_80 */
9367   {
9368     { "vfrczps", { XM, EXxmm } },
9369     { "vfrczps", { XM, EXymmq } },
9370   },
9371   /* VEX_LEN_XOP_09_81 */
9372   {
9373     { "vfrczpd", { XM, EXxmm } },
9374     { "vfrczpd", { XM, EXymmq } },
9375   },
9376 };
9377
9378 static const struct dis386 mod_table[][2] = {
9379   {
9380     /* MOD_8D */
9381     { "leaS",           { Gv, M } },
9382     { "(bad)",          { XX } },
9383   },
9384   {
9385     /* MOD_0F01_REG_0 */
9386     { X86_64_TABLE (X86_64_0F01_REG_0) },
9387     { RM_TABLE (RM_0F01_REG_0) },
9388   },
9389   {
9390     /* MOD_0F01_REG_1 */
9391     { X86_64_TABLE (X86_64_0F01_REG_1) },
9392     { RM_TABLE (RM_0F01_REG_1) },
9393   },
9394   {
9395     /* MOD_0F01_REG_2 */
9396     { X86_64_TABLE (X86_64_0F01_REG_2) },
9397     { RM_TABLE (RM_0F01_REG_2) },
9398   },
9399   {
9400     /* MOD_0F01_REG_3 */
9401     { X86_64_TABLE (X86_64_0F01_REG_3) },
9402     { RM_TABLE (RM_0F01_REG_3) },
9403   },
9404   {
9405     /* MOD_0F01_REG_7 */
9406     { "invlpg",         { Mb } },
9407     { RM_TABLE (RM_0F01_REG_7) },
9408   },
9409   {
9410     /* MOD_0F12_PREFIX_0 */
9411     { "movlps",         { XM, EXq } },
9412     { "movhlps",        { XM, EXq } },
9413   },
9414   {
9415     /* MOD_0F13 */
9416     { "movlpX",         { EXq, XM } },
9417     { "(bad)",          { XX } },
9418   },
9419   {
9420     /* MOD_0F16_PREFIX_0 */
9421     { "movhps",         { XM, EXq } },
9422     { "movlhps",        { XM, EXq } },
9423   },
9424   {
9425     /* MOD_0F17 */
9426     { "movhpX",         { EXq, XM } },
9427     { "(bad)",          { XX } },
9428   },
9429   {
9430     /* MOD_0F18_REG_0 */
9431     { "prefetchnta",    { Mb } },
9432     { "(bad)",          { XX } },
9433   },
9434   {
9435     /* MOD_0F18_REG_1 */
9436     { "prefetcht0",     { Mb } },
9437     { "(bad)",          { XX } },
9438   },
9439   {
9440     /* MOD_0F18_REG_2 */
9441     { "prefetcht1",     { Mb } },
9442     { "(bad)",          { XX } },
9443   },
9444   {
9445     /* MOD_0F18_REG_3 */
9446     { "prefetcht2",     { Mb } },
9447     { "(bad)",          { XX } },
9448   },
9449   {
9450     /* MOD_0F20 */
9451     { "(bad)",          { XX } },
9452     { "movZ",           { Rm, Cm } },
9453   },
9454   {
9455     /* MOD_0F21 */
9456     { "(bad)",          { XX } },
9457     { "movZ",           { Rm, Dm } },
9458   },
9459   {
9460     /* MOD_0F22 */
9461     { "(bad)",          { XX } },
9462     { "movZ",           { Cm, Rm } },
9463   },
9464   {
9465     /* MOD_0F23 */
9466     { "(bad)",          { XX } },
9467     { "movZ",           { Dm, Rm } },
9468   },
9469   {
9470     /* MOD_0F24 */
9471     { "(bad)",          { XX } },    
9472     { "movL",           { Rd, Td } },
9473   },
9474   {
9475     /* MOD_0F26 */
9476     { "(bad)",          { XX } },
9477     { "movL",           { Td, Rd } },
9478   },
9479   {
9480     /* MOD_0F2B_PREFIX_0 */
9481     {"movntps",         { Mx, XM } },
9482     { "(bad)",          { XX } },
9483   },
9484   {
9485     /* MOD_0F2B_PREFIX_1 */
9486     {"movntss",         { Md, XM } },
9487     { "(bad)",          { XX } },
9488   },
9489   {
9490     /* MOD_0F2B_PREFIX_2 */
9491     {"movntpd",         { Mx, XM } },
9492     { "(bad)",          { XX } },
9493   },
9494   {
9495     /* MOD_0F2B_PREFIX_3 */
9496     {"movntsd",         { Mq, XM } },
9497     { "(bad)",          { XX } },
9498   },
9499   {
9500     /* MOD_0F51 */
9501     { "(bad)",          { XX } },
9502     { "movmskpX",       { Gdq, XS } },
9503   },
9504   {
9505     /* MOD_0F71_REG_2 */
9506     { "(bad)",          { XX } },
9507     { "psrlw",          { MS, Ib } },
9508   },
9509   {
9510     /* MOD_0F71_REG_4 */
9511     { "(bad)",          { XX } },
9512     { "psraw",          { MS, Ib } },
9513   },
9514   {
9515     /* MOD_0F71_REG_6 */
9516     { "(bad)",          { XX } },
9517     { "psllw",          { MS, Ib } },
9518   },
9519   {
9520     /* MOD_0F72_REG_2 */
9521     { "(bad)",          { XX } },
9522     { "psrld",          { MS, Ib } },
9523   },
9524   {
9525     /* MOD_0F72_REG_4 */
9526     { "(bad)",          { XX } },
9527     { "psrad",          { MS, Ib } },
9528   },
9529   {
9530     /* MOD_0F72_REG_6 */
9531     { "(bad)",          { XX } },
9532     { "pslld",          { MS, Ib } },
9533   },
9534   {
9535     /* MOD_0F73_REG_2 */
9536     { "(bad)",          { XX } },
9537     { "psrlq",          { MS, Ib } },
9538   },
9539   {
9540     /* MOD_0F73_REG_3 */
9541     { "(bad)",          { XX } },
9542     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
9543   },
9544   {
9545     /* MOD_0F73_REG_6 */
9546     { "(bad)",          { XX } },
9547     { "psllq",          { MS, Ib } },
9548   },
9549   {
9550     /* MOD_0F73_REG_7 */
9551     { "(bad)",          { XX } },
9552     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
9553   },
9554   {
9555     /* MOD_0FAE_REG_0 */
9556     { "fxsave",         { M } },
9557     { "(bad)",          { XX } },
9558   },
9559   {
9560     /* MOD_0FAE_REG_1 */
9561     { "fxrstor",        { M } },
9562     { "(bad)",          { XX } },
9563   },
9564   {
9565     /* MOD_0FAE_REG_2 */
9566     { "ldmxcsr",        { Md } },
9567     { "(bad)",          { XX } },
9568   },
9569   {
9570     /* MOD_0FAE_REG_3 */
9571     { "stmxcsr",        { Md } },
9572     { "(bad)",          { XX } },
9573   },
9574   {
9575     /* MOD_0FAE_REG_4 */
9576     { "xsave",          { M } },
9577     { "(bad)",          { XX } },
9578   },
9579   {
9580     /* MOD_0FAE_REG_5 */
9581     { "xrstor",         { M } },
9582     { RM_TABLE (RM_0FAE_REG_5) },
9583   },
9584   {
9585     /* MOD_0FAE_REG_6 */
9586     { "xsaveopt",       { M } },
9587     { RM_TABLE (RM_0FAE_REG_6) },
9588   },
9589   {
9590     /* MOD_0FAE_REG_7 */
9591     { "clflush",        { Mb } },
9592     { RM_TABLE (RM_0FAE_REG_7) },
9593   },
9594   {
9595     /* MOD_0FB2 */
9596     { "lssS",           { Gv, Mp } },
9597     { "(bad)",          { XX } },
9598   },
9599   {
9600     /* MOD_0FB4 */
9601     { "lfsS",           { Gv, Mp } },
9602     { "(bad)",          { XX } },
9603   },
9604   {
9605     /* MOD_0FB5 */
9606     { "lgsS",           { Gv, Mp } },
9607     { "(bad)",          { XX } },
9608   },
9609   {
9610     /* MOD_0FC7_REG_6 */
9611     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
9612     { "(bad)",          { XX } },
9613   },
9614   {
9615     /* MOD_0FC7_REG_7 */
9616     { "vmptrst",        { Mq } },
9617     { "(bad)",          { XX } },
9618   },
9619   {
9620     /* MOD_0FD7 */
9621     { "(bad)",          { XX } },
9622     { "pmovmskb",       { Gdq, MS } },
9623   },
9624   {
9625     /* MOD_0FE7_PREFIX_2 */
9626     { "movntdq",        { Mx, XM } },
9627     { "(bad)",          { XX } },
9628   },
9629   {
9630     /* MOD_0FF0_PREFIX_3 */
9631     { "lddqu",          { XM, M } },
9632     { "(bad)",          { XX } },
9633   },
9634   {
9635     /* MOD_0F382A_PREFIX_2 */
9636     { "movntdqa",       { XM, Mx } },
9637     { "(bad)",          { XX } },
9638   },
9639   {
9640     /* MOD_62_32BIT */
9641     { "bound{S|}",      { Gv, Ma } },
9642     { "(bad)",          { XX } },
9643   },
9644   {
9645     /* MOD_C4_32BIT */
9646     { "lesS",           { Gv, Mp } },
9647     { VEX_C4_TABLE (VEX_0F) },
9648   },
9649   {
9650     /* MOD_C5_32BIT */
9651     { "ldsS",           { Gv, Mp } },
9652     { VEX_C5_TABLE (VEX_0F) },
9653   },
9654   {
9655     /* MOD_VEX_12_PREFIX_0 */
9656     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
9657     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
9658   },
9659   {
9660     /* MOD_VEX_13 */
9661     { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
9662     { "(bad)",          { XX } },
9663   },
9664   {
9665     /* MOD_VEX_16_PREFIX_0 */
9666     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
9667     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
9668   },
9669   {
9670     /* MOD_VEX_17 */
9671     { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
9672     { "(bad)",          { XX } },
9673   },
9674   {
9675     /* MOD_VEX_2B */
9676     { "vmovntpX",       { Mx, XM } },
9677     { "(bad)",          { XX } },
9678   },
9679   {
9680     /* MOD_VEX_51 */
9681     { "(bad)",          { XX } },
9682     { "vmovmskpX",      { Gdq, XS } },
9683   },
9684   {
9685     /* MOD_VEX_71_REG_2 */
9686     { "(bad)",          { XX } },
9687     { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
9688   },
9689   {
9690     /* MOD_VEX_71_REG_4 */
9691     { "(bad)",          { XX } },
9692     { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
9693   },
9694   {
9695     /* MOD_VEX_71_REG_6 */
9696     { "(bad)",          { XX } },
9697     { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
9698   },
9699   {
9700     /* MOD_VEX_72_REG_2 */
9701     { "(bad)",          { XX } },
9702     { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
9703   },
9704   {
9705     /* MOD_VEX_72_REG_4 */
9706     { "(bad)",          { XX } },
9707     { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
9708   },
9709   {
9710     /* MOD_VEX_72_REG_6 */
9711     { "(bad)",          { XX } },
9712     { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
9713   },
9714   {
9715     /* MOD_VEX_73_REG_2 */
9716     { "(bad)",          { XX } },
9717     { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
9718   },
9719   {
9720     /* MOD_VEX_73_REG_3 */
9721     { "(bad)",          { XX } },
9722     { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
9723   },
9724   {
9725     /* MOD_VEX_73_REG_6 */
9726     { "(bad)",          { XX } },
9727     { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
9728   },
9729   {
9730     /* MOD_VEX_73_REG_7 */
9731     { "(bad)",          { XX } },
9732     { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
9733   },
9734   {
9735     /* MOD_VEX_AE_REG_2 */
9736     { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
9737     { "(bad)",          { XX } },
9738   },
9739   {
9740     /* MOD_VEX_AE_REG_3 */
9741     { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
9742     { "(bad)",          { XX } },
9743   },
9744   {
9745     /* MOD_VEX_D7_PREFIX_2 */
9746     { "(bad)",          { XX } },
9747     { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
9748   },
9749   {
9750     /* MOD_VEX_E7_PREFIX_2 */
9751     { "vmovntdq",       { Mx, XM } },
9752     { "(bad)",          { XX } },
9753   },
9754   {
9755     /* MOD_VEX_F0_PREFIX_3 */
9756     { "vlddqu",         { XM, M } },
9757     { "(bad)",          { XX } },
9758   },
9759   {
9760     /* MOD_VEX_3818_PREFIX_2 */
9761     { "vbroadcastss",   { XM, Md } },
9762     { "(bad)",          { XX } },
9763   },
9764   {
9765     /* MOD_VEX_3819_PREFIX_2 */
9766     { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
9767     { "(bad)",          { XX } },
9768   },
9769   {
9770     /* MOD_VEX_381A_PREFIX_2 */
9771     { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
9772     { "(bad)",          { XX } },
9773   },
9774   {
9775     /* MOD_VEX_382A_PREFIX_2 */
9776     { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
9777     { "(bad)",          { XX } },
9778   },
9779   {
9780     /* MOD_VEX_382C_PREFIX_2 */
9781     { "vmaskmovps",     { XM, Vex, Mx } },
9782     { "(bad)",          { XX } },
9783   },
9784   {
9785     /* MOD_VEX_382D_PREFIX_2 */
9786     { "vmaskmovpd",     { XM, Vex, Mx } },
9787     { "(bad)",          { XX } },
9788   },
9789   {
9790     /* MOD_VEX_382E_PREFIX_2 */
9791     { "vmaskmovps",     { Mx, Vex, XM } },
9792     { "(bad)",          { XX } },
9793   },
9794   {
9795     /* MOD_VEX_382F_PREFIX_2 */
9796     { "vmaskmovpd",     { Mx, Vex, XM } },
9797     { "(bad)",          { XX } },
9798   },
9799 };
9800
9801 static const struct dis386 rm_table[][8] = {
9802   {
9803     /* RM_0F01_REG_0 */
9804     { "(bad)",          { XX } },
9805     { "vmcall",         { Skip_MODRM } },
9806     { "vmlaunch",       { Skip_MODRM } },
9807     { "vmresume",       { Skip_MODRM } },
9808     { "vmxoff",         { Skip_MODRM } },
9809     { "(bad)",          { XX } },
9810     { "(bad)",          { XX } },
9811     { "(bad)",          { XX } },
9812   },
9813   {
9814     /* RM_0F01_REG_1 */
9815     { "monitor",        { { OP_Monitor, 0 } } },
9816     { "mwait",          { { OP_Mwait, 0 } } },
9817     { "(bad)",          { XX } },
9818     { "(bad)",          { XX } },
9819     { "(bad)",          { XX } },
9820     { "(bad)",          { XX } },
9821     { "(bad)",          { XX } },
9822     { "(bad)",          { XX } },
9823   },
9824   {
9825     /* RM_0F01_REG_2 */
9826     { "xgetbv",         { Skip_MODRM } },
9827     { "xsetbv",         { Skip_MODRM } },
9828     { "(bad)",          { XX } },
9829     { "(bad)",          { XX } },
9830     { "(bad)",          { XX } },
9831     { "(bad)",          { XX } },
9832     { "(bad)",          { XX } },
9833     { "(bad)",          { XX } },
9834   },
9835   {
9836     /* RM_0F01_REG_3 */
9837     { "vmrun",          { Skip_MODRM } },
9838     { "vmmcall",        { Skip_MODRM } },
9839     { "vmload",         { Skip_MODRM } },
9840     { "vmsave",         { Skip_MODRM } },
9841     { "stgi",           { Skip_MODRM } },
9842     { "clgi",           { Skip_MODRM } },
9843     { "skinit",         { Skip_MODRM } },
9844     { "invlpga",        { Skip_MODRM } },
9845   },
9846   {
9847     /* RM_0F01_REG_7 */
9848     { "swapgs",         { Skip_MODRM } },
9849     { "rdtscp",         { Skip_MODRM } },
9850     { "(bad)",          { XX } },
9851     { "(bad)",          { XX } },
9852     { "(bad)",          { XX } },
9853     { "(bad)",          { XX } },
9854     { "(bad)",          { XX } },
9855     { "(bad)",          { XX } },
9856   },
9857   {
9858     /* RM_0FAE_REG_5 */
9859     { "lfence",         { Skip_MODRM } },
9860     { "(bad)",          { XX } },
9861     { "(bad)",          { XX } },
9862     { "(bad)",          { XX } },
9863     { "(bad)",          { XX } },
9864     { "(bad)",          { XX } },
9865     { "(bad)",          { XX } },
9866     { "(bad)",          { XX } },
9867   },
9868   {
9869     /* RM_0FAE_REG_6 */
9870     { "mfence",         { Skip_MODRM } },
9871     { "(bad)",          { XX } },
9872     { "(bad)",          { XX } },
9873     { "(bad)",          { XX } },
9874     { "(bad)",          { XX } },
9875     { "(bad)",          { XX } },
9876     { "(bad)",          { XX } },
9877     { "(bad)",          { XX } },
9878   },
9879   {
9880     /* RM_0FAE_REG_7 */
9881     { "sfence",         { Skip_MODRM } },
9882     { "(bad)",          { XX } },
9883     { "(bad)",          { XX } },
9884     { "(bad)",          { XX } },
9885     { "(bad)",          { XX } },
9886     { "(bad)",          { XX } },
9887     { "(bad)",          { XX } },
9888     { "(bad)",          { XX } },
9889   },
9890 };
9891
9892 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
9893
9894 /* We use the high bit to indicate different name for the same
9895    prefix.  */
9896 #define ADDR16_PREFIX   (0x67 | 0x100)
9897 #define ADDR32_PREFIX   (0x67 | 0x200)
9898 #define DATA16_PREFIX   (0x66 | 0x100)
9899 #define DATA32_PREFIX   (0x66 | 0x200)
9900 #define REP_PREFIX      (0xf3 | 0x100)
9901
9902 static int
9903 ckprefix (void)
9904 {
9905   int newrex, i, length;
9906   rex = 0;
9907   rex_original = 0;
9908   rex_ignored = 0;
9909   prefixes = 0;
9910   used_prefixes = 0;
9911   rex_used = 0;
9912   last_lock_prefix = -1;
9913   last_repz_prefix = -1;
9914   last_repnz_prefix = -1;
9915   last_data_prefix = -1;
9916   last_addr_prefix = -1;
9917   last_rex_prefix = -1;
9918   last_seg_prefix = -1;
9919   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
9920     all_prefixes[i] = 0;
9921   i = 0;
9922   length = 0;
9923   /* The maximum instruction length is 15bytes.  */
9924   while (length < MAX_CODE_LENGTH - 1)
9925     {
9926       FETCH_DATA (the_info, codep + 1);
9927       newrex = 0;
9928       switch (*codep)
9929         {
9930         /* REX prefixes family.  */
9931         case 0x40:
9932         case 0x41:
9933         case 0x42:
9934         case 0x43:
9935         case 0x44:
9936         case 0x45:
9937         case 0x46:
9938         case 0x47:
9939         case 0x48:
9940         case 0x49:
9941         case 0x4a:
9942         case 0x4b:
9943         case 0x4c:
9944         case 0x4d:
9945         case 0x4e:
9946         case 0x4f:
9947           if (address_mode == mode_64bit)
9948             newrex = *codep;
9949           else
9950             return 1;
9951           last_rex_prefix = i;
9952           break;
9953         case 0xf3:
9954           prefixes |= PREFIX_REPZ;
9955           last_repz_prefix = i;
9956           break;
9957         case 0xf2:
9958           prefixes |= PREFIX_REPNZ;
9959           last_repnz_prefix = i;
9960           break;
9961         case 0xf0:
9962           prefixes |= PREFIX_LOCK;
9963           last_lock_prefix = i;
9964           break;
9965         case 0x2e:
9966           prefixes |= PREFIX_CS;
9967           last_seg_prefix = i;
9968           break;
9969         case 0x36:
9970           prefixes |= PREFIX_SS;
9971           last_seg_prefix = i;
9972           break;
9973         case 0x3e:
9974           prefixes |= PREFIX_DS;
9975           last_seg_prefix = i;
9976           break;
9977         case 0x26:
9978           prefixes |= PREFIX_ES;
9979           last_seg_prefix = i;
9980           break;
9981         case 0x64:
9982           prefixes |= PREFIX_FS;
9983           last_seg_prefix = i;
9984           break;
9985         case 0x65:
9986           prefixes |= PREFIX_GS;
9987           last_seg_prefix = i;
9988           break;
9989         case 0x66:
9990           prefixes |= PREFIX_DATA;
9991           last_data_prefix = i;
9992           break;
9993         case 0x67:
9994           prefixes |= PREFIX_ADDR;
9995           last_addr_prefix = i;
9996           break;
9997         case FWAIT_OPCODE:
9998           /* fwait is really an instruction.  If there are prefixes
9999              before the fwait, they belong to the fwait, *not* to the
10000              following instruction.  */
10001           if (prefixes || rex)
10002             {
10003               prefixes |= PREFIX_FWAIT;
10004               codep++;
10005               return 1;
10006             }
10007           prefixes = PREFIX_FWAIT;
10008           break;
10009         default:
10010           return 1;
10011         }
10012       /* Rex is ignored when followed by another prefix.  */
10013       if (rex)
10014         {
10015           rex_used = rex;
10016           return 1;
10017         }
10018       if (*codep != FWAIT_OPCODE)
10019         all_prefixes[i++] = *codep;
10020       rex = newrex;
10021       rex_original = rex;
10022       codep++;
10023       length++;
10024     }
10025   return 0;
10026 }
10027
10028 static int
10029 seg_prefix (int pref)
10030 {
10031   switch (pref)
10032     {
10033     case 0x2e:
10034       return PREFIX_CS;
10035     case 0x36:
10036       return PREFIX_SS;
10037     case 0x3e:
10038       return PREFIX_DS;
10039     case 0x26:
10040       return PREFIX_ES;
10041     case 0x64:
10042       return PREFIX_FS;
10043     case 0x65:
10044       return PREFIX_GS;
10045     default:
10046       return 0;
10047     }
10048 }
10049
10050 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10051    prefix byte.  */
10052
10053 static const char *
10054 prefix_name (int pref, int sizeflag)
10055 {
10056   static const char *rexes [16] =
10057     {
10058       "rex",            /* 0x40 */
10059       "rex.B",          /* 0x41 */
10060       "rex.X",          /* 0x42 */
10061       "rex.XB",         /* 0x43 */
10062       "rex.R",          /* 0x44 */
10063       "rex.RB",         /* 0x45 */
10064       "rex.RX",         /* 0x46 */
10065       "rex.RXB",        /* 0x47 */
10066       "rex.W",          /* 0x48 */
10067       "rex.WB",         /* 0x49 */
10068       "rex.WX",         /* 0x4a */
10069       "rex.WXB",        /* 0x4b */
10070       "rex.WR",         /* 0x4c */
10071       "rex.WRB",        /* 0x4d */
10072       "rex.WRX",        /* 0x4e */
10073       "rex.WRXB",       /* 0x4f */
10074     };
10075
10076   switch (pref)
10077     {
10078     /* REX prefixes family.  */
10079     case 0x40:
10080     case 0x41:
10081     case 0x42:
10082     case 0x43:
10083     case 0x44:
10084     case 0x45:
10085     case 0x46:
10086     case 0x47:
10087     case 0x48:
10088     case 0x49:
10089     case 0x4a:
10090     case 0x4b:
10091     case 0x4c:
10092     case 0x4d:
10093     case 0x4e:
10094     case 0x4f:
10095       return rexes [pref - 0x40];
10096     case 0xf3:
10097       return "repz";
10098     case 0xf2:
10099       return "repnz";
10100     case 0xf0:
10101       return "lock";
10102     case 0x2e:
10103       return "cs";
10104     case 0x36:
10105       return "ss";
10106     case 0x3e:
10107       return "ds";
10108     case 0x26:
10109       return "es";
10110     case 0x64:
10111       return "fs";
10112     case 0x65:
10113       return "gs";
10114     case 0x66:
10115       return (sizeflag & DFLAG) ? "data16" : "data32";
10116     case 0x67:
10117       if (address_mode == mode_64bit)
10118         return (sizeflag & AFLAG) ? "addr32" : "addr64";
10119       else
10120         return (sizeflag & AFLAG) ? "addr16" : "addr32";
10121     case FWAIT_OPCODE:
10122       return "fwait";
10123     case ADDR16_PREFIX:
10124       return "addr16";
10125     case ADDR32_PREFIX:
10126       return "addr32";
10127     case DATA16_PREFIX:
10128       return "data16";
10129     case DATA32_PREFIX:
10130       return "data32";
10131     case REP_PREFIX:
10132       return "rep";
10133     default:
10134       return NULL;
10135     }
10136 }
10137
10138 static char op_out[MAX_OPERANDS][100];
10139 static int op_ad, op_index[MAX_OPERANDS];
10140 static int two_source_ops;
10141 static bfd_vma op_address[MAX_OPERANDS];
10142 static bfd_vma op_riprel[MAX_OPERANDS];
10143 static bfd_vma start_pc;
10144
10145 /*
10146  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10147  *   (see topic "Redundant prefixes" in the "Differences from 8086"
10148  *   section of the "Virtual 8086 Mode" chapter.)
10149  * 'pc' should be the address of this instruction, it will
10150  *   be used to print the target address if this is a relative jump or call
10151  * The function returns the length of this instruction in bytes.
10152  */
10153
10154 static char intel_syntax;
10155 static char intel_mnemonic = !SYSV386_COMPAT;
10156 static char open_char;
10157 static char close_char;
10158 static char separator_char;
10159 static char scale_char;
10160
10161 /* Here for backwards compatibility.  When gdb stops using
10162    print_insn_i386_att and print_insn_i386_intel these functions can
10163    disappear, and print_insn_i386 be merged into print_insn.  */
10164 int
10165 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10166 {
10167   intel_syntax = 0;
10168
10169   return print_insn (pc, info);
10170 }
10171
10172 int
10173 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10174 {
10175   intel_syntax = 1;
10176
10177   return print_insn (pc, info);
10178 }
10179
10180 int
10181 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10182 {
10183   intel_syntax = -1;
10184
10185   return print_insn (pc, info);
10186 }
10187
10188 void
10189 print_i386_disassembler_options (FILE *stream)
10190 {
10191   fprintf (stream, _("\n\
10192 The following i386/x86-64 specific disassembler options are supported for use\n\
10193 with the -M switch (multiple options should be separated by commas):\n"));
10194
10195   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
10196   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
10197   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
10198   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
10199   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
10200   fprintf (stream, _("  att-mnemonic\n"
10201                      "              Display instruction in AT&T mnemonic\n"));
10202   fprintf (stream, _("  intel-mnemonic\n"
10203                      "              Display instruction in Intel mnemonic\n"));
10204   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
10205   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
10206   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
10207   fprintf (stream, _("  data32      Assume 32bit data size\n"));
10208   fprintf (stream, _("  data16      Assume 16bit data size\n"));
10209   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
10210 }
10211
10212 /* Get a pointer to struct dis386 with a valid name.  */
10213
10214 static const struct dis386 *
10215 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10216 {
10217   int index, vex_table_index;
10218
10219   if (dp->name != NULL)
10220     return dp;
10221
10222   switch (dp->op[0].bytemode)
10223     {
10224     case USE_REG_TABLE:
10225       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10226       break;
10227
10228     case USE_MOD_TABLE:
10229       index = modrm.mod == 0x3 ? 1 : 0;
10230       dp = &mod_table[dp->op[1].bytemode][index];
10231       break;
10232
10233     case USE_RM_TABLE:
10234       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10235       break;
10236
10237     case USE_PREFIX_TABLE:
10238       if (need_vex)
10239         {
10240           /* The prefix in VEX is implicit.  */
10241           switch (vex.prefix)
10242             {
10243             case 0:
10244               index = 0;
10245               break;
10246             case REPE_PREFIX_OPCODE:
10247               index = 1;
10248               break;
10249             case DATA_PREFIX_OPCODE:
10250               index = 2;
10251               break;
10252             case REPNE_PREFIX_OPCODE:
10253               index = 3;
10254               break;
10255             default:
10256               abort ();
10257               break;
10258             }
10259         }
10260       else 
10261         {
10262           index = 0;
10263           used_prefixes |= (prefixes & PREFIX_REPZ);
10264           if (prefixes & PREFIX_REPZ)
10265             {
10266               index = 1;
10267               all_prefixes[last_repz_prefix] = 0;
10268             }
10269           else
10270             {
10271               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10272                  PREFIX_DATA.  */
10273               used_prefixes |= (prefixes & PREFIX_REPNZ);
10274               if (prefixes & PREFIX_REPNZ)
10275                 {
10276                   index = 3;
10277                   all_prefixes[last_repnz_prefix] = 0;
10278                 }
10279               else
10280                 {
10281                   used_prefixes |= (prefixes & PREFIX_DATA);
10282                   if (prefixes & PREFIX_DATA)
10283                     {
10284                       index = 2;
10285                       all_prefixes[last_data_prefix] = 0;
10286                     }
10287                 }
10288             }
10289         }
10290       dp = &prefix_table[dp->op[1].bytemode][index];
10291       break;
10292
10293     case USE_X86_64_TABLE:
10294       index = address_mode == mode_64bit ? 1 : 0;
10295       dp = &x86_64_table[dp->op[1].bytemode][index];
10296       break;
10297
10298     case USE_3BYTE_TABLE:
10299       FETCH_DATA (info, codep + 2);
10300       index = *codep++;
10301       dp = &three_byte_table[dp->op[1].bytemode][index];
10302       modrm.mod = (*codep >> 6) & 3;
10303       modrm.reg = (*codep >> 3) & 7;
10304       modrm.rm = *codep & 7;
10305       break;
10306
10307     case USE_VEX_LEN_TABLE:
10308       if (!need_vex)
10309         abort ();
10310
10311       switch (vex.length)
10312         {
10313         case 128:
10314           index = 0;
10315           break;
10316         case 256:
10317           index = 1;
10318           break;
10319         default:
10320           abort ();
10321           break;
10322         }
10323
10324       dp = &vex_len_table[dp->op[1].bytemode][index];
10325       break;
10326
10327     case USE_XOP_8F_TABLE:
10328       FETCH_DATA (info, codep + 3);
10329       /* All bits in the REX prefix are ignored.  */
10330       rex_ignored = rex;
10331       rex = ~(*codep >> 5) & 0x7;
10332
10333       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
10334       switch ((*codep & 0x1f))
10335         {
10336         default:
10337           BadOp ();
10338         case 0x8:
10339           vex_table_index = XOP_08;
10340           break;
10341         case 0x9:
10342           vex_table_index = XOP_09;
10343           break;
10344         case 0xa:
10345           vex_table_index = XOP_0A;
10346           break;
10347         }
10348       codep++;
10349       vex.w = *codep & 0x80;
10350       if (vex.w && address_mode == mode_64bit)
10351         rex |= REX_W;
10352
10353       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10354       if (address_mode != mode_64bit
10355           && vex.register_specifier > 0x7)
10356         BadOp ();
10357
10358       vex.length = (*codep & 0x4) ? 256 : 128;
10359       switch ((*codep & 0x3))
10360         {
10361         case 0:
10362           vex.prefix = 0;
10363           break;
10364         case 1:
10365           vex.prefix = DATA_PREFIX_OPCODE;
10366           break;
10367         case 2:
10368           vex.prefix = REPE_PREFIX_OPCODE;
10369           break;
10370         case 3:
10371           vex.prefix = REPNE_PREFIX_OPCODE;
10372           break;
10373         }
10374       need_vex = 1;
10375       need_vex_reg = 1;
10376       codep++;
10377       index = *codep++;
10378       dp = &xop_table[vex_table_index][index];
10379
10380       FETCH_DATA (info, codep + 1);
10381       modrm.mod = (*codep >> 6) & 3;
10382       modrm.reg = (*codep >> 3) & 7;
10383       modrm.rm = *codep & 7;
10384       break;
10385
10386     case USE_VEX_C4_TABLE:
10387       FETCH_DATA (info, codep + 3);
10388       /* All bits in the REX prefix are ignored.  */
10389       rex_ignored = rex;
10390       rex = ~(*codep >> 5) & 0x7;
10391       switch ((*codep & 0x1f))
10392         {
10393         default:
10394           BadOp ();
10395         case 0x1:
10396           vex_table_index = VEX_0F;
10397           break;
10398         case 0x2:
10399           vex_table_index = VEX_0F38;
10400           break;
10401         case 0x3:
10402           vex_table_index = VEX_0F3A;
10403           break;
10404         }
10405       codep++;
10406       vex.w = *codep & 0x80;
10407       if (vex.w && address_mode == mode_64bit)
10408         rex |= REX_W;
10409
10410       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10411       if (address_mode != mode_64bit
10412           && vex.register_specifier > 0x7)
10413         BadOp ();
10414
10415       vex.length = (*codep & 0x4) ? 256 : 128;
10416       switch ((*codep & 0x3))
10417         {
10418         case 0:
10419           vex.prefix = 0;
10420           break;
10421         case 1:
10422           vex.prefix = DATA_PREFIX_OPCODE;
10423           break;
10424         case 2:
10425           vex.prefix = REPE_PREFIX_OPCODE;
10426           break;
10427         case 3:
10428           vex.prefix = REPNE_PREFIX_OPCODE;
10429           break;
10430         }
10431       need_vex = 1;
10432       need_vex_reg = 1;
10433       codep++;
10434       index = *codep++;
10435       dp = &vex_table[vex_table_index][index];
10436       /* There is no MODRM byte for VEX [82|77].  */
10437       if (index != 0x77 && index != 0x82)
10438         {
10439           FETCH_DATA (info, codep + 1);
10440           modrm.mod = (*codep >> 6) & 3;
10441           modrm.reg = (*codep >> 3) & 7;
10442           modrm.rm = *codep & 7;
10443         }
10444       break;
10445
10446     case USE_VEX_C5_TABLE:
10447       FETCH_DATA (info, codep + 2);
10448       /* All bits in the REX prefix are ignored.  */
10449       rex_ignored = rex;
10450       rex = (*codep & 0x80) ? 0 : REX_R;
10451
10452       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10453       if (address_mode != mode_64bit
10454           && vex.register_specifier > 0x7)
10455         BadOp ();
10456
10457       vex.length = (*codep & 0x4) ? 256 : 128;
10458       switch ((*codep & 0x3))
10459         {
10460         case 0:
10461           vex.prefix = 0;
10462           break;
10463         case 1:
10464           vex.prefix = DATA_PREFIX_OPCODE;
10465           break;
10466         case 2:
10467           vex.prefix = REPE_PREFIX_OPCODE;
10468           break;
10469         case 3:
10470           vex.prefix = REPNE_PREFIX_OPCODE;
10471           break;
10472         }
10473       need_vex = 1;
10474       need_vex_reg = 1;
10475       codep++;
10476       index = *codep++;
10477       dp = &vex_table[dp->op[1].bytemode][index];
10478       /* There is no MODRM byte for VEX [82|77].  */
10479       if (index != 0x77 && index != 0x82)
10480         {
10481           FETCH_DATA (info, codep + 1);
10482           modrm.mod = (*codep >> 6) & 3;
10483           modrm.reg = (*codep >> 3) & 7;
10484           modrm.rm = *codep & 7;
10485         }
10486       break;
10487
10488     default:
10489       abort ();
10490     }
10491
10492   if (dp->name != NULL)
10493     return dp;
10494   else
10495     return get_valid_dis386 (dp, info);
10496 }
10497
10498 static int
10499 print_insn (bfd_vma pc, disassemble_info *info)
10500 {
10501   const struct dis386 *dp;
10502   int i;
10503   char *op_txt[MAX_OPERANDS];
10504   int needcomma;
10505   int sizeflag;
10506   const char *p;
10507   struct dis_private priv;
10508   unsigned char op;
10509   int prefix_length;
10510   int default_prefixes;
10511
10512   if (info->mach == bfd_mach_x86_64_intel_syntax
10513       || info->mach == bfd_mach_x86_64
10514       || info->mach == bfd_mach_l1om
10515       || info->mach == bfd_mach_l1om_intel_syntax)
10516     address_mode = mode_64bit;
10517   else
10518     address_mode = mode_32bit;
10519
10520   if (intel_syntax == (char) -1)
10521     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
10522                     || info->mach == bfd_mach_x86_64_intel_syntax
10523                     || info->mach == bfd_mach_l1om_intel_syntax);
10524
10525   if (info->mach == bfd_mach_i386_i386
10526       || info->mach == bfd_mach_x86_64
10527       || info->mach == bfd_mach_l1om
10528       || info->mach == bfd_mach_i386_i386_intel_syntax
10529       || info->mach == bfd_mach_x86_64_intel_syntax
10530       || info->mach == bfd_mach_l1om_intel_syntax)
10531     priv.orig_sizeflag = AFLAG | DFLAG;
10532   else if (info->mach == bfd_mach_i386_i8086)
10533     priv.orig_sizeflag = 0;
10534   else
10535     abort ();
10536
10537   for (p = info->disassembler_options; p != NULL; )
10538     {
10539       if (CONST_STRNEQ (p, "x86-64"))
10540         {
10541           address_mode = mode_64bit;
10542           priv.orig_sizeflag = AFLAG | DFLAG;
10543         }
10544       else if (CONST_STRNEQ (p, "i386"))
10545         {
10546           address_mode = mode_32bit;
10547           priv.orig_sizeflag = AFLAG | DFLAG;
10548         }
10549       else if (CONST_STRNEQ (p, "i8086"))
10550         {
10551           address_mode = mode_16bit;
10552           priv.orig_sizeflag = 0;
10553         }
10554       else if (CONST_STRNEQ (p, "intel"))
10555         {
10556           intel_syntax = 1;
10557           if (CONST_STRNEQ (p + 5, "-mnemonic"))
10558             intel_mnemonic = 1;
10559         }
10560       else if (CONST_STRNEQ (p, "att"))
10561         {
10562           intel_syntax = 0;
10563           if (CONST_STRNEQ (p + 3, "-mnemonic"))
10564             intel_mnemonic = 0;
10565         }
10566       else if (CONST_STRNEQ (p, "addr"))
10567         {
10568           if (address_mode == mode_64bit)
10569             {
10570               if (p[4] == '3' && p[5] == '2')
10571                 priv.orig_sizeflag &= ~AFLAG;
10572               else if (p[4] == '6' && p[5] == '4')
10573                 priv.orig_sizeflag |= AFLAG;
10574             }
10575           else
10576             {
10577               if (p[4] == '1' && p[5] == '6')
10578                 priv.orig_sizeflag &= ~AFLAG;
10579               else if (p[4] == '3' && p[5] == '2')
10580                 priv.orig_sizeflag |= AFLAG;
10581             }
10582         }
10583       else if (CONST_STRNEQ (p, "data"))
10584         {
10585           if (p[4] == '1' && p[5] == '6')
10586             priv.orig_sizeflag &= ~DFLAG;
10587           else if (p[4] == '3' && p[5] == '2')
10588             priv.orig_sizeflag |= DFLAG;
10589         }
10590       else if (CONST_STRNEQ (p, "suffix"))
10591         priv.orig_sizeflag |= SUFFIX_ALWAYS;
10592
10593       p = strchr (p, ',');
10594       if (p != NULL)
10595         p++;
10596     }
10597
10598   if (intel_syntax)
10599     {
10600       names64 = intel_names64;
10601       names32 = intel_names32;
10602       names16 = intel_names16;
10603       names8 = intel_names8;
10604       names8rex = intel_names8rex;
10605       names_seg = intel_names_seg;
10606       index64 = intel_index64;
10607       index32 = intel_index32;
10608       index16 = intel_index16;
10609       open_char = '[';
10610       close_char = ']';
10611       separator_char = '+';
10612       scale_char = '*';
10613     }
10614   else
10615     {
10616       names64 = att_names64;
10617       names32 = att_names32;
10618       names16 = att_names16;
10619       names8 = att_names8;
10620       names8rex = att_names8rex;
10621       names_seg = att_names_seg;
10622       index64 = att_index64;
10623       index32 = att_index32;
10624       index16 = att_index16;
10625       open_char = '(';
10626       close_char =  ')';
10627       separator_char = ',';
10628       scale_char = ',';
10629     }
10630
10631   /* The output looks better if we put 7 bytes on a line, since that
10632      puts most long word instructions on a single line.  Use 8 bytes
10633      for Intel L1OM.  */
10634   if (info->mach == bfd_mach_l1om
10635       || info->mach == bfd_mach_l1om_intel_syntax)
10636     info->bytes_per_line = 8;
10637   else
10638     info->bytes_per_line = 7;
10639
10640   info->private_data = &priv;
10641   priv.max_fetched = priv.the_buffer;
10642   priv.insn_start = pc;
10643
10644   obuf[0] = 0;
10645   for (i = 0; i < MAX_OPERANDS; ++i)
10646     {
10647       op_out[i][0] = 0;
10648       op_index[i] = -1;
10649     }
10650
10651   the_info = info;
10652   start_pc = pc;
10653   start_codep = priv.the_buffer;
10654   codep = priv.the_buffer;
10655
10656   if (setjmp (priv.bailout) != 0)
10657     {
10658       const char *name;
10659
10660       /* Getting here means we tried for data but didn't get it.  That
10661          means we have an incomplete instruction of some sort.  Just
10662          print the first byte as a prefix or a .byte pseudo-op.  */
10663       if (codep > priv.the_buffer)
10664         {
10665           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
10666           if (name != NULL)
10667             (*info->fprintf_func) (info->stream, "%s", name);
10668           else
10669             {
10670               /* Just print the first byte as a .byte instruction.  */
10671               (*info->fprintf_func) (info->stream, ".byte 0x%x",
10672                                      (unsigned int) priv.the_buffer[0]);
10673             }
10674
10675           return 1;
10676         }
10677
10678       return -1;
10679     }
10680
10681   obufp = obuf;
10682   sizeflag = priv.orig_sizeflag;
10683
10684   if (!ckprefix () || rex_used)
10685     {
10686       /* Too many prefixes or unused REX prefixes.  */
10687       for (i = 0;
10688            all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
10689            i++)
10690         (*info->fprintf_func) (info->stream, "%s",
10691                                prefix_name (all_prefixes[i], sizeflag));
10692       return 1;
10693     }
10694
10695   insn_codep = codep;
10696
10697   FETCH_DATA (info, codep + 1);
10698   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
10699
10700   if (((prefixes & PREFIX_FWAIT)
10701        && ((*codep < 0xd8) || (*codep > 0xdf))))
10702     {
10703       (*info->fprintf_func) (info->stream, "fwait");
10704       return 1;
10705     }
10706
10707   op = 0;
10708
10709   if (*codep == 0x0f)
10710     {
10711       unsigned char threebyte;
10712       FETCH_DATA (info, codep + 2);
10713       threebyte = *++codep;
10714       dp = &dis386_twobyte[threebyte];
10715       need_modrm = twobyte_has_modrm[*codep];
10716       codep++;
10717     }
10718   else
10719     {
10720       dp = &dis386[*codep];
10721       need_modrm = onebyte_has_modrm[*codep];
10722       codep++;
10723     }
10724
10725   if ((prefixes & PREFIX_REPZ))
10726     used_prefixes |= PREFIX_REPZ;
10727   if ((prefixes & PREFIX_REPNZ))
10728     used_prefixes |= PREFIX_REPNZ;
10729   if ((prefixes & PREFIX_LOCK))
10730     used_prefixes |= PREFIX_LOCK;
10731
10732   default_prefixes = 0;
10733   if (prefixes & PREFIX_ADDR)
10734     {
10735       sizeflag ^= AFLAG;
10736       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
10737         {
10738           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
10739             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
10740           else
10741             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
10742           default_prefixes |= PREFIX_ADDR;
10743         }
10744     }
10745
10746   if ((prefixes & PREFIX_DATA))
10747     {
10748       sizeflag ^= DFLAG;
10749       if (dp->op[2].bytemode == cond_jump_mode
10750           && dp->op[0].bytemode == v_mode
10751           && !intel_syntax)
10752         {
10753           if (sizeflag & DFLAG)
10754             all_prefixes[last_data_prefix] = DATA32_PREFIX;
10755           else
10756             all_prefixes[last_data_prefix] = DATA16_PREFIX;
10757           default_prefixes |= PREFIX_DATA;
10758         }
10759       else if (rex & REX_W)
10760         {
10761           /* REX_W will override PREFIX_DATA.  */
10762           default_prefixes |= PREFIX_DATA;
10763         }
10764     }
10765
10766   if (need_modrm)
10767     {
10768       FETCH_DATA (info, codep + 1);
10769       modrm.mod = (*codep >> 6) & 3;
10770       modrm.reg = (*codep >> 3) & 7;
10771       modrm.rm = *codep & 7;
10772     }
10773
10774    need_vex = 0;
10775    need_vex_reg = 0;
10776    vex_w_done = 0;
10777
10778   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
10779     {
10780       dofloat (sizeflag);
10781     }
10782   else
10783     {
10784       dp = get_valid_dis386 (dp, info);
10785       if (dp != NULL && putop (dp->name, sizeflag) == 0)
10786         {
10787           for (i = 0; i < MAX_OPERANDS; ++i)
10788             {
10789               obufp = op_out[i];
10790               op_ad = MAX_OPERANDS - 1 - i;
10791               if (dp->op[i].rtn)
10792                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
10793             }
10794         }
10795     }
10796
10797   /* See if any prefixes were not used.  If so, print the first one
10798      separately.  If we don't do this, we'll wind up printing an
10799      instruction stream which does not precisely correspond to the
10800      bytes we are disassembling.  */
10801   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
10802     {
10803       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10804         if (all_prefixes[i])
10805           {
10806             const char *name;
10807             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
10808             if (name == NULL)
10809               name = INTERNAL_DISASSEMBLER_ERROR;
10810             (*info->fprintf_func) (info->stream, "%s", name);
10811             return 1;
10812           }
10813     }
10814
10815   /* Check if the REX prefix used.  */
10816   if (rex_ignored == 0 && (rex ^ rex_used) == 0)
10817     all_prefixes[last_rex_prefix] = 0;
10818
10819   /* Check if the SEG prefix used.  */
10820   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10821                    | PREFIX_FS | PREFIX_GS)) != 0
10822       && (used_prefixes
10823           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
10824     all_prefixes[last_seg_prefix] = 0;
10825
10826   /* Check if the ADDR prefix used.  */
10827   if ((prefixes & PREFIX_ADDR) != 0
10828       && (used_prefixes & PREFIX_ADDR) != 0)
10829     all_prefixes[last_addr_prefix] = 0;
10830
10831   /* Check if the DATA prefix used.  */
10832   if ((prefixes & PREFIX_DATA) != 0
10833       && (used_prefixes & PREFIX_DATA) != 0)
10834     all_prefixes[last_data_prefix] = 0;
10835
10836   prefix_length = 0;
10837   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10838     if (all_prefixes[i])
10839       {
10840         const char *name;
10841         name = prefix_name (all_prefixes[i], sizeflag);
10842         if (name == NULL)
10843           abort ();
10844         prefix_length += strlen (name) + 1;
10845         (*info->fprintf_func) (info->stream, "%s ", name);
10846       }
10847
10848   /* Check maximum code length.  */
10849   if ((codep - start_codep) > MAX_CODE_LENGTH)
10850     {
10851       (*info->fprintf_func) (info->stream, "(bad)");
10852       return MAX_CODE_LENGTH;
10853     }
10854
10855   obufp = mnemonicendp;
10856   for (i = strlen (obuf) + prefix_length; i < 6; i++)
10857     oappend (" ");
10858   oappend (" ");
10859   (*info->fprintf_func) (info->stream, "%s", obuf);
10860
10861   /* The enter and bound instructions are printed with operands in the same
10862      order as the intel book; everything else is printed in reverse order.  */
10863   if (intel_syntax || two_source_ops)
10864     {
10865       bfd_vma riprel;
10866
10867       for (i = 0; i < MAX_OPERANDS; ++i)
10868         op_txt[i] = op_out[i];
10869
10870       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10871         {
10872           op_ad = op_index[i];
10873           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
10874           op_index[MAX_OPERANDS - 1 - i] = op_ad;
10875           riprel = op_riprel[i];
10876           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
10877           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10878         }
10879     }
10880   else
10881     {
10882       for (i = 0; i < MAX_OPERANDS; ++i)
10883         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
10884     }
10885
10886   needcomma = 0;
10887   for (i = 0; i < MAX_OPERANDS; ++i)
10888     if (*op_txt[i])
10889       {
10890         if (needcomma)
10891           (*info->fprintf_func) (info->stream, ",");
10892         if (op_index[i] != -1 && !op_riprel[i])
10893           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
10894         else
10895           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
10896         needcomma = 1;
10897       }
10898
10899   for (i = 0; i < MAX_OPERANDS; i++)
10900     if (op_index[i] != -1 && op_riprel[i])
10901       {
10902         (*info->fprintf_func) (info->stream, "        # ");
10903         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
10904                                                 + op_address[op_index[i]]), info);
10905         break;
10906       }
10907   return codep - priv.the_buffer;
10908 }
10909
10910 static const char *float_mem[] = {
10911   /* d8 */
10912   "fadd{s|}",
10913   "fmul{s|}",
10914   "fcom{s|}",
10915   "fcomp{s|}",
10916   "fsub{s|}",
10917   "fsubr{s|}",
10918   "fdiv{s|}",
10919   "fdivr{s|}",
10920   /* d9 */
10921   "fld{s|}",
10922   "(bad)",
10923   "fst{s|}",
10924   "fstp{s|}",
10925   "fldenvIC",
10926   "fldcw",
10927   "fNstenvIC",
10928   "fNstcw",
10929   /* da */
10930   "fiadd{l|}",
10931   "fimul{l|}",
10932   "ficom{l|}",
10933   "ficomp{l|}",
10934   "fisub{l|}",
10935   "fisubr{l|}",
10936   "fidiv{l|}",
10937   "fidivr{l|}",
10938   /* db */
10939   "fild{l|}",
10940   "fisttp{l|}",
10941   "fist{l|}",
10942   "fistp{l|}",
10943   "(bad)",
10944   "fld{t||t|}",
10945   "(bad)",
10946   "fstp{t||t|}",
10947   /* dc */
10948   "fadd{l|}",
10949   "fmul{l|}",
10950   "fcom{l|}",
10951   "fcomp{l|}",
10952   "fsub{l|}",
10953   "fsubr{l|}",
10954   "fdiv{l|}",
10955   "fdivr{l|}",
10956   /* dd */
10957   "fld{l|}",
10958   "fisttp{ll|}",
10959   "fst{l||}",
10960   "fstp{l|}",
10961   "frstorIC",
10962   "(bad)",
10963   "fNsaveIC",
10964   "fNstsw",
10965   /* de */
10966   "fiadd",
10967   "fimul",
10968   "ficom",
10969   "ficomp",
10970   "fisub",
10971   "fisubr",
10972   "fidiv",
10973   "fidivr",
10974   /* df */
10975   "fild",
10976   "fisttp",
10977   "fist",
10978   "fistp",
10979   "fbld",
10980   "fild{ll|}",
10981   "fbstp",
10982   "fistp{ll|}",
10983 };
10984
10985 static const unsigned char float_mem_mode[] = {
10986   /* d8 */
10987   d_mode,
10988   d_mode,
10989   d_mode,
10990   d_mode,
10991   d_mode,
10992   d_mode,
10993   d_mode,
10994   d_mode,
10995   /* d9 */
10996   d_mode,
10997   0,
10998   d_mode,
10999   d_mode,
11000   0,
11001   w_mode,
11002   0,
11003   w_mode,
11004   /* da */
11005   d_mode,
11006   d_mode,
11007   d_mode,
11008   d_mode,
11009   d_mode,
11010   d_mode,
11011   d_mode,
11012   d_mode,
11013   /* db */
11014   d_mode,
11015   d_mode,
11016   d_mode,
11017   d_mode,
11018   0,
11019   t_mode,
11020   0,
11021   t_mode,
11022   /* dc */
11023   q_mode,
11024   q_mode,
11025   q_mode,
11026   q_mode,
11027   q_mode,
11028   q_mode,
11029   q_mode,
11030   q_mode,
11031   /* dd */
11032   q_mode,
11033   q_mode,
11034   q_mode,
11035   q_mode,
11036   0,
11037   0,
11038   0,
11039   w_mode,
11040   /* de */
11041   w_mode,
11042   w_mode,
11043   w_mode,
11044   w_mode,
11045   w_mode,
11046   w_mode,
11047   w_mode,
11048   w_mode,
11049   /* df */
11050   w_mode,
11051   w_mode,
11052   w_mode,
11053   w_mode,
11054   t_mode,
11055   q_mode,
11056   t_mode,
11057   q_mode
11058 };
11059
11060 #define ST { OP_ST, 0 }
11061 #define STi { OP_STi, 0 }
11062
11063 #define FGRPd9_2 NULL, { { NULL, 0 } }
11064 #define FGRPd9_4 NULL, { { NULL, 1 } }
11065 #define FGRPd9_5 NULL, { { NULL, 2 } }
11066 #define FGRPd9_6 NULL, { { NULL, 3 } }
11067 #define FGRPd9_7 NULL, { { NULL, 4 } }
11068 #define FGRPda_5 NULL, { { NULL, 5 } }
11069 #define FGRPdb_4 NULL, { { NULL, 6 } }
11070 #define FGRPde_3 NULL, { { NULL, 7 } }
11071 #define FGRPdf_4 NULL, { { NULL, 8 } }
11072
11073 static const struct dis386 float_reg[][8] = {
11074   /* d8 */
11075   {
11076     { "fadd",   { ST, STi } },
11077     { "fmul",   { ST, STi } },
11078     { "fcom",   { STi } },
11079     { "fcomp",  { STi } },
11080     { "fsub",   { ST, STi } },
11081     { "fsubr",  { ST, STi } },
11082     { "fdiv",   { ST, STi } },
11083     { "fdivr",  { ST, STi } },
11084   },
11085   /* d9 */
11086   {
11087     { "fld",    { STi } },
11088     { "fxch",   { STi } },
11089     { FGRPd9_2 },
11090     { "(bad)",  { XX } },
11091     { FGRPd9_4 },
11092     { FGRPd9_5 },
11093     { FGRPd9_6 },
11094     { FGRPd9_7 },
11095   },
11096   /* da */
11097   {
11098     { "fcmovb", { ST, STi } },
11099     { "fcmove", { ST, STi } },
11100     { "fcmovbe",{ ST, STi } },
11101     { "fcmovu", { ST, STi } },
11102     { "(bad)",  { XX } },
11103     { FGRPda_5 },
11104     { "(bad)",  { XX } },
11105     { "(bad)",  { XX } },
11106   },
11107   /* db */
11108   {
11109     { "fcmovnb",{ ST, STi } },
11110     { "fcmovne",{ ST, STi } },
11111     { "fcmovnbe",{ ST, STi } },
11112     { "fcmovnu",{ ST, STi } },
11113     { FGRPdb_4 },
11114     { "fucomi", { ST, STi } },
11115     { "fcomi",  { ST, STi } },
11116     { "(bad)",  { XX } },
11117   },
11118   /* dc */
11119   {
11120     { "fadd",   { STi, ST } },
11121     { "fmul",   { STi, ST } },
11122     { "(bad)",  { XX } },
11123     { "(bad)",  { XX } },
11124     { "fsub!M", { STi, ST } },
11125     { "fsubM",  { STi, ST } },
11126     { "fdiv!M", { STi, ST } },
11127     { "fdivM",  { STi, ST } },
11128   },
11129   /* dd */
11130   {
11131     { "ffree",  { STi } },
11132     { "(bad)",  { XX } },
11133     { "fst",    { STi } },
11134     { "fstp",   { STi } },
11135     { "fucom",  { STi } },
11136     { "fucomp", { STi } },
11137     { "(bad)",  { XX } },
11138     { "(bad)",  { XX } },
11139   },
11140   /* de */
11141   {
11142     { "faddp",  { STi, ST } },
11143     { "fmulp",  { STi, ST } },
11144     { "(bad)",  { XX } },
11145     { FGRPde_3 },
11146     { "fsub!Mp", { STi, ST } },
11147     { "fsubMp", { STi, ST } },
11148     { "fdiv!Mp", { STi, ST } },
11149     { "fdivMp", { STi, ST } },
11150   },
11151   /* df */
11152   {
11153     { "ffreep", { STi } },
11154     { "(bad)",  { XX } },
11155     { "(bad)",  { XX } },
11156     { "(bad)",  { XX } },
11157     { FGRPdf_4 },
11158     { "fucomip", { ST, STi } },
11159     { "fcomip", { ST, STi } },
11160     { "(bad)",  { XX } },
11161   },
11162 };
11163
11164 static char *fgrps[][8] = {
11165   /* d9_2  0 */
11166   {
11167     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11168   },
11169
11170   /* d9_4  1 */
11171   {
11172     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11173   },
11174
11175   /* d9_5  2 */
11176   {
11177     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11178   },
11179
11180   /* d9_6  3 */
11181   {
11182     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11183   },
11184
11185   /* d9_7  4 */
11186   {
11187     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11188   },
11189
11190   /* da_5  5 */
11191   {
11192     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11193   },
11194
11195   /* db_4  6 */
11196   {
11197     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11198     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11199   },
11200
11201   /* de_3  7 */
11202   {
11203     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11204   },
11205
11206   /* df_4  8 */
11207   {
11208     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11209   },
11210 };
11211
11212 static void
11213 swap_operand (void)
11214 {
11215   mnemonicendp[0] = '.';
11216   mnemonicendp[1] = 's';
11217   mnemonicendp += 2;
11218 }
11219
11220 static void
11221 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11222                int sizeflag ATTRIBUTE_UNUSED)
11223 {
11224   /* Skip mod/rm byte.  */
11225   MODRM_CHECK;
11226   codep++;
11227 }
11228
11229 static void
11230 dofloat (int sizeflag)
11231 {
11232   const struct dis386 *dp;
11233   unsigned char floatop;
11234
11235   floatop = codep[-1];
11236
11237   if (modrm.mod != 3)
11238     {
11239       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
11240
11241       putop (float_mem[fp_indx], sizeflag);
11242       obufp = op_out[0];
11243       op_ad = 2;
11244       OP_E (float_mem_mode[fp_indx], sizeflag);
11245       return;
11246     }
11247   /* Skip mod/rm byte.  */
11248   MODRM_CHECK;
11249   codep++;
11250
11251   dp = &float_reg[floatop - 0xd8][modrm.reg];
11252   if (dp->name == NULL)
11253     {
11254       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
11255
11256       /* Instruction fnstsw is only one with strange arg.  */
11257       if (floatop == 0xdf && codep[-1] == 0xe0)
11258         strcpy (op_out[0], names16[0]);
11259     }
11260   else
11261     {
11262       putop (dp->name, sizeflag);
11263
11264       obufp = op_out[0];
11265       op_ad = 2;
11266       if (dp->op[0].rtn)
11267         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
11268
11269       obufp = op_out[1];
11270       op_ad = 1;
11271       if (dp->op[1].rtn)
11272         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
11273     }
11274 }
11275
11276 static void
11277 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11278 {
11279   oappend ("%st" + intel_syntax);
11280 }
11281
11282 static void
11283 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11284 {
11285   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
11286   oappend (scratchbuf + intel_syntax);
11287 }
11288
11289 /* Capital letters in template are macros.  */
11290 static int
11291 putop (const char *in_template, int sizeflag)
11292 {
11293   const char *p;
11294   int alt = 0;
11295   int cond = 1;
11296   unsigned int l = 0, len = 1;
11297   char last[4];
11298
11299 #define SAVE_LAST(c)                    \
11300   if (l < len && l < sizeof (last))     \
11301     last[l++] = c;                      \
11302   else                                  \
11303     abort ();
11304
11305   for (p = in_template; *p; p++)
11306     {
11307       switch (*p)
11308         {
11309         default:
11310           *obufp++ = *p;
11311           break;
11312         case '%':
11313           len++;
11314           break;
11315         case '!':
11316           cond = 0;
11317           break;
11318         case '{':
11319           alt = 0;
11320           if (intel_syntax)
11321             {
11322               while (*++p != '|')
11323                 if (*p == '}' || *p == '\0')
11324                   abort ();
11325             }
11326           /* Fall through.  */
11327         case 'I':
11328           alt = 1;
11329           continue;
11330         case '|':
11331           while (*++p != '}')
11332             {
11333               if (*p == '\0')
11334                 abort ();
11335             }
11336           break;
11337         case '}':
11338           break;
11339         case 'A':
11340           if (intel_syntax)
11341             break;
11342           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11343             *obufp++ = 'b';
11344           break;
11345         case 'B':
11346           if (l == 0 && len == 1)
11347             {
11348 case_B:
11349               if (intel_syntax)
11350                 break;
11351               if (sizeflag & SUFFIX_ALWAYS)
11352                 *obufp++ = 'b';
11353             }
11354           else
11355             {
11356               if (l != 1
11357                   || len != 2
11358                   || last[0] != 'L')
11359                 {
11360                   SAVE_LAST (*p);
11361                   break;
11362                 }
11363
11364               if (address_mode == mode_64bit
11365                   && !(prefixes & PREFIX_ADDR))
11366                 {
11367                   *obufp++ = 'a';
11368                   *obufp++ = 'b';
11369                   *obufp++ = 's';
11370                 }
11371
11372               goto case_B;
11373             }
11374           break;
11375         case 'C':
11376           if (intel_syntax && !alt)
11377             break;
11378           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11379             {
11380               if (sizeflag & DFLAG)
11381                 *obufp++ = intel_syntax ? 'd' : 'l';
11382               else
11383                 *obufp++ = intel_syntax ? 'w' : 's';
11384               used_prefixes |= (prefixes & PREFIX_DATA);
11385             }
11386           break;
11387         case 'D':
11388           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11389             break;
11390           USED_REX (REX_W);
11391           if (modrm.mod == 3)
11392             {
11393               if (rex & REX_W)
11394                 *obufp++ = 'q';
11395               else
11396                 {
11397                   if (sizeflag & DFLAG)
11398                     *obufp++ = intel_syntax ? 'd' : 'l';
11399                   else
11400                     *obufp++ = 'w';
11401                   used_prefixes |= (prefixes & PREFIX_DATA);
11402                 }
11403             }
11404           else
11405             *obufp++ = 'w';
11406           break;
11407         case 'E':               /* For jcxz/jecxz */
11408           if (address_mode == mode_64bit)
11409             {
11410               if (sizeflag & AFLAG)
11411                 *obufp++ = 'r';
11412               else
11413                 *obufp++ = 'e';
11414             }
11415           else
11416             if (sizeflag & AFLAG)
11417               *obufp++ = 'e';
11418           used_prefixes |= (prefixes & PREFIX_ADDR);
11419           break;
11420         case 'F':
11421           if (intel_syntax)
11422             break;
11423           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
11424             {
11425               if (sizeflag & AFLAG)
11426                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
11427               else
11428                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
11429               used_prefixes |= (prefixes & PREFIX_ADDR);
11430             }
11431           break;
11432         case 'G':
11433           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
11434             break;
11435           if ((rex & REX_W) || (sizeflag & DFLAG))
11436             *obufp++ = 'l';
11437           else
11438             *obufp++ = 'w';
11439           if (!(rex & REX_W))
11440             used_prefixes |= (prefixes & PREFIX_DATA);
11441           break;
11442         case 'H':
11443           if (intel_syntax)
11444             break;
11445           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
11446               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
11447             {
11448               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
11449               *obufp++ = ',';
11450               *obufp++ = 'p';
11451               if (prefixes & PREFIX_DS)
11452                 *obufp++ = 't';
11453               else
11454                 *obufp++ = 'n';
11455             }
11456           break;
11457         case 'J':
11458           if (intel_syntax)
11459             break;
11460           *obufp++ = 'l';
11461           break;
11462         case 'K':
11463           USED_REX (REX_W);
11464           if (rex & REX_W)
11465             *obufp++ = 'q';
11466           else
11467             *obufp++ = 'd';
11468           break;
11469         case 'Z':
11470           if (intel_syntax)
11471             break;
11472           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
11473             {
11474               *obufp++ = 'q';
11475               break;
11476             }
11477           /* Fall through.  */
11478           goto case_L;
11479         case 'L':
11480           if (l != 0 || len != 1)
11481             {
11482               SAVE_LAST (*p);
11483               break;
11484             }
11485 case_L:
11486           if (intel_syntax)
11487             break;
11488           if (sizeflag & SUFFIX_ALWAYS)
11489             *obufp++ = 'l';
11490           break;
11491         case 'M':
11492           if (intel_mnemonic != cond)
11493             *obufp++ = 'r';
11494           break;
11495         case 'N':
11496           if ((prefixes & PREFIX_FWAIT) == 0)
11497             *obufp++ = 'n';
11498           else
11499             used_prefixes |= PREFIX_FWAIT;
11500           break;
11501         case 'O':
11502           USED_REX (REX_W);
11503           if (rex & REX_W)
11504             *obufp++ = 'o';
11505           else if (intel_syntax && (sizeflag & DFLAG))
11506             *obufp++ = 'q';
11507           else
11508             *obufp++ = 'd';
11509           if (!(rex & REX_W))
11510             used_prefixes |= (prefixes & PREFIX_DATA);
11511           break;
11512         case 'T':
11513           if (intel_syntax)
11514             break;
11515           if (address_mode == mode_64bit && (sizeflag & DFLAG))
11516             {
11517               *obufp++ = 'q';
11518               break;
11519             }
11520           /* Fall through.  */
11521         case 'P':
11522           if (intel_syntax)
11523             break;
11524           if ((prefixes & PREFIX_DATA)
11525               || (rex & REX_W)
11526               || (sizeflag & SUFFIX_ALWAYS))
11527             {
11528               USED_REX (REX_W);
11529               if (rex & REX_W)
11530                 *obufp++ = 'q';
11531               else
11532                 {
11533                    if (sizeflag & DFLAG)
11534                       *obufp++ = 'l';
11535                    else
11536                      *obufp++ = 'w';
11537                    used_prefixes |= (prefixes & PREFIX_DATA);
11538                 }
11539             }
11540           break;
11541         case 'U':
11542           if (intel_syntax)
11543             break;
11544           if (address_mode == mode_64bit && (sizeflag & DFLAG))
11545             {
11546               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11547                 *obufp++ = 'q';
11548               break;
11549             }
11550           /* Fall through.  */
11551           goto case_Q;
11552         case 'Q':
11553           if (l == 0 && len == 1)
11554             {
11555 case_Q:
11556               if (intel_syntax && !alt)
11557                 break;
11558               USED_REX (REX_W);
11559               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11560                 {
11561                   if (rex & REX_W)
11562                     *obufp++ = 'q';
11563                   else
11564                     {
11565                       if (sizeflag & DFLAG)
11566                         *obufp++ = intel_syntax ? 'd' : 'l';
11567                       else
11568                         *obufp++ = 'w';
11569                       used_prefixes |= (prefixes & PREFIX_DATA);
11570                     }
11571                 }
11572             }
11573           else
11574             {
11575               if (l != 1 || len != 2 || last[0] != 'L')
11576                 {
11577                   SAVE_LAST (*p);
11578                   break;
11579                 }
11580               if (intel_syntax
11581                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11582                 break;
11583               if ((rex & REX_W))
11584                 {
11585                   USED_REX (REX_W);
11586                   *obufp++ = 'q';
11587                 }
11588               else
11589                 *obufp++ = 'l';
11590             }
11591           break;
11592         case 'R':
11593           USED_REX (REX_W);
11594           if (rex & REX_W)
11595             *obufp++ = 'q';
11596           else if (sizeflag & DFLAG)
11597             {
11598               if (intel_syntax)
11599                   *obufp++ = 'd';
11600               else
11601                   *obufp++ = 'l';
11602             }
11603           else
11604             *obufp++ = 'w';
11605           if (intel_syntax && !p[1]
11606               && ((rex & REX_W) || (sizeflag & DFLAG)))
11607             *obufp++ = 'e';
11608           if (!(rex & REX_W))
11609             used_prefixes |= (prefixes & PREFIX_DATA);
11610           break;
11611         case 'V':
11612           if (l == 0 && len == 1)
11613             {
11614               if (intel_syntax)
11615                 break;
11616               if (address_mode == mode_64bit && (sizeflag & DFLAG))
11617                 {
11618                   if (sizeflag & SUFFIX_ALWAYS)
11619                     *obufp++ = 'q';
11620                   break;
11621                 }
11622             }
11623           else
11624             {
11625               if (l != 1
11626                   || len != 2
11627                   || last[0] != 'L')
11628                 {
11629                   SAVE_LAST (*p);
11630                   break;
11631                 }
11632
11633               if (rex & REX_W)
11634                 {
11635                   *obufp++ = 'a';
11636                   *obufp++ = 'b';
11637                   *obufp++ = 's';
11638                 }
11639             }
11640           /* Fall through.  */
11641           goto case_S;
11642         case 'S':
11643           if (l == 0 && len == 1)
11644             {
11645 case_S:
11646               if (intel_syntax)
11647                 break;
11648               if (sizeflag & SUFFIX_ALWAYS)
11649                 {
11650                   if (rex & REX_W)
11651                     *obufp++ = 'q';
11652                   else
11653                     {
11654                       if (sizeflag & DFLAG)
11655                         *obufp++ = 'l';
11656                       else
11657                         *obufp++ = 'w';
11658                       used_prefixes |= (prefixes & PREFIX_DATA);
11659                     }
11660                 }
11661             }
11662           else
11663             {
11664               if (l != 1
11665                   || len != 2
11666                   || last[0] != 'L')
11667                 {
11668                   SAVE_LAST (*p);
11669                   break;
11670                 }
11671
11672               if (address_mode == mode_64bit
11673                   && !(prefixes & PREFIX_ADDR))
11674                 {
11675                   *obufp++ = 'a';
11676                   *obufp++ = 'b';
11677                   *obufp++ = 's';
11678                 }
11679
11680               goto case_S;
11681             }
11682           break;
11683         case 'X':
11684           if (l != 0 || len != 1)
11685             {
11686               SAVE_LAST (*p);
11687               break;
11688             }
11689           if (need_vex && vex.prefix)
11690             {
11691               if (vex.prefix == DATA_PREFIX_OPCODE)
11692                 *obufp++ = 'd';
11693               else
11694                 *obufp++ = 's';
11695             }
11696           else
11697             {
11698               if (prefixes & PREFIX_DATA)
11699                 *obufp++ = 'd';
11700               else
11701                 *obufp++ = 's';
11702               used_prefixes |= (prefixes & PREFIX_DATA);
11703             }
11704           break;
11705         case 'Y':
11706           if (l == 0 && len == 1)
11707             {
11708               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
11709                 break;
11710               if (rex & REX_W)
11711                 {
11712                   USED_REX (REX_W);
11713                   *obufp++ = 'q';
11714                 }
11715               break;
11716             }
11717           else
11718             {
11719               if (l != 1 || len != 2 || last[0] != 'X')
11720                 {
11721                   SAVE_LAST (*p);
11722                   break;
11723                 }
11724               if (!need_vex)
11725                 abort ();
11726               if (intel_syntax
11727                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
11728                 break;
11729               switch (vex.length)
11730                 {
11731                 case 128:
11732                   *obufp++ = 'x';
11733                   break;
11734                 case 256:
11735                   *obufp++ = 'y';
11736                   break;
11737                 default:
11738                   abort ();
11739                 }
11740             }
11741           break;
11742         case 'W':
11743           if (l == 0 && len == 1)
11744             {
11745               /* operand size flag for cwtl, cbtw */
11746               USED_REX (REX_W);
11747               if (rex & REX_W)
11748                 {
11749                   if (intel_syntax)
11750                     *obufp++ = 'd';
11751                   else
11752                     *obufp++ = 'l';
11753                 }
11754               else if (sizeflag & DFLAG)
11755                 *obufp++ = 'w';
11756               else
11757                 *obufp++ = 'b';
11758               if (!(rex & REX_W))
11759                 used_prefixes |= (prefixes & PREFIX_DATA);
11760             }
11761           else
11762             {
11763               if (l != 1 || len != 2 || last[0] != 'X')
11764                 {
11765                   SAVE_LAST (*p);
11766                   break;
11767                 }
11768               if (!need_vex)
11769                 abort ();
11770               *obufp++ = vex.w ? 'd': 's';
11771             }
11772           break;
11773         }
11774       alt = 0;
11775     }
11776   *obufp = 0;
11777   mnemonicendp = obufp;
11778   return 0;
11779 }
11780
11781 static void
11782 oappend (const char *s)
11783 {
11784   obufp = stpcpy (obufp, s);
11785 }
11786
11787 static void
11788 append_seg (void)
11789 {
11790   if (prefixes & PREFIX_CS)
11791     {
11792       used_prefixes |= PREFIX_CS;
11793       oappend ("%cs:" + intel_syntax);
11794     }
11795   if (prefixes & PREFIX_DS)
11796     {
11797       used_prefixes |= PREFIX_DS;
11798       oappend ("%ds:" + intel_syntax);
11799     }
11800   if (prefixes & PREFIX_SS)
11801     {
11802       used_prefixes |= PREFIX_SS;
11803       oappend ("%ss:" + intel_syntax);
11804     }
11805   if (prefixes & PREFIX_ES)
11806     {
11807       used_prefixes |= PREFIX_ES;
11808       oappend ("%es:" + intel_syntax);
11809     }
11810   if (prefixes & PREFIX_FS)
11811     {
11812       used_prefixes |= PREFIX_FS;
11813       oappend ("%fs:" + intel_syntax);
11814     }
11815   if (prefixes & PREFIX_GS)
11816     {
11817       used_prefixes |= PREFIX_GS;
11818       oappend ("%gs:" + intel_syntax);
11819     }
11820 }
11821
11822 static void
11823 OP_indirE (int bytemode, int sizeflag)
11824 {
11825   if (!intel_syntax)
11826     oappend ("*");
11827   OP_E (bytemode, sizeflag);
11828 }
11829
11830 static void
11831 print_operand_value (char *buf, int hex, bfd_vma disp)
11832 {
11833   if (address_mode == mode_64bit)
11834     {
11835       if (hex)
11836         {
11837           char tmp[30];
11838           int i;
11839           buf[0] = '0';
11840           buf[1] = 'x';
11841           sprintf_vma (tmp, disp);
11842           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
11843           strcpy (buf + 2, tmp + i);
11844         }
11845       else
11846         {
11847           bfd_signed_vma v = disp;
11848           char tmp[30];
11849           int i;
11850           if (v < 0)
11851             {
11852               *(buf++) = '-';
11853               v = -disp;
11854               /* Check for possible overflow on 0x8000000000000000.  */
11855               if (v < 0)
11856                 {
11857                   strcpy (buf, "9223372036854775808");
11858                   return;
11859                 }
11860             }
11861           if (!v)
11862             {
11863               strcpy (buf, "0");
11864               return;
11865             }
11866
11867           i = 0;
11868           tmp[29] = 0;
11869           while (v)
11870             {
11871               tmp[28 - i] = (v % 10) + '0';
11872               v /= 10;
11873               i++;
11874             }
11875           strcpy (buf, tmp + 29 - i);
11876         }
11877     }
11878   else
11879     {
11880       if (hex)
11881         sprintf (buf, "0x%x", (unsigned int) disp);
11882       else
11883         sprintf (buf, "%d", (int) disp);
11884     }
11885 }
11886
11887 /* Put DISP in BUF as signed hex number.  */
11888
11889 static void
11890 print_displacement (char *buf, bfd_vma disp)
11891 {
11892   bfd_signed_vma val = disp;
11893   char tmp[30];
11894   int i, j = 0;
11895
11896   if (val < 0)
11897     {
11898       buf[j++] = '-';
11899       val = -disp;
11900
11901       /* Check for possible overflow.  */
11902       if (val < 0)
11903         {
11904           switch (address_mode)
11905             {
11906             case mode_64bit:
11907               strcpy (buf + j, "0x8000000000000000");
11908               break;
11909             case mode_32bit:
11910               strcpy (buf + j, "0x80000000");
11911               break;
11912             case mode_16bit:
11913               strcpy (buf + j, "0x8000");
11914               break;
11915             }
11916           return;
11917         }
11918     }
11919
11920   buf[j++] = '0';
11921   buf[j++] = 'x';
11922
11923   sprintf_vma (tmp, (bfd_vma) val);
11924   for (i = 0; tmp[i] == '0'; i++)
11925     continue;
11926   if (tmp[i] == '\0')
11927     i--;
11928   strcpy (buf + j, tmp + i);
11929 }
11930
11931 static void
11932 intel_operand_size (int bytemode, int sizeflag)
11933 {
11934   switch (bytemode)
11935     {
11936     case b_mode:
11937     case b_swap_mode:
11938     case dqb_mode:
11939       oappend ("BYTE PTR ");
11940       break;
11941     case w_mode:
11942     case dqw_mode:
11943       oappend ("WORD PTR ");
11944       break;
11945     case stack_v_mode:
11946       if (address_mode == mode_64bit && (sizeflag & DFLAG))
11947         {
11948           oappend ("QWORD PTR ");
11949           break;
11950         }
11951       /* FALLTHRU */
11952     case v_mode:
11953     case v_swap_mode:
11954     case dq_mode:
11955       USED_REX (REX_W);
11956       if (rex & REX_W)
11957         oappend ("QWORD PTR ");
11958       else
11959         {
11960           if ((sizeflag & DFLAG) || bytemode == dq_mode)
11961             oappend ("DWORD PTR ");
11962           else
11963             oappend ("WORD PTR ");
11964           used_prefixes |= (prefixes & PREFIX_DATA);
11965         }
11966       break;
11967     case z_mode:
11968       if ((rex & REX_W) || (sizeflag & DFLAG))
11969         *obufp++ = 'D';
11970       oappend ("WORD PTR ");
11971       if (!(rex & REX_W))
11972         used_prefixes |= (prefixes & PREFIX_DATA);
11973       break;
11974     case a_mode:
11975       if (sizeflag & DFLAG)
11976         oappend ("QWORD PTR ");
11977       else
11978         oappend ("DWORD PTR ");
11979       used_prefixes |= (prefixes & PREFIX_DATA);
11980       break;
11981     case d_mode:
11982     case d_swap_mode:
11983     case dqd_mode:
11984       oappend ("DWORD PTR ");
11985       break;
11986     case q_mode:
11987     case q_swap_mode:
11988       oappend ("QWORD PTR ");
11989       break;
11990     case m_mode:
11991       if (address_mode == mode_64bit)
11992         oappend ("QWORD PTR ");
11993       else
11994         oappend ("DWORD PTR ");
11995       break;
11996     case f_mode:
11997       if (sizeflag & DFLAG)
11998         oappend ("FWORD PTR ");
11999       else
12000         oappend ("DWORD PTR ");
12001       used_prefixes |= (prefixes & PREFIX_DATA);
12002       break;
12003     case t_mode:
12004       oappend ("TBYTE PTR ");
12005       break;
12006     case x_mode:
12007     case x_swap_mode:
12008       if (need_vex)
12009         {
12010           switch (vex.length)
12011             {
12012             case 128:
12013               oappend ("XMMWORD PTR ");
12014               break;
12015             case 256:
12016               oappend ("YMMWORD PTR ");
12017               break;
12018             default:
12019               abort ();
12020             }
12021         }
12022       else
12023         oappend ("XMMWORD PTR ");
12024       break;
12025     case xmm_mode:
12026       oappend ("XMMWORD PTR ");
12027       break;
12028     case xmmq_mode:
12029       if (!need_vex)
12030         abort ();
12031
12032       switch (vex.length)
12033         {
12034         case 128:
12035           oappend ("QWORD PTR ");
12036           break;
12037         case 256:
12038           oappend ("XMMWORD PTR ");
12039           break;
12040         default:
12041           abort ();
12042         }
12043       break;
12044     case ymmq_mode:
12045       if (!need_vex)
12046         abort ();
12047
12048       switch (vex.length)
12049         {
12050         case 128:
12051           oappend ("QWORD PTR ");
12052           break;
12053         case 256:
12054           oappend ("YMMWORD PTR ");
12055           break;
12056         default:
12057           abort ();
12058         }
12059       break;
12060     case o_mode:
12061       oappend ("OWORD PTR ");
12062       break;
12063     case vex_w_dq_mode:
12064       if (!need_vex)
12065         abort ();
12066
12067       if (vex.w)
12068         oappend ("QWORD PTR ");
12069       else
12070         oappend ("DWORD PTR ");
12071       break;
12072     default:
12073       break;
12074     }
12075 }
12076
12077 static void
12078 OP_E_register (int bytemode, int sizeflag)
12079 {
12080   int reg = modrm.rm;
12081   const char **names;
12082
12083   USED_REX (REX_B);
12084   if ((rex & REX_B))
12085     reg += 8;
12086
12087   if ((sizeflag & SUFFIX_ALWAYS)
12088       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12089     swap_operand ();
12090
12091   switch (bytemode)
12092     {
12093     case b_mode:
12094     case b_swap_mode:
12095       USED_REX (0);
12096       if (rex)
12097         names = names8rex;
12098       else
12099         names = names8;
12100       break;
12101     case w_mode:
12102       names = names16;
12103       break;
12104     case d_mode:
12105       names = names32;
12106       break;
12107     case q_mode:
12108       names = names64;
12109       break;
12110     case m_mode:
12111       names = address_mode == mode_64bit ? names64 : names32;
12112       break;
12113     case stack_v_mode:
12114       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12115         {
12116           names = names64;
12117           break;
12118         }
12119       bytemode = v_mode;
12120       /* FALLTHRU */
12121     case v_mode:
12122     case v_swap_mode:
12123     case dq_mode:
12124     case dqb_mode:
12125     case dqd_mode:
12126     case dqw_mode:
12127       USED_REX (REX_W);
12128       if (rex & REX_W)
12129         names = names64;
12130       else
12131         {
12132           if ((sizeflag & DFLAG) 
12133               || (bytemode != v_mode
12134                   && bytemode != v_swap_mode))
12135             names = names32;
12136           else
12137             names = names16;
12138           used_prefixes |= (prefixes & PREFIX_DATA);
12139         }
12140       break;
12141     case 0:
12142       return;
12143     default:
12144       oappend (INTERNAL_DISASSEMBLER_ERROR);
12145       return;
12146     }
12147   oappend (names[reg]);
12148 }
12149
12150 static void
12151 OP_E_memory (int bytemode, int sizeflag)
12152 {
12153   bfd_vma disp = 0;
12154   int add = (rex & REX_B) ? 8 : 0;
12155   int riprel = 0;
12156
12157   USED_REX (REX_B);
12158   if (intel_syntax)
12159     intel_operand_size (bytemode, sizeflag);
12160   append_seg ();
12161
12162   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12163     {
12164       /* 32/64 bit address mode */
12165       int havedisp;
12166       int havesib;
12167       int havebase;
12168       int haveindex;
12169       int needindex;
12170       int base, rbase;
12171       int index = 0;
12172       int scale = 0;
12173
12174       havesib = 0;
12175       havebase = 1;
12176       haveindex = 0;
12177       base = modrm.rm;
12178
12179       if (base == 4)
12180         {
12181           havesib = 1;
12182           FETCH_DATA (the_info, codep + 1);
12183           index = (*codep >> 3) & 7;
12184           scale = (*codep >> 6) & 3;
12185           base = *codep & 7;
12186           USED_REX (REX_X);
12187           if (rex & REX_X)
12188             index += 8;
12189           haveindex = index != 4;
12190           codep++;
12191         }
12192       rbase = base + add;
12193
12194       switch (modrm.mod)
12195         {
12196         case 0:
12197           if (base == 5)
12198             {
12199               havebase = 0;
12200               if (address_mode == mode_64bit && !havesib)
12201                 riprel = 1;
12202               disp = get32s ();
12203             }
12204           break;
12205         case 1:
12206           FETCH_DATA (the_info, codep + 1);
12207           disp = *codep++;
12208           if ((disp & 0x80) != 0)
12209             disp -= 0x100;
12210           break;
12211         case 2:
12212           disp = get32s ();
12213           break;
12214         }
12215
12216       /* In 32bit mode, we need index register to tell [offset] from
12217          [eiz*1 + offset].  */
12218       needindex = (havesib
12219                    && !havebase
12220                    && !haveindex
12221                    && address_mode == mode_32bit);
12222       havedisp = (havebase
12223                   || needindex
12224                   || (havesib && (haveindex || scale != 0)));
12225
12226       if (!intel_syntax)
12227         if (modrm.mod != 0 || base == 5)
12228           {
12229             if (havedisp || riprel)
12230               print_displacement (scratchbuf, disp);
12231             else
12232               print_operand_value (scratchbuf, 1, disp);
12233             oappend (scratchbuf);
12234             if (riprel)
12235               {
12236                 set_op (disp, 1);
12237                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
12238               }
12239           }
12240
12241       if (havebase || haveindex || riprel)
12242         used_prefixes |= PREFIX_ADDR;
12243
12244       if (havedisp || (intel_syntax && riprel))
12245         {
12246           *obufp++ = open_char;
12247           if (intel_syntax && riprel)
12248             {
12249               set_op (disp, 1);
12250               oappend (sizeflag & AFLAG ? "rip" : "eip");
12251             }
12252           *obufp = '\0';
12253           if (havebase)
12254             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
12255                      ? names64[rbase] : names32[rbase]);
12256           if (havesib)
12257             {
12258               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12259                  print index to tell base + index from base.  */
12260               if (scale != 0
12261                   || needindex
12262                   || haveindex
12263                   || (havebase && base != ESP_REG_NUM))
12264                 {
12265                   if (!intel_syntax || havebase)
12266                     {
12267                       *obufp++ = separator_char;
12268                       *obufp = '\0';
12269                     }
12270                   if (haveindex)
12271                     oappend (address_mode == mode_64bit 
12272                              && (sizeflag & AFLAG)
12273                              ? names64[index] : names32[index]);
12274                   else
12275                     oappend (address_mode == mode_64bit 
12276                              && (sizeflag & AFLAG)
12277                              ? index64 : index32);
12278
12279                   *obufp++ = scale_char;
12280                   *obufp = '\0';
12281                   sprintf (scratchbuf, "%d", 1 << scale);
12282                   oappend (scratchbuf);
12283                 }
12284             }
12285           if (intel_syntax
12286               && (disp || modrm.mod != 0 || base == 5))
12287             {
12288               if (!havedisp || (bfd_signed_vma) disp >= 0)
12289                 {
12290                   *obufp++ = '+';
12291                   *obufp = '\0';
12292                 }
12293               else if (modrm.mod != 1 && disp != -disp)
12294                 {
12295                   *obufp++ = '-';
12296                   *obufp = '\0';
12297                   disp = - (bfd_signed_vma) disp;
12298                 }
12299
12300               if (havedisp)
12301                 print_displacement (scratchbuf, disp);
12302               else
12303                 print_operand_value (scratchbuf, 1, disp);
12304               oappend (scratchbuf);
12305             }
12306
12307           *obufp++ = close_char;
12308           *obufp = '\0';
12309         }
12310       else if (intel_syntax)
12311         {
12312           if (modrm.mod != 0 || base == 5)
12313             {
12314               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12315                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12316                 ;
12317               else
12318                 {
12319                   oappend (names_seg[ds_reg - es_reg]);
12320                   oappend (":");
12321                 }
12322               print_operand_value (scratchbuf, 1, disp);
12323               oappend (scratchbuf);
12324             }
12325         }
12326     }
12327   else
12328     {
12329       /* 16 bit address mode */
12330       used_prefixes |= prefixes & PREFIX_ADDR;
12331       switch (modrm.mod)
12332         {
12333         case 0:
12334           if (modrm.rm == 6)
12335             {
12336               disp = get16 ();
12337               if ((disp & 0x8000) != 0)
12338                 disp -= 0x10000;
12339             }
12340           break;
12341         case 1:
12342           FETCH_DATA (the_info, codep + 1);
12343           disp = *codep++;
12344           if ((disp & 0x80) != 0)
12345             disp -= 0x100;
12346           break;
12347         case 2:
12348           disp = get16 ();
12349           if ((disp & 0x8000) != 0)
12350             disp -= 0x10000;
12351           break;
12352         }
12353
12354       if (!intel_syntax)
12355         if (modrm.mod != 0 || modrm.rm == 6)
12356           {
12357             print_displacement (scratchbuf, disp);
12358             oappend (scratchbuf);
12359           }
12360
12361       if (modrm.mod != 0 || modrm.rm != 6)
12362         {
12363           *obufp++ = open_char;
12364           *obufp = '\0';
12365           oappend (index16[modrm.rm]);
12366           if (intel_syntax
12367               && (disp || modrm.mod != 0 || modrm.rm == 6))
12368             {
12369               if ((bfd_signed_vma) disp >= 0)
12370                 {
12371                   *obufp++ = '+';
12372                   *obufp = '\0';
12373                 }
12374               else if (modrm.mod != 1)
12375                 {
12376                   *obufp++ = '-';
12377                   *obufp = '\0';
12378                   disp = - (bfd_signed_vma) disp;
12379                 }
12380
12381               print_displacement (scratchbuf, disp);
12382               oappend (scratchbuf);
12383             }
12384
12385           *obufp++ = close_char;
12386           *obufp = '\0';
12387         }
12388       else if (intel_syntax)
12389         {
12390           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12391                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12392             ;
12393           else
12394             {
12395               oappend (names_seg[ds_reg - es_reg]);
12396               oappend (":");
12397             }
12398           print_operand_value (scratchbuf, 1, disp & 0xffff);
12399           oappend (scratchbuf);
12400         }
12401     }
12402 }
12403
12404 static void
12405 OP_E (int bytemode, int sizeflag)
12406 {
12407   /* Skip mod/rm byte.  */
12408   MODRM_CHECK;
12409   codep++;
12410
12411   if (modrm.mod == 3)
12412     OP_E_register (bytemode, sizeflag);
12413   else
12414     OP_E_memory (bytemode, sizeflag);
12415 }
12416
12417 static void
12418 OP_G (int bytemode, int sizeflag)
12419 {
12420   int add = 0;
12421   USED_REX (REX_R);
12422   if (rex & REX_R)
12423     add += 8;
12424   switch (bytemode)
12425     {
12426     case b_mode:
12427       USED_REX (0);
12428       if (rex)
12429         oappend (names8rex[modrm.reg + add]);
12430       else
12431         oappend (names8[modrm.reg + add]);
12432       break;
12433     case w_mode:
12434       oappend (names16[modrm.reg + add]);
12435       break;
12436     case d_mode:
12437       oappend (names32[modrm.reg + add]);
12438       break;
12439     case q_mode:
12440       oappend (names64[modrm.reg + add]);
12441       break;
12442     case v_mode:
12443     case dq_mode:
12444     case dqb_mode:
12445     case dqd_mode:
12446     case dqw_mode:
12447       USED_REX (REX_W);
12448       if (rex & REX_W)
12449         oappend (names64[modrm.reg + add]);
12450       else
12451         {
12452           if ((sizeflag & DFLAG) || bytemode != v_mode)
12453             oappend (names32[modrm.reg + add]);
12454           else
12455             oappend (names16[modrm.reg + add]);
12456           used_prefixes |= (prefixes & PREFIX_DATA);
12457         }
12458       break;
12459     case m_mode:
12460       if (address_mode == mode_64bit)
12461         oappend (names64[modrm.reg + add]);
12462       else
12463         oappend (names32[modrm.reg + add]);
12464       break;
12465     default:
12466       oappend (INTERNAL_DISASSEMBLER_ERROR);
12467       break;
12468     }
12469 }
12470
12471 static bfd_vma
12472 get64 (void)
12473 {
12474   bfd_vma x;
12475 #ifdef BFD64
12476   unsigned int a;
12477   unsigned int b;
12478
12479   FETCH_DATA (the_info, codep + 8);
12480   a = *codep++ & 0xff;
12481   a |= (*codep++ & 0xff) << 8;
12482   a |= (*codep++ & 0xff) << 16;
12483   a |= (*codep++ & 0xff) << 24;
12484   b = *codep++ & 0xff;
12485   b |= (*codep++ & 0xff) << 8;
12486   b |= (*codep++ & 0xff) << 16;
12487   b |= (*codep++ & 0xff) << 24;
12488   x = a + ((bfd_vma) b << 32);
12489 #else
12490   abort ();
12491   x = 0;
12492 #endif
12493   return x;
12494 }
12495
12496 static bfd_signed_vma
12497 get32 (void)
12498 {
12499   bfd_signed_vma x = 0;
12500
12501   FETCH_DATA (the_info, codep + 4);
12502   x = *codep++ & (bfd_signed_vma) 0xff;
12503   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12504   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12505   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12506   return x;
12507 }
12508
12509 static bfd_signed_vma
12510 get32s (void)
12511 {
12512   bfd_signed_vma x = 0;
12513
12514   FETCH_DATA (the_info, codep + 4);
12515   x = *codep++ & (bfd_signed_vma) 0xff;
12516   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
12517   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
12518   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
12519
12520   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
12521
12522   return x;
12523 }
12524
12525 static int
12526 get16 (void)
12527 {
12528   int x = 0;
12529
12530   FETCH_DATA (the_info, codep + 2);
12531   x = *codep++ & 0xff;
12532   x |= (*codep++ & 0xff) << 8;
12533   return x;
12534 }
12535
12536 static void
12537 set_op (bfd_vma op, int riprel)
12538 {
12539   op_index[op_ad] = op_ad;
12540   if (address_mode == mode_64bit)
12541     {
12542       op_address[op_ad] = op;
12543       op_riprel[op_ad] = riprel;
12544     }
12545   else
12546     {
12547       /* Mask to get a 32-bit address.  */
12548       op_address[op_ad] = op & 0xffffffff;
12549       op_riprel[op_ad] = riprel & 0xffffffff;
12550     }
12551 }
12552
12553 static void
12554 OP_REG (int code, int sizeflag)
12555 {
12556   const char *s;
12557   int add;
12558   USED_REX (REX_B);
12559   if (rex & REX_B)
12560     add = 8;
12561   else
12562     add = 0;
12563
12564   switch (code)
12565     {
12566     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12567     case sp_reg: case bp_reg: case si_reg: case di_reg:
12568       s = names16[code - ax_reg + add];
12569       break;
12570     case es_reg: case ss_reg: case cs_reg:
12571     case ds_reg: case fs_reg: case gs_reg:
12572       s = names_seg[code - es_reg + add];
12573       break;
12574     case al_reg: case ah_reg: case cl_reg: case ch_reg:
12575     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12576       USED_REX (0);
12577       if (rex)
12578         s = names8rex[code - al_reg + add];
12579       else
12580         s = names8[code - al_reg];
12581       break;
12582     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12583     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12584       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12585         {
12586           s = names64[code - rAX_reg + add];
12587           break;
12588         }
12589       code += eAX_reg - rAX_reg;
12590       /* Fall through.  */
12591     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12592     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12593       USED_REX (REX_W);
12594       if (rex & REX_W)
12595         s = names64[code - eAX_reg + add];
12596       else
12597         {
12598           if (sizeflag & DFLAG)
12599             s = names32[code - eAX_reg + add];
12600           else
12601             s = names16[code - eAX_reg + add];
12602           used_prefixes |= (prefixes & PREFIX_DATA);
12603         }
12604       break;
12605     default:
12606       s = INTERNAL_DISASSEMBLER_ERROR;
12607       break;
12608     }
12609   oappend (s);
12610 }
12611
12612 static void
12613 OP_IMREG (int code, int sizeflag)
12614 {
12615   const char *s;
12616
12617   switch (code)
12618     {
12619     case indir_dx_reg:
12620       if (intel_syntax)
12621         s = "dx";
12622       else
12623         s = "(%dx)";
12624       break;
12625     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12626     case sp_reg: case bp_reg: case si_reg: case di_reg:
12627       s = names16[code - ax_reg];
12628       break;
12629     case es_reg: case ss_reg: case cs_reg:
12630     case ds_reg: case fs_reg: case gs_reg:
12631       s = names_seg[code - es_reg];
12632       break;
12633     case al_reg: case ah_reg: case cl_reg: case ch_reg:
12634     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
12635       USED_REX (0);
12636       if (rex)
12637         s = names8rex[code - al_reg];
12638       else
12639         s = names8[code - al_reg];
12640       break;
12641     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12642     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12643       USED_REX (REX_W);
12644       if (rex & REX_W)
12645         s = names64[code - eAX_reg];
12646       else
12647         {
12648           if (sizeflag & DFLAG)
12649             s = names32[code - eAX_reg];
12650           else
12651             s = names16[code - eAX_reg];
12652           used_prefixes |= (prefixes & PREFIX_DATA);
12653         }
12654       break;
12655     case z_mode_ax_reg:
12656       if ((rex & REX_W) || (sizeflag & DFLAG))
12657         s = *names32;
12658       else
12659         s = *names16;
12660       if (!(rex & REX_W))
12661         used_prefixes |= (prefixes & PREFIX_DATA);
12662       break;
12663     default:
12664       s = INTERNAL_DISASSEMBLER_ERROR;
12665       break;
12666     }
12667   oappend (s);
12668 }
12669
12670 static void
12671 OP_I (int bytemode, int sizeflag)
12672 {
12673   bfd_signed_vma op;
12674   bfd_signed_vma mask = -1;
12675
12676   switch (bytemode)
12677     {
12678     case b_mode:
12679       FETCH_DATA (the_info, codep + 1);
12680       op = *codep++;
12681       mask = 0xff;
12682       break;
12683     case q_mode:
12684       if (address_mode == mode_64bit)
12685         {
12686           op = get32s ();
12687           break;
12688         }
12689       /* Fall through.  */
12690     case v_mode:
12691       USED_REX (REX_W);
12692       if (rex & REX_W)
12693         op = get32s ();
12694       else
12695         {
12696           if (sizeflag & DFLAG)
12697             {
12698               op = get32 ();
12699               mask = 0xffffffff;
12700             }
12701           else
12702             {
12703               op = get16 ();
12704               mask = 0xfffff;
12705             }
12706           used_prefixes |= (prefixes & PREFIX_DATA);
12707         }
12708       break;
12709     case w_mode:
12710       mask = 0xfffff;
12711       op = get16 ();
12712       break;
12713     case const_1_mode:
12714       if (intel_syntax)
12715         oappend ("1");
12716       return;
12717     default:
12718       oappend (INTERNAL_DISASSEMBLER_ERROR);
12719       return;
12720     }
12721
12722   op &= mask;
12723   scratchbuf[0] = '$';
12724   print_operand_value (scratchbuf + 1, 1, op);
12725   oappend (scratchbuf + intel_syntax);
12726   scratchbuf[0] = '\0';
12727 }
12728
12729 static void
12730 OP_I64 (int bytemode, int sizeflag)
12731 {
12732   bfd_signed_vma op;
12733   bfd_signed_vma mask = -1;
12734
12735   if (address_mode != mode_64bit)
12736     {
12737       OP_I (bytemode, sizeflag);
12738       return;
12739     }
12740
12741   switch (bytemode)
12742     {
12743     case b_mode:
12744       FETCH_DATA (the_info, codep + 1);
12745       op = *codep++;
12746       mask = 0xff;
12747       break;
12748     case v_mode:
12749       USED_REX (REX_W);
12750       if (rex & REX_W)
12751         op = get64 ();
12752       else
12753         {
12754           if (sizeflag & DFLAG)
12755             {
12756               op = get32 ();
12757               mask = 0xffffffff;
12758             }
12759           else
12760             {
12761               op = get16 ();
12762               mask = 0xfffff;
12763             }
12764           used_prefixes |= (prefixes & PREFIX_DATA);
12765         }
12766       break;
12767     case w_mode:
12768       mask = 0xfffff;
12769       op = get16 ();
12770       break;
12771     default:
12772       oappend (INTERNAL_DISASSEMBLER_ERROR);
12773       return;
12774     }
12775
12776   op &= mask;
12777   scratchbuf[0] = '$';
12778   print_operand_value (scratchbuf + 1, 1, op);
12779   oappend (scratchbuf + intel_syntax);
12780   scratchbuf[0] = '\0';
12781 }
12782
12783 static void
12784 OP_sI (int bytemode, int sizeflag)
12785 {
12786   bfd_signed_vma op;
12787   bfd_signed_vma mask = -1;
12788
12789   switch (bytemode)
12790     {
12791     case b_mode:
12792       FETCH_DATA (the_info, codep + 1);
12793       op = *codep++;
12794       if ((op & 0x80) != 0)
12795         op -= 0x100;
12796       mask = 0xffffffff;
12797       break;
12798     case v_mode:
12799       USED_REX (REX_W);
12800       if (rex & REX_W)
12801         op = get32s ();
12802       else
12803         {
12804           if (sizeflag & DFLAG)
12805             {
12806               op = get32s ();
12807               mask = 0xffffffff;
12808             }
12809           else
12810             {
12811               mask = 0xffffffff;
12812               op = get16 ();
12813               if ((op & 0x8000) != 0)
12814                 op -= 0x10000;
12815             }
12816           used_prefixes |= (prefixes & PREFIX_DATA);
12817         }
12818       break;
12819     case w_mode:
12820       op = get16 ();
12821       mask = 0xffffffff;
12822       if ((op & 0x8000) != 0)
12823         op -= 0x10000;
12824       break;
12825     default:
12826       oappend (INTERNAL_DISASSEMBLER_ERROR);
12827       return;
12828     }
12829
12830   scratchbuf[0] = '$';
12831   print_operand_value (scratchbuf + 1, 1, op);
12832   oappend (scratchbuf + intel_syntax);
12833 }
12834
12835 static void
12836 OP_J (int bytemode, int sizeflag)
12837 {
12838   bfd_vma disp;
12839   bfd_vma mask = -1;
12840   bfd_vma segment = 0;
12841
12842   switch (bytemode)
12843     {
12844     case b_mode:
12845       FETCH_DATA (the_info, codep + 1);
12846       disp = *codep++;
12847       if ((disp & 0x80) != 0)
12848         disp -= 0x100;
12849       break;
12850     case v_mode:
12851       USED_REX (REX_W);
12852       if ((sizeflag & DFLAG) || (rex & REX_W))
12853         disp = get32s ();
12854       else
12855         {
12856           disp = get16 ();
12857           if ((disp & 0x8000) != 0)
12858             disp -= 0x10000;
12859           /* In 16bit mode, address is wrapped around at 64k within
12860              the same segment.  Otherwise, a data16 prefix on a jump
12861              instruction means that the pc is masked to 16 bits after
12862              the displacement is added!  */
12863           mask = 0xffff;
12864           if ((prefixes & PREFIX_DATA) == 0)
12865             segment = ((start_pc + codep - start_codep)
12866                        & ~((bfd_vma) 0xffff));
12867         }
12868       if (!(rex & REX_W))
12869         used_prefixes |= (prefixes & PREFIX_DATA);
12870       break;
12871     default:
12872       oappend (INTERNAL_DISASSEMBLER_ERROR);
12873       return;
12874     }
12875   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
12876   set_op (disp, 0);
12877   print_operand_value (scratchbuf, 1, disp);
12878   oappend (scratchbuf);
12879 }
12880
12881 static void
12882 OP_SEG (int bytemode, int sizeflag)
12883 {
12884   if (bytemode == w_mode)
12885     oappend (names_seg[modrm.reg]);
12886   else
12887     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12888 }
12889
12890 static void
12891 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12892 {
12893   int seg, offset;
12894
12895   if (sizeflag & DFLAG)
12896     {
12897       offset = get32 ();
12898       seg = get16 ();
12899     }
12900   else
12901     {
12902       offset = get16 ();
12903       seg = get16 ();
12904     }
12905   used_prefixes |= (prefixes & PREFIX_DATA);
12906   if (intel_syntax)
12907     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12908   else
12909     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12910   oappend (scratchbuf);
12911 }
12912
12913 static void
12914 OP_OFF (int bytemode, int sizeflag)
12915 {
12916   bfd_vma off;
12917
12918   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12919     intel_operand_size (bytemode, sizeflag);
12920   append_seg ();
12921
12922   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12923     off = get32 ();
12924   else
12925     off = get16 ();
12926
12927   if (intel_syntax)
12928     {
12929       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12930                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12931         {
12932           oappend (names_seg[ds_reg - es_reg]);
12933           oappend (":");
12934         }
12935     }
12936   print_operand_value (scratchbuf, 1, off);
12937   oappend (scratchbuf);
12938 }
12939
12940 static void
12941 OP_OFF64 (int bytemode, int sizeflag)
12942 {
12943   bfd_vma off;
12944
12945   if (address_mode != mode_64bit
12946       || (prefixes & PREFIX_ADDR))
12947     {
12948       OP_OFF (bytemode, sizeflag);
12949       return;
12950     }
12951
12952   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12953     intel_operand_size (bytemode, sizeflag);
12954   append_seg ();
12955
12956   off = get64 ();
12957
12958   if (intel_syntax)
12959     {
12960       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12961                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
12962         {
12963           oappend (names_seg[ds_reg - es_reg]);
12964           oappend (":");
12965         }
12966     }
12967   print_operand_value (scratchbuf, 1, off);
12968   oappend (scratchbuf);
12969 }
12970
12971 static void
12972 ptr_reg (int code, int sizeflag)
12973 {
12974   const char *s;
12975
12976   *obufp++ = open_char;
12977   used_prefixes |= (prefixes & PREFIX_ADDR);
12978   if (address_mode == mode_64bit)
12979     {
12980       if (!(sizeflag & AFLAG))
12981         s = names32[code - eAX_reg];
12982       else
12983         s = names64[code - eAX_reg];
12984     }
12985   else if (sizeflag & AFLAG)
12986     s = names32[code - eAX_reg];
12987   else
12988     s = names16[code - eAX_reg];
12989   oappend (s);
12990   *obufp++ = close_char;
12991   *obufp = 0;
12992 }
12993
12994 static void
12995 OP_ESreg (int code, int sizeflag)
12996 {
12997   if (intel_syntax)
12998     {
12999       switch (codep[-1])
13000         {
13001         case 0x6d:      /* insw/insl */
13002           intel_operand_size (z_mode, sizeflag);
13003           break;
13004         case 0xa5:      /* movsw/movsl/movsq */
13005         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13006         case 0xab:      /* stosw/stosl */
13007         case 0xaf:      /* scasw/scasl */
13008           intel_operand_size (v_mode, sizeflag);
13009           break;
13010         default:
13011           intel_operand_size (b_mode, sizeflag);
13012         }
13013     }
13014   oappend ("%es:" + intel_syntax);
13015   ptr_reg (code, sizeflag);
13016 }
13017
13018 static void
13019 OP_DSreg (int code, int sizeflag)
13020 {
13021   if (intel_syntax)
13022     {
13023       switch (codep[-1])
13024         {
13025         case 0x6f:      /* outsw/outsl */
13026           intel_operand_size (z_mode, sizeflag);
13027           break;
13028         case 0xa5:      /* movsw/movsl/movsq */
13029         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13030         case 0xad:      /* lodsw/lodsl/lodsq */
13031           intel_operand_size (v_mode, sizeflag);
13032           break;
13033         default:
13034           intel_operand_size (b_mode, sizeflag);
13035         }
13036     }
13037   if ((prefixes
13038        & (PREFIX_CS
13039           | PREFIX_DS
13040           | PREFIX_SS
13041           | PREFIX_ES
13042           | PREFIX_FS
13043           | PREFIX_GS)) == 0)
13044     prefixes |= PREFIX_DS;
13045   append_seg ();
13046   ptr_reg (code, sizeflag);
13047 }
13048
13049 static void
13050 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13051 {
13052   int add;
13053   if (rex & REX_R)
13054     {
13055       USED_REX (REX_R);
13056       add = 8;
13057     }
13058   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13059     {
13060       all_prefixes[last_lock_prefix] = 0;
13061       used_prefixes |= PREFIX_LOCK;
13062       add = 8;
13063     }
13064   else
13065     add = 0;
13066   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13067   oappend (scratchbuf + intel_syntax);
13068 }
13069
13070 static void
13071 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13072 {
13073   int add;
13074   USED_REX (REX_R);
13075   if (rex & REX_R)
13076     add = 8;
13077   else
13078     add = 0;
13079   if (intel_syntax)
13080     sprintf (scratchbuf, "db%d", modrm.reg + add);
13081   else
13082     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13083   oappend (scratchbuf);
13084 }
13085
13086 static void
13087 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13088 {
13089   sprintf (scratchbuf, "%%tr%d", modrm.reg);
13090   oappend (scratchbuf + intel_syntax);
13091 }
13092
13093 static void
13094 OP_R (int bytemode, int sizeflag)
13095 {
13096   if (modrm.mod == 3)
13097     OP_E (bytemode, sizeflag);
13098   else
13099     BadOp ();
13100 }
13101
13102 static void
13103 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13104 {
13105   used_prefixes |= (prefixes & PREFIX_DATA);
13106   if (prefixes & PREFIX_DATA)
13107     {
13108       int add;
13109       USED_REX (REX_R);
13110       if (rex & REX_R)
13111         add = 8;
13112       else
13113         add = 0;
13114       sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
13115     }
13116   else
13117     sprintf (scratchbuf, "%%mm%d", modrm.reg);
13118   oappend (scratchbuf + intel_syntax);
13119 }
13120
13121 static void
13122 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13123 {
13124   int add;
13125   USED_REX (REX_R);
13126   if (rex & REX_R)
13127     add = 8;
13128   else
13129     add = 0;
13130   if (need_vex && bytemode != xmm_mode)
13131     {
13132       switch (vex.length)
13133         {
13134         case 128:
13135           sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
13136           break;
13137         case 256:
13138           sprintf (scratchbuf, "%%ymm%d", modrm.reg + add);
13139           break;
13140         default:
13141           abort ();
13142         }
13143     }
13144   else
13145     sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
13146   oappend (scratchbuf + intel_syntax);
13147 }
13148
13149 static void
13150 OP_EM (int bytemode, int sizeflag)
13151 {
13152   if (modrm.mod != 3)
13153     {
13154       if (intel_syntax
13155           && (bytemode == v_mode || bytemode == v_swap_mode))
13156         {
13157           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13158           used_prefixes |= (prefixes & PREFIX_DATA);
13159         }
13160       OP_E (bytemode, sizeflag);
13161       return;
13162     }
13163
13164   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13165     swap_operand ();
13166
13167   /* Skip mod/rm byte.  */
13168   MODRM_CHECK;
13169   codep++;
13170   used_prefixes |= (prefixes & PREFIX_DATA);
13171   if (prefixes & PREFIX_DATA)
13172     {
13173       int add;
13174
13175       USED_REX (REX_B);
13176       if (rex & REX_B)
13177         add = 8;
13178       else
13179         add = 0;
13180       sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
13181     }
13182   else
13183     sprintf (scratchbuf, "%%mm%d", modrm.rm);
13184   oappend (scratchbuf + intel_syntax);
13185 }
13186
13187 /* cvt* are the only instructions in sse2 which have
13188    both SSE and MMX operands and also have 0x66 prefix
13189    in their opcode. 0x66 was originally used to differentiate
13190    between SSE and MMX instruction(operands). So we have to handle the
13191    cvt* separately using OP_EMC and OP_MXC */
13192 static void
13193 OP_EMC (int bytemode, int sizeflag)
13194 {
13195   if (modrm.mod != 3)
13196     {
13197       if (intel_syntax && bytemode == v_mode)
13198         {
13199           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13200           used_prefixes |= (prefixes & PREFIX_DATA);
13201         }
13202       OP_E (bytemode, sizeflag);
13203       return;
13204     }
13205
13206   /* Skip mod/rm byte.  */
13207   MODRM_CHECK;
13208   codep++;
13209   used_prefixes |= (prefixes & PREFIX_DATA);
13210   sprintf (scratchbuf, "%%mm%d", modrm.rm);
13211   oappend (scratchbuf + intel_syntax);
13212 }
13213
13214 static void
13215 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13216 {
13217   used_prefixes |= (prefixes & PREFIX_DATA);
13218   sprintf (scratchbuf, "%%mm%d", modrm.reg);
13219   oappend (scratchbuf + intel_syntax);
13220 }
13221
13222 static void
13223 OP_EX (int bytemode, int sizeflag)
13224 {
13225   int add;
13226
13227   /* Skip mod/rm byte.  */
13228   MODRM_CHECK;
13229   codep++;
13230
13231   if (modrm.mod != 3)
13232     {
13233       OP_E_memory (bytemode, sizeflag);
13234       return;
13235     }
13236
13237   USED_REX (REX_B);
13238   if (rex & REX_B)
13239     add = 8;
13240   else
13241     add = 0;
13242
13243   if ((sizeflag & SUFFIX_ALWAYS)
13244       && (bytemode == x_swap_mode
13245           || bytemode == d_swap_mode
13246           || bytemode == q_swap_mode))
13247     swap_operand ();
13248
13249   if (need_vex
13250       && bytemode != xmm_mode
13251       && bytemode != xmmq_mode)
13252     {
13253       switch (vex.length)
13254         {
13255         case 128:
13256           sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
13257           break;
13258         case 256:
13259           sprintf (scratchbuf, "%%ymm%d", modrm.rm + add);
13260           break;
13261         default:
13262           abort ();
13263         }
13264     }
13265   else
13266     sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
13267   oappend (scratchbuf + intel_syntax);
13268 }
13269
13270 static void
13271 OP_MS (int bytemode, int sizeflag)
13272 {
13273   if (modrm.mod == 3)
13274     OP_EM (bytemode, sizeflag);
13275   else
13276     BadOp ();
13277 }
13278
13279 static void
13280 OP_XS (int bytemode, int sizeflag)
13281 {
13282   if (modrm.mod == 3)
13283     OP_EX (bytemode, sizeflag);
13284   else
13285     BadOp ();
13286 }
13287
13288 static void
13289 OP_M (int bytemode, int sizeflag)
13290 {
13291   if (modrm.mod == 3)
13292     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13293     BadOp ();
13294   else
13295     OP_E (bytemode, sizeflag);
13296 }
13297
13298 static void
13299 OP_0f07 (int bytemode, int sizeflag)
13300 {
13301   if (modrm.mod != 3 || modrm.rm != 0)
13302     BadOp ();
13303   else
13304     OP_E (bytemode, sizeflag);
13305 }
13306
13307 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13308    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13309
13310 static void
13311 NOP_Fixup1 (int bytemode, int sizeflag)
13312 {
13313   if ((prefixes & PREFIX_DATA) != 0
13314       || (rex != 0
13315           && rex != 0x48
13316           && address_mode == mode_64bit))
13317     OP_REG (bytemode, sizeflag);
13318   else
13319     strcpy (obuf, "nop");
13320 }
13321
13322 static void
13323 NOP_Fixup2 (int bytemode, int sizeflag)
13324 {
13325   if ((prefixes & PREFIX_DATA) != 0
13326       || (rex != 0
13327           && rex != 0x48
13328           && address_mode == mode_64bit))
13329     OP_IMREG (bytemode, sizeflag);
13330 }
13331
13332 static const char *const Suffix3DNow[] = {
13333 /* 00 */        NULL,           NULL,           NULL,           NULL,
13334 /* 04 */        NULL,           NULL,           NULL,           NULL,
13335 /* 08 */        NULL,           NULL,           NULL,           NULL,
13336 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
13337 /* 10 */        NULL,           NULL,           NULL,           NULL,
13338 /* 14 */        NULL,           NULL,           NULL,           NULL,
13339 /* 18 */        NULL,           NULL,           NULL,           NULL,
13340 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
13341 /* 20 */        NULL,           NULL,           NULL,           NULL,
13342 /* 24 */        NULL,           NULL,           NULL,           NULL,
13343 /* 28 */        NULL,           NULL,           NULL,           NULL,
13344 /* 2C */        NULL,           NULL,           NULL,           NULL,
13345 /* 30 */        NULL,           NULL,           NULL,           NULL,
13346 /* 34 */        NULL,           NULL,           NULL,           NULL,
13347 /* 38 */        NULL,           NULL,           NULL,           NULL,
13348 /* 3C */        NULL,           NULL,           NULL,           NULL,
13349 /* 40 */        NULL,           NULL,           NULL,           NULL,
13350 /* 44 */        NULL,           NULL,           NULL,           NULL,
13351 /* 48 */        NULL,           NULL,           NULL,           NULL,
13352 /* 4C */        NULL,           NULL,           NULL,           NULL,
13353 /* 50 */        NULL,           NULL,           NULL,           NULL,
13354 /* 54 */        NULL,           NULL,           NULL,           NULL,
13355 /* 58 */        NULL,           NULL,           NULL,           NULL,
13356 /* 5C */        NULL,           NULL,           NULL,           NULL,
13357 /* 60 */        NULL,           NULL,           NULL,           NULL,
13358 /* 64 */        NULL,           NULL,           NULL,           NULL,
13359 /* 68 */        NULL,           NULL,           NULL,           NULL,
13360 /* 6C */        NULL,           NULL,           NULL,           NULL,
13361 /* 70 */        NULL,           NULL,           NULL,           NULL,
13362 /* 74 */        NULL,           NULL,           NULL,           NULL,
13363 /* 78 */        NULL,           NULL,           NULL,           NULL,
13364 /* 7C */        NULL,           NULL,           NULL,           NULL,
13365 /* 80 */        NULL,           NULL,           NULL,           NULL,
13366 /* 84 */        NULL,           NULL,           NULL,           NULL,
13367 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
13368 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
13369 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
13370 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
13371 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
13372 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
13373 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
13374 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
13375 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
13376 /* AC */        NULL,           NULL,           "pfacc",        NULL,
13377 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
13378 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
13379 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
13380 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
13381 /* C0 */        NULL,           NULL,           NULL,           NULL,
13382 /* C4 */        NULL,           NULL,           NULL,           NULL,
13383 /* C8 */        NULL,           NULL,           NULL,           NULL,
13384 /* CC */        NULL,           NULL,           NULL,           NULL,
13385 /* D0 */        NULL,           NULL,           NULL,           NULL,
13386 /* D4 */        NULL,           NULL,           NULL,           NULL,
13387 /* D8 */        NULL,           NULL,           NULL,           NULL,
13388 /* DC */        NULL,           NULL,           NULL,           NULL,
13389 /* E0 */        NULL,           NULL,           NULL,           NULL,
13390 /* E4 */        NULL,           NULL,           NULL,           NULL,
13391 /* E8 */        NULL,           NULL,           NULL,           NULL,
13392 /* EC */        NULL,           NULL,           NULL,           NULL,
13393 /* F0 */        NULL,           NULL,           NULL,           NULL,
13394 /* F4 */        NULL,           NULL,           NULL,           NULL,
13395 /* F8 */        NULL,           NULL,           NULL,           NULL,
13396 /* FC */        NULL,           NULL,           NULL,           NULL,
13397 };
13398
13399 static void
13400 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13401 {
13402   const char *mnemonic;
13403
13404   FETCH_DATA (the_info, codep + 1);
13405   /* AMD 3DNow! instructions are specified by an opcode suffix in the
13406      place where an 8-bit immediate would normally go.  ie. the last
13407      byte of the instruction.  */
13408   obufp = mnemonicendp;
13409   mnemonic = Suffix3DNow[*codep++ & 0xff];
13410   if (mnemonic)
13411     oappend (mnemonic);
13412   else
13413     {
13414       /* Since a variable sized modrm/sib chunk is between the start
13415          of the opcode (0x0f0f) and the opcode suffix, we need to do
13416          all the modrm processing first, and don't know until now that
13417          we have a bad opcode.  This necessitates some cleaning up.  */
13418       op_out[0][0] = '\0';
13419       op_out[1][0] = '\0';
13420       BadOp ();
13421     }
13422   mnemonicendp = obufp;
13423 }
13424
13425 static struct op simd_cmp_op[] =
13426 {
13427   { STRING_COMMA_LEN ("eq") },
13428   { STRING_COMMA_LEN ("lt") },
13429   { STRING_COMMA_LEN ("le") },
13430   { STRING_COMMA_LEN ("unord") },
13431   { STRING_COMMA_LEN ("neq") },
13432   { STRING_COMMA_LEN ("nlt") },
13433   { STRING_COMMA_LEN ("nle") },
13434   { STRING_COMMA_LEN ("ord") }
13435 };
13436
13437 static void
13438 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13439 {
13440   unsigned int cmp_type;
13441
13442   FETCH_DATA (the_info, codep + 1);
13443   cmp_type = *codep++ & 0xff;
13444   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13445     {
13446       char suffix [3];
13447       char *p = mnemonicendp - 2;
13448       suffix[0] = p[0];
13449       suffix[1] = p[1];
13450       suffix[2] = '\0';
13451       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13452       mnemonicendp += simd_cmp_op[cmp_type].len;
13453     }
13454   else
13455     {
13456       /* We have a reserved extension byte.  Output it directly.  */
13457       scratchbuf[0] = '$';
13458       print_operand_value (scratchbuf + 1, 1, cmp_type);
13459       oappend (scratchbuf + intel_syntax);
13460       scratchbuf[0] = '\0';
13461     }
13462 }
13463
13464 static void
13465 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
13466           int sizeflag ATTRIBUTE_UNUSED)
13467 {
13468   /* mwait %eax,%ecx  */
13469   if (!intel_syntax)
13470     {
13471       const char **names = (address_mode == mode_64bit
13472                             ? names64 : names32);
13473       strcpy (op_out[0], names[0]);
13474       strcpy (op_out[1], names[1]);
13475       two_source_ops = 1;
13476     }
13477   /* Skip mod/rm byte.  */
13478   MODRM_CHECK;
13479   codep++;
13480 }
13481
13482 static void
13483 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13484             int sizeflag ATTRIBUTE_UNUSED)
13485 {
13486   /* monitor %eax,%ecx,%edx"  */
13487   if (!intel_syntax)
13488     {
13489       const char **op1_names;
13490       const char **names = (address_mode == mode_64bit
13491                             ? names64 : names32);
13492
13493       if (!(prefixes & PREFIX_ADDR))
13494         op1_names = (address_mode == mode_16bit
13495                      ? names16 : names);
13496       else
13497         {
13498           /* Remove "addr16/addr32".  */
13499           all_prefixes[last_addr_prefix] = 0;
13500           op1_names = (address_mode != mode_32bit
13501                        ? names32 : names16);
13502           used_prefixes |= PREFIX_ADDR;
13503         }
13504       strcpy (op_out[0], op1_names[0]);
13505       strcpy (op_out[1], names[1]);
13506       strcpy (op_out[2], names[2]);
13507       two_source_ops = 1;
13508     }
13509   /* Skip mod/rm byte.  */
13510   MODRM_CHECK;
13511   codep++;
13512 }
13513
13514 static void
13515 BadOp (void)
13516 {
13517   /* Throw away prefixes and 1st. opcode byte.  */
13518   codep = insn_codep + 1;
13519   oappend ("(bad)");
13520 }
13521
13522 static void
13523 REP_Fixup (int bytemode, int sizeflag)
13524 {
13525   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13526      lods and stos.  */
13527   if (prefixes & PREFIX_REPZ)
13528     all_prefixes[last_repz_prefix] = REP_PREFIX;
13529
13530   switch (bytemode)
13531     {
13532     case al_reg:
13533     case eAX_reg:
13534     case indir_dx_reg:
13535       OP_IMREG (bytemode, sizeflag);
13536       break;
13537     case eDI_reg:
13538       OP_ESreg (bytemode, sizeflag);
13539       break;
13540     case eSI_reg:
13541       OP_DSreg (bytemode, sizeflag);
13542       break;
13543     default:
13544       abort ();
13545       break;
13546     }
13547 }
13548
13549 static void
13550 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13551 {
13552   USED_REX (REX_W);
13553   if (rex & REX_W)
13554     {
13555       /* Change cmpxchg8b to cmpxchg16b.  */
13556       char *p = mnemonicendp - 2;
13557       mnemonicendp = stpcpy (p, "16b");
13558       bytemode = o_mode;
13559     }
13560   OP_M (bytemode, sizeflag);
13561 }
13562
13563 static void
13564 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13565 {
13566   if (need_vex)
13567     {
13568       switch (vex.length)
13569         {
13570         case 128:
13571           sprintf (scratchbuf, "%%xmm%d", reg);
13572           break;
13573         case 256:
13574           sprintf (scratchbuf, "%%ymm%d", reg);
13575           break;
13576         default:
13577           abort ();
13578         }
13579     }
13580   else
13581     sprintf (scratchbuf, "%%xmm%d", reg);
13582   oappend (scratchbuf + intel_syntax);
13583 }
13584
13585 static void
13586 CRC32_Fixup (int bytemode, int sizeflag)
13587 {
13588   /* Add proper suffix to "crc32".  */
13589   char *p = mnemonicendp;
13590
13591   switch (bytemode)
13592     {
13593     case b_mode:
13594       if (intel_syntax)
13595         goto skip;
13596
13597       *p++ = 'b';
13598       break;
13599     case v_mode:
13600       if (intel_syntax)
13601         goto skip;
13602
13603       USED_REX (REX_W);
13604       if (rex & REX_W)
13605         *p++ = 'q';
13606       else 
13607         {
13608           if (sizeflag & DFLAG)
13609             *p++ = 'l';
13610           else
13611             *p++ = 'w';
13612           used_prefixes |= (prefixes & PREFIX_DATA);
13613         }
13614       break;
13615     default:
13616       oappend (INTERNAL_DISASSEMBLER_ERROR);
13617       break;
13618     }
13619   mnemonicendp = p;
13620   *p = '\0';
13621
13622 skip:
13623   if (modrm.mod == 3)
13624     {
13625       int add;
13626
13627       /* Skip mod/rm byte.  */
13628       MODRM_CHECK;
13629       codep++;
13630
13631       USED_REX (REX_B);
13632       add = (rex & REX_B) ? 8 : 0;
13633       if (bytemode == b_mode)
13634         {
13635           USED_REX (0);
13636           if (rex)
13637             oappend (names8rex[modrm.rm + add]);
13638           else
13639             oappend (names8[modrm.rm + add]);
13640         }
13641       else
13642         {
13643           USED_REX (REX_W);
13644           if (rex & REX_W)
13645             oappend (names64[modrm.rm + add]);
13646           else if ((prefixes & PREFIX_DATA))
13647             oappend (names16[modrm.rm + add]);
13648           else
13649             oappend (names32[modrm.rm + add]);
13650         }
13651     }
13652   else
13653     OP_E (bytemode, sizeflag);
13654 }
13655
13656 /* Display the destination register operand for instructions with
13657    VEX. */
13658
13659 static void
13660 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13661 {
13662   if (!need_vex)
13663     abort ();
13664
13665   if (!need_vex_reg)
13666     return;
13667
13668   switch (vex.length)
13669     {
13670     case 128:
13671       switch (bytemode)
13672         {
13673         case vex_mode:
13674         case vex128_mode:
13675           break;
13676         default:
13677           abort ();
13678           return;
13679         }
13680
13681       sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13682       break;
13683     case 256:
13684       switch (bytemode)
13685         {
13686         case vex_mode:
13687         case vex256_mode:
13688           break;
13689         default:
13690           abort ();
13691           return;
13692         }
13693
13694       sprintf (scratchbuf, "%%ymm%d", vex.register_specifier);
13695       break;
13696     default:
13697       abort ();
13698       break;
13699     }
13700   oappend (scratchbuf + intel_syntax);
13701 }
13702
13703 /* Get the VEX immediate byte without moving codep.  */
13704
13705 static unsigned char
13706 get_vex_imm8 (int sizeflag)
13707 {
13708   int bytes_before_imm = 0;
13709
13710   /* Skip mod/rm byte.   */
13711   MODRM_CHECK;
13712   codep++;
13713
13714   if (modrm.mod != 3)
13715     {
13716       /* There are SIB/displacement bytes.  */
13717       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13718         {
13719           /* 32/64 bit address mode */
13720           int base = modrm.rm;
13721
13722           /* Check SIB byte.  */
13723           if (base == 4)
13724             {
13725               FETCH_DATA (the_info, codep + 1);
13726               base = *codep & 7;
13727               bytes_before_imm++;
13728             }
13729
13730           switch (modrm.mod)
13731             {
13732             case 0:
13733               /* When modrm.rm == 5 or modrm.rm == 4 and base in
13734                  SIB == 5, there is a 4 byte displacement.  */
13735               if (base != 5)
13736                 /* No displacement. */
13737                 break;
13738             case 2:
13739               /* 4 byte displacement.  */
13740               bytes_before_imm += 4;
13741               break;
13742             case 1:
13743               /* 1 byte displacement.  */
13744               bytes_before_imm++;
13745               break;
13746             }
13747         }
13748       else
13749         { /* 16 bit address mode */
13750           switch (modrm.mod)
13751             {
13752             case 0:
13753               /* When modrm.rm == 6, there is a 2 byte displacement.  */
13754               if (modrm.rm != 6)
13755                 /* No displacement. */
13756                 break;
13757             case 2:
13758               /* 2 byte displacement.  */
13759               bytes_before_imm += 2;
13760               break;
13761             case 1:
13762               /* 1 byte displacement.  */
13763               bytes_before_imm++;
13764               break;
13765             }
13766         }
13767     }
13768
13769   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
13770   return codep [bytes_before_imm];
13771 }
13772
13773 static void
13774 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
13775 {
13776   if (reg == -1 && modrm.mod != 3)
13777     {
13778       OP_E_memory (bytemode, sizeflag);
13779       return;
13780     }
13781   else
13782     {
13783       if (reg == -1)
13784         {
13785           reg = modrm.rm;
13786           USED_REX (REX_B);
13787           if (rex & REX_B)
13788             reg += 8;
13789         }
13790       else if (reg > 7 && address_mode != mode_64bit)
13791         BadOp ();
13792     }
13793
13794   switch (vex.length)
13795     {
13796     case 128:
13797       sprintf (scratchbuf, "%%xmm%d", reg);
13798       break;
13799     case 256:
13800       sprintf (scratchbuf, "%%ymm%d", reg);
13801       break;
13802     default:
13803       abort ();
13804     }
13805   oappend (scratchbuf + intel_syntax);
13806 }
13807
13808 static void
13809 OP_Vex_2src (int bytemode, int sizeflag)
13810 {
13811   if (modrm.mod == 3)
13812     {
13813       USED_REX (REX_B);
13814       sprintf (scratchbuf, "%%xmm%d", rex & REX_B ? modrm.rm + 8 : modrm.rm);
13815       oappend (scratchbuf + intel_syntax);
13816     }
13817   else
13818     {
13819       if (intel_syntax
13820           && (bytemode == v_mode || bytemode == v_swap_mode))
13821         {
13822           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13823           used_prefixes |= (prefixes & PREFIX_DATA);
13824         }
13825       OP_E (bytemode, sizeflag);
13826     }
13827 }
13828
13829 static void
13830 OP_Vex_2src_1 (int bytemode, int sizeflag)
13831 {
13832   if (modrm.mod == 3)
13833     {
13834       /* Skip mod/rm byte.   */
13835       MODRM_CHECK;
13836       codep++;
13837     }
13838
13839   if (vex.w)
13840     {
13841       sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13842       oappend (scratchbuf + intel_syntax);
13843     }
13844   else
13845     OP_Vex_2src (bytemode, sizeflag);
13846 }
13847
13848 static void
13849 OP_Vex_2src_2 (int bytemode, int sizeflag)
13850 {
13851   if (vex.w)
13852     OP_Vex_2src (bytemode, sizeflag);
13853   else
13854     {
13855       sprintf (scratchbuf, "%%xmm%d", vex.register_specifier);
13856       oappend (scratchbuf + intel_syntax);
13857     }
13858 }
13859
13860 static void
13861 OP_EX_VexW (int bytemode, int sizeflag)
13862 {
13863   int reg = -1;
13864
13865   if (!vex_w_done)
13866     {
13867       vex_w_done = 1;
13868       if (vex.w)
13869         reg = get_vex_imm8 (sizeflag) >> 4;
13870     }
13871   else
13872     {
13873       if (!vex.w)
13874         reg = get_vex_imm8 (sizeflag) >> 4;
13875     }
13876
13877   OP_EX_VexReg (bytemode, sizeflag, reg);
13878 }
13879
13880 static void
13881 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
13882              int sizeflag ATTRIBUTE_UNUSED)
13883 {
13884   /* Skip the immediate byte and check for invalid bits.  */
13885   FETCH_DATA (the_info, codep + 1);
13886   if (*codep++ & 0xf)
13887     BadOp ();
13888 }
13889
13890 static void
13891 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13892 {
13893   int reg;
13894   FETCH_DATA (the_info, codep + 1);
13895   reg = *codep++;
13896
13897   if (bytemode != x_mode)
13898     abort ();
13899
13900   if (reg & 0xf)
13901       BadOp ();
13902
13903   reg >>= 4;
13904   if (reg > 7 && address_mode != mode_64bit)
13905     BadOp ();
13906
13907   switch (vex.length)
13908     {
13909     case 128:
13910       sprintf (scratchbuf, "%%xmm%d", reg);
13911       break;
13912     case 256:
13913       sprintf (scratchbuf, "%%ymm%d", reg);
13914       break;
13915     default:
13916       abort ();
13917     }
13918   oappend (scratchbuf + intel_syntax);
13919 }
13920
13921 static void
13922 OP_XMM_VexW (int bytemode, int sizeflag)
13923 {
13924   /* Turn off the REX.W bit since it is used for swapping operands
13925      now.  */
13926   rex &= ~REX_W;
13927   OP_XMM (bytemode, sizeflag);
13928 }
13929
13930 static void
13931 OP_EX_Vex (int bytemode, int sizeflag)
13932 {
13933   if (modrm.mod != 3)
13934     {
13935       if (vex.register_specifier != 0)
13936         BadOp ();
13937       need_vex_reg = 0;
13938     }
13939   OP_EX (bytemode, sizeflag);
13940 }
13941
13942 static void
13943 OP_XMM_Vex (int bytemode, int sizeflag)
13944 {
13945   if (modrm.mod != 3)
13946     {
13947       if (vex.register_specifier != 0)
13948         BadOp ();
13949       need_vex_reg = 0;
13950     }
13951   OP_XMM (bytemode, sizeflag);
13952 }
13953
13954 static void
13955 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13956 {
13957   switch (vex.length)
13958     {
13959     case 128:
13960       mnemonicendp = stpcpy (obuf, "vzeroupper");
13961       break;
13962     case 256:
13963       mnemonicendp = stpcpy (obuf, "vzeroall");
13964       break;
13965     default:
13966       abort ();
13967     }
13968 }
13969
13970 static struct op vex_cmp_op[] =
13971 {
13972   { STRING_COMMA_LEN ("eq") },
13973   { STRING_COMMA_LEN ("lt") },
13974   { STRING_COMMA_LEN ("le") },
13975   { STRING_COMMA_LEN ("unord") },
13976   { STRING_COMMA_LEN ("neq") },
13977   { STRING_COMMA_LEN ("nlt") },
13978   { STRING_COMMA_LEN ("nle") },
13979   { STRING_COMMA_LEN ("ord") },
13980   { STRING_COMMA_LEN ("eq_uq") },
13981   { STRING_COMMA_LEN ("nge") },
13982   { STRING_COMMA_LEN ("ngt") },
13983   { STRING_COMMA_LEN ("false") },
13984   { STRING_COMMA_LEN ("neq_oq") },
13985   { STRING_COMMA_LEN ("ge") },
13986   { STRING_COMMA_LEN ("gt") },
13987   { STRING_COMMA_LEN ("true") },
13988   { STRING_COMMA_LEN ("eq_os") },
13989   { STRING_COMMA_LEN ("lt_oq") },
13990   { STRING_COMMA_LEN ("le_oq") },
13991   { STRING_COMMA_LEN ("unord_s") },
13992   { STRING_COMMA_LEN ("neq_us") },
13993   { STRING_COMMA_LEN ("nlt_uq") },
13994   { STRING_COMMA_LEN ("nle_uq") },
13995   { STRING_COMMA_LEN ("ord_s") },
13996   { STRING_COMMA_LEN ("eq_us") },
13997   { STRING_COMMA_LEN ("nge_uq") },
13998   { STRING_COMMA_LEN ("ngt_uq") },
13999   { STRING_COMMA_LEN ("false_os") },
14000   { STRING_COMMA_LEN ("neq_os") },
14001   { STRING_COMMA_LEN ("ge_oq") },
14002   { STRING_COMMA_LEN ("gt_oq") },
14003   { STRING_COMMA_LEN ("true_us") },
14004 };
14005
14006 static void
14007 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14008 {
14009   unsigned int cmp_type;
14010
14011   FETCH_DATA (the_info, codep + 1);
14012   cmp_type = *codep++ & 0xff;
14013   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
14014     {
14015       char suffix [3];
14016       char *p = mnemonicendp - 2;
14017       suffix[0] = p[0];
14018       suffix[1] = p[1];
14019       suffix[2] = '\0';
14020       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
14021       mnemonicendp += vex_cmp_op[cmp_type].len;
14022     }
14023   else
14024     {
14025       /* We have a reserved extension byte.  Output it directly.  */
14026       scratchbuf[0] = '$';
14027       print_operand_value (scratchbuf + 1, 1, cmp_type);
14028       oappend (scratchbuf + intel_syntax);
14029       scratchbuf[0] = '\0';
14030     }
14031 }
14032
14033 static const struct op pclmul_op[] =
14034 {
14035   { STRING_COMMA_LEN ("lql") },
14036   { STRING_COMMA_LEN ("hql") },
14037   { STRING_COMMA_LEN ("lqh") },
14038   { STRING_COMMA_LEN ("hqh") }
14039 };
14040
14041 static void
14042 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14043               int sizeflag ATTRIBUTE_UNUSED)
14044 {
14045   unsigned int pclmul_type;
14046
14047   FETCH_DATA (the_info, codep + 1);
14048   pclmul_type = *codep++ & 0xff;
14049   switch (pclmul_type)
14050     {
14051     case 0x10:
14052       pclmul_type = 2;
14053       break;
14054     case 0x11:
14055       pclmul_type = 3;
14056       break;
14057     default:
14058       break;
14059     } 
14060   if (pclmul_type < ARRAY_SIZE (pclmul_op))
14061     {
14062       char suffix [4];
14063       char *p = mnemonicendp - 3;
14064       suffix[0] = p[0];
14065       suffix[1] = p[1];
14066       suffix[2] = p[2];
14067       suffix[3] = '\0';
14068       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14069       mnemonicendp += pclmul_op[pclmul_type].len;
14070     }
14071   else
14072     {
14073       /* We have a reserved extension byte.  Output it directly.  */
14074       scratchbuf[0] = '$';
14075       print_operand_value (scratchbuf + 1, 1, pclmul_type);
14076       oappend (scratchbuf + intel_syntax);
14077       scratchbuf[0] = '\0';
14078     }
14079 }
14080
14081 static void
14082 MOVBE_Fixup (int bytemode, int sizeflag)
14083 {
14084   /* Add proper suffix to "movbe".  */
14085   char *p = mnemonicendp;
14086
14087   switch (bytemode)
14088     {
14089     case v_mode:
14090       if (intel_syntax)
14091         goto skip;
14092
14093       USED_REX (REX_W);
14094       if (sizeflag & SUFFIX_ALWAYS)
14095         {
14096           if (rex & REX_W)
14097             *p++ = 'q';
14098           else
14099             {
14100               if (sizeflag & DFLAG)
14101                 *p++ = 'l';
14102               else
14103                 *p++ = 'w';
14104               used_prefixes |= (prefixes & PREFIX_DATA);
14105             }
14106         }
14107       break;
14108     default:
14109       oappend (INTERNAL_DISASSEMBLER_ERROR);
14110       break;
14111     }
14112   mnemonicendp = p;
14113   *p = '\0';
14114
14115 skip:
14116   OP_M (bytemode, sizeflag);
14117 }
14118
14119 static void
14120 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14121 {
14122   int reg;
14123   const char **names;
14124
14125   /* Skip mod/rm byte.  */
14126   MODRM_CHECK;
14127   codep++;
14128
14129   if (vex.w)
14130     names = names64;
14131   else if (vex.length == 256)
14132     names = names32;
14133   else
14134     names = names16;
14135
14136   reg = modrm.rm;
14137   USED_REX (REX_B);
14138   if (rex & REX_B)
14139     reg += 8;
14140
14141   oappend (names[reg]);
14142 }
14143
14144 static void
14145 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14146 {
14147   const char **names;
14148
14149   if (vex.w)
14150     names = names64;
14151   else if (vex.length == 256)
14152     names = names32;
14153   else
14154     names = names16;
14155
14156   oappend (names[vex.register_specifier]);
14157 }
14158
14159 static void
14160 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
14161 {
14162   if (vex.w || vex.length == 256)
14163     OP_I (q_mode, sizeflag);
14164   else
14165     OP_I (w_mode, sizeflag);
14166 }
14167