2010-03-22 Sebastian Pop <sebastian.pop@amd.com>
[external/binutils.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
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_EX_VexImmW (int, int);
95 static void OP_XMM_Vex (int, int);
96 static void OP_XMM_VexW (int, int);
97 static void OP_REG_VexI4 (int, int);
98 static void PCLMUL_Fixup (int, int);
99 static void VEXI4_Fixup (int, int);
100 static void VZERO_Fixup (int, int);
101 static void VCMP_Fixup (int, int);
102 static void OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void CMPXCHG8B_Fixup (int, int);
112 static void XMM_Fixup (int, int);
113 static void CRC32_Fixup (int, int);
114 static void FXSAVE_Fixup (int, int);
115 static void OP_LWPCB_E (int, int);
116 static void OP_LWP_E (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 #define Bad_Opcode NULL, { { NULL, 0 } }
220
221 #define Eb { OP_E, b_mode }
222 #define EbS { OP_E, b_swap_mode }
223 #define Ev { OP_E, v_mode }
224 #define EvS { OP_E, v_swap_mode }
225 #define Ed { OP_E, d_mode }
226 #define Edq { OP_E, dq_mode }
227 #define Edqw { OP_E, dqw_mode }
228 #define Edqb { OP_E, dqb_mode }
229 #define Edqd { OP_E, dqd_mode }
230 #define Eq { OP_E, q_mode }
231 #define indirEv { OP_indirE, stack_v_mode }
232 #define indirEp { OP_indirE, f_mode }
233 #define stackEv { OP_E, stack_v_mode }
234 #define Em { OP_E, m_mode }
235 #define Ew { OP_E, w_mode }
236 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
237 #define Ma { OP_M, a_mode }
238 #define Mb { OP_M, b_mode }
239 #define Md { OP_M, d_mode }
240 #define Mo { OP_M, o_mode }
241 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
242 #define Mq { OP_M, q_mode }
243 #define Mx { OP_M, x_mode }
244 #define Mxmm { OP_M, xmm_mode }
245 #define Gb { OP_G, b_mode }
246 #define Gv { OP_G, v_mode }
247 #define Gd { OP_G, d_mode }
248 #define Gdq { OP_G, dq_mode }
249 #define Gm { OP_G, m_mode }
250 #define Gw { OP_G, w_mode }
251 #define Rd { OP_R, d_mode }
252 #define Rm { OP_R, m_mode }
253 #define Ib { OP_I, b_mode }
254 #define sIb { OP_sI, b_mode }   /* sign extened byte */
255 #define Iv { OP_I, v_mode }
256 #define Iq { OP_I, q_mode }
257 #define Iv64 { OP_I64, v_mode }
258 #define Iw { OP_I, w_mode }
259 #define I1 { OP_I, const_1_mode }
260 #define Jb { OP_J, b_mode }
261 #define Jv { OP_J, v_mode }
262 #define Cm { OP_C, m_mode }
263 #define Dm { OP_D, m_mode }
264 #define Td { OP_T, d_mode }
265 #define Skip_MODRM { OP_Skip_MODRM, 0 }
266
267 #define RMeAX { OP_REG, eAX_reg }
268 #define RMeBX { OP_REG, eBX_reg }
269 #define RMeCX { OP_REG, eCX_reg }
270 #define RMeDX { OP_REG, eDX_reg }
271 #define RMeSP { OP_REG, eSP_reg }
272 #define RMeBP { OP_REG, eBP_reg }
273 #define RMeSI { OP_REG, eSI_reg }
274 #define RMeDI { OP_REG, eDI_reg }
275 #define RMrAX { OP_REG, rAX_reg }
276 #define RMrBX { OP_REG, rBX_reg }
277 #define RMrCX { OP_REG, rCX_reg }
278 #define RMrDX { OP_REG, rDX_reg }
279 #define RMrSP { OP_REG, rSP_reg }
280 #define RMrBP { OP_REG, rBP_reg }
281 #define RMrSI { OP_REG, rSI_reg }
282 #define RMrDI { OP_REG, rDI_reg }
283 #define RMAL { OP_REG, al_reg }
284 #define RMAL { OP_REG, al_reg }
285 #define RMCL { OP_REG, cl_reg }
286 #define RMDL { OP_REG, dl_reg }
287 #define RMBL { OP_REG, bl_reg }
288 #define RMAH { OP_REG, ah_reg }
289 #define RMCH { OP_REG, ch_reg }
290 #define RMDH { OP_REG, dh_reg }
291 #define RMBH { OP_REG, bh_reg }
292 #define RMAX { OP_REG, ax_reg }
293 #define RMDX { OP_REG, dx_reg }
294
295 #define eAX { OP_IMREG, eAX_reg }
296 #define eBX { OP_IMREG, eBX_reg }
297 #define eCX { OP_IMREG, eCX_reg }
298 #define eDX { OP_IMREG, eDX_reg }
299 #define eSP { OP_IMREG, eSP_reg }
300 #define eBP { OP_IMREG, eBP_reg }
301 #define eSI { OP_IMREG, eSI_reg }
302 #define eDI { OP_IMREG, eDI_reg }
303 #define AL { OP_IMREG, al_reg }
304 #define CL { OP_IMREG, cl_reg }
305 #define DL { OP_IMREG, dl_reg }
306 #define BL { OP_IMREG, bl_reg }
307 #define AH { OP_IMREG, ah_reg }
308 #define CH { OP_IMREG, ch_reg }
309 #define DH { OP_IMREG, dh_reg }
310 #define BH { OP_IMREG, bh_reg }
311 #define AX { OP_IMREG, ax_reg }
312 #define DX { OP_IMREG, dx_reg }
313 #define zAX { OP_IMREG, z_mode_ax_reg }
314 #define indirDX { OP_IMREG, indir_dx_reg }
315
316 #define Sw { OP_SEG, w_mode }
317 #define Sv { OP_SEG, v_mode }
318 #define Ap { OP_DIR, 0 }
319 #define Ob { OP_OFF64, b_mode }
320 #define Ov { OP_OFF64, v_mode }
321 #define Xb { OP_DSreg, eSI_reg }
322 #define Xv { OP_DSreg, eSI_reg }
323 #define Xz { OP_DSreg, eSI_reg }
324 #define Yb { OP_ESreg, eDI_reg }
325 #define Yv { OP_ESreg, eDI_reg }
326 #define DSBX { OP_DSreg, eBX_reg }
327
328 #define es { OP_REG, es_reg }
329 #define ss { OP_REG, ss_reg }
330 #define cs { OP_REG, cs_reg }
331 #define ds { OP_REG, ds_reg }
332 #define fs { OP_REG, fs_reg }
333 #define gs { OP_REG, gs_reg }
334
335 #define MX { OP_MMX, 0 }
336 #define XM { OP_XMM, 0 }
337 #define XMScalar { OP_XMM, scalar_mode }
338 #define XMM { OP_XMM, xmm_mode }
339 #define EM { OP_EM, v_mode }
340 #define EMS { OP_EM, v_swap_mode }
341 #define EMd { OP_EM, d_mode }
342 #define EMx { OP_EM, x_mode }
343 #define EXw { OP_EX, w_mode }
344 #define EXd { OP_EX, d_mode }
345 #define EXdScalar { OP_EX, d_scalar_mode }
346 #define EXdS { OP_EX, d_swap_mode }
347 #define EXq { OP_EX, q_mode }
348 #define EXqScalar { OP_EX, q_scalar_mode }
349 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
350 #define EXqS { OP_EX, q_swap_mode }
351 #define EXx { OP_EX, x_mode }
352 #define EXxS { OP_EX, x_swap_mode }
353 #define EXxmm { OP_EX, xmm_mode }
354 #define EXxmmq { OP_EX, xmmq_mode }
355 #define EXymmq { OP_EX, ymmq_mode }
356 #define EXVexWdq { OP_EX, vex_w_dq_mode }
357 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
358 #define MS { OP_MS, v_mode }
359 #define XS { OP_XS, v_mode }
360 #define EMCq { OP_EMC, q_mode }
361 #define MXC { OP_MXC, 0 }
362 #define OPSUF { OP_3DNowSuffix, 0 }
363 #define CMP { CMP_Fixup, 0 }
364 #define XMM0 { XMM_Fixup, 0 }
365 #define FXSAVE { FXSAVE_Fixup, 0 }
366 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
367 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
368
369 #define Vex { OP_VEX, vex_mode }
370 #define VexScalar { OP_VEX, vex_scalar_mode }
371 #define Vex128 { OP_VEX, vex128_mode }
372 #define Vex256 { OP_VEX, vex256_mode }
373 #define VexI4 { VEXI4_Fixup, 0}
374 #define EXdVex { OP_EX_Vex, d_mode }
375 #define EXdVexS { OP_EX_Vex, d_swap_mode }
376 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
377 #define EXqVex { OP_EX_Vex, q_mode }
378 #define EXqVexS { OP_EX_Vex, q_swap_mode }
379 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
380 #define EXVexW { OP_EX_VexW, x_mode }
381 #define EXdVexW { OP_EX_VexW, d_mode }
382 #define EXqVexW { OP_EX_VexW, q_mode }
383 #define EXVexImmW { OP_EX_VexImmW, x_mode }
384 #define XMVex { OP_XMM_Vex, 0 }
385 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
386 #define XMVexW { OP_XMM_VexW, 0 }
387 #define XMVexI4 { OP_REG_VexI4, x_mode }
388 #define PCLMUL { PCLMUL_Fixup, 0 }
389 #define VZERO { VZERO_Fixup, 0 }
390 #define VCMP { VCMP_Fixup, 0 }
391
392 /* Used handle "rep" prefix for string instructions.  */
393 #define Xbr { REP_Fixup, eSI_reg }
394 #define Xvr { REP_Fixup, eSI_reg }
395 #define Ybr { REP_Fixup, eDI_reg }
396 #define Yvr { REP_Fixup, eDI_reg }
397 #define Yzr { REP_Fixup, eDI_reg }
398 #define indirDXr { REP_Fixup, indir_dx_reg }
399 #define ALr { REP_Fixup, al_reg }
400 #define eAXr { REP_Fixup, eAX_reg }
401
402 #define cond_jump_flag { NULL, cond_jump_mode }
403 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
404
405 /* bits in sizeflag */
406 #define SUFFIX_ALWAYS 4
407 #define AFLAG 2
408 #define DFLAG 1
409
410 enum
411 {
412   /* byte operand */
413   b_mode = 1,
414   /* byte operand with operand swapped */
415   b_swap_mode,
416   /* operand size depends on prefixes */
417   v_mode,
418   /* operand size depends on prefixes with operand swapped */
419   v_swap_mode,
420   /* word operand */
421   w_mode,
422   /* double word operand  */
423   d_mode,
424   /* double word operand with operand swapped */
425   d_swap_mode,
426   /* quad word operand */
427   q_mode,
428   /* quad word operand with operand swapped */
429   q_swap_mode,
430   /* ten-byte operand */
431   t_mode,
432   /* 16-byte XMM or 32-byte YMM operand */
433   x_mode,
434   /* 16-byte XMM or 32-byte YMM operand with operand swapped */
435   x_swap_mode,
436   /* 16-byte XMM operand */
437   xmm_mode,
438   /* 16-byte XMM or quad word operand */
439   xmmq_mode,
440   /* 32-byte YMM or quad word operand */
441   ymmq_mode,
442   /* d_mode in 32bit, q_mode in 64bit mode.  */
443   m_mode,
444   /* pair of v_mode operands */
445   a_mode,
446   cond_jump_mode,
447   loop_jcxz_mode,
448   /* operand size depends on REX prefixes.  */
449   dq_mode,
450   /* registers like dq_mode, memory like w_mode.  */
451   dqw_mode,
452   /* 4- or 6-byte pointer operand */
453   f_mode,
454   const_1_mode,
455   /* v_mode for stack-related opcodes.  */
456   stack_v_mode,
457   /* non-quad operand size depends on prefixes */
458   z_mode,
459   /* 16-byte operand */
460   o_mode,
461   /* registers like dq_mode, memory like b_mode.  */
462   dqb_mode,
463   /* registers like dq_mode, memory like d_mode.  */
464   dqd_mode,
465   /* normal vex mode */
466   vex_mode,
467   /* 128bit vex mode */
468   vex128_mode,
469   /* 256bit vex mode */
470   vex256_mode,
471   /* operand size depends on the VEX.W bit.  */
472   vex_w_dq_mode,
473
474   /* scalar, ignore vector length.  */
475   scalar_mode,
476   /* like d_mode, ignore vector length.  */
477   d_scalar_mode,
478   /* like d_swap_mode, ignore vector length.  */
479   d_scalar_swap_mode,
480   /* like q_mode, ignore vector length.  */
481   q_scalar_mode,
482   /* like q_swap_mode, ignore vector length.  */
483   q_scalar_swap_mode,
484   /* like vex_mode, ignore vector length.  */
485   vex_scalar_mode,
486   /* like vex_w_dq_mode, ignore vector length.  */
487   vex_scalar_w_dq_mode,
488
489   es_reg,
490   cs_reg,
491   ss_reg,
492   ds_reg,
493   fs_reg,
494   gs_reg,
495
496   eAX_reg,
497   eCX_reg,
498   eDX_reg,
499   eBX_reg,
500   eSP_reg,
501   eBP_reg,
502   eSI_reg,
503   eDI_reg,
504
505   al_reg,
506   cl_reg,
507   dl_reg,
508   bl_reg,
509   ah_reg,
510   ch_reg,
511   dh_reg,
512   bh_reg,
513
514   ax_reg,
515   cx_reg,
516   dx_reg,
517   bx_reg,
518   sp_reg,
519   bp_reg,
520   si_reg,
521   di_reg,
522
523   rAX_reg,
524   rCX_reg,
525   rDX_reg,
526   rBX_reg,
527   rSP_reg,
528   rBP_reg,
529   rSI_reg,
530   rDI_reg,
531
532   z_mode_ax_reg,
533   indir_dx_reg
534 };
535
536 enum
537 {
538   FLOATCODE = 1,
539   USE_REG_TABLE,
540   USE_MOD_TABLE,
541   USE_RM_TABLE,
542   USE_PREFIX_TABLE,
543   USE_X86_64_TABLE,
544   USE_3BYTE_TABLE,
545   USE_XOP_8F_TABLE,
546   USE_VEX_C4_TABLE,
547   USE_VEX_C5_TABLE,
548   USE_VEX_LEN_TABLE,
549   USE_VEX_W_TABLE
550 };
551
552 #define FLOAT                   NULL, { { NULL, FLOATCODE } }
553
554 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
555 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
556 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
557 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
558 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
559 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
560 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
561 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
562 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
563 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
564 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
565 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
566
567 enum
568 {
569   REG_80 = 0,
570   REG_81,
571   REG_82,
572   REG_8F,
573   REG_C0,
574   REG_C1,
575   REG_C6,
576   REG_C7,
577   REG_D0,
578   REG_D1,
579   REG_D2,
580   REG_D3,
581   REG_F6,
582   REG_F7,
583   REG_FE,
584   REG_FF,
585   REG_0F00,
586   REG_0F01,
587   REG_0F0D,
588   REG_0F18,
589   REG_0F71,
590   REG_0F72,
591   REG_0F73,
592   REG_0FA6,
593   REG_0FA7,
594   REG_0FAE,
595   REG_0FBA,
596   REG_0FC7,
597   REG_VEX_71,
598   REG_VEX_72,
599   REG_VEX_73,
600   REG_VEX_AE,
601   REG_XOP_LWPCB,
602   REG_XOP_LWP
603 };
604
605 enum
606 {
607   MOD_8D = 0,
608   MOD_0F01_REG_0,
609   MOD_0F01_REG_1,
610   MOD_0F01_REG_2,
611   MOD_0F01_REG_3,
612   MOD_0F01_REG_7,
613   MOD_0F12_PREFIX_0,
614   MOD_0F13,
615   MOD_0F16_PREFIX_0,
616   MOD_0F17,
617   MOD_0F18_REG_0,
618   MOD_0F18_REG_1,
619   MOD_0F18_REG_2,
620   MOD_0F18_REG_3,
621   MOD_0F20,
622   MOD_0F21,
623   MOD_0F22,
624   MOD_0F23,
625   MOD_0F24,
626   MOD_0F26,
627   MOD_0F2B_PREFIX_0,
628   MOD_0F2B_PREFIX_1,
629   MOD_0F2B_PREFIX_2,
630   MOD_0F2B_PREFIX_3,
631   MOD_0F51,
632   MOD_0F71_REG_2,
633   MOD_0F71_REG_4,
634   MOD_0F71_REG_6,
635   MOD_0F72_REG_2,
636   MOD_0F72_REG_4,
637   MOD_0F72_REG_6,
638   MOD_0F73_REG_2,
639   MOD_0F73_REG_3,
640   MOD_0F73_REG_6,
641   MOD_0F73_REG_7,
642   MOD_0FAE_REG_0,
643   MOD_0FAE_REG_1,
644   MOD_0FAE_REG_2,
645   MOD_0FAE_REG_3,
646   MOD_0FAE_REG_4,
647   MOD_0FAE_REG_5,
648   MOD_0FAE_REG_6,
649   MOD_0FAE_REG_7,
650   MOD_0FB2,
651   MOD_0FB4,
652   MOD_0FB5,
653   MOD_0FC7_REG_6,
654   MOD_0FC7_REG_7,
655   MOD_0FD7,
656   MOD_0FE7_PREFIX_2,
657   MOD_0FF0_PREFIX_3,
658   MOD_0F382A_PREFIX_2,
659   MOD_62_32BIT,
660   MOD_C4_32BIT,
661   MOD_C5_32BIT,
662   MOD_VEX_12_PREFIX_0,
663   MOD_VEX_13,
664   MOD_VEX_16_PREFIX_0,
665   MOD_VEX_17,
666   MOD_VEX_2B,
667   MOD_VEX_50,
668   MOD_VEX_71_REG_2,
669   MOD_VEX_71_REG_4,
670   MOD_VEX_71_REG_6,
671   MOD_VEX_72_REG_2,
672   MOD_VEX_72_REG_4,
673   MOD_VEX_72_REG_6,
674   MOD_VEX_73_REG_2,
675   MOD_VEX_73_REG_3,
676   MOD_VEX_73_REG_6,
677   MOD_VEX_73_REG_7,
678   MOD_VEX_AE_REG_2,
679   MOD_VEX_AE_REG_3,
680   MOD_VEX_D7_PREFIX_2,
681   MOD_VEX_E7_PREFIX_2,
682   MOD_VEX_F0_PREFIX_3,
683   MOD_VEX_3818_PREFIX_2,
684   MOD_VEX_3819_PREFIX_2,
685   MOD_VEX_381A_PREFIX_2,
686   MOD_VEX_382A_PREFIX_2,
687   MOD_VEX_382C_PREFIX_2,
688   MOD_VEX_382D_PREFIX_2,
689   MOD_VEX_382E_PREFIX_2,
690   MOD_VEX_382F_PREFIX_2
691 };
692
693 enum
694 {
695   RM_0F01_REG_0 = 0,
696   RM_0F01_REG_1,
697   RM_0F01_REG_2,
698   RM_0F01_REG_3,
699   RM_0F01_REG_7,
700   RM_0FAE_REG_5,
701   RM_0FAE_REG_6,
702   RM_0FAE_REG_7
703 };
704
705 enum
706 {
707   PREFIX_90 = 0,
708   PREFIX_0F10,
709   PREFIX_0F11,
710   PREFIX_0F12,
711   PREFIX_0F16,
712   PREFIX_0F2A,
713   PREFIX_0F2B,
714   PREFIX_0F2C,
715   PREFIX_0F2D,
716   PREFIX_0F2E,
717   PREFIX_0F2F,
718   PREFIX_0F51,
719   PREFIX_0F52,
720   PREFIX_0F53,
721   PREFIX_0F58,
722   PREFIX_0F59,
723   PREFIX_0F5A,
724   PREFIX_0F5B,
725   PREFIX_0F5C,
726   PREFIX_0F5D,
727   PREFIX_0F5E,
728   PREFIX_0F5F,
729   PREFIX_0F60,
730   PREFIX_0F61,
731   PREFIX_0F62,
732   PREFIX_0F6C,
733   PREFIX_0F6D,
734   PREFIX_0F6F,
735   PREFIX_0F70,
736   PREFIX_0F73_REG_3,
737   PREFIX_0F73_REG_7,
738   PREFIX_0F78,
739   PREFIX_0F79,
740   PREFIX_0F7C,
741   PREFIX_0F7D,
742   PREFIX_0F7E,
743   PREFIX_0F7F,
744   PREFIX_0FB8,
745   PREFIX_0FBD,
746   PREFIX_0FC2,
747   PREFIX_0FC3,
748   PREFIX_0FC7_REG_6,
749   PREFIX_0FD0,
750   PREFIX_0FD6,
751   PREFIX_0FE6,
752   PREFIX_0FE7,
753   PREFIX_0FF0,
754   PREFIX_0FF7,
755   PREFIX_0F3810,
756   PREFIX_0F3814,
757   PREFIX_0F3815,
758   PREFIX_0F3817,
759   PREFIX_0F3820,
760   PREFIX_0F3821,
761   PREFIX_0F3822,
762   PREFIX_0F3823,
763   PREFIX_0F3824,
764   PREFIX_0F3825,
765   PREFIX_0F3828,
766   PREFIX_0F3829,
767   PREFIX_0F382A,
768   PREFIX_0F382B,
769   PREFIX_0F3830,
770   PREFIX_0F3831,
771   PREFIX_0F3832,
772   PREFIX_0F3833,
773   PREFIX_0F3834,
774   PREFIX_0F3835,
775   PREFIX_0F3837,
776   PREFIX_0F3838,
777   PREFIX_0F3839,
778   PREFIX_0F383A,
779   PREFIX_0F383B,
780   PREFIX_0F383C,
781   PREFIX_0F383D,
782   PREFIX_0F383E,
783   PREFIX_0F383F,
784   PREFIX_0F3840,
785   PREFIX_0F3841,
786   PREFIX_0F3880,
787   PREFIX_0F3881,
788   PREFIX_0F38DB,
789   PREFIX_0F38DC,
790   PREFIX_0F38DD,
791   PREFIX_0F38DE,
792   PREFIX_0F38DF,
793   PREFIX_0F38F0,
794   PREFIX_0F38F1,
795   PREFIX_0F3A08,
796   PREFIX_0F3A09,
797   PREFIX_0F3A0A,
798   PREFIX_0F3A0B,
799   PREFIX_0F3A0C,
800   PREFIX_0F3A0D,
801   PREFIX_0F3A0E,
802   PREFIX_0F3A14,
803   PREFIX_0F3A15,
804   PREFIX_0F3A16,
805   PREFIX_0F3A17,
806   PREFIX_0F3A20,
807   PREFIX_0F3A21,
808   PREFIX_0F3A22,
809   PREFIX_0F3A40,
810   PREFIX_0F3A41,
811   PREFIX_0F3A42,
812   PREFIX_0F3A44,
813   PREFIX_0F3A60,
814   PREFIX_0F3A61,
815   PREFIX_0F3A62,
816   PREFIX_0F3A63,
817   PREFIX_0F3ADF,
818   PREFIX_VEX_10,
819   PREFIX_VEX_11,
820   PREFIX_VEX_12,
821   PREFIX_VEX_16,
822   PREFIX_VEX_2A,
823   PREFIX_VEX_2C,
824   PREFIX_VEX_2D,
825   PREFIX_VEX_2E,
826   PREFIX_VEX_2F,
827   PREFIX_VEX_51,
828   PREFIX_VEX_52,
829   PREFIX_VEX_53,
830   PREFIX_VEX_58,
831   PREFIX_VEX_59,
832   PREFIX_VEX_5A,
833   PREFIX_VEX_5B,
834   PREFIX_VEX_5C,
835   PREFIX_VEX_5D,
836   PREFIX_VEX_5E,
837   PREFIX_VEX_5F,
838   PREFIX_VEX_60,
839   PREFIX_VEX_61,
840   PREFIX_VEX_62,
841   PREFIX_VEX_63,
842   PREFIX_VEX_64,
843   PREFIX_VEX_65,
844   PREFIX_VEX_66,
845   PREFIX_VEX_67,
846   PREFIX_VEX_68,
847   PREFIX_VEX_69,
848   PREFIX_VEX_6A,
849   PREFIX_VEX_6B,
850   PREFIX_VEX_6C,
851   PREFIX_VEX_6D,
852   PREFIX_VEX_6E,
853   PREFIX_VEX_6F,
854   PREFIX_VEX_70,
855   PREFIX_VEX_71_REG_2,
856   PREFIX_VEX_71_REG_4,
857   PREFIX_VEX_71_REG_6,
858   PREFIX_VEX_72_REG_2,
859   PREFIX_VEX_72_REG_4,
860   PREFIX_VEX_72_REG_6,
861   PREFIX_VEX_73_REG_2,
862   PREFIX_VEX_73_REG_3,
863   PREFIX_VEX_73_REG_6,
864   PREFIX_VEX_73_REG_7,
865   PREFIX_VEX_74,
866   PREFIX_VEX_75,
867   PREFIX_VEX_76,
868   PREFIX_VEX_77,
869   PREFIX_VEX_7C,
870   PREFIX_VEX_7D,
871   PREFIX_VEX_7E,
872   PREFIX_VEX_7F,
873   PREFIX_VEX_C2,
874   PREFIX_VEX_C4,
875   PREFIX_VEX_C5,
876   PREFIX_VEX_D0,
877   PREFIX_VEX_D1,
878   PREFIX_VEX_D2,
879   PREFIX_VEX_D3,
880   PREFIX_VEX_D4,
881   PREFIX_VEX_D5,
882   PREFIX_VEX_D6,
883   PREFIX_VEX_D7,
884   PREFIX_VEX_D8,
885   PREFIX_VEX_D9,
886   PREFIX_VEX_DA,
887   PREFIX_VEX_DB,
888   PREFIX_VEX_DC,
889   PREFIX_VEX_DD,
890   PREFIX_VEX_DE,
891   PREFIX_VEX_DF,
892   PREFIX_VEX_E0,
893   PREFIX_VEX_E1,
894   PREFIX_VEX_E2,
895   PREFIX_VEX_E3,
896   PREFIX_VEX_E4,
897   PREFIX_VEX_E5,
898   PREFIX_VEX_E6,
899   PREFIX_VEX_E7,
900   PREFIX_VEX_E8,
901   PREFIX_VEX_E9,
902   PREFIX_VEX_EA,
903   PREFIX_VEX_EB,
904   PREFIX_VEX_EC,
905   PREFIX_VEX_ED,
906   PREFIX_VEX_EE,
907   PREFIX_VEX_EF,
908   PREFIX_VEX_F0,
909   PREFIX_VEX_F1,
910   PREFIX_VEX_F2,
911   PREFIX_VEX_F3,
912   PREFIX_VEX_F4,
913   PREFIX_VEX_F5,
914   PREFIX_VEX_F6,
915   PREFIX_VEX_F7,
916   PREFIX_VEX_F8,
917   PREFIX_VEX_F9,
918   PREFIX_VEX_FA,
919   PREFIX_VEX_FB,
920   PREFIX_VEX_FC,
921   PREFIX_VEX_FD,
922   PREFIX_VEX_FE,
923   PREFIX_VEX_3800,
924   PREFIX_VEX_3801,
925   PREFIX_VEX_3802,
926   PREFIX_VEX_3803,
927   PREFIX_VEX_3804,
928   PREFIX_VEX_3805,
929   PREFIX_VEX_3806,
930   PREFIX_VEX_3807,
931   PREFIX_VEX_3808,
932   PREFIX_VEX_3809,
933   PREFIX_VEX_380A,
934   PREFIX_VEX_380B,
935   PREFIX_VEX_380C,
936   PREFIX_VEX_380D,
937   PREFIX_VEX_380E,
938   PREFIX_VEX_380F,
939   PREFIX_VEX_3817,
940   PREFIX_VEX_3818,
941   PREFIX_VEX_3819,
942   PREFIX_VEX_381A,
943   PREFIX_VEX_381C,
944   PREFIX_VEX_381D,
945   PREFIX_VEX_381E,
946   PREFIX_VEX_3820,
947   PREFIX_VEX_3821,
948   PREFIX_VEX_3822,
949   PREFIX_VEX_3823,
950   PREFIX_VEX_3824,
951   PREFIX_VEX_3825,
952   PREFIX_VEX_3828,
953   PREFIX_VEX_3829,
954   PREFIX_VEX_382A,
955   PREFIX_VEX_382B,
956   PREFIX_VEX_382C,
957   PREFIX_VEX_382D,
958   PREFIX_VEX_382E,
959   PREFIX_VEX_382F,
960   PREFIX_VEX_3830,
961   PREFIX_VEX_3831,
962   PREFIX_VEX_3832,
963   PREFIX_VEX_3833,
964   PREFIX_VEX_3834,
965   PREFIX_VEX_3835,
966   PREFIX_VEX_3837,
967   PREFIX_VEX_3838,
968   PREFIX_VEX_3839,
969   PREFIX_VEX_383A,
970   PREFIX_VEX_383B,
971   PREFIX_VEX_383C,
972   PREFIX_VEX_383D,
973   PREFIX_VEX_383E,
974   PREFIX_VEX_383F,
975   PREFIX_VEX_3840,
976   PREFIX_VEX_3841,
977   PREFIX_VEX_3896,
978   PREFIX_VEX_3897,
979   PREFIX_VEX_3898,
980   PREFIX_VEX_3899,
981   PREFIX_VEX_389A,
982   PREFIX_VEX_389B,
983   PREFIX_VEX_389C,
984   PREFIX_VEX_389D,
985   PREFIX_VEX_389E,
986   PREFIX_VEX_389F,
987   PREFIX_VEX_38A6,
988   PREFIX_VEX_38A7,
989   PREFIX_VEX_38A8,
990   PREFIX_VEX_38A9,
991   PREFIX_VEX_38AA,
992   PREFIX_VEX_38AB,
993   PREFIX_VEX_38AC,
994   PREFIX_VEX_38AD,
995   PREFIX_VEX_38AE,
996   PREFIX_VEX_38AF,
997   PREFIX_VEX_38B6,
998   PREFIX_VEX_38B7,
999   PREFIX_VEX_38B8,
1000   PREFIX_VEX_38B9,
1001   PREFIX_VEX_38BA,
1002   PREFIX_VEX_38BB,
1003   PREFIX_VEX_38BC,
1004   PREFIX_VEX_38BD,
1005   PREFIX_VEX_38BE,
1006   PREFIX_VEX_38BF,
1007   PREFIX_VEX_38DB,
1008   PREFIX_VEX_38DC,
1009   PREFIX_VEX_38DD,
1010   PREFIX_VEX_38DE,
1011   PREFIX_VEX_38DF,
1012   PREFIX_VEX_3A04,
1013   PREFIX_VEX_3A05,
1014   PREFIX_VEX_3A06,
1015   PREFIX_VEX_3A08,
1016   PREFIX_VEX_3A09,
1017   PREFIX_VEX_3A0A,
1018   PREFIX_VEX_3A0B,
1019   PREFIX_VEX_3A0C,
1020   PREFIX_VEX_3A0D,
1021   PREFIX_VEX_3A0E,
1022   PREFIX_VEX_3A0F,
1023   PREFIX_VEX_3A14,
1024   PREFIX_VEX_3A15,
1025   PREFIX_VEX_3A16,
1026   PREFIX_VEX_3A17,
1027   PREFIX_VEX_3A18,
1028   PREFIX_VEX_3A19,
1029   PREFIX_VEX_3A20,
1030   PREFIX_VEX_3A21,
1031   PREFIX_VEX_3A22,
1032   PREFIX_VEX_3A40,
1033   PREFIX_VEX_3A41,
1034   PREFIX_VEX_3A42,
1035   PREFIX_VEX_3A44,
1036   PREFIX_VEX_3A48,
1037   PREFIX_VEX_3A49,
1038   PREFIX_VEX_3A4A,
1039   PREFIX_VEX_3A4B,
1040   PREFIX_VEX_3A4C,
1041   PREFIX_VEX_3A5C,
1042   PREFIX_VEX_3A5D,
1043   PREFIX_VEX_3A5E,
1044   PREFIX_VEX_3A5F,
1045   PREFIX_VEX_3A60,
1046   PREFIX_VEX_3A61,
1047   PREFIX_VEX_3A62,
1048   PREFIX_VEX_3A63,
1049   PREFIX_VEX_3A68,
1050   PREFIX_VEX_3A69,
1051   PREFIX_VEX_3A6A,
1052   PREFIX_VEX_3A6B,
1053   PREFIX_VEX_3A6C,
1054   PREFIX_VEX_3A6D,
1055   PREFIX_VEX_3A6E,
1056   PREFIX_VEX_3A6F,
1057   PREFIX_VEX_3A78,
1058   PREFIX_VEX_3A79,
1059   PREFIX_VEX_3A7A,
1060   PREFIX_VEX_3A7B,
1061   PREFIX_VEX_3A7C,
1062   PREFIX_VEX_3A7D,
1063   PREFIX_VEX_3A7E,
1064   PREFIX_VEX_3A7F,
1065   PREFIX_VEX_3ADF
1066 };
1067
1068 enum
1069 {
1070   X86_64_06 = 0,
1071   X86_64_07,
1072   X86_64_0D,
1073   X86_64_16,
1074   X86_64_17,
1075   X86_64_1E,
1076   X86_64_1F,
1077   X86_64_27,
1078   X86_64_2F,
1079   X86_64_37,
1080   X86_64_3F,
1081   X86_64_60,
1082   X86_64_61,
1083   X86_64_62,
1084   X86_64_63,
1085   X86_64_6D,
1086   X86_64_6F,
1087   X86_64_9A,
1088   X86_64_C4,
1089   X86_64_C5,
1090   X86_64_CE,
1091   X86_64_D4,
1092   X86_64_D5,
1093   X86_64_EA,
1094   X86_64_0F01_REG_0,
1095   X86_64_0F01_REG_1,
1096   X86_64_0F01_REG_2,
1097   X86_64_0F01_REG_3
1098 };
1099
1100 enum
1101 {
1102   THREE_BYTE_0F38 = 0,
1103   THREE_BYTE_0F3A,
1104   THREE_BYTE_0F7A
1105 };
1106
1107 enum
1108 {
1109   XOP_08 = 0,
1110   XOP_09,
1111   XOP_0A
1112 };
1113
1114 enum
1115 {
1116   VEX_0F = 0,
1117   VEX_0F38,
1118   VEX_0F3A
1119 };
1120
1121 enum
1122 {
1123   VEX_LEN_10_P_1 = 0,
1124   VEX_LEN_10_P_3,
1125   VEX_LEN_11_P_1,
1126   VEX_LEN_11_P_3,
1127   VEX_LEN_12_P_0_M_0,
1128   VEX_LEN_12_P_0_M_1,
1129   VEX_LEN_12_P_2,
1130   VEX_LEN_13_M_0,
1131   VEX_LEN_16_P_0_M_0,
1132   VEX_LEN_16_P_0_M_1,
1133   VEX_LEN_16_P_2,
1134   VEX_LEN_17_M_0,
1135   VEX_LEN_2A_P_1,
1136   VEX_LEN_2A_P_3,
1137   VEX_LEN_2C_P_1,
1138   VEX_LEN_2C_P_3,
1139   VEX_LEN_2D_P_1,
1140   VEX_LEN_2D_P_3,
1141   VEX_LEN_2E_P_0,
1142   VEX_LEN_2E_P_2,
1143   VEX_LEN_2F_P_0,
1144   VEX_LEN_2F_P_2,
1145   VEX_LEN_51_P_1,
1146   VEX_LEN_51_P_3,
1147   VEX_LEN_52_P_1,
1148   VEX_LEN_53_P_1,
1149   VEX_LEN_58_P_1,
1150   VEX_LEN_58_P_3,
1151   VEX_LEN_59_P_1,
1152   VEX_LEN_59_P_3,
1153   VEX_LEN_5A_P_1,
1154   VEX_LEN_5A_P_3,
1155   VEX_LEN_5C_P_1,
1156   VEX_LEN_5C_P_3,
1157   VEX_LEN_5D_P_1,
1158   VEX_LEN_5D_P_3,
1159   VEX_LEN_5E_P_1,
1160   VEX_LEN_5E_P_3,
1161   VEX_LEN_5F_P_1,
1162   VEX_LEN_5F_P_3,
1163   VEX_LEN_60_P_2,
1164   VEX_LEN_61_P_2,
1165   VEX_LEN_62_P_2,
1166   VEX_LEN_63_P_2,
1167   VEX_LEN_64_P_2,
1168   VEX_LEN_65_P_2,
1169   VEX_LEN_66_P_2,
1170   VEX_LEN_67_P_2,
1171   VEX_LEN_68_P_2,
1172   VEX_LEN_69_P_2,
1173   VEX_LEN_6A_P_2,
1174   VEX_LEN_6B_P_2,
1175   VEX_LEN_6C_P_2,
1176   VEX_LEN_6D_P_2,
1177   VEX_LEN_6E_P_2,
1178   VEX_LEN_70_P_1,
1179   VEX_LEN_70_P_2,
1180   VEX_LEN_70_P_3,
1181   VEX_LEN_71_R_2_P_2,
1182   VEX_LEN_71_R_4_P_2,
1183   VEX_LEN_71_R_6_P_2,
1184   VEX_LEN_72_R_2_P_2,
1185   VEX_LEN_72_R_4_P_2,
1186   VEX_LEN_72_R_6_P_2,
1187   VEX_LEN_73_R_2_P_2,
1188   VEX_LEN_73_R_3_P_2,
1189   VEX_LEN_73_R_6_P_2,
1190   VEX_LEN_73_R_7_P_2,
1191   VEX_LEN_74_P_2,
1192   VEX_LEN_75_P_2,
1193   VEX_LEN_76_P_2,
1194   VEX_LEN_7E_P_1,
1195   VEX_LEN_7E_P_2,
1196   VEX_LEN_AE_R_2_M_0,
1197   VEX_LEN_AE_R_3_M_0,
1198   VEX_LEN_C2_P_1,
1199   VEX_LEN_C2_P_3,
1200   VEX_LEN_C4_P_2,
1201   VEX_LEN_C5_P_2,
1202   VEX_LEN_D1_P_2,
1203   VEX_LEN_D2_P_2,
1204   VEX_LEN_D3_P_2,
1205   VEX_LEN_D4_P_2,
1206   VEX_LEN_D5_P_2,
1207   VEX_LEN_D6_P_2,
1208   VEX_LEN_D7_P_2_M_1,
1209   VEX_LEN_D8_P_2,
1210   VEX_LEN_D9_P_2,
1211   VEX_LEN_DA_P_2,
1212   VEX_LEN_DB_P_2,
1213   VEX_LEN_DC_P_2,
1214   VEX_LEN_DD_P_2,
1215   VEX_LEN_DE_P_2,
1216   VEX_LEN_DF_P_2,
1217   VEX_LEN_E0_P_2,
1218   VEX_LEN_E1_P_2,
1219   VEX_LEN_E2_P_2,
1220   VEX_LEN_E3_P_2,
1221   VEX_LEN_E4_P_2,
1222   VEX_LEN_E5_P_2,
1223   VEX_LEN_E8_P_2,
1224   VEX_LEN_E9_P_2,
1225   VEX_LEN_EA_P_2,
1226   VEX_LEN_EB_P_2,
1227   VEX_LEN_EC_P_2,
1228   VEX_LEN_ED_P_2,
1229   VEX_LEN_EE_P_2,
1230   VEX_LEN_EF_P_2,
1231   VEX_LEN_F1_P_2,
1232   VEX_LEN_F2_P_2,
1233   VEX_LEN_F3_P_2,
1234   VEX_LEN_F4_P_2,
1235   VEX_LEN_F5_P_2,
1236   VEX_LEN_F6_P_2,
1237   VEX_LEN_F7_P_2,
1238   VEX_LEN_F8_P_2,
1239   VEX_LEN_F9_P_2,
1240   VEX_LEN_FA_P_2,
1241   VEX_LEN_FB_P_2,
1242   VEX_LEN_FC_P_2,
1243   VEX_LEN_FD_P_2,
1244   VEX_LEN_FE_P_2,
1245   VEX_LEN_3800_P_2,
1246   VEX_LEN_3801_P_2,
1247   VEX_LEN_3802_P_2,
1248   VEX_LEN_3803_P_2,
1249   VEX_LEN_3804_P_2,
1250   VEX_LEN_3805_P_2,
1251   VEX_LEN_3806_P_2,
1252   VEX_LEN_3807_P_2,
1253   VEX_LEN_3808_P_2,
1254   VEX_LEN_3809_P_2,
1255   VEX_LEN_380A_P_2,
1256   VEX_LEN_380B_P_2,
1257   VEX_LEN_3819_P_2_M_0,
1258   VEX_LEN_381A_P_2_M_0,
1259   VEX_LEN_381C_P_2,
1260   VEX_LEN_381D_P_2,
1261   VEX_LEN_381E_P_2,
1262   VEX_LEN_3820_P_2,
1263   VEX_LEN_3821_P_2,
1264   VEX_LEN_3822_P_2,
1265   VEX_LEN_3823_P_2,
1266   VEX_LEN_3824_P_2,
1267   VEX_LEN_3825_P_2,
1268   VEX_LEN_3828_P_2,
1269   VEX_LEN_3829_P_2,
1270   VEX_LEN_382A_P_2_M_0,
1271   VEX_LEN_382B_P_2,
1272   VEX_LEN_3830_P_2,
1273   VEX_LEN_3831_P_2,
1274   VEX_LEN_3832_P_2,
1275   VEX_LEN_3833_P_2,
1276   VEX_LEN_3834_P_2,
1277   VEX_LEN_3835_P_2,
1278   VEX_LEN_3837_P_2,
1279   VEX_LEN_3838_P_2,
1280   VEX_LEN_3839_P_2,
1281   VEX_LEN_383A_P_2,
1282   VEX_LEN_383B_P_2,
1283   VEX_LEN_383C_P_2,
1284   VEX_LEN_383D_P_2,
1285   VEX_LEN_383E_P_2,
1286   VEX_LEN_383F_P_2,
1287   VEX_LEN_3840_P_2,
1288   VEX_LEN_3841_P_2,
1289   VEX_LEN_38DB_P_2,
1290   VEX_LEN_38DC_P_2,
1291   VEX_LEN_38DD_P_2,
1292   VEX_LEN_38DE_P_2,
1293   VEX_LEN_38DF_P_2,
1294   VEX_LEN_3A06_P_2,
1295   VEX_LEN_3A0A_P_2,
1296   VEX_LEN_3A0B_P_2,
1297   VEX_LEN_3A0E_P_2,
1298   VEX_LEN_3A0F_P_2,
1299   VEX_LEN_3A14_P_2,
1300   VEX_LEN_3A15_P_2,
1301   VEX_LEN_3A16_P_2,
1302   VEX_LEN_3A17_P_2,
1303   VEX_LEN_3A18_P_2,
1304   VEX_LEN_3A19_P_2,
1305   VEX_LEN_3A20_P_2,
1306   VEX_LEN_3A21_P_2,
1307   VEX_LEN_3A22_P_2,
1308   VEX_LEN_3A41_P_2,
1309   VEX_LEN_3A42_P_2,
1310   VEX_LEN_3A44_P_2,
1311   VEX_LEN_3A4C_P_2,
1312   VEX_LEN_3A60_P_2,
1313   VEX_LEN_3A61_P_2,
1314   VEX_LEN_3A62_P_2,
1315   VEX_LEN_3A63_P_2,
1316   VEX_LEN_3A6A_P_2,
1317   VEX_LEN_3A6B_P_2,
1318   VEX_LEN_3A6E_P_2,
1319   VEX_LEN_3A6F_P_2,
1320   VEX_LEN_3A7A_P_2,
1321   VEX_LEN_3A7B_P_2,
1322   VEX_LEN_3A7E_P_2,
1323   VEX_LEN_3A7F_P_2,
1324   VEX_LEN_3ADF_P_2,
1325   VEX_LEN_XOP_09_80,
1326   VEX_LEN_XOP_09_81
1327 };
1328
1329 enum
1330 {
1331   VEX_W_10_P_0 = 0,
1332   VEX_W_10_P_1,
1333   VEX_W_10_P_2,
1334   VEX_W_10_P_3,
1335   VEX_W_11_P_0,
1336   VEX_W_11_P_1,
1337   VEX_W_11_P_2,
1338   VEX_W_11_P_3,
1339   VEX_W_12_P_0_M_0,
1340   VEX_W_12_P_0_M_1,
1341   VEX_W_12_P_1,
1342   VEX_W_12_P_2,
1343   VEX_W_12_P_3,
1344   VEX_W_13_M_0,
1345   VEX_W_14,
1346   VEX_W_15,
1347   VEX_W_16_P_0_M_0,
1348   VEX_W_16_P_0_M_1,
1349   VEX_W_16_P_1,
1350   VEX_W_16_P_2,
1351   VEX_W_17_M_0,
1352   VEX_W_28,
1353   VEX_W_29,
1354   VEX_W_2B_M_0,
1355   VEX_W_2E_P_0,
1356   VEX_W_2E_P_2,
1357   VEX_W_2F_P_0,
1358   VEX_W_2F_P_2,
1359   VEX_W_50_M_0,
1360   VEX_W_51_P_0,
1361   VEX_W_51_P_1,
1362   VEX_W_51_P_2,
1363   VEX_W_51_P_3,
1364   VEX_W_52_P_0,
1365   VEX_W_52_P_1,
1366   VEX_W_53_P_0,
1367   VEX_W_53_P_1,
1368   VEX_W_58_P_0,
1369   VEX_W_58_P_1,
1370   VEX_W_58_P_2,
1371   VEX_W_58_P_3,
1372   VEX_W_59_P_0,
1373   VEX_W_59_P_1,
1374   VEX_W_59_P_2,
1375   VEX_W_59_P_3,
1376   VEX_W_5A_P_0,
1377   VEX_W_5A_P_1,
1378   VEX_W_5A_P_3,
1379   VEX_W_5B_P_0,
1380   VEX_W_5B_P_1,
1381   VEX_W_5B_P_2,
1382   VEX_W_5C_P_0,
1383   VEX_W_5C_P_1,
1384   VEX_W_5C_P_2,
1385   VEX_W_5C_P_3,
1386   VEX_W_5D_P_0,
1387   VEX_W_5D_P_1,
1388   VEX_W_5D_P_2,
1389   VEX_W_5D_P_3,
1390   VEX_W_5E_P_0,
1391   VEX_W_5E_P_1,
1392   VEX_W_5E_P_2,
1393   VEX_W_5E_P_3,
1394   VEX_W_5F_P_0,
1395   VEX_W_5F_P_1,
1396   VEX_W_5F_P_2,
1397   VEX_W_5F_P_3,
1398   VEX_W_60_P_2,
1399   VEX_W_61_P_2,
1400   VEX_W_62_P_2,
1401   VEX_W_63_P_2,
1402   VEX_W_64_P_2,
1403   VEX_W_65_P_2,
1404   VEX_W_66_P_2,
1405   VEX_W_67_P_2,
1406   VEX_W_68_P_2,
1407   VEX_W_69_P_2,
1408   VEX_W_6A_P_2,
1409   VEX_W_6B_P_2,
1410   VEX_W_6C_P_2,
1411   VEX_W_6D_P_2,
1412   VEX_W_6F_P_1,
1413   VEX_W_6F_P_2,
1414   VEX_W_70_P_1,
1415   VEX_W_70_P_2,
1416   VEX_W_70_P_3,
1417   VEX_W_71_R_2_P_2,
1418   VEX_W_71_R_4_P_2,
1419   VEX_W_71_R_6_P_2,
1420   VEX_W_72_R_2_P_2,
1421   VEX_W_72_R_4_P_2,
1422   VEX_W_72_R_6_P_2,
1423   VEX_W_73_R_2_P_2,
1424   VEX_W_73_R_3_P_2,
1425   VEX_W_73_R_6_P_2,
1426   VEX_W_73_R_7_P_2,
1427   VEX_W_74_P_2,
1428   VEX_W_75_P_2,
1429   VEX_W_76_P_2,
1430   VEX_W_77_P_0,
1431   VEX_W_7C_P_2,
1432   VEX_W_7C_P_3,
1433   VEX_W_7D_P_2,
1434   VEX_W_7D_P_3,
1435   VEX_W_7E_P_1,
1436   VEX_W_7F_P_1,
1437   VEX_W_7F_P_2,
1438   VEX_W_AE_R_2_M_0,
1439   VEX_W_AE_R_3_M_0,
1440   VEX_W_C2_P_0,
1441   VEX_W_C2_P_1,
1442   VEX_W_C2_P_2,
1443   VEX_W_C2_P_3,
1444   VEX_W_C4_P_2,
1445   VEX_W_C5_P_2,
1446   VEX_W_D0_P_2,
1447   VEX_W_D0_P_3,
1448   VEX_W_D1_P_2,
1449   VEX_W_D2_P_2,
1450   VEX_W_D3_P_2,
1451   VEX_W_D4_P_2,
1452   VEX_W_D5_P_2,
1453   VEX_W_D6_P_2,
1454   VEX_W_D7_P_2_M_1,
1455   VEX_W_D8_P_2,
1456   VEX_W_D9_P_2,
1457   VEX_W_DA_P_2,
1458   VEX_W_DB_P_2,
1459   VEX_W_DC_P_2,
1460   VEX_W_DD_P_2,
1461   VEX_W_DE_P_2,
1462   VEX_W_DF_P_2,
1463   VEX_W_E0_P_2,
1464   VEX_W_E1_P_2,
1465   VEX_W_E2_P_2,
1466   VEX_W_E3_P_2,
1467   VEX_W_E4_P_2,
1468   VEX_W_E5_P_2,
1469   VEX_W_E6_P_1,
1470   VEX_W_E6_P_2,
1471   VEX_W_E6_P_3,
1472   VEX_W_E7_P_2_M_0,
1473   VEX_W_E8_P_2,
1474   VEX_W_E9_P_2,
1475   VEX_W_EA_P_2,
1476   VEX_W_EB_P_2,
1477   VEX_W_EC_P_2,
1478   VEX_W_ED_P_2,
1479   VEX_W_EE_P_2,
1480   VEX_W_EF_P_2,
1481   VEX_W_F0_P_3_M_0,
1482   VEX_W_F1_P_2,
1483   VEX_W_F2_P_2,
1484   VEX_W_F3_P_2,
1485   VEX_W_F4_P_2,
1486   VEX_W_F5_P_2,
1487   VEX_W_F6_P_2,
1488   VEX_W_F7_P_2,
1489   VEX_W_F8_P_2,
1490   VEX_W_F9_P_2,
1491   VEX_W_FA_P_2,
1492   VEX_W_FB_P_2,
1493   VEX_W_FC_P_2,
1494   VEX_W_FD_P_2,
1495   VEX_W_FE_P_2,
1496   VEX_W_3800_P_2,
1497   VEX_W_3801_P_2,
1498   VEX_W_3802_P_2,
1499   VEX_W_3803_P_2,
1500   VEX_W_3804_P_2,
1501   VEX_W_3805_P_2,
1502   VEX_W_3806_P_2,
1503   VEX_W_3807_P_2,
1504   VEX_W_3808_P_2,
1505   VEX_W_3809_P_2,
1506   VEX_W_380A_P_2,
1507   VEX_W_380B_P_2,
1508   VEX_W_380C_P_2,
1509   VEX_W_380D_P_2,
1510   VEX_W_380E_P_2,
1511   VEX_W_380F_P_2,
1512   VEX_W_3817_P_2,
1513   VEX_W_3818_P_2_M_0,
1514   VEX_W_3819_P_2_M_0,
1515   VEX_W_381A_P_2_M_0,
1516   VEX_W_381C_P_2,
1517   VEX_W_381D_P_2,
1518   VEX_W_381E_P_2,
1519   VEX_W_3820_P_2,
1520   VEX_W_3821_P_2,
1521   VEX_W_3822_P_2,
1522   VEX_W_3823_P_2,
1523   VEX_W_3824_P_2,
1524   VEX_W_3825_P_2,
1525   VEX_W_3828_P_2,
1526   VEX_W_3829_P_2,
1527   VEX_W_382A_P_2_M_0,
1528   VEX_W_382B_P_2,
1529   VEX_W_382C_P_2_M_0,
1530   VEX_W_382D_P_2_M_0,
1531   VEX_W_382E_P_2_M_0,
1532   VEX_W_382F_P_2_M_0,
1533   VEX_W_3830_P_2,
1534   VEX_W_3831_P_2,
1535   VEX_W_3832_P_2,
1536   VEX_W_3833_P_2,
1537   VEX_W_3834_P_2,
1538   VEX_W_3835_P_2,
1539   VEX_W_3837_P_2,
1540   VEX_W_3838_P_2,
1541   VEX_W_3839_P_2,
1542   VEX_W_383A_P_2,
1543   VEX_W_383B_P_2,
1544   VEX_W_383C_P_2,
1545   VEX_W_383D_P_2,
1546   VEX_W_383E_P_2,
1547   VEX_W_383F_P_2,
1548   VEX_W_3840_P_2,
1549   VEX_W_3841_P_2,
1550   VEX_W_38DB_P_2,
1551   VEX_W_38DC_P_2,
1552   VEX_W_38DD_P_2,
1553   VEX_W_38DE_P_2,
1554   VEX_W_38DF_P_2,
1555   VEX_W_3A04_P_2,
1556   VEX_W_3A05_P_2,
1557   VEX_W_3A06_P_2,
1558   VEX_W_3A08_P_2,
1559   VEX_W_3A09_P_2,
1560   VEX_W_3A0A_P_2,
1561   VEX_W_3A0B_P_2,
1562   VEX_W_3A0C_P_2,
1563   VEX_W_3A0D_P_2,
1564   VEX_W_3A0E_P_2,
1565   VEX_W_3A0F_P_2,
1566   VEX_W_3A14_P_2,
1567   VEX_W_3A15_P_2,
1568   VEX_W_3A18_P_2,
1569   VEX_W_3A19_P_2,
1570   VEX_W_3A20_P_2,
1571   VEX_W_3A21_P_2,
1572   VEX_W_3A40_P_2,
1573   VEX_W_3A41_P_2,
1574   VEX_W_3A42_P_2,
1575   VEX_W_3A44_P_2,
1576   VEX_W_3A48_P_2,
1577   VEX_W_3A49_P_2,
1578   VEX_W_3A4A_P_2,
1579   VEX_W_3A4B_P_2,
1580   VEX_W_3A4C_P_2,
1581   VEX_W_3A60_P_2,
1582   VEX_W_3A61_P_2,
1583   VEX_W_3A62_P_2,
1584   VEX_W_3A63_P_2,
1585   VEX_W_3ADF_P_2
1586 };
1587
1588 typedef void (*op_rtn) (int bytemode, int sizeflag);
1589
1590 struct dis386 {
1591   const char *name;
1592   struct
1593     {
1594       op_rtn rtn;
1595       int bytemode;
1596     } op[MAX_OPERANDS];
1597 };
1598
1599 /* Upper case letters in the instruction names here are macros.
1600    'A' => print 'b' if no register operands or suffix_always is true
1601    'B' => print 'b' if suffix_always is true
1602    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1603           size prefix
1604    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1605           suffix_always is true
1606    'E' => print 'e' if 32-bit form of jcxz
1607    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1608    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1609    'H' => print ",pt" or ",pn" branch hint
1610    'I' => honor following macro letter even in Intel mode (implemented only
1611           for some of the macro letters)
1612    'J' => print 'l'
1613    'K' => print 'd' or 'q' if rex prefix is present.
1614    'L' => print 'l' if suffix_always is true
1615    'M' => print 'r' if intel_mnemonic is false.
1616    'N' => print 'n' if instruction has no wait "prefix"
1617    'O' => print 'd' or 'o' (or 'q' in Intel mode)
1618    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
1619           or suffix_always is true.  print 'q' if rex prefix is present.
1620    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1621           is true
1622    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1623    'S' => print 'w', 'l' or 'q' if suffix_always is true
1624    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
1625    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
1626    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
1627    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1628    'X' => print 's', 'd' depending on data16 prefix (for XMM)
1629    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
1630           suffix_always is true.
1631    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
1632    '!' => change condition from true to false or from false to true.
1633    '%' => add 1 upper case letter to the macro.
1634
1635    2 upper case letter macros:
1636    "XY" => print 'x' or 'y' if no register operands or suffix_always
1637            is true.
1638    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1639    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
1640            or suffix_always is true
1641    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1642    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1643    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1644
1645    Many of the above letters print nothing in Intel mode.  See "putop"
1646    for the details.
1647
1648    Braces '{' and '}', and vertical bars '|', indicate alternative
1649    mnemonic strings for AT&T and Intel.  */
1650
1651 static const struct dis386 dis386[] = {
1652   /* 00 */
1653   { "addB",             { Eb, Gb } },
1654   { "addS",             { Ev, Gv } },
1655   { "addB",             { Gb, EbS } },
1656   { "addS",             { Gv, EvS } },
1657   { "addB",             { AL, Ib } },
1658   { "addS",             { eAX, Iv } },
1659   { X86_64_TABLE (X86_64_06) },
1660   { X86_64_TABLE (X86_64_07) },
1661   /* 08 */
1662   { "orB",              { Eb, Gb } },
1663   { "orS",              { Ev, Gv } },
1664   { "orB",              { Gb, EbS } },
1665   { "orS",              { Gv, EvS } },
1666   { "orB",              { AL, Ib } },
1667   { "orS",              { eAX, Iv } },
1668   { X86_64_TABLE (X86_64_0D) },
1669   { Bad_Opcode },       /* 0x0f extended opcode escape */
1670   /* 10 */
1671   { "adcB",             { Eb, Gb } },
1672   { "adcS",             { Ev, Gv } },
1673   { "adcB",             { Gb, EbS } },
1674   { "adcS",             { Gv, EvS } },
1675   { "adcB",             { AL, Ib } },
1676   { "adcS",             { eAX, Iv } },
1677   { X86_64_TABLE (X86_64_16) },
1678   { X86_64_TABLE (X86_64_17) },
1679   /* 18 */
1680   { "sbbB",             { Eb, Gb } },
1681   { "sbbS",             { Ev, Gv } },
1682   { "sbbB",             { Gb, EbS } },
1683   { "sbbS",             { Gv, EvS } },
1684   { "sbbB",             { AL, Ib } },
1685   { "sbbS",             { eAX, Iv } },
1686   { X86_64_TABLE (X86_64_1E) },
1687   { X86_64_TABLE (X86_64_1F) },
1688   /* 20 */
1689   { "andB",             { Eb, Gb } },
1690   { "andS",             { Ev, Gv } },
1691   { "andB",             { Gb, EbS } },
1692   { "andS",             { Gv, EvS } },
1693   { "andB",             { AL, Ib } },
1694   { "andS",             { eAX, Iv } },
1695   { Bad_Opcode },       /* SEG ES prefix */
1696   { X86_64_TABLE (X86_64_27) },
1697   /* 28 */
1698   { "subB",             { Eb, Gb } },
1699   { "subS",             { Ev, Gv } },
1700   { "subB",             { Gb, EbS } },
1701   { "subS",             { Gv, EvS } },
1702   { "subB",             { AL, Ib } },
1703   { "subS",             { eAX, Iv } },
1704   { Bad_Opcode },       /* SEG CS prefix */
1705   { X86_64_TABLE (X86_64_2F) },
1706   /* 30 */
1707   { "xorB",             { Eb, Gb } },
1708   { "xorS",             { Ev, Gv } },
1709   { "xorB",             { Gb, EbS } },
1710   { "xorS",             { Gv, EvS } },
1711   { "xorB",             { AL, Ib } },
1712   { "xorS",             { eAX, Iv } },
1713   { Bad_Opcode },       /* SEG SS prefix */
1714   { X86_64_TABLE (X86_64_37) },
1715   /* 38 */
1716   { "cmpB",             { Eb, Gb } },
1717   { "cmpS",             { Ev, Gv } },
1718   { "cmpB",             { Gb, EbS } },
1719   { "cmpS",             { Gv, EvS } },
1720   { "cmpB",             { AL, Ib } },
1721   { "cmpS",             { eAX, Iv } },
1722   { Bad_Opcode },       /* SEG DS prefix */
1723   { X86_64_TABLE (X86_64_3F) },
1724   /* 40 */
1725   { "inc{S|}",          { RMeAX } },
1726   { "inc{S|}",          { RMeCX } },
1727   { "inc{S|}",          { RMeDX } },
1728   { "inc{S|}",          { RMeBX } },
1729   { "inc{S|}",          { RMeSP } },
1730   { "inc{S|}",          { RMeBP } },
1731   { "inc{S|}",          { RMeSI } },
1732   { "inc{S|}",          { RMeDI } },
1733   /* 48 */
1734   { "dec{S|}",          { RMeAX } },
1735   { "dec{S|}",          { RMeCX } },
1736   { "dec{S|}",          { RMeDX } },
1737   { "dec{S|}",          { RMeBX } },
1738   { "dec{S|}",          { RMeSP } },
1739   { "dec{S|}",          { RMeBP } },
1740   { "dec{S|}",          { RMeSI } },
1741   { "dec{S|}",          { RMeDI } },
1742   /* 50 */
1743   { "pushV",            { RMrAX } },
1744   { "pushV",            { RMrCX } },
1745   { "pushV",            { RMrDX } },
1746   { "pushV",            { RMrBX } },
1747   { "pushV",            { RMrSP } },
1748   { "pushV",            { RMrBP } },
1749   { "pushV",            { RMrSI } },
1750   { "pushV",            { RMrDI } },
1751   /* 58 */
1752   { "popV",             { RMrAX } },
1753   { "popV",             { RMrCX } },
1754   { "popV",             { RMrDX } },
1755   { "popV",             { RMrBX } },
1756   { "popV",             { RMrSP } },
1757   { "popV",             { RMrBP } },
1758   { "popV",             { RMrSI } },
1759   { "popV",             { RMrDI } },
1760   /* 60 */
1761   { X86_64_TABLE (X86_64_60) },
1762   { X86_64_TABLE (X86_64_61) },
1763   { X86_64_TABLE (X86_64_62) },
1764   { X86_64_TABLE (X86_64_63) },
1765   { Bad_Opcode },       /* seg fs */
1766   { Bad_Opcode },       /* seg gs */
1767   { Bad_Opcode },       /* op size prefix */
1768   { Bad_Opcode },       /* adr size prefix */
1769   /* 68 */
1770   { "pushT",            { Iq } },
1771   { "imulS",            { Gv, Ev, Iv } },
1772   { "pushT",            { sIb } },
1773   { "imulS",            { Gv, Ev, sIb } },
1774   { "ins{b|}",          { Ybr, indirDX } },
1775   { X86_64_TABLE (X86_64_6D) },
1776   { "outs{b|}",         { indirDXr, Xb } },
1777   { X86_64_TABLE (X86_64_6F) },
1778   /* 70 */
1779   { "joH",              { Jb, XX, cond_jump_flag } },
1780   { "jnoH",             { Jb, XX, cond_jump_flag } },
1781   { "jbH",              { Jb, XX, cond_jump_flag } },
1782   { "jaeH",             { Jb, XX, cond_jump_flag } },
1783   { "jeH",              { Jb, XX, cond_jump_flag } },
1784   { "jneH",             { Jb, XX, cond_jump_flag } },
1785   { "jbeH",             { Jb, XX, cond_jump_flag } },
1786   { "jaH",              { Jb, XX, cond_jump_flag } },
1787   /* 78 */
1788   { "jsH",              { Jb, XX, cond_jump_flag } },
1789   { "jnsH",             { Jb, XX, cond_jump_flag } },
1790   { "jpH",              { Jb, XX, cond_jump_flag } },
1791   { "jnpH",             { Jb, XX, cond_jump_flag } },
1792   { "jlH",              { Jb, XX, cond_jump_flag } },
1793   { "jgeH",             { Jb, XX, cond_jump_flag } },
1794   { "jleH",             { Jb, XX, cond_jump_flag } },
1795   { "jgH",              { Jb, XX, cond_jump_flag } },
1796   /* 80 */
1797   { REG_TABLE (REG_80) },
1798   { REG_TABLE (REG_81) },
1799   { Bad_Opcode },
1800   { REG_TABLE (REG_82) },
1801   { "testB",            { Eb, Gb } },
1802   { "testS",            { Ev, Gv } },
1803   { "xchgB",            { Eb, Gb } },
1804   { "xchgS",            { Ev, Gv } },
1805   /* 88 */
1806   { "movB",             { Eb, Gb } },
1807   { "movS",             { Ev, Gv } },
1808   { "movB",             { Gb, EbS } },
1809   { "movS",             { Gv, EvS } },
1810   { "movD",             { Sv, Sw } },
1811   { MOD_TABLE (MOD_8D) },
1812   { "movD",             { Sw, Sv } },
1813   { REG_TABLE (REG_8F) },
1814   /* 90 */
1815   { PREFIX_TABLE (PREFIX_90) },
1816   { "xchgS",            { RMeCX, eAX } },
1817   { "xchgS",            { RMeDX, eAX } },
1818   { "xchgS",            { RMeBX, eAX } },
1819   { "xchgS",            { RMeSP, eAX } },
1820   { "xchgS",            { RMeBP, eAX } },
1821   { "xchgS",            { RMeSI, eAX } },
1822   { "xchgS",            { RMeDI, eAX } },
1823   /* 98 */
1824   { "cW{t|}R",          { XX } },
1825   { "cR{t|}O",          { XX } },
1826   { X86_64_TABLE (X86_64_9A) },
1827   { Bad_Opcode },       /* fwait */
1828   { "pushfT",           { XX } },
1829   { "popfT",            { XX } },
1830   { "sahf",             { XX } },
1831   { "lahf",             { XX } },
1832   /* a0 */
1833   { "mov%LB",           { AL, Ob } },
1834   { "mov%LS",           { eAX, Ov } },
1835   { "mov%LB",           { Ob, AL } },
1836   { "mov%LS",           { Ov, eAX } },
1837   { "movs{b|}",         { Ybr, Xb } },
1838   { "movs{R|}",         { Yvr, Xv } },
1839   { "cmps{b|}",         { Xb, Yb } },
1840   { "cmps{R|}",         { Xv, Yv } },
1841   /* a8 */
1842   { "testB",            { AL, Ib } },
1843   { "testS",            { eAX, Iv } },
1844   { "stosB",            { Ybr, AL } },
1845   { "stosS",            { Yvr, eAX } },
1846   { "lodsB",            { ALr, Xb } },
1847   { "lodsS",            { eAXr, Xv } },
1848   { "scasB",            { AL, Yb } },
1849   { "scasS",            { eAX, Yv } },
1850   /* b0 */
1851   { "movB",             { RMAL, Ib } },
1852   { "movB",             { RMCL, Ib } },
1853   { "movB",             { RMDL, Ib } },
1854   { "movB",             { RMBL, Ib } },
1855   { "movB",             { RMAH, Ib } },
1856   { "movB",             { RMCH, Ib } },
1857   { "movB",             { RMDH, Ib } },
1858   { "movB",             { RMBH, Ib } },
1859   /* b8 */
1860   { "mov%LV",           { RMeAX, Iv64 } },
1861   { "mov%LV",           { RMeCX, Iv64 } },
1862   { "mov%LV",           { RMeDX, Iv64 } },
1863   { "mov%LV",           { RMeBX, Iv64 } },
1864   { "mov%LV",           { RMeSP, Iv64 } },
1865   { "mov%LV",           { RMeBP, Iv64 } },
1866   { "mov%LV",           { RMeSI, Iv64 } },
1867   { "mov%LV",           { RMeDI, Iv64 } },
1868   /* c0 */
1869   { REG_TABLE (REG_C0) },
1870   { REG_TABLE (REG_C1) },
1871   { "retT",             { Iw } },
1872   { "retT",             { XX } },
1873   { X86_64_TABLE (X86_64_C4) },
1874   { X86_64_TABLE (X86_64_C5) },
1875   { REG_TABLE (REG_C6) },
1876   { REG_TABLE (REG_C7) },
1877   /* c8 */
1878   { "enterT",           { Iw, Ib } },
1879   { "leaveT",           { XX } },
1880   { "Jret{|f}P",        { Iw } },
1881   { "Jret{|f}P",        { XX } },
1882   { "int3",             { XX } },
1883   { "int",              { Ib } },
1884   { X86_64_TABLE (X86_64_CE) },
1885   { "iretP",            { XX } },
1886   /* d0 */
1887   { REG_TABLE (REG_D0) },
1888   { REG_TABLE (REG_D1) },
1889   { REG_TABLE (REG_D2) },
1890   { REG_TABLE (REG_D3) },
1891   { X86_64_TABLE (X86_64_D4) },
1892   { X86_64_TABLE (X86_64_D5) },
1893   { Bad_Opcode },
1894   { "xlat",             { DSBX } },
1895   /* d8 */
1896   { FLOAT },
1897   { FLOAT },
1898   { FLOAT },
1899   { FLOAT },
1900   { FLOAT },
1901   { FLOAT },
1902   { FLOAT },
1903   { FLOAT },
1904   /* e0 */
1905   { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
1906   { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
1907   { "loopFH",           { Jb, XX, loop_jcxz_flag } },
1908   { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
1909   { "inB",              { AL, Ib } },
1910   { "inG",              { zAX, Ib } },
1911   { "outB",             { Ib, AL } },
1912   { "outG",             { Ib, zAX } },
1913   /* e8 */
1914   { "callT",            { Jv } },
1915   { "jmpT",             { Jv } },
1916   { X86_64_TABLE (X86_64_EA) },
1917   { "jmp",              { Jb } },
1918   { "inB",              { AL, indirDX } },
1919   { "inG",              { zAX, indirDX } },
1920   { "outB",             { indirDX, AL } },
1921   { "outG",             { indirDX, zAX } },
1922   /* f0 */
1923   { Bad_Opcode },       /* lock prefix */
1924   { "icebp",            { XX } },
1925   { Bad_Opcode },       /* repne */
1926   { Bad_Opcode },       /* repz */
1927   { "hlt",              { XX } },
1928   { "cmc",              { XX } },
1929   { REG_TABLE (REG_F6) },
1930   { REG_TABLE (REG_F7) },
1931   /* f8 */
1932   { "clc",              { XX } },
1933   { "stc",              { XX } },
1934   { "cli",              { XX } },
1935   { "sti",              { XX } },
1936   { "cld",              { XX } },
1937   { "std",              { XX } },
1938   { REG_TABLE (REG_FE) },
1939   { REG_TABLE (REG_FF) },
1940 };
1941
1942 static const struct dis386 dis386_twobyte[] = {
1943   /* 00 */
1944   { REG_TABLE (REG_0F00 ) },
1945   { REG_TABLE (REG_0F01 ) },
1946   { "larS",             { Gv, Ew } },
1947   { "lslS",             { Gv, Ew } },
1948   { Bad_Opcode },
1949   { "syscall",          { XX } },
1950   { "clts",             { XX } },
1951   { "sysretP",          { XX } },
1952   /* 08 */
1953   { "invd",             { XX } },
1954   { "wbinvd",           { XX } },
1955   { Bad_Opcode },
1956   { "ud2a",             { XX } },
1957   { Bad_Opcode },
1958   { REG_TABLE (REG_0F0D) },
1959   { "femms",            { XX } },
1960   { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
1961   /* 10 */
1962   { PREFIX_TABLE (PREFIX_0F10) },
1963   { PREFIX_TABLE (PREFIX_0F11) },
1964   { PREFIX_TABLE (PREFIX_0F12) },
1965   { MOD_TABLE (MOD_0F13) },
1966   { "unpcklpX",         { XM, EXx } },
1967   { "unpckhpX",         { XM, EXx } },
1968   { PREFIX_TABLE (PREFIX_0F16) },
1969   { MOD_TABLE (MOD_0F17) },
1970   /* 18 */
1971   { REG_TABLE (REG_0F18) },
1972   { "nopQ",             { Ev } },
1973   { "nopQ",             { Ev } },
1974   { "nopQ",             { Ev } },
1975   { "nopQ",             { Ev } },
1976   { "nopQ",             { Ev } },
1977   { "nopQ",             { Ev } },
1978   { "nopQ",             { Ev } },
1979   /* 20 */
1980   { MOD_TABLE (MOD_0F20) },
1981   { MOD_TABLE (MOD_0F21) },
1982   { MOD_TABLE (MOD_0F22) },
1983   { MOD_TABLE (MOD_0F23) },
1984   { MOD_TABLE (MOD_0F24) },
1985   { Bad_Opcode },
1986   { MOD_TABLE (MOD_0F26) },
1987   { Bad_Opcode },
1988   /* 28 */
1989   { "movapX",           { XM, EXx } },
1990   { "movapX",           { EXxS, XM } },
1991   { PREFIX_TABLE (PREFIX_0F2A) },
1992   { PREFIX_TABLE (PREFIX_0F2B) },
1993   { PREFIX_TABLE (PREFIX_0F2C) },
1994   { PREFIX_TABLE (PREFIX_0F2D) },
1995   { PREFIX_TABLE (PREFIX_0F2E) },
1996   { PREFIX_TABLE (PREFIX_0F2F) },
1997   /* 30 */
1998   { "wrmsr",            { XX } },
1999   { "rdtsc",            { XX } },
2000   { "rdmsr",            { XX } },
2001   { "rdpmc",            { XX } },
2002   { "sysenter",         { XX } },
2003   { "sysexit",          { XX } },
2004   { Bad_Opcode },
2005   { "getsec",           { XX } },
2006   /* 38 */
2007   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2008   { Bad_Opcode },
2009   { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2010   { Bad_Opcode },
2011   { Bad_Opcode },
2012   { Bad_Opcode },
2013   { Bad_Opcode },
2014   { Bad_Opcode },
2015   /* 40 */
2016   { "cmovoS",           { Gv, Ev } },
2017   { "cmovnoS",          { Gv, Ev } },
2018   { "cmovbS",           { Gv, Ev } },
2019   { "cmovaeS",          { Gv, Ev } },
2020   { "cmoveS",           { Gv, Ev } },
2021   { "cmovneS",          { Gv, Ev } },
2022   { "cmovbeS",          { Gv, Ev } },
2023   { "cmovaS",           { Gv, Ev } },
2024   /* 48 */
2025   { "cmovsS",           { Gv, Ev } },
2026   { "cmovnsS",          { Gv, Ev } },
2027   { "cmovpS",           { Gv, Ev } },
2028   { "cmovnpS",          { Gv, Ev } },
2029   { "cmovlS",           { Gv, Ev } },
2030   { "cmovgeS",          { Gv, Ev } },
2031   { "cmovleS",          { Gv, Ev } },
2032   { "cmovgS",           { Gv, Ev } },
2033   /* 50 */
2034   { MOD_TABLE (MOD_0F51) },
2035   { PREFIX_TABLE (PREFIX_0F51) },
2036   { PREFIX_TABLE (PREFIX_0F52) },
2037   { PREFIX_TABLE (PREFIX_0F53) },
2038   { "andpX",            { XM, EXx } },
2039   { "andnpX",           { XM, EXx } },
2040   { "orpX",             { XM, EXx } },
2041   { "xorpX",            { XM, EXx } },
2042   /* 58 */
2043   { PREFIX_TABLE (PREFIX_0F58) },
2044   { PREFIX_TABLE (PREFIX_0F59) },
2045   { PREFIX_TABLE (PREFIX_0F5A) },
2046   { PREFIX_TABLE (PREFIX_0F5B) },
2047   { PREFIX_TABLE (PREFIX_0F5C) },
2048   { PREFIX_TABLE (PREFIX_0F5D) },
2049   { PREFIX_TABLE (PREFIX_0F5E) },
2050   { PREFIX_TABLE (PREFIX_0F5F) },
2051   /* 60 */
2052   { PREFIX_TABLE (PREFIX_0F60) },
2053   { PREFIX_TABLE (PREFIX_0F61) },
2054   { PREFIX_TABLE (PREFIX_0F62) },
2055   { "packsswb",         { MX, EM } },
2056   { "pcmpgtb",          { MX, EM } },
2057   { "pcmpgtw",          { MX, EM } },
2058   { "pcmpgtd",          { MX, EM } },
2059   { "packuswb",         { MX, EM } },
2060   /* 68 */
2061   { "punpckhbw",        { MX, EM } },
2062   { "punpckhwd",        { MX, EM } },
2063   { "punpckhdq",        { MX, EM } },
2064   { "packssdw",         { MX, EM } },
2065   { PREFIX_TABLE (PREFIX_0F6C) },
2066   { PREFIX_TABLE (PREFIX_0F6D) },
2067   { "movK",             { MX, Edq } },
2068   { PREFIX_TABLE (PREFIX_0F6F) },
2069   /* 70 */
2070   { PREFIX_TABLE (PREFIX_0F70) },
2071   { REG_TABLE (REG_0F71) },
2072   { REG_TABLE (REG_0F72) },
2073   { REG_TABLE (REG_0F73) },
2074   { "pcmpeqb",          { MX, EM } },
2075   { "pcmpeqw",          { MX, EM } },
2076   { "pcmpeqd",          { MX, EM } },
2077   { "emms",             { XX } },
2078   /* 78 */
2079   { PREFIX_TABLE (PREFIX_0F78) },
2080   { PREFIX_TABLE (PREFIX_0F79) },
2081   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2082   { Bad_Opcode },
2083   { PREFIX_TABLE (PREFIX_0F7C) },
2084   { PREFIX_TABLE (PREFIX_0F7D) },
2085   { PREFIX_TABLE (PREFIX_0F7E) },
2086   { PREFIX_TABLE (PREFIX_0F7F) },
2087   /* 80 */
2088   { "joH",              { Jv, XX, cond_jump_flag } },
2089   { "jnoH",             { Jv, XX, cond_jump_flag } },
2090   { "jbH",              { Jv, XX, cond_jump_flag } },
2091   { "jaeH",             { Jv, XX, cond_jump_flag } },
2092   { "jeH",              { Jv, XX, cond_jump_flag } },
2093   { "jneH",             { Jv, XX, cond_jump_flag } },
2094   { "jbeH",             { Jv, XX, cond_jump_flag } },
2095   { "jaH",              { Jv, XX, cond_jump_flag } },
2096   /* 88 */
2097   { "jsH",              { Jv, XX, cond_jump_flag } },
2098   { "jnsH",             { Jv, XX, cond_jump_flag } },
2099   { "jpH",              { Jv, XX, cond_jump_flag } },
2100   { "jnpH",             { Jv, XX, cond_jump_flag } },
2101   { "jlH",              { Jv, XX, cond_jump_flag } },
2102   { "jgeH",             { Jv, XX, cond_jump_flag } },
2103   { "jleH",             { Jv, XX, cond_jump_flag } },
2104   { "jgH",              { Jv, XX, cond_jump_flag } },
2105   /* 90 */
2106   { "seto",             { Eb } },
2107   { "setno",            { Eb } },
2108   { "setb",             { Eb } },
2109   { "setae",            { Eb } },
2110   { "sete",             { Eb } },
2111   { "setne",            { Eb } },
2112   { "setbe",            { Eb } },
2113   { "seta",             { Eb } },
2114   /* 98 */
2115   { "sets",             { Eb } },
2116   { "setns",            { Eb } },
2117   { "setp",             { Eb } },
2118   { "setnp",            { Eb } },
2119   { "setl",             { Eb } },
2120   { "setge",            { Eb } },
2121   { "setle",            { Eb } },
2122   { "setg",             { Eb } },
2123   /* a0 */
2124   { "pushT",            { fs } },
2125   { "popT",             { fs } },
2126   { "cpuid",            { XX } },
2127   { "btS",              { Ev, Gv } },
2128   { "shldS",            { Ev, Gv, Ib } },
2129   { "shldS",            { Ev, Gv, CL } },
2130   { REG_TABLE (REG_0FA6) },
2131   { REG_TABLE (REG_0FA7) },
2132   /* a8 */
2133   { "pushT",            { gs } },
2134   { "popT",             { gs } },
2135   { "rsm",              { XX } },
2136   { "btsS",             { Ev, Gv } },
2137   { "shrdS",            { Ev, Gv, Ib } },
2138   { "shrdS",            { Ev, Gv, CL } },
2139   { REG_TABLE (REG_0FAE) },
2140   { "imulS",            { Gv, Ev } },
2141   /* b0 */
2142   { "cmpxchgB",         { Eb, Gb } },
2143   { "cmpxchgS",         { Ev, Gv } },
2144   { MOD_TABLE (MOD_0FB2) },
2145   { "btrS",             { Ev, Gv } },
2146   { MOD_TABLE (MOD_0FB4) },
2147   { MOD_TABLE (MOD_0FB5) },
2148   { "movz{bR|x}",       { Gv, Eb } },
2149   { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
2150   /* b8 */
2151   { PREFIX_TABLE (PREFIX_0FB8) },
2152   { "ud2b",             { XX } },
2153   { REG_TABLE (REG_0FBA) },
2154   { "btcS",             { Ev, Gv } },
2155   { "bsfS",             { Gv, Ev } },
2156   { PREFIX_TABLE (PREFIX_0FBD) },
2157   { "movs{bR|x}",       { Gv, Eb } },
2158   { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
2159   /* c0 */
2160   { "xaddB",            { Eb, Gb } },
2161   { "xaddS",            { Ev, Gv } },
2162   { PREFIX_TABLE (PREFIX_0FC2) },
2163   { PREFIX_TABLE (PREFIX_0FC3) },
2164   { "pinsrw",           { MX, Edqw, Ib } },
2165   { "pextrw",           { Gdq, MS, Ib } },
2166   { "shufpX",           { XM, EXx, Ib } },
2167   { REG_TABLE (REG_0FC7) },
2168   /* c8 */
2169   { "bswap",            { RMeAX } },
2170   { "bswap",            { RMeCX } },
2171   { "bswap",            { RMeDX } },
2172   { "bswap",            { RMeBX } },
2173   { "bswap",            { RMeSP } },
2174   { "bswap",            { RMeBP } },
2175   { "bswap",            { RMeSI } },
2176   { "bswap",            { RMeDI } },
2177   /* d0 */
2178   { PREFIX_TABLE (PREFIX_0FD0) },
2179   { "psrlw",            { MX, EM } },
2180   { "psrld",            { MX, EM } },
2181   { "psrlq",            { MX, EM } },
2182   { "paddq",            { MX, EM } },
2183   { "pmullw",           { MX, EM } },
2184   { PREFIX_TABLE (PREFIX_0FD6) },
2185   { MOD_TABLE (MOD_0FD7) },
2186   /* d8 */
2187   { "psubusb",          { MX, EM } },
2188   { "psubusw",          { MX, EM } },
2189   { "pminub",           { MX, EM } },
2190   { "pand",             { MX, EM } },
2191   { "paddusb",          { MX, EM } },
2192   { "paddusw",          { MX, EM } },
2193   { "pmaxub",           { MX, EM } },
2194   { "pandn",            { MX, EM } },
2195   /* e0 */
2196   { "pavgb",            { MX, EM } },
2197   { "psraw",            { MX, EM } },
2198   { "psrad",            { MX, EM } },
2199   { "pavgw",            { MX, EM } },
2200   { "pmulhuw",          { MX, EM } },
2201   { "pmulhw",           { MX, EM } },
2202   { PREFIX_TABLE (PREFIX_0FE6) },
2203   { PREFIX_TABLE (PREFIX_0FE7) },
2204   /* e8 */
2205   { "psubsb",           { MX, EM } },
2206   { "psubsw",           { MX, EM } },
2207   { "pminsw",           { MX, EM } },
2208   { "por",              { MX, EM } },
2209   { "paddsb",           { MX, EM } },
2210   { "paddsw",           { MX, EM } },
2211   { "pmaxsw",           { MX, EM } },
2212   { "pxor",             { MX, EM } },
2213   /* f0 */
2214   { PREFIX_TABLE (PREFIX_0FF0) },
2215   { "psllw",            { MX, EM } },
2216   { "pslld",            { MX, EM } },
2217   { "psllq",            { MX, EM } },
2218   { "pmuludq",          { MX, EM } },
2219   { "pmaddwd",          { MX, EM } },
2220   { "psadbw",           { MX, EM } },
2221   { PREFIX_TABLE (PREFIX_0FF7) },
2222   /* f8 */
2223   { "psubb",            { MX, EM } },
2224   { "psubw",            { MX, EM } },
2225   { "psubd",            { MX, EM } },
2226   { "psubq",            { MX, EM } },
2227   { "paddb",            { MX, EM } },
2228   { "paddw",            { MX, EM } },
2229   { "paddd",            { MX, EM } },
2230   { Bad_Opcode },
2231 };
2232
2233 static const unsigned char onebyte_has_modrm[256] = {
2234   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2235   /*       -------------------------------        */
2236   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2237   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2238   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2239   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2240   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2241   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2242   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2243   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2244   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2245   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2246   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2247   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2248   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2249   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2250   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2251   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2252   /*       -------------------------------        */
2253   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2254 };
2255
2256 static const unsigned char twobyte_has_modrm[256] = {
2257   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2258   /*       -------------------------------        */
2259   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2260   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2261   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2262   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2263   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2264   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2265   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2266   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2267   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2268   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2269   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2270   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2271   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2272   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2273   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2274   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
2275   /*       -------------------------------        */
2276   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2277 };
2278
2279 static char obuf[100];
2280 static char *obufp;
2281 static char *mnemonicendp;
2282 static char scratchbuf[100];
2283 static unsigned char *start_codep;
2284 static unsigned char *insn_codep;
2285 static unsigned char *codep;
2286 static int last_lock_prefix;
2287 static int last_repz_prefix;
2288 static int last_repnz_prefix;
2289 static int last_data_prefix;
2290 static int last_addr_prefix;
2291 static int last_rex_prefix;
2292 static int last_seg_prefix;
2293 #define MAX_CODE_LENGTH 15
2294 /* We can up to 14 prefixes since the maximum instruction length is
2295    15bytes.  */
2296 static int all_prefixes[MAX_CODE_LENGTH - 1];
2297 static disassemble_info *the_info;
2298 static struct
2299   {
2300     int mod;
2301     int reg;
2302     int rm;
2303   }
2304 modrm;
2305 static unsigned char need_modrm;
2306 static struct
2307   {
2308     int register_specifier;
2309     int length;
2310     int prefix;
2311     int w;
2312   }
2313 vex;
2314 static unsigned char need_vex;
2315 static unsigned char need_vex_reg;
2316 static unsigned char vex_w_done;
2317
2318 struct op
2319   {
2320     const char *name;
2321     unsigned int len;
2322   };
2323
2324 /* If we are accessing mod/rm/reg without need_modrm set, then the
2325    values are stale.  Hitting this abort likely indicates that you
2326    need to update onebyte_has_modrm or twobyte_has_modrm.  */
2327 #define MODRM_CHECK  if (!need_modrm) abort ()
2328
2329 static const char **names64;
2330 static const char **names32;
2331 static const char **names16;
2332 static const char **names8;
2333 static const char **names8rex;
2334 static const char **names_seg;
2335 static const char *index64;
2336 static const char *index32;
2337 static const char **index16;
2338
2339 static const char *intel_names64[] = {
2340   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2341   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2342 };
2343 static const char *intel_names32[] = {
2344   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2345   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2346 };
2347 static const char *intel_names16[] = {
2348   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2349   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2350 };
2351 static const char *intel_names8[] = {
2352   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2353 };
2354 static const char *intel_names8rex[] = {
2355   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2356   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2357 };
2358 static const char *intel_names_seg[] = {
2359   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2360 };
2361 static const char *intel_index64 = "riz";
2362 static const char *intel_index32 = "eiz";
2363 static const char *intel_index16[] = {
2364   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2365 };
2366
2367 static const char *att_names64[] = {
2368   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2369   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2370 };
2371 static const char *att_names32[] = {
2372   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2373   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2374 };
2375 static const char *att_names16[] = {
2376   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2377   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2378 };
2379 static const char *att_names8[] = {
2380   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2381 };
2382 static const char *att_names8rex[] = {
2383   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2384   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2385 };
2386 static const char *att_names_seg[] = {
2387   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2388 };
2389 static const char *att_index64 = "%riz";
2390 static const char *att_index32 = "%eiz";
2391 static const char *att_index16[] = {
2392   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2393 };
2394
2395 static const char **names_mm;
2396 static const char *intel_names_mm[] = {
2397   "mm0", "mm1", "mm2", "mm3",
2398   "mm4", "mm5", "mm6", "mm7"
2399 };
2400 static const char *att_names_mm[] = {
2401   "%mm0", "%mm1", "%mm2", "%mm3",
2402   "%mm4", "%mm5", "%mm6", "%mm7"
2403 };
2404
2405 static const char **names_xmm;
2406 static const char *intel_names_xmm[] = {
2407   "xmm0", "xmm1", "xmm2", "xmm3",
2408   "xmm4", "xmm5", "xmm6", "xmm7",
2409   "xmm8", "xmm9", "xmm10", "xmm11",
2410   "xmm12", "xmm13", "xmm14", "xmm15"
2411 };
2412 static const char *att_names_xmm[] = {
2413   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2414   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2415   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2416   "%xmm12", "%xmm13", "%xmm14", "%xmm15"
2417 };
2418
2419 static const char **names_ymm;
2420 static const char *intel_names_ymm[] = {
2421   "ymm0", "ymm1", "ymm2", "ymm3",
2422   "ymm4", "ymm5", "ymm6", "ymm7",
2423   "ymm8", "ymm9", "ymm10", "ymm11",
2424   "ymm12", "ymm13", "ymm14", "ymm15"
2425 };
2426 static const char *att_names_ymm[] = {
2427   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2428   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2429   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2430   "%ymm12", "%ymm13", "%ymm14", "%ymm15"
2431 };
2432
2433 static const struct dis386 reg_table[][8] = {
2434   /* REG_80 */
2435   {
2436     { "addA",   { Eb, Ib } },
2437     { "orA",    { Eb, Ib } },
2438     { "adcA",   { Eb, Ib } },
2439     { "sbbA",   { Eb, Ib } },
2440     { "andA",   { Eb, Ib } },
2441     { "subA",   { Eb, Ib } },
2442     { "xorA",   { Eb, Ib } },
2443     { "cmpA",   { Eb, Ib } },
2444   },
2445   /* REG_81 */
2446   {
2447     { "addQ",   { Ev, Iv } },
2448     { "orQ",    { Ev, Iv } },
2449     { "adcQ",   { Ev, Iv } },
2450     { "sbbQ",   { Ev, Iv } },
2451     { "andQ",   { Ev, Iv } },
2452     { "subQ",   { Ev, Iv } },
2453     { "xorQ",   { Ev, Iv } },
2454     { "cmpQ",   { Ev, Iv } },
2455   },
2456   /* REG_82 */
2457   {
2458     { "addQ",   { Ev, sIb } },
2459     { "orQ",    { Ev, sIb } },
2460     { "adcQ",   { Ev, sIb } },
2461     { "sbbQ",   { Ev, sIb } },
2462     { "andQ",   { Ev, sIb } },
2463     { "subQ",   { Ev, sIb } },
2464     { "xorQ",   { Ev, sIb } },
2465     { "cmpQ",   { Ev, sIb } },
2466   },
2467   /* REG_8F */
2468   {
2469     { "popU",   { stackEv } },
2470     { XOP_8F_TABLE (XOP_09) },
2471     { Bad_Opcode },
2472     { Bad_Opcode },
2473     { Bad_Opcode },
2474     { XOP_8F_TABLE (XOP_09) },
2475   },
2476   /* REG_C0 */
2477   {
2478     { "rolA",   { Eb, Ib } },
2479     { "rorA",   { Eb, Ib } },
2480     { "rclA",   { Eb, Ib } },
2481     { "rcrA",   { Eb, Ib } },
2482     { "shlA",   { Eb, Ib } },
2483     { "shrA",   { Eb, Ib } },
2484     { Bad_Opcode },
2485     { "sarA",   { Eb, Ib } },
2486   },
2487   /* REG_C1 */
2488   {
2489     { "rolQ",   { Ev, Ib } },
2490     { "rorQ",   { Ev, Ib } },
2491     { "rclQ",   { Ev, Ib } },
2492     { "rcrQ",   { Ev, Ib } },
2493     { "shlQ",   { Ev, Ib } },
2494     { "shrQ",   { Ev, Ib } },
2495     { Bad_Opcode },
2496     { "sarQ",   { Ev, Ib } },
2497   },
2498   /* REG_C6 */
2499   {
2500     { "movA",   { Eb, Ib } },
2501   },
2502   /* REG_C7 */
2503   {
2504     { "movQ",   { Ev, Iv } },
2505   },
2506   /* REG_D0 */
2507   {
2508     { "rolA",   { Eb, I1 } },
2509     { "rorA",   { Eb, I1 } },
2510     { "rclA",   { Eb, I1 } },
2511     { "rcrA",   { Eb, I1 } },
2512     { "shlA",   { Eb, I1 } },
2513     { "shrA",   { Eb, I1 } },
2514     { Bad_Opcode },
2515     { "sarA",   { Eb, I1 } },
2516   },
2517   /* REG_D1 */
2518   {
2519     { "rolQ",   { Ev, I1 } },
2520     { "rorQ",   { Ev, I1 } },
2521     { "rclQ",   { Ev, I1 } },
2522     { "rcrQ",   { Ev, I1 } },
2523     { "shlQ",   { Ev, I1 } },
2524     { "shrQ",   { Ev, I1 } },
2525     { Bad_Opcode },
2526     { "sarQ",   { Ev, I1 } },
2527   },
2528   /* REG_D2 */
2529   {
2530     { "rolA",   { Eb, CL } },
2531     { "rorA",   { Eb, CL } },
2532     { "rclA",   { Eb, CL } },
2533     { "rcrA",   { Eb, CL } },
2534     { "shlA",   { Eb, CL } },
2535     { "shrA",   { Eb, CL } },
2536     { Bad_Opcode },
2537     { "sarA",   { Eb, CL } },
2538   },
2539   /* REG_D3 */
2540   {
2541     { "rolQ",   { Ev, CL } },
2542     { "rorQ",   { Ev, CL } },
2543     { "rclQ",   { Ev, CL } },
2544     { "rcrQ",   { Ev, CL } },
2545     { "shlQ",   { Ev, CL } },
2546     { "shrQ",   { Ev, CL } },
2547     { Bad_Opcode },
2548     { "sarQ",   { Ev, CL } },
2549   },
2550   /* REG_F6 */
2551   {
2552     { "testA",  { Eb, Ib } },
2553     { Bad_Opcode },
2554     { "notA",   { Eb } },
2555     { "negA",   { Eb } },
2556     { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
2557     { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
2558     { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
2559     { "idivA",  { Eb } },       /* and idiv for consistency.               */
2560   },
2561   /* REG_F7 */
2562   {
2563     { "testQ",  { Ev, Iv } },
2564     { Bad_Opcode },
2565     { "notQ",   { Ev } },
2566     { "negQ",   { Ev } },
2567     { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
2568     { "imulQ",  { Ev } },
2569     { "divQ",   { Ev } },
2570     { "idivQ",  { Ev } },
2571   },
2572   /* REG_FE */
2573   {
2574     { "incA",   { Eb } },
2575     { "decA",   { Eb } },
2576   },
2577   /* REG_FF */
2578   {
2579     { "incQ",   { Ev } },
2580     { "decQ",   { Ev } },
2581     { "callT",  { indirEv } },
2582     { "JcallT", { indirEp } },
2583     { "jmpT",   { indirEv } },
2584     { "JjmpT",  { indirEp } },
2585     { "pushU",  { stackEv } },
2586     { Bad_Opcode },
2587   },
2588   /* REG_0F00 */
2589   {
2590     { "sldtD",  { Sv } },
2591     { "strD",   { Sv } },
2592     { "lldt",   { Ew } },
2593     { "ltr",    { Ew } },
2594     { "verr",   { Ew } },
2595     { "verw",   { Ew } },
2596     { Bad_Opcode },
2597     { Bad_Opcode },
2598   },
2599   /* REG_0F01 */
2600   {
2601     { MOD_TABLE (MOD_0F01_REG_0) },
2602     { MOD_TABLE (MOD_0F01_REG_1) },
2603     { MOD_TABLE (MOD_0F01_REG_2) },
2604     { MOD_TABLE (MOD_0F01_REG_3) },
2605     { "smswD",  { Sv } },
2606     { Bad_Opcode },
2607     { "lmsw",   { Ew } },
2608     { MOD_TABLE (MOD_0F01_REG_7) },
2609   },
2610   /* REG_0F0D */
2611   {
2612     { "prefetch",       { Eb } },
2613     { "prefetchw",      { Eb } },
2614   },
2615   /* REG_0F18 */
2616   {
2617     { MOD_TABLE (MOD_0F18_REG_0) },
2618     { MOD_TABLE (MOD_0F18_REG_1) },
2619     { MOD_TABLE (MOD_0F18_REG_2) },
2620     { MOD_TABLE (MOD_0F18_REG_3) },
2621   },
2622   /* REG_0F71 */
2623   {
2624     { Bad_Opcode },
2625     { Bad_Opcode },
2626     { MOD_TABLE (MOD_0F71_REG_2) },
2627     { Bad_Opcode },
2628     { MOD_TABLE (MOD_0F71_REG_4) },
2629     { Bad_Opcode },
2630     { MOD_TABLE (MOD_0F71_REG_6) },
2631   },
2632   /* REG_0F72 */
2633   {
2634     { Bad_Opcode },
2635     { Bad_Opcode },
2636     { MOD_TABLE (MOD_0F72_REG_2) },
2637     { Bad_Opcode },
2638     { MOD_TABLE (MOD_0F72_REG_4) },
2639     { Bad_Opcode },
2640     { MOD_TABLE (MOD_0F72_REG_6) },
2641   },
2642   /* REG_0F73 */
2643   {
2644     { Bad_Opcode },
2645     { Bad_Opcode },
2646     { MOD_TABLE (MOD_0F73_REG_2) },
2647     { MOD_TABLE (MOD_0F73_REG_3) },
2648     { Bad_Opcode },
2649     { Bad_Opcode },
2650     { MOD_TABLE (MOD_0F73_REG_6) },
2651     { MOD_TABLE (MOD_0F73_REG_7) },
2652   },
2653   /* REG_0FA6 */
2654   {
2655     { "montmul",        { { OP_0f07, 0 } } },
2656     { "xsha1",          { { OP_0f07, 0 } } },
2657     { "xsha256",        { { OP_0f07, 0 } } },
2658   },
2659   /* REG_0FA7 */
2660   {
2661     { "xstore-rng",     { { OP_0f07, 0 } } },
2662     { "xcrypt-ecb",     { { OP_0f07, 0 } } },
2663     { "xcrypt-cbc",     { { OP_0f07, 0 } } },
2664     { "xcrypt-ctr",     { { OP_0f07, 0 } } },
2665     { "xcrypt-cfb",     { { OP_0f07, 0 } } },
2666     { "xcrypt-ofb",     { { OP_0f07, 0 } } },
2667   },
2668   /* REG_0FAE */
2669   {
2670     { MOD_TABLE (MOD_0FAE_REG_0) },
2671     { MOD_TABLE (MOD_0FAE_REG_1) },
2672     { MOD_TABLE (MOD_0FAE_REG_2) },
2673     { MOD_TABLE (MOD_0FAE_REG_3) },
2674     { MOD_TABLE (MOD_0FAE_REG_4) },
2675     { MOD_TABLE (MOD_0FAE_REG_5) },
2676     { MOD_TABLE (MOD_0FAE_REG_6) },
2677     { MOD_TABLE (MOD_0FAE_REG_7) },
2678   },
2679   /* REG_0FBA */
2680   {
2681     { Bad_Opcode },
2682     { Bad_Opcode },
2683     { Bad_Opcode },
2684     { Bad_Opcode },
2685     { "btQ",    { Ev, Ib } },
2686     { "btsQ",   { Ev, Ib } },
2687     { "btrQ",   { Ev, Ib } },
2688     { "btcQ",   { Ev, Ib } },
2689   },
2690   /* REG_0FC7 */
2691   {
2692     { Bad_Opcode },
2693     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
2694     { Bad_Opcode },
2695     { Bad_Opcode },
2696     { Bad_Opcode },
2697     { Bad_Opcode },
2698     { MOD_TABLE (MOD_0FC7_REG_6) },
2699     { MOD_TABLE (MOD_0FC7_REG_7) },
2700   },
2701   /* REG_VEX_71 */
2702   {
2703     { Bad_Opcode },
2704     { Bad_Opcode },
2705     { MOD_TABLE (MOD_VEX_71_REG_2) },
2706     { Bad_Opcode },
2707     { MOD_TABLE (MOD_VEX_71_REG_4) },
2708     { Bad_Opcode },
2709     { MOD_TABLE (MOD_VEX_71_REG_6) },
2710   },
2711   /* REG_VEX_72 */
2712   {
2713     { Bad_Opcode },
2714     { Bad_Opcode },
2715     { MOD_TABLE (MOD_VEX_72_REG_2) },
2716     { Bad_Opcode },
2717     { MOD_TABLE (MOD_VEX_72_REG_4) },
2718     { Bad_Opcode },
2719     { MOD_TABLE (MOD_VEX_72_REG_6) },
2720   },
2721   /* REG_VEX_73 */
2722   {
2723     { Bad_Opcode },
2724     { Bad_Opcode },
2725     { MOD_TABLE (MOD_VEX_73_REG_2) },
2726     { MOD_TABLE (MOD_VEX_73_REG_3) },
2727     { Bad_Opcode },
2728     { Bad_Opcode },
2729     { MOD_TABLE (MOD_VEX_73_REG_6) },
2730     { MOD_TABLE (MOD_VEX_73_REG_7) },
2731   },
2732   /* REG_VEX_AE */
2733   {
2734     { Bad_Opcode },
2735     { Bad_Opcode },
2736     { MOD_TABLE (MOD_VEX_AE_REG_2) },
2737     { MOD_TABLE (MOD_VEX_AE_REG_3) },
2738   },
2739   /* REG_XOP_LWPCB */
2740   {
2741     { "llwpcb", { { OP_LWPCB_E, 0 } } },
2742     { "slwpcb", { { OP_LWPCB_E, 0 } } },
2743   },
2744   /* REG_XOP_LWP */
2745   {
2746     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq } },
2747     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq } },
2748   },
2749 };
2750
2751 static const struct dis386 prefix_table[][4] = {
2752   /* PREFIX_90 */
2753   {
2754     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2755     { "pause", { XX } },
2756     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
2757   },
2758
2759   /* PREFIX_0F10 */
2760   {
2761     { "movups", { XM, EXx } },
2762     { "movss",  { XM, EXd } },
2763     { "movupd", { XM, EXx } },
2764     { "movsd",  { XM, EXq } },
2765   },
2766
2767   /* PREFIX_0F11 */
2768   {
2769     { "movups", { EXxS, XM } },
2770     { "movss",  { EXdS, XM } },
2771     { "movupd", { EXxS, XM } },
2772     { "movsd",  { EXqS, XM } },
2773   },
2774
2775   /* PREFIX_0F12 */
2776   {
2777     { MOD_TABLE (MOD_0F12_PREFIX_0) },
2778     { "movsldup", { XM, EXx } },
2779     { "movlpd", { XM, EXq } },
2780     { "movddup", { XM, EXq } },
2781   },
2782
2783   /* PREFIX_0F16 */
2784   {
2785     { MOD_TABLE (MOD_0F16_PREFIX_0) },
2786     { "movshdup", { XM, EXx } },
2787     { "movhpd", { XM, EXq } },
2788   },
2789
2790   /* PREFIX_0F2A */
2791   {
2792     { "cvtpi2ps", { XM, EMCq } },
2793     { "cvtsi2ss%LQ", { XM, Ev } },
2794     { "cvtpi2pd", { XM, EMCq } },
2795     { "cvtsi2sd%LQ", { XM, Ev } },
2796   },
2797
2798   /* PREFIX_0F2B */
2799   {
2800     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
2801     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
2802     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
2803     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
2804   },
2805
2806   /* PREFIX_0F2C */
2807   {
2808     { "cvttps2pi", { MXC, EXq } },
2809     { "cvttss2siY", { Gv, EXd } },
2810     { "cvttpd2pi", { MXC, EXx } },
2811     { "cvttsd2siY", { Gv, EXq } },
2812   },
2813
2814   /* PREFIX_0F2D */
2815   {
2816     { "cvtps2pi", { MXC, EXq } },
2817     { "cvtss2siY", { Gv, EXd } },
2818     { "cvtpd2pi", { MXC, EXx } },
2819     { "cvtsd2siY", { Gv, EXq } },
2820   },
2821
2822   /* PREFIX_0F2E */
2823   {
2824     { "ucomiss",{ XM, EXd } }, 
2825     { Bad_Opcode },
2826     { "ucomisd",{ XM, EXq } }, 
2827   },
2828
2829   /* PREFIX_0F2F */
2830   {
2831     { "comiss", { XM, EXd } },
2832     { Bad_Opcode },
2833     { "comisd", { XM, EXq } },
2834   },
2835
2836   /* PREFIX_0F51 */
2837   {
2838     { "sqrtps", { XM, EXx } },
2839     { "sqrtss", { XM, EXd } },
2840     { "sqrtpd", { XM, EXx } },
2841     { "sqrtsd", { XM, EXq } },
2842   },
2843
2844   /* PREFIX_0F52 */
2845   {
2846     { "rsqrtps",{ XM, EXx } },
2847     { "rsqrtss",{ XM, EXd } },
2848   },
2849
2850   /* PREFIX_0F53 */
2851   {
2852     { "rcpps",  { XM, EXx } },
2853     { "rcpss",  { XM, EXd } },
2854   },
2855
2856   /* PREFIX_0F58 */
2857   {
2858     { "addps", { XM, EXx } },
2859     { "addss", { XM, EXd } },
2860     { "addpd", { XM, EXx } },
2861     { "addsd", { XM, EXq } },
2862   },
2863
2864   /* PREFIX_0F59 */
2865   {
2866     { "mulps",  { XM, EXx } },
2867     { "mulss",  { XM, EXd } },
2868     { "mulpd",  { XM, EXx } },
2869     { "mulsd",  { XM, EXq } },
2870   },
2871
2872   /* PREFIX_0F5A */
2873   {
2874     { "cvtps2pd", { XM, EXq } },
2875     { "cvtss2sd", { XM, EXd } },
2876     { "cvtpd2ps", { XM, EXx } },
2877     { "cvtsd2ss", { XM, EXq } },
2878   },
2879
2880   /* PREFIX_0F5B */
2881   {
2882     { "cvtdq2ps", { XM, EXx } },
2883     { "cvttps2dq", { XM, EXx } },
2884     { "cvtps2dq", { XM, EXx } },
2885   },
2886
2887   /* PREFIX_0F5C */
2888   {
2889     { "subps",  { XM, EXx } },
2890     { "subss",  { XM, EXd } },
2891     { "subpd",  { XM, EXx } },
2892     { "subsd",  { XM, EXq } },
2893   },
2894
2895   /* PREFIX_0F5D */
2896   {
2897     { "minps",  { XM, EXx } },
2898     { "minss",  { XM, EXd } },
2899     { "minpd",  { XM, EXx } },
2900     { "minsd",  { XM, EXq } },
2901   },
2902
2903   /* PREFIX_0F5E */
2904   {
2905     { "divps",  { XM, EXx } },
2906     { "divss",  { XM, EXd } },
2907     { "divpd",  { XM, EXx } },
2908     { "divsd",  { XM, EXq } },
2909   },
2910
2911   /* PREFIX_0F5F */
2912   {
2913     { "maxps",  { XM, EXx } },
2914     { "maxss",  { XM, EXd } },
2915     { "maxpd",  { XM, EXx } },
2916     { "maxsd",  { XM, EXq } },
2917   },
2918
2919   /* PREFIX_0F60 */
2920   {
2921     { "punpcklbw",{ MX, EMd } },
2922     { Bad_Opcode },
2923     { "punpcklbw",{ MX, EMx } },
2924   },
2925
2926   /* PREFIX_0F61 */
2927   {
2928     { "punpcklwd",{ MX, EMd } },
2929     { Bad_Opcode },
2930     { "punpcklwd",{ MX, EMx } },
2931   },
2932
2933   /* PREFIX_0F62 */
2934   {
2935     { "punpckldq",{ MX, EMd } },
2936     { Bad_Opcode },
2937     { "punpckldq",{ MX, EMx } },
2938   },
2939
2940   /* PREFIX_0F6C */
2941   {
2942     { Bad_Opcode },
2943     { Bad_Opcode },
2944     { "punpcklqdq", { XM, EXx } },
2945   },
2946
2947   /* PREFIX_0F6D */
2948   {
2949     { Bad_Opcode },
2950     { Bad_Opcode },
2951     { "punpckhqdq", { XM, EXx } },
2952   },
2953
2954   /* PREFIX_0F6F */
2955   {
2956     { "movq",   { MX, EM } },
2957     { "movdqu", { XM, EXx } },
2958     { "movdqa", { XM, EXx } },
2959   },
2960
2961   /* PREFIX_0F70 */
2962   {
2963     { "pshufw", { MX, EM, Ib } },
2964     { "pshufhw",{ XM, EXx, Ib } },
2965     { "pshufd", { XM, EXx, Ib } },
2966     { "pshuflw",{ XM, EXx, Ib } },
2967   },
2968
2969   /* PREFIX_0F73_REG_3 */
2970   {
2971     { Bad_Opcode },
2972     { Bad_Opcode },
2973     { "psrldq", { XS, Ib } },
2974   },
2975
2976   /* PREFIX_0F73_REG_7 */
2977   {
2978     { Bad_Opcode },
2979     { Bad_Opcode },
2980     { "pslldq", { XS, Ib } },
2981   },
2982
2983   /* PREFIX_0F78 */
2984   {
2985     {"vmread",  { Em, Gm } },
2986     { Bad_Opcode },
2987     {"extrq",   { XS, Ib, Ib } },
2988     {"insertq", { XM, XS, Ib, Ib } },
2989   },
2990
2991   /* PREFIX_0F79 */
2992   {
2993     {"vmwrite", { Gm, Em } },
2994     { Bad_Opcode },
2995     {"extrq",   { XM, XS } },
2996     {"insertq", { XM, XS } },
2997   },
2998
2999   /* PREFIX_0F7C */
3000   {
3001     { Bad_Opcode },
3002     { Bad_Opcode },
3003     { "haddpd", { XM, EXx } },
3004     { "haddps", { XM, EXx } },
3005   },
3006
3007   /* PREFIX_0F7D */
3008   {
3009     { Bad_Opcode },
3010     { Bad_Opcode },
3011     { "hsubpd", { XM, EXx } },
3012     { "hsubps", { XM, EXx } },
3013   },
3014
3015   /* PREFIX_0F7E */
3016   {
3017     { "movK",   { Edq, MX } },
3018     { "movq",   { XM, EXq } },
3019     { "movK",   { Edq, XM } },
3020   },
3021
3022   /* PREFIX_0F7F */
3023   {
3024     { "movq",   { EMS, MX } },
3025     { "movdqu", { EXxS, XM } },
3026     { "movdqa", { EXxS, XM } },
3027   },
3028
3029   /* PREFIX_0FB8 */
3030   {
3031     { Bad_Opcode },
3032     { "popcntS", { Gv, Ev } },
3033   },
3034
3035   /* PREFIX_0FBD */
3036   {
3037     { "bsrS",   { Gv, Ev } },
3038     { "lzcntS", { Gv, Ev } },
3039     { "bsrS",   { Gv, Ev } },
3040   },
3041
3042   /* PREFIX_0FC2 */
3043   {
3044     { "cmpps",  { XM, EXx, CMP } },
3045     { "cmpss",  { XM, EXd, CMP } },
3046     { "cmppd",  { XM, EXx, CMP } },
3047     { "cmpsd",  { XM, EXq, CMP } },
3048   },
3049
3050   /* PREFIX_0FC3 */
3051   {
3052     { "movntiS", { Ma, Gv } },
3053   },
3054
3055   /* PREFIX_0FC7_REG_6 */
3056   {
3057     { "vmptrld",{ Mq } },
3058     { "vmxon",  { Mq } },
3059     { "vmclear",{ Mq } },
3060   },
3061
3062   /* PREFIX_0FD0 */
3063   {
3064     { Bad_Opcode },
3065     { Bad_Opcode },
3066     { "addsubpd", { XM, EXx } },
3067     { "addsubps", { XM, EXx } },
3068   },
3069
3070   /* PREFIX_0FD6 */
3071   {
3072     { Bad_Opcode },
3073     { "movq2dq",{ XM, MS } },
3074     { "movq",   { EXqS, XM } },
3075     { "movdq2q",{ MX, XS } },
3076   },
3077
3078   /* PREFIX_0FE6 */
3079   {
3080     { Bad_Opcode },
3081     { "cvtdq2pd", { XM, EXq } },
3082     { "cvttpd2dq", { XM, EXx } },
3083     { "cvtpd2dq", { XM, EXx } },
3084   },
3085
3086   /* PREFIX_0FE7 */
3087   {
3088     { "movntq", { Mq, MX } },
3089     { Bad_Opcode },
3090     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3091   },
3092
3093   /* PREFIX_0FF0 */
3094   {
3095     { Bad_Opcode },
3096     { Bad_Opcode },
3097     { Bad_Opcode },
3098     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3099   },
3100
3101   /* PREFIX_0FF7 */
3102   {
3103     { "maskmovq", { MX, MS } },
3104     { Bad_Opcode },
3105     { "maskmovdqu", { XM, XS } },
3106   },
3107
3108   /* PREFIX_0F3810 */
3109   {
3110     { Bad_Opcode },
3111     { Bad_Opcode },
3112     { "pblendvb", { XM, EXx, XMM0 } },
3113   },
3114
3115   /* PREFIX_0F3814 */
3116   {
3117     { Bad_Opcode },
3118     { Bad_Opcode },
3119     { "blendvps", { XM, EXx, XMM0 } },
3120   },
3121
3122   /* PREFIX_0F3815 */
3123   {
3124     { Bad_Opcode },
3125     { Bad_Opcode },
3126     { "blendvpd", { XM, EXx, XMM0 } },
3127   },
3128
3129   /* PREFIX_0F3817 */
3130   {
3131     { Bad_Opcode },
3132     { Bad_Opcode },
3133     { "ptest",  { XM, EXx } },
3134   },
3135
3136   /* PREFIX_0F3820 */
3137   {
3138     { Bad_Opcode },
3139     { Bad_Opcode },
3140     { "pmovsxbw", { XM, EXq } },
3141   },
3142
3143   /* PREFIX_0F3821 */
3144   {
3145     { Bad_Opcode },
3146     { Bad_Opcode },
3147     { "pmovsxbd", { XM, EXd } },
3148   },
3149
3150   /* PREFIX_0F3822 */
3151   {
3152     { Bad_Opcode },
3153     { Bad_Opcode },
3154     { "pmovsxbq", { XM, EXw } },
3155   },
3156
3157   /* PREFIX_0F3823 */
3158   {
3159     { Bad_Opcode },
3160     { Bad_Opcode },
3161     { "pmovsxwd", { XM, EXq } },
3162   },
3163
3164   /* PREFIX_0F3824 */
3165   {
3166     { Bad_Opcode },
3167     { Bad_Opcode },
3168     { "pmovsxwq", { XM, EXd } },
3169   },
3170
3171   /* PREFIX_0F3825 */
3172   {
3173     { Bad_Opcode },
3174     { Bad_Opcode },
3175     { "pmovsxdq", { XM, EXq } },
3176   },
3177
3178   /* PREFIX_0F3828 */
3179   {
3180     { Bad_Opcode },
3181     { Bad_Opcode },
3182     { "pmuldq", { XM, EXx } },
3183   },
3184
3185   /* PREFIX_0F3829 */
3186   {
3187     { Bad_Opcode },
3188     { Bad_Opcode },
3189     { "pcmpeqq", { XM, EXx } },
3190   },
3191
3192   /* PREFIX_0F382A */
3193   {
3194     { Bad_Opcode },
3195     { Bad_Opcode },
3196     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3197   },
3198
3199   /* PREFIX_0F382B */
3200   {
3201     { Bad_Opcode },
3202     { Bad_Opcode },
3203     { "packusdw", { XM, EXx } },
3204   },
3205
3206   /* PREFIX_0F3830 */
3207   {
3208     { Bad_Opcode },
3209     { Bad_Opcode },
3210     { "pmovzxbw", { XM, EXq } },
3211   },
3212
3213   /* PREFIX_0F3831 */
3214   {
3215     { Bad_Opcode },
3216     { Bad_Opcode },
3217     { "pmovzxbd", { XM, EXd } },
3218   },
3219
3220   /* PREFIX_0F3832 */
3221   {
3222     { Bad_Opcode },
3223     { Bad_Opcode },
3224     { "pmovzxbq", { XM, EXw } },
3225   },
3226
3227   /* PREFIX_0F3833 */
3228   {
3229     { Bad_Opcode },
3230     { Bad_Opcode },
3231     { "pmovzxwd", { XM, EXq } },
3232   },
3233
3234   /* PREFIX_0F3834 */
3235   {
3236     { Bad_Opcode },
3237     { Bad_Opcode },
3238     { "pmovzxwq", { XM, EXd } },
3239   },
3240
3241   /* PREFIX_0F3835 */
3242   {
3243     { Bad_Opcode },
3244     { Bad_Opcode },
3245     { "pmovzxdq", { XM, EXq } },
3246   },
3247
3248   /* PREFIX_0F3837 */
3249   {
3250     { Bad_Opcode },
3251     { Bad_Opcode },
3252     { "pcmpgtq", { XM, EXx } },
3253   },
3254
3255   /* PREFIX_0F3838 */
3256   {
3257     { Bad_Opcode },
3258     { Bad_Opcode },
3259     { "pminsb", { XM, EXx } },
3260   },
3261
3262   /* PREFIX_0F3839 */
3263   {
3264     { Bad_Opcode },
3265     { Bad_Opcode },
3266     { "pminsd", { XM, EXx } },
3267   },
3268
3269   /* PREFIX_0F383A */
3270   {
3271     { Bad_Opcode },
3272     { Bad_Opcode },
3273     { "pminuw", { XM, EXx } },
3274   },
3275
3276   /* PREFIX_0F383B */
3277   {
3278     { Bad_Opcode },
3279     { Bad_Opcode },
3280     { "pminud", { XM, EXx } },
3281   },
3282
3283   /* PREFIX_0F383C */
3284   {
3285     { Bad_Opcode },
3286     { Bad_Opcode },
3287     { "pmaxsb", { XM, EXx } },
3288   },
3289
3290   /* PREFIX_0F383D */
3291   {
3292     { Bad_Opcode },
3293     { Bad_Opcode },
3294     { "pmaxsd", { XM, EXx } },
3295   },
3296
3297   /* PREFIX_0F383E */
3298   {
3299     { Bad_Opcode },
3300     { Bad_Opcode },
3301     { "pmaxuw", { XM, EXx } },
3302   },
3303
3304   /* PREFIX_0F383F */
3305   {
3306     { Bad_Opcode },
3307     { Bad_Opcode },
3308     { "pmaxud", { XM, EXx } },
3309   },
3310
3311   /* PREFIX_0F3840 */
3312   {
3313     { Bad_Opcode },
3314     { Bad_Opcode },
3315     { "pmulld", { XM, EXx } },
3316   },
3317
3318   /* PREFIX_0F3841 */
3319   {
3320     { Bad_Opcode },
3321     { Bad_Opcode },
3322     { "phminposuw", { XM, EXx } },
3323   },
3324
3325   /* PREFIX_0F3880 */
3326   {
3327     { Bad_Opcode },
3328     { Bad_Opcode },
3329     { "invept", { Gm, Mo } },
3330   },
3331
3332   /* PREFIX_0F3881 */
3333   {
3334     { Bad_Opcode },
3335     { Bad_Opcode },
3336     { "invvpid", { Gm, Mo } },
3337   },
3338
3339   /* PREFIX_0F38DB */
3340   {
3341     { Bad_Opcode },
3342     { Bad_Opcode },
3343     { "aesimc", { XM, EXx } },
3344   },
3345
3346   /* PREFIX_0F38DC */
3347   {
3348     { Bad_Opcode },
3349     { Bad_Opcode },
3350     { "aesenc", { XM, EXx } },
3351   },
3352
3353   /* PREFIX_0F38DD */
3354   {
3355     { Bad_Opcode },
3356     { Bad_Opcode },
3357     { "aesenclast", { XM, EXx } },
3358   },
3359
3360   /* PREFIX_0F38DE */
3361   {
3362     { Bad_Opcode },
3363     { Bad_Opcode },
3364     { "aesdec", { XM, EXx } },
3365   },
3366
3367   /* PREFIX_0F38DF */
3368   {
3369     { Bad_Opcode },
3370     { Bad_Opcode },
3371     { "aesdeclast", { XM, EXx } },
3372   },
3373
3374   /* PREFIX_0F38F0 */
3375   {
3376     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3377     { Bad_Opcode },
3378     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
3379     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },     
3380   },
3381
3382   /* PREFIX_0F38F1 */
3383   {
3384     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3385     { Bad_Opcode },
3386     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
3387     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },     
3388   },
3389
3390   /* PREFIX_0F3A08 */
3391   {
3392     { Bad_Opcode },
3393     { Bad_Opcode },
3394     { "roundps", { XM, EXx, Ib } },
3395   },
3396
3397   /* PREFIX_0F3A09 */
3398   {
3399     { Bad_Opcode },
3400     { Bad_Opcode },
3401     { "roundpd", { XM, EXx, Ib } },
3402   },
3403
3404   /* PREFIX_0F3A0A */
3405   {
3406     { Bad_Opcode },
3407     { Bad_Opcode },
3408     { "roundss", { XM, EXd, Ib } },
3409   },
3410
3411   /* PREFIX_0F3A0B */
3412   {
3413     { Bad_Opcode },
3414     { Bad_Opcode },
3415     { "roundsd", { XM, EXq, Ib } },
3416   },
3417
3418   /* PREFIX_0F3A0C */
3419   {
3420     { Bad_Opcode },
3421     { Bad_Opcode },
3422     { "blendps", { XM, EXx, Ib } },
3423   },
3424
3425   /* PREFIX_0F3A0D */
3426   {
3427     { Bad_Opcode },
3428     { Bad_Opcode },
3429     { "blendpd", { XM, EXx, Ib } },
3430   },
3431
3432   /* PREFIX_0F3A0E */
3433   {
3434     { Bad_Opcode },
3435     { Bad_Opcode },
3436     { "pblendw", { XM, EXx, Ib } },
3437   },
3438
3439   /* PREFIX_0F3A14 */
3440   {
3441     { Bad_Opcode },
3442     { Bad_Opcode },
3443     { "pextrb", { Edqb, XM, Ib } },
3444   },
3445
3446   /* PREFIX_0F3A15 */
3447   {
3448     { Bad_Opcode },
3449     { Bad_Opcode },
3450     { "pextrw", { Edqw, XM, Ib } },
3451   },
3452
3453   /* PREFIX_0F3A16 */
3454   {
3455     { Bad_Opcode },
3456     { Bad_Opcode },
3457     { "pextrK", { Edq, XM, Ib } },
3458   },
3459
3460   /* PREFIX_0F3A17 */
3461   {
3462     { Bad_Opcode },
3463     { Bad_Opcode },
3464     { "extractps", { Edqd, XM, Ib } },
3465   },
3466
3467   /* PREFIX_0F3A20 */
3468   {
3469     { Bad_Opcode },
3470     { Bad_Opcode },
3471     { "pinsrb", { XM, Edqb, Ib } },
3472   },
3473
3474   /* PREFIX_0F3A21 */
3475   {
3476     { Bad_Opcode },
3477     { Bad_Opcode },
3478     { "insertps", { XM, EXd, Ib } },
3479   },
3480
3481   /* PREFIX_0F3A22 */
3482   {
3483     { Bad_Opcode },
3484     { Bad_Opcode },
3485     { "pinsrK", { XM, Edq, Ib } },
3486   },
3487
3488   /* PREFIX_0F3A40 */
3489   {
3490     { Bad_Opcode },
3491     { Bad_Opcode },
3492     { "dpps",   { XM, EXx, Ib } },
3493   },
3494
3495   /* PREFIX_0F3A41 */
3496   {
3497     { Bad_Opcode },
3498     { Bad_Opcode },
3499     { "dppd",   { XM, EXx, Ib } },
3500   },
3501
3502   /* PREFIX_0F3A42 */
3503   {
3504     { Bad_Opcode },
3505     { Bad_Opcode },
3506     { "mpsadbw", { XM, EXx, Ib } },
3507   },
3508
3509   /* PREFIX_0F3A44 */
3510   {
3511     { Bad_Opcode },
3512     { Bad_Opcode },
3513     { "pclmulqdq", { XM, EXx, PCLMUL } },
3514   },
3515
3516   /* PREFIX_0F3A60 */
3517   {
3518     { Bad_Opcode },
3519     { Bad_Opcode },
3520     { "pcmpestrm", { XM, EXx, Ib } },
3521   },
3522
3523   /* PREFIX_0F3A61 */
3524   {
3525     { Bad_Opcode },
3526     { Bad_Opcode },
3527     { "pcmpestri", { XM, EXx, Ib } },
3528   },
3529
3530   /* PREFIX_0F3A62 */
3531   {
3532     { Bad_Opcode },
3533     { Bad_Opcode },
3534     { "pcmpistrm", { XM, EXx, Ib } },
3535   },
3536
3537   /* PREFIX_0F3A63 */
3538   {
3539     { Bad_Opcode },
3540     { Bad_Opcode },
3541     { "pcmpistri", { XM, EXx, Ib } },
3542   },
3543
3544   /* PREFIX_0F3ADF */
3545   {
3546     { Bad_Opcode },
3547     { Bad_Opcode },
3548     { "aeskeygenassist", { XM, EXx, Ib } },
3549   },
3550
3551   /* PREFIX_VEX_10 */
3552   {
3553     { VEX_W_TABLE (VEX_W_10_P_0) },
3554     { VEX_LEN_TABLE (VEX_LEN_10_P_1) },
3555     { VEX_W_TABLE (VEX_W_10_P_2) },
3556     { VEX_LEN_TABLE (VEX_LEN_10_P_3) },
3557   },
3558
3559   /* PREFIX_VEX_11 */
3560   {
3561     { VEX_W_TABLE (VEX_W_11_P_0) },
3562     { VEX_LEN_TABLE (VEX_LEN_11_P_1) },
3563     { VEX_W_TABLE (VEX_W_11_P_2) },
3564     { VEX_LEN_TABLE (VEX_LEN_11_P_3) },
3565   },
3566
3567   /* PREFIX_VEX_12 */
3568   {
3569     { MOD_TABLE (MOD_VEX_12_PREFIX_0) },
3570     { VEX_W_TABLE (VEX_W_12_P_1) },
3571     { VEX_LEN_TABLE (VEX_LEN_12_P_2) },
3572     { VEX_W_TABLE (VEX_W_12_P_3) },
3573   },
3574
3575   /* PREFIX_VEX_16 */
3576   {
3577     { MOD_TABLE (MOD_VEX_16_PREFIX_0) },
3578     { VEX_W_TABLE (VEX_W_16_P_1) },
3579     { VEX_LEN_TABLE (VEX_LEN_16_P_2) },
3580   },
3581
3582   /* PREFIX_VEX_2A */
3583   {
3584     { Bad_Opcode },
3585     { VEX_LEN_TABLE (VEX_LEN_2A_P_1) },
3586     { Bad_Opcode },
3587     { VEX_LEN_TABLE (VEX_LEN_2A_P_3) },
3588   },
3589
3590   /* PREFIX_VEX_2C */
3591   {
3592     { Bad_Opcode },
3593     { VEX_LEN_TABLE (VEX_LEN_2C_P_1) },
3594     { Bad_Opcode },
3595     { VEX_LEN_TABLE (VEX_LEN_2C_P_3) },
3596   },
3597
3598   /* PREFIX_VEX_2D */
3599   {
3600     { Bad_Opcode },
3601     { VEX_LEN_TABLE (VEX_LEN_2D_P_1) },
3602     { Bad_Opcode },
3603     { VEX_LEN_TABLE (VEX_LEN_2D_P_3) },
3604   },
3605
3606   /* PREFIX_VEX_2E */
3607   {
3608     { VEX_LEN_TABLE (VEX_LEN_2E_P_0) },
3609     { Bad_Opcode },
3610     { VEX_LEN_TABLE (VEX_LEN_2E_P_2) },
3611   },
3612
3613   /* PREFIX_VEX_2F */
3614   {
3615     { VEX_LEN_TABLE (VEX_LEN_2F_P_0) },
3616     { Bad_Opcode },
3617     { VEX_LEN_TABLE (VEX_LEN_2F_P_2) },
3618   },
3619
3620   /* PREFIX_VEX_51 */
3621   {
3622     { VEX_W_TABLE (VEX_W_51_P_0) },
3623     { VEX_LEN_TABLE (VEX_LEN_51_P_1) },
3624     { VEX_W_TABLE (VEX_W_51_P_2) },
3625     { VEX_LEN_TABLE (VEX_LEN_51_P_3) },
3626   },
3627
3628   /* PREFIX_VEX_52 */
3629   {
3630     { VEX_W_TABLE (VEX_W_52_P_0) },
3631     { VEX_LEN_TABLE (VEX_LEN_52_P_1) },
3632   },
3633
3634   /* PREFIX_VEX_53 */
3635   {
3636     { VEX_W_TABLE (VEX_W_53_P_0) },
3637     { VEX_LEN_TABLE (VEX_LEN_53_P_1) },
3638   },
3639
3640   /* PREFIX_VEX_58 */
3641   {
3642     { VEX_W_TABLE (VEX_W_58_P_0) },
3643     { VEX_LEN_TABLE (VEX_LEN_58_P_1) },
3644     { VEX_W_TABLE (VEX_W_58_P_2) },
3645     { VEX_LEN_TABLE (VEX_LEN_58_P_3) },
3646   },
3647
3648   /* PREFIX_VEX_59 */
3649   {
3650     { VEX_W_TABLE (VEX_W_59_P_0) },
3651     { VEX_LEN_TABLE (VEX_LEN_59_P_1) },
3652     { VEX_W_TABLE (VEX_W_59_P_2) },
3653     { VEX_LEN_TABLE (VEX_LEN_59_P_3) },
3654   },
3655
3656   /* PREFIX_VEX_5A */
3657   {
3658     { VEX_W_TABLE (VEX_W_5A_P_0) },
3659     { VEX_LEN_TABLE (VEX_LEN_5A_P_1) },
3660     { "vcvtpd2ps%XY", { XMM, EXx } },
3661     { VEX_LEN_TABLE (VEX_LEN_5A_P_3) },
3662   },
3663
3664   /* PREFIX_VEX_5B */
3665   {
3666     { VEX_W_TABLE (VEX_W_5B_P_0) },
3667     { VEX_W_TABLE (VEX_W_5B_P_1) },
3668     { VEX_W_TABLE (VEX_W_5B_P_2) },
3669   },
3670
3671   /* PREFIX_VEX_5C */
3672   {
3673     { VEX_W_TABLE (VEX_W_5C_P_0) },
3674     { VEX_LEN_TABLE (VEX_LEN_5C_P_1) },
3675     { VEX_W_TABLE (VEX_W_5C_P_2) },
3676     { VEX_LEN_TABLE (VEX_LEN_5C_P_3) },
3677   },
3678
3679   /* PREFIX_VEX_5D */
3680   {
3681     { VEX_W_TABLE (VEX_W_5D_P_0) },
3682     { VEX_LEN_TABLE (VEX_LEN_5D_P_1) },
3683     { VEX_W_TABLE (VEX_W_5D_P_2) },
3684     { VEX_LEN_TABLE (VEX_LEN_5D_P_3) },
3685   },
3686
3687   /* PREFIX_VEX_5E */
3688   {
3689     { VEX_W_TABLE (VEX_W_5E_P_0) },
3690     { VEX_LEN_TABLE (VEX_LEN_5E_P_1) },
3691     { VEX_W_TABLE (VEX_W_5E_P_2) },
3692     { VEX_LEN_TABLE (VEX_LEN_5E_P_3) },
3693   },
3694
3695   /* PREFIX_VEX_5F */
3696   {
3697     { VEX_W_TABLE (VEX_W_5F_P_0) },
3698     { VEX_LEN_TABLE (VEX_LEN_5F_P_1) },
3699     { VEX_W_TABLE (VEX_W_5F_P_2) },
3700     { VEX_LEN_TABLE (VEX_LEN_5F_P_3) },
3701   },
3702
3703   /* PREFIX_VEX_60 */
3704   {
3705     { Bad_Opcode },
3706     { Bad_Opcode },
3707     { VEX_LEN_TABLE (VEX_LEN_60_P_2) },
3708   },
3709
3710   /* PREFIX_VEX_61 */
3711   {
3712     { Bad_Opcode },
3713     { Bad_Opcode },
3714     { VEX_LEN_TABLE (VEX_LEN_61_P_2) },
3715   },
3716
3717   /* PREFIX_VEX_62 */
3718   {
3719     { Bad_Opcode },
3720     { Bad_Opcode },
3721     { VEX_LEN_TABLE (VEX_LEN_62_P_2) },
3722   },
3723
3724   /* PREFIX_VEX_63 */
3725   {
3726     { Bad_Opcode },
3727     { Bad_Opcode },
3728     { VEX_LEN_TABLE (VEX_LEN_63_P_2) },
3729   },
3730
3731   /* PREFIX_VEX_64 */
3732   {
3733     { Bad_Opcode },
3734     { Bad_Opcode },
3735     { VEX_LEN_TABLE (VEX_LEN_64_P_2) },
3736   },
3737
3738   /* PREFIX_VEX_65 */
3739   {
3740     { Bad_Opcode },
3741     { Bad_Opcode },
3742     { VEX_LEN_TABLE (VEX_LEN_65_P_2) },
3743   },
3744
3745   /* PREFIX_VEX_66 */
3746   {
3747     { Bad_Opcode },
3748     { Bad_Opcode },
3749     { VEX_LEN_TABLE (VEX_LEN_66_P_2) },
3750   },
3751
3752   /* PREFIX_VEX_67 */
3753   {
3754     { Bad_Opcode },
3755     { Bad_Opcode },
3756     { VEX_LEN_TABLE (VEX_LEN_67_P_2) },
3757   },
3758
3759   /* PREFIX_VEX_68 */
3760   {
3761     { Bad_Opcode },
3762     { Bad_Opcode },
3763     { VEX_LEN_TABLE (VEX_LEN_68_P_2) },
3764   },
3765
3766   /* PREFIX_VEX_69 */
3767   {
3768     { Bad_Opcode },
3769     { Bad_Opcode },
3770     { VEX_LEN_TABLE (VEX_LEN_69_P_2) },
3771   },
3772
3773   /* PREFIX_VEX_6A */
3774   {
3775     { Bad_Opcode },
3776     { Bad_Opcode },
3777     { VEX_LEN_TABLE (VEX_LEN_6A_P_2) },
3778   },
3779
3780   /* PREFIX_VEX_6B */
3781   {
3782     { Bad_Opcode },
3783     { Bad_Opcode },
3784     { VEX_LEN_TABLE (VEX_LEN_6B_P_2) },
3785   },
3786
3787   /* PREFIX_VEX_6C */
3788   {
3789     { Bad_Opcode },
3790     { Bad_Opcode },
3791     { VEX_LEN_TABLE (VEX_LEN_6C_P_2) },
3792   },
3793
3794   /* PREFIX_VEX_6D */
3795   {
3796     { Bad_Opcode },
3797     { Bad_Opcode },
3798     { VEX_LEN_TABLE (VEX_LEN_6D_P_2) },
3799   },
3800
3801   /* PREFIX_VEX_6E */
3802   {
3803     { Bad_Opcode },
3804     { Bad_Opcode },
3805     { VEX_LEN_TABLE (VEX_LEN_6E_P_2) },
3806   },
3807
3808   /* PREFIX_VEX_6F */
3809   {
3810     { Bad_Opcode },
3811     { VEX_W_TABLE (VEX_W_6F_P_1) },
3812     { VEX_W_TABLE (VEX_W_6F_P_2) },
3813   },
3814
3815   /* PREFIX_VEX_70 */
3816   {
3817     { Bad_Opcode },
3818     { VEX_LEN_TABLE (VEX_LEN_70_P_1) },
3819     { VEX_LEN_TABLE (VEX_LEN_70_P_2) },
3820     { VEX_LEN_TABLE (VEX_LEN_70_P_3) },
3821   },
3822
3823   /* PREFIX_VEX_71_REG_2 */
3824   {
3825     { Bad_Opcode },
3826     { Bad_Opcode },
3827     { VEX_LEN_TABLE (VEX_LEN_71_R_2_P_2) },
3828   },
3829
3830   /* PREFIX_VEX_71_REG_4 */
3831   {
3832     { Bad_Opcode },
3833     { Bad_Opcode },
3834     { VEX_LEN_TABLE (VEX_LEN_71_R_4_P_2) },
3835   },
3836
3837   /* PREFIX_VEX_71_REG_6 */
3838   {
3839     { Bad_Opcode },
3840     { Bad_Opcode },
3841     { VEX_LEN_TABLE (VEX_LEN_71_R_6_P_2) },
3842   },
3843
3844   /* PREFIX_VEX_72_REG_2 */
3845   {
3846     { Bad_Opcode },
3847     { Bad_Opcode },
3848     { VEX_LEN_TABLE (VEX_LEN_72_R_2_P_2) },
3849   },
3850
3851   /* PREFIX_VEX_72_REG_4 */
3852   {
3853     { Bad_Opcode },
3854     { Bad_Opcode },
3855     { VEX_LEN_TABLE (VEX_LEN_72_R_4_P_2) },
3856   },
3857
3858   /* PREFIX_VEX_72_REG_6 */
3859   {
3860     { Bad_Opcode },
3861     { Bad_Opcode },
3862     { VEX_LEN_TABLE (VEX_LEN_72_R_6_P_2) },
3863   },
3864
3865   /* PREFIX_VEX_73_REG_2 */
3866   {
3867     { Bad_Opcode },
3868     { Bad_Opcode },
3869     { VEX_LEN_TABLE (VEX_LEN_73_R_2_P_2) },
3870   },
3871
3872   /* PREFIX_VEX_73_REG_3 */
3873   {
3874     { Bad_Opcode },
3875     { Bad_Opcode },
3876     { VEX_LEN_TABLE (VEX_LEN_73_R_3_P_2) },
3877   },
3878
3879   /* PREFIX_VEX_73_REG_6 */
3880   {
3881     { Bad_Opcode },
3882     { Bad_Opcode },
3883     { VEX_LEN_TABLE (VEX_LEN_73_R_6_P_2) },
3884   },
3885
3886   /* PREFIX_VEX_73_REG_7 */
3887   {
3888     { Bad_Opcode },
3889     { Bad_Opcode },
3890     { VEX_LEN_TABLE (VEX_LEN_73_R_7_P_2) },
3891   },
3892
3893   /* PREFIX_VEX_74 */
3894   {
3895     { Bad_Opcode },
3896     { Bad_Opcode },
3897     { VEX_LEN_TABLE (VEX_LEN_74_P_2) },
3898   },
3899
3900   /* PREFIX_VEX_75 */
3901   {
3902     { Bad_Opcode },
3903     { Bad_Opcode },
3904     { VEX_LEN_TABLE (VEX_LEN_75_P_2) },
3905   },
3906
3907   /* PREFIX_VEX_76 */
3908   {
3909     { Bad_Opcode },
3910     { Bad_Opcode },
3911     { VEX_LEN_TABLE (VEX_LEN_76_P_2) },
3912   },
3913
3914   /* PREFIX_VEX_77 */
3915   {
3916     { VEX_W_TABLE (VEX_W_77_P_0) },
3917   },
3918
3919   /* PREFIX_VEX_7C */
3920   {
3921     { Bad_Opcode },
3922     { Bad_Opcode },
3923     { VEX_W_TABLE (VEX_W_7C_P_2) },
3924     { VEX_W_TABLE (VEX_W_7C_P_3) },
3925   },
3926
3927   /* PREFIX_VEX_7D */
3928   {
3929     { Bad_Opcode },
3930     { Bad_Opcode },
3931     { VEX_W_TABLE (VEX_W_7D_P_2) },
3932     { VEX_W_TABLE (VEX_W_7D_P_3) },
3933   },
3934
3935   /* PREFIX_VEX_7E */
3936   {
3937     { Bad_Opcode },
3938     { VEX_LEN_TABLE (VEX_LEN_7E_P_1) },
3939     { VEX_LEN_TABLE (VEX_LEN_7E_P_2) },
3940   },
3941
3942   /* PREFIX_VEX_7F */
3943   {
3944     { Bad_Opcode },
3945     { VEX_W_TABLE (VEX_W_7F_P_1) },
3946     { VEX_W_TABLE (VEX_W_7F_P_2) },
3947   },
3948
3949   /* PREFIX_VEX_C2 */
3950   {
3951     { VEX_W_TABLE (VEX_W_C2_P_0) },
3952     { VEX_LEN_TABLE (VEX_LEN_C2_P_1) },
3953     { VEX_W_TABLE (VEX_W_C2_P_2) },
3954     { VEX_LEN_TABLE (VEX_LEN_C2_P_3) },
3955   },
3956
3957   /* PREFIX_VEX_C4 */
3958   {
3959     { Bad_Opcode },
3960     { Bad_Opcode },
3961     { VEX_LEN_TABLE (VEX_LEN_C4_P_2) },
3962   },
3963
3964   /* PREFIX_VEX_C5 */
3965   {
3966     { Bad_Opcode },
3967     { Bad_Opcode },
3968     { VEX_LEN_TABLE (VEX_LEN_C5_P_2) },
3969   },
3970
3971   /* PREFIX_VEX_D0 */
3972   {
3973     { Bad_Opcode },
3974     { Bad_Opcode },
3975     { VEX_W_TABLE (VEX_W_D0_P_2) },
3976     { VEX_W_TABLE (VEX_W_D0_P_3) },
3977   },
3978
3979   /* PREFIX_VEX_D1 */
3980   {
3981     { Bad_Opcode },
3982     { Bad_Opcode },
3983     { VEX_LEN_TABLE (VEX_LEN_D1_P_2) },
3984   },
3985
3986   /* PREFIX_VEX_D2 */
3987   {
3988     { Bad_Opcode },
3989     { Bad_Opcode },
3990     { VEX_LEN_TABLE (VEX_LEN_D2_P_2) },
3991   },
3992
3993   /* PREFIX_VEX_D3 */
3994   {
3995     { Bad_Opcode },
3996     { Bad_Opcode },
3997     { VEX_LEN_TABLE (VEX_LEN_D3_P_2) },
3998   },
3999
4000   /* PREFIX_VEX_D4 */
4001   {
4002     { Bad_Opcode },
4003     { Bad_Opcode },
4004     { VEX_LEN_TABLE (VEX_LEN_D4_P_2) },
4005   },
4006
4007   /* PREFIX_VEX_D5 */
4008   {
4009     { Bad_Opcode },
4010     { Bad_Opcode },
4011     { VEX_LEN_TABLE (VEX_LEN_D5_P_2) },
4012   },
4013
4014   /* PREFIX_VEX_D6 */
4015   {
4016     { Bad_Opcode },
4017     { Bad_Opcode },
4018     { VEX_LEN_TABLE (VEX_LEN_D6_P_2) },
4019   },
4020
4021   /* PREFIX_VEX_D7 */
4022   {
4023     { Bad_Opcode },
4024     { Bad_Opcode },
4025     { MOD_TABLE (MOD_VEX_D7_PREFIX_2) },
4026   },
4027
4028   /* PREFIX_VEX_D8 */
4029   {
4030     { Bad_Opcode },
4031     { Bad_Opcode },
4032     { VEX_LEN_TABLE (VEX_LEN_D8_P_2) },
4033   },
4034
4035   /* PREFIX_VEX_D9 */
4036   {
4037     { Bad_Opcode },
4038     { Bad_Opcode },
4039     { VEX_LEN_TABLE (VEX_LEN_D9_P_2) },
4040   },
4041
4042   /* PREFIX_VEX_DA */
4043   {
4044     { Bad_Opcode },
4045     { Bad_Opcode },
4046     { VEX_LEN_TABLE (VEX_LEN_DA_P_2) },
4047   },
4048
4049   /* PREFIX_VEX_DB */
4050   {
4051     { Bad_Opcode },
4052     { Bad_Opcode },
4053     { VEX_LEN_TABLE (VEX_LEN_DB_P_2) },
4054   },
4055
4056   /* PREFIX_VEX_DC */
4057   {
4058     { Bad_Opcode },
4059     { Bad_Opcode },
4060     { VEX_LEN_TABLE (VEX_LEN_DC_P_2) },
4061   },
4062
4063   /* PREFIX_VEX_DD */
4064   {
4065     { Bad_Opcode },
4066     { Bad_Opcode },
4067     { VEX_LEN_TABLE (VEX_LEN_DD_P_2) },
4068   },
4069
4070   /* PREFIX_VEX_DE */
4071   {
4072     { Bad_Opcode },
4073     { Bad_Opcode },
4074     { VEX_LEN_TABLE (VEX_LEN_DE_P_2) },
4075   },
4076
4077   /* PREFIX_VEX_DF */
4078   {
4079     { Bad_Opcode },
4080     { Bad_Opcode },
4081     { VEX_LEN_TABLE (VEX_LEN_DF_P_2) },
4082   },
4083
4084   /* PREFIX_VEX_E0 */
4085   {
4086     { Bad_Opcode },
4087     { Bad_Opcode },
4088     { VEX_LEN_TABLE (VEX_LEN_E0_P_2) },
4089   },
4090
4091   /* PREFIX_VEX_E1 */
4092   {
4093     { Bad_Opcode },
4094     { Bad_Opcode },
4095     { VEX_LEN_TABLE (VEX_LEN_E1_P_2) },
4096   },
4097
4098   /* PREFIX_VEX_E2 */
4099   {
4100     { Bad_Opcode },
4101     { Bad_Opcode },
4102     { VEX_LEN_TABLE (VEX_LEN_E2_P_2) },
4103   },
4104
4105   /* PREFIX_VEX_E3 */
4106   {
4107     { Bad_Opcode },
4108     { Bad_Opcode },
4109     { VEX_LEN_TABLE (VEX_LEN_E3_P_2) },
4110   },
4111
4112   /* PREFIX_VEX_E4 */
4113   {
4114     { Bad_Opcode },
4115     { Bad_Opcode },
4116     { VEX_LEN_TABLE (VEX_LEN_E4_P_2) },
4117   },
4118
4119   /* PREFIX_VEX_E5 */
4120   {
4121     { Bad_Opcode },
4122     { Bad_Opcode },
4123     { VEX_LEN_TABLE (VEX_LEN_E5_P_2) },
4124   },
4125
4126   /* PREFIX_VEX_E6 */
4127   {
4128     { Bad_Opcode },
4129     { VEX_W_TABLE (VEX_W_E6_P_1) },
4130     { VEX_W_TABLE (VEX_W_E6_P_2) },
4131     { VEX_W_TABLE (VEX_W_E6_P_3) },
4132   },
4133
4134   /* PREFIX_VEX_E7 */
4135   {
4136     { Bad_Opcode },
4137     { Bad_Opcode },
4138     { MOD_TABLE (MOD_VEX_E7_PREFIX_2) },
4139   },
4140
4141   /* PREFIX_VEX_E8 */
4142   {
4143     { Bad_Opcode },
4144     { Bad_Opcode },
4145     { VEX_LEN_TABLE (VEX_LEN_E8_P_2) },
4146   },
4147
4148   /* PREFIX_VEX_E9 */
4149   {
4150     { Bad_Opcode },
4151     { Bad_Opcode },
4152     { VEX_LEN_TABLE (VEX_LEN_E9_P_2) },
4153   },
4154
4155   /* PREFIX_VEX_EA */
4156   {
4157     { Bad_Opcode },
4158     { Bad_Opcode },
4159     { VEX_LEN_TABLE (VEX_LEN_EA_P_2) },
4160   },
4161
4162   /* PREFIX_VEX_EB */
4163   {
4164     { Bad_Opcode },
4165     { Bad_Opcode },
4166     { VEX_LEN_TABLE (VEX_LEN_EB_P_2) },
4167   },
4168
4169   /* PREFIX_VEX_EC */
4170   {
4171     { Bad_Opcode },
4172     { Bad_Opcode },
4173     { VEX_LEN_TABLE (VEX_LEN_EC_P_2) },
4174   },
4175
4176   /* PREFIX_VEX_ED */
4177   {
4178     { Bad_Opcode },
4179     { Bad_Opcode },
4180     { VEX_LEN_TABLE (VEX_LEN_ED_P_2) },
4181   },
4182
4183   /* PREFIX_VEX_EE */
4184   {
4185     { Bad_Opcode },
4186     { Bad_Opcode },
4187     { VEX_LEN_TABLE (VEX_LEN_EE_P_2) },
4188   },
4189
4190   /* PREFIX_VEX_EF */
4191   {
4192     { Bad_Opcode },
4193     { Bad_Opcode },
4194     { VEX_LEN_TABLE (VEX_LEN_EF_P_2) },
4195   },
4196
4197   /* PREFIX_VEX_F0 */
4198   {
4199     { Bad_Opcode },
4200     { Bad_Opcode },
4201     { Bad_Opcode },
4202     { MOD_TABLE (MOD_VEX_F0_PREFIX_3) },
4203   },
4204
4205   /* PREFIX_VEX_F1 */
4206   {
4207     { Bad_Opcode },
4208     { Bad_Opcode },
4209     { VEX_LEN_TABLE (VEX_LEN_F1_P_2) },
4210   },
4211
4212   /* PREFIX_VEX_F2 */
4213   {
4214     { Bad_Opcode },
4215     { Bad_Opcode },
4216     { VEX_LEN_TABLE (VEX_LEN_F2_P_2) },
4217   },
4218
4219   /* PREFIX_VEX_F3 */
4220   {
4221     { Bad_Opcode },
4222     { Bad_Opcode },
4223     { VEX_LEN_TABLE (VEX_LEN_F3_P_2) },
4224   },
4225
4226   /* PREFIX_VEX_F4 */
4227   {
4228     { Bad_Opcode },
4229     { Bad_Opcode },
4230     { VEX_LEN_TABLE (VEX_LEN_F4_P_2) },
4231   },
4232
4233   /* PREFIX_VEX_F5 */
4234   {
4235     { Bad_Opcode },
4236     { Bad_Opcode },
4237     { VEX_LEN_TABLE (VEX_LEN_F5_P_2) },
4238   },
4239
4240   /* PREFIX_VEX_F6 */
4241   {
4242     { Bad_Opcode },
4243     { Bad_Opcode },
4244     { VEX_LEN_TABLE (VEX_LEN_F6_P_2) },
4245   },
4246
4247   /* PREFIX_VEX_F7 */
4248   {
4249     { Bad_Opcode },
4250     { Bad_Opcode },
4251     { VEX_LEN_TABLE (VEX_LEN_F7_P_2) },
4252   },
4253
4254   /* PREFIX_VEX_F8 */
4255   {
4256     { Bad_Opcode },
4257     { Bad_Opcode },
4258     { VEX_LEN_TABLE (VEX_LEN_F8_P_2) },
4259   },
4260
4261   /* PREFIX_VEX_F9 */
4262   {
4263     { Bad_Opcode },
4264     { Bad_Opcode },
4265     { VEX_LEN_TABLE (VEX_LEN_F9_P_2) },
4266   },
4267
4268   /* PREFIX_VEX_FA */
4269   {
4270     { Bad_Opcode },
4271     { Bad_Opcode },
4272     { VEX_LEN_TABLE (VEX_LEN_FA_P_2) },
4273   },
4274
4275   /* PREFIX_VEX_FB */
4276   {
4277     { Bad_Opcode },
4278     { Bad_Opcode },
4279     { VEX_LEN_TABLE (VEX_LEN_FB_P_2) },
4280   },
4281
4282   /* PREFIX_VEX_FC */
4283   {
4284     { Bad_Opcode },
4285     { Bad_Opcode },
4286     { VEX_LEN_TABLE (VEX_LEN_FC_P_2) },
4287   },
4288
4289   /* PREFIX_VEX_FD */
4290   {
4291     { Bad_Opcode },
4292     { Bad_Opcode },
4293     { VEX_LEN_TABLE (VEX_LEN_FD_P_2) },
4294   },
4295
4296   /* PREFIX_VEX_FE */
4297   {
4298     { Bad_Opcode },
4299     { Bad_Opcode },
4300     { VEX_LEN_TABLE (VEX_LEN_FE_P_2) },
4301   },
4302
4303   /* PREFIX_VEX_3800 */
4304   {
4305     { Bad_Opcode },
4306     { Bad_Opcode },
4307     { VEX_LEN_TABLE (VEX_LEN_3800_P_2) },
4308   },
4309
4310   /* PREFIX_VEX_3801 */
4311   {
4312     { Bad_Opcode },
4313     { Bad_Opcode },
4314     { VEX_LEN_TABLE (VEX_LEN_3801_P_2) },
4315   },
4316
4317   /* PREFIX_VEX_3802 */
4318   {
4319     { Bad_Opcode },
4320     { Bad_Opcode },
4321     { VEX_LEN_TABLE (VEX_LEN_3802_P_2) },
4322   },
4323
4324   /* PREFIX_VEX_3803 */
4325   {
4326     { Bad_Opcode },
4327     { Bad_Opcode },
4328     { VEX_LEN_TABLE (VEX_LEN_3803_P_2) },
4329   },
4330
4331   /* PREFIX_VEX_3804 */
4332   {
4333     { Bad_Opcode },
4334     { Bad_Opcode },
4335     { VEX_LEN_TABLE (VEX_LEN_3804_P_2) },
4336   },
4337
4338   /* PREFIX_VEX_3805 */
4339   {
4340     { Bad_Opcode },
4341     { Bad_Opcode },
4342     { VEX_LEN_TABLE (VEX_LEN_3805_P_2) },
4343   },
4344
4345   /* PREFIX_VEX_3806 */
4346   {
4347     { Bad_Opcode },
4348     { Bad_Opcode },
4349     { VEX_LEN_TABLE (VEX_LEN_3806_P_2) },
4350   },
4351
4352   /* PREFIX_VEX_3807 */
4353   {
4354     { Bad_Opcode },
4355     { Bad_Opcode },
4356     { VEX_LEN_TABLE (VEX_LEN_3807_P_2) },
4357   },
4358
4359   /* PREFIX_VEX_3808 */
4360   {
4361     { Bad_Opcode },
4362     { Bad_Opcode },
4363     { VEX_LEN_TABLE (VEX_LEN_3808_P_2) },
4364   },
4365
4366   /* PREFIX_VEX_3809 */
4367   {
4368     { Bad_Opcode },
4369     { Bad_Opcode },
4370     { VEX_LEN_TABLE (VEX_LEN_3809_P_2) },
4371   },
4372
4373   /* PREFIX_VEX_380A */
4374   {
4375     { Bad_Opcode },
4376     { Bad_Opcode },
4377     { VEX_LEN_TABLE (VEX_LEN_380A_P_2) },
4378   },
4379
4380   /* PREFIX_VEX_380B */
4381   {
4382     { Bad_Opcode },
4383     { Bad_Opcode },
4384     { VEX_LEN_TABLE (VEX_LEN_380B_P_2) },
4385   },
4386
4387   /* PREFIX_VEX_380C */
4388   {
4389     { Bad_Opcode },
4390     { Bad_Opcode },
4391     { VEX_W_TABLE (VEX_W_380C_P_2) },
4392   },
4393
4394   /* PREFIX_VEX_380D */
4395   {
4396     { Bad_Opcode },
4397     { Bad_Opcode },
4398     { VEX_W_TABLE (VEX_W_380D_P_2) },
4399   },
4400
4401   /* PREFIX_VEX_380E */
4402   {
4403     { Bad_Opcode },
4404     { Bad_Opcode },
4405     { VEX_W_TABLE (VEX_W_380E_P_2) },
4406   },
4407
4408   /* PREFIX_VEX_380F */
4409   {
4410     { Bad_Opcode },
4411     { Bad_Opcode },
4412     { VEX_W_TABLE (VEX_W_380F_P_2) },
4413   },
4414
4415   /* PREFIX_VEX_3817 */
4416   {
4417     { Bad_Opcode },
4418     { Bad_Opcode },
4419     { VEX_W_TABLE (VEX_W_3817_P_2) },
4420   },
4421
4422   /* PREFIX_VEX_3818 */
4423   {
4424     { Bad_Opcode },
4425     { Bad_Opcode },
4426     { MOD_TABLE (MOD_VEX_3818_PREFIX_2) },
4427   },
4428
4429   /* PREFIX_VEX_3819 */
4430   {
4431     { Bad_Opcode },
4432     { Bad_Opcode },
4433     { MOD_TABLE (MOD_VEX_3819_PREFIX_2) },
4434   },
4435
4436   /* PREFIX_VEX_381A */
4437   {
4438     { Bad_Opcode },
4439     { Bad_Opcode },
4440     { MOD_TABLE (MOD_VEX_381A_PREFIX_2) },
4441   },
4442
4443   /* PREFIX_VEX_381C */
4444   {
4445     { Bad_Opcode },
4446     { Bad_Opcode },
4447     { VEX_LEN_TABLE (VEX_LEN_381C_P_2) },
4448   },
4449
4450   /* PREFIX_VEX_381D */
4451   {
4452     { Bad_Opcode },
4453     { Bad_Opcode },
4454     { VEX_LEN_TABLE (VEX_LEN_381D_P_2) },
4455   },
4456
4457   /* PREFIX_VEX_381E */
4458   {
4459     { Bad_Opcode },
4460     { Bad_Opcode },
4461     { VEX_LEN_TABLE (VEX_LEN_381E_P_2) },
4462   },
4463
4464   /* PREFIX_VEX_3820 */
4465   {
4466     { Bad_Opcode },
4467     { Bad_Opcode },
4468     { VEX_LEN_TABLE (VEX_LEN_3820_P_2) },
4469   },
4470
4471   /* PREFIX_VEX_3821 */
4472   {
4473     { Bad_Opcode },
4474     { Bad_Opcode },
4475     { VEX_LEN_TABLE (VEX_LEN_3821_P_2) },
4476   },
4477
4478   /* PREFIX_VEX_3822 */
4479   {
4480     { Bad_Opcode },
4481     { Bad_Opcode },
4482     { VEX_LEN_TABLE (VEX_LEN_3822_P_2) },
4483   },
4484
4485   /* PREFIX_VEX_3823 */
4486   {
4487     { Bad_Opcode },
4488     { Bad_Opcode },
4489     { VEX_LEN_TABLE (VEX_LEN_3823_P_2) },
4490   },
4491
4492   /* PREFIX_VEX_3824 */
4493   {
4494     { Bad_Opcode },
4495     { Bad_Opcode },
4496     { VEX_LEN_TABLE (VEX_LEN_3824_P_2) },
4497   },
4498
4499   /* PREFIX_VEX_3825 */
4500   {
4501     { Bad_Opcode },
4502     { Bad_Opcode },
4503     { VEX_LEN_TABLE (VEX_LEN_3825_P_2) },
4504   },
4505
4506   /* PREFIX_VEX_3828 */
4507   {
4508     { Bad_Opcode },
4509     { Bad_Opcode },
4510     { VEX_LEN_TABLE (VEX_LEN_3828_P_2) },
4511   },
4512
4513   /* PREFIX_VEX_3829 */
4514   {
4515     { Bad_Opcode },
4516     { Bad_Opcode },
4517     { VEX_LEN_TABLE (VEX_LEN_3829_P_2) },
4518   },
4519
4520   /* PREFIX_VEX_382A */
4521   {
4522     { Bad_Opcode },
4523     { Bad_Opcode },
4524     { MOD_TABLE (MOD_VEX_382A_PREFIX_2) },
4525   },
4526
4527   /* PREFIX_VEX_382B */
4528   {
4529     { Bad_Opcode },
4530     { Bad_Opcode },
4531     { VEX_LEN_TABLE (VEX_LEN_382B_P_2) },
4532   },
4533
4534   /* PREFIX_VEX_382C */
4535   {
4536     { Bad_Opcode },
4537     { Bad_Opcode },
4538      { MOD_TABLE (MOD_VEX_382C_PREFIX_2) },
4539   },
4540
4541   /* PREFIX_VEX_382D */
4542   {
4543     { Bad_Opcode },
4544     { Bad_Opcode },
4545      { MOD_TABLE (MOD_VEX_382D_PREFIX_2) },
4546   },
4547
4548   /* PREFIX_VEX_382E */
4549   {
4550     { Bad_Opcode },
4551     { Bad_Opcode },
4552      { MOD_TABLE (MOD_VEX_382E_PREFIX_2) },
4553   },
4554
4555   /* PREFIX_VEX_382F */
4556   {
4557     { Bad_Opcode },
4558     { Bad_Opcode },
4559      { MOD_TABLE (MOD_VEX_382F_PREFIX_2) },
4560   },
4561
4562   /* PREFIX_VEX_3830 */
4563   {
4564     { Bad_Opcode },
4565     { Bad_Opcode },
4566     { VEX_LEN_TABLE (VEX_LEN_3830_P_2) },
4567   },
4568
4569   /* PREFIX_VEX_3831 */
4570   {
4571     { Bad_Opcode },
4572     { Bad_Opcode },
4573     { VEX_LEN_TABLE (VEX_LEN_3831_P_2) },
4574   },
4575
4576   /* PREFIX_VEX_3832 */
4577   {
4578     { Bad_Opcode },
4579     { Bad_Opcode },
4580     { VEX_LEN_TABLE (VEX_LEN_3832_P_2) },
4581   },
4582
4583   /* PREFIX_VEX_3833 */
4584   {
4585     { Bad_Opcode },
4586     { Bad_Opcode },
4587     { VEX_LEN_TABLE (VEX_LEN_3833_P_2) },
4588   },
4589
4590   /* PREFIX_VEX_3834 */
4591   {
4592     { Bad_Opcode },
4593     { Bad_Opcode },
4594     { VEX_LEN_TABLE (VEX_LEN_3834_P_2) },
4595   },
4596
4597   /* PREFIX_VEX_3835 */
4598   {
4599     { Bad_Opcode },
4600     { Bad_Opcode },
4601     { VEX_LEN_TABLE (VEX_LEN_3835_P_2) },
4602   },
4603
4604   /* PREFIX_VEX_3837 */
4605   {
4606     { Bad_Opcode },
4607     { Bad_Opcode },
4608     { VEX_LEN_TABLE (VEX_LEN_3837_P_2) },
4609   },
4610
4611   /* PREFIX_VEX_3838 */
4612   {
4613     { Bad_Opcode },
4614     { Bad_Opcode },
4615     { VEX_LEN_TABLE (VEX_LEN_3838_P_2) },
4616   },
4617
4618   /* PREFIX_VEX_3839 */
4619   {
4620     { Bad_Opcode },
4621     { Bad_Opcode },
4622     { VEX_LEN_TABLE (VEX_LEN_3839_P_2) },
4623   },
4624
4625   /* PREFIX_VEX_383A */
4626   {
4627     { Bad_Opcode },
4628     { Bad_Opcode },
4629     { VEX_LEN_TABLE (VEX_LEN_383A_P_2) },
4630   },
4631
4632   /* PREFIX_VEX_383B */
4633   {
4634     { Bad_Opcode },
4635     { Bad_Opcode },
4636     { VEX_LEN_TABLE (VEX_LEN_383B_P_2) },
4637   },
4638
4639   /* PREFIX_VEX_383C */
4640   {
4641     { Bad_Opcode },
4642     { Bad_Opcode },
4643     { VEX_LEN_TABLE (VEX_LEN_383C_P_2) },
4644   },
4645
4646   /* PREFIX_VEX_383D */
4647   {
4648     { Bad_Opcode },
4649     { Bad_Opcode },
4650     { VEX_LEN_TABLE (VEX_LEN_383D_P_2) },
4651   },
4652
4653   /* PREFIX_VEX_383E */
4654   {
4655     { Bad_Opcode },
4656     { Bad_Opcode },
4657     { VEX_LEN_TABLE (VEX_LEN_383E_P_2) },
4658   },
4659
4660   /* PREFIX_VEX_383F */
4661   {
4662     { Bad_Opcode },
4663     { Bad_Opcode },
4664     { VEX_LEN_TABLE (VEX_LEN_383F_P_2) },
4665   },
4666
4667   /* PREFIX_VEX_3840 */
4668   {
4669     { Bad_Opcode },
4670     { Bad_Opcode },
4671     { VEX_LEN_TABLE (VEX_LEN_3840_P_2) },
4672   },
4673
4674   /* PREFIX_VEX_3841 */
4675   {
4676     { Bad_Opcode },
4677     { Bad_Opcode },
4678     { VEX_LEN_TABLE (VEX_LEN_3841_P_2) },
4679   },
4680
4681   /* PREFIX_VEX_3896 */
4682   {
4683     { Bad_Opcode },
4684     { Bad_Opcode },
4685     { "vfmaddsub132p%XW", { XM, Vex, EXx } },
4686   },
4687
4688   /* PREFIX_VEX_3897 */
4689   {
4690     { Bad_Opcode },
4691     { Bad_Opcode },
4692     { "vfmsubadd132p%XW", { XM, Vex, EXx } },
4693   },
4694
4695   /* PREFIX_VEX_3898 */
4696   {
4697     { Bad_Opcode },
4698     { Bad_Opcode },
4699     { "vfmadd132p%XW", { XM, Vex, EXx } },
4700   },
4701
4702   /* PREFIX_VEX_3899 */
4703   {
4704     { Bad_Opcode },
4705     { Bad_Opcode },
4706     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4707   },
4708
4709   /* PREFIX_VEX_389A */
4710   {
4711     { Bad_Opcode },
4712     { Bad_Opcode },
4713     { "vfmsub132p%XW", { XM, Vex, EXx } },
4714   },
4715
4716   /* PREFIX_VEX_389B */
4717   {
4718     { Bad_Opcode },
4719     { Bad_Opcode },
4720     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4721   },
4722
4723   /* PREFIX_VEX_389C */
4724   {
4725     { Bad_Opcode },
4726     { Bad_Opcode },
4727     { "vfnmadd132p%XW", { XM, Vex, EXx } },
4728   },
4729
4730   /* PREFIX_VEX_389D */
4731   {
4732     { Bad_Opcode },
4733     { Bad_Opcode },
4734     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4735   },
4736
4737   /* PREFIX_VEX_389E */
4738   {
4739     { Bad_Opcode },
4740     { Bad_Opcode },
4741     { "vfnmsub132p%XW", { XM, Vex, EXx } },
4742   },
4743
4744   /* PREFIX_VEX_389F */
4745   {
4746     { Bad_Opcode },
4747     { Bad_Opcode },
4748     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4749   },
4750
4751   /* PREFIX_VEX_38A6 */
4752   {
4753     { Bad_Opcode },
4754     { Bad_Opcode },
4755     { "vfmaddsub213p%XW", { XM, Vex, EXx } },
4756     { Bad_Opcode },
4757   },
4758
4759   /* PREFIX_VEX_38A7 */
4760   {
4761     { Bad_Opcode },
4762     { Bad_Opcode },
4763     { "vfmsubadd213p%XW", { XM, Vex, EXx } },
4764   },
4765
4766   /* PREFIX_VEX_38A8 */
4767   {
4768     { Bad_Opcode },
4769     { Bad_Opcode },
4770     { "vfmadd213p%XW", { XM, Vex, EXx } },
4771   },
4772
4773   /* PREFIX_VEX_38A9 */
4774   {
4775     { Bad_Opcode },
4776     { Bad_Opcode },
4777     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4778   },
4779
4780   /* PREFIX_VEX_38AA */
4781   {
4782     { Bad_Opcode },
4783     { Bad_Opcode },
4784     { "vfmsub213p%XW", { XM, Vex, EXx } },
4785   },
4786
4787   /* PREFIX_VEX_38AB */
4788   {
4789     { Bad_Opcode },
4790     { Bad_Opcode },
4791     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4792   },
4793
4794   /* PREFIX_VEX_38AC */
4795   {
4796     { Bad_Opcode },
4797     { Bad_Opcode },
4798     { "vfnmadd213p%XW", { XM, Vex, EXx } },
4799   },
4800
4801   /* PREFIX_VEX_38AD */
4802   {
4803     { Bad_Opcode },
4804     { Bad_Opcode },
4805     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4806   },
4807
4808   /* PREFIX_VEX_38AE */
4809   {
4810     { Bad_Opcode },
4811     { Bad_Opcode },
4812     { "vfnmsub213p%XW", { XM, Vex, EXx } },
4813   },
4814
4815   /* PREFIX_VEX_38AF */
4816   {
4817     { Bad_Opcode },
4818     { Bad_Opcode },
4819     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4820   },
4821
4822   /* PREFIX_VEX_38B6 */
4823   {
4824     { Bad_Opcode },
4825     { Bad_Opcode },
4826     { "vfmaddsub231p%XW", { XM, Vex, EXx } },
4827   },
4828
4829   /* PREFIX_VEX_38B7 */
4830   {
4831     { Bad_Opcode },
4832     { Bad_Opcode },
4833     { "vfmsubadd231p%XW", { XM, Vex, EXx } },
4834   },
4835
4836   /* PREFIX_VEX_38B8 */
4837   {
4838     { Bad_Opcode },
4839     { Bad_Opcode },
4840     { "vfmadd231p%XW", { XM, Vex, EXx } },
4841   },
4842
4843   /* PREFIX_VEX_38B9 */
4844   {
4845     { Bad_Opcode },
4846     { Bad_Opcode },
4847     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4848   },
4849
4850   /* PREFIX_VEX_38BA */
4851   {
4852     { Bad_Opcode },
4853     { Bad_Opcode },
4854     { "vfmsub231p%XW", { XM, Vex, EXx } },
4855   },
4856
4857   /* PREFIX_VEX_38BB */
4858   {
4859     { Bad_Opcode },
4860     { Bad_Opcode },
4861     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4862   },
4863
4864   /* PREFIX_VEX_38BC */
4865   {
4866     { Bad_Opcode },
4867     { Bad_Opcode },
4868     { "vfnmadd231p%XW", { XM, Vex, EXx } },
4869   },
4870
4871   /* PREFIX_VEX_38BD */
4872   {
4873     { Bad_Opcode },
4874     { Bad_Opcode },
4875     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4876   },
4877
4878   /* PREFIX_VEX_38BE */
4879   {
4880     { Bad_Opcode },
4881     { Bad_Opcode },
4882     { "vfnmsub231p%XW", { XM, Vex, EXx } },
4883   },
4884
4885   /* PREFIX_VEX_38BF */
4886   {
4887     { Bad_Opcode },
4888     { Bad_Opcode },
4889     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
4890   },
4891
4892   /* PREFIX_VEX_38DB */
4893   {
4894     { Bad_Opcode },
4895     { Bad_Opcode },
4896     { VEX_LEN_TABLE (VEX_LEN_38DB_P_2) },
4897   },
4898
4899   /* PREFIX_VEX_38DC */
4900   {
4901     { Bad_Opcode },
4902     { Bad_Opcode },
4903     { VEX_LEN_TABLE (VEX_LEN_38DC_P_2) },
4904   },
4905
4906   /* PREFIX_VEX_38DD */
4907   {
4908     { Bad_Opcode },
4909     { Bad_Opcode },
4910     { VEX_LEN_TABLE (VEX_LEN_38DD_P_2) },
4911   },
4912
4913   /* PREFIX_VEX_38DE */
4914   {
4915     { Bad_Opcode },
4916     { Bad_Opcode },
4917     { VEX_LEN_TABLE (VEX_LEN_38DE_P_2) },
4918   },
4919
4920   /* PREFIX_VEX_38DF */
4921   {
4922     { Bad_Opcode },
4923     { Bad_Opcode },
4924     { VEX_LEN_TABLE (VEX_LEN_38DF_P_2) },
4925   },
4926
4927   /* PREFIX_VEX_3A04 */
4928   {
4929     { Bad_Opcode },
4930     { Bad_Opcode },
4931     { VEX_W_TABLE (VEX_W_3A04_P_2) },
4932   },
4933
4934   /* PREFIX_VEX_3A05 */
4935   {
4936     { Bad_Opcode },
4937     { Bad_Opcode },
4938     { VEX_W_TABLE (VEX_W_3A05_P_2) },
4939   },
4940
4941   /* PREFIX_VEX_3A06 */
4942   {
4943     { Bad_Opcode },
4944     { Bad_Opcode },
4945     { VEX_LEN_TABLE (VEX_LEN_3A06_P_2) },
4946   },
4947
4948   /* PREFIX_VEX_3A08 */
4949   {
4950     { Bad_Opcode },
4951     { Bad_Opcode },
4952     { VEX_W_TABLE (VEX_W_3A08_P_2) },
4953   },
4954
4955   /* PREFIX_VEX_3A09 */
4956   {
4957     { Bad_Opcode },
4958     { Bad_Opcode },
4959     { VEX_W_TABLE (VEX_W_3A09_P_2) },
4960   },
4961
4962   /* PREFIX_VEX_3A0A */
4963   {
4964     { Bad_Opcode },
4965     { Bad_Opcode },
4966     { VEX_LEN_TABLE (VEX_LEN_3A0A_P_2) },
4967   },
4968
4969   /* PREFIX_VEX_3A0B */
4970   {
4971     { Bad_Opcode },
4972     { Bad_Opcode },
4973     { VEX_LEN_TABLE (VEX_LEN_3A0B_P_2) },
4974   },
4975
4976   /* PREFIX_VEX_3A0C */
4977   {
4978     { Bad_Opcode },
4979     { Bad_Opcode },
4980     { VEX_W_TABLE (VEX_W_3A0C_P_2) },
4981   },
4982
4983   /* PREFIX_VEX_3A0D */
4984   {
4985     { Bad_Opcode },
4986     { Bad_Opcode },
4987     { VEX_W_TABLE (VEX_W_3A0D_P_2) },
4988   },
4989
4990   /* PREFIX_VEX_3A0E */
4991   {
4992     { Bad_Opcode },
4993     { Bad_Opcode },
4994     { VEX_LEN_TABLE (VEX_LEN_3A0E_P_2) },
4995   },
4996
4997   /* PREFIX_VEX_3A0F */
4998   {
4999     { Bad_Opcode },
5000     { Bad_Opcode },
5001     { VEX_LEN_TABLE (VEX_LEN_3A0F_P_2) },
5002   },
5003
5004   /* PREFIX_VEX_3A14 */
5005   {
5006     { Bad_Opcode },
5007     { Bad_Opcode },
5008     { VEX_LEN_TABLE (VEX_LEN_3A14_P_2) },
5009   },
5010
5011   /* PREFIX_VEX_3A15 */
5012   {
5013     { Bad_Opcode },
5014     { Bad_Opcode },
5015     { VEX_LEN_TABLE (VEX_LEN_3A15_P_2) },
5016   },
5017
5018   /* PREFIX_VEX_3A16 */
5019   {
5020     { Bad_Opcode },
5021     { Bad_Opcode },
5022     { VEX_LEN_TABLE (VEX_LEN_3A16_P_2) },
5023   },
5024
5025   /* PREFIX_VEX_3A17 */
5026   {
5027     { Bad_Opcode },
5028     { Bad_Opcode },
5029     { VEX_LEN_TABLE (VEX_LEN_3A17_P_2) },
5030   },
5031
5032   /* PREFIX_VEX_3A18 */
5033   {
5034     { Bad_Opcode },
5035     { Bad_Opcode },
5036     { VEX_LEN_TABLE (VEX_LEN_3A18_P_2) },
5037   },
5038
5039   /* PREFIX_VEX_3A19 */
5040   {
5041     { Bad_Opcode },
5042     { Bad_Opcode },
5043     { VEX_LEN_TABLE (VEX_LEN_3A19_P_2) },
5044   },
5045
5046   /* PREFIX_VEX_3A20 */
5047   {
5048     { Bad_Opcode },
5049     { Bad_Opcode },
5050     { VEX_LEN_TABLE (VEX_LEN_3A20_P_2) },
5051   },
5052
5053   /* PREFIX_VEX_3A21 */
5054   {
5055     { Bad_Opcode },
5056     { Bad_Opcode },
5057     { VEX_LEN_TABLE (VEX_LEN_3A21_P_2) },
5058   },
5059
5060   /* PREFIX_VEX_3A22 */
5061   {
5062     { Bad_Opcode },
5063     { Bad_Opcode },
5064     { VEX_LEN_TABLE (VEX_LEN_3A22_P_2) },
5065   },
5066
5067   /* PREFIX_VEX_3A40 */
5068   {
5069     { Bad_Opcode },
5070     { Bad_Opcode },
5071     { VEX_W_TABLE (VEX_W_3A40_P_2) },
5072   },
5073
5074   /* PREFIX_VEX_3A41 */
5075   {
5076     { Bad_Opcode },
5077     { Bad_Opcode },
5078     { VEX_LEN_TABLE (VEX_LEN_3A41_P_2) },
5079   },
5080
5081   /* PREFIX_VEX_3A42 */
5082   {
5083     { Bad_Opcode },
5084     { Bad_Opcode },
5085     { VEX_LEN_TABLE (VEX_LEN_3A42_P_2) },
5086   },
5087
5088   /* PREFIX_VEX_3A44 */
5089   {
5090     { Bad_Opcode },
5091     { Bad_Opcode },
5092     { VEX_LEN_TABLE (VEX_LEN_3A44_P_2) },
5093   },
5094
5095   /* PREFIX_VEX_3A48 */
5096   {
5097     { Bad_Opcode },
5098     { Bad_Opcode },
5099     { VEX_W_TABLE (VEX_W_3A48_P_2) },
5100   },
5101
5102   /* PREFIX_VEX_3A49 */
5103   {
5104     { Bad_Opcode },
5105     { Bad_Opcode },
5106     { VEX_W_TABLE (VEX_W_3A49_P_2) },
5107   },
5108
5109   /* PREFIX_VEX_3A4A */
5110   {
5111     { Bad_Opcode },
5112     { Bad_Opcode },
5113     { VEX_W_TABLE (VEX_W_3A4A_P_2) },
5114   },
5115
5116   /* PREFIX_VEX_3A4B */
5117   {
5118     { Bad_Opcode },
5119     { Bad_Opcode },
5120     { VEX_W_TABLE (VEX_W_3A4B_P_2) },
5121   },
5122
5123   /* PREFIX_VEX_3A4C */
5124   {
5125     { Bad_Opcode },
5126     { Bad_Opcode },
5127     { VEX_LEN_TABLE (VEX_LEN_3A4C_P_2) },
5128   },
5129
5130   /* PREFIX_VEX_3A5C */
5131   {
5132     { Bad_Opcode },
5133     { Bad_Opcode },
5134     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5135   },
5136
5137   /* PREFIX_VEX_3A5D */
5138   {
5139     { Bad_Opcode },
5140     { Bad_Opcode },
5141     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5142   },
5143
5144   /* PREFIX_VEX_3A5E */
5145   {
5146     { Bad_Opcode },
5147     { Bad_Opcode },
5148     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5149   },
5150
5151   /* PREFIX_VEX_3A5F */
5152   {
5153     { Bad_Opcode },
5154     { Bad_Opcode },
5155     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5156   },
5157
5158   /* PREFIX_VEX_3A60 */
5159   {
5160     { Bad_Opcode },
5161     { Bad_Opcode },
5162     { VEX_LEN_TABLE (VEX_LEN_3A60_P_2) },
5163     { Bad_Opcode },
5164   },
5165
5166   /* PREFIX_VEX_3A61 */
5167   {
5168     { Bad_Opcode },
5169     { Bad_Opcode },
5170     { VEX_LEN_TABLE (VEX_LEN_3A61_P_2) },
5171   },
5172
5173   /* PREFIX_VEX_3A62 */
5174   {
5175     { Bad_Opcode },
5176     { Bad_Opcode },
5177     { VEX_LEN_TABLE (VEX_LEN_3A62_P_2) },
5178   },
5179
5180   /* PREFIX_VEX_3A63 */
5181   {
5182     { Bad_Opcode },
5183     { Bad_Opcode },
5184     { VEX_LEN_TABLE (VEX_LEN_3A63_P_2) },
5185   },
5186
5187   /* PREFIX_VEX_3A68 */
5188   {
5189     { Bad_Opcode },
5190     { Bad_Opcode },
5191     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5192   },
5193
5194   /* PREFIX_VEX_3A69 */
5195   {
5196     { Bad_Opcode },
5197     { Bad_Opcode },
5198     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5199   },
5200
5201   /* PREFIX_VEX_3A6A */
5202   {
5203     { Bad_Opcode },
5204     { Bad_Opcode },
5205     { VEX_LEN_TABLE (VEX_LEN_3A6A_P_2) },
5206   },
5207
5208   /* PREFIX_VEX_3A6B */
5209   {
5210     { Bad_Opcode },
5211     { Bad_Opcode },
5212     { VEX_LEN_TABLE (VEX_LEN_3A6B_P_2) },
5213   },
5214
5215   /* PREFIX_VEX_3A6C */
5216   {
5217     { Bad_Opcode },
5218     { Bad_Opcode },
5219     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5220   },
5221
5222   /* PREFIX_VEX_3A6D */
5223   {
5224     { Bad_Opcode },
5225     { Bad_Opcode },
5226     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5227   },
5228
5229   /* PREFIX_VEX_3A6E */
5230   {
5231     { Bad_Opcode },
5232     { Bad_Opcode },
5233     { VEX_LEN_TABLE (VEX_LEN_3A6E_P_2) },
5234   },
5235
5236   /* PREFIX_VEX_3A6F */
5237   {
5238     { Bad_Opcode },
5239     { Bad_Opcode },
5240     { VEX_LEN_TABLE (VEX_LEN_3A6F_P_2) },
5241   },
5242
5243   /* PREFIX_VEX_3A78 */
5244   {
5245     { Bad_Opcode },
5246     { Bad_Opcode },
5247     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5248   },
5249
5250   /* PREFIX_VEX_3A79 */
5251   {
5252     { Bad_Opcode },
5253     { Bad_Opcode },
5254     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5255   },
5256
5257   /* PREFIX_VEX_3A7A */
5258   {
5259     { Bad_Opcode },
5260     { Bad_Opcode },
5261     { VEX_LEN_TABLE (VEX_LEN_3A7A_P_2) },
5262   },
5263
5264   /* PREFIX_VEX_3A7B */
5265   {
5266     { Bad_Opcode },
5267     { Bad_Opcode },
5268     { VEX_LEN_TABLE (VEX_LEN_3A7B_P_2) },
5269   },
5270
5271   /* PREFIX_VEX_3A7C */
5272   {
5273     { Bad_Opcode },
5274     { Bad_Opcode },
5275     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5276     { Bad_Opcode },
5277   },
5278
5279   /* PREFIX_VEX_3A7D */
5280   {
5281     { Bad_Opcode },
5282     { Bad_Opcode },
5283     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
5284   },
5285
5286   /* PREFIX_VEX_3A7E */
5287   {
5288     { Bad_Opcode },
5289     { Bad_Opcode },
5290     { VEX_LEN_TABLE (VEX_LEN_3A7E_P_2) },
5291   },
5292
5293   /* PREFIX_VEX_3A7F */
5294   {
5295     { Bad_Opcode },
5296     { Bad_Opcode },
5297     { VEX_LEN_TABLE (VEX_LEN_3A7F_P_2) },
5298   },
5299
5300   /* PREFIX_VEX_3ADF */
5301   {
5302     { Bad_Opcode },
5303     { Bad_Opcode },
5304     { VEX_LEN_TABLE (VEX_LEN_3ADF_P_2) },
5305   },
5306 };
5307
5308 static const struct dis386 x86_64_table[][2] = {
5309   /* X86_64_06 */
5310   {
5311     { "push{T|}", { es } },
5312   },
5313
5314   /* X86_64_07 */
5315   {
5316     { "pop{T|}", { es } },
5317   },
5318
5319   /* X86_64_0D */
5320   {
5321     { "push{T|}", { cs } },
5322   },
5323
5324   /* X86_64_16 */
5325   {
5326     { "push{T|}", { ss } },
5327   },
5328
5329   /* X86_64_17 */
5330   {
5331     { "pop{T|}", { ss } },
5332   },
5333
5334   /* X86_64_1E */
5335   {
5336     { "push{T|}", { ds } },
5337   },
5338
5339   /* X86_64_1F */
5340   {
5341     { "pop{T|}", { ds } },
5342   },
5343
5344   /* X86_64_27 */
5345   {
5346     { "daa", { XX } },
5347   },
5348
5349   /* X86_64_2F */
5350   {
5351     { "das", { XX } },
5352   },
5353
5354   /* X86_64_37 */
5355   {
5356     { "aaa", { XX } },
5357   },
5358
5359   /* X86_64_3F */
5360   {
5361     { "aas", { XX } },
5362   },
5363
5364   /* X86_64_60 */
5365   {
5366     { "pusha{P|}", { XX } },
5367   },
5368
5369   /* X86_64_61 */
5370   {
5371     { "popa{P|}", { XX } },
5372   },
5373
5374   /* X86_64_62 */
5375   {
5376     { MOD_TABLE (MOD_62_32BIT) },
5377   },
5378
5379   /* X86_64_63 */
5380   {
5381     { "arpl", { Ew, Gw } },
5382     { "movs{lq|xd}", { Gv, Ed } },
5383   },
5384
5385   /* X86_64_6D */
5386   {
5387     { "ins{R|}", { Yzr, indirDX } },
5388     { "ins{G|}", { Yzr, indirDX } },
5389   },
5390
5391   /* X86_64_6F */
5392   {
5393     { "outs{R|}", { indirDXr, Xz } },
5394     { "outs{G|}", { indirDXr, Xz } },
5395   },
5396
5397   /* X86_64_9A */
5398   {
5399     { "Jcall{T|}", { Ap } },
5400   },
5401
5402   /* X86_64_C4 */
5403   {
5404     { MOD_TABLE (MOD_C4_32BIT) },
5405     { VEX_C4_TABLE (VEX_0F) },
5406   },
5407
5408   /* X86_64_C5 */
5409   {
5410     { MOD_TABLE (MOD_C5_32BIT) },
5411     { VEX_C5_TABLE (VEX_0F) },
5412   },
5413
5414   /* X86_64_CE */
5415   {
5416     { "into", { XX } },
5417   },
5418
5419   /* X86_64_D4 */
5420   {
5421     { "aam", { sIb } },
5422   },
5423
5424   /* X86_64_D5 */
5425   {
5426     { "aad", { sIb } },
5427   },
5428
5429   /* X86_64_EA */
5430   {
5431     { "Jjmp{T|}", { Ap } },
5432   },
5433
5434   /* X86_64_0F01_REG_0 */
5435   {
5436     { "sgdt{Q|IQ}", { M } },
5437     { "sgdt", { M } },
5438   },
5439
5440   /* X86_64_0F01_REG_1 */
5441   {
5442     { "sidt{Q|IQ}", { M } },
5443     { "sidt", { M } },
5444   },
5445
5446   /* X86_64_0F01_REG_2 */
5447   {
5448     { "lgdt{Q|Q}", { M } },
5449     { "lgdt", { M } },
5450   },
5451
5452   /* X86_64_0F01_REG_3 */
5453   {
5454     { "lidt{Q|Q}", { M } },
5455     { "lidt", { M } },
5456   },
5457 };
5458
5459 static const struct dis386 three_byte_table[][256] = {
5460
5461   /* THREE_BYTE_0F38 */
5462   {
5463     /* 00 */
5464     { "pshufb",         { MX, EM } },
5465     { "phaddw",         { MX, EM } },
5466     { "phaddd",         { MX, EM } },
5467     { "phaddsw",        { MX, EM } },
5468     { "pmaddubsw",      { MX, EM } },
5469     { "phsubw",         { MX, EM } },
5470     { "phsubd",         { MX, EM } },
5471     { "phsubsw",        { MX, EM } },
5472     /* 08 */
5473     { "psignb",         { MX, EM } },
5474     { "psignw",         { MX, EM } },
5475     { "psignd",         { MX, EM } },
5476     { "pmulhrsw",       { MX, EM } },
5477     { Bad_Opcode },
5478     { Bad_Opcode },
5479     { Bad_Opcode },
5480     { Bad_Opcode },
5481     /* 10 */
5482     { PREFIX_TABLE (PREFIX_0F3810) },
5483     { Bad_Opcode },
5484     { Bad_Opcode },
5485     { Bad_Opcode },
5486     { PREFIX_TABLE (PREFIX_0F3814) },
5487     { PREFIX_TABLE (PREFIX_0F3815) },
5488     { Bad_Opcode },
5489     { PREFIX_TABLE (PREFIX_0F3817) },
5490     /* 18 */
5491     { Bad_Opcode },
5492     { Bad_Opcode },
5493     { Bad_Opcode },
5494     { Bad_Opcode },
5495     { "pabsb",          { MX, EM } },
5496     { "pabsw",          { MX, EM } },
5497     { "pabsd",          { MX, EM } },
5498     { Bad_Opcode },
5499     /* 20 */
5500     { PREFIX_TABLE (PREFIX_0F3820) },
5501     { PREFIX_TABLE (PREFIX_0F3821) },
5502     { PREFIX_TABLE (PREFIX_0F3822) },
5503     { PREFIX_TABLE (PREFIX_0F3823) },
5504     { PREFIX_TABLE (PREFIX_0F3824) },
5505     { PREFIX_TABLE (PREFIX_0F3825) },
5506     { Bad_Opcode },
5507     { Bad_Opcode },
5508     /* 28 */
5509     { PREFIX_TABLE (PREFIX_0F3828) },
5510     { PREFIX_TABLE (PREFIX_0F3829) },
5511     { PREFIX_TABLE (PREFIX_0F382A) },
5512     { PREFIX_TABLE (PREFIX_0F382B) },
5513     { Bad_Opcode },
5514     { Bad_Opcode },
5515     { Bad_Opcode },
5516     { Bad_Opcode },
5517     /* 30 */
5518     { PREFIX_TABLE (PREFIX_0F3830) },
5519     { PREFIX_TABLE (PREFIX_0F3831) },
5520     { PREFIX_TABLE (PREFIX_0F3832) },
5521     { PREFIX_TABLE (PREFIX_0F3833) },
5522     { PREFIX_TABLE (PREFIX_0F3834) },
5523     { PREFIX_TABLE (PREFIX_0F3835) },
5524     { Bad_Opcode },
5525     { PREFIX_TABLE (PREFIX_0F3837) },
5526     /* 38 */
5527     { PREFIX_TABLE (PREFIX_0F3838) },
5528     { PREFIX_TABLE (PREFIX_0F3839) },
5529     { PREFIX_TABLE (PREFIX_0F383A) },
5530     { PREFIX_TABLE (PREFIX_0F383B) },
5531     { PREFIX_TABLE (PREFIX_0F383C) },
5532     { PREFIX_TABLE (PREFIX_0F383D) },
5533     { PREFIX_TABLE (PREFIX_0F383E) },
5534     { PREFIX_TABLE (PREFIX_0F383F) },
5535     /* 40 */
5536     { PREFIX_TABLE (PREFIX_0F3840) },
5537     { PREFIX_TABLE (PREFIX_0F3841) },
5538     { Bad_Opcode },
5539     { Bad_Opcode },
5540     { Bad_Opcode },
5541     { Bad_Opcode },
5542     { Bad_Opcode },
5543     { Bad_Opcode },
5544     /* 48 */
5545     { Bad_Opcode },
5546     { Bad_Opcode },
5547     { Bad_Opcode },
5548     { Bad_Opcode },
5549     { Bad_Opcode },
5550     { Bad_Opcode },
5551     { Bad_Opcode },
5552     { Bad_Opcode },
5553     /* 50 */
5554     { Bad_Opcode },
5555     { Bad_Opcode },
5556     { Bad_Opcode },
5557     { Bad_Opcode },
5558     { Bad_Opcode },
5559     { Bad_Opcode },
5560     { Bad_Opcode },
5561     { Bad_Opcode },
5562     /* 58 */
5563     { Bad_Opcode },
5564     { Bad_Opcode },
5565     { Bad_Opcode },
5566     { Bad_Opcode },
5567     { Bad_Opcode },
5568     { Bad_Opcode },
5569     { Bad_Opcode },
5570     { Bad_Opcode },
5571     /* 60 */
5572     { Bad_Opcode },
5573     { Bad_Opcode },
5574     { Bad_Opcode },
5575     { Bad_Opcode },
5576     { Bad_Opcode },
5577     { Bad_Opcode },
5578     { Bad_Opcode },
5579     { Bad_Opcode },
5580     /* 68 */
5581     { Bad_Opcode },
5582     { Bad_Opcode },
5583     { Bad_Opcode },
5584     { Bad_Opcode },
5585     { Bad_Opcode },
5586     { Bad_Opcode },
5587     { Bad_Opcode },
5588     { Bad_Opcode },
5589     /* 70 */
5590     { Bad_Opcode },
5591     { Bad_Opcode },
5592     { Bad_Opcode },
5593     { Bad_Opcode },
5594     { Bad_Opcode },
5595     { Bad_Opcode },
5596     { Bad_Opcode },
5597     { Bad_Opcode },
5598     /* 78 */
5599     { Bad_Opcode },
5600     { Bad_Opcode },
5601     { Bad_Opcode },
5602     { Bad_Opcode },
5603     { Bad_Opcode },
5604     { Bad_Opcode },
5605     { Bad_Opcode },
5606     { Bad_Opcode },
5607     /* 80 */
5608     { PREFIX_TABLE (PREFIX_0F3880) },
5609     { PREFIX_TABLE (PREFIX_0F3881) },
5610     { Bad_Opcode },
5611     { Bad_Opcode },
5612     { Bad_Opcode },
5613     { Bad_Opcode },
5614     { Bad_Opcode },
5615     { Bad_Opcode },
5616     /* 88 */
5617     { Bad_Opcode },
5618     { Bad_Opcode },
5619     { Bad_Opcode },
5620     { Bad_Opcode },
5621     { Bad_Opcode },
5622     { Bad_Opcode },
5623     { Bad_Opcode },
5624     { Bad_Opcode },
5625     /* 90 */
5626     { Bad_Opcode },
5627     { Bad_Opcode },
5628     { Bad_Opcode },
5629     { Bad_Opcode },
5630     { Bad_Opcode },
5631     { Bad_Opcode },
5632     { Bad_Opcode },
5633     { Bad_Opcode },
5634     /* 98 */
5635     { Bad_Opcode },
5636     { Bad_Opcode },
5637     { Bad_Opcode },
5638     { Bad_Opcode },
5639     { Bad_Opcode },
5640     { Bad_Opcode },
5641     { Bad_Opcode },
5642     { Bad_Opcode },
5643     /* a0 */
5644     { Bad_Opcode },
5645     { Bad_Opcode },
5646     { Bad_Opcode },
5647     { Bad_Opcode },
5648     { Bad_Opcode },
5649     { Bad_Opcode },
5650     { Bad_Opcode },
5651     { Bad_Opcode },
5652     /* a8 */
5653     { Bad_Opcode },
5654     { Bad_Opcode },
5655     { Bad_Opcode },
5656     { Bad_Opcode },
5657     { Bad_Opcode },
5658     { Bad_Opcode },
5659     { Bad_Opcode },
5660     { Bad_Opcode },
5661     /* b0 */
5662     { Bad_Opcode },
5663     { Bad_Opcode },
5664     { Bad_Opcode },
5665     { Bad_Opcode },
5666     { Bad_Opcode },
5667     { Bad_Opcode },
5668     { Bad_Opcode },
5669     { Bad_Opcode },
5670     /* b8 */
5671     { Bad_Opcode },
5672     { Bad_Opcode },
5673     { Bad_Opcode },
5674     { Bad_Opcode },
5675     { Bad_Opcode },
5676     { Bad_Opcode },
5677     { Bad_Opcode },
5678     { Bad_Opcode },
5679     /* c0 */
5680     { Bad_Opcode },
5681     { Bad_Opcode },
5682     { Bad_Opcode },
5683     { Bad_Opcode },
5684     { Bad_Opcode },
5685     { Bad_Opcode },
5686     { Bad_Opcode },
5687     { Bad_Opcode },
5688     /* c8 */
5689     { Bad_Opcode },
5690     { Bad_Opcode },
5691     { Bad_Opcode },
5692     { Bad_Opcode },
5693     { Bad_Opcode },
5694     { Bad_Opcode },
5695     { Bad_Opcode },
5696     { Bad_Opcode },
5697     /* d0 */
5698     { Bad_Opcode },
5699     { Bad_Opcode },
5700     { Bad_Opcode },
5701     { Bad_Opcode },
5702     { Bad_Opcode },
5703     { Bad_Opcode },
5704     { Bad_Opcode },
5705     { Bad_Opcode },
5706     /* d8 */
5707     { Bad_Opcode },
5708     { Bad_Opcode },
5709     { Bad_Opcode },
5710     { PREFIX_TABLE (PREFIX_0F38DB) },
5711     { PREFIX_TABLE (PREFIX_0F38DC) },
5712     { PREFIX_TABLE (PREFIX_0F38DD) },
5713     { PREFIX_TABLE (PREFIX_0F38DE) },
5714     { PREFIX_TABLE (PREFIX_0F38DF) },
5715     /* e0 */
5716     { Bad_Opcode },
5717     { Bad_Opcode },
5718     { Bad_Opcode },
5719     { Bad_Opcode },
5720     { Bad_Opcode },
5721     { Bad_Opcode },
5722     { Bad_Opcode },
5723     { Bad_Opcode },
5724     /* e8 */
5725     { Bad_Opcode },
5726     { Bad_Opcode },
5727     { Bad_Opcode },
5728     { Bad_Opcode },
5729     { Bad_Opcode },
5730     { Bad_Opcode },
5731     { Bad_Opcode },
5732     { Bad_Opcode },
5733     /* f0 */
5734     { PREFIX_TABLE (PREFIX_0F38F0) },
5735     { PREFIX_TABLE (PREFIX_0F38F1) },
5736     { Bad_Opcode },
5737     { Bad_Opcode },
5738     { Bad_Opcode },
5739     { Bad_Opcode },
5740     { Bad_Opcode },
5741     { Bad_Opcode },
5742     /* f8 */
5743     { Bad_Opcode },
5744     { Bad_Opcode },
5745     { Bad_Opcode },
5746     { Bad_Opcode },
5747     { Bad_Opcode },
5748     { Bad_Opcode },
5749     { Bad_Opcode },
5750     { Bad_Opcode },
5751   },
5752   /* THREE_BYTE_0F3A */
5753   {
5754     /* 00 */
5755     { Bad_Opcode },
5756     { Bad_Opcode },
5757     { Bad_Opcode },
5758     { Bad_Opcode },
5759     { Bad_Opcode },
5760     { Bad_Opcode },
5761     { Bad_Opcode },
5762     { Bad_Opcode },
5763     /* 08 */
5764     { PREFIX_TABLE (PREFIX_0F3A08) },
5765     { PREFIX_TABLE (PREFIX_0F3A09) },
5766     { PREFIX_TABLE (PREFIX_0F3A0A) },
5767     { PREFIX_TABLE (PREFIX_0F3A0B) },
5768     { PREFIX_TABLE (PREFIX_0F3A0C) },
5769     { PREFIX_TABLE (PREFIX_0F3A0D) },
5770     { PREFIX_TABLE (PREFIX_0F3A0E) },
5771     { "palignr",        { MX, EM, Ib } },
5772     /* 10 */
5773     { Bad_Opcode },
5774     { Bad_Opcode },
5775     { Bad_Opcode },
5776     { Bad_Opcode },
5777     { PREFIX_TABLE (PREFIX_0F3A14) },
5778     { PREFIX_TABLE (PREFIX_0F3A15) },
5779     { PREFIX_TABLE (PREFIX_0F3A16) },
5780     { PREFIX_TABLE (PREFIX_0F3A17) },
5781     /* 18 */
5782     { Bad_Opcode },
5783     { Bad_Opcode },
5784     { Bad_Opcode },
5785     { Bad_Opcode },
5786     { Bad_Opcode },
5787     { Bad_Opcode },
5788     { Bad_Opcode },
5789     { Bad_Opcode },
5790     /* 20 */
5791     { PREFIX_TABLE (PREFIX_0F3A20) },
5792     { PREFIX_TABLE (PREFIX_0F3A21) },
5793     { PREFIX_TABLE (PREFIX_0F3A22) },
5794     { Bad_Opcode },
5795     { Bad_Opcode },
5796     { Bad_Opcode },
5797     { Bad_Opcode },
5798     { Bad_Opcode },
5799     /* 28 */
5800     { Bad_Opcode },
5801     { Bad_Opcode },
5802     { Bad_Opcode },
5803     { Bad_Opcode },
5804     { Bad_Opcode },
5805     { Bad_Opcode },
5806     { Bad_Opcode },
5807     { Bad_Opcode },
5808     /* 30 */
5809     { Bad_Opcode },
5810     { Bad_Opcode },
5811     { Bad_Opcode },
5812     { Bad_Opcode },
5813     { Bad_Opcode },
5814     { Bad_Opcode },
5815     { Bad_Opcode },
5816     { Bad_Opcode },
5817     /* 38 */
5818     { Bad_Opcode },
5819     { Bad_Opcode },
5820     { Bad_Opcode },
5821     { Bad_Opcode },
5822     { Bad_Opcode },
5823     { Bad_Opcode },
5824     { Bad_Opcode },
5825     { Bad_Opcode },
5826     /* 40 */
5827     { PREFIX_TABLE (PREFIX_0F3A40) },
5828     { PREFIX_TABLE (PREFIX_0F3A41) },
5829     { PREFIX_TABLE (PREFIX_0F3A42) },
5830     { Bad_Opcode },
5831     { PREFIX_TABLE (PREFIX_0F3A44) },
5832     { Bad_Opcode },
5833     { Bad_Opcode },
5834     { Bad_Opcode },
5835     /* 48 */
5836     { Bad_Opcode },
5837     { Bad_Opcode },
5838     { Bad_Opcode },
5839     { Bad_Opcode },
5840     { Bad_Opcode },
5841     { Bad_Opcode },
5842     { Bad_Opcode },
5843     { Bad_Opcode },
5844     /* 50 */
5845     { Bad_Opcode },
5846     { Bad_Opcode },
5847     { Bad_Opcode },
5848     { Bad_Opcode },
5849     { Bad_Opcode },
5850     { Bad_Opcode },
5851     { Bad_Opcode },
5852     { Bad_Opcode },
5853     /* 58 */
5854     { Bad_Opcode },
5855     { Bad_Opcode },
5856     { Bad_Opcode },
5857     { Bad_Opcode },
5858     { Bad_Opcode },
5859     { Bad_Opcode },
5860     { Bad_Opcode },
5861     { Bad_Opcode },
5862     /* 60 */
5863     { PREFIX_TABLE (PREFIX_0F3A60) },
5864     { PREFIX_TABLE (PREFIX_0F3A61) },
5865     { PREFIX_TABLE (PREFIX_0F3A62) },
5866     { PREFIX_TABLE (PREFIX_0F3A63) },
5867     { Bad_Opcode },
5868     { Bad_Opcode },
5869     { Bad_Opcode },
5870     { Bad_Opcode },
5871     /* 68 */
5872     { Bad_Opcode },
5873     { Bad_Opcode },
5874     { Bad_Opcode },
5875     { Bad_Opcode },
5876     { Bad_Opcode },
5877     { Bad_Opcode },
5878     { Bad_Opcode },
5879     { Bad_Opcode },
5880     /* 70 */
5881     { Bad_Opcode },
5882     { Bad_Opcode },
5883     { Bad_Opcode },
5884     { Bad_Opcode },
5885     { Bad_Opcode },
5886     { Bad_Opcode },
5887     { Bad_Opcode },
5888     { Bad_Opcode },
5889     /* 78 */
5890     { Bad_Opcode },
5891     { Bad_Opcode },
5892     { Bad_Opcode },
5893     { Bad_Opcode },
5894     { Bad_Opcode },
5895     { Bad_Opcode },
5896     { Bad_Opcode },
5897     { Bad_Opcode },
5898     /* 80 */
5899     { Bad_Opcode },
5900     { Bad_Opcode },
5901     { Bad_Opcode },
5902     { Bad_Opcode },
5903     { Bad_Opcode },
5904     { Bad_Opcode },
5905     { Bad_Opcode },
5906     { Bad_Opcode },
5907     /* 88 */
5908     { Bad_Opcode },
5909     { Bad_Opcode },
5910     { Bad_Opcode },
5911     { Bad_Opcode },
5912     { Bad_Opcode },
5913     { Bad_Opcode },
5914     { Bad_Opcode },
5915     { Bad_Opcode },
5916     /* 90 */
5917     { Bad_Opcode },
5918     { Bad_Opcode },
5919     { Bad_Opcode },
5920     { Bad_Opcode },
5921     { Bad_Opcode },
5922     { Bad_Opcode },
5923     { Bad_Opcode },
5924     { Bad_Opcode },
5925     /* 98 */
5926     { Bad_Opcode },
5927     { Bad_Opcode },
5928     { Bad_Opcode },
5929     { Bad_Opcode },
5930     { Bad_Opcode },
5931     { Bad_Opcode },
5932     { Bad_Opcode },
5933     { Bad_Opcode },
5934     /* a0 */
5935     { Bad_Opcode },
5936     { Bad_Opcode },
5937     { Bad_Opcode },
5938     { Bad_Opcode },
5939     { Bad_Opcode },
5940     { Bad_Opcode },
5941     { Bad_Opcode },
5942     { Bad_Opcode },
5943     /* a8 */
5944     { Bad_Opcode },
5945     { Bad_Opcode },
5946     { Bad_Opcode },
5947     { Bad_Opcode },
5948     { Bad_Opcode },
5949     { Bad_Opcode },
5950     { Bad_Opcode },
5951     { Bad_Opcode },
5952     /* b0 */
5953     { Bad_Opcode },
5954     { Bad_Opcode },
5955     { Bad_Opcode },
5956     { Bad_Opcode },
5957     { Bad_Opcode },
5958     { Bad_Opcode },
5959     { Bad_Opcode },
5960     { Bad_Opcode },
5961     /* b8 */
5962     { Bad_Opcode },
5963     { Bad_Opcode },
5964     { Bad_Opcode },
5965     { Bad_Opcode },
5966     { Bad_Opcode },
5967     { Bad_Opcode },
5968     { Bad_Opcode },
5969     { Bad_Opcode },
5970     /* c0 */
5971     { Bad_Opcode },
5972     { Bad_Opcode },
5973     { Bad_Opcode },
5974     { Bad_Opcode },
5975     { Bad_Opcode },
5976     { Bad_Opcode },
5977     { Bad_Opcode },
5978     { Bad_Opcode },
5979     /* c8 */
5980     { Bad_Opcode },
5981     { Bad_Opcode },
5982     { Bad_Opcode },
5983     { Bad_Opcode },
5984     { Bad_Opcode },
5985     { Bad_Opcode },
5986     { Bad_Opcode },
5987     { Bad_Opcode },
5988     /* d0 */
5989     { Bad_Opcode },
5990     { Bad_Opcode },
5991     { Bad_Opcode },
5992     { Bad_Opcode },
5993     { Bad_Opcode },
5994     { Bad_Opcode },
5995     { Bad_Opcode },
5996     { Bad_Opcode },
5997     /* d8 */
5998     { Bad_Opcode },
5999     { Bad_Opcode },
6000     { Bad_Opcode },
6001     { Bad_Opcode },
6002     { Bad_Opcode },
6003     { Bad_Opcode },
6004     { Bad_Opcode },
6005     { PREFIX_TABLE (PREFIX_0F3ADF) },
6006     /* e0 */
6007     { Bad_Opcode },
6008     { Bad_Opcode },
6009     { Bad_Opcode },
6010     { Bad_Opcode },
6011     { Bad_Opcode },
6012     { Bad_Opcode },
6013     { Bad_Opcode },
6014     { Bad_Opcode },
6015     /* e8 */
6016     { Bad_Opcode },
6017     { Bad_Opcode },
6018     { Bad_Opcode },
6019     { Bad_Opcode },
6020     { Bad_Opcode },
6021     { Bad_Opcode },
6022     { Bad_Opcode },
6023     { Bad_Opcode },
6024     /* f0 */
6025     { Bad_Opcode },
6026     { Bad_Opcode },
6027     { Bad_Opcode },
6028     { Bad_Opcode },
6029     { Bad_Opcode },
6030     { Bad_Opcode },
6031     { Bad_Opcode },
6032     { Bad_Opcode },
6033     /* f8 */
6034     { Bad_Opcode },
6035     { Bad_Opcode },
6036     { Bad_Opcode },
6037     { Bad_Opcode },
6038     { Bad_Opcode },
6039     { Bad_Opcode },
6040     { Bad_Opcode },
6041     { Bad_Opcode },
6042   },
6043
6044   /* THREE_BYTE_0F7A */
6045   {
6046     /* 00 */
6047     { Bad_Opcode },
6048     { Bad_Opcode },
6049     { Bad_Opcode },
6050     { Bad_Opcode },
6051     { Bad_Opcode },
6052     { Bad_Opcode },
6053     { Bad_Opcode },
6054     { Bad_Opcode },
6055     /* 08 */
6056     { Bad_Opcode },
6057     { Bad_Opcode },
6058     { Bad_Opcode },
6059     { Bad_Opcode },
6060     { Bad_Opcode },
6061     { Bad_Opcode },
6062     { Bad_Opcode },
6063     { Bad_Opcode },
6064     /* 10 */
6065     { Bad_Opcode },
6066     { Bad_Opcode },
6067     { Bad_Opcode },
6068     { Bad_Opcode },
6069     { Bad_Opcode },
6070     { Bad_Opcode },
6071     { Bad_Opcode },
6072     { Bad_Opcode },
6073     /* 18 */
6074     { Bad_Opcode },
6075     { Bad_Opcode },
6076     { Bad_Opcode },
6077     { Bad_Opcode },
6078     { Bad_Opcode },
6079     { Bad_Opcode },
6080     { Bad_Opcode },
6081     { Bad_Opcode },
6082     /* 20 */
6083     { "ptest",          { XX } },
6084     { Bad_Opcode },
6085     { Bad_Opcode },
6086     { Bad_Opcode },
6087     { Bad_Opcode },
6088     { Bad_Opcode },
6089     { Bad_Opcode },
6090     { Bad_Opcode },
6091     /* 28 */
6092     { Bad_Opcode },
6093     { Bad_Opcode },
6094     { Bad_Opcode },
6095     { Bad_Opcode },
6096     { Bad_Opcode },
6097     { Bad_Opcode },
6098     { Bad_Opcode },
6099     { Bad_Opcode },
6100     /* 30 */
6101     { Bad_Opcode },
6102     { Bad_Opcode },
6103     { Bad_Opcode },
6104     { Bad_Opcode },
6105     { Bad_Opcode },
6106     { Bad_Opcode },
6107     { Bad_Opcode },
6108     { Bad_Opcode },
6109     /* 38 */
6110     { Bad_Opcode },
6111     { Bad_Opcode },
6112     { Bad_Opcode },
6113     { Bad_Opcode },
6114     { Bad_Opcode },
6115     { Bad_Opcode },
6116     { Bad_Opcode },
6117     { Bad_Opcode },
6118     /* 40 */
6119     { Bad_Opcode },
6120     { "phaddbw",        { XM, EXq } },
6121     { "phaddbd",        { XM, EXq } },
6122     { "phaddbq",        { XM, EXq } },
6123     { Bad_Opcode },
6124     { Bad_Opcode },
6125     { "phaddwd",        { XM, EXq } },
6126     { "phaddwq",        { XM, EXq } },
6127     /* 48 */
6128     { Bad_Opcode },
6129     { Bad_Opcode },
6130     { Bad_Opcode },
6131     { "phadddq",        { XM, EXq } },
6132     { Bad_Opcode },
6133     { Bad_Opcode },
6134     { Bad_Opcode },
6135     { Bad_Opcode },
6136     /* 50 */
6137     { Bad_Opcode },
6138     { "phaddubw",       { XM, EXq } },
6139     { "phaddubd",       { XM, EXq } },
6140     { "phaddubq",       { XM, EXq } },
6141     { Bad_Opcode },
6142     { Bad_Opcode },
6143     { "phadduwd",       { XM, EXq } },
6144     { "phadduwq",       { XM, EXq } },
6145     /* 58 */
6146     { Bad_Opcode },
6147     { Bad_Opcode },
6148     { Bad_Opcode },
6149     { "phaddudq",       { XM, EXq } },
6150     { Bad_Opcode },
6151     { Bad_Opcode },
6152     { Bad_Opcode },
6153     { Bad_Opcode },
6154     /* 60 */
6155     { Bad_Opcode },
6156     { "phsubbw",        { XM, EXq } },
6157     { "phsubbd",        { XM, EXq } },
6158     { "phsubbq",        { XM, EXq } },
6159     { Bad_Opcode },
6160     { Bad_Opcode },
6161     { Bad_Opcode },
6162     { Bad_Opcode },
6163     /* 68 */
6164     { Bad_Opcode },
6165     { Bad_Opcode },
6166     { Bad_Opcode },
6167     { Bad_Opcode },
6168     { Bad_Opcode },
6169     { Bad_Opcode },
6170     { Bad_Opcode },
6171     { Bad_Opcode },
6172     /* 70 */
6173     { Bad_Opcode },
6174     { Bad_Opcode },
6175     { Bad_Opcode },
6176     { Bad_Opcode },
6177     { Bad_Opcode },
6178     { Bad_Opcode },
6179     { Bad_Opcode },
6180     { Bad_Opcode },
6181     /* 78 */
6182     { Bad_Opcode },
6183     { Bad_Opcode },
6184     { Bad_Opcode },
6185     { Bad_Opcode },
6186     { Bad_Opcode },
6187     { Bad_Opcode },
6188     { Bad_Opcode },
6189     { Bad_Opcode },
6190     /* 80 */
6191     { Bad_Opcode },
6192     { Bad_Opcode },
6193     { Bad_Opcode },
6194     { Bad_Opcode },
6195     { Bad_Opcode },
6196     { Bad_Opcode },
6197     { Bad_Opcode },
6198     { Bad_Opcode },
6199     /* 88 */
6200     { Bad_Opcode },
6201     { Bad_Opcode },
6202     { Bad_Opcode },
6203     { Bad_Opcode },
6204     { Bad_Opcode },
6205     { Bad_Opcode },
6206     { Bad_Opcode },
6207     { Bad_Opcode },
6208     /* 90 */
6209     { Bad_Opcode },
6210     { Bad_Opcode },
6211     { Bad_Opcode },
6212     { Bad_Opcode },
6213     { Bad_Opcode },
6214     { Bad_Opcode },
6215     { Bad_Opcode },
6216     { Bad_Opcode },
6217     /* 98 */
6218     { Bad_Opcode },
6219     { Bad_Opcode },
6220     { Bad_Opcode },
6221     { Bad_Opcode },
6222     { Bad_Opcode },
6223     { Bad_Opcode },
6224     { Bad_Opcode },
6225     { Bad_Opcode },
6226     /* a0 */
6227     { Bad_Opcode },
6228     { Bad_Opcode },
6229     { Bad_Opcode },
6230     { Bad_Opcode },
6231     { Bad_Opcode },
6232     { Bad_Opcode },
6233     { Bad_Opcode },
6234     { Bad_Opcode },
6235     /* a8 */
6236     { Bad_Opcode },
6237     { Bad_Opcode },
6238     { Bad_Opcode },
6239     { Bad_Opcode },
6240     { Bad_Opcode },
6241     { Bad_Opcode },
6242     { Bad_Opcode },
6243     { Bad_Opcode },
6244     /* b0 */
6245     { Bad_Opcode },
6246     { Bad_Opcode },
6247     { Bad_Opcode },
6248     { Bad_Opcode },
6249     { Bad_Opcode },
6250     { Bad_Opcode },
6251     { Bad_Opcode },
6252     { Bad_Opcode },
6253     /* b8 */
6254     { Bad_Opcode },
6255     { Bad_Opcode },
6256     { Bad_Opcode },
6257     { Bad_Opcode },
6258     { Bad_Opcode },
6259     { Bad_Opcode },
6260     { Bad_Opcode },
6261     { Bad_Opcode },
6262     /* c0 */
6263     { Bad_Opcode },
6264     { Bad_Opcode },
6265     { Bad_Opcode },
6266     { Bad_Opcode },
6267     { Bad_Opcode },
6268     { Bad_Opcode },
6269     { Bad_Opcode },
6270     { Bad_Opcode },
6271     /* c8 */
6272     { Bad_Opcode },
6273     { Bad_Opcode },
6274     { Bad_Opcode },
6275     { Bad_Opcode },
6276     { Bad_Opcode },
6277     { Bad_Opcode },
6278     { Bad_Opcode },
6279     { Bad_Opcode },
6280     /* d0 */
6281     { Bad_Opcode },
6282     { Bad_Opcode },
6283     { Bad_Opcode },
6284     { Bad_Opcode },
6285     { Bad_Opcode },
6286     { Bad_Opcode },
6287     { Bad_Opcode },
6288     { Bad_Opcode },
6289     /* d8 */
6290     { Bad_Opcode },
6291     { Bad_Opcode },
6292     { Bad_Opcode },
6293     { Bad_Opcode },
6294     { Bad_Opcode },
6295     { Bad_Opcode },
6296     { Bad_Opcode },
6297     { Bad_Opcode },
6298     /* e0 */
6299     { Bad_Opcode },
6300     { Bad_Opcode },
6301     { Bad_Opcode },
6302     { Bad_Opcode },
6303     { Bad_Opcode },
6304     { Bad_Opcode },
6305     { Bad_Opcode },
6306     { Bad_Opcode },
6307     /* e8 */
6308     { Bad_Opcode },
6309     { Bad_Opcode },
6310     { Bad_Opcode },
6311     { Bad_Opcode },
6312     { Bad_Opcode },
6313     { Bad_Opcode },
6314     { Bad_Opcode },
6315     { Bad_Opcode },
6316     /* f0 */
6317     { Bad_Opcode },
6318     { Bad_Opcode },
6319     { Bad_Opcode },
6320     { Bad_Opcode },
6321     { Bad_Opcode },
6322     { Bad_Opcode },
6323     { Bad_Opcode },
6324     { Bad_Opcode },
6325     /* f8 */
6326     { Bad_Opcode },
6327     { Bad_Opcode },
6328     { Bad_Opcode },
6329     { Bad_Opcode },
6330     { Bad_Opcode },
6331     { Bad_Opcode },
6332     { Bad_Opcode },
6333     { Bad_Opcode },
6334   },
6335 };
6336
6337 static const struct dis386 xop_table[][256] = {
6338   /* XOP_08 */
6339   {
6340     /* 00 */
6341     { Bad_Opcode },
6342     { Bad_Opcode },
6343     { Bad_Opcode },
6344     { Bad_Opcode },
6345     { Bad_Opcode },
6346     { Bad_Opcode },
6347     { Bad_Opcode },
6348     { Bad_Opcode },
6349     /* 08 */
6350     { Bad_Opcode },
6351     { Bad_Opcode },
6352     { Bad_Opcode },
6353     { Bad_Opcode },
6354     { Bad_Opcode },
6355     { Bad_Opcode },
6356     { Bad_Opcode },
6357     { Bad_Opcode },
6358     /* 10 */
6359     { Bad_Opcode },
6360     { Bad_Opcode },
6361     { Bad_Opcode },
6362     { Bad_Opcode },
6363     { Bad_Opcode },
6364     { Bad_Opcode },
6365     { Bad_Opcode },
6366     { Bad_Opcode },
6367     /* 18 */
6368     { Bad_Opcode },
6369     { Bad_Opcode },
6370     { Bad_Opcode },
6371     { Bad_Opcode },
6372     { Bad_Opcode },
6373     { Bad_Opcode },
6374     { Bad_Opcode },
6375     { Bad_Opcode },
6376     /* 20 */
6377     { Bad_Opcode },
6378     { Bad_Opcode },
6379     { Bad_Opcode },
6380     { Bad_Opcode },
6381     { Bad_Opcode },
6382     { Bad_Opcode },
6383     { Bad_Opcode },
6384     { Bad_Opcode },
6385     /* 28 */
6386     { Bad_Opcode },
6387     { Bad_Opcode },
6388     { Bad_Opcode },
6389     { Bad_Opcode },
6390     { Bad_Opcode },
6391     { Bad_Opcode },
6392     { Bad_Opcode },
6393     { Bad_Opcode },
6394     /* 30 */
6395     { Bad_Opcode },
6396     { Bad_Opcode },
6397     { Bad_Opcode },
6398     { Bad_Opcode },
6399     { Bad_Opcode },
6400     { Bad_Opcode },
6401     { Bad_Opcode },
6402     { Bad_Opcode },
6403     /* 38 */
6404     { Bad_Opcode },
6405     { Bad_Opcode },
6406     { Bad_Opcode },
6407     { Bad_Opcode },
6408     { Bad_Opcode },
6409     { Bad_Opcode },
6410     { Bad_Opcode },
6411     { Bad_Opcode },
6412     /* 40 */
6413     { Bad_Opcode },
6414     { Bad_Opcode },
6415     { Bad_Opcode },
6416     { Bad_Opcode },
6417     { Bad_Opcode },
6418     { Bad_Opcode },
6419     { Bad_Opcode },
6420     { Bad_Opcode },
6421     /* 48 */
6422     { Bad_Opcode },
6423     { Bad_Opcode },
6424     { Bad_Opcode },
6425     { Bad_Opcode },
6426     { Bad_Opcode },
6427     { Bad_Opcode },
6428     { Bad_Opcode },
6429     { Bad_Opcode },
6430     /* 50 */
6431     { Bad_Opcode },
6432     { Bad_Opcode },
6433     { Bad_Opcode },
6434     { Bad_Opcode },
6435     { Bad_Opcode },
6436     { Bad_Opcode },
6437     { Bad_Opcode },
6438     { Bad_Opcode },
6439     /* 58 */
6440     { Bad_Opcode },
6441     { Bad_Opcode },
6442     { Bad_Opcode },
6443     { Bad_Opcode },
6444     { Bad_Opcode },
6445     { Bad_Opcode },
6446     { Bad_Opcode },
6447     { Bad_Opcode },
6448     /* 60 */
6449     { Bad_Opcode },
6450     { Bad_Opcode },
6451     { Bad_Opcode },
6452     { Bad_Opcode },
6453     { Bad_Opcode },
6454     { Bad_Opcode },
6455     { Bad_Opcode },
6456     { Bad_Opcode },
6457     /* 68 */
6458     { Bad_Opcode },
6459     { Bad_Opcode },
6460     { Bad_Opcode },
6461     { Bad_Opcode },
6462     { Bad_Opcode },
6463     { Bad_Opcode },
6464     { Bad_Opcode },
6465     { Bad_Opcode },
6466     /* 70 */
6467     { Bad_Opcode },
6468     { Bad_Opcode },
6469     { Bad_Opcode },
6470     { Bad_Opcode },
6471     { Bad_Opcode },
6472     { Bad_Opcode },
6473     { Bad_Opcode },
6474     { Bad_Opcode },
6475     /* 78 */
6476     { Bad_Opcode },
6477     { Bad_Opcode },
6478     { Bad_Opcode },
6479     { Bad_Opcode },
6480     { Bad_Opcode },
6481     { Bad_Opcode },
6482     { Bad_Opcode },
6483     { Bad_Opcode },
6484     /* 80 */
6485     { Bad_Opcode },
6486     { Bad_Opcode },
6487     { Bad_Opcode },
6488     { Bad_Opcode },
6489     { Bad_Opcode },
6490     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6491     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6492     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6493     /* 88 */
6494     { Bad_Opcode },
6495     { Bad_Opcode },
6496     { Bad_Opcode },
6497     { Bad_Opcode },
6498     { Bad_Opcode },
6499     { Bad_Opcode },
6500     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6501     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6502     /* 90 */
6503     { Bad_Opcode },
6504     { Bad_Opcode },
6505     { Bad_Opcode },
6506     { Bad_Opcode },
6507     { Bad_Opcode },
6508     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6509     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6510     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6511     /* 98 */
6512     { Bad_Opcode },
6513     { Bad_Opcode },
6514     { Bad_Opcode },
6515     { Bad_Opcode },
6516     { Bad_Opcode },
6517     { Bad_Opcode },
6518     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6519     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6520     /* a0 */
6521     { Bad_Opcode },
6522     { Bad_Opcode },
6523     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6524     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6525     { Bad_Opcode },
6526     { Bad_Opcode },
6527     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6528     { Bad_Opcode },
6529     /* a8 */
6530     { Bad_Opcode },
6531     { Bad_Opcode },
6532     { Bad_Opcode },
6533     { Bad_Opcode },
6534     { Bad_Opcode },
6535     { Bad_Opcode },
6536     { Bad_Opcode },
6537     { Bad_Opcode },
6538     /* b0 */
6539     { Bad_Opcode },
6540     { Bad_Opcode },
6541     { Bad_Opcode },
6542     { Bad_Opcode },
6543     { Bad_Opcode },
6544     { Bad_Opcode },
6545     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6546     { Bad_Opcode },
6547     /* b8 */
6548     { Bad_Opcode },
6549     { Bad_Opcode },
6550     { Bad_Opcode },
6551     { Bad_Opcode },
6552     { Bad_Opcode },
6553     { Bad_Opcode },
6554     { Bad_Opcode },
6555     { Bad_Opcode },
6556     /* c0 */
6557     { "vprotb",         { XM, Vex_2src_1, Ib } },
6558     { "vprotw",         { XM, Vex_2src_1, Ib } },
6559     { "vprotd",         { XM, Vex_2src_1, Ib } },
6560     { "vprotq",         { XM, Vex_2src_1, Ib } },
6561     { Bad_Opcode },
6562     { Bad_Opcode },
6563     { Bad_Opcode },
6564     { Bad_Opcode },
6565     /* c8 */
6566     { Bad_Opcode },
6567     { Bad_Opcode },
6568     { Bad_Opcode },
6569     { Bad_Opcode },
6570     { "vpcomb",         { XM, Vex128, EXx, Ib } },
6571     { "vpcomw",         { XM, Vex128, EXx, Ib } },
6572     { "vpcomd",         { XM, Vex128, EXx, Ib } },
6573     { "vpcomq",         { XM, Vex128, EXx, Ib } },
6574     /* d0 */
6575     { Bad_Opcode },
6576     { Bad_Opcode },
6577     { Bad_Opcode },
6578     { Bad_Opcode },
6579     { Bad_Opcode },
6580     { Bad_Opcode },
6581     { Bad_Opcode },
6582     { Bad_Opcode },
6583     /* d8 */
6584     { Bad_Opcode },
6585     { Bad_Opcode },
6586     { Bad_Opcode },
6587     { Bad_Opcode },
6588     { Bad_Opcode },
6589     { Bad_Opcode },
6590     { Bad_Opcode },
6591     { Bad_Opcode },
6592     /* e0 */
6593     { Bad_Opcode },
6594     { Bad_Opcode },
6595     { Bad_Opcode },
6596     { Bad_Opcode },
6597     { Bad_Opcode },
6598     { Bad_Opcode },
6599     { Bad_Opcode },
6600     { Bad_Opcode },
6601     /* e8 */
6602     { Bad_Opcode },
6603     { Bad_Opcode },
6604     { Bad_Opcode },
6605     { Bad_Opcode },
6606     { "vpcomub",        { XM, Vex128, EXx, Ib } },
6607     { "vpcomuw",        { XM, Vex128, EXx, Ib } },
6608     { "vpcomud",        { XM, Vex128, EXx, Ib } },
6609     { "vpcomuq",        { XM, Vex128, EXx, Ib } },
6610     /* f0 */
6611     { Bad_Opcode },
6612     { Bad_Opcode },
6613     { Bad_Opcode },
6614     { Bad_Opcode },
6615     { Bad_Opcode },
6616     { Bad_Opcode },
6617     { Bad_Opcode },
6618     { Bad_Opcode },
6619     /* f8 */
6620     { Bad_Opcode },
6621     { Bad_Opcode },
6622     { Bad_Opcode },
6623     { Bad_Opcode },
6624     { Bad_Opcode },
6625     { Bad_Opcode },
6626     { Bad_Opcode },
6627     { Bad_Opcode },
6628   },
6629   /* XOP_09 */
6630   {
6631     /* 00 */
6632     { Bad_Opcode },
6633     { Bad_Opcode },
6634     { Bad_Opcode },
6635     { Bad_Opcode },
6636     { Bad_Opcode },
6637     { Bad_Opcode },
6638     { Bad_Opcode },
6639     { Bad_Opcode },
6640     /* 08 */
6641     { Bad_Opcode },
6642     { Bad_Opcode },
6643     { Bad_Opcode },
6644     { Bad_Opcode },
6645     { Bad_Opcode },
6646     { Bad_Opcode },
6647     { Bad_Opcode },
6648     { Bad_Opcode },
6649     /* 10 */
6650     { Bad_Opcode },
6651     { Bad_Opcode },
6652     { REG_TABLE (REG_XOP_LWPCB) },
6653     { Bad_Opcode },
6654     { Bad_Opcode },
6655     { Bad_Opcode },
6656     { Bad_Opcode },
6657     { Bad_Opcode },
6658     /* 18 */
6659     { Bad_Opcode },
6660     { Bad_Opcode },
6661     { Bad_Opcode },
6662     { Bad_Opcode },
6663     { Bad_Opcode },
6664     { Bad_Opcode },
6665     { Bad_Opcode },
6666     { Bad_Opcode },
6667     /* 20 */
6668     { Bad_Opcode },
6669     { Bad_Opcode },
6670     { Bad_Opcode },
6671     { Bad_Opcode },
6672     { Bad_Opcode },
6673     { Bad_Opcode },
6674     { Bad_Opcode },
6675     { Bad_Opcode },
6676     /* 28 */
6677     { Bad_Opcode },
6678     { Bad_Opcode },
6679     { Bad_Opcode },
6680     { Bad_Opcode },
6681     { Bad_Opcode },
6682     { Bad_Opcode },
6683     { Bad_Opcode },
6684     { Bad_Opcode },
6685     /* 30 */
6686     { Bad_Opcode },
6687     { Bad_Opcode },
6688     { Bad_Opcode },
6689     { Bad_Opcode },
6690     { Bad_Opcode },
6691     { Bad_Opcode },
6692     { Bad_Opcode },
6693     { Bad_Opcode },
6694     /* 38 */
6695     { Bad_Opcode },
6696     { Bad_Opcode },
6697     { Bad_Opcode },
6698     { Bad_Opcode },
6699     { Bad_Opcode },
6700     { Bad_Opcode },
6701     { Bad_Opcode },
6702     { Bad_Opcode },
6703     /* 40 */
6704     { Bad_Opcode },
6705     { Bad_Opcode },
6706     { Bad_Opcode },
6707     { Bad_Opcode },
6708     { Bad_Opcode },
6709     { Bad_Opcode },
6710     { Bad_Opcode },
6711     { Bad_Opcode },
6712     /* 48 */
6713     { Bad_Opcode },
6714     { Bad_Opcode },
6715     { Bad_Opcode },
6716     { Bad_Opcode },
6717     { Bad_Opcode },
6718     { Bad_Opcode },
6719     { Bad_Opcode },
6720     { Bad_Opcode },
6721     /* 50 */
6722     { Bad_Opcode },
6723     { Bad_Opcode },
6724     { Bad_Opcode },
6725     { Bad_Opcode },
6726     { Bad_Opcode },
6727     { Bad_Opcode },
6728     { Bad_Opcode },
6729     { Bad_Opcode },
6730     /* 58 */
6731     { Bad_Opcode },
6732     { Bad_Opcode },
6733     { Bad_Opcode },
6734     { Bad_Opcode },
6735     { Bad_Opcode },
6736     { Bad_Opcode },
6737     { Bad_Opcode },
6738     { Bad_Opcode },
6739     /* 60 */
6740     { Bad_Opcode },
6741     { Bad_Opcode },
6742     { Bad_Opcode },
6743     { Bad_Opcode },
6744     { Bad_Opcode },
6745     { Bad_Opcode },
6746     { Bad_Opcode },
6747     { Bad_Opcode },
6748     /* 68 */
6749     { Bad_Opcode },
6750     { Bad_Opcode },
6751     { Bad_Opcode },
6752     { Bad_Opcode },
6753     { Bad_Opcode },
6754     { Bad_Opcode },
6755     { Bad_Opcode },
6756     { Bad_Opcode },
6757     /* 70 */
6758     { Bad_Opcode },
6759     { Bad_Opcode },
6760     { Bad_Opcode },
6761     { Bad_Opcode },
6762     { Bad_Opcode },
6763     { Bad_Opcode },
6764     { Bad_Opcode },
6765     { Bad_Opcode },
6766     /* 78 */
6767     { Bad_Opcode },
6768     { Bad_Opcode },
6769     { Bad_Opcode },
6770     { Bad_Opcode },
6771     { Bad_Opcode },
6772     { Bad_Opcode },
6773     { Bad_Opcode },
6774     { Bad_Opcode },
6775     /* 80 */
6776     { VEX_LEN_TABLE (VEX_LEN_XOP_09_80) },
6777     { VEX_LEN_TABLE (VEX_LEN_XOP_09_81) },
6778     { "vfrczss",        { XM, EXd } },
6779     { "vfrczsd",        { XM, EXq } },
6780     { Bad_Opcode },
6781     { Bad_Opcode },
6782     { Bad_Opcode },
6783     { Bad_Opcode },
6784     /* 88 */
6785     { Bad_Opcode },
6786     { Bad_Opcode },
6787     { Bad_Opcode },
6788     { Bad_Opcode },
6789     { Bad_Opcode },
6790     { Bad_Opcode },
6791     { Bad_Opcode },
6792     { Bad_Opcode },
6793     /* 90 */
6794     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 } },
6795     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 } },
6796     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 } },
6797     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 } },
6798     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 } },
6799     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 } },
6800     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 } },
6801     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 } },
6802     /* 98 */
6803     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 } },
6804     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 } },
6805     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 } },
6806     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 } },
6807     { Bad_Opcode },
6808     { Bad_Opcode },
6809     { Bad_Opcode },
6810     { Bad_Opcode },
6811     /* a0 */
6812     { Bad_Opcode },
6813     { Bad_Opcode },
6814     { Bad_Opcode },
6815     { Bad_Opcode },
6816     { Bad_Opcode },
6817     { Bad_Opcode },
6818     { Bad_Opcode },
6819     { Bad_Opcode },
6820     /* a8 */
6821     { Bad_Opcode },
6822     { Bad_Opcode },
6823     { Bad_Opcode },
6824     { Bad_Opcode },
6825     { Bad_Opcode },
6826     { Bad_Opcode },
6827     { Bad_Opcode },
6828     { Bad_Opcode },
6829     /* b0 */
6830     { Bad_Opcode },
6831     { Bad_Opcode },
6832     { Bad_Opcode },
6833     { Bad_Opcode },
6834     { Bad_Opcode },
6835     { Bad_Opcode },
6836     { Bad_Opcode },
6837     { Bad_Opcode },
6838     /* b8 */
6839     { Bad_Opcode },
6840     { Bad_Opcode },
6841     { Bad_Opcode },
6842     { Bad_Opcode },
6843     { Bad_Opcode },
6844     { Bad_Opcode },
6845     { Bad_Opcode },
6846     { Bad_Opcode },
6847     /* c0 */
6848     { Bad_Opcode },
6849     { "vphaddbw",       { XM, EXxmm } },
6850     { "vphaddbd",       { XM, EXxmm } },
6851     { "vphaddbq",       { XM, EXxmm } },
6852     { Bad_Opcode },
6853     { Bad_Opcode },
6854     { "vphaddwd",       { XM, EXxmm } },
6855     { "vphaddwq",       { XM, EXxmm } },
6856     /* c8 */
6857     { Bad_Opcode },
6858     { Bad_Opcode },
6859     { Bad_Opcode },
6860     { "vphadddq",       { XM, EXxmm } },
6861     { Bad_Opcode },
6862     { Bad_Opcode },
6863     { Bad_Opcode },
6864     { Bad_Opcode },
6865     /* d0 */
6866     { Bad_Opcode },
6867     { "vphaddubw",      { XM, EXxmm } },
6868     { "vphaddubd",      { XM, EXxmm } },
6869     { "vphaddubq",      { XM, EXxmm } },
6870     { Bad_Opcode },
6871     { Bad_Opcode },
6872     { "vphadduwd",      { XM, EXxmm } },
6873     { "vphadduwq",      { XM, EXxmm } },
6874     /* d8 */
6875     { Bad_Opcode },
6876     { Bad_Opcode },
6877     { Bad_Opcode },
6878     { "vphaddudq",      { XM, EXxmm } },
6879     { Bad_Opcode },
6880     { Bad_Opcode },
6881     { Bad_Opcode },
6882     { Bad_Opcode },
6883     /* e0 */
6884     { Bad_Opcode },
6885     { "vphsubbw",       { XM, EXxmm } },
6886     { "vphsubwd",       { XM, EXxmm } },
6887     { "vphsubdq",       { XM, EXxmm } },
6888     { Bad_Opcode },
6889     { Bad_Opcode },
6890     { Bad_Opcode },
6891     { Bad_Opcode },
6892     /* e8 */
6893     { Bad_Opcode },
6894     { Bad_Opcode },
6895     { Bad_Opcode },
6896     { Bad_Opcode },
6897     { Bad_Opcode },
6898     { Bad_Opcode },
6899     { Bad_Opcode },
6900     { Bad_Opcode },
6901     /* f0 */
6902     { Bad_Opcode },
6903     { Bad_Opcode },
6904     { Bad_Opcode },
6905     { Bad_Opcode },
6906     { Bad_Opcode },
6907     { Bad_Opcode },
6908     { Bad_Opcode },
6909     { Bad_Opcode },
6910     /* f8 */
6911     { Bad_Opcode },
6912     { Bad_Opcode },
6913     { Bad_Opcode },
6914     { Bad_Opcode },
6915     { Bad_Opcode },
6916     { Bad_Opcode },
6917     { Bad_Opcode },
6918     { Bad_Opcode },
6919   },
6920   /* XOP_0A */
6921   {
6922     /* 00 */
6923     { Bad_Opcode },
6924     { Bad_Opcode },
6925     { Bad_Opcode },
6926     { Bad_Opcode },
6927     { Bad_Opcode },
6928     { Bad_Opcode },
6929     { Bad_Opcode },
6930     { Bad_Opcode },
6931     /* 08 */
6932     { Bad_Opcode },
6933     { Bad_Opcode },
6934     { Bad_Opcode },
6935     { Bad_Opcode },
6936     { Bad_Opcode },
6937     { Bad_Opcode },
6938     { Bad_Opcode },
6939     { Bad_Opcode },
6940     /* 10 */
6941     { Bad_Opcode },
6942     { Bad_Opcode },
6943     { REG_TABLE (REG_XOP_LWP) },
6944     { Bad_Opcode },
6945     { Bad_Opcode },
6946     { Bad_Opcode },
6947     { Bad_Opcode },
6948     { Bad_Opcode },
6949     /* 18 */
6950     { Bad_Opcode },
6951     { Bad_Opcode },
6952     { Bad_Opcode },
6953     { Bad_Opcode },
6954     { Bad_Opcode },
6955     { Bad_Opcode },
6956     { Bad_Opcode },
6957     { Bad_Opcode },
6958     /* 20 */
6959     { Bad_Opcode },
6960     { Bad_Opcode },
6961     { Bad_Opcode },
6962     { Bad_Opcode },
6963     { Bad_Opcode },
6964     { Bad_Opcode },
6965     { Bad_Opcode },
6966     { Bad_Opcode },
6967     /* 28 */
6968     { Bad_Opcode },
6969     { Bad_Opcode },
6970     { Bad_Opcode },
6971     { Bad_Opcode },
6972     { Bad_Opcode },
6973     { Bad_Opcode },
6974     { Bad_Opcode },
6975     { Bad_Opcode },
6976     /* 30 */
6977     { Bad_Opcode },
6978     { Bad_Opcode },
6979     { Bad_Opcode },
6980     { Bad_Opcode },
6981     { Bad_Opcode },
6982     { Bad_Opcode },
6983     { Bad_Opcode },
6984     { Bad_Opcode },
6985     /* 38 */
6986     { Bad_Opcode },
6987     { Bad_Opcode },
6988     { Bad_Opcode },
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     { Bad_Opcode },
6992     { Bad_Opcode },
6993     { Bad_Opcode },
6994     /* 40 */
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     { Bad_Opcode },
6998     { Bad_Opcode },
6999     { Bad_Opcode },
7000     { Bad_Opcode },
7001     { Bad_Opcode },
7002     { Bad_Opcode },
7003     /* 48 */
7004     { Bad_Opcode },
7005     { Bad_Opcode },
7006     { Bad_Opcode },
7007     { Bad_Opcode },
7008     { Bad_Opcode },
7009     { Bad_Opcode },
7010     { Bad_Opcode },
7011     { Bad_Opcode },
7012     /* 50 */
7013     { Bad_Opcode },
7014     { Bad_Opcode },
7015     { Bad_Opcode },
7016     { Bad_Opcode },
7017     { Bad_Opcode },
7018     { Bad_Opcode },
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     /* 58 */
7022     { Bad_Opcode },
7023     { Bad_Opcode },
7024     { Bad_Opcode },
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     { Bad_Opcode },
7028     { Bad_Opcode },
7029     { Bad_Opcode },
7030     /* 60 */
7031     { Bad_Opcode },
7032     { Bad_Opcode },
7033     { Bad_Opcode },
7034     { Bad_Opcode },
7035     { Bad_Opcode },
7036     { Bad_Opcode },
7037     { Bad_Opcode },
7038     { Bad_Opcode },
7039     /* 68 */
7040     { Bad_Opcode },
7041     { Bad_Opcode },
7042     { Bad_Opcode },
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     { Bad_Opcode },
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     /* 70 */
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     /* 78 */
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     /* 80 */
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     /* 88 */
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     { Bad_Opcode },
7082     { Bad_Opcode },
7083     { Bad_Opcode },
7084     /* 90 */
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     { Bad_Opcode },
7091     { Bad_Opcode },
7092     { Bad_Opcode },
7093     /* 98 */
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     { Bad_Opcode },
7101     { Bad_Opcode },
7102     /* a0 */
7103     { Bad_Opcode },
7104     { Bad_Opcode },
7105     { Bad_Opcode },
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     { Bad_Opcode },
7109     { Bad_Opcode },
7110     { Bad_Opcode },
7111     /* a8 */
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     { Bad_Opcode },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     { Bad_Opcode },
7119     { Bad_Opcode },
7120     /* b0 */
7121     { Bad_Opcode },
7122     { Bad_Opcode },
7123     { Bad_Opcode },
7124     { Bad_Opcode },
7125     { Bad_Opcode },
7126     { Bad_Opcode },
7127     { Bad_Opcode },
7128     { Bad_Opcode },
7129     /* b8 */
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     /* c0 */
7139     { Bad_Opcode },
7140     { Bad_Opcode },
7141     { Bad_Opcode },
7142     { Bad_Opcode },
7143     { Bad_Opcode },
7144     { Bad_Opcode },
7145     { Bad_Opcode },
7146     { Bad_Opcode },
7147     /* c8 */
7148     { Bad_Opcode },
7149     { Bad_Opcode },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     { Bad_Opcode },
7154     { Bad_Opcode },
7155     { Bad_Opcode },
7156     /* d0 */
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     { Bad_Opcode },
7163     { Bad_Opcode },
7164     { Bad_Opcode },
7165     /* d8 */
7166     { Bad_Opcode },
7167     { Bad_Opcode },
7168     { Bad_Opcode },
7169     { Bad_Opcode },
7170     { Bad_Opcode },
7171     { Bad_Opcode },
7172     { Bad_Opcode },
7173     { Bad_Opcode },
7174     /* e0 */
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     { Bad_Opcode },
7178     { Bad_Opcode },
7179     { Bad_Opcode },
7180     { Bad_Opcode },
7181     { Bad_Opcode },
7182     { Bad_Opcode },
7183     /* e8 */
7184     { Bad_Opcode },
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     { Bad_Opcode },
7190     { Bad_Opcode },
7191     { Bad_Opcode },
7192     /* f0 */
7193     { Bad_Opcode },
7194     { Bad_Opcode },
7195     { Bad_Opcode },
7196     { Bad_Opcode },
7197     { Bad_Opcode },
7198     { Bad_Opcode },
7199     { Bad_Opcode },
7200     { Bad_Opcode },
7201     /* f8 */
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     { Bad_Opcode },
7207     { Bad_Opcode },
7208     { Bad_Opcode },
7209     { Bad_Opcode },
7210   },
7211 };
7212
7213 static const struct dis386 vex_table[][256] = {
7214   /* VEX_0F */
7215   {
7216     /* 00 */
7217     { Bad_Opcode },
7218     { Bad_Opcode },
7219     { Bad_Opcode },
7220     { Bad_Opcode },
7221     { Bad_Opcode },
7222     { Bad_Opcode },
7223     { Bad_Opcode },
7224     { Bad_Opcode },
7225     /* 08 */
7226     { Bad_Opcode },
7227     { Bad_Opcode },
7228     { Bad_Opcode },
7229     { Bad_Opcode },
7230     { Bad_Opcode },
7231     { Bad_Opcode },
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     /* 10 */
7235     { PREFIX_TABLE (PREFIX_VEX_10) },
7236     { PREFIX_TABLE (PREFIX_VEX_11) },
7237     { PREFIX_TABLE (PREFIX_VEX_12) },
7238     { MOD_TABLE (MOD_VEX_13) },
7239     { VEX_W_TABLE (VEX_W_14) },
7240     { VEX_W_TABLE (VEX_W_15) },
7241     { PREFIX_TABLE (PREFIX_VEX_16) },
7242     { MOD_TABLE (MOD_VEX_17) },
7243     /* 18 */
7244     { Bad_Opcode },
7245     { Bad_Opcode },
7246     { Bad_Opcode },
7247     { Bad_Opcode },
7248     { Bad_Opcode },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     { Bad_Opcode },
7252     /* 20 */
7253     { Bad_Opcode },
7254     { Bad_Opcode },
7255     { Bad_Opcode },
7256     { Bad_Opcode },
7257     { Bad_Opcode },
7258     { Bad_Opcode },
7259     { Bad_Opcode },
7260     { Bad_Opcode },
7261     /* 28 */
7262     { VEX_W_TABLE (VEX_W_28) },
7263     { VEX_W_TABLE (VEX_W_29) },
7264     { PREFIX_TABLE (PREFIX_VEX_2A) },
7265     { MOD_TABLE (MOD_VEX_2B) },
7266     { PREFIX_TABLE (PREFIX_VEX_2C) },
7267     { PREFIX_TABLE (PREFIX_VEX_2D) },
7268     { PREFIX_TABLE (PREFIX_VEX_2E) },
7269     { PREFIX_TABLE (PREFIX_VEX_2F) },
7270     /* 30 */
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     { Bad_Opcode },
7274     { Bad_Opcode },
7275     { Bad_Opcode },
7276     { Bad_Opcode },
7277     { Bad_Opcode },
7278     { Bad_Opcode },
7279     /* 38 */
7280     { Bad_Opcode },
7281     { Bad_Opcode },
7282     { Bad_Opcode },
7283     { Bad_Opcode },
7284     { Bad_Opcode },
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     /* 40 */
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     { Bad_Opcode },
7292     { Bad_Opcode },
7293     { Bad_Opcode },
7294     { Bad_Opcode },
7295     { Bad_Opcode },
7296     { Bad_Opcode },
7297     /* 48 */
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     { Bad_Opcode },
7301     { Bad_Opcode },
7302     { Bad_Opcode },
7303     { Bad_Opcode },
7304     { Bad_Opcode },
7305     { Bad_Opcode },
7306     /* 50 */
7307     { MOD_TABLE (MOD_VEX_50) },
7308     { PREFIX_TABLE (PREFIX_VEX_51) },
7309     { PREFIX_TABLE (PREFIX_VEX_52) },
7310     { PREFIX_TABLE (PREFIX_VEX_53) },
7311     { "vandpX",         { XM, Vex, EXx } },
7312     { "vandnpX",        { XM, Vex, EXx } },
7313     { "vorpX",          { XM, Vex, EXx } },
7314     { "vxorpX",         { XM, Vex, EXx } },
7315     /* 58 */
7316     { PREFIX_TABLE (PREFIX_VEX_58) },
7317     { PREFIX_TABLE (PREFIX_VEX_59) },
7318     { PREFIX_TABLE (PREFIX_VEX_5A) },
7319     { PREFIX_TABLE (PREFIX_VEX_5B) },
7320     { PREFIX_TABLE (PREFIX_VEX_5C) },
7321     { PREFIX_TABLE (PREFIX_VEX_5D) },
7322     { PREFIX_TABLE (PREFIX_VEX_5E) },
7323     { PREFIX_TABLE (PREFIX_VEX_5F) },
7324     /* 60 */
7325     { PREFIX_TABLE (PREFIX_VEX_60) },
7326     { PREFIX_TABLE (PREFIX_VEX_61) },
7327     { PREFIX_TABLE (PREFIX_VEX_62) },
7328     { PREFIX_TABLE (PREFIX_VEX_63) },
7329     { PREFIX_TABLE (PREFIX_VEX_64) },
7330     { PREFIX_TABLE (PREFIX_VEX_65) },
7331     { PREFIX_TABLE (PREFIX_VEX_66) },
7332     { PREFIX_TABLE (PREFIX_VEX_67) },
7333     /* 68 */
7334     { PREFIX_TABLE (PREFIX_VEX_68) },
7335     { PREFIX_TABLE (PREFIX_VEX_69) },
7336     { PREFIX_TABLE (PREFIX_VEX_6A) },
7337     { PREFIX_TABLE (PREFIX_VEX_6B) },
7338     { PREFIX_TABLE (PREFIX_VEX_6C) },
7339     { PREFIX_TABLE (PREFIX_VEX_6D) },
7340     { PREFIX_TABLE (PREFIX_VEX_6E) },
7341     { PREFIX_TABLE (PREFIX_VEX_6F) },
7342     /* 70 */
7343     { PREFIX_TABLE (PREFIX_VEX_70) },
7344     { REG_TABLE (REG_VEX_71) },
7345     { REG_TABLE (REG_VEX_72) },
7346     { REG_TABLE (REG_VEX_73) },
7347     { PREFIX_TABLE (PREFIX_VEX_74) },
7348     { PREFIX_TABLE (PREFIX_VEX_75) },
7349     { PREFIX_TABLE (PREFIX_VEX_76) },
7350     { PREFIX_TABLE (PREFIX_VEX_77) },
7351     /* 78 */
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     { Bad_Opcode },
7355     { Bad_Opcode },
7356     { PREFIX_TABLE (PREFIX_VEX_7C) },
7357     { PREFIX_TABLE (PREFIX_VEX_7D) },
7358     { PREFIX_TABLE (PREFIX_VEX_7E) },
7359     { PREFIX_TABLE (PREFIX_VEX_7F) },
7360     /* 80 */
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     { Bad_Opcode },
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     /* 88 */
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     { Bad_Opcode },
7373     { Bad_Opcode },
7374     { Bad_Opcode },
7375     { Bad_Opcode },
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     /* 90 */
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     { Bad_Opcode },
7382     { Bad_Opcode },
7383     { Bad_Opcode },
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     /* 98 */
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     { Bad_Opcode },
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     /* a0 */
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     { Bad_Opcode },
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     { Bad_Opcode },
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     /* a8 */
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     { Bad_Opcode },
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     { Bad_Opcode },
7412     { REG_TABLE (REG_VEX_AE) },
7413     { Bad_Opcode },
7414     /* b0 */
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     { Bad_Opcode },
7418     { Bad_Opcode },
7419     { Bad_Opcode },
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     /* b8 */
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     { Bad_Opcode },
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     /* c0 */
7433     { Bad_Opcode },
7434     { Bad_Opcode },
7435     { PREFIX_TABLE (PREFIX_VEX_C2) },
7436     { Bad_Opcode },
7437     { PREFIX_TABLE (PREFIX_VEX_C4) },
7438     { PREFIX_TABLE (PREFIX_VEX_C5) },
7439     { "vshufpX",        { XM, Vex, EXx, Ib } },
7440     { Bad_Opcode },
7441     /* c8 */
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     { Bad_Opcode },
7445     { Bad_Opcode },
7446     { Bad_Opcode },
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     /* d0 */
7451     { PREFIX_TABLE (PREFIX_VEX_D0) },
7452     { PREFIX_TABLE (PREFIX_VEX_D1) },
7453     { PREFIX_TABLE (PREFIX_VEX_D2) },
7454     { PREFIX_TABLE (PREFIX_VEX_D3) },
7455     { PREFIX_TABLE (PREFIX_VEX_D4) },
7456     { PREFIX_TABLE (PREFIX_VEX_D5) },
7457     { PREFIX_TABLE (PREFIX_VEX_D6) },
7458     { PREFIX_TABLE (PREFIX_VEX_D7) },
7459     /* d8 */
7460     { PREFIX_TABLE (PREFIX_VEX_D8) },
7461     { PREFIX_TABLE (PREFIX_VEX_D9) },
7462     { PREFIX_TABLE (PREFIX_VEX_DA) },
7463     { PREFIX_TABLE (PREFIX_VEX_DB) },
7464     { PREFIX_TABLE (PREFIX_VEX_DC) },
7465     { PREFIX_TABLE (PREFIX_VEX_DD) },
7466     { PREFIX_TABLE (PREFIX_VEX_DE) },
7467     { PREFIX_TABLE (PREFIX_VEX_DF) },
7468     /* e0 */
7469     { PREFIX_TABLE (PREFIX_VEX_E0) },
7470     { PREFIX_TABLE (PREFIX_VEX_E1) },
7471     { PREFIX_TABLE (PREFIX_VEX_E2) },
7472     { PREFIX_TABLE (PREFIX_VEX_E3) },
7473     { PREFIX_TABLE (PREFIX_VEX_E4) },
7474     { PREFIX_TABLE (PREFIX_VEX_E5) },
7475     { PREFIX_TABLE (PREFIX_VEX_E6) },
7476     { PREFIX_TABLE (PREFIX_VEX_E7) },
7477     /* e8 */
7478     { PREFIX_TABLE (PREFIX_VEX_E8) },
7479     { PREFIX_TABLE (PREFIX_VEX_E9) },
7480     { PREFIX_TABLE (PREFIX_VEX_EA) },
7481     { PREFIX_TABLE (PREFIX_VEX_EB) },
7482     { PREFIX_TABLE (PREFIX_VEX_EC) },
7483     { PREFIX_TABLE (PREFIX_VEX_ED) },
7484     { PREFIX_TABLE (PREFIX_VEX_EE) },
7485     { PREFIX_TABLE (PREFIX_VEX_EF) },
7486     /* f0 */
7487     { PREFIX_TABLE (PREFIX_VEX_F0) },
7488     { PREFIX_TABLE (PREFIX_VEX_F1) },
7489     { PREFIX_TABLE (PREFIX_VEX_F2) },
7490     { PREFIX_TABLE (PREFIX_VEX_F3) },
7491     { PREFIX_TABLE (PREFIX_VEX_F4) },
7492     { PREFIX_TABLE (PREFIX_VEX_F5) },
7493     { PREFIX_TABLE (PREFIX_VEX_F6) },
7494     { PREFIX_TABLE (PREFIX_VEX_F7) },
7495     /* f8 */
7496     { PREFIX_TABLE (PREFIX_VEX_F8) },
7497     { PREFIX_TABLE (PREFIX_VEX_F9) },
7498     { PREFIX_TABLE (PREFIX_VEX_FA) },
7499     { PREFIX_TABLE (PREFIX_VEX_FB) },
7500     { PREFIX_TABLE (PREFIX_VEX_FC) },
7501     { PREFIX_TABLE (PREFIX_VEX_FD) },
7502     { PREFIX_TABLE (PREFIX_VEX_FE) },
7503     { Bad_Opcode },
7504   },
7505   /* VEX_0F38 */
7506   {
7507     /* 00 */
7508     { PREFIX_TABLE (PREFIX_VEX_3800) },
7509     { PREFIX_TABLE (PREFIX_VEX_3801) },
7510     { PREFIX_TABLE (PREFIX_VEX_3802) },
7511     { PREFIX_TABLE (PREFIX_VEX_3803) },
7512     { PREFIX_TABLE (PREFIX_VEX_3804) },
7513     { PREFIX_TABLE (PREFIX_VEX_3805) },
7514     { PREFIX_TABLE (PREFIX_VEX_3806) },
7515     { PREFIX_TABLE (PREFIX_VEX_3807) },
7516     /* 08 */
7517     { PREFIX_TABLE (PREFIX_VEX_3808) },
7518     { PREFIX_TABLE (PREFIX_VEX_3809) },
7519     { PREFIX_TABLE (PREFIX_VEX_380A) },
7520     { PREFIX_TABLE (PREFIX_VEX_380B) },
7521     { PREFIX_TABLE (PREFIX_VEX_380C) },
7522     { PREFIX_TABLE (PREFIX_VEX_380D) },
7523     { PREFIX_TABLE (PREFIX_VEX_380E) },
7524     { PREFIX_TABLE (PREFIX_VEX_380F) },
7525     /* 10 */
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     { Bad_Opcode },
7529     { Bad_Opcode },
7530     { Bad_Opcode },
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { PREFIX_TABLE (PREFIX_VEX_3817) },
7534     /* 18 */
7535     { PREFIX_TABLE (PREFIX_VEX_3818) },
7536     { PREFIX_TABLE (PREFIX_VEX_3819) },
7537     { PREFIX_TABLE (PREFIX_VEX_381A) },
7538     { Bad_Opcode },
7539     { PREFIX_TABLE (PREFIX_VEX_381C) },
7540     { PREFIX_TABLE (PREFIX_VEX_381D) },
7541     { PREFIX_TABLE (PREFIX_VEX_381E) },
7542     { Bad_Opcode },
7543     /* 20 */
7544     { PREFIX_TABLE (PREFIX_VEX_3820) },
7545     { PREFIX_TABLE (PREFIX_VEX_3821) },
7546     { PREFIX_TABLE (PREFIX_VEX_3822) },
7547     { PREFIX_TABLE (PREFIX_VEX_3823) },
7548     { PREFIX_TABLE (PREFIX_VEX_3824) },
7549     { PREFIX_TABLE (PREFIX_VEX_3825) },
7550     { Bad_Opcode },
7551     { Bad_Opcode },
7552     /* 28 */
7553     { PREFIX_TABLE (PREFIX_VEX_3828) },
7554     { PREFIX_TABLE (PREFIX_VEX_3829) },
7555     { PREFIX_TABLE (PREFIX_VEX_382A) },
7556     { PREFIX_TABLE (PREFIX_VEX_382B) },
7557     { PREFIX_TABLE (PREFIX_VEX_382C) },
7558     { PREFIX_TABLE (PREFIX_VEX_382D) },
7559     { PREFIX_TABLE (PREFIX_VEX_382E) },
7560     { PREFIX_TABLE (PREFIX_VEX_382F) },
7561     /* 30 */
7562     { PREFIX_TABLE (PREFIX_VEX_3830) },
7563     { PREFIX_TABLE (PREFIX_VEX_3831) },
7564     { PREFIX_TABLE (PREFIX_VEX_3832) },
7565     { PREFIX_TABLE (PREFIX_VEX_3833) },
7566     { PREFIX_TABLE (PREFIX_VEX_3834) },
7567     { PREFIX_TABLE (PREFIX_VEX_3835) },
7568     { Bad_Opcode },
7569     { PREFIX_TABLE (PREFIX_VEX_3837) },
7570     /* 38 */
7571     { PREFIX_TABLE (PREFIX_VEX_3838) },
7572     { PREFIX_TABLE (PREFIX_VEX_3839) },
7573     { PREFIX_TABLE (PREFIX_VEX_383A) },
7574     { PREFIX_TABLE (PREFIX_VEX_383B) },
7575     { PREFIX_TABLE (PREFIX_VEX_383C) },
7576     { PREFIX_TABLE (PREFIX_VEX_383D) },
7577     { PREFIX_TABLE (PREFIX_VEX_383E) },
7578     { PREFIX_TABLE (PREFIX_VEX_383F) },
7579     /* 40 */
7580     { PREFIX_TABLE (PREFIX_VEX_3840) },
7581     { PREFIX_TABLE (PREFIX_VEX_3841) },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     { Bad_Opcode },
7585     { Bad_Opcode },
7586     { Bad_Opcode },
7587     { Bad_Opcode },
7588     /* 48 */
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     { Bad_Opcode },
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     /* 50 */
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     { Bad_Opcode },
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     /* 58 */
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     { Bad_Opcode },
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     /* 60 */
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     { Bad_Opcode },
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     { Bad_Opcode },
7624     /* 68 */
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     { Bad_Opcode },
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     /* 70 */
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     { Bad_Opcode },
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     /* 78 */
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     { Bad_Opcode },
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     /* 80 */
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     { Bad_Opcode },
7657     { Bad_Opcode },
7658     { Bad_Opcode },
7659     { Bad_Opcode },
7660     /* 88 */
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     { Bad_Opcode },
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     /* 90 */
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     { Bad_Opcode },
7674     { Bad_Opcode },
7675     { Bad_Opcode },
7676     { PREFIX_TABLE (PREFIX_VEX_3896) },
7677     { PREFIX_TABLE (PREFIX_VEX_3897) },
7678     /* 98 */
7679     { PREFIX_TABLE (PREFIX_VEX_3898) },
7680     { PREFIX_TABLE (PREFIX_VEX_3899) },
7681     { PREFIX_TABLE (PREFIX_VEX_389A) },
7682     { PREFIX_TABLE (PREFIX_VEX_389B) },
7683     { PREFIX_TABLE (PREFIX_VEX_389C) },
7684     { PREFIX_TABLE (PREFIX_VEX_389D) },
7685     { PREFIX_TABLE (PREFIX_VEX_389E) },
7686     { PREFIX_TABLE (PREFIX_VEX_389F) },
7687     /* a0 */
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     { Bad_Opcode },
7693     { Bad_Opcode },
7694     { PREFIX_TABLE (PREFIX_VEX_38A6) },
7695     { PREFIX_TABLE (PREFIX_VEX_38A7) },
7696     /* a8 */
7697     { PREFIX_TABLE (PREFIX_VEX_38A8) },
7698     { PREFIX_TABLE (PREFIX_VEX_38A9) },
7699     { PREFIX_TABLE (PREFIX_VEX_38AA) },
7700     { PREFIX_TABLE (PREFIX_VEX_38AB) },
7701     { PREFIX_TABLE (PREFIX_VEX_38AC) },
7702     { PREFIX_TABLE (PREFIX_VEX_38AD) },
7703     { PREFIX_TABLE (PREFIX_VEX_38AE) },
7704     { PREFIX_TABLE (PREFIX_VEX_38AF) },
7705     /* b0 */
7706     { Bad_Opcode },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { Bad_Opcode },
7710     { Bad_Opcode },
7711     { Bad_Opcode },
7712     { PREFIX_TABLE (PREFIX_VEX_38B6) },
7713     { PREFIX_TABLE (PREFIX_VEX_38B7) },
7714     /* b8 */
7715     { PREFIX_TABLE (PREFIX_VEX_38B8) },
7716     { PREFIX_TABLE (PREFIX_VEX_38B9) },
7717     { PREFIX_TABLE (PREFIX_VEX_38BA) },
7718     { PREFIX_TABLE (PREFIX_VEX_38BB) },
7719     { PREFIX_TABLE (PREFIX_VEX_38BC) },
7720     { PREFIX_TABLE (PREFIX_VEX_38BD) },
7721     { PREFIX_TABLE (PREFIX_VEX_38BE) },
7722     { PREFIX_TABLE (PREFIX_VEX_38BF) },
7723     /* c0 */
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { Bad_Opcode },
7728     { Bad_Opcode },
7729     { Bad_Opcode },
7730     { Bad_Opcode },
7731     { Bad_Opcode },
7732     /* c8 */
7733     { Bad_Opcode },
7734     { Bad_Opcode },
7735     { Bad_Opcode },
7736     { Bad_Opcode },
7737     { Bad_Opcode },
7738     { Bad_Opcode },
7739     { Bad_Opcode },
7740     { Bad_Opcode },
7741     /* d0 */
7742     { Bad_Opcode },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     { Bad_Opcode },
7746     { Bad_Opcode },
7747     { Bad_Opcode },
7748     { Bad_Opcode },
7749     { Bad_Opcode },
7750     /* d8 */
7751     { Bad_Opcode },
7752     { Bad_Opcode },
7753     { Bad_Opcode },
7754     { PREFIX_TABLE (PREFIX_VEX_38DB) },
7755     { PREFIX_TABLE (PREFIX_VEX_38DC) },
7756     { PREFIX_TABLE (PREFIX_VEX_38DD) },
7757     { PREFIX_TABLE (PREFIX_VEX_38DE) },
7758     { PREFIX_TABLE (PREFIX_VEX_38DF) },
7759     /* e0 */
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764     { Bad_Opcode },
7765     { Bad_Opcode },
7766     { Bad_Opcode },
7767     { Bad_Opcode },
7768     /* e8 */
7769     { Bad_Opcode },
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     { Bad_Opcode },
7776     { Bad_Opcode },
7777     /* f0 */
7778     { Bad_Opcode },
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     { Bad_Opcode },
7784     { Bad_Opcode },
7785     { Bad_Opcode },
7786     /* f8 */
7787     { Bad_Opcode },
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     { Bad_Opcode },
7791     { Bad_Opcode },
7792     { Bad_Opcode },
7793     { Bad_Opcode },
7794     { Bad_Opcode },
7795   },
7796   /* VEX_0F3A */
7797   {
7798     /* 00 */
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     { Bad_Opcode },
7803     { PREFIX_TABLE (PREFIX_VEX_3A04) },
7804     { PREFIX_TABLE (PREFIX_VEX_3A05) },
7805     { PREFIX_TABLE (PREFIX_VEX_3A06) },
7806     { Bad_Opcode },
7807     /* 08 */
7808     { PREFIX_TABLE (PREFIX_VEX_3A08) },
7809     { PREFIX_TABLE (PREFIX_VEX_3A09) },
7810     { PREFIX_TABLE (PREFIX_VEX_3A0A) },
7811     { PREFIX_TABLE (PREFIX_VEX_3A0B) },
7812     { PREFIX_TABLE (PREFIX_VEX_3A0C) },
7813     { PREFIX_TABLE (PREFIX_VEX_3A0D) },
7814     { PREFIX_TABLE (PREFIX_VEX_3A0E) },
7815     { PREFIX_TABLE (PREFIX_VEX_3A0F) },
7816     /* 10 */
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     { Bad_Opcode },
7821     { PREFIX_TABLE (PREFIX_VEX_3A14) },
7822     { PREFIX_TABLE (PREFIX_VEX_3A15) },
7823     { PREFIX_TABLE (PREFIX_VEX_3A16) },
7824     { PREFIX_TABLE (PREFIX_VEX_3A17) },
7825     /* 18 */
7826     { PREFIX_TABLE (PREFIX_VEX_3A18) },
7827     { PREFIX_TABLE (PREFIX_VEX_3A19) },
7828     { Bad_Opcode },
7829     { Bad_Opcode },
7830     { Bad_Opcode },
7831     { Bad_Opcode },
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     /* 20 */
7835     { PREFIX_TABLE (PREFIX_VEX_3A20) },
7836     { PREFIX_TABLE (PREFIX_VEX_3A21) },
7837     { PREFIX_TABLE (PREFIX_VEX_3A22) },
7838     { Bad_Opcode },
7839     { Bad_Opcode },
7840     { Bad_Opcode },
7841     { Bad_Opcode },
7842     { Bad_Opcode },
7843     /* 28 */
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     { Bad_Opcode },
7848     { Bad_Opcode },
7849     { Bad_Opcode },
7850     { Bad_Opcode },
7851     { Bad_Opcode },
7852     /* 30 */
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     { Bad_Opcode },
7861     /* 38 */
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     { Bad_Opcode },
7865     { Bad_Opcode },
7866     { Bad_Opcode },
7867     { Bad_Opcode },
7868     { Bad_Opcode },
7869     { Bad_Opcode },
7870     /* 40 */
7871     { PREFIX_TABLE (PREFIX_VEX_3A40) },
7872     { PREFIX_TABLE (PREFIX_VEX_3A41) },
7873     { PREFIX_TABLE (PREFIX_VEX_3A42) },
7874     { Bad_Opcode },
7875     { PREFIX_TABLE (PREFIX_VEX_3A44) },
7876     { Bad_Opcode },
7877     { Bad_Opcode },
7878     { Bad_Opcode },
7879     /* 48 */
7880     { PREFIX_TABLE (PREFIX_VEX_3A48) },
7881     { PREFIX_TABLE (PREFIX_VEX_3A49) },
7882     { PREFIX_TABLE (PREFIX_VEX_3A4A) },
7883     { PREFIX_TABLE (PREFIX_VEX_3A4B) },
7884     { PREFIX_TABLE (PREFIX_VEX_3A4C) },
7885     { Bad_Opcode },
7886     { Bad_Opcode },
7887     { Bad_Opcode },
7888     /* 50 */
7889     { Bad_Opcode },
7890     { Bad_Opcode },
7891     { Bad_Opcode },
7892     { Bad_Opcode },
7893     { Bad_Opcode },
7894     { Bad_Opcode },
7895     { Bad_Opcode },
7896     { Bad_Opcode },
7897     /* 58 */
7898     { Bad_Opcode },
7899     { Bad_Opcode },
7900     { Bad_Opcode },
7901     { Bad_Opcode },
7902     { PREFIX_TABLE (PREFIX_VEX_3A5C) },
7903     { PREFIX_TABLE (PREFIX_VEX_3A5D) },
7904     { PREFIX_TABLE (PREFIX_VEX_3A5E) },
7905     { PREFIX_TABLE (PREFIX_VEX_3A5F) },
7906     /* 60 */
7907     { PREFIX_TABLE (PREFIX_VEX_3A60) },
7908     { PREFIX_TABLE (PREFIX_VEX_3A61) },
7909     { PREFIX_TABLE (PREFIX_VEX_3A62) },
7910     { PREFIX_TABLE (PREFIX_VEX_3A63) },
7911     { Bad_Opcode },
7912     { Bad_Opcode },
7913     { Bad_Opcode },
7914     { Bad_Opcode },
7915     /* 68 */
7916     { PREFIX_TABLE (PREFIX_VEX_3A68) },
7917     { PREFIX_TABLE (PREFIX_VEX_3A69) },
7918     { PREFIX_TABLE (PREFIX_VEX_3A6A) },
7919     { PREFIX_TABLE (PREFIX_VEX_3A6B) },
7920     { PREFIX_TABLE (PREFIX_VEX_3A6C) },
7921     { PREFIX_TABLE (PREFIX_VEX_3A6D) },
7922     { PREFIX_TABLE (PREFIX_VEX_3A6E) },
7923     { PREFIX_TABLE (PREFIX_VEX_3A6F) },
7924     /* 70 */
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     { Bad_Opcode },
7930     { Bad_Opcode },
7931     { Bad_Opcode },
7932     { Bad_Opcode },
7933     /* 78 */
7934     { PREFIX_TABLE (PREFIX_VEX_3A78) },
7935     { PREFIX_TABLE (PREFIX_VEX_3A79) },
7936     { PREFIX_TABLE (PREFIX_VEX_3A7A) },
7937     { PREFIX_TABLE (PREFIX_VEX_3A7B) },
7938     { PREFIX_TABLE (PREFIX_VEX_3A7C) },
7939     { PREFIX_TABLE (PREFIX_VEX_3A7D) },
7940     { PREFIX_TABLE (PREFIX_VEX_3A7E) },
7941     { PREFIX_TABLE (PREFIX_VEX_3A7F) },
7942     /* 80 */
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     { Bad_Opcode },
7948     { Bad_Opcode },
7949     { Bad_Opcode },
7950     { Bad_Opcode },
7951     /* 88 */
7952     { Bad_Opcode },
7953     { Bad_Opcode },
7954     { Bad_Opcode },
7955     { Bad_Opcode },
7956     { Bad_Opcode },
7957     { Bad_Opcode },
7958     { Bad_Opcode },
7959     { Bad_Opcode },
7960     /* 90 */
7961     { Bad_Opcode },
7962     { Bad_Opcode },
7963     { Bad_Opcode },
7964     { Bad_Opcode },
7965     { Bad_Opcode },
7966     { Bad_Opcode },
7967     { Bad_Opcode },
7968     { Bad_Opcode },
7969     /* 98 */
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { Bad_Opcode },
7973     { Bad_Opcode },
7974     { Bad_Opcode },
7975     { Bad_Opcode },
7976     { Bad_Opcode },
7977     { Bad_Opcode },
7978     /* a0 */
7979     { Bad_Opcode },
7980     { Bad_Opcode },
7981     { Bad_Opcode },
7982     { Bad_Opcode },
7983     { Bad_Opcode },
7984     { Bad_Opcode },
7985     { Bad_Opcode },
7986     { Bad_Opcode },
7987     /* a8 */
7988     { Bad_Opcode },
7989     { Bad_Opcode },
7990     { Bad_Opcode },
7991     { Bad_Opcode },
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     { Bad_Opcode },
7996     /* b0 */
7997     { Bad_Opcode },
7998     { Bad_Opcode },
7999     { Bad_Opcode },
8000     { Bad_Opcode },
8001     { Bad_Opcode },
8002     { Bad_Opcode },
8003     { Bad_Opcode },
8004     { Bad_Opcode },
8005     /* b8 */
8006     { Bad_Opcode },
8007     { Bad_Opcode },
8008     { Bad_Opcode },
8009     { Bad_Opcode },
8010     { Bad_Opcode },
8011     { Bad_Opcode },
8012     { Bad_Opcode },
8013     { Bad_Opcode },
8014     /* c0 */
8015     { Bad_Opcode },
8016     { Bad_Opcode },
8017     { Bad_Opcode },
8018     { Bad_Opcode },
8019     { Bad_Opcode },
8020     { Bad_Opcode },
8021     { Bad_Opcode },
8022     { Bad_Opcode },
8023     /* c8 */
8024     { Bad_Opcode },
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     { Bad_Opcode },
8031     { Bad_Opcode },
8032     /* d0 */
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { Bad_Opcode },
8037     { Bad_Opcode },
8038     { Bad_Opcode },
8039     { Bad_Opcode },
8040     { Bad_Opcode },
8041     /* d8 */
8042     { Bad_Opcode },
8043     { Bad_Opcode },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     { Bad_Opcode },
8048     { Bad_Opcode },
8049     { PREFIX_TABLE (PREFIX_VEX_3ADF) },
8050     /* e0 */
8051     { Bad_Opcode },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     { Bad_Opcode },
8055     { Bad_Opcode },
8056     { Bad_Opcode },
8057     { Bad_Opcode },
8058     { Bad_Opcode },
8059     /* e8 */
8060     { Bad_Opcode },
8061     { Bad_Opcode },
8062     { Bad_Opcode },
8063     { Bad_Opcode },
8064     { Bad_Opcode },
8065     { Bad_Opcode },
8066     { Bad_Opcode },
8067     { Bad_Opcode },
8068     /* f0 */
8069     { Bad_Opcode },
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     { Bad_Opcode },
8075     { Bad_Opcode },
8076     { Bad_Opcode },
8077     /* f8 */
8078     { Bad_Opcode },
8079     { Bad_Opcode },
8080     { Bad_Opcode },
8081     { Bad_Opcode },
8082     { Bad_Opcode },
8083     { Bad_Opcode },
8084     { Bad_Opcode },
8085     { Bad_Opcode },
8086   },
8087 };
8088
8089 static const struct dis386 vex_len_table[][2] = {
8090   /* VEX_LEN_10_P_1 */
8091   {
8092     { VEX_W_TABLE (VEX_W_10_P_1) },
8093     { VEX_W_TABLE (VEX_W_10_P_1) },
8094   },
8095
8096   /* VEX_LEN_10_P_3 */
8097   {
8098     { VEX_W_TABLE (VEX_W_10_P_3) },
8099     { VEX_W_TABLE (VEX_W_10_P_3) },
8100   },
8101
8102   /* VEX_LEN_11_P_1 */
8103   {
8104     { VEX_W_TABLE (VEX_W_11_P_1) },
8105     { VEX_W_TABLE (VEX_W_11_P_1) },
8106   },
8107
8108   /* VEX_LEN_11_P_3 */
8109   {
8110     { VEX_W_TABLE (VEX_W_11_P_3) },
8111     { VEX_W_TABLE (VEX_W_11_P_3) },
8112   },
8113
8114   /* VEX_LEN_12_P_0_M_0 */
8115   {
8116     { VEX_W_TABLE (VEX_W_12_P_0_M_0) },
8117   },
8118
8119   /* VEX_LEN_12_P_0_M_1 */
8120   {
8121     { VEX_W_TABLE (VEX_W_12_P_0_M_1) },
8122   },
8123
8124   /* VEX_LEN_12_P_2 */
8125   {
8126     { VEX_W_TABLE (VEX_W_12_P_2) },
8127   },
8128
8129   /* VEX_LEN_13_M_0 */
8130   {
8131     { VEX_W_TABLE (VEX_W_13_M_0) },
8132   },
8133
8134   /* VEX_LEN_16_P_0_M_0 */
8135   {
8136     { VEX_W_TABLE (VEX_W_16_P_0_M_0) },
8137   },
8138
8139   /* VEX_LEN_16_P_0_M_1 */
8140   {
8141     { VEX_W_TABLE (VEX_W_16_P_0_M_1) },
8142   },
8143
8144   /* VEX_LEN_16_P_2 */
8145   {
8146     { VEX_W_TABLE (VEX_W_16_P_2) },
8147   },
8148
8149   /* VEX_LEN_17_M_0 */
8150   {
8151     { VEX_W_TABLE (VEX_W_17_M_0) },
8152   },
8153
8154   /* VEX_LEN_2A_P_1 */
8155   {
8156     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev } },
8157     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev } },
8158   },
8159
8160   /* VEX_LEN_2A_P_3 */
8161   {
8162     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev } },
8163     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev } },
8164   },
8165
8166   /* VEX_LEN_2C_P_1 */
8167   {
8168     { "vcvttss2siY",    { Gv, EXdScalar } },
8169     { "vcvttss2siY",    { Gv, EXdScalar } },
8170   },
8171
8172   /* VEX_LEN_2C_P_3 */
8173   {
8174     { "vcvttsd2siY",    { Gv, EXqScalar } },
8175     { "vcvttsd2siY",    { Gv, EXqScalar } },
8176   },
8177
8178   /* VEX_LEN_2D_P_1 */
8179   {
8180     { "vcvtss2siY",     { Gv, EXdScalar } },
8181     { "vcvtss2siY",     { Gv, EXdScalar } },
8182   },
8183
8184   /* VEX_LEN_2D_P_3 */
8185   {
8186     { "vcvtsd2siY",     { Gv, EXqScalar } },
8187     { "vcvtsd2siY",     { Gv, EXqScalar } },
8188   },
8189
8190   /* VEX_LEN_2E_P_0 */
8191   {
8192     { VEX_W_TABLE (VEX_W_2E_P_0) },
8193     { VEX_W_TABLE (VEX_W_2E_P_0) },
8194   },
8195
8196   /* VEX_LEN_2E_P_2 */
8197   {
8198     { VEX_W_TABLE (VEX_W_2E_P_2) },
8199     { VEX_W_TABLE (VEX_W_2E_P_2) },
8200   },
8201
8202   /* VEX_LEN_2F_P_0 */
8203   {
8204     { VEX_W_TABLE (VEX_W_2F_P_0) },
8205     { VEX_W_TABLE (VEX_W_2F_P_0) },
8206   },
8207
8208   /* VEX_LEN_2F_P_2 */
8209   {
8210     { VEX_W_TABLE (VEX_W_2F_P_2) },
8211     { VEX_W_TABLE (VEX_W_2F_P_2) },
8212   },
8213
8214   /* VEX_LEN_51_P_1 */
8215   {
8216     { VEX_W_TABLE (VEX_W_51_P_1) },
8217     { VEX_W_TABLE (VEX_W_51_P_1) },
8218   },
8219
8220   /* VEX_LEN_51_P_3 */
8221   {
8222     { VEX_W_TABLE (VEX_W_51_P_3) },
8223     { VEX_W_TABLE (VEX_W_51_P_3) },
8224   },
8225
8226   /* VEX_LEN_52_P_1 */
8227   {
8228     { VEX_W_TABLE (VEX_W_52_P_1) },
8229     { VEX_W_TABLE (VEX_W_52_P_1) },
8230   },
8231
8232   /* VEX_LEN_53_P_1 */
8233   {
8234     { VEX_W_TABLE (VEX_W_53_P_1) },
8235     { VEX_W_TABLE (VEX_W_53_P_1) },
8236   },
8237
8238   /* VEX_LEN_58_P_1 */
8239   {
8240     { VEX_W_TABLE (VEX_W_58_P_1) },
8241     { VEX_W_TABLE (VEX_W_58_P_1) },
8242   },
8243
8244   /* VEX_LEN_58_P_3 */
8245   {
8246     { VEX_W_TABLE (VEX_W_58_P_3) },
8247     { VEX_W_TABLE (VEX_W_58_P_3) },
8248   },
8249
8250   /* VEX_LEN_59_P_1 */
8251   {
8252     { VEX_W_TABLE (VEX_W_59_P_1) },
8253     { VEX_W_TABLE (VEX_W_59_P_1) },
8254   },
8255
8256   /* VEX_LEN_59_P_3 */
8257   {
8258     { VEX_W_TABLE (VEX_W_59_P_3) },
8259     { VEX_W_TABLE (VEX_W_59_P_3) },
8260   },
8261
8262   /* VEX_LEN_5A_P_1 */
8263   {
8264     { VEX_W_TABLE (VEX_W_5A_P_1) },
8265     { VEX_W_TABLE (VEX_W_5A_P_1) },
8266   },
8267
8268   /* VEX_LEN_5A_P_3 */
8269   {
8270     { VEX_W_TABLE (VEX_W_5A_P_3) },
8271     { VEX_W_TABLE (VEX_W_5A_P_3) },
8272   },
8273
8274   /* VEX_LEN_5C_P_1 */
8275   {
8276     { VEX_W_TABLE (VEX_W_5C_P_1) },
8277     { VEX_W_TABLE (VEX_W_5C_P_1) },
8278   },
8279
8280   /* VEX_LEN_5C_P_3 */
8281   {
8282     { VEX_W_TABLE (VEX_W_5C_P_3) },
8283     { VEX_W_TABLE (VEX_W_5C_P_3) },
8284   },
8285
8286   /* VEX_LEN_5D_P_1 */
8287   {
8288     { VEX_W_TABLE (VEX_W_5D_P_1) },
8289     { VEX_W_TABLE (VEX_W_5D_P_1) },
8290   },
8291
8292   /* VEX_LEN_5D_P_3 */
8293   {
8294     { VEX_W_TABLE (VEX_W_5D_P_3) },
8295     { VEX_W_TABLE (VEX_W_5D_P_3) },
8296   },
8297
8298   /* VEX_LEN_5E_P_1 */
8299   {
8300     { VEX_W_TABLE (VEX_W_5E_P_1) },
8301     { VEX_W_TABLE (VEX_W_5E_P_1) },
8302   },
8303
8304   /* VEX_LEN_5E_P_3 */
8305   {
8306     { VEX_W_TABLE (VEX_W_5E_P_3) },
8307     { VEX_W_TABLE (VEX_W_5E_P_3) },
8308   },
8309
8310   /* VEX_LEN_5F_P_1 */
8311   {
8312     { VEX_W_TABLE (VEX_W_5F_P_1) },
8313     { VEX_W_TABLE (VEX_W_5F_P_1) },
8314   },
8315
8316   /* VEX_LEN_5F_P_3 */
8317   {
8318     { VEX_W_TABLE (VEX_W_5F_P_3) },
8319     { VEX_W_TABLE (VEX_W_5F_P_3) },
8320   },
8321
8322   /* VEX_LEN_60_P_2 */
8323   {
8324     { VEX_W_TABLE (VEX_W_60_P_2) },
8325   },
8326
8327   /* VEX_LEN_61_P_2 */
8328   {
8329     { VEX_W_TABLE (VEX_W_61_P_2) },
8330   },
8331
8332   /* VEX_LEN_62_P_2 */
8333   {
8334     { VEX_W_TABLE (VEX_W_62_P_2) },
8335   },
8336
8337   /* VEX_LEN_63_P_2 */
8338   {
8339     { VEX_W_TABLE (VEX_W_63_P_2) },
8340   },
8341
8342   /* VEX_LEN_64_P_2 */
8343   {
8344     { VEX_W_TABLE (VEX_W_64_P_2) },
8345   },
8346
8347   /* VEX_LEN_65_P_2 */
8348   {
8349     { VEX_W_TABLE (VEX_W_65_P_2) },
8350   },
8351
8352   /* VEX_LEN_66_P_2 */
8353   {
8354     { VEX_W_TABLE (VEX_W_66_P_2) },
8355   },
8356
8357   /* VEX_LEN_67_P_2 */
8358   {
8359     { VEX_W_TABLE (VEX_W_67_P_2) },
8360   },
8361
8362   /* VEX_LEN_68_P_2 */
8363   {
8364     { VEX_W_TABLE (VEX_W_68_P_2) },
8365   },
8366
8367   /* VEX_LEN_69_P_2 */
8368   {
8369     { VEX_W_TABLE (VEX_W_69_P_2) },
8370   },
8371
8372   /* VEX_LEN_6A_P_2 */
8373   {
8374     { VEX_W_TABLE (VEX_W_6A_P_2) },
8375   },
8376
8377   /* VEX_LEN_6B_P_2 */
8378   {
8379     { VEX_W_TABLE (VEX_W_6B_P_2) },
8380   },
8381
8382   /* VEX_LEN_6C_P_2 */
8383   {
8384     { VEX_W_TABLE (VEX_W_6C_P_2) },
8385   },
8386
8387   /* VEX_LEN_6D_P_2 */
8388   {
8389     { VEX_W_TABLE (VEX_W_6D_P_2) },
8390   },
8391
8392   /* VEX_LEN_6E_P_2 */
8393   {
8394     { "vmovK",          { XMScalar, Edq } },
8395     { "vmovK",          { XMScalar, Edq } },
8396   },
8397
8398   /* VEX_LEN_70_P_1 */
8399   {
8400     { VEX_W_TABLE (VEX_W_70_P_1) },
8401   },
8402
8403   /* VEX_LEN_70_P_2 */
8404   {
8405     { VEX_W_TABLE (VEX_W_70_P_2) },
8406   },
8407
8408   /* VEX_LEN_70_P_3 */
8409   {
8410     { VEX_W_TABLE (VEX_W_70_P_3) },
8411   },
8412
8413   /* VEX_LEN_71_R_2_P_2 */
8414   {
8415     { VEX_W_TABLE (VEX_W_71_R_2_P_2) },
8416   },
8417
8418   /* VEX_LEN_71_R_4_P_2 */
8419   {
8420     { VEX_W_TABLE (VEX_W_71_R_4_P_2) },
8421   },
8422
8423   /* VEX_LEN_71_R_6_P_2 */
8424   {
8425     { VEX_W_TABLE (VEX_W_71_R_6_P_2) },
8426   },
8427
8428   /* VEX_LEN_72_R_2_P_2 */
8429   {
8430     { VEX_W_TABLE (VEX_W_72_R_2_P_2) },
8431   },
8432
8433   /* VEX_LEN_72_R_4_P_2 */
8434   {
8435     { VEX_W_TABLE (VEX_W_72_R_4_P_2) },
8436   },
8437
8438   /* VEX_LEN_72_R_6_P_2 */
8439   {
8440     { VEX_W_TABLE (VEX_W_72_R_6_P_2) },
8441   },
8442
8443   /* VEX_LEN_73_R_2_P_2 */
8444   {
8445     { VEX_W_TABLE (VEX_W_73_R_2_P_2) },
8446   },
8447
8448   /* VEX_LEN_73_R_3_P_2 */
8449   {
8450     { VEX_W_TABLE (VEX_W_73_R_3_P_2) },
8451   },
8452
8453   /* VEX_LEN_73_R_6_P_2 */
8454   {
8455     { VEX_W_TABLE (VEX_W_73_R_6_P_2) },
8456   },
8457
8458   /* VEX_LEN_73_R_7_P_2 */
8459   {
8460     { VEX_W_TABLE (VEX_W_73_R_7_P_2) },
8461   },
8462
8463   /* VEX_LEN_74_P_2 */
8464   {
8465     { VEX_W_TABLE (VEX_W_74_P_2) },
8466   },
8467
8468   /* VEX_LEN_75_P_2 */
8469   {
8470     { VEX_W_TABLE (VEX_W_75_P_2) },
8471   },
8472
8473   /* VEX_LEN_76_P_2 */
8474   {
8475     { VEX_W_TABLE (VEX_W_76_P_2) },
8476   },
8477
8478   /* VEX_LEN_7E_P_1 */
8479   {
8480     { VEX_W_TABLE (VEX_W_7E_P_1) },
8481     { VEX_W_TABLE (VEX_W_7E_P_1) },
8482   },
8483
8484   /* VEX_LEN_7E_P_2 */
8485   {
8486     { "vmovK",          { Edq, XMScalar } },
8487     { "vmovK",          { Edq, XMScalar } },
8488   },
8489
8490   /* VEX_LEN_AE_R_2_M_0 */
8491   {
8492     { VEX_W_TABLE (VEX_W_AE_R_2_M_0) },
8493   },
8494
8495   /* VEX_LEN_AE_R_3_M_0 */
8496   {
8497     { VEX_W_TABLE (VEX_W_AE_R_3_M_0) },
8498   },
8499
8500   /* VEX_LEN_C2_P_1 */
8501   {
8502     { VEX_W_TABLE (VEX_W_C2_P_1) },
8503     { VEX_W_TABLE (VEX_W_C2_P_1) },
8504   },
8505
8506   /* VEX_LEN_C2_P_3 */
8507   {
8508     { VEX_W_TABLE (VEX_W_C2_P_3) },
8509     { VEX_W_TABLE (VEX_W_C2_P_3) },
8510   },
8511
8512   /* VEX_LEN_C4_P_2 */
8513   {
8514     { VEX_W_TABLE (VEX_W_C4_P_2) },
8515   },
8516
8517   /* VEX_LEN_C5_P_2 */
8518   {
8519     { VEX_W_TABLE (VEX_W_C5_P_2) },
8520   },
8521
8522   /* VEX_LEN_D1_P_2 */
8523   {
8524     { VEX_W_TABLE (VEX_W_D1_P_2) },
8525   },
8526
8527   /* VEX_LEN_D2_P_2 */
8528   {
8529     { VEX_W_TABLE (VEX_W_D2_P_2) },
8530   },
8531
8532   /* VEX_LEN_D3_P_2 */
8533   {
8534     { VEX_W_TABLE (VEX_W_D3_P_2) },
8535   },
8536
8537   /* VEX_LEN_D4_P_2 */
8538   {
8539     { VEX_W_TABLE (VEX_W_D4_P_2) },
8540   },
8541
8542   /* VEX_LEN_D5_P_2 */
8543   {
8544     { VEX_W_TABLE (VEX_W_D5_P_2) },
8545   },
8546
8547   /* VEX_LEN_D6_P_2 */
8548   {
8549     { VEX_W_TABLE (VEX_W_D6_P_2) },
8550     { VEX_W_TABLE (VEX_W_D6_P_2) },
8551   },
8552
8553   /* VEX_LEN_D7_P_2_M_1 */
8554   {
8555     { VEX_W_TABLE (VEX_W_D7_P_2_M_1) },
8556   },
8557
8558   /* VEX_LEN_D8_P_2 */
8559   {
8560     { VEX_W_TABLE (VEX_W_D8_P_2) },
8561   },
8562
8563   /* VEX_LEN_D9_P_2 */
8564   {
8565     { VEX_W_TABLE (VEX_W_D9_P_2) },
8566   },
8567
8568   /* VEX_LEN_DA_P_2 */
8569   {
8570     { VEX_W_TABLE (VEX_W_DA_P_2) },
8571   },
8572
8573   /* VEX_LEN_DB_P_2 */
8574   {
8575     { VEX_W_TABLE (VEX_W_DB_P_2) },
8576   },
8577
8578   /* VEX_LEN_DC_P_2 */
8579   {
8580     { VEX_W_TABLE (VEX_W_DC_P_2) },
8581   },
8582
8583   /* VEX_LEN_DD_P_2 */
8584   {
8585     { VEX_W_TABLE (VEX_W_DD_P_2) },
8586   },
8587
8588   /* VEX_LEN_DE_P_2 */
8589   {
8590     { VEX_W_TABLE (VEX_W_DE_P_2) },
8591   },
8592
8593   /* VEX_LEN_DF_P_2 */
8594   {
8595     { VEX_W_TABLE (VEX_W_DF_P_2) },
8596   },
8597
8598   /* VEX_LEN_E0_P_2 */
8599   {
8600     { VEX_W_TABLE (VEX_W_E0_P_2) },
8601   },
8602
8603   /* VEX_LEN_E1_P_2 */
8604   {
8605     { VEX_W_TABLE (VEX_W_E1_P_2) },
8606   },
8607
8608   /* VEX_LEN_E2_P_2 */
8609   {
8610     { VEX_W_TABLE (VEX_W_E2_P_2) },
8611   },
8612
8613   /* VEX_LEN_E3_P_2 */
8614   {
8615     { VEX_W_TABLE (VEX_W_E3_P_2) },
8616   },
8617
8618   /* VEX_LEN_E4_P_2 */
8619   {
8620     { VEX_W_TABLE (VEX_W_E4_P_2) },
8621   },
8622
8623   /* VEX_LEN_E5_P_2 */
8624   {
8625     { VEX_W_TABLE (VEX_W_E5_P_2) },
8626   },
8627
8628   /* VEX_LEN_E8_P_2 */
8629   {
8630     { VEX_W_TABLE (VEX_W_E8_P_2) },
8631   },
8632
8633   /* VEX_LEN_E9_P_2 */
8634   {
8635     { VEX_W_TABLE (VEX_W_E9_P_2) },
8636   },
8637
8638   /* VEX_LEN_EA_P_2 */
8639   {
8640     { VEX_W_TABLE (VEX_W_EA_P_2) },
8641   },
8642
8643   /* VEX_LEN_EB_P_2 */
8644   {
8645     { VEX_W_TABLE (VEX_W_EB_P_2) },
8646   },
8647
8648   /* VEX_LEN_EC_P_2 */
8649   {
8650     { VEX_W_TABLE (VEX_W_EC_P_2) },
8651   },
8652
8653   /* VEX_LEN_ED_P_2 */
8654   {
8655     { VEX_W_TABLE (VEX_W_ED_P_2) },
8656   },
8657
8658   /* VEX_LEN_EE_P_2 */
8659   {
8660     { VEX_W_TABLE (VEX_W_EE_P_2) },
8661   },
8662
8663   /* VEX_LEN_EF_P_2 */
8664   {
8665     { VEX_W_TABLE (VEX_W_EF_P_2) },
8666   },
8667
8668   /* VEX_LEN_F1_P_2 */
8669   {
8670     { VEX_W_TABLE (VEX_W_F1_P_2) },
8671   },
8672
8673   /* VEX_LEN_F2_P_2 */
8674   {
8675     { VEX_W_TABLE (VEX_W_F2_P_2) },
8676   },
8677
8678   /* VEX_LEN_F3_P_2 */
8679   {
8680     { VEX_W_TABLE (VEX_W_F3_P_2) },
8681   },
8682
8683   /* VEX_LEN_F4_P_2 */
8684   {
8685     { VEX_W_TABLE (VEX_W_F4_P_2) },
8686   },
8687
8688   /* VEX_LEN_F5_P_2 */
8689   {
8690     { VEX_W_TABLE (VEX_W_F5_P_2) },
8691   },
8692
8693   /* VEX_LEN_F6_P_2 */
8694   {
8695     { VEX_W_TABLE (VEX_W_F6_P_2) },
8696   },
8697
8698   /* VEX_LEN_F7_P_2 */
8699   {
8700     { VEX_W_TABLE (VEX_W_F7_P_2) },
8701   },
8702
8703   /* VEX_LEN_F8_P_2 */
8704   {
8705     { VEX_W_TABLE (VEX_W_F8_P_2) },
8706   },
8707
8708   /* VEX_LEN_F9_P_2 */
8709   {
8710     { VEX_W_TABLE (VEX_W_F9_P_2) },
8711   },
8712
8713   /* VEX_LEN_FA_P_2 */
8714   {
8715     { VEX_W_TABLE (VEX_W_FA_P_2) },
8716   },
8717
8718   /* VEX_LEN_FB_P_2 */
8719   {
8720     { VEX_W_TABLE (VEX_W_FB_P_2) },
8721   },
8722
8723   /* VEX_LEN_FC_P_2 */
8724   {
8725     { VEX_W_TABLE (VEX_W_FC_P_2) },
8726   },
8727
8728   /* VEX_LEN_FD_P_2 */
8729   {
8730     { VEX_W_TABLE (VEX_W_FD_P_2) },
8731   },
8732
8733   /* VEX_LEN_FE_P_2 */
8734   {
8735     { VEX_W_TABLE (VEX_W_FE_P_2) },
8736   },
8737
8738   /* VEX_LEN_3800_P_2 */
8739   {
8740     { VEX_W_TABLE (VEX_W_3800_P_2) },
8741   },
8742
8743   /* VEX_LEN_3801_P_2 */
8744   {
8745     { VEX_W_TABLE (VEX_W_3801_P_2) },
8746   },
8747
8748   /* VEX_LEN_3802_P_2 */
8749   {
8750     { VEX_W_TABLE (VEX_W_3802_P_2) },
8751   },
8752
8753   /* VEX_LEN_3803_P_2 */
8754   {
8755     { VEX_W_TABLE (VEX_W_3803_P_2) },
8756   },
8757
8758   /* VEX_LEN_3804_P_2 */
8759   {
8760     { VEX_W_TABLE (VEX_W_3804_P_2) },
8761   },
8762
8763   /* VEX_LEN_3805_P_2 */
8764   {
8765     { VEX_W_TABLE (VEX_W_3805_P_2) },
8766   },
8767
8768   /* VEX_LEN_3806_P_2 */
8769   {
8770     { VEX_W_TABLE (VEX_W_3806_P_2) },
8771   },
8772
8773   /* VEX_LEN_3807_P_2 */
8774   {
8775     { VEX_W_TABLE (VEX_W_3807_P_2) },
8776   },
8777
8778   /* VEX_LEN_3808_P_2 */
8779   {
8780     { VEX_W_TABLE (VEX_W_3808_P_2) },
8781   },
8782
8783   /* VEX_LEN_3809_P_2 */
8784   {
8785     { VEX_W_TABLE (VEX_W_3809_P_2) },
8786   },
8787
8788   /* VEX_LEN_380A_P_2 */
8789   {
8790     { VEX_W_TABLE (VEX_W_380A_P_2) },
8791   },
8792
8793   /* VEX_LEN_380B_P_2 */
8794   {
8795     { VEX_W_TABLE (VEX_W_380B_P_2) },
8796   },
8797
8798   /* VEX_LEN_3819_P_2_M_0 */
8799   {
8800     { Bad_Opcode },
8801     { VEX_W_TABLE (VEX_W_3819_P_2_M_0) },
8802   },
8803
8804   /* VEX_LEN_381A_P_2_M_0 */
8805   {
8806     { Bad_Opcode },
8807     { VEX_W_TABLE (VEX_W_381A_P_2_M_0) },
8808   },
8809
8810   /* VEX_LEN_381C_P_2 */
8811   {
8812     { VEX_W_TABLE (VEX_W_381C_P_2) },
8813   },
8814
8815   /* VEX_LEN_381D_P_2 */
8816   {
8817     { VEX_W_TABLE (VEX_W_381D_P_2) },
8818   },
8819
8820   /* VEX_LEN_381E_P_2 */
8821   {
8822     { VEX_W_TABLE (VEX_W_381E_P_2) },
8823   },
8824
8825   /* VEX_LEN_3820_P_2 */
8826   {
8827     { VEX_W_TABLE (VEX_W_3820_P_2) },
8828   },
8829
8830   /* VEX_LEN_3821_P_2 */
8831   {
8832     { VEX_W_TABLE (VEX_W_3821_P_2) },
8833   },
8834
8835   /* VEX_LEN_3822_P_2 */
8836   {
8837     { VEX_W_TABLE (VEX_W_3822_P_2) },
8838   },
8839
8840   /* VEX_LEN_3823_P_2 */
8841   {
8842     { VEX_W_TABLE (VEX_W_3823_P_2) },
8843   },
8844
8845   /* VEX_LEN_3824_P_2 */
8846   {
8847     { VEX_W_TABLE (VEX_W_3824_P_2) },
8848   },
8849
8850   /* VEX_LEN_3825_P_2 */
8851   {
8852     { VEX_W_TABLE (VEX_W_3825_P_2) },
8853   },
8854
8855   /* VEX_LEN_3828_P_2 */
8856   {
8857     { VEX_W_TABLE (VEX_W_3828_P_2) },
8858   },
8859
8860   /* VEX_LEN_3829_P_2 */
8861   {
8862     { VEX_W_TABLE (VEX_W_3829_P_2) },
8863   },
8864
8865   /* VEX_LEN_382A_P_2_M_0 */
8866   {
8867     { VEX_W_TABLE (VEX_W_382A_P_2_M_0) },
8868   },
8869
8870   /* VEX_LEN_382B_P_2 */
8871   {
8872     { VEX_W_TABLE (VEX_W_382B_P_2) },
8873   },
8874
8875   /* VEX_LEN_3830_P_2 */
8876   {
8877     { VEX_W_TABLE (VEX_W_3830_P_2) },
8878   },
8879
8880   /* VEX_LEN_3831_P_2 */
8881   {
8882     { VEX_W_TABLE (VEX_W_3831_P_2) },
8883   },
8884
8885   /* VEX_LEN_3832_P_2 */
8886   {
8887     { VEX_W_TABLE (VEX_W_3832_P_2) },
8888   },
8889
8890   /* VEX_LEN_3833_P_2 */
8891   {
8892     { VEX_W_TABLE (VEX_W_3833_P_2) },
8893   },
8894
8895   /* VEX_LEN_3834_P_2 */
8896   {
8897     { VEX_W_TABLE (VEX_W_3834_P_2) },
8898   },
8899
8900   /* VEX_LEN_3835_P_2 */
8901   {
8902     { VEX_W_TABLE (VEX_W_3835_P_2) },
8903   },
8904
8905   /* VEX_LEN_3837_P_2 */
8906   {
8907     { VEX_W_TABLE (VEX_W_3837_P_2) },
8908   },
8909
8910   /* VEX_LEN_3838_P_2 */
8911   {
8912     { VEX_W_TABLE (VEX_W_3838_P_2) },
8913   },
8914
8915   /* VEX_LEN_3839_P_2 */
8916   {
8917     { VEX_W_TABLE (VEX_W_3839_P_2) },
8918   },
8919
8920   /* VEX_LEN_383A_P_2 */
8921   {
8922     { VEX_W_TABLE (VEX_W_383A_P_2) },
8923   },
8924
8925   /* VEX_LEN_383B_P_2 */
8926   {
8927     { VEX_W_TABLE (VEX_W_383B_P_2) },
8928   },
8929
8930   /* VEX_LEN_383C_P_2 */
8931   {
8932     { VEX_W_TABLE (VEX_W_383C_P_2) },
8933   },
8934
8935   /* VEX_LEN_383D_P_2 */
8936   {
8937     { VEX_W_TABLE (VEX_W_383D_P_2) },
8938   },
8939
8940   /* VEX_LEN_383E_P_2 */
8941   {
8942     { VEX_W_TABLE (VEX_W_383E_P_2) },
8943   },
8944
8945   /* VEX_LEN_383F_P_2 */
8946   {
8947     { VEX_W_TABLE (VEX_W_383F_P_2) },
8948   },
8949
8950   /* VEX_LEN_3840_P_2 */
8951   {
8952     { VEX_W_TABLE (VEX_W_3840_P_2) },
8953   },
8954
8955   /* VEX_LEN_3841_P_2 */
8956   {
8957     { VEX_W_TABLE (VEX_W_3841_P_2) },
8958   },
8959
8960   /* VEX_LEN_38DB_P_2 */
8961   {
8962     { VEX_W_TABLE (VEX_W_38DB_P_2) },
8963   },
8964
8965   /* VEX_LEN_38DC_P_2 */
8966   {
8967     { VEX_W_TABLE (VEX_W_38DC_P_2) },
8968   },
8969
8970   /* VEX_LEN_38DD_P_2 */
8971   {
8972     { VEX_W_TABLE (VEX_W_38DD_P_2) },
8973   },
8974
8975   /* VEX_LEN_38DE_P_2 */
8976   {
8977     { VEX_W_TABLE (VEX_W_38DE_P_2) },
8978   },
8979
8980   /* VEX_LEN_38DF_P_2 */
8981   {
8982     { VEX_W_TABLE (VEX_W_38DF_P_2) },
8983   },
8984
8985   /* VEX_LEN_3A06_P_2 */
8986   {
8987     { Bad_Opcode },
8988     { VEX_W_TABLE (VEX_W_3A06_P_2) },
8989   },
8990
8991   /* VEX_LEN_3A0A_P_2 */
8992   {
8993     { VEX_W_TABLE (VEX_W_3A0A_P_2) },
8994     { VEX_W_TABLE (VEX_W_3A0A_P_2) },
8995   },
8996
8997   /* VEX_LEN_3A0B_P_2 */
8998   {
8999     { VEX_W_TABLE (VEX_W_3A0B_P_2) },
9000     { VEX_W_TABLE (VEX_W_3A0B_P_2) },
9001   },
9002
9003   /* VEX_LEN_3A0E_P_2 */
9004   {
9005     { VEX_W_TABLE (VEX_W_3A0E_P_2) },
9006   },
9007
9008   /* VEX_LEN_3A0F_P_2 */
9009   {
9010     { VEX_W_TABLE (VEX_W_3A0F_P_2) },
9011   },
9012
9013   /* VEX_LEN_3A14_P_2 */
9014   {
9015     { VEX_W_TABLE (VEX_W_3A14_P_2) },
9016   },
9017
9018   /* VEX_LEN_3A15_P_2 */
9019   {
9020     { VEX_W_TABLE (VEX_W_3A15_P_2) },
9021   },
9022
9023   /* VEX_LEN_3A16_P_2  */
9024   {
9025     { "vpextrK",        { Edq, XM, Ib } },
9026   },
9027
9028   /* VEX_LEN_3A17_P_2 */
9029   {
9030     { "vextractps",     { Edqd, XM, Ib } },
9031   },
9032
9033   /* VEX_LEN_3A18_P_2 */
9034   {
9035     { Bad_Opcode },
9036     { VEX_W_TABLE (VEX_W_3A18_P_2) },
9037   },
9038
9039   /* VEX_LEN_3A19_P_2 */
9040   {
9041     { Bad_Opcode },
9042     { VEX_W_TABLE (VEX_W_3A19_P_2) },
9043   },
9044
9045   /* VEX_LEN_3A20_P_2 */
9046   {
9047     { VEX_W_TABLE (VEX_W_3A20_P_2) },
9048   },
9049
9050   /* VEX_LEN_3A21_P_2 */
9051   {
9052     { VEX_W_TABLE (VEX_W_3A21_P_2) },
9053   },
9054
9055   /* VEX_LEN_3A22_P_2 */
9056   {
9057     { "vpinsrK",        { XM, Vex128, Edq, Ib } },
9058   },
9059
9060   /* VEX_LEN_3A41_P_2 */
9061   {
9062     { VEX_W_TABLE (VEX_W_3A41_P_2) },
9063   },
9064
9065   /* VEX_LEN_3A42_P_2 */
9066   {
9067     { VEX_W_TABLE (VEX_W_3A42_P_2) },
9068   },
9069
9070   /* VEX_LEN_3A44_P_2 */
9071   {
9072     { VEX_W_TABLE (VEX_W_3A44_P_2) },
9073   },
9074
9075   /* VEX_LEN_3A4C_P_2 */
9076   {
9077     { VEX_W_TABLE (VEX_W_3A4C_P_2) },
9078   },
9079
9080   /* VEX_LEN_3A60_P_2 */
9081   {
9082     { VEX_W_TABLE (VEX_W_3A60_P_2) },
9083   },
9084
9085   /* VEX_LEN_3A61_P_2 */
9086   {
9087     { VEX_W_TABLE (VEX_W_3A61_P_2) },
9088   },
9089
9090   /* VEX_LEN_3A62_P_2 */
9091   {
9092     { VEX_W_TABLE (VEX_W_3A62_P_2) },
9093   },
9094
9095   /* VEX_LEN_3A63_P_2 */
9096   {
9097     { VEX_W_TABLE (VEX_W_3A63_P_2) },
9098   },
9099
9100   /* VEX_LEN_3A6A_P_2 */
9101   {
9102     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9103   },
9104
9105   /* VEX_LEN_3A6B_P_2 */
9106   {
9107     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9108   },
9109
9110   /* VEX_LEN_3A6E_P_2 */
9111   {
9112     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9113   },
9114
9115   /* VEX_LEN_3A6F_P_2 */
9116   {
9117     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9118   },
9119
9120   /* VEX_LEN_3A7A_P_2 */
9121   {
9122     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9123   },
9124
9125   /* VEX_LEN_3A7B_P_2 */
9126   {
9127     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9128   },
9129
9130   /* VEX_LEN_3A7E_P_2 */
9131   {
9132     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9133   },
9134
9135   /* VEX_LEN_3A7F_P_2 */
9136   {
9137     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9138   },
9139
9140   /* VEX_LEN_3ADF_P_2 */
9141   {
9142     { VEX_W_TABLE (VEX_W_3ADF_P_2) },
9143   },
9144
9145   /* VEX_LEN_XOP_09_80 */
9146   {
9147     { "vfrczps",        { XM, EXxmm } },
9148     { "vfrczps",        { XM, EXymmq } },
9149   },
9150
9151   /* VEX_LEN_XOP_09_81 */
9152   {
9153     { "vfrczpd",        { XM, EXxmm } },
9154     { "vfrczpd",        { XM, EXymmq } },
9155   },
9156 };
9157
9158 static const struct dis386 vex_w_table[][2] = {
9159   {
9160     /* VEX_W_10_P_0 */
9161     { "vmovups",        { XM, EXx } },
9162   },
9163   {
9164     /* VEX_W_10_P_1 */
9165     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar } },
9166   },
9167   {
9168     /* VEX_W_10_P_2 */
9169     { "vmovupd",        { XM, EXx } },
9170   },
9171   {
9172     /* VEX_W_10_P_3 */
9173     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar } },
9174   },
9175   {
9176     /* VEX_W_11_P_0 */
9177     { "vmovups",        { EXxS, XM } },
9178   },
9179   {
9180     /* VEX_W_11_P_1 */
9181     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar } },
9182   },
9183   {
9184     /* VEX_W_11_P_2 */
9185     { "vmovupd",        { EXxS, XM } },
9186   },
9187   {
9188     /* VEX_W_11_P_3 */
9189     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar } },
9190   },
9191   {
9192     /* VEX_W_12_P_0_M_0 */
9193     { "vmovlps",        { XM, Vex128, EXq } },
9194   },
9195   {
9196     /* VEX_W_12_P_0_M_1 */
9197     { "vmovhlps",       { XM, Vex128, EXq } },
9198   },
9199   {
9200     /* VEX_W_12_P_1 */
9201     { "vmovsldup",      { XM, EXx } },
9202   },
9203   {
9204     /* VEX_W_12_P_2 */
9205     { "vmovlpd",        { XM, Vex128, EXq } },
9206   },
9207   {
9208     /* VEX_W_12_P_3 */
9209     { "vmovddup",       { XM, EXymmq } },
9210   },
9211   {
9212     /* VEX_W_13_M_0 */
9213     { "vmovlpX",        { EXq, XM } },
9214   },
9215   {
9216     /* VEX_W_14 */
9217     { "vunpcklpX",      { XM, Vex, EXx } },
9218   },
9219   {
9220     /* VEX_W_15 */
9221     { "vunpckhpX",      { XM, Vex, EXx } },
9222   },
9223   {
9224     /* VEX_W_16_P_0_M_0 */
9225     { "vmovhps",        { XM, Vex128, EXq } },
9226   },
9227   {
9228     /* VEX_W_16_P_0_M_1 */
9229     { "vmovlhps",       { XM, Vex128, EXq } },
9230   },
9231   {
9232     /* VEX_W_16_P_1 */
9233     { "vmovshdup",      { XM, EXx } },
9234   },
9235   {
9236     /* VEX_W_16_P_2 */
9237     { "vmovhpd",        { XM, Vex128, EXq } },
9238   },
9239   {
9240     /* VEX_W_17_M_0 */
9241     { "vmovhpX",        { EXq, XM } },
9242   },
9243   {
9244     /* VEX_W_28 */
9245     { "vmovapX",        { XM, EXx } },
9246   },
9247   {
9248     /* VEX_W_29 */
9249     { "vmovapX",        { EXxS, XM } },
9250   },
9251   {
9252     /* VEX_W_2B_M_0 */
9253     { "vmovntpX",       { Mx, XM } },
9254   },
9255   {
9256     /* VEX_W_2E_P_0 */
9257     { "vucomiss",       { XMScalar, EXdScalar } }, 
9258   },
9259   {
9260     /* VEX_W_2E_P_2 */
9261     { "vucomisd",       { XMScalar, EXqScalar } }, 
9262   },
9263   {
9264     /* VEX_W_2F_P_0 */
9265     { "vcomiss",        { XMScalar, EXdScalar } },
9266   },
9267   {
9268     /* VEX_W_2F_P_2 */
9269     { "vcomisd",        { XMScalar, EXqScalar } },
9270   },
9271   {
9272     /* VEX_W_50_M_0 */
9273     { "vmovmskpX",      { Gdq, XS } },
9274   },
9275   {
9276     /* VEX_W_51_P_0 */
9277     { "vsqrtps",        { XM, EXx } },
9278   },
9279   {
9280     /* VEX_W_51_P_1 */
9281     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar } },
9282   },
9283   {
9284     /* VEX_W_51_P_2  */
9285     { "vsqrtpd",        { XM, EXx } },
9286   },
9287   {
9288     /* VEX_W_51_P_3 */
9289     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar } },
9290   },
9291   {
9292     /* VEX_W_52_P_0 */
9293     { "vrsqrtps",       { XM, EXx } },
9294   },
9295   {
9296     /* VEX_W_52_P_1 */
9297     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar } },
9298   },
9299   {
9300     /* VEX_W_53_P_0  */
9301     { "vrcpps",         { XM, EXx } },
9302   },
9303   {
9304     /* VEX_W_53_P_1  */
9305     { "vrcpss",         { XMScalar, VexScalar, EXdScalar } },
9306   },
9307   {
9308     /* VEX_W_58_P_0  */
9309     { "vaddps",         { XM, Vex, EXx } },
9310   },
9311   {
9312     /* VEX_W_58_P_1  */
9313     { "vaddss",         { XMScalar, VexScalar, EXdScalar } },
9314   },
9315   {
9316     /* VEX_W_58_P_2  */
9317     { "vaddpd",         { XM, Vex, EXx } },
9318   },
9319   {
9320     /* VEX_W_58_P_3  */
9321     { "vaddsd",         { XMScalar, VexScalar, EXqScalar } },
9322   },
9323   {
9324     /* VEX_W_59_P_0  */
9325     { "vmulps",         { XM, Vex, EXx } },
9326   },
9327   {
9328     /* VEX_W_59_P_1  */
9329     { "vmulss",         { XMScalar, VexScalar, EXdScalar } },
9330   },
9331   {
9332     /* VEX_W_59_P_2  */
9333     { "vmulpd",         { XM, Vex, EXx } },
9334   },
9335   {
9336     /* VEX_W_59_P_3  */
9337     { "vmulsd",         { XMScalar, VexScalar, EXqScalar } },
9338   },
9339   {
9340     /* VEX_W_5A_P_0  */
9341     { "vcvtps2pd",      { XM, EXxmmq } },
9342   },
9343   {
9344     /* VEX_W_5A_P_1  */
9345     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar } },
9346   },
9347   {
9348     /* VEX_W_5A_P_3  */
9349     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar } },
9350   },
9351   {
9352     /* VEX_W_5B_P_0  */
9353     { "vcvtdq2ps",      { XM, EXx } },
9354   },
9355   {
9356     /* VEX_W_5B_P_1  */
9357     { "vcvttps2dq",     { XM, EXx } },
9358   },
9359   {
9360     /* VEX_W_5B_P_2  */
9361     { "vcvtps2dq",      { XM, EXx } },
9362   },
9363   {
9364     /* VEX_W_5C_P_0  */
9365     { "vsubps",         { XM, Vex, EXx } },
9366   },
9367   {
9368     /* VEX_W_5C_P_1  */
9369     { "vsubss",         { XMScalar, VexScalar, EXdScalar } },
9370   },
9371   {
9372     /* VEX_W_5C_P_2  */
9373     { "vsubpd",         { XM, Vex, EXx } },
9374   },
9375   {
9376     /* VEX_W_5C_P_3  */
9377     { "vsubsd",         { XMScalar, VexScalar, EXqScalar } },
9378   },
9379   {
9380     /* VEX_W_5D_P_0  */
9381     { "vminps",         { XM, Vex, EXx } },
9382   },
9383   {
9384     /* VEX_W_5D_P_1  */
9385     { "vminss",         { XMScalar, VexScalar, EXdScalar } },
9386   },
9387   {
9388     /* VEX_W_5D_P_2  */
9389     { "vminpd",         { XM, Vex, EXx } },
9390   },
9391   {
9392     /* VEX_W_5D_P_3  */
9393     { "vminsd",         { XMScalar, VexScalar, EXqScalar } },
9394   },
9395   {
9396     /* VEX_W_5E_P_0  */
9397     { "vdivps",         { XM, Vex, EXx } },
9398   },
9399   {
9400     /* VEX_W_5E_P_1  */
9401     { "vdivss",         { XMScalar, VexScalar, EXdScalar } },
9402   },
9403   {
9404     /* VEX_W_5E_P_2  */
9405     { "vdivpd",         { XM, Vex, EXx } },
9406   },
9407   {
9408     /* VEX_W_5E_P_3  */
9409     { "vdivsd",         { XMScalar, VexScalar, EXqScalar } },
9410   },
9411   {
9412     /* VEX_W_5F_P_0  */
9413     { "vmaxps",         { XM, Vex, EXx } },
9414   },
9415   {
9416     /* VEX_W_5F_P_1  */
9417     { "vmaxss",         { XMScalar, VexScalar, EXdScalar } },
9418   },
9419   {
9420     /* VEX_W_5F_P_2  */
9421     { "vmaxpd",         { XM, Vex, EXx } },
9422   },
9423   {
9424     /* VEX_W_5F_P_3  */
9425     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar } },
9426   },
9427   {
9428     /* VEX_W_60_P_2  */
9429     { "vpunpcklbw",     { XM, Vex128, EXx } },
9430   },
9431   {
9432     /* VEX_W_61_P_2  */
9433     { "vpunpcklwd",     { XM, Vex128, EXx } },
9434   },
9435   {
9436     /* VEX_W_62_P_2  */
9437     { "vpunpckldq",     { XM, Vex128, EXx } },
9438   },
9439   {
9440     /* VEX_W_63_P_2  */
9441     { "vpacksswb",      { XM, Vex128, EXx } },
9442   },
9443   {
9444     /* VEX_W_64_P_2  */
9445     { "vpcmpgtb",       { XM, Vex128, EXx } },
9446   },
9447   {
9448     /* VEX_W_65_P_2  */
9449     { "vpcmpgtw",       { XM, Vex128, EXx } },
9450   },
9451   {
9452     /* VEX_W_66_P_2  */
9453     { "vpcmpgtd",       { XM, Vex128, EXx } },
9454   },
9455   {
9456     /* VEX_W_67_P_2  */
9457     { "vpackuswb",      { XM, Vex128, EXx } },
9458   },
9459   {
9460     /* VEX_W_68_P_2  */
9461     { "vpunpckhbw",     { XM, Vex128, EXx } },
9462   },
9463   {
9464     /* VEX_W_69_P_2  */
9465     { "vpunpckhwd",     { XM, Vex128, EXx } },
9466   },
9467   {
9468     /* VEX_W_6A_P_2  */
9469     { "vpunpckhdq",     { XM, Vex128, EXx } },
9470   },
9471   {
9472     /* VEX_W_6B_P_2  */
9473     { "vpackssdw",      { XM, Vex128, EXx } },
9474   },
9475   {
9476     /* VEX_W_6C_P_2  */
9477     { "vpunpcklqdq",    { XM, Vex128, EXx } },
9478   },
9479   {
9480     /* VEX_W_6D_P_2  */
9481     { "vpunpckhqdq",    { XM, Vex128, EXx } },
9482   },
9483   {
9484     /* VEX_W_6F_P_1  */
9485     { "vmovdqu",        { XM, EXx } },
9486   },
9487   {
9488     /* VEX_W_6F_P_2  */
9489     { "vmovdqa",        { XM, EXx } },
9490   },
9491   {
9492     /* VEX_W_70_P_1 */
9493     { "vpshufhw",       { XM, EXx, Ib } },
9494   },
9495   {
9496     /* VEX_W_70_P_2 */
9497     { "vpshufd",        { XM, EXx, Ib } },
9498   },
9499   {
9500     /* VEX_W_70_P_3 */
9501     { "vpshuflw",       { XM, EXx, Ib } },
9502   },
9503   {
9504     /* VEX_W_71_R_2_P_2  */
9505     { "vpsrlw",         { Vex128, XS, Ib } },
9506   },
9507   {
9508     /* VEX_W_71_R_4_P_2  */
9509     { "vpsraw",         { Vex128, XS, Ib } },
9510   },
9511   {
9512     /* VEX_W_71_R_6_P_2  */
9513     { "vpsllw",         { Vex128, XS, Ib } },
9514   },
9515   {
9516     /* VEX_W_72_R_2_P_2  */
9517     { "vpsrld",         { Vex128, XS, Ib } },
9518   },
9519   {
9520     /* VEX_W_72_R_4_P_2  */
9521     { "vpsrad",         { Vex128, XS, Ib } },
9522   },
9523   {
9524     /* VEX_W_72_R_6_P_2  */
9525     { "vpslld",         { Vex128, XS, Ib } },
9526   },
9527   {
9528     /* VEX_W_73_R_2_P_2  */
9529     { "vpsrlq",         { Vex128, XS, Ib } },
9530   },
9531   {
9532     /* VEX_W_73_R_3_P_2  */
9533     { "vpsrldq",        { Vex128, XS, Ib } },
9534   },
9535   {
9536     /* VEX_W_73_R_6_P_2  */
9537     { "vpsllq",         { Vex128, XS, Ib } },
9538   },
9539   {
9540     /* VEX_W_73_R_7_P_2  */
9541     { "vpslldq",        { Vex128, XS, Ib } },
9542   },
9543   {
9544     /* VEX_W_74_P_2 */
9545     { "vpcmpeqb",       { XM, Vex128, EXx } },
9546   },
9547   {
9548     /* VEX_W_75_P_2 */
9549     { "vpcmpeqw",       { XM, Vex128, EXx } },
9550   },
9551   {
9552     /* VEX_W_76_P_2 */
9553     { "vpcmpeqd",       { XM, Vex128, EXx } },
9554   },
9555   {
9556     /* VEX_W_77_P_0 */
9557     { "",               { VZERO } },
9558   },
9559   {
9560     /* VEX_W_7C_P_2 */
9561     { "vhaddpd",        { XM, Vex, EXx } },
9562   },
9563   {
9564     /* VEX_W_7C_P_3 */
9565     { "vhaddps",        { XM, Vex, EXx } },
9566   },
9567   {
9568     /* VEX_W_7D_P_2 */
9569     { "vhsubpd",        { XM, Vex, EXx } },
9570   },
9571   {
9572     /* VEX_W_7D_P_3 */
9573     { "vhsubps",        { XM, Vex, EXx } },
9574   },
9575   {
9576     /* VEX_W_7E_P_1 */
9577     { "vmovq",          { XMScalar, EXqScalar } },
9578   },
9579   {
9580     /* VEX_W_7F_P_1 */
9581     { "vmovdqu",        { EXxS, XM } },
9582   },
9583   {
9584     /* VEX_W_7F_P_2 */
9585     { "vmovdqa",        { EXxS, XM } },
9586   },
9587   {
9588     /* VEX_W_AE_R_2_M_0 */
9589     { "vldmxcsr",       { Md } },
9590   },
9591   {
9592     /* VEX_W_AE_R_3_M_0 */
9593     { "vstmxcsr",       { Md } },
9594   },
9595   {
9596     /* VEX_W_C2_P_0 */
9597     { "vcmpps",         { XM, Vex, EXx, VCMP } },
9598   },
9599   {
9600     /* VEX_W_C2_P_1 */
9601     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP } },
9602   },
9603   {
9604     /* VEX_W_C2_P_2 */
9605     { "vcmppd",         { XM, Vex, EXx, VCMP } },
9606   },
9607   {
9608     /* VEX_W_C2_P_3 */
9609     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP } },
9610   },
9611   {
9612     /* VEX_W_C4_P_2 */
9613     { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
9614   },
9615   {
9616     /* VEX_W_C5_P_2 */
9617     { "vpextrw",        { Gdq, XS, Ib } },
9618   },
9619   {
9620     /* VEX_W_D0_P_2 */
9621     { "vaddsubpd",      { XM, Vex, EXx } },
9622   },
9623   {
9624     /* VEX_W_D0_P_3 */
9625     { "vaddsubps",      { XM, Vex, EXx } },
9626   },
9627   {
9628     /* VEX_W_D1_P_2 */
9629     { "vpsrlw",         { XM, Vex128, EXx } },
9630   },
9631   {
9632     /* VEX_W_D2_P_2 */
9633     { "vpsrld",         { XM, Vex128, EXx } },
9634   },
9635   {
9636     /* VEX_W_D3_P_2 */
9637     { "vpsrlq",         { XM, Vex128, EXx } },
9638   },
9639   {
9640     /* VEX_W_D4_P_2 */
9641     { "vpaddq",         { XM, Vex128, EXx } },
9642   },
9643   {
9644     /* VEX_W_D5_P_2 */
9645     { "vpmullw",        { XM, Vex128, EXx } },
9646   },
9647   {
9648     /* VEX_W_D6_P_2 */
9649     { "vmovq",          { EXqScalarS, XMScalar } },
9650   },
9651   {
9652     /* VEX_W_D7_P_2_M_1 */
9653     { "vpmovmskb",      { Gdq, XS } },
9654   },
9655   {
9656     /* VEX_W_D8_P_2 */
9657     { "vpsubusb",       { XM, Vex128, EXx } },
9658   },
9659   {
9660     /* VEX_W_D9_P_2 */
9661     { "vpsubusw",       { XM, Vex128, EXx } },
9662   },
9663   {
9664     /* VEX_W_DA_P_2 */
9665     { "vpminub",        { XM, Vex128, EXx } },
9666   },
9667   {
9668     /* VEX_W_DB_P_2 */
9669     { "vpand",          { XM, Vex128, EXx } },
9670   },
9671   {
9672     /* VEX_W_DC_P_2 */
9673     { "vpaddusb",       { XM, Vex128, EXx } },
9674   },
9675   {
9676     /* VEX_W_DD_P_2 */
9677     { "vpaddusw",       { XM, Vex128, EXx } },
9678   },
9679   {
9680     /* VEX_W_DE_P_2 */
9681     { "vpmaxub",        { XM, Vex128, EXx } },
9682   },
9683   {
9684     /* VEX_W_DF_P_2 */
9685     { "vpandn",         { XM, Vex128, EXx } },
9686   },
9687   {
9688     /* VEX_W_E0_P_2  */
9689     { "vpavgb",         { XM, Vex128, EXx } },
9690   },
9691   {
9692     /* VEX_W_E1_P_2  */
9693     { "vpsraw",         { XM, Vex128, EXx } },
9694   },
9695   {
9696     /* VEX_W_E2_P_2  */
9697     { "vpsrad",         { XM, Vex128, EXx } },
9698   },
9699   {
9700     /* VEX_W_E3_P_2  */
9701     { "vpavgw",         { XM, Vex128, EXx } },
9702   },
9703   {
9704     /* VEX_W_E4_P_2  */
9705     { "vpmulhuw",       { XM, Vex128, EXx } },
9706   },
9707   {
9708     /* VEX_W_E5_P_2  */
9709     { "vpmulhw",        { XM, Vex128, EXx } },
9710   },
9711   {
9712     /* VEX_W_E6_P_1  */
9713     { "vcvtdq2pd",      { XM, EXxmmq } },
9714   },
9715   {
9716     /* VEX_W_E6_P_2  */
9717     { "vcvttpd2dq%XY",  { XMM, EXx } },
9718   },
9719   {
9720     /* VEX_W_E6_P_3  */
9721     { "vcvtpd2dq%XY",   { XMM, EXx } },
9722   },
9723   {
9724     /* VEX_W_E7_P_2_M_0 */
9725     { "vmovntdq",       { Mx, XM } },
9726   },
9727   {
9728     /* VEX_W_E8_P_2  */
9729     { "vpsubsb",        { XM, Vex128, EXx } },
9730   },
9731   {
9732     /* VEX_W_E9_P_2  */
9733     { "vpsubsw",        { XM, Vex128, EXx } },
9734   },
9735   {
9736     /* VEX_W_EA_P_2  */
9737     { "vpminsw",        { XM, Vex128, EXx } },
9738   },
9739   {
9740     /* VEX_W_EB_P_2  */
9741     { "vpor",           { XM, Vex128, EXx } },
9742   },
9743   {
9744     /* VEX_W_EC_P_2  */
9745     { "vpaddsb",        { XM, Vex128, EXx } },
9746   },
9747   {
9748     /* VEX_W_ED_P_2  */
9749     { "vpaddsw",        { XM, Vex128, EXx } },
9750   },
9751   {
9752     /* VEX_W_EE_P_2  */
9753     { "vpmaxsw",        { XM, Vex128, EXx } },
9754   },
9755   {
9756     /* VEX_W_EF_P_2  */
9757     { "vpxor",          { XM, Vex128, EXx } },
9758   },
9759   {
9760     /* VEX_W_F0_P_3_M_0 */
9761     { "vlddqu",         { XM, M } },
9762   },
9763   {
9764     /* VEX_W_F1_P_2 */
9765     { "vpsllw",         { XM, Vex128, EXx } },
9766   },
9767   {
9768     /* VEX_W_F2_P_2 */
9769     { "vpslld",         { XM, Vex128, EXx } },
9770   },
9771   {
9772     /* VEX_W_F3_P_2 */
9773     { "vpsllq",         { XM, Vex128, EXx } },
9774   },
9775   {
9776     /* VEX_W_F4_P_2 */
9777     { "vpmuludq",       { XM, Vex128, EXx } },
9778   },
9779   {
9780     /* VEX_W_F5_P_2 */
9781     { "vpmaddwd",       { XM, Vex128, EXx } },
9782   },
9783   {
9784     /* VEX_W_F6_P_2 */
9785     { "vpsadbw",        { XM, Vex128, EXx } },
9786   },
9787   {
9788     /* VEX_W_F7_P_2 */
9789     { "vmaskmovdqu",    { XM, XS } },
9790   },
9791   {
9792     /* VEX_W_F8_P_2 */
9793     { "vpsubb",         { XM, Vex128, EXx } },
9794   },
9795   {
9796     /* VEX_W_F9_P_2 */
9797     { "vpsubw",         { XM, Vex128, EXx } },
9798   },
9799   {
9800     /* VEX_W_FA_P_2 */
9801     { "vpsubd",         { XM, Vex128, EXx } },
9802   },
9803   {
9804     /* VEX_W_FB_P_2 */
9805     { "vpsubq",         { XM, Vex128, EXx } },
9806   },
9807   {
9808     /* VEX_W_FC_P_2 */
9809     { "vpaddb",         { XM, Vex128, EXx } },
9810   },
9811   {
9812     /* VEX_W_FD_P_2 */
9813     { "vpaddw",         { XM, Vex128, EXx } },
9814   },
9815   {
9816     /* VEX_W_FE_P_2 */
9817     { "vpaddd",         { XM, Vex128, EXx } },
9818   },
9819   {
9820     /* VEX_W_3800_P_2  */
9821     { "vpshufb",        { XM, Vex128, EXx } },
9822   },
9823   {
9824     /* VEX_W_3801_P_2  */
9825     { "vphaddw",        { XM, Vex128, EXx } },
9826   },
9827   {
9828     /* VEX_W_3802_P_2  */
9829     { "vphaddd",        { XM, Vex128, EXx } },
9830   },
9831   {
9832     /* VEX_W_3803_P_2  */
9833     { "vphaddsw",       { XM, Vex128, EXx } },
9834   },
9835   {
9836     /* VEX_W_3804_P_2  */
9837     { "vpmaddubsw",     { XM, Vex128, EXx } },
9838   },
9839   {
9840     /* VEX_W_3805_P_2  */
9841     { "vphsubw",        { XM, Vex128, EXx } },
9842   },
9843   {
9844     /* VEX_W_3806_P_2  */
9845     { "vphsubd",        { XM, Vex128, EXx } },
9846   },
9847   {
9848     /* VEX_W_3807_P_2  */
9849     { "vphsubsw",       { XM, Vex128, EXx } },
9850   },
9851   {
9852     /* VEX_W_3808_P_2  */
9853     { "vpsignb",        { XM, Vex128, EXx } },
9854   },
9855   {
9856     /* VEX_W_3809_P_2  */
9857     { "vpsignw",        { XM, Vex128, EXx } },
9858   },
9859   {
9860     /* VEX_W_380A_P_2  */
9861     { "vpsignd",        { XM, Vex128, EXx } },
9862   },
9863   {
9864     /* VEX_W_380B_P_2  */
9865     { "vpmulhrsw",      { XM, Vex128, EXx } },
9866   },
9867   {
9868     /* VEX_W_380C_P_2  */
9869     { "vpermilps",      { XM, Vex, EXx } },
9870   },
9871   {
9872     /* VEX_W_380D_P_2  */
9873     { "vpermilpd",      { XM, Vex, EXx } },
9874   },
9875   {
9876     /* VEX_W_380E_P_2  */
9877     { "vtestps",        { XM, EXx } },
9878   },
9879   {
9880     /* VEX_W_380F_P_2  */
9881     { "vtestpd",        { XM, EXx } },
9882   },
9883   {
9884     /* VEX_W_3817_P_2 */
9885     { "vptest",         { XM, EXx } },
9886   },
9887   {
9888     /* VEX_W_3818_P_2_M_0 */
9889     { "vbroadcastss",   { XM, Md } },
9890   },
9891   {
9892     /* VEX_W_3819_P_2_M_0 */
9893     { "vbroadcastsd",   { XM, Mq } },
9894   },
9895   {
9896     /* VEX_W_381A_P_2_M_0 */
9897     { "vbroadcastf128", { XM, Mxmm } },
9898   },
9899   {
9900     /* VEX_W_381C_P_2 */
9901     { "vpabsb",         { XM, EXx } },
9902   },
9903   {
9904     /* VEX_W_381D_P_2 */
9905     { "vpabsw",         { XM, EXx } },
9906   },
9907   {
9908     /* VEX_W_381E_P_2 */
9909     { "vpabsd",         { XM, EXx } },
9910   },
9911   {
9912     /* VEX_W_3820_P_2 */
9913     { "vpmovsxbw",      { XM, EXq } },
9914   },
9915   {
9916     /* VEX_W_3821_P_2 */
9917     { "vpmovsxbd",      { XM, EXd } },
9918   },
9919   {
9920     /* VEX_W_3822_P_2 */
9921     { "vpmovsxbq",      { XM, EXw } },
9922   },
9923   {
9924     /* VEX_W_3823_P_2 */
9925     { "vpmovsxwd",      { XM, EXq } },
9926   },
9927   {
9928     /* VEX_W_3824_P_2 */
9929     { "vpmovsxwq",      { XM, EXd } },
9930   },
9931   {
9932     /* VEX_W_3825_P_2 */
9933     { "vpmovsxdq",      { XM, EXq } },
9934   },
9935   {
9936     /* VEX_W_3828_P_2 */
9937     { "vpmuldq",        { XM, Vex128, EXx } },
9938   },
9939   {
9940     /* VEX_W_3829_P_2 */
9941     { "vpcmpeqq",       { XM, Vex128, EXx } },
9942   },
9943   {
9944     /* VEX_W_382A_P_2_M_0 */
9945     { "vmovntdqa",      { XM, Mx } },
9946   },
9947   {
9948     /* VEX_W_382B_P_2 */
9949     { "vpackusdw",      { XM, Vex128, EXx } },
9950   },
9951   {
9952     /* VEX_W_382C_P_2_M_0 */
9953     { "vmaskmovps",     { XM, Vex, Mx } },
9954   },
9955   {
9956     /* VEX_W_382D_P_2_M_0 */
9957     { "vmaskmovpd",     { XM, Vex, Mx } },
9958   },
9959   {
9960     /* VEX_W_382E_P_2_M_0 */
9961     { "vmaskmovps",     { Mx, Vex, XM } },
9962   },
9963   {
9964     /* VEX_W_382F_P_2_M_0 */
9965     { "vmaskmovpd",     { Mx, Vex, XM } },
9966   },
9967   {
9968     /* VEX_W_3830_P_2 */
9969     { "vpmovzxbw",      { XM, EXq } },
9970   },
9971   {
9972     /* VEX_W_3831_P_2 */
9973     { "vpmovzxbd",      { XM, EXd } },
9974   },
9975   {
9976     /* VEX_W_3832_P_2 */
9977     { "vpmovzxbq",      { XM, EXw } },
9978   },
9979   {
9980     /* VEX_W_3833_P_2 */
9981     { "vpmovzxwd",      { XM, EXq } },
9982   },
9983   {
9984     /* VEX_W_3834_P_2 */
9985     { "vpmovzxwq",      { XM, EXd } },
9986   },
9987   {
9988     /* VEX_W_3835_P_2 */
9989     { "vpmovzxdq",      { XM, EXq } },
9990   },
9991   {
9992     /* VEX_W_3837_P_2 */
9993     { "vpcmpgtq",       { XM, Vex128, EXx } },
9994   },
9995   {
9996     /* VEX_W_3838_P_2 */
9997     { "vpminsb",        { XM, Vex128, EXx } },
9998   },
9999   {
10000     /* VEX_W_3839_P_2 */
10001     { "vpminsd",        { XM, Vex128, EXx } },
10002   },
10003   {
10004     /* VEX_W_383A_P_2 */
10005     { "vpminuw",        { XM, Vex128, EXx } },
10006   },
10007   {
10008     /* VEX_W_383B_P_2 */
10009     { "vpminud",        { XM, Vex128, EXx } },
10010   },
10011   {
10012     /* VEX_W_383C_P_2 */
10013     { "vpmaxsb",        { XM, Vex128, EXx } },
10014   },
10015   {
10016     /* VEX_W_383D_P_2 */
10017     { "vpmaxsd",        { XM, Vex128, EXx } },
10018   },
10019   {
10020     /* VEX_W_383E_P_2 */
10021     { "vpmaxuw",        { XM, Vex128, EXx } },
10022   },
10023   {
10024     /* VEX_W_383F_P_2 */
10025     { "vpmaxud",        { XM, Vex128, EXx } },
10026   },
10027   {
10028     /* VEX_W_3840_P_2 */
10029     { "vpmulld",        { XM, Vex128, EXx } },
10030   },
10031   {
10032     /* VEX_W_3841_P_2 */
10033     { "vphminposuw",    { XM, EXx } },
10034   },
10035   {
10036     /* VEX_W_38DB_P_2 */
10037     { "vaesimc",        { XM, EXx } },
10038   },
10039   {
10040     /* VEX_W_38DC_P_2 */
10041     { "vaesenc",        { XM, Vex128, EXx } },
10042   },
10043   {
10044     /* VEX_W_38DD_P_2 */
10045     { "vaesenclast",    { XM, Vex128, EXx } },
10046   },
10047   {
10048     /* VEX_W_38DE_P_2 */
10049     { "vaesdec",        { XM, Vex128, EXx } },
10050   },
10051   {
10052     /* VEX_W_38DF_P_2 */
10053     { "vaesdeclast",    { XM, Vex128, EXx } },
10054   },
10055   {
10056     /* VEX_W_3A04_P_2 */
10057     { "vpermilps",      { XM, EXx, Ib } },
10058   },
10059   {
10060     /* VEX_W_3A05_P_2 */
10061     { "vpermilpd",      { XM, EXx, Ib } },
10062   },
10063   {
10064     /* VEX_W_3A06_P_2 */
10065     { "vperm2f128",     { XM, Vex256, EXx, Ib } },
10066   },
10067   {
10068     /* VEX_W_3A08_P_2 */
10069     { "vroundps",       { XM, EXx, Ib } },
10070   },
10071   {
10072     /* VEX_W_3A09_P_2 */
10073     { "vroundpd",       { XM, EXx, Ib } },
10074   },
10075   {
10076     /* VEX_W_3A0A_P_2 */
10077     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib } },
10078   },
10079   {
10080     /* VEX_W_3A0B_P_2 */
10081     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib } },
10082   },
10083   {
10084     /* VEX_W_3A0C_P_2 */
10085     { "vblendps",       { XM, Vex, EXx, Ib } },
10086   },
10087   {
10088     /* VEX_W_3A0D_P_2 */
10089     { "vblendpd",       { XM, Vex, EXx, Ib } },
10090   },
10091   {
10092     /* VEX_W_3A0E_P_2 */
10093     { "vpblendw",       { XM, Vex128, EXx, Ib } },
10094   },
10095   {
10096     /* VEX_W_3A0F_P_2 */
10097     { "vpalignr",       { XM, Vex128, EXx, Ib } },
10098   },
10099   {
10100     /* VEX_W_3A14_P_2 */
10101     { "vpextrb",        { Edqb, XM, Ib } },
10102   },
10103   {
10104     /* VEX_W_3A15_P_2 */
10105     { "vpextrw",        { Edqw, XM, Ib } },
10106   },
10107   {
10108     /* VEX_W_3A18_P_2 */
10109     { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
10110   },
10111   {
10112     /* VEX_W_3A19_P_2 */
10113     { "vextractf128",   { EXxmm, XM, Ib } },
10114   },
10115   {
10116     /* VEX_W_3A20_P_2 */
10117     { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
10118   },
10119   {
10120     /* VEX_W_3A21_P_2 */
10121     { "vinsertps",      { XM, Vex128, EXd, Ib } },
10122   },
10123   {
10124     /* VEX_W_3A40_P_2 */
10125     { "vdpps",          { XM, Vex, EXx, Ib } },
10126   },
10127   {
10128     /* VEX_W_3A41_P_2 */
10129     { "vdppd",          { XM, Vex128, EXx, Ib } },
10130   },
10131   {
10132     /* VEX_W_3A42_P_2 */
10133     { "vmpsadbw",       { XM, Vex128, EXx, Ib } },
10134   },
10135   {
10136     /* VEX_W_3A44_P_2 */
10137     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL } },
10138   },
10139   {
10140     /* VEX_W_3A48_P_2 */
10141     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10142     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10143   },
10144   {
10145     /* VEX_W_3A49_P_2 */
10146     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10147     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
10148   },
10149   {
10150     /* VEX_W_3A4A_P_2 */
10151     { "vblendvps",      { XM, Vex, EXx, XMVexI4 } },
10152   },
10153   {
10154     /* VEX_W_3A4B_P_2 */
10155     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 } },
10156   },
10157   {
10158     /* VEX_W_3A4C_P_2 */
10159     { "vpblendvb",      { XM, Vex128, EXx, XMVexI4 } },
10160   },
10161   {
10162     /* VEX_W_3A60_P_2 */
10163     { "vpcmpestrm",     { XM, EXx, Ib } },
10164   },
10165   {
10166     /* VEX_W_3A61_P_2 */
10167     { "vpcmpestri",     { XM, EXx, Ib } },
10168   },
10169   {
10170     /* VEX_W_3A62_P_2 */
10171     { "vpcmpistrm",     { XM, EXx, Ib } },
10172   },
10173   {
10174     /* VEX_W_3A63_P_2 */
10175     { "vpcmpistri",     { XM, EXx, Ib } },
10176   },
10177   {
10178     /* VEX_W_3ADF_P_2 */
10179     { "vaeskeygenassist", { XM, EXx, Ib } },
10180   },
10181 };
10182
10183 static const struct dis386 mod_table[][2] = {
10184   {
10185     /* MOD_8D */
10186     { "leaS",           { Gv, M } },
10187   },
10188   {
10189     /* MOD_0F01_REG_0 */
10190     { X86_64_TABLE (X86_64_0F01_REG_0) },
10191     { RM_TABLE (RM_0F01_REG_0) },
10192   },
10193   {
10194     /* MOD_0F01_REG_1 */
10195     { X86_64_TABLE (X86_64_0F01_REG_1) },
10196     { RM_TABLE (RM_0F01_REG_1) },
10197   },
10198   {
10199     /* MOD_0F01_REG_2 */
10200     { X86_64_TABLE (X86_64_0F01_REG_2) },
10201     { RM_TABLE (RM_0F01_REG_2) },
10202   },
10203   {
10204     /* MOD_0F01_REG_3 */
10205     { X86_64_TABLE (X86_64_0F01_REG_3) },
10206     { RM_TABLE (RM_0F01_REG_3) },
10207   },
10208   {
10209     /* MOD_0F01_REG_7 */
10210     { "invlpg",         { Mb } },
10211     { RM_TABLE (RM_0F01_REG_7) },
10212   },
10213   {
10214     /* MOD_0F12_PREFIX_0 */
10215     { "movlps",         { XM, EXq } },
10216     { "movhlps",        { XM, EXq } },
10217   },
10218   {
10219     /* MOD_0F13 */
10220     { "movlpX",         { EXq, XM } },
10221   },
10222   {
10223     /* MOD_0F16_PREFIX_0 */
10224     { "movhps",         { XM, EXq } },
10225     { "movlhps",        { XM, EXq } },
10226   },
10227   {
10228     /* MOD_0F17 */
10229     { "movhpX",         { EXq, XM } },
10230   },
10231   {
10232     /* MOD_0F18_REG_0 */
10233     { "prefetchnta",    { Mb } },
10234   },
10235   {
10236     /* MOD_0F18_REG_1 */
10237     { "prefetcht0",     { Mb } },
10238   },
10239   {
10240     /* MOD_0F18_REG_2 */
10241     { "prefetcht1",     { Mb } },
10242   },
10243   {
10244     /* MOD_0F18_REG_3 */
10245     { "prefetcht2",     { Mb } },
10246   },
10247   {
10248     /* MOD_0F20 */
10249     { Bad_Opcode },
10250     { "movZ",           { Rm, Cm } },
10251   },
10252   {
10253     /* MOD_0F21 */
10254     { Bad_Opcode },
10255     { "movZ",           { Rm, Dm } },
10256   },
10257   {
10258     /* MOD_0F22 */
10259     { Bad_Opcode },
10260     { "movZ",           { Cm, Rm } },
10261   },
10262   {
10263     /* MOD_0F23 */
10264     { Bad_Opcode },
10265     { "movZ",           { Dm, Rm } },
10266   },
10267   {
10268     /* MOD_0F24 */
10269     { Bad_Opcode },    
10270     { "movL",           { Rd, Td } },
10271   },
10272   {
10273     /* MOD_0F26 */
10274     { Bad_Opcode },
10275     { "movL",           { Td, Rd } },
10276   },
10277   {
10278     /* MOD_0F2B_PREFIX_0 */
10279     {"movntps",         { Mx, XM } },
10280   },
10281   {
10282     /* MOD_0F2B_PREFIX_1 */
10283     {"movntss",         { Md, XM } },
10284   },
10285   {
10286     /* MOD_0F2B_PREFIX_2 */
10287     {"movntpd",         { Mx, XM } },
10288   },
10289   {
10290     /* MOD_0F2B_PREFIX_3 */
10291     {"movntsd",         { Mq, XM } },
10292   },
10293   {
10294     /* MOD_0F51 */
10295     { Bad_Opcode },
10296     { "movmskpX",       { Gdq, XS } },
10297   },
10298   {
10299     /* MOD_0F71_REG_2 */
10300     { Bad_Opcode },
10301     { "psrlw",          { MS, Ib } },
10302   },
10303   {
10304     /* MOD_0F71_REG_4 */
10305     { Bad_Opcode },
10306     { "psraw",          { MS, Ib } },
10307   },
10308   {
10309     /* MOD_0F71_REG_6 */
10310     { Bad_Opcode },
10311     { "psllw",          { MS, Ib } },
10312   },
10313   {
10314     /* MOD_0F72_REG_2 */
10315     { Bad_Opcode },
10316     { "psrld",          { MS, Ib } },
10317   },
10318   {
10319     /* MOD_0F72_REG_4 */
10320     { Bad_Opcode },
10321     { "psrad",          { MS, Ib } },
10322   },
10323   {
10324     /* MOD_0F72_REG_6 */
10325     { Bad_Opcode },
10326     { "pslld",          { MS, Ib } },
10327   },
10328   {
10329     /* MOD_0F73_REG_2 */
10330     { Bad_Opcode },
10331     { "psrlq",          { MS, Ib } },
10332   },
10333   {
10334     /* MOD_0F73_REG_3 */
10335     { Bad_Opcode },
10336     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10337   },
10338   {
10339     /* MOD_0F73_REG_6 */
10340     { Bad_Opcode },
10341     { "psllq",          { MS, Ib } },
10342   },
10343   {
10344     /* MOD_0F73_REG_7 */
10345     { Bad_Opcode },
10346     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10347   },
10348   {
10349     /* MOD_0FAE_REG_0 */
10350     { "fxsave",         { FXSAVE } },
10351   },
10352   {
10353     /* MOD_0FAE_REG_1 */
10354     { "fxrstor",        { FXSAVE } },
10355   },
10356   {
10357     /* MOD_0FAE_REG_2 */
10358     { "ldmxcsr",        { Md } },
10359   },
10360   {
10361     /* MOD_0FAE_REG_3 */
10362     { "stmxcsr",        { Md } },
10363   },
10364   {
10365     /* MOD_0FAE_REG_4 */
10366     { "xsave",          { FXSAVE } },
10367   },
10368   {
10369     /* MOD_0FAE_REG_5 */
10370     { "xrstor",         { FXSAVE } },
10371     { RM_TABLE (RM_0FAE_REG_5) },
10372   },
10373   {
10374     /* MOD_0FAE_REG_6 */
10375     { Bad_Opcode },
10376     { RM_TABLE (RM_0FAE_REG_6) },
10377   },
10378   {
10379     /* MOD_0FAE_REG_7 */
10380     { "clflush",        { Mb } },
10381     { RM_TABLE (RM_0FAE_REG_7) },
10382   },
10383   {
10384     /* MOD_0FB2 */
10385     { "lssS",           { Gv, Mp } },
10386   },
10387   {
10388     /* MOD_0FB4 */
10389     { "lfsS",           { Gv, Mp } },
10390   },
10391   {
10392     /* MOD_0FB5 */
10393     { "lgsS",           { Gv, Mp } },
10394   },
10395   {
10396     /* MOD_0FC7_REG_6 */
10397     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
10398   },
10399   {
10400     /* MOD_0FC7_REG_7 */
10401     { "vmptrst",        { Mq } },
10402   },
10403   {
10404     /* MOD_0FD7 */
10405     { Bad_Opcode },
10406     { "pmovmskb",       { Gdq, MS } },
10407   },
10408   {
10409     /* MOD_0FE7_PREFIX_2 */
10410     { "movntdq",        { Mx, XM } },
10411   },
10412   {
10413     /* MOD_0FF0_PREFIX_3 */
10414     { "lddqu",          { XM, M } },
10415   },
10416   {
10417     /* MOD_0F382A_PREFIX_2 */
10418     { "movntdqa",       { XM, Mx } },
10419   },
10420   {
10421     /* MOD_62_32BIT */
10422     { "bound{S|}",      { Gv, Ma } },
10423   },
10424   {
10425     /* MOD_C4_32BIT */
10426     { "lesS",           { Gv, Mp } },
10427     { VEX_C4_TABLE (VEX_0F) },
10428   },
10429   {
10430     /* MOD_C5_32BIT */
10431     { "ldsS",           { Gv, Mp } },
10432     { VEX_C5_TABLE (VEX_0F) },
10433   },
10434   {
10435     /* MOD_VEX_12_PREFIX_0 */
10436     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
10437     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
10438   },
10439   {
10440     /* MOD_VEX_13 */
10441     { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
10442   },
10443   {
10444     /* MOD_VEX_16_PREFIX_0 */
10445     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
10446     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
10447   },
10448   {
10449     /* MOD_VEX_17 */
10450     { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
10451   },
10452   {
10453     /* MOD_VEX_2B */
10454     { VEX_W_TABLE (VEX_W_2B_M_0) },
10455   },
10456   {
10457     /* MOD_VEX_50 */
10458     { Bad_Opcode },
10459     { VEX_W_TABLE (VEX_W_50_M_0) },
10460   },
10461   {
10462     /* MOD_VEX_71_REG_2 */
10463     { Bad_Opcode },
10464     { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
10465   },
10466   {
10467     /* MOD_VEX_71_REG_4 */
10468     { Bad_Opcode },
10469     { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
10470   },
10471   {
10472     /* MOD_VEX_71_REG_6 */
10473     { Bad_Opcode },
10474     { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
10475   },
10476   {
10477     /* MOD_VEX_72_REG_2 */
10478     { Bad_Opcode },
10479     { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
10480   },
10481   {
10482     /* MOD_VEX_72_REG_4 */
10483     { Bad_Opcode },
10484     { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
10485   },
10486   {
10487     /* MOD_VEX_72_REG_6 */
10488     { Bad_Opcode },
10489     { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
10490   },
10491   {
10492     /* MOD_VEX_73_REG_2 */
10493     { Bad_Opcode },
10494     { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
10495   },
10496   {
10497     /* MOD_VEX_73_REG_3 */
10498     { Bad_Opcode },
10499     { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
10500   },
10501   {
10502     /* MOD_VEX_73_REG_6 */
10503     { Bad_Opcode },
10504     { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
10505   },
10506   {
10507     /* MOD_VEX_73_REG_7 */
10508     { Bad_Opcode },
10509     { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
10510   },
10511   {
10512     /* MOD_VEX_AE_REG_2 */
10513     { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
10514   },
10515   {
10516     /* MOD_VEX_AE_REG_3 */
10517     { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
10518   },
10519   {
10520     /* MOD_VEX_D7_PREFIX_2 */
10521     { Bad_Opcode },
10522     { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
10523   },
10524   {
10525     /* MOD_VEX_E7_PREFIX_2 */
10526     { VEX_W_TABLE (VEX_W_E7_P_2_M_0) },
10527   },
10528   {
10529     /* MOD_VEX_F0_PREFIX_3 */
10530     { VEX_W_TABLE (VEX_W_F0_P_3_M_0) },
10531   },
10532   {
10533     /* MOD_VEX_3818_PREFIX_2 */
10534     { VEX_W_TABLE (VEX_W_3818_P_2_M_0) },
10535   },
10536   {
10537     /* MOD_VEX_3819_PREFIX_2 */
10538     { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
10539   },
10540   {
10541     /* MOD_VEX_381A_PREFIX_2 */
10542     { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
10543   },
10544   {
10545     /* MOD_VEX_382A_PREFIX_2 */
10546     { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
10547   },
10548   {
10549     /* MOD_VEX_382C_PREFIX_2 */
10550     { VEX_W_TABLE (VEX_W_382C_P_2_M_0) },
10551   },
10552   {
10553     /* MOD_VEX_382D_PREFIX_2 */
10554     { VEX_W_TABLE (VEX_W_382D_P_2_M_0) },
10555   },
10556   {
10557     /* MOD_VEX_382E_PREFIX_2 */
10558     { VEX_W_TABLE (VEX_W_382E_P_2_M_0) },
10559   },
10560   {
10561     /* MOD_VEX_382F_PREFIX_2 */
10562     { VEX_W_TABLE (VEX_W_382F_P_2_M_0) },
10563   },
10564 };
10565
10566 static const struct dis386 rm_table[][8] = {
10567   {
10568     /* RM_0F01_REG_0 */
10569     { Bad_Opcode },
10570     { "vmcall",         { Skip_MODRM } },
10571     { "vmlaunch",       { Skip_MODRM } },
10572     { "vmresume",       { Skip_MODRM } },
10573     { "vmxoff",         { Skip_MODRM } },
10574   },
10575   {
10576     /* RM_0F01_REG_1 */
10577     { "monitor",        { { OP_Monitor, 0 } } },
10578     { "mwait",          { { OP_Mwait, 0 } } },
10579   },
10580   {
10581     /* RM_0F01_REG_2 */
10582     { "xgetbv",         { Skip_MODRM } },
10583     { "xsetbv",         { Skip_MODRM } },
10584   },
10585   {
10586     /* RM_0F01_REG_3 */
10587     { "vmrun",          { Skip_MODRM } },
10588     { "vmmcall",        { Skip_MODRM } },
10589     { "vmload",         { Skip_MODRM } },
10590     { "vmsave",         { Skip_MODRM } },
10591     { "stgi",           { Skip_MODRM } },
10592     { "clgi",           { Skip_MODRM } },
10593     { "skinit",         { Skip_MODRM } },
10594     { "invlpga",        { Skip_MODRM } },
10595   },
10596   {
10597     /* RM_0F01_REG_7 */
10598     { "swapgs",         { Skip_MODRM } },
10599     { "rdtscp",         { Skip_MODRM } },
10600   },
10601   {
10602     /* RM_0FAE_REG_5 */
10603     { "lfence",         { Skip_MODRM } },
10604   },
10605   {
10606     /* RM_0FAE_REG_6 */
10607     { "mfence",         { Skip_MODRM } },
10608   },
10609   {
10610     /* RM_0FAE_REG_7 */
10611     { "sfence",         { Skip_MODRM } },
10612   },
10613 };
10614
10615 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10616
10617 /* We use the high bit to indicate different name for the same
10618    prefix.  */
10619 #define ADDR16_PREFIX   (0x67 | 0x100)
10620 #define ADDR32_PREFIX   (0x67 | 0x200)
10621 #define DATA16_PREFIX   (0x66 | 0x100)
10622 #define DATA32_PREFIX   (0x66 | 0x200)
10623 #define REP_PREFIX      (0xf3 | 0x100)
10624
10625 static int
10626 ckprefix (void)
10627 {
10628   int newrex, i, length;
10629   rex = 0;
10630   rex_ignored = 0;
10631   prefixes = 0;
10632   used_prefixes = 0;
10633   rex_used = 0;
10634   last_lock_prefix = -1;
10635   last_repz_prefix = -1;
10636   last_repnz_prefix = -1;
10637   last_data_prefix = -1;
10638   last_addr_prefix = -1;
10639   last_rex_prefix = -1;
10640   last_seg_prefix = -1;
10641   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10642     all_prefixes[i] = 0;
10643   i = 0;
10644   length = 0;
10645   /* The maximum instruction length is 15bytes.  */
10646   while (length < MAX_CODE_LENGTH - 1)
10647     {
10648       FETCH_DATA (the_info, codep + 1);
10649       newrex = 0;
10650       switch (*codep)
10651         {
10652         /* REX prefixes family.  */
10653         case 0x40:
10654         case 0x41:
10655         case 0x42:
10656         case 0x43:
10657         case 0x44:
10658         case 0x45:
10659         case 0x46:
10660         case 0x47:
10661         case 0x48:
10662         case 0x49:
10663         case 0x4a:
10664         case 0x4b:
10665         case 0x4c:
10666         case 0x4d:
10667         case 0x4e:
10668         case 0x4f:
10669           if (address_mode == mode_64bit)
10670             newrex = *codep;
10671           else
10672             return 1;
10673           last_rex_prefix = i;
10674           break;
10675         case 0xf3:
10676           prefixes |= PREFIX_REPZ;
10677           last_repz_prefix = i;
10678           break;
10679         case 0xf2:
10680           prefixes |= PREFIX_REPNZ;
10681           last_repnz_prefix = i;
10682           break;
10683         case 0xf0:
10684           prefixes |= PREFIX_LOCK;
10685           last_lock_prefix = i;
10686           break;
10687         case 0x2e:
10688           prefixes |= PREFIX_CS;
10689           last_seg_prefix = i;
10690           break;
10691         case 0x36:
10692           prefixes |= PREFIX_SS;
10693           last_seg_prefix = i;
10694           break;
10695         case 0x3e:
10696           prefixes |= PREFIX_DS;
10697           last_seg_prefix = i;
10698           break;
10699         case 0x26:
10700           prefixes |= PREFIX_ES;
10701           last_seg_prefix = i;
10702           break;
10703         case 0x64:
10704           prefixes |= PREFIX_FS;
10705           last_seg_prefix = i;
10706           break;
10707         case 0x65:
10708           prefixes |= PREFIX_GS;
10709           last_seg_prefix = i;
10710           break;
10711         case 0x66:
10712           prefixes |= PREFIX_DATA;
10713           last_data_prefix = i;
10714           break;
10715         case 0x67:
10716           prefixes |= PREFIX_ADDR;
10717           last_addr_prefix = i;
10718           break;
10719         case FWAIT_OPCODE:
10720           /* fwait is really an instruction.  If there are prefixes
10721              before the fwait, they belong to the fwait, *not* to the
10722              following instruction.  */
10723           if (prefixes || rex)
10724             {
10725               prefixes |= PREFIX_FWAIT;
10726               codep++;
10727               return 1;
10728             }
10729           prefixes = PREFIX_FWAIT;
10730           break;
10731         default:
10732           return 1;
10733         }
10734       /* Rex is ignored when followed by another prefix.  */
10735       if (rex)
10736         {
10737           rex_used = rex;
10738           return 1;
10739         }
10740       if (*codep != FWAIT_OPCODE)
10741         all_prefixes[i++] = *codep;
10742       rex = newrex;
10743       codep++;
10744       length++;
10745     }
10746   return 0;
10747 }
10748
10749 static int
10750 seg_prefix (int pref)
10751 {
10752   switch (pref)
10753     {
10754     case 0x2e:
10755       return PREFIX_CS;
10756     case 0x36:
10757       return PREFIX_SS;
10758     case 0x3e:
10759       return PREFIX_DS;
10760     case 0x26:
10761       return PREFIX_ES;
10762     case 0x64:
10763       return PREFIX_FS;
10764     case 0x65:
10765       return PREFIX_GS;
10766     default:
10767       return 0;
10768     }
10769 }
10770
10771 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10772    prefix byte.  */
10773
10774 static const char *
10775 prefix_name (int pref, int sizeflag)
10776 {
10777   static const char *rexes [16] =
10778     {
10779       "rex",            /* 0x40 */
10780       "rex.B",          /* 0x41 */
10781       "rex.X",          /* 0x42 */
10782       "rex.XB",         /* 0x43 */
10783       "rex.R",          /* 0x44 */
10784       "rex.RB",         /* 0x45 */
10785       "rex.RX",         /* 0x46 */
10786       "rex.RXB",        /* 0x47 */
10787       "rex.W",          /* 0x48 */
10788       "rex.WB",         /* 0x49 */
10789       "rex.WX",         /* 0x4a */
10790       "rex.WXB",        /* 0x4b */
10791       "rex.WR",         /* 0x4c */
10792       "rex.WRB",        /* 0x4d */
10793       "rex.WRX",        /* 0x4e */
10794       "rex.WRXB",       /* 0x4f */
10795     };
10796
10797   switch (pref)
10798     {
10799     /* REX prefixes family.  */
10800     case 0x40:
10801     case 0x41:
10802     case 0x42:
10803     case 0x43:
10804     case 0x44:
10805     case 0x45:
10806     case 0x46:
10807     case 0x47:
10808     case 0x48:
10809     case 0x49:
10810     case 0x4a:
10811     case 0x4b:
10812     case 0x4c:
10813     case 0x4d:
10814     case 0x4e:
10815     case 0x4f:
10816       return rexes [pref - 0x40];
10817     case 0xf3:
10818       return "repz";
10819     case 0xf2:
10820       return "repnz";
10821     case 0xf0:
10822       return "lock";
10823     case 0x2e:
10824       return "cs";
10825     case 0x36:
10826       return "ss";
10827     case 0x3e:
10828       return "ds";
10829     case 0x26:
10830       return "es";
10831     case 0x64:
10832       return "fs";
10833     case 0x65:
10834       return "gs";
10835     case 0x66:
10836       return (sizeflag & DFLAG) ? "data16" : "data32";
10837     case 0x67:
10838       if (address_mode == mode_64bit)
10839         return (sizeflag & AFLAG) ? "addr32" : "addr64";
10840       else
10841         return (sizeflag & AFLAG) ? "addr16" : "addr32";
10842     case FWAIT_OPCODE:
10843       return "fwait";
10844     case ADDR16_PREFIX:
10845       return "addr16";
10846     case ADDR32_PREFIX:
10847       return "addr32";
10848     case DATA16_PREFIX:
10849       return "data16";
10850     case DATA32_PREFIX:
10851       return "data32";
10852     case REP_PREFIX:
10853       return "rep";
10854     default:
10855       return NULL;
10856     }
10857 }
10858
10859 static char op_out[MAX_OPERANDS][100];
10860 static int op_ad, op_index[MAX_OPERANDS];
10861 static int two_source_ops;
10862 static bfd_vma op_address[MAX_OPERANDS];
10863 static bfd_vma op_riprel[MAX_OPERANDS];
10864 static bfd_vma start_pc;
10865
10866 /*
10867  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10868  *   (see topic "Redundant prefixes" in the "Differences from 8086"
10869  *   section of the "Virtual 8086 Mode" chapter.)
10870  * 'pc' should be the address of this instruction, it will
10871  *   be used to print the target address if this is a relative jump or call
10872  * The function returns the length of this instruction in bytes.
10873  */
10874
10875 static char intel_syntax;
10876 static char intel_mnemonic = !SYSV386_COMPAT;
10877 static char open_char;
10878 static char close_char;
10879 static char separator_char;
10880 static char scale_char;
10881
10882 /* Here for backwards compatibility.  When gdb stops using
10883    print_insn_i386_att and print_insn_i386_intel these functions can
10884    disappear, and print_insn_i386 be merged into print_insn.  */
10885 int
10886 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10887 {
10888   intel_syntax = 0;
10889
10890   return print_insn (pc, info);
10891 }
10892
10893 int
10894 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10895 {
10896   intel_syntax = 1;
10897
10898   return print_insn (pc, info);
10899 }
10900
10901 int
10902 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10903 {
10904   intel_syntax = -1;
10905
10906   return print_insn (pc, info);
10907 }
10908
10909 void
10910 print_i386_disassembler_options (FILE *stream)
10911 {
10912   fprintf (stream, _("\n\
10913 The following i386/x86-64 specific disassembler options are supported for use\n\
10914 with the -M switch (multiple options should be separated by commas):\n"));
10915
10916   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
10917   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
10918   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
10919   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
10920   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
10921   fprintf (stream, _("  att-mnemonic\n"
10922                      "              Display instruction in AT&T mnemonic\n"));
10923   fprintf (stream, _("  intel-mnemonic\n"
10924                      "              Display instruction in Intel mnemonic\n"));
10925   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
10926   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
10927   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
10928   fprintf (stream, _("  data32      Assume 32bit data size\n"));
10929   fprintf (stream, _("  data16      Assume 16bit data size\n"));
10930   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
10931 }
10932
10933 /* Bad opcode.  */
10934 static const struct dis386 bad_opcode = { "(bad)", { XX } };
10935
10936 /* Get a pointer to struct dis386 with a valid name.  */
10937
10938 static const struct dis386 *
10939 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10940 {
10941   int vindex, vex_table_index;
10942
10943   if (dp->name != NULL)
10944     return dp;
10945
10946   switch (dp->op[0].bytemode)
10947     {
10948     case USE_REG_TABLE:
10949       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10950       break;
10951
10952     case USE_MOD_TABLE:
10953       vindex = modrm.mod == 0x3 ? 1 : 0;
10954       dp = &mod_table[dp->op[1].bytemode][vindex];
10955       break;
10956
10957     case USE_RM_TABLE:
10958       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10959       break;
10960
10961     case USE_PREFIX_TABLE:
10962       if (need_vex)
10963         {
10964           /* The prefix in VEX is implicit.  */
10965           switch (vex.prefix)
10966             {
10967             case 0:
10968               vindex = 0;
10969               break;
10970             case REPE_PREFIX_OPCODE:
10971               vindex = 1;
10972               break;
10973             case DATA_PREFIX_OPCODE:
10974               vindex = 2;
10975               break;
10976             case REPNE_PREFIX_OPCODE:
10977               vindex = 3;
10978               break;
10979             default:
10980               abort ();
10981               break;
10982             }
10983         }
10984       else 
10985         {
10986           vindex = 0;
10987           used_prefixes |= (prefixes & PREFIX_REPZ);
10988           if (prefixes & PREFIX_REPZ)
10989             {
10990               vindex = 1;
10991               all_prefixes[last_repz_prefix] = 0;
10992             }
10993           else
10994             {
10995               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10996                  PREFIX_DATA.  */
10997               used_prefixes |= (prefixes & PREFIX_REPNZ);
10998               if (prefixes & PREFIX_REPNZ)
10999                 {
11000                   vindex = 3;
11001                   all_prefixes[last_repnz_prefix] = 0;
11002                 }
11003               else
11004                 {
11005                   used_prefixes |= (prefixes & PREFIX_DATA);
11006                   if (prefixes & PREFIX_DATA)
11007                     {
11008                       vindex = 2;
11009                       all_prefixes[last_data_prefix] = 0;
11010                     }
11011                 }
11012             }
11013         }
11014       dp = &prefix_table[dp->op[1].bytemode][vindex];
11015       break;
11016
11017     case USE_X86_64_TABLE:
11018       vindex = address_mode == mode_64bit ? 1 : 0;
11019       dp = &x86_64_table[dp->op[1].bytemode][vindex];
11020       break;
11021
11022     case USE_3BYTE_TABLE:
11023       FETCH_DATA (info, codep + 2);
11024       vindex = *codep++;
11025       dp = &three_byte_table[dp->op[1].bytemode][vindex];
11026       modrm.mod = (*codep >> 6) & 3;
11027       modrm.reg = (*codep >> 3) & 7;
11028       modrm.rm = *codep & 7;
11029       break;
11030
11031     case USE_VEX_LEN_TABLE:
11032       if (!need_vex)
11033         abort ();
11034
11035       switch (vex.length)
11036         {
11037         case 128:
11038           vindex = 0;
11039           break;
11040         case 256:
11041           vindex = 1;
11042           break;
11043         default:
11044           abort ();
11045           break;
11046         }
11047
11048       dp = &vex_len_table[dp->op[1].bytemode][vindex];
11049       break;
11050
11051     case USE_XOP_8F_TABLE:
11052       FETCH_DATA (info, codep + 3);
11053       /* All bits in the REX prefix are ignored.  */
11054       rex_ignored = rex;
11055       rex = ~(*codep >> 5) & 0x7;
11056
11057       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
11058       switch ((*codep & 0x1f))
11059         {
11060         default:
11061           BadOp ();
11062         case 0x8:
11063           vex_table_index = XOP_08;
11064           break;
11065         case 0x9:
11066           vex_table_index = XOP_09;
11067           break;
11068         case 0xa:
11069           vex_table_index = XOP_0A;
11070           break;
11071         }
11072       codep++;
11073       vex.w = *codep & 0x80;
11074       if (vex.w && address_mode == mode_64bit)
11075         rex |= REX_W;
11076
11077       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11078       if (address_mode != mode_64bit
11079           && vex.register_specifier > 0x7)
11080         BadOp ();
11081
11082       vex.length = (*codep & 0x4) ? 256 : 128;
11083       switch ((*codep & 0x3))
11084         {
11085         case 0:
11086           vex.prefix = 0;
11087           break;
11088         case 1:
11089           vex.prefix = DATA_PREFIX_OPCODE;
11090           break;
11091         case 2:
11092           vex.prefix = REPE_PREFIX_OPCODE;
11093           break;
11094         case 3:
11095           vex.prefix = REPNE_PREFIX_OPCODE;
11096           break;
11097         }
11098       need_vex = 1;
11099       need_vex_reg = 1;
11100       codep++;
11101       vindex = *codep++;
11102       dp = &xop_table[vex_table_index][vindex];
11103
11104       FETCH_DATA (info, codep + 1);
11105       modrm.mod = (*codep >> 6) & 3;
11106       modrm.reg = (*codep >> 3) & 7;
11107       modrm.rm = *codep & 7;
11108       break;
11109
11110     case USE_VEX_C4_TABLE:
11111       FETCH_DATA (info, codep + 3);
11112       /* All bits in the REX prefix are ignored.  */
11113       rex_ignored = rex;
11114       rex = ~(*codep >> 5) & 0x7;
11115       switch ((*codep & 0x1f))
11116         {
11117         default:
11118           BadOp ();
11119         case 0x1:
11120           vex_table_index = VEX_0F;
11121           break;
11122         case 0x2:
11123           vex_table_index = VEX_0F38;
11124           break;
11125         case 0x3:
11126           vex_table_index = VEX_0F3A;
11127           break;
11128         }
11129       codep++;
11130       vex.w = *codep & 0x80;
11131       if (vex.w && address_mode == mode_64bit)
11132         rex |= REX_W;
11133
11134       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11135       if (address_mode != mode_64bit
11136           && vex.register_specifier > 0x7)
11137         BadOp ();
11138
11139       vex.length = (*codep & 0x4) ? 256 : 128;
11140       switch ((*codep & 0x3))
11141         {
11142         case 0:
11143           vex.prefix = 0;
11144           break;
11145         case 1:
11146           vex.prefix = DATA_PREFIX_OPCODE;
11147           break;
11148         case 2:
11149           vex.prefix = REPE_PREFIX_OPCODE;
11150           break;
11151         case 3:
11152           vex.prefix = REPNE_PREFIX_OPCODE;
11153           break;
11154         }
11155       need_vex = 1;
11156       need_vex_reg = 1;
11157       codep++;
11158       vindex = *codep++;
11159       dp = &vex_table[vex_table_index][vindex];
11160       /* There is no MODRM byte for VEX [82|77].  */
11161       if (vindex != 0x77 && vindex != 0x82)
11162         {
11163           FETCH_DATA (info, codep + 1);
11164           modrm.mod = (*codep >> 6) & 3;
11165           modrm.reg = (*codep >> 3) & 7;
11166           modrm.rm = *codep & 7;
11167         }
11168       break;
11169
11170     case USE_VEX_C5_TABLE:
11171       FETCH_DATA (info, codep + 2);
11172       /* All bits in the REX prefix are ignored.  */
11173       rex_ignored = rex;
11174       rex = (*codep & 0x80) ? 0 : REX_R;
11175
11176       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11177       if (address_mode != mode_64bit
11178           && vex.register_specifier > 0x7)
11179         BadOp ();
11180
11181       vex.w = 0;
11182
11183       vex.length = (*codep & 0x4) ? 256 : 128;
11184       switch ((*codep & 0x3))
11185         {
11186         case 0:
11187           vex.prefix = 0;
11188           break;
11189         case 1:
11190           vex.prefix = DATA_PREFIX_OPCODE;
11191           break;
11192         case 2:
11193           vex.prefix = REPE_PREFIX_OPCODE;
11194           break;
11195         case 3:
11196           vex.prefix = REPNE_PREFIX_OPCODE;
11197           break;
11198         }
11199       need_vex = 1;
11200       need_vex_reg = 1;
11201       codep++;
11202       vindex = *codep++;
11203       dp = &vex_table[dp->op[1].bytemode][vindex];
11204       /* There is no MODRM byte for VEX [82|77].  */
11205       if (vindex != 0x77 && vindex != 0x82)
11206         {
11207           FETCH_DATA (info, codep + 1);
11208           modrm.mod = (*codep >> 6) & 3;
11209           modrm.reg = (*codep >> 3) & 7;
11210           modrm.rm = *codep & 7;
11211         }
11212       break;
11213
11214     case USE_VEX_W_TABLE:
11215       if (!need_vex)
11216         abort ();
11217
11218       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11219       break;
11220
11221     case 0:
11222       dp = &bad_opcode;
11223       break;
11224
11225     default:
11226       abort ();
11227     }
11228
11229   if (dp->name != NULL)
11230     return dp;
11231   else
11232     return get_valid_dis386 (dp, info);
11233 }
11234
11235 static int
11236 print_insn (bfd_vma pc, disassemble_info *info)
11237 {
11238   const struct dis386 *dp;
11239   int i;
11240   char *op_txt[MAX_OPERANDS];
11241   int needcomma;
11242   int sizeflag;
11243   const char *p;
11244   struct dis_private priv;
11245   unsigned char op;
11246   int prefix_length;
11247   int default_prefixes;
11248
11249   if (info->mach == bfd_mach_x86_64_intel_syntax
11250       || info->mach == bfd_mach_x86_64
11251       || info->mach == bfd_mach_l1om
11252       || info->mach == bfd_mach_l1om_intel_syntax)
11253     address_mode = mode_64bit;
11254   else
11255     address_mode = mode_32bit;
11256
11257   if (intel_syntax == (char) -1)
11258     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
11259                     || info->mach == bfd_mach_x86_64_intel_syntax
11260                     || info->mach == bfd_mach_l1om_intel_syntax);
11261
11262   if (info->mach == bfd_mach_i386_i386
11263       || info->mach == bfd_mach_x86_64
11264       || info->mach == bfd_mach_l1om
11265       || info->mach == bfd_mach_i386_i386_intel_syntax
11266       || info->mach == bfd_mach_x86_64_intel_syntax
11267       || info->mach == bfd_mach_l1om_intel_syntax)
11268     priv.orig_sizeflag = AFLAG | DFLAG;
11269   else if (info->mach == bfd_mach_i386_i8086)
11270     priv.orig_sizeflag = 0;
11271   else
11272     abort ();
11273
11274   for (p = info->disassembler_options; p != NULL; )
11275     {
11276       if (CONST_STRNEQ (p, "x86-64"))
11277         {
11278           address_mode = mode_64bit;
11279           priv.orig_sizeflag = AFLAG | DFLAG;
11280         }
11281       else if (CONST_STRNEQ (p, "i386"))
11282         {
11283           address_mode = mode_32bit;
11284           priv.orig_sizeflag = AFLAG | DFLAG;
11285         }
11286       else if (CONST_STRNEQ (p, "i8086"))
11287         {
11288           address_mode = mode_16bit;
11289           priv.orig_sizeflag = 0;
11290         }
11291       else if (CONST_STRNEQ (p, "intel"))
11292         {
11293           intel_syntax = 1;
11294           if (CONST_STRNEQ (p + 5, "-mnemonic"))
11295             intel_mnemonic = 1;
11296         }
11297       else if (CONST_STRNEQ (p, "att"))
11298         {
11299           intel_syntax = 0;
11300           if (CONST_STRNEQ (p + 3, "-mnemonic"))
11301             intel_mnemonic = 0;
11302         }
11303       else if (CONST_STRNEQ (p, "addr"))
11304         {
11305           if (address_mode == mode_64bit)
11306             {
11307               if (p[4] == '3' && p[5] == '2')
11308                 priv.orig_sizeflag &= ~AFLAG;
11309               else if (p[4] == '6' && p[5] == '4')
11310                 priv.orig_sizeflag |= AFLAG;
11311             }
11312           else
11313             {
11314               if (p[4] == '1' && p[5] == '6')
11315                 priv.orig_sizeflag &= ~AFLAG;
11316               else if (p[4] == '3' && p[5] == '2')
11317                 priv.orig_sizeflag |= AFLAG;
11318             }
11319         }
11320       else if (CONST_STRNEQ (p, "data"))
11321         {
11322           if (p[4] == '1' && p[5] == '6')
11323             priv.orig_sizeflag &= ~DFLAG;
11324           else if (p[4] == '3' && p[5] == '2')
11325             priv.orig_sizeflag |= DFLAG;
11326         }
11327       else if (CONST_STRNEQ (p, "suffix"))
11328         priv.orig_sizeflag |= SUFFIX_ALWAYS;
11329
11330       p = strchr (p, ',');
11331       if (p != NULL)
11332         p++;
11333     }
11334
11335   if (intel_syntax)
11336     {
11337       names64 = intel_names64;
11338       names32 = intel_names32;
11339       names16 = intel_names16;
11340       names8 = intel_names8;
11341       names8rex = intel_names8rex;
11342       names_seg = intel_names_seg;
11343       names_mm = intel_names_mm;
11344       names_xmm = intel_names_xmm;
11345       names_ymm = intel_names_ymm;
11346       index64 = intel_index64;
11347       index32 = intel_index32;
11348       index16 = intel_index16;
11349       open_char = '[';
11350       close_char = ']';
11351       separator_char = '+';
11352       scale_char = '*';
11353     }
11354   else
11355     {
11356       names64 = att_names64;
11357       names32 = att_names32;
11358       names16 = att_names16;
11359       names8 = att_names8;
11360       names8rex = att_names8rex;
11361       names_seg = att_names_seg;
11362       names_mm = att_names_mm;
11363       names_xmm = att_names_xmm;
11364       names_ymm = att_names_ymm;
11365       index64 = att_index64;
11366       index32 = att_index32;
11367       index16 = att_index16;
11368       open_char = '(';
11369       close_char =  ')';
11370       separator_char = ',';
11371       scale_char = ',';
11372     }
11373
11374   /* The output looks better if we put 7 bytes on a line, since that
11375      puts most long word instructions on a single line.  Use 8 bytes
11376      for Intel L1OM.  */
11377   if (info->mach == bfd_mach_l1om
11378       || info->mach == bfd_mach_l1om_intel_syntax)
11379     info->bytes_per_line = 8;
11380   else
11381     info->bytes_per_line = 7;
11382
11383   info->private_data = &priv;
11384   priv.max_fetched = priv.the_buffer;
11385   priv.insn_start = pc;
11386
11387   obuf[0] = 0;
11388   for (i = 0; i < MAX_OPERANDS; ++i)
11389     {
11390       op_out[i][0] = 0;
11391       op_index[i] = -1;
11392     }
11393
11394   the_info = info;
11395   start_pc = pc;
11396   start_codep = priv.the_buffer;
11397   codep = priv.the_buffer;
11398
11399   if (setjmp (priv.bailout) != 0)
11400     {
11401       const char *name;
11402
11403       /* Getting here means we tried for data but didn't get it.  That
11404          means we have an incomplete instruction of some sort.  Just
11405          print the first byte as a prefix or a .byte pseudo-op.  */
11406       if (codep > priv.the_buffer)
11407         {
11408           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11409           if (name != NULL)
11410             (*info->fprintf_func) (info->stream, "%s", name);
11411           else
11412             {
11413               /* Just print the first byte as a .byte instruction.  */
11414               (*info->fprintf_func) (info->stream, ".byte 0x%x",
11415                                      (unsigned int) priv.the_buffer[0]);
11416             }
11417
11418           return 1;
11419         }
11420
11421       return -1;
11422     }
11423
11424   obufp = obuf;
11425   sizeflag = priv.orig_sizeflag;
11426
11427   if (!ckprefix () || rex_used)
11428     {
11429       /* Too many prefixes or unused REX prefixes.  */
11430       for (i = 0;
11431            all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
11432            i++)
11433         (*info->fprintf_func) (info->stream, "%s",
11434                                prefix_name (all_prefixes[i], sizeflag));
11435       return 1;
11436     }
11437
11438   insn_codep = codep;
11439
11440   FETCH_DATA (info, codep + 1);
11441   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11442
11443   if (((prefixes & PREFIX_FWAIT)
11444        && ((*codep < 0xd8) || (*codep > 0xdf))))
11445     {
11446       (*info->fprintf_func) (info->stream, "fwait");
11447       return 1;
11448     }
11449
11450   op = 0;
11451
11452   if (*codep == 0x0f)
11453     {
11454       unsigned char threebyte;
11455       FETCH_DATA (info, codep + 2);
11456       threebyte = *++codep;
11457       dp = &dis386_twobyte[threebyte];
11458       need_modrm = twobyte_has_modrm[*codep];
11459       codep++;
11460     }
11461   else
11462     {
11463       dp = &dis386[*codep];
11464       need_modrm = onebyte_has_modrm[*codep];
11465       codep++;
11466     }
11467
11468   if ((prefixes & PREFIX_REPZ))
11469     used_prefixes |= PREFIX_REPZ;
11470   if ((prefixes & PREFIX_REPNZ))
11471     used_prefixes |= PREFIX_REPNZ;
11472   if ((prefixes & PREFIX_LOCK))
11473     used_prefixes |= PREFIX_LOCK;
11474
11475   default_prefixes = 0;
11476   if (prefixes & PREFIX_ADDR)
11477     {
11478       sizeflag ^= AFLAG;
11479       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11480         {
11481           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11482             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11483           else
11484             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11485           default_prefixes |= PREFIX_ADDR;
11486         }
11487     }
11488
11489   if ((prefixes & PREFIX_DATA))
11490     {
11491       sizeflag ^= DFLAG;
11492       if (dp->op[2].bytemode == cond_jump_mode
11493           && dp->op[0].bytemode == v_mode
11494           && !intel_syntax)
11495         {
11496           if (sizeflag & DFLAG)
11497             all_prefixes[last_data_prefix] = DATA32_PREFIX;
11498           else
11499             all_prefixes[last_data_prefix] = DATA16_PREFIX;
11500           default_prefixes |= PREFIX_DATA;
11501         }
11502       else if (rex & REX_W)
11503         {
11504           /* REX_W will override PREFIX_DATA.  */
11505           default_prefixes |= PREFIX_DATA;
11506         }
11507     }
11508
11509   if (need_modrm)
11510     {
11511       FETCH_DATA (info, codep + 1);
11512       modrm.mod = (*codep >> 6) & 3;
11513       modrm.reg = (*codep >> 3) & 7;
11514       modrm.rm = *codep & 7;
11515     }
11516
11517    need_vex = 0;
11518    need_vex_reg = 0;
11519    vex_w_done = 0;
11520
11521   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11522     {
11523       dofloat (sizeflag);
11524     }
11525   else
11526     {
11527       dp = get_valid_dis386 (dp, info);
11528       if (dp != NULL && putop (dp->name, sizeflag) == 0)
11529         {
11530           for (i = 0; i < MAX_OPERANDS; ++i)
11531             {
11532               obufp = op_out[i];
11533               op_ad = MAX_OPERANDS - 1 - i;
11534               if (dp->op[i].rtn)
11535                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11536             }
11537         }
11538     }
11539
11540   /* See if any prefixes were not used.  If so, print the first one
11541      separately.  If we don't do this, we'll wind up printing an
11542      instruction stream which does not precisely correspond to the
11543      bytes we are disassembling.  */
11544   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11545     {
11546       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11547         if (all_prefixes[i])
11548           {
11549             const char *name;
11550             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11551             if (name == NULL)
11552               name = INTERNAL_DISASSEMBLER_ERROR;
11553             (*info->fprintf_func) (info->stream, "%s", name);
11554             return 1;
11555           }
11556     }
11557
11558   /* Check if the REX prefix is used.  */
11559   if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11560     all_prefixes[last_rex_prefix] = 0;
11561
11562   /* Check if the SEG prefix is used.  */
11563   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11564                    | PREFIX_FS | PREFIX_GS)) != 0
11565       && (used_prefixes
11566           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11567     all_prefixes[last_seg_prefix] = 0;
11568
11569   /* Check if the ADDR prefix is used.  */
11570   if ((prefixes & PREFIX_ADDR) != 0
11571       && (used_prefixes & PREFIX_ADDR) != 0)
11572     all_prefixes[last_addr_prefix] = 0;
11573
11574   /* Check if the DATA prefix is used.  */
11575   if ((prefixes & PREFIX_DATA) != 0
11576       && (used_prefixes & PREFIX_DATA) != 0)
11577     all_prefixes[last_data_prefix] = 0;
11578
11579   prefix_length = 0;
11580   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11581     if (all_prefixes[i])
11582       {
11583         const char *name;
11584         name = prefix_name (all_prefixes[i], sizeflag);
11585         if (name == NULL)
11586           abort ();
11587         prefix_length += strlen (name) + 1;
11588         (*info->fprintf_func) (info->stream, "%s ", name);
11589       }
11590
11591   /* Check maximum code length.  */
11592   if ((codep - start_codep) > MAX_CODE_LENGTH)
11593     {
11594       (*info->fprintf_func) (info->stream, "(bad)");
11595       return MAX_CODE_LENGTH;
11596     }
11597
11598   obufp = mnemonicendp;
11599   for (i = strlen (obuf) + prefix_length; i < 6; i++)
11600     oappend (" ");
11601   oappend (" ");
11602   (*info->fprintf_func) (info->stream, "%s", obuf);
11603
11604   /* The enter and bound instructions are printed with operands in the same
11605      order as the intel book; everything else is printed in reverse order.  */
11606   if (intel_syntax || two_source_ops)
11607     {
11608       bfd_vma riprel;
11609
11610       for (i = 0; i < MAX_OPERANDS; ++i)
11611         op_txt[i] = op_out[i];
11612
11613       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11614         {
11615           op_ad = op_index[i];
11616           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11617           op_index[MAX_OPERANDS - 1 - i] = op_ad;
11618           riprel = op_riprel[i];
11619           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11620           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11621         }
11622     }
11623   else
11624     {
11625       for (i = 0; i < MAX_OPERANDS; ++i)
11626         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11627     }
11628
11629   needcomma = 0;
11630   for (i = 0; i < MAX_OPERANDS; ++i)
11631     if (*op_txt[i])
11632       {
11633         if (needcomma)
11634           (*info->fprintf_func) (info->stream, ",");
11635         if (op_index[i] != -1 && !op_riprel[i])
11636           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11637         else
11638           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11639         needcomma = 1;
11640       }
11641
11642   for (i = 0; i < MAX_OPERANDS; i++)
11643     if (op_index[i] != -1 && op_riprel[i])
11644       {
11645         (*info->fprintf_func) (info->stream, "        # ");
11646         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11647                                                 + op_address[op_index[i]]), info);
11648         break;
11649       }
11650   return codep - priv.the_buffer;
11651 }
11652
11653 static const char *float_mem[] = {
11654   /* d8 */
11655   "fadd{s|}",
11656   "fmul{s|}",
11657   "fcom{s|}",
11658   "fcomp{s|}",
11659   "fsub{s|}",
11660   "fsubr{s|}",
11661   "fdiv{s|}",
11662   "fdivr{s|}",
11663   /* d9 */
11664   "fld{s|}",
11665   "(bad)",
11666   "fst{s|}",
11667   "fstp{s|}",
11668   "fldenvIC",
11669   "fldcw",
11670   "fNstenvIC",
11671   "fNstcw",
11672   /* da */
11673   "fiadd{l|}",
11674   "fimul{l|}",
11675   "ficom{l|}",
11676   "ficomp{l|}",
11677   "fisub{l|}",
11678   "fisubr{l|}",
11679   "fidiv{l|}",
11680   "fidivr{l|}",
11681   /* db */
11682   "fild{l|}",
11683   "fisttp{l|}",
11684   "fist{l|}",
11685   "fistp{l|}",
11686   "(bad)",
11687   "fld{t||t|}",
11688   "(bad)",
11689   "fstp{t||t|}",
11690   /* dc */
11691   "fadd{l|}",
11692   "fmul{l|}",
11693   "fcom{l|}",
11694   "fcomp{l|}",
11695   "fsub{l|}",
11696   "fsubr{l|}",
11697   "fdiv{l|}",
11698   "fdivr{l|}",
11699   /* dd */
11700   "fld{l|}",
11701   "fisttp{ll|}",
11702   "fst{l||}",
11703   "fstp{l|}",
11704   "frstorIC",
11705   "(bad)",
11706   "fNsaveIC",
11707   "fNstsw",
11708   /* de */
11709   "fiadd",
11710   "fimul",
11711   "ficom",
11712   "ficomp",
11713   "fisub",
11714   "fisubr",
11715   "fidiv",
11716   "fidivr",
11717   /* df */
11718   "fild",
11719   "fisttp",
11720   "fist",
11721   "fistp",
11722   "fbld",
11723   "fild{ll|}",
11724   "fbstp",
11725   "fistp{ll|}",
11726 };
11727
11728 static const unsigned char float_mem_mode[] = {
11729   /* d8 */
11730   d_mode,
11731   d_mode,
11732   d_mode,
11733   d_mode,
11734   d_mode,
11735   d_mode,
11736   d_mode,
11737   d_mode,
11738   /* d9 */
11739   d_mode,
11740   0,
11741   d_mode,
11742   d_mode,
11743   0,
11744   w_mode,
11745   0,
11746   w_mode,
11747   /* da */
11748   d_mode,
11749   d_mode,
11750   d_mode,
11751   d_mode,
11752   d_mode,
11753   d_mode,
11754   d_mode,
11755   d_mode,
11756   /* db */
11757   d_mode,
11758   d_mode,
11759   d_mode,
11760   d_mode,
11761   0,
11762   t_mode,
11763   0,
11764   t_mode,
11765   /* dc */
11766   q_mode,
11767   q_mode,
11768   q_mode,
11769   q_mode,
11770   q_mode,
11771   q_mode,
11772   q_mode,
11773   q_mode,
11774   /* dd */
11775   q_mode,
11776   q_mode,
11777   q_mode,
11778   q_mode,
11779   0,
11780   0,
11781   0,
11782   w_mode,
11783   /* de */
11784   w_mode,
11785   w_mode,
11786   w_mode,
11787   w_mode,
11788   w_mode,
11789   w_mode,
11790   w_mode,
11791   w_mode,
11792   /* df */
11793   w_mode,
11794   w_mode,
11795   w_mode,
11796   w_mode,
11797   t_mode,
11798   q_mode,
11799   t_mode,
11800   q_mode
11801 };
11802
11803 #define ST { OP_ST, 0 }
11804 #define STi { OP_STi, 0 }
11805
11806 #define FGRPd9_2 NULL, { { NULL, 0 } }
11807 #define FGRPd9_4 NULL, { { NULL, 1 } }
11808 #define FGRPd9_5 NULL, { { NULL, 2 } }
11809 #define FGRPd9_6 NULL, { { NULL, 3 } }
11810 #define FGRPd9_7 NULL, { { NULL, 4 } }
11811 #define FGRPda_5 NULL, { { NULL, 5 } }
11812 #define FGRPdb_4 NULL, { { NULL, 6 } }
11813 #define FGRPde_3 NULL, { { NULL, 7 } }
11814 #define FGRPdf_4 NULL, { { NULL, 8 } }
11815
11816 static const struct dis386 float_reg[][8] = {
11817   /* d8 */
11818   {
11819     { "fadd",   { ST, STi } },
11820     { "fmul",   { ST, STi } },
11821     { "fcom",   { STi } },
11822     { "fcomp",  { STi } },
11823     { "fsub",   { ST, STi } },
11824     { "fsubr",  { ST, STi } },
11825     { "fdiv",   { ST, STi } },
11826     { "fdivr",  { ST, STi } },
11827   },
11828   /* d9 */
11829   {
11830     { "fld",    { STi } },
11831     { "fxch",   { STi } },
11832     { FGRPd9_2 },
11833     { Bad_Opcode },
11834     { FGRPd9_4 },
11835     { FGRPd9_5 },
11836     { FGRPd9_6 },
11837     { FGRPd9_7 },
11838   },
11839   /* da */
11840   {
11841     { "fcmovb", { ST, STi } },
11842     { "fcmove", { ST, STi } },
11843     { "fcmovbe",{ ST, STi } },
11844     { "fcmovu", { ST, STi } },
11845     { Bad_Opcode },
11846     { FGRPda_5 },
11847     { Bad_Opcode },
11848     { Bad_Opcode },
11849   },
11850   /* db */
11851   {
11852     { "fcmovnb",{ ST, STi } },
11853     { "fcmovne",{ ST, STi } },
11854     { "fcmovnbe",{ ST, STi } },
11855     { "fcmovnu",{ ST, STi } },
11856     { FGRPdb_4 },
11857     { "fucomi", { ST, STi } },
11858     { "fcomi",  { ST, STi } },
11859     { Bad_Opcode },
11860   },
11861   /* dc */
11862   {
11863     { "fadd",   { STi, ST } },
11864     { "fmul",   { STi, ST } },
11865     { Bad_Opcode },
11866     { Bad_Opcode },
11867     { "fsub!M", { STi, ST } },
11868     { "fsubM",  { STi, ST } },
11869     { "fdiv!M", { STi, ST } },
11870     { "fdivM",  { STi, ST } },
11871   },
11872   /* dd */
11873   {
11874     { "ffree",  { STi } },
11875     { Bad_Opcode },
11876     { "fst",    { STi } },
11877     { "fstp",   { STi } },
11878     { "fucom",  { STi } },
11879     { "fucomp", { STi } },
11880     { Bad_Opcode },
11881     { Bad_Opcode },
11882   },
11883   /* de */
11884   {
11885     { "faddp",  { STi, ST } },
11886     { "fmulp",  { STi, ST } },
11887     { Bad_Opcode },
11888     { FGRPde_3 },
11889     { "fsub!Mp", { STi, ST } },
11890     { "fsubMp", { STi, ST } },
11891     { "fdiv!Mp", { STi, ST } },
11892     { "fdivMp", { STi, ST } },
11893   },
11894   /* df */
11895   {
11896     { "ffreep", { STi } },
11897     { Bad_Opcode },
11898     { Bad_Opcode },
11899     { Bad_Opcode },
11900     { FGRPdf_4 },
11901     { "fucomip", { ST, STi } },
11902     { "fcomip", { ST, STi } },
11903     { Bad_Opcode },
11904   },
11905 };
11906
11907 static char *fgrps[][8] = {
11908   /* d9_2  0 */
11909   {
11910     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11911   },
11912
11913   /* d9_4  1 */
11914   {
11915     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11916   },
11917
11918   /* d9_5  2 */
11919   {
11920     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11921   },
11922
11923   /* d9_6  3 */
11924   {
11925     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11926   },
11927
11928   /* d9_7  4 */
11929   {
11930     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11931   },
11932
11933   /* da_5  5 */
11934   {
11935     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11936   },
11937
11938   /* db_4  6 */
11939   {
11940     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11941     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11942   },
11943
11944   /* de_3  7 */
11945   {
11946     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11947   },
11948
11949   /* df_4  8 */
11950   {
11951     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11952   },
11953 };
11954
11955 static void
11956 swap_operand (void)
11957 {
11958   mnemonicendp[0] = '.';
11959   mnemonicendp[1] = 's';
11960   mnemonicendp += 2;
11961 }
11962
11963 static void
11964 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11965                int sizeflag ATTRIBUTE_UNUSED)
11966 {
11967   /* Skip mod/rm byte.  */
11968   MODRM_CHECK;
11969   codep++;
11970 }
11971
11972 static void
11973 dofloat (int sizeflag)
11974 {
11975   const struct dis386 *dp;
11976   unsigned char floatop;
11977
11978   floatop = codep[-1];
11979
11980   if (modrm.mod != 3)
11981     {
11982       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
11983
11984       putop (float_mem[fp_indx], sizeflag);
11985       obufp = op_out[0];
11986       op_ad = 2;
11987       OP_E (float_mem_mode[fp_indx], sizeflag);
11988       return;
11989     }
11990   /* Skip mod/rm byte.  */
11991   MODRM_CHECK;
11992   codep++;
11993
11994   dp = &float_reg[floatop - 0xd8][modrm.reg];
11995   if (dp->name == NULL)
11996     {
11997       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
11998
11999       /* Instruction fnstsw is only one with strange arg.  */
12000       if (floatop == 0xdf && codep[-1] == 0xe0)
12001         strcpy (op_out[0], names16[0]);
12002     }
12003   else
12004     {
12005       putop (dp->name, sizeflag);
12006
12007       obufp = op_out[0];
12008       op_ad = 2;
12009       if (dp->op[0].rtn)
12010         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12011
12012       obufp = op_out[1];
12013       op_ad = 1;
12014       if (dp->op[1].rtn)
12015         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12016     }
12017 }
12018
12019 static void
12020 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12021 {
12022   oappend ("%st" + intel_syntax);
12023 }
12024
12025 static void
12026 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12027 {
12028   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12029   oappend (scratchbuf + intel_syntax);
12030 }
12031
12032 /* Capital letters in template are macros.  */
12033 static int
12034 putop (const char *in_template, int sizeflag)
12035 {
12036   const char *p;
12037   int alt = 0;
12038   int cond = 1;
12039   unsigned int l = 0, len = 1;
12040   char last[4];
12041
12042 #define SAVE_LAST(c)                    \
12043   if (l < len && l < sizeof (last))     \
12044     last[l++] = c;                      \
12045   else                                  \
12046     abort ();
12047
12048   for (p = in_template; *p; p++)
12049     {
12050       switch (*p)
12051         {
12052         default:
12053           *obufp++ = *p;
12054           break;
12055         case '%':
12056           len++;
12057           break;
12058         case '!':
12059           cond = 0;
12060           break;
12061         case '{':
12062           alt = 0;
12063           if (intel_syntax)
12064             {
12065               while (*++p != '|')
12066                 if (*p == '}' || *p == '\0')
12067                   abort ();
12068             }
12069           /* Fall through.  */
12070         case 'I':
12071           alt = 1;
12072           continue;
12073         case '|':
12074           while (*++p != '}')
12075             {
12076               if (*p == '\0')
12077                 abort ();
12078             }
12079           break;
12080         case '}':
12081           break;
12082         case 'A':
12083           if (intel_syntax)
12084             break;
12085           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12086             *obufp++ = 'b';
12087           break;
12088         case 'B':
12089           if (l == 0 && len == 1)
12090             {
12091 case_B:
12092               if (intel_syntax)
12093                 break;
12094               if (sizeflag & SUFFIX_ALWAYS)
12095                 *obufp++ = 'b';
12096             }
12097           else
12098             {
12099               if (l != 1
12100                   || len != 2
12101                   || last[0] != 'L')
12102                 {
12103                   SAVE_LAST (*p);
12104                   break;
12105                 }
12106
12107               if (address_mode == mode_64bit
12108                   && !(prefixes & PREFIX_ADDR))
12109                 {
12110                   *obufp++ = 'a';
12111                   *obufp++ = 'b';
12112                   *obufp++ = 's';
12113                 }
12114
12115               goto case_B;
12116             }
12117           break;
12118         case 'C':
12119           if (intel_syntax && !alt)
12120             break;
12121           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12122             {
12123               if (sizeflag & DFLAG)
12124                 *obufp++ = intel_syntax ? 'd' : 'l';
12125               else
12126                 *obufp++ = intel_syntax ? 'w' : 's';
12127               used_prefixes |= (prefixes & PREFIX_DATA);
12128             }
12129           break;
12130         case 'D':
12131           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12132             break;
12133           USED_REX (REX_W);
12134           if (modrm.mod == 3)
12135             {
12136               if (rex & REX_W)
12137                 *obufp++ = 'q';
12138               else
12139                 {
12140                   if (sizeflag & DFLAG)
12141                     *obufp++ = intel_syntax ? 'd' : 'l';
12142                   else
12143                     *obufp++ = 'w';
12144                   used_prefixes |= (prefixes & PREFIX_DATA);
12145                 }
12146             }
12147           else
12148             *obufp++ = 'w';
12149           break;
12150         case 'E':               /* For jcxz/jecxz */
12151           if (address_mode == mode_64bit)
12152             {
12153               if (sizeflag & AFLAG)
12154                 *obufp++ = 'r';
12155               else
12156                 *obufp++ = 'e';
12157             }
12158           else
12159             if (sizeflag & AFLAG)
12160               *obufp++ = 'e';
12161           used_prefixes |= (prefixes & PREFIX_ADDR);
12162           break;
12163         case 'F':
12164           if (intel_syntax)
12165             break;
12166           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12167             {
12168               if (sizeflag & AFLAG)
12169                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12170               else
12171                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12172               used_prefixes |= (prefixes & PREFIX_ADDR);
12173             }
12174           break;
12175         case 'G':
12176           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12177             break;
12178           if ((rex & REX_W) || (sizeflag & DFLAG))
12179             *obufp++ = 'l';
12180           else
12181             *obufp++ = 'w';
12182           if (!(rex & REX_W))
12183             used_prefixes |= (prefixes & PREFIX_DATA);
12184           break;
12185         case 'H':
12186           if (intel_syntax)
12187             break;
12188           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12189               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12190             {
12191               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12192               *obufp++ = ',';
12193               *obufp++ = 'p';
12194               if (prefixes & PREFIX_DS)
12195                 *obufp++ = 't';
12196               else
12197                 *obufp++ = 'n';
12198             }
12199           break;
12200         case 'J':
12201           if (intel_syntax)
12202             break;
12203           *obufp++ = 'l';
12204           break;
12205         case 'K':
12206           USED_REX (REX_W);
12207           if (rex & REX_W)
12208             *obufp++ = 'q';
12209           else
12210             *obufp++ = 'd';
12211           break;
12212         case 'Z':
12213           if (intel_syntax)
12214             break;
12215           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12216             {
12217               *obufp++ = 'q';
12218               break;
12219             }
12220           /* Fall through.  */
12221           goto case_L;
12222         case 'L':
12223           if (l != 0 || len != 1)
12224             {
12225               SAVE_LAST (*p);
12226               break;
12227             }
12228 case_L:
12229           if (intel_syntax)
12230             break;
12231           if (sizeflag & SUFFIX_ALWAYS)
12232             *obufp++ = 'l';
12233           break;
12234         case 'M':
12235           if (intel_mnemonic != cond)
12236             *obufp++ = 'r';
12237           break;
12238         case 'N':
12239           if ((prefixes & PREFIX_FWAIT) == 0)
12240             *obufp++ = 'n';
12241           else
12242             used_prefixes |= PREFIX_FWAIT;
12243           break;
12244         case 'O':
12245           USED_REX (REX_W);
12246           if (rex & REX_W)
12247             *obufp++ = 'o';
12248           else if (intel_syntax && (sizeflag & DFLAG))
12249             *obufp++ = 'q';
12250           else
12251             *obufp++ = 'd';
12252           if (!(rex & REX_W))
12253             used_prefixes |= (prefixes & PREFIX_DATA);
12254           break;
12255         case 'T':
12256           if (intel_syntax)
12257             break;
12258           if (address_mode == mode_64bit && (sizeflag & DFLAG))
12259             {
12260               *obufp++ = 'q';
12261               break;
12262             }
12263           /* Fall through.  */
12264         case 'P':
12265           if (intel_syntax)
12266             break;
12267           if ((prefixes & PREFIX_DATA)
12268               || (rex & REX_W)
12269               || (sizeflag & SUFFIX_ALWAYS))
12270             {
12271               USED_REX (REX_W);
12272               if (rex & REX_W)
12273                 *obufp++ = 'q';
12274               else
12275                 {
12276                    if (sizeflag & DFLAG)
12277                       *obufp++ = 'l';
12278                    else
12279                      *obufp++ = 'w';
12280                    used_prefixes |= (prefixes & PREFIX_DATA);
12281                 }
12282             }
12283           break;
12284         case 'U':
12285           if (intel_syntax)
12286             break;
12287           if (address_mode == mode_64bit && (sizeflag & DFLAG))
12288             {
12289               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12290                 *obufp++ = 'q';
12291               break;
12292             }
12293           /* Fall through.  */
12294           goto case_Q;
12295         case 'Q':
12296           if (l == 0 && len == 1)
12297             {
12298 case_Q:
12299               if (intel_syntax && !alt)
12300                 break;
12301               USED_REX (REX_W);
12302               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12303                 {
12304                   if (rex & REX_W)
12305                     *obufp++ = 'q';
12306                   else
12307                     {
12308                       if (sizeflag & DFLAG)
12309                         *obufp++ = intel_syntax ? 'd' : 'l';
12310                       else
12311                         *obufp++ = 'w';
12312                       used_prefixes |= (prefixes & PREFIX_DATA);
12313                     }
12314                 }
12315             }
12316           else
12317             {
12318               if (l != 1 || len != 2 || last[0] != 'L')
12319                 {
12320                   SAVE_LAST (*p);
12321                   break;
12322                 }
12323               if (intel_syntax
12324                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12325                 break;
12326               if ((rex & REX_W))
12327                 {
12328                   USED_REX (REX_W);
12329                   *obufp++ = 'q';
12330                 }
12331               else
12332                 *obufp++ = 'l';
12333             }
12334           break;
12335         case 'R':
12336           USED_REX (REX_W);
12337           if (rex & REX_W)
12338             *obufp++ = 'q';
12339           else if (sizeflag & DFLAG)
12340             {
12341               if (intel_syntax)
12342                   *obufp++ = 'd';
12343               else
12344                   *obufp++ = 'l';
12345             }
12346           else
12347             *obufp++ = 'w';
12348           if (intel_syntax && !p[1]
12349               && ((rex & REX_W) || (sizeflag & DFLAG)))
12350             *obufp++ = 'e';
12351           if (!(rex & REX_W))
12352             used_prefixes |= (prefixes & PREFIX_DATA);
12353           break;
12354         case 'V':
12355           if (l == 0 && len == 1)
12356             {
12357               if (intel_syntax)
12358                 break;
12359               if (address_mode == mode_64bit && (sizeflag & DFLAG))
12360                 {
12361                   if (sizeflag & SUFFIX_ALWAYS)
12362                     *obufp++ = 'q';
12363                   break;
12364                 }
12365             }
12366           else
12367             {
12368               if (l != 1
12369                   || len != 2
12370                   || last[0] != 'L')
12371                 {
12372                   SAVE_LAST (*p);
12373                   break;
12374                 }
12375
12376               if (rex & REX_W)
12377                 {
12378                   *obufp++ = 'a';
12379                   *obufp++ = 'b';
12380                   *obufp++ = 's';
12381                 }
12382             }
12383           /* Fall through.  */
12384           goto case_S;
12385         case 'S':
12386           if (l == 0 && len == 1)
12387             {
12388 case_S:
12389               if (intel_syntax)
12390                 break;
12391               if (sizeflag & SUFFIX_ALWAYS)
12392                 {
12393                   if (rex & REX_W)
12394                     *obufp++ = 'q';
12395                   else
12396                     {
12397                       if (sizeflag & DFLAG)
12398                         *obufp++ = 'l';
12399                       else
12400                         *obufp++ = 'w';
12401                       used_prefixes |= (prefixes & PREFIX_DATA);
12402                     }
12403                 }
12404             }
12405           else
12406             {
12407               if (l != 1
12408                   || len != 2
12409                   || last[0] != 'L')
12410                 {
12411                   SAVE_LAST (*p);
12412                   break;
12413                 }
12414
12415               if (address_mode == mode_64bit
12416                   && !(prefixes & PREFIX_ADDR))
12417                 {
12418                   *obufp++ = 'a';
12419                   *obufp++ = 'b';
12420                   *obufp++ = 's';
12421                 }
12422
12423               goto case_S;
12424             }
12425           break;
12426         case 'X':
12427           if (l != 0 || len != 1)
12428             {
12429               SAVE_LAST (*p);
12430               break;
12431             }
12432           if (need_vex && vex.prefix)
12433             {
12434               if (vex.prefix == DATA_PREFIX_OPCODE)
12435                 *obufp++ = 'd';
12436               else
12437                 *obufp++ = 's';
12438             }
12439           else
12440             {
12441               if (prefixes & PREFIX_DATA)
12442                 *obufp++ = 'd';
12443               else
12444                 *obufp++ = 's';
12445               used_prefixes |= (prefixes & PREFIX_DATA);
12446             }
12447           break;
12448         case 'Y':
12449           if (l == 0 && len == 1)
12450             {
12451               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12452                 break;
12453               if (rex & REX_W)
12454                 {
12455                   USED_REX (REX_W);
12456                   *obufp++ = 'q';
12457                 }
12458               break;
12459             }
12460           else
12461             {
12462               if (l != 1 || len != 2 || last[0] != 'X')
12463                 {
12464                   SAVE_LAST (*p);
12465                   break;
12466                 }
12467               if (!need_vex)
12468                 abort ();
12469               if (intel_syntax
12470                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12471                 break;
12472               switch (vex.length)
12473                 {
12474                 case 128:
12475                   *obufp++ = 'x';
12476                   break;
12477                 case 256:
12478                   *obufp++ = 'y';
12479                   break;
12480                 default:
12481                   abort ();
12482                 }
12483             }
12484           break;
12485         case 'W':
12486           if (l == 0 && len == 1)
12487             {
12488               /* operand size flag for cwtl, cbtw */
12489               USED_REX (REX_W);
12490               if (rex & REX_W)
12491                 {
12492                   if (intel_syntax)
12493                     *obufp++ = 'd';
12494                   else
12495                     *obufp++ = 'l';
12496                 }
12497               else if (sizeflag & DFLAG)
12498                 *obufp++ = 'w';
12499               else
12500                 *obufp++ = 'b';
12501               if (!(rex & REX_W))
12502                 used_prefixes |= (prefixes & PREFIX_DATA);
12503             }
12504           else
12505             {
12506               if (l != 1 || len != 2 || last[0] != 'X')
12507                 {
12508                   SAVE_LAST (*p);
12509                   break;
12510                 }
12511               if (!need_vex)
12512                 abort ();
12513               *obufp++ = vex.w ? 'd': 's';
12514             }
12515           break;
12516         }
12517       alt = 0;
12518     }
12519   *obufp = 0;
12520   mnemonicendp = obufp;
12521   return 0;
12522 }
12523
12524 static void
12525 oappend (const char *s)
12526 {
12527   obufp = stpcpy (obufp, s);
12528 }
12529
12530 static void
12531 append_seg (void)
12532 {
12533   if (prefixes & PREFIX_CS)
12534     {
12535       used_prefixes |= PREFIX_CS;
12536       oappend ("%cs:" + intel_syntax);
12537     }
12538   if (prefixes & PREFIX_DS)
12539     {
12540       used_prefixes |= PREFIX_DS;
12541       oappend ("%ds:" + intel_syntax);
12542     }
12543   if (prefixes & PREFIX_SS)
12544     {
12545       used_prefixes |= PREFIX_SS;
12546       oappend ("%ss:" + intel_syntax);
12547     }
12548   if (prefixes & PREFIX_ES)
12549     {
12550       used_prefixes |= PREFIX_ES;
12551       oappend ("%es:" + intel_syntax);
12552     }
12553   if (prefixes & PREFIX_FS)
12554     {
12555       used_prefixes |= PREFIX_FS;
12556       oappend ("%fs:" + intel_syntax);
12557     }
12558   if (prefixes & PREFIX_GS)
12559     {
12560       used_prefixes |= PREFIX_GS;
12561       oappend ("%gs:" + intel_syntax);
12562     }
12563 }
12564
12565 static void
12566 OP_indirE (int bytemode, int sizeflag)
12567 {
12568   if (!intel_syntax)
12569     oappend ("*");
12570   OP_E (bytemode, sizeflag);
12571 }
12572
12573 static void
12574 print_operand_value (char *buf, int hex, bfd_vma disp)
12575 {
12576   if (address_mode == mode_64bit)
12577     {
12578       if (hex)
12579         {
12580           char tmp[30];
12581           int i;
12582           buf[0] = '0';
12583           buf[1] = 'x';
12584           sprintf_vma (tmp, disp);
12585           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12586           strcpy (buf + 2, tmp + i);
12587         }
12588       else
12589         {
12590           bfd_signed_vma v = disp;
12591           char tmp[30];
12592           int i;
12593           if (v < 0)
12594             {
12595               *(buf++) = '-';
12596               v = -disp;
12597               /* Check for possible overflow on 0x8000000000000000.  */
12598               if (v < 0)
12599                 {
12600                   strcpy (buf, "9223372036854775808");
12601                   return;
12602                 }
12603             }
12604           if (!v)
12605             {
12606               strcpy (buf, "0");
12607               return;
12608             }
12609
12610           i = 0;
12611           tmp[29] = 0;
12612           while (v)
12613             {
12614               tmp[28 - i] = (v % 10) + '0';
12615               v /= 10;
12616               i++;
12617             }
12618           strcpy (buf, tmp + 29 - i);
12619         }
12620     }
12621   else
12622     {
12623       if (hex)
12624         sprintf (buf, "0x%x", (unsigned int) disp);
12625       else
12626         sprintf (buf, "%d", (int) disp);
12627     }
12628 }
12629
12630 /* Put DISP in BUF as signed hex number.  */
12631
12632 static void
12633 print_displacement (char *buf, bfd_vma disp)
12634 {
12635   bfd_signed_vma val = disp;
12636   char tmp[30];
12637   int i, j = 0;
12638
12639   if (val < 0)
12640     {
12641       buf[j++] = '-';
12642       val = -disp;
12643
12644       /* Check for possible overflow.  */
12645       if (val < 0)
12646         {
12647           switch (address_mode)
12648             {
12649             case mode_64bit:
12650               strcpy (buf + j, "0x8000000000000000");
12651               break;
12652             case mode_32bit:
12653               strcpy (buf + j, "0x80000000");
12654               break;
12655             case mode_16bit:
12656               strcpy (buf + j, "0x8000");
12657               break;
12658             }
12659           return;
12660         }
12661     }
12662
12663   buf[j++] = '0';
12664   buf[j++] = 'x';
12665
12666   sprintf_vma (tmp, (bfd_vma) val);
12667   for (i = 0; tmp[i] == '0'; i++)
12668     continue;
12669   if (tmp[i] == '\0')
12670     i--;
12671   strcpy (buf + j, tmp + i);
12672 }
12673
12674 static void
12675 intel_operand_size (int bytemode, int sizeflag)
12676 {
12677   switch (bytemode)
12678     {
12679     case b_mode:
12680     case b_swap_mode:
12681     case dqb_mode:
12682       oappend ("BYTE PTR ");
12683       break;
12684     case w_mode:
12685     case dqw_mode:
12686       oappend ("WORD PTR ");
12687       break;
12688     case stack_v_mode:
12689       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12690         {
12691           oappend ("QWORD PTR ");
12692           break;
12693         }
12694       /* FALLTHRU */
12695     case v_mode:
12696     case v_swap_mode:
12697     case dq_mode:
12698       USED_REX (REX_W);
12699       if (rex & REX_W)
12700         oappend ("QWORD PTR ");
12701       else
12702         {
12703           if ((sizeflag & DFLAG) || bytemode == dq_mode)
12704             oappend ("DWORD PTR ");
12705           else
12706             oappend ("WORD PTR ");
12707           used_prefixes |= (prefixes & PREFIX_DATA);
12708         }
12709       break;
12710     case z_mode:
12711       if ((rex & REX_W) || (sizeflag & DFLAG))
12712         *obufp++ = 'D';
12713       oappend ("WORD PTR ");
12714       if (!(rex & REX_W))
12715         used_prefixes |= (prefixes & PREFIX_DATA);
12716       break;
12717     case a_mode:
12718       if (sizeflag & DFLAG)
12719         oappend ("QWORD PTR ");
12720       else
12721         oappend ("DWORD PTR ");
12722       used_prefixes |= (prefixes & PREFIX_DATA);
12723       break;
12724     case d_mode:
12725     case d_scalar_mode:
12726     case d_scalar_swap_mode:
12727     case d_swap_mode:
12728     case dqd_mode:
12729       oappend ("DWORD PTR ");
12730       break;
12731     case q_mode:
12732     case q_scalar_mode:
12733     case q_scalar_swap_mode:
12734     case q_swap_mode:
12735       oappend ("QWORD PTR ");
12736       break;
12737     case m_mode:
12738       if (address_mode == mode_64bit)
12739         oappend ("QWORD PTR ");
12740       else
12741         oappend ("DWORD PTR ");
12742       break;
12743     case f_mode:
12744       if (sizeflag & DFLAG)
12745         oappend ("FWORD PTR ");
12746       else
12747         oappend ("DWORD PTR ");
12748       used_prefixes |= (prefixes & PREFIX_DATA);
12749       break;
12750     case t_mode:
12751       oappend ("TBYTE PTR ");
12752       break;
12753     case x_mode:
12754     case x_swap_mode:
12755       if (need_vex)
12756         {
12757           switch (vex.length)
12758             {
12759             case 128:
12760               oappend ("XMMWORD PTR ");
12761               break;
12762             case 256:
12763               oappend ("YMMWORD PTR ");
12764               break;
12765             default:
12766               abort ();
12767             }
12768         }
12769       else
12770         oappend ("XMMWORD PTR ");
12771       break;
12772     case xmm_mode:
12773       oappend ("XMMWORD PTR ");
12774       break;
12775     case xmmq_mode:
12776       if (!need_vex)
12777         abort ();
12778
12779       switch (vex.length)
12780         {
12781         case 128:
12782           oappend ("QWORD PTR ");
12783           break;
12784         case 256:
12785           oappend ("XMMWORD PTR ");
12786           break;
12787         default:
12788           abort ();
12789         }
12790       break;
12791     case ymmq_mode:
12792       if (!need_vex)
12793         abort ();
12794
12795       switch (vex.length)
12796         {
12797         case 128:
12798           oappend ("QWORD PTR ");
12799           break;
12800         case 256:
12801           oappend ("YMMWORD PTR ");
12802           break;
12803         default:
12804           abort ();
12805         }
12806       break;
12807     case o_mode:
12808       oappend ("OWORD PTR ");
12809       break;
12810     case vex_w_dq_mode:
12811     case vex_scalar_w_dq_mode:
12812       if (!need_vex)
12813         abort ();
12814
12815       if (vex.w)
12816         oappend ("QWORD PTR ");
12817       else
12818         oappend ("DWORD PTR ");
12819       break;
12820     default:
12821       break;
12822     }
12823 }
12824
12825 static void
12826 OP_E_register (int bytemode, int sizeflag)
12827 {
12828   int reg = modrm.rm;
12829   const char **names;
12830
12831   USED_REX (REX_B);
12832   if ((rex & REX_B))
12833     reg += 8;
12834
12835   if ((sizeflag & SUFFIX_ALWAYS)
12836       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12837     swap_operand ();
12838
12839   switch (bytemode)
12840     {
12841     case b_mode:
12842     case b_swap_mode:
12843       USED_REX (0);
12844       if (rex)
12845         names = names8rex;
12846       else
12847         names = names8;
12848       break;
12849     case w_mode:
12850       names = names16;
12851       break;
12852     case d_mode:
12853       names = names32;
12854       break;
12855     case q_mode:
12856       names = names64;
12857       break;
12858     case m_mode:
12859       names = address_mode == mode_64bit ? names64 : names32;
12860       break;
12861     case stack_v_mode:
12862       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12863         {
12864           names = names64;
12865           break;
12866         }
12867       bytemode = v_mode;
12868       /* FALLTHRU */
12869     case v_mode:
12870     case v_swap_mode:
12871     case dq_mode:
12872     case dqb_mode:
12873     case dqd_mode:
12874     case dqw_mode:
12875       USED_REX (REX_W);
12876       if (rex & REX_W)
12877         names = names64;
12878       else
12879         {
12880           if ((sizeflag & DFLAG) 
12881               || (bytemode != v_mode
12882                   && bytemode != v_swap_mode))
12883             names = names32;
12884           else
12885             names = names16;
12886           used_prefixes |= (prefixes & PREFIX_DATA);
12887         }
12888       break;
12889     case 0:
12890       return;
12891     default:
12892       oappend (INTERNAL_DISASSEMBLER_ERROR);
12893       return;
12894     }
12895   oappend (names[reg]);
12896 }
12897
12898 static void
12899 OP_E_memory (int bytemode, int sizeflag)
12900 {
12901   bfd_vma disp = 0;
12902   int add = (rex & REX_B) ? 8 : 0;
12903   int riprel = 0;
12904
12905   USED_REX (REX_B);
12906   if (intel_syntax)
12907     intel_operand_size (bytemode, sizeflag);
12908   append_seg ();
12909
12910   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12911     {
12912       /* 32/64 bit address mode */
12913       int havedisp;
12914       int havesib;
12915       int havebase;
12916       int haveindex;
12917       int needindex;
12918       int base, rbase;
12919       int vindex = 0;
12920       int scale = 0;
12921
12922       havesib = 0;
12923       havebase = 1;
12924       haveindex = 0;
12925       base = modrm.rm;
12926
12927       if (base == 4)
12928         {
12929           havesib = 1;
12930           FETCH_DATA (the_info, codep + 1);
12931           vindex = (*codep >> 3) & 7;
12932           scale = (*codep >> 6) & 3;
12933           base = *codep & 7;
12934           USED_REX (REX_X);
12935           if (rex & REX_X)
12936             vindex += 8;
12937           haveindex = vindex != 4;
12938           codep++;
12939         }
12940       rbase = base + add;
12941
12942       switch (modrm.mod)
12943         {
12944         case 0:
12945           if (base == 5)
12946             {
12947               havebase = 0;
12948               if (address_mode == mode_64bit && !havesib)
12949                 riprel = 1;
12950               disp = get32s ();
12951             }
12952           break;
12953         case 1:
12954           FETCH_DATA (the_info, codep + 1);
12955           disp = *codep++;
12956           if ((disp & 0x80) != 0)
12957             disp -= 0x100;
12958           break;
12959         case 2:
12960           disp = get32s ();
12961           break;
12962         }
12963
12964       /* In 32bit mode, we need index register to tell [offset] from
12965          [eiz*1 + offset].  */
12966       needindex = (havesib
12967                    && !havebase
12968                    && !haveindex
12969                    && address_mode == mode_32bit);
12970       havedisp = (havebase
12971                   || needindex
12972                   || (havesib && (haveindex || scale != 0)));
12973
12974       if (!intel_syntax)
12975         if (modrm.mod != 0 || base == 5)
12976           {
12977             if (havedisp || riprel)
12978               print_displacement (scratchbuf, disp);
12979             else
12980               print_operand_value (scratchbuf, 1, disp);
12981             oappend (scratchbuf);
12982             if (riprel)
12983               {
12984                 set_op (disp, 1);
12985                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
12986               }
12987           }
12988
12989       if (havebase || haveindex || riprel)
12990         used_prefixes |= PREFIX_ADDR;
12991
12992       if (havedisp || (intel_syntax && riprel))
12993         {
12994           *obufp++ = open_char;
12995           if (intel_syntax && riprel)
12996             {
12997               set_op (disp, 1);
12998               oappend (sizeflag & AFLAG ? "rip" : "eip");
12999             }
13000           *obufp = '\0';
13001           if (havebase)
13002             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13003                      ? names64[rbase] : names32[rbase]);
13004           if (havesib)
13005             {
13006               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
13007                  print index to tell base + index from base.  */
13008               if (scale != 0
13009                   || needindex
13010                   || haveindex
13011                   || (havebase && base != ESP_REG_NUM))
13012                 {
13013                   if (!intel_syntax || havebase)
13014                     {
13015                       *obufp++ = separator_char;
13016                       *obufp = '\0';
13017                     }
13018                   if (haveindex)
13019                     oappend (address_mode == mode_64bit 
13020                              && (sizeflag & AFLAG)
13021                              ? names64[vindex] : names32[vindex]);
13022                   else
13023                     oappend (address_mode == mode_64bit 
13024                              && (sizeflag & AFLAG)
13025                              ? index64 : index32);
13026
13027                   *obufp++ = scale_char;
13028                   *obufp = '\0';
13029                   sprintf (scratchbuf, "%d", 1 << scale);
13030                   oappend (scratchbuf);
13031                 }
13032             }
13033           if (intel_syntax
13034               && (disp || modrm.mod != 0 || base == 5))
13035             {
13036               if (!havedisp || (bfd_signed_vma) disp >= 0)
13037                 {
13038                   *obufp++ = '+';
13039                   *obufp = '\0';
13040                 }
13041               else if (modrm.mod != 1 && disp != -disp)
13042                 {
13043                   *obufp++ = '-';
13044                   *obufp = '\0';
13045                   disp = - (bfd_signed_vma) disp;
13046                 }
13047
13048               if (havedisp)
13049                 print_displacement (scratchbuf, disp);
13050               else
13051                 print_operand_value (scratchbuf, 1, disp);
13052               oappend (scratchbuf);
13053             }
13054
13055           *obufp++ = close_char;
13056           *obufp = '\0';
13057         }
13058       else if (intel_syntax)
13059         {
13060           if (modrm.mod != 0 || base == 5)
13061             {
13062               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13063                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13064                 ;
13065               else
13066                 {
13067                   oappend (names_seg[ds_reg - es_reg]);
13068                   oappend (":");
13069                 }
13070               print_operand_value (scratchbuf, 1, disp);
13071               oappend (scratchbuf);
13072             }
13073         }
13074     }
13075   else
13076     {
13077       /* 16 bit address mode */
13078       used_prefixes |= prefixes & PREFIX_ADDR;
13079       switch (modrm.mod)
13080         {
13081         case 0:
13082           if (modrm.rm == 6)
13083             {
13084               disp = get16 ();
13085               if ((disp & 0x8000) != 0)
13086                 disp -= 0x10000;
13087             }
13088           break;
13089         case 1:
13090           FETCH_DATA (the_info, codep + 1);
13091           disp = *codep++;
13092           if ((disp & 0x80) != 0)
13093             disp -= 0x100;
13094           break;
13095         case 2:
13096           disp = get16 ();
13097           if ((disp & 0x8000) != 0)
13098             disp -= 0x10000;
13099           break;
13100         }
13101
13102       if (!intel_syntax)
13103         if (modrm.mod != 0 || modrm.rm == 6)
13104           {
13105             print_displacement (scratchbuf, disp);
13106             oappend (scratchbuf);
13107           }
13108
13109       if (modrm.mod != 0 || modrm.rm != 6)
13110         {
13111           *obufp++ = open_char;
13112           *obufp = '\0';
13113           oappend (index16[modrm.rm]);
13114           if (intel_syntax
13115               && (disp || modrm.mod != 0 || modrm.rm == 6))
13116             {
13117               if ((bfd_signed_vma) disp >= 0)
13118                 {
13119                   *obufp++ = '+';
13120                   *obufp = '\0';
13121                 }
13122               else if (modrm.mod != 1)
13123                 {
13124                   *obufp++ = '-';
13125                   *obufp = '\0';
13126                   disp = - (bfd_signed_vma) disp;
13127                 }
13128
13129               print_displacement (scratchbuf, disp);
13130               oappend (scratchbuf);
13131             }
13132
13133           *obufp++ = close_char;
13134           *obufp = '\0';
13135         }
13136       else if (intel_syntax)
13137         {
13138           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13139                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13140             ;
13141           else
13142             {
13143               oappend (names_seg[ds_reg - es_reg]);
13144               oappend (":");
13145             }
13146           print_operand_value (scratchbuf, 1, disp & 0xffff);
13147           oappend (scratchbuf);
13148         }
13149     }
13150 }
13151
13152 static void
13153 OP_E (int bytemode, int sizeflag)
13154 {
13155   /* Skip mod/rm byte.  */
13156   MODRM_CHECK;
13157   codep++;
13158
13159   if (modrm.mod == 3)
13160     OP_E_register (bytemode, sizeflag);
13161   else
13162     OP_E_memory (bytemode, sizeflag);
13163 }
13164
13165 static void
13166 OP_G (int bytemode, int sizeflag)
13167 {
13168   int add = 0;
13169   USED_REX (REX_R);
13170   if (rex & REX_R)
13171     add += 8;
13172   switch (bytemode)
13173     {
13174     case b_mode:
13175       USED_REX (0);
13176       if (rex)
13177         oappend (names8rex[modrm.reg + add]);
13178       else
13179         oappend (names8[modrm.reg + add]);
13180       break;
13181     case w_mode:
13182       oappend (names16[modrm.reg + add]);
13183       break;
13184     case d_mode:
13185       oappend (names32[modrm.reg + add]);
13186       break;
13187     case q_mode:
13188       oappend (names64[modrm.reg + add]);
13189       break;
13190     case v_mode:
13191     case dq_mode:
13192     case dqb_mode:
13193     case dqd_mode:
13194     case dqw_mode:
13195       USED_REX (REX_W);
13196       if (rex & REX_W)
13197         oappend (names64[modrm.reg + add]);
13198       else
13199         {
13200           if ((sizeflag & DFLAG) || bytemode != v_mode)
13201             oappend (names32[modrm.reg + add]);
13202           else
13203             oappend (names16[modrm.reg + add]);
13204           used_prefixes |= (prefixes & PREFIX_DATA);
13205         }
13206       break;
13207     case m_mode:
13208       if (address_mode == mode_64bit)
13209         oappend (names64[modrm.reg + add]);
13210       else
13211         oappend (names32[modrm.reg + add]);
13212       break;
13213     default:
13214       oappend (INTERNAL_DISASSEMBLER_ERROR);
13215       break;
13216     }
13217 }
13218
13219 static bfd_vma
13220 get64 (void)
13221 {
13222   bfd_vma x;
13223 #ifdef BFD64
13224   unsigned int a;
13225   unsigned int b;
13226
13227   FETCH_DATA (the_info, codep + 8);
13228   a = *codep++ & 0xff;
13229   a |= (*codep++ & 0xff) << 8;
13230   a |= (*codep++ & 0xff) << 16;
13231   a |= (*codep++ & 0xff) << 24;
13232   b = *codep++ & 0xff;
13233   b |= (*codep++ & 0xff) << 8;
13234   b |= (*codep++ & 0xff) << 16;
13235   b |= (*codep++ & 0xff) << 24;
13236   x = a + ((bfd_vma) b << 32);
13237 #else
13238   abort ();
13239   x = 0;
13240 #endif
13241   return x;
13242 }
13243
13244 static bfd_signed_vma
13245 get32 (void)
13246 {
13247   bfd_signed_vma x = 0;
13248
13249   FETCH_DATA (the_info, codep + 4);
13250   x = *codep++ & (bfd_signed_vma) 0xff;
13251   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13252   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13253   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13254   return x;
13255 }
13256
13257 static bfd_signed_vma
13258 get32s (void)
13259 {
13260   bfd_signed_vma x = 0;
13261
13262   FETCH_DATA (the_info, codep + 4);
13263   x = *codep++ & (bfd_signed_vma) 0xff;
13264   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13265   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13266   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13267
13268   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13269
13270   return x;
13271 }
13272
13273 static int
13274 get16 (void)
13275 {
13276   int x = 0;
13277
13278   FETCH_DATA (the_info, codep + 2);
13279   x = *codep++ & 0xff;
13280   x |= (*codep++ & 0xff) << 8;
13281   return x;
13282 }
13283
13284 static void
13285 set_op (bfd_vma op, int riprel)
13286 {
13287   op_index[op_ad] = op_ad;
13288   if (address_mode == mode_64bit)
13289     {
13290       op_address[op_ad] = op;
13291       op_riprel[op_ad] = riprel;
13292     }
13293   else
13294     {
13295       /* Mask to get a 32-bit address.  */
13296       op_address[op_ad] = op & 0xffffffff;
13297       op_riprel[op_ad] = riprel & 0xffffffff;
13298     }
13299 }
13300
13301 static void
13302 OP_REG (int code, int sizeflag)
13303 {
13304   const char *s;
13305   int add;
13306   USED_REX (REX_B);
13307   if (rex & REX_B)
13308     add = 8;
13309   else
13310     add = 0;
13311
13312   switch (code)
13313     {
13314     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13315     case sp_reg: case bp_reg: case si_reg: case di_reg:
13316       s = names16[code - ax_reg + add];
13317       break;
13318     case es_reg: case ss_reg: case cs_reg:
13319     case ds_reg: case fs_reg: case gs_reg:
13320       s = names_seg[code - es_reg + add];
13321       break;
13322     case al_reg: case ah_reg: case cl_reg: case ch_reg:
13323     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13324       USED_REX (0);
13325       if (rex)
13326         s = names8rex[code - al_reg + add];
13327       else
13328         s = names8[code - al_reg];
13329       break;
13330     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13331     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13332       if (address_mode == mode_64bit && (sizeflag & DFLAG))
13333         {
13334           s = names64[code - rAX_reg + add];
13335           break;
13336         }
13337       code += eAX_reg - rAX_reg;
13338       /* Fall through.  */
13339     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13340     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13341       USED_REX (REX_W);
13342       if (rex & REX_W)
13343         s = names64[code - eAX_reg + add];
13344       else
13345         {
13346           if (sizeflag & DFLAG)
13347             s = names32[code - eAX_reg + add];
13348           else
13349             s = names16[code - eAX_reg + add];
13350           used_prefixes |= (prefixes & PREFIX_DATA);
13351         }
13352       break;
13353     default:
13354       s = INTERNAL_DISASSEMBLER_ERROR;
13355       break;
13356     }
13357   oappend (s);
13358 }
13359
13360 static void
13361 OP_IMREG (int code, int sizeflag)
13362 {
13363   const char *s;
13364
13365   switch (code)
13366     {
13367     case indir_dx_reg:
13368       if (intel_syntax)
13369         s = "dx";
13370       else
13371         s = "(%dx)";
13372       break;
13373     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13374     case sp_reg: case bp_reg: case si_reg: case di_reg:
13375       s = names16[code - ax_reg];
13376       break;
13377     case es_reg: case ss_reg: case cs_reg:
13378     case ds_reg: case fs_reg: case gs_reg:
13379       s = names_seg[code - es_reg];
13380       break;
13381     case al_reg: case ah_reg: case cl_reg: case ch_reg:
13382     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13383       USED_REX (0);
13384       if (rex)
13385         s = names8rex[code - al_reg];
13386       else
13387         s = names8[code - al_reg];
13388       break;
13389     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13390     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13391       USED_REX (REX_W);
13392       if (rex & REX_W)
13393         s = names64[code - eAX_reg];
13394       else
13395         {
13396           if (sizeflag & DFLAG)
13397             s = names32[code - eAX_reg];
13398           else
13399             s = names16[code - eAX_reg];
13400           used_prefixes |= (prefixes & PREFIX_DATA);
13401         }
13402       break;
13403     case z_mode_ax_reg:
13404       if ((rex & REX_W) || (sizeflag & DFLAG))
13405         s = *names32;
13406       else
13407         s = *names16;
13408       if (!(rex & REX_W))
13409         used_prefixes |= (prefixes & PREFIX_DATA);
13410       break;
13411     default:
13412       s = INTERNAL_DISASSEMBLER_ERROR;
13413       break;
13414     }
13415   oappend (s);
13416 }
13417
13418 static void
13419 OP_I (int bytemode, int sizeflag)
13420 {
13421   bfd_signed_vma op;
13422   bfd_signed_vma mask = -1;
13423
13424   switch (bytemode)
13425     {
13426     case b_mode:
13427       FETCH_DATA (the_info, codep + 1);
13428       op = *codep++;
13429       mask = 0xff;
13430       break;
13431     case q_mode:
13432       if (address_mode == mode_64bit)
13433         {
13434           op = get32s ();
13435           break;
13436         }
13437       /* Fall through.  */
13438     case v_mode:
13439       USED_REX (REX_W);
13440       if (rex & REX_W)
13441         op = get32s ();
13442       else
13443         {
13444           if (sizeflag & DFLAG)
13445             {
13446               op = get32 ();
13447               mask = 0xffffffff;
13448             }
13449           else
13450             {
13451               op = get16 ();
13452               mask = 0xfffff;
13453             }
13454           used_prefixes |= (prefixes & PREFIX_DATA);
13455         }
13456       break;
13457     case w_mode:
13458       mask = 0xfffff;
13459       op = get16 ();
13460       break;
13461     case const_1_mode:
13462       if (intel_syntax)
13463         oappend ("1");
13464       return;
13465     default:
13466       oappend (INTERNAL_DISASSEMBLER_ERROR);
13467       return;
13468     }
13469
13470   op &= mask;
13471   scratchbuf[0] = '$';
13472   print_operand_value (scratchbuf + 1, 1, op);
13473   oappend (scratchbuf + intel_syntax);
13474   scratchbuf[0] = '\0';
13475 }
13476
13477 static void
13478 OP_I64 (int bytemode, int sizeflag)
13479 {
13480   bfd_signed_vma op;
13481   bfd_signed_vma mask = -1;
13482
13483   if (address_mode != mode_64bit)
13484     {
13485       OP_I (bytemode, sizeflag);
13486       return;
13487     }
13488
13489   switch (bytemode)
13490     {
13491     case b_mode:
13492       FETCH_DATA (the_info, codep + 1);
13493       op = *codep++;
13494       mask = 0xff;
13495       break;
13496     case v_mode:
13497       USED_REX (REX_W);
13498       if (rex & REX_W)
13499         op = get64 ();
13500       else
13501         {
13502           if (sizeflag & DFLAG)
13503             {
13504               op = get32 ();
13505               mask = 0xffffffff;
13506             }
13507           else
13508             {
13509               op = get16 ();
13510               mask = 0xfffff;
13511             }
13512           used_prefixes |= (prefixes & PREFIX_DATA);
13513         }
13514       break;
13515     case w_mode:
13516       mask = 0xfffff;
13517       op = get16 ();
13518       break;
13519     default:
13520       oappend (INTERNAL_DISASSEMBLER_ERROR);
13521       return;
13522     }
13523
13524   op &= mask;
13525   scratchbuf[0] = '$';
13526   print_operand_value (scratchbuf + 1, 1, op);
13527   oappend (scratchbuf + intel_syntax);
13528   scratchbuf[0] = '\0';
13529 }
13530
13531 static void
13532 OP_sI (int bytemode, int sizeflag)
13533 {
13534   bfd_signed_vma op;
13535   bfd_signed_vma mask = -1;
13536
13537   switch (bytemode)
13538     {
13539     case b_mode:
13540       FETCH_DATA (the_info, codep + 1);
13541       op = *codep++;
13542       if ((op & 0x80) != 0)
13543         op -= 0x100;
13544       mask = 0xffffffff;
13545       break;
13546     case v_mode:
13547       USED_REX (REX_W);
13548       if (rex & REX_W)
13549         op = get32s ();
13550       else
13551         {
13552           if (sizeflag & DFLAG)
13553             {
13554               op = get32s ();
13555               mask = 0xffffffff;
13556             }
13557           else
13558             {
13559               mask = 0xffffffff;
13560               op = get16 ();
13561               if ((op & 0x8000) != 0)
13562                 op -= 0x10000;
13563             }
13564           used_prefixes |= (prefixes & PREFIX_DATA);
13565         }
13566       break;
13567     case w_mode:
13568       op = get16 ();
13569       mask = 0xffffffff;
13570       if ((op & 0x8000) != 0)
13571         op -= 0x10000;
13572       break;
13573     default:
13574       oappend (INTERNAL_DISASSEMBLER_ERROR);
13575       return;
13576     }
13577
13578   scratchbuf[0] = '$';
13579   print_operand_value (scratchbuf + 1, 1, op);
13580   oappend (scratchbuf + intel_syntax);
13581 }
13582
13583 static void
13584 OP_J (int bytemode, int sizeflag)
13585 {
13586   bfd_vma disp;
13587   bfd_vma mask = -1;
13588   bfd_vma segment = 0;
13589
13590   switch (bytemode)
13591     {
13592     case b_mode:
13593       FETCH_DATA (the_info, codep + 1);
13594       disp = *codep++;
13595       if ((disp & 0x80) != 0)
13596         disp -= 0x100;
13597       break;
13598     case v_mode:
13599       USED_REX (REX_W);
13600       if ((sizeflag & DFLAG) || (rex & REX_W))
13601         disp = get32s ();
13602       else
13603         {
13604           disp = get16 ();
13605           if ((disp & 0x8000) != 0)
13606             disp -= 0x10000;
13607           /* In 16bit mode, address is wrapped around at 64k within
13608              the same segment.  Otherwise, a data16 prefix on a jump
13609              instruction means that the pc is masked to 16 bits after
13610              the displacement is added!  */
13611           mask = 0xffff;
13612           if ((prefixes & PREFIX_DATA) == 0)
13613             segment = ((start_pc + codep - start_codep)
13614                        & ~((bfd_vma) 0xffff));
13615         }
13616       if (!(rex & REX_W))
13617         used_prefixes |= (prefixes & PREFIX_DATA);
13618       break;
13619     default:
13620       oappend (INTERNAL_DISASSEMBLER_ERROR);
13621       return;
13622     }
13623   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
13624   set_op (disp, 0);
13625   print_operand_value (scratchbuf, 1, disp);
13626   oappend (scratchbuf);
13627 }
13628
13629 static void
13630 OP_SEG (int bytemode, int sizeflag)
13631 {
13632   if (bytemode == w_mode)
13633     oappend (names_seg[modrm.reg]);
13634   else
13635     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13636 }
13637
13638 static void
13639 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13640 {
13641   int seg, offset;
13642
13643   if (sizeflag & DFLAG)
13644     {
13645       offset = get32 ();
13646       seg = get16 ();
13647     }
13648   else
13649     {
13650       offset = get16 ();
13651       seg = get16 ();
13652     }
13653   used_prefixes |= (prefixes & PREFIX_DATA);
13654   if (intel_syntax)
13655     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13656   else
13657     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13658   oappend (scratchbuf);
13659 }
13660
13661 static void
13662 OP_OFF (int bytemode, int sizeflag)
13663 {
13664   bfd_vma off;
13665
13666   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13667     intel_operand_size (bytemode, sizeflag);
13668   append_seg ();
13669
13670   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13671     off = get32 ();
13672   else
13673     off = get16 ();
13674
13675   if (intel_syntax)
13676     {
13677       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13678                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13679         {
13680           oappend (names_seg[ds_reg - es_reg]);
13681           oappend (":");
13682         }
13683     }
13684   print_operand_value (scratchbuf, 1, off);
13685   oappend (scratchbuf);
13686 }
13687
13688 static void
13689 OP_OFF64 (int bytemode, int sizeflag)
13690 {
13691   bfd_vma off;
13692
13693   if (address_mode != mode_64bit
13694       || (prefixes & PREFIX_ADDR))
13695     {
13696       OP_OFF (bytemode, sizeflag);
13697       return;
13698     }
13699
13700   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13701     intel_operand_size (bytemode, sizeflag);
13702   append_seg ();
13703
13704   off = get64 ();
13705
13706   if (intel_syntax)
13707     {
13708       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13709                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13710         {
13711           oappend (names_seg[ds_reg - es_reg]);
13712           oappend (":");
13713         }
13714     }
13715   print_operand_value (scratchbuf, 1, off);
13716   oappend (scratchbuf);
13717 }
13718
13719 static void
13720 ptr_reg (int code, int sizeflag)
13721 {
13722   const char *s;
13723
13724   *obufp++ = open_char;
13725   used_prefixes |= (prefixes & PREFIX_ADDR);
13726   if (address_mode == mode_64bit)
13727     {
13728       if (!(sizeflag & AFLAG))
13729         s = names32[code - eAX_reg];
13730       else
13731         s = names64[code - eAX_reg];
13732     }
13733   else if (sizeflag & AFLAG)
13734     s = names32[code - eAX_reg];
13735   else
13736     s = names16[code - eAX_reg];
13737   oappend (s);
13738   *obufp++ = close_char;
13739   *obufp = 0;
13740 }
13741
13742 static void
13743 OP_ESreg (int code, int sizeflag)
13744 {
13745   if (intel_syntax)
13746     {
13747       switch (codep[-1])
13748         {
13749         case 0x6d:      /* insw/insl */
13750           intel_operand_size (z_mode, sizeflag);
13751           break;
13752         case 0xa5:      /* movsw/movsl/movsq */
13753         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13754         case 0xab:      /* stosw/stosl */
13755         case 0xaf:      /* scasw/scasl */
13756           intel_operand_size (v_mode, sizeflag);
13757           break;
13758         default:
13759           intel_operand_size (b_mode, sizeflag);
13760         }
13761     }
13762   oappend ("%es:" + intel_syntax);
13763   ptr_reg (code, sizeflag);
13764 }
13765
13766 static void
13767 OP_DSreg (int code, int sizeflag)
13768 {
13769   if (intel_syntax)
13770     {
13771       switch (codep[-1])
13772         {
13773         case 0x6f:      /* outsw/outsl */
13774           intel_operand_size (z_mode, sizeflag);
13775           break;
13776         case 0xa5:      /* movsw/movsl/movsq */
13777         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13778         case 0xad:      /* lodsw/lodsl/lodsq */
13779           intel_operand_size (v_mode, sizeflag);
13780           break;
13781         default:
13782           intel_operand_size (b_mode, sizeflag);
13783         }
13784     }
13785   if ((prefixes
13786        & (PREFIX_CS
13787           | PREFIX_DS
13788           | PREFIX_SS
13789           | PREFIX_ES
13790           | PREFIX_FS
13791           | PREFIX_GS)) == 0)
13792     prefixes |= PREFIX_DS;
13793   append_seg ();
13794   ptr_reg (code, sizeflag);
13795 }
13796
13797 static void
13798 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13799 {
13800   int add;
13801   if (rex & REX_R)
13802     {
13803       USED_REX (REX_R);
13804       add = 8;
13805     }
13806   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13807     {
13808       all_prefixes[last_lock_prefix] = 0;
13809       used_prefixes |= PREFIX_LOCK;
13810       add = 8;
13811     }
13812   else
13813     add = 0;
13814   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13815   oappend (scratchbuf + intel_syntax);
13816 }
13817
13818 static void
13819 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13820 {
13821   int add;
13822   USED_REX (REX_R);
13823   if (rex & REX_R)
13824     add = 8;
13825   else
13826     add = 0;
13827   if (intel_syntax)
13828     sprintf (scratchbuf, "db%d", modrm.reg + add);
13829   else
13830     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13831   oappend (scratchbuf);
13832 }
13833
13834 static void
13835 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13836 {
13837   sprintf (scratchbuf, "%%tr%d", modrm.reg);
13838   oappend (scratchbuf + intel_syntax);
13839 }
13840
13841 static void
13842 OP_R (int bytemode, int sizeflag)
13843 {
13844   if (modrm.mod == 3)
13845     OP_E (bytemode, sizeflag);
13846   else
13847     BadOp ();
13848 }
13849
13850 static void
13851 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13852 {
13853   int reg = modrm.reg;
13854   const char **names;
13855
13856   used_prefixes |= (prefixes & PREFIX_DATA);
13857   if (prefixes & PREFIX_DATA)
13858     {
13859       names = names_xmm;
13860       USED_REX (REX_R);
13861       if (rex & REX_R)
13862         reg += 8;
13863     }
13864   else
13865     names = names_mm;
13866   oappend (names[reg]);
13867 }
13868
13869 static void
13870 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13871 {
13872   int reg = modrm.reg;
13873   const char **names;
13874
13875   USED_REX (REX_R);
13876   if (rex & REX_R)
13877     reg += 8;
13878   if (need_vex
13879       && bytemode != xmm_mode
13880       && bytemode != scalar_mode)
13881     {
13882       switch (vex.length)
13883         {
13884         case 128:
13885           names = names_xmm;
13886           break;
13887         case 256:
13888           names = names_ymm;
13889           break;
13890         default:
13891           abort ();
13892         }
13893     }
13894   else
13895     names = names_xmm;
13896   oappend (names[reg]);
13897 }
13898
13899 static void
13900 OP_EM (int bytemode, int sizeflag)
13901 {
13902   int reg;
13903   const char **names;
13904
13905   if (modrm.mod != 3)
13906     {
13907       if (intel_syntax
13908           && (bytemode == v_mode || bytemode == v_swap_mode))
13909         {
13910           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13911           used_prefixes |= (prefixes & PREFIX_DATA);
13912         }
13913       OP_E (bytemode, sizeflag);
13914       return;
13915     }
13916
13917   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13918     swap_operand ();
13919
13920   /* Skip mod/rm byte.  */
13921   MODRM_CHECK;
13922   codep++;
13923   used_prefixes |= (prefixes & PREFIX_DATA);
13924   reg = modrm.rm;
13925   if (prefixes & PREFIX_DATA)
13926     {
13927       names = names_xmm;
13928       USED_REX (REX_B);
13929       if (rex & REX_B)
13930         reg += 8;
13931     }
13932   else
13933     names = names_mm;
13934   oappend (names[reg]);
13935 }
13936
13937 /* cvt* are the only instructions in sse2 which have
13938    both SSE and MMX operands and also have 0x66 prefix
13939    in their opcode. 0x66 was originally used to differentiate
13940    between SSE and MMX instruction(operands). So we have to handle the
13941    cvt* separately using OP_EMC and OP_MXC */
13942 static void
13943 OP_EMC (int bytemode, int sizeflag)
13944 {
13945   if (modrm.mod != 3)
13946     {
13947       if (intel_syntax && bytemode == v_mode)
13948         {
13949           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13950           used_prefixes |= (prefixes & PREFIX_DATA);
13951         }
13952       OP_E (bytemode, sizeflag);
13953       return;
13954     }
13955
13956   /* Skip mod/rm byte.  */
13957   MODRM_CHECK;
13958   codep++;
13959   used_prefixes |= (prefixes & PREFIX_DATA);
13960   oappend (names_mm[modrm.rm]);
13961 }
13962
13963 static void
13964 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13965 {
13966   used_prefixes |= (prefixes & PREFIX_DATA);
13967   oappend (names_mm[modrm.reg]);
13968 }
13969
13970 static void
13971 OP_EX (int bytemode, int sizeflag)
13972 {
13973   int reg;
13974   const char **names;
13975
13976   /* Skip mod/rm byte.  */
13977   MODRM_CHECK;
13978   codep++;
13979
13980   if (modrm.mod != 3)
13981     {
13982       OP_E_memory (bytemode, sizeflag);
13983       return;
13984     }
13985
13986   reg = modrm.rm;
13987   USED_REX (REX_B);
13988   if (rex & REX_B)
13989     reg += 8;
13990
13991   if ((sizeflag & SUFFIX_ALWAYS)
13992       && (bytemode == x_swap_mode
13993           || bytemode == d_swap_mode
13994           || bytemode == d_scalar_swap_mode 
13995           || bytemode == q_swap_mode
13996           || bytemode == q_scalar_swap_mode))
13997     swap_operand ();
13998
13999   if (need_vex
14000       && bytemode != xmm_mode
14001       && bytemode != xmmq_mode
14002       && bytemode != d_scalar_mode
14003       && bytemode != d_scalar_swap_mode 
14004       && bytemode != q_scalar_mode
14005       && bytemode != q_scalar_swap_mode
14006       && bytemode != vex_scalar_w_dq_mode)
14007     {
14008       switch (vex.length)
14009         {
14010         case 128:
14011           names = names_xmm;
14012           break;
14013         case 256:
14014           names = names_ymm;
14015           break;
14016         default:
14017           abort ();
14018         }
14019     }
14020   else
14021     names = names_xmm;
14022   oappend (names[reg]);
14023 }
14024
14025 static void
14026 OP_MS (int bytemode, int sizeflag)
14027 {
14028   if (modrm.mod == 3)
14029     OP_EM (bytemode, sizeflag);
14030   else
14031     BadOp ();
14032 }
14033
14034 static void
14035 OP_XS (int bytemode, int sizeflag)
14036 {
14037   if (modrm.mod == 3)
14038     OP_EX (bytemode, sizeflag);
14039   else
14040     BadOp ();
14041 }
14042
14043 static void
14044 OP_M (int bytemode, int sizeflag)
14045 {
14046   if (modrm.mod == 3)
14047     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14048     BadOp ();
14049   else
14050     OP_E (bytemode, sizeflag);
14051 }
14052
14053 static void
14054 OP_0f07 (int bytemode, int sizeflag)
14055 {
14056   if (modrm.mod != 3 || modrm.rm != 0)
14057     BadOp ();
14058   else
14059     OP_E (bytemode, sizeflag);
14060 }
14061
14062 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14063    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
14064
14065 static void
14066 NOP_Fixup1 (int bytemode, int sizeflag)
14067 {
14068   if ((prefixes & PREFIX_DATA) != 0
14069       || (rex != 0
14070           && rex != 0x48
14071           && address_mode == mode_64bit))
14072     OP_REG (bytemode, sizeflag);
14073   else
14074     strcpy (obuf, "nop");
14075 }
14076
14077 static void
14078 NOP_Fixup2 (int bytemode, int sizeflag)
14079 {
14080   if ((prefixes & PREFIX_DATA) != 0
14081       || (rex != 0
14082           && rex != 0x48
14083           && address_mode == mode_64bit))
14084     OP_IMREG (bytemode, sizeflag);
14085 }
14086
14087 static const char *const Suffix3DNow[] = {
14088 /* 00 */        NULL,           NULL,           NULL,           NULL,
14089 /* 04 */        NULL,           NULL,           NULL,           NULL,
14090 /* 08 */        NULL,           NULL,           NULL,           NULL,
14091 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
14092 /* 10 */        NULL,           NULL,           NULL,           NULL,
14093 /* 14 */        NULL,           NULL,           NULL,           NULL,
14094 /* 18 */        NULL,           NULL,           NULL,           NULL,
14095 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
14096 /* 20 */        NULL,           NULL,           NULL,           NULL,
14097 /* 24 */        NULL,           NULL,           NULL,           NULL,
14098 /* 28 */        NULL,           NULL,           NULL,           NULL,
14099 /* 2C */        NULL,           NULL,           NULL,           NULL,
14100 /* 30 */        NULL,           NULL,           NULL,           NULL,
14101 /* 34 */        NULL,           NULL,           NULL,           NULL,
14102 /* 38 */        NULL,           NULL,           NULL,           NULL,
14103 /* 3C */        NULL,           NULL,           NULL,           NULL,
14104 /* 40 */        NULL,           NULL,           NULL,           NULL,
14105 /* 44 */        NULL,           NULL,           NULL,           NULL,
14106 /* 48 */        NULL,           NULL,           NULL,           NULL,
14107 /* 4C */        NULL,           NULL,           NULL,           NULL,
14108 /* 50 */        NULL,           NULL,           NULL,           NULL,
14109 /* 54 */        NULL,           NULL,           NULL,           NULL,
14110 /* 58 */        NULL,           NULL,           NULL,           NULL,
14111 /* 5C */        NULL,           NULL,           NULL,           NULL,
14112 /* 60 */        NULL,           NULL,           NULL,           NULL,
14113 /* 64 */        NULL,           NULL,           NULL,           NULL,
14114 /* 68 */        NULL,           NULL,           NULL,           NULL,
14115 /* 6C */        NULL,           NULL,           NULL,           NULL,
14116 /* 70 */        NULL,           NULL,           NULL,           NULL,
14117 /* 74 */        NULL,           NULL,           NULL,           NULL,
14118 /* 78 */        NULL,           NULL,           NULL,           NULL,
14119 /* 7C */        NULL,           NULL,           NULL,           NULL,
14120 /* 80 */        NULL,           NULL,           NULL,           NULL,
14121 /* 84 */        NULL,           NULL,           NULL,           NULL,
14122 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
14123 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
14124 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
14125 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
14126 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
14127 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
14128 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
14129 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
14130 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
14131 /* AC */        NULL,           NULL,           "pfacc",        NULL,
14132 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
14133 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
14134 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
14135 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
14136 /* C0 */        NULL,           NULL,           NULL,           NULL,
14137 /* C4 */        NULL,           NULL,           NULL,           NULL,
14138 /* C8 */        NULL,           NULL,           NULL,           NULL,
14139 /* CC */        NULL,           NULL,           NULL,           NULL,
14140 /* D0 */        NULL,           NULL,           NULL,           NULL,
14141 /* D4 */        NULL,           NULL,           NULL,           NULL,
14142 /* D8 */        NULL,           NULL,           NULL,           NULL,
14143 /* DC */        NULL,           NULL,           NULL,           NULL,
14144 /* E0 */        NULL,           NULL,           NULL,           NULL,
14145 /* E4 */        NULL,           NULL,           NULL,           NULL,
14146 /* E8 */        NULL,           NULL,           NULL,           NULL,
14147 /* EC */        NULL,           NULL,           NULL,           NULL,
14148 /* F0 */        NULL,           NULL,           NULL,           NULL,
14149 /* F4 */        NULL,           NULL,           NULL,           NULL,
14150 /* F8 */        NULL,           NULL,           NULL,           NULL,
14151 /* FC */        NULL,           NULL,           NULL,           NULL,
14152 };
14153
14154 static void
14155 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14156 {
14157   const char *mnemonic;
14158
14159   FETCH_DATA (the_info, codep + 1);
14160   /* AMD 3DNow! instructions are specified by an opcode suffix in the
14161      place where an 8-bit immediate would normally go.  ie. the last
14162      byte of the instruction.  */
14163   obufp = mnemonicendp;
14164   mnemonic = Suffix3DNow[*codep++ & 0xff];
14165   if (mnemonic)
14166     oappend (mnemonic);
14167   else
14168     {
14169       /* Since a variable sized modrm/sib chunk is between the start
14170          of the opcode (0x0f0f) and the opcode suffix, we need to do
14171          all the modrm processing first, and don't know until now that
14172          we have a bad opcode.  This necessitates some cleaning up.  */
14173       op_out[0][0] = '\0';
14174       op_out[1][0] = '\0';
14175       BadOp ();
14176     }
14177   mnemonicendp = obufp;
14178 }
14179
14180 static struct op simd_cmp_op[] =
14181 {
14182   { STRING_COMMA_LEN ("eq") },
14183   { STRING_COMMA_LEN ("lt") },
14184   { STRING_COMMA_LEN ("le") },
14185   { STRING_COMMA_LEN ("unord") },
14186   { STRING_COMMA_LEN ("neq") },
14187   { STRING_COMMA_LEN ("nlt") },
14188   { STRING_COMMA_LEN ("nle") },
14189   { STRING_COMMA_LEN ("ord") }
14190 };
14191
14192 static void
14193 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14194 {
14195   unsigned int cmp_type;
14196
14197   FETCH_DATA (the_info, codep + 1);
14198   cmp_type = *codep++ & 0xff;
14199   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14200     {
14201       char suffix [3];
14202       char *p = mnemonicendp - 2;
14203       suffix[0] = p[0];
14204       suffix[1] = p[1];
14205       suffix[2] = '\0';
14206       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14207       mnemonicendp += simd_cmp_op[cmp_type].len;
14208     }
14209   else
14210     {
14211       /* We have a reserved extension byte.  Output it directly.  */
14212       scratchbuf[0] = '$';
14213       print_operand_value (scratchbuf + 1, 1, cmp_type);
14214       oappend (scratchbuf + intel_syntax);
14215       scratchbuf[0] = '\0';
14216     }
14217 }
14218
14219 static void
14220 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14221           int sizeflag ATTRIBUTE_UNUSED)
14222 {
14223   /* mwait %eax,%ecx  */
14224   if (!intel_syntax)
14225     {
14226       const char **names = (address_mode == mode_64bit
14227                             ? names64 : names32);
14228       strcpy (op_out[0], names[0]);
14229       strcpy (op_out[1], names[1]);
14230       two_source_ops = 1;
14231     }
14232   /* Skip mod/rm byte.  */
14233   MODRM_CHECK;
14234   codep++;
14235 }
14236
14237 static void
14238 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14239             int sizeflag ATTRIBUTE_UNUSED)
14240 {
14241   /* monitor %eax,%ecx,%edx"  */
14242   if (!intel_syntax)
14243     {
14244       const char **op1_names;
14245       const char **names = (address_mode == mode_64bit
14246                             ? names64 : names32);
14247
14248       if (!(prefixes & PREFIX_ADDR))
14249         op1_names = (address_mode == mode_16bit
14250                      ? names16 : names);
14251       else
14252         {
14253           /* Remove "addr16/addr32".  */
14254           all_prefixes[last_addr_prefix] = 0;
14255           op1_names = (address_mode != mode_32bit
14256                        ? names32 : names16);
14257           used_prefixes |= PREFIX_ADDR;
14258         }
14259       strcpy (op_out[0], op1_names[0]);
14260       strcpy (op_out[1], names[1]);
14261       strcpy (op_out[2], names[2]);
14262       two_source_ops = 1;
14263     }
14264   /* Skip mod/rm byte.  */
14265   MODRM_CHECK;
14266   codep++;
14267 }
14268
14269 static void
14270 BadOp (void)
14271 {
14272   /* Throw away prefixes and 1st. opcode byte.  */
14273   codep = insn_codep + 1;
14274   oappend ("(bad)");
14275 }
14276
14277 static void
14278 REP_Fixup (int bytemode, int sizeflag)
14279 {
14280   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14281      lods and stos.  */
14282   if (prefixes & PREFIX_REPZ)
14283     all_prefixes[last_repz_prefix] = REP_PREFIX;
14284
14285   switch (bytemode)
14286     {
14287     case al_reg:
14288     case eAX_reg:
14289     case indir_dx_reg:
14290       OP_IMREG (bytemode, sizeflag);
14291       break;
14292     case eDI_reg:
14293       OP_ESreg (bytemode, sizeflag);
14294       break;
14295     case eSI_reg:
14296       OP_DSreg (bytemode, sizeflag);
14297       break;
14298     default:
14299       abort ();
14300       break;
14301     }
14302 }
14303
14304 static void
14305 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14306 {
14307   USED_REX (REX_W);
14308   if (rex & REX_W)
14309     {
14310       /* Change cmpxchg8b to cmpxchg16b.  */
14311       char *p = mnemonicendp - 2;
14312       mnemonicendp = stpcpy (p, "16b");
14313       bytemode = o_mode;
14314     }
14315   OP_M (bytemode, sizeflag);
14316 }
14317
14318 static void
14319 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14320 {
14321   const char **names;
14322
14323   if (need_vex)
14324     {
14325       switch (vex.length)
14326         {
14327         case 128:
14328           names = names_xmm;
14329           break;
14330         case 256:
14331           names = names_ymm;
14332           break;
14333         default:
14334           abort ();
14335         }
14336     }
14337   else
14338     names = names_xmm;
14339   oappend (names[reg]);
14340 }
14341
14342 static void
14343 CRC32_Fixup (int bytemode, int sizeflag)
14344 {
14345   /* Add proper suffix to "crc32".  */
14346   char *p = mnemonicendp;
14347
14348   switch (bytemode)
14349     {
14350     case b_mode:
14351       if (intel_syntax)
14352         goto skip;
14353
14354       *p++ = 'b';
14355       break;
14356     case v_mode:
14357       if (intel_syntax)
14358         goto skip;
14359
14360       USED_REX (REX_W);
14361       if (rex & REX_W)
14362         *p++ = 'q';
14363       else 
14364         {
14365           if (sizeflag & DFLAG)
14366             *p++ = 'l';
14367           else
14368             *p++ = 'w';
14369           used_prefixes |= (prefixes & PREFIX_DATA);
14370         }
14371       break;
14372     default:
14373       oappend (INTERNAL_DISASSEMBLER_ERROR);
14374       break;
14375     }
14376   mnemonicendp = p;
14377   *p = '\0';
14378
14379 skip:
14380   if (modrm.mod == 3)
14381     {
14382       int add;
14383
14384       /* Skip mod/rm byte.  */
14385       MODRM_CHECK;
14386       codep++;
14387
14388       USED_REX (REX_B);
14389       add = (rex & REX_B) ? 8 : 0;
14390       if (bytemode == b_mode)
14391         {
14392           USED_REX (0);
14393           if (rex)
14394             oappend (names8rex[modrm.rm + add]);
14395           else
14396             oappend (names8[modrm.rm + add]);
14397         }
14398       else
14399         {
14400           USED_REX (REX_W);
14401           if (rex & REX_W)
14402             oappend (names64[modrm.rm + add]);
14403           else if ((prefixes & PREFIX_DATA))
14404             oappend (names16[modrm.rm + add]);
14405           else
14406             oappend (names32[modrm.rm + add]);
14407         }
14408     }
14409   else
14410     OP_E (bytemode, sizeflag);
14411 }
14412
14413 static void
14414 FXSAVE_Fixup (int bytemode, int sizeflag)
14415 {
14416   /* Add proper suffix to "fxsave" and "fxrstor".  */
14417   USED_REX (REX_W);
14418   if (rex & REX_W)
14419     {
14420       char *p = mnemonicendp;
14421       *p++ = '6';
14422       *p++ = '4';
14423       *p = '\0';
14424       mnemonicendp = p;
14425     }
14426   OP_M (bytemode, sizeflag);
14427 }
14428
14429 /* Display the destination register operand for instructions with
14430    VEX. */
14431
14432 static void
14433 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14434 {
14435   int reg;
14436   const char **names;
14437
14438   if (!need_vex)
14439     abort ();
14440
14441   if (!need_vex_reg)
14442     return;
14443
14444   reg = vex.register_specifier;
14445   if (bytemode == vex_scalar_mode)
14446     {
14447       oappend (names_xmm[reg]);
14448       return;
14449     }
14450
14451   switch (vex.length)
14452     {
14453     case 128:
14454       switch (bytemode)
14455         {
14456         case vex_mode:
14457         case vex128_mode:
14458           break;
14459         default:
14460           abort ();
14461           return;
14462         }
14463
14464       names = names_xmm;
14465       break;
14466     case 256:
14467       switch (bytemode)
14468         {
14469         case vex_mode:
14470         case vex256_mode:
14471           break;
14472         default:
14473           abort ();
14474           return;
14475         }
14476
14477       names = names_ymm;
14478       break;
14479     default:
14480       abort ();
14481       break;
14482     }
14483   oappend (names[reg]);
14484 }
14485
14486 /* Get the VEX immediate byte without moving codep.  */
14487
14488 static unsigned char
14489 get_vex_imm8 (int sizeflag, int opnum)
14490 {
14491   int bytes_before_imm = 0;
14492
14493   if (modrm.mod != 3)
14494     {
14495       /* There are SIB/displacement bytes.  */
14496       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14497         {
14498           /* 32/64 bit address mode */
14499           int base = modrm.rm;
14500
14501           /* Check SIB byte.  */
14502           if (base == 4)
14503             {
14504               FETCH_DATA (the_info, codep + 1);
14505               base = *codep & 7;
14506               /* When decoding the third source, don't increase
14507                  bytes_before_imm as this has already been incremented
14508                  by one in OP_E_memory while decoding the second
14509                  source operand.  */
14510               if (opnum == 0)
14511                 bytes_before_imm++;
14512             }
14513
14514           /* Don't increase bytes_before_imm when decoding the third source,
14515              it has already been incremented by OP_E_memory while decoding
14516              the second source operand.  */
14517           if (opnum == 0)
14518             {
14519               switch (modrm.mod)
14520                 {
14521                   case 0:
14522                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
14523                        SIB == 5, there is a 4 byte displacement.  */
14524                     if (base != 5)
14525                       /* No displacement. */
14526                       break;
14527                   case 2:
14528                     /* 4 byte displacement.  */
14529                     bytes_before_imm += 4;
14530                     break;
14531                   case 1:
14532                     /* 1 byte displacement.  */
14533                     bytes_before_imm++;
14534                     break;
14535                 }
14536             }
14537         }
14538       else
14539         {
14540           /* 16 bit address mode */
14541           /* Don't increase bytes_before_imm when decoding the third source,
14542              it has already been incremented by OP_E_memory while decoding
14543              the second source operand.  */
14544           if (opnum == 0)
14545             {
14546               switch (modrm.mod)
14547                 {
14548                 case 0:
14549                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
14550                   if (modrm.rm != 6)
14551                     /* No displacement. */
14552                     break;
14553                 case 2:
14554                   /* 2 byte displacement.  */
14555                   bytes_before_imm += 2;
14556                   break;
14557                 case 1:
14558                   /* 1 byte displacement: when decoding the third source,
14559                      don't increase bytes_before_imm as this has already
14560                      been incremented by one in OP_E_memory while decoding
14561                      the second source operand.  */
14562                   if (opnum == 0)
14563                     bytes_before_imm++;
14564
14565                   break;
14566                 }
14567             }
14568         }
14569     }
14570
14571   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14572   return codep [bytes_before_imm];
14573 }
14574
14575 static void
14576 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14577 {
14578   const char **names;
14579
14580   if (reg == -1 && modrm.mod != 3)
14581     {
14582       OP_E_memory (bytemode, sizeflag);
14583       return;
14584     }
14585   else
14586     {
14587       if (reg == -1)
14588         {
14589           reg = modrm.rm;
14590           USED_REX (REX_B);
14591           if (rex & REX_B)
14592             reg += 8;
14593         }
14594       else if (reg > 7 && address_mode != mode_64bit)
14595         BadOp ();
14596     }
14597
14598   switch (vex.length)
14599     {
14600     case 128:
14601       names = names_xmm;
14602       break;
14603     case 256:
14604       names = names_ymm;
14605       break;
14606     default:
14607       abort ();
14608     }
14609   oappend (names[reg]);
14610 }
14611
14612 static void
14613 OP_EX_VexImmW (int bytemode, int sizeflag)
14614 {
14615   int reg = -1;
14616   static unsigned char vex_imm8;
14617
14618   if (vex_w_done == 0)
14619     {
14620       vex_w_done = 1;
14621
14622       /* Skip mod/rm byte.  */
14623       MODRM_CHECK;
14624       codep++;
14625
14626       vex_imm8 = get_vex_imm8 (sizeflag, 0);
14627
14628       if (vex.w)
14629           reg = vex_imm8 >> 4;
14630
14631       OP_EX_VexReg (bytemode, sizeflag, reg);
14632     }
14633   else if (vex_w_done == 1)
14634     {
14635       vex_w_done = 2;
14636
14637       if (!vex.w)
14638           reg = vex_imm8 >> 4;
14639
14640       OP_EX_VexReg (bytemode, sizeflag, reg);
14641     }
14642   else
14643     {
14644       /* Output the imm8 directly.  */
14645       scratchbuf[0] = '$';
14646       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
14647       oappend (scratchbuf + intel_syntax);
14648       scratchbuf[0] = '\0';
14649       codep++;
14650     }
14651 }
14652
14653 static void
14654 OP_Vex_2src (int bytemode, int sizeflag)
14655 {
14656   if (modrm.mod == 3)
14657     {
14658       int reg = modrm.rm;
14659       USED_REX (REX_B);
14660       if (rex & REX_B)
14661         reg += 8;
14662       oappend (names_xmm[reg]);
14663     }
14664   else
14665     {
14666       if (intel_syntax
14667           && (bytemode == v_mode || bytemode == v_swap_mode))
14668         {
14669           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14670           used_prefixes |= (prefixes & PREFIX_DATA);
14671         }
14672       OP_E (bytemode, sizeflag);
14673     }
14674 }
14675
14676 static void
14677 OP_Vex_2src_1 (int bytemode, int sizeflag)
14678 {
14679   if (modrm.mod == 3)
14680     {
14681       /* Skip mod/rm byte.   */
14682       MODRM_CHECK;
14683       codep++;
14684     }
14685
14686   if (vex.w)
14687     oappend (names_xmm[vex.register_specifier]);
14688   else
14689     OP_Vex_2src (bytemode, sizeflag);
14690 }
14691
14692 static void
14693 OP_Vex_2src_2 (int bytemode, int sizeflag)
14694 {
14695   if (vex.w)
14696     OP_Vex_2src (bytemode, sizeflag);
14697   else
14698     oappend (names_xmm[vex.register_specifier]);
14699 }
14700
14701 static void
14702 OP_EX_VexW (int bytemode, int sizeflag)
14703 {
14704   int reg = -1;
14705
14706   if (!vex_w_done)
14707     {
14708       vex_w_done = 1;
14709
14710       /* Skip mod/rm byte.  */
14711       MODRM_CHECK;
14712       codep++;
14713
14714       if (vex.w)
14715         reg = get_vex_imm8 (sizeflag, 0) >> 4;
14716     }
14717   else
14718     {
14719       if (!vex.w)
14720         reg = get_vex_imm8 (sizeflag, 1) >> 4;
14721     }
14722
14723   OP_EX_VexReg (bytemode, sizeflag, reg);
14724 }
14725
14726 static void
14727 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
14728              int sizeflag ATTRIBUTE_UNUSED)
14729 {
14730   /* Skip the immediate byte and check for invalid bits.  */
14731   FETCH_DATA (the_info, codep + 1);
14732   if (*codep++ & 0xf)
14733     BadOp ();
14734 }
14735
14736 static void
14737 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14738 {
14739   int reg;
14740   const char **names;
14741
14742   FETCH_DATA (the_info, codep + 1);
14743   reg = *codep++;
14744
14745   if (bytemode != x_mode)
14746     abort ();
14747
14748   if (reg & 0xf)
14749       BadOp ();
14750
14751   reg >>= 4;
14752   if (reg > 7 && address_mode != mode_64bit)
14753     BadOp ();
14754
14755   switch (vex.length)
14756     {
14757     case 128:
14758       names = names_xmm;
14759       break;
14760     case 256:
14761       names = names_ymm;
14762       break;
14763     default:
14764       abort ();
14765     }
14766   oappend (names[reg]);
14767 }
14768
14769 static void
14770 OP_XMM_VexW (int bytemode, int sizeflag)
14771 {
14772   /* Turn off the REX.W bit since it is used for swapping operands
14773      now.  */
14774   rex &= ~REX_W;
14775   OP_XMM (bytemode, sizeflag);
14776 }
14777
14778 static void
14779 OP_EX_Vex (int bytemode, int sizeflag)
14780 {
14781   if (modrm.mod != 3)
14782     {
14783       if (vex.register_specifier != 0)
14784         BadOp ();
14785       need_vex_reg = 0;
14786     }
14787   OP_EX (bytemode, sizeflag);
14788 }
14789
14790 static void
14791 OP_XMM_Vex (int bytemode, int sizeflag)
14792 {
14793   if (modrm.mod != 3)
14794     {
14795       if (vex.register_specifier != 0)
14796         BadOp ();
14797       need_vex_reg = 0;
14798     }
14799   OP_XMM (bytemode, sizeflag);
14800 }
14801
14802 static void
14803 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14804 {
14805   switch (vex.length)
14806     {
14807     case 128:
14808       mnemonicendp = stpcpy (obuf, "vzeroupper");
14809       break;
14810     case 256:
14811       mnemonicendp = stpcpy (obuf, "vzeroall");
14812       break;
14813     default:
14814       abort ();
14815     }
14816 }
14817
14818 static struct op vex_cmp_op[] =
14819 {
14820   { STRING_COMMA_LEN ("eq") },
14821   { STRING_COMMA_LEN ("lt") },
14822   { STRING_COMMA_LEN ("le") },
14823   { STRING_COMMA_LEN ("unord") },
14824   { STRING_COMMA_LEN ("neq") },
14825   { STRING_COMMA_LEN ("nlt") },
14826   { STRING_COMMA_LEN ("nle") },
14827   { STRING_COMMA_LEN ("ord") },
14828   { STRING_COMMA_LEN ("eq_uq") },
14829   { STRING_COMMA_LEN ("nge") },
14830   { STRING_COMMA_LEN ("ngt") },
14831   { STRING_COMMA_LEN ("false") },
14832   { STRING_COMMA_LEN ("neq_oq") },
14833   { STRING_COMMA_LEN ("ge") },
14834   { STRING_COMMA_LEN ("gt") },
14835   { STRING_COMMA_LEN ("true") },
14836   { STRING_COMMA_LEN ("eq_os") },
14837   { STRING_COMMA_LEN ("lt_oq") },
14838   { STRING_COMMA_LEN ("le_oq") },
14839   { STRING_COMMA_LEN ("unord_s") },
14840   { STRING_COMMA_LEN ("neq_us") },
14841   { STRING_COMMA_LEN ("nlt_uq") },
14842   { STRING_COMMA_LEN ("nle_uq") },
14843   { STRING_COMMA_LEN ("ord_s") },
14844   { STRING_COMMA_LEN ("eq_us") },
14845   { STRING_COMMA_LEN ("nge_uq") },
14846   { STRING_COMMA_LEN ("ngt_uq") },
14847   { STRING_COMMA_LEN ("false_os") },
14848   { STRING_COMMA_LEN ("neq_os") },
14849   { STRING_COMMA_LEN ("ge_oq") },
14850   { STRING_COMMA_LEN ("gt_oq") },
14851   { STRING_COMMA_LEN ("true_us") },
14852 };
14853
14854 static void
14855 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14856 {
14857   unsigned int cmp_type;
14858
14859   FETCH_DATA (the_info, codep + 1);
14860   cmp_type = *codep++ & 0xff;
14861   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
14862     {
14863       char suffix [3];
14864       char *p = mnemonicendp - 2;
14865       suffix[0] = p[0];
14866       suffix[1] = p[1];
14867       suffix[2] = '\0';
14868       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
14869       mnemonicendp += vex_cmp_op[cmp_type].len;
14870     }
14871   else
14872     {
14873       /* We have a reserved extension byte.  Output it directly.  */
14874       scratchbuf[0] = '$';
14875       print_operand_value (scratchbuf + 1, 1, cmp_type);
14876       oappend (scratchbuf + intel_syntax);
14877       scratchbuf[0] = '\0';
14878     }
14879 }
14880
14881 static const struct op pclmul_op[] =
14882 {
14883   { STRING_COMMA_LEN ("lql") },
14884   { STRING_COMMA_LEN ("hql") },
14885   { STRING_COMMA_LEN ("lqh") },
14886   { STRING_COMMA_LEN ("hqh") }
14887 };
14888
14889 static void
14890 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14891               int sizeflag ATTRIBUTE_UNUSED)
14892 {
14893   unsigned int pclmul_type;
14894
14895   FETCH_DATA (the_info, codep + 1);
14896   pclmul_type = *codep++ & 0xff;
14897   switch (pclmul_type)
14898     {
14899     case 0x10:
14900       pclmul_type = 2;
14901       break;
14902     case 0x11:
14903       pclmul_type = 3;
14904       break;
14905     default:
14906       break;
14907     } 
14908   if (pclmul_type < ARRAY_SIZE (pclmul_op))
14909     {
14910       char suffix [4];
14911       char *p = mnemonicendp - 3;
14912       suffix[0] = p[0];
14913       suffix[1] = p[1];
14914       suffix[2] = p[2];
14915       suffix[3] = '\0';
14916       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14917       mnemonicendp += pclmul_op[pclmul_type].len;
14918     }
14919   else
14920     {
14921       /* We have a reserved extension byte.  Output it directly.  */
14922       scratchbuf[0] = '$';
14923       print_operand_value (scratchbuf + 1, 1, pclmul_type);
14924       oappend (scratchbuf + intel_syntax);
14925       scratchbuf[0] = '\0';
14926     }
14927 }
14928
14929 static void
14930 MOVBE_Fixup (int bytemode, int sizeflag)
14931 {
14932   /* Add proper suffix to "movbe".  */
14933   char *p = mnemonicendp;
14934
14935   switch (bytemode)
14936     {
14937     case v_mode:
14938       if (intel_syntax)
14939         goto skip;
14940
14941       USED_REX (REX_W);
14942       if (sizeflag & SUFFIX_ALWAYS)
14943         {
14944           if (rex & REX_W)
14945             *p++ = 'q';
14946           else
14947             {
14948               if (sizeflag & DFLAG)
14949                 *p++ = 'l';
14950               else
14951                 *p++ = 'w';
14952               used_prefixes |= (prefixes & PREFIX_DATA);
14953             }
14954         }
14955       break;
14956     default:
14957       oappend (INTERNAL_DISASSEMBLER_ERROR);
14958       break;
14959     }
14960   mnemonicendp = p;
14961   *p = '\0';
14962
14963 skip:
14964   OP_M (bytemode, sizeflag);
14965 }
14966
14967 static void
14968 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14969 {
14970   int reg;
14971   const char **names;
14972
14973   /* Skip mod/rm byte.  */
14974   MODRM_CHECK;
14975   codep++;
14976
14977   if (vex.w)
14978     names = names64;
14979   else
14980     names = names32;
14981
14982   reg = modrm.rm;
14983   USED_REX (REX_B);
14984   if (rex & REX_B)
14985     reg += 8;
14986
14987   oappend (names[reg]);
14988 }
14989
14990 static void
14991 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14992 {
14993   const char **names;
14994
14995   if (vex.w)
14996     names = names64;
14997   else
14998     names = names32;
14999
15000   oappend (names[vex.register_specifier]);
15001 }
15002