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