OSDN Git Service

Merge commit '97841852f4cb6c2' into tmp
[pf3gnuchains/pf3gnuchains4x.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5
6    This file is part of the GNU opcodes library.
7
8    This library is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    It is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22
23
24 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
25    July 1988
26     modified by John Hassey (hassey@dg-rtp.dg.com)
27     x86-64 support added by Jan Hubicka (jh@suse.cz)
28     VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
29
30 /* The main tables describing the instructions is essentially a copy
31    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
32    Programmers Manual.  Usually, there is a capital letter, followed
33    by a small letter.  The capital letter tell the addressing mode,
34    and the small letter tells about the operand size.  Refer to
35    the Intel manual for details.  */
36
37 #include "sysdep.h"
38 #include "dis-asm.h"
39 #include "opintl.h"
40 #include "opcode/i386.h"
41 #include "libiberty.h"
42
43 #include <setjmp.h>
44
45 static int print_insn (bfd_vma, disassemble_info *);
46 static void dofloat (int);
47 static void OP_ST (int, int);
48 static void OP_STi (int, int);
49 static int putop (const char *, int);
50 static void oappend (const char *);
51 static void append_seg (void);
52 static void OP_indirE (int, int);
53 static void print_operand_value (char *, int, bfd_vma);
54 static void OP_E_register (int, int);
55 static void OP_E_memory (int, int);
56 static void print_displacement (char *, bfd_vma);
57 static void OP_E (int, int);
58 static void OP_G (int, int);
59 static bfd_vma get64 (void);
60 static bfd_signed_vma get32 (void);
61 static bfd_signed_vma get32s (void);
62 static int get16 (void);
63 static void set_op (bfd_vma, int);
64 static void OP_Skip_MODRM (int, int);
65 static void OP_REG (int, int);
66 static void OP_IMREG (int, int);
67 static void OP_I (int, int);
68 static void OP_I64 (int, int);
69 static void OP_sI (int, int);
70 static void OP_J (int, int);
71 static void OP_SEG (int, int);
72 static void OP_DIR (int, int);
73 static void OP_OFF (int, int);
74 static void OP_OFF64 (int, int);
75 static void ptr_reg (int, int);
76 static void OP_ESreg (int, int);
77 static void OP_DSreg (int, int);
78 static void OP_C (int, int);
79 static void OP_D (int, int);
80 static void OP_T (int, int);
81 static void OP_R (int, int);
82 static void OP_MMX (int, int);
83 static void OP_XMM (int, int);
84 static void OP_EM (int, int);
85 static void OP_EX (int, int);
86 static void OP_EMC (int,int);
87 static void OP_MXC (int,int);
88 static void OP_MS (int, int);
89 static void OP_XS (int, int);
90 static void OP_M (int, int);
91 static void OP_VEX (int, int);
92 static void OP_EX_Vex (int, int);
93 static void OP_EX_VexW (int, int);
94 static void OP_XMM_Vex (int, int);
95 static void OP_XMM_VexW (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VEXI4_Fixup (int, int);
99 static void VZERO_Fixup (int, int);
100 static void VCMP_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void NOP_Fixup1 (int, int);
105 static void NOP_Fixup2 (int, int);
106 static void OP_3DNowSuffix (int, int);
107 static void CMP_Fixup (int, int);
108 static void BadOp (void);
109 static void REP_Fixup (int, int);
110 static void CMPXCHG8B_Fixup (int, int);
111 static void XMM_Fixup (int, int);
112 static void CRC32_Fixup (int, int);
113 static void FXSAVE_Fixup (int, int);
114 static void OP_LWPCB_E (int, int);
115 static void OP_LWP_E (int, int);
116 static void OP_LWP_I (int, int);
117 static void OP_Vex_2src_1 (int, int);
118 static void OP_Vex_2src_2 (int, int);
119
120 static void MOVBE_Fixup (int, int);
121
122 struct dis_private {
123   /* Points to first byte not fetched.  */
124   bfd_byte *max_fetched;
125   bfd_byte the_buffer[MAX_MNEM_SIZE];
126   bfd_vma insn_start;
127   int orig_sizeflag;
128   jmp_buf bailout;
129 };
130
131 enum address_mode
132 {
133   mode_16bit,
134   mode_32bit,
135   mode_64bit
136 };
137
138 enum address_mode address_mode;
139
140 /* Flags for the prefixes for the current instruction.  See below.  */
141 static int prefixes;
142
143 /* REX prefix the current instruction.  See below.  */
144 static int rex;
145 /* Bits of REX we've already used.  */
146 static int rex_used;
147 /* REX bits in original REX prefix ignored.  */
148 static int rex_ignored;
149 /* Mark parts used in the REX prefix.  When we are testing for
150    empty prefix (for 8bit register REX extension), just mask it
151    out.  Otherwise test for REX bit is excuse for existence of REX
152    only in case value is nonzero.  */
153 #define USED_REX(value)                                 \
154   {                                                     \
155     if (value)                                          \
156       {                                                 \
157         if ((rex & value))                              \
158           rex_used |= (value) | REX_OPCODE;             \
159       }                                                 \
160     else                                                \
161       rex_used |= REX_OPCODE;                           \
162   }
163
164 /* Flags for prefixes which we somehow handled when printing the
165    current instruction.  */
166 static int used_prefixes;
167
168 /* Flags stored in PREFIXES.  */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
172 #define PREFIX_CS 8
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
181
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
184    on error.  */
185 #define FETCH_DATA(info, addr) \
186   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187    ? 1 : fetch_data ((info), (addr)))
188
189 static int
190 fetch_data (struct disassemble_info *info, bfd_byte *addr)
191 {
192   int status;
193   struct dis_private *priv = (struct dis_private *) info->private_data;
194   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
195
196   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
197     status = (*info->read_memory_func) (start,
198                                         priv->max_fetched,
199                                         addr - priv->max_fetched,
200                                         info);
201   else
202     status = -1;
203   if (status != 0)
204     {
205       /* If we did manage to read at least one byte, then
206          print_insn_i386 will do something sensible.  Otherwise, print
207          an error.  We do that here because this is where we know
208          STATUS.  */
209       if (priv->max_fetched == priv->the_buffer)
210         (*info->memory_error_func) (status, start, info);
211       longjmp (priv->bailout, 1);
212     }
213   else
214     priv->max_fetched = addr;
215   return 1;
216 }
217
218 #define XX { NULL, 0 }
219
220 #define Eb { OP_E, b_mode }
221 #define EbS { OP_E, b_swap_mode }
222 #define Ev { OP_E, v_mode }
223 #define EvS { OP_E, v_swap_mode }
224 #define Ed { OP_E, d_mode }
225 #define Edq { OP_E, dq_mode }
226 #define Edqw { OP_E, dqw_mode }
227 #define Edqb { OP_E, dqb_mode }
228 #define Edqd { OP_E, dqd_mode }
229 #define Eq { OP_E, q_mode }
230 #define indirEv { OP_indirE, stack_v_mode }
231 #define indirEp { OP_indirE, f_mode }
232 #define stackEv { OP_E, stack_v_mode }
233 #define Em { OP_E, m_mode }
234 #define Ew { OP_E, w_mode }
235 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
236 #define Ma { OP_M, a_mode }
237 #define Mb { OP_M, b_mode }
238 #define Md { OP_M, d_mode }
239 #define Mo { OP_M, o_mode }
240 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
241 #define Mq { OP_M, q_mode }
242 #define Mx { OP_M, x_mode }
243 #define Mxmm { OP_M, xmm_mode }
244 #define Gb { OP_G, b_mode }
245 #define Gv { OP_G, v_mode }
246 #define Gd { OP_G, d_mode }
247 #define Gdq { OP_G, dq_mode }
248 #define Gm { OP_G, m_mode }
249 #define Gw { OP_G, w_mode }
250 #define Rd { OP_R, d_mode }
251 #define Rm { OP_R, m_mode }
252 #define Ib { OP_I, b_mode }
253 #define sIb { OP_sI, b_mode }   /* sign extened byte */
254 #define Iv { OP_I, v_mode }
255 #define Iq { OP_I, q_mode }
256 #define Iv64 { OP_I64, v_mode }
257 #define Iw { OP_I, w_mode }
258 #define I1 { OP_I, const_1_mode }
259 #define Jb { OP_J, b_mode }
260 #define Jv { OP_J, v_mode }
261 #define Cm { OP_C, m_mode }
262 #define Dm { OP_D, m_mode }
263 #define Td { OP_T, d_mode }
264 #define Skip_MODRM { OP_Skip_MODRM, 0 }
265
266 #define RMeAX { OP_REG, eAX_reg }
267 #define RMeBX { OP_REG, eBX_reg }
268 #define RMeCX { OP_REG, eCX_reg }
269 #define RMeDX { OP_REG, eDX_reg }
270 #define RMeSP { OP_REG, eSP_reg }
271 #define RMeBP { OP_REG, eBP_reg }
272 #define RMeSI { OP_REG, eSI_reg }
273 #define RMeDI { OP_REG, eDI_reg }
274 #define RMrAX { OP_REG, rAX_reg }
275 #define RMrBX { OP_REG, rBX_reg }
276 #define RMrCX { OP_REG, rCX_reg }
277 #define RMrDX { OP_REG, rDX_reg }
278 #define RMrSP { OP_REG, rSP_reg }
279 #define RMrBP { OP_REG, rBP_reg }
280 #define RMrSI { OP_REG, rSI_reg }
281 #define RMrDI { OP_REG, rDI_reg }
282 #define RMAL { OP_REG, al_reg }
283 #define RMAL { OP_REG, al_reg }
284 #define RMCL { OP_REG, cl_reg }
285 #define RMDL { OP_REG, dl_reg }
286 #define RMBL { OP_REG, bl_reg }
287 #define RMAH { OP_REG, ah_reg }
288 #define RMCH { OP_REG, ch_reg }
289 #define RMDH { OP_REG, dh_reg }
290 #define RMBH { OP_REG, bh_reg }
291 #define RMAX { OP_REG, ax_reg }
292 #define RMDX { OP_REG, dx_reg }
293
294 #define eAX { OP_IMREG, eAX_reg }
295 #define eBX { OP_IMREG, eBX_reg }
296 #define eCX { OP_IMREG, eCX_reg }
297 #define eDX { OP_IMREG, eDX_reg }
298 #define eSP { OP_IMREG, eSP_reg }
299 #define eBP { OP_IMREG, eBP_reg }
300 #define eSI { OP_IMREG, eSI_reg }
301 #define eDI { OP_IMREG, eDI_reg }
302 #define AL { OP_IMREG, al_reg }
303 #define CL { OP_IMREG, cl_reg }
304 #define DL { OP_IMREG, dl_reg }
305 #define BL { OP_IMREG, bl_reg }
306 #define AH { OP_IMREG, ah_reg }
307 #define CH { OP_IMREG, ch_reg }
308 #define DH { OP_IMREG, dh_reg }
309 #define BH { OP_IMREG, bh_reg }
310 #define AX { OP_IMREG, ax_reg }
311 #define DX { OP_IMREG, dx_reg }
312 #define zAX { OP_IMREG, z_mode_ax_reg }
313 #define indirDX { OP_IMREG, indir_dx_reg }
314
315 #define Sw { OP_SEG, w_mode }
316 #define Sv { OP_SEG, v_mode }
317 #define Ap { OP_DIR, 0 }
318 #define Ob { OP_OFF64, b_mode }
319 #define Ov { OP_OFF64, v_mode }
320 #define Xb { OP_DSreg, eSI_reg }
321 #define Xv { OP_DSreg, eSI_reg }
322 #define Xz { OP_DSreg, eSI_reg }
323 #define Yb { OP_ESreg, eDI_reg }
324 #define Yv { OP_ESreg, eDI_reg }
325 #define DSBX { OP_DSreg, eBX_reg }
326
327 #define es { OP_REG, es_reg }
328 #define ss { OP_REG, ss_reg }
329 #define cs { OP_REG, cs_reg }
330 #define ds { OP_REG, ds_reg }
331 #define fs { OP_REG, fs_reg }
332 #define gs { OP_REG, gs_reg }
333
334 #define MX { OP_MMX, 0 }
335 #define XM { OP_XMM, 0 }
336 #define XMM { OP_XMM, xmm_mode }
337 #define EM { OP_EM, v_mode }
338 #define EMS { OP_EM, v_swap_mode }
339 #define EMd { OP_EM, d_mode }
340 #define EMx { OP_EM, x_mode }
341 #define EXw { OP_EX, w_mode }
342 #define EXd { OP_EX, d_mode }
343 #define EXdS { OP_EX, d_swap_mode }
344 #define EXq { OP_EX, q_mode }
345 #define EXqS { OP_EX, q_swap_mode }
346 #define EXx { OP_EX, x_mode }
347 #define EXxS { OP_EX, x_swap_mode }
348 #define EXxmm { OP_EX, xmm_mode }
349 #define EXxmmq { OP_EX, xmmq_mode }
350 #define EXymmq { OP_EX, ymmq_mode }
351 #define EXVexWdq { OP_EX, vex_w_dq_mode }
352 #define MS { OP_MS, v_mode }
353 #define XS { OP_XS, v_mode }
354 #define EMCq { OP_EMC, q_mode }
355 #define MXC { OP_MXC, 0 }
356 #define OPSUF { OP_3DNowSuffix, 0 }
357 #define CMP { CMP_Fixup, 0 }
358 #define XMM0 { XMM_Fixup, 0 }
359 #define FXSAVE { FXSAVE_Fixup, 0 }
360 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
361 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
362
363 #define Vex { OP_VEX, vex_mode }
364 #define Vex128 { OP_VEX, vex128_mode }
365 #define Vex256 { OP_VEX, vex256_mode }
366 #define VexI4 { VEXI4_Fixup, 0}
367 #define EXdVex { OP_EX_Vex, d_mode }
368 #define EXdVexS { OP_EX_Vex, d_swap_mode }
369 #define EXqVex { OP_EX_Vex, q_mode }
370 #define EXqVexS { OP_EX_Vex, q_swap_mode }
371 #define EXVexW { OP_EX_VexW, x_mode }
372 #define EXdVexW { OP_EX_VexW, d_mode }
373 #define EXqVexW { OP_EX_VexW, q_mode }
374 #define XMVex { OP_XMM_Vex, 0 }
375 #define XMVexW { OP_XMM_VexW, 0 }
376 #define XMVexI4 { OP_REG_VexI4, x_mode }
377 #define PCLMUL { PCLMUL_Fixup, 0 }
378 #define VZERO { VZERO_Fixup, 0 }
379 #define VCMP { VCMP_Fixup, 0 }
380
381 /* Used handle "rep" prefix for string instructions.  */
382 #define Xbr { REP_Fixup, eSI_reg }
383 #define Xvr { REP_Fixup, eSI_reg }
384 #define Ybr { REP_Fixup, eDI_reg }
385 #define Yvr { REP_Fixup, eDI_reg }
386 #define Yzr { REP_Fixup, eDI_reg }
387 #define indirDXr { REP_Fixup, indir_dx_reg }
388 #define ALr { REP_Fixup, al_reg }
389 #define eAXr { REP_Fixup, eAX_reg }
390
391 #define cond_jump_flag { NULL, cond_jump_mode }
392 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
393
394 /* bits in sizeflag */
395 #define SUFFIX_ALWAYS 4
396 #define AFLAG 2
397 #define DFLAG 1
398
399 enum
400 {
401   /* byte operand */
402   b_mode = 1,
403   /* byte operand with operand swapped */
404   b_swap_mode,
405   /* operand size depends on prefixes */
406   v_mode,
407   /* operand size depends on prefixes with operand swapped */
408   v_swap_mode,
409   /* word operand */
410   w_mode,
411   /* double word operand  */
412   d_mode,
413   /* double word operand with operand swapped */
414   d_swap_mode,
415   /* quad word operand */
416   q_mode,
417   /* quad word operand with operand swapped */
418   q_swap_mode,
419   /* ten-byte operand */
420   t_mode,
421   /* 16-byte XMM or 32-byte YMM operand */
422   x_mode,
423   /* 16-byte XMM or 32-byte YMM operand with operand swapped */
424   x_swap_mode,
425   /* 16-byte XMM operand */
426   xmm_mode,
427   /* 16-byte XMM or quad word operand */
428   xmmq_mode,
429   /* 32-byte YMM or quad word operand */
430   ymmq_mode,
431   /* d_mode in 32bit, q_mode in 64bit mode.  */
432   m_mode,
433   /* pair of v_mode operands */
434   a_mode,
435   cond_jump_mode,
436   loop_jcxz_mode,
437   /* operand size depends on REX prefixes.  */
438   dq_mode,
439   /* registers like dq_mode, memory like w_mode.  */
440   dqw_mode,
441   /* 4- or 6-byte pointer operand */
442   f_mode,
443   const_1_mode,
444   /* v_mode for stack-related opcodes.  */
445   stack_v_mode,
446   /* non-quad operand size depends on prefixes */
447   z_mode,
448   /* 16-byte operand */
449   o_mode,
450   /* registers like dq_mode, memory like b_mode.  */
451   dqb_mode,
452   /* registers like dq_mode, memory like d_mode.  */
453   dqd_mode,
454   /* normal vex mode */
455   vex_mode,
456   /* 128bit vex mode */
457   vex128_mode,
458   /* 256bit vex mode */
459   vex256_mode,
460   /* operand size depends on the VEX.W bit.  */
461   vex_w_dq_mode,
462
463   es_reg,
464   cs_reg,
465   ss_reg,
466   ds_reg,
467   fs_reg,
468   gs_reg,
469
470   eAX_reg,
471   eCX_reg,
472   eDX_reg,
473   eBX_reg,
474   eSP_reg,
475   eBP_reg,
476   eSI_reg,
477   eDI_reg,
478
479   al_reg,
480   cl_reg,
481   dl_reg,
482   bl_reg,
483   ah_reg,
484   ch_reg,
485   dh_reg,
486   bh_reg,
487
488   ax_reg,
489   cx_reg,
490   dx_reg,
491   bx_reg,
492   sp_reg,
493   bp_reg,
494   si_reg,
495   di_reg,
496
497   rAX_reg,
498   rCX_reg,
499   rDX_reg,
500   rBX_reg,
501   rSP_reg,
502   rBP_reg,
503   rSI_reg,
504   rDI_reg,
505
506   z_mode_ax_reg,
507   indir_dx_reg
508 };
509
510 enum
511 {
512   FLOATCODE = 1,
513   USE_REG_TABLE,
514   USE_MOD_TABLE,
515   USE_RM_TABLE,
516   USE_PREFIX_TABLE,
517   USE_X86_64_TABLE,
518   USE_3BYTE_TABLE,
519   USE_XOP_8F_TABLE,
520   USE_VEX_C4_TABLE,
521   USE_VEX_C5_TABLE,
522   USE_VEX_LEN_TABLE,
523   USE_VEX_W_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 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
540
541 enum
542 {
543   REG_80 = 0,
544   REG_81,
545   REG_82,
546   REG_8F,
547   REG_C0,
548   REG_C1,
549   REG_C6,
550   REG_C7,
551   REG_D0,
552   REG_D1,
553   REG_D2,
554   REG_D3,
555   REG_F6,
556   REG_F7,
557   REG_FE,
558   REG_FF,
559   REG_0F00,
560   REG_0F01,
561   REG_0F0D,
562   REG_0F18,
563   REG_0F71,
564   REG_0F72,
565   REG_0F73,
566   REG_0FA6,
567   REG_0FA7,
568   REG_0FAE,
569   REG_0FBA,
570   REG_0FC7,
571   REG_VEX_71,
572   REG_VEX_72,
573   REG_VEX_73,
574   REG_VEX_AE,
575   REG_XOP_LWPCB,
576   REG_XOP_LWP
577 };
578
579 enum
580 {
581   MOD_8D = 0,
582   MOD_0F01_REG_0,
583   MOD_0F01_REG_1,
584   MOD_0F01_REG_2,
585   MOD_0F01_REG_3,
586   MOD_0F01_REG_7,
587   MOD_0F12_PREFIX_0,
588   MOD_0F13,
589   MOD_0F16_PREFIX_0,
590   MOD_0F17,
591   MOD_0F18_REG_0,
592   MOD_0F18_REG_1,
593   MOD_0F18_REG_2,
594   MOD_0F18_REG_3,
595   MOD_0F20,
596   MOD_0F21,
597   MOD_0F22,
598   MOD_0F23,
599   MOD_0F24,
600   MOD_0F26,
601   MOD_0F2B_PREFIX_0,
602   MOD_0F2B_PREFIX_1,
603   MOD_0F2B_PREFIX_2,
604   MOD_0F2B_PREFIX_3,
605   MOD_0F51,
606   MOD_0F71_REG_2,
607   MOD_0F71_REG_4,
608   MOD_0F71_REG_6,
609   MOD_0F72_REG_2,
610   MOD_0F72_REG_4,
611   MOD_0F72_REG_6,
612   MOD_0F73_REG_2,
613   MOD_0F73_REG_3,
614   MOD_0F73_REG_6,
615   MOD_0F73_REG_7,
616   MOD_0FAE_REG_0,
617   MOD_0FAE_REG_1,
618   MOD_0FAE_REG_2,
619   MOD_0FAE_REG_3,
620   MOD_0FAE_REG_4,
621   MOD_0FAE_REG_5,
622   MOD_0FAE_REG_6,
623   MOD_0FAE_REG_7,
624   MOD_0FB2,
625   MOD_0FB4,
626   MOD_0FB5,
627   MOD_0FC7_REG_6,
628   MOD_0FC7_REG_7,
629   MOD_0FD7,
630   MOD_0FE7_PREFIX_2,
631   MOD_0FF0_PREFIX_3,
632   MOD_0F382A_PREFIX_2,
633   MOD_62_32BIT,
634   MOD_C4_32BIT,
635   MOD_C5_32BIT,
636   MOD_VEX_12_PREFIX_0,
637   MOD_VEX_13,
638   MOD_VEX_16_PREFIX_0,
639   MOD_VEX_17,
640   MOD_VEX_2B,
641   MOD_VEX_50,
642   MOD_VEX_71_REG_2,
643   MOD_VEX_71_REG_4,
644   MOD_VEX_71_REG_6,
645   MOD_VEX_72_REG_2,
646   MOD_VEX_72_REG_4,
647   MOD_VEX_72_REG_6,
648   MOD_VEX_73_REG_2,
649   MOD_VEX_73_REG_3,
650   MOD_VEX_73_REG_6,
651   MOD_VEX_73_REG_7,
652   MOD_VEX_AE_REG_2,
653   MOD_VEX_AE_REG_3,
654   MOD_VEX_D7_PREFIX_2,
655   MOD_VEX_E7_PREFIX_2,
656   MOD_VEX_F0_PREFIX_3,
657   MOD_VEX_3818_PREFIX_2,
658   MOD_VEX_3819_PREFIX_2,
659   MOD_VEX_381A_PREFIX_2,
660   MOD_VEX_382A_PREFIX_2,
661   MOD_VEX_382C_PREFIX_2,
662   MOD_VEX_382D_PREFIX_2,
663   MOD_VEX_382E_PREFIX_2,
664   MOD_VEX_382F_PREFIX_2
665 };
666
667 enum
668 {
669   RM_0F01_REG_0 = 0,
670   RM_0F01_REG_1,
671   RM_0F01_REG_2,
672   RM_0F01_REG_3,
673   RM_0F01_REG_7,
674   RM_0FAE_REG_5,
675   RM_0FAE_REG_6,
676   RM_0FAE_REG_7
677 };
678
679 enum
680 {
681   PREFIX_90 = 0,
682   PREFIX_0F10,
683   PREFIX_0F11,
684   PREFIX_0F12,
685   PREFIX_0F16,
686   PREFIX_0F2A,
687   PREFIX_0F2B,
688   PREFIX_0F2C,
689   PREFIX_0F2D,
690   PREFIX_0F2E,
691   PREFIX_0F2F,
692   PREFIX_0F51,
693   PREFIX_0F52,
694   PREFIX_0F53,
695   PREFIX_0F58,
696   PREFIX_0F59,
697   PREFIX_0F5A,
698   PREFIX_0F5B,
699   PREFIX_0F5C,
700   PREFIX_0F5D,
701   PREFIX_0F5E,
702   PREFIX_0F5F,
703   PREFIX_0F60,
704   PREFIX_0F61,
705   PREFIX_0F62,
706   PREFIX_0F6C,
707   PREFIX_0F6D,
708   PREFIX_0F6F,
709   PREFIX_0F70,
710   PREFIX_0F73_REG_3,
711   PREFIX_0F73_REG_7,
712   PREFIX_0F78,
713   PREFIX_0F79,
714   PREFIX_0F7C,
715   PREFIX_0F7D,
716   PREFIX_0F7E,
717   PREFIX_0F7F,
718   PREFIX_0FB8,
719   PREFIX_0FBD,
720   PREFIX_0FC2,
721   PREFIX_0FC3,
722   PREFIX_0FC7_REG_6,
723   PREFIX_0FD0,
724   PREFIX_0FD6,
725   PREFIX_0FE6,
726   PREFIX_0FE7,
727   PREFIX_0FF0,
728   PREFIX_0FF7,
729   PREFIX_0F3810,
730   PREFIX_0F3814,
731   PREFIX_0F3815,
732   PREFIX_0F3817,
733   PREFIX_0F3820,
734   PREFIX_0F3821,
735   PREFIX_0F3822,
736   PREFIX_0F3823,
737   PREFIX_0F3824,
738   PREFIX_0F3825,
739   PREFIX_0F3828,
740   PREFIX_0F3829,
741   PREFIX_0F382A,
742   PREFIX_0F382B,
743   PREFIX_0F3830,
744   PREFIX_0F3831,
745   PREFIX_0F3832,
746   PREFIX_0F3833,
747   PREFIX_0F3834,
748   PREFIX_0F3835,
749   PREFIX_0F3837,
750   PREFIX_0F3838,
751   PREFIX_0F3839,
752   PREFIX_0F383A,
753   PREFIX_0F383B,
754   PREFIX_0F383C,
755   PREFIX_0F383D,
756   PREFIX_0F383E,
757   PREFIX_0F383F,
758   PREFIX_0F3840,
759   PREFIX_0F3841,
760   PREFIX_0F3880,
761   PREFIX_0F3881,
762   PREFIX_0F38DB,
763   PREFIX_0F38DC,
764   PREFIX_0F38DD,
765   PREFIX_0F38DE,
766   PREFIX_0F38DF,
767   PREFIX_0F38F0,
768   PREFIX_0F38F1,
769   PREFIX_0F3A08,
770   PREFIX_0F3A09,
771   PREFIX_0F3A0A,
772   PREFIX_0F3A0B,
773   PREFIX_0F3A0C,
774   PREFIX_0F3A0D,
775   PREFIX_0F3A0E,
776   PREFIX_0F3A14,
777   PREFIX_0F3A15,
778   PREFIX_0F3A16,
779   PREFIX_0F3A17,
780   PREFIX_0F3A20,
781   PREFIX_0F3A21,
782   PREFIX_0F3A22,
783   PREFIX_0F3A40,
784   PREFIX_0F3A41,
785   PREFIX_0F3A42,
786   PREFIX_0F3A44,
787   PREFIX_0F3A60,
788   PREFIX_0F3A61,
789   PREFIX_0F3A62,
790   PREFIX_0F3A63,
791   PREFIX_0F3ADF,
792   PREFIX_VEX_10,
793   PREFIX_VEX_11,
794   PREFIX_VEX_12,
795   PREFIX_VEX_16,
796   PREFIX_VEX_2A,
797   PREFIX_VEX_2C,
798   PREFIX_VEX_2D,
799   PREFIX_VEX_2E,
800   PREFIX_VEX_2F,
801   PREFIX_VEX_51,
802   PREFIX_VEX_52,
803   PREFIX_VEX_53,
804   PREFIX_VEX_58,
805   PREFIX_VEX_59,
806   PREFIX_VEX_5A,
807   PREFIX_VEX_5B,
808   PREFIX_VEX_5C,
809   PREFIX_VEX_5D,
810   PREFIX_VEX_5E,
811   PREFIX_VEX_5F,
812   PREFIX_VEX_60,
813   PREFIX_VEX_61,
814   PREFIX_VEX_62,
815   PREFIX_VEX_63,
816   PREFIX_VEX_64,
817   PREFIX_VEX_65,
818   PREFIX_VEX_66,
819   PREFIX_VEX_67,
820   PREFIX_VEX_68,
821   PREFIX_VEX_69,
822   PREFIX_VEX_6A,
823   PREFIX_VEX_6B,
824   PREFIX_VEX_6C,
825   PREFIX_VEX_6D,
826   PREFIX_VEX_6E,
827   PREFIX_VEX_6F,
828   PREFIX_VEX_70,
829   PREFIX_VEX_71_REG_2,
830   PREFIX_VEX_71_REG_4,
831   PREFIX_VEX_71_REG_6,
832   PREFIX_VEX_72_REG_2,
833   PREFIX_VEX_72_REG_4,
834   PREFIX_VEX_72_REG_6,
835   PREFIX_VEX_73_REG_2,
836   PREFIX_VEX_73_REG_3,
837   PREFIX_VEX_73_REG_6,
838   PREFIX_VEX_73_REG_7,
839   PREFIX_VEX_74,
840   PREFIX_VEX_75,
841   PREFIX_VEX_76,
842   PREFIX_VEX_77,
843   PREFIX_VEX_7C,
844   PREFIX_VEX_7D,
845   PREFIX_VEX_7E,
846   PREFIX_VEX_7F,
847   PREFIX_VEX_C2,
848   PREFIX_VEX_C4,
849   PREFIX_VEX_C5,
850   PREFIX_VEX_D0,
851   PREFIX_VEX_D1,
852   PREFIX_VEX_D2,
853   PREFIX_VEX_D3,
854   PREFIX_VEX_D4,
855   PREFIX_VEX_D5,
856   PREFIX_VEX_D6,
857   PREFIX_VEX_D7,
858   PREFIX_VEX_D8,
859   PREFIX_VEX_D9,
860   PREFIX_VEX_DA,
861   PREFIX_VEX_DB,
862   PREFIX_VEX_DC,
863   PREFIX_VEX_DD,
864   PREFIX_VEX_DE,
865   PREFIX_VEX_DF,
866   PREFIX_VEX_E0,
867   PREFIX_VEX_E1,
868   PREFIX_VEX_E2,
869   PREFIX_VEX_E3,
870   PREFIX_VEX_E4,
871   PREFIX_VEX_E5,
872   PREFIX_VEX_E6,
873   PREFIX_VEX_E7,
874   PREFIX_VEX_E8,
875   PREFIX_VEX_E9,
876   PREFIX_VEX_EA,
877   PREFIX_VEX_EB,
878   PREFIX_VEX_EC,
879   PREFIX_VEX_ED,
880   PREFIX_VEX_EE,
881   PREFIX_VEX_EF,
882   PREFIX_VEX_F0,
883   PREFIX_VEX_F1,
884   PREFIX_VEX_F2,
885   PREFIX_VEX_F3,
886   PREFIX_VEX_F4,
887   PREFIX_VEX_F5,
888   PREFIX_VEX_F6,
889   PREFIX_VEX_F7,
890   PREFIX_VEX_F8,
891   PREFIX_VEX_F9,
892   PREFIX_VEX_FA,
893   PREFIX_VEX_FB,
894   PREFIX_VEX_FC,
895   PREFIX_VEX_FD,
896   PREFIX_VEX_FE,
897   PREFIX_VEX_3800,
898   PREFIX_VEX_3801,
899   PREFIX_VEX_3802,
900   PREFIX_VEX_3803,
901   PREFIX_VEX_3804,
902   PREFIX_VEX_3805,
903   PREFIX_VEX_3806,
904   PREFIX_VEX_3807,
905   PREFIX_VEX_3808,
906   PREFIX_VEX_3809,
907   PREFIX_VEX_380A,
908   PREFIX_VEX_380B,
909   PREFIX_VEX_380C,
910   PREFIX_VEX_380D,
911   PREFIX_VEX_380E,
912   PREFIX_VEX_380F,
913   PREFIX_VEX_3817,
914   PREFIX_VEX_3818,
915   PREFIX_VEX_3819,
916   PREFIX_VEX_381A,
917   PREFIX_VEX_381C,
918   PREFIX_VEX_381D,
919   PREFIX_VEX_381E,
920   PREFIX_VEX_3820,
921   PREFIX_VEX_3821,
922   PREFIX_VEX_3822,
923   PREFIX_VEX_3823,
924   PREFIX_VEX_3824,
925   PREFIX_VEX_3825,
926   PREFIX_VEX_3828,
927   PREFIX_VEX_3829,
928   PREFIX_VEX_382A,
929   PREFIX_VEX_382B,
930   PREFIX_VEX_382C,
931   PREFIX_VEX_382D,
932   PREFIX_VEX_382E,
933   PREFIX_VEX_382F,
934   PREFIX_VEX_3830,
935   PREFIX_VEX_3831,
936   PREFIX_VEX_3832,
937   PREFIX_VEX_3833,
938   PREFIX_VEX_3834,
939   PREFIX_VEX_3835,
940   PREFIX_VEX_3837,
941   PREFIX_VEX_3838,
942   PREFIX_VEX_3839,
943   PREFIX_VEX_383A,
944   PREFIX_VEX_383B,
945   PREFIX_VEX_383C,
946   PREFIX_VEX_383D,
947   PREFIX_VEX_383E,
948   PREFIX_VEX_383F,
949   PREFIX_VEX_3840,
950   PREFIX_VEX_3841,
951   PREFIX_VEX_3896,
952   PREFIX_VEX_3897,
953   PREFIX_VEX_3898,
954   PREFIX_VEX_3899,
955   PREFIX_VEX_389A,
956   PREFIX_VEX_389B,
957   PREFIX_VEX_389C,
958   PREFIX_VEX_389D,
959   PREFIX_VEX_389E,
960   PREFIX_VEX_389F,
961   PREFIX_VEX_38A6,
962   PREFIX_VEX_38A7,
963   PREFIX_VEX_38A8,
964   PREFIX_VEX_38A9,
965   PREFIX_VEX_38AA,
966   PREFIX_VEX_38AB,
967   PREFIX_VEX_38AC,
968   PREFIX_VEX_38AD,
969   PREFIX_VEX_38AE,
970   PREFIX_VEX_38AF,
971   PREFIX_VEX_38B6,
972   PREFIX_VEX_38B7,
973   PREFIX_VEX_38B8,
974   PREFIX_VEX_38B9,
975   PREFIX_VEX_38BA,
976   PREFIX_VEX_38BB,
977   PREFIX_VEX_38BC,
978   PREFIX_VEX_38BD,
979   PREFIX_VEX_38BE,
980   PREFIX_VEX_38BF,
981   PREFIX_VEX_38DB,
982   PREFIX_VEX_38DC,
983   PREFIX_VEX_38DD,
984   PREFIX_VEX_38DE,
985   PREFIX_VEX_38DF,
986   PREFIX_VEX_3A04,
987   PREFIX_VEX_3A05,
988   PREFIX_VEX_3A06,
989   PREFIX_VEX_3A08,
990   PREFIX_VEX_3A09,
991   PREFIX_VEX_3A0A,
992   PREFIX_VEX_3A0B,
993   PREFIX_VEX_3A0C,
994   PREFIX_VEX_3A0D,
995   PREFIX_VEX_3A0E,
996   PREFIX_VEX_3A0F,
997   PREFIX_VEX_3A14,
998   PREFIX_VEX_3A15,
999   PREFIX_VEX_3A16,
1000   PREFIX_VEX_3A17,
1001   PREFIX_VEX_3A18,
1002   PREFIX_VEX_3A19,
1003   PREFIX_VEX_3A20,
1004   PREFIX_VEX_3A21,
1005   PREFIX_VEX_3A22,
1006   PREFIX_VEX_3A40,
1007   PREFIX_VEX_3A41,
1008   PREFIX_VEX_3A42,
1009   PREFIX_VEX_3A44,
1010   PREFIX_VEX_3A4A,
1011   PREFIX_VEX_3A4B,
1012   PREFIX_VEX_3A4C,
1013   PREFIX_VEX_3A5C,
1014   PREFIX_VEX_3A5D,
1015   PREFIX_VEX_3A5E,
1016   PREFIX_VEX_3A5F,
1017   PREFIX_VEX_3A60,
1018   PREFIX_VEX_3A61,
1019   PREFIX_VEX_3A62,
1020   PREFIX_VEX_3A63,
1021   PREFIX_VEX_3A68,
1022   PREFIX_VEX_3A69,
1023   PREFIX_VEX_3A6A,
1024   PREFIX_VEX_3A6B,
1025   PREFIX_VEX_3A6C,
1026   PREFIX_VEX_3A6D,
1027   PREFIX_VEX_3A6E,
1028   PREFIX_VEX_3A6F,
1029   PREFIX_VEX_3A78,
1030   PREFIX_VEX_3A79,
1031   PREFIX_VEX_3A7A,
1032   PREFIX_VEX_3A7B,
1033   PREFIX_VEX_3A7C,
1034   PREFIX_VEX_3A7D,
1035   PREFIX_VEX_3A7E,
1036   PREFIX_VEX_3A7F,
1037   PREFIX_VEX_3ADF
1038 };
1039
1040 enum
1041 {
1042   X86_64_06 = 0,
1043   X86_64_07,
1044   X86_64_0D,
1045   X86_64_16,
1046   X86_64_17,
1047   X86_64_1E,
1048   X86_64_1F,
1049   X86_64_27,
1050   X86_64_2F,
1051   X86_64_37,
1052   X86_64_3F,
1053   X86_64_60,
1054   X86_64_61,
1055   X86_64_62,
1056   X86_64_63,
1057   X86_64_6D,
1058   X86_64_6F,
1059   X86_64_9A,
1060   X86_64_C4,
1061   X86_64_C5,
1062   X86_64_CE,
1063   X86_64_D4,
1064   X86_64_D5,
1065   X86_64_EA,
1066   X86_64_0F01_REG_0,
1067   X86_64_0F01_REG_1,
1068   X86_64_0F01_REG_2,
1069   X86_64_0F01_REG_3
1070 };
1071
1072 enum
1073 {
1074   THREE_BYTE_0F38 = 0,
1075   THREE_BYTE_0F3A,
1076   THREE_BYTE_0F7A
1077 };
1078
1079 enum
1080 {
1081   XOP_08 = 0,
1082   XOP_09,
1083   XOP_0A
1084 };
1085
1086 enum
1087 {
1088   VEX_0F = 0,
1089   VEX_0F38,
1090   VEX_0F3A
1091 };
1092
1093 enum
1094 {
1095   VEX_LEN_10_P_1 = 0,
1096   VEX_LEN_10_P_3,
1097   VEX_LEN_11_P_1,
1098   VEX_LEN_11_P_3,
1099   VEX_LEN_12_P_0_M_0,
1100   VEX_LEN_12_P_0_M_1,
1101   VEX_LEN_12_P_2,
1102   VEX_LEN_13_M_0,
1103   VEX_LEN_16_P_0_M_0,
1104   VEX_LEN_16_P_0_M_1,
1105   VEX_LEN_16_P_2,
1106   VEX_LEN_17_M_0,
1107   VEX_LEN_2A_P_1,
1108   VEX_LEN_2A_P_3,
1109   VEX_LEN_2C_P_1,
1110   VEX_LEN_2C_P_3,
1111   VEX_LEN_2D_P_1,
1112   VEX_LEN_2D_P_3,
1113   VEX_LEN_2E_P_0,
1114   VEX_LEN_2E_P_2,
1115   VEX_LEN_2F_P_0,
1116   VEX_LEN_2F_P_2,
1117   VEX_LEN_51_P_1,
1118   VEX_LEN_51_P_3,
1119   VEX_LEN_52_P_1,
1120   VEX_LEN_53_P_1,
1121   VEX_LEN_58_P_1,
1122   VEX_LEN_58_P_3,
1123   VEX_LEN_59_P_1,
1124   VEX_LEN_59_P_3,
1125   VEX_LEN_5A_P_1,
1126   VEX_LEN_5A_P_3,
1127   VEX_LEN_5C_P_1,
1128   VEX_LEN_5C_P_3,
1129   VEX_LEN_5D_P_1,
1130   VEX_LEN_5D_P_3,
1131   VEX_LEN_5E_P_1,
1132   VEX_LEN_5E_P_3,
1133   VEX_LEN_5F_P_1,
1134   VEX_LEN_5F_P_3,
1135   VEX_LEN_60_P_2,
1136   VEX_LEN_61_P_2,
1137   VEX_LEN_62_P_2,
1138   VEX_LEN_63_P_2,
1139   VEX_LEN_64_P_2,
1140   VEX_LEN_65_P_2,
1141   VEX_LEN_66_P_2,
1142   VEX_LEN_67_P_2,
1143   VEX_LEN_68_P_2,
1144   VEX_LEN_69_P_2,
1145   VEX_LEN_6A_P_2,
1146   VEX_LEN_6B_P_2,
1147   VEX_LEN_6C_P_2,
1148   VEX_LEN_6D_P_2,
1149   VEX_LEN_6E_P_2,
1150   VEX_LEN_70_P_1,
1151   VEX_LEN_70_P_2,
1152   VEX_LEN_70_P_3,
1153   VEX_LEN_71_R_2_P_2,
1154   VEX_LEN_71_R_4_P_2,
1155   VEX_LEN_71_R_6_P_2,
1156   VEX_LEN_72_R_2_P_2,
1157   VEX_LEN_72_R_4_P_2,
1158   VEX_LEN_72_R_6_P_2,
1159   VEX_LEN_73_R_2_P_2,
1160   VEX_LEN_73_R_3_P_2,
1161   VEX_LEN_73_R_6_P_2,
1162   VEX_LEN_73_R_7_P_2,
1163   VEX_LEN_74_P_2,
1164   VEX_LEN_75_P_2,
1165   VEX_LEN_76_P_2,
1166   VEX_LEN_7E_P_1,
1167   VEX_LEN_7E_P_2,
1168   VEX_LEN_AE_R_2_M_0,
1169   VEX_LEN_AE_R_3_M_0,
1170   VEX_LEN_C2_P_1,
1171   VEX_LEN_C2_P_3,
1172   VEX_LEN_C4_P_2,
1173   VEX_LEN_C5_P_2,
1174   VEX_LEN_D1_P_2,
1175   VEX_LEN_D2_P_2,
1176   VEX_LEN_D3_P_2,
1177   VEX_LEN_D4_P_2,
1178   VEX_LEN_D5_P_2,
1179   VEX_LEN_D6_P_2,
1180   VEX_LEN_D7_P_2_M_1,
1181   VEX_LEN_D8_P_2,
1182   VEX_LEN_D9_P_2,
1183   VEX_LEN_DA_P_2,
1184   VEX_LEN_DB_P_2,
1185   VEX_LEN_DC_P_2,
1186   VEX_LEN_DD_P_2,
1187   VEX_LEN_DE_P_2,
1188   VEX_LEN_DF_P_2,
1189   VEX_LEN_E0_P_2,
1190   VEX_LEN_E1_P_2,
1191   VEX_LEN_E2_P_2,
1192   VEX_LEN_E3_P_2,
1193   VEX_LEN_E4_P_2,
1194   VEX_LEN_E5_P_2,
1195   VEX_LEN_E8_P_2,
1196   VEX_LEN_E9_P_2,
1197   VEX_LEN_EA_P_2,
1198   VEX_LEN_EB_P_2,
1199   VEX_LEN_EC_P_2,
1200   VEX_LEN_ED_P_2,
1201   VEX_LEN_EE_P_2,
1202   VEX_LEN_EF_P_2,
1203   VEX_LEN_F1_P_2,
1204   VEX_LEN_F2_P_2,
1205   VEX_LEN_F3_P_2,
1206   VEX_LEN_F4_P_2,
1207   VEX_LEN_F5_P_2,
1208   VEX_LEN_F6_P_2,
1209   VEX_LEN_F7_P_2,
1210   VEX_LEN_F8_P_2,
1211   VEX_LEN_F9_P_2,
1212   VEX_LEN_FA_P_2,
1213   VEX_LEN_FB_P_2,
1214   VEX_LEN_FC_P_2,
1215   VEX_LEN_FD_P_2,
1216   VEX_LEN_FE_P_2,
1217   VEX_LEN_3800_P_2,
1218   VEX_LEN_3801_P_2,
1219   VEX_LEN_3802_P_2,
1220   VEX_LEN_3803_P_2,
1221   VEX_LEN_3804_P_2,
1222   VEX_LEN_3805_P_2,
1223   VEX_LEN_3806_P_2,
1224   VEX_LEN_3807_P_2,
1225   VEX_LEN_3808_P_2,
1226   VEX_LEN_3809_P_2,
1227   VEX_LEN_380A_P_2,
1228   VEX_LEN_380B_P_2,
1229   VEX_LEN_3819_P_2_M_0,
1230   VEX_LEN_381A_P_2_M_0,
1231   VEX_LEN_381C_P_2,
1232   VEX_LEN_381D_P_2,
1233   VEX_LEN_381E_P_2,
1234   VEX_LEN_3820_P_2,
1235   VEX_LEN_3821_P_2,
1236   VEX_LEN_3822_P_2,
1237   VEX_LEN_3823_P_2,
1238   VEX_LEN_3824_P_2,
1239   VEX_LEN_3825_P_2,
1240   VEX_LEN_3828_P_2,
1241   VEX_LEN_3829_P_2,
1242   VEX_LEN_382A_P_2_M_0,
1243   VEX_LEN_382B_P_2,
1244   VEX_LEN_3830_P_2,
1245   VEX_LEN_3831_P_2,
1246   VEX_LEN_3832_P_2,
1247   VEX_LEN_3833_P_2,
1248   VEX_LEN_3834_P_2,
1249   VEX_LEN_3835_P_2,
1250   VEX_LEN_3837_P_2,
1251   VEX_LEN_3838_P_2,
1252   VEX_LEN_3839_P_2,
1253   VEX_LEN_383A_P_2,
1254   VEX_LEN_383B_P_2,
1255   VEX_LEN_383C_P_2,
1256   VEX_LEN_383D_P_2,
1257   VEX_LEN_383E_P_2,
1258   VEX_LEN_383F_P_2,
1259   VEX_LEN_3840_P_2,
1260   VEX_LEN_3841_P_2,
1261   VEX_LEN_38DB_P_2,
1262   VEX_LEN_38DC_P_2,
1263   VEX_LEN_38DD_P_2,
1264   VEX_LEN_38DE_P_2,
1265   VEX_LEN_38DF_P_2,
1266   VEX_LEN_3A06_P_2,
1267   VEX_LEN_3A0A_P_2,
1268   VEX_LEN_3A0B_P_2,
1269   VEX_LEN_3A0E_P_2,
1270   VEX_LEN_3A0F_P_2,
1271   VEX_LEN_3A14_P_2,
1272   VEX_LEN_3A15_P_2,
1273   VEX_LEN_3A16_P_2,
1274   VEX_LEN_3A17_P_2,
1275   VEX_LEN_3A18_P_2,
1276   VEX_LEN_3A19_P_2,
1277   VEX_LEN_3A20_P_2,
1278   VEX_LEN_3A21_P_2,
1279   VEX_LEN_3A22_P_2,
1280   VEX_LEN_3A41_P_2,
1281   VEX_LEN_3A42_P_2,
1282   VEX_LEN_3A44_P_2,
1283   VEX_LEN_3A4C_P_2,
1284   VEX_LEN_3A60_P_2,
1285   VEX_LEN_3A61_P_2,
1286   VEX_LEN_3A62_P_2,
1287   VEX_LEN_3A63_P_2,
1288   VEX_LEN_3A6A_P_2,
1289   VEX_LEN_3A6B_P_2,
1290   VEX_LEN_3A6E_P_2,
1291   VEX_LEN_3A6F_P_2,
1292   VEX_LEN_3A7A_P_2,
1293   VEX_LEN_3A7B_P_2,
1294   VEX_LEN_3A7E_P_2,
1295   VEX_LEN_3A7F_P_2,
1296   VEX_LEN_3ADF_P_2,
1297   VEX_LEN_XOP_09_80,
1298   VEX_LEN_XOP_09_81
1299 };
1300
1301 enum
1302 {
1303   VEX_W_10_P_0 = 0,
1304   VEX_W_10_P_1,
1305   VEX_W_10_P_2,
1306   VEX_W_10_P_3,
1307   VEX_W_11_P_0,
1308   VEX_W_11_P_1,
1309   VEX_W_11_P_2,
1310   VEX_W_11_P_3,
1311   VEX_W_12_P_0_M_0,
1312   VEX_W_12_P_0_M_1,
1313   VEX_W_12_P_1,
1314   VEX_W_12_P_2,
1315   VEX_W_12_P_3,
1316   VEX_W_13_M_0,
1317   VEX_W_14,
1318   VEX_W_15,
1319   VEX_W_16_P_0_M_0,
1320   VEX_W_16_P_0_M_1,
1321   VEX_W_16_P_1,
1322   VEX_W_16_P_2,
1323   VEX_W_17_M_0,
1324   VEX_W_28,
1325   VEX_W_29,
1326   VEX_W_2B_M_0,
1327   VEX_W_2E_P_0,
1328   VEX_W_2E_P_2,
1329   VEX_W_2F_P_0,
1330   VEX_W_2F_P_2,
1331   VEX_W_50_M_0,
1332   VEX_W_51_P_0,
1333   VEX_W_51_P_1,
1334   VEX_W_51_P_2,
1335   VEX_W_51_P_3,
1336   VEX_W_52_P_0,
1337   VEX_W_52_P_1,
1338   VEX_W_53_P_0,
1339   VEX_W_53_P_1,
1340   VEX_W_58_P_0,
1341   VEX_W_58_P_1,
1342   VEX_W_58_P_2,
1343   VEX_W_58_P_3,
1344   VEX_W_59_P_0,
1345   VEX_W_59_P_1,
1346   VEX_W_59_P_2,
1347   VEX_W_59_P_3,
1348   VEX_W_5A_P_0,
1349   VEX_W_5A_P_1,
1350   VEX_W_5A_P_3,
1351   VEX_W_5B_P_0,
1352   VEX_W_5B_P_1,
1353   VEX_W_5B_P_2,
1354   VEX_W_5C_P_0,
1355   VEX_W_5C_P_1,
1356   VEX_W_5C_P_2,
1357   VEX_W_5C_P_3,
1358   VEX_W_5D_P_0,
1359   VEX_W_5D_P_1,
1360   VEX_W_5D_P_2,
1361   VEX_W_5D_P_3,
1362   VEX_W_5E_P_0,
1363   VEX_W_5E_P_1,
1364   VEX_W_5E_P_2,
1365   VEX_W_5E_P_3,
1366   VEX_W_5F_P_0,
1367   VEX_W_5F_P_1,
1368   VEX_W_5F_P_2,
1369   VEX_W_5F_P_3,
1370   VEX_W_60_P_2,
1371   VEX_W_61_P_2,
1372   VEX_W_62_P_2,
1373   VEX_W_63_P_2,
1374   VEX_W_64_P_2,
1375   VEX_W_65_P_2,
1376   VEX_W_66_P_2,
1377   VEX_W_67_P_2,
1378   VEX_W_68_P_2,
1379   VEX_W_69_P_2,
1380   VEX_W_6A_P_2,
1381   VEX_W_6B_P_2,
1382   VEX_W_6C_P_2,
1383   VEX_W_6D_P_2,
1384   VEX_W_6F_P_1,
1385   VEX_W_6F_P_2,
1386   VEX_W_70_P_1,
1387   VEX_W_70_P_2,
1388   VEX_W_70_P_3,
1389   VEX_W_71_R_2_P_2,
1390   VEX_W_71_R_4_P_2,
1391   VEX_W_71_R_6_P_2,
1392   VEX_W_72_R_2_P_2,
1393   VEX_W_72_R_4_P_2,
1394   VEX_W_72_R_6_P_2,
1395   VEX_W_73_R_2_P_2,
1396   VEX_W_73_R_3_P_2,
1397   VEX_W_73_R_6_P_2,
1398   VEX_W_73_R_7_P_2,
1399   VEX_W_74_P_2,
1400   VEX_W_75_P_2,
1401   VEX_W_76_P_2,
1402   VEX_W_77_P_0,
1403   VEX_W_7C_P_2,
1404   VEX_W_7C_P_3,
1405   VEX_W_7D_P_2,
1406   VEX_W_7D_P_3,
1407   VEX_W_7E_P_1,
1408   VEX_W_7F_P_1,
1409   VEX_W_7F_P_2,
1410   VEX_W_AE_R_2_M_0,
1411   VEX_W_AE_R_3_M_0,
1412   VEX_W_C2_P_0,
1413   VEX_W_C2_P_1,
1414   VEX_W_C2_P_2,
1415   VEX_W_C2_P_3,
1416   VEX_W_C4_P_2,
1417   VEX_W_C5_P_2,
1418   VEX_W_D0_P_2,
1419   VEX_W_D0_P_3,
1420   VEX_W_D1_P_2,
1421   VEX_W_D2_P_2,
1422   VEX_W_D3_P_2,
1423   VEX_W_D4_P_2,
1424   VEX_W_D5_P_2,
1425   VEX_W_D6_P_2,
1426   VEX_W_D7_P_2_M_1,
1427   VEX_W_D8_P_2,
1428   VEX_W_D9_P_2,
1429   VEX_W_DA_P_2,
1430   VEX_W_DB_P_2,
1431   VEX_W_DC_P_2,
1432   VEX_W_DD_P_2,
1433   VEX_W_DE_P_2,
1434   VEX_W_DF_P_2,
1435   VEX_W_E0_P_2,
1436   VEX_W_E1_P_2,
1437   VEX_W_E2_P_2,
1438   VEX_W_E3_P_2,
1439   VEX_W_E4_P_2,
1440   VEX_W_E5_P_2,
1441   VEX_W_E6_P_1,
1442   VEX_W_E6_P_2,
1443   VEX_W_E6_P_3,
1444   VEX_W_E7_P_2_M_0,
1445   VEX_W_E8_P_2,
1446   VEX_W_E9_P_2,
1447   VEX_W_EA_P_2,
1448   VEX_W_EB_P_2,
1449   VEX_W_EC_P_2,
1450   VEX_W_ED_P_2,
1451   VEX_W_EE_P_2,
1452   VEX_W_EF_P_2,
1453   VEX_W_F0_P_3_M_0,
1454   VEX_W_F1_P_2,
1455   VEX_W_F2_P_2,
1456   VEX_W_F3_P_2,
1457   VEX_W_F4_P_2,
1458   VEX_W_F5_P_2,
1459   VEX_W_F6_P_2,
1460   VEX_W_F7_P_2,
1461   VEX_W_F8_P_2,
1462   VEX_W_F9_P_2,
1463   VEX_W_FA_P_2,
1464   VEX_W_FB_P_2,
1465   VEX_W_FC_P_2,
1466   VEX_W_FD_P_2,
1467   VEX_W_FE_P_2,
1468   VEX_W_3800_P_2,
1469   VEX_W_3801_P_2,
1470   VEX_W_3802_P_2,
1471   VEX_W_3803_P_2,
1472   VEX_W_3804_P_2,
1473   VEX_W_3805_P_2,
1474   VEX_W_3806_P_2,
1475   VEX_W_3807_P_2,
1476   VEX_W_3808_P_2,
1477   VEX_W_3809_P_2,
1478   VEX_W_380A_P_2,
1479   VEX_W_380B_P_2,
1480   VEX_W_380C_P_2,
1481   VEX_W_380D_P_2,
1482   VEX_W_380E_P_2,
1483   VEX_W_380F_P_2,
1484   VEX_W_3817_P_2,
1485   VEX_W_3818_P_2_M_0,
1486   VEX_W_3819_P_2_M_0,
1487   VEX_W_381A_P_2_M_0,
1488   VEX_W_381C_P_2,
1489   VEX_W_381D_P_2,
1490   VEX_W_381E_P_2,
1491   VEX_W_3820_P_2,
1492   VEX_W_3821_P_2,
1493   VEX_W_3822_P_2,
1494   VEX_W_3823_P_2,
1495   VEX_W_3824_P_2,
1496   VEX_W_3825_P_2,
1497   VEX_W_3828_P_2,
1498   VEX_W_3829_P_2,
1499   VEX_W_382A_P_2_M_0,
1500   VEX_W_382B_P_2,
1501   VEX_W_382C_P_2_M_0,
1502   VEX_W_382D_P_2_M_0,
1503   VEX_W_382E_P_2_M_0,
1504   VEX_W_382F_P_2_M_0,
1505   VEX_W_3830_P_2,
1506   VEX_W_3831_P_2,
1507   VEX_W_3832_P_2,
1508   VEX_W_3833_P_2,
1509   VEX_W_3834_P_2,
1510   VEX_W_3835_P_2,
1511   VEX_W_3837_P_2,
1512   VEX_W_3838_P_2,
1513   VEX_W_3839_P_2,
1514   VEX_W_383A_P_2,
1515   VEX_W_383B_P_2,
1516   VEX_W_383C_P_2,
1517   VEX_W_383D_P_2,
1518   VEX_W_383E_P_2,
1519   VEX_W_383F_P_2,
1520   VEX_W_3840_P_2,
1521   VEX_W_3841_P_2,
1522   VEX_W_38DB_P_2,
1523   VEX_W_38DC_P_2,
1524   VEX_W_38DD_P_2,
1525   VEX_W_38DE_P_2,
1526   VEX_W_38DF_P_2,
1527   VEX_W_3A04_P_2,
1528   VEX_W_3A05_P_2,
1529   VEX_W_3A06_P_2,
1530   VEX_W_3A08_P_2,
1531   VEX_W_3A09_P_2,
1532   VEX_W_3A0A_P_2,
1533   VEX_W_3A0B_P_2,
1534   VEX_W_3A0C_P_2,
1535   VEX_W_3A0D_P_2,
1536   VEX_W_3A0E_P_2,
1537   VEX_W_3A0F_P_2,
1538   VEX_W_3A14_P_2,
1539   VEX_W_3A15_P_2,
1540   VEX_W_3A18_P_2,
1541   VEX_W_3A19_P_2,
1542   VEX_W_3A20_P_2,
1543   VEX_W_3A21_P_2,
1544   VEX_W_3A40_P_2,
1545   VEX_W_3A41_P_2,
1546   VEX_W_3A42_P_2,
1547   VEX_W_3A44_P_2,
1548   VEX_W_3A4A_P_2,
1549   VEX_W_3A4B_P_2,
1550   VEX_W_3A4C_P_2,
1551   VEX_W_3A60_P_2,
1552   VEX_W_3A61_P_2,
1553   VEX_W_3A62_P_2,
1554   VEX_W_3A63_P_2,
1555   VEX_W_3ADF_P_2
1556 };
1557
1558 typedef void (*op_rtn) (int bytemode, int sizeflag);
1559
1560 struct dis386 {
1561   const char *name;
1562   struct
1563     {
1564       op_rtn rtn;
1565       int bytemode;
1566     } op[MAX_OPERANDS];
1567 };
1568
1569 /* Upper case letters in the instruction names here are macros.
1570    'A' => print 'b' if no register operands or suffix_always is true
1571    'B' => print 'b' if suffix_always is true
1572    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1573           size prefix
1574    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1575           suffix_always is true
1576    'E' => print 'e' if 32-bit form of jcxz
1577    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1578    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1579    'H' => print ",pt" or ",pn" branch hint
1580    'I' => honor following macro letter even in Intel mode (implemented only
1581           for some of the macro letters)
1582    'J' => print 'l'
1583    'K' => print 'd' or 'q' if rex prefix is present.
1584    'L' => print 'l' if suffix_always is true
1585    'M' => print 'r' if intel_mnemonic is false.
1586    'N' => print 'n' if instruction has no wait "prefix"
1587    'O' => print 'd' or 'o' (or 'q' in Intel mode)
1588    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1589           or suffix_always is true.  print 'q' if rex prefix is present.
1590    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1591           is true
1592    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1593    'S' => print 'w', 'l' or 'q' if suffix_always is true
1594    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1595    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1596    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1597    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1598    'X' => print 's', 'd' depending on data16 prefix (for XMM)
1599    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1600           suffix_always is true.
1601    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1602    '!' => change condition from true to false or from false to true.
1603    '%' => add 1 upper case letter to the macro.
1604
1605    2 upper case letter macros:
1606    "XY" => print 'x' or 'y' if no register operands or suffix_always
1607            is true.
1608    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1609    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1610            or suffix_always is true
1611    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1612    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1613    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1614
1615    Many of the above letters print nothing in Intel mode.  See "putop"
1616    for the details.
1617
1618    Braces '{' and '}', and vertical bars '|', indicate alternative
1619    mnemonic strings for AT&T and Intel.  */
1620
1621 static const struct dis386 dis386[] = {
1622   /* 00 */
1623   { "addB",             { Eb, Gb } },
1624   { "addS",             { Ev, Gv } },
1625   { "addB",             { Gb, EbS } },
1626   { "addS",             { Gv, EvS } },
1627   { "addB",             { AL, Ib } },
1628   { "addS",             { eAX, Iv } },
1629   { X86_64_TABLE (X86_64_06) },
1630   { X86_64_TABLE (X86_64_07) },
1631   /* 08 */
1632   { "orB",              { Eb, Gb } },
1633   { "orS",              { Ev, Gv } },
1634   { "orB",              { Gb, EbS } },
1635   { "orS",              { Gv, EvS } },
1636   { "orB",              { AL, Ib } },
1637   { "orS",              { eAX, Iv } },
1638   { X86_64_TABLE (X86_64_0D) },
1639   { "(bad)",            { XX } },       /* 0x0f extended opcode escape */
1640   /* 10 */
1641   { "adcB",             { Eb, Gb } },
1642   { "adcS",             { Ev, Gv } },
1643   { "adcB",             { Gb, EbS } },
1644   { "adcS",             { Gv, EvS } },
1645   { "adcB",             { AL, Ib } },
1646   { "adcS",             { eAX, Iv } },
1647   { X86_64_TABLE (X86_64_16) },
1648   { X86_64_TABLE (X86_64_17) },
1649   /* 18 */
1650   { "sbbB",             { Eb, Gb } },
1651   { "sbbS",             { Ev, Gv } },
1652   { "sbbB",             { Gb, EbS } },
1653   { "sbbS",             { Gv, EvS } },
1654   { "sbbB",             { AL, Ib } },
1655   { "sbbS",             { eAX, Iv } },
1656   { X86_64_TABLE (X86_64_1E) },
1657   { X86_64_TABLE (X86_64_1F) },
1658   /* 20 */
1659   { "andB",             { Eb, Gb } },
1660   { "andS",             { Ev, Gv } },
1661   { "andB",             { Gb, EbS } },
1662   { "andS",             { Gv, EvS } },
1663   { "andB",             { AL, Ib } },
1664   { "andS",             { eAX, Iv } },
1665   { "(bad)",            { XX } },       /* SEG ES prefix */
1666   { X86_64_TABLE (X86_64_27) },
1667   /* 28 */
1668   { "subB",             { Eb, Gb } },
1669   { "subS",             { Ev, Gv } },
1670   { "subB",             { Gb, EbS } },
1671   { "subS",             { Gv, EvS } },
1672   { "subB",             { AL, Ib } },
1673   { "subS",             { eAX, Iv } },
1674   { "(bad)",            { XX } },       /* SEG CS prefix */
1675   { X86_64_TABLE (X86_64_2F) },
1676   /* 30 */
1677   { "xorB",             { Eb, Gb } },
1678   { "xorS",             { Ev, Gv } },
1679   { "xorB",             { Gb, EbS } },
1680   { "xorS",             { Gv, EvS } },
1681   { "xorB",             { AL, Ib } },
1682   { "xorS",             { eAX, Iv } },
1683   { "(bad)",            { XX } },       /* SEG SS prefix */
1684   { X86_64_TABLE (X86_64_37) },
1685   /* 38 */
1686   { "cmpB",             { Eb, Gb } },
1687   { "cmpS",             { Ev, Gv } },
1688   { "cmpB",             { Gb, EbS } },
1689   { "cmpS",             { Gv, EvS } },
1690   { "cmpB",             { AL, Ib } },
1691   { "cmpS",             { eAX, Iv } },
1692   { "(bad)",            { XX } },       /* SEG DS prefix */
1693   { X86_64_TABLE (X86_64_3F) },
1694   /* 40 */
1695   { "inc{S|}",          { RMeAX } },
1696   { "inc{S|}",          { RMeCX } },
1697   { "inc{S|}",          { RMeDX } },
1698   { "inc{S|}",          { RMeBX } },
1699   { "inc{S|}",          { RMeSP } },
1700   { "inc{S|}",          { RMeBP } },
1701   { "inc{S|}",          { RMeSI } },
1702   { "inc{S|}",          { RMeDI } },
1703   /* 48 */
1704   { "dec{S|}",          { RMeAX } },
1705   { "dec{S|}",          { RMeCX } },
1706   { "dec{S|}",          { RMeDX } },
1707   { "dec{S|}",          { RMeBX } },
1708   { "dec{S|}",          { RMeSP } },
1709   { "dec{S|}",          { RMeBP } },
1710   { "dec{S|}",          { RMeSI } },
1711   { "dec{S|}",          { RMeDI } },
1712   /* 50 */
1713   { "pushV",            { RMrAX } },
1714   { "pushV",            { RMrCX } },
1715   { "pushV",            { RMrDX } },
1716   { "pushV",            { RMrBX } },
1717   { "pushV",            { RMrSP } },
1718   { "pushV",            { RMrBP } },
1719   { "pushV",            { RMrSI } },
1720   { "pushV",            { RMrDI } },
1721   /* 58 */
1722   { "popV",             { RMrAX } },
1723   { "popV",             { RMrCX } },
1724   { "popV",             { RMrDX } },
1725   { "popV",             { RMrBX } },
1726   { "popV",             { RMrSP } },
1727   { "popV",             { RMrBP } },
1728   { "popV",             { RMrSI } },
1729   { "popV",             { RMrDI } },
1730   /* 60 */
1731   { X86_64_TABLE (X86_64_60) },
1732   { X86_64_TABLE (X86_64_61) },
1733   { X86_64_TABLE (X86_64_62) },
1734   { X86_64_TABLE (X86_64_63) },
1735   { "(bad)",            { XX } },       /* seg fs */
1736   { "(bad)",            { XX } },       /* seg gs */
1737   { "(bad)",            { XX } },       /* op size prefix */
1738   { "(bad)",            { XX } },       /* adr size prefix */
1739   /* 68 */
1740   { "pushT",            { Iq } },
1741   { "imulS",            { Gv, Ev, Iv } },
1742   { "pushT",            { sIb } },
1743   { "imulS",            { Gv, Ev, sIb } },
1744   { "ins{b|}",          { Ybr, indirDX } },
1745   { X86_64_TABLE (X86_64_6D) },
1746   { "outs{b|}",         { indirDXr, Xb } },
1747   { X86_64_TABLE (X86_64_6F) },
1748   /* 70 */
1749   { "joH",              { Jb, XX, cond_jump_flag } },
1750   { "jnoH",             { Jb, XX, cond_jump_flag } },
1751   { "jbH",              { Jb, XX, cond_jump_flag } },
1752   { "jaeH",             { Jb, XX, cond_jump_flag } },
1753   { "jeH",              { Jb, XX, cond_jump_flag } },
1754   { "jneH",             { Jb, XX, cond_jump_flag } },
1755   { "jbeH",             { Jb, XX, cond_jump_flag } },
1756   { "jaH",              { Jb, XX, cond_jump_flag } },
1757   /* 78 */
1758   { "jsH",              { Jb, XX, cond_jump_flag } },
1759   { "jnsH",             { Jb, XX, cond_jump_flag } },
1760   { "jpH",              { Jb, XX, cond_jump_flag } },
1761   { "jnpH",             { Jb, XX, cond_jump_flag } },
1762   { "jlH",              { Jb, XX, cond_jump_flag } },
1763   { "jgeH",             { Jb, XX, cond_jump_flag } },
1764   { "jleH",             { Jb, XX, cond_jump_flag } },
1765   { "jgH",              { Jb, XX, cond_jump_flag } },
1766   /* 80 */
1767   { REG_TABLE (REG_80) },
1768   { REG_TABLE (REG_81) },
1769   { "(bad)",            { XX } },
1770   { REG_TABLE (REG_82) },
1771   { "testB",            { Eb, Gb } },
1772   { "testS",            { Ev, Gv } },
1773   { "xchgB",            { Eb, Gb } },
1774   { "xchgS",            { Ev, Gv } },
1775   /* 88 */
1776   { "movB",             { Eb, Gb } },
1777   { "movS",             { Ev, Gv } },
1778   { "movB",             { Gb, EbS } },
1779   { "movS",             { Gv, EvS } },
1780   { "movD",             { Sv, Sw } },
1781   { MOD_TABLE (MOD_8D) },
1782   { "movD",             { Sw, Sv } },
1783   { REG_TABLE (REG_8F) },
1784   /* 90 */
1785   { PREFIX_TABLE (PREFIX_90) },
1786   { "xchgS",            { RMeCX, eAX } },
1787   { "xchgS",            { RMeDX, eAX } },
1788   { "xchgS",            { RMeBX, eAX } },
1789   { "xchgS",            { RMeSP, eAX } },
1790   { "xchgS",            { RMeBP, eAX } },
1791   { "xchgS",            { RMeSI, eAX } },
1792   { "xchgS",            { RMeDI, eAX } },
1793   /* 98 */
1794   { "cW{t|}R",          { XX } },
1795   { "cR{t|}O",          { XX } },
1796   { X86_64_TABLE (X86_64_9A) },
1797   { "(bad)",            { XX } },       /* fwait */
1798   { "pushfT",           { XX } },
1799   { "popfT",            { XX } },
1800   { "sahf",             { XX } },
1801   { "lahf",             { XX } },
1802   /* a0 */
1803   { "mov%LB",           { AL, Ob } },
1804   { "mov%LS",           { eAX, Ov } },
1805   { "mov%LB",           { Ob, AL } },
1806   { "mov%LS",           { Ov, eAX } },
1807   { "movs{b|}",         { Ybr, Xb } },
1808   { "movs{R|}",         { Yvr, Xv } },
1809   { "cmps{b|}",         { Xb, Yb } },
1810   { "cmps{R|}",         { Xv, Yv } },
1811   /* a8 */
1812   { "testB",            { AL, Ib } },
1813   { "testS",            { eAX, Iv } },
1814   { "stosB",            { Ybr, AL } },
1815   { "stosS",            { Yvr, eAX } },
1816   { "lodsB",            { ALr, Xb } },
1817   { "lodsS",            { eAXr, Xv } },
1818   { "scasB",            { AL, Yb } },
1819   { "scasS",            { eAX, Yv } },
1820   /* b0 */
1821   { "movB",             { RMAL, Ib } },
1822   { "movB",             { RMCL, Ib } },
1823   { "movB",             { RMDL, Ib } },
1824   { "movB",             { RMBL, Ib } },
1825   { "movB",             { RMAH, Ib } },
1826   { "movB",             { RMCH, Ib } },
1827   { "movB",             { RMDH, Ib } },
1828   { "movB",             { RMBH, Ib } },
1829   /* b8 */
1830   { "mov%LV",           { RMeAX, Iv64 } },
1831   { "mov%LV",           { RMeCX, Iv64 } },
1832   { "mov%LV",           { RMeDX, Iv64 } },
1833   { "mov%LV",           { RMeBX, Iv64 } },
1834   { "mov%LV",           { RMeSP, Iv64 } },
1835   { "mov%LV",           { RMeBP, Iv64 } },
1836   { "mov%LV",           { RMeSI, Iv64 } },
1837   { "mov%LV",           { RMeDI, Iv64 } },
1838   /* c0 */
1839   { REG_TABLE (REG_C0) },
1840   { REG_TABLE (REG_C1) },
1841   { "retT",             { Iw } },
1842   { "retT",             { XX } },
1843   { X86_64_TABLE (X86_64_C4) },
1844   { X86_64_TABLE (X86_64_C5) },
1845   { REG_TABLE (REG_C6) },
1846   { REG_TABLE (REG_C7) },
1847   /* c8 */
1848   { "enterT",           { Iw, Ib } },
1849   { "leaveT",           { XX } },
1850   { "Jret{|f}P",        { Iw } },
1851   { "Jret{|f}P",        { XX } },
1852   { "int3",             { XX } },
1853   { "int",              { Ib } },
1854   { X86_64_TABLE (X86_64_CE) },
1855   { "iretP",            { XX } },
1856   /* d0 */
1857   { REG_TABLE (REG_D0) },
1858   { REG_TABLE (REG_D1) },
1859   { REG_TABLE (REG_D2) },
1860   { REG_TABLE (REG_D3) },
1861   { X86_64_TABLE (X86_64_D4) },
1862   { X86_64_TABLE (X86_64_D5) },
1863   { "(bad)",            { XX } },
1864   { "xlat",             { DSBX } },
1865   /* d8 */
1866   { FLOAT },
1867   { FLOAT },
1868   { FLOAT },
1869   { FLOAT },
1870   { FLOAT },
1871   { FLOAT },
1872   { FLOAT },
1873   { FLOAT },
1874   /* e0 */
1875   { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1876   { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1877   { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1878   { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1879   { "inB",              { AL, Ib } },
1880   { "inG",              { zAX, Ib } },
1881   { "outB",             { Ib, AL } },
1882   { "outG",             { Ib, zAX } },
1883   /* e8 */
1884   { "callT",            { Jv } },
1885   { "jmpT",             { Jv } },
1886   { X86_64_TABLE (X86_64_EA) },
1887   { "jmp",              { Jb } },
1888   { "inB",              { AL, indirDX } },
1889   { "inG",              { zAX, indirDX } },
1890   { "outB",             { indirDX, AL } },
1891   { "outG",             { indirDX, zAX } },
1892   /* f0 */
1893   { "(bad)",            { XX } },       /* lock prefix */
1894   { "icebp",            { XX } },
1895   { "(bad)",            { XX } },       /* repne */
1896   { "(bad)",            { XX } },       /* repz */
1897   { "hlt",              { XX } },
1898   { "cmc",              { XX } },
1899   { REG_TABLE (REG_F6) },
1900   { REG_TABLE (REG_F7) },
1901   /* f8 */
1902   { "clc",              { XX } },
1903   { "stc",              { XX } },
1904   { "cli",              { XX } },
1905   { "sti",              { XX } },
1906   { "cld",              { XX } },
1907   { "std",              { XX } },
1908   { REG_TABLE (REG_FE) },
1909   { REG_TABLE (REG_FF) },
1910 };
1911
1912 static const struct dis386 dis386_twobyte[] = {
1913   /* 00 */
1914   { REG_TABLE (REG_0F00 ) },
1915   { REG_TABLE (REG_0F01 ) },
1916   { "larS",             { Gv, Ew } },
1917   { "lslS",             { Gv, Ew } },
1918   { "(bad)",            { XX } },
1919   { "syscall",          { XX } },
1920   { "clts",             { XX } },
1921   { "sysretP",          { XX } },
1922   /* 08 */
1923   { "invd",             { XX } },
1924   { "wbinvd",           { XX } },
1925   { "(bad)",            { XX } },
1926   { "ud2a",             { XX } },
1927   { "(bad)",            { XX } },
1928   { REG_TABLE (REG_0F0D) },
1929   { "femms",            { XX } },
1930   { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1931   /* 10 */
1932   { PREFIX_TABLE (PREFIX_0F10) },
1933   { PREFIX_TABLE (PREFIX_0F11) },
1934   { PREFIX_TABLE (PREFIX_0F12) },
1935   { MOD_TABLE (MOD_0F13) },
1936   { "unpcklpX",         { XM, EXx } },
1937   { "unpckhpX",         { XM, EXx } },
1938   { PREFIX_TABLE (PREFIX_0F16) },
1939   { MOD_TABLE (MOD_0F17) },
1940   /* 18 */
1941   { REG_TABLE (REG_0F18) },
1942   { "nopQ",             { Ev } },
1943   { "nopQ",             { Ev } },
1944   { "nopQ",             { Ev } },
1945   { "nopQ",             { Ev } },
1946   { "nopQ",             { Ev } },
1947   { "nopQ",             { Ev } },
1948   { "nopQ",             { Ev } },
1949   /* 20 */
1950   { MOD_TABLE (MOD_0F20) },
1951   { MOD_TABLE (MOD_0F21) },
1952   { MOD_TABLE (MOD_0F22) },
1953   { MOD_TABLE (MOD_0F23) },
1954   { MOD_TABLE (MOD_0F24) },
1955   { "(bad)",            { XX } },
1956   { MOD_TABLE (MOD_0F26) },
1957   { "(bad)",            { XX } },
1958   /* 28 */
1959   { "movapX",           { XM, EXx } },
1960   { "movapX",           { EXxS, XM } },
1961   { PREFIX_TABLE (PREFIX_0F2A) },
1962   { PREFIX_TABLE (PREFIX_0F2B) },
1963   { PREFIX_TABLE (PREFIX_0F2C) },
1964   { PREFIX_TABLE (PREFIX_0F2D) },
1965   { PREFIX_TABLE (PREFIX_0F2E) },
1966   { PREFIX_TABLE (PREFIX_0F2F) },
1967   /* 30 */
1968   { "wrmsr",            { XX } },
1969   { "rdtsc",            { XX } },
1970   { "rdmsr",            { XX } },
1971   { "rdpmc",            { XX } },
1972   { "sysenter",         { XX } },
1973   { "sysexit",          { XX } },
1974   { "(bad)",            { XX } },
1975   { "getsec",           { XX } },
1976   /* 38 */
1977   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
1978   { "(bad)",            { XX } },
1979   { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
1980   { "(bad)",            { XX } },
1981   { "(bad)",            { XX } },
1982   { "(bad)",            { XX } },
1983   { "(bad)",            { XX } },
1984   { "(bad)",            { XX } },
1985   /* 40 */
1986   { "cmovoS",           { Gv, Ev } },
1987   { "cmovnoS",          { Gv, Ev } },
1988   { "cmovbS",           { Gv, Ev } },
1989   { "cmovaeS",          { Gv, Ev } },
1990   { "cmoveS",           { Gv, Ev } },
1991   { "cmovneS",          { Gv, Ev } },
1992   { "cmovbeS",          { Gv, Ev } },
1993   { "cmovaS",           { Gv, Ev } },
1994   /* 48 */
1995   { "cmovsS",           { Gv, Ev } },
1996   { "cmovnsS",          { Gv, Ev } },
1997   { "cmovpS",           { Gv, Ev } },
1998   { "cmovnpS",          { Gv, Ev } },
1999   { "cmovlS",           { Gv, Ev } },
2000   { "cmovgeS",          { Gv, Ev } },
2001   { "cmovleS",          { Gv, Ev } },
2002   { "cmovgS",           { Gv, Ev } },
2003   /* 50 */
2004   { MOD_TABLE (MOD_0F51) },
2005   { PREFIX_TABLE (PREFIX_0F51) },
2006   { PREFIX_TABLE (PREFIX_0F52) },
2007   { PREFIX_TABLE (PREFIX_0F53) },
2008   { "andpX",            { XM, EXx } },
2009   { "andnpX",           { XM, EXx } },
2010   { "orpX",             { XM, EXx } },
2011   { "xorpX",            { XM, EXx } },
2012   /* 58 */
2013   { PREFIX_TABLE (PREFIX_0F58) },
2014   { PREFIX_TABLE (PREFIX_0F59) },
2015   { PREFIX_TABLE (PREFIX_0F5A) },
2016   { PREFIX_TABLE (PREFIX_0F5B) },
2017   { PREFIX_TABLE (PREFIX_0F5C) },
2018   { PREFIX_TABLE (PREFIX_0F5D) },
2019   { PREFIX_TABLE (PREFIX_0F5E) },
2020   { PREFIX_TABLE (PREFIX_0F5F) },
2021   /* 60 */
2022   { PREFIX_TABLE (PREFIX_0F60) },
2023   { PREFIX_TABLE (PREFIX_0F61) },
2024   { PREFIX_TABLE (PREFIX_0F62) },
2025   { "packsswb",         { MX, EM } },
2026   { "pcmpgtb",          { MX, EM } },
2027   { "pcmpgtw",          { MX, EM } },
2028   { "pcmpgtd",          { MX, EM } },
2029   { "packuswb",         { MX, EM } },
2030   /* 68 */
2031   { "punpckhbw",        { MX, EM } },
2032   { "punpckhwd",        { MX, EM } },
2033   { "punpckhdq",        { MX, EM } },
2034   { "packssdw",         { MX, EM } },
2035   { PREFIX_TABLE (PREFIX_0F6C) },
2036   { PREFIX_TABLE (PREFIX_0F6D) },
2037   { "movK",             { MX, Edq } },
2038   { PREFIX_TABLE (PREFIX_0F6F) },
2039   /* 70 */
2040   { PREFIX_TABLE (PREFIX_0F70) },
2041   { REG_TABLE (REG_0F71) },
2042   { REG_TABLE (REG_0F72) },
2043   { REG_TABLE (REG_0F73) },
2044   { "pcmpeqb",          { MX, EM } },
2045   { "pcmpeqw",          { MX, EM } },
2046   { "pcmpeqd",          { MX, EM } },
2047   { "emms",             { XX } },
2048   /* 78 */
2049   { PREFIX_TABLE (PREFIX_0F78) },
2050   { PREFIX_TABLE (PREFIX_0F79) },
2051   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2052   { "(bad)",            { XX } },
2053   { PREFIX_TABLE (PREFIX_0F7C) },
2054   { PREFIX_TABLE (PREFIX_0F7D) },
2055   { PREFIX_TABLE (PREFIX_0F7E) },
2056   { PREFIX_TABLE (PREFIX_0F7F) },
2057   /* 80 */
2058   { "joH",              { Jv, XX, cond_jump_flag } },
2059   { "jnoH",             { Jv, XX, cond_jump_flag } },
2060   { "jbH",              { Jv, XX, cond_jump_flag } },
2061   { "jaeH",             { Jv, XX, cond_jump_flag } },
2062   { "jeH",              { Jv, XX, cond_jump_flag } },
2063   { "jneH",             { Jv, XX, cond_jump_flag } },
2064   { "jbeH",             { Jv, XX, cond_jump_flag } },
2065   { "jaH",              { Jv, XX, cond_jump_flag } },
2066   /* 88 */
2067   { "jsH",              { Jv, XX, cond_jump_flag } },
2068   { "jnsH",             { Jv, XX, cond_jump_flag } },
2069   { "jpH",              { Jv, XX, cond_jump_flag } },
2070   { "jnpH",             { Jv, XX, cond_jump_flag } },
2071   { "jlH",              { Jv, XX, cond_jump_flag } },
2072   { "jgeH",             { Jv, XX, cond_jump_flag } },
2073   { "jleH",             { Jv, XX, cond_jump_flag } },
2074   { "jgH",              { Jv, XX, cond_jump_flag } },
2075   /* 90 */
2076   { "seto",             { Eb } },
2077   { "setno",            { Eb } },
2078   { "setb",             { Eb } },
2079   { "setae",            { Eb } },
2080   { "sete",             { Eb } },
2081   { "setne",            { Eb } },
2082   { "setbe",            { Eb } },
2083   { "seta",             { Eb } },
2084   /* 98 */
2085   { "sets",             { Eb } },
2086   { "setns",            { Eb } },
2087   { "setp",             { Eb } },
2088   { "setnp",            { Eb } },
2089   { "setl",             { Eb } },
2090   { "setge",            { Eb } },
2091   { "setle",            { Eb } },
2092   { "setg",             { Eb } },
2093   /* a0 */
2094   { "pushT",            { fs } },
2095   { "popT",             { fs } },
2096   { "cpuid",            { XX } },
2097   { "btS",              { Ev, Gv } },
2098   { "shldS",            { Ev, Gv, Ib } },
2099   { "shldS",            { Ev, Gv, CL } },
2100   { REG_TABLE (REG_0FA6) },
2101   { REG_TABLE (REG_0FA7) },
2102   /* a8 */
2103   { "pushT",            { gs } },
2104   { "popT",             { gs } },
2105   { "rsm",              { XX } },
2106   { "btsS",             { Ev, Gv } },
2107   { "shrdS",            { Ev, Gv, Ib } },
2108   { "shrdS",            { Ev, Gv, CL } },
2109   { REG_TABLE (REG_0FAE) },
2110   { "imulS",            { Gv, Ev } },
2111   /* b0 */
2112   { "cmpxchgB",         { Eb, Gb } },
2113   { "cmpxchgS",         { Ev, Gv } },
2114   { MOD_TABLE (MOD_0FB2) },
2115   { "btrS",             { Ev, Gv } },
2116   { MOD_TABLE (MOD_0FB4) },
2117   { MOD_TABLE (MOD_0FB5) },
2118   { "movz{bR|x}",       { Gv, Eb } },
2119   { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
2120   /* b8 */
2121   { PREFIX_TABLE (PREFIX_0FB8) },
2122   { "ud2b",             { XX } },
2123   { REG_TABLE (REG_0FBA) },
2124   { "btcS",             { Ev, Gv } },
2125   { "bsfS",             { Gv, Ev } },
2126   { PREFIX_TABLE (PREFIX_0FBD) },
2127   { "movs{bR|x}",       { Gv, Eb } },
2128   { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
2129   /* c0 */
2130   { "xaddB",            { Eb, Gb } },
2131   { "xaddS",            { Ev, Gv } },
2132   { PREFIX_TABLE (PREFIX_0FC2) },
2133   { PREFIX_TABLE (PREFIX_0FC3) },
2134   { "pinsrw",           { MX, Edqw, Ib } },
2135   { "pextrw",           { Gdq, MS, Ib } },
2136   { "shufpX",           { XM, EXx, Ib } },
2137   { REG_TABLE (REG_0FC7) },
2138   /* c8 */
2139   { "bswap",            { RMeAX } },
2140   { "bswap",            { RMeCX } },
2141   { "bswap",            { RMeDX } },
2142   { "bswap",            { RMeBX } },
2143   { "bswap",            { RMeSP } },
2144   { "bswap",            { RMeBP } },
2145   { "bswap",            { RMeSI } },
2146   { "bswap",            { RMeDI } },
2147   /* d0 */
2148   { PREFIX_TABLE (PREFIX_0FD0) },
2149   { "psrlw",            { MX, EM } },
2150   { "psrld",            { MX, EM } },
2151   { "psrlq",            { MX, EM } },
2152   { "paddq",            { MX, EM } },
2153   { "pmullw",           { MX, EM } },
2154   { PREFIX_TABLE (PREFIX_0FD6) },
2155   { MOD_TABLE (MOD_0FD7) },
2156   /* d8 */
2157   { "psubusb",          { MX, EM } },
2158   { "psubusw",          { MX, EM } },
2159   { "pminub",           { MX, EM } },
2160   { "pand",             { MX, EM } },
2161   { "paddusb",          { MX, EM } },
2162   { "paddusw",          { MX, EM } },
2163   { "pmaxub",           { MX, EM } },
2164   { "pandn",            { MX, EM } },
2165   /* e0 */
2166   { "pavgb",            { MX, EM } },
2167   { "psraw",            { MX, EM } },
2168   { "psrad",            { MX, EM } },
2169   { "pavgw",            { MX, EM } },
2170   { "pmulhuw",          { MX, EM } },
2171   { "pmulhw",           { MX, EM } },
2172   { PREFIX_TABLE (PREFIX_0FE6) },
2173   { PREFIX_TABLE (PREFIX_0FE7) },
2174   /* e8 */
2175   { "psubsb",           { MX, EM } },
2176   { "psubsw",           { MX, EM } },
2177   { "pminsw",           { MX, EM } },
2178   { "por",              { MX, EM } },
2179   { "paddsb",           { MX, EM } },
2180   { "paddsw",           { MX, EM } },
2181   { "pmaxsw",           { MX, EM } },
2182   { "pxor",             { MX, EM } },
2183   /* f0 */
2184   { PREFIX_TABLE (PREFIX_0FF0) },
2185   { "psllw",            { MX, EM } },
2186   { "pslld",            { MX, EM } },
2187   { "psllq",            { MX, EM } },
2188   { "pmuludq",          { MX, EM } },
2189   { "pmaddwd",          { MX, EM } },
2190   { "psadbw",           { MX, EM } },
2191   { PREFIX_TABLE (PREFIX_0FF7) },
2192   /* f8 */
2193   { "psubb",            { MX, EM } },
2194   { "psubw",            { MX, EM } },
2195   { "psubd",            { MX, EM } },
2196   { "psubq",            { MX, EM } },
2197   { "paddb",            { MX, EM } },
2198   { "paddw",            { MX, EM } },
2199   { "paddd",            { MX, EM } },
2200   { "(bad)",            { XX } },
2201 };
2202
2203 static const unsigned char onebyte_has_modrm[256] = {
2204   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2205   /*       -------------------------------        */
2206   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2207   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2208   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2209   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2210   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2211   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2212   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2213   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2214   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2215   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2216   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2217   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2218   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2219   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2220   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2221   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2222   /*       -------------------------------        */
2223   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2224 };
2225
2226 static const unsigned char twobyte_has_modrm[256] = {
2227   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2228   /*       -------------------------------        */
2229   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2230   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2231   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2232   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2233   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2234   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2235   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2236   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2237   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2238   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2239   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2240   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2241   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2242   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2243   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2244   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
2245   /*       -------------------------------        */
2246   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2247 };
2248
2249 static char obuf[100];
2250 static char *obufp;
2251 static char *mnemonicendp;
2252 static char scratchbuf[100];
2253 static unsigned char *start_codep;
2254 static unsigned char *insn_codep;
2255 static unsigned char *codep;
2256 static int last_lock_prefix;
2257 static int last_repz_prefix;
2258 static int last_repnz_prefix;
2259 static int last_data_prefix;
2260 static int last_addr_prefix;
2261 static int last_rex_prefix;
2262 static int last_seg_prefix;
2263 #define MAX_CODE_LENGTH 15
2264 /* We can up to 14 prefixes since the maximum instruction length is
2265    15bytes.  */
2266 static int all_prefixes[MAX_CODE_LENGTH - 1];
2267 static disassemble_info *the_info;
2268 static struct
2269   {
2270     int mod;
2271     int reg;
2272     int rm;
2273   }
2274 modrm;
2275 static unsigned char need_modrm;
2276 static struct
2277   {
2278     int register_specifier;
2279     int length;
2280     int prefix;
2281     int w;
2282   }
2283 vex;
2284 static unsigned char need_vex;
2285 static unsigned char need_vex_reg;
2286 static unsigned char vex_w_done;
2287
2288 struct op
2289   {
2290     const char *name;
2291     unsigned int len;
2292   };
2293
2294 /* If we are accessing mod/rm/reg without need_modrm set, then the
2295    values are stale.  Hitting this abort likely indicates that you
2296    need to update onebyte_has_modrm or twobyte_has_modrm.  */
2297 #define MODRM_CHECK  if (!need_modrm) abort ()
2298
2299 static const char **names64;
2300 static const char **names32;
2301 static const char **names16;
2302 static const char **names8;
2303 static const char **names8rex;
2304 static const char **names_seg;
2305 static const char *index64;
2306 static const char *index32;
2307 static const char **index16;
2308
2309 static const char *intel_names64[] = {
2310   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2311   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2312 };
2313 static const char *intel_names32[] = {
2314   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2315   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2316 };
2317 static const char *intel_names16[] = {
2318   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2319   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2320 };
2321 static const char *intel_names8[] = {
2322   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2323 };
2324 static const char *intel_names8rex[] = {
2325   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2326   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2327 };
2328 static const char *intel_names_seg[] = {
2329   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2330 };
2331 static const char *intel_index64 = "riz";
2332 static const char *intel_index32 = "eiz";
2333 static const char *intel_index16[] = {
2334   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2335 };
2336
2337 static const char *att_names64[] = {
2338   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2339   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2340 };
2341 static const char *att_names32[] = {
2342   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2343   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2344 };
2345 static const char *att_names16[] = {
2346   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2347   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2348 };
2349 static const char *att_names8[] = {
2350   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2351 };
2352 static const char *att_names8rex[] = {
2353   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2354   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2355 };
2356 static const char *att_names_seg[] = {
2357   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2358 };
2359 static const char *att_index64 = "%riz";
2360 static const char *att_index32 = "%eiz";
2361 static const char *att_index16[] = {
2362   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2363 };
2364
2365 static const char **names_mm;
2366 static const char *intel_names_mm[] = {
2367   "mm0", "mm1", "mm2", "mm3",
2368   "mm4", "mm5", "mm6", "mm7"
2369 };
2370 static const char *att_names_mm[] = {
2371   "%mm0", "%mm1", "%mm2", "%mm3",
2372   "%mm4", "%mm5", "%mm6", "%mm7"
2373 };
2374
2375 static const char **names_xmm;
2376 static const char *intel_names_xmm[] = {
2377   "xmm0", "xmm1", "xmm2", "xmm3",
2378   "xmm4", "xmm5", "xmm6", "xmm7",
2379   "xmm8", "xmm9", "xmm10", "xmm11",
2380   "xmm12", "xmm13", "xmm14", "xmm15"
2381 };
2382 static const char *att_names_xmm[] = {
2383   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2384   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2385   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2386   "%xmm12", "%xmm13", "%xmm14", "%xmm15"
2387 };
2388
2389 static const char **names_ymm;
2390 static const char *intel_names_ymm[] = {
2391   "ymm0", "ymm1", "ymm2", "ymm3",
2392   "ymm4", "ymm5", "ymm6", "ymm7",
2393   "ymm8", "ymm9", "ymm10", "ymm11",
2394   "ymm12", "ymm13", "ymm14", "ymm15"
2395 };
2396 static const char *att_names_ymm[] = {
2397   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2398   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2399   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2400   "%ymm12", "%ymm13", "%ymm14", "%ymm15"
2401 };
2402
2403 static const struct dis386 reg_table[][8] = {
2404   /* REG_80 */
2405   {
2406     { "addA",   { Eb, Ib } },
2407     { "orA",    { Eb, Ib } },
2408     { "adcA",   { Eb, Ib } },
2409     { "sbbA",   { Eb, Ib } },
2410     { "andA",   { Eb, Ib } },
2411     { "subA",   { Eb, Ib } },
2412     { "xorA",   { Eb, Ib } },
2413     { "cmpA",   { Eb, Ib } },
2414   },
2415   /* REG_81 */
2416   {
2417     { "addQ",   { Ev, Iv } },
2418     { "orQ",    { Ev, Iv } },
2419     { "adcQ",   { Ev, Iv } },
2420     { "sbbQ",   { Ev, Iv } },
2421     { "andQ",   { Ev, Iv } },
2422     { "subQ",   { Ev, Iv } },
2423     { "xorQ",   { Ev, Iv } },
2424     { "cmpQ",   { Ev, Iv } },
2425   },
2426   /* REG_82 */
2427   {
2428     { "addQ",   { Ev, sIb } },
2429     { "orQ",    { Ev, sIb } },
2430     { "adcQ",   { Ev, sIb } },
2431     { "sbbQ",   { Ev, sIb } },
2432     { "andQ",   { Ev, sIb } },
2433     { "subQ",   { Ev, sIb } },
2434     { "xorQ",   { Ev, sIb } },
2435     { "cmpQ",   { Ev, sIb } },
2436   },
2437   /* REG_8F */
2438   {
2439     { "popU",   { stackEv } },
2440     { XOP_8F_TABLE (XOP_09) },
2441     { "(bad)",  { XX } },
2442     { "(bad)",  { XX } },
2443     { "(bad)",  { XX } },
2444     { XOP_8F_TABLE (XOP_09) },
2445     { "(bad)",  { XX } },
2446     { "(bad)",  { XX } },
2447   },
2448   /* REG_C0 */
2449   {
2450     { "rolA",   { Eb, Ib } },
2451     { "rorA",   { Eb, Ib } },
2452     { "rclA",   { Eb, Ib } },
2453     { "rcrA",   { Eb, Ib } },
2454     { "shlA",   { Eb, Ib } },
2455     { "shrA",   { Eb, Ib } },
2456     { "(bad)",  { XX } },
2457     { "sarA",   { Eb, Ib } },
2458   },
2459   /* REG_C1 */
2460   {
2461     { "rolQ",   { Ev, Ib } },
2462     { "rorQ",   { Ev, Ib } },
2463     { "rclQ",   { Ev, Ib } },
2464     { "rcrQ",   { Ev, Ib } },
2465     { "shlQ",   { Ev, Ib } },
2466     { "shrQ",   { Ev, Ib } },
2467     { "(bad)",  { XX } },
2468     { "sarQ",   { Ev, Ib } },
2469   },
2470   /* REG_C6 */
2471   {
2472     { "movA",   { Eb, Ib } },
2473     { "(bad)",  { XX } },
2474     { "(bad)",  { XX } },
2475     { "(bad)",  { XX } },
2476     { "(bad)",  { XX } },
2477     { "(bad)",  { XX } },
2478     { "(bad)",  { XX } },
2479     { "(bad)",  { XX } },
2480   },
2481   /* REG_C7 */
2482   {
2483     { "movQ",   { Ev, Iv } },
2484     { "(bad)",  { XX } },
2485     { "(bad)",  { XX } },
2486     { "(bad)",  { XX } },
2487     { "(bad)",  { XX } },
2488     { "(bad)",  { XX } },
2489     { "(bad)",  { XX } },
2490     { "(bad)",  { XX } },
2491   },
2492   /* REG_D0 */
2493   {
2494     { "rolA",   { Eb, I1 } },
2495     { "rorA",   { Eb, I1 } },
2496     { "rclA",   { Eb, I1 } },
2497     { "rcrA",   { Eb, I1 } },
2498     { "shlA",   { Eb, I1 } },
2499     { "shrA",   { Eb, I1 } },
2500     { "(bad)",  { XX } },
2501     { "sarA",   { Eb, I1 } },
2502   },
2503   /* REG_D1 */
2504   {
2505     { "rolQ",   { Ev, I1 } },
2506     { "rorQ",   { Ev, I1 } },
2507     { "rclQ",   { Ev, I1 } },
2508     { "rcrQ",   { Ev, I1 } },
2509     { "shlQ",   { Ev, I1 } },
2510     { "shrQ",   { Ev, I1 } },
2511     { "(bad)",  { XX } },
2512     { "sarQ",   { Ev, I1 } },
2513   },
2514   /* REG_D2 */
2515   {
2516     { "rolA",   { Eb, CL } },
2517     { "rorA",   { Eb, CL } },
2518     { "rclA",   { Eb, CL } },
2519     { "rcrA",   { Eb, CL } },
2520     { "shlA",   { Eb, CL } },
2521     { "shrA",   { Eb, CL } },
2522     { "(bad)",  { XX } },
2523     { "sarA",   { Eb, CL } },
2524   },
2525   /* REG_D3 */
2526   {
2527     { "rolQ",   { Ev, CL } },
2528     { "rorQ",   { Ev, CL } },
2529     { "rclQ",   { Ev, CL } },
2530     { "rcrQ",   { Ev, CL } },
2531     { "shlQ",   { Ev, CL } },
2532     { "shrQ",   { Ev, CL } },
2533     { "(bad)",  { XX } },
2534     { "sarQ",   { Ev, CL } },
2535   },
2536   /* REG_F6 */
2537   {
2538     { "testA",  { Eb, Ib } },
2539     { "(bad)",  { XX } },
2540     { "notA",   { Eb } },
2541     { "negA",   { Eb } },
2542     { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
2543     { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
2544     { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
2545     { "idivA",  { Eb } },       /* and idiv for consistency.               */
2546   },
2547   /* REG_F7 */
2548   {
2549     { "testQ",  { Ev, Iv } },
2550     { "(bad)",  { XX } },
2551     { "notQ",   { Ev } },
2552     { "negQ",   { Ev } },
2553     { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
2554     { "imulQ",  { Ev } },
2555     { "divQ",   { Ev } },
2556     { "idivQ",  { Ev } },
2557   },
2558   /* REG_FE */
2559   {
2560     { "incA",   { Eb } },
2561     { "decA",   { Eb } },
2562     { "(bad)",  { XX } },
2563     { "(bad)",  { XX } },
2564     { "(bad)",  { XX } },
2565     { "(bad)",  { XX } },
2566     { "(bad)",  { XX } },
2567     { "(bad)",  { XX } },
2568   },
2569   /* REG_FF */
2570   {
2571     { "incQ",   { Ev } },
2572     { "decQ",   { Ev } },
2573     { "callT",  { indirEv } },
2574     { "JcallT", { indirEp } },
2575     { "jmpT",   { indirEv } },
2576     { "JjmpT",  { indirEp } },
2577     { "pushU",  { stackEv } },
2578     { "(bad)",  { XX } },
2579   },
2580   /* REG_0F00 */
2581   {
2582     { "sldtD",  { Sv } },
2583     { "strD",   { Sv } },
2584     { "lldt",   { Ew } },
2585     { "ltr",    { Ew } },
2586     { "verr",   { Ew } },
2587     { "verw",   { Ew } },
2588     { "(bad)",  { XX } },
2589     { "(bad)",  { XX } },
2590   },
2591   /* REG_0F01 */
2592   {
2593     { MOD_TABLE (MOD_0F01_REG_0) },
2594     { MOD_TABLE (MOD_0F01_REG_1) },
2595     { MOD_TABLE (MOD_0F01_REG_2) },
2596     { MOD_TABLE (MOD_0F01_REG_3) },
2597     { "smswD",  { Sv } },
2598     { "(bad)",  { XX } },
2599     { "lmsw",   { Ew } },
2600     { MOD_TABLE (MOD_0F01_REG_7) },
2601   },
2602   /* REG_0F0D */
2603   {
2604     { "prefetch",       { Eb } },
2605     { "prefetchw",      { Eb } },
2606     { "(bad)",          { XX } },
2607     { "(bad)",          { XX } },
2608     { "(bad)",          { XX } },
2609     { "(bad)",          { XX } },
2610     { "(bad)",          { XX } },
2611     { "(bad)",          { XX } },
2612   },
2613   /* REG_0F18 */
2614   {
2615     { MOD_TABLE (MOD_0F18_REG_0) },
2616     { MOD_TABLE (MOD_0F18_REG_1) },
2617     { MOD_TABLE (MOD_0F18_REG_2) },
2618     { MOD_TABLE (MOD_0F18_REG_3) },
2619     { "(bad)",  { XX } },
2620     { "(bad)",  { XX } },
2621     { "(bad)",  { XX } },
2622     { "(bad)",  { XX } },
2623   },
2624   /* REG_0F71 */
2625   {
2626     { "(bad)",  { XX } },
2627     { "(bad)",  { XX } },
2628     { MOD_TABLE (MOD_0F71_REG_2) },
2629     { "(bad)",  { XX } },
2630     { MOD_TABLE (MOD_0F71_REG_4) },
2631     { "(bad)",  { XX } },
2632     { MOD_TABLE (MOD_0F71_REG_6) },
2633     { "(bad)",  { XX } },
2634   },
2635   /* REG_0F72 */
2636   {
2637     { "(bad)",  { XX } },
2638     { "(bad)",  { XX } },
2639     { MOD_TABLE (MOD_0F72_REG_2) },
2640     { "(bad)",  { XX } },
2641     { MOD_TABLE (MOD_0F72_REG_4) },
2642     { "(bad)",  { XX } },
2643     { MOD_TABLE (MOD_0F72_REG_6) },
2644     { "(bad)",  { XX } },
2645   },
2646   /* REG_0F73 */
2647   {
2648     { "(bad)",  { XX } },
2649     { "(bad)",  { XX } },
2650     { MOD_TABLE (MOD_0F73_REG_2) },
2651     { MOD_TABLE (MOD_0F73_REG_3) },
2652     { "(bad)",  { XX } },
2653     { "(bad)",  { XX } },
2654     { MOD_TABLE (MOD_0F73_REG_6) },
2655     { MOD_TABLE (MOD_0F73_REG_7) },
2656   },
2657   /* REG_0FA6 */
2658   {
2659     { "montmul",        { { OP_0f07, 0 } } },
2660     { "xsha1",          { { OP_0f07, 0 } } },
2661     { "xsha256",        { { OP_0f07, 0 } } },
2662     { "(bad)",          { { OP_0f07, 0 } } },
2663     { "(bad)",          { { OP_0f07, 0 } } },
2664     { "(bad)",          { { OP_0f07, 0 } } },
2665     { "(bad)",          { { OP_0f07, 0 } } },
2666     { "(bad)",          { { OP_0f07, 0 } } },
2667   },
2668   /* REG_0FA7 */
2669   {
2670     { "xstore-rng",     { { OP_0f07, 0 } } },
2671     { "xcrypt-ecb",     { { OP_0f07, 0 } } },
2672     { "xcrypt-cbc",     { { OP_0f07, 0 } } },
2673     { "xcrypt-ctr",     { { OP_0f07, 0 } } },
2674     { "xcrypt-cfb",     { { OP_0f07, 0 } } },
2675     { "xcrypt-ofb",     { { OP_0f07, 0 } } },
2676     { "(bad)",          { { OP_0f07, 0 } } },
2677     { "(bad)",          { { OP_0f07, 0 } } },
2678   },
2679   /* REG_0FAE */
2680   {
2681     { MOD_TABLE (MOD_0FAE_REG_0) },
2682     { MOD_TABLE (MOD_0FAE_REG_1) },
2683     { MOD_TABLE (MOD_0FAE_REG_2) },
2684     { MOD_TABLE (MOD_0FAE_REG_3) },
2685     { MOD_TABLE (MOD_0FAE_REG_4) },
2686     { MOD_TABLE (MOD_0FAE_REG_5) },
2687     { MOD_TABLE (MOD_0FAE_REG_6) },
2688     { MOD_TABLE (MOD_0FAE_REG_7) },
2689   },
2690   /* REG_0FBA */
2691   {
2692     { "(bad)",  { XX } },
2693     { "(bad)",  { XX } },
2694     { "(bad)",  { XX } },
2695     { "(bad)",  { XX } },
2696     { "btQ",    { Ev, Ib } },
2697     { "btsQ",   { Ev, Ib } },
2698     { "btrQ",   { Ev, Ib } },
2699     { "btcQ",   { Ev, Ib } },
2700   },
2701   /* REG_0FC7 */
2702   {
2703     { "(bad)",  { XX } },
2704     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2705     { "(bad)",  { XX } },
2706     { "(bad)",  { XX } },
2707     { "(bad)",  { XX } },
2708     { "(bad)",  { XX } },
2709     { MOD_TABLE (MOD_0FC7_REG_6) },
2710     { MOD_TABLE (MOD_0FC7_REG_7) },
2711   },
2712   /* REG_VEX_71 */
2713   {
2714     { "(bad)",  { XX } },
2715     { "(bad)",  { XX } },
2716     { MOD_TABLE (MOD_VEX_71_REG_2) },
2717     { "(bad)",  { XX } },
2718     { MOD_TABLE (MOD_VEX_71_REG_4) },
2719     { "(bad)",  { XX } },
2720     { MOD_TABLE (MOD_VEX_71_REG_6) },
2721     { "(bad)",  { XX } },
2722   },
2723   /* REG_VEX_72 */
2724   {
2725     { "(bad)",  { XX } },
2726     { "(bad)",  { XX } },
2727     { MOD_TABLE (MOD_VEX_72_REG_2) },
2728     { "(bad)",  { XX } },
2729     { MOD_TABLE (MOD_VEX_72_REG_4) },
2730     { "(bad)",  { XX } },
2731     { MOD_TABLE (MOD_VEX_72_REG_6) },
2732     { "(bad)",  { XX } },
2733   },
2734   /* REG_VEX_73 */
2735   {
2736     { "(bad)",  { XX } },
2737     { "(bad)",  { XX } },
2738     { MOD_TABLE (MOD_VEX_73_REG_2) },
2739     { MOD_TABLE (MOD_VEX_73_REG_3) },
2740     { "(bad)",  { XX } },
2741     { "(bad)",  { XX } },
2742     { MOD_TABLE (MOD_VEX_73_REG_6) },
2743     { MOD_TABLE (MOD_VEX_73_REG_7) },
2744   },
2745   /* REG_VEX_AE */
2746   {
2747     { "(bad)",  { XX } },
2748     { "(bad)",  { XX } },
2749     { MOD_TABLE (MOD_VEX_AE_REG_2) },
2750     { MOD_TABLE (MOD_VEX_AE_REG_3) },
2751     { "(bad)",  { XX } },
2752     { "(bad)",  { XX } },
2753     { "(bad)",  { XX } },
2754     { "(bad)",  { XX } },
2755   },
2756   /* REG_XOP_LWPCB */
2757   {
2758     { "llwpcb", { { OP_LWPCB_E, 0 } } },
2759     { "slwpcb", { { OP_LWPCB_E, 0 } } },
2760     { "(bad)",  { XX } },
2761     { "(bad)",  { XX } },
2762     { "(bad)",  { XX } },
2763     { "(bad)",  { XX } },
2764     { "(bad)",  { XX } },
2765     { "(bad)",  { XX } },
2766   },
2767   /* REG_XOP_LWP */
2768   {
2769     { "lwpins", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2770     { "lwpval", { { OP_LWP_E, 0 }, Ed, { OP_LWP_I, 0 } } },
2771     { "(bad)",  { XX } },
2772     { "(bad)",  { XX } },
2773     { "(bad)",  { XX } },
2774     { "(bad)",  { XX } },
2775     { "(bad)",  { XX } },
2776     { "(bad)",  { XX } },
2777   },
2778 };
2779
2780 static const struct dis386 prefix_table[][4] = {
2781   /* PREFIX_90 */
2782   {
2783     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2784     { "pause", { XX } },
2785     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2786     { "(bad)", { XX } },
2787   },
2788
2789   /* PREFIX_0F10 */
2790   {
2791     { "movups", { XM, EXx } },
2792     { "movss",  { XM, EXd } },
2793     { "movupd", { XM, EXx } },
2794     { "movsd",  { XM, EXq } },
2795   },
2796
2797   /* PREFIX_0F11 */
2798   {
2799     { "movups", { EXxS, XM } },
2800     { "movss",  { EXdS, XM } },
2801     { "movupd", { EXxS, XM } },
2802     { "movsd",  { EXqS, XM } },
2803   },
2804
2805   /* PREFIX_0F12 */
2806   {
2807     { MOD_TABLE (MOD_0F12_PREFIX_0) },
2808     { "movsldup", { XM, EXx } },
2809     { "movlpd", { XM, EXq } },
2810     { "movddup", { XM, EXq } },
2811   },
2812
2813   /* PREFIX_0F16 */
2814   {
2815     { MOD_TABLE (MOD_0F16_PREFIX_0) },
2816     { "movshdup", { XM, EXx } },
2817     { "movhpd", { XM, EXq } },
2818     { "(bad)",  { XX } },
2819   },
2820
2821   /* PREFIX_0F2A */
2822   {
2823     { "cvtpi2ps", { XM, EMCq } },
2824     { "cvtsi2ss%LQ", { XM, Ev } },
2825     { "cvtpi2pd", { XM, EMCq } },
2826     { "cvtsi2sd%LQ", { XM, Ev } },
2827   },
2828
2829   /* PREFIX_0F2B */
2830   {
2831     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2832     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2833     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2834     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2835   },
2836
2837   /* PREFIX_0F2C */
2838   {
2839     { "cvttps2pi", { MXC, EXq } },
2840     { "cvttss2siY", { Gv, EXd } },
2841     { "cvttpd2pi", { MXC, EXx } },
2842     { "cvttsd2siY", { Gv, EXq } },
2843   },
2844
2845   /* PREFIX_0F2D */
2846   {
2847     { "cvtps2pi", { MXC, EXq } },
2848     { "cvtss2siY", { Gv, EXd } },
2849     { "cvtpd2pi", { MXC, EXx } },
2850     { "cvtsd2siY", { Gv, EXq } },
2851   },
2852
2853   /* PREFIX_0F2E */
2854   {
2855     { "ucomiss",{ XM, EXd } }, 
2856     { "(bad)",  { XX } },
2857     { "ucomisd",{ XM, EXq } }, 
2858     { "(bad)",  { XX } },
2859   },
2860
2861   /* PREFIX_0F2F */
2862   {
2863     { "comiss", { XM, EXd } },
2864     { "(bad)",  { XX } },
2865     { "comisd", { XM, EXq } },
2866     { "(bad)",  { XX } },
2867   },
2868
2869   /* PREFIX_0F51 */
2870   {
2871     { "sqrtps", { XM, EXx } },
2872     { "sqrtss", { XM, EXd } },
2873     { "sqrtpd", { XM, EXx } },
2874     { "sqrtsd", { XM, EXq } },
2875   },
2876
2877   /* PREFIX_0F52 */
2878   {
2879     { "rsqrtps",{ XM, EXx } },
2880     { "rsqrtss",{ XM, EXd } },
2881     { "(bad)",  { XX } },
2882     { "(bad)",  { XX } },
2883   },
2884
2885   /* PREFIX_0F53 */
2886   {
2887     { "rcpps",  { XM, EXx } },
2888     { "rcpss",  { XM, EXd } },
2889     { "(bad)",  { XX } },
2890     { "(bad)",  { XX } },
2891   },
2892
2893   /* PREFIX_0F58 */
2894   {
2895     { "addps", { XM, EXx } },
2896     { "addss", { XM, EXd } },
2897     { "addpd", { XM, EXx } },
2898     { "addsd", { XM, EXq } },
2899   },
2900
2901   /* PREFIX_0F59 */
2902   {
2903     { "mulps",  { XM, EXx } },
2904     { "mulss",  { XM, EXd } },
2905     { "mulpd",  { XM, EXx } },
2906     { "mulsd",  { XM, EXq } },
2907   },
2908
2909   /* PREFIX_0F5A */
2910   {
2911     { "cvtps2pd", { XM, EXq } },
2912     { "cvtss2sd", { XM, EXd } },
2913     { "cvtpd2ps", { XM, EXx } },
2914     { "cvtsd2ss", { XM, EXq } },
2915   },
2916
2917   /* PREFIX_0F5B */
2918   {
2919     { "cvtdq2ps", { XM, EXx } },
2920     { "cvttps2dq", { XM, EXx } },
2921     { "cvtps2dq", { XM, EXx } },
2922     { "(bad)",  { XX } },
2923   },
2924
2925   /* PREFIX_0F5C */
2926   {
2927     { "subps",  { XM, EXx } },
2928     { "subss",  { XM, EXd } },
2929     { "subpd",  { XM, EXx } },
2930     { "subsd",  { XM, EXq } },
2931   },
2932
2933   /* PREFIX_0F5D */
2934   {
2935     { "minps",  { XM, EXx } },
2936     { "minss",  { XM, EXd } },
2937     { "minpd",  { XM, EXx } },
2938     { "minsd",  { XM, EXq } },
2939   },
2940
2941   /* PREFIX_0F5E */
2942   {
2943     { "divps",  { XM, EXx } },
2944     { "divss",  { XM, EXd } },
2945     { "divpd",  { XM, EXx } },
2946     { "divsd",  { XM, EXq } },
2947   },
2948
2949   /* PREFIX_0F5F */
2950   {
2951     { "maxps",  { XM, EXx } },
2952     { "maxss",  { XM, EXd } },
2953     { "maxpd",  { XM, EXx } },
2954     { "maxsd",  { XM, EXq } },
2955   },
2956
2957   /* PREFIX_0F60 */
2958   {
2959     { "punpcklbw",{ MX, EMd } },
2960     { "(bad)",  { XX } },
2961     { "punpcklbw",{ MX, EMx } },
2962     { "(bad)",  { XX } },
2963   },
2964
2965   /* PREFIX_0F61 */
2966   {
2967     { "punpcklwd",{ MX, EMd } },
2968     { "(bad)",  { XX } },
2969     { "punpcklwd",{ MX, EMx } },
2970     { "(bad)",  { XX } },
2971   },
2972
2973   /* PREFIX_0F62 */
2974   {
2975     { "punpckldq",{ MX, EMd } },
2976     { "(bad)",  { XX } },
2977     { "punpckldq",{ MX, EMx } },
2978     { "(bad)",  { XX } },
2979   },
2980
2981   /* PREFIX_0F6C */
2982   {
2983     { "(bad)",  { XX } },
2984     { "(bad)",  { XX } },
2985     { "punpcklqdq", { XM, EXx } },
2986     { "(bad)",  { XX } },
2987   },
2988
2989   /* PREFIX_0F6D */
2990   {
2991     { "(bad)",  { XX } },
2992     { "(bad)",  { XX } },
2993     { "punpckhqdq", { XM, EXx } },
2994     { "(bad)",  { XX } },
2995   },
2996
2997   /* PREFIX_0F6F */
2998   {
2999     { "movq",   { MX, EM } },
3000     { "movdqu", { XM, EXx } },
3001     { "movdqa", { XM, EXx } },
3002     { "(bad)",  { XX } },
3003   },
3004
3005   /* PREFIX_0F70 */
3006   {
3007     { "pshufw", { MX, EM, Ib } },
3008     { "pshufhw",{ XM, EXx, Ib } },
3009     { "pshufd", { XM, EXx, Ib } },
3010     { "pshuflw",{ XM, EXx, Ib } },
3011   },
3012
3013   /* PREFIX_0F73_REG_3 */
3014   {
3015     { "(bad)",  { XX } },
3016     { "(bad)",  { XX } },
3017     { "psrldq", { XS, Ib } },
3018     { "(bad)",  { XX } },
3019   },
3020
3021   /* PREFIX_0F73_REG_7 */
3022   {
3023     { "(bad)",  { XX } },
3024     { "(bad)",  { XX } },
3025     { "pslldq", { XS, Ib } },
3026     { "(bad)",  { XX } },
3027   },
3028
3029   /* PREFIX_0F78 */
3030   {
3031     {"vmread",  { Em, Gm } },
3032     {"(bad)",   { XX } },
3033     {"extrq",   { XS, Ib, Ib } },
3034     {"insertq", { XM, XS, Ib, Ib } },
3035   },
3036
3037   /* PREFIX_0F79 */
3038   {
3039     {"vmwrite", { Gm, Em } },
3040     {"(bad)",   { XX } },
3041     {"extrq",   { XM, XS } },
3042     {"insertq", { XM, XS } },
3043   },
3044
3045   /* PREFIX_0F7C */
3046   {
3047     { "(bad)",  { XX } },
3048     { "(bad)",  { XX } },
3049     { "haddpd", { XM, EXx } },
3050     { "haddps", { XM, EXx } },
3051   },
3052
3053   /* PREFIX_0F7D */
3054   {
3055     { "(bad)",  { XX } },
3056     { "(bad)",  { XX } },
3057     { "hsubpd", { XM, EXx } },
3058     { "hsubps", { XM, EXx } },
3059   },
3060
3061   /* PREFIX_0F7E */
3062   {
3063     { "movK",   { Edq, MX } },
3064     { "movq",   { XM, EXq } },
3065     { "movK",   { Edq, XM } },
3066     { "(bad)",  { XX } },
3067   },
3068
3069   /* PREFIX_0F7F */
3070   {
3071     { "movq",   { EMS, MX } },
3072     { "movdqu", { EXxS, XM } },
3073     { "movdqa", { EXxS, XM } },
3074     { "(bad)",  { XX } },
3075   },
3076
3077   /* PREFIX_0FB8 */
3078   {
3079     { "(bad)", { XX } },
3080     { "popcntS", { Gv, Ev } },
3081     { "(bad)", { XX } },
3082     { "(bad)", { XX } },
3083   },
3084
3085   /* PREFIX_0FBD */
3086   {
3087     { "bsrS",   { Gv, Ev } },
3088     { "lzcntS", { Gv, Ev } },
3089     { "bsrS",   { Gv, Ev } },
3090     { "(bad)",  { XX } },
3091   },
3092
3093   /* PREFIX_0FC2 */
3094   {
3095     { "cmpps",  { XM, EXx, CMP } },
3096     { "cmpss",  { XM, EXd, CMP } },
3097     { "cmppd",  { XM, EXx, CMP } },
3098     { "cmpsd",  { XM, EXq, CMP } },
3099   },
3100
3101   /* PREFIX_0FC3 */
3102   {
3103     { "movntiS", { Ma, Gv } },
3104     { "(bad)",  { XX } },
3105     { "(bad)",  { XX } },
3106     { "(bad)",  { XX } },
3107   },
3108
3109   /* PREFIX_0FC7_REG_6 */
3110   {
3111     { "vmptrld",{ Mq } },
3112     { "vmxon",  { Mq } },
3113     { "vmclear",{ Mq } },
3114     { "(bad)",  { XX } },
3115   },
3116
3117   /* PREFIX_0FD0 */
3118   {
3119     { "(bad)",  { XX } },
3120     { "(bad)",  { XX } },
3121     { "addsubpd", { XM, EXx } },
3122     { "addsubps", { XM, EXx } },
3123   },
3124
3125   /* PREFIX_0FD6 */
3126   {
3127     { "(bad)",  { XX } },
3128     { "movq2dq",{ XM, MS } },
3129     { "movq",   { EXqS, XM } },
3130     { "movdq2q",{ MX, XS } },
3131   },
3132
3133   /* PREFIX_0FE6 */
3134   {
3135     { "(bad)",  { XX } },
3136     { "cvtdq2pd", { XM, EXq } },
3137     { "cvttpd2dq", { XM, EXx } },
3138     { "cvtpd2dq", { XM, EXx } },
3139   },
3140
3141   /* PREFIX_0FE7 */
3142   {
3143     { "movntq", { Mq, MX } },
3144     { "(bad)",  { XX } },
3145     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3146     { "(bad)",  { XX } },
3147   },
3148
3149   /* PREFIX_0FF0 */
3150   {
3151     { "(bad)",  { XX } },
3152     { "(bad)",  { XX } },
3153     { "(bad)",  { XX } },
3154     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3155   },
3156
3157   /* PREFIX_0FF7 */
3158   {
3159     { "maskmovq", { MX, MS } },
3160     { "(bad)",  { XX } },
3161     { "maskmovdqu", { XM, XS } },
3162     { "(bad)",  { XX } },
3163   },
3164
3165   /* PREFIX_0F3810 */
3166   {
3167     { "(bad)",  { XX } },
3168     { "(bad)",  { XX } },
3169     { "pblendvb", { XM, EXx, XMM0 } },
3170     { "(bad)",  { XX } },
3171   },
3172
3173   /* PREFIX_0F3814 */
3174   {
3175     { "(bad)",  { XX } },
3176     { "(bad)",  { XX } },
3177     { "blendvps", { XM, EXx, XMM0 } },
3178     { "(bad)",  { XX } },
3179   },
3180
3181   /* PREFIX_0F3815 */
3182   {
3183     { "(bad)",  { XX } },
3184     { "(bad)",  { XX } },
3185     { "blendvpd", { XM, EXx, XMM0 } },
3186     { "(bad)",  { XX } },
3187   },
3188
3189   /* PREFIX_0F3817 */
3190   {
3191     { "(bad)",  { XX } },
3192     { "(bad)",  { XX } },
3193     { "ptest",  { XM, EXx } },
3194     { "(bad)",  { XX } },
3195   },
3196
3197   /* PREFIX_0F3820 */
3198   {
3199     { "(bad)",  { XX } },
3200     { "(bad)",  { XX } },
3201     { "pmovsxbw", { XM, EXq } },
3202     { "(bad)",  { XX } },
3203   },
3204
3205   /* PREFIX_0F3821 */
3206   {
3207     { "(bad)",  { XX } },
3208     { "(bad)",  { XX } },
3209     { "pmovsxbd", { XM, EXd } },
3210     { "(bad)",  { XX } },
3211   },
3212
3213   /* PREFIX_0F3822 */
3214   {
3215     { "(bad)",  { XX } },
3216     { "(bad)",  { XX } },
3217     { "pmovsxbq", { XM, EXw } },
3218     { "(bad)",  { XX } },
3219   },
3220
3221   /* PREFIX_0F3823 */
3222   {
3223     { "(bad)",  { XX } },
3224     { "(bad)",  { XX } },
3225     { "pmovsxwd", { XM, EXq } },
3226     { "(bad)",  { XX } },
3227   },
3228
3229   /* PREFIX_0F3824 */
3230   {
3231     { "(bad)",  { XX } },
3232     { "(bad)",  { XX } },
3233     { "pmovsxwq", { XM, EXd } },
3234     { "(bad)",  { XX } },
3235   },
3236
3237   /* PREFIX_0F3825 */
3238   {
3239     { "(bad)",  { XX } },
3240     { "(bad)",  { XX } },
3241     { "pmovsxdq", { XM, EXq } },
3242     { "(bad)",  { XX } },
3243   },
3244
3245   /* PREFIX_0F3828 */
3246   {
3247     { "(bad)",  { XX } },
3248     { "(bad)",  { XX } },
3249     { "pmuldq", { XM, EXx } },
3250     { "(bad)",  { XX } },
3251   },
3252
3253   /* PREFIX_0F3829 */
3254   {
3255     { "(bad)",  { XX } },
3256     { "(bad)",  { XX } },
3257     { "pcmpeqq", { XM, EXx } },
3258     { "(bad)",  { XX } },
3259   },
3260
3261   /* PREFIX_0F382A */
3262   {
3263     { "(bad)",  { XX } },
3264     { "(bad)",  { XX } },
3265     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3266     { "(bad)",  { XX } },
3267   },
3268
3269   /* PREFIX_0F382B */
3270   {
3271     { "(bad)",  { XX } },
3272     { "(bad)",  { XX } },
3273     { "packusdw", { XM, EXx } },
3274     { "(bad)",  { XX } },
3275   },
3276
3277   /* PREFIX_0F3830 */
3278   {
3279     { "(bad)",  { XX } },
3280     { "(bad)",  { XX } },
3281     { "pmovzxbw", { XM, EXq } },
3282     { "(bad)",  { XX } },
3283   },
3284
3285   /* PREFIX_0F3831 */
3286   {
3287     { "(bad)",  { XX } },
3288     { "(bad)",  { XX } },
3289     { "pmovzxbd", { XM, EXd } },
3290     { "(bad)",  { XX } },
3291   },
3292
3293   /* PREFIX_0F3832 */
3294   {
3295     { "(bad)",  { XX } },
3296     { "(bad)",  { XX } },
3297     { "pmovzxbq", { XM, EXw } },
3298     { "(bad)",  { XX } },
3299   },
3300
3301   /* PREFIX_0F3833 */
3302   {
3303     { "(bad)",  { XX } },
3304     { "(bad)",  { XX } },
3305     { "pmovzxwd", { XM, EXq } },
3306     { "(bad)",  { XX } },
3307   },
3308
3309   /* PREFIX_0F3834 */
3310   {
3311     { "(bad)",  { XX } },
3312     { "(bad)",  { XX } },
3313     { "pmovzxwq", { XM, EXd } },
3314     { "(bad)",  { XX } },
3315   },
3316
3317   /* PREFIX_0F3835 */
3318   {
3319     { "(bad)",  { XX } },
3320     { "(bad)",  { XX } },
3321     { "pmovzxdq", { XM, EXq } },
3322     { "(bad)",  { XX } },
3323   },
3324
3325   /* PREFIX_0F3837 */
3326   {
3327     { "(bad)",  { XX } },
3328     { "(bad)",  { XX } },
3329     { "pcmpgtq", { XM, EXx } },
3330     { "(bad)",  { XX } },
3331   },
3332
3333   /* PREFIX_0F3838 */
3334   {
3335     { "(bad)",  { XX } },
3336     { "(bad)",  { XX } },
3337     { "pminsb", { XM, EXx } },
3338     { "(bad)",  { XX } },
3339   },
3340
3341   /* PREFIX_0F3839 */
3342   {
3343     { "(bad)",  { XX } },
3344     { "(bad)",  { XX } },
3345     { "pminsd", { XM, EXx } },
3346     { "(bad)",  { XX } },
3347   },
3348
3349   /* PREFIX_0F383A */
3350   {
3351     { "(bad)",  { XX } },
3352     { "(bad)",  { XX } },
3353     { "pminuw", { XM, EXx } },
3354     { "(bad)",  { XX } },
3355   },
3356
3357   /* PREFIX_0F383B */
3358   {
3359     { "(bad)",  { XX } },
3360     { "(bad)",  { XX } },
3361     { "pminud", { XM, EXx } },
3362     { "(bad)",  { XX } },
3363   },
3364
3365   /* PREFIX_0F383C */
3366   {
3367     { "(bad)",  { XX } },
3368     { "(bad)",  { XX } },
3369     { "pmaxsb", { XM, EXx } },
3370     { "(bad)",  { XX } },
3371   },
3372
3373   /* PREFIX_0F383D */
3374   {
3375     { "(bad)",  { XX } },
3376     { "(bad)",  { XX } },
3377     { "pmaxsd", { XM, EXx } },
3378     { "(bad)",  { XX } },
3379   },
3380
3381   /* PREFIX_0F383E */
3382   {
3383     { "(bad)",  { XX } },
3384     { "(bad)",  { XX } },
3385     { "pmaxuw", { XM, EXx } },
3386     { "(bad)",  { XX } },
3387   },
3388
3389   /* PREFIX_0F383F */
3390   {
3391     { "(bad)",  { XX } },
3392     { "(bad)",  { XX } },
3393     { "pmaxud", { XM, EXx } },
3394     { "(bad)",  { XX } },
3395   },
3396
3397   /* PREFIX_0F3840 */
3398   {
3399     { "(bad)",  { XX } },
3400     { "(bad)",  { XX } },
3401     { "pmulld", { XM, EXx } },
3402     { "(bad)",  { XX } },
3403   },
3404
3405   /* PREFIX_0F3841 */
3406   {
3407     { "(bad)",  { XX } },
3408     { "(bad)",  { XX } },
3409     { "phminposuw", { XM, EXx } },
3410     { "(bad)",  { XX } },
3411   },
3412
3413   /* PREFIX_0F3880 */
3414   {
3415     { "(bad)",  { XX } },
3416     { "(bad)",  { XX } },
3417     { "invept", { Gm, Mo } },
3418     { "(bad)",  { XX } },
3419   },
3420
3421   /* PREFIX_0F3881 */
3422   {
3423     { "(bad)",  { XX } },
3424     { "(bad)",  { XX } },
3425     { "invvpid", { Gm, Mo } },
3426     { "(bad)",  { XX } },
3427   },
3428
3429   /* PREFIX_0F38DB */
3430   {
3431     { "(bad)",  { XX } },
3432     { "(bad)",  { XX } },
3433     { "aesimc", { XM, EXx } },
3434     { "(bad)",  { XX } },
3435   },
3436
3437   /* PREFIX_0F38DC */
3438   {
3439     { "(bad)",  { XX } },
3440     { "(bad)",  { XX } },
3441     { "aesenc", { XM, EXx } },
3442     { "(bad)",  { XX } },
3443   },
3444
3445   /* PREFIX_0F38DD */
3446   {
3447     { "(bad)",  { XX } },
3448     { "(bad)",  { XX } },
3449     { "aesenclast", { XM, EXx } },
3450     { "(bad)",  { XX } },
3451   },
3452
3453   /* PREFIX_0F38DE */
3454   {
3455     { "(bad)",  { XX } },
3456     { "(bad)",  { XX } },
3457     { "aesdec", { XM, EXx } },
3458     { "(bad)",  { XX } },
3459   },
3460
3461   /* PREFIX_0F38DF */
3462   {
3463     { "(bad)",  { XX } },
3464     { "(bad)",  { XX } },
3465     { "aesdeclast", { XM, EXx } },
3466     { "(bad)",  { XX } },
3467   },
3468
3469   /* PREFIX_0F38F0 */
3470   {
3471     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3472     { "(bad)",  { XX } },
3473     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3474     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },     
3475   },
3476
3477   /* PREFIX_0F38F1 */
3478   {
3479     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3480     { "(bad)",  { XX } },
3481     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3482     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },     
3483   },
3484
3485   /* PREFIX_0F3A08 */
3486   {
3487     { "(bad)",  { XX } },
3488     { "(bad)",  { XX } },
3489     { "roundps", { XM, EXx, Ib } },
3490     { "(bad)",  { XX } },
3491   },
3492
3493   /* PREFIX_0F3A09 */
3494   {
3495     { "(bad)",  { XX } },
3496     { "(bad)",  { XX } },
3497     { "roundpd", { XM, EXx, Ib } },
3498     { "(bad)",  { XX } },
3499   },
3500
3501   /* PREFIX_0F3A0A */
3502   {
3503     { "(bad)",  { XX } },
3504     { "(bad)",  { XX } },
3505     { "roundss", { XM, EXd, Ib } },
3506     { "(bad)",  { XX } },
3507   },
3508
3509   /* PREFIX_0F3A0B */
3510   {
3511     { "(bad)",  { XX } },
3512     { "(bad)",  { XX } },
3513     { "roundsd", { XM, EXq, Ib } },
3514     { "(bad)",  { XX } },
3515   },
3516
3517   /* PREFIX_0F3A0C */
3518   {
3519     { "(bad)",  { XX } },
3520     { "(bad)",  { XX } },
3521     { "blendps", { XM, EXx, Ib } },
3522     { "(bad)",  { XX } },
3523   },
3524
3525   /* PREFIX_0F3A0D */
3526   {
3527     { "(bad)",  { XX } },
3528     { "(bad)",  { XX } },
3529     { "blendpd", { XM, EXx, Ib } },
3530     { "(bad)",  { XX } },
3531   },
3532
3533   /* PREFIX_0F3A0E */
3534   {
3535     { "(bad)",  { XX } },
3536     { "(bad)",  { XX } },
3537     { "pblendw", { XM, EXx, Ib } },
3538     { "(bad)",  { XX } },
3539   },
3540
3541   /* PREFIX_0F3A14 */
3542   {
3543     { "(bad)",  { XX } },
3544     { "(bad)",  { XX } },
3545     { "pextrb", { Edqb, XM, Ib } },
3546     { "(bad)",  { XX } },
3547   },
3548
3549   /* PREFIX_0F3A15 */
3550   {
3551     { "(bad)",  { XX } },
3552     { "(bad)",  { XX } },
3553     { "pextrw", { Edqw, XM, Ib } },
3554     { "(bad)",  { XX } },
3555   },
3556
3557   /* PREFIX_0F3A16 */
3558   {
3559     { "(bad)",  { XX } },
3560     { "(bad)",  { XX } },
3561     { "pextrK", { Edq, XM, Ib } },
3562     { "(bad)",  { XX } },
3563   },
3564
3565   /* PREFIX_0F3A17 */
3566   {
3567     { "(bad)",  { XX } },
3568     { "(bad)",  { XX } },
3569     { "extractps", { Edqd, XM, Ib } },
3570     { "(bad)",  { XX } },
3571   },
3572
3573   /* PREFIX_0F3A20 */
3574   {
3575     { "(bad)",  { XX } },
3576     { "(bad)",  { XX } },
3577     { "pinsrb", { XM, Edqb, Ib } },
3578     { "(bad)",  { XX } },
3579   },
3580
3581   /* PREFIX_0F3A21 */
3582   {
3583     { "(bad)",  { XX } },
3584     { "(bad)",  { XX } },
3585     { "insertps", { XM, EXd, Ib } },
3586     { "(bad)",  { XX } },
3587   },
3588
3589   /* PREFIX_0F3A22 */
3590   {
3591     { "(bad)",  { XX } },
3592     { "(bad)",  { XX } },
3593     { "pinsrK", { XM, Edq, Ib } },
3594     { "(bad)",  { XX } },
3595   },
3596
3597   /* PREFIX_0F3A40 */
3598   {
3599     { "(bad)",  { XX } },
3600     { "(bad)",  { XX } },
3601     { "dpps",   { XM, EXx, Ib } },
3602     { "(bad)",  { XX } },
3603   },
3604
3605   /* PREFIX_0F3A41 */
3606   {
3607     { "(bad)",  { XX } },
3608     { "(bad)",  { XX } },
3609     { "dppd",   { XM, EXx, Ib } },
3610     { "(bad)",  { XX } },
3611   },
3612
3613   /* PREFIX_0F3A42 */
3614   {
3615     { "(bad)",  { XX } },
3616     { "(bad)",  { XX } },
3617     { "mpsadbw", { XM, EXx, Ib } },
3618     { "(bad)",  { XX } },
3619   },
3620
3621   /* PREFIX_0F3A44 */
3622   {
3623     { "(bad)",  { XX } },
3624     { "(bad)",  { XX } },
3625     { "pclmulqdq", { XM, EXx, PCLMUL } },
3626     { "(bad)",  { XX } },
3627   },
3628
3629   /* PREFIX_0F3A60 */
3630   {
3631     { "(bad)",  { XX } },
3632     { "(bad)",  { XX } },
3633     { "pcmpestrm", { XM, EXx, Ib } },
3634     { "(bad)",  { XX } },
3635   },
3636
3637   /* PREFIX_0F3A61 */
3638   {
3639     { "(bad)",  { XX } },
3640     { "(bad)",  { XX } },
3641     { "pcmpestri", { XM, EXx, Ib } },
3642     { "(bad)",  { XX } },
3643   },
3644
3645   /* PREFIX_0F3A62 */
3646   {
3647     { "(bad)",  { XX } },
3648     { "(bad)",  { XX } },
3649     { "pcmpistrm", { XM, EXx, Ib } },
3650     { "(bad)",  { XX } },
3651   },
3652
3653   /* PREFIX_0F3A63 */
3654   {
3655     { "(bad)",  { XX } },
3656     { "(bad)",  { XX } },
3657     { "pcmpistri", { XM, EXx, Ib } },
3658     { "(bad)",  { XX } },
3659   },
3660
3661   /* PREFIX_0F3ADF */
3662   {
3663     { "(bad)",  { XX } },
3664     { "(bad)",  { XX } },
3665     { "aeskeygenassist", { XM, EXx, Ib } },
3666     { "(bad)",  { XX } },
3667   },
3668
3669   /* PREFIX_VEX_10 */
3670   {
3671     { VEX_W_TABLE (VEX_W_10_P_0) },
3672     { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3673     { VEX_W_TABLE (VEX_W_10_P_2) },
3674     { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3675   },
3676
3677   /* PREFIX_VEX_11 */
3678   {
3679     { VEX_W_TABLE (VEX_W_11_P_0) },
3680     { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3681     { VEX_W_TABLE (VEX_W_11_P_2) },
3682     { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3683   },
3684
3685   /* PREFIX_VEX_12 */
3686   {
3687     { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3688     { VEX_W_TABLE (VEX_W_12_P_1) },
3689     { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3690     { VEX_W_TABLE (VEX_W_12_P_3) },
3691   },
3692
3693   /* PREFIX_VEX_16 */
3694   {
3695     { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3696     { VEX_W_TABLE (VEX_W_16_P_1) },
3697     { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3698     { "(bad)",  { XX } },
3699   },
3700
3701   /* PREFIX_VEX_2A */
3702   {
3703     { "(bad)",  { XX } },
3704     { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3705     { "(bad)",  { XX } },
3706     { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3707   },
3708
3709   /* PREFIX_VEX_2C */
3710   {
3711     { "(bad)",  { XX } },
3712     { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3713     { "(bad)",  { XX } },
3714     { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3715   },
3716
3717   /* PREFIX_VEX_2D */
3718   {
3719     { "(bad)",  { XX } },
3720     { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3721     { "(bad)",  { XX } },
3722     { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3723   },
3724
3725   /* PREFIX_VEX_2E */
3726   {
3727     { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3728     { "(bad)",  { XX } },
3729     { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3730     { "(bad)",  { XX } },
3731   },
3732
3733   /* PREFIX_VEX_2F */
3734   {
3735     { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3736     { "(bad)",  { XX } },
3737     { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3738     { "(bad)",  { XX } },
3739   },
3740
3741   /* PREFIX_VEX_51 */
3742   {
3743     { VEX_W_TABLE (VEX_W_51_P_0) },
3744     { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3745     { VEX_W_TABLE (VEX_W_51_P_2) },
3746     { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3747   },
3748
3749   /* PREFIX_VEX_52 */
3750   {
3751     { VEX_W_TABLE (VEX_W_52_P_0) },
3752     { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3753     { "(bad)",  { XX } },
3754     { "(bad)",  { XX } },
3755   },
3756
3757   /* PREFIX_VEX_53 */
3758   {
3759     { VEX_W_TABLE (VEX_W_53_P_0) },
3760     { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3761     { "(bad)",  { XX } },
3762     { "(bad)",  { XX } },
3763   },
3764
3765   /* PREFIX_VEX_58 */
3766   {
3767     { VEX_W_TABLE (VEX_W_58_P_0) },
3768     { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3769     { VEX_W_TABLE (VEX_W_58_P_2) },
3770     { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3771   },
3772
3773   /* PREFIX_VEX_59 */
3774   {
3775     { VEX_W_TABLE (VEX_W_59_P_0) },
3776     { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3777     { VEX_W_TABLE (VEX_W_59_P_2) },
3778     { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3779   },
3780
3781   /* PREFIX_VEX_5A */
3782   {
3783     { VEX_W_TABLE (VEX_W_5A_P_0) },
3784     { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3785     { "vcvtpd2ps%XY", { XMM, EXx } },
3786     { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3787   },
3788
3789   /* PREFIX_VEX_5B */
3790   {
3791     { VEX_W_TABLE (VEX_W_5B_P_0) },
3792     { VEX_W_TABLE (VEX_W_5B_P_1) },
3793     { VEX_W_TABLE (VEX_W_5B_P_2) },
3794     { "(bad)",  { XX } },
3795   },
3796
3797   /* PREFIX_VEX_5C */
3798   {
3799     { VEX_W_TABLE (VEX_W_5C_P_0) },
3800     { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3801     { VEX_W_TABLE (VEX_W_5C_P_2) },
3802     { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3803   },
3804
3805   /* PREFIX_VEX_5D */
3806   {
3807     { VEX_W_TABLE (VEX_W_5D_P_0) },
3808     { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3809     { VEX_W_TABLE (VEX_W_5D_P_2) },
3810     { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3811   },
3812
3813   /* PREFIX_VEX_5E */
3814   {
3815     { VEX_W_TABLE (VEX_W_5E_P_0) },
3816     { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3817     { VEX_W_TABLE (VEX_W_5E_P_2) },
3818     { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3819   },
3820
3821   /* PREFIX_VEX_5F */
3822   {
3823     { VEX_W_TABLE (VEX_W_5F_P_0) },
3824     { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3825     { VEX_W_TABLE (VEX_W_5F_P_2) },
3826     { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3827   },
3828
3829   /* PREFIX_VEX_60 */
3830   {
3831     { "(bad)",  { XX } },
3832     { "(bad)",  { XX } },
3833     { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3834     { "(bad)",  { XX } },
3835   },
3836
3837   /* PREFIX_VEX_61 */
3838   {
3839     { "(bad)",  { XX } },
3840     { "(bad)",  { XX } },
3841     { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3842     { "(bad)",  { XX } },
3843   },
3844
3845   /* PREFIX_VEX_62 */
3846   {
3847     { "(bad)",  { XX } },
3848     { "(bad)",  { XX } },
3849     { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3850     { "(bad)",  { XX } },
3851   },
3852
3853   /* PREFIX_VEX_63 */
3854   {
3855     { "(bad)",  { XX } },
3856     { "(bad)",  { XX } },
3857     { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3858     { "(bad)",  { XX } },
3859   },
3860
3861   /* PREFIX_VEX_64 */
3862   {
3863     { "(bad)",  { XX } },
3864     { "(bad)",  { XX } },
3865     { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3866     { "(bad)",  { XX } },
3867   },
3868
3869   /* PREFIX_VEX_65 */
3870   {
3871     { "(bad)",  { XX } },
3872     { "(bad)",  { XX } },
3873     { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3874     { "(bad)",  { XX } },
3875   },
3876
3877   /* PREFIX_VEX_66 */
3878   {
3879     { "(bad)",  { XX } },
3880     { "(bad)",  { XX } },
3881     { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3882     { "(bad)",  { XX } },
3883   },
3884
3885   /* PREFIX_VEX_67 */
3886   {
3887     { "(bad)",  { XX } },
3888     { "(bad)",  { XX } },
3889     { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3890     { "(bad)",  { XX } },
3891   },
3892
3893   /* PREFIX_VEX_68 */
3894   {
3895     { "(bad)",  { XX } },
3896     { "(bad)",  { XX } },
3897     { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3898     { "(bad)",  { XX } },
3899   },
3900
3901   /* PREFIX_VEX_69 */
3902   {
3903     { "(bad)",  { XX } },
3904     { "(bad)",  { XX } },
3905     { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3906     { "(bad)",  { XX } },
3907   },
3908
3909   /* PREFIX_VEX_6A */
3910   {
3911     { "(bad)",  { XX } },
3912     { "(bad)",  { XX } },
3913     { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3914     { "(bad)",  { XX } },
3915   },
3916
3917   /* PREFIX_VEX_6B */
3918   {
3919     { "(bad)",  { XX } },
3920     { "(bad)",  { XX } },
3921     { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3922     { "(bad)",  { XX } },
3923   },
3924
3925   /* PREFIX_VEX_6C */
3926   {
3927     { "(bad)",  { XX } },
3928     { "(bad)",  { XX } },
3929     { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3930     { "(bad)",  { XX } },
3931   },
3932
3933   /* PREFIX_VEX_6D */
3934   {
3935     { "(bad)",  { XX } },
3936     { "(bad)",  { XX } },
3937     { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3938     { "(bad)",  { XX } },
3939   },
3940
3941   /* PREFIX_VEX_6E */
3942   {
3943     { "(bad)",  { XX } },
3944     { "(bad)",  { XX } },
3945     { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3946     { "(bad)",  { XX } },
3947   },
3948
3949   /* PREFIX_VEX_6F */
3950   {
3951     { "(bad)",  { XX } },
3952     { VEX_W_TABLE (VEX_W_6F_P_1) },
3953     { VEX_W_TABLE (VEX_W_6F_P_2) },
3954     { "(bad)",  { XX } },
3955   },
3956
3957   /* PREFIX_VEX_70 */
3958   {
3959     { "(bad)",  { XX } },
3960     { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3961     { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3962     { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3963   },
3964
3965   /* PREFIX_VEX_71_REG_2 */
3966   {
3967     { "(bad)",  { XX } },
3968     { "(bad)",  { XX } },
3969     { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3970     { "(bad)",  { XX } },
3971   },
3972
3973   /* PREFIX_VEX_71_REG_4 */
3974   {
3975     { "(bad)",  { XX } },
3976     { "(bad)",  { XX } },
3977     { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3978     { "(bad)",  { XX } },
3979   },
3980
3981   /* PREFIX_VEX_71_REG_6 */
3982   {
3983     { "(bad)",  { XX } },
3984     { "(bad)",  { XX } },
3985     { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3986     { "(bad)",  { XX } },
3987   },
3988
3989   /* PREFIX_VEX_72_REG_2 */
3990   {
3991     { "(bad)",  { XX } },
3992     { "(bad)",  { XX } },
3993     { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3994     { "(bad)",  { XX } },
3995   },
3996
3997   /* PREFIX_VEX_72_REG_4 */
3998   {
3999     { "(bad)",  { XX } },
4000     { "(bad)",  { XX } },
4001     { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
4002     { "(bad)",  { XX } },
4003   },
4004
4005   /* PREFIX_VEX_72_REG_6 */
4006   {
4007     { "(bad)",  { XX } },
4008     { "(bad)",  { XX } },
4009     { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
4010     { "(bad)",  { XX } },
4011   },
4012
4013   /* PREFIX_VEX_73_REG_2 */
4014   {
4015     { "(bad)",  { XX } },
4016     { "(bad)",  { XX } },
4017     { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
4018     { "(bad)",  { XX } },
4019   },
4020
4021   /* PREFIX_VEX_73_REG_3 */
4022   {
4023     { "(bad)",  { XX } },
4024     { "(bad)",  { XX } },
4025     { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
4026     { "(bad)",  { XX } },
4027   },
4028
4029   /* PREFIX_VEX_73_REG_6 */
4030   {
4031     { "(bad)",  { XX } },
4032     { "(bad)",  { XX } },
4033     { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
4034     { "(bad)",  { XX } },
4035   },
4036
4037   /* PREFIX_VEX_73_REG_7 */
4038   {
4039     { "(bad)",  { XX } },
4040     { "(bad)",  { XX } },
4041     { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
4042     { "(bad)",  { XX } },
4043   },
4044
4045   /* PREFIX_VEX_74 */
4046   {
4047     { "(bad)",  { XX } },
4048     { "(bad)",  { XX } },
4049     { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
4050     { "(bad)",  { XX } },
4051   },
4052
4053   /* PREFIX_VEX_75 */
4054   {
4055     { "(bad)",  { XX } },
4056     { "(bad)",  { XX } },
4057     { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
4058     { "(bad)",  { XX } },
4059   },
4060
4061   /* PREFIX_VEX_76 */
4062   {
4063     { "(bad)",  { XX } },
4064     { "(bad)",  { XX } },
4065     { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
4066     { "(bad)",  { XX } },
4067   },
4068
4069   /* PREFIX_VEX_77 */
4070   {
4071     { VEX_W_TABLE (VEX_W_77_P_0) },
4072     { "(bad)",  { XX } },
4073     { "(bad)",  { XX } },
4074     { "(bad)",  { XX } },
4075   },
4076
4077   /* PREFIX_VEX_7C */
4078   {
4079     { "(bad)",  { XX } },
4080     { "(bad)",  { XX } },
4081     { VEX_W_TABLE (VEX_W_7C_P_2) },
4082     { VEX_W_TABLE (VEX_W_7C_P_3) },
4083   },
4084
4085   /* PREFIX_VEX_7D */
4086   {
4087     { "(bad)",  { XX } },
4088     { "(bad)",  { XX } },
4089     { VEX_W_TABLE (VEX_W_7D_P_2) },
4090     { VEX_W_TABLE (VEX_W_7D_P_3) },
4091   },
4092
4093   /* PREFIX_VEX_7E */
4094   {
4095     { "(bad)",  { XX } },
4096     { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
4097     { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
4098     { "(bad)",  { XX } },
4099   },
4100
4101   /* PREFIX_VEX_7F */
4102   {
4103     { "(bad)",  { XX } },
4104     { VEX_W_TABLE (VEX_W_7F_P_1) },
4105     { VEX_W_TABLE (VEX_W_7F_P_2) },
4106     { "(bad)",  { XX } },
4107   },
4108
4109   /* PREFIX_VEX_C2 */
4110   {
4111     { VEX_W_TABLE (VEX_W_C2_P_0) },
4112     { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
4113     { VEX_W_TABLE (VEX_W_C2_P_2) },
4114     { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
4115   },
4116
4117   /* PREFIX_VEX_C4 */
4118   {
4119     { "(bad)",  { XX } },
4120     { "(bad)",  { XX } },
4121     { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
4122     { "(bad)",  { XX } },
4123   },
4124
4125   /* PREFIX_VEX_C5 */
4126   {
4127     { "(bad)",  { XX } },
4128     { "(bad)",  { XX } },
4129     { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
4130     { "(bad)",  { XX } },
4131   },
4132
4133   /* PREFIX_VEX_D0 */
4134   {
4135     { "(bad)",  { XX } },
4136     { "(bad)",  { XX } },
4137     { VEX_W_TABLE (VEX_W_D0_P_2) },
4138     { VEX_W_TABLE (VEX_W_D0_P_3) },
4139   },
4140
4141   /* PREFIX_VEX_D1 */
4142   {
4143     { "(bad)",  { XX } },
4144     { "(bad)",  { XX } },
4145     { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
4146     { "(bad)",  { XX } },
4147   },
4148
4149   /* PREFIX_VEX_D2 */
4150   {
4151     { "(bad)",  { XX } },
4152     { "(bad)",  { XX } },
4153     { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
4154     { "(bad)",  { XX } },
4155   },
4156
4157   /* PREFIX_VEX_D3 */
4158   {
4159     { "(bad)",  { XX } },
4160     { "(bad)",  { XX } },
4161     { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
4162     { "(bad)",  { XX } },
4163   },
4164
4165   /* PREFIX_VEX_D4 */
4166   {
4167     { "(bad)",  { XX } },
4168     { "(bad)",  { XX } },
4169     { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
4170     { "(bad)",  { XX } },
4171   },
4172
4173   /* PREFIX_VEX_D5 */
4174   {
4175     { "(bad)",  { XX } },
4176     { "(bad)",  { XX } },
4177     { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
4178     { "(bad)",  { XX } },
4179   },
4180
4181   /* PREFIX_VEX_D6 */
4182   {
4183     { "(bad)",  { XX } },
4184     { "(bad)",  { XX } },
4185     { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
4186     { "(bad)",  { XX } },
4187   },
4188
4189   /* PREFIX_VEX_D7 */
4190   {
4191     { "(bad)",  { XX } },
4192     { "(bad)",  { XX } },
4193     { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
4194     { "(bad)",  { XX } },
4195   },
4196
4197   /* PREFIX_VEX_D8 */
4198   {
4199     { "(bad)",  { XX } },
4200     { "(bad)",  { XX } },
4201     { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
4202     { "(bad)",  { XX } },
4203   },
4204
4205   /* PREFIX_VEX_D9 */
4206   {
4207     { "(bad)",  { XX } },
4208     { "(bad)",  { XX } },
4209     { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
4210     { "(bad)",  { XX } },
4211   },
4212
4213   /* PREFIX_VEX_DA */
4214   {
4215     { "(bad)",  { XX } },
4216     { "(bad)",  { XX } },
4217     { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
4218     { "(bad)",  { XX } },
4219   },
4220
4221   /* PREFIX_VEX_DB */
4222   {
4223     { "(bad)",  { XX } },
4224     { "(bad)",  { XX } },
4225     { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
4226     { "(bad)",  { XX } },
4227   },
4228
4229   /* PREFIX_VEX_DC */
4230   {
4231     { "(bad)",  { XX } },
4232     { "(bad)",  { XX } },
4233     { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
4234     { "(bad)",  { XX } },
4235   },
4236
4237   /* PREFIX_VEX_DD */
4238   {
4239     { "(bad)",  { XX } },
4240     { "(bad)",  { XX } },
4241     { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
4242     { "(bad)",  { XX } },
4243   },
4244
4245   /* PREFIX_VEX_DE */
4246   {
4247     { "(bad)",  { XX } },
4248     { "(bad)",  { XX } },
4249     { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
4250     { "(bad)",  { XX } },
4251   },
4252
4253   /* PREFIX_VEX_DF */
4254   {
4255     { "(bad)",  { XX } },
4256     { "(bad)",  { XX } },
4257     { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
4258     { "(bad)",  { XX } },
4259   },
4260
4261   /* PREFIX_VEX_E0 */
4262   {
4263     { "(bad)",  { XX } },
4264     { "(bad)",  { XX } },
4265     { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
4266     { "(bad)",  { XX } },
4267   },
4268
4269   /* PREFIX_VEX_E1 */
4270   {
4271     { "(bad)",  { XX } },
4272     { "(bad)",  { XX } },
4273     { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
4274     { "(bad)",  { XX } },
4275   },
4276
4277   /* PREFIX_VEX_E2 */
4278   {
4279     { "(bad)",  { XX } },
4280     { "(bad)",  { XX } },
4281     { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
4282     { "(bad)",  { XX } },
4283   },
4284
4285   /* PREFIX_VEX_E3 */
4286   {
4287     { "(bad)",  { XX } },
4288     { "(bad)",  { XX } },
4289     { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
4290     { "(bad)",  { XX } },
4291   },
4292
4293   /* PREFIX_VEX_E4 */
4294   {
4295     { "(bad)",  { XX } },
4296     { "(bad)",  { XX } },
4297     { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
4298     { "(bad)",  { XX } },
4299   },
4300
4301   /* PREFIX_VEX_E5 */
4302   {
4303     { "(bad)",  { XX } },
4304     { "(bad)",  { XX } },
4305     { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4306     { "(bad)",  { XX } },
4307   },
4308
4309   /* PREFIX_VEX_E6 */
4310   {
4311     { "(bad)",  { XX } },
4312     { VEX_W_TABLE (VEX_W_E6_P_1) },
4313     { VEX_W_TABLE (VEX_W_E6_P_2) },
4314     { VEX_W_TABLE (VEX_W_E6_P_3) },
4315   },
4316
4317   /* PREFIX_VEX_E7 */
4318   {
4319     { "(bad)",  { XX } },
4320     { "(bad)",  { XX } },
4321     { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4322     { "(bad)",  { XX } },
4323   },
4324
4325   /* PREFIX_VEX_E8 */
4326   {
4327     { "(bad)",  { XX } },
4328     { "(bad)",  { XX } },
4329     { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4330     { "(bad)",  { XX } },
4331   },
4332
4333   /* PREFIX_VEX_E9 */
4334   {
4335     { "(bad)",  { XX } },
4336     { "(bad)",  { XX } },
4337     { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4338     { "(bad)",  { XX } },
4339   },
4340
4341   /* PREFIX_VEX_EA */
4342   {
4343     { "(bad)",  { XX } },
4344     { "(bad)",  { XX } },
4345     { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4346     { "(bad)",  { XX } },
4347   },
4348
4349   /* PREFIX_VEX_EB */
4350   {
4351     { "(bad)",  { XX } },
4352     { "(bad)",  { XX } },
4353     { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4354     { "(bad)",  { XX } },
4355   },
4356
4357   /* PREFIX_VEX_EC */
4358   {
4359     { "(bad)",  { XX } },
4360     { "(bad)",  { XX } },
4361     { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4362     { "(bad)",  { XX } },
4363   },
4364
4365   /* PREFIX_VEX_ED */
4366   {
4367     { "(bad)",  { XX } },
4368     { "(bad)",  { XX } },
4369     { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4370     { "(bad)",  { XX } },
4371   },
4372
4373   /* PREFIX_VEX_EE */
4374   {
4375     { "(bad)",  { XX } },
4376     { "(bad)",  { XX } },
4377     { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4378     { "(bad)",  { XX } },
4379   },
4380
4381   /* PREFIX_VEX_EF */
4382   {
4383     { "(bad)",  { XX } },
4384     { "(bad)",  { XX } },
4385     { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4386     { "(bad)",  { XX } },
4387   },
4388
4389   /* PREFIX_VEX_F0 */
4390   {
4391     { "(bad)",  { XX } },
4392     { "(bad)",  { XX } },
4393     { "(bad)",  { XX } },
4394     { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4395   },
4396
4397   /* PREFIX_VEX_F1 */
4398   {
4399     { "(bad)",  { XX } },
4400     { "(bad)",  { XX } },
4401     { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4402     { "(bad)",  { XX } },
4403   },
4404
4405   /* PREFIX_VEX_F2 */
4406   {
4407     { "(bad)",  { XX } },
4408     { "(bad)",  { XX } },
4409     { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4410     { "(bad)",  { XX } },
4411   },
4412
4413   /* PREFIX_VEX_F3 */
4414   {
4415     { "(bad)",  { XX } },
4416     { "(bad)",  { XX } },
4417     { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4418     { "(bad)",  { XX } },
4419   },
4420
4421   /* PREFIX_VEX_F4 */
4422   {
4423     { "(bad)",  { XX } },
4424     { "(bad)",  { XX } },
4425     { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4426     { "(bad)",  { XX } },
4427   },
4428
4429   /* PREFIX_VEX_F5 */
4430   {
4431     { "(bad)",  { XX } },
4432     { "(bad)",  { XX } },
4433     { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4434     { "(bad)",  { XX } },
4435   },
4436
4437   /* PREFIX_VEX_F6 */
4438   {
4439     { "(bad)",  { XX } },
4440     { "(bad)",  { XX } },
4441     { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4442     { "(bad)",  { XX } },
4443   },
4444
4445   /* PREFIX_VEX_F7 */
4446   {
4447     { "(bad)",  { XX } },
4448     { "(bad)",  { XX } },
4449     { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4450     { "(bad)",  { XX } },
4451   },
4452
4453   /* PREFIX_VEX_F8 */
4454   {
4455     { "(bad)",  { XX } },
4456     { "(bad)",  { XX } },
4457     { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4458     { "(bad)",  { XX } },
4459   },
4460
4461   /* PREFIX_VEX_F9 */
4462   {
4463     { "(bad)",  { XX } },
4464     { "(bad)",  { XX } },
4465     { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4466     { "(bad)",  { XX } },
4467   },
4468
4469   /* PREFIX_VEX_FA */
4470   {
4471     { "(bad)",  { XX } },
4472     { "(bad)",  { XX } },
4473     { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4474     { "(bad)",  { XX } },
4475   },
4476
4477   /* PREFIX_VEX_FB */
4478   {
4479     { "(bad)",  { XX } },
4480     { "(bad)",  { XX } },
4481     { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4482     { "(bad)",  { XX } },
4483   },
4484
4485   /* PREFIX_VEX_FC */
4486   {
4487     { "(bad)",  { XX } },
4488     { "(bad)",  { XX } },
4489     { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4490     { "(bad)",  { XX } },
4491   },
4492
4493   /* PREFIX_VEX_FD */
4494   {
4495     { "(bad)",  { XX } },
4496     { "(bad)",  { XX } },
4497     { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4498     { "(bad)",  { XX } },
4499   },
4500
4501   /* PREFIX_VEX_FE */
4502   {
4503     { "(bad)",  { XX } },
4504     { "(bad)",  { XX } },
4505     { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4506     { "(bad)",  { XX } },
4507   },
4508
4509   /* PREFIX_VEX_3800 */
4510   {
4511     { "(bad)",  { XX } },
4512     { "(bad)",  { XX } },
4513     { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4514     { "(bad)",  { XX } },
4515   },
4516
4517   /* PREFIX_VEX_3801 */
4518   {
4519     { "(bad)",  { XX } },
4520     { "(bad)",  { XX } },
4521     { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4522     { "(bad)",  { XX } },
4523   },
4524
4525   /* PREFIX_VEX_3802 */
4526   {
4527     { "(bad)",  { XX } },
4528     { "(bad)",  { XX } },
4529     { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4530     { "(bad)",  { XX } },
4531   },
4532
4533   /* PREFIX_VEX_3803 */
4534   {
4535     { "(bad)",  { XX } },
4536     { "(bad)",  { XX } },
4537     { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4538     { "(bad)",  { XX } },
4539   },
4540
4541   /* PREFIX_VEX_3804 */
4542   {
4543     { "(bad)",  { XX } },
4544     { "(bad)",  { XX } },
4545     { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4546     { "(bad)",  { XX } },
4547   },
4548
4549   /* PREFIX_VEX_3805 */
4550   {
4551     { "(bad)",  { XX } },
4552     { "(bad)",  { XX } },
4553     { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4554     { "(bad)",  { XX } },
4555   },
4556
4557   /* PREFIX_VEX_3806 */
4558   {
4559     { "(bad)",  { XX } },
4560     { "(bad)",  { XX } },
4561     { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4562     { "(bad)",  { XX } },
4563   },
4564
4565   /* PREFIX_VEX_3807 */
4566   {
4567     { "(bad)",  { XX } },
4568     { "(bad)",  { XX } },
4569     { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4570     { "(bad)",  { XX } },
4571   },
4572
4573   /* PREFIX_VEX_3808 */
4574   {
4575     { "(bad)",  { XX } },
4576     { "(bad)",  { XX } },
4577     { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4578     { "(bad)",  { XX } },
4579   },
4580
4581   /* PREFIX_VEX_3809 */
4582   {
4583     { "(bad)",  { XX } },
4584     { "(bad)",  { XX } },
4585     { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4586     { "(bad)",  { XX } },
4587   },
4588
4589   /* PREFIX_VEX_380A */
4590   {
4591     { "(bad)",  { XX } },
4592     { "(bad)",  { XX } },
4593     { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4594     { "(bad)",  { XX } },
4595   },
4596
4597   /* PREFIX_VEX_380B */
4598   {
4599     { "(bad)",  { XX } },
4600     { "(bad)",  { XX } },
4601     { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4602     { "(bad)",  { XX } },
4603   },
4604
4605   /* PREFIX_VEX_380C */
4606   {
4607     { "(bad)",  { XX } },
4608     { "(bad)",  { XX } },
4609     { VEX_W_TABLE (VEX_W_380C_P_2) },
4610     { "(bad)",  { XX } },
4611   },
4612
4613   /* PREFIX_VEX_380D */
4614   {
4615     { "(bad)",  { XX } },
4616     { "(bad)",  { XX } },
4617     { VEX_W_TABLE (VEX_W_380D_P_2) },
4618     { "(bad)",  { XX } },
4619   },
4620
4621   /* PREFIX_VEX_380E */
4622   {
4623     { "(bad)",  { XX } },
4624     { "(bad)",  { XX } },
4625     { VEX_W_TABLE (VEX_W_380E_P_2) },
4626     { "(bad)",  { XX } },
4627   },
4628
4629   /* PREFIX_VEX_380F */
4630   {
4631     { "(bad)",  { XX } },
4632     { "(bad)",  { XX } },
4633     { VEX_W_TABLE (VEX_W_380F_P_2) },
4634     { "(bad)",  { XX } },
4635   },
4636
4637   /* PREFIX_VEX_3817 */
4638   {
4639     { "(bad)",  { XX } },
4640     { "(bad)",  { XX } },
4641     { VEX_W_TABLE (VEX_W_3817_P_2) },
4642     { "(bad)",  { XX } },
4643   },
4644
4645   /* PREFIX_VEX_3818 */
4646   {
4647     { "(bad)",  { XX } },
4648     { "(bad)",  { XX } },
4649     { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4650     { "(bad)",  { XX } },
4651   },
4652
4653   /* PREFIX_VEX_3819 */
4654   {
4655     { "(bad)",  { XX } },
4656     { "(bad)",  { XX } },
4657     { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4658     { "(bad)",  { XX } },
4659   },
4660
4661   /* PREFIX_VEX_381A */
4662   {
4663     { "(bad)",  { XX } },
4664     { "(bad)",  { XX } },
4665     { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4666     { "(bad)",  { XX } },
4667   },
4668
4669   /* PREFIX_VEX_381C */
4670   {
4671     { "(bad)",  { XX } },
4672     { "(bad)",  { XX } },
4673     { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4674     { "(bad)",  { XX } },
4675   },
4676
4677   /* PREFIX_VEX_381D */
4678   {
4679     { "(bad)",  { XX } },
4680     { "(bad)",  { XX } },
4681     { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4682     { "(bad)",  { XX } },
4683   },
4684
4685   /* PREFIX_VEX_381E */
4686   {
4687     { "(bad)",  { XX } },
4688     { "(bad)",  { XX } },
4689     { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4690     { "(bad)",  { XX } },
4691   },
4692
4693   /* PREFIX_VEX_3820 */
4694   {
4695     { "(bad)",  { XX } },
4696     { "(bad)",  { XX } },
4697     { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4698     { "(bad)",  { XX } },
4699   },
4700
4701   /* PREFIX_VEX_3821 */
4702   {
4703     { "(bad)",  { XX } },
4704     { "(bad)",  { XX } },
4705     { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4706     { "(bad)",  { XX } },
4707   },
4708
4709   /* PREFIX_VEX_3822 */
4710   {
4711     { "(bad)",  { XX } },
4712     { "(bad)",  { XX } },
4713     { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4714     { "(bad)",  { XX } },
4715   },
4716
4717   /* PREFIX_VEX_3823 */
4718   {
4719     { "(bad)",  { XX } },
4720     { "(bad)",  { XX } },
4721     { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4722     { "(bad)",  { XX } },
4723   },
4724
4725   /* PREFIX_VEX_3824 */
4726   {
4727     { "(bad)",  { XX } },
4728     { "(bad)",  { XX } },
4729     { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4730     { "(bad)",  { XX } },
4731   },
4732
4733   /* PREFIX_VEX_3825 */
4734   {
4735     { "(bad)",  { XX } },
4736     { "(bad)",  { XX } },
4737     { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4738     { "(bad)",  { XX } },
4739   },
4740
4741   /* PREFIX_VEX_3828 */
4742   {
4743     { "(bad)",  { XX } },
4744     { "(bad)",  { XX } },
4745     { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4746     { "(bad)",  { XX } },
4747   },
4748
4749   /* PREFIX_VEX_3829 */
4750   {
4751     { "(bad)",  { XX } },
4752     { "(bad)",  { XX } },
4753     { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4754     { "(bad)",  { XX } },
4755   },
4756
4757   /* PREFIX_VEX_382A */
4758   {
4759     { "(bad)",  { XX } },
4760     { "(bad)",  { XX } },
4761     { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4762     { "(bad)",  { XX } },
4763   },
4764
4765   /* PREFIX_VEX_382B */
4766   {
4767     { "(bad)",  { XX } },
4768     { "(bad)",  { XX } },
4769     { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4770     { "(bad)",  { XX } },
4771   },
4772
4773   /* PREFIX_VEX_382C */
4774   {
4775     { "(bad)",  { XX } },
4776     { "(bad)",  { XX } },
4777      { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4778     { "(bad)",  { XX } },
4779   },
4780
4781   /* PREFIX_VEX_382D */
4782   {
4783     { "(bad)",  { XX } },
4784     { "(bad)",  { XX } },
4785      { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4786     { "(bad)",  { XX } },
4787   },
4788
4789   /* PREFIX_VEX_382E */
4790   {
4791     { "(bad)",  { XX } },
4792     { "(bad)",  { XX } },
4793      { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4794     { "(bad)",  { XX } },
4795   },
4796
4797   /* PREFIX_VEX_382F */
4798   {
4799     { "(bad)",  { XX } },
4800     { "(bad)",  { XX } },
4801      { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4802     { "(bad)",  { XX } },
4803   },
4804
4805   /* PREFIX_VEX_3830 */
4806   {
4807     { "(bad)",  { XX } },
4808     { "(bad)",  { XX } },
4809     { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4810     { "(bad)",  { XX } },
4811   },
4812
4813   /* PREFIX_VEX_3831 */
4814   {
4815     { "(bad)",  { XX } },
4816     { "(bad)",  { XX } },
4817     { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4818     { "(bad)",  { XX } },
4819   },
4820
4821   /* PREFIX_VEX_3832 */
4822   {
4823     { "(bad)",  { XX } },
4824     { "(bad)",  { XX } },
4825     { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4826     { "(bad)",  { XX } },
4827   },
4828
4829   /* PREFIX_VEX_3833 */
4830   {
4831     { "(bad)",  { XX } },
4832     { "(bad)",  { XX } },
4833     { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4834     { "(bad)",  { XX } },
4835   },
4836
4837   /* PREFIX_VEX_3834 */
4838   {
4839     { "(bad)",  { XX } },
4840     { "(bad)",  { XX } },
4841     { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4842     { "(bad)",  { XX } },
4843   },
4844
4845   /* PREFIX_VEX_3835 */
4846   {
4847     { "(bad)",  { XX } },
4848     { "(bad)",  { XX } },
4849     { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4850     { "(bad)",  { XX } },
4851   },
4852
4853   /* PREFIX_VEX_3837 */
4854   {
4855     { "(bad)",  { XX } },
4856     { "(bad)",  { XX } },
4857     { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4858     { "(bad)",  { XX } },
4859   },
4860
4861   /* PREFIX_VEX_3838 */
4862   {
4863     { "(bad)",  { XX } },
4864     { "(bad)",  { XX } },
4865     { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4866     { "(bad)",  { XX } },
4867   },
4868
4869   /* PREFIX_VEX_3839 */
4870   {
4871     { "(bad)",  { XX } },
4872     { "(bad)",  { XX } },
4873     { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4874     { "(bad)",  { XX } },
4875   },
4876
4877   /* PREFIX_VEX_383A */
4878   {
4879     { "(bad)",  { XX } },
4880     { "(bad)",  { XX } },
4881     { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4882     { "(bad)",  { XX } },
4883   },
4884
4885   /* PREFIX_VEX_383B */
4886   {
4887     { "(bad)",  { XX } },
4888     { "(bad)",  { XX } },
4889     { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4890     { "(bad)",  { XX } },
4891   },
4892
4893   /* PREFIX_VEX_383C */
4894   {
4895     { "(bad)",  { XX } },
4896     { "(bad)",  { XX } },
4897     { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4898     { "(bad)",  { XX } },
4899   },
4900
4901   /* PREFIX_VEX_383D */
4902   {
4903     { "(bad)",  { XX } },
4904     { "(bad)",  { XX } },
4905     { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4906     { "(bad)",  { XX } },
4907   },
4908
4909   /* PREFIX_VEX_383E */
4910   {
4911     { "(bad)",  { XX } },
4912     { "(bad)",  { XX } },
4913     { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4914     { "(bad)",  { XX } },
4915   },
4916
4917   /* PREFIX_VEX_383F */
4918   {
4919     { "(bad)",  { XX } },
4920     { "(bad)",  { XX } },
4921     { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4922     { "(bad)",  { XX } },
4923   },
4924
4925   /* PREFIX_VEX_3840 */
4926   {
4927     { "(bad)",  { XX } },
4928     { "(bad)",  { XX } },
4929     { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4930     { "(bad)",  { XX } },
4931   },
4932
4933   /* PREFIX_VEX_3841 */
4934   {
4935     { "(bad)",  { XX } },
4936     { "(bad)",  { XX } },
4937     { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4938     { "(bad)",  { XX } },
4939   },
4940
4941   /* PREFIX_VEX_3896 */
4942   {
4943     { "(bad)",  { XX } },
4944     { "(bad)",  { XX } },
4945     { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4946     { "(bad)",  { XX } },
4947   },
4948
4949   /* PREFIX_VEX_3897 */
4950   {
4951     { "(bad)",  { XX } },
4952     { "(bad)",  { XX } },
4953     { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4954     { "(bad)",  { XX } },
4955   },
4956
4957   /* PREFIX_VEX_3898 */
4958   {
4959     { "(bad)",  { XX } },
4960     { "(bad)",  { XX } },
4961     { "vfmadd132p%XW", { XM, Vex, EXx } },
4962     { "(bad)",  { XX } },
4963   },
4964
4965   /* PREFIX_VEX_3899 */
4966   {
4967     { "(bad)",  { XX } },
4968     { "(bad)",  { XX } },
4969     { "vfmadd132s%XW", { XM, Vex, EXVexWdq } },
4970     { "(bad)",  { XX } },
4971   },
4972
4973   /* PREFIX_VEX_389A */
4974   {
4975     { "(bad)",  { XX } },
4976     { "(bad)",  { XX } },
4977     { "vfmsub132p%XW", { XM, Vex, EXx } },
4978     { "(bad)",  { XX } },
4979   },
4980
4981   /* PREFIX_VEX_389B */
4982   {
4983     { "(bad)",  { XX } },
4984     { "(bad)",  { XX } },
4985     { "vfmsub132s%XW", { XM, Vex, EXVexWdq } },
4986     { "(bad)",  { XX } },
4987   },
4988
4989   /* PREFIX_VEX_389C */
4990   {
4991     { "(bad)",  { XX } },
4992     { "(bad)",  { XX } },
4993     { "vfnmadd132p%XW", { XM, Vex, EXx } },
4994     { "(bad)",  { XX } },
4995   },
4996
4997   /* PREFIX_VEX_389D */
4998   {
4999     { "(bad)",  { XX } },
5000     { "(bad)",  { XX } },
5001     { "vfnmadd132s%XW", { XM, Vex, EXVexWdq } },
5002     { "(bad)",  { XX } },
5003   },
5004
5005   /* PREFIX_VEX_389E */
5006   {
5007     { "(bad)",  { XX } },
5008     { "(bad)",  { XX } },
5009     { "vfnmsub132p%XW", { XM, Vex, EXx } },
5010     { "(bad)",  { XX } },
5011   },
5012
5013   /* PREFIX_VEX_389F */
5014   {
5015     { "(bad)",  { XX } },
5016     { "(bad)",  { XX } },
5017     { "vfnmsub132s%XW", { XM, Vex, EXVexWdq } },
5018     { "(bad)",  { XX } },
5019   },
5020
5021   /* PREFIX_VEX_38A6 */
5022   {
5023     { "(bad)",  { XX } },
5024     { "(bad)",  { XX } },
5025     { "vfmaddsub213p%XW", { XM, Vex, EXx } },
5026     { "(bad)",  { XX } },
5027   },
5028
5029   /* PREFIX_VEX_38A7 */
5030   {
5031     { "(bad)",  { XX } },
5032     { "(bad)",  { XX } },
5033     { "vfmsubadd213p%XW", { XM, Vex, EXx } },
5034     { "(bad)",  { XX } },
5035   },
5036
5037   /* PREFIX_VEX_38A8 */
5038   {
5039     { "(bad)",  { XX } },
5040     { "(bad)",  { XX } },
5041     { "vfmadd213p%XW", { XM, Vex, EXx } },
5042     { "(bad)",  { XX } },
5043   },
5044
5045   /* PREFIX_VEX_38A9 */
5046   {
5047     { "(bad)",  { XX } },
5048     { "(bad)",  { XX } },
5049     { "vfmadd213s%XW", { XM, Vex, EXVexWdq } },
5050     { "(bad)",  { XX } },
5051   },
5052
5053   /* PREFIX_VEX_38AA */
5054   {
5055     { "(bad)",  { XX } },
5056     { "(bad)",  { XX } },
5057     { "vfmsub213p%XW", { XM, Vex, EXx } },
5058     { "(bad)",  { XX } },
5059   },
5060
5061   /* PREFIX_VEX_38AB */
5062   {
5063     { "(bad)",  { XX } },
5064     { "(bad)",  { XX } },
5065     { "vfmsub213s%XW", { XM, Vex, EXVexWdq } },
5066     { "(bad)",  { XX } },
5067   },
5068
5069   /* PREFIX_VEX_38AC */
5070   {
5071     { "(bad)",  { XX } },
5072     { "(bad)",  { XX } },
5073     { "vfnmadd213p%XW", { XM, Vex, EXx } },
5074     { "(bad)",  { XX } },
5075   },
5076
5077   /* PREFIX_VEX_38AD */
5078   {
5079     { "(bad)",  { XX } },
5080     { "(bad)",  { XX } },
5081     { "vfnmadd213s%XW", { XM, Vex, EXVexWdq } },
5082     { "(bad)",  { XX } },
5083   },
5084
5085   /* PREFIX_VEX_38AE */
5086   {
5087     { "(bad)",  { XX } },
5088     { "(bad)",  { XX } },
5089     { "vfnmsub213p%XW", { XM, Vex, EXx } },
5090     { "(bad)",  { XX } },
5091   },
5092
5093   /* PREFIX_VEX_38AF */
5094   {
5095     { "(bad)",  { XX } },
5096     { "(bad)",  { XX } },
5097     { "vfnmsub213s%XW", { XM, Vex, EXVexWdq } },
5098     { "(bad)",  { XX } },
5099   },
5100
5101   /* PREFIX_VEX_38B6 */
5102   {
5103     { "(bad)",  { XX } },
5104     { "(bad)",  { XX } },
5105     { "vfmaddsub231p%XW", { XM, Vex, EXx } },
5106     { "(bad)",  { XX } },
5107   },
5108
5109   /* PREFIX_VEX_38B7 */
5110   {
5111     { "(bad)",  { XX } },
5112     { "(bad)",  { XX } },
5113     { "vfmsubadd231p%XW", { XM, Vex, EXx } },
5114     { "(bad)",  { XX } },
5115   },
5116
5117   /* PREFIX_VEX_38B8 */
5118   {
5119     { "(bad)",  { XX } },
5120     { "(bad)",  { XX } },
5121     { "vfmadd231p%XW", { XM, Vex, EXx } },
5122     { "(bad)",  { XX } },
5123   },
5124
5125   /* PREFIX_VEX_38B9 */
5126   {
5127     { "(bad)",  { XX } },
5128     { "(bad)",  { XX } },
5129     { "vfmadd231s%XW", { XM, Vex, EXVexWdq } },
5130     { "(bad)",  { XX } },
5131   },
5132
5133   /* PREFIX_VEX_38BA */
5134   {
5135     { "(bad)",  { XX } },
5136     { "(bad)",  { XX } },
5137     { "vfmsub231p%XW", { XM, Vex, EXx } },
5138     { "(bad)",  { XX } },
5139   },
5140
5141   /* PREFIX_VEX_38BB */
5142   {
5143     { "(bad)",  { XX } },
5144     { "(bad)",  { XX } },
5145     { "vfmsub231s%XW", { XM, Vex, EXVexWdq } },
5146     { "(bad)",  { XX } },
5147   },
5148
5149   /* PREFIX_VEX_38BC */
5150   {
5151     { "(bad)",  { XX } },
5152     { "(bad)",  { XX } },
5153     { "vfnmadd231p%XW", { XM, Vex, EXx } },
5154     { "(bad)",  { XX } },
5155   },
5156
5157   /* PREFIX_VEX_38BD */
5158   {
5159     { "(bad)",  { XX } },
5160     { "(bad)",  { XX } },
5161     { "vfnmadd231s%XW", { XM, Vex, EXVexWdq } },
5162     { "(bad)",  { XX } },
5163   },
5164
5165   /* PREFIX_VEX_38BE */
5166   {
5167     { "(bad)",  { XX } },
5168     { "(bad)",  { XX } },
5169     { "vfnmsub231p%XW", { XM, Vex, EXx } },
5170     { "(bad)",  { XX } },
5171   },
5172
5173   /* PREFIX_VEX_38BF */
5174   {
5175     { "(bad)",  { XX } },
5176     { "(bad)",  { XX } },
5177     { "vfnmsub231s%XW", { XM, Vex, EXVexWdq } },
5178     { "(bad)",  { XX } },
5179   },
5180
5181   /* PREFIX_VEX_38DB */
5182   {
5183     { "(bad)",  { XX } },
5184     { "(bad)",  { XX } },
5185     { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
5186     { "(bad)",  { XX } },
5187   },
5188
5189   /* PREFIX_VEX_38DC */
5190   {
5191     { "(bad)",  { XX } },
5192     { "(bad)",  { XX } },
5193     { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
5194     { "(bad)",  { XX } },
5195   },
5196
5197   /* PREFIX_VEX_38DD */
5198   {
5199     { "(bad)",  { XX } },
5200     { "(bad)",  { XX } },
5201     { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
5202     { "(bad)",  { XX } },
5203   },
5204
5205   /* PREFIX_VEX_38DE */
5206   {
5207     { "(bad)",  { XX } },
5208     { "(bad)",  { XX } },
5209     { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
5210     { "(bad)",  { XX } },
5211   },
5212
5213   /* PREFIX_VEX_38DF */
5214   {
5215     { "(bad)",  { XX } },
5216     { "(bad)",  { XX } },
5217     { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
5218     { "(bad)",  { XX } },
5219   },
5220
5221   /* PREFIX_VEX_3A04 */
5222   {
5223     { "(bad)",  { XX } },
5224     { "(bad)",  { XX } },
5225     { VEX_W_TABLE (VEX_W_3A04_P_2) },
5226     { "(bad)",  { XX } },
5227   },
5228
5229   /* PREFIX_VEX_3A05 */
5230   {
5231     { "(bad)",  { XX } },
5232     { "(bad)",  { XX } },
5233     { VEX_W_TABLE (VEX_W_3A05_P_2) },
5234     { "(bad)",  { XX } },
5235   },
5236
5237   /* PREFIX_VEX_3A06 */
5238   {
5239     { "(bad)",  { XX } },
5240     { "(bad)",  { XX } },
5241     { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
5242     { "(bad)",  { XX } },
5243   },
5244
5245   /* PREFIX_VEX_3A08 */
5246   {
5247     { "(bad)",  { XX } },
5248     { "(bad)",  { XX } },
5249     { VEX_W_TABLE (VEX_W_3A08_P_2) },
5250     { "(bad)",  { XX } },
5251   },
5252
5253   /* PREFIX_VEX_3A09 */
5254   {
5255     { "(bad)",  { XX } },
5256     { "(bad)",  { XX } },
5257     { VEX_W_TABLE (VEX_W_3A09_P_2) },
5258     { "(bad)",  { XX } },
5259   },
5260
5261   /* PREFIX_VEX_3A0A */
5262   {
5263     { "(bad)",  { XX } },
5264     { "(bad)",  { XX } },
5265     { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
5266     { "(bad)",  { XX } },
5267   },
5268
5269   /* PREFIX_VEX_3A0B */
5270   {
5271     { "(bad)",  { XX } },
5272     { "(bad)",  { XX } },
5273     { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
5274     { "(bad)",  { XX } },
5275   },
5276
5277   /* PREFIX_VEX_3A0C */
5278   {
5279     { "(bad)",  { XX } },
5280     { "(bad)",  { XX } },
5281     { VEX_W_TABLE (VEX_W_3A0C_P_2) },
5282     { "(bad)",  { XX } },
5283   },
5284
5285   /* PREFIX_VEX_3A0D */
5286   {
5287     { "(bad)",  { XX } },
5288     { "(bad)",  { XX } },
5289     { VEX_W_TABLE (VEX_W_3A0D_P_2) },
5290     { "(bad)",  { XX } },
5291   },
5292
5293   /* PREFIX_VEX_3A0E */
5294   {
5295     { "(bad)",  { XX } },
5296     { "(bad)",  { XX } },
5297     { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
5298     { "(bad)",  { XX } },
5299   },
5300
5301   /* PREFIX_VEX_3A0F */
5302   {
5303     { "(bad)",  { XX } },
5304     { "(bad)",  { XX } },
5305     { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5306     { "(bad)",  { XX } },
5307   },
5308
5309   /* PREFIX_VEX_3A14 */
5310   {
5311     { "(bad)",  { XX } },
5312     { "(bad)",  { XX } },
5313     { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5314     { "(bad)",  { XX } },
5315   },
5316
5317   /* PREFIX_VEX_3A15 */
5318   {
5319     { "(bad)",  { XX } },
5320     { "(bad)",  { XX } },
5321     { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5322     { "(bad)",  { XX } },
5323   },
5324
5325   /* PREFIX_VEX_3A16 */
5326   {
5327     { "(bad)",  { XX } },
5328     { "(bad)",  { XX } },
5329     { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
5330     { "(bad)",  { XX } },
5331   },
5332
5333   /* PREFIX_VEX_3A17 */
5334   {
5335     { "(bad)",  { XX } },
5336     { "(bad)",  { XX } },
5337     { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
5338     { "(bad)",  { XX } },
5339   },
5340
5341   /* PREFIX_VEX_3A18 */
5342   {
5343     { "(bad)",  { XX } },
5344     { "(bad)",  { XX } },
5345     { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
5346     { "(bad)",  { XX } },
5347   },
5348
5349   /* PREFIX_VEX_3A19 */
5350   {
5351     { "(bad)",  { XX } },
5352     { "(bad)",  { XX } },
5353     { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
5354     { "(bad)",  { XX } },
5355   },
5356
5357   /* PREFIX_VEX_3A20 */
5358   {
5359     { "(bad)",  { XX } },
5360     { "(bad)",  { XX } },
5361     { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
5362     { "(bad)",  { XX } },
5363   },
5364
5365   /* PREFIX_VEX_3A21 */
5366   {
5367     { "(bad)",  { XX } },
5368     { "(bad)",  { XX } },
5369     { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
5370     { "(bad)",  { XX } },
5371   },
5372
5373   /* PREFIX_VEX_3A22 */
5374   {
5375     { "(bad)",  { XX } },
5376     { "(bad)",  { XX } },
5377     { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5378     { "(bad)",  { XX } },
5379   },
5380
5381   /* PREFIX_VEX_3A40 */
5382   {
5383     { "(bad)",  { XX } },
5384     { "(bad)",  { XX } },
5385     { VEX_W_TABLE (VEX_W_3A40_P_2) },
5386     { "(bad)",  { XX } },
5387   },
5388
5389   /* PREFIX_VEX_3A41 */
5390   {
5391     { "(bad)",  { XX } },
5392     { "(bad)",  { XX } },
5393     { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5394     { "(bad)",  { XX } },
5395   },
5396
5397   /* PREFIX_VEX_3A42 */
5398   {
5399     { "(bad)",  { XX } },
5400     { "(bad)",  { XX } },
5401     { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5402     { "(bad)",  { XX } },
5403   },
5404
5405   /* PREFIX_VEX_3A44 */
5406   {
5407     { "(bad)",  { XX } },
5408     { "(bad)",  { XX } },
5409     { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5410     { "(bad)",  { XX } },
5411   },
5412
5413   /* PREFIX_VEX_3A4A */
5414   {
5415     { "(bad)",  { XX } },
5416     { "(bad)",  { XX } },
5417     { VEX_W_TABLE (VEX_W_3A4A_P_2) },
5418     { "(bad)",  { XX } },
5419   },
5420
5421   /* PREFIX_VEX_3A4B */
5422   {
5423     { "(bad)",  { XX } },
5424     { "(bad)",  { XX } },
5425     { VEX_W_TABLE (VEX_W_3A4B_P_2) },
5426     { "(bad)",  { XX } },
5427   },
5428
5429   /* PREFIX_VEX_3A4C */
5430   {
5431     { "(bad)",  { XX } },
5432     { "(bad)",  { XX } },
5433     { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5434     { "(bad)",  { XX } },
5435   },
5436
5437   /* PREFIX_VEX_3A5C */
5438   {
5439     { "(bad)",  { XX } },
5440     { "(bad)",  { XX } },
5441     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5442     { "(bad)",  { XX } },
5443   },
5444
5445   /* PREFIX_VEX_3A5D */
5446   {
5447     { "(bad)",  { XX } },
5448     { "(bad)",  { XX } },
5449     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5450     { "(bad)",  { XX } },
5451   },
5452
5453   /* PREFIX_VEX_3A5E */
5454   {
5455     { "(bad)",  { XX } },
5456     { "(bad)",  { XX } },
5457     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5458     { "(bad)",  { XX } },
5459   },
5460
5461   /* PREFIX_VEX_3A5F */
5462   {
5463     { "(bad)",  { XX } },
5464     { "(bad)",  { XX } },
5465     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5466     { "(bad)",  { XX } },
5467   },
5468
5469   /* PREFIX_VEX_3A60 */
5470   {
5471     { "(bad)",  { XX } },
5472     { "(bad)",  { XX } },
5473     { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5474     { "(bad)",  { XX } },
5475   },
5476
5477   /* PREFIX_VEX_3A61 */
5478   {
5479     { "(bad)",  { XX } },
5480     { "(bad)",  { XX } },
5481     { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5482     { "(bad)",  { XX } },
5483   },
5484
5485   /* PREFIX_VEX_3A62 */
5486   {
5487     { "(bad)",  { XX } },
5488     { "(bad)",  { XX } },
5489     { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5490     { "(bad)",  { XX } },
5491   },
5492
5493   /* PREFIX_VEX_3A63 */
5494   {
5495     { "(bad)",  { XX } },
5496     { "(bad)",  { XX } },
5497     { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5498     { "(bad)",  { XX } },
5499   },
5500
5501   /* PREFIX_VEX_3A68 */
5502   {
5503     { "(bad)",  { XX } },
5504     { "(bad)",  { XX } },
5505     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5506     { "(bad)",  { XX } },
5507   },
5508
5509   /* PREFIX_VEX_3A69 */
5510   {
5511     { "(bad)",  { XX } },
5512     { "(bad)",  { XX } },
5513     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5514     { "(bad)",  { XX } },
5515   },
5516
5517   /* PREFIX_VEX_3A6A */
5518   {
5519     { "(bad)",  { XX } },
5520     { "(bad)",  { XX } },
5521     { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5522     { "(bad)",  { XX } },
5523   },
5524
5525   /* PREFIX_VEX_3A6B */
5526   {
5527     { "(bad)",  { XX } },
5528     { "(bad)",  { XX } },
5529     { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5530     { "(bad)",  { XX } },
5531   },
5532
5533   /* PREFIX_VEX_3A6C */
5534   {
5535     { "(bad)",  { XX } },
5536     { "(bad)",  { XX } },
5537     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5538     { "(bad)",  { XX } },
5539   },
5540
5541   /* PREFIX_VEX_3A6D */
5542   {
5543     { "(bad)",  { XX } },
5544     { "(bad)",  { XX } },
5545     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5546     { "(bad)",  { XX } },
5547   },
5548
5549   /* PREFIX_VEX_3A6E */
5550   {
5551     { "(bad)",  { XX } },
5552     { "(bad)",  { XX } },
5553     { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5554     { "(bad)",  { XX } },
5555   },
5556
5557   /* PREFIX_VEX_3A6F */
5558   {
5559     { "(bad)",  { XX } },
5560     { "(bad)",  { XX } },
5561     { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5562     { "(bad)",  { XX } },
5563   },
5564
5565   /* PREFIX_VEX_3A78 */
5566   {
5567     { "(bad)",  { XX } },
5568     { "(bad)",  { XX } },
5569     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5570     { "(bad)",  { XX } },
5571   },
5572
5573   /* PREFIX_VEX_3A79 */
5574   {
5575     { "(bad)",  { XX } },
5576     { "(bad)",  { XX } },
5577     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5578     { "(bad)",  { XX } },
5579   },
5580
5581   /* PREFIX_VEX_3A7A */
5582   {
5583     { "(bad)",  { XX } },
5584     { "(bad)",  { XX } },
5585     { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5586     { "(bad)",  { XX } },
5587   },
5588
5589   /* PREFIX_VEX_3A7B */
5590   {
5591     { "(bad)",  { XX } },
5592     { "(bad)",  { XX } },
5593     { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5594     { "(bad)",  { XX } },
5595   },
5596
5597   /* PREFIX_VEX_3A7C */
5598   {
5599     { "(bad)",  { XX } },
5600     { "(bad)",  { XX } },
5601     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5602     { "(bad)",  { XX } },
5603   },
5604
5605   /* PREFIX_VEX_3A7D */
5606   {
5607     { "(bad)",  { XX } },
5608     { "(bad)",  { XX } },
5609     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5610     { "(bad)",  { XX } },
5611   },
5612
5613   /* PREFIX_VEX_3A7E */
5614   {
5615     { "(bad)",  { XX } },
5616     { "(bad)",  { XX } },
5617     { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5618     { "(bad)",  { XX } },
5619   },
5620
5621   /* PREFIX_VEX_3A7F */
5622   {
5623     { "(bad)",  { XX } },
5624     { "(bad)",  { XX } },
5625     { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5626     { "(bad)",  { XX } },
5627   },
5628
5629   /* PREFIX_VEX_3ADF */
5630   {
5631     { "(bad)",  { XX } },
5632     { "(bad)",  { XX } },
5633     { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5634     { "(bad)",  { XX } },
5635   },
5636 };
5637
5638 static const struct dis386 x86_64_table[][2] = {
5639   /* X86_64_06 */
5640   {
5641     { "push{T|}", { es } },
5642     { "(bad)", { XX } },
5643   },
5644
5645   /* X86_64_07 */
5646   {
5647     { "pop{T|}", { es } },
5648     { "(bad)", { XX } },
5649   },
5650
5651   /* X86_64_0D */
5652   {
5653     { "push{T|}", { cs } },
5654     { "(bad)", { XX } },
5655   },
5656
5657   /* X86_64_16 */
5658   {
5659     { "push{T|}", { ss } },
5660     { "(bad)", { XX } },
5661   },
5662
5663   /* X86_64_17 */
5664   {
5665     { "pop{T|}", { ss } },
5666     { "(bad)", { XX } },
5667   },
5668
5669   /* X86_64_1E */
5670   {
5671     { "push{T|}", { ds } },
5672     { "(bad)", { XX } },
5673   },
5674
5675   /* X86_64_1F */
5676   {
5677     { "pop{T|}", { ds } },
5678     { "(bad)", { XX } },
5679   },
5680
5681   /* X86_64_27 */
5682   {
5683     { "daa", { XX } },
5684     { "(bad)", { XX } },
5685   },
5686
5687   /* X86_64_2F */
5688   {
5689     { "das", { XX } },
5690     { "(bad)", { XX } },
5691   },
5692
5693   /* X86_64_37 */
5694   {
5695     { "aaa", { XX } },
5696     { "(bad)", { XX } },
5697   },
5698
5699   /* X86_64_3F */
5700   {
5701     { "aas", { XX } },
5702     { "(bad)", { XX } },
5703   },
5704
5705   /* X86_64_60 */
5706   {
5707     { "pusha{P|}", { XX } },
5708     { "(bad)", { XX } },
5709   },
5710
5711   /* X86_64_61 */
5712   {
5713     { "popa{P|}", { XX } },
5714     { "(bad)", { XX } },
5715   },
5716
5717   /* X86_64_62 */
5718   {
5719     { MOD_TABLE (MOD_62_32BIT) },
5720     { "(bad)", { XX } },
5721   },
5722
5723   /* X86_64_63 */
5724   {
5725     { "arpl", { Ew, Gw } },
5726     { "movs{lq|xd}", { Gv, Ed } },
5727   },
5728
5729   /* X86_64_6D */
5730   {
5731     { "ins{R|}", { Yzr, indirDX } },
5732     { "ins{G|}", { Yzr, indirDX } },
5733   },
5734
5735   /* X86_64_6F */
5736   {
5737     { "outs{R|}", { indirDXr, Xz } },
5738     { "outs{G|}", { indirDXr, Xz } },
5739   },
5740
5741   /* X86_64_9A */
5742   {
5743     { "Jcall{T|}", { Ap } },
5744     { "(bad)", { XX } },
5745   },
5746
5747   /* X86_64_C4 */
5748   {
5749     { MOD_TABLE (MOD_C4_32BIT) },
5750     { VEX_C4_TABLE (VEX_0F) },
5751   },
5752
5753   /* X86_64_C5 */
5754   {
5755     { MOD_TABLE (MOD_C5_32BIT) },
5756     { VEX_C5_TABLE (VEX_0F) },
5757   },
5758
5759   /* X86_64_CE */
5760   {
5761     { "into", { XX } },
5762     { "(bad)", { XX } },
5763   },
5764
5765   /* X86_64_D4 */
5766   {
5767     { "aam", { sIb } },
5768     { "(bad)", { XX } },
5769   },
5770
5771   /* X86_64_D5 */
5772   {
5773     { "aad", { sIb } },
5774     { "(bad)", { XX } },
5775   },
5776
5777   /* X86_64_EA */
5778   {
5779     { "Jjmp{T|}", { Ap } },
5780     { "(bad)", { XX } },
5781   },
5782
5783   /* X86_64_0F01_REG_0 */
5784   {
5785     { "sgdt{Q|IQ}", { M } },
5786     { "sgdt", { M } },
5787   },
5788
5789   /* X86_64_0F01_REG_1 */
5790   {
5791     { "sidt{Q|IQ}", { M } },
5792     { "sidt", { M } },
5793   },
5794
5795   /* X86_64_0F01_REG_2 */
5796   {
5797     { "lgdt{Q|Q}", { M } },
5798     { "lgdt", { M } },
5799   },
5800
5801   /* X86_64_0F01_REG_3 */
5802   {
5803     { "lidt{Q|Q}", { M } },
5804     { "lidt", { M } },
5805   },
5806 };
5807
5808 static const struct dis386 three_byte_table[][256] = {
5809
5810   /* THREE_BYTE_0F38 */
5811   {
5812     /* 00 */
5813     { "pshufb",         { MX, EM } },
5814     { "phaddw",         { MX, EM } },
5815     { "phaddd",         { MX, EM } },
5816     { "phaddsw",        { MX, EM } },
5817     { "pmaddubsw",      { MX, EM } },
5818     { "phsubw",         { MX, EM } },
5819     { "phsubd",         { MX, EM } },
5820     { "phsubsw",        { MX, EM } },
5821     /* 08 */
5822     { "psignb",         { MX, EM } },
5823     { "psignw",         { MX, EM } },
5824     { "psignd",         { MX, EM } },
5825     { "pmulhrsw",       { MX, EM } },
5826     { "(bad)",          { XX } },
5827     { "(bad)",          { XX } },
5828     { "(bad)",          { XX } },
5829     { "(bad)",          { XX } },
5830     /* 10 */
5831     { PREFIX_TABLE (PREFIX_0F3810) },
5832     { "(bad)",          { XX } },
5833     { "(bad)",          { XX } },
5834     { "(bad)",          { XX } },
5835     { PREFIX_TABLE (PREFIX_0F3814) },
5836     { PREFIX_TABLE (PREFIX_0F3815) },
5837     { "(bad)",          { XX } },
5838     { PREFIX_TABLE (PREFIX_0F3817) },
5839     /* 18 */
5840     { "(bad)",          { XX } },
5841     { "(bad)",          { XX } },
5842     { "(bad)",          { XX } },
5843     { "(bad)",          { XX } },
5844     { "pabsb",          { MX, EM } },
5845     { "pabsw",          { MX, EM } },
5846     { "pabsd",          { MX, EM } },
5847     { "(bad)",          { XX } },
5848     /* 20 */
5849     { PREFIX_TABLE (PREFIX_0F3820) },
5850     { PREFIX_TABLE (PREFIX_0F3821) },
5851     { PREFIX_TABLE (PREFIX_0F3822) },
5852     { PREFIX_TABLE (PREFIX_0F3823) },
5853     { PREFIX_TABLE (PREFIX_0F3824) },
5854     { PREFIX_TABLE (PREFIX_0F3825) },
5855     { "(bad)",          { XX } },
5856     { "(bad)",          { XX } },
5857     /* 28 */
5858     { PREFIX_TABLE (PREFIX_0F3828) },
5859     { PREFIX_TABLE (PREFIX_0F3829) },
5860     { PREFIX_TABLE (PREFIX_0F382A) },
5861     { PREFIX_TABLE (PREFIX_0F382B) },
5862     { "(bad)",          { XX } },
5863     { "(bad)",          { XX } },
5864     { "(bad)",          { XX } },
5865     { "(bad)",          { XX } },
5866     /* 30 */
5867     { PREFIX_TABLE (PREFIX_0F3830) },
5868     { PREFIX_TABLE (PREFIX_0F3831) },
5869     { PREFIX_TABLE (PREFIX_0F3832) },
5870     { PREFIX_TABLE (PREFIX_0F3833) },
5871     { PREFIX_TABLE (PREFIX_0F3834) },
5872     { PREFIX_TABLE (PREFIX_0F3835) },
5873     { "(bad)",          { XX } },
5874     { PREFIX_TABLE (PREFIX_0F3837) },
5875     /* 38 */
5876     { PREFIX_TABLE (PREFIX_0F3838) },
5877     { PREFIX_TABLE (PREFIX_0F3839) },
5878     { PREFIX_TABLE (PREFIX_0F383A) },
5879     { PREFIX_TABLE (PREFIX_0F383B) },
5880     { PREFIX_TABLE (PREFIX_0F383C) },
5881     { PREFIX_TABLE (PREFIX_0F383D) },
5882     { PREFIX_TABLE (PREFIX_0F383E) },
5883     { PREFIX_TABLE (PREFIX_0F383F) },
5884     /* 40 */
5885     { PREFIX_TABLE (PREFIX_0F3840) },
5886     { PREFIX_TABLE (PREFIX_0F3841) },
5887     { "(bad)",          { XX } },
5888     { "(bad)",          { XX } },
5889     { "(bad)",          { XX } },
5890     { "(bad)",          { XX } },
5891     { "(bad)",          { XX } },
5892     { "(bad)",          { XX } },
5893     /* 48 */
5894     { "(bad)",          { XX } },
5895     { "(bad)",          { XX } },
5896     { "(bad)",          { XX } },
5897     { "(bad)",          { XX } },
5898     { "(bad)",          { XX } },
5899     { "(bad)",          { XX } },
5900     { "(bad)",          { XX } },
5901     { "(bad)",          { XX } },
5902     /* 50 */
5903     { "(bad)",          { XX } },
5904     { "(bad)",          { XX } },
5905     { "(bad)",          { XX } },
5906     { "(bad)",          { XX } },
5907     { "(bad)",          { XX } },
5908     { "(bad)",          { XX } },
5909     { "(bad)",          { XX } },
5910     { "(bad)",          { XX } },
5911     /* 58 */
5912     { "(bad)",          { XX } },
5913     { "(bad)",          { XX } },
5914     { "(bad)",          { XX } },
5915     { "(bad)",          { XX } },
5916     { "(bad)",          { XX } },
5917     { "(bad)",          { XX } },
5918     { "(bad)",          { XX } },
5919     { "(bad)",          { XX } },
5920     /* 60 */
5921     { "(bad)",          { XX } },
5922     { "(bad)",          { XX } },
5923     { "(bad)",          { XX } },
5924     { "(bad)",          { XX } },
5925     { "(bad)",          { XX } },
5926     { "(bad)",          { XX } },
5927     { "(bad)",          { XX } },
5928     { "(bad)",          { XX } },
5929     /* 68 */
5930     { "(bad)",          { XX } },
5931     { "(bad)",          { XX } },
5932     { "(bad)",          { XX } },
5933     { "(bad)",          { XX } },
5934     { "(bad)",          { XX } },
5935     { "(bad)",          { XX } },
5936     { "(bad)",          { XX } },
5937     { "(bad)",          { XX } },
5938     /* 70 */
5939     { "(bad)",          { XX } },
5940     { "(bad)",          { XX } },
5941     { "(bad)",          { XX } },
5942     { "(bad)",          { XX } },
5943     { "(bad)",          { XX } },
5944     { "(bad)",          { XX } },
5945     { "(bad)",          { XX } },
5946     { "(bad)",          { XX } },
5947     /* 78 */
5948     { "(bad)",          { XX } },
5949     { "(bad)",          { XX } },
5950     { "(bad)",          { XX } },
5951     { "(bad)",          { XX } },
5952     { "(bad)",          { XX } },
5953     { "(bad)",          { XX } },
5954     { "(bad)",          { XX } },
5955     { "(bad)",          { XX } },
5956     /* 80 */
5957     { PREFIX_TABLE (PREFIX_0F3880) },
5958     { PREFIX_TABLE (PREFIX_0F3881) },
5959     { "(bad)",          { XX } },
5960     { "(bad)",          { XX } },
5961     { "(bad)",          { XX } },
5962     { "(bad)",          { XX } },
5963     { "(bad)",          { XX } },
5964     { "(bad)",          { XX } },
5965     /* 88 */
5966     { "(bad)",          { XX } },
5967     { "(bad)",          { XX } },
5968     { "(bad)",          { XX } },
5969     { "(bad)",          { XX } },
5970     { "(bad)",          { XX } },
5971     { "(bad)",          { XX } },
5972     { "(bad)",          { XX } },
5973     { "(bad)",          { XX } },
5974     /* 90 */
5975     { "(bad)",          { XX } },
5976     { "(bad)",          { XX } },
5977     { "(bad)",          { XX } },
5978     { "(bad)",          { XX } },
5979     { "(bad)",          { XX } },
5980     { "(bad)",          { XX } },
5981     { "(bad)",          { XX } },
5982     { "(bad)",          { XX } },
5983     /* 98 */
5984     { "(bad)",          { XX } },
5985     { "(bad)",          { XX } },
5986     { "(bad)",          { XX } },
5987     { "(bad)",          { XX } },
5988     { "(bad)",          { XX } },
5989     { "(bad)",          { XX } },
5990     { "(bad)",          { XX } },
5991     { "(bad)",          { XX } },
5992     /* a0 */
5993     { "(bad)",          { XX } },
5994     { "(bad)",          { XX } },
5995     { "(bad)",          { XX } },
5996     { "(bad)",          { XX } },
5997     { "(bad)",          { XX } },
5998     { "(bad)",          { XX } },
5999     { "(bad)",          { XX } },
6000     { "(bad)",          { XX } },
6001     /* a8 */
6002     { "(bad)",          { XX } },
6003     { "(bad)",          { XX } },
6004     { "(bad)",          { XX } },
6005     { "(bad)",          { XX } },
6006     { "(bad)",          { XX } },
6007     { "(bad)",          { XX } },
6008     { "(bad)",          { XX } },
6009     { "(bad)",          { XX } },
6010     /* b0 */
6011     { "(bad)",          { XX } },
6012     { "(bad)",          { XX } },
6013     { "(bad)",          { XX } },
6014     { "(bad)",          { XX } },
6015     { "(bad)",          { XX } },
6016     { "(bad)",          { XX } },
6017     { "(bad)",          { XX } },
6018     { "(bad)",          { XX } },
6019     /* b8 */
6020     { "(bad)",          { XX } },
6021     { "(bad)",          { XX } },
6022     { "(bad)",          { XX } },
6023     { "(bad)",          { XX } },
6024     { "(bad)",          { XX } },
6025     { "(bad)",          { XX } },
6026     { "(bad)",          { XX } },
6027     { "(bad)",          { XX } },
6028     /* c0 */
6029     { "(bad)",          { XX } },
6030     { "(bad)",          { XX } },
6031     { "(bad)",          { XX } },
6032     { "(bad)",          { XX } },
6033     { "(bad)",          { XX } },
6034     { "(bad)",          { XX } },
6035     { "(bad)",          { XX } },
6036     { "(bad)",          { XX } },
6037     /* c8 */
6038     { "(bad)",          { XX } },
6039     { "(bad)",          { XX } },
6040     { "(bad)",          { XX } },
6041     { "(bad)",          { XX } },
6042     { "(bad)",          { XX } },
6043     { "(bad)",          { XX } },
6044     { "(bad)",          { XX } },
6045     { "(bad)",          { XX } },
6046     /* d0 */
6047     { "(bad)",          { XX } },
6048     { "(bad)",          { XX } },
6049     { "(bad)",          { XX } },
6050     { "(bad)",          { XX } },
6051     { "(bad)",          { XX } },
6052     { "(bad)",          { XX } },
6053     { "(bad)",          { XX } },
6054     { "(bad)",          { XX } },
6055     /* d8 */
6056     { "(bad)",          { XX } },
6057     { "(bad)",          { XX } },
6058     { "(bad)",          { XX } },
6059     { PREFIX_TABLE (PREFIX_0F38DB) },
6060     { PREFIX_TABLE (PREFIX_0F38DC) },
6061     { PREFIX_TABLE (PREFIX_0F38DD) },
6062     { PREFIX_TABLE (PREFIX_0F38DE) },
6063     { PREFIX_TABLE (PREFIX_0F38DF) },
6064     /* e0 */
6065     { "(bad)",          { XX } },
6066     { "(bad)",          { XX } },
6067     { "(bad)",          { XX } },
6068     { "(bad)",          { XX } },
6069     { "(bad)",          { XX } },
6070     { "(bad)",          { XX } },
6071     { "(bad)",          { XX } },
6072     { "(bad)",          { XX } },
6073     /* e8 */
6074     { "(bad)",          { XX } },
6075     { "(bad)",          { XX } },
6076     { "(bad)",          { XX } },
6077     { "(bad)",          { XX } },
6078     { "(bad)",          { XX } },
6079     { "(bad)",          { XX } },
6080     { "(bad)",          { XX } },
6081     { "(bad)",          { XX } },
6082     /* f0 */
6083     { PREFIX_TABLE (PREFIX_0F38F0) },
6084     { PREFIX_TABLE (PREFIX_0F38F1) },
6085     { "(bad)",          { XX } },
6086     { "(bad)",          { XX } },
6087     { "(bad)",          { XX } },
6088     { "(bad)",          { XX } },
6089     { "(bad)",          { XX } },
6090     { "(bad)",          { XX } },
6091     /* f8 */
6092     { "(bad)",          { XX } },
6093     { "(bad)",          { XX } },
6094     { "(bad)",          { XX } },
6095     { "(bad)",          { XX } },
6096     { "(bad)",          { XX } },
6097     { "(bad)",          { XX } },
6098     { "(bad)",          { XX } },
6099     { "(bad)",          { XX } },
6100   },
6101   /* THREE_BYTE_0F3A */
6102   {
6103     /* 00 */
6104     { "(bad)",          { XX } },
6105     { "(bad)",          { XX } },
6106     { "(bad)",          { XX } },
6107     { "(bad)",          { XX } },
6108     { "(bad)",          { XX } },
6109     { "(bad)",          { XX } },
6110     { "(bad)",          { XX } },
6111     { "(bad)",          { XX } },
6112     /* 08 */
6113     { PREFIX_TABLE (PREFIX_0F3A08) },
6114     { PREFIX_TABLE (PREFIX_0F3A09) },
6115     { PREFIX_TABLE (PREFIX_0F3A0A) },
6116     { PREFIX_TABLE (PREFIX_0F3A0B) },
6117     { PREFIX_TABLE (PREFIX_0F3A0C) },
6118     { PREFIX_TABLE (PREFIX_0F3A0D) },
6119     { PREFIX_TABLE (PREFIX_0F3A0E) },
6120     { "palignr",        { MX, EM, Ib } },
6121     /* 10 */
6122     { "(bad)",          { XX } },
6123     { "(bad)",          { XX } },
6124     { "(bad)",          { XX } },
6125     { "(bad)",          { XX } },
6126     { PREFIX_TABLE (PREFIX_0F3A14) },
6127     { PREFIX_TABLE (PREFIX_0F3A15) },
6128     { PREFIX_TABLE (PREFIX_0F3A16) },
6129     { PREFIX_TABLE (PREFIX_0F3A17) },
6130     /* 18 */
6131     { "(bad)",          { XX } },
6132     { "(bad)",          { XX } },
6133     { "(bad)",          { XX } },
6134     { "(bad)",          { XX } },
6135     { "(bad)",          { XX } },
6136     { "(bad)",          { XX } },
6137     { "(bad)",          { XX } },
6138     { "(bad)",          { XX } },
6139     /* 20 */
6140     { PREFIX_TABLE (PREFIX_0F3A20) },
6141     { PREFIX_TABLE (PREFIX_0F3A21) },
6142     { PREFIX_TABLE (PREFIX_0F3A22) },
6143     { "(bad)",          { XX } },
6144     { "(bad)",          { XX } },
6145     { "(bad)",          { XX } },
6146     { "(bad)",          { XX } },
6147     { "(bad)",          { XX } },
6148     /* 28 */
6149     { "(bad)",          { XX } },
6150     { "(bad)",          { XX } },
6151     { "(bad)",          { XX } },
6152     { "(bad)",          { XX } },
6153     { "(bad)",          { XX } },
6154     { "(bad)",          { XX } },
6155     { "(bad)",          { XX } },
6156     { "(bad)",          { XX } },
6157     /* 30 */
6158     { "(bad)",          { XX } },
6159     { "(bad)",          { XX } },
6160     { "(bad)",          { XX } },
6161     { "(bad)",          { XX } },
6162     { "(bad)",          { XX } },
6163     { "(bad)",          { XX } },
6164     { "(bad)",          { XX } },
6165     { "(bad)",          { XX } },
6166     /* 38 */
6167     { "(bad)",          { XX } },
6168     { "(bad)",          { XX } },
6169     { "(bad)",          { XX } },
6170     { "(bad)",          { XX } },
6171     { "(bad)",          { XX } },
6172     { "(bad)",          { XX } },
6173     { "(bad)",          { XX } },
6174     { "(bad)",          { XX } },
6175     /* 40 */
6176     { PREFIX_TABLE (PREFIX_0F3A40) },
6177     { PREFIX_TABLE (PREFIX_0F3A41) },
6178     { PREFIX_TABLE (PREFIX_0F3A42) },
6179     { "(bad)",          { XX } },
6180     { PREFIX_TABLE (PREFIX_0F3A44) },
6181     { "(bad)",          { XX } },
6182     { "(bad)",          { XX } },
6183     { "(bad)",          { XX } },
6184     /* 48 */
6185     { "(bad)",          { XX } },
6186     { "(bad)",          { XX } },
6187     { "(bad)",          { XX } },
6188     { "(bad)",          { XX } },
6189     { "(bad)",          { XX } },
6190     { "(bad)",          { XX } },
6191     { "(bad)",          { XX } },
6192     { "(bad)",          { XX } },
6193     /* 50 */
6194     { "(bad)",          { XX } },
6195     { "(bad)",          { XX } },
6196     { "(bad)",          { XX } },
6197     { "(bad)",          { XX } },
6198     { "(bad)",          { XX } },
6199     { "(bad)",          { XX } },
6200     { "(bad)",          { XX } },
6201     { "(bad)",          { XX } },
6202     /* 58 */
6203     { "(bad)",          { XX } },
6204     { "(bad)",          { XX } },
6205     { "(bad)",          { XX } },
6206     { "(bad)",          { XX } },
6207     { "(bad)",          { XX } },
6208     { "(bad)",          { XX } },
6209     { "(bad)",          { XX } },
6210     { "(bad)",          { XX } },
6211     /* 60 */
6212     { PREFIX_TABLE (PREFIX_0F3A60) },
6213     { PREFIX_TABLE (PREFIX_0F3A61) },
6214     { PREFIX_TABLE (PREFIX_0F3A62) },
6215     { PREFIX_TABLE (PREFIX_0F3A63) },
6216     { "(bad)",          { XX } },
6217     { "(bad)",          { XX } },
6218     { "(bad)",          { XX } },
6219     { "(bad)",          { XX } },
6220     /* 68 */
6221     { "(bad)",          { XX } },
6222     { "(bad)",          { XX } },
6223     { "(bad)",          { XX } },
6224     { "(bad)",          { XX } },
6225     { "(bad)",          { XX } },
6226     { "(bad)",          { XX } },
6227     { "(bad)",          { XX } },
6228     { "(bad)",          { XX } },
6229     /* 70 */
6230     { "(bad)",          { XX } },
6231     { "(bad)",          { XX } },
6232     { "(bad)",          { XX } },
6233     { "(bad)",          { XX } },
6234     { "(bad)",          { XX } },
6235     { "(bad)",          { XX } },
6236     { "(bad)",          { XX } },
6237     { "(bad)",          { XX } },
6238     /* 78 */
6239     { "(bad)",          { XX } },
6240     { "(bad)",          { XX } },
6241     { "(bad)",          { XX } },
6242     { "(bad)",          { XX } },
6243     { "(bad)",          { XX } },
6244     { "(bad)",          { XX } },
6245     { "(bad)",          { XX } },
6246     { "(bad)",          { XX } },
6247     /* 80 */
6248     { "(bad)",          { XX } },
6249     { "(bad)",          { XX } },
6250     { "(bad)",          { XX } },
6251     { "(bad)",          { XX } },
6252     { "(bad)",          { XX } },
6253     { "(bad)",          { XX } },
6254     { "(bad)",          { XX } },
6255     { "(bad)",          { XX } },
6256     /* 88 */
6257     { "(bad)",          { XX } },
6258     { "(bad)",          { XX } },
6259     { "(bad)",          { XX } },
6260     { "(bad)",          { XX } },
6261     { "(bad)",          { XX } },
6262     { "(bad)",          { XX } },
6263     { "(bad)",          { XX } },
6264     { "(bad)",          { XX } },
6265     /* 90 */
6266     { "(bad)",          { XX } },
6267     { "(bad)",          { XX } },
6268     { "(bad)",          { XX } },
6269     { "(bad)",          { XX } },
6270     { "(bad)",          { XX } },
6271     { "(bad)",          { XX } },
6272     { "(bad)",          { XX } },
6273     { "(bad)",          { XX } },
6274     /* 98 */
6275     { "(bad)",          { XX } },
6276     { "(bad)",          { XX } },
6277     { "(bad)",          { XX } },
6278     { "(bad)",          { XX } },
6279     { "(bad)",          { XX } },
6280     { "(bad)",          { XX } },
6281     { "(bad)",          { XX } },
6282     { "(bad)",          { XX } },
6283     /* a0 */
6284     { "(bad)",          { XX } },
6285     { "(bad)",          { XX } },
6286     { "(bad)",          { XX } },
6287     { "(bad)",          { XX } },
6288     { "(bad)",          { XX } },
6289     { "(bad)",          { XX } },
6290     { "(bad)",          { XX } },
6291     { "(bad)",          { XX } },
6292     /* a8 */
6293     { "(bad)",          { XX } },
6294     { "(bad)",          { XX } },
6295     { "(bad)",          { XX } },
6296     { "(bad)",          { XX } },
6297     { "(bad)",          { XX } },
6298     { "(bad)",          { XX } },
6299     { "(bad)",          { XX } },
6300     { "(bad)",          { XX } },
6301     /* b0 */
6302     { "(bad)",          { XX } },
6303     { "(bad)",          { XX } },
6304     { "(bad)",          { XX } },
6305     { "(bad)",          { XX } },
6306     { "(bad)",          { XX } },
6307     { "(bad)",          { XX } },
6308     { "(bad)",          { XX } },
6309     { "(bad)",          { XX } },
6310     /* b8 */
6311     { "(bad)",          { XX } },
6312     { "(bad)",          { XX } },
6313     { "(bad)",          { XX } },
6314     { "(bad)",          { XX } },
6315     { "(bad)",          { XX } },
6316     { "(bad)",          { XX } },
6317     { "(bad)",          { XX } },
6318     { "(bad)",          { XX } },
6319     /* c0 */
6320     { "(bad)",          { XX } },
6321     { "(bad)",          { XX } },
6322     { "(bad)",          { XX } },
6323     { "(bad)",          { XX } },
6324     { "(bad)",          { XX } },
6325     { "(bad)",          { XX } },
6326     { "(bad)",          { XX } },
6327     { "(bad)",          { XX } },
6328     /* c8 */
6329     { "(bad)",          { XX } },
6330     { "(bad)",          { XX } },
6331     { "(bad)",          { XX } },
6332     { "(bad)",          { XX } },
6333     { "(bad)",          { XX } },
6334     { "(bad)",          { XX } },
6335     { "(bad)",          { XX } },
6336     { "(bad)",          { XX } },
6337     /* d0 */
6338     { "(bad)",          { XX } },
6339     { "(bad)",          { XX } },
6340     { "(bad)",          { XX } },
6341     { "(bad)",          { XX } },
6342     { "(bad)",          { XX } },
6343     { "(bad)",          { XX } },
6344     { "(bad)",          { XX } },
6345     { "(bad)",          { XX } },
6346     /* d8 */
6347     { "(bad)",          { XX } },
6348     { "(bad)",          { XX } },
6349     { "(bad)",          { XX } },
6350     { "(bad)",          { XX } },
6351     { "(bad)",          { XX } },
6352     { "(bad)",          { XX } },
6353     { "(bad)",          { XX } },
6354     { PREFIX_TABLE (PREFIX_0F3ADF) },
6355     /* e0 */
6356     { "(bad)",          { XX } },
6357     { "(bad)",          { XX } },
6358     { "(bad)",          { XX } },
6359     { "(bad)",          { XX } },
6360     { "(bad)",          { XX } },
6361     { "(bad)",          { XX } },
6362     { "(bad)",          { XX } },
6363     { "(bad)",          { XX } },
6364     /* e8 */
6365     { "(bad)",          { XX } },
6366     { "(bad)",          { XX } },
6367     { "(bad)",          { XX } },
6368     { "(bad)",          { XX } },
6369     { "(bad)",          { XX } },
6370     { "(bad)",          { XX } },
6371     { "(bad)",          { XX } },
6372     { "(bad)",          { XX } },
6373     /* f0 */
6374     { "(bad)",          { XX } },
6375     { "(bad)",          { XX } },
6376     { "(bad)",          { XX } },
6377     { "(bad)",          { XX } },
6378     { "(bad)",          { XX } },
6379     { "(bad)",          { XX } },
6380     { "(bad)",          { XX } },
6381     { "(bad)",          { XX } },
6382     /* f8 */
6383     { "(bad)",          { XX } },
6384     { "(bad)",          { XX } },
6385     { "(bad)",          { XX } },
6386     { "(bad)",          { XX } },
6387     { "(bad)",          { XX } },
6388     { "(bad)",          { XX } },
6389     { "(bad)",          { XX } },
6390     { "(bad)",          { XX } },
6391   },
6392
6393   /* THREE_BYTE_0F7A */
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     { "ptest",          { 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     { "phaddbw",        { XM, EXq } },
6470     { "phaddbd",        { XM, EXq } },
6471     { "phaddbq",        { XM, EXq } },
6472     { "(bad)",          { XX } },
6473     { "(bad)",          { XX } },
6474     { "phaddwd",        { XM, EXq } },
6475     { "phaddwq",        { XM, EXq } },
6476     /* 48 */
6477     { "(bad)",          { XX } },
6478     { "(bad)",          { XX } },
6479     { "(bad)",          { XX } },
6480     { "phadddq",        { XM, EXq } },
6481     { "(bad)",          { XX } },
6482     { "(bad)",          { XX } },
6483     { "(bad)",          { XX } },
6484     { "(bad)",          { XX } },
6485     /* 50 */
6486     { "(bad)",          { XX } },
6487     { "phaddubw",       { XM, EXq } },
6488     { "phaddubd",       { XM, EXq } },
6489     { "phaddubq",       { XM, EXq } },
6490     { "(bad)",          { XX } },
6491     { "(bad)",          { XX } },
6492     { "phadduwd",       { XM, EXq } },
6493     { "phadduwq",       { XM, EXq } },
6494     /* 58 */
6495     { "(bad)",          { XX } },
6496     { "(bad)",          { XX } },
6497     { "(bad)",          { XX } },
6498     { "phaddudq",       { XM, EXq } },
6499     { "(bad)",          { XX } },
6500     { "(bad)",          { XX } },
6501     { "(bad)",          { XX } },
6502     { "(bad)",          { XX } },
6503     /* 60 */
6504     { "(bad)",          { XX } },
6505     { "phsubbw",        { XM, EXq } },
6506     { "phsubbd",        { XM, EXq } },
6507     { "phsubbq",        { XM, EXq } },
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     { "(bad)",          { XX } },
6546     { "(bad)",          { XX } },
6547     { "(bad)",          { XX } },
6548     /* 88 */
6549     { "(bad)",          { XX } },
6550     { "(bad)",          { XX } },
6551     { "(bad)",          { XX } },
6552     { "(bad)",          { XX } },
6553     { "(bad)",          { XX } },
6554     { "(bad)",          { XX } },
6555     { "(bad)",          { XX } },
6556     { "(bad)",          { XX } },
6557     /* 90 */
6558     { "(bad)",          { XX } },
6559     { "(bad)",          { XX } },
6560     { "(bad)",          { XX } },
6561     { "(bad)",          { XX } },
6562     { "(bad)",          { XX } },
6563     { "(bad)",          { XX } },
6564     { "(bad)",          { XX } },
6565     { "(bad)",          { XX } },
6566     /* 98 */
6567     { "(bad)",          { XX } },
6568     { "(bad)",          { XX } },
6569     { "(bad)",          { XX } },
6570     { "(bad)",          { XX } },
6571     { "(bad)",          { XX } },
6572     { "(bad)",          { XX } },
6573     { "(bad)",          { XX } },
6574     { "(bad)",          { XX } },
6575     /* a0 */
6576     { "(bad)",          { XX } },
6577     { "(bad)",          { XX } },
6578     { "(bad)",          { XX } },
6579     { "(bad)",          { XX } },
6580     { "(bad)",          { XX } },
6581     { "(bad)",          { XX } },
6582     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
6613     { "(bad)",          { XX } },
6614     { "(bad)",          { XX } },
6615     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
6626     { "(bad)",          { XX } },
6627     { "(bad)",          { XX } },
6628     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
6662     { "(bad)",          { XX } },
6663     { "(bad)",          { XX } },
6664     { "(bad)",          { XX } },
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 };
6685
6686 static const struct dis386 xop_table[][256] = {
6687   /* XOP_08 */
6688   {
6689     /* 00 */
6690     { "(bad)",          { XX } },
6691     { "(bad)",          { XX } },
6692     { "(bad)",          { XX } },
6693     { "(bad)",          { XX } },
6694     { "(bad)",          { XX } },
6695     { "(bad)",          { XX } },
6696     { "(bad)",          { XX } },
6697     { "(bad)",          { XX } },
6698     /* 08 */
6699     { "(bad)",          { XX } },
6700     { "(bad)",          { XX } },
6701     { "(bad)",          { XX } },
6702     { "(bad)",          { XX } },
6703     { "(bad)",          { XX } },
6704     { "(bad)",          { XX } },
6705     { "(bad)",          { XX } },
6706     { "(bad)",          { XX } },
6707     /* 10 */
6708     { "(bad)",          { XX } },
6709     { "(bad)",          { XX } },
6710     { "(bad)",          { XX } },
6711     { "(bad)",          { XX } },
6712     { "(bad)",          { XX } },
6713     { "(bad)",          { XX } },
6714     { "(bad)",          { XX } },
6715     { "(bad)",          { XX } },
6716     /* 18 */
6717     { "(bad)",          { XX } },
6718     { "(bad)",          { XX } },
6719     { "(bad)",          { XX } },
6720     { "(bad)",          { XX } },
6721     { "(bad)",          { XX } },
6722     { "(bad)",          { XX } },
6723     { "(bad)",          { XX } },
6724     { "(bad)",          { XX } },
6725     /* 20 */
6726     { "(bad)",          { XX } },
6727     { "(bad)",          { XX } },
6728     { "(bad)",          { XX } },
6729     { "(bad)",          { XX } },
6730     { "(bad)",          { XX } },
6731     { "(bad)",          { XX } },
6732     { "(bad)",          { XX } },
6733     { "(bad)",          { XX } },
6734     /* 28 */
6735     { "(bad)",          { XX } },
6736     { "(bad)",          { XX } },
6737     { "(bad)",          { XX } },
6738     { "(bad)",          { XX } },
6739     { "(bad)",          { XX } },
6740     { "(bad)",          { XX } },
6741     { "(bad)",          { XX } },
6742     { "(bad)",          { XX } },
6743     /* 30 */
6744     { "(bad)",          { XX } },
6745     { "(bad)",          { XX } },
6746     { "(bad)",          { XX } },
6747     { "(bad)",          { XX } },
6748     { "(bad)",          { XX } },
6749     { "(bad)",          { XX } },
6750     { "(bad)",          { XX } },
6751     { "(bad)",          { XX } },
6752     /* 38 */
6753     { "(bad)",          { XX } },
6754     { "(bad)",          { XX } },
6755     { "(bad)",          { XX } },
6756     { "(bad)",          { XX } },
6757     { "(bad)",          { XX } },
6758     { "(bad)",          { XX } },
6759     { "(bad)",          { XX } },
6760     { "(bad)",          { XX } },
6761     /* 40 */
6762     { "(bad)",          { XX } },
6763     { "(bad)",          { XX } },
6764     { "(bad)",          { XX } },
6765     { "(bad)",          { XX } },
6766     { "(bad)",          { XX } },
6767     { "(bad)",          { XX } },
6768     { "(bad)",          { XX } },
6769     { "(bad)",          { XX } },
6770     /* 48 */
6771     { "(bad)",          { XX } },
6772     { "(bad)",          { XX } },
6773     { "(bad)",          { XX } },
6774     { "(bad)",          { XX } },
6775     { "(bad)",          { XX } },
6776     { "(bad)",          { XX } },
6777     { "(bad)",          { XX } },
6778     { "(bad)",          { XX } },
6779     /* 50 */
6780     { "(bad)",          { XX } },
6781     { "(bad)",          { XX } },
6782     { "(bad)",          { XX } },
6783     { "(bad)",          { XX } },
6784     { "(bad)",          { XX } },
6785     { "(bad)",          { XX } },
6786     { "(bad)",          { XX } },
6787     { "(bad)",          { XX } },
6788     /* 58 */
6789     { "(bad)",          { XX } },
6790     { "(bad)",          { XX } },
6791     { "(bad)",          { XX } },
6792     { "(bad)",          { XX } },
6793     { "(bad)",          { XX } },
6794     { "(bad)",          { XX } },
6795     { "(bad)",          { XX } },
6796     { "(bad)",          { XX } },
6797     /* 60 */
6798     { "(bad)",          { XX } },
6799     { "(bad)",          { XX } },
6800     { "(bad)",          { XX } },
6801     { "(bad)",          { XX } },
6802     { "(bad)",          { XX } },
6803     { "(bad)",          { XX } },
6804     { "(bad)",          { XX } },
6805     { "(bad)",          { XX } },
6806     /* 68 */
6807     { "(bad)",          { XX } },
6808     { "(bad)",          { XX } },
6809     { "(bad)",          { XX } },
6810     { "(bad)",          { XX } },
6811     { "(bad)",          { XX } },
6812     { "(bad)",          { XX } },
6813     { "(bad)",          { XX } },
6814     { "(bad)",          { XX } },
6815     /* 70 */
6816     { "(bad)",          { XX } },
6817     { "(bad)",          { XX } },
6818     { "(bad)",          { XX } },
6819     { "(bad)",          { XX } },
6820     { "(bad)",          { XX } },
6821     { "(bad)",          { XX } },
6822     { "(bad)",          { XX } },
6823     { "(bad)",          { XX } },
6824     /* 78 */
6825     { "(bad)",          { XX } },
6826     { "(bad)",          { XX } },
6827     { "(bad)",          { XX } },
6828     { "(bad)",          { XX } },
6829     { "(bad)",          { XX } },
6830     { "(bad)",          { XX } },
6831     { "(bad)",          { XX } },
6832     { "(bad)",          { XX } },
6833     /* 80 */
6834     { "(bad)",          { XX } },
6835     { "(bad)",          { XX } },
6836     { "(bad)",          { XX } },
6837     { "(bad)",          { XX } },
6838     { "(bad)",          { XX } },
6839     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6840     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6841     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6842     /* 88 */
6843     { "(bad)",          { XX } },
6844     { "(bad)",          { XX } },
6845     { "(bad)",          { XX } },
6846     { "(bad)",          { XX } },
6847     { "(bad)",          { XX } },
6848     { "(bad)",          { XX } },
6849     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6850     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6851     /* 90 */
6852     { "(bad)",          { XX } },
6853     { "(bad)",          { XX } },
6854     { "(bad)",          { XX } },
6855     { "(bad)",          { XX } },
6856     { "(bad)",          { XX } },
6857     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6858     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6859     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6860     /* 98 */
6861     { "(bad)",          { XX } },
6862     { "(bad)",          { XX } },
6863     { "(bad)",          { XX } },
6864     { "(bad)",          { XX } },
6865     { "(bad)",          { XX } },
6866     { "(bad)",          { XX } },
6867     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6868     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6869     /* a0 */
6870     { "(bad)",          { XX } },
6871     { "(bad)",          { XX } },
6872     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6873     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6874     { "(bad)",          { XX } },
6875     { "(bad)",          { XX } },
6876     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6877     { "(bad)",          { XX } },
6878     /* a8 */
6879     { "(bad)",          { XX } },
6880     { "(bad)",          { XX } },
6881     { "(bad)",          { XX } },
6882     { "(bad)",          { XX } },
6883     { "(bad)",          { XX } },
6884     { "(bad)",          { XX } },
6885     { "(bad)",          { XX } },
6886     { "(bad)",          { XX } },
6887     /* b0 */
6888     { "(bad)",          { XX } },
6889     { "(bad)",          { XX } },
6890     { "(bad)",          { XX } },
6891     { "(bad)",          { XX } },
6892     { "(bad)",          { XX } },
6893     { "(bad)",          { XX } },
6894     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6895     { "(bad)",          { XX } },
6896     /* b8 */
6897     { "(bad)",          { XX } },
6898     { "(bad)",          { XX } },
6899     { "(bad)",          { XX } },
6900     { "(bad)",          { XX } },
6901     { "(bad)",          { XX } },
6902     { "(bad)",          { XX } },
6903     { "(bad)",          { XX } },
6904     { "(bad)",          { XX } },
6905     /* c0 */
6906     { "vprotb",         { XM, Vex_2src_1, Ib } },
6907     { "vprotw",         { XM, Vex_2src_1, Ib } },
6908     { "vprotd",         { XM, Vex_2src_1, Ib } },
6909     { "vprotq",         { XM, Vex_2src_1, Ib } },
6910     { "(bad)",          { XX } },
6911     { "(bad)",          { XX } },
6912     { "(bad)",          { XX } },
6913     { "(bad)",          { XX } },
6914     /* c8 */
6915     { "(bad)",          { XX } },
6916     { "(bad)",          { XX } },
6917     { "(bad)",          { XX } },
6918     { "(bad)",          { XX } },
6919     { "vpcomb",         { XM, Vex128, EXx, Ib } },
6920     { "vpcomw",         { XM, Vex128, EXx, Ib } },
6921     { "vpcomd",         { XM, Vex128, EXx, Ib } },
6922     { "vpcomq",         { XM, Vex128, EXx, Ib } },
6923     /* d0 */
6924     { "(bad)",          { XX } },
6925     { "(bad)",          { XX } },
6926     { "(bad)",          { XX } },
6927     { "(bad)",          { XX } },
6928     { "(bad)",          { XX } },
6929     { "(bad)",          { XX } },
6930     { "(bad)",          { XX } },
6931     { "(bad)",          { XX } },
6932     /* d8 */
6933     { "(bad)",          { XX } },
6934     { "(bad)",          { XX } },
6935     { "(bad)",          { XX } },
6936     { "(bad)",          { XX } },
6937     { "(bad)",          { XX } },
6938     { "(bad)",          { XX } },
6939     { "(bad)",          { XX } },
6940     { "(bad)",          { XX } },
6941     /* e0 */
6942     { "(bad)",          { XX } },
6943     { "(bad)",          { XX } },
6944     { "(bad)",          { XX } },
6945     { "(bad)",          { XX } },
6946     { "(bad)",          { XX } },
6947     { "(bad)",          { XX } },
6948     { "(bad)",          { XX } },
6949     { "(bad)",          { XX } },
6950     /* e8 */
6951     { "(bad)",          { XX } },
6952     { "(bad)",          { XX } },
6953     { "(bad)",          { XX } },
6954     { "(bad)",          { XX } },
6955     { "vpcomub",        { XM, Vex128, EXx, Ib } },
6956     { "vpcomuw",        { XM, Vex128, EXx, Ib } },
6957     { "vpcomud",        { XM, Vex128, EXx, Ib } },
6958     { "vpcomuq",        { XM, Vex128, EXx, Ib } },
6959     /* f0 */
6960     { "(bad)",          { XX } },
6961     { "(bad)",          { XX } },
6962     { "(bad)",          { XX } },
6963     { "(bad)",          { XX } },
6964     { "(bad)",          { XX } },
6965     { "(bad)",          { XX } },
6966     { "(bad)",          { XX } },
6967     { "(bad)",          { XX } },
6968     /* f8 */
6969     { "(bad)",          { XX } },
6970     { "(bad)",          { XX } },
6971     { "(bad)",          { XX } },
6972     { "(bad)",          { XX } },
6973     { "(bad)",          { XX } },
6974     { "(bad)",          { XX } },
6975     { "(bad)",          { XX } },
6976     { "(bad)",          { XX } },
6977   },
6978   /* XOP_09 */
6979   {
6980     /* 00 */
6981     { "(bad)",          { XX } },
6982     { "(bad)",          { XX } },
6983     { "(bad)",          { XX } },
6984     { "(bad)",          { XX } },
6985     { "(bad)",          { XX } },
6986     { "(bad)",          { XX } },
6987     { "(bad)",          { XX } },
6988     { "(bad)",          { XX } },
6989     /* 08 */
6990     { "(bad)",          { XX } },
6991     { "(bad)",          { XX } },
6992     { "(bad)",          { XX } },
6993     { "(bad)",          { XX } },
6994     { "(bad)",          { XX } },
6995     { "(bad)",          { XX } },
6996     { "(bad)",          { XX } },
6997     { "(bad)",          { XX } },
6998     /* 10 */
6999     { "(bad)",          { XX } },
7000     { "(bad)",          { XX } },
7001     { REG_TABLE (REG_XOP_LWPCB) },
7002     { "(bad)",          { XX } },
7003     { "(bad)",          { XX } },
7004     { "(bad)",          { XX } },
7005     { "(bad)",          { XX } },
7006     { "(bad)",          { XX } },
7007     /* 18 */
7008     { "(bad)",          { XX } },
7009     { "(bad)",          { XX } },
7010     { "(bad)",          { XX } },
7011     { "(bad)",          { XX } },
7012     { "(bad)",          { XX } },
7013     { "(bad)",          { XX } },
7014     { "(bad)",          { XX } },
7015     { "(bad)",          { XX } },
7016     /* 20 */
7017     { "(bad)",          { XX } },
7018     { "(bad)",          { XX } },
7019     { "(bad)",          { XX } },
7020     { "(bad)",          { XX } },
7021     { "(bad)",          { XX } },
7022     { "(bad)",          { XX } },
7023     { "(bad)",          { XX } },
7024     { "(bad)",          { XX } },
7025     /* 28 */
7026     { "(bad)",          { XX } },
7027     { "(bad)",          { XX } },
7028     { "(bad)",          { XX } },
7029     { "(bad)",          { XX } },
7030     { "(bad)",          { XX } },
7031     { "(bad)",          { XX } },
7032     { "(bad)",          { XX } },
7033     { "(bad)",          { XX } },
7034     /* 30 */
7035     { "(bad)",          { XX } },
7036     { "(bad)",          { XX } },
7037     { "(bad)",          { XX } },
7038     { "(bad)",          { XX } },
7039     { "(bad)",          { XX } },
7040     { "(bad)",          { XX } },
7041     { "(bad)",          { XX } },
7042     { "(bad)",          { XX } },
7043     /* 38 */
7044     { "(bad)",          { XX } },
7045     { "(bad)",          { XX } },
7046     { "(bad)",          { XX } },
7047     { "(bad)",          { XX } },
7048     { "(bad)",          { XX } },
7049     { "(bad)",          { XX } },
7050     { "(bad)",          { XX } },
7051     { "(bad)",          { XX } },
7052     /* 40 */
7053     { "(bad)",          { XX } },
7054     { "(bad)",          { XX } },
7055     { "(bad)",          { XX } },
7056     { "(bad)",          { XX } },
7057     { "(bad)",          { XX } },
7058     { "(bad)",          { XX } },
7059     { "(bad)",          { XX } },
7060     { "(bad)",          { XX } },
7061     /* 48 */
7062     { "(bad)",          { XX } },
7063     { "(bad)",          { XX } },
7064     { "(bad)",          { XX } },
7065     { "(bad)",          { XX } },
7066     { "(bad)",          { XX } },
7067     { "(bad)",          { XX } },
7068     { "(bad)",          { XX } },
7069     { "(bad)",          { XX } },
7070     /* 50 */
7071     { "(bad)",          { XX } },
7072     { "(bad)",          { XX } },
7073     { "(bad)",          { XX } },
7074     { "(bad)",          { XX } },
7075     { "(bad)",          { XX } },
7076     { "(bad)",          { XX } },
7077     { "(bad)",          { XX } },
7078     { "(bad)",          { XX } },
7079     /* 58 */
7080     { "(bad)",          { XX } },
7081     { "(bad)",          { XX } },
7082     { "(bad)",          { XX } },
7083     { "(bad)",          { XX } },
7084     { "(bad)",          { XX } },
7085     { "(bad)",          { XX } },
7086     { "(bad)",          { XX } },
7087     { "(bad)",          { XX } },
7088     /* 60 */
7089     { "(bad)",          { XX } },
7090     { "(bad)",          { XX } },
7091     { "(bad)",          { XX } },
7092     { "(bad)",          { XX } },
7093     { "(bad)",          { XX } },
7094     { "(bad)",          { XX } },
7095     { "(bad)",          { XX } },
7096     { "(bad)",          { XX } },
7097     /* 68 */
7098     { "(bad)",          { XX } },
7099     { "(bad)",          { XX } },
7100     { "(bad)",          { XX } },
7101     { "(bad)",          { XX } },
7102     { "(bad)",          { XX } },
7103     { "(bad)",          { XX } },
7104     { "(bad)",          { XX } },
7105     { "(bad)",          { XX } },
7106     /* 70 */
7107     { "(bad)",          { XX } },
7108     { "(bad)",          { XX } },
7109     { "(bad)",          { XX } },
7110     { "(bad)",          { XX } },
7111     { "(bad)",          { XX } },
7112     { "(bad)",          { XX } },
7113     { "(bad)",          { XX } },
7114     { "(bad)",          { XX } },
7115     /* 78 */
7116     { "(bad)",          { XX } },
7117     { "(bad)",          { XX } },
7118     { "(bad)",          { XX } },
7119     { "(bad)",          { XX } },
7120     { "(bad)",          { XX } },
7121     { "(bad)",          { XX } },
7122     { "(bad)",          { XX } },
7123     { "(bad)",          { XX } },
7124     /* 80 */
7125     { VEX_LEN_TABLE (VEX_LEN_XOP_09_80) },
7126     { VEX_LEN_TABLE (VEX_LEN_XOP_09_81) },
7127     { "vfrczss",        { XM, EXd } },
7128     { "vfrczsd",        { XM, EXq } },
7129     { "(bad)",          { XX } },
7130     { "(bad)",          { XX } },
7131     { "(bad)",          { XX } },
7132     { "(bad)",          { XX } },
7133     /* 88 */
7134     { "(bad)",          { XX } },
7135     { "(bad)",          { XX } },
7136     { "(bad)",          { XX } },
7137     { "(bad)",          { XX } },
7138     { "(bad)",          { XX } },
7139     { "(bad)",          { XX } },
7140     { "(bad)",          { XX } },
7141     { "(bad)",          { XX } },
7142     /* 90 */
7143     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 } },
7144     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 } },
7145     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 } },
7146     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 } },
7147     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 } },
7148     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 } },
7149     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 } },
7150     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 } },
7151     /* 98 */
7152     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 } },
7153     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 } },
7154     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 } },
7155     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 } },
7156     { "(bad)",          { XX } },
7157     { "(bad)",          { XX } },
7158     { "(bad)",          { XX } },
7159     { "(bad)",          { XX } },
7160     /* a0 */
7161     { "(bad)",          { XX } },
7162     { "(bad)",          { XX } },
7163     { "(bad)",          { XX } },
7164     { "(bad)",          { XX } },
7165     { "(bad)",          { XX } },
7166     { "(bad)",          { XX } },
7167     { "(bad)",          { XX } },
7168     { "(bad)",          { XX } },
7169     /* a8 */
7170     { "(bad)",          { XX } },
7171     { "(bad)",          { XX } },
7172     { "(bad)",          { XX } },
7173     { "(bad)",          { XX } },
7174     { "(bad)",          { XX } },
7175     { "(bad)",          { XX } },
7176     { "(bad)",          { XX } },
7177     { "(bad)",          { XX } },
7178     /* b0 */
7179     { "(bad)",          { XX } },
7180     { "(bad)",          { XX } },
7181     { "(bad)",          { XX } },
7182     { "(bad)",          { XX } },
7183     { "(bad)",          { XX } },
7184     { "(bad)",          { XX } },
7185     { "(bad)",          { XX } },
7186     { "(bad)",          { XX } },
7187     /* b8 */
7188     { "(bad)",          { XX } },
7189     { "(bad)",          { XX } },
7190     { "(bad)",          { XX } },
7191     { "(bad)",          { XX } },
7192     { "(bad)",          { XX } },
7193     { "(bad)",          { XX } },
7194     { "(bad)",          { XX } },
7195     { "(bad)",          { XX } },
7196     /* c0 */
7197     { "(bad)",          { XX } },
7198     { "vphaddbw",       { XM, EXxmm } },
7199     { "vphaddbd",       { XM, EXxmm } },
7200     { "vphaddbq",       { XM, EXxmm } },
7201     { "(bad)",          { XX } },
7202     { "(bad)",          { XX } },
7203     { "vphaddwd",       { XM, EXxmm } },
7204     { "vphaddwq",       { XM, EXxmm } },
7205     /* c8 */
7206     { "(bad)",          { XX } },
7207     { "(bad)",          { XX } },
7208     { "(bad)",          { XX } },
7209     { "vphadddq",       { XM, EXxmm } },
7210     { "(bad)",          { XX } },
7211     { "(bad)",          { XX } },
7212     { "(bad)",          { XX } },
7213     { "(bad)",          { XX } },
7214     /* d0 */
7215     { "(bad)",          { XX } },
7216     { "vphaddubw",      { XM, EXxmm } },
7217     { "vphaddubd",      { XM, EXxmm } },
7218     { "vphaddubq",      { XM, EXxmm } },
7219     { "(bad)",          { XX } },
7220     { "(bad)",          { XX } },
7221     { "vphadduwd",      { XM, EXxmm } },
7222     { "vphadduwq",      { XM, EXxmm } },
7223     /* d8 */
7224     { "(bad)",          { XX } },
7225     { "(bad)",          { XX } },
7226     { "(bad)",          { XX } },
7227     { "vphaddudq",      { XM, EXxmm } },
7228     { "(bad)",          { XX } },
7229     { "(bad)",          { XX } },
7230     { "(bad)",          { XX } },
7231     { "(bad)",          { XX } },
7232     /* e0 */
7233     { "(bad)",          { XX } },
7234     { "vphsubbw",       { XM, EXxmm } },
7235     { "vphsubwd",       { XM, EXxmm } },
7236     { "vphsubdq",       { XM, EXxmm } },
7237     { "(bad)",          { XX } },
7238     { "(bad)",          { XX } },
7239     { "(bad)",          { XX } },
7240     { "(bad)",          { XX } },
7241     /* e8 */
7242     { "(bad)",          { XX } },
7243     { "(bad)",          { XX } },
7244     { "(bad)",          { XX } },
7245     { "(bad)",          { XX } },
7246     { "(bad)",          { XX } },
7247     { "(bad)",          { XX } },
7248     { "(bad)",          { XX } },
7249     { "(bad)",          { XX } },
7250     /* f0 */
7251     { "(bad)",          { XX } },
7252     { "(bad)",          { XX } },
7253     { "(bad)",          { XX } },
7254     { "(bad)",          { XX } },
7255     { "(bad)",          { XX } },
7256     { "(bad)",          { XX } },
7257     { "(bad)",          { XX } },
7258     { "(bad)",          { XX } },
7259     /* f8 */
7260     { "(bad)",          { XX } },
7261     { "(bad)",          { XX } },
7262     { "(bad)",          { XX } },
7263     { "(bad)",          { XX } },
7264     { "(bad)",          { XX } },
7265     { "(bad)",          { XX } },
7266     { "(bad)",          { XX } },
7267     { "(bad)",          { XX } },
7268   },
7269   /* XOP_0A */
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     { "(bad)",          { XX } },
7291     { "(bad)",          { XX } },
7292     { REG_TABLE (REG_XOP_LWP) },
7293     { "(bad)",          { XX } },
7294     { "(bad)",          { XX } },
7295     { "(bad)",          { XX } },
7296     { "(bad)",          { XX } },
7297     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
7318     { "(bad)",          { XX } },
7319     { "(bad)",          { XX } },
7320     { "(bad)",          { XX } },
7321     { "(bad)",          { XX } },
7322     { "(bad)",          { XX } },
7323     { "(bad)",          { XX } },
7324     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
7363     { "(bad)",          { XX } },
7364     { "(bad)",          { XX } },
7365     { "(bad)",          { XX } },
7366     { "(bad)",          { XX } },
7367     { "(bad)",          { XX } },
7368     { "(bad)",          { XX } },
7369     { "(bad)",          { XX } },
7370     /* 58 */
7371     { "(bad)",          { XX } },
7372     { "(bad)",          { XX } },
7373     { "(bad)",          { XX } },
7374     { "(bad)",          { XX } },
7375     { "(bad)",          { XX } },
7376     { "(bad)",          { XX } },
7377     { "(bad)",          { XX } },
7378     { "(bad)",          { XX } },
7379     /* 60 */
7380     { "(bad)",          { XX } },
7381     { "(bad)",          { XX } },
7382     { "(bad)",          { XX } },
7383     { "(bad)",          { XX } },
7384     { "(bad)",          { XX } },
7385     { "(bad)",          { XX } },
7386     { "(bad)",          { XX } },
7387     { "(bad)",          { XX } },
7388     /* 68 */
7389     { "(bad)",          { XX } },
7390     { "(bad)",          { XX } },
7391     { "(bad)",          { XX } },
7392     { "(bad)",          { XX } },
7393     { "(bad)",          { XX } },
7394     { "(bad)",          { XX } },
7395     { "(bad)",          { XX } },
7396     { "(bad)",          { XX } },
7397     /* 70 */
7398     { "(bad)",          { XX } },
7399     { "(bad)",          { XX } },
7400     { "(bad)",          { XX } },
7401     { "(bad)",          { XX } },
7402     { "(bad)",          { XX } },
7403     { "(bad)",          { XX } },
7404     { "(bad)",          { XX } },
7405     { "(bad)",          { XX } },
7406     /* 78 */
7407     { "(bad)",          { XX } },
7408     { "(bad)",          { XX } },
7409     { "(bad)",          { XX } },
7410     { "(bad)",          { XX } },
7411     { "(bad)",          { XX } },
7412     { "(bad)",          { XX } },
7413     { "(bad)",          { XX } },
7414     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
7491     { "(bad)",          { XX } },
7492     { "(bad)",          { XX } },
7493     { "(bad)",          { XX } },
7494     { "(bad)",          { XX } },
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     { "(bad)",          { XX } },
7507     { "(bad)",          { XX } },
7508     { "(bad)",          { XX } },
7509     { "(bad)",          { XX } },
7510     { "(bad)",          { XX } },
7511     { "(bad)",          { XX } },
7512     { "(bad)",          { XX } },
7513     { "(bad)",          { XX } },
7514     /* d8 */
7515     { "(bad)",          { XX } },
7516     { "(bad)",          { XX } },
7517     { "(bad)",          { XX } },
7518     { "(bad)",          { XX } },
7519     { "(bad)",          { XX } },
7520     { "(bad)",          { XX } },
7521     { "(bad)",          { XX } },
7522     { "(bad)",          { XX } },
7523     /* e0 */
7524     { "(bad)",          { XX } },
7525     { "(bad)",          { XX } },
7526     { "(bad)",          { XX } },
7527     { "(bad)",          { XX } },
7528     { "(bad)",          { XX } },
7529     { "(bad)",          { XX } },
7530     { "(bad)",          { XX } },
7531     { "(bad)",          { XX } },
7532     /* e8 */
7533     { "(bad)",          { XX } },
7534     { "(bad)",          { XX } },
7535     { "(bad)",          { XX } },
7536     { "(bad)",          { XX } },
7537     { "(bad)",          { XX } },
7538     { "(bad)",          { XX } },
7539     { "(bad)",          { XX } },
7540     { "(bad)",          { XX } },
7541     /* f0 */
7542     { "(bad)",          { XX } },
7543     { "(bad)",          { XX } },
7544     { "(bad)",          { XX } },
7545     { "(bad)",          { XX } },
7546     { "(bad)",          { XX } },
7547     { "(bad)",          { XX } },
7548     { "(bad)",          { XX } },
7549     { "(bad)",          { XX } },
7550     /* f8 */
7551     { "(bad)",          { XX } },
7552     { "(bad)",          { XX } },
7553     { "(bad)",          { XX } },
7554     { "(bad)",          { XX } },
7555     { "(bad)",          { XX } },
7556     { "(bad)",          { XX } },
7557     { "(bad)",          { XX } },
7558     { "(bad)",          { XX } },
7559   },
7560 };
7561
7562 static const struct dis386 vex_table[][256] = {
7563   /* VEX_0F */
7564   {
7565     /* 00 */
7566     { "(bad)",          { XX } },
7567     { "(bad)",          { XX } },
7568     { "(bad)",          { XX } },
7569     { "(bad)",          { XX } },
7570     { "(bad)",          { XX } },
7571     { "(bad)",          { XX } },
7572     { "(bad)",          { XX } },
7573     { "(bad)",          { XX } },
7574     /* 08 */
7575     { "(bad)",          { XX } },
7576     { "(bad)",          { XX } },
7577     { "(bad)",          { XX } },
7578     { "(bad)",          { XX } },
7579     { "(bad)",          { XX } },
7580     { "(bad)",          { XX } },
7581     { "(bad)",          { XX } },
7582     { "(bad)",          { XX } },
7583     /* 10 */
7584     { PREFIX_TABLE (PREFIX_VEX_10) },
7585     { PREFIX_TABLE (PREFIX_VEX_11) },
7586     { PREFIX_TABLE (PREFIX_VEX_12) },
7587     { MOD_TABLE (MOD_VEX_13) },
7588     { VEX_W_TABLE (VEX_W_14) },
7589     { VEX_W_TABLE (VEX_W_15) },
7590     { PREFIX_TABLE (PREFIX_VEX_16) },
7591     { MOD_TABLE (MOD_VEX_17) },
7592     /* 18 */
7593     { "(bad)",          { XX } },
7594     { "(bad)",          { XX } },
7595     { "(bad)",          { XX } },
7596     { "(bad)",          { XX } },
7597     { "(bad)",          { XX } },
7598     { "(bad)",          { XX } },
7599     { "(bad)",          { XX } },
7600     { "(bad)",          { XX } },
7601     /* 20 */
7602     { "(bad)",          { XX } },
7603     { "(bad)",          { XX } },
7604     { "(bad)",          { XX } },
7605     { "(bad)",          { XX } },
7606     { "(bad)",          { XX } },
7607     { "(bad)",          { XX } },
7608     { "(bad)",          { XX } },
7609     { "(bad)",          { XX } },
7610     /* 28 */
7611     { VEX_W_TABLE (VEX_W_28) },
7612     { VEX_W_TABLE (VEX_W_29) },
7613     { PREFIX_TABLE (PREFIX_VEX_2A) },
7614     { MOD_TABLE (MOD_VEX_2B) },
7615     { PREFIX_TABLE (PREFIX_VEX_2C) },
7616     { PREFIX_TABLE (PREFIX_VEX_2D) },
7617     { PREFIX_TABLE (PREFIX_VEX_2E) },
7618     { PREFIX_TABLE (PREFIX_VEX_2F) },
7619     /* 30 */
7620     { "(bad)",          { XX } },
7621     { "(bad)",          { XX } },
7622     { "(bad)",          { XX } },
7623     { "(bad)",          { XX } },
7624     { "(bad)",          { XX } },
7625     { "(bad)",          { XX } },
7626     { "(bad)",          { XX } },
7627     { "(bad)",          { XX } },
7628     /* 38 */
7629     { "(bad)",          { XX } },
7630     { "(bad)",          { XX } },
7631     { "(bad)",          { XX } },
7632     { "(bad)",          { XX } },
7633     { "(bad)",          { XX } },
7634     { "(bad)",          { XX } },
7635     { "(bad)",          { XX } },
7636     { "(bad)",          { XX } },
7637     /* 40 */
7638     { "(bad)",          { XX } },
7639     { "(bad)",          { XX } },
7640     { "(bad)",          { XX } },
7641     { "(bad)",          { XX } },
7642     { "(bad)",          { XX } },
7643     { "(bad)",          { XX } },
7644     { "(bad)",          { XX } },
7645     { "(bad)",          { XX } },
7646     /* 48 */
7647     { "(bad)",          { XX } },
7648     { "(bad)",          { XX } },
7649     { "(bad)",          { XX } },
7650     { "(bad)",          { XX } },
7651     { "(bad)",          { XX } },
7652     { "(bad)",          { XX } },
7653     { "(bad)",          { XX } },
7654     { "(bad)",          { XX } },
7655     /* 50 */
7656     { MOD_TABLE (MOD_VEX_50) },
7657     { PREFIX_TABLE (PREFIX_VEX_51) },
7658     { PREFIX_TABLE (PREFIX_VEX_52) },
7659     { PREFIX_TABLE (PREFIX_VEX_53) },
7660     { "vandpX",         { XM, Vex, EXx } },
7661     { "vandnpX",        { XM, Vex, EXx } },
7662     { "vorpX",          { XM, Vex, EXx } },
7663     { "vxorpX",         { XM, Vex, EXx } },
7664     /* 58 */
7665     { PREFIX_TABLE (PREFIX_VEX_58) },
7666     { PREFIX_TABLE (PREFIX_VEX_59) },
7667     { PREFIX_TABLE (PREFIX_VEX_5A) },
7668     { PREFIX_TABLE (PREFIX_VEX_5B) },
7669     { PREFIX_TABLE (PREFIX_VEX_5C) },
7670     { PREFIX_TABLE (PREFIX_VEX_5D) },
7671     { PREFIX_TABLE (PREFIX_VEX_5E) },
7672     { PREFIX_TABLE (PREFIX_VEX_5F) },
7673     /* 60 */
7674     { PREFIX_TABLE (PREFIX_VEX_60) },
7675     { PREFIX_TABLE (PREFIX_VEX_61) },
7676     { PREFIX_TABLE (PREFIX_VEX_62) },
7677     { PREFIX_TABLE (PREFIX_VEX_63) },
7678     { PREFIX_TABLE (PREFIX_VEX_64) },
7679     { PREFIX_TABLE (PREFIX_VEX_65) },
7680     { PREFIX_TABLE (PREFIX_VEX_66) },
7681     { PREFIX_TABLE (PREFIX_VEX_67) },
7682     /* 68 */
7683     { PREFIX_TABLE (PREFIX_VEX_68) },
7684     { PREFIX_TABLE (PREFIX_VEX_69) },
7685     { PREFIX_TABLE (PREFIX_VEX_6A) },
7686     { PREFIX_TABLE (PREFIX_VEX_6B) },
7687     { PREFIX_TABLE (PREFIX_VEX_6C) },
7688     { PREFIX_TABLE (PREFIX_VEX_6D) },
7689     { PREFIX_TABLE (PREFIX_VEX_6E) },
7690     { PREFIX_TABLE (PREFIX_VEX_6F) },
7691     /* 70 */
7692     { PREFIX_TABLE (PREFIX_VEX_70) },
7693     { REG_TABLE (REG_VEX_71) },
7694     { REG_TABLE (REG_VEX_72) },
7695     { REG_TABLE (REG_VEX_73) },
7696     { PREFIX_TABLE (PREFIX_VEX_74) },
7697     { PREFIX_TABLE (PREFIX_VEX_75) },
7698     { PREFIX_TABLE (PREFIX_VEX_76) },
7699     { PREFIX_TABLE (PREFIX_VEX_77) },
7700     /* 78 */
7701     { "(bad)",          { XX } },
7702     { "(bad)",          { XX } },
7703     { "(bad)",          { XX } },
7704     { "(bad)",          { XX } },
7705     { PREFIX_TABLE (PREFIX_VEX_7C) },
7706     { PREFIX_TABLE (PREFIX_VEX_7D) },
7707     { PREFIX_TABLE (PREFIX_VEX_7E) },
7708     { PREFIX_TABLE (PREFIX_VEX_7F) },
7709     /* 80 */
7710     { "(bad)",          { XX } },
7711     { "(bad)",          { XX } },
7712     { "(bad)",          { XX } },
7713     { "(bad)",          { XX } },
7714     { "(bad)",          { XX } },
7715     { "(bad)",          { XX } },
7716     { "(bad)",          { XX } },
7717     { "(bad)",          { XX } },
7718     /* 88 */
7719     { "(bad)",          { XX } },
7720     { "(bad)",          { XX } },
7721     { "(bad)",          { XX } },
7722     { "(bad)",          { XX } },
7723     { "(bad)",          { XX } },
7724     { "(bad)",          { XX } },
7725     { "(bad)",          { XX } },
7726     { "(bad)",          { XX } },
7727     /* 90 */
7728     { "(bad)",          { XX } },
7729     { "(bad)",          { XX } },
7730     { "(bad)",          { XX } },
7731     { "(bad)",          { XX } },
7732     { "(bad)",          { XX } },
7733     { "(bad)",          { XX } },
7734     { "(bad)",          { XX } },
7735     { "(bad)",          { XX } },
7736     /* 98 */
7737     { "(bad)",          { XX } },
7738     { "(bad)",          { XX } },
7739     { "(bad)",          { XX } },
7740     { "(bad)",          { XX } },
7741     { "(bad)",          { XX } },
7742     { "(bad)",          { XX } },
7743     { "(bad)",          { XX } },
7744     { "(bad)",          { XX } },
7745     /* a0 */
7746     { "(bad)",          { XX } },
7747     { "(bad)",          { XX } },
7748     { "(bad)",          { XX } },
7749     { "(bad)",          { XX } },
7750     { "(bad)",          { XX } },
7751     { "(bad)",          { XX } },
7752     { "(bad)",          { XX } },
7753     { "(bad)",          { XX } },
7754     /* a8 */
7755     { "(bad)",          { XX } },
7756     { "(bad)",          { XX } },
7757     { "(bad)",          { XX } },
7758     { "(bad)",          { XX } },
7759     { "(bad)",          { XX } },
7760     { "(bad)",          { XX } },
7761     { REG_TABLE (REG_VEX_AE) },
7762     { "(bad)",          { XX } },
7763     /* b0 */
7764     { "(bad)",          { XX } },
7765     { "(bad)",          { XX } },
7766     { "(bad)",          { XX } },
7767     { "(bad)",          { XX } },
7768     { "(bad)",          { XX } },
7769     { "(bad)",          { XX } },
7770     { "(bad)",          { XX } },
7771     { "(bad)",          { XX } },
7772     /* b8 */
7773     { "(bad)",          { XX } },
7774     { "(bad)",          { XX } },
7775     { "(bad)",          { XX } },
7776     { "(bad)",          { XX } },
7777     { "(bad)",          { XX } },
7778     { "(bad)",          { XX } },
7779     { "(bad)",          { XX } },
7780     { "(bad)",          { XX } },
7781     /* c0 */
7782     { "(bad)",          { XX } },
7783     { "(bad)",          { XX } },
7784     { PREFIX_TABLE (PREFIX_VEX_C2) },
7785     { "(bad)",          { XX } },
7786     { PREFIX_TABLE (PREFIX_VEX_C4) },
7787     { PREFIX_TABLE (PREFIX_VEX_C5) },
7788     { "vshufpX",        { XM, Vex, EXx, Ib } },
7789     { "(bad)",          { XX } },
7790     /* c8 */
7791     { "(bad)",          { XX } },
7792     { "(bad)",          { XX } },
7793     { "(bad)",          { XX } },
7794     { "(bad)",          { XX } },
7795     { "(bad)",          { XX } },
7796     { "(bad)",          { XX } },
7797     { "(bad)",          { XX } },
7798     { "(bad)",          { XX } },
7799     /* d0 */
7800     { PREFIX_TABLE (PREFIX_VEX_D0) },
7801     { PREFIX_TABLE (PREFIX_VEX_D1) },
7802     { PREFIX_TABLE (PREFIX_VEX_D2) },
7803     { PREFIX_TABLE (PREFIX_VEX_D3) },
7804     { PREFIX_TABLE (PREFIX_VEX_D4) },
7805     { PREFIX_TABLE (PREFIX_VEX_D5) },
7806     { PREFIX_TABLE (PREFIX_VEX_D6) },
7807     { PREFIX_TABLE (PREFIX_VEX_D7) },
7808     /* d8 */
7809     { PREFIX_TABLE (PREFIX_VEX_D8) },
7810     { PREFIX_TABLE (PREFIX_VEX_D9) },
7811     { PREFIX_TABLE (PREFIX_VEX_DA) },
7812     { PREFIX_TABLE (PREFIX_VEX_DB) },
7813     { PREFIX_TABLE (PREFIX_VEX_DC) },
7814     { PREFIX_TABLE (PREFIX_VEX_DD) },
7815     { PREFIX_TABLE (PREFIX_VEX_DE) },
7816     { PREFIX_TABLE (PREFIX_VEX_DF) },
7817     /* e0 */
7818     { PREFIX_TABLE (PREFIX_VEX_E0) },
7819     { PREFIX_TABLE (PREFIX_VEX_E1) },
7820     { PREFIX_TABLE (PREFIX_VEX_E2) },
7821     { PREFIX_TABLE (PREFIX_VEX_E3) },
7822     { PREFIX_TABLE (PREFIX_VEX_E4) },
7823     { PREFIX_TABLE (PREFIX_VEX_E5) },
7824     { PREFIX_TABLE (PREFIX_VEX_E6) },
7825     { PREFIX_TABLE (PREFIX_VEX_E7) },
7826     /* e8 */
7827     { PREFIX_TABLE (PREFIX_VEX_E8) },
7828     { PREFIX_TABLE (PREFIX_VEX_E9) },
7829     { PREFIX_TABLE (PREFIX_VEX_EA) },
7830     { PREFIX_TABLE (PREFIX_VEX_EB) },
7831     { PREFIX_TABLE (PREFIX_VEX_EC) },
7832     { PREFIX_TABLE (PREFIX_VEX_ED) },
7833     { PREFIX_TABLE (PREFIX_VEX_EE) },
7834     { PREFIX_TABLE (PREFIX_VEX_EF) },
7835     /* f0 */
7836     { PREFIX_TABLE (PREFIX_VEX_F0) },
7837     { PREFIX_TABLE (PREFIX_VEX_F1) },
7838     { PREFIX_TABLE (PREFIX_VEX_F2) },
7839     { PREFIX_TABLE (PREFIX_VEX_F3) },
7840     { PREFIX_TABLE (PREFIX_VEX_F4) },
7841     { PREFIX_TABLE (PREFIX_VEX_F5) },
7842     { PREFIX_TABLE (PREFIX_VEX_F6) },
7843     { PREFIX_TABLE (PREFIX_VEX_F7) },
7844     /* f8 */
7845     { PREFIX_TABLE (PREFIX_VEX_F8) },
7846     { PREFIX_TABLE (PREFIX_VEX_F9) },
7847     { PREFIX_TABLE (PREFIX_VEX_FA) },
7848     { PREFIX_TABLE (PREFIX_VEX_FB) },
7849     { PREFIX_TABLE (PREFIX_VEX_FC) },
7850     { PREFIX_TABLE (PREFIX_VEX_FD) },
7851     { PREFIX_TABLE (PREFIX_VEX_FE) },
7852     { "(bad)",          { XX } },
7853   },
7854   /* VEX_0F38 */
7855   {
7856     /* 00 */
7857     { PREFIX_TABLE (PREFIX_VEX_3800) },
7858     { PREFIX_TABLE (PREFIX_VEX_3801) },
7859     { PREFIX_TABLE (PREFIX_VEX_3802) },
7860     { PREFIX_TABLE (PREFIX_VEX_3803) },
7861     { PREFIX_TABLE (PREFIX_VEX_3804) },
7862     { PREFIX_TABLE (PREFIX_VEX_3805) },
7863     { PREFIX_TABLE (PREFIX_VEX_3806) },
7864     { PREFIX_TABLE (PREFIX_VEX_3807) },
7865     /* 08 */
7866     { PREFIX_TABLE (PREFIX_VEX_3808) },
7867     { PREFIX_TABLE (PREFIX_VEX_3809) },
7868     { PREFIX_TABLE (PREFIX_VEX_380A) },
7869     { PREFIX_TABLE (PREFIX_VEX_380B) },
7870     { PREFIX_TABLE (PREFIX_VEX_380C) },
7871     { PREFIX_TABLE (PREFIX_VEX_380D) },
7872     { PREFIX_TABLE (PREFIX_VEX_380E) },
7873     { PREFIX_TABLE (PREFIX_VEX_380F) },
7874     /* 10 */
7875     { "(bad)",          { XX } },
7876     { "(bad)",          { XX } },
7877     { "(bad)",          { XX } },
7878     { "(bad)",          { XX } },
7879     { "(bad)",          { XX } },
7880     { "(bad)",          { XX } },
7881     { "(bad)",          { XX } },
7882     { PREFIX_TABLE (PREFIX_VEX_3817) },
7883     /* 18 */
7884     { PREFIX_TABLE (PREFIX_VEX_3818) },
7885     { PREFIX_TABLE (PREFIX_VEX_3819) },
7886     { PREFIX_TABLE (PREFIX_VEX_381A) },
7887     { "(bad)",          { XX } },
7888     { PREFIX_TABLE (PREFIX_VEX_381C) },
7889     { PREFIX_TABLE (PREFIX_VEX_381D) },
7890     { PREFIX_TABLE (PREFIX_VEX_381E) },
7891     { "(bad)",          { XX } },
7892     /* 20 */
7893     { PREFIX_TABLE (PREFIX_VEX_3820) },
7894     { PREFIX_TABLE (PREFIX_VEX_3821) },
7895     { PREFIX_TABLE (PREFIX_VEX_3822) },
7896     { PREFIX_TABLE (PREFIX_VEX_3823) },
7897     { PREFIX_TABLE (PREFIX_VEX_3824) },
7898     { PREFIX_TABLE (PREFIX_VEX_3825) },
7899     { "(bad)",          { XX } },
7900     { "(bad)",          { XX } },
7901     /* 28 */
7902     { PREFIX_TABLE (PREFIX_VEX_3828) },
7903     { PREFIX_TABLE (PREFIX_VEX_3829) },
7904     { PREFIX_TABLE (PREFIX_VEX_382A) },
7905     { PREFIX_TABLE (PREFIX_VEX_382B) },
7906     { PREFIX_TABLE (PREFIX_VEX_382C) },
7907     { PREFIX_TABLE (PREFIX_VEX_382D) },
7908     { PREFIX_TABLE (PREFIX_VEX_382E) },
7909     { PREFIX_TABLE (PREFIX_VEX_382F) },
7910     /* 30 */
7911     { PREFIX_TABLE (PREFIX_VEX_3830) },
7912     { PREFIX_TABLE (PREFIX_VEX_3831) },
7913     { PREFIX_TABLE (PREFIX_VEX_3832) },
7914     { PREFIX_TABLE (PREFIX_VEX_3833) },
7915     { PREFIX_TABLE (PREFIX_VEX_3834) },
7916     { PREFIX_TABLE (PREFIX_VEX_3835) },
7917     { "(bad)",          { XX } },
7918     { PREFIX_TABLE (PREFIX_VEX_3837) },
7919     /* 38 */
7920     { PREFIX_TABLE (PREFIX_VEX_3838) },
7921     { PREFIX_TABLE (PREFIX_VEX_3839) },
7922     { PREFIX_TABLE (PREFIX_VEX_383A) },
7923     { PREFIX_TABLE (PREFIX_VEX_383B) },
7924     { PREFIX_TABLE (PREFIX_VEX_383C) },
7925     { PREFIX_TABLE (PREFIX_VEX_383D) },
7926     { PREFIX_TABLE (PREFIX_VEX_383E) },
7927     { PREFIX_TABLE (PREFIX_VEX_383F) },
7928     /* 40 */
7929     { PREFIX_TABLE (PREFIX_VEX_3840) },
7930     { PREFIX_TABLE (PREFIX_VEX_3841) },
7931     { "(bad)",          { XX } },
7932     { "(bad)",          { XX } },
7933     { "(bad)",          { XX } },
7934     { "(bad)",          { XX } },
7935     { "(bad)",          { XX } },
7936     { "(bad)",          { XX } },
7937     /* 48 */
7938     { "(bad)",          { XX } },
7939     { "(bad)",          { XX } },
7940     { "(bad)",          { XX } },
7941     { "(bad)",          { XX } },
7942     { "(bad)",          { XX } },
7943     { "(bad)",          { XX } },
7944     { "(bad)",          { XX } },
7945     { "(bad)",          { XX } },
7946     /* 50 */
7947     { "(bad)",          { XX } },
7948     { "(bad)",          { XX } },
7949     { "(bad)",          { XX } },
7950     { "(bad)",          { XX } },
7951     { "(bad)",          { XX } },
7952     { "(bad)",          { XX } },
7953     { "(bad)",          { XX } },
7954     { "(bad)",          { XX } },
7955     /* 58 */
7956     { "(bad)",          { XX } },
7957     { "(bad)",          { XX } },
7958     { "(bad)",          { XX } },
7959     { "(bad)",          { XX } },
7960     { "(bad)",          { XX } },
7961     { "(bad)",          { XX } },
7962     { "(bad)",          { XX } },
7963     { "(bad)",          { XX } },
7964     /* 60 */
7965     { "(bad)",          { XX } },
7966     { "(bad)",          { XX } },
7967     { "(bad)",          { XX } },
7968     { "(bad)",          { XX } },
7969     { "(bad)",          { XX } },
7970     { "(bad)",          { XX } },
7971     { "(bad)",          { XX } },
7972     { "(bad)",          { XX } },
7973     /* 68 */
7974     { "(bad)",          { XX } },
7975     { "(bad)",          { XX } },
7976     { "(bad)",          { XX } },
7977     { "(bad)",          { XX } },
7978     { "(bad)",          { XX } },
7979     { "(bad)",          { XX } },
7980     { "(bad)",          { XX } },
7981     { "(bad)",          { XX } },
7982     /* 70 */
7983     { "(bad)",          { XX } },
7984     { "(bad)",          { XX } },
7985     { "(bad)",          { XX } },
7986     { "(bad)",          { XX } },
7987     { "(bad)",          { XX } },
7988     { "(bad)",          { XX } },
7989     { "(bad)",          { XX } },
7990     { "(bad)",          { XX } },
7991     /* 78 */
7992     { "(bad)",          { XX } },
7993     { "(bad)",          { XX } },
7994     { "(bad)",          { XX } },
7995     { "(bad)",          { XX } },
7996     { "(bad)",          { XX } },
7997     { "(bad)",          { XX } },
7998     { "(bad)",          { XX } },
7999     { "(bad)",          { XX } },
8000     /* 80 */
8001     { "(bad)",          { XX } },
8002     { "(bad)",          { XX } },
8003     { "(bad)",          { XX } },
8004     { "(bad)",          { XX } },
8005     { "(bad)",          { XX } },
8006     { "(bad)",          { XX } },
8007     { "(bad)",          { XX } },
8008     { "(bad)",          { XX } },
8009     /* 88 */
8010     { "(bad)",          { XX } },
8011     { "(bad)",          { XX } },
8012     { "(bad)",          { XX } },
8013     { "(bad)",          { XX } },
8014     { "(bad)",          { XX } },
8015     { "(bad)",          { XX } },
8016     { "(bad)",          { XX } },
8017     { "(bad)",          { XX } },
8018     /* 90 */
8019     { "(bad)",          { XX } },
8020     { "(bad)",          { XX } },
8021     { "(bad)",          { XX } },
8022     { "(bad)",          { XX } },
8023     { "(bad)",          { XX } },
8024     { "(bad)",          { XX } },
8025     { PREFIX_TABLE (PREFIX_VEX_3896) },
8026     { PREFIX_TABLE (PREFIX_VEX_3897) },
8027     /* 98 */
8028     { PREFIX_TABLE (PREFIX_VEX_3898) },
8029     { PREFIX_TABLE (PREFIX_VEX_3899) },
8030     { PREFIX_TABLE (PREFIX_VEX_389A) },
8031     { PREFIX_TABLE (PREFIX_VEX_389B) },
8032     { PREFIX_TABLE (PREFIX_VEX_389C) },
8033     { PREFIX_TABLE (PREFIX_VEX_389D) },
8034     { PREFIX_TABLE (PREFIX_VEX_389E) },
8035     { PREFIX_TABLE (PREFIX_VEX_389F) },
8036     /* a0 */
8037     { "(bad)",          { XX } },
8038     { "(bad)",          { XX } },
8039     { "(bad)",          { XX } },
8040     { "(bad)",          { XX } },
8041     { "(bad)",          { XX } },
8042     { "(bad)",          { XX } },
8043     { PREFIX_TABLE (PREFIX_VEX_38A6) },
8044     { PREFIX_TABLE (PREFIX_VEX_38A7) },
8045     /* a8 */
8046     { PREFIX_TABLE (PREFIX_VEX_38A8) },
8047     { PREFIX_TABLE (PREFIX_VEX_38A9) },
8048     { PREFIX_TABLE (PREFIX_VEX_38AA) },
8049     { PREFIX_TABLE (PREFIX_VEX_38AB) },
8050     { PREFIX_TABLE (PREFIX_VEX_38AC) },
8051     { PREFIX_TABLE (PREFIX_VEX_38AD) },
8052     { PREFIX_TABLE (PREFIX_VEX_38AE) },
8053     { PREFIX_TABLE (PREFIX_VEX_38AF) },
8054     /* b0 */
8055     { "(bad)",          { XX } },
8056     { "(bad)",          { XX } },
8057     { "(bad)",          { XX } },
8058     { "(bad)",          { XX } },
8059     { "(bad)",          { XX } },
8060     { "(bad)",          { XX } },
8061     { PREFIX_TABLE (PREFIX_VEX_38B6) },
8062     { PREFIX_TABLE (PREFIX_VEX_38B7) },
8063     /* b8 */
8064     { PREFIX_TABLE (PREFIX_VEX_38B8) },
8065     { PREFIX_TABLE (PREFIX_VEX_38B9) },
8066     { PREFIX_TABLE (PREFIX_VEX_38BA) },
8067     { PREFIX_TABLE (PREFIX_VEX_38BB) },
8068     { PREFIX_TABLE (PREFIX_VEX_38BC) },
8069     { PREFIX_TABLE (PREFIX_VEX_38BD) },
8070     { PREFIX_TABLE (PREFIX_VEX_38BE) },
8071     { PREFIX_TABLE (PREFIX_VEX_38BF) },
8072     /* c0 */
8073     { "(bad)",          { XX } },
8074     { "(bad)",          { XX } },
8075     { "(bad)",          { XX } },
8076     { "(bad)",          { XX } },
8077     { "(bad)",          { XX } },
8078     { "(bad)",          { XX } },
8079     { "(bad)",          { XX } },
8080     { "(bad)",          { XX } },
8081     /* c8 */
8082     { "(bad)",          { XX } },
8083     { "(bad)",          { XX } },
8084     { "(bad)",          { XX } },
8085     { "(bad)",          { XX } },
8086     { "(bad)",          { XX } },
8087     { "(bad)",          { XX } },
8088     { "(bad)",          { XX } },
8089     { "(bad)",          { XX } },
8090     /* d0 */
8091     { "(bad)",          { XX } },
8092     { "(bad)",          { XX } },
8093     { "(bad)",          { XX } },
8094     { "(bad)",          { XX } },
8095     { "(bad)",          { XX } },
8096     { "(bad)",          { XX } },
8097     { "(bad)",          { XX } },
8098     { "(bad)",          { XX } },
8099     /* d8 */
8100     { "(bad)",          { XX } },
8101     { "(bad)",          { XX } },
8102     { "(bad)",          { XX } },
8103     { PREFIX_TABLE (PREFIX_VEX_38DB) },
8104     { PREFIX_TABLE (PREFIX_VEX_38DC) },
8105     { PREFIX_TABLE (PREFIX_VEX_38DD) },
8106     { PREFIX_TABLE (PREFIX_VEX_38DE) },
8107     { PREFIX_TABLE (PREFIX_VEX_38DF) },
8108     /* e0 */
8109     { "(bad)",          { XX } },
8110     { "(bad)",          { XX } },
8111     { "(bad)",          { XX } },
8112     { "(bad)",          { XX } },
8113     { "(bad)",          { XX } },
8114     { "(bad)",          { XX } },
8115     { "(bad)",          { XX } },
8116     { "(bad)",          { XX } },
8117     /* e8 */
8118     { "(bad)",          { XX } },
8119     { "(bad)",          { XX } },
8120     { "(bad)",          { XX } },
8121     { "(bad)",          { XX } },
8122     { "(bad)",          { XX } },
8123     { "(bad)",          { XX } },
8124     { "(bad)",          { XX } },
8125     { "(bad)",          { XX } },
8126     /* f0 */
8127     { "(bad)",          { XX } },
8128     { "(bad)",          { XX } },
8129     { "(bad)",          { XX } },
8130     { "(bad)",          { XX } },
8131     { "(bad)",          { XX } },
8132     { "(bad)",          { XX } },
8133     { "(bad)",          { XX } },
8134     { "(bad)",          { XX } },
8135     /* f8 */
8136     { "(bad)",          { XX } },
8137     { "(bad)",          { XX } },
8138     { "(bad)",          { XX } },
8139     { "(bad)",          { XX } },
8140     { "(bad)",          { XX } },
8141     { "(bad)",          { XX } },
8142     { "(bad)",          { XX } },
8143     { "(bad)",          { XX } },
8144   },
8145   /* VEX_0F3A */
8146   {
8147     /* 00 */
8148     { "(bad)",          { XX } },
8149     { "(bad)",          { XX } },
8150     { "(bad)",          { XX } },
8151     { "(bad)",          { XX } },
8152     { PREFIX_TABLE (PREFIX_VEX_3A04) },
8153     { PREFIX_TABLE (PREFIX_VEX_3A05) },
8154     { PREFIX_TABLE (PREFIX_VEX_3A06) },
8155     { "(bad)",          { XX } },
8156     /* 08 */
8157     { PREFIX_TABLE (PREFIX_VEX_3A08) },
8158     { PREFIX_TABLE (PREFIX_VEX_3A09) },
8159     { PREFIX_TABLE (PREFIX_VEX_3A0A) },
8160     { PREFIX_TABLE (PREFIX_VEX_3A0B) },
8161     { PREFIX_TABLE (PREFIX_VEX_3A0C) },
8162     { PREFIX_TABLE (PREFIX_VEX_3A0D) },
8163     { PREFIX_TABLE (PREFIX_VEX_3A0E) },
8164     { PREFIX_TABLE (PREFIX_VEX_3A0F) },
8165     /* 10 */
8166     { "(bad)",          { XX } },
8167     { "(bad)",          { XX } },
8168     { "(bad)",          { XX } },
8169     { "(bad)",          { XX } },
8170     { PREFIX_TABLE (PREFIX_VEX_3A14) },
8171     { PREFIX_TABLE (PREFIX_VEX_3A15) },
8172     { PREFIX_TABLE (PREFIX_VEX_3A16) },
8173     { PREFIX_TABLE (PREFIX_VEX_3A17) },
8174     /* 18 */
8175     { PREFIX_TABLE (PREFIX_VEX_3A18) },
8176     { PREFIX_TABLE (PREFIX_VEX_3A19) },
8177     { "(bad)",          { XX } },
8178     { "(bad)",          { XX } },
8179     { "(bad)",          { XX } },
8180     { "(bad)",          { XX } },
8181     { "(bad)",          { XX } },
8182     { "(bad)",          { XX } },
8183     /* 20 */
8184     { PREFIX_TABLE (PREFIX_VEX_3A20) },
8185     { PREFIX_TABLE (PREFIX_VEX_3A21) },
8186     { PREFIX_TABLE (PREFIX_VEX_3A22) },
8187     { "(bad)",          { XX } },
8188     { "(bad)",          { XX } },
8189     { "(bad)",          { XX } },
8190     { "(bad)",          { XX } },
8191     { "(bad)",          { XX } },
8192     /* 28 */
8193     { "(bad)",          { XX } },
8194     { "(bad)",          { XX } },
8195     { "(bad)",          { XX } },
8196     { "(bad)",          { XX } },
8197     { "(bad)",          { XX } },
8198     { "(bad)",          { XX } },
8199     { "(bad)",          { XX } },
8200     { "(bad)",          { XX } },
8201     /* 30 */
8202     { "(bad)",          { XX } },
8203     { "(bad)",          { XX } },
8204     { "(bad)",          { XX } },
8205     { "(bad)",          { XX } },
8206     { "(bad)",          { XX } },
8207     { "(bad)",          { XX } },
8208     { "(bad)",          { XX } },
8209     { "(bad)",          { XX } },
8210     /* 38 */
8211     { "(bad)",          { XX } },
8212     { "(bad)",          { XX } },
8213     { "(bad)",          { XX } },
8214     { "(bad)",          { XX } },
8215     { "(bad)",          { XX } },
8216     { "(bad)",          { XX } },
8217     { "(bad)",          { XX } },
8218     { "(bad)",          { XX } },
8219     /* 40 */
8220     { PREFIX_TABLE (PREFIX_VEX_3A40) },
8221     { PREFIX_TABLE (PREFIX_VEX_3A41) },
8222     { PREFIX_TABLE (PREFIX_VEX_3A42) },
8223     { "(bad)",          { XX } },
8224     { PREFIX_TABLE (PREFIX_VEX_3A44) },
8225     { "(bad)",          { XX } },
8226     { "(bad)",          { XX } },
8227     { "(bad)",          { XX } },
8228     /* 48 */
8229     { "(bad)",          { XX } },
8230     { "(bad)",          { XX } },
8231     { PREFIX_TABLE (PREFIX_VEX_3A4A) },
8232     { PREFIX_TABLE (PREFIX_VEX_3A4B) },
8233     { PREFIX_TABLE (PREFIX_VEX_3A4C) },
8234     { "(bad)",          { XX } },
8235     { "(bad)",          { XX } },
8236     { "(bad)",          { XX } },
8237     /* 50 */
8238     { "(bad)",          { XX } },
8239     { "(bad)",          { XX } },
8240     { "(bad)",          { XX } },
8241     { "(bad)",          { XX } },
8242     { "(bad)",          { XX } },
8243     { "(bad)",          { XX } },
8244     { "(bad)",          { XX } },
8245     { "(bad)",          { XX } },
8246     /* 58 */
8247     { "(bad)",          { XX } },
8248     { "(bad)",          { XX } },
8249     { "(bad)",          { XX } },
8250     { "(bad)",          { XX } },
8251     { PREFIX_TABLE (PREFIX_VEX_3A5C) },
8252     { PREFIX_TABLE (PREFIX_VEX_3A5D) },
8253     { PREFIX_TABLE (PREFIX_VEX_3A5E) },
8254     { PREFIX_TABLE (PREFIX_VEX_3A5F) },
8255     /* 60 */
8256     { PREFIX_TABLE (PREFIX_VEX_3A60) },
8257     { PREFIX_TABLE (PREFIX_VEX_3A61) },
8258     { PREFIX_TABLE (PREFIX_VEX_3A62) },
8259     { PREFIX_TABLE (PREFIX_VEX_3A63) },
8260     { "(bad)",          { XX } },
8261     { "(bad)",          { XX } },
8262     { "(bad)",          { XX } },
8263     { "(bad)",          { XX } },
8264     /* 68 */
8265     { PREFIX_TABLE (PREFIX_VEX_3A68) },
8266     { PREFIX_TABLE (PREFIX_VEX_3A69) },
8267     { PREFIX_TABLE (PREFIX_VEX_3A6A) },
8268     { PREFIX_TABLE (PREFIX_VEX_3A6B) },
8269     { PREFIX_TABLE (PREFIX_VEX_3A6C) },
8270     { PREFIX_TABLE (PREFIX_VEX_3A6D) },
8271     { PREFIX_TABLE (PREFIX_VEX_3A6E) },
8272     { PREFIX_TABLE (PREFIX_VEX_3A6F) },
8273     /* 70 */
8274     { "(bad)",          { XX } },
8275     { "(bad)",          { XX } },
8276     { "(bad)",          { XX } },
8277     { "(bad)",          { XX } },
8278     { "(bad)",          { XX } },
8279     { "(bad)",          { XX } },
8280     { "(bad)",          { XX } },
8281     { "(bad)",          { XX } },
8282     /* 78 */
8283     { PREFIX_TABLE (PREFIX_VEX_3A78) },
8284     { PREFIX_TABLE (PREFIX_VEX_3A79) },
8285     { PREFIX_TABLE (PREFIX_VEX_3A7A) },
8286     { PREFIX_TABLE (PREFIX_VEX_3A7B) },
8287     { PREFIX_TABLE (PREFIX_VEX_3A7C) },
8288     { PREFIX_TABLE (PREFIX_VEX_3A7D) },
8289     { PREFIX_TABLE (PREFIX_VEX_3A7E) },
8290     { PREFIX_TABLE (PREFIX_VEX_3A7F) },
8291     /* 80 */
8292     { "(bad)",          { XX } },
8293     { "(bad)",          { XX } },
8294     { "(bad)",          { XX } },
8295     { "(bad)",          { XX } },
8296     { "(bad)",          { XX } },
8297     { "(bad)",          { XX } },
8298     { "(bad)",          { XX } },
8299     { "(bad)",          { XX } },
8300     /* 88 */
8301     { "(bad)",          { XX } },
8302     { "(bad)",          { XX } },
8303     { "(bad)",          { XX } },
8304     { "(bad)",          { XX } },
8305     { "(bad)",          { XX } },
8306     { "(bad)",          { XX } },
8307     { "(bad)",          { XX } },
8308     { "(bad)",          { XX } },
8309     /* 90 */
8310     { "(bad)",          { XX } },
8311     { "(bad)",          { XX } },
8312     { "(bad)",          { XX } },
8313     { "(bad)",          { XX } },
8314     { "(bad)",          { XX } },
8315     { "(bad)",          { XX } },
8316     { "(bad)",          { XX } },
8317     { "(bad)",          { XX } },
8318     /* 98 */
8319     { "(bad)",          { XX } },
8320     { "(bad)",          { XX } },
8321     { "(bad)",          { XX } },
8322     { "(bad)",          { XX } },
8323     { "(bad)",          { XX } },
8324     { "(bad)",          { XX } },
8325     { "(bad)",          { XX } },
8326     { "(bad)",          { XX } },
8327     /* a0 */
8328     { "(bad)",          { XX } },
8329     { "(bad)",          { XX } },
8330     { "(bad)",          { XX } },
8331     { "(bad)",          { XX } },
8332     { "(bad)",          { XX } },
8333     { "(bad)",          { XX } },
8334     { "(bad)",          { XX } },
8335     { "(bad)",          { XX } },
8336     /* a8 */
8337     { "(bad)",          { XX } },
8338     { "(bad)",          { XX } },
8339     { "(bad)",          { XX } },
8340     { "(bad)",          { XX } },
8341     { "(bad)",          { XX } },
8342     { "(bad)",          { XX } },
8343     { "(bad)",          { XX } },
8344     { "(bad)",          { XX } },
8345     /* b0 */
8346     { "(bad)",          { XX } },
8347     { "(bad)",          { XX } },
8348     { "(bad)",          { XX } },
8349     { "(bad)",          { XX } },
8350     { "(bad)",          { XX } },
8351     { "(bad)",          { XX } },
8352     { "(bad)",          { XX } },
8353     { "(bad)",          { XX } },
8354     /* b8 */
8355     { "(bad)",          { XX } },
8356     { "(bad)",          { XX } },
8357     { "(bad)",          { XX } },
8358     { "(bad)",          { XX } },
8359     { "(bad)",          { XX } },
8360     { "(bad)",          { XX } },
8361     { "(bad)",          { XX } },
8362     { "(bad)",          { XX } },
8363     /* c0 */
8364     { "(bad)",          { XX } },
8365     { "(bad)",          { XX } },
8366     { "(bad)",          { XX } },
8367     { "(bad)",          { XX } },
8368     { "(bad)",          { XX } },
8369     { "(bad)",          { XX } },
8370     { "(bad)",          { XX } },
8371     { "(bad)",          { XX } },
8372     /* c8 */
8373     { "(bad)",          { XX } },
8374     { "(bad)",          { XX } },
8375     { "(bad)",          { XX } },
8376     { "(bad)",          { XX } },
8377     { "(bad)",          { XX } },
8378     { "(bad)",          { XX } },
8379     { "(bad)",          { XX } },
8380     { "(bad)",          { XX } },
8381     /* d0 */
8382     { "(bad)",          { XX } },
8383     { "(bad)",          { XX } },
8384     { "(bad)",          { XX } },
8385     { "(bad)",          { XX } },
8386     { "(bad)",          { XX } },
8387     { "(bad)",          { XX } },
8388     { "(bad)",          { XX } },
8389     { "(bad)",          { XX } },
8390     /* d8 */
8391     { "(bad)",          { XX } },
8392     { "(bad)",          { XX } },
8393     { "(bad)",          { XX } },
8394     { "(bad)",          { XX } },
8395     { "(bad)",          { XX } },
8396     { "(bad)",          { XX } },
8397     { "(bad)",          { XX } },
8398     { PREFIX_TABLE (PREFIX_VEX_3ADF) },
8399     /* e0 */
8400     { "(bad)",          { XX } },
8401     { "(bad)",          { XX } },
8402     { "(bad)",          { XX } },
8403     { "(bad)",          { XX } },
8404     { "(bad)",          { XX } },
8405     { "(bad)",          { XX } },
8406     { "(bad)",          { XX } },
8407     { "(bad)",          { XX } },
8408     /* e8 */
8409     { "(bad)",          { XX } },
8410     { "(bad)",          { XX } },
8411     { "(bad)",          { XX } },
8412     { "(bad)",          { XX } },
8413     { "(bad)",          { XX } },
8414     { "(bad)",          { XX } },
8415     { "(bad)",          { XX } },
8416     { "(bad)",          { XX } },
8417     /* f0 */
8418     { "(bad)",          { XX } },
8419     { "(bad)",          { XX } },
8420     { "(bad)",          { XX } },
8421     { "(bad)",          { XX } },
8422     { "(bad)",          { XX } },
8423     { "(bad)",          { XX } },
8424     { "(bad)",          { XX } },
8425     { "(bad)",          { XX } },
8426     /* f8 */
8427     { "(bad)",          { XX } },
8428     { "(bad)",          { XX } },
8429     { "(bad)",          { XX } },
8430     { "(bad)",          { XX } },
8431     { "(bad)",          { XX } },
8432     { "(bad)",          { XX } },
8433     { "(bad)",          { XX } },
8434     { "(bad)",          { XX } },
8435   },
8436 };
8437
8438 static const struct dis386 vex_len_table[][2] = {
8439   /* VEX_LEN_10_P_1 */
8440   {
8441     { VEX_W_TABLE (VEX_W_10_P_1) },
8442     { "(bad)",          { XX } },
8443   },
8444
8445   /* VEX_LEN_10_P_3 */
8446   {
8447     { VEX_W_TABLE (VEX_W_10_P_3) },
8448     { "(bad)",          { XX } },
8449   },
8450
8451   /* VEX_LEN_11_P_1 */
8452   {
8453     { VEX_W_TABLE (VEX_W_11_P_1) },
8454     { "(bad)",          { XX } },
8455   },
8456
8457   /* VEX_LEN_11_P_3 */
8458   {
8459     { VEX_W_TABLE (VEX_W_11_P_3) },
8460     { "(bad)",          { XX } },
8461   },
8462
8463   /* VEX_LEN_12_P_0_M_0 */
8464   {
8465     { VEX_W_TABLE (VEX_W_12_P_0_M_0) },
8466     { "(bad)",          { XX } },
8467   },
8468
8469   /* VEX_LEN_12_P_0_M_1 */
8470   {
8471     { VEX_W_TABLE (VEX_W_12_P_0_M_1) },
8472     { "(bad)",          { XX } },
8473   },
8474
8475   /* VEX_LEN_12_P_2 */
8476   {
8477     { VEX_W_TABLE (VEX_W_12_P_2) },
8478     { "(bad)",          { XX } },
8479   },
8480
8481   /* VEX_LEN_13_M_0 */
8482   {
8483     { VEX_W_TABLE (VEX_W_13_M_0) },
8484     { "(bad)",          { XX } },
8485   },
8486
8487   /* VEX_LEN_16_P_0_M_0 */
8488   {
8489     { VEX_W_TABLE (VEX_W_16_P_0_M_0) },
8490     { "(bad)",          { XX } },
8491   },
8492
8493   /* VEX_LEN_16_P_0_M_1 */
8494   {
8495     { VEX_W_TABLE (VEX_W_16_P_0_M_1) },
8496     { "(bad)",          { XX } },
8497   },
8498
8499   /* VEX_LEN_16_P_2 */
8500   {
8501     { VEX_W_TABLE (VEX_W_16_P_2) },
8502     { "(bad)",          { XX } },
8503   },
8504
8505   /* VEX_LEN_17_M_0 */
8506   {
8507     { VEX_W_TABLE (VEX_W_17_M_0) },
8508     { "(bad)",          { XX } },
8509   },
8510
8511   /* VEX_LEN_2A_P_1 */
8512   {
8513     { "vcvtsi2ss%LQ",   { XM, Vex128, Ev } },
8514     { "(bad)",          { XX } },
8515   },
8516
8517   /* VEX_LEN_2A_P_3 */
8518   {
8519     { "vcvtsi2sd%LQ",   { XM, Vex128, Ev } },
8520     { "(bad)",          { XX } },
8521   },
8522
8523   /* VEX_LEN_2C_P_1 */
8524   {
8525     { "vcvttss2siY",    { Gv, EXd } },
8526     { "(bad)",          { XX } },
8527   },
8528
8529   /* VEX_LEN_2C_P_3 */
8530   {
8531     { "vcvttsd2siY",    { Gv, EXq } },
8532     { "(bad)",          { XX } },
8533   },
8534
8535   /* VEX_LEN_2D_P_1 */
8536   {
8537     { "vcvtss2siY",     { Gv, EXd } },
8538     { "(bad)",          { XX } },
8539   },
8540
8541   /* VEX_LEN_2D_P_3 */
8542   {
8543     { "vcvtsd2siY",     { Gv, EXq } },
8544     { "(bad)",          { XX } },
8545   },
8546
8547   /* VEX_LEN_2E_P_0 */
8548   {
8549     { VEX_W_TABLE (VEX_W_2E_P_0) },
8550     { "(bad)",          { XX } },
8551   },
8552
8553   /* VEX_LEN_2E_P_2 */
8554   {
8555     { VEX_W_TABLE (VEX_W_2E_P_2) },
8556     { "(bad)",          { XX } },
8557   },
8558
8559   /* VEX_LEN_2F_P_0 */
8560   {
8561     { VEX_W_TABLE (VEX_W_2F_P_0) },
8562     { "(bad)",          { XX } },
8563   },
8564
8565   /* VEX_LEN_2F_P_2 */
8566   {
8567     { VEX_W_TABLE (VEX_W_2F_P_2) },
8568     { "(bad)",          { XX } },
8569   },
8570
8571   /* VEX_LEN_51_P_1 */
8572   {
8573     { VEX_W_TABLE (VEX_W_51_P_1) },
8574     { "(bad)",          { XX } },
8575   },
8576
8577   /* VEX_LEN_51_P_3 */
8578   {
8579     { VEX_W_TABLE (VEX_W_51_P_3) },
8580     { "(bad)",          { XX } },
8581   },
8582
8583   /* VEX_LEN_52_P_1 */
8584   {
8585     { VEX_W_TABLE (VEX_W_52_P_1) },
8586     { "(bad)",          { XX } },
8587   },
8588
8589   /* VEX_LEN_53_P_1 */
8590   {
8591     { VEX_W_TABLE (VEX_W_53_P_1) },
8592     { "(bad)",          { XX } },
8593   },
8594
8595   /* VEX_LEN_58_P_1 */
8596   {
8597     { VEX_W_TABLE (VEX_W_58_P_1) },
8598     { "(bad)",          { XX } },
8599   },
8600
8601   /* VEX_LEN_58_P_3 */
8602   {
8603     { VEX_W_TABLE (VEX_W_58_P_3) },
8604     { "(bad)",          { XX } },
8605   },
8606
8607   /* VEX_LEN_59_P_1 */
8608   {
8609     { VEX_W_TABLE (VEX_W_59_P_1) },
8610     { "(bad)",          { XX } },
8611   },
8612
8613   /* VEX_LEN_59_P_3 */
8614   {
8615     { VEX_W_TABLE (VEX_W_59_P_3) },
8616     { "(bad)",          { XX } },
8617   },
8618
8619   /* VEX_LEN_5A_P_1 */
8620   {
8621     { VEX_W_TABLE (VEX_W_5A_P_1) },
8622     { "(bad)",          { XX } },
8623   },
8624
8625   /* VEX_LEN_5A_P_3 */
8626   {
8627     { VEX_W_TABLE (VEX_W_5A_P_3) },
8628     { "(bad)",          { XX } },
8629   },
8630
8631   /* VEX_LEN_5C_P_1 */
8632   {
8633     { VEX_W_TABLE (VEX_W_5C_P_1) },
8634     { "(bad)",          { XX } },
8635   },
8636
8637   /* VEX_LEN_5C_P_3 */
8638   {
8639     { VEX_W_TABLE (VEX_W_5C_P_3) },
8640     { "(bad)",          { XX } },
8641   },
8642
8643   /* VEX_LEN_5D_P_1 */
8644   {
8645     { VEX_W_TABLE (VEX_W_5D_P_1) },
8646     { "(bad)",          { XX } },
8647   },
8648
8649   /* VEX_LEN_5D_P_3 */
8650   {
8651     { VEX_W_TABLE (VEX_W_5D_P_3) },
8652     { "(bad)",          { XX } },
8653   },
8654
8655   /* VEX_LEN_5E_P_1 */
8656   {
8657     { VEX_W_TABLE (VEX_W_5E_P_1) },
8658     { "(bad)",          { XX } },
8659   },
8660
8661   /* VEX_LEN_5E_P_3 */
8662   {
8663     { VEX_W_TABLE (VEX_W_5E_P_3) },
8664     { "(bad)",          { XX } },
8665   },
8666
8667   /* VEX_LEN_5F_P_1 */
8668   {
8669     { VEX_W_TABLE (VEX_W_5F_P_1) },
8670     { "(bad)",          { XX } },
8671   },
8672
8673   /* VEX_LEN_5F_P_3 */
8674   {
8675     { VEX_W_TABLE (VEX_W_5F_P_3) },
8676     { "(bad)",          { XX } },
8677   },
8678
8679   /* VEX_LEN_60_P_2 */
8680   {
8681     { VEX_W_TABLE (VEX_W_60_P_2) },
8682     { "(bad)",          { XX } },
8683   },
8684
8685   /* VEX_LEN_61_P_2 */
8686   {
8687     { VEX_W_TABLE (VEX_W_61_P_2) },
8688     { "(bad)",          { XX } },
8689   },
8690
8691   /* VEX_LEN_62_P_2 */
8692   {
8693     { VEX_W_TABLE (VEX_W_62_P_2) },
8694     { "(bad)",          { XX } },
8695   },
8696
8697   /* VEX_LEN_63_P_2 */
8698   {
8699     { VEX_W_TABLE (VEX_W_63_P_2) },
8700     { "(bad)",          { XX } },
8701   },
8702
8703   /* VEX_LEN_64_P_2 */
8704   {
8705     { VEX_W_TABLE (VEX_W_64_P_2) },
8706     { "(bad)",          { XX } },
8707   },
8708
8709   /* VEX_LEN_65_P_2 */
8710   {
8711     { VEX_W_TABLE (VEX_W_65_P_2) },
8712     { "(bad)",          { XX } },
8713   },
8714
8715   /* VEX_LEN_66_P_2 */
8716   {
8717     { VEX_W_TABLE (VEX_W_66_P_2) },
8718     { "(bad)",          { XX } },
8719   },
8720
8721   /* VEX_LEN_67_P_2 */
8722   {
8723     { VEX_W_TABLE (VEX_W_67_P_2) },
8724     { "(bad)",          { XX } },
8725   },
8726
8727   /* VEX_LEN_68_P_2 */
8728   {
8729     { VEX_W_TABLE (VEX_W_68_P_2) },
8730     { "(bad)",          { XX } },
8731   },
8732
8733   /* VEX_LEN_69_P_2 */
8734   {
8735     { VEX_W_TABLE (VEX_W_69_P_2) },
8736     { "(bad)",          { XX } },
8737   },
8738
8739   /* VEX_LEN_6A_P_2 */
8740   {
8741     { VEX_W_TABLE (VEX_W_6A_P_2) },
8742     { "(bad)",          { XX } },
8743   },
8744
8745   /* VEX_LEN_6B_P_2 */
8746   {
8747     { VEX_W_TABLE (VEX_W_6B_P_2) },
8748     { "(bad)",          { XX } },
8749   },
8750
8751   /* VEX_LEN_6C_P_2 */
8752   {
8753     { VEX_W_TABLE (VEX_W_6C_P_2) },
8754     { "(bad)",          { XX } },
8755   },
8756
8757   /* VEX_LEN_6D_P_2 */
8758   {
8759     { VEX_W_TABLE (VEX_W_6D_P_2) },
8760     { "(bad)",          { XX } },
8761   },
8762
8763   /* VEX_LEN_6E_P_2 */
8764   {
8765     { "vmovK",          { XM, Edq } },
8766     { "(bad)",          { XX } },
8767   },
8768
8769   /* VEX_LEN_70_P_1 */
8770   {
8771     { VEX_W_TABLE (VEX_W_70_P_1) },
8772     { "(bad)",          { XX } },
8773   },
8774
8775   /* VEX_LEN_70_P_2 */
8776   {
8777     { VEX_W_TABLE (VEX_W_70_P_2) },
8778     { "(bad)",          { XX } },
8779   },
8780
8781   /* VEX_LEN_70_P_3 */
8782   {
8783     { VEX_W_TABLE (VEX_W_70_P_3) },
8784     { "(bad)",          { XX } },
8785   },
8786
8787   /* VEX_LEN_71_R_2_P_2 */
8788   {
8789     { VEX_W_TABLE (VEX_W_71_R_2_P_2) },
8790     { "(bad)",          { XX } },
8791   },
8792
8793   /* VEX_LEN_71_R_4_P_2 */
8794   {
8795     { VEX_W_TABLE (VEX_W_71_R_4_P_2) },
8796     { "(bad)",          { XX } },
8797   },
8798
8799   /* VEX_LEN_71_R_6_P_2 */
8800   {
8801     { VEX_W_TABLE (VEX_W_71_R_6_P_2) },
8802     { "(bad)",          { XX } },
8803   },
8804
8805   /* VEX_LEN_72_R_2_P_2 */
8806   {
8807     { VEX_W_TABLE (VEX_W_72_R_2_P_2) },
8808     { "(bad)",          { XX } },
8809   },
8810
8811   /* VEX_LEN_72_R_4_P_2 */
8812   {
8813     { VEX_W_TABLE (VEX_W_72_R_4_P_2) },
8814     { "(bad)",          { XX } },
8815   },
8816
8817   /* VEX_LEN_72_R_6_P_2 */
8818   {
8819     { VEX_W_TABLE (VEX_W_72_R_6_P_2) },
8820     { "(bad)",          { XX } },
8821   },
8822
8823   /* VEX_LEN_73_R_2_P_2 */
8824   {
8825     { VEX_W_TABLE (VEX_W_73_R_2_P_2) },
8826     { "(bad)",          { XX } },
8827   },
8828
8829   /* VEX_LEN_73_R_3_P_2 */
8830   {
8831     { VEX_W_TABLE (VEX_W_73_R_3_P_2) },
8832     { "(bad)",          { XX } },
8833   },
8834
8835   /* VEX_LEN_73_R_6_P_2 */
8836   {
8837     { VEX_W_TABLE (VEX_W_73_R_6_P_2) },
8838     { "(bad)",          { XX } },
8839   },
8840
8841   /* VEX_LEN_73_R_7_P_2 */
8842   {
8843     { VEX_W_TABLE (VEX_W_73_R_7_P_2) },
8844     { "(bad)",          { XX } },
8845   },
8846
8847   /* VEX_LEN_74_P_2 */
8848   {
8849     { VEX_W_TABLE (VEX_W_74_P_2) },
8850     { "(bad)",          { XX } },
8851   },
8852
8853   /* VEX_LEN_75_P_2 */
8854   {
8855     { VEX_W_TABLE (VEX_W_75_P_2) },
8856     { "(bad)",          { XX } },
8857   },
8858
8859   /* VEX_LEN_76_P_2 */
8860   {
8861     { VEX_W_TABLE (VEX_W_76_P_2) },
8862     { "(bad)",          { XX } },
8863   },
8864
8865   /* VEX_LEN_7E_P_1 */
8866   {
8867     { VEX_W_TABLE (VEX_W_7E_P_1) },
8868     { "(bad)",          { XX } },
8869   },
8870
8871   /* VEX_LEN_7E_P_2 */
8872   {
8873     { "vmovK",          { Edq, XM } },
8874     { "(bad)",          { XX } },
8875   },
8876
8877   /* VEX_LEN_AE_R_2_M_0 */
8878   {
8879     { VEX_W_TABLE (VEX_W_AE_R_2_M_0) },
8880     { "(bad)",          { XX } },
8881   },
8882
8883   /* VEX_LEN_AE_R_3_M_0 */
8884   {
8885     { VEX_W_TABLE (VEX_W_AE_R_3_M_0) },
8886     { "(bad)",          { XX } },
8887   },
8888
8889   /* VEX_LEN_C2_P_1 */
8890   {
8891     { VEX_W_TABLE (VEX_W_C2_P_1) },
8892     { "(bad)",          { XX } },
8893   },
8894
8895   /* VEX_LEN_C2_P_3 */
8896   {
8897     { VEX_W_TABLE (VEX_W_C2_P_3) },
8898     { "(bad)",          { XX } },
8899   },
8900
8901   /* VEX_LEN_C4_P_2 */
8902   {
8903     { VEX_W_TABLE (VEX_W_C4_P_2) },
8904     { "(bad)",          { XX } },
8905   },
8906
8907   /* VEX_LEN_C5_P_2 */
8908   {
8909     { VEX_W_TABLE (VEX_W_C5_P_2) },
8910     { "(bad)",          { XX } },
8911   },
8912
8913   /* VEX_LEN_D1_P_2 */
8914   {
8915     { VEX_W_TABLE (VEX_W_D1_P_2) },
8916     { "(bad)",          { XX } },
8917   },
8918
8919   /* VEX_LEN_D2_P_2 */
8920   {
8921     { VEX_W_TABLE (VEX_W_D2_P_2) },
8922     { "(bad)",          { XX } },
8923   },
8924
8925   /* VEX_LEN_D3_P_2 */
8926   {
8927     { VEX_W_TABLE (VEX_W_D3_P_2) },
8928     { "(bad)",          { XX } },
8929   },
8930
8931   /* VEX_LEN_D4_P_2 */
8932   {
8933     { VEX_W_TABLE (VEX_W_D4_P_2) },
8934     { "(bad)",          { XX } },
8935   },
8936
8937   /* VEX_LEN_D5_P_2 */
8938   {
8939     { VEX_W_TABLE (VEX_W_D5_P_2) },
8940     { "(bad)",          { XX } },
8941   },
8942
8943   /* VEX_LEN_D6_P_2 */
8944   {
8945     { VEX_W_TABLE (VEX_W_D6_P_2) },
8946     { "(bad)",          { XX } },
8947   },
8948
8949   /* VEX_LEN_D7_P_2_M_1 */
8950   {
8951     { VEX_W_TABLE (VEX_W_D7_P_2_M_1) },
8952     { "(bad)",          { XX } },
8953   },
8954
8955   /* VEX_LEN_D8_P_2 */
8956   {
8957     { VEX_W_TABLE (VEX_W_D8_P_2) },
8958     { "(bad)",          { XX } },
8959   },
8960
8961   /* VEX_LEN_D9_P_2 */
8962   {
8963     { VEX_W_TABLE (VEX_W_D9_P_2) },
8964     { "(bad)",          { XX } },
8965   },
8966
8967   /* VEX_LEN_DA_P_2 */
8968   {
8969     { VEX_W_TABLE (VEX_W_DA_P_2) },
8970     { "(bad)",          { XX } },
8971   },
8972
8973   /* VEX_LEN_DB_P_2 */
8974   {
8975     { VEX_W_TABLE (VEX_W_DB_P_2) },
8976     { "(bad)",          { XX } },
8977   },
8978
8979   /* VEX_LEN_DC_P_2 */
8980   {
8981     { VEX_W_TABLE (VEX_W_DC_P_2) },
8982     { "(bad)",          { XX } },
8983   },
8984
8985   /* VEX_LEN_DD_P_2 */
8986   {
8987     { VEX_W_TABLE (VEX_W_DD_P_2) },
8988     { "(bad)",          { XX } },
8989   },
8990
8991   /* VEX_LEN_DE_P_2 */
8992   {
8993     { VEX_W_TABLE (VEX_W_DE_P_2) },
8994     { "(bad)",          { XX } },
8995   },
8996
8997   /* VEX_LEN_DF_P_2 */
8998   {
8999     { VEX_W_TABLE (VEX_W_DF_P_2) },
9000     { "(bad)",          { XX } },
9001   },
9002
9003   /* VEX_LEN_E0_P_2 */
9004   {
9005     { VEX_W_TABLE (VEX_W_E0_P_2) },
9006     { "(bad)",          { XX } },
9007   },
9008
9009   /* VEX_LEN_E1_P_2 */
9010   {
9011     { VEX_W_TABLE (VEX_W_E1_P_2) },
9012     { "(bad)",          { XX } },
9013   },
9014
9015   /* VEX_LEN_E2_P_2 */
9016   {
9017     { VEX_W_TABLE (VEX_W_E2_P_2) },
9018     { "(bad)",          { XX } },
9019   },
9020
9021   /* VEX_LEN_E3_P_2 */
9022   {
9023     { VEX_W_TABLE (VEX_W_E3_P_2) },
9024     { "(bad)",          { XX } },
9025   },
9026
9027   /* VEX_LEN_E4_P_2 */
9028   {
9029     { VEX_W_TABLE (VEX_W_E4_P_2) },
9030     { "(bad)",          { XX } },
9031   },
9032
9033   /* VEX_LEN_E5_P_2 */
9034   {
9035     { VEX_W_TABLE (VEX_W_E5_P_2) },
9036     { "(bad)",          { XX } },
9037   },
9038
9039   /* VEX_LEN_E8_P_2 */
9040   {
9041     { VEX_W_TABLE (VEX_W_E8_P_2) },
9042     { "(bad)",          { XX } },
9043   },
9044
9045   /* VEX_LEN_E9_P_2 */
9046   {
9047     { VEX_W_TABLE (VEX_W_E9_P_2) },
9048     { "(bad)",          { XX } },
9049   },
9050
9051   /* VEX_LEN_EA_P_2 */
9052   {
9053     { VEX_W_TABLE (VEX_W_EA_P_2) },
9054     { "(bad)",          { XX } },
9055   },
9056
9057   /* VEX_LEN_EB_P_2 */
9058   {
9059     { VEX_W_TABLE (VEX_W_EB_P_2) },
9060     { "(bad)",          { XX } },
9061   },
9062
9063   /* VEX_LEN_EC_P_2 */
9064   {
9065     { VEX_W_TABLE (VEX_W_EC_P_2) },
9066     { "(bad)",          { XX } },
9067   },
9068
9069   /* VEX_LEN_ED_P_2 */
9070   {
9071     { VEX_W_TABLE (VEX_W_ED_P_2) },
9072     { "(bad)",          { XX } },
9073   },
9074
9075   /* VEX_LEN_EE_P_2 */
9076   {
9077     { VEX_W_TABLE (VEX_W_EE_P_2) },
9078     { "(bad)",          { XX } },
9079   },
9080
9081   /* VEX_LEN_EF_P_2 */
9082   {
9083     { VEX_W_TABLE (VEX_W_EF_P_2) },
9084     { "(bad)",          { XX } },
9085   },
9086
9087   /* VEX_LEN_F1_P_2 */
9088   {
9089     { VEX_W_TABLE (VEX_W_F1_P_2) },
9090     { "(bad)",          { XX } },
9091   },
9092
9093   /* VEX_LEN_F2_P_2 */
9094   {
9095     { VEX_W_TABLE (VEX_W_F2_P_2) },
9096     { "(bad)",          { XX } },
9097   },
9098
9099   /* VEX_LEN_F3_P_2 */
9100   {
9101     { VEX_W_TABLE (VEX_W_F3_P_2) },
9102     { "(bad)",          { XX } },
9103   },
9104
9105   /* VEX_LEN_F4_P_2 */
9106   {
9107     { VEX_W_TABLE (VEX_W_F4_P_2) },
9108     { "(bad)",          { XX } },
9109   },
9110
9111   /* VEX_LEN_F5_P_2 */
9112   {
9113     { VEX_W_TABLE (VEX_W_F5_P_2) },
9114     { "(bad)",          { XX } },
9115   },
9116
9117   /* VEX_LEN_F6_P_2 */
9118   {
9119     { VEX_W_TABLE (VEX_W_F6_P_2) },
9120     { "(bad)",          { XX } },
9121   },
9122
9123   /* VEX_LEN_F7_P_2 */
9124   {
9125     { VEX_W_TABLE (VEX_W_F7_P_2) },
9126     { "(bad)",          { XX } },
9127   },
9128
9129   /* VEX_LEN_F8_P_2 */
9130   {
9131     { VEX_W_TABLE (VEX_W_F8_P_2) },
9132     { "(bad)",          { XX } },
9133   },
9134
9135   /* VEX_LEN_F9_P_2 */
9136   {
9137     { VEX_W_TABLE (VEX_W_F9_P_2) },
9138     { "(bad)",          { XX } },
9139   },
9140
9141   /* VEX_LEN_FA_P_2 */
9142   {
9143     { VEX_W_TABLE (VEX_W_FA_P_2) },
9144     { "(bad)",          { XX } },
9145   },
9146
9147   /* VEX_LEN_FB_P_2 */
9148   {
9149     { VEX_W_TABLE (VEX_W_FB_P_2) },
9150     { "(bad)",          { XX } },
9151   },
9152
9153   /* VEX_LEN_FC_P_2 */
9154   {
9155     { VEX_W_TABLE (VEX_W_FC_P_2) },
9156     { "(bad)",          { XX } },
9157   },
9158
9159   /* VEX_LEN_FD_P_2 */
9160   {
9161     { VEX_W_TABLE (VEX_W_FD_P_2) },
9162     { "(bad)",          { XX } },
9163   },
9164
9165   /* VEX_LEN_FE_P_2 */
9166   {
9167     { VEX_W_TABLE (VEX_W_FE_P_2) },
9168     { "(bad)",          { XX } },
9169   },
9170
9171   /* VEX_LEN_3800_P_2 */
9172   {
9173     { VEX_W_TABLE (VEX_W_3800_P_2) },
9174     { "(bad)",          { XX } },
9175   },
9176
9177   /* VEX_LEN_3801_P_2 */
9178   {
9179     { VEX_W_TABLE (VEX_W_3801_P_2) },
9180     { "(bad)",          { XX } },
9181   },
9182
9183   /* VEX_LEN_3802_P_2 */
9184   {
9185     { VEX_W_TABLE (VEX_W_3802_P_2) },
9186     { "(bad)",          { XX } },
9187   },
9188
9189   /* VEX_LEN_3803_P_2 */
9190   {
9191     { VEX_W_TABLE (VEX_W_3803_P_2) },
9192     { "(bad)",          { XX } },
9193   },
9194
9195   /* VEX_LEN_3804_P_2 */
9196   {
9197     { VEX_W_TABLE (VEX_W_3804_P_2) },
9198     { "(bad)",          { XX } },
9199   },
9200
9201   /* VEX_LEN_3805_P_2 */
9202   {
9203     { VEX_W_TABLE (VEX_W_3805_P_2) },
9204     { "(bad)",          { XX } },
9205   },
9206
9207   /* VEX_LEN_3806_P_2 */
9208   {
9209     { VEX_W_TABLE (VEX_W_3806_P_2) },
9210     { "(bad)",          { XX } },
9211   },
9212
9213   /* VEX_LEN_3807_P_2 */
9214   {
9215     { VEX_W_TABLE (VEX_W_3807_P_2) },
9216     { "(bad)",          { XX } },
9217   },
9218
9219   /* VEX_LEN_3808_P_2 */
9220   {
9221     { VEX_W_TABLE (VEX_W_3808_P_2) },
9222     { "(bad)",          { XX } },
9223   },
9224
9225   /* VEX_LEN_3809_P_2 */
9226   {
9227     { VEX_W_TABLE (VEX_W_3809_P_2) },
9228     { "(bad)",          { XX } },
9229   },
9230
9231   /* VEX_LEN_380A_P_2 */
9232   {
9233     { VEX_W_TABLE (VEX_W_380A_P_2) },
9234     { "(bad)",          { XX } },
9235   },
9236
9237   /* VEX_LEN_380B_P_2 */
9238   {
9239     { VEX_W_TABLE (VEX_W_380B_P_2) },
9240     { "(bad)",          { XX } },
9241   },
9242
9243   /* VEX_LEN_3819_P_2_M_0 */
9244   {
9245     { "(bad)",          { XX } },
9246     { VEX_W_TABLE (VEX_W_3819_P_2_M_0) },
9247   },
9248
9249   /* VEX_LEN_381A_P_2_M_0 */
9250   {
9251     { "(bad)",          { XX } },
9252     { VEX_W_TABLE (VEX_W_381A_P_2_M_0) },
9253   },
9254
9255   /* VEX_LEN_381C_P_2 */
9256   {
9257     { VEX_W_TABLE (VEX_W_381C_P_2) },
9258     { "(bad)",          { XX } },
9259   },
9260
9261   /* VEX_LEN_381D_P_2 */
9262   {
9263     { VEX_W_TABLE (VEX_W_381D_P_2) },
9264     { "(bad)",          { XX } },
9265   },
9266
9267   /* VEX_LEN_381E_P_2 */
9268   {
9269     { VEX_W_TABLE (VEX_W_381E_P_2) },
9270     { "(bad)",          { XX } },
9271   },
9272
9273   /* VEX_LEN_3820_P_2 */
9274   {
9275     { VEX_W_TABLE (VEX_W_3820_P_2) },
9276     { "(bad)",          { XX } },
9277   },
9278
9279   /* VEX_LEN_3821_P_2 */
9280   {
9281     { VEX_W_TABLE (VEX_W_3821_P_2) },
9282     { "(bad)",          { XX } },
9283   },
9284
9285   /* VEX_LEN_3822_P_2 */
9286   {
9287     { VEX_W_TABLE (VEX_W_3822_P_2) },
9288     { "(bad)",          { XX } },
9289   },
9290
9291   /* VEX_LEN_3823_P_2 */
9292   {
9293     { VEX_W_TABLE (VEX_W_3823_P_2) },
9294     { "(bad)",          { XX } },
9295   },
9296
9297   /* VEX_LEN_3824_P_2 */
9298   {
9299     { VEX_W_TABLE (VEX_W_3824_P_2) },
9300     { "(bad)",          { XX } },
9301   },
9302
9303   /* VEX_LEN_3825_P_2 */
9304   {
9305     { VEX_W_TABLE (VEX_W_3825_P_2) },
9306     { "(bad)",          { XX } },
9307   },
9308
9309   /* VEX_LEN_3828_P_2 */
9310   {
9311     { VEX_W_TABLE (VEX_W_3828_P_2) },
9312     { "(bad)",          { XX } },
9313   },
9314
9315   /* VEX_LEN_3829_P_2 */
9316   {
9317     { VEX_W_TABLE (VEX_W_3829_P_2) },
9318     { "(bad)",          { XX } },
9319   },
9320
9321   /* VEX_LEN_382A_P_2_M_0 */
9322   {
9323     { VEX_W_TABLE (VEX_W_382A_P_2_M_0) },
9324     { "(bad)",          { XX } },
9325   },
9326
9327   /* VEX_LEN_382B_P_2 */
9328   {
9329     { VEX_W_TABLE (VEX_W_382B_P_2) },
9330     { "(bad)",          { XX } },
9331   },
9332
9333   /* VEX_LEN_3830_P_2 */
9334   {
9335     { VEX_W_TABLE (VEX_W_3830_P_2) },
9336     { "(bad)",          { XX } },
9337   },
9338
9339   /* VEX_LEN_3831_P_2 */
9340   {
9341     { VEX_W_TABLE (VEX_W_3831_P_2) },
9342     { "(bad)",          { XX } },
9343   },
9344
9345   /* VEX_LEN_3832_P_2 */
9346   {
9347     { VEX_W_TABLE (VEX_W_3832_P_2) },
9348     { "(bad)",          { XX } },
9349   },
9350
9351   /* VEX_LEN_3833_P_2 */
9352   {
9353     { VEX_W_TABLE (VEX_W_3833_P_2) },
9354     { "(bad)",          { XX } },
9355   },
9356
9357   /* VEX_LEN_3834_P_2 */
9358   {
9359     { VEX_W_TABLE (VEX_W_3834_P_2) },
9360     { "(bad)",          { XX } },
9361   },
9362
9363   /* VEX_LEN_3835_P_2 */
9364   {
9365     { VEX_W_TABLE (VEX_W_3835_P_2) },
9366     { "(bad)",          { XX } },
9367   },
9368
9369   /* VEX_LEN_3837_P_2 */
9370   {
9371     { VEX_W_TABLE (VEX_W_3837_P_2) },
9372     { "(bad)",          { XX } },
9373   },
9374
9375   /* VEX_LEN_3838_P_2 */
9376   {
9377     { VEX_W_TABLE (VEX_W_3838_P_2) },
9378     { "(bad)",          { XX } },
9379   },
9380
9381   /* VEX_LEN_3839_P_2 */
9382   {
9383     { VEX_W_TABLE (VEX_W_3839_P_2) },
9384     { "(bad)",          { XX } },
9385   },
9386
9387   /* VEX_LEN_383A_P_2 */
9388   {
9389     { VEX_W_TABLE (VEX_W_383A_P_2) },
9390     { "(bad)",          { XX } },
9391   },
9392
9393   /* VEX_LEN_383B_P_2 */
9394   {
9395     { VEX_W_TABLE (VEX_W_383B_P_2) },
9396     { "(bad)",          { XX } },
9397   },
9398
9399   /* VEX_LEN_383C_P_2 */
9400   {
9401     { VEX_W_TABLE (VEX_W_383C_P_2) },
9402     { "(bad)",          { XX } },
9403   },
9404
9405   /* VEX_LEN_383D_P_2 */
9406   {
9407     { VEX_W_TABLE (VEX_W_383D_P_2) },
9408     { "(bad)",          { XX } },
9409   },
9410
9411   /* VEX_LEN_383E_P_2 */
9412   {
9413     { VEX_W_TABLE (VEX_W_383E_P_2) },
9414     { "(bad)",          { XX } },
9415   },
9416
9417   /* VEX_LEN_383F_P_2 */
9418   {
9419     { VEX_W_TABLE (VEX_W_383F_P_2) },
9420     { "(bad)",          { XX } },
9421   },
9422
9423   /* VEX_LEN_3840_P_2 */
9424   {
9425     { VEX_W_TABLE (VEX_W_3840_P_2) },
9426     { "(bad)",          { XX } },
9427   },
9428
9429   /* VEX_LEN_3841_P_2 */
9430   {
9431     { VEX_W_TABLE (VEX_W_3841_P_2) },
9432     { "(bad)",          { XX } },
9433   },
9434
9435   /* VEX_LEN_38DB_P_2 */
9436   {
9437     { VEX_W_TABLE (VEX_W_38DB_P_2) },
9438     { "(bad)",          { XX } },
9439   },
9440
9441   /* VEX_LEN_38DC_P_2 */
9442   {
9443     { VEX_W_TABLE (VEX_W_38DC_P_2) },
9444     { "(bad)",          { XX } },
9445   },
9446
9447   /* VEX_LEN_38DD_P_2 */
9448   {
9449     { VEX_W_TABLE (VEX_W_38DD_P_2) },
9450     { "(bad)",          { XX } },
9451   },
9452
9453   /* VEX_LEN_38DE_P_2 */
9454   {
9455     { VEX_W_TABLE (VEX_W_38DE_P_2) },
9456     { "(bad)",          { XX } },
9457   },
9458
9459   /* VEX_LEN_38DF_P_2 */
9460   {
9461     { VEX_W_TABLE (VEX_W_38DF_P_2) },
9462     { "(bad)",          { XX } },
9463   },
9464
9465   /* VEX_LEN_3A06_P_2 */
9466   {
9467     { "(bad)",          { XX } },
9468     { VEX_W_TABLE (VEX_W_3A06_P_2) },
9469   },
9470
9471   /* VEX_LEN_3A0A_P_2 */
9472   {
9473     { VEX_W_TABLE (VEX_W_3A0A_P_2) },
9474     { "(bad)",          { XX } },
9475   },
9476
9477   /* VEX_LEN_3A0B_P_2 */
9478   {
9479     { VEX_W_TABLE (VEX_W_3A0B_P_2) },
9480     { "(bad)",          { XX } },
9481   },
9482
9483   /* VEX_LEN_3A0E_P_2 */
9484   {
9485     { VEX_W_TABLE (VEX_W_3A0E_P_2) },
9486     { "(bad)",          { XX } },
9487   },
9488
9489   /* VEX_LEN_3A0F_P_2 */
9490   {
9491     { VEX_W_TABLE (VEX_W_3A0F_P_2) },
9492     { "(bad)",          { XX } },
9493   },
9494
9495   /* VEX_LEN_3A14_P_2 */
9496   {
9497     { VEX_W_TABLE (VEX_W_3A14_P_2) },
9498     { "(bad)",          { XX } },
9499   },
9500
9501   /* VEX_LEN_3A15_P_2 */
9502   {
9503     { VEX_W_TABLE (VEX_W_3A15_P_2) },
9504     { "(bad)",          { XX } },
9505   },
9506
9507   /* VEX_LEN_3A16_P_2  */
9508   {
9509     { "vpextrK",        { Edq, XM, Ib } },
9510     { "(bad)",          { XX } },
9511   },
9512
9513   /* VEX_LEN_3A17_P_2 */
9514   {
9515     { "vextractps",     { Edqd, XM, Ib } },
9516     { "(bad)",          { XX } },
9517   },
9518
9519   /* VEX_LEN_3A18_P_2 */
9520   {
9521     { "(bad)",          { XX } },
9522     { VEX_W_TABLE (VEX_W_3A18_P_2) },
9523   },
9524
9525   /* VEX_LEN_3A19_P_2 */
9526   {
9527     { "(bad)",          { XX } },
9528     { VEX_W_TABLE (VEX_W_3A19_P_2) },
9529   },
9530
9531   /* VEX_LEN_3A20_P_2 */
9532   {
9533     { VEX_W_TABLE (VEX_W_3A20_P_2) },
9534     { "(bad)",          { XX } },
9535   },
9536
9537   /* VEX_LEN_3A21_P_2 */
9538   {
9539     { VEX_W_TABLE (VEX_W_3A21_P_2) },
9540     { "(bad)",          { XX } },
9541   },
9542
9543   /* VEX_LEN_3A22_P_2 */
9544   {
9545     { "vpinsrK",        { XM, Vex128, Edq, Ib } },
9546     { "(bad)",          { XX } },
9547   },
9548
9549   /* VEX_LEN_3A41_P_2 */
9550   {
9551     { VEX_W_TABLE (VEX_W_3A41_P_2) },
9552     { "(bad)",          { XX } },
9553   },
9554
9555   /* VEX_LEN_3A42_P_2 */
9556   {
9557     { VEX_W_TABLE (VEX_W_3A42_P_2) },
9558     { "(bad)",          { XX } },
9559   },
9560
9561   /* VEX_LEN_3A44_P_2 */
9562   {
9563     { VEX_W_TABLE (VEX_W_3A44_P_2) },
9564     { "(bad)",          { XX } },
9565   },
9566
9567   /* VEX_LEN_3A4C_P_2 */
9568   {
9569     { VEX_W_TABLE (VEX_W_3A4C_P_2) },
9570     { "(bad)",          { XX } },
9571   },
9572
9573   /* VEX_LEN_3A60_P_2 */
9574   {
9575     { VEX_W_TABLE (VEX_W_3A60_P_2) },
9576     { "(bad)",          { XX } },
9577   },
9578
9579   /* VEX_LEN_3A61_P_2 */
9580   {
9581     { VEX_W_TABLE (VEX_W_3A61_P_2) },
9582     { "(bad)",          { XX } },
9583   },
9584
9585   /* VEX_LEN_3A62_P_2 */
9586   {
9587     { VEX_W_TABLE (VEX_W_3A62_P_2) },
9588     { "(bad)",          { XX } },
9589   },
9590
9591   /* VEX_LEN_3A63_P_2 */
9592   {
9593     { VEX_W_TABLE (VEX_W_3A63_P_2) },
9594     { "(bad)",          { XX } },
9595   },
9596
9597   /* VEX_LEN_3A6A_P_2 */
9598   {
9599     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9600     { "(bad)",          { XX } },
9601   },
9602
9603   /* VEX_LEN_3A6B_P_2 */
9604   {
9605     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9606     { "(bad)",          { XX } },
9607   },
9608
9609   /* VEX_LEN_3A6E_P_2 */
9610   {
9611     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9612     { "(bad)",          { XX } },
9613   },
9614
9615   /* VEX_LEN_3A6F_P_2 */
9616   {
9617     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9618     { "(bad)",          { XX } },
9619   },
9620
9621   /* VEX_LEN_3A7A_P_2 */
9622   {
9623     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9624     { "(bad)",          { XX } },
9625   },
9626
9627   /* VEX_LEN_3A7B_P_2 */
9628   {
9629     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9630     { "(bad)",          { XX } },
9631   },
9632
9633   /* VEX_LEN_3A7E_P_2 */
9634   {
9635     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9636     { "(bad)",          { XX } },
9637   },
9638
9639   /* VEX_LEN_3A7F_P_2 */
9640   {
9641     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9642     { "(bad)",          { XX } },
9643   },
9644
9645   /* VEX_LEN_3ADF_P_2 */
9646   {
9647     { VEX_W_TABLE (VEX_W_3ADF_P_2) },
9648     { "(bad)",          { XX } },
9649   },
9650
9651   /* VEX_LEN_XOP_09_80 */
9652   {
9653     { "vfrczps",        { XM, EXxmm } },
9654     { "vfrczps",        { XM, EXymmq } },
9655   },
9656
9657   /* VEX_LEN_XOP_09_81 */
9658   {
9659     { "vfrczpd",        { XM, EXxmm } },
9660     { "vfrczpd",        { XM, EXymmq } },
9661   },
9662 };
9663
9664 static const struct dis386 vex_w_table[][2] = {
9665   {
9666     /* VEX_W_10_P_0 */
9667     { "vmovups",        { XM, EXx } },
9668     { "(bad)",          { XX } },
9669   },
9670   {
9671     /* VEX_W_10_P_1 */
9672     { "vmovss",         { XMVex, Vex128, EXd } },
9673     { "(bad)",          { XX } },
9674   },
9675   {
9676     /* VEX_W_10_P_2 */
9677     { "vmovupd",        { XM, EXx } },
9678     { "(bad)",          { XX } },
9679   },
9680   {
9681     /* VEX_W_10_P_3 */
9682     { "vmovsd",         { XMVex, Vex128, EXq } },
9683     { "(bad)",          { XX } },
9684   },
9685   {
9686     /* VEX_W_11_P_0 */
9687     { "vmovups",        { EXxS, XM } },
9688     { "(bad)",          { XX } },
9689   },
9690   {
9691     /* VEX_W_11_P_1 */
9692     { "vmovss",         { EXdVexS, Vex128, XM } },
9693     { "(bad)",          { XX } },
9694   },
9695   {
9696     /* VEX_W_11_P_2 */
9697     { "vmovupd",        { EXxS, XM } },
9698     { "(bad)",          { XX } },
9699   },
9700   {
9701     /* VEX_W_11_P_3 */
9702     { "vmovsd",         { EXqVexS, Vex128, XM } },
9703     { "(bad)",          { XX } },
9704   },
9705   {
9706     /* VEX_W_12_P_0_M_0 */
9707     { "vmovlps",        { XM, Vex128, EXq } },
9708     { "(bad)",          { XX } },
9709   },
9710   {
9711     /* VEX_W_12_P_0_M_1 */
9712     { "vmovhlps",       { XM, Vex128, EXq } },
9713     { "(bad)",          { XX } },
9714   },
9715   {
9716     /* VEX_W_12_P_1 */
9717     { "vmovsldup",      { XM, EXx } },
9718     { "(bad)",          { XX } },
9719   },
9720   {
9721     /* VEX_W_12_P_2 */
9722     { "vmovlpd",        { XM, Vex128, EXq } },
9723     { "(bad)",          { XX } },
9724   },
9725   {
9726     /* VEX_W_12_P_3 */
9727     { "vmovddup",       { XM, EXymmq } },
9728     { "(bad)",          { XX } },
9729   },
9730   {
9731     /* VEX_W_13_M_0 */
9732     { "vmovlpX",        { EXq, XM } },
9733     { "(bad)",          { XX } },
9734   },
9735   {
9736     /* VEX_W_14 */
9737     { "vunpcklpX",      { XM, Vex, EXx } },
9738     { "(bad)",          { XX } },
9739   },
9740   {
9741     /* VEX_W_15 */
9742     { "vunpckhpX",      { XM, Vex, EXx } },
9743     { "(bad)",          { XX } },
9744   },
9745   {
9746     /* VEX_W_16_P_0_M_0 */
9747     { "vmovhps",        { XM, Vex128, EXq } },
9748     { "(bad)",          { XX } },
9749   },
9750   {
9751     /* VEX_W_16_P_0_M_1 */
9752     { "vmovlhps",       { XM, Vex128, EXq } },
9753     { "(bad)",          { XX } },
9754   },
9755   {
9756     /* VEX_W_16_P_1 */
9757     { "vmovshdup",      { XM, EXx } },
9758     { "(bad)",          { XX } },
9759   },
9760   {
9761     /* VEX_W_16_P_2 */
9762     { "vmovhpd",        { XM, Vex128, EXq } },
9763     { "(bad)",          { XX } },
9764   },
9765   {
9766     /* VEX_W_17_M_0 */
9767     { "vmovhpX",        { EXq, XM } },
9768     { "(bad)",          { XX } },
9769   },
9770   {
9771     /* VEX_W_28 */
9772     { "vmovapX",        { XM, EXx } },
9773     { "(bad)",          { XX } },
9774   },
9775   {
9776     /* VEX_W_29 */
9777     { "vmovapX",        { EXxS, XM } },
9778     { "(bad)",          { XX } },
9779   },
9780   {
9781     /* VEX_W_2B_M_0 */
9782     { "vmovntpX",       { Mx, XM } },
9783     { "(bad)",          { XX } },
9784   },
9785   {
9786     /* VEX_W_2E_P_0 */
9787     { "vucomiss",       { XM, EXd } }, 
9788     { "(bad)",          { XX } },
9789   },
9790   {
9791     /* VEX_W_2E_P_2 */
9792     { "vucomisd",       { XM, EXq } }, 
9793     { "(bad)",          { XX } },
9794   },
9795   {
9796     /* VEX_W_2F_P_0 */
9797     { "vcomiss",        { XM, EXd } },
9798     { "(bad)",          { XX } },
9799   },
9800   {
9801     /* VEX_W_2F_P_2 */
9802     { "vcomisd",        { XM, EXq } },
9803     { "(bad)",          { XX } },
9804   },
9805   {
9806     /* VEX_W_50_M_0 */
9807     { "vmovmskpX",      { Gdq, XS } },
9808     { "(bad)",          { XX } },
9809   },
9810   {
9811     /* VEX_W_51_P_0 */
9812     { "vsqrtps",        { XM, EXx } },
9813     { "(bad)",          { XX } },
9814   },
9815   {
9816     /* VEX_W_51_P_1 */
9817     { "vsqrtss",        { XM, Vex128, EXd } },
9818     { "(bad)",          { XX } },
9819   },
9820   {
9821     /* VEX_W_51_P_2  */
9822     { "vsqrtpd",        { XM, EXx } },
9823     { "(bad)",          { XX } },
9824   },
9825   {
9826     /* VEX_W_51_P_3 */
9827     { "vsqrtsd",        { XM, Vex128, EXq } },
9828     { "(bad)",          { XX } },
9829   },
9830   {
9831     /* VEX_W_52_P_0 */
9832     { "vrsqrtps",       { XM, EXx } },
9833     { "(bad)",          { XX } },
9834   },
9835   {
9836     /* VEX_W_52_P_1 */
9837     { "vrsqrtss",       { XM, Vex128, EXd } },
9838     { "(bad)",          { XX } },
9839   },
9840   {
9841     /* VEX_W_53_P_0  */
9842     { "vrcpps",         { XM, EXx } },
9843     { "(bad)",          { XX } },
9844   },
9845   {
9846     /* VEX_W_53_P_1  */
9847     { "vrcpss",         { XM, Vex128, EXd } },
9848     { "(bad)",          { XX } },
9849   },
9850   {
9851     /* VEX_W_58_P_0  */
9852     { "vaddps",         { XM, Vex, EXx } },
9853     { "(bad)",          { XX } },
9854   },
9855   {
9856     /* VEX_W_58_P_1  */
9857     { "vaddss",         { XM, Vex128, EXd } },
9858     { "(bad)",          { XX } },
9859   },
9860   {
9861     /* VEX_W_58_P_2  */
9862     { "vaddpd",         { XM, Vex, EXx } },
9863     { "(bad)",          { XX } },
9864   },
9865   {
9866     /* VEX_W_58_P_3  */
9867     { "vaddsd",         { XM, Vex128, EXq } },
9868     { "(bad)",          { XX } },
9869   },
9870   {
9871     /* VEX_W_59_P_0  */
9872     { "vmulps",         { XM, Vex, EXx } },
9873     { "(bad)",          { XX } },
9874   },
9875   {
9876     /* VEX_W_59_P_1  */
9877     { "vmulss",         { XM, Vex128, EXd } },
9878     { "(bad)",          { XX } },
9879   },
9880   {
9881     /* VEX_W_59_P_2  */
9882     { "vmulpd",         { XM, Vex, EXx } },
9883     { "(bad)",          { XX } },
9884   },
9885   {
9886     /* VEX_W_59_P_3  */
9887     { "vmulsd",         { XM, Vex128, EXq } },
9888     { "(bad)",          { XX } },
9889   },
9890   {
9891     /* VEX_W_5A_P_0  */
9892     { "vcvtps2pd",      { XM, EXxmmq } },
9893     { "(bad)",          { XX } },
9894   },
9895   {
9896     /* VEX_W_5A_P_1  */
9897     { "vcvtss2sd",      { XM, Vex128, EXd } },
9898     { "(bad)",          { XX } },
9899   },
9900   {
9901     /* VEX_W_5A_P_3  */
9902     { "vcvtsd2ss",      { XM, Vex128, EXq } },
9903     { "(bad)",          { XX } },
9904   },
9905   {
9906     /* VEX_W_5B_P_0  */
9907     { "vcvtdq2ps",      { XM, EXx } },
9908     { "(bad)",          { XX } },
9909   },
9910   {
9911     /* VEX_W_5B_P_1  */
9912     { "vcvttps2dq",     { XM, EXx } },
9913     { "(bad)",          { XX } },
9914   },
9915   {
9916     /* VEX_W_5B_P_2  */
9917     { "vcvtps2dq",      { XM, EXx } },
9918     { "(bad)",          { XX } },
9919   },
9920   {
9921     /* VEX_W_5C_P_0  */
9922     { "vsubps",         { XM, Vex, EXx } },
9923     { "(bad)",          { XX } },
9924   },
9925   {
9926     /* VEX_W_5C_P_1  */
9927     { "vsubss",         { XM, Vex128, EXd } },
9928     { "(bad)",          { XX } },
9929   },
9930   {
9931     /* VEX_W_5C_P_2  */
9932     { "vsubpd",         { XM, Vex, EXx } },
9933     { "(bad)",          { XX } },
9934   },
9935   {
9936     /* VEX_W_5C_P_3  */
9937     { "vsubsd",         { XM, Vex128, EXq } },
9938     { "(bad)",          { XX } },
9939   },
9940   {
9941     /* VEX_W_5D_P_0  */
9942     { "vminps",         { XM, Vex, EXx } },
9943     { "(bad)",          { XX } },
9944   },
9945   {
9946     /* VEX_W_5D_P_1  */
9947     { "vminss",         { XM, Vex128, EXd } },
9948     { "(bad)",          { XX } },
9949   },
9950   {
9951     /* VEX_W_5D_P_2  */
9952     { "vminpd",         { XM, Vex, EXx } },
9953     { "(bad)",          { XX } },
9954   },
9955   {
9956     /* VEX_W_5D_P_3  */
9957     { "vminsd",         { XM, Vex128, EXq } },
9958     { "(bad)",          { XX } },
9959   },
9960   {
9961     /* VEX_W_5E_P_0  */
9962     { "vdivps",         { XM, Vex, EXx } },
9963     { "(bad)",          { XX } },
9964   },
9965   {
9966     /* VEX_W_5E_P_1  */
9967     { "vdivss",         { XM, Vex128, EXd } },
9968     { "(bad)",          { XX } },
9969   },
9970   {
9971     /* VEX_W_5E_P_2  */
9972     { "vdivpd",         { XM, Vex, EXx } },
9973     { "(bad)",          { XX } },
9974   },
9975   {
9976     /* VEX_W_5E_P_3  */
9977     { "vdivsd",         { XM, Vex128, EXq } },
9978     { "(bad)",          { XX } },
9979   },
9980   {
9981     /* VEX_W_5F_P_0  */
9982     { "vmaxps",         { XM, Vex, EXx } },
9983     { "(bad)",          { XX } },
9984   },
9985   {
9986     /* VEX_W_5F_P_1  */
9987     { "vmaxss",         { XM, Vex128, EXd } },
9988     { "(bad)",          { XX } },
9989   },
9990   {
9991     /* VEX_W_5F_P_2  */
9992     { "vmaxpd",         { XM, Vex, EXx } },
9993     { "(bad)",          { XX } },
9994   },
9995   {
9996     /* VEX_W_5F_P_3  */
9997     { "vmaxsd",         { XM, Vex128, EXq } },
9998     { "(bad)",          { XX } },
9999   },
10000   {
10001     /* VEX_W_60_P_2  */
10002     { "vpunpcklbw",     { XM, Vex128, EXx } },
10003     { "(bad)",          { XX } },
10004   },
10005   {
10006     /* VEX_W_61_P_2  */
10007     { "vpunpcklwd",     { XM, Vex128, EXx } },
10008     { "(bad)",          { XX } },
10009   },
10010   {
10011     /* VEX_W_62_P_2  */
10012     { "vpunpckldq",     { XM, Vex128, EXx } },
10013     { "(bad)",          { XX } },
10014   },
10015   {
10016     /* VEX_W_63_P_2  */
10017     { "vpacksswb",      { XM, Vex128, EXx } },
10018     { "(bad)",          { XX } },
10019   },
10020   {
10021     /* VEX_W_64_P_2  */
10022     { "vpcmpgtb",       { XM, Vex128, EXx } },
10023     { "(bad)",          { XX } },
10024   },
10025   {
10026     /* VEX_W_65_P_2  */
10027     { "vpcmpgtw",       { XM, Vex128, EXx } },
10028     { "(bad)",          { XX } },
10029   },
10030   {
10031     /* VEX_W_66_P_2  */
10032     { "vpcmpgtd",       { XM, Vex128, EXx } },
10033     { "(bad)",          { XX } },
10034   },
10035   {
10036     /* VEX_W_67_P_2  */
10037     { "vpackuswb",      { XM, Vex128, EXx } },
10038     { "(bad)",          { XX } },
10039   },
10040   {
10041     /* VEX_W_68_P_2  */
10042     { "vpunpckhbw",     { XM, Vex128, EXx } },
10043     { "(bad)",          { XX } },
10044   },
10045   {
10046     /* VEX_W_69_P_2  */
10047     { "vpunpckhwd",     { XM, Vex128, EXx } },
10048     { "(bad)",          { XX } },
10049   },
10050   {
10051     /* VEX_W_6A_P_2  */
10052     { "vpunpckhdq",     { XM, Vex128, EXx } },
10053     { "(bad)",          { XX } },
10054   },
10055   {
10056     /* VEX_W_6B_P_2  */
10057     { "vpackssdw",      { XM, Vex128, EXx } },
10058     { "(bad)",          { XX } },
10059   },
10060   {
10061     /* VEX_W_6C_P_2  */
10062     { "vpunpcklqdq",    { XM, Vex128, EXx } },
10063     { "(bad)",          { XX } },
10064   },
10065   {
10066     /* VEX_W_6D_P_2  */
10067     { "vpunpckhqdq",    { XM, Vex128, EXx } },
10068     { "(bad)",          { XX } },
10069   },
10070   {
10071     /* VEX_W_6F_P_1  */
10072     { "vmovdqu",        { XM, EXx } },
10073     { "(bad)",          { XX } },
10074   },
10075   {
10076     /* VEX_W_6F_P_2  */
10077     { "vmovdqa",        { XM, EXx } },
10078     { "(bad)",          { XX } },
10079   },
10080   {
10081     /* VEX_W_70_P_1 */
10082     { "vpshufhw",       { XM, EXx, Ib } },
10083     { "(bad)",          { XX } },
10084   },
10085   {
10086     /* VEX_W_70_P_2 */
10087     { "vpshufd",        { XM, EXx, Ib } },
10088     { "(bad)",          { XX } },
10089   },
10090   {
10091     /* VEX_W_70_P_3 */
10092     { "vpshuflw",       { XM, EXx, Ib } },
10093     { "(bad)",          { XX } },
10094   },
10095   {
10096     /* VEX_W_71_R_2_P_2  */
10097     { "vpsrlw",         { Vex128, XS, Ib } },
10098     { "(bad)",          { XX } },
10099   },
10100   {
10101     /* VEX_W_71_R_4_P_2  */
10102     { "vpsraw",         { Vex128, XS, Ib } },
10103     { "(bad)",          { XX } },
10104   },
10105   {
10106     /* VEX_W_71_R_6_P_2  */
10107     { "vpsllw",         { Vex128, XS, Ib } },
10108     { "(bad)",          { XX } },
10109   },
10110   {
10111     /* VEX_W_72_R_2_P_2  */
10112     { "vpsrld",         { Vex128, XS, Ib } },
10113     { "(bad)",          { XX } },
10114   },
10115   {
10116     /* VEX_W_72_R_4_P_2  */
10117     { "vpsrad",         { Vex128, XS, Ib } },
10118     { "(bad)",          { XX } },
10119   },
10120   {
10121     /* VEX_W_72_R_6_P_2  */
10122     { "vpslld",         { Vex128, XS, Ib } },
10123     { "(bad)",          { XX } },
10124   },
10125   {
10126     /* VEX_W_73_R_2_P_2  */
10127     { "vpsrlq",         { Vex128, XS, Ib } },
10128     { "(bad)",          { XX } },
10129   },
10130   {
10131     /* VEX_W_73_R_3_P_2  */
10132     { "vpsrldq",        { Vex128, XS, Ib } },
10133     { "(bad)",          { XX } },
10134   },
10135   {
10136     /* VEX_W_73_R_6_P_2  */
10137     { "vpsllq",         { Vex128, XS, Ib } },
10138     { "(bad)",          { XX } },
10139   },
10140   {
10141     /* VEX_W_73_R_7_P_2  */
10142     { "vpslldq",        { Vex128, XS, Ib } },
10143     { "(bad)",          { XX } },
10144   },
10145   {
10146     /* VEX_W_74_P_2 */
10147     { "vpcmpeqb",       { XM, Vex128, EXx } },
10148     { "(bad)",          { XX } },
10149   },
10150   {
10151     /* VEX_W_75_P_2 */
10152     { "vpcmpeqw",       { XM, Vex128, EXx } },
10153     { "(bad)",          { XX } },
10154   },
10155   {
10156     /* VEX_W_76_P_2 */
10157     { "vpcmpeqd",       { XM, Vex128, EXx } },
10158     { "(bad)",          { XX } },
10159   },
10160   {
10161     /* VEX_W_77_P_0 */
10162     { "",               { VZERO } },
10163     { "(bad)",          { XX } },
10164   },
10165   {
10166     /* VEX_W_7C_P_2 */
10167     { "vhaddpd",        { XM, Vex, EXx } },
10168     { "(bad)",          { XX } },
10169   },
10170   {
10171     /* VEX_W_7C_P_3 */
10172     { "vhaddps",        { XM, Vex, EXx } },
10173     { "(bad)",          { XX } },
10174   },
10175   {
10176     /* VEX_W_7D_P_2 */
10177     { "vhsubpd",        { XM, Vex, EXx } },
10178     { "(bad)",          { XX } },
10179   },
10180   {
10181     /* VEX_W_7D_P_3 */
10182     { "vhsubps",        { XM, Vex, EXx } },
10183     { "(bad)",          { XX } },
10184   },
10185   {
10186     /* VEX_W_7E_P_1 */
10187     { "vmovq",          { XM, EXq } },
10188     { "(bad)",          { XX } },
10189   },
10190   {
10191     /* VEX_W_7F_P_1 */
10192     { "vmovdqu",        { EXxS, XM } },
10193     { "(bad)",          { XX } },
10194   },
10195   {
10196     /* VEX_W_7F_P_2 */
10197     { "vmovdqa",        { EXxS, XM } },
10198     { "(bad)",          { XX } },
10199   },
10200   {
10201     /* VEX_W_AE_R_2_M_0 */
10202     { "vldmxcsr",       { Md } },
10203     { "(bad)",          { XX } },
10204   },
10205   {
10206     /* VEX_W_AE_R_3_M_0 */
10207     { "vstmxcsr",       { Md } },
10208     { "(bad)",          { XX } },
10209   },
10210   {
10211     /* VEX_W_C2_P_0 */
10212     { "vcmpps",         { XM, Vex, EXx, VCMP } },
10213     { "(bad)",          { XX } },
10214   },
10215   {
10216     /* VEX_W_C2_P_1 */
10217     { "vcmpss",         { XM, Vex128, EXd, VCMP } },
10218     { "(bad)",          { XX } },
10219   },
10220   {
10221     /* VEX_W_C2_P_2 */
10222     { "vcmppd",         { XM, Vex, EXx, VCMP } },
10223     { "(bad)",          { XX } },
10224   },
10225   {
10226     /* VEX_W_C2_P_3 */
10227     { "vcmpsd",         { XM, Vex128, EXq, VCMP } },
10228     { "(bad)",          { XX } },
10229   },
10230   {
10231     /* VEX_W_C4_P_2 */
10232     { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
10233     { "(bad)",          { XX } },
10234   },
10235   {
10236     /* VEX_W_C5_P_2 */
10237     { "vpextrw",        { Gdq, XS, Ib } },
10238     { "(bad)",          { XX } },
10239   },
10240   {
10241     /* VEX_W_D0_P_2 */
10242     { "vaddsubpd",      { XM, Vex, EXx } },
10243     { "(bad)",          { XX } },
10244   },
10245   {
10246     /* VEX_W_D0_P_3 */
10247     { "vaddsubps",      { XM, Vex, EXx } },
10248     { "(bad)",          { XX } },
10249   },
10250   {
10251     /* VEX_W_D1_P_2 */
10252     { "vpsrlw",         { XM, Vex128, EXx } },
10253     { "(bad)",          { XX } },
10254   },
10255   {
10256     /* VEX_W_D2_P_2 */
10257     { "vpsrld",         { XM, Vex128, EXx } },
10258     { "(bad)",          { XX } },
10259   },
10260   {
10261     /* VEX_W_D3_P_2 */
10262     { "vpsrlq",         { XM, Vex128, EXx } },
10263     { "(bad)",          { XX } },
10264   },
10265   {
10266     /* VEX_W_D4_P_2 */
10267     { "vpaddq",         { XM, Vex128, EXx } },
10268     { "(bad)",          { XX } },
10269   },
10270   {
10271     /* VEX_W_D5_P_2 */
10272     { "vpmullw",        { XM, Vex128, EXx } },
10273     { "(bad)",          { XX } },
10274   },
10275   {
10276     /* VEX_W_D6_P_2 */
10277     { "vmovq",          { EXqS, XM } },
10278     { "(bad)",          { XX } },
10279   },
10280   {
10281     /* VEX_W_D7_P_2_M_1 */
10282     { "vpmovmskb",      { Gdq, XS } },
10283     { "(bad)",          { XX } },
10284   },
10285   {
10286     /* VEX_W_D8_P_2 */
10287     { "vpsubusb",       { XM, Vex128, EXx } },
10288     { "(bad)",          { XX } },
10289   },
10290   {
10291     /* VEX_W_D9_P_2 */
10292     { "vpsubusw",       { XM, Vex128, EXx } },
10293     { "(bad)",          { XX } },
10294   },
10295   {
10296     /* VEX_W_DA_P_2 */
10297     { "vpminub",        { XM, Vex128, EXx } },
10298     { "(bad)",          { XX } },
10299   },
10300   {
10301     /* VEX_W_DB_P_2 */
10302     { "vpand",          { XM, Vex128, EXx } },
10303     { "(bad)",          { XX } },
10304   },
10305   {
10306     /* VEX_W_DC_P_2 */
10307     { "vpaddusb",       { XM, Vex128, EXx } },
10308     { "(bad)",          { XX } },
10309   },
10310   {
10311     /* VEX_W_DD_P_2 */
10312     { "vpaddusw",       { XM, Vex128, EXx } },
10313     { "(bad)",          { XX } },
10314   },
10315   {
10316     /* VEX_W_DE_P_2 */
10317     { "vpmaxub",        { XM, Vex128, EXx } },
10318     { "(bad)",          { XX } },
10319   },
10320   {
10321     /* VEX_W_DF_P_2 */
10322     { "vpandn",         { XM, Vex128, EXx } },
10323     { "(bad)",          { XX } },
10324   },
10325   {
10326     /* VEX_W_E0_P_2  */
10327     { "vpavgb",         { XM, Vex128, EXx } },
10328     { "(bad)",          { XX } },
10329   },
10330   {
10331     /* VEX_W_E1_P_2  */
10332     { "vpsraw",         { XM, Vex128, EXx } },
10333     { "(bad)",          { XX } },
10334   },
10335   {
10336     /* VEX_W_E2_P_2  */
10337     { "vpsrad",         { XM, Vex128, EXx } },
10338     { "(bad)",          { XX } },
10339   },
10340   {
10341     /* VEX_W_E3_P_2  */
10342     { "vpavgw",         { XM, Vex128, EXx } },
10343     { "(bad)",          { XX } },
10344   },
10345   {
10346     /* VEX_W_E4_P_2  */
10347     { "vpmulhuw",       { XM, Vex128, EXx } },
10348     { "(bad)",          { XX } },
10349   },
10350   {
10351     /* VEX_W_E5_P_2  */
10352     { "vpmulhw",        { XM, Vex128, EXx } },
10353     { "(bad)",          { XX } },
10354   },
10355   {
10356     /* VEX_W_E6_P_1  */
10357     { "vcvtdq2pd",      { XM, EXxmmq } },
10358     { "(bad)",          { XX } },
10359   },
10360   {
10361     /* VEX_W_E6_P_2  */
10362     { "vcvttpd2dq%XY",  { XMM, EXx } },
10363     { "(bad)",          { XX } },
10364   },
10365   {
10366     /* VEX_W_E6_P_3  */
10367     { "vcvtpd2dq%XY",   { XMM, EXx } },
10368     { "(bad)",          { XX } },
10369   },
10370   {
10371     /* VEX_W_E7_P_2_M_0 */
10372     { "vmovntdq",       { Mx, XM } },
10373     { "(bad)",          { XX } },
10374   },
10375   {
10376     /* VEX_W_E8_P_2  */
10377     { "vpsubsb",        { XM, Vex128, EXx } },
10378     { "(bad)",          { XX } },
10379   },
10380   {
10381     /* VEX_W_E9_P_2  */
10382     { "vpsubsw",        { XM, Vex128, EXx } },
10383     { "(bad)",          { XX } },
10384   },
10385   {
10386     /* VEX_W_EA_P_2  */
10387     { "vpminsw",        { XM, Vex128, EXx } },
10388     { "(bad)",          { XX } },
10389   },
10390   {
10391     /* VEX_W_EB_P_2  */
10392     { "vpor",           { XM, Vex128, EXx } },
10393     { "(bad)",          { XX } },
10394   },
10395   {
10396     /* VEX_W_EC_P_2  */
10397     { "vpaddsb",        { XM, Vex128, EXx } },
10398     { "(bad)",          { XX } },
10399   },
10400   {
10401     /* VEX_W_ED_P_2  */
10402     { "vpaddsw",        { XM, Vex128, EXx } },
10403     { "(bad)",          { XX } },
10404   },
10405   {
10406     /* VEX_W_EE_P_2  */
10407     { "vpmaxsw",        { XM, Vex128, EXx } },
10408     { "(bad)",          { XX } },
10409   },
10410   {
10411     /* VEX_W_EF_P_2  */
10412     { "vpxor",          { XM, Vex128, EXx } },
10413     { "(bad)",          { XX } },
10414   },
10415   {
10416     /* VEX_W_F0_P_3_M_0 */
10417     { "vlddqu",         { XM, M } },
10418     { "(bad)",          { XX } },
10419   },
10420   {
10421     /* VEX_W_F1_P_2 */
10422     { "vpsllw",         { XM, Vex128, EXx } },
10423     { "(bad)",          { XX } },
10424   },
10425   {
10426     /* VEX_W_F2_P_2 */
10427     { "vpslld",         { XM, Vex128, EXx } },
10428     { "(bad)",          { XX } },
10429   },
10430   {
10431     /* VEX_W_F3_P_2 */
10432     { "vpsllq",         { XM, Vex128, EXx } },
10433     { "(bad)",          { XX } },
10434   },
10435   {
10436     /* VEX_W_F4_P_2 */
10437     { "vpmuludq",       { XM, Vex128, EXx } },
10438     { "(bad)",          { XX } },
10439   },
10440   {
10441     /* VEX_W_F5_P_2 */
10442     { "vpmaddwd",       { XM, Vex128, EXx } },
10443     { "(bad)",          { XX } },
10444   },
10445   {
10446     /* VEX_W_F6_P_2 */
10447     { "vpsadbw",        { XM, Vex128, EXx } },
10448     { "(bad)",          { XX } },
10449   },
10450   {
10451     /* VEX_W_F7_P_2 */
10452     { "vmaskmovdqu",    { XM, XS } },
10453     { "(bad)",          { XX } },
10454   },
10455   {
10456     /* VEX_W_F8_P_2 */
10457     { "vpsubb",         { XM, Vex128, EXx } },
10458     { "(bad)",          { XX } },
10459   },
10460   {
10461     /* VEX_W_F9_P_2 */
10462     { "vpsubw",         { XM, Vex128, EXx } },
10463     { "(bad)",          { XX } },
10464   },
10465   {
10466     /* VEX_W_FA_P_2 */
10467     { "vpsubd",         { XM, Vex128, EXx } },
10468     { "(bad)",          { XX } },
10469   },
10470   {
10471     /* VEX_W_FB_P_2 */
10472     { "vpsubq",         { XM, Vex128, EXx } },
10473     { "(bad)",          { XX } },
10474   },
10475   {
10476     /* VEX_W_FC_P_2 */
10477     { "vpaddb",         { XM, Vex128, EXx } },
10478     { "(bad)",          { XX } },
10479   },
10480   {
10481     /* VEX_W_FD_P_2 */
10482     { "vpaddw",         { XM, Vex128, EXx } },
10483     { "(bad)",          { XX } },
10484   },
10485   {
10486     /* VEX_W_FE_P_2 */
10487     { "vpaddd",         { XM, Vex128, EXx } },
10488     { "(bad)",          { XX } },
10489   },
10490   {
10491     /* VEX_W_3800_P_2  */
10492     { "vpshufb",        { XM, Vex128, EXx } },
10493     { "(bad)",          { XX } },
10494   },
10495   {
10496     /* VEX_W_3801_P_2  */
10497     { "vphaddw",        { XM, Vex128, EXx } },
10498     { "(bad)",          { XX } },
10499   },
10500   {
10501     /* VEX_W_3802_P_2  */
10502     { "vphaddd",        { XM, Vex128, EXx } },
10503     { "(bad)",          { XX } },
10504   },
10505   {
10506     /* VEX_W_3803_P_2  */
10507     { "vphaddsw",       { XM, Vex128, EXx } },
10508     { "(bad)",          { XX } },
10509   },
10510   {
10511     /* VEX_W_3804_P_2  */
10512     { "vpmaddubsw",     { XM, Vex128, EXx } },
10513     { "(bad)",          { XX } },
10514   },
10515   {
10516     /* VEX_W_3805_P_2  */
10517     { "vphsubw",        { XM, Vex128, EXx } },
10518     { "(bad)",          { XX } },
10519   },
10520   {
10521     /* VEX_W_3806_P_2  */
10522     { "vphsubd",        { XM, Vex128, EXx } },
10523     { "(bad)",          { XX } },
10524   },
10525   {
10526     /* VEX_W_3807_P_2  */
10527     { "vphsubsw",       { XM, Vex128, EXx } },
10528     { "(bad)",          { XX } },
10529   },
10530   {
10531     /* VEX_W_3808_P_2  */
10532     { "vpsignb",        { XM, Vex128, EXx } },
10533     { "(bad)",          { XX } },
10534   },
10535   {
10536     /* VEX_W_3809_P_2  */
10537     { "vpsignw",        { XM, Vex128, EXx } },
10538     { "(bad)",          { XX } },
10539   },
10540   {
10541     /* VEX_W_380A_P_2  */
10542     { "vpsignd",        { XM, Vex128, EXx } },
10543     { "(bad)",          { XX } },
10544   },
10545   {
10546     /* VEX_W_380B_P_2  */
10547     { "vpmulhrsw",      { XM, Vex128, EXx } },
10548     { "(bad)",          { XX } },
10549   },
10550   {
10551     /* VEX_W_380C_P_2  */
10552     { "vpermilps",      { XM, Vex, EXx } },
10553     { "(bad)",          { XX } },
10554   },
10555   {
10556     /* VEX_W_380D_P_2  */
10557     { "vpermilpd",      { XM, Vex, EXx } },
10558     { "(bad)",          { XX } },
10559   },
10560   {
10561     /* VEX_W_380E_P_2  */
10562     { "vtestps",        { XM, EXx } },
10563     { "(bad)",          { XX } },
10564   },
10565   {
10566     /* VEX_W_380F_P_2  */
10567     { "vtestpd",        { XM, EXx } },
10568     { "(bad)",          { XX } },
10569   },
10570   {
10571     /* VEX_W_3817_P_2 */
10572     { "vptest",         { XM, EXx } },
10573     { "(bad)",          { XX } },
10574   },
10575   {
10576     /* VEX_W_3818_P_2_M_0 */
10577     { "vbroadcastss",   { XM, Md } },
10578     { "(bad)",          { XX } },
10579   },
10580   {
10581     /* VEX_W_3819_P_2_M_0 */
10582     { "vbroadcastsd",   { XM, Mq } },
10583     { "(bad)",          { XX } },
10584   },
10585   {
10586     /* VEX_W_381A_P_2_M_0 */
10587     { "vbroadcastf128", { XM, Mxmm } },
10588     { "(bad)",          { XX } },
10589   },
10590   {
10591     /* VEX_W_381C_P_2 */
10592     { "vpabsb",         { XM, EXx } },
10593     { "(bad)",          { XX } },
10594   },
10595   {
10596     /* VEX_W_381D_P_2 */
10597     { "vpabsw",         { XM, EXx } },
10598     { "(bad)",          { XX } },
10599   },
10600   {
10601     /* VEX_W_381E_P_2 */
10602     { "vpabsd",         { XM, EXx } },
10603     { "(bad)",          { XX } },
10604   },
10605   {
10606     /* VEX_W_3820_P_2 */
10607     { "vpmovsxbw",      { XM, EXq } },
10608     { "(bad)",          { XX } },
10609   },
10610   {
10611     /* VEX_W_3821_P_2 */
10612     { "vpmovsxbd",      { XM, EXd } },
10613     { "(bad)",          { XX } },
10614   },
10615   {
10616     /* VEX_W_3822_P_2 */
10617     { "vpmovsxbq",      { XM, EXw } },
10618     { "(bad)",          { XX } },
10619   },
10620   {
10621     /* VEX_W_3823_P_2 */
10622     { "vpmovsxwd",      { XM, EXq } },
10623     { "(bad)",          { XX } },
10624   },
10625   {
10626     /* VEX_W_3824_P_2 */
10627     { "vpmovsxwq",      { XM, EXd } },
10628     { "(bad)",          { XX } },
10629   },
10630   {
10631     /* VEX_W_3825_P_2 */
10632     { "vpmovsxdq",      { XM, EXq } },
10633     { "(bad)",          { XX } },
10634   },
10635   {
10636     /* VEX_W_3828_P_2 */
10637     { "vpmuldq",        { XM, Vex128, EXx } },
10638     { "(bad)",          { XX } },
10639   },
10640   {
10641     /* VEX_W_3829_P_2 */
10642     { "vpcmpeqq",       { XM, Vex128, EXx } },
10643     { "(bad)",          { XX } },
10644   },
10645   {
10646     /* VEX_W_382A_P_2_M_0 */
10647     { "vmovntdqa",      { XM, Mx } },
10648     { "(bad)",          { XX } },
10649   },
10650   {
10651     /* VEX_W_382B_P_2 */
10652     { "vpackusdw",      { XM, Vex128, EXx } },
10653     { "(bad)",          { XX } },
10654   },
10655   {
10656     /* VEX_W_382C_P_2_M_0 */
10657     { "vmaskmovps",     { XM, Vex, Mx } },
10658     { "(bad)",          { XX } },
10659   },
10660   {
10661     /* VEX_W_382D_P_2_M_0 */
10662     { "vmaskmovpd",     { XM, Vex, Mx } },
10663     { "(bad)",          { XX } },
10664   },
10665   {
10666     /* VEX_W_382E_P_2_M_0 */
10667     { "vmaskmovps",     { Mx, Vex, XM } },
10668     { "(bad)",          { XX } },
10669   },
10670   {
10671     /* VEX_W_382F_P_2_M_0 */
10672     { "vmaskmovpd",     { Mx, Vex, XM } },
10673     { "(bad)",          { XX } },
10674   },
10675   {
10676     /* VEX_W_3830_P_2 */
10677     { "vpmovzxbw",      { XM, EXq } },
10678     { "(bad)",          { XX } },
10679   },
10680   {
10681     /* VEX_W_3831_P_2 */
10682     { "vpmovzxbd",      { XM, EXd } },
10683     { "(bad)",          { XX } },
10684   },
10685   {
10686     /* VEX_W_3832_P_2 */
10687     { "vpmovzxbq",      { XM, EXw } },
10688     { "(bad)",          { XX } },
10689   },
10690   {
10691     /* VEX_W_3833_P_2 */
10692     { "vpmovzxwd",      { XM, EXq } },
10693     { "(bad)",          { XX } },
10694   },
10695   {
10696     /* VEX_W_3834_P_2 */
10697     { "vpmovzxwq",      { XM, EXd } },
10698     { "(bad)",          { XX } },
10699   },
10700   {
10701     /* VEX_W_3835_P_2 */
10702     { "vpmovzxdq",      { XM, EXq } },
10703     { "(bad)",          { XX } },
10704   },
10705   {
10706     /* VEX_W_3837_P_2 */
10707     { "vpcmpgtq",       { XM, Vex128, EXx } },
10708     { "(bad)",          { XX } },
10709   },
10710   {
10711     /* VEX_W_3838_P_2 */
10712     { "vpminsb",        { XM, Vex128, EXx } },
10713     { "(bad)",          { XX } },
10714   },
10715   {
10716     /* VEX_W_3839_P_2 */
10717     { "vpminsd",        { XM, Vex128, EXx } },
10718     { "(bad)",          { XX } },
10719   },
10720   {
10721     /* VEX_W_383A_P_2 */
10722     { "vpminuw",        { XM, Vex128, EXx } },
10723     { "(bad)",          { XX } },
10724   },
10725   {
10726     /* VEX_W_383B_P_2 */
10727     { "vpminud",        { XM, Vex128, EXx } },
10728     { "(bad)",          { XX } },
10729   },
10730   {
10731     /* VEX_W_383C_P_2 */
10732     { "vpmaxsb",        { XM, Vex128, EXx } },
10733     { "(bad)",          { XX } },
10734   },
10735   {
10736     /* VEX_W_383D_P_2 */
10737     { "vpmaxsd",        { XM, Vex128, EXx } },
10738     { "(bad)",          { XX } },
10739   },
10740   {
10741     /* VEX_W_383E_P_2 */
10742     { "vpmaxuw",        { XM, Vex128, EXx } },
10743     { "(bad)",          { XX } },
10744   },
10745   {
10746     /* VEX_W_383F_P_2 */
10747     { "vpmaxud",        { XM, Vex128, EXx } },
10748     { "(bad)",          { XX } },
10749   },
10750   {
10751     /* VEX_W_3840_P_2 */
10752     { "vpmulld",        { XM, Vex128, EXx } },
10753     { "(bad)",          { XX } },
10754   },
10755   {
10756     /* VEX_W_3841_P_2 */
10757     { "vphminposuw",    { XM, EXx } },
10758     { "(bad)",          { XX } },
10759   },
10760   {
10761     /* VEX_W_38DB_P_2 */
10762     { "vaesimc",        { XM, EXx } },
10763     { "(bad)",          { XX } },
10764   },
10765   {
10766     /* VEX_W_38DC_P_2 */
10767     { "vaesenc",        { XM, Vex128, EXx } },
10768     { "(bad)",          { XX } },
10769   },
10770   {
10771     /* VEX_W_38DD_P_2 */
10772     { "vaesenclast",    { XM, Vex128, EXx } },
10773     { "(bad)",          { XX } },
10774   },
10775   {
10776     /* VEX_W_38DE_P_2 */
10777     { "vaesdec",        { XM, Vex128, EXx } },
10778     { "(bad)",          { XX } },
10779   },
10780   {
10781     /* VEX_W_38DF_P_2 */
10782     { "vaesdeclast",    { XM, Vex128, EXx } },
10783     { "(bad)",          { XX } },
10784   },
10785   {
10786     /* VEX_W_3A04_P_2 */
10787     { "vpermilps",      { XM, EXx, Ib } },
10788     { "(bad)",          { XX } },
10789   },
10790   {
10791     /* VEX_W_3A05_P_2 */
10792     { "vpermilpd",      { XM, EXx, Ib } },
10793     { "(bad)",          { XX } },
10794   },
10795   {
10796     /* VEX_W_3A06_P_2 */
10797     { "vperm2f128",     { XM, Vex256, EXx, Ib } },
10798     { "(bad)",          { XX } },
10799   },
10800   {
10801     /* VEX_W_3A08_P_2 */
10802     { "vroundps",       { XM, EXx, Ib } },
10803     { "(bad)",          { XX } },
10804   },
10805   {
10806     /* VEX_W_3A09_P_2 */
10807     { "vroundpd",       { XM, EXx, Ib } },
10808     { "(bad)",          { XX } },
10809   },
10810   {
10811     /* VEX_W_3A0A_P_2 */
10812     { "vroundss",       { XM, Vex128, EXd, Ib } },
10813     { "(bad)",          { XX } },
10814   },
10815   {
10816     /* VEX_W_3A0B_P_2 */
10817     { "vroundsd",       { XM, Vex128, EXq, Ib } },
10818     { "(bad)",          { XX } },
10819   },
10820   {
10821     /* VEX_W_3A0C_P_2 */
10822     { "vblendps",       { XM, Vex, EXx, Ib } },
10823     { "(bad)",          { XX } },
10824   },
10825   {
10826     /* VEX_W_3A0D_P_2 */
10827     { "vblendpd",       { XM, Vex, EXx, Ib } },
10828     { "(bad)",          { XX } },
10829   },
10830   {
10831     /* VEX_W_3A0E_P_2 */
10832     { "vpblendw",       { XM, Vex128, EXx, Ib } },
10833     { "(bad)",          { XX } },
10834   },
10835   {
10836     /* VEX_W_3A0F_P_2 */
10837     { "vpalignr",       { XM, Vex128, EXx, Ib } },
10838     { "(bad)",          { XX } },
10839   },
10840   {
10841     /* VEX_W_3A14_P_2 */
10842     { "vpextrb",        { Edqb, XM, Ib } },
10843     { "(bad)",          { XX } },
10844   },
10845   {
10846     /* VEX_W_3A15_P_2 */
10847     { "vpextrw",        { Edqw, XM, Ib } },
10848     { "(bad)",          { XX } },
10849   },
10850   {
10851     /* VEX_W_3A18_P_2 */
10852     { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
10853     { "(bad)",          { XX } },
10854   },
10855   {
10856     /* VEX_W_3A19_P_2 */
10857     { "vextractf128",   { EXxmm, XM, Ib } },
10858     { "(bad)",          { XX } },
10859   },
10860   {
10861     /* VEX_W_3A20_P_2 */
10862     { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
10863     { "(bad)",          { XX } },
10864   },
10865   {
10866     /* VEX_W_3A21_P_2 */
10867     { "vinsertps",      { XM, Vex128, EXd, Ib } },
10868     { "(bad)",          { XX } },
10869   },
10870   {
10871     /* VEX_W_3A40_P_2 */
10872     { "vdpps",          { XM, Vex, EXx, Ib } },
10873     { "(bad)",          { XX } },
10874   },
10875   {
10876     /* VEX_W_3A41_P_2 */
10877     { "vdppd",          { XM, Vex128, EXx, Ib } },
10878     { "(bad)",          { XX } },
10879   },
10880   {
10881     /* VEX_W_3A42_P_2 */
10882     { "vmpsadbw",       { XM, Vex128, EXx, Ib } },
10883     { "(bad)",          { XX } },
10884   },
10885   {
10886     /* VEX_W_3A44_P_2 */
10887     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL } },
10888     { "(bad)",          { XX } },
10889   },
10890   {
10891     /* VEX_W_3A4A_P_2 */
10892     { "vblendvps",      { XM, Vex, EXx, XMVexI4 } },
10893     { "(bad)",          { XX } },
10894   },
10895   {
10896     /* VEX_W_3A4B_P_2 */
10897     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 } },
10898     { "(bad)",          { XX } },
10899   },
10900   {
10901     /* VEX_W_3A4C_P_2 */
10902     { "vpblendvb",      { XM, Vex128, EXx, XMVexI4 } },
10903     { "(bad)",          { XX } },
10904   },
10905   {
10906     /* VEX_W_3A60_P_2 */
10907     { "vpcmpestrm",     { XM, EXx, Ib } },
10908     { "(bad)",          { XX } },
10909   },
10910   {
10911     /* VEX_W_3A61_P_2 */
10912     { "vpcmpestri",     { XM, EXx, Ib } },
10913     { "(bad)",          { XX } },
10914   },
10915   {
10916     /* VEX_W_3A62_P_2 */
10917     { "vpcmpistrm",     { XM, EXx, Ib } },
10918     { "(bad)",          { XX } },
10919   },
10920   {
10921     /* VEX_W_3A63_P_2 */
10922     { "vpcmpistri",     { XM, EXx, Ib } },
10923     { "(bad)",          { XX } },
10924   },
10925   {
10926     /* VEX_W_3ADF_P_2 */
10927     { "vaeskeygenassist", { XM, EXx, Ib } },
10928     { "(bad)",          { XX } },
10929   },
10930 };
10931
10932 static const struct dis386 mod_table[][2] = {
10933   {
10934     /* MOD_8D */
10935     { "leaS",           { Gv, M } },
10936     { "(bad)",          { XX } },
10937   },
10938   {
10939     /* MOD_0F01_REG_0 */
10940     { X86_64_TABLE (X86_64_0F01_REG_0) },
10941     { RM_TABLE (RM_0F01_REG_0) },
10942   },
10943   {
10944     /* MOD_0F01_REG_1 */
10945     { X86_64_TABLE (X86_64_0F01_REG_1) },
10946     { RM_TABLE (RM_0F01_REG_1) },
10947   },
10948   {
10949     /* MOD_0F01_REG_2 */
10950     { X86_64_TABLE (X86_64_0F01_REG_2) },
10951     { RM_TABLE (RM_0F01_REG_2) },
10952   },
10953   {
10954     /* MOD_0F01_REG_3 */
10955     { X86_64_TABLE (X86_64_0F01_REG_3) },
10956     { RM_TABLE (RM_0F01_REG_3) },
10957   },
10958   {
10959     /* MOD_0F01_REG_7 */
10960     { "invlpg",         { Mb } },
10961     { RM_TABLE (RM_0F01_REG_7) },
10962   },
10963   {
10964     /* MOD_0F12_PREFIX_0 */
10965     { "movlps",         { XM, EXq } },
10966     { "movhlps",        { XM, EXq } },
10967   },
10968   {
10969     /* MOD_0F13 */
10970     { "movlpX",         { EXq, XM } },
10971     { "(bad)",          { XX } },
10972   },
10973   {
10974     /* MOD_0F16_PREFIX_0 */
10975     { "movhps",         { XM, EXq } },
10976     { "movlhps",        { XM, EXq } },
10977   },
10978   {
10979     /* MOD_0F17 */
10980     { "movhpX",         { EXq, XM } },
10981     { "(bad)",          { XX } },
10982   },
10983   {
10984     /* MOD_0F18_REG_0 */
10985     { "prefetchnta",    { Mb } },
10986     { "(bad)",          { XX } },
10987   },
10988   {
10989     /* MOD_0F18_REG_1 */
10990     { "prefetcht0",     { Mb } },
10991     { "(bad)",          { XX } },
10992   },
10993   {
10994     /* MOD_0F18_REG_2 */
10995     { "prefetcht1",     { Mb } },
10996     { "(bad)",          { XX } },
10997   },
10998   {
10999     /* MOD_0F18_REG_3 */
11000     { "prefetcht2",     { Mb } },
11001     { "(bad)",          { XX } },
11002   },
11003   {
11004     /* MOD_0F20 */
11005     { "(bad)",          { XX } },
11006     { "movZ",           { Rm, Cm } },
11007   },
11008   {
11009     /* MOD_0F21 */
11010     { "(bad)",          { XX } },
11011     { "movZ",           { Rm, Dm } },
11012   },
11013   {
11014     /* MOD_0F22 */
11015     { "(bad)",          { XX } },
11016     { "movZ",           { Cm, Rm } },
11017   },
11018   {
11019     /* MOD_0F23 */
11020     { "(bad)",          { XX } },
11021     { "movZ",           { Dm, Rm } },
11022   },
11023   {
11024     /* MOD_0F24 */
11025     { "(bad)",          { XX } },    
11026     { "movL",           { Rd, Td } },
11027   },
11028   {
11029     /* MOD_0F26 */
11030     { "(bad)",          { XX } },
11031     { "movL",           { Td, Rd } },
11032   },
11033   {
11034     /* MOD_0F2B_PREFIX_0 */
11035     {"movntps",         { Mx, XM } },
11036     { "(bad)",          { XX } },
11037   },
11038   {
11039     /* MOD_0F2B_PREFIX_1 */
11040     {"movntss",         { Md, XM } },
11041     { "(bad)",          { XX } },
11042   },
11043   {
11044     /* MOD_0F2B_PREFIX_2 */
11045     {"movntpd",         { Mx, XM } },
11046     { "(bad)",          { XX } },
11047   },
11048   {
11049     /* MOD_0F2B_PREFIX_3 */
11050     {"movntsd",         { Mq, XM } },
11051     { "(bad)",          { XX } },
11052   },
11053   {
11054     /* MOD_0F51 */
11055     { "(bad)",          { XX } },
11056     { "movmskpX",       { Gdq, XS } },
11057   },
11058   {
11059     /* MOD_0F71_REG_2 */
11060     { "(bad)",          { XX } },
11061     { "psrlw",          { MS, Ib } },
11062   },
11063   {
11064     /* MOD_0F71_REG_4 */
11065     { "(bad)",          { XX } },
11066     { "psraw",          { MS, Ib } },
11067   },
11068   {
11069     /* MOD_0F71_REG_6 */
11070     { "(bad)",          { XX } },
11071     { "psllw",          { MS, Ib } },
11072   },
11073   {
11074     /* MOD_0F72_REG_2 */
11075     { "(bad)",          { XX } },
11076     { "psrld",          { MS, Ib } },
11077   },
11078   {
11079     /* MOD_0F72_REG_4 */
11080     { "(bad)",          { XX } },
11081     { "psrad",          { MS, Ib } },
11082   },
11083   {
11084     /* MOD_0F72_REG_6 */
11085     { "(bad)",          { XX } },
11086     { "pslld",          { MS, Ib } },
11087   },
11088   {
11089     /* MOD_0F73_REG_2 */
11090     { "(bad)",          { XX } },
11091     { "psrlq",          { MS, Ib } },
11092   },
11093   {
11094     /* MOD_0F73_REG_3 */
11095     { "(bad)",          { XX } },
11096     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11097   },
11098   {
11099     /* MOD_0F73_REG_6 */
11100     { "(bad)",          { XX } },
11101     { "psllq",          { MS, Ib } },
11102   },
11103   {
11104     /* MOD_0F73_REG_7 */
11105     { "(bad)",          { XX } },
11106     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11107   },
11108   {
11109     /* MOD_0FAE_REG_0 */
11110     { "fxsave",         { FXSAVE } },
11111     { "(bad)",          { XX } },
11112   },
11113   {
11114     /* MOD_0FAE_REG_1 */
11115     { "fxrstor",        { FXSAVE } },
11116     { "(bad)",          { XX } },
11117   },
11118   {
11119     /* MOD_0FAE_REG_2 */
11120     { "ldmxcsr",        { Md } },
11121     { "(bad)",          { XX } },
11122   },
11123   {
11124     /* MOD_0FAE_REG_3 */
11125     { "stmxcsr",        { Md } },
11126     { "(bad)",          { XX } },
11127   },
11128   {
11129     /* MOD_0FAE_REG_4 */
11130     { "xsave",          { M } },
11131     { "(bad)",          { XX } },
11132   },
11133   {
11134     /* MOD_0FAE_REG_5 */
11135     { "xrstor",         { M } },
11136     { RM_TABLE (RM_0FAE_REG_5) },
11137   },
11138   {
11139     /* MOD_0FAE_REG_6 */
11140     { "xsaveopt",       { M } },
11141     { RM_TABLE (RM_0FAE_REG_6) },
11142   },
11143   {
11144     /* MOD_0FAE_REG_7 */
11145     { "clflush",        { Mb } },
11146     { RM_TABLE (RM_0FAE_REG_7) },
11147   },
11148   {
11149     /* MOD_0FB2 */
11150     { "lssS",           { Gv, Mp } },
11151     { "(bad)",          { XX } },
11152   },
11153   {
11154     /* MOD_0FB4 */
11155     { "lfsS",           { Gv, Mp } },
11156     { "(bad)",          { XX } },
11157   },
11158   {
11159     /* MOD_0FB5 */
11160     { "lgsS",           { Gv, Mp } },
11161     { "(bad)",          { XX } },
11162   },
11163   {
11164     /* MOD_0FC7_REG_6 */
11165     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
11166     { "(bad)",          { XX } },
11167   },
11168   {
11169     /* MOD_0FC7_REG_7 */
11170     { "vmptrst",        { Mq } },
11171     { "(bad)",          { XX } },
11172   },
11173   {
11174     /* MOD_0FD7 */
11175     { "(bad)",          { XX } },
11176     { "pmovmskb",       { Gdq, MS } },
11177   },
11178   {
11179     /* MOD_0FE7_PREFIX_2 */
11180     { "movntdq",        { Mx, XM } },
11181     { "(bad)",          { XX } },
11182   },
11183   {
11184     /* MOD_0FF0_PREFIX_3 */
11185     { "lddqu",          { XM, M } },
11186     { "(bad)",          { XX } },
11187   },
11188   {
11189     /* MOD_0F382A_PREFIX_2 */
11190     { "movntdqa",       { XM, Mx } },
11191     { "(bad)",          { XX } },
11192   },
11193   {
11194     /* MOD_62_32BIT */
11195     { "bound{S|}",      { Gv, Ma } },
11196     { "(bad)",          { XX } },
11197   },
11198   {
11199     /* MOD_C4_32BIT */
11200     { "lesS",           { Gv, Mp } },
11201     { VEX_C4_TABLE (VEX_0F) },
11202   },
11203   {
11204     /* MOD_C5_32BIT */
11205     { "ldsS",           { Gv, Mp } },
11206     { VEX_C5_TABLE (VEX_0F) },
11207   },
11208   {
11209     /* MOD_VEX_12_PREFIX_0 */
11210     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
11211     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
11212   },
11213   {
11214     /* MOD_VEX_13 */
11215     { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
11216     { "(bad)",          { XX } },
11217   },
11218   {
11219     /* MOD_VEX_16_PREFIX_0 */
11220     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
11221     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
11222   },
11223   {
11224     /* MOD_VEX_17 */
11225     { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
11226     { "(bad)",          { XX } },
11227   },
11228   {
11229     /* MOD_VEX_2B */
11230     { VEX_W_TABLE (VEX_W_2B_M_0) },
11231     { "(bad)",          { XX } },
11232   },
11233   {
11234     /* MOD_VEX_50 */
11235     { "(bad)",          { XX } },
11236     { VEX_W_TABLE (VEX_W_50_M_0) },
11237   },
11238   {
11239     /* MOD_VEX_71_REG_2 */
11240     { "(bad)",          { XX } },
11241     { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
11242   },
11243   {
11244     /* MOD_VEX_71_REG_4 */
11245     { "(bad)",          { XX } },
11246     { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
11247   },
11248   {
11249     /* MOD_VEX_71_REG_6 */
11250     { "(bad)",          { XX } },
11251     { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
11252   },
11253   {
11254     /* MOD_VEX_72_REG_2 */
11255     { "(bad)",          { XX } },
11256     { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
11257   },
11258   {
11259     /* MOD_VEX_72_REG_4 */
11260     { "(bad)",          { XX } },
11261     { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
11262   },
11263   {
11264     /* MOD_VEX_72_REG_6 */
11265     { "(bad)",          { XX } },
11266     { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
11267   },
11268   {
11269     /* MOD_VEX_73_REG_2 */
11270     { "(bad)",          { XX } },
11271     { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
11272   },
11273   {
11274     /* MOD_VEX_73_REG_3 */
11275     { "(bad)",          { XX } },
11276     { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
11277   },
11278   {
11279     /* MOD_VEX_73_REG_6 */
11280     { "(bad)",          { XX } },
11281     { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
11282   },
11283   {
11284     /* MOD_VEX_73_REG_7 */
11285     { "(bad)",          { XX } },
11286     { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
11287   },
11288   {
11289     /* MOD_VEX_AE_REG_2 */
11290     { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
11291     { "(bad)",          { XX } },
11292   },
11293   {
11294     /* MOD_VEX_AE_REG_3 */
11295     { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
11296     { "(bad)",          { XX } },
11297   },
11298   {
11299     /* MOD_VEX_D7_PREFIX_2 */
11300     { "(bad)",          { XX } },
11301     { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
11302   },
11303   {
11304     /* MOD_VEX_E7_PREFIX_2 */
11305     { VEX_W_TABLE (VEX_W_E7_P_2_M_0) },
11306     { "(bad)",          { XX } },
11307   },
11308   {
11309     /* MOD_VEX_F0_PREFIX_3 */
11310     { VEX_W_TABLE (VEX_W_F0_P_3_M_0) },
11311     { "(bad)",          { XX } },
11312   },
11313   {
11314     /* MOD_VEX_3818_PREFIX_2 */
11315     { VEX_W_TABLE (VEX_W_3818_P_2_M_0) },
11316     { "(bad)",          { XX } },
11317   },
11318   {
11319     /* MOD_VEX_3819_PREFIX_2 */
11320     { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
11321     { "(bad)",          { XX } },
11322   },
11323   {
11324     /* MOD_VEX_381A_PREFIX_2 */
11325     { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
11326     { "(bad)",          { XX } },
11327   },
11328   {
11329     /* MOD_VEX_382A_PREFIX_2 */
11330     { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
11331     { "(bad)",          { XX } },
11332   },
11333   {
11334     /* MOD_VEX_382C_PREFIX_2 */
11335     { VEX_W_TABLE (VEX_W_382C_P_2_M_0) },
11336     { "(bad)",          { XX } },
11337   },
11338   {
11339     /* MOD_VEX_382D_PREFIX_2 */
11340     { VEX_W_TABLE (VEX_W_382D_P_2_M_0) },
11341     { "(bad)",          { XX } },
11342   },
11343   {
11344     /* MOD_VEX_382E_PREFIX_2 */
11345     { VEX_W_TABLE (VEX_W_382E_P_2_M_0) },
11346     { "(bad)",          { XX } },
11347   },
11348   {
11349     /* MOD_VEX_382F_PREFIX_2 */
11350     { VEX_W_TABLE (VEX_W_382F_P_2_M_0) },
11351     { "(bad)",          { XX } },
11352   },
11353 };
11354
11355 static const struct dis386 rm_table[][8] = {
11356   {
11357     /* RM_0F01_REG_0 */
11358     { "(bad)",          { XX } },
11359     { "vmcall",         { Skip_MODRM } },
11360     { "vmlaunch",       { Skip_MODRM } },
11361     { "vmresume",       { Skip_MODRM } },
11362     { "vmxoff",         { Skip_MODRM } },
11363     { "(bad)",          { XX } },
11364     { "(bad)",          { XX } },
11365     { "(bad)",          { XX } },
11366   },
11367   {
11368     /* RM_0F01_REG_1 */
11369     { "monitor",        { { OP_Monitor, 0 } } },
11370     { "mwait",          { { OP_Mwait, 0 } } },
11371     { "(bad)",          { XX } },
11372     { "(bad)",          { XX } },
11373     { "(bad)",          { XX } },
11374     { "(bad)",          { XX } },
11375     { "(bad)",          { XX } },
11376     { "(bad)",          { XX } },
11377   },
11378   {
11379     /* RM_0F01_REG_2 */
11380     { "xgetbv",         { Skip_MODRM } },
11381     { "xsetbv",         { Skip_MODRM } },
11382     { "(bad)",          { XX } },
11383     { "(bad)",          { XX } },
11384     { "(bad)",          { XX } },
11385     { "(bad)",          { XX } },
11386     { "(bad)",          { XX } },
11387     { "(bad)",          { XX } },
11388   },
11389   {
11390     /* RM_0F01_REG_3 */
11391     { "vmrun",          { Skip_MODRM } },
11392     { "vmmcall",        { Skip_MODRM } },
11393     { "vmload",         { Skip_MODRM } },
11394     { "vmsave",         { Skip_MODRM } },
11395     { "stgi",           { Skip_MODRM } },
11396     { "clgi",           { Skip_MODRM } },
11397     { "skinit",         { Skip_MODRM } },
11398     { "invlpga",        { Skip_MODRM } },
11399   },
11400   {
11401     /* RM_0F01_REG_7 */
11402     { "swapgs",         { Skip_MODRM } },
11403     { "rdtscp",         { Skip_MODRM } },
11404     { "(bad)",          { XX } },
11405     { "(bad)",          { XX } },
11406     { "(bad)",          { XX } },
11407     { "(bad)",          { XX } },
11408     { "(bad)",          { XX } },
11409     { "(bad)",          { XX } },
11410   },
11411   {
11412     /* RM_0FAE_REG_5 */
11413     { "lfence",         { Skip_MODRM } },
11414     { "(bad)",          { XX } },
11415     { "(bad)",          { XX } },
11416     { "(bad)",          { XX } },
11417     { "(bad)",          { XX } },
11418     { "(bad)",          { XX } },
11419     { "(bad)",          { XX } },
11420     { "(bad)",          { XX } },
11421   },
11422   {
11423     /* RM_0FAE_REG_6 */
11424     { "mfence",         { Skip_MODRM } },
11425     { "(bad)",          { XX } },
11426     { "(bad)",          { XX } },
11427     { "(bad)",          { XX } },
11428     { "(bad)",          { XX } },
11429     { "(bad)",          { XX } },
11430     { "(bad)",          { XX } },
11431     { "(bad)",          { XX } },
11432   },
11433   {
11434     /* RM_0FAE_REG_7 */
11435     { "sfence",         { Skip_MODRM } },
11436     { "(bad)",          { XX } },
11437     { "(bad)",          { XX } },
11438     { "(bad)",          { XX } },
11439     { "(bad)",          { XX } },
11440     { "(bad)",          { XX } },
11441     { "(bad)",          { XX } },
11442     { "(bad)",          { XX } },
11443   },
11444 };
11445
11446 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11447
11448 /* We use the high bit to indicate different name for the same
11449    prefix.  */
11450 #define ADDR16_PREFIX   (0x67 | 0x100)
11451 #define ADDR32_PREFIX   (0x67 | 0x200)
11452 #define DATA16_PREFIX   (0x66 | 0x100)
11453 #define DATA32_PREFIX   (0x66 | 0x200)
11454 #define REP_PREFIX      (0xf3 | 0x100)
11455
11456 static int
11457 ckprefix (void)
11458 {
11459   int newrex, i, length;
11460   rex = 0;
11461   rex_ignored = 0;
11462   prefixes = 0;
11463   used_prefixes = 0;
11464   rex_used = 0;
11465   last_lock_prefix = -1;
11466   last_repz_prefix = -1;
11467   last_repnz_prefix = -1;
11468   last_data_prefix = -1;
11469   last_addr_prefix = -1;
11470   last_rex_prefix = -1;
11471   last_seg_prefix = -1;
11472   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11473     all_prefixes[i] = 0;
11474   i = 0;
11475   length = 0;
11476   /* The maximum instruction length is 15bytes.  */
11477   while (length < MAX_CODE_LENGTH - 1)
11478     {
11479       FETCH_DATA (the_info, codep + 1);
11480       newrex = 0;
11481       switch (*codep)
11482         {
11483         /* REX prefixes family.  */
11484         case 0x40:
11485         case 0x41:
11486         case 0x42:
11487         case 0x43:
11488         case 0x44:
11489         case 0x45:
11490         case 0x46:
11491         case 0x47:
11492         case 0x48:
11493         case 0x49:
11494         case 0x4a:
11495         case 0x4b:
11496         case 0x4c:
11497         case 0x4d:
11498         case 0x4e:
11499         case 0x4f:
11500           if (address_mode == mode_64bit)
11501             newrex = *codep;
11502           else
11503             return 1;
11504           last_rex_prefix = i;
11505           break;
11506         case 0xf3:
11507           prefixes |= PREFIX_REPZ;
11508           last_repz_prefix = i;
11509           break;
11510         case 0xf2:
11511           prefixes |= PREFIX_REPNZ;
11512           last_repnz_prefix = i;
11513           break;
11514         case 0xf0:
11515           prefixes |= PREFIX_LOCK;
11516           last_lock_prefix = i;
11517           break;
11518         case 0x2e:
11519           prefixes |= PREFIX_CS;
11520           last_seg_prefix = i;
11521           break;
11522         case 0x36:
11523           prefixes |= PREFIX_SS;
11524           last_seg_prefix = i;
11525           break;
11526         case 0x3e:
11527           prefixes |= PREFIX_DS;
11528           last_seg_prefix = i;
11529           break;
11530         case 0x26:
11531           prefixes |= PREFIX_ES;
11532           last_seg_prefix = i;
11533           break;
11534         case 0x64:
11535           prefixes |= PREFIX_FS;
11536           last_seg_prefix = i;
11537           break;
11538         case 0x65:
11539           prefixes |= PREFIX_GS;
11540           last_seg_prefix = i;
11541           break;
11542         case 0x66:
11543           prefixes |= PREFIX_DATA;
11544           last_data_prefix = i;
11545           break;
11546         case 0x67:
11547           prefixes |= PREFIX_ADDR;
11548           last_addr_prefix = i;
11549           break;
11550         case FWAIT_OPCODE:
11551           /* fwait is really an instruction.  If there are prefixes
11552              before the fwait, they belong to the fwait, *not* to the
11553              following instruction.  */
11554           if (prefixes || rex)
11555             {
11556               prefixes |= PREFIX_FWAIT;
11557               codep++;
11558               return 1;
11559             }
11560           prefixes = PREFIX_FWAIT;
11561           break;
11562         default:
11563           return 1;
11564         }
11565       /* Rex is ignored when followed by another prefix.  */
11566       if (rex)
11567         {
11568           rex_used = rex;
11569           return 1;
11570         }
11571       if (*codep != FWAIT_OPCODE)
11572         all_prefixes[i++] = *codep;
11573       rex = newrex;
11574       codep++;
11575       length++;
11576     }
11577   return 0;
11578 }
11579
11580 static int
11581 seg_prefix (int pref)
11582 {
11583   switch (pref)
11584     {
11585     case 0x2e:
11586       return PREFIX_CS;
11587     case 0x36:
11588       return PREFIX_SS;
11589     case 0x3e:
11590       return PREFIX_DS;
11591     case 0x26:
11592       return PREFIX_ES;
11593     case 0x64:
11594       return PREFIX_FS;
11595     case 0x65:
11596       return PREFIX_GS;
11597     default:
11598       return 0;
11599     }
11600 }
11601
11602 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11603    prefix byte.  */
11604
11605 static const char *
11606 prefix_name (int pref, int sizeflag)
11607 {
11608   static const char *rexes [16] =
11609     {
11610       "rex",            /* 0x40 */
11611       "rex.B",          /* 0x41 */
11612       "rex.X",          /* 0x42 */
11613       "rex.XB",         /* 0x43 */
11614       "rex.R",          /* 0x44 */
11615       "rex.RB",         /* 0x45 */
11616       "rex.RX",         /* 0x46 */
11617       "rex.RXB",        /* 0x47 */
11618       "rex.W",          /* 0x48 */
11619       "rex.WB",         /* 0x49 */
11620       "rex.WX",         /* 0x4a */
11621       "rex.WXB",        /* 0x4b */
11622       "rex.WR",         /* 0x4c */
11623       "rex.WRB",        /* 0x4d */
11624       "rex.WRX",        /* 0x4e */
11625       "rex.WRXB",       /* 0x4f */
11626     };
11627
11628   switch (pref)
11629     {
11630     /* REX prefixes family.  */
11631     case 0x40:
11632     case 0x41:
11633     case 0x42:
11634     case 0x43:
11635     case 0x44:
11636     case 0x45:
11637     case 0x46:
11638     case 0x47:
11639     case 0x48:
11640     case 0x49:
11641     case 0x4a:
11642     case 0x4b:
11643     case 0x4c:
11644     case 0x4d:
11645     case 0x4e:
11646     case 0x4f:
11647       return rexes [pref - 0x40];
11648     case 0xf3:
11649       return "repz";
11650     case 0xf2:
11651       return "repnz";
11652     case 0xf0:
11653       return "lock";
11654     case 0x2e:
11655       return "cs";
11656     case 0x36:
11657       return "ss";
11658     case 0x3e:
11659       return "ds";
11660     case 0x26:
11661       return "es";
11662     case 0x64:
11663       return "fs";
11664     case 0x65:
11665       return "gs";
11666     case 0x66:
11667       return (sizeflag & DFLAG) ? "data16" : "data32";
11668     case 0x67:
11669       if (address_mode == mode_64bit)
11670         return (sizeflag & AFLAG) ? "addr32" : "addr64";
11671       else
11672         return (sizeflag & AFLAG) ? "addr16" : "addr32";
11673     case FWAIT_OPCODE:
11674       return "fwait";
11675     case ADDR16_PREFIX:
11676       return "addr16";
11677     case ADDR32_PREFIX:
11678       return "addr32";
11679     case DATA16_PREFIX:
11680       return "data16";
11681     case DATA32_PREFIX:
11682       return "data32";
11683     case REP_PREFIX:
11684       return "rep";
11685     default:
11686       return NULL;
11687     }
11688 }
11689
11690 static char op_out[MAX_OPERANDS][100];
11691 static int op_ad, op_index[MAX_OPERANDS];
11692 static int two_source_ops;
11693 static bfd_vma op_address[MAX_OPERANDS];
11694 static bfd_vma op_riprel[MAX_OPERANDS];
11695 static bfd_vma start_pc;
11696
11697 /*
11698  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11699  *   (see topic "Redundant prefixes" in the "Differences from 8086"
11700  *   section of the "Virtual 8086 Mode" chapter.)
11701  * 'pc' should be the address of this instruction, it will
11702  *   be used to print the target address if this is a relative jump or call
11703  * The function returns the length of this instruction in bytes.
11704  */
11705
11706 static char intel_syntax;
11707 static char intel_mnemonic = !SYSV386_COMPAT;
11708 static char open_char;
11709 static char close_char;
11710 static char separator_char;
11711 static char scale_char;
11712
11713 /* Here for backwards compatibility.  When gdb stops using
11714    print_insn_i386_att and print_insn_i386_intel these functions can
11715    disappear, and print_insn_i386 be merged into print_insn.  */
11716 int
11717 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11718 {
11719   intel_syntax = 0;
11720
11721   return print_insn (pc, info);
11722 }
11723
11724 int
11725 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11726 {
11727   intel_syntax = 1;
11728
11729   return print_insn (pc, info);
11730 }
11731
11732 int
11733 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11734 {
11735   intel_syntax = -1;
11736
11737   return print_insn (pc, info);
11738 }
11739
11740 void
11741 print_i386_disassembler_options (FILE *stream)
11742 {
11743   fprintf (stream, _("\n\
11744 The following i386/x86-64 specific disassembler options are supported for use\n\
11745 with the -M switch (multiple options should be separated by commas):\n"));
11746
11747   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
11748   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
11749   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
11750   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
11751   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
11752   fprintf (stream, _("  att-mnemonic\n"
11753                      "              Display instruction in AT&T mnemonic\n"));
11754   fprintf (stream, _("  intel-mnemonic\n"
11755                      "              Display instruction in Intel mnemonic\n"));
11756   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
11757   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
11758   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
11759   fprintf (stream, _("  data32      Assume 32bit data size\n"));
11760   fprintf (stream, _("  data16      Assume 16bit data size\n"));
11761   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
11762 }
11763
11764 /* Get a pointer to struct dis386 with a valid name.  */
11765
11766 static const struct dis386 *
11767 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11768 {
11769   int vindex, vex_table_index;
11770
11771   if (dp->name != NULL)
11772     return dp;
11773
11774   switch (dp->op[0].bytemode)
11775     {
11776     case USE_REG_TABLE:
11777       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11778       break;
11779
11780     case USE_MOD_TABLE:
11781       vindex = modrm.mod == 0x3 ? 1 : 0;
11782       dp = &mod_table[dp->op[1].bytemode][vindex];
11783       break;
11784
11785     case USE_RM_TABLE:
11786       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11787       break;
11788
11789     case USE_PREFIX_TABLE:
11790       if (need_vex)
11791         {
11792           /* The prefix in VEX is implicit.  */
11793           switch (vex.prefix)
11794             {
11795             case 0:
11796               vindex = 0;
11797               break;
11798             case REPE_PREFIX_OPCODE:
11799               vindex = 1;
11800               break;
11801             case DATA_PREFIX_OPCODE:
11802               vindex = 2;
11803               break;
11804             case REPNE_PREFIX_OPCODE:
11805               vindex = 3;
11806               break;
11807             default:
11808               abort ();
11809               break;
11810             }
11811         }
11812       else 
11813         {
11814           vindex = 0;
11815           used_prefixes |= (prefixes & PREFIX_REPZ);
11816           if (prefixes & PREFIX_REPZ)
11817             {
11818               vindex = 1;
11819               all_prefixes[last_repz_prefix] = 0;
11820             }
11821           else
11822             {
11823               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
11824                  PREFIX_DATA.  */
11825               used_prefixes |= (prefixes & PREFIX_REPNZ);
11826               if (prefixes & PREFIX_REPNZ)
11827                 {
11828                   vindex = 3;
11829                   all_prefixes[last_repnz_prefix] = 0;
11830                 }
11831               else
11832                 {
11833                   used_prefixes |= (prefixes & PREFIX_DATA);
11834                   if (prefixes & PREFIX_DATA)
11835                     {
11836                       vindex = 2;
11837                       all_prefixes[last_data_prefix] = 0;
11838                     }
11839                 }
11840             }
11841         }
11842       dp = &prefix_table[dp->op[1].bytemode][vindex];
11843       break;
11844
11845     case USE_X86_64_TABLE:
11846       vindex = address_mode == mode_64bit ? 1 : 0;
11847       dp = &x86_64_table[dp->op[1].bytemode][vindex];
11848       break;
11849
11850     case USE_3BYTE_TABLE:
11851       FETCH_DATA (info, codep + 2);
11852       vindex = *codep++;
11853       dp = &three_byte_table[dp->op[1].bytemode][vindex];
11854       modrm.mod = (*codep >> 6) & 3;
11855       modrm.reg = (*codep >> 3) & 7;
11856       modrm.rm = *codep & 7;
11857       break;
11858
11859     case USE_VEX_LEN_TABLE:
11860       if (!need_vex)
11861         abort ();
11862
11863       switch (vex.length)
11864         {
11865         case 128:
11866           vindex = 0;
11867           break;
11868         case 256:
11869           vindex = 1;
11870           break;
11871         default:
11872           abort ();
11873           break;
11874         }
11875
11876       dp = &vex_len_table[dp->op[1].bytemode][vindex];
11877       break;
11878
11879     case USE_XOP_8F_TABLE:
11880       FETCH_DATA (info, codep + 3);
11881       /* All bits in the REX prefix are ignored.  */
11882       rex_ignored = rex;
11883       rex = ~(*codep >> 5) & 0x7;
11884
11885       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
11886       switch ((*codep & 0x1f))
11887         {
11888         default:
11889           BadOp ();
11890         case 0x8:
11891           vex_table_index = XOP_08;
11892           break;
11893         case 0x9:
11894           vex_table_index = XOP_09;
11895           break;
11896         case 0xa:
11897           vex_table_index = XOP_0A;
11898           break;
11899         }
11900       codep++;
11901       vex.w = *codep & 0x80;
11902       if (vex.w && address_mode == mode_64bit)
11903         rex |= REX_W;
11904
11905       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11906       if (address_mode != mode_64bit
11907           && vex.register_specifier > 0x7)
11908         BadOp ();
11909
11910       vex.length = (*codep & 0x4) ? 256 : 128;
11911       switch ((*codep & 0x3))
11912         {
11913         case 0:
11914           vex.prefix = 0;
11915           break;
11916         case 1:
11917           vex.prefix = DATA_PREFIX_OPCODE;
11918           break;
11919         case 2:
11920           vex.prefix = REPE_PREFIX_OPCODE;
11921           break;
11922         case 3:
11923           vex.prefix = REPNE_PREFIX_OPCODE;
11924           break;
11925         }
11926       need_vex = 1;
11927       need_vex_reg = 1;
11928       codep++;
11929       vindex = *codep++;
11930       dp = &xop_table[vex_table_index][vindex];
11931
11932       FETCH_DATA (info, codep + 1);
11933       modrm.mod = (*codep >> 6) & 3;
11934       modrm.reg = (*codep >> 3) & 7;
11935       modrm.rm = *codep & 7;
11936       break;
11937
11938     case USE_VEX_C4_TABLE:
11939       FETCH_DATA (info, codep + 3);
11940       /* All bits in the REX prefix are ignored.  */
11941       rex_ignored = rex;
11942       rex = ~(*codep >> 5) & 0x7;
11943       switch ((*codep & 0x1f))
11944         {
11945         default:
11946           BadOp ();
11947         case 0x1:
11948           vex_table_index = VEX_0F;
11949           break;
11950         case 0x2:
11951           vex_table_index = VEX_0F38;
11952           break;
11953         case 0x3:
11954           vex_table_index = VEX_0F3A;
11955           break;
11956         }
11957       codep++;
11958       vex.w = *codep & 0x80;
11959       if (vex.w && address_mode == mode_64bit)
11960         rex |= REX_W;
11961
11962       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11963       if (address_mode != mode_64bit
11964           && vex.register_specifier > 0x7)
11965         BadOp ();
11966
11967       vex.length = (*codep & 0x4) ? 256 : 128;
11968       switch ((*codep & 0x3))
11969         {
11970         case 0:
11971           vex.prefix = 0;
11972           break;
11973         case 1:
11974           vex.prefix = DATA_PREFIX_OPCODE;
11975           break;
11976         case 2:
11977           vex.prefix = REPE_PREFIX_OPCODE;
11978           break;
11979         case 3:
11980           vex.prefix = REPNE_PREFIX_OPCODE;
11981           break;
11982         }
11983       need_vex = 1;
11984       need_vex_reg = 1;
11985       codep++;
11986       vindex = *codep++;
11987       dp = &vex_table[vex_table_index][vindex];
11988       /* There is no MODRM byte for VEX [82|77].  */
11989       if (vindex != 0x77 && vindex != 0x82)
11990         {
11991           FETCH_DATA (info, codep + 1);
11992           modrm.mod = (*codep >> 6) & 3;
11993           modrm.reg = (*codep >> 3) & 7;
11994           modrm.rm = *codep & 7;
11995         }
11996       break;
11997
11998     case USE_VEX_C5_TABLE:
11999       FETCH_DATA (info, codep + 2);
12000       /* All bits in the REX prefix are ignored.  */
12001       rex_ignored = rex;
12002       rex = (*codep & 0x80) ? 0 : REX_R;
12003
12004       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12005       if (address_mode != mode_64bit
12006           && vex.register_specifier > 0x7)
12007         BadOp ();
12008
12009       vex.w = 0;
12010
12011       vex.length = (*codep & 0x4) ? 256 : 128;
12012       switch ((*codep & 0x3))
12013         {
12014         case 0:
12015           vex.prefix = 0;
12016           break;
12017         case 1:
12018           vex.prefix = DATA_PREFIX_OPCODE;
12019           break;
12020         case 2:
12021           vex.prefix = REPE_PREFIX_OPCODE;
12022           break;
12023         case 3:
12024           vex.prefix = REPNE_PREFIX_OPCODE;
12025           break;
12026         }
12027       need_vex = 1;
12028       need_vex_reg = 1;
12029       codep++;
12030       vindex = *codep++;
12031       dp = &vex_table[dp->op[1].bytemode][vindex];
12032       /* There is no MODRM byte for VEX [82|77].  */
12033       if (vindex != 0x77 && vindex != 0x82)
12034         {
12035           FETCH_DATA (info, codep + 1);
12036           modrm.mod = (*codep >> 6) & 3;
12037           modrm.reg = (*codep >> 3) & 7;
12038           modrm.rm = *codep & 7;
12039         }
12040       break;
12041
12042     case USE_VEX_W_TABLE:
12043       if (!need_vex)
12044         abort ();
12045
12046       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12047       break;
12048
12049     default:
12050       abort ();
12051     }
12052
12053   if (dp->name != NULL)
12054     return dp;
12055   else
12056     return get_valid_dis386 (dp, info);
12057 }
12058
12059 static int
12060 print_insn (bfd_vma pc, disassemble_info *info)
12061 {
12062   const struct dis386 *dp;
12063   int i;
12064   char *op_txt[MAX_OPERANDS];
12065   int needcomma;
12066   int sizeflag;
12067   const char *p;
12068   struct dis_private priv;
12069   unsigned char op;
12070   int prefix_length;
12071   int default_prefixes;
12072
12073   if (info->mach == bfd_mach_x86_64_intel_syntax
12074       || info->mach == bfd_mach_x86_64
12075       || info->mach == bfd_mach_l1om
12076       || info->mach == bfd_mach_l1om_intel_syntax)
12077     address_mode = mode_64bit;
12078   else
12079     address_mode = mode_32bit;
12080
12081   if (intel_syntax == (char) -1)
12082     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
12083                     || info->mach == bfd_mach_x86_64_intel_syntax
12084                     || info->mach == bfd_mach_l1om_intel_syntax);
12085
12086   if (info->mach == bfd_mach_i386_i386
12087       || info->mach == bfd_mach_x86_64
12088       || info->mach == bfd_mach_l1om
12089       || info->mach == bfd_mach_i386_i386_intel_syntax
12090       || info->mach == bfd_mach_x86_64_intel_syntax
12091       || info->mach == bfd_mach_l1om_intel_syntax)
12092     priv.orig_sizeflag = AFLAG | DFLAG;
12093   else if (info->mach == bfd_mach_i386_i8086)
12094     priv.orig_sizeflag = 0;
12095   else
12096     abort ();
12097
12098   for (p = info->disassembler_options; p != NULL; )
12099     {
12100       if (CONST_STRNEQ (p, "x86-64"))
12101         {
12102           address_mode = mode_64bit;
12103           priv.orig_sizeflag = AFLAG | DFLAG;
12104         }
12105       else if (CONST_STRNEQ (p, "i386"))
12106         {
12107           address_mode = mode_32bit;
12108           priv.orig_sizeflag = AFLAG | DFLAG;
12109         }
12110       else if (CONST_STRNEQ (p, "i8086"))
12111         {
12112           address_mode = mode_16bit;
12113           priv.orig_sizeflag = 0;
12114         }
12115       else if (CONST_STRNEQ (p, "intel"))
12116         {
12117           intel_syntax = 1;
12118           if (CONST_STRNEQ (p + 5, "-mnemonic"))
12119             intel_mnemonic = 1;
12120         }
12121       else if (CONST_STRNEQ (p, "att"))
12122         {
12123           intel_syntax = 0;
12124           if (CONST_STRNEQ (p + 3, "-mnemonic"))
12125             intel_mnemonic = 0;
12126         }
12127       else if (CONST_STRNEQ (p, "addr"))
12128         {
12129           if (address_mode == mode_64bit)
12130             {
12131               if (p[4] == '3' && p[5] == '2')
12132                 priv.orig_sizeflag &= ~AFLAG;
12133               else if (p[4] == '6' && p[5] == '4')
12134                 priv.orig_sizeflag |= AFLAG;
12135             }
12136           else
12137             {
12138               if (p[4] == '1' && p[5] == '6')
12139                 priv.orig_sizeflag &= ~AFLAG;
12140               else if (p[4] == '3' && p[5] == '2')
12141                 priv.orig_sizeflag |= AFLAG;
12142             }
12143         }
12144       else if (CONST_STRNEQ (p, "data"))
12145         {
12146           if (p[4] == '1' && p[5] == '6')
12147             priv.orig_sizeflag &= ~DFLAG;
12148           else if (p[4] == '3' && p[5] == '2')
12149             priv.orig_sizeflag |= DFLAG;
12150         }
12151       else if (CONST_STRNEQ (p, "suffix"))
12152         priv.orig_sizeflag |= SUFFIX_ALWAYS;
12153
12154       p = strchr (p, ',');
12155       if (p != NULL)
12156         p++;
12157     }
12158
12159   if (intel_syntax)
12160     {
12161       names64 = intel_names64;
12162       names32 = intel_names32;
12163       names16 = intel_names16;
12164       names8 = intel_names8;
12165       names8rex = intel_names8rex;
12166       names_seg = intel_names_seg;
12167       names_mm = intel_names_mm;
12168       names_xmm = intel_names_xmm;
12169       names_ymm = intel_names_ymm;
12170       index64 = intel_index64;
12171       index32 = intel_index32;
12172       index16 = intel_index16;
12173       open_char = '[';
12174       close_char = ']';
12175       separator_char = '+';
12176       scale_char = '*';
12177     }
12178   else
12179     {
12180       names64 = att_names64;
12181       names32 = att_names32;
12182       names16 = att_names16;
12183       names8 = att_names8;
12184       names8rex = att_names8rex;
12185       names_seg = att_names_seg;
12186       names_mm = att_names_mm;
12187       names_xmm = att_names_xmm;
12188       names_ymm = att_names_ymm;
12189       index64 = att_index64;
12190       index32 = att_index32;
12191       index16 = att_index16;
12192       open_char = '(';
12193       close_char =  ')';
12194       separator_char = ',';
12195       scale_char = ',';
12196     }
12197
12198   /* The output looks better if we put 7 bytes on a line, since that
12199      puts most long word instructions on a single line.  Use 8 bytes
12200      for Intel L1OM.  */
12201   if (info->mach == bfd_mach_l1om
12202       || info->mach == bfd_mach_l1om_intel_syntax)
12203     info->bytes_per_line = 8;
12204   else
12205     info->bytes_per_line = 7;
12206
12207   info->private_data = &priv;
12208   priv.max_fetched = priv.the_buffer;
12209   priv.insn_start = pc;
12210
12211   obuf[0] = 0;
12212   for (i = 0; i < MAX_OPERANDS; ++i)
12213     {
12214       op_out[i][0] = 0;
12215       op_index[i] = -1;
12216     }
12217
12218   the_info = info;
12219   start_pc = pc;
12220   start_codep = priv.the_buffer;
12221   codep = priv.the_buffer;
12222
12223   if (setjmp (priv.bailout) != 0)
12224     {
12225       const char *name;
12226
12227       /* Getting here means we tried for data but didn't get it.  That
12228          means we have an incomplete instruction of some sort.  Just
12229          print the first byte as a prefix or a .byte pseudo-op.  */
12230       if (codep > priv.the_buffer)
12231         {
12232           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12233           if (name != NULL)
12234             (*info->fprintf_func) (info->stream, "%s", name);
12235           else
12236             {
12237               /* Just print the first byte as a .byte instruction.  */
12238               (*info->fprintf_func) (info->stream, ".byte 0x%x",
12239                                      (unsigned int) priv.the_buffer[0]);
12240             }
12241
12242           return 1;
12243         }
12244
12245       return -1;
12246     }
12247
12248   obufp = obuf;
12249   sizeflag = priv.orig_sizeflag;
12250
12251   if (!ckprefix () || rex_used)
12252     {
12253       /* Too many prefixes or unused REX prefixes.  */
12254       for (i = 0;
12255            all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
12256            i++)
12257         (*info->fprintf_func) (info->stream, "%s",
12258                                prefix_name (all_prefixes[i], sizeflag));
12259       return 1;
12260     }
12261
12262   insn_codep = codep;
12263
12264   FETCH_DATA (info, codep + 1);
12265   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12266
12267   if (((prefixes & PREFIX_FWAIT)
12268        && ((*codep < 0xd8) || (*codep > 0xdf))))
12269     {
12270       (*info->fprintf_func) (info->stream, "fwait");
12271       return 1;
12272     }
12273
12274   op = 0;
12275
12276   if (*codep == 0x0f)
12277     {
12278       unsigned char threebyte;
12279       FETCH_DATA (info, codep + 2);
12280       threebyte = *++codep;
12281       dp = &dis386_twobyte[threebyte];
12282       need_modrm = twobyte_has_modrm[*codep];
12283       codep++;
12284     }
12285   else
12286     {
12287       dp = &dis386[*codep];
12288       need_modrm = onebyte_has_modrm[*codep];
12289       codep++;
12290     }
12291
12292   if ((prefixes & PREFIX_REPZ))
12293     used_prefixes |= PREFIX_REPZ;
12294   if ((prefixes & PREFIX_REPNZ))
12295     used_prefixes |= PREFIX_REPNZ;
12296   if ((prefixes & PREFIX_LOCK))
12297     used_prefixes |= PREFIX_LOCK;
12298
12299   default_prefixes = 0;
12300   if (prefixes & PREFIX_ADDR)
12301     {
12302       sizeflag ^= AFLAG;
12303       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
12304         {
12305           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12306             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
12307           else
12308             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
12309           default_prefixes |= PREFIX_ADDR;
12310         }
12311     }
12312
12313   if ((prefixes & PREFIX_DATA))
12314     {
12315       sizeflag ^= DFLAG;
12316       if (dp->op[2].bytemode == cond_jump_mode
12317           && dp->op[0].bytemode == v_mode
12318           && !intel_syntax)
12319         {
12320           if (sizeflag & DFLAG)
12321             all_prefixes[last_data_prefix] = DATA32_PREFIX;
12322           else
12323             all_prefixes[last_data_prefix] = DATA16_PREFIX;
12324           default_prefixes |= PREFIX_DATA;
12325         }
12326       else if (rex & REX_W)
12327         {
12328           /* REX_W will override PREFIX_DATA.  */
12329           default_prefixes |= PREFIX_DATA;
12330         }
12331     }
12332
12333   if (need_modrm)
12334     {
12335       FETCH_DATA (info, codep + 1);
12336       modrm.mod = (*codep >> 6) & 3;
12337       modrm.reg = (*codep >> 3) & 7;
12338       modrm.rm = *codep & 7;
12339     }
12340
12341    need_vex = 0;
12342    need_vex_reg = 0;
12343    vex_w_done = 0;
12344
12345   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12346     {
12347       dofloat (sizeflag);
12348     }
12349   else
12350     {
12351       dp = get_valid_dis386 (dp, info);
12352       if (dp != NULL && putop (dp->name, sizeflag) == 0)
12353         {
12354           for (i = 0; i < MAX_OPERANDS; ++i)
12355             {
12356               obufp = op_out[i];
12357               op_ad = MAX_OPERANDS - 1 - i;
12358               if (dp->op[i].rtn)
12359                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12360             }
12361         }
12362     }
12363
12364   /* See if any prefixes were not used.  If so, print the first one
12365      separately.  If we don't do this, we'll wind up printing an
12366      instruction stream which does not precisely correspond to the
12367      bytes we are disassembling.  */
12368   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
12369     {
12370       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12371         if (all_prefixes[i])
12372           {
12373             const char *name;
12374             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
12375             if (name == NULL)
12376               name = INTERNAL_DISASSEMBLER_ERROR;
12377             (*info->fprintf_func) (info->stream, "%s", name);
12378             return 1;
12379           }
12380     }
12381
12382   /* Check if the REX prefix is used.  */
12383   if (rex_ignored == 0 && (rex ^ rex_used) == 0)
12384     all_prefixes[last_rex_prefix] = 0;
12385
12386   /* Check if the SEG prefix is used.  */
12387   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12388                    | PREFIX_FS | PREFIX_GS)) != 0
12389       && (used_prefixes
12390           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
12391     all_prefixes[last_seg_prefix] = 0;
12392
12393   /* Check if the ADDR prefix is used.  */
12394   if ((prefixes & PREFIX_ADDR) != 0
12395       && (used_prefixes & PREFIX_ADDR) != 0)
12396     all_prefixes[last_addr_prefix] = 0;
12397
12398   /* Check if the DATA prefix is used.  */
12399   if ((prefixes & PREFIX_DATA) != 0
12400       && (used_prefixes & PREFIX_DATA) != 0)
12401     all_prefixes[last_data_prefix] = 0;
12402
12403   prefix_length = 0;
12404   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12405     if (all_prefixes[i])
12406       {
12407         const char *name;
12408         name = prefix_name (all_prefixes[i], sizeflag);
12409         if (name == NULL)
12410           abort ();
12411         prefix_length += strlen (name) + 1;
12412         (*info->fprintf_func) (info->stream, "%s ", name);
12413       }
12414
12415   /* Check maximum code length.  */
12416   if ((codep - start_codep) > MAX_CODE_LENGTH)
12417     {
12418       (*info->fprintf_func) (info->stream, "(bad)");
12419       return MAX_CODE_LENGTH;
12420     }
12421
12422   obufp = mnemonicendp;
12423   for (i = strlen (obuf) + prefix_length; i < 6; i++)
12424     oappend (" ");
12425   oappend (" ");
12426   (*info->fprintf_func) (info->stream, "%s", obuf);
12427
12428   /* The enter and bound instructions are printed with operands in the same
12429      order as the intel book; everything else is printed in reverse order.  */
12430   if (intel_syntax || two_source_ops)
12431     {
12432       bfd_vma riprel;
12433
12434       for (i = 0; i < MAX_OPERANDS; ++i)
12435         op_txt[i] = op_out[i];
12436
12437       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12438         {
12439           op_ad = op_index[i];
12440           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12441           op_index[MAX_OPERANDS - 1 - i] = op_ad;
12442           riprel = op_riprel[i];
12443           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12444           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12445         }
12446     }
12447   else
12448     {
12449       for (i = 0; i < MAX_OPERANDS; ++i)
12450         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12451     }
12452
12453   needcomma = 0;
12454   for (i = 0; i < MAX_OPERANDS; ++i)
12455     if (*op_txt[i])
12456       {
12457         if (needcomma)
12458           (*info->fprintf_func) (info->stream, ",");
12459         if (op_index[i] != -1 && !op_riprel[i])
12460           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12461         else
12462           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12463         needcomma = 1;
12464       }
12465
12466   for (i = 0; i < MAX_OPERANDS; i++)
12467     if (op_index[i] != -1 && op_riprel[i])
12468       {
12469         (*info->fprintf_func) (info->stream, "        # ");
12470         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
12471                                                 + op_address[op_index[i]]), info);
12472         break;
12473       }
12474   return codep - priv.the_buffer;
12475 }
12476
12477 static const char *float_mem[] = {
12478   /* d8 */
12479   "fadd{s|}",
12480   "fmul{s|}",
12481   "fcom{s|}",
12482   "fcomp{s|}",
12483   "fsub{s|}",
12484   "fsubr{s|}",
12485   "fdiv{s|}",
12486   "fdivr{s|}",
12487   /* d9 */
12488   "fld{s|}",
12489   "(bad)",
12490   "fst{s|}",
12491   "fstp{s|}",
12492   "fldenvIC",
12493   "fldcw",
12494   "fNstenvIC",
12495   "fNstcw",
12496   /* da */
12497   "fiadd{l|}",
12498   "fimul{l|}",
12499   "ficom{l|}",
12500   "ficomp{l|}",
12501   "fisub{l|}",
12502   "fisubr{l|}",
12503   "fidiv{l|}",
12504   "fidivr{l|}",
12505   /* db */
12506   "fild{l|}",
12507   "fisttp{l|}",
12508   "fist{l|}",
12509   "fistp{l|}",
12510   "(bad)",
12511   "fld{t||t|}",
12512   "(bad)",
12513   "fstp{t||t|}",
12514   /* dc */
12515   "fadd{l|}",
12516   "fmul{l|}",
12517   "fcom{l|}",
12518   "fcomp{l|}",
12519   "fsub{l|}",
12520   "fsubr{l|}",
12521   "fdiv{l|}",
12522   "fdivr{l|}",
12523   /* dd */
12524   "fld{l|}",
12525   "fisttp{ll|}",
12526   "fst{l||}",
12527   "fstp{l|}",
12528   "frstorIC",
12529   "(bad)",
12530   "fNsaveIC",
12531   "fNstsw",
12532   /* de */
12533   "fiadd",
12534   "fimul",
12535   "ficom",
12536   "ficomp",
12537   "fisub",
12538   "fisubr",
12539   "fidiv",
12540   "fidivr",
12541   /* df */
12542   "fild",
12543   "fisttp",
12544   "fist",
12545   "fistp",
12546   "fbld",
12547   "fild{ll|}",
12548   "fbstp",
12549   "fistp{ll|}",
12550 };
12551
12552 static const unsigned char float_mem_mode[] = {
12553   /* d8 */
12554   d_mode,
12555   d_mode,
12556   d_mode,
12557   d_mode,
12558   d_mode,
12559   d_mode,
12560   d_mode,
12561   d_mode,
12562   /* d9 */
12563   d_mode,
12564   0,
12565   d_mode,
12566   d_mode,
12567   0,
12568   w_mode,
12569   0,
12570   w_mode,
12571   /* da */
12572   d_mode,
12573   d_mode,
12574   d_mode,
12575   d_mode,
12576   d_mode,
12577   d_mode,
12578   d_mode,
12579   d_mode,
12580   /* db */
12581   d_mode,
12582   d_mode,
12583   d_mode,
12584   d_mode,
12585   0,
12586   t_mode,
12587   0,
12588   t_mode,
12589   /* dc */
12590   q_mode,
12591   q_mode,
12592   q_mode,
12593   q_mode,
12594   q_mode,
12595   q_mode,
12596   q_mode,
12597   q_mode,
12598   /* dd */
12599   q_mode,
12600   q_mode,
12601   q_mode,
12602   q_mode,
12603   0,
12604   0,
12605   0,
12606   w_mode,
12607   /* de */
12608   w_mode,
12609   w_mode,
12610   w_mode,
12611   w_mode,
12612   w_mode,
12613   w_mode,
12614   w_mode,
12615   w_mode,
12616   /* df */
12617   w_mode,
12618   w_mode,
12619   w_mode,
12620   w_mode,
12621   t_mode,
12622   q_mode,
12623   t_mode,
12624   q_mode
12625 };
12626
12627 #define ST { OP_ST, 0 }
12628 #define STi { OP_STi, 0 }
12629
12630 #define FGRPd9_2 NULL, { { NULL, 0 } }
12631 #define FGRPd9_4 NULL, { { NULL, 1 } }
12632 #define FGRPd9_5 NULL, { { NULL, 2 } }
12633 #define FGRPd9_6 NULL, { { NULL, 3 } }
12634 #define FGRPd9_7 NULL, { { NULL, 4 } }
12635 #define FGRPda_5 NULL, { { NULL, 5 } }
12636 #define FGRPdb_4 NULL, { { NULL, 6 } }
12637 #define FGRPde_3 NULL, { { NULL, 7 } }
12638 #define FGRPdf_4 NULL, { { NULL, 8 } }
12639
12640 static const struct dis386 float_reg[][8] = {
12641   /* d8 */
12642   {
12643     { "fadd",   { ST, STi } },
12644     { "fmul",   { ST, STi } },
12645     { "fcom",   { STi } },
12646     { "fcomp",  { STi } },
12647     { "fsub",   { ST, STi } },
12648     { "fsubr",  { ST, STi } },
12649     { "fdiv",   { ST, STi } },
12650     { "fdivr",  { ST, STi } },
12651   },
12652   /* d9 */
12653   {
12654     { "fld",    { STi } },
12655     { "fxch",   { STi } },
12656     { FGRPd9_2 },
12657     { "(bad)",  { XX } },
12658     { FGRPd9_4 },
12659     { FGRPd9_5 },
12660     { FGRPd9_6 },
12661     { FGRPd9_7 },
12662   },
12663   /* da */
12664   {
12665     { "fcmovb", { ST, STi } },
12666     { "fcmove", { ST, STi } },
12667     { "fcmovbe",{ ST, STi } },
12668     { "fcmovu", { ST, STi } },
12669     { "(bad)",  { XX } },
12670     { FGRPda_5 },
12671     { "(bad)",  { XX } },
12672     { "(bad)",  { XX } },
12673   },
12674   /* db */
12675   {
12676     { "fcmovnb",{ ST, STi } },
12677     { "fcmovne",{ ST, STi } },
12678     { "fcmovnbe",{ ST, STi } },
12679     { "fcmovnu",{ ST, STi } },
12680     { FGRPdb_4 },
12681     { "fucomi", { ST, STi } },
12682     { "fcomi",  { ST, STi } },
12683     { "(bad)",  { XX } },
12684   },
12685   /* dc */
12686   {
12687     { "fadd",   { STi, ST } },
12688     { "fmul",   { STi, ST } },
12689     { "(bad)",  { XX } },
12690     { "(bad)",  { XX } },
12691     { "fsub!M", { STi, ST } },
12692     { "fsubM",  { STi, ST } },
12693     { "fdiv!M", { STi, ST } },
12694     { "fdivM",  { STi, ST } },
12695   },
12696   /* dd */
12697   {
12698     { "ffree",  { STi } },
12699     { "(bad)",  { XX } },
12700     { "fst",    { STi } },
12701     { "fstp",   { STi } },
12702     { "fucom",  { STi } },
12703     { "fucomp", { STi } },
12704     { "(bad)",  { XX } },
12705     { "(bad)",  { XX } },
12706   },
12707   /* de */
12708   {
12709     { "faddp",  { STi, ST } },
12710     { "fmulp",  { STi, ST } },
12711     { "(bad)",  { XX } },
12712     { FGRPde_3 },
12713     { "fsub!Mp", { STi, ST } },
12714     { "fsubMp", { STi, ST } },
12715     { "fdiv!Mp", { STi, ST } },
12716     { "fdivMp", { STi, ST } },
12717   },
12718   /* df */
12719   {
12720     { "ffreep", { STi } },
12721     { "(bad)",  { XX } },
12722     { "(bad)",  { XX } },
12723     { "(bad)",  { XX } },
12724     { FGRPdf_4 },
12725     { "fucomip", { ST, STi } },
12726     { "fcomip", { ST, STi } },
12727     { "(bad)",  { XX } },
12728   },
12729 };
12730
12731 static char *fgrps[][8] = {
12732   /* d9_2  0 */
12733   {
12734     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12735   },
12736
12737   /* d9_4  1 */
12738   {
12739     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12740   },
12741
12742   /* d9_5  2 */
12743   {
12744     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12745   },
12746
12747   /* d9_6  3 */
12748   {
12749     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12750   },
12751
12752   /* d9_7  4 */
12753   {
12754     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12755   },
12756
12757   /* da_5  5 */
12758   {
12759     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12760   },
12761
12762   /* db_4  6 */
12763   {
12764     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12765     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12766   },
12767
12768   /* de_3  7 */
12769   {
12770     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12771   },
12772
12773   /* df_4  8 */
12774   {
12775     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12776   },
12777 };
12778
12779 static void
12780 swap_operand (void)
12781 {
12782   mnemonicendp[0] = '.';
12783   mnemonicendp[1] = 's';
12784   mnemonicendp += 2;
12785 }
12786
12787 static void
12788 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12789                int sizeflag ATTRIBUTE_UNUSED)
12790 {
12791   /* Skip mod/rm byte.  */
12792   MODRM_CHECK;
12793   codep++;
12794 }
12795
12796 static void
12797 dofloat (int sizeflag)
12798 {
12799   const struct dis386 *dp;
12800   unsigned char floatop;
12801
12802   floatop = codep[-1];
12803
12804   if (modrm.mod != 3)
12805     {
12806       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12807
12808       putop (float_mem[fp_indx], sizeflag);
12809       obufp = op_out[0];
12810       op_ad = 2;
12811       OP_E (float_mem_mode[fp_indx], sizeflag);
12812       return;
12813     }
12814   /* Skip mod/rm byte.  */
12815   MODRM_CHECK;
12816   codep++;
12817
12818   dp = &float_reg[floatop - 0xd8][modrm.reg];
12819   if (dp->name == NULL)
12820     {
12821       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12822
12823       /* Instruction fnstsw is only one with strange arg.  */
12824       if (floatop == 0xdf && codep[-1] == 0xe0)
12825         strcpy (op_out[0], names16[0]);
12826     }
12827   else
12828     {
12829       putop (dp->name, sizeflag);
12830
12831       obufp = op_out[0];
12832       op_ad = 2;
12833       if (dp->op[0].rtn)
12834         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12835
12836       obufp = op_out[1];
12837       op_ad = 1;
12838       if (dp->op[1].rtn)
12839         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12840     }
12841 }
12842
12843 static void
12844 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12845 {
12846   oappend ("%st" + intel_syntax);
12847 }
12848
12849 static void
12850 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12851 {
12852   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12853   oappend (scratchbuf + intel_syntax);
12854 }
12855
12856 /* Capital letters in template are macros.  */
12857 static int
12858 putop (const char *in_template, int sizeflag)
12859 {
12860   const char *p;
12861   int alt = 0;
12862   int cond = 1;
12863   unsigned int l = 0, len = 1;
12864   char last[4];
12865
12866 #define SAVE_LAST(c)                    \
12867   if (l < len && l < sizeof (last))     \
12868     last[l++] = c;                      \
12869   else                                  \
12870     abort ();
12871
12872   for (p = in_template; *p; p++)
12873     {
12874       switch (*p)
12875         {
12876         default:
12877           *obufp++ = *p;
12878           break;
12879         case '%':
12880           len++;
12881           break;
12882         case '!':
12883           cond = 0;
12884           break;
12885         case '{':
12886           alt = 0;
12887           if (intel_syntax)
12888             {
12889               while (*++p != '|')
12890                 if (*p == '}' || *p == '\0')
12891                   abort ();
12892             }
12893           /* Fall through.  */
12894         case 'I':
12895           alt = 1;
12896           continue;
12897         case '|':
12898           while (*++p != '}')
12899             {
12900               if (*p == '\0')
12901                 abort ();
12902             }
12903           break;
12904         case '}':
12905           break;
12906         case 'A':
12907           if (intel_syntax)
12908             break;
12909           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12910             *obufp++ = 'b';
12911           break;
12912         case 'B':
12913           if (l == 0 && len == 1)
12914             {
12915 case_B:
12916               if (intel_syntax)
12917                 break;
12918               if (sizeflag & SUFFIX_ALWAYS)
12919                 *obufp++ = 'b';
12920             }
12921           else
12922             {
12923               if (l != 1
12924                   || len != 2
12925                   || last[0] != 'L')
12926                 {
12927                   SAVE_LAST (*p);
12928                   break;
12929                 }
12930
12931               if (address_mode == mode_64bit
12932                   && !(prefixes & PREFIX_ADDR))
12933                 {
12934                   *obufp++ = 'a';
12935                   *obufp++ = 'b';
12936                   *obufp++ = 's';
12937                 }
12938
12939               goto case_B;
12940             }
12941           break;
12942         case 'C':
12943           if (intel_syntax && !alt)
12944             break;
12945           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12946             {
12947               if (sizeflag & DFLAG)
12948                 *obufp++ = intel_syntax ? 'd' : 'l';
12949               else
12950                 *obufp++ = intel_syntax ? 'w' : 's';
12951               used_prefixes |= (prefixes & PREFIX_DATA);
12952             }
12953           break;
12954         case 'D':
12955           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12956             break;
12957           USED_REX (REX_W);
12958           if (modrm.mod == 3)
12959             {
12960               if (rex & REX_W)
12961                 *obufp++ = 'q';
12962               else
12963                 {
12964                   if (sizeflag & DFLAG)
12965                     *obufp++ = intel_syntax ? 'd' : 'l';
12966                   else
12967                     *obufp++ = 'w';
12968                   used_prefixes |= (prefixes & PREFIX_DATA);
12969                 }
12970             }
12971           else
12972             *obufp++ = 'w';
12973           break;
12974         case 'E':               /* For jcxz/jecxz */
12975           if (address_mode == mode_64bit)
12976             {
12977               if (sizeflag & AFLAG)
12978                 *obufp++ = 'r';
12979               else
12980                 *obufp++ = 'e';
12981             }
12982           else
12983             if (sizeflag & AFLAG)
12984               *obufp++ = 'e';
12985           used_prefixes |= (prefixes & PREFIX_ADDR);
12986           break;
12987         case 'F':
12988           if (intel_syntax)
12989             break;
12990           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12991             {
12992               if (sizeflag & AFLAG)
12993                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12994               else
12995                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12996               used_prefixes |= (prefixes & PREFIX_ADDR);
12997             }
12998           break;
12999         case 'G':
13000           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13001             break;
13002           if ((rex & REX_W) || (sizeflag & DFLAG))
13003             *obufp++ = 'l';
13004           else
13005             *obufp++ = 'w';
13006           if (!(rex & REX_W))
13007             used_prefixes |= (prefixes & PREFIX_DATA);
13008           break;
13009         case 'H':
13010           if (intel_syntax)
13011             break;
13012           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13013               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13014             {
13015               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13016               *obufp++ = ',';
13017               *obufp++ = 'p';
13018               if (prefixes & PREFIX_DS)
13019                 *obufp++ = 't';
13020               else
13021                 *obufp++ = 'n';
13022             }
13023           break;
13024         case 'J':
13025           if (intel_syntax)
13026             break;
13027           *obufp++ = 'l';
13028           break;
13029         case 'K':
13030           USED_REX (REX_W);
13031           if (rex & REX_W)
13032             *obufp++ = 'q';
13033           else
13034             *obufp++ = 'd';
13035           break;
13036         case 'Z':
13037           if (intel_syntax)
13038             break;
13039           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13040             {
13041               *obufp++ = 'q';
13042               break;
13043             }
13044           /* Fall through.  */
13045           goto case_L;
13046         case 'L':
13047           if (l != 0 || len != 1)
13048             {
13049               SAVE_LAST (*p);
13050               break;
13051             }
13052 case_L:
13053           if (intel_syntax)
13054             break;
13055           if (sizeflag & SUFFIX_ALWAYS)
13056             *obufp++ = 'l';
13057           break;
13058         case 'M':
13059           if (intel_mnemonic != cond)
13060             *obufp++ = 'r';
13061           break;
13062         case 'N':
13063           if ((prefixes & PREFIX_FWAIT) == 0)
13064             *obufp++ = 'n';
13065           else
13066             used_prefixes |= PREFIX_FWAIT;
13067           break;
13068         case 'O':
13069           USED_REX (REX_W);
13070           if (rex & REX_W)
13071             *obufp++ = 'o';
13072           else if (intel_syntax && (sizeflag & DFLAG))
13073             *obufp++ = 'q';
13074           else
13075             *obufp++ = 'd';
13076           if (!(rex & REX_W))
13077             used_prefixes |= (prefixes & PREFIX_DATA);
13078           break;
13079         case 'T':
13080           if (intel_syntax)
13081             break;
13082           if (address_mode == mode_64bit && (sizeflag & DFLAG))
13083             {
13084               *obufp++ = 'q';
13085               break;
13086             }
13087           /* Fall through.  */
13088         case 'P':
13089           if (intel_syntax)
13090             break;
13091           if ((prefixes & PREFIX_DATA)
13092               || (rex & REX_W)
13093               || (sizeflag & SUFFIX_ALWAYS))
13094             {
13095               USED_REX (REX_W);
13096               if (rex & REX_W)
13097                 *obufp++ = 'q';
13098               else
13099                 {
13100                    if (sizeflag & DFLAG)
13101                       *obufp++ = 'l';
13102                    else
13103                      *obufp++ = 'w';
13104                    used_prefixes |= (prefixes & PREFIX_DATA);
13105                 }
13106             }
13107           break;
13108         case 'U':
13109           if (intel_syntax)
13110             break;
13111           if (address_mode == mode_64bit && (sizeflag & DFLAG))
13112             {
13113               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13114                 *obufp++ = 'q';
13115               break;
13116             }
13117           /* Fall through.  */
13118           goto case_Q;
13119         case 'Q':
13120           if (l == 0 && len == 1)
13121             {
13122 case_Q:
13123               if (intel_syntax && !alt)
13124                 break;
13125               USED_REX (REX_W);
13126               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13127                 {
13128                   if (rex & REX_W)
13129                     *obufp++ = 'q';
13130                   else
13131                     {
13132                       if (sizeflag & DFLAG)
13133                         *obufp++ = intel_syntax ? 'd' : 'l';
13134                       else
13135                         *obufp++ = 'w';
13136                       used_prefixes |= (prefixes & PREFIX_DATA);
13137                     }
13138                 }
13139             }
13140           else
13141             {
13142               if (l != 1 || len != 2 || last[0] != 'L')
13143                 {
13144                   SAVE_LAST (*p);
13145                   break;
13146                 }
13147               if (intel_syntax
13148                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13149                 break;
13150               if ((rex & REX_W))
13151                 {
13152                   USED_REX (REX_W);
13153                   *obufp++ = 'q';
13154                 }
13155               else
13156                 *obufp++ = 'l';
13157             }
13158           break;
13159         case 'R':
13160           USED_REX (REX_W);
13161           if (rex & REX_W)
13162             *obufp++ = 'q';
13163           else if (sizeflag & DFLAG)
13164             {
13165               if (intel_syntax)
13166                   *obufp++ = 'd';
13167               else
13168                   *obufp++ = 'l';
13169             }
13170           else
13171             *obufp++ = 'w';
13172           if (intel_syntax && !p[1]
13173               && ((rex & REX_W) || (sizeflag & DFLAG)))
13174             *obufp++ = 'e';
13175           if (!(rex & REX_W))
13176             used_prefixes |= (prefixes & PREFIX_DATA);
13177           break;
13178         case 'V':
13179           if (l == 0 && len == 1)
13180             {
13181               if (intel_syntax)
13182                 break;
13183               if (address_mode == mode_64bit && (sizeflag & DFLAG))
13184                 {
13185                   if (sizeflag & SUFFIX_ALWAYS)
13186                     *obufp++ = 'q';
13187                   break;
13188                 }
13189             }
13190           else
13191             {
13192               if (l != 1
13193                   || len != 2
13194                   || last[0] != 'L')
13195                 {
13196                   SAVE_LAST (*p);
13197                   break;
13198                 }
13199
13200               if (rex & REX_W)
13201                 {
13202                   *obufp++ = 'a';
13203                   *obufp++ = 'b';
13204                   *obufp++ = 's';
13205                 }
13206             }
13207           /* Fall through.  */
13208           goto case_S;
13209         case 'S':
13210           if (l == 0 && len == 1)
13211             {
13212 case_S:
13213               if (intel_syntax)
13214                 break;
13215               if (sizeflag & SUFFIX_ALWAYS)
13216                 {
13217                   if (rex & REX_W)
13218                     *obufp++ = 'q';
13219                   else
13220                     {
13221                       if (sizeflag & DFLAG)
13222                         *obufp++ = 'l';
13223                       else
13224                         *obufp++ = 'w';
13225                       used_prefixes |= (prefixes & PREFIX_DATA);
13226                     }
13227                 }
13228             }
13229           else
13230             {
13231               if (l != 1
13232                   || len != 2
13233                   || last[0] != 'L')
13234                 {
13235                   SAVE_LAST (*p);
13236                   break;
13237                 }
13238
13239               if (address_mode == mode_64bit
13240                   && !(prefixes & PREFIX_ADDR))
13241                 {
13242                   *obufp++ = 'a';
13243                   *obufp++ = 'b';
13244                   *obufp++ = 's';
13245                 }
13246
13247               goto case_S;
13248             }
13249           break;
13250         case 'X':
13251           if (l != 0 || len != 1)
13252             {
13253               SAVE_LAST (*p);
13254               break;
13255             }
13256           if (need_vex && vex.prefix)
13257             {
13258               if (vex.prefix == DATA_PREFIX_OPCODE)
13259                 *obufp++ = 'd';
13260               else
13261                 *obufp++ = 's';
13262             }
13263           else
13264             {
13265               if (prefixes & PREFIX_DATA)
13266                 *obufp++ = 'd';
13267               else
13268                 *obufp++ = 's';
13269               used_prefixes |= (prefixes & PREFIX_DATA);
13270             }
13271           break;
13272         case 'Y':
13273           if (l == 0 && len == 1)
13274             {
13275               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13276                 break;
13277               if (rex & REX_W)
13278                 {
13279                   USED_REX (REX_W);
13280                   *obufp++ = 'q';
13281                 }
13282               break;
13283             }
13284           else
13285             {
13286               if (l != 1 || len != 2 || last[0] != 'X')
13287                 {
13288                   SAVE_LAST (*p);
13289                   break;
13290                 }
13291               if (!need_vex)
13292                 abort ();
13293               if (intel_syntax
13294                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13295                 break;
13296               switch (vex.length)
13297                 {
13298                 case 128:
13299                   *obufp++ = 'x';
13300                   break;
13301                 case 256:
13302                   *obufp++ = 'y';
13303                   break;
13304                 default:
13305                   abort ();
13306                 }
13307             }
13308           break;
13309         case 'W':
13310           if (l == 0 && len == 1)
13311             {
13312               /* operand size flag for cwtl, cbtw */
13313               USED_REX (REX_W);
13314               if (rex & REX_W)
13315                 {
13316                   if (intel_syntax)
13317                     *obufp++ = 'd';
13318                   else
13319                     *obufp++ = 'l';
13320                 }
13321               else if (sizeflag & DFLAG)
13322                 *obufp++ = 'w';
13323               else
13324                 *obufp++ = 'b';
13325               if (!(rex & REX_W))
13326                 used_prefixes |= (prefixes & PREFIX_DATA);
13327             }
13328           else
13329             {
13330               if (l != 1 || len != 2 || last[0] != 'X')
13331                 {
13332                   SAVE_LAST (*p);
13333                   break;
13334                 }
13335               if (!need_vex)
13336                 abort ();
13337               *obufp++ = vex.w ? 'd': 's';
13338             }
13339           break;
13340         }
13341       alt = 0;
13342     }
13343   *obufp = 0;
13344   mnemonicendp = obufp;
13345   return 0;
13346 }
13347
13348 static void
13349 oappend (const char *s)
13350 {
13351   obufp = stpcpy (obufp, s);
13352 }
13353
13354 static void
13355 append_seg (void)
13356 {
13357   if (prefixes & PREFIX_CS)
13358     {
13359       used_prefixes |= PREFIX_CS;
13360       oappend ("%cs:" + intel_syntax);
13361     }
13362   if (prefixes & PREFIX_DS)
13363     {
13364       used_prefixes |= PREFIX_DS;
13365       oappend ("%ds:" + intel_syntax);
13366     }
13367   if (prefixes & PREFIX_SS)
13368     {
13369       used_prefixes |= PREFIX_SS;
13370       oappend ("%ss:" + intel_syntax);
13371     }
13372   if (prefixes & PREFIX_ES)
13373     {
13374       used_prefixes |= PREFIX_ES;
13375       oappend ("%es:" + intel_syntax);
13376     }
13377   if (prefixes & PREFIX_FS)
13378     {
13379       used_prefixes |= PREFIX_FS;
13380       oappend ("%fs:" + intel_syntax);
13381     }
13382   if (prefixes & PREFIX_GS)
13383     {
13384       used_prefixes |= PREFIX_GS;
13385       oappend ("%gs:" + intel_syntax);
13386     }
13387 }
13388
13389 static void
13390 OP_indirE (int bytemode, int sizeflag)
13391 {
13392   if (!intel_syntax)
13393     oappend ("*");
13394   OP_E (bytemode, sizeflag);
13395 }
13396
13397 static void
13398 print_operand_value (char *buf, int hex, bfd_vma disp)
13399 {
13400   if (address_mode == mode_64bit)
13401     {
13402       if (hex)
13403         {
13404           char tmp[30];
13405           int i;
13406           buf[0] = '0';
13407           buf[1] = 'x';
13408           sprintf_vma (tmp, disp);
13409           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13410           strcpy (buf + 2, tmp + i);
13411         }
13412       else
13413         {
13414           bfd_signed_vma v = disp;
13415           char tmp[30];
13416           int i;
13417           if (v < 0)
13418             {
13419               *(buf++) = '-';
13420               v = -disp;
13421               /* Check for possible overflow on 0x8000000000000000.  */
13422               if (v < 0)
13423                 {
13424                   strcpy (buf, "9223372036854775808");
13425                   return;
13426                 }
13427             }
13428           if (!v)
13429             {
13430               strcpy (buf, "0");
13431               return;
13432             }
13433
13434           i = 0;
13435           tmp[29] = 0;
13436           while (v)
13437             {
13438               tmp[28 - i] = (v % 10) + '0';
13439               v /= 10;
13440               i++;
13441             }
13442           strcpy (buf, tmp + 29 - i);
13443         }
13444     }
13445   else
13446     {
13447       if (hex)
13448         sprintf (buf, "0x%x", (unsigned int) disp);
13449       else
13450         sprintf (buf, "%d", (int) disp);
13451     }
13452 }
13453
13454 /* Put DISP in BUF as signed hex number.  */
13455
13456 static void
13457 print_displacement (char *buf, bfd_vma disp)
13458 {
13459   bfd_signed_vma val = disp;
13460   char tmp[30];
13461   int i, j = 0;
13462
13463   if (val < 0)
13464     {
13465       buf[j++] = '-';
13466       val = -disp;
13467
13468       /* Check for possible overflow.  */
13469       if (val < 0)
13470         {
13471           switch (address_mode)
13472             {
13473             case mode_64bit:
13474               strcpy (buf + j, "0x8000000000000000");
13475               break;
13476             case mode_32bit:
13477               strcpy (buf + j, "0x80000000");
13478               break;
13479             case mode_16bit:
13480               strcpy (buf + j, "0x8000");
13481               break;
13482             }
13483           return;
13484         }
13485     }
13486
13487   buf[j++] = '0';
13488   buf[j++] = 'x';
13489
13490   sprintf_vma (tmp, (bfd_vma) val);
13491   for (i = 0; tmp[i] == '0'; i++)
13492     continue;
13493   if (tmp[i] == '\0')
13494     i--;
13495   strcpy (buf + j, tmp + i);
13496 }
13497
13498 static void
13499 intel_operand_size (int bytemode, int sizeflag)
13500 {
13501   switch (bytemode)
13502     {
13503     case b_mode:
13504     case b_swap_mode:
13505     case dqb_mode:
13506       oappend ("BYTE PTR ");
13507       break;
13508     case w_mode:
13509     case dqw_mode:
13510       oappend ("WORD PTR ");
13511       break;
13512     case stack_v_mode:
13513       if (address_mode == mode_64bit && (sizeflag & DFLAG))
13514         {
13515           oappend ("QWORD PTR ");
13516           break;
13517         }
13518       /* FALLTHRU */
13519     case v_mode:
13520     case v_swap_mode:
13521     case dq_mode:
13522       USED_REX (REX_W);
13523       if (rex & REX_W)
13524         oappend ("QWORD PTR ");
13525       else
13526         {
13527           if ((sizeflag & DFLAG) || bytemode == dq_mode)
13528             oappend ("DWORD PTR ");
13529           else
13530             oappend ("WORD PTR ");
13531           used_prefixes |= (prefixes & PREFIX_DATA);
13532         }
13533       break;
13534     case z_mode:
13535       if ((rex & REX_W) || (sizeflag & DFLAG))
13536         *obufp++ = 'D';
13537       oappend ("WORD PTR ");
13538       if (!(rex & REX_W))
13539         used_prefixes |= (prefixes & PREFIX_DATA);
13540       break;
13541     case a_mode:
13542       if (sizeflag & DFLAG)
13543         oappend ("QWORD PTR ");
13544       else
13545         oappend ("DWORD PTR ");
13546       used_prefixes |= (prefixes & PREFIX_DATA);
13547       break;
13548     case d_mode:
13549     case d_swap_mode:
13550     case dqd_mode:
13551       oappend ("DWORD PTR ");
13552       break;
13553     case q_mode:
13554     case q_swap_mode:
13555       oappend ("QWORD PTR ");
13556       break;
13557     case m_mode:
13558       if (address_mode == mode_64bit)
13559         oappend ("QWORD PTR ");
13560       else
13561         oappend ("DWORD PTR ");
13562       break;
13563     case f_mode:
13564       if (sizeflag & DFLAG)
13565         oappend ("FWORD PTR ");
13566       else
13567         oappend ("DWORD PTR ");
13568       used_prefixes |= (prefixes & PREFIX_DATA);
13569       break;
13570     case t_mode:
13571       oappend ("TBYTE PTR ");
13572       break;
13573     case x_mode:
13574     case x_swap_mode:
13575       if (need_vex)
13576         {
13577           switch (vex.length)
13578             {
13579             case 128:
13580               oappend ("XMMWORD PTR ");
13581               break;
13582             case 256:
13583               oappend ("YMMWORD PTR ");
13584               break;
13585             default:
13586               abort ();
13587             }
13588         }
13589       else
13590         oappend ("XMMWORD PTR ");
13591       break;
13592     case xmm_mode:
13593       oappend ("XMMWORD PTR ");
13594       break;
13595     case xmmq_mode:
13596       if (!need_vex)
13597         abort ();
13598
13599       switch (vex.length)
13600         {
13601         case 128:
13602           oappend ("QWORD PTR ");
13603           break;
13604         case 256:
13605           oappend ("XMMWORD PTR ");
13606           break;
13607         default:
13608           abort ();
13609         }
13610       break;
13611     case ymmq_mode:
13612       if (!need_vex)
13613         abort ();
13614
13615       switch (vex.length)
13616         {
13617         case 128:
13618           oappend ("QWORD PTR ");
13619           break;
13620         case 256:
13621           oappend ("YMMWORD PTR ");
13622           break;
13623         default:
13624           abort ();
13625         }
13626       break;
13627     case o_mode:
13628       oappend ("OWORD PTR ");
13629       break;
13630     case vex_w_dq_mode:
13631       if (!need_vex)
13632         abort ();
13633
13634       if (vex.w)
13635         oappend ("QWORD PTR ");
13636       else
13637         oappend ("DWORD PTR ");
13638       break;
13639     default:
13640       break;
13641     }
13642 }
13643
13644 static void
13645 OP_E_register (int bytemode, int sizeflag)
13646 {
13647   int reg = modrm.rm;
13648   const char **names;
13649
13650   USED_REX (REX_B);
13651   if ((rex & REX_B))
13652     reg += 8;
13653
13654   if ((sizeflag & SUFFIX_ALWAYS)
13655       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
13656     swap_operand ();
13657
13658   switch (bytemode)
13659     {
13660     case b_mode:
13661     case b_swap_mode:
13662       USED_REX (0);
13663       if (rex)
13664         names = names8rex;
13665       else
13666         names = names8;
13667       break;
13668     case w_mode:
13669       names = names16;
13670       break;
13671     case d_mode:
13672       names = names32;
13673       break;
13674     case q_mode:
13675       names = names64;
13676       break;
13677     case m_mode:
13678       names = address_mode == mode_64bit ? names64 : names32;
13679       break;
13680     case stack_v_mode:
13681       if (address_mode == mode_64bit && (sizeflag & DFLAG))
13682         {
13683           names = names64;
13684           break;
13685         }
13686       bytemode = v_mode;
13687       /* FALLTHRU */
13688     case v_mode:
13689     case v_swap_mode:
13690     case dq_mode:
13691     case dqb_mode:
13692     case dqd_mode:
13693     case dqw_mode:
13694       USED_REX (REX_W);
13695       if (rex & REX_W)
13696         names = names64;
13697       else
13698         {
13699           if ((sizeflag & DFLAG) 
13700               || (bytemode != v_mode
13701                   && bytemode != v_swap_mode))
13702             names = names32;
13703           else
13704             names = names16;
13705           used_prefixes |= (prefixes & PREFIX_DATA);
13706         }
13707       break;
13708     case 0:
13709       return;
13710     default:
13711       oappend (INTERNAL_DISASSEMBLER_ERROR);
13712       return;
13713     }
13714   oappend (names[reg]);
13715 }
13716
13717 static void
13718 OP_E_memory (int bytemode, int sizeflag)
13719 {
13720   bfd_vma disp = 0;
13721   int add = (rex & REX_B) ? 8 : 0;
13722   int riprel = 0;
13723
13724   USED_REX (REX_B);
13725   if (intel_syntax)
13726     intel_operand_size (bytemode, sizeflag);
13727   append_seg ();
13728
13729   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13730     {
13731       /* 32/64 bit address mode */
13732       int havedisp;
13733       int havesib;
13734       int havebase;
13735       int haveindex;
13736       int needindex;
13737       int base, rbase;
13738       int vindex = 0;
13739       int scale = 0;
13740
13741       havesib = 0;
13742       havebase = 1;
13743       haveindex = 0;
13744       base = modrm.rm;
13745
13746       if (base == 4)
13747         {
13748           havesib = 1;
13749           FETCH_DATA (the_info, codep + 1);
13750           vindex = (*codep >> 3) & 7;
13751           scale = (*codep >> 6) & 3;
13752           base = *codep & 7;
13753           USED_REX (REX_X);
13754           if (rex & REX_X)
13755             vindex += 8;
13756           haveindex = vindex != 4;
13757           codep++;
13758         }
13759       rbase = base + add;
13760
13761       switch (modrm.mod)
13762         {
13763         case 0:
13764           if (base == 5)
13765             {
13766               havebase = 0;
13767               if (address_mode == mode_64bit && !havesib)
13768                 riprel = 1;
13769               disp = get32s ();
13770             }
13771           break;
13772         case 1:
13773           FETCH_DATA (the_info, codep + 1);
13774           disp = *codep++;
13775           if ((disp & 0x80) != 0)
13776             disp -= 0x100;
13777           break;
13778         case 2:
13779           disp = get32s ();
13780           break;
13781         }
13782
13783       /* In 32bit mode, we need index register to tell [offset] from
13784          [eiz*1 + offset].  */
13785       needindex = (havesib
13786                    && !havebase
13787                    && !haveindex
13788                    && address_mode == mode_32bit);
13789       havedisp = (havebase
13790                   || needindex
13791                   || (havesib && (haveindex || scale != 0)));
13792
13793       if (!intel_syntax)
13794         if (modrm.mod != 0 || base == 5)
13795           {
13796             if (havedisp || riprel)
13797               print_displacement (scratchbuf, disp);
13798             else
13799               print_operand_value (scratchbuf, 1, disp);
13800             oappend (scratchbuf);
13801             if (riprel)
13802               {
13803                 set_op (disp, 1);
13804                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
13805               }
13806           }
13807
13808       if (havebase || haveindex || riprel)
13809         used_prefixes |= PREFIX_ADDR;
13810
13811       if (havedisp || (intel_syntax && riprel))
13812         {
13813           *obufp++ = open_char;
13814           if (intel_syntax && riprel)
13815             {
13816               set_op (disp, 1);
13817               oappend (sizeflag & AFLAG ? "rip" : "eip");
13818             }
13819           *obufp = '\0';
13820           if (havebase)
13821             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13822                      ? names64[rbase] : names32[rbase]);
13823           if (havesib)
13824             {
13825               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
13826                  print index to tell base + index from base.  */
13827               if (scale != 0
13828                   || needindex
13829                   || haveindex
13830                   || (havebase && base != ESP_REG_NUM))
13831                 {
13832                   if (!intel_syntax || havebase)
13833                     {
13834                       *obufp++ = separator_char;
13835                       *obufp = '\0';
13836                     }
13837                   if (haveindex)
13838                     oappend (address_mode == mode_64bit 
13839                              && (sizeflag & AFLAG)
13840                              ? names64[vindex] : names32[vindex]);
13841                   else
13842                     oappend (address_mode == mode_64bit 
13843                              && (sizeflag & AFLAG)
13844                              ? index64 : index32);
13845
13846                   *obufp++ = scale_char;
13847                   *obufp = '\0';
13848                   sprintf (scratchbuf, "%d", 1 << scale);
13849                   oappend (scratchbuf);
13850                 }
13851             }
13852           if (intel_syntax
13853               && (disp || modrm.mod != 0 || base == 5))
13854             {
13855               if (!havedisp || (bfd_signed_vma) disp >= 0)
13856                 {
13857                   *obufp++ = '+';
13858                   *obufp = '\0';
13859                 }
13860               else if (modrm.mod != 1 && disp != -disp)
13861                 {
13862                   *obufp++ = '-';
13863                   *obufp = '\0';
13864                   disp = - (bfd_signed_vma) disp;
13865                 }
13866
13867               if (havedisp)
13868                 print_displacement (scratchbuf, disp);
13869               else
13870                 print_operand_value (scratchbuf, 1, disp);
13871               oappend (scratchbuf);
13872             }
13873
13874           *obufp++ = close_char;
13875           *obufp = '\0';
13876         }
13877       else if (intel_syntax)
13878         {
13879           if (modrm.mod != 0 || base == 5)
13880             {
13881               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13882                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13883                 ;
13884               else
13885                 {
13886                   oappend (names_seg[ds_reg - es_reg]);
13887                   oappend (":");
13888                 }
13889               print_operand_value (scratchbuf, 1, disp);
13890               oappend (scratchbuf);
13891             }
13892         }
13893     }
13894   else
13895     {
13896       /* 16 bit address mode */
13897       used_prefixes |= prefixes & PREFIX_ADDR;
13898       switch (modrm.mod)
13899         {
13900         case 0:
13901           if (modrm.rm == 6)
13902             {
13903               disp = get16 ();
13904               if ((disp & 0x8000) != 0)
13905                 disp -= 0x10000;
13906             }
13907           break;
13908         case 1:
13909           FETCH_DATA (the_info, codep + 1);
13910           disp = *codep++;
13911           if ((disp & 0x80) != 0)
13912             disp -= 0x100;
13913           break;
13914         case 2:
13915           disp = get16 ();
13916           if ((disp & 0x8000) != 0)
13917             disp -= 0x10000;
13918           break;
13919         }
13920
13921       if (!intel_syntax)
13922         if (modrm.mod != 0 || modrm.rm == 6)
13923           {
13924             print_displacement (scratchbuf, disp);
13925             oappend (scratchbuf);
13926           }
13927
13928       if (modrm.mod != 0 || modrm.rm != 6)
13929         {
13930           *obufp++ = open_char;
13931           *obufp = '\0';
13932           oappend (index16[modrm.rm]);
13933           if (intel_syntax
13934               && (disp || modrm.mod != 0 || modrm.rm == 6))
13935             {
13936               if ((bfd_signed_vma) disp >= 0)
13937                 {
13938                   *obufp++ = '+';
13939                   *obufp = '\0';
13940                 }
13941               else if (modrm.mod != 1)
13942                 {
13943                   *obufp++ = '-';
13944                   *obufp = '\0';
13945                   disp = - (bfd_signed_vma) disp;
13946                 }
13947
13948               print_displacement (scratchbuf, disp);
13949               oappend (scratchbuf);
13950             }
13951
13952           *obufp++ = close_char;
13953           *obufp = '\0';
13954         }
13955       else if (intel_syntax)
13956         {
13957           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13958                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13959             ;
13960           else
13961             {
13962               oappend (names_seg[ds_reg - es_reg]);
13963               oappend (":");
13964             }
13965           print_operand_value (scratchbuf, 1, disp & 0xffff);
13966           oappend (scratchbuf);
13967         }
13968     }
13969 }
13970
13971 static void
13972 OP_E (int bytemode, int sizeflag)
13973 {
13974   /* Skip mod/rm byte.  */
13975   MODRM_CHECK;
13976   codep++;
13977
13978   if (modrm.mod == 3)
13979     OP_E_register (bytemode, sizeflag);
13980   else
13981     OP_E_memory (bytemode, sizeflag);
13982 }
13983
13984 static void
13985 OP_G (int bytemode, int sizeflag)
13986 {
13987   int add = 0;
13988   USED_REX (REX_R);
13989   if (rex & REX_R)
13990     add += 8;
13991   switch (bytemode)
13992     {
13993     case b_mode:
13994       USED_REX (0);
13995       if (rex)
13996         oappend (names8rex[modrm.reg + add]);
13997       else
13998         oappend (names8[modrm.reg + add]);
13999       break;
14000     case w_mode:
14001       oappend (names16[modrm.reg + add]);
14002       break;
14003     case d_mode:
14004       oappend (names32[modrm.reg + add]);
14005       break;
14006     case q_mode:
14007       oappend (names64[modrm.reg + add]);
14008       break;
14009     case v_mode:
14010     case dq_mode:
14011     case dqb_mode:
14012     case dqd_mode:
14013     case dqw_mode:
14014       USED_REX (REX_W);
14015       if (rex & REX_W)
14016         oappend (names64[modrm.reg + add]);
14017       else
14018         {
14019           if ((sizeflag & DFLAG) || bytemode != v_mode)
14020             oappend (names32[modrm.reg + add]);
14021           else
14022             oappend (names16[modrm.reg + add]);
14023           used_prefixes |= (prefixes & PREFIX_DATA);
14024         }
14025       break;
14026     case m_mode:
14027       if (address_mode == mode_64bit)
14028         oappend (names64[modrm.reg + add]);
14029       else
14030         oappend (names32[modrm.reg + add]);
14031       break;
14032     default:
14033       oappend (INTERNAL_DISASSEMBLER_ERROR);
14034       break;
14035     }
14036 }
14037
14038 static bfd_vma
14039 get64 (void)
14040 {
14041   bfd_vma x;
14042 #ifdef BFD64
14043   unsigned int a;
14044   unsigned int b;
14045
14046   FETCH_DATA (the_info, codep + 8);
14047   a = *codep++ & 0xff;
14048   a |= (*codep++ & 0xff) << 8;
14049   a |= (*codep++ & 0xff) << 16;
14050   a |= (*codep++ & 0xff) << 24;
14051   b = *codep++ & 0xff;
14052   b |= (*codep++ & 0xff) << 8;
14053   b |= (*codep++ & 0xff) << 16;
14054   b |= (*codep++ & 0xff) << 24;
14055   x = a + ((bfd_vma) b << 32);
14056 #else
14057   abort ();
14058   x = 0;
14059 #endif
14060   return x;
14061 }
14062
14063 static bfd_signed_vma
14064 get32 (void)
14065 {
14066   bfd_signed_vma x = 0;
14067
14068   FETCH_DATA (the_info, codep + 4);
14069   x = *codep++ & (bfd_signed_vma) 0xff;
14070   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14071   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14072   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14073   return x;
14074 }
14075
14076 static bfd_signed_vma
14077 get32s (void)
14078 {
14079   bfd_signed_vma x = 0;
14080
14081   FETCH_DATA (the_info, codep + 4);
14082   x = *codep++ & (bfd_signed_vma) 0xff;
14083   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14084   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14085   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14086
14087   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14088
14089   return x;
14090 }
14091
14092 static int
14093 get16 (void)
14094 {
14095   int x = 0;
14096
14097   FETCH_DATA (the_info, codep + 2);
14098   x = *codep++ & 0xff;
14099   x |= (*codep++ & 0xff) << 8;
14100   return x;
14101 }
14102
14103 static void
14104 set_op (bfd_vma op, int riprel)
14105 {
14106   op_index[op_ad] = op_ad;
14107   if (address_mode == mode_64bit)
14108     {
14109       op_address[op_ad] = op;
14110       op_riprel[op_ad] = riprel;
14111     }
14112   else
14113     {
14114       /* Mask to get a 32-bit address.  */
14115       op_address[op_ad] = op & 0xffffffff;
14116       op_riprel[op_ad] = riprel & 0xffffffff;
14117     }
14118 }
14119
14120 static void
14121 OP_REG (int code, int sizeflag)
14122 {
14123   const char *s;
14124   int add;
14125   USED_REX (REX_B);
14126   if (rex & REX_B)
14127     add = 8;
14128   else
14129     add = 0;
14130
14131   switch (code)
14132     {
14133     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14134     case sp_reg: case bp_reg: case si_reg: case di_reg:
14135       s = names16[code - ax_reg + add];
14136       break;
14137     case es_reg: case ss_reg: case cs_reg:
14138     case ds_reg: case fs_reg: case gs_reg:
14139       s = names_seg[code - es_reg + add];
14140       break;
14141     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14142     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14143       USED_REX (0);
14144       if (rex)
14145         s = names8rex[code - al_reg + add];
14146       else
14147         s = names8[code - al_reg];
14148       break;
14149     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14150     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14151       if (address_mode == mode_64bit && (sizeflag & DFLAG))
14152         {
14153           s = names64[code - rAX_reg + add];
14154           break;
14155         }
14156       code += eAX_reg - rAX_reg;
14157       /* Fall through.  */
14158     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14159     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14160       USED_REX (REX_W);
14161       if (rex & REX_W)
14162         s = names64[code - eAX_reg + add];
14163       else
14164         {
14165           if (sizeflag & DFLAG)
14166             s = names32[code - eAX_reg + add];
14167           else
14168             s = names16[code - eAX_reg + add];
14169           used_prefixes |= (prefixes & PREFIX_DATA);
14170         }
14171       break;
14172     default:
14173       s = INTERNAL_DISASSEMBLER_ERROR;
14174       break;
14175     }
14176   oappend (s);
14177 }
14178
14179 static void
14180 OP_IMREG (int code, int sizeflag)
14181 {
14182   const char *s;
14183
14184   switch (code)
14185     {
14186     case indir_dx_reg:
14187       if (intel_syntax)
14188         s = "dx";
14189       else
14190         s = "(%dx)";
14191       break;
14192     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14193     case sp_reg: case bp_reg: case si_reg: case di_reg:
14194       s = names16[code - ax_reg];
14195       break;
14196     case es_reg: case ss_reg: case cs_reg:
14197     case ds_reg: case fs_reg: case gs_reg:
14198       s = names_seg[code - es_reg];
14199       break;
14200     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14201     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14202       USED_REX (0);
14203       if (rex)
14204         s = names8rex[code - al_reg];
14205       else
14206         s = names8[code - al_reg];
14207       break;
14208     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14209     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14210       USED_REX (REX_W);
14211       if (rex & REX_W)
14212         s = names64[code - eAX_reg];
14213       else
14214         {
14215           if (sizeflag & DFLAG)
14216             s = names32[code - eAX_reg];
14217           else
14218             s = names16[code - eAX_reg];
14219           used_prefixes |= (prefixes & PREFIX_DATA);
14220         }
14221       break;
14222     case z_mode_ax_reg:
14223       if ((rex & REX_W) || (sizeflag & DFLAG))
14224         s = *names32;
14225       else
14226         s = *names16;
14227       if (!(rex & REX_W))
14228         used_prefixes |= (prefixes & PREFIX_DATA);
14229       break;
14230     default:
14231       s = INTERNAL_DISASSEMBLER_ERROR;
14232       break;
14233     }
14234   oappend (s);
14235 }
14236
14237 static void
14238 OP_I (int bytemode, int sizeflag)
14239 {
14240   bfd_signed_vma op;
14241   bfd_signed_vma mask = -1;
14242
14243   switch (bytemode)
14244     {
14245     case b_mode:
14246       FETCH_DATA (the_info, codep + 1);
14247       op = *codep++;
14248       mask = 0xff;
14249       break;
14250     case q_mode:
14251       if (address_mode == mode_64bit)
14252         {
14253           op = get32s ();
14254           break;
14255         }
14256       /* Fall through.  */
14257     case v_mode:
14258       USED_REX (REX_W);
14259       if (rex & REX_W)
14260         op = get32s ();
14261       else
14262         {
14263           if (sizeflag & DFLAG)
14264             {
14265               op = get32 ();
14266               mask = 0xffffffff;
14267             }
14268           else
14269             {
14270               op = get16 ();
14271               mask = 0xfffff;
14272             }
14273           used_prefixes |= (prefixes & PREFIX_DATA);
14274         }
14275       break;
14276     case w_mode:
14277       mask = 0xfffff;
14278       op = get16 ();
14279       break;
14280     case const_1_mode:
14281       if (intel_syntax)
14282         oappend ("1");
14283       return;
14284     default:
14285       oappend (INTERNAL_DISASSEMBLER_ERROR);
14286       return;
14287     }
14288
14289   op &= mask;
14290   scratchbuf[0] = '$';
14291   print_operand_value (scratchbuf + 1, 1, op);
14292   oappend (scratchbuf + intel_syntax);
14293   scratchbuf[0] = '\0';
14294 }
14295
14296 static void
14297 OP_I64 (int bytemode, int sizeflag)
14298 {
14299   bfd_signed_vma op;
14300   bfd_signed_vma mask = -1;
14301
14302   if (address_mode != mode_64bit)
14303     {
14304       OP_I (bytemode, sizeflag);
14305       return;
14306     }
14307
14308   switch (bytemode)
14309     {
14310     case b_mode:
14311       FETCH_DATA (the_info, codep + 1);
14312       op = *codep++;
14313       mask = 0xff;
14314       break;
14315     case v_mode:
14316       USED_REX (REX_W);
14317       if (rex & REX_W)
14318         op = get64 ();
14319       else
14320         {
14321           if (sizeflag & DFLAG)
14322             {
14323               op = get32 ();
14324               mask = 0xffffffff;
14325             }
14326           else
14327             {
14328               op = get16 ();
14329               mask = 0xfffff;
14330             }
14331           used_prefixes |= (prefixes & PREFIX_DATA);
14332         }
14333       break;
14334     case w_mode:
14335       mask = 0xfffff;
14336       op = get16 ();
14337       break;
14338     default:
14339       oappend (INTERNAL_DISASSEMBLER_ERROR);
14340       return;
14341     }
14342
14343   op &= mask;
14344   scratchbuf[0] = '$';
14345   print_operand_value (scratchbuf + 1, 1, op);
14346   oappend (scratchbuf + intel_syntax);
14347   scratchbuf[0] = '\0';
14348 }
14349
14350 static void
14351 OP_sI (int bytemode, int sizeflag)
14352 {
14353   bfd_signed_vma op;
14354   bfd_signed_vma mask = -1;
14355
14356   switch (bytemode)
14357     {
14358     case b_mode:
14359       FETCH_DATA (the_info, codep + 1);
14360       op = *codep++;
14361       if ((op & 0x80) != 0)
14362         op -= 0x100;
14363       mask = 0xffffffff;
14364       break;
14365     case v_mode:
14366       USED_REX (REX_W);
14367       if (rex & REX_W)
14368         op = get32s ();
14369       else
14370         {
14371           if (sizeflag & DFLAG)
14372             {
14373               op = get32s ();
14374               mask = 0xffffffff;
14375             }
14376           else
14377             {
14378               mask = 0xffffffff;
14379               op = get16 ();
14380               if ((op & 0x8000) != 0)
14381                 op -= 0x10000;
14382             }
14383           used_prefixes |= (prefixes & PREFIX_DATA);
14384         }
14385       break;
14386     case w_mode:
14387       op = get16 ();
14388       mask = 0xffffffff;
14389       if ((op & 0x8000) != 0)
14390         op -= 0x10000;
14391       break;
14392     default:
14393       oappend (INTERNAL_DISASSEMBLER_ERROR);
14394       return;
14395     }
14396
14397   scratchbuf[0] = '$';
14398   print_operand_value (scratchbuf + 1, 1, op);
14399   oappend (scratchbuf + intel_syntax);
14400 }
14401
14402 static void
14403 OP_J (int bytemode, int sizeflag)
14404 {
14405   bfd_vma disp;
14406   bfd_vma mask = -1;
14407   bfd_vma segment = 0;
14408
14409   switch (bytemode)
14410     {
14411     case b_mode:
14412       FETCH_DATA (the_info, codep + 1);
14413       disp = *codep++;
14414       if ((disp & 0x80) != 0)
14415         disp -= 0x100;
14416       break;
14417     case v_mode:
14418       USED_REX (REX_W);
14419       if ((sizeflag & DFLAG) || (rex & REX_W))
14420         disp = get32s ();
14421       else
14422         {
14423           disp = get16 ();
14424           if ((disp & 0x8000) != 0)
14425             disp -= 0x10000;
14426           /* In 16bit mode, address is wrapped around at 64k within
14427              the same segment.  Otherwise, a data16 prefix on a jump
14428              instruction means that the pc is masked to 16 bits after
14429              the displacement is added!  */
14430           mask = 0xffff;
14431           if ((prefixes & PREFIX_DATA) == 0)
14432             segment = ((start_pc + codep - start_codep)
14433                        & ~((bfd_vma) 0xffff));
14434         }
14435       if (!(rex & REX_W))
14436         used_prefixes |= (prefixes & PREFIX_DATA);
14437       break;
14438     default:
14439       oappend (INTERNAL_DISASSEMBLER_ERROR);
14440       return;
14441     }
14442   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
14443   set_op (disp, 0);
14444   print_operand_value (scratchbuf, 1, disp);
14445   oappend (scratchbuf);
14446 }
14447
14448 static void
14449 OP_SEG (int bytemode, int sizeflag)
14450 {
14451   if (bytemode == w_mode)
14452     oappend (names_seg[modrm.reg]);
14453   else
14454     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14455 }
14456
14457 static void
14458 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14459 {
14460   int seg, offset;
14461
14462   if (sizeflag & DFLAG)
14463     {
14464       offset = get32 ();
14465       seg = get16 ();
14466     }
14467   else
14468     {
14469       offset = get16 ();
14470       seg = get16 ();
14471     }
14472   used_prefixes |= (prefixes & PREFIX_DATA);
14473   if (intel_syntax)
14474     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14475   else
14476     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14477   oappend (scratchbuf);
14478 }
14479
14480 static void
14481 OP_OFF (int bytemode, int sizeflag)
14482 {
14483   bfd_vma off;
14484
14485   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14486     intel_operand_size (bytemode, sizeflag);
14487   append_seg ();
14488
14489   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14490     off = get32 ();
14491   else
14492     off = get16 ();
14493
14494   if (intel_syntax)
14495     {
14496       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
14497                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
14498         {
14499           oappend (names_seg[ds_reg - es_reg]);
14500           oappend (":");
14501         }
14502     }
14503   print_operand_value (scratchbuf, 1, off);
14504   oappend (scratchbuf);
14505 }
14506
14507 static void
14508 OP_OFF64 (int bytemode, int sizeflag)
14509 {
14510   bfd_vma off;
14511
14512   if (address_mode != mode_64bit
14513       || (prefixes & PREFIX_ADDR))
14514     {
14515       OP_OFF (bytemode, sizeflag);
14516       return;
14517     }
14518
14519   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14520     intel_operand_size (bytemode, sizeflag);
14521   append_seg ();
14522
14523   off = get64 ();
14524
14525   if (intel_syntax)
14526     {
14527       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
14528                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
14529         {
14530           oappend (names_seg[ds_reg - es_reg]);
14531           oappend (":");
14532         }
14533     }
14534   print_operand_value (scratchbuf, 1, off);
14535   oappend (scratchbuf);
14536 }
14537
14538 static void
14539 ptr_reg (int code, int sizeflag)
14540 {
14541   const char *s;
14542
14543   *obufp++ = open_char;
14544   used_prefixes |= (prefixes & PREFIX_ADDR);
14545   if (address_mode == mode_64bit)
14546     {
14547       if (!(sizeflag & AFLAG))
14548         s = names32[code - eAX_reg];
14549       else
14550         s = names64[code - eAX_reg];
14551     }
14552   else if (sizeflag & AFLAG)
14553     s = names32[code - eAX_reg];
14554   else
14555     s = names16[code - eAX_reg];
14556   oappend (s);
14557   *obufp++ = close_char;
14558   *obufp = 0;
14559 }
14560
14561 static void
14562 OP_ESreg (int code, int sizeflag)
14563 {
14564   if (intel_syntax)
14565     {
14566       switch (codep[-1])
14567         {
14568         case 0x6d:      /* insw/insl */
14569           intel_operand_size (z_mode, sizeflag);
14570           break;
14571         case 0xa5:      /* movsw/movsl/movsq */
14572         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
14573         case 0xab:      /* stosw/stosl */
14574         case 0xaf:      /* scasw/scasl */
14575           intel_operand_size (v_mode, sizeflag);
14576           break;
14577         default:
14578           intel_operand_size (b_mode, sizeflag);
14579         }
14580     }
14581   oappend ("%es:" + intel_syntax);
14582   ptr_reg (code, sizeflag);
14583 }
14584
14585 static void
14586 OP_DSreg (int code, int sizeflag)
14587 {
14588   if (intel_syntax)
14589     {
14590       switch (codep[-1])
14591         {
14592         case 0x6f:      /* outsw/outsl */
14593           intel_operand_size (z_mode, sizeflag);
14594           break;
14595         case 0xa5:      /* movsw/movsl/movsq */
14596         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
14597         case 0xad:      /* lodsw/lodsl/lodsq */
14598           intel_operand_size (v_mode, sizeflag);
14599           break;
14600         default:
14601           intel_operand_size (b_mode, sizeflag);
14602         }
14603     }
14604   if ((prefixes
14605        & (PREFIX_CS
14606           | PREFIX_DS
14607           | PREFIX_SS
14608           | PREFIX_ES
14609           | PREFIX_FS
14610           | PREFIX_GS)) == 0)
14611     prefixes |= PREFIX_DS;
14612   append_seg ();
14613   ptr_reg (code, sizeflag);
14614 }
14615
14616 static void
14617 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14618 {
14619   int add;
14620   if (rex & REX_R)
14621     {
14622       USED_REX (REX_R);
14623       add = 8;
14624     }
14625   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
14626     {
14627       all_prefixes[last_lock_prefix] = 0;
14628       used_prefixes |= PREFIX_LOCK;
14629       add = 8;
14630     }
14631   else
14632     add = 0;
14633   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
14634   oappend (scratchbuf + intel_syntax);
14635 }
14636
14637 static void
14638 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14639 {
14640   int add;
14641   USED_REX (REX_R);
14642   if (rex & REX_R)
14643     add = 8;
14644   else
14645     add = 0;
14646   if (intel_syntax)
14647     sprintf (scratchbuf, "db%d", modrm.reg + add);
14648   else
14649     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
14650   oappend (scratchbuf);
14651 }
14652
14653 static void
14654 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14655 {
14656   sprintf (scratchbuf, "%%tr%d", modrm.reg);
14657   oappend (scratchbuf + intel_syntax);
14658 }
14659
14660 static void
14661 OP_R (int bytemode, int sizeflag)
14662 {
14663   if (modrm.mod == 3)
14664     OP_E (bytemode, sizeflag);
14665   else
14666     BadOp ();
14667 }
14668
14669 static void
14670 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14671 {
14672   int reg = modrm.reg;
14673   const char **names;
14674
14675   used_prefixes |= (prefixes & PREFIX_DATA);
14676   if (prefixes & PREFIX_DATA)
14677     {
14678       names = names_xmm;
14679       USED_REX (REX_R);
14680       if (rex & REX_R)
14681         reg += 8;
14682     }
14683   else
14684     names = names_mm;
14685   oappend (names[reg]);
14686 }
14687
14688 static void
14689 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14690 {
14691   int reg = modrm.reg;
14692   const char **names;
14693
14694   USED_REX (REX_R);
14695   if (rex & REX_R)
14696     reg += 8;
14697   if (need_vex && bytemode != xmm_mode)
14698     {
14699       switch (vex.length)
14700         {
14701         case 128:
14702           names = names_xmm;
14703           break;
14704         case 256:
14705           names = names_ymm;
14706           break;
14707         default:
14708           abort ();
14709         }
14710     }
14711   else
14712     names = names_xmm;
14713   oappend (names[reg]);
14714 }
14715
14716 static void
14717 OP_EM (int bytemode, int sizeflag)
14718 {
14719   int reg;
14720   const char **names;
14721
14722   if (modrm.mod != 3)
14723     {
14724       if (intel_syntax
14725           && (bytemode == v_mode || bytemode == v_swap_mode))
14726         {
14727           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14728           used_prefixes |= (prefixes & PREFIX_DATA);
14729         }
14730       OP_E (bytemode, sizeflag);
14731       return;
14732     }
14733
14734   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
14735     swap_operand ();
14736
14737   /* Skip mod/rm byte.  */
14738   MODRM_CHECK;
14739   codep++;
14740   used_prefixes |= (prefixes & PREFIX_DATA);
14741   reg = modrm.rm;
14742   if (prefixes & PREFIX_DATA)
14743     {
14744       names = names_xmm;
14745       USED_REX (REX_B);
14746       if (rex & REX_B)
14747         reg += 8;
14748     }
14749   else
14750     names = names_mm;
14751   oappend (names[reg]);
14752 }
14753
14754 /* cvt* are the only instructions in sse2 which have
14755    both SSE and MMX operands and also have 0x66 prefix
14756    in their opcode. 0x66 was originally used to differentiate
14757    between SSE and MMX instruction(operands). So we have to handle the
14758    cvt* separately using OP_EMC and OP_MXC */
14759 static void
14760 OP_EMC (int bytemode, int sizeflag)
14761 {
14762   if (modrm.mod != 3)
14763     {
14764       if (intel_syntax && bytemode == v_mode)
14765         {
14766           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14767           used_prefixes |= (prefixes & PREFIX_DATA);
14768         }
14769       OP_E (bytemode, sizeflag);
14770       return;
14771     }
14772
14773   /* Skip mod/rm byte.  */
14774   MODRM_CHECK;
14775   codep++;
14776   used_prefixes |= (prefixes & PREFIX_DATA);
14777   oappend (names_mm[modrm.rm]);
14778 }
14779
14780 static void
14781 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14782 {
14783   used_prefixes |= (prefixes & PREFIX_DATA);
14784   oappend (names_mm[modrm.reg]);
14785 }
14786
14787 static void
14788 OP_EX (int bytemode, int sizeflag)
14789 {
14790   int reg;
14791   const char **names;
14792
14793   /* Skip mod/rm byte.  */
14794   MODRM_CHECK;
14795   codep++;
14796
14797   if (modrm.mod != 3)
14798     {
14799       OP_E_memory (bytemode, sizeflag);
14800       return;
14801     }
14802
14803   reg = modrm.rm;
14804   USED_REX (REX_B);
14805   if (rex & REX_B)
14806     reg += 8;
14807
14808   if ((sizeflag & SUFFIX_ALWAYS)
14809       && (bytemode == x_swap_mode
14810           || bytemode == d_swap_mode
14811           || bytemode == q_swap_mode))
14812     swap_operand ();
14813
14814   if (need_vex
14815       && bytemode != xmm_mode
14816       && bytemode != xmmq_mode)
14817     {
14818       switch (vex.length)
14819         {
14820         case 128:
14821           names = names_xmm;
14822           break;
14823         case 256:
14824           names = names_ymm;
14825           break;
14826         default:
14827           abort ();
14828         }
14829     }
14830   else
14831     names = names_xmm;
14832   oappend (names[reg]);
14833 }
14834
14835 static void
14836 OP_MS (int bytemode, int sizeflag)
14837 {
14838   if (modrm.mod == 3)
14839     OP_EM (bytemode, sizeflag);
14840   else
14841     BadOp ();
14842 }
14843
14844 static void
14845 OP_XS (int bytemode, int sizeflag)
14846 {
14847   if (modrm.mod == 3)
14848     OP_EX (bytemode, sizeflag);
14849   else
14850     BadOp ();
14851 }
14852
14853 static void
14854 OP_M (int bytemode, int sizeflag)
14855 {
14856   if (modrm.mod == 3)
14857     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14858     BadOp ();
14859   else
14860     OP_E (bytemode, sizeflag);
14861 }
14862
14863 static void
14864 OP_0f07 (int bytemode, int sizeflag)
14865 {
14866   if (modrm.mod != 3 || modrm.rm != 0)
14867     BadOp ();
14868   else
14869     OP_E (bytemode, sizeflag);
14870 }
14871
14872 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14873    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
14874
14875 static void
14876 NOP_Fixup1 (int bytemode, int sizeflag)
14877 {
14878   if ((prefixes & PREFIX_DATA) != 0
14879       || (rex != 0
14880           && rex != 0x48
14881           && address_mode == mode_64bit))
14882     OP_REG (bytemode, sizeflag);
14883   else
14884     strcpy (obuf, "nop");
14885 }
14886
14887 static void
14888 NOP_Fixup2 (int bytemode, int sizeflag)
14889 {
14890   if ((prefixes & PREFIX_DATA) != 0
14891       || (rex != 0
14892           && rex != 0x48
14893           && address_mode == mode_64bit))
14894     OP_IMREG (bytemode, sizeflag);
14895 }
14896
14897 static const char *const Suffix3DNow[] = {
14898 /* 00 */        NULL,           NULL,           NULL,           NULL,
14899 /* 04 */        NULL,           NULL,           NULL,           NULL,
14900 /* 08 */        NULL,           NULL,           NULL,           NULL,
14901 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
14902 /* 10 */        NULL,           NULL,           NULL,           NULL,
14903 /* 14 */        NULL,           NULL,           NULL,           NULL,
14904 /* 18 */        NULL,           NULL,           NULL,           NULL,
14905 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
14906 /* 20 */        NULL,           NULL,           NULL,           NULL,
14907 /* 24 */        NULL,           NULL,           NULL,           NULL,
14908 /* 28 */        NULL,           NULL,           NULL,           NULL,
14909 /* 2C */        NULL,           NULL,           NULL,           NULL,
14910 /* 30 */        NULL,           NULL,           NULL,           NULL,
14911 /* 34 */        NULL,           NULL,           NULL,           NULL,
14912 /* 38 */        NULL,           NULL,           NULL,           NULL,
14913 /* 3C */        NULL,           NULL,           NULL,           NULL,
14914 /* 40 */        NULL,           NULL,           NULL,           NULL,
14915 /* 44 */        NULL,           NULL,           NULL,           NULL,
14916 /* 48 */        NULL,           NULL,           NULL,           NULL,
14917 /* 4C */        NULL,           NULL,           NULL,           NULL,
14918 /* 50 */        NULL,           NULL,           NULL,           NULL,
14919 /* 54 */        NULL,           NULL,           NULL,           NULL,
14920 /* 58 */        NULL,           NULL,           NULL,           NULL,
14921 /* 5C */        NULL,           NULL,           NULL,           NULL,
14922 /* 60 */        NULL,           NULL,           NULL,           NULL,
14923 /* 64 */        NULL,           NULL,           NULL,           NULL,
14924 /* 68 */        NULL,           NULL,           NULL,           NULL,
14925 /* 6C */        NULL,           NULL,           NULL,           NULL,
14926 /* 70 */        NULL,           NULL,           NULL,           NULL,
14927 /* 74 */        NULL,           NULL,           NULL,           NULL,
14928 /* 78 */        NULL,           NULL,           NULL,           NULL,
14929 /* 7C */        NULL,           NULL,           NULL,           NULL,
14930 /* 80 */        NULL,           NULL,           NULL,           NULL,
14931 /* 84 */        NULL,           NULL,           NULL,           NULL,
14932 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
14933 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
14934 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
14935 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
14936 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
14937 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
14938 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
14939 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
14940 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
14941 /* AC */        NULL,           NULL,           "pfacc",        NULL,
14942 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
14943 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
14944 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
14945 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
14946 /* C0 */        NULL,           NULL,           NULL,           NULL,
14947 /* C4 */        NULL,           NULL,           NULL,           NULL,
14948 /* C8 */        NULL,           NULL,           NULL,           NULL,
14949 /* CC */        NULL,           NULL,           NULL,           NULL,
14950 /* D0 */        NULL,           NULL,           NULL,           NULL,
14951 /* D4 */        NULL,           NULL,           NULL,           NULL,
14952 /* D8 */        NULL,           NULL,           NULL,           NULL,
14953 /* DC */        NULL,           NULL,           NULL,           NULL,
14954 /* E0 */        NULL,           NULL,           NULL,           NULL,
14955 /* E4 */        NULL,           NULL,           NULL,           NULL,
14956 /* E8 */        NULL,           NULL,           NULL,           NULL,
14957 /* EC */        NULL,           NULL,           NULL,           NULL,
14958 /* F0 */        NULL,           NULL,           NULL,           NULL,
14959 /* F4 */        NULL,           NULL,           NULL,           NULL,
14960 /* F8 */        NULL,           NULL,           NULL,           NULL,
14961 /* FC */        NULL,           NULL,           NULL,           NULL,
14962 };
14963
14964 static void
14965 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14966 {
14967   const char *mnemonic;
14968
14969   FETCH_DATA (the_info, codep + 1);
14970   /* AMD 3DNow! instructions are specified by an opcode suffix in the
14971      place where an 8-bit immediate would normally go.  ie. the last
14972      byte of the instruction.  */
14973   obufp = mnemonicendp;
14974   mnemonic = Suffix3DNow[*codep++ & 0xff];
14975   if (mnemonic)
14976     oappend (mnemonic);
14977   else
14978     {
14979       /* Since a variable sized modrm/sib chunk is between the start
14980          of the opcode (0x0f0f) and the opcode suffix, we need to do
14981          all the modrm processing first, and don't know until now that
14982          we have a bad opcode.  This necessitates some cleaning up.  */
14983       op_out[0][0] = '\0';
14984       op_out[1][0] = '\0';
14985       BadOp ();
14986     }
14987   mnemonicendp = obufp;
14988 }
14989
14990 static struct op simd_cmp_op[] =
14991 {
14992   { STRING_COMMA_LEN ("eq") },
14993   { STRING_COMMA_LEN ("lt") },
14994   { STRING_COMMA_LEN ("le") },
14995   { STRING_COMMA_LEN ("unord") },
14996   { STRING_COMMA_LEN ("neq") },
14997   { STRING_COMMA_LEN ("nlt") },
14998   { STRING_COMMA_LEN ("nle") },
14999   { STRING_COMMA_LEN ("ord") }
15000 };
15001
15002 static void
15003 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15004 {
15005   unsigned int cmp_type;
15006
15007   FETCH_DATA (the_info, codep + 1);
15008   cmp_type = *codep++ & 0xff;
15009   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15010     {
15011       char suffix [3];
15012       char *p = mnemonicendp - 2;
15013       suffix[0] = p[0];
15014       suffix[1] = p[1];
15015       suffix[2] = '\0';
15016       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15017       mnemonicendp += simd_cmp_op[cmp_type].len;
15018     }
15019   else
15020     {
15021       /* We have a reserved extension byte.  Output it directly.  */
15022       scratchbuf[0] = '$';
15023       print_operand_value (scratchbuf + 1, 1, cmp_type);
15024       oappend (scratchbuf + intel_syntax);
15025       scratchbuf[0] = '\0';
15026     }
15027 }
15028
15029 static void
15030 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15031           int sizeflag ATTRIBUTE_UNUSED)
15032 {
15033   /* mwait %eax,%ecx  */
15034   if (!intel_syntax)
15035     {
15036       const char **names = (address_mode == mode_64bit
15037                             ? names64 : names32);
15038       strcpy (op_out[0], names[0]);
15039       strcpy (op_out[1], names[1]);
15040       two_source_ops = 1;
15041     }
15042   /* Skip mod/rm byte.  */
15043   MODRM_CHECK;
15044   codep++;
15045 }
15046
15047 static void
15048 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15049             int sizeflag ATTRIBUTE_UNUSED)
15050 {
15051   /* monitor %eax,%ecx,%edx"  */
15052   if (!intel_syntax)
15053     {
15054       const char **op1_names;
15055       const char **names = (address_mode == mode_64bit
15056                             ? names64 : names32);
15057
15058       if (!(prefixes & PREFIX_ADDR))
15059         op1_names = (address_mode == mode_16bit
15060                      ? names16 : names);
15061       else
15062         {
15063           /* Remove "addr16/addr32".  */
15064           all_prefixes[last_addr_prefix] = 0;
15065           op1_names = (address_mode != mode_32bit
15066                        ? names32 : names16);
15067           used_prefixes |= PREFIX_ADDR;
15068         }
15069       strcpy (op_out[0], op1_names[0]);
15070       strcpy (op_out[1], names[1]);
15071       strcpy (op_out[2], names[2]);
15072       two_source_ops = 1;
15073     }
15074   /* Skip mod/rm byte.  */
15075   MODRM_CHECK;
15076   codep++;
15077 }
15078
15079 static void
15080 BadOp (void)
15081 {
15082   /* Throw away prefixes and 1st. opcode byte.  */
15083   codep = insn_codep + 1;
15084   oappend ("(bad)");
15085 }
15086
15087 static void
15088 REP_Fixup (int bytemode, int sizeflag)
15089 {
15090   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15091      lods and stos.  */
15092   if (prefixes & PREFIX_REPZ)
15093     all_prefixes[last_repz_prefix] = REP_PREFIX;
15094
15095   switch (bytemode)
15096     {
15097     case al_reg:
15098     case eAX_reg:
15099     case indir_dx_reg:
15100       OP_IMREG (bytemode, sizeflag);
15101       break;
15102     case eDI_reg:
15103       OP_ESreg (bytemode, sizeflag);
15104       break;
15105     case eSI_reg:
15106       OP_DSreg (bytemode, sizeflag);
15107       break;
15108     default:
15109       abort ();
15110       break;
15111     }
15112 }
15113
15114 static void
15115 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15116 {
15117   USED_REX (REX_W);
15118   if (rex & REX_W)
15119     {
15120       /* Change cmpxchg8b to cmpxchg16b.  */
15121       char *p = mnemonicendp - 2;
15122       mnemonicendp = stpcpy (p, "16b");
15123       bytemode = o_mode;
15124     }
15125   OP_M (bytemode, sizeflag);
15126 }
15127
15128 static void
15129 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15130 {
15131   const char **names;
15132
15133   if (need_vex)
15134     {
15135       switch (vex.length)
15136         {
15137         case 128:
15138           names = names_xmm;
15139           break;
15140         case 256:
15141           names = names_ymm;
15142           break;
15143         default:
15144           abort ();
15145         }
15146     }
15147   else
15148     names = names_xmm;
15149   oappend (names[reg]);
15150 }
15151
15152 static void
15153 CRC32_Fixup (int bytemode, int sizeflag)
15154 {
15155   /* Add proper suffix to "crc32".  */
15156   char *p = mnemonicendp;
15157
15158   switch (bytemode)
15159     {
15160     case b_mode:
15161       if (intel_syntax)
15162         goto skip;
15163
15164       *p++ = 'b';
15165       break;
15166     case v_mode:
15167       if (intel_syntax)
15168         goto skip;
15169
15170       USED_REX (REX_W);
15171       if (rex & REX_W)
15172         *p++ = 'q';
15173       else 
15174         {
15175           if (sizeflag & DFLAG)
15176             *p++ = 'l';
15177           else
15178             *p++ = 'w';
15179           used_prefixes |= (prefixes & PREFIX_DATA);
15180         }
15181       break;
15182     default:
15183       oappend (INTERNAL_DISASSEMBLER_ERROR);
15184       break;
15185     }
15186   mnemonicendp = p;
15187   *p = '\0';
15188
15189 skip:
15190   if (modrm.mod == 3)
15191     {
15192       int add;
15193
15194       /* Skip mod/rm byte.  */
15195       MODRM_CHECK;
15196       codep++;
15197
15198       USED_REX (REX_B);
15199       add = (rex & REX_B) ? 8 : 0;
15200       if (bytemode == b_mode)
15201         {
15202           USED_REX (0);
15203           if (rex)
15204             oappend (names8rex[modrm.rm + add]);
15205           else
15206             oappend (names8[modrm.rm + add]);
15207         }
15208       else
15209         {
15210           USED_REX (REX_W);
15211           if (rex & REX_W)
15212             oappend (names64[modrm.rm + add]);
15213           else if ((prefixes & PREFIX_DATA))
15214             oappend (names16[modrm.rm + add]);
15215           else
15216             oappend (names32[modrm.rm + add]);
15217         }
15218     }
15219   else
15220     OP_E (bytemode, sizeflag);
15221 }
15222
15223 static void
15224 FXSAVE_Fixup (int bytemode, int sizeflag)
15225 {
15226   /* Add proper suffix to "fxsave" and "fxrstor".  */
15227   USED_REX (REX_W);
15228   if (rex & REX_W)
15229     {
15230       char *p = mnemonicendp;
15231       *p++ = '6';
15232       *p++ = '4';
15233       *p = '\0';
15234       mnemonicendp = p;
15235     }
15236   OP_M (bytemode, sizeflag);
15237 }
15238
15239 /* Display the destination register operand for instructions with
15240    VEX. */
15241
15242 static void
15243 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15244 {
15245   const char **names;
15246
15247   if (!need_vex)
15248     abort ();
15249
15250   if (!need_vex_reg)
15251     return;
15252
15253   switch (vex.length)
15254     {
15255     case 128:
15256       switch (bytemode)
15257         {
15258         case vex_mode:
15259         case vex128_mode:
15260           break;
15261         default:
15262           abort ();
15263           return;
15264         }
15265
15266       names = names_xmm;
15267       break;
15268     case 256:
15269       switch (bytemode)
15270         {
15271         case vex_mode:
15272         case vex256_mode:
15273           break;
15274         default:
15275           abort ();
15276           return;
15277         }
15278
15279       names = names_ymm;
15280       break;
15281     default:
15282       abort ();
15283       break;
15284     }
15285   oappend (names[vex.register_specifier]);
15286 }
15287
15288 /* Get the VEX immediate byte without moving codep.  */
15289
15290 static unsigned char
15291 get_vex_imm8 (int sizeflag, int opnum)
15292 {
15293   int bytes_before_imm = 0;
15294
15295   if (modrm.mod != 3)
15296     {
15297       /* There are SIB/displacement bytes.  */
15298       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15299         {
15300           /* 32/64 bit address mode */
15301           int base = modrm.rm;
15302
15303           /* Check SIB byte.  */
15304           if (base == 4)
15305             {
15306               FETCH_DATA (the_info, codep + 1);
15307               base = *codep & 7;
15308               /* When decoding the third source, don't increase
15309                  bytes_before_imm as this has already been incremented
15310                  by one in OP_E_memory while decoding the second
15311                  source operand.  */
15312               if (opnum == 0)
15313                 bytes_before_imm++;
15314             }
15315
15316           /* Don't increase bytes_before_imm when decoding the third source,
15317              it has already been incremented by OP_E_memory while decoding
15318              the second source operand.  */
15319           if (opnum == 0)
15320             {
15321               switch (modrm.mod)
15322                 {
15323                   case 0:
15324                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
15325                        SIB == 5, there is a 4 byte displacement.  */
15326                     if (base != 5)
15327                       /* No displacement. */
15328                       break;
15329                   case 2:
15330                     /* 4 byte displacement.  */
15331                     bytes_before_imm += 4;
15332                     break;
15333                   case 1:
15334                     /* 1 byte displacement.  */
15335                     bytes_before_imm++;
15336                     break;
15337                 }
15338             }
15339         }
15340       else
15341         {
15342           /* 16 bit address mode */
15343           /* Don't increase bytes_before_imm when decoding the third source,
15344              it has already been incremented by OP_E_memory while decoding
15345              the second source operand.  */
15346           if (opnum == 0)
15347             {
15348               switch (modrm.mod)
15349                 {
15350                 case 0:
15351                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
15352                   if (modrm.rm != 6)
15353                     /* No displacement. */
15354                     break;
15355                 case 2:
15356                   /* 2 byte displacement.  */
15357                   bytes_before_imm += 2;
15358                   break;
15359                 case 1:
15360                   /* 1 byte displacement: when decoding the third source,
15361                      don't increase bytes_before_imm as this has already
15362                      been incremented by one in OP_E_memory while decoding
15363                      the second source operand.  */
15364                   if (opnum == 0)
15365                     bytes_before_imm++;
15366
15367                   break;
15368                 }
15369             }
15370         }
15371     }
15372
15373   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
15374   return codep [bytes_before_imm];
15375 }
15376
15377 static void
15378 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
15379 {
15380   const char **names;
15381
15382   if (reg == -1 && modrm.mod != 3)
15383     {
15384       OP_E_memory (bytemode, sizeflag);
15385       return;
15386     }
15387   else
15388     {
15389       if (reg == -1)
15390         {
15391           reg = modrm.rm;
15392           USED_REX (REX_B);
15393           if (rex & REX_B)
15394             reg += 8;
15395         }
15396       else if (reg > 7 && address_mode != mode_64bit)
15397         BadOp ();
15398     }
15399
15400   switch (vex.length)
15401     {
15402     case 128:
15403       names = names_xmm;
15404       break;
15405     case 256:
15406       names = names_ymm;
15407       break;
15408     default:
15409       abort ();
15410     }
15411   oappend (names[reg]);
15412 }
15413
15414 static void
15415 OP_Vex_2src (int bytemode, int sizeflag)
15416 {
15417   if (modrm.mod == 3)
15418     {
15419       int reg = modrm.rm;
15420       USED_REX (REX_B);
15421       if (rex & REX_B)
15422         reg += 8;
15423       oappend (names_xmm[reg]);
15424     }
15425   else
15426     {
15427       if (intel_syntax
15428           && (bytemode == v_mode || bytemode == v_swap_mode))
15429         {
15430           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15431           used_prefixes |= (prefixes & PREFIX_DATA);
15432         }
15433       OP_E (bytemode, sizeflag);
15434     }
15435 }
15436
15437 static void
15438 OP_Vex_2src_1 (int bytemode, int sizeflag)
15439 {
15440   if (modrm.mod == 3)
15441     {
15442       /* Skip mod/rm byte.   */
15443       MODRM_CHECK;
15444       codep++;
15445     }
15446
15447   if (vex.w)
15448     oappend (names_xmm[vex.register_specifier]);
15449   else
15450     OP_Vex_2src (bytemode, sizeflag);
15451 }
15452
15453 static void
15454 OP_Vex_2src_2 (int bytemode, int sizeflag)
15455 {
15456   if (vex.w)
15457     OP_Vex_2src (bytemode, sizeflag);
15458   else
15459     oappend (names_xmm[vex.register_specifier]);
15460 }
15461
15462 static void
15463 OP_EX_VexW (int bytemode, int sizeflag)
15464 {
15465   int reg = -1;
15466
15467   if (!vex_w_done)
15468     {
15469       vex_w_done = 1;
15470
15471       /* Skip mod/rm byte.  */
15472       MODRM_CHECK;
15473       codep++;
15474
15475       if (vex.w)
15476         reg = get_vex_imm8 (sizeflag, 0) >> 4;
15477     }
15478   else
15479     {
15480       if (!vex.w)
15481         reg = get_vex_imm8 (sizeflag, 1) >> 4;
15482     }
15483
15484   OP_EX_VexReg (bytemode, sizeflag, reg);
15485 }
15486
15487 static void
15488 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
15489              int sizeflag ATTRIBUTE_UNUSED)
15490 {
15491   /* Skip the immediate byte and check for invalid bits.  */
15492   FETCH_DATA (the_info, codep + 1);
15493   if (*codep++ & 0xf)
15494     BadOp ();
15495 }
15496
15497 static void
15498 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15499 {
15500   int reg;
15501   const char **names;
15502
15503   FETCH_DATA (the_info, codep + 1);
15504   reg = *codep++;
15505
15506   if (bytemode != x_mode)
15507     abort ();
15508
15509   if (reg & 0xf)
15510       BadOp ();
15511
15512   reg >>= 4;
15513   if (reg > 7 && address_mode != mode_64bit)
15514     BadOp ();
15515
15516   switch (vex.length)
15517     {
15518     case 128:
15519       names = names_xmm;
15520       break;
15521     case 256:
15522       names = names_ymm;
15523       break;
15524     default:
15525       abort ();
15526     }
15527   oappend (names[reg]);
15528 }
15529
15530 static void
15531 OP_XMM_VexW (int bytemode, int sizeflag)
15532 {
15533   /* Turn off the REX.W bit since it is used for swapping operands
15534      now.  */
15535   rex &= ~REX_W;
15536   OP_XMM (bytemode, sizeflag);
15537 }
15538
15539 static void
15540 OP_EX_Vex (int bytemode, int sizeflag)
15541 {
15542   if (modrm.mod != 3)
15543     {
15544       if (vex.register_specifier != 0)
15545         BadOp ();
15546       need_vex_reg = 0;
15547     }
15548   OP_EX (bytemode, sizeflag);
15549 }
15550
15551 static void
15552 OP_XMM_Vex (int bytemode, int sizeflag)
15553 {
15554   if (modrm.mod != 3)
15555     {
15556       if (vex.register_specifier != 0)
15557         BadOp ();
15558       need_vex_reg = 0;
15559     }
15560   OP_XMM (bytemode, sizeflag);
15561 }
15562
15563 static void
15564 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15565 {
15566   switch (vex.length)
15567     {
15568     case 128:
15569       mnemonicendp = stpcpy (obuf, "vzeroupper");
15570       break;
15571     case 256:
15572       mnemonicendp = stpcpy (obuf, "vzeroall");
15573       break;
15574     default:
15575       abort ();
15576     }
15577 }
15578
15579 static struct op vex_cmp_op[] =
15580 {
15581   { STRING_COMMA_LEN ("eq") },
15582   { STRING_COMMA_LEN ("lt") },
15583   { STRING_COMMA_LEN ("le") },
15584   { STRING_COMMA_LEN ("unord") },
15585   { STRING_COMMA_LEN ("neq") },
15586   { STRING_COMMA_LEN ("nlt") },
15587   { STRING_COMMA_LEN ("nle") },
15588   { STRING_COMMA_LEN ("ord") },
15589   { STRING_COMMA_LEN ("eq_uq") },
15590   { STRING_COMMA_LEN ("nge") },
15591   { STRING_COMMA_LEN ("ngt") },
15592   { STRING_COMMA_LEN ("false") },
15593   { STRING_COMMA_LEN ("neq_oq") },
15594   { STRING_COMMA_LEN ("ge") },
15595   { STRING_COMMA_LEN ("gt") },
15596   { STRING_COMMA_LEN ("true") },
15597   { STRING_COMMA_LEN ("eq_os") },
15598   { STRING_COMMA_LEN ("lt_oq") },
15599   { STRING_COMMA_LEN ("le_oq") },
15600   { STRING_COMMA_LEN ("unord_s") },
15601   { STRING_COMMA_LEN ("neq_us") },
15602   { STRING_COMMA_LEN ("nlt_uq") },
15603   { STRING_COMMA_LEN ("nle_uq") },
15604   { STRING_COMMA_LEN ("ord_s") },
15605   { STRING_COMMA_LEN ("eq_us") },
15606   { STRING_COMMA_LEN ("nge_uq") },
15607   { STRING_COMMA_LEN ("ngt_uq") },
15608   { STRING_COMMA_LEN ("false_os") },
15609   { STRING_COMMA_LEN ("neq_os") },
15610   { STRING_COMMA_LEN ("ge_oq") },
15611   { STRING_COMMA_LEN ("gt_oq") },
15612   { STRING_COMMA_LEN ("true_us") },
15613 };
15614
15615 static void
15616 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15617 {
15618   unsigned int cmp_type;
15619
15620   FETCH_DATA (the_info, codep + 1);
15621   cmp_type = *codep++ & 0xff;
15622   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
15623     {
15624       char suffix [3];
15625       char *p = mnemonicendp - 2;
15626       suffix[0] = p[0];
15627       suffix[1] = p[1];
15628       suffix[2] = '\0';
15629       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
15630       mnemonicendp += vex_cmp_op[cmp_type].len;
15631     }
15632   else
15633     {
15634       /* We have a reserved extension byte.  Output it directly.  */
15635       scratchbuf[0] = '$';
15636       print_operand_value (scratchbuf + 1, 1, cmp_type);
15637       oappend (scratchbuf + intel_syntax);
15638       scratchbuf[0] = '\0';
15639     }
15640 }
15641
15642 static const struct op pclmul_op[] =
15643 {
15644   { STRING_COMMA_LEN ("lql") },
15645   { STRING_COMMA_LEN ("hql") },
15646   { STRING_COMMA_LEN ("lqh") },
15647   { STRING_COMMA_LEN ("hqh") }
15648 };
15649
15650 static void
15651 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
15652               int sizeflag ATTRIBUTE_UNUSED)
15653 {
15654   unsigned int pclmul_type;
15655
15656   FETCH_DATA (the_info, codep + 1);
15657   pclmul_type = *codep++ & 0xff;
15658   switch (pclmul_type)
15659     {
15660     case 0x10:
15661       pclmul_type = 2;
15662       break;
15663     case 0x11:
15664       pclmul_type = 3;
15665       break;
15666     default:
15667       break;
15668     } 
15669   if (pclmul_type < ARRAY_SIZE (pclmul_op))
15670     {
15671       char suffix [4];
15672       char *p = mnemonicendp - 3;
15673       suffix[0] = p[0];
15674       suffix[1] = p[1];
15675       suffix[2] = p[2];
15676       suffix[3] = '\0';
15677       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
15678       mnemonicendp += pclmul_op[pclmul_type].len;
15679     }
15680   else
15681     {
15682       /* We have a reserved extension byte.  Output it directly.  */
15683       scratchbuf[0] = '$';
15684       print_operand_value (scratchbuf + 1, 1, pclmul_type);
15685       oappend (scratchbuf + intel_syntax);
15686       scratchbuf[0] = '\0';
15687     }
15688 }
15689
15690 static void
15691 MOVBE_Fixup (int bytemode, int sizeflag)
15692 {
15693   /* Add proper suffix to "movbe".  */
15694   char *p = mnemonicendp;
15695
15696   switch (bytemode)
15697     {
15698     case v_mode:
15699       if (intel_syntax)
15700         goto skip;
15701
15702       USED_REX (REX_W);
15703       if (sizeflag & SUFFIX_ALWAYS)
15704         {
15705           if (rex & REX_W)
15706             *p++ = 'q';
15707           else
15708             {
15709               if (sizeflag & DFLAG)
15710                 *p++ = 'l';
15711               else
15712                 *p++ = 'w';
15713               used_prefixes |= (prefixes & PREFIX_DATA);
15714             }
15715         }
15716       break;
15717     default:
15718       oappend (INTERNAL_DISASSEMBLER_ERROR);
15719       break;
15720     }
15721   mnemonicendp = p;
15722   *p = '\0';
15723
15724 skip:
15725   OP_M (bytemode, sizeflag);
15726 }
15727
15728 static void
15729 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15730 {
15731   int reg;
15732   const char **names;
15733
15734   /* Skip mod/rm byte.  */
15735   MODRM_CHECK;
15736   codep++;
15737
15738   if (vex.w)
15739     names = names64;
15740   else if (vex.length == 256)
15741     names = names32;
15742   else
15743     names = names16;
15744
15745   reg = modrm.rm;
15746   USED_REX (REX_B);
15747   if (rex & REX_B)
15748     reg += 8;
15749
15750   oappend (names[reg]);
15751 }
15752
15753 static void
15754 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15755 {
15756   const char **names;
15757
15758   if (vex.w)
15759     names = names64;
15760   else if (vex.length == 256)
15761     names = names32;
15762   else
15763     names = names16;
15764
15765   oappend (names[vex.register_specifier]);
15766 }
15767
15768 static void
15769 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
15770 {
15771   if (vex.w || vex.length == 256)
15772     OP_I (q_mode, sizeflag);
15773   else
15774     OP_I (w_mode, sizeflag);
15775 }
15776