opcodes/
[external/binutils.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 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   },
10604   {
10605     /* RM_0F01_REG_2 */
10606     { "xgetbv",         { Skip_MODRM } },
10607     { "xsetbv",         { Skip_MODRM } },
10608     { Bad_Opcode },
10609     { Bad_Opcode },
10610     { "vmfunc",         { Skip_MODRM } },
10611     { "xend",           { Skip_MODRM } },
10612     { "xtest",          { Skip_MODRM } },
10613     { Bad_Opcode },
10614   },
10615   {
10616     /* RM_0F01_REG_3 */
10617     { "vmrun",          { Skip_MODRM } },
10618     { "vmmcall",        { Skip_MODRM } },
10619     { "vmload",         { Skip_MODRM } },
10620     { "vmsave",         { Skip_MODRM } },
10621     { "stgi",           { Skip_MODRM } },
10622     { "clgi",           { Skip_MODRM } },
10623     { "skinit",         { Skip_MODRM } },
10624     { "invlpga",        { Skip_MODRM } },
10625   },
10626   {
10627     /* RM_0F01_REG_7 */
10628     { "swapgs",         { Skip_MODRM } },
10629     { "rdtscp",         { Skip_MODRM } },
10630   },
10631   {
10632     /* RM_0FAE_REG_5 */
10633     { "lfence",         { Skip_MODRM } },
10634   },
10635   {
10636     /* RM_0FAE_REG_6 */
10637     { "mfence",         { Skip_MODRM } },
10638   },
10639   {
10640     /* RM_0FAE_REG_7 */
10641     { "sfence",         { Skip_MODRM } },
10642   },
10643 };
10644
10645 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10646
10647 /* We use the high bit to indicate different name for the same
10648    prefix.  */
10649 #define ADDR16_PREFIX   (0x67 | 0x100)
10650 #define ADDR32_PREFIX   (0x67 | 0x200)
10651 #define DATA16_PREFIX   (0x66 | 0x100)
10652 #define DATA32_PREFIX   (0x66 | 0x200)
10653 #define REP_PREFIX      (0xf3 | 0x100)
10654 #define XACQUIRE_PREFIX (0xf2 | 0x200)
10655 #define XRELEASE_PREFIX (0xf3 | 0x400)
10656
10657 static int
10658 ckprefix (void)
10659 {
10660   int newrex, i, length;
10661   rex = 0;
10662   rex_ignored = 0;
10663   prefixes = 0;
10664   used_prefixes = 0;
10665   rex_used = 0;
10666   last_lock_prefix = -1;
10667   last_repz_prefix = -1;
10668   last_repnz_prefix = -1;
10669   last_data_prefix = -1;
10670   last_addr_prefix = -1;
10671   last_rex_prefix = -1;
10672   last_seg_prefix = -1;
10673   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10674     all_prefixes[i] = 0;
10675   i = 0;
10676   length = 0;
10677   /* The maximum instruction length is 15bytes.  */
10678   while (length < MAX_CODE_LENGTH - 1)
10679     {
10680       FETCH_DATA (the_info, codep + 1);
10681       newrex = 0;
10682       switch (*codep)
10683         {
10684         /* REX prefixes family.  */
10685         case 0x40:
10686         case 0x41:
10687         case 0x42:
10688         case 0x43:
10689         case 0x44:
10690         case 0x45:
10691         case 0x46:
10692         case 0x47:
10693         case 0x48:
10694         case 0x49:
10695         case 0x4a:
10696         case 0x4b:
10697         case 0x4c:
10698         case 0x4d:
10699         case 0x4e:
10700         case 0x4f:
10701           if (address_mode == mode_64bit)
10702             newrex = *codep;
10703           else
10704             return 1;
10705           last_rex_prefix = i;
10706           break;
10707         case 0xf3:
10708           prefixes |= PREFIX_REPZ;
10709           last_repz_prefix = i;
10710           break;
10711         case 0xf2:
10712           prefixes |= PREFIX_REPNZ;
10713           last_repnz_prefix = i;
10714           break;
10715         case 0xf0:
10716           prefixes |= PREFIX_LOCK;
10717           last_lock_prefix = i;
10718           break;
10719         case 0x2e:
10720           prefixes |= PREFIX_CS;
10721           last_seg_prefix = i;
10722           break;
10723         case 0x36:
10724           prefixes |= PREFIX_SS;
10725           last_seg_prefix = i;
10726           break;
10727         case 0x3e:
10728           prefixes |= PREFIX_DS;
10729           last_seg_prefix = i;
10730           break;
10731         case 0x26:
10732           prefixes |= PREFIX_ES;
10733           last_seg_prefix = i;
10734           break;
10735         case 0x64:
10736           prefixes |= PREFIX_FS;
10737           last_seg_prefix = i;
10738           break;
10739         case 0x65:
10740           prefixes |= PREFIX_GS;
10741           last_seg_prefix = i;
10742           break;
10743         case 0x66:
10744           prefixes |= PREFIX_DATA;
10745           last_data_prefix = i;
10746           break;
10747         case 0x67:
10748           prefixes |= PREFIX_ADDR;
10749           last_addr_prefix = i;
10750           break;
10751         case FWAIT_OPCODE:
10752           /* fwait is really an instruction.  If there are prefixes
10753              before the fwait, they belong to the fwait, *not* to the
10754              following instruction.  */
10755           if (prefixes || rex)
10756             {
10757               prefixes |= PREFIX_FWAIT;
10758               codep++;
10759               /* This ensures that the previous REX prefixes are noticed
10760                  as unused prefixes, as in the return case below.  */
10761               rex_used = rex;
10762               return 1;
10763             }
10764           prefixes = PREFIX_FWAIT;
10765           break;
10766         default:
10767           return 1;
10768         }
10769       /* Rex is ignored when followed by another prefix.  */
10770       if (rex)
10771         {
10772           rex_used = rex;
10773           return 1;
10774         }
10775       if (*codep != FWAIT_OPCODE)
10776         all_prefixes[i++] = *codep;
10777       rex = newrex;
10778       codep++;
10779       length++;
10780     }
10781   return 0;
10782 }
10783
10784 static int
10785 seg_prefix (int pref)
10786 {
10787   switch (pref)
10788     {
10789     case 0x2e:
10790       return PREFIX_CS;
10791     case 0x36:
10792       return PREFIX_SS;
10793     case 0x3e:
10794       return PREFIX_DS;
10795     case 0x26:
10796       return PREFIX_ES;
10797     case 0x64:
10798       return PREFIX_FS;
10799     case 0x65:
10800       return PREFIX_GS;
10801     default:
10802       return 0;
10803     }
10804 }
10805
10806 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10807    prefix byte.  */
10808
10809 static const char *
10810 prefix_name (int pref, int sizeflag)
10811 {
10812   static const char *rexes [16] =
10813     {
10814       "rex",            /* 0x40 */
10815       "rex.B",          /* 0x41 */
10816       "rex.X",          /* 0x42 */
10817       "rex.XB",         /* 0x43 */
10818       "rex.R",          /* 0x44 */
10819       "rex.RB",         /* 0x45 */
10820       "rex.RX",         /* 0x46 */
10821       "rex.RXB",        /* 0x47 */
10822       "rex.W",          /* 0x48 */
10823       "rex.WB",         /* 0x49 */
10824       "rex.WX",         /* 0x4a */
10825       "rex.WXB",        /* 0x4b */
10826       "rex.WR",         /* 0x4c */
10827       "rex.WRB",        /* 0x4d */
10828       "rex.WRX",        /* 0x4e */
10829       "rex.WRXB",       /* 0x4f */
10830     };
10831
10832   switch (pref)
10833     {
10834     /* REX prefixes family.  */
10835     case 0x40:
10836     case 0x41:
10837     case 0x42:
10838     case 0x43:
10839     case 0x44:
10840     case 0x45:
10841     case 0x46:
10842     case 0x47:
10843     case 0x48:
10844     case 0x49:
10845     case 0x4a:
10846     case 0x4b:
10847     case 0x4c:
10848     case 0x4d:
10849     case 0x4e:
10850     case 0x4f:
10851       return rexes [pref - 0x40];
10852     case 0xf3:
10853       return "repz";
10854     case 0xf2:
10855       return "repnz";
10856     case 0xf0:
10857       return "lock";
10858     case 0x2e:
10859       return "cs";
10860     case 0x36:
10861       return "ss";
10862     case 0x3e:
10863       return "ds";
10864     case 0x26:
10865       return "es";
10866     case 0x64:
10867       return "fs";
10868     case 0x65:
10869       return "gs";
10870     case 0x66:
10871       return (sizeflag & DFLAG) ? "data16" : "data32";
10872     case 0x67:
10873       if (address_mode == mode_64bit)
10874         return (sizeflag & AFLAG) ? "addr32" : "addr64";
10875       else
10876         return (sizeflag & AFLAG) ? "addr16" : "addr32";
10877     case FWAIT_OPCODE:
10878       return "fwait";
10879     case ADDR16_PREFIX:
10880       return "addr16";
10881     case ADDR32_PREFIX:
10882       return "addr32";
10883     case DATA16_PREFIX:
10884       return "data16";
10885     case DATA32_PREFIX:
10886       return "data32";
10887     case REP_PREFIX:
10888       return "rep";
10889     case XACQUIRE_PREFIX:
10890       return "xacquire";
10891     case XRELEASE_PREFIX:
10892       return "xrelease";
10893     default:
10894       return NULL;
10895     }
10896 }
10897
10898 static char op_out[MAX_OPERANDS][100];
10899 static int op_ad, op_index[MAX_OPERANDS];
10900 static int two_source_ops;
10901 static bfd_vma op_address[MAX_OPERANDS];
10902 static bfd_vma op_riprel[MAX_OPERANDS];
10903 static bfd_vma start_pc;
10904
10905 /*
10906  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10907  *   (see topic "Redundant prefixes" in the "Differences from 8086"
10908  *   section of the "Virtual 8086 Mode" chapter.)
10909  * 'pc' should be the address of this instruction, it will
10910  *   be used to print the target address if this is a relative jump or call
10911  * The function returns the length of this instruction in bytes.
10912  */
10913
10914 static char intel_syntax;
10915 static char intel_mnemonic = !SYSV386_COMPAT;
10916 static char open_char;
10917 static char close_char;
10918 static char separator_char;
10919 static char scale_char;
10920
10921 /* Here for backwards compatibility.  When gdb stops using
10922    print_insn_i386_att and print_insn_i386_intel these functions can
10923    disappear, and print_insn_i386 be merged into print_insn.  */
10924 int
10925 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10926 {
10927   intel_syntax = 0;
10928
10929   return print_insn (pc, info);
10930 }
10931
10932 int
10933 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10934 {
10935   intel_syntax = 1;
10936
10937   return print_insn (pc, info);
10938 }
10939
10940 int
10941 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10942 {
10943   intel_syntax = -1;
10944
10945   return print_insn (pc, info);
10946 }
10947
10948 void
10949 print_i386_disassembler_options (FILE *stream)
10950 {
10951   fprintf (stream, _("\n\
10952 The following i386/x86-64 specific disassembler options are supported for use\n\
10953 with the -M switch (multiple options should be separated by commas):\n"));
10954
10955   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
10956   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
10957   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
10958   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
10959   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
10960   fprintf (stream, _("  att-mnemonic\n"
10961                      "              Display instruction in AT&T mnemonic\n"));
10962   fprintf (stream, _("  intel-mnemonic\n"
10963                      "              Display instruction in Intel mnemonic\n"));
10964   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
10965   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
10966   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
10967   fprintf (stream, _("  data32      Assume 32bit data size\n"));
10968   fprintf (stream, _("  data16      Assume 16bit data size\n"));
10969   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
10970 }
10971
10972 /* Bad opcode.  */
10973 static const struct dis386 bad_opcode = { "(bad)", { XX } };
10974
10975 /* Get a pointer to struct dis386 with a valid name.  */
10976
10977 static const struct dis386 *
10978 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10979 {
10980   int vindex, vex_table_index;
10981
10982   if (dp->name != NULL)
10983     return dp;
10984
10985   switch (dp->op[0].bytemode)
10986     {
10987     case USE_REG_TABLE:
10988       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10989       break;
10990
10991     case USE_MOD_TABLE:
10992       vindex = modrm.mod == 0x3 ? 1 : 0;
10993       dp = &mod_table[dp->op[1].bytemode][vindex];
10994       break;
10995
10996     case USE_RM_TABLE:
10997       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10998       break;
10999
11000     case USE_PREFIX_TABLE:
11001       if (need_vex)
11002         {
11003           /* The prefix in VEX is implicit.  */
11004           switch (vex.prefix)
11005             {
11006             case 0:
11007               vindex = 0;
11008               break;
11009             case REPE_PREFIX_OPCODE:
11010               vindex = 1;
11011               break;
11012             case DATA_PREFIX_OPCODE:
11013               vindex = 2;
11014               break;
11015             case REPNE_PREFIX_OPCODE:
11016               vindex = 3;
11017               break;
11018             default:
11019               abort ();
11020               break;
11021             }
11022         }
11023       else
11024         {
11025           vindex = 0;
11026           used_prefixes |= (prefixes & PREFIX_REPZ);
11027           if (prefixes & PREFIX_REPZ)
11028             {
11029               vindex = 1;
11030               all_prefixes[last_repz_prefix] = 0;
11031             }
11032           else
11033             {
11034               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
11035                  PREFIX_DATA.  */
11036               used_prefixes |= (prefixes & PREFIX_REPNZ);
11037               if (prefixes & PREFIX_REPNZ)
11038                 {
11039                   vindex = 3;
11040                   all_prefixes[last_repnz_prefix] = 0;
11041                 }
11042               else
11043                 {
11044                   used_prefixes |= (prefixes & PREFIX_DATA);
11045                   if (prefixes & PREFIX_DATA)
11046                     {
11047                       vindex = 2;
11048                       all_prefixes[last_data_prefix] = 0;
11049                     }
11050                 }
11051             }
11052         }
11053       dp = &prefix_table[dp->op[1].bytemode][vindex];
11054       break;
11055
11056     case USE_X86_64_TABLE:
11057       vindex = address_mode == mode_64bit ? 1 : 0;
11058       dp = &x86_64_table[dp->op[1].bytemode][vindex];
11059       break;
11060
11061     case USE_3BYTE_TABLE:
11062       FETCH_DATA (info, codep + 2);
11063       vindex = *codep++;
11064       dp = &three_byte_table[dp->op[1].bytemode][vindex];
11065       modrm.mod = (*codep >> 6) & 3;
11066       modrm.reg = (*codep >> 3) & 7;
11067       modrm.rm = *codep & 7;
11068       break;
11069
11070     case USE_VEX_LEN_TABLE:
11071       if (!need_vex)
11072         abort ();
11073
11074       switch (vex.length)
11075         {
11076         case 128:
11077           vindex = 0;
11078           break;
11079         case 256:
11080           vindex = 1;
11081           break;
11082         default:
11083           abort ();
11084           break;
11085         }
11086
11087       dp = &vex_len_table[dp->op[1].bytemode][vindex];
11088       break;
11089
11090     case USE_XOP_8F_TABLE:
11091       FETCH_DATA (info, codep + 3);
11092       /* All bits in the REX prefix are ignored.  */
11093       rex_ignored = rex;
11094       rex = ~(*codep >> 5) & 0x7;
11095
11096       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
11097       switch ((*codep & 0x1f))
11098         {
11099         default:
11100           dp = &bad_opcode;
11101           return dp;
11102         case 0x8:
11103           vex_table_index = XOP_08;
11104           break;
11105         case 0x9:
11106           vex_table_index = XOP_09;
11107           break;
11108         case 0xa:
11109           vex_table_index = XOP_0A;
11110           break;
11111         }
11112       codep++;
11113       vex.w = *codep & 0x80;
11114       if (vex.w && address_mode == mode_64bit)
11115         rex |= REX_W;
11116
11117       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11118       if (address_mode != mode_64bit
11119           && vex.register_specifier > 0x7)
11120         {
11121           dp = &bad_opcode;
11122           return dp;
11123         }
11124
11125       vex.length = (*codep & 0x4) ? 256 : 128;
11126       switch ((*codep & 0x3))
11127         {
11128         case 0:
11129           vex.prefix = 0;
11130           break;
11131         case 1:
11132           vex.prefix = DATA_PREFIX_OPCODE;
11133           break;
11134         case 2:
11135           vex.prefix = REPE_PREFIX_OPCODE;
11136           break;
11137         case 3:
11138           vex.prefix = REPNE_PREFIX_OPCODE;
11139           break;
11140         }
11141       need_vex = 1;
11142       need_vex_reg = 1;
11143       codep++;
11144       vindex = *codep++;
11145       dp = &xop_table[vex_table_index][vindex];
11146
11147       FETCH_DATA (info, codep + 1);
11148       modrm.mod = (*codep >> 6) & 3;
11149       modrm.reg = (*codep >> 3) & 7;
11150       modrm.rm = *codep & 7;
11151       break;
11152
11153     case USE_VEX_C4_TABLE:
11154       FETCH_DATA (info, codep + 3);
11155       /* All bits in the REX prefix are ignored.  */
11156       rex_ignored = rex;
11157       rex = ~(*codep >> 5) & 0x7;
11158       switch ((*codep & 0x1f))
11159         {
11160         default:
11161           dp = &bad_opcode;
11162           return dp;
11163         case 0x1:
11164           vex_table_index = VEX_0F;
11165           break;
11166         case 0x2:
11167           vex_table_index = VEX_0F38;
11168           break;
11169         case 0x3:
11170           vex_table_index = VEX_0F3A;
11171           break;
11172         }
11173       codep++;
11174       vex.w = *codep & 0x80;
11175       if (vex.w && address_mode == mode_64bit)
11176         rex |= REX_W;
11177
11178       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11179       if (address_mode != mode_64bit
11180           && vex.register_specifier > 0x7)
11181         {
11182           dp = &bad_opcode;
11183           return dp;
11184         }
11185
11186       vex.length = (*codep & 0x4) ? 256 : 128;
11187       switch ((*codep & 0x3))
11188         {
11189         case 0:
11190           vex.prefix = 0;
11191           break;
11192         case 1:
11193           vex.prefix = DATA_PREFIX_OPCODE;
11194           break;
11195         case 2:
11196           vex.prefix = REPE_PREFIX_OPCODE;
11197           break;
11198         case 3:
11199           vex.prefix = REPNE_PREFIX_OPCODE;
11200           break;
11201         }
11202       need_vex = 1;
11203       need_vex_reg = 1;
11204       codep++;
11205       vindex = *codep++;
11206       dp = &vex_table[vex_table_index][vindex];
11207       /* There is no MODRM byte for VEX [82|77].  */
11208       if (vindex != 0x77 && vindex != 0x82)
11209         {
11210           FETCH_DATA (info, codep + 1);
11211           modrm.mod = (*codep >> 6) & 3;
11212           modrm.reg = (*codep >> 3) & 7;
11213           modrm.rm = *codep & 7;
11214         }
11215       break;
11216
11217     case USE_VEX_C5_TABLE:
11218       FETCH_DATA (info, codep + 2);
11219       /* All bits in the REX prefix are ignored.  */
11220       rex_ignored = rex;
11221       rex = (*codep & 0x80) ? 0 : REX_R;
11222
11223       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11224       if (address_mode != mode_64bit
11225           && vex.register_specifier > 0x7)
11226         {
11227           dp = &bad_opcode;
11228           return dp;
11229         }
11230
11231       vex.w = 0;
11232
11233       vex.length = (*codep & 0x4) ? 256 : 128;
11234       switch ((*codep & 0x3))
11235         {
11236         case 0:
11237           vex.prefix = 0;
11238           break;
11239         case 1:
11240           vex.prefix = DATA_PREFIX_OPCODE;
11241           break;
11242         case 2:
11243           vex.prefix = REPE_PREFIX_OPCODE;
11244           break;
11245         case 3:
11246           vex.prefix = REPNE_PREFIX_OPCODE;
11247           break;
11248         }
11249       need_vex = 1;
11250       need_vex_reg = 1;
11251       codep++;
11252       vindex = *codep++;
11253       dp = &vex_table[dp->op[1].bytemode][vindex];
11254       /* There is no MODRM byte for VEX [82|77].  */
11255       if (vindex != 0x77 && vindex != 0x82)
11256         {
11257           FETCH_DATA (info, codep + 1);
11258           modrm.mod = (*codep >> 6) & 3;
11259           modrm.reg = (*codep >> 3) & 7;
11260           modrm.rm = *codep & 7;
11261         }
11262       break;
11263
11264     case USE_VEX_W_TABLE:
11265       if (!need_vex)
11266         abort ();
11267
11268       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11269       break;
11270
11271     case 0:
11272       dp = &bad_opcode;
11273       break;
11274
11275     default:
11276       abort ();
11277     }
11278
11279   if (dp->name != NULL)
11280     return dp;
11281   else
11282     return get_valid_dis386 (dp, info);
11283 }
11284
11285 static void
11286 get_sib (disassemble_info *info)
11287 {
11288   /* If modrm.mod == 3, operand must be register.  */
11289   if (need_modrm
11290       && address_mode != mode_16bit
11291       && modrm.mod != 3
11292       && modrm.rm == 4)
11293     {
11294       FETCH_DATA (info, codep + 2);
11295       sib.index = (codep [1] >> 3) & 7;
11296       sib.scale = (codep [1] >> 6) & 3;
11297       sib.base = codep [1] & 7;
11298     }
11299 }
11300
11301 static int
11302 print_insn (bfd_vma pc, disassemble_info *info)
11303 {
11304   const struct dis386 *dp;
11305   int i;
11306   char *op_txt[MAX_OPERANDS];
11307   int needcomma;
11308   int sizeflag;
11309   const char *p;
11310   struct dis_private priv;
11311   int prefix_length;
11312   int default_prefixes;
11313
11314   priv.orig_sizeflag = AFLAG | DFLAG;
11315   if ((info->mach & bfd_mach_i386_i386) != 0)
11316     address_mode = mode_32bit;
11317   else if (info->mach == bfd_mach_i386_i8086)
11318     {
11319       address_mode = mode_16bit;
11320       priv.orig_sizeflag = 0;
11321     }
11322   else
11323     address_mode = mode_64bit;
11324
11325   if (intel_syntax == (char) -1)
11326     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11327
11328   for (p = info->disassembler_options; p != NULL; )
11329     {
11330       if (CONST_STRNEQ (p, "x86-64"))
11331         {
11332           address_mode = mode_64bit;
11333           priv.orig_sizeflag = AFLAG | DFLAG;
11334         }
11335       else if (CONST_STRNEQ (p, "i386"))
11336         {
11337           address_mode = mode_32bit;
11338           priv.orig_sizeflag = AFLAG | DFLAG;
11339         }
11340       else if (CONST_STRNEQ (p, "i8086"))
11341         {
11342           address_mode = mode_16bit;
11343           priv.orig_sizeflag = 0;
11344         }
11345       else if (CONST_STRNEQ (p, "intel"))
11346         {
11347           intel_syntax = 1;
11348           if (CONST_STRNEQ (p + 5, "-mnemonic"))
11349             intel_mnemonic = 1;
11350         }
11351       else if (CONST_STRNEQ (p, "att"))
11352         {
11353           intel_syntax = 0;
11354           if (CONST_STRNEQ (p + 3, "-mnemonic"))
11355             intel_mnemonic = 0;
11356         }
11357       else if (CONST_STRNEQ (p, "addr"))
11358         {
11359           if (address_mode == mode_64bit)
11360             {
11361               if (p[4] == '3' && p[5] == '2')
11362                 priv.orig_sizeflag &= ~AFLAG;
11363               else if (p[4] == '6' && p[5] == '4')
11364                 priv.orig_sizeflag |= AFLAG;
11365             }
11366           else
11367             {
11368               if (p[4] == '1' && p[5] == '6')
11369                 priv.orig_sizeflag &= ~AFLAG;
11370               else if (p[4] == '3' && p[5] == '2')
11371                 priv.orig_sizeflag |= AFLAG;
11372             }
11373         }
11374       else if (CONST_STRNEQ (p, "data"))
11375         {
11376           if (p[4] == '1' && p[5] == '6')
11377             priv.orig_sizeflag &= ~DFLAG;
11378           else if (p[4] == '3' && p[5] == '2')
11379             priv.orig_sizeflag |= DFLAG;
11380         }
11381       else if (CONST_STRNEQ (p, "suffix"))
11382         priv.orig_sizeflag |= SUFFIX_ALWAYS;
11383
11384       p = strchr (p, ',');
11385       if (p != NULL)
11386         p++;
11387     }
11388
11389   if (intel_syntax)
11390     {
11391       names64 = intel_names64;
11392       names32 = intel_names32;
11393       names16 = intel_names16;
11394       names8 = intel_names8;
11395       names8rex = intel_names8rex;
11396       names_seg = intel_names_seg;
11397       names_mm = intel_names_mm;
11398       names_xmm = intel_names_xmm;
11399       names_ymm = intel_names_ymm;
11400       index64 = intel_index64;
11401       index32 = intel_index32;
11402       index16 = intel_index16;
11403       open_char = '[';
11404       close_char = ']';
11405       separator_char = '+';
11406       scale_char = '*';
11407     }
11408   else
11409     {
11410       names64 = att_names64;
11411       names32 = att_names32;
11412       names16 = att_names16;
11413       names8 = att_names8;
11414       names8rex = att_names8rex;
11415       names_seg = att_names_seg;
11416       names_mm = att_names_mm;
11417       names_xmm = att_names_xmm;
11418       names_ymm = att_names_ymm;
11419       index64 = att_index64;
11420       index32 = att_index32;
11421       index16 = att_index16;
11422       open_char = '(';
11423       close_char =  ')';
11424       separator_char = ',';
11425       scale_char = ',';
11426     }
11427
11428   /* The output looks better if we put 7 bytes on a line, since that
11429      puts most long word instructions on a single line.  Use 8 bytes
11430      for Intel L1OM.  */
11431   if ((info->mach & bfd_mach_l1om) != 0)
11432     info->bytes_per_line = 8;
11433   else
11434     info->bytes_per_line = 7;
11435
11436   info->private_data = &priv;
11437   priv.max_fetched = priv.the_buffer;
11438   priv.insn_start = pc;
11439
11440   obuf[0] = 0;
11441   for (i = 0; i < MAX_OPERANDS; ++i)
11442     {
11443       op_out[i][0] = 0;
11444       op_index[i] = -1;
11445     }
11446
11447   the_info = info;
11448   start_pc = pc;
11449   start_codep = priv.the_buffer;
11450   codep = priv.the_buffer;
11451
11452   if (setjmp (priv.bailout) != 0)
11453     {
11454       const char *name;
11455
11456       /* Getting here means we tried for data but didn't get it.  That
11457          means we have an incomplete instruction of some sort.  Just
11458          print the first byte as a prefix or a .byte pseudo-op.  */
11459       if (codep > priv.the_buffer)
11460         {
11461           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11462           if (name != NULL)
11463             (*info->fprintf_func) (info->stream, "%s", name);
11464           else
11465             {
11466               /* Just print the first byte as a .byte instruction.  */
11467               (*info->fprintf_func) (info->stream, ".byte 0x%x",
11468                                      (unsigned int) priv.the_buffer[0]);
11469             }
11470
11471           return 1;
11472         }
11473
11474       return -1;
11475     }
11476
11477   obufp = obuf;
11478   sizeflag = priv.orig_sizeflag;
11479
11480   if (!ckprefix () || rex_used)
11481     {
11482       /* Too many prefixes or unused REX prefixes.  */
11483       for (i = 0;
11484            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
11485            i++)
11486         (*info->fprintf_func) (info->stream, "%s%s",
11487                                i == 0 ? "" : " ",
11488                                prefix_name (all_prefixes[i], sizeflag));
11489       return i;
11490     }
11491
11492   insn_codep = codep;
11493
11494   FETCH_DATA (info, codep + 1);
11495   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11496
11497   if (((prefixes & PREFIX_FWAIT)
11498        && ((*codep < 0xd8) || (*codep > 0xdf))))
11499     {
11500       (*info->fprintf_func) (info->stream, "fwait");
11501       return 1;
11502     }
11503
11504   if (*codep == 0x0f)
11505     {
11506       unsigned char threebyte;
11507       FETCH_DATA (info, codep + 2);
11508       threebyte = *++codep;
11509       dp = &dis386_twobyte[threebyte];
11510       need_modrm = twobyte_has_modrm[*codep];
11511       codep++;
11512     }
11513   else
11514     {
11515       dp = &dis386[*codep];
11516       need_modrm = onebyte_has_modrm[*codep];
11517       codep++;
11518     }
11519
11520   if ((prefixes & PREFIX_REPZ))
11521     used_prefixes |= PREFIX_REPZ;
11522   if ((prefixes & PREFIX_REPNZ))
11523     used_prefixes |= PREFIX_REPNZ;
11524   if ((prefixes & PREFIX_LOCK))
11525     used_prefixes |= PREFIX_LOCK;
11526
11527   default_prefixes = 0;
11528   if (prefixes & PREFIX_ADDR)
11529     {
11530       sizeflag ^= AFLAG;
11531       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11532         {
11533           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11534             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11535           else
11536             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11537           default_prefixes |= PREFIX_ADDR;
11538         }
11539     }
11540
11541   if ((prefixes & PREFIX_DATA))
11542     {
11543       sizeflag ^= DFLAG;
11544       if (dp->op[2].bytemode == cond_jump_mode
11545           && dp->op[0].bytemode == v_mode
11546           && !intel_syntax)
11547         {
11548           if (sizeflag & DFLAG)
11549             all_prefixes[last_data_prefix] = DATA32_PREFIX;
11550           else
11551             all_prefixes[last_data_prefix] = DATA16_PREFIX;
11552           default_prefixes |= PREFIX_DATA;
11553         }
11554       else if (rex & REX_W)
11555         {
11556           /* REX_W will override PREFIX_DATA.  */
11557           default_prefixes |= PREFIX_DATA;
11558         }
11559     }
11560
11561   if (need_modrm)
11562     {
11563       FETCH_DATA (info, codep + 1);
11564       modrm.mod = (*codep >> 6) & 3;
11565       modrm.reg = (*codep >> 3) & 7;
11566       modrm.rm = *codep & 7;
11567     }
11568
11569   need_vex = 0;
11570   need_vex_reg = 0;
11571   vex_w_done = 0;
11572
11573   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11574     {
11575       get_sib (info);
11576       dofloat (sizeflag);
11577     }
11578   else
11579     {
11580       dp = get_valid_dis386 (dp, info);
11581       if (dp != NULL && putop (dp->name, sizeflag) == 0)
11582         {
11583           get_sib (info);
11584           for (i = 0; i < MAX_OPERANDS; ++i)
11585             {
11586               obufp = op_out[i];
11587               op_ad = MAX_OPERANDS - 1 - i;
11588               if (dp->op[i].rtn)
11589                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11590             }
11591         }
11592     }
11593
11594   /* See if any prefixes were not used.  If so, print the first one
11595      separately.  If we don't do this, we'll wind up printing an
11596      instruction stream which does not precisely correspond to the
11597      bytes we are disassembling.  */
11598   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11599     {
11600       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11601         if (all_prefixes[i])
11602           {
11603             const char *name;
11604             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11605             if (name == NULL)
11606               name = INTERNAL_DISASSEMBLER_ERROR;
11607             (*info->fprintf_func) (info->stream, "%s", name);
11608             return 1;
11609           }
11610     }
11611
11612   /* Check if the REX prefix is used.  */
11613   if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11614     all_prefixes[last_rex_prefix] = 0;
11615
11616   /* Check if the SEG prefix is used.  */
11617   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11618                    | PREFIX_FS | PREFIX_GS)) != 0
11619       && (used_prefixes
11620           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11621     all_prefixes[last_seg_prefix] = 0;
11622
11623   /* Check if the ADDR prefix is used.  */
11624   if ((prefixes & PREFIX_ADDR) != 0
11625       && (used_prefixes & PREFIX_ADDR) != 0)
11626     all_prefixes[last_addr_prefix] = 0;
11627
11628   /* Check if the DATA prefix is used.  */
11629   if ((prefixes & PREFIX_DATA) != 0
11630       && (used_prefixes & PREFIX_DATA) != 0)
11631     all_prefixes[last_data_prefix] = 0;
11632
11633   prefix_length = 0;
11634   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11635     if (all_prefixes[i])
11636       {
11637         const char *name;
11638         name = prefix_name (all_prefixes[i], sizeflag);
11639         if (name == NULL)
11640           abort ();
11641         prefix_length += strlen (name) + 1;
11642         (*info->fprintf_func) (info->stream, "%s ", name);
11643       }
11644
11645   /* Check maximum code length.  */
11646   if ((codep - start_codep) > MAX_CODE_LENGTH)
11647     {
11648       (*info->fprintf_func) (info->stream, "(bad)");
11649       return MAX_CODE_LENGTH;
11650     }
11651
11652   obufp = mnemonicendp;
11653   for (i = strlen (obuf) + prefix_length; i < 6; i++)
11654     oappend (" ");
11655   oappend (" ");
11656   (*info->fprintf_func) (info->stream, "%s", obuf);
11657
11658   /* The enter and bound instructions are printed with operands in the same
11659      order as the intel book; everything else is printed in reverse order.  */
11660   if (intel_syntax || two_source_ops)
11661     {
11662       bfd_vma riprel;
11663
11664       for (i = 0; i < MAX_OPERANDS; ++i)
11665         op_txt[i] = op_out[i];
11666
11667       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11668         {
11669           op_ad = op_index[i];
11670           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11671           op_index[MAX_OPERANDS - 1 - i] = op_ad;
11672           riprel = op_riprel[i];
11673           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11674           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11675         }
11676     }
11677   else
11678     {
11679       for (i = 0; i < MAX_OPERANDS; ++i)
11680         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11681     }
11682
11683   needcomma = 0;
11684   for (i = 0; i < MAX_OPERANDS; ++i)
11685     if (*op_txt[i])
11686       {
11687         if (needcomma)
11688           (*info->fprintf_func) (info->stream, ",");
11689         if (op_index[i] != -1 && !op_riprel[i])
11690           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11691         else
11692           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11693         needcomma = 1;
11694       }
11695
11696   for (i = 0; i < MAX_OPERANDS; i++)
11697     if (op_index[i] != -1 && op_riprel[i])
11698       {
11699         (*info->fprintf_func) (info->stream, "        # ");
11700         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11701                                                 + op_address[op_index[i]]), info);
11702         break;
11703       }
11704   return codep - priv.the_buffer;
11705 }
11706
11707 static const char *float_mem[] = {
11708   /* d8 */
11709   "fadd{s|}",
11710   "fmul{s|}",
11711   "fcom{s|}",
11712   "fcomp{s|}",
11713   "fsub{s|}",
11714   "fsubr{s|}",
11715   "fdiv{s|}",
11716   "fdivr{s|}",
11717   /* d9 */
11718   "fld{s|}",
11719   "(bad)",
11720   "fst{s|}",
11721   "fstp{s|}",
11722   "fldenvIC",
11723   "fldcw",
11724   "fNstenvIC",
11725   "fNstcw",
11726   /* da */
11727   "fiadd{l|}",
11728   "fimul{l|}",
11729   "ficom{l|}",
11730   "ficomp{l|}",
11731   "fisub{l|}",
11732   "fisubr{l|}",
11733   "fidiv{l|}",
11734   "fidivr{l|}",
11735   /* db */
11736   "fild{l|}",
11737   "fisttp{l|}",
11738   "fist{l|}",
11739   "fistp{l|}",
11740   "(bad)",
11741   "fld{t||t|}",
11742   "(bad)",
11743   "fstp{t||t|}",
11744   /* dc */
11745   "fadd{l|}",
11746   "fmul{l|}",
11747   "fcom{l|}",
11748   "fcomp{l|}",
11749   "fsub{l|}",
11750   "fsubr{l|}",
11751   "fdiv{l|}",
11752   "fdivr{l|}",
11753   /* dd */
11754   "fld{l|}",
11755   "fisttp{ll|}",
11756   "fst{l||}",
11757   "fstp{l|}",
11758   "frstorIC",
11759   "(bad)",
11760   "fNsaveIC",
11761   "fNstsw",
11762   /* de */
11763   "fiadd",
11764   "fimul",
11765   "ficom",
11766   "ficomp",
11767   "fisub",
11768   "fisubr",
11769   "fidiv",
11770   "fidivr",
11771   /* df */
11772   "fild",
11773   "fisttp",
11774   "fist",
11775   "fistp",
11776   "fbld",
11777   "fild{ll|}",
11778   "fbstp",
11779   "fistp{ll|}",
11780 };
11781
11782 static const unsigned char float_mem_mode[] = {
11783   /* d8 */
11784   d_mode,
11785   d_mode,
11786   d_mode,
11787   d_mode,
11788   d_mode,
11789   d_mode,
11790   d_mode,
11791   d_mode,
11792   /* d9 */
11793   d_mode,
11794   0,
11795   d_mode,
11796   d_mode,
11797   0,
11798   w_mode,
11799   0,
11800   w_mode,
11801   /* da */
11802   d_mode,
11803   d_mode,
11804   d_mode,
11805   d_mode,
11806   d_mode,
11807   d_mode,
11808   d_mode,
11809   d_mode,
11810   /* db */
11811   d_mode,
11812   d_mode,
11813   d_mode,
11814   d_mode,
11815   0,
11816   t_mode,
11817   0,
11818   t_mode,
11819   /* dc */
11820   q_mode,
11821   q_mode,
11822   q_mode,
11823   q_mode,
11824   q_mode,
11825   q_mode,
11826   q_mode,
11827   q_mode,
11828   /* dd */
11829   q_mode,
11830   q_mode,
11831   q_mode,
11832   q_mode,
11833   0,
11834   0,
11835   0,
11836   w_mode,
11837   /* de */
11838   w_mode,
11839   w_mode,
11840   w_mode,
11841   w_mode,
11842   w_mode,
11843   w_mode,
11844   w_mode,
11845   w_mode,
11846   /* df */
11847   w_mode,
11848   w_mode,
11849   w_mode,
11850   w_mode,
11851   t_mode,
11852   q_mode,
11853   t_mode,
11854   q_mode
11855 };
11856
11857 #define ST { OP_ST, 0 }
11858 #define STi { OP_STi, 0 }
11859
11860 #define FGRPd9_2 NULL, { { NULL, 0 } }
11861 #define FGRPd9_4 NULL, { { NULL, 1 } }
11862 #define FGRPd9_5 NULL, { { NULL, 2 } }
11863 #define FGRPd9_6 NULL, { { NULL, 3 } }
11864 #define FGRPd9_7 NULL, { { NULL, 4 } }
11865 #define FGRPda_5 NULL, { { NULL, 5 } }
11866 #define FGRPdb_4 NULL, { { NULL, 6 } }
11867 #define FGRPde_3 NULL, { { NULL, 7 } }
11868 #define FGRPdf_4 NULL, { { NULL, 8 } }
11869
11870 static const struct dis386 float_reg[][8] = {
11871   /* d8 */
11872   {
11873     { "fadd",   { ST, STi } },
11874     { "fmul",   { ST, STi } },
11875     { "fcom",   { STi } },
11876     { "fcomp",  { STi } },
11877     { "fsub",   { ST, STi } },
11878     { "fsubr",  { ST, STi } },
11879     { "fdiv",   { ST, STi } },
11880     { "fdivr",  { ST, STi } },
11881   },
11882   /* d9 */
11883   {
11884     { "fld",    { STi } },
11885     { "fxch",   { STi } },
11886     { FGRPd9_2 },
11887     { Bad_Opcode },
11888     { FGRPd9_4 },
11889     { FGRPd9_5 },
11890     { FGRPd9_6 },
11891     { FGRPd9_7 },
11892   },
11893   /* da */
11894   {
11895     { "fcmovb", { ST, STi } },
11896     { "fcmove", { ST, STi } },
11897     { "fcmovbe",{ ST, STi } },
11898     { "fcmovu", { ST, STi } },
11899     { Bad_Opcode },
11900     { FGRPda_5 },
11901     { Bad_Opcode },
11902     { Bad_Opcode },
11903   },
11904   /* db */
11905   {
11906     { "fcmovnb",{ ST, STi } },
11907     { "fcmovne",{ ST, STi } },
11908     { "fcmovnbe",{ ST, STi } },
11909     { "fcmovnu",{ ST, STi } },
11910     { FGRPdb_4 },
11911     { "fucomi", { ST, STi } },
11912     { "fcomi",  { ST, STi } },
11913     { Bad_Opcode },
11914   },
11915   /* dc */
11916   {
11917     { "fadd",   { STi, ST } },
11918     { "fmul",   { STi, ST } },
11919     { Bad_Opcode },
11920     { Bad_Opcode },
11921     { "fsub!M", { STi, ST } },
11922     { "fsubM",  { STi, ST } },
11923     { "fdiv!M", { STi, ST } },
11924     { "fdivM",  { STi, ST } },
11925   },
11926   /* dd */
11927   {
11928     { "ffree",  { STi } },
11929     { Bad_Opcode },
11930     { "fst",    { STi } },
11931     { "fstp",   { STi } },
11932     { "fucom",  { STi } },
11933     { "fucomp", { STi } },
11934     { Bad_Opcode },
11935     { Bad_Opcode },
11936   },
11937   /* de */
11938   {
11939     { "faddp",  { STi, ST } },
11940     { "fmulp",  { STi, ST } },
11941     { Bad_Opcode },
11942     { FGRPde_3 },
11943     { "fsub!Mp", { STi, ST } },
11944     { "fsubMp", { STi, ST } },
11945     { "fdiv!Mp", { STi, ST } },
11946     { "fdivMp", { STi, ST } },
11947   },
11948   /* df */
11949   {
11950     { "ffreep", { STi } },
11951     { Bad_Opcode },
11952     { Bad_Opcode },
11953     { Bad_Opcode },
11954     { FGRPdf_4 },
11955     { "fucomip", { ST, STi } },
11956     { "fcomip", { ST, STi } },
11957     { Bad_Opcode },
11958   },
11959 };
11960
11961 static char *fgrps[][8] = {
11962   /* d9_2  0 */
11963   {
11964     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11965   },
11966
11967   /* d9_4  1 */
11968   {
11969     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11970   },
11971
11972   /* d9_5  2 */
11973   {
11974     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11975   },
11976
11977   /* d9_6  3 */
11978   {
11979     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11980   },
11981
11982   /* d9_7  4 */
11983   {
11984     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11985   },
11986
11987   /* da_5  5 */
11988   {
11989     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11990   },
11991
11992   /* db_4  6 */
11993   {
11994     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11995     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11996   },
11997
11998   /* de_3  7 */
11999   {
12000     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12001   },
12002
12003   /* df_4  8 */
12004   {
12005     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12006   },
12007 };
12008
12009 static void
12010 swap_operand (void)
12011 {
12012   mnemonicendp[0] = '.';
12013   mnemonicendp[1] = 's';
12014   mnemonicendp += 2;
12015 }
12016
12017 static void
12018 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12019                int sizeflag ATTRIBUTE_UNUSED)
12020 {
12021   /* Skip mod/rm byte.  */
12022   MODRM_CHECK;
12023   codep++;
12024 }
12025
12026 static void
12027 dofloat (int sizeflag)
12028 {
12029   const struct dis386 *dp;
12030   unsigned char floatop;
12031
12032   floatop = codep[-1];
12033
12034   if (modrm.mod != 3)
12035     {
12036       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12037
12038       putop (float_mem[fp_indx], sizeflag);
12039       obufp = op_out[0];
12040       op_ad = 2;
12041       OP_E (float_mem_mode[fp_indx], sizeflag);
12042       return;
12043     }
12044   /* Skip mod/rm byte.  */
12045   MODRM_CHECK;
12046   codep++;
12047
12048   dp = &float_reg[floatop - 0xd8][modrm.reg];
12049   if (dp->name == NULL)
12050     {
12051       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12052
12053       /* Instruction fnstsw is only one with strange arg.  */
12054       if (floatop == 0xdf && codep[-1] == 0xe0)
12055         strcpy (op_out[0], names16[0]);
12056     }
12057   else
12058     {
12059       putop (dp->name, sizeflag);
12060
12061       obufp = op_out[0];
12062       op_ad = 2;
12063       if (dp->op[0].rtn)
12064         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12065
12066       obufp = op_out[1];
12067       op_ad = 1;
12068       if (dp->op[1].rtn)
12069         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12070     }
12071 }
12072
12073 static void
12074 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12075 {
12076   oappend ("%st" + intel_syntax);
12077 }
12078
12079 static void
12080 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12081 {
12082   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12083   oappend (scratchbuf + intel_syntax);
12084 }
12085
12086 /* Capital letters in template are macros.  */
12087 static int
12088 putop (const char *in_template, int sizeflag)
12089 {
12090   const char *p;
12091   int alt = 0;
12092   int cond = 1;
12093   unsigned int l = 0, len = 1;
12094   char last[4];
12095
12096 #define SAVE_LAST(c)                    \
12097   if (l < len && l < sizeof (last))     \
12098     last[l++] = c;                      \
12099   else                                  \
12100     abort ();
12101
12102   for (p = in_template; *p; p++)
12103     {
12104       switch (*p)
12105         {
12106         default:
12107           *obufp++ = *p;
12108           break;
12109         case '%':
12110           len++;
12111           break;
12112         case '!':
12113           cond = 0;
12114           break;
12115         case '{':
12116           alt = 0;
12117           if (intel_syntax)
12118             {
12119               while (*++p != '|')
12120                 if (*p == '}' || *p == '\0')
12121                   abort ();
12122             }
12123           /* Fall through.  */
12124         case 'I':
12125           alt = 1;
12126           continue;
12127         case '|':
12128           while (*++p != '}')
12129             {
12130               if (*p == '\0')
12131                 abort ();
12132             }
12133           break;
12134         case '}':
12135           break;
12136         case 'A':
12137           if (intel_syntax)
12138             break;
12139           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12140             *obufp++ = 'b';
12141           break;
12142         case 'B':
12143           if (l == 0 && len == 1)
12144             {
12145 case_B:
12146               if (intel_syntax)
12147                 break;
12148               if (sizeflag & SUFFIX_ALWAYS)
12149                 *obufp++ = 'b';
12150             }
12151           else
12152             {
12153               if (l != 1
12154                   || len != 2
12155                   || last[0] != 'L')
12156                 {
12157                   SAVE_LAST (*p);
12158                   break;
12159                 }
12160
12161               if (address_mode == mode_64bit
12162                   && !(prefixes & PREFIX_ADDR))
12163                 {
12164                   *obufp++ = 'a';
12165                   *obufp++ = 'b';
12166                   *obufp++ = 's';
12167                 }
12168
12169               goto case_B;
12170             }
12171           break;
12172         case 'C':
12173           if (intel_syntax && !alt)
12174             break;
12175           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12176             {
12177               if (sizeflag & DFLAG)
12178                 *obufp++ = intel_syntax ? 'd' : 'l';
12179               else
12180                 *obufp++ = intel_syntax ? 'w' : 's';
12181               used_prefixes |= (prefixes & PREFIX_DATA);
12182             }
12183           break;
12184         case 'D':
12185           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12186             break;
12187           USED_REX (REX_W);
12188           if (modrm.mod == 3)
12189             {
12190               if (rex & REX_W)
12191                 *obufp++ = 'q';
12192               else
12193                 {
12194                   if (sizeflag & DFLAG)
12195                     *obufp++ = intel_syntax ? 'd' : 'l';
12196                   else
12197                     *obufp++ = 'w';
12198                   used_prefixes |= (prefixes & PREFIX_DATA);
12199                 }
12200             }
12201           else
12202             *obufp++ = 'w';
12203           break;
12204         case 'E':               /* For jcxz/jecxz */
12205           if (address_mode == mode_64bit)
12206             {
12207               if (sizeflag & AFLAG)
12208                 *obufp++ = 'r';
12209               else
12210                 *obufp++ = 'e';
12211             }
12212           else
12213             if (sizeflag & AFLAG)
12214               *obufp++ = 'e';
12215           used_prefixes |= (prefixes & PREFIX_ADDR);
12216           break;
12217         case 'F':
12218           if (intel_syntax)
12219             break;
12220           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12221             {
12222               if (sizeflag & AFLAG)
12223                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12224               else
12225                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12226               used_prefixes |= (prefixes & PREFIX_ADDR);
12227             }
12228           break;
12229         case 'G':
12230           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12231             break;
12232           if ((rex & REX_W) || (sizeflag & DFLAG))
12233             *obufp++ = 'l';
12234           else
12235             *obufp++ = 'w';
12236           if (!(rex & REX_W))
12237             used_prefixes |= (prefixes & PREFIX_DATA);
12238           break;
12239         case 'H':
12240           if (intel_syntax)
12241             break;
12242           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12243               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12244             {
12245               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12246               *obufp++ = ',';
12247               *obufp++ = 'p';
12248               if (prefixes & PREFIX_DS)
12249                 *obufp++ = 't';
12250               else
12251                 *obufp++ = 'n';
12252             }
12253           break;
12254         case 'J':
12255           if (intel_syntax)
12256             break;
12257           *obufp++ = 'l';
12258           break;
12259         case 'K':
12260           USED_REX (REX_W);
12261           if (rex & REX_W)
12262             *obufp++ = 'q';
12263           else
12264             *obufp++ = 'd';
12265           break;
12266         case 'Z':
12267           if (intel_syntax)
12268             break;
12269           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12270             {
12271               *obufp++ = 'q';
12272               break;
12273             }
12274           /* Fall through.  */
12275           goto case_L;
12276         case 'L':
12277           if (l != 0 || len != 1)
12278             {
12279               SAVE_LAST (*p);
12280               break;
12281             }
12282 case_L:
12283           if (intel_syntax)
12284             break;
12285           if (sizeflag & SUFFIX_ALWAYS)
12286             *obufp++ = 'l';
12287           break;
12288         case 'M':
12289           if (intel_mnemonic != cond)
12290             *obufp++ = 'r';
12291           break;
12292         case 'N':
12293           if ((prefixes & PREFIX_FWAIT) == 0)
12294             *obufp++ = 'n';
12295           else
12296             used_prefixes |= PREFIX_FWAIT;
12297           break;
12298         case 'O':
12299           USED_REX (REX_W);
12300           if (rex & REX_W)
12301             *obufp++ = 'o';
12302           else if (intel_syntax && (sizeflag & DFLAG))
12303             *obufp++ = 'q';
12304           else
12305             *obufp++ = 'd';
12306           if (!(rex & REX_W))
12307             used_prefixes |= (prefixes & PREFIX_DATA);
12308           break;
12309         case 'T':
12310           if (!intel_syntax
12311               && address_mode == mode_64bit
12312               && ((sizeflag & DFLAG) || (rex & REX_W)))
12313             {
12314               *obufp++ = 'q';
12315               break;
12316             }
12317           /* Fall through.  */
12318         case 'P':
12319           if (intel_syntax)
12320             {
12321               if ((rex & REX_W) == 0
12322                   && (prefixes & PREFIX_DATA))
12323                 {
12324                   if ((sizeflag & DFLAG) == 0)
12325                     *obufp++ = 'w';
12326                    used_prefixes |= (prefixes & PREFIX_DATA);
12327                 }
12328               break;
12329             }
12330           if ((prefixes & PREFIX_DATA)
12331               || (rex & REX_W)
12332               || (sizeflag & SUFFIX_ALWAYS))
12333             {
12334               USED_REX (REX_W);
12335               if (rex & REX_W)
12336                 *obufp++ = 'q';
12337               else
12338                 {
12339                    if (sizeflag & DFLAG)
12340                       *obufp++ = 'l';
12341                    else
12342                      *obufp++ = 'w';
12343                    used_prefixes |= (prefixes & PREFIX_DATA);
12344                 }
12345             }
12346           break;
12347         case 'U':
12348           if (intel_syntax)
12349             break;
12350           if (address_mode == mode_64bit
12351               && ((sizeflag & DFLAG) || (rex & REX_W)))
12352             {
12353               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12354                 *obufp++ = 'q';
12355               break;
12356             }
12357           /* Fall through.  */
12358           goto case_Q;
12359         case 'Q':
12360           if (l == 0 && len == 1)
12361             {
12362 case_Q:
12363               if (intel_syntax && !alt)
12364                 break;
12365               USED_REX (REX_W);
12366               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12367                 {
12368                   if (rex & REX_W)
12369                     *obufp++ = 'q';
12370                   else
12371                     {
12372                       if (sizeflag & DFLAG)
12373                         *obufp++ = intel_syntax ? 'd' : 'l';
12374                       else
12375                         *obufp++ = 'w';
12376                       used_prefixes |= (prefixes & PREFIX_DATA);
12377                     }
12378                 }
12379             }
12380           else
12381             {
12382               if (l != 1 || len != 2 || last[0] != 'L')
12383                 {
12384                   SAVE_LAST (*p);
12385                   break;
12386                 }
12387               if (intel_syntax
12388                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12389                 break;
12390               if ((rex & REX_W))
12391                 {
12392                   USED_REX (REX_W);
12393                   *obufp++ = 'q';
12394                 }
12395               else
12396                 *obufp++ = 'l';
12397             }
12398           break;
12399         case 'R':
12400           USED_REX (REX_W);
12401           if (rex & REX_W)
12402             *obufp++ = 'q';
12403           else if (sizeflag & DFLAG)
12404             {
12405               if (intel_syntax)
12406                   *obufp++ = 'd';
12407               else
12408                   *obufp++ = 'l';
12409             }
12410           else
12411             *obufp++ = 'w';
12412           if (intel_syntax && !p[1]
12413               && ((rex & REX_W) || (sizeflag & DFLAG)))
12414             *obufp++ = 'e';
12415           if (!(rex & REX_W))
12416             used_prefixes |= (prefixes & PREFIX_DATA);
12417           break;
12418         case 'V':
12419           if (l == 0 && len == 1)
12420             {
12421               if (intel_syntax)
12422                 break;
12423               if (address_mode == mode_64bit
12424                   && ((sizeflag & DFLAG) || (rex & REX_W)))
12425                 {
12426                   if (sizeflag & SUFFIX_ALWAYS)
12427                     *obufp++ = 'q';
12428                   break;
12429                 }
12430             }
12431           else
12432             {
12433               if (l != 1
12434                   || len != 2
12435                   || last[0] != 'L')
12436                 {
12437                   SAVE_LAST (*p);
12438                   break;
12439                 }
12440
12441               if (rex & REX_W)
12442                 {
12443                   *obufp++ = 'a';
12444                   *obufp++ = 'b';
12445                   *obufp++ = 's';
12446                 }
12447             }
12448           /* Fall through.  */
12449           goto case_S;
12450         case 'S':
12451           if (l == 0 && len == 1)
12452             {
12453 case_S:
12454               if (intel_syntax)
12455                 break;
12456               if (sizeflag & SUFFIX_ALWAYS)
12457                 {
12458                   if (rex & REX_W)
12459                     *obufp++ = 'q';
12460                   else
12461                     {
12462                       if (sizeflag & DFLAG)
12463                         *obufp++ = 'l';
12464                       else
12465                         *obufp++ = 'w';
12466                       used_prefixes |= (prefixes & PREFIX_DATA);
12467                     }
12468                 }
12469             }
12470           else
12471             {
12472               if (l != 1
12473                   || len != 2
12474                   || last[0] != 'L')
12475                 {
12476                   SAVE_LAST (*p);
12477                   break;
12478                 }
12479
12480               if (address_mode == mode_64bit
12481                   && !(prefixes & PREFIX_ADDR))
12482                 {
12483                   *obufp++ = 'a';
12484                   *obufp++ = 'b';
12485                   *obufp++ = 's';
12486                 }
12487
12488               goto case_S;
12489             }
12490           break;
12491         case 'X':
12492           if (l != 0 || len != 1)
12493             {
12494               SAVE_LAST (*p);
12495               break;
12496             }
12497           if (need_vex && vex.prefix)
12498             {
12499               if (vex.prefix == DATA_PREFIX_OPCODE)
12500                 *obufp++ = 'd';
12501               else
12502                 *obufp++ = 's';
12503             }
12504           else
12505             {
12506               if (prefixes & PREFIX_DATA)
12507                 *obufp++ = 'd';
12508               else
12509                 *obufp++ = 's';
12510               used_prefixes |= (prefixes & PREFIX_DATA);
12511             }
12512           break;
12513         case 'Y':
12514           if (l == 0 && len == 1)
12515             {
12516               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12517                 break;
12518               if (rex & REX_W)
12519                 {
12520                   USED_REX (REX_W);
12521                   *obufp++ = 'q';
12522                 }
12523               break;
12524             }
12525           else
12526             {
12527               if (l != 1 || len != 2 || last[0] != 'X')
12528                 {
12529                   SAVE_LAST (*p);
12530                   break;
12531                 }
12532               if (!need_vex)
12533                 abort ();
12534               if (intel_syntax
12535                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12536                 break;
12537               switch (vex.length)
12538                 {
12539                 case 128:
12540                   *obufp++ = 'x';
12541                   break;
12542                 case 256:
12543                   *obufp++ = 'y';
12544                   break;
12545                 default:
12546                   abort ();
12547                 }
12548             }
12549           break;
12550         case 'W':
12551           if (l == 0 && len == 1)
12552             {
12553               /* operand size flag for cwtl, cbtw */
12554               USED_REX (REX_W);
12555               if (rex & REX_W)
12556                 {
12557                   if (intel_syntax)
12558                     *obufp++ = 'd';
12559                   else
12560                     *obufp++ = 'l';
12561                 }
12562               else if (sizeflag & DFLAG)
12563                 *obufp++ = 'w';
12564               else
12565                 *obufp++ = 'b';
12566               if (!(rex & REX_W))
12567                 used_prefixes |= (prefixes & PREFIX_DATA);
12568             }
12569           else
12570             {
12571               if (l != 1
12572                   || len != 2
12573                   || (last[0] != 'X'
12574                       && last[0] != 'L'))
12575                 {
12576                   SAVE_LAST (*p);
12577                   break;
12578                 }
12579               if (!need_vex)
12580                 abort ();
12581               if (last[0] == 'X')
12582                 *obufp++ = vex.w ? 'd': 's';
12583               else
12584                 *obufp++ = vex.w ? 'q': 'd';
12585             }
12586           break;
12587         }
12588       alt = 0;
12589     }
12590   *obufp = 0;
12591   mnemonicendp = obufp;
12592   return 0;
12593 }
12594
12595 static void
12596 oappend (const char *s)
12597 {
12598   obufp = stpcpy (obufp, s);
12599 }
12600
12601 static void
12602 append_seg (void)
12603 {
12604   if (prefixes & PREFIX_CS)
12605     {
12606       used_prefixes |= PREFIX_CS;
12607       oappend ("%cs:" + intel_syntax);
12608     }
12609   if (prefixes & PREFIX_DS)
12610     {
12611       used_prefixes |= PREFIX_DS;
12612       oappend ("%ds:" + intel_syntax);
12613     }
12614   if (prefixes & PREFIX_SS)
12615     {
12616       used_prefixes |= PREFIX_SS;
12617       oappend ("%ss:" + intel_syntax);
12618     }
12619   if (prefixes & PREFIX_ES)
12620     {
12621       used_prefixes |= PREFIX_ES;
12622       oappend ("%es:" + intel_syntax);
12623     }
12624   if (prefixes & PREFIX_FS)
12625     {
12626       used_prefixes |= PREFIX_FS;
12627       oappend ("%fs:" + intel_syntax);
12628     }
12629   if (prefixes & PREFIX_GS)
12630     {
12631       used_prefixes |= PREFIX_GS;
12632       oappend ("%gs:" + intel_syntax);
12633     }
12634 }
12635
12636 static void
12637 OP_indirE (int bytemode, int sizeflag)
12638 {
12639   if (!intel_syntax)
12640     oappend ("*");
12641   OP_E (bytemode, sizeflag);
12642 }
12643
12644 static void
12645 print_operand_value (char *buf, int hex, bfd_vma disp)
12646 {
12647   if (address_mode == mode_64bit)
12648     {
12649       if (hex)
12650         {
12651           char tmp[30];
12652           int i;
12653           buf[0] = '0';
12654           buf[1] = 'x';
12655           sprintf_vma (tmp, disp);
12656           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12657           strcpy (buf + 2, tmp + i);
12658         }
12659       else
12660         {
12661           bfd_signed_vma v = disp;
12662           char tmp[30];
12663           int i;
12664           if (v < 0)
12665             {
12666               *(buf++) = '-';
12667               v = -disp;
12668               /* Check for possible overflow on 0x8000000000000000.  */
12669               if (v < 0)
12670                 {
12671                   strcpy (buf, "9223372036854775808");
12672                   return;
12673                 }
12674             }
12675           if (!v)
12676             {
12677               strcpy (buf, "0");
12678               return;
12679             }
12680
12681           i = 0;
12682           tmp[29] = 0;
12683           while (v)
12684             {
12685               tmp[28 - i] = (v % 10) + '0';
12686               v /= 10;
12687               i++;
12688             }
12689           strcpy (buf, tmp + 29 - i);
12690         }
12691     }
12692   else
12693     {
12694       if (hex)
12695         sprintf (buf, "0x%x", (unsigned int) disp);
12696       else
12697         sprintf (buf, "%d", (int) disp);
12698     }
12699 }
12700
12701 /* Put DISP in BUF as signed hex number.  */
12702
12703 static void
12704 print_displacement (char *buf, bfd_vma disp)
12705 {
12706   bfd_signed_vma val = disp;
12707   char tmp[30];
12708   int i, j = 0;
12709
12710   if (val < 0)
12711     {
12712       buf[j++] = '-';
12713       val = -disp;
12714
12715       /* Check for possible overflow.  */
12716       if (val < 0)
12717         {
12718           switch (address_mode)
12719             {
12720             case mode_64bit:
12721               strcpy (buf + j, "0x8000000000000000");
12722               break;
12723             case mode_32bit:
12724               strcpy (buf + j, "0x80000000");
12725               break;
12726             case mode_16bit:
12727               strcpy (buf + j, "0x8000");
12728               break;
12729             }
12730           return;
12731         }
12732     }
12733
12734   buf[j++] = '0';
12735   buf[j++] = 'x';
12736
12737   sprintf_vma (tmp, (bfd_vma) val);
12738   for (i = 0; tmp[i] == '0'; i++)
12739     continue;
12740   if (tmp[i] == '\0')
12741     i--;
12742   strcpy (buf + j, tmp + i);
12743 }
12744
12745 static void
12746 intel_operand_size (int bytemode, int sizeflag)
12747 {
12748   switch (bytemode)
12749     {
12750     case b_mode:
12751     case b_swap_mode:
12752     case dqb_mode:
12753       oappend ("BYTE PTR ");
12754       break;
12755     case w_mode:
12756     case dqw_mode:
12757       oappend ("WORD PTR ");
12758       break;
12759     case stack_v_mode:
12760       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
12761         {
12762           oappend ("QWORD PTR ");
12763           break;
12764         }
12765       /* FALLTHRU */
12766     case v_mode:
12767     case v_swap_mode:
12768     case dq_mode:
12769       USED_REX (REX_W);
12770       if (rex & REX_W)
12771         oappend ("QWORD PTR ");
12772       else
12773         {
12774           if ((sizeflag & DFLAG) || bytemode == dq_mode)
12775             oappend ("DWORD PTR ");
12776           else
12777             oappend ("WORD PTR ");
12778           used_prefixes |= (prefixes & PREFIX_DATA);
12779         }
12780       break;
12781     case z_mode:
12782       if ((rex & REX_W) || (sizeflag & DFLAG))
12783         *obufp++ = 'D';
12784       oappend ("WORD PTR ");
12785       if (!(rex & REX_W))
12786         used_prefixes |= (prefixes & PREFIX_DATA);
12787       break;
12788     case a_mode:
12789       if (sizeflag & DFLAG)
12790         oappend ("QWORD PTR ");
12791       else
12792         oappend ("DWORD PTR ");
12793       used_prefixes |= (prefixes & PREFIX_DATA);
12794       break;
12795     case d_mode:
12796     case d_scalar_mode:
12797     case d_scalar_swap_mode:
12798     case d_swap_mode:
12799     case dqd_mode:
12800       oappend ("DWORD PTR ");
12801       break;
12802     case q_mode:
12803     case q_scalar_mode:
12804     case q_scalar_swap_mode:
12805     case q_swap_mode:
12806       oappend ("QWORD PTR ");
12807       break;
12808     case m_mode:
12809       if (address_mode == mode_64bit)
12810         oappend ("QWORD PTR ");
12811       else
12812         oappend ("DWORD PTR ");
12813       break;
12814     case f_mode:
12815       if (sizeflag & DFLAG)
12816         oappend ("FWORD PTR ");
12817       else
12818         oappend ("DWORD PTR ");
12819       used_prefixes |= (prefixes & PREFIX_DATA);
12820       break;
12821     case t_mode:
12822       oappend ("TBYTE PTR ");
12823       break;
12824     case x_mode:
12825     case x_swap_mode:
12826       if (need_vex)
12827         {
12828           switch (vex.length)
12829             {
12830             case 128:
12831               oappend ("XMMWORD PTR ");
12832               break;
12833             case 256:
12834               oappend ("YMMWORD PTR ");
12835               break;
12836             default:
12837               abort ();
12838             }
12839         }
12840       else
12841         oappend ("XMMWORD PTR ");
12842       break;
12843     case xmm_mode:
12844       oappend ("XMMWORD PTR ");
12845       break;
12846     case xmmq_mode:
12847       if (!need_vex)
12848         abort ();
12849
12850       switch (vex.length)
12851         {
12852         case 128:
12853           oappend ("QWORD PTR ");
12854           break;
12855         case 256:
12856           oappend ("XMMWORD PTR ");
12857           break;
12858         default:
12859           abort ();
12860         }
12861       break;
12862     case xmm_mb_mode:
12863       if (!need_vex)
12864         abort ();
12865
12866       switch (vex.length)
12867         {
12868         case 128:
12869         case 256:
12870           oappend ("BYTE PTR ");
12871           break;
12872         default:
12873           abort ();
12874         }
12875       break;
12876     case xmm_mw_mode:
12877       if (!need_vex)
12878         abort ();
12879
12880       switch (vex.length)
12881         {
12882         case 128:
12883         case 256:
12884           oappend ("WORD PTR ");
12885           break;
12886         default:
12887           abort ();
12888         }
12889       break;
12890     case xmm_md_mode:
12891       if (!need_vex)
12892         abort ();
12893
12894       switch (vex.length)
12895         {
12896         case 128:
12897         case 256:
12898           oappend ("DWORD PTR ");
12899           break;
12900         default:
12901           abort ();
12902         }
12903       break;
12904     case xmm_mq_mode:
12905       if (!need_vex)
12906         abort ();
12907
12908       switch (vex.length)
12909         {
12910         case 128:
12911         case 256:
12912           oappend ("QWORD PTR ");
12913           break;
12914         default:
12915           abort ();
12916         }
12917       break;
12918     case xmmdw_mode:
12919       if (!need_vex)
12920         abort ();
12921
12922       switch (vex.length)
12923         {
12924         case 128:
12925           oappend ("WORD PTR ");
12926           break;
12927         case 256:
12928           oappend ("DWORD PTR ");
12929           break;
12930         default:
12931           abort ();
12932         }
12933       break;
12934     case xmmqd_mode:
12935       if (!need_vex)
12936         abort ();
12937
12938       switch (vex.length)
12939         {
12940         case 128:
12941           oappend ("DWORD PTR ");
12942           break;
12943         case 256:
12944           oappend ("QWORD PTR ");
12945           break;
12946         default:
12947           abort ();
12948         }
12949       break;
12950     case ymmq_mode:
12951       if (!need_vex)
12952         abort ();
12953
12954       switch (vex.length)
12955         {
12956         case 128:
12957           oappend ("QWORD PTR ");
12958           break;
12959         case 256:
12960           oappend ("YMMWORD PTR ");
12961           break;
12962         default:
12963           abort ();
12964         }
12965       break;
12966     case ymmxmm_mode:
12967       if (!need_vex)
12968         abort ();
12969
12970       switch (vex.length)
12971         {
12972         case 128:
12973         case 256:
12974           oappend ("XMMWORD PTR ");
12975           break;
12976         default:
12977           abort ();
12978         }
12979       break;
12980     case o_mode:
12981       oappend ("OWORD PTR ");
12982       break;
12983     case vex_w_dq_mode:
12984     case vex_scalar_w_dq_mode:
12985     case vex_vsib_d_w_dq_mode:
12986     case vex_vsib_q_w_dq_mode:
12987       if (!need_vex)
12988         abort ();
12989
12990       if (vex.w)
12991         oappend ("QWORD PTR ");
12992       else
12993         oappend ("DWORD PTR ");
12994       break;
12995     default:
12996       break;
12997     }
12998 }
12999
13000 static void
13001 OP_E_register (int bytemode, int sizeflag)
13002 {
13003   int reg = modrm.rm;
13004   const char **names;
13005
13006   USED_REX (REX_B);
13007   if ((rex & REX_B))
13008     reg += 8;
13009
13010   if ((sizeflag & SUFFIX_ALWAYS)
13011       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
13012     swap_operand ();
13013
13014   switch (bytemode)
13015     {
13016     case b_mode:
13017     case b_swap_mode:
13018       USED_REX (0);
13019       if (rex)
13020         names = names8rex;
13021       else
13022         names = names8;
13023       break;
13024     case w_mode:
13025       names = names16;
13026       break;
13027     case d_mode:
13028       names = names32;
13029       break;
13030     case q_mode:
13031       names = names64;
13032       break;
13033     case m_mode:
13034       names = address_mode == mode_64bit ? names64 : names32;
13035       break;
13036     case stack_v_mode:
13037       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13038         {
13039           names = names64;
13040           break;
13041         }
13042       bytemode = v_mode;
13043       /* FALLTHRU */
13044     case v_mode:
13045     case v_swap_mode:
13046     case dq_mode:
13047     case dqb_mode:
13048     case dqd_mode:
13049     case dqw_mode:
13050       USED_REX (REX_W);
13051       if (rex & REX_W)
13052         names = names64;
13053       else
13054         {
13055           if ((sizeflag & DFLAG)
13056               || (bytemode != v_mode
13057                   && bytemode != v_swap_mode))
13058             names = names32;
13059           else
13060             names = names16;
13061           used_prefixes |= (prefixes & PREFIX_DATA);
13062         }
13063       break;
13064     case 0:
13065       return;
13066     default:
13067       oappend (INTERNAL_DISASSEMBLER_ERROR);
13068       return;
13069     }
13070   oappend (names[reg]);
13071 }
13072
13073 static void
13074 OP_E_memory (int bytemode, int sizeflag)
13075 {
13076   bfd_vma disp = 0;
13077   int add = (rex & REX_B) ? 8 : 0;
13078   int riprel = 0;
13079
13080   USED_REX (REX_B);
13081   if (intel_syntax)
13082     intel_operand_size (bytemode, sizeflag);
13083   append_seg ();
13084
13085   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13086     {
13087       /* 32/64 bit address mode */
13088       int havedisp;
13089       int havesib;
13090       int havebase;
13091       int haveindex;
13092       int needindex;
13093       int base, rbase;
13094       int vindex = 0;
13095       int scale = 0;
13096       const char **indexes64 = names64;
13097       const char **indexes32 = names32;
13098
13099       havesib = 0;
13100       havebase = 1;
13101       haveindex = 0;
13102       base = modrm.rm;
13103
13104       if (base == 4)
13105         {
13106           havesib = 1;
13107           vindex = sib.index;
13108           USED_REX (REX_X);
13109           if (rex & REX_X)
13110             vindex += 8;
13111           switch (bytemode)
13112             {
13113             case vex_vsib_d_w_dq_mode:
13114             case vex_vsib_q_w_dq_mode:
13115               if (!need_vex)
13116                 abort ();
13117
13118               haveindex = 1;
13119               switch (vex.length)
13120                 {
13121                 case 128:
13122                   indexes64 = indexes32 = names_xmm;
13123                   break;
13124                 case 256:
13125                   if (!vex.w || bytemode == vex_vsib_q_w_dq_mode)
13126                     indexes64 = indexes32 = names_ymm;
13127                   else
13128                     indexes64 = indexes32 = names_xmm;
13129                   break;
13130                 default:
13131                   abort ();
13132                 }
13133               break;
13134             default:
13135               haveindex = vindex != 4;
13136               break;
13137             }
13138           scale = sib.scale;
13139           base = sib.base;
13140           codep++;
13141         }
13142       rbase = base + add;
13143
13144       switch (modrm.mod)
13145         {
13146         case 0:
13147           if (base == 5)
13148             {
13149               havebase = 0;
13150               if (address_mode == mode_64bit && !havesib)
13151                 riprel = 1;
13152               disp = get32s ();
13153             }
13154           break;
13155         case 1:
13156           FETCH_DATA (the_info, codep + 1);
13157           disp = *codep++;
13158           if ((disp & 0x80) != 0)
13159             disp -= 0x100;
13160           break;
13161         case 2:
13162           disp = get32s ();
13163           break;
13164         }
13165
13166       /* In 32bit mode, we need index register to tell [offset] from
13167          [eiz*1 + offset].  */
13168       needindex = (havesib
13169                    && !havebase
13170                    && !haveindex
13171                    && address_mode == mode_32bit);
13172       havedisp = (havebase
13173                   || needindex
13174                   || (havesib && (haveindex || scale != 0)));
13175
13176       if (!intel_syntax)
13177         if (modrm.mod != 0 || base == 5)
13178           {
13179             if (havedisp || riprel)
13180               print_displacement (scratchbuf, disp);
13181             else
13182               print_operand_value (scratchbuf, 1, disp);
13183             oappend (scratchbuf);
13184             if (riprel)
13185               {
13186                 set_op (disp, 1);
13187                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
13188               }
13189           }
13190
13191       if (havebase || haveindex || riprel)
13192         used_prefixes |= PREFIX_ADDR;
13193
13194       if (havedisp || (intel_syntax && riprel))
13195         {
13196           *obufp++ = open_char;
13197           if (intel_syntax && riprel)
13198             {
13199               set_op (disp, 1);
13200               oappend (sizeflag & AFLAG ? "rip" : "eip");
13201             }
13202           *obufp = '\0';
13203           if (havebase)
13204             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
13205                      ? names64[rbase] : names32[rbase]);
13206           if (havesib)
13207             {
13208               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
13209                  print index to tell base + index from base.  */
13210               if (scale != 0
13211                   || needindex
13212                   || haveindex
13213                   || (havebase && base != ESP_REG_NUM))
13214                 {
13215                   if (!intel_syntax || havebase)
13216                     {
13217                       *obufp++ = separator_char;
13218                       *obufp = '\0';
13219                     }
13220                   if (haveindex)
13221                     oappend (address_mode == mode_64bit
13222                              && (sizeflag & AFLAG)
13223                              ? indexes64[vindex] : indexes32[vindex]);
13224                   else
13225                     oappend (address_mode == mode_64bit
13226                              && (sizeflag & AFLAG)
13227                              ? index64 : index32);
13228
13229                   *obufp++ = scale_char;
13230                   *obufp = '\0';
13231                   sprintf (scratchbuf, "%d", 1 << scale);
13232                   oappend (scratchbuf);
13233                 }
13234             }
13235           if (intel_syntax
13236               && (disp || modrm.mod != 0 || base == 5))
13237             {
13238               if (!havedisp || (bfd_signed_vma) disp >= 0)
13239                 {
13240                   *obufp++ = '+';
13241                   *obufp = '\0';
13242                 }
13243               else if (modrm.mod != 1 && disp != -disp)
13244                 {
13245                   *obufp++ = '-';
13246                   *obufp = '\0';
13247                   disp = - (bfd_signed_vma) disp;
13248                 }
13249
13250               if (havedisp)
13251                 print_displacement (scratchbuf, disp);
13252               else
13253                 print_operand_value (scratchbuf, 1, disp);
13254               oappend (scratchbuf);
13255             }
13256
13257           *obufp++ = close_char;
13258           *obufp = '\0';
13259         }
13260       else if (intel_syntax)
13261         {
13262           if (modrm.mod != 0 || base == 5)
13263             {
13264               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13265                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13266                 ;
13267               else
13268                 {
13269                   oappend (names_seg[ds_reg - es_reg]);
13270                   oappend (":");
13271                 }
13272               print_operand_value (scratchbuf, 1, disp);
13273               oappend (scratchbuf);
13274             }
13275         }
13276     }
13277   else
13278     {
13279       /* 16 bit address mode */
13280       used_prefixes |= prefixes & PREFIX_ADDR;
13281       switch (modrm.mod)
13282         {
13283         case 0:
13284           if (modrm.rm == 6)
13285             {
13286               disp = get16 ();
13287               if ((disp & 0x8000) != 0)
13288                 disp -= 0x10000;
13289             }
13290           break;
13291         case 1:
13292           FETCH_DATA (the_info, codep + 1);
13293           disp = *codep++;
13294           if ((disp & 0x80) != 0)
13295             disp -= 0x100;
13296           break;
13297         case 2:
13298           disp = get16 ();
13299           if ((disp & 0x8000) != 0)
13300             disp -= 0x10000;
13301           break;
13302         }
13303
13304       if (!intel_syntax)
13305         if (modrm.mod != 0 || modrm.rm == 6)
13306           {
13307             print_displacement (scratchbuf, disp);
13308             oappend (scratchbuf);
13309           }
13310
13311       if (modrm.mod != 0 || modrm.rm != 6)
13312         {
13313           *obufp++ = open_char;
13314           *obufp = '\0';
13315           oappend (index16[modrm.rm]);
13316           if (intel_syntax
13317               && (disp || modrm.mod != 0 || modrm.rm == 6))
13318             {
13319               if ((bfd_signed_vma) disp >= 0)
13320                 {
13321                   *obufp++ = '+';
13322                   *obufp = '\0';
13323                 }
13324               else if (modrm.mod != 1)
13325                 {
13326                   *obufp++ = '-';
13327                   *obufp = '\0';
13328                   disp = - (bfd_signed_vma) disp;
13329                 }
13330
13331               print_displacement (scratchbuf, disp);
13332               oappend (scratchbuf);
13333             }
13334
13335           *obufp++ = close_char;
13336           *obufp = '\0';
13337         }
13338       else if (intel_syntax)
13339         {
13340           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13341                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13342             ;
13343           else
13344             {
13345               oappend (names_seg[ds_reg - es_reg]);
13346               oappend (":");
13347             }
13348           print_operand_value (scratchbuf, 1, disp & 0xffff);
13349           oappend (scratchbuf);
13350         }
13351     }
13352 }
13353
13354 static void
13355 OP_E (int bytemode, int sizeflag)
13356 {
13357   /* Skip mod/rm byte.  */
13358   MODRM_CHECK;
13359   codep++;
13360
13361   if (modrm.mod == 3)
13362     OP_E_register (bytemode, sizeflag);
13363   else
13364     OP_E_memory (bytemode, sizeflag);
13365 }
13366
13367 static void
13368 OP_G (int bytemode, int sizeflag)
13369 {
13370   int add = 0;
13371   USED_REX (REX_R);
13372   if (rex & REX_R)
13373     add += 8;
13374   switch (bytemode)
13375     {
13376     case b_mode:
13377       USED_REX (0);
13378       if (rex)
13379         oappend (names8rex[modrm.reg + add]);
13380       else
13381         oappend (names8[modrm.reg + add]);
13382       break;
13383     case w_mode:
13384       oappend (names16[modrm.reg + add]);
13385       break;
13386     case d_mode:
13387       oappend (names32[modrm.reg + add]);
13388       break;
13389     case q_mode:
13390       oappend (names64[modrm.reg + add]);
13391       break;
13392     case v_mode:
13393     case dq_mode:
13394     case dqb_mode:
13395     case dqd_mode:
13396     case dqw_mode:
13397       USED_REX (REX_W);
13398       if (rex & REX_W)
13399         oappend (names64[modrm.reg + add]);
13400       else
13401         {
13402           if ((sizeflag & DFLAG) || bytemode != v_mode)
13403             oappend (names32[modrm.reg + add]);
13404           else
13405             oappend (names16[modrm.reg + add]);
13406           used_prefixes |= (prefixes & PREFIX_DATA);
13407         }
13408       break;
13409     case m_mode:
13410       if (address_mode == mode_64bit)
13411         oappend (names64[modrm.reg + add]);
13412       else
13413         oappend (names32[modrm.reg + add]);
13414       break;
13415     default:
13416       oappend (INTERNAL_DISASSEMBLER_ERROR);
13417       break;
13418     }
13419 }
13420
13421 static bfd_vma
13422 get64 (void)
13423 {
13424   bfd_vma x;
13425 #ifdef BFD64
13426   unsigned int a;
13427   unsigned int b;
13428
13429   FETCH_DATA (the_info, codep + 8);
13430   a = *codep++ & 0xff;
13431   a |= (*codep++ & 0xff) << 8;
13432   a |= (*codep++ & 0xff) << 16;
13433   a |= (*codep++ & 0xff) << 24;
13434   b = *codep++ & 0xff;
13435   b |= (*codep++ & 0xff) << 8;
13436   b |= (*codep++ & 0xff) << 16;
13437   b |= (*codep++ & 0xff) << 24;
13438   x = a + ((bfd_vma) b << 32);
13439 #else
13440   abort ();
13441   x = 0;
13442 #endif
13443   return x;
13444 }
13445
13446 static bfd_signed_vma
13447 get32 (void)
13448 {
13449   bfd_signed_vma x = 0;
13450
13451   FETCH_DATA (the_info, codep + 4);
13452   x = *codep++ & (bfd_signed_vma) 0xff;
13453   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13454   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13455   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13456   return x;
13457 }
13458
13459 static bfd_signed_vma
13460 get32s (void)
13461 {
13462   bfd_signed_vma x = 0;
13463
13464   FETCH_DATA (the_info, codep + 4);
13465   x = *codep++ & (bfd_signed_vma) 0xff;
13466   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13467   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13468   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13469
13470   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13471
13472   return x;
13473 }
13474
13475 static int
13476 get16 (void)
13477 {
13478   int x = 0;
13479
13480   FETCH_DATA (the_info, codep + 2);
13481   x = *codep++ & 0xff;
13482   x |= (*codep++ & 0xff) << 8;
13483   return x;
13484 }
13485
13486 static void
13487 set_op (bfd_vma op, int riprel)
13488 {
13489   op_index[op_ad] = op_ad;
13490   if (address_mode == mode_64bit)
13491     {
13492       op_address[op_ad] = op;
13493       op_riprel[op_ad] = riprel;
13494     }
13495   else
13496     {
13497       /* Mask to get a 32-bit address.  */
13498       op_address[op_ad] = op & 0xffffffff;
13499       op_riprel[op_ad] = riprel & 0xffffffff;
13500     }
13501 }
13502
13503 static void
13504 OP_REG (int code, int sizeflag)
13505 {
13506   const char *s;
13507   int add;
13508
13509   switch (code)
13510     {
13511     case es_reg: case ss_reg: case cs_reg:
13512     case ds_reg: case fs_reg: case gs_reg:
13513       oappend (names_seg[code - es_reg]);
13514       return;
13515     }
13516
13517   USED_REX (REX_B);
13518   if (rex & REX_B)
13519     add = 8;
13520   else
13521     add = 0;
13522
13523   switch (code)
13524     {
13525     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13526     case sp_reg: case bp_reg: case si_reg: case di_reg:
13527       s = names16[code - ax_reg + add];
13528       break;
13529     case al_reg: case ah_reg: case cl_reg: case ch_reg:
13530     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13531       USED_REX (0);
13532       if (rex)
13533         s = names8rex[code - al_reg + add];
13534       else
13535         s = names8[code - al_reg];
13536       break;
13537     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13538     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13539       if (address_mode == mode_64bit
13540           && ((sizeflag & DFLAG) || (rex & REX_W)))
13541         {
13542           s = names64[code - rAX_reg + add];
13543           break;
13544         }
13545       code += eAX_reg - rAX_reg;
13546       /* Fall through.  */
13547     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13548     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13549       USED_REX (REX_W);
13550       if (rex & REX_W)
13551         s = names64[code - eAX_reg + add];
13552       else
13553         {
13554           if (sizeflag & DFLAG)
13555             s = names32[code - eAX_reg + add];
13556           else
13557             s = names16[code - eAX_reg + add];
13558           used_prefixes |= (prefixes & PREFIX_DATA);
13559         }
13560       break;
13561     default:
13562       s = INTERNAL_DISASSEMBLER_ERROR;
13563       break;
13564     }
13565   oappend (s);
13566 }
13567
13568 static void
13569 OP_IMREG (int code, int sizeflag)
13570 {
13571   const char *s;
13572
13573   switch (code)
13574     {
13575     case indir_dx_reg:
13576       if (intel_syntax)
13577         s = "dx";
13578       else
13579         s = "(%dx)";
13580       break;
13581     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13582     case sp_reg: case bp_reg: case si_reg: case di_reg:
13583       s = names16[code - ax_reg];
13584       break;
13585     case es_reg: case ss_reg: case cs_reg:
13586     case ds_reg: case fs_reg: case gs_reg:
13587       s = names_seg[code - es_reg];
13588       break;
13589     case al_reg: case ah_reg: case cl_reg: case ch_reg:
13590     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13591       USED_REX (0);
13592       if (rex)
13593         s = names8rex[code - al_reg];
13594       else
13595         s = names8[code - al_reg];
13596       break;
13597     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13598     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13599       USED_REX (REX_W);
13600       if (rex & REX_W)
13601         s = names64[code - eAX_reg];
13602       else
13603         {
13604           if (sizeflag & DFLAG)
13605             s = names32[code - eAX_reg];
13606           else
13607             s = names16[code - eAX_reg];
13608           used_prefixes |= (prefixes & PREFIX_DATA);
13609         }
13610       break;
13611     case z_mode_ax_reg:
13612       if ((rex & REX_W) || (sizeflag & DFLAG))
13613         s = *names32;
13614       else
13615         s = *names16;
13616       if (!(rex & REX_W))
13617         used_prefixes |= (prefixes & PREFIX_DATA);
13618       break;
13619     default:
13620       s = INTERNAL_DISASSEMBLER_ERROR;
13621       break;
13622     }
13623   oappend (s);
13624 }
13625
13626 static void
13627 OP_I (int bytemode, int sizeflag)
13628 {
13629   bfd_signed_vma op;
13630   bfd_signed_vma mask = -1;
13631
13632   switch (bytemode)
13633     {
13634     case b_mode:
13635       FETCH_DATA (the_info, codep + 1);
13636       op = *codep++;
13637       mask = 0xff;
13638       break;
13639     case q_mode:
13640       if (address_mode == mode_64bit)
13641         {
13642           op = get32s ();
13643           break;
13644         }
13645       /* Fall through.  */
13646     case v_mode:
13647       USED_REX (REX_W);
13648       if (rex & REX_W)
13649         op = get32s ();
13650       else
13651         {
13652           if (sizeflag & DFLAG)
13653             {
13654               op = get32 ();
13655               mask = 0xffffffff;
13656             }
13657           else
13658             {
13659               op = get16 ();
13660               mask = 0xfffff;
13661             }
13662           used_prefixes |= (prefixes & PREFIX_DATA);
13663         }
13664       break;
13665     case w_mode:
13666       mask = 0xfffff;
13667       op = get16 ();
13668       break;
13669     case const_1_mode:
13670       if (intel_syntax)
13671         oappend ("1");
13672       return;
13673     default:
13674       oappend (INTERNAL_DISASSEMBLER_ERROR);
13675       return;
13676     }
13677
13678   op &= mask;
13679   scratchbuf[0] = '$';
13680   print_operand_value (scratchbuf + 1, 1, op);
13681   oappend (scratchbuf + intel_syntax);
13682   scratchbuf[0] = '\0';
13683 }
13684
13685 static void
13686 OP_I64 (int bytemode, int sizeflag)
13687 {
13688   bfd_signed_vma op;
13689   bfd_signed_vma mask = -1;
13690
13691   if (address_mode != mode_64bit)
13692     {
13693       OP_I (bytemode, sizeflag);
13694       return;
13695     }
13696
13697   switch (bytemode)
13698     {
13699     case b_mode:
13700       FETCH_DATA (the_info, codep + 1);
13701       op = *codep++;
13702       mask = 0xff;
13703       break;
13704     case v_mode:
13705       USED_REX (REX_W);
13706       if (rex & REX_W)
13707         op = get64 ();
13708       else
13709         {
13710           if (sizeflag & DFLAG)
13711             {
13712               op = get32 ();
13713               mask = 0xffffffff;
13714             }
13715           else
13716             {
13717               op = get16 ();
13718               mask = 0xfffff;
13719             }
13720           used_prefixes |= (prefixes & PREFIX_DATA);
13721         }
13722       break;
13723     case w_mode:
13724       mask = 0xfffff;
13725       op = get16 ();
13726       break;
13727     default:
13728       oappend (INTERNAL_DISASSEMBLER_ERROR);
13729       return;
13730     }
13731
13732   op &= mask;
13733   scratchbuf[0] = '$';
13734   print_operand_value (scratchbuf + 1, 1, op);
13735   oappend (scratchbuf + intel_syntax);
13736   scratchbuf[0] = '\0';
13737 }
13738
13739 static void
13740 OP_sI (int bytemode, int sizeflag)
13741 {
13742   bfd_signed_vma op;
13743
13744   switch (bytemode)
13745     {
13746     case b_mode:
13747     case b_T_mode:
13748       FETCH_DATA (the_info, codep + 1);
13749       op = *codep++;
13750       if ((op & 0x80) != 0)
13751         op -= 0x100;
13752       if (bytemode == b_T_mode)
13753         {
13754           if (address_mode != mode_64bit
13755               || !((sizeflag & DFLAG) || (rex & REX_W)))
13756             {
13757               /* The operand-size prefix is overridden by a REX prefix.  */
13758               if ((sizeflag & DFLAG) || (rex & REX_W))
13759                 op &= 0xffffffff;
13760               else
13761                 op &= 0xffff;
13762           }
13763         }
13764       else
13765         {
13766           if (!(rex & REX_W))
13767             {
13768               if (sizeflag & DFLAG)
13769                 op &= 0xffffffff;
13770               else
13771                 op &= 0xffff;
13772             }
13773         }
13774       break;
13775     case v_mode:
13776       /* The operand-size prefix is overridden by a REX prefix.  */
13777       if ((sizeflag & DFLAG) || (rex & REX_W))
13778         op = get32s ();
13779       else
13780         op = get16 ();
13781       break;
13782     default:
13783       oappend (INTERNAL_DISASSEMBLER_ERROR);
13784       return;
13785     }
13786
13787   scratchbuf[0] = '$';
13788   print_operand_value (scratchbuf + 1, 1, op);
13789   oappend (scratchbuf + intel_syntax);
13790 }
13791
13792 static void
13793 OP_J (int bytemode, int sizeflag)
13794 {
13795   bfd_vma disp;
13796   bfd_vma mask = -1;
13797   bfd_vma segment = 0;
13798
13799   switch (bytemode)
13800     {
13801     case b_mode:
13802       FETCH_DATA (the_info, codep + 1);
13803       disp = *codep++;
13804       if ((disp & 0x80) != 0)
13805         disp -= 0x100;
13806       break;
13807     case v_mode:
13808       USED_REX (REX_W);
13809       if ((sizeflag & DFLAG) || (rex & REX_W))
13810         disp = get32s ();
13811       else
13812         {
13813           disp = get16 ();
13814           if ((disp & 0x8000) != 0)
13815             disp -= 0x10000;
13816           /* In 16bit mode, address is wrapped around at 64k within
13817              the same segment.  Otherwise, a data16 prefix on a jump
13818              instruction means that the pc is masked to 16 bits after
13819              the displacement is added!  */
13820           mask = 0xffff;
13821           if ((prefixes & PREFIX_DATA) == 0)
13822             segment = ((start_pc + codep - start_codep)
13823                        & ~((bfd_vma) 0xffff));
13824         }
13825       if (!(rex & REX_W))
13826         used_prefixes |= (prefixes & PREFIX_DATA);
13827       break;
13828     default:
13829       oappend (INTERNAL_DISASSEMBLER_ERROR);
13830       return;
13831     }
13832   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
13833   set_op (disp, 0);
13834   print_operand_value (scratchbuf, 1, disp);
13835   oappend (scratchbuf);
13836 }
13837
13838 static void
13839 OP_SEG (int bytemode, int sizeflag)
13840 {
13841   if (bytemode == w_mode)
13842     oappend (names_seg[modrm.reg]);
13843   else
13844     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13845 }
13846
13847 static void
13848 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13849 {
13850   int seg, offset;
13851
13852   if (sizeflag & DFLAG)
13853     {
13854       offset = get32 ();
13855       seg = get16 ();
13856     }
13857   else
13858     {
13859       offset = get16 ();
13860       seg = get16 ();
13861     }
13862   used_prefixes |= (prefixes & PREFIX_DATA);
13863   if (intel_syntax)
13864     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13865   else
13866     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13867   oappend (scratchbuf);
13868 }
13869
13870 static void
13871 OP_OFF (int bytemode, int sizeflag)
13872 {
13873   bfd_vma off;
13874
13875   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13876     intel_operand_size (bytemode, sizeflag);
13877   append_seg ();
13878
13879   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13880     off = get32 ();
13881   else
13882     off = get16 ();
13883
13884   if (intel_syntax)
13885     {
13886       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13887                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13888         {
13889           oappend (names_seg[ds_reg - es_reg]);
13890           oappend (":");
13891         }
13892     }
13893   print_operand_value (scratchbuf, 1, off);
13894   oappend (scratchbuf);
13895 }
13896
13897 static void
13898 OP_OFF64 (int bytemode, int sizeflag)
13899 {
13900   bfd_vma off;
13901
13902   if (address_mode != mode_64bit
13903       || (prefixes & PREFIX_ADDR))
13904     {
13905       OP_OFF (bytemode, sizeflag);
13906       return;
13907     }
13908
13909   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13910     intel_operand_size (bytemode, sizeflag);
13911   append_seg ();
13912
13913   off = get64 ();
13914
13915   if (intel_syntax)
13916     {
13917       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13918                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13919         {
13920           oappend (names_seg[ds_reg - es_reg]);
13921           oappend (":");
13922         }
13923     }
13924   print_operand_value (scratchbuf, 1, off);
13925   oappend (scratchbuf);
13926 }
13927
13928 static void
13929 ptr_reg (int code, int sizeflag)
13930 {
13931   const char *s;
13932
13933   *obufp++ = open_char;
13934   used_prefixes |= (prefixes & PREFIX_ADDR);
13935   if (address_mode == mode_64bit)
13936     {
13937       if (!(sizeflag & AFLAG))
13938         s = names32[code - eAX_reg];
13939       else
13940         s = names64[code - eAX_reg];
13941     }
13942   else if (sizeflag & AFLAG)
13943     s = names32[code - eAX_reg];
13944   else
13945     s = names16[code - eAX_reg];
13946   oappend (s);
13947   *obufp++ = close_char;
13948   *obufp = 0;
13949 }
13950
13951 static void
13952 OP_ESreg (int code, int sizeflag)
13953 {
13954   if (intel_syntax)
13955     {
13956       switch (codep[-1])
13957         {
13958         case 0x6d:      /* insw/insl */
13959           intel_operand_size (z_mode, sizeflag);
13960           break;
13961         case 0xa5:      /* movsw/movsl/movsq */
13962         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13963         case 0xab:      /* stosw/stosl */
13964         case 0xaf:      /* scasw/scasl */
13965           intel_operand_size (v_mode, sizeflag);
13966           break;
13967         default:
13968           intel_operand_size (b_mode, sizeflag);
13969         }
13970     }
13971   oappend ("%es:" + intel_syntax);
13972   ptr_reg (code, sizeflag);
13973 }
13974
13975 static void
13976 OP_DSreg (int code, int sizeflag)
13977 {
13978   if (intel_syntax)
13979     {
13980       switch (codep[-1])
13981         {
13982         case 0x6f:      /* outsw/outsl */
13983           intel_operand_size (z_mode, sizeflag);
13984           break;
13985         case 0xa5:      /* movsw/movsl/movsq */
13986         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13987         case 0xad:      /* lodsw/lodsl/lodsq */
13988           intel_operand_size (v_mode, sizeflag);
13989           break;
13990         default:
13991           intel_operand_size (b_mode, sizeflag);
13992         }
13993     }
13994   if ((prefixes
13995        & (PREFIX_CS
13996           | PREFIX_DS
13997           | PREFIX_SS
13998           | PREFIX_ES
13999           | PREFIX_FS
14000           | PREFIX_GS)) == 0)
14001     prefixes |= PREFIX_DS;
14002   append_seg ();
14003   ptr_reg (code, sizeflag);
14004 }
14005
14006 static void
14007 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14008 {
14009   int add;
14010   if (rex & REX_R)
14011     {
14012       USED_REX (REX_R);
14013       add = 8;
14014     }
14015   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
14016     {
14017       all_prefixes[last_lock_prefix] = 0;
14018       used_prefixes |= PREFIX_LOCK;
14019       add = 8;
14020     }
14021   else
14022     add = 0;
14023   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
14024   oappend (scratchbuf + intel_syntax);
14025 }
14026
14027 static void
14028 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14029 {
14030   int add;
14031   USED_REX (REX_R);
14032   if (rex & REX_R)
14033     add = 8;
14034   else
14035     add = 0;
14036   if (intel_syntax)
14037     sprintf (scratchbuf, "db%d", modrm.reg + add);
14038   else
14039     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
14040   oappend (scratchbuf);
14041 }
14042
14043 static void
14044 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14045 {
14046   sprintf (scratchbuf, "%%tr%d", modrm.reg);
14047   oappend (scratchbuf + intel_syntax);
14048 }
14049
14050 static void
14051 OP_R (int bytemode, int sizeflag)
14052 {
14053   if (modrm.mod == 3)
14054     OP_E (bytemode, sizeflag);
14055   else
14056     BadOp ();
14057 }
14058
14059 static void
14060 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14061 {
14062   int reg = modrm.reg;
14063   const char **names;
14064
14065   used_prefixes |= (prefixes & PREFIX_DATA);
14066   if (prefixes & PREFIX_DATA)
14067     {
14068       names = names_xmm;
14069       USED_REX (REX_R);
14070       if (rex & REX_R)
14071         reg += 8;
14072     }
14073   else
14074     names = names_mm;
14075   oappend (names[reg]);
14076 }
14077
14078 static void
14079 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14080 {
14081   int reg = modrm.reg;
14082   const char **names;
14083
14084   USED_REX (REX_R);
14085   if (rex & REX_R)
14086     reg += 8;
14087   if (need_vex
14088       && bytemode != xmm_mode
14089       && bytemode != scalar_mode)
14090     {
14091       switch (vex.length)
14092         {
14093         case 128:
14094           names = names_xmm;
14095           break;
14096         case 256:
14097           if (vex.w || bytemode != vex_vsib_q_w_dq_mode)
14098             names = names_ymm;
14099           else
14100             names = names_xmm;
14101           break;
14102         default:
14103           abort ();
14104         }
14105     }
14106   else
14107     names = names_xmm;
14108   oappend (names[reg]);
14109 }
14110
14111 static void
14112 OP_EM (int bytemode, int sizeflag)
14113 {
14114   int reg;
14115   const char **names;
14116
14117   if (modrm.mod != 3)
14118     {
14119       if (intel_syntax
14120           && (bytemode == v_mode || bytemode == v_swap_mode))
14121         {
14122           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14123           used_prefixes |= (prefixes & PREFIX_DATA);
14124         }
14125       OP_E (bytemode, sizeflag);
14126       return;
14127     }
14128
14129   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
14130     swap_operand ();
14131
14132   /* Skip mod/rm byte.  */
14133   MODRM_CHECK;
14134   codep++;
14135   used_prefixes |= (prefixes & PREFIX_DATA);
14136   reg = modrm.rm;
14137   if (prefixes & PREFIX_DATA)
14138     {
14139       names = names_xmm;
14140       USED_REX (REX_B);
14141       if (rex & REX_B)
14142         reg += 8;
14143     }
14144   else
14145     names = names_mm;
14146   oappend (names[reg]);
14147 }
14148
14149 /* cvt* are the only instructions in sse2 which have
14150    both SSE and MMX operands and also have 0x66 prefix
14151    in their opcode. 0x66 was originally used to differentiate
14152    between SSE and MMX instruction(operands). So we have to handle the
14153    cvt* separately using OP_EMC and OP_MXC */
14154 static void
14155 OP_EMC (int bytemode, int sizeflag)
14156 {
14157   if (modrm.mod != 3)
14158     {
14159       if (intel_syntax && bytemode == v_mode)
14160         {
14161           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14162           used_prefixes |= (prefixes & PREFIX_DATA);
14163         }
14164       OP_E (bytemode, sizeflag);
14165       return;
14166     }
14167
14168   /* Skip mod/rm byte.  */
14169   MODRM_CHECK;
14170   codep++;
14171   used_prefixes |= (prefixes & PREFIX_DATA);
14172   oappend (names_mm[modrm.rm]);
14173 }
14174
14175 static void
14176 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14177 {
14178   used_prefixes |= (prefixes & PREFIX_DATA);
14179   oappend (names_mm[modrm.reg]);
14180 }
14181
14182 static void
14183 OP_EX (int bytemode, int sizeflag)
14184 {
14185   int reg;
14186   const char **names;
14187
14188   /* Skip mod/rm byte.  */
14189   MODRM_CHECK;
14190   codep++;
14191
14192   if (modrm.mod != 3)
14193     {
14194       OP_E_memory (bytemode, sizeflag);
14195       return;
14196     }
14197
14198   reg = modrm.rm;
14199   USED_REX (REX_B);
14200   if (rex & REX_B)
14201     reg += 8;
14202
14203   if ((sizeflag & SUFFIX_ALWAYS)
14204       && (bytemode == x_swap_mode
14205           || bytemode == d_swap_mode
14206           || bytemode == d_scalar_swap_mode
14207           || bytemode == q_swap_mode
14208           || bytemode == q_scalar_swap_mode))
14209     swap_operand ();
14210
14211   if (need_vex
14212       && bytemode != xmm_mode
14213       && bytemode != xmmdw_mode
14214       && bytemode != xmmqd_mode
14215       && bytemode != xmm_mb_mode
14216       && bytemode != xmm_mw_mode
14217       && bytemode != xmm_md_mode
14218       && bytemode != xmm_mq_mode
14219       && bytemode != xmmq_mode
14220       && bytemode != d_scalar_mode
14221       && bytemode != d_scalar_swap_mode
14222       && bytemode != q_scalar_mode
14223       && bytemode != q_scalar_swap_mode
14224       && bytemode != vex_scalar_w_dq_mode)
14225     {
14226       switch (vex.length)
14227         {
14228         case 128:
14229           names = names_xmm;
14230           break;
14231         case 256:
14232           names = names_ymm;
14233           break;
14234         default:
14235           abort ();
14236         }
14237     }
14238   else
14239     names = names_xmm;
14240   oappend (names[reg]);
14241 }
14242
14243 static void
14244 OP_MS (int bytemode, int sizeflag)
14245 {
14246   if (modrm.mod == 3)
14247     OP_EM (bytemode, sizeflag);
14248   else
14249     BadOp ();
14250 }
14251
14252 static void
14253 OP_XS (int bytemode, int sizeflag)
14254 {
14255   if (modrm.mod == 3)
14256     OP_EX (bytemode, sizeflag);
14257   else
14258     BadOp ();
14259 }
14260
14261 static void
14262 OP_M (int bytemode, int sizeflag)
14263 {
14264   if (modrm.mod == 3)
14265     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
14266     BadOp ();
14267   else
14268     OP_E (bytemode, sizeflag);
14269 }
14270
14271 static void
14272 OP_0f07 (int bytemode, int sizeflag)
14273 {
14274   if (modrm.mod != 3 || modrm.rm != 0)
14275     BadOp ();
14276   else
14277     OP_E (bytemode, sizeflag);
14278 }
14279
14280 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
14281    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
14282
14283 static void
14284 NOP_Fixup1 (int bytemode, int sizeflag)
14285 {
14286   if ((prefixes & PREFIX_DATA) != 0
14287       || (rex != 0
14288           && rex != 0x48
14289           && address_mode == mode_64bit))
14290     OP_REG (bytemode, sizeflag);
14291   else
14292     strcpy (obuf, "nop");
14293 }
14294
14295 static void
14296 NOP_Fixup2 (int bytemode, int sizeflag)
14297 {
14298   if ((prefixes & PREFIX_DATA) != 0
14299       || (rex != 0
14300           && rex != 0x48
14301           && address_mode == mode_64bit))
14302     OP_IMREG (bytemode, sizeflag);
14303 }
14304
14305 static const char *const Suffix3DNow[] = {
14306 /* 00 */        NULL,           NULL,           NULL,           NULL,
14307 /* 04 */        NULL,           NULL,           NULL,           NULL,
14308 /* 08 */        NULL,           NULL,           NULL,           NULL,
14309 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
14310 /* 10 */        NULL,           NULL,           NULL,           NULL,
14311 /* 14 */        NULL,           NULL,           NULL,           NULL,
14312 /* 18 */        NULL,           NULL,           NULL,           NULL,
14313 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
14314 /* 20 */        NULL,           NULL,           NULL,           NULL,
14315 /* 24 */        NULL,           NULL,           NULL,           NULL,
14316 /* 28 */        NULL,           NULL,           NULL,           NULL,
14317 /* 2C */        NULL,           NULL,           NULL,           NULL,
14318 /* 30 */        NULL,           NULL,           NULL,           NULL,
14319 /* 34 */        NULL,           NULL,           NULL,           NULL,
14320 /* 38 */        NULL,           NULL,           NULL,           NULL,
14321 /* 3C */        NULL,           NULL,           NULL,           NULL,
14322 /* 40 */        NULL,           NULL,           NULL,           NULL,
14323 /* 44 */        NULL,           NULL,           NULL,           NULL,
14324 /* 48 */        NULL,           NULL,           NULL,           NULL,
14325 /* 4C */        NULL,           NULL,           NULL,           NULL,
14326 /* 50 */        NULL,           NULL,           NULL,           NULL,
14327 /* 54 */        NULL,           NULL,           NULL,           NULL,
14328 /* 58 */        NULL,           NULL,           NULL,           NULL,
14329 /* 5C */        NULL,           NULL,           NULL,           NULL,
14330 /* 60 */        NULL,           NULL,           NULL,           NULL,
14331 /* 64 */        NULL,           NULL,           NULL,           NULL,
14332 /* 68 */        NULL,           NULL,           NULL,           NULL,
14333 /* 6C */        NULL,           NULL,           NULL,           NULL,
14334 /* 70 */        NULL,           NULL,           NULL,           NULL,
14335 /* 74 */        NULL,           NULL,           NULL,           NULL,
14336 /* 78 */        NULL,           NULL,           NULL,           NULL,
14337 /* 7C */        NULL,           NULL,           NULL,           NULL,
14338 /* 80 */        NULL,           NULL,           NULL,           NULL,
14339 /* 84 */        NULL,           NULL,           NULL,           NULL,
14340 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
14341 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
14342 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
14343 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
14344 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
14345 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
14346 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
14347 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
14348 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
14349 /* AC */        NULL,           NULL,           "pfacc",        NULL,
14350 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
14351 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
14352 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
14353 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
14354 /* C0 */        NULL,           NULL,           NULL,           NULL,
14355 /* C4 */        NULL,           NULL,           NULL,           NULL,
14356 /* C8 */        NULL,           NULL,           NULL,           NULL,
14357 /* CC */        NULL,           NULL,           NULL,           NULL,
14358 /* D0 */        NULL,           NULL,           NULL,           NULL,
14359 /* D4 */        NULL,           NULL,           NULL,           NULL,
14360 /* D8 */        NULL,           NULL,           NULL,           NULL,
14361 /* DC */        NULL,           NULL,           NULL,           NULL,
14362 /* E0 */        NULL,           NULL,           NULL,           NULL,
14363 /* E4 */        NULL,           NULL,           NULL,           NULL,
14364 /* E8 */        NULL,           NULL,           NULL,           NULL,
14365 /* EC */        NULL,           NULL,           NULL,           NULL,
14366 /* F0 */        NULL,           NULL,           NULL,           NULL,
14367 /* F4 */        NULL,           NULL,           NULL,           NULL,
14368 /* F8 */        NULL,           NULL,           NULL,           NULL,
14369 /* FC */        NULL,           NULL,           NULL,           NULL,
14370 };
14371
14372 static void
14373 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14374 {
14375   const char *mnemonic;
14376
14377   FETCH_DATA (the_info, codep + 1);
14378   /* AMD 3DNow! instructions are specified by an opcode suffix in the
14379      place where an 8-bit immediate would normally go.  ie. the last
14380      byte of the instruction.  */
14381   obufp = mnemonicendp;
14382   mnemonic = Suffix3DNow[*codep++ & 0xff];
14383   if (mnemonic)
14384     oappend (mnemonic);
14385   else
14386     {
14387       /* Since a variable sized modrm/sib chunk is between the start
14388          of the opcode (0x0f0f) and the opcode suffix, we need to do
14389          all the modrm processing first, and don't know until now that
14390          we have a bad opcode.  This necessitates some cleaning up.  */
14391       op_out[0][0] = '\0';
14392       op_out[1][0] = '\0';
14393       BadOp ();
14394     }
14395   mnemonicendp = obufp;
14396 }
14397
14398 static struct op simd_cmp_op[] =
14399 {
14400   { STRING_COMMA_LEN ("eq") },
14401   { STRING_COMMA_LEN ("lt") },
14402   { STRING_COMMA_LEN ("le") },
14403   { STRING_COMMA_LEN ("unord") },
14404   { STRING_COMMA_LEN ("neq") },
14405   { STRING_COMMA_LEN ("nlt") },
14406   { STRING_COMMA_LEN ("nle") },
14407   { STRING_COMMA_LEN ("ord") }
14408 };
14409
14410 static void
14411 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14412 {
14413   unsigned int cmp_type;
14414
14415   FETCH_DATA (the_info, codep + 1);
14416   cmp_type = *codep++ & 0xff;
14417   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14418     {
14419       char suffix [3];
14420       char *p = mnemonicendp - 2;
14421       suffix[0] = p[0];
14422       suffix[1] = p[1];
14423       suffix[2] = '\0';
14424       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14425       mnemonicendp += simd_cmp_op[cmp_type].len;
14426     }
14427   else
14428     {
14429       /* We have a reserved extension byte.  Output it directly.  */
14430       scratchbuf[0] = '$';
14431       print_operand_value (scratchbuf + 1, 1, cmp_type);
14432       oappend (scratchbuf + intel_syntax);
14433       scratchbuf[0] = '\0';
14434     }
14435 }
14436
14437 static void
14438 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14439           int sizeflag ATTRIBUTE_UNUSED)
14440 {
14441   /* mwait %eax,%ecx  */
14442   if (!intel_syntax)
14443     {
14444       const char **names = (address_mode == mode_64bit
14445                             ? names64 : names32);
14446       strcpy (op_out[0], names[0]);
14447       strcpy (op_out[1], names[1]);
14448       two_source_ops = 1;
14449     }
14450   /* Skip mod/rm byte.  */
14451   MODRM_CHECK;
14452   codep++;
14453 }
14454
14455 static void
14456 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14457             int sizeflag ATTRIBUTE_UNUSED)
14458 {
14459   /* monitor %eax,%ecx,%edx"  */
14460   if (!intel_syntax)
14461     {
14462       const char **op1_names;
14463       const char **names = (address_mode == mode_64bit
14464                             ? names64 : names32);
14465
14466       if (!(prefixes & PREFIX_ADDR))
14467         op1_names = (address_mode == mode_16bit
14468                      ? names16 : names);
14469       else
14470         {
14471           /* Remove "addr16/addr32".  */
14472           all_prefixes[last_addr_prefix] = 0;
14473           op1_names = (address_mode != mode_32bit
14474                        ? names32 : names16);
14475           used_prefixes |= PREFIX_ADDR;
14476         }
14477       strcpy (op_out[0], op1_names[0]);
14478       strcpy (op_out[1], names[1]);
14479       strcpy (op_out[2], names[2]);
14480       two_source_ops = 1;
14481     }
14482   /* Skip mod/rm byte.  */
14483   MODRM_CHECK;
14484   codep++;
14485 }
14486
14487 static void
14488 BadOp (void)
14489 {
14490   /* Throw away prefixes and 1st. opcode byte.  */
14491   codep = insn_codep + 1;
14492   oappend ("(bad)");
14493 }
14494
14495 static void
14496 REP_Fixup (int bytemode, int sizeflag)
14497 {
14498   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14499      lods and stos.  */
14500   if (prefixes & PREFIX_REPZ)
14501     all_prefixes[last_repz_prefix] = REP_PREFIX;
14502
14503   switch (bytemode)
14504     {
14505     case al_reg:
14506     case eAX_reg:
14507     case indir_dx_reg:
14508       OP_IMREG (bytemode, sizeflag);
14509       break;
14510     case eDI_reg:
14511       OP_ESreg (bytemode, sizeflag);
14512       break;
14513     case eSI_reg:
14514       OP_DSreg (bytemode, sizeflag);
14515       break;
14516     default:
14517       abort ();
14518       break;
14519     }
14520 }
14521
14522 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
14523    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
14524  */
14525
14526 static void
14527 HLE_Fixup1 (int bytemode, int sizeflag)
14528 {
14529   if (modrm.mod != 3
14530       && (prefixes & PREFIX_LOCK) != 0)
14531     {
14532       if (prefixes & PREFIX_REPZ)
14533         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14534       if (prefixes & PREFIX_REPNZ)
14535         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14536     }
14537
14538   OP_E (bytemode, sizeflag);
14539 }
14540
14541 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
14542    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
14543  */
14544
14545 static void
14546 HLE_Fixup2 (int bytemode, int sizeflag)
14547 {
14548   if (modrm.mod != 3)
14549     {
14550       if (prefixes & PREFIX_REPZ)
14551         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14552       if (prefixes & PREFIX_REPNZ)
14553         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14554     }
14555
14556   OP_E (bytemode, sizeflag);
14557 }
14558
14559 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
14560    "xrelease" for memory operand.  No check for LOCK prefix.   */
14561
14562 static void
14563 HLE_Fixup3 (int bytemode, int sizeflag)
14564 {
14565   if (modrm.mod != 3
14566       && last_repz_prefix > last_repnz_prefix
14567       && (prefixes & PREFIX_REPZ) != 0)
14568     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14569
14570   OP_E (bytemode, sizeflag);
14571 }
14572
14573 static void
14574 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14575 {
14576   USED_REX (REX_W);
14577   if (rex & REX_W)
14578     {
14579       /* Change cmpxchg8b to cmpxchg16b.  */
14580       char *p = mnemonicendp - 2;
14581       mnemonicendp = stpcpy (p, "16b");
14582       bytemode = o_mode;
14583     }
14584   else if ((prefixes & PREFIX_LOCK) != 0)
14585     {
14586       if (prefixes & PREFIX_REPZ)
14587         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
14588       if (prefixes & PREFIX_REPNZ)
14589         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
14590     }
14591
14592   OP_M (bytemode, sizeflag);
14593 }
14594
14595 static void
14596 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14597 {
14598   const char **names;
14599
14600   if (need_vex)
14601     {
14602       switch (vex.length)
14603         {
14604         case 128:
14605           names = names_xmm;
14606           break;
14607         case 256:
14608           names = names_ymm;
14609           break;
14610         default:
14611           abort ();
14612         }
14613     }
14614   else
14615     names = names_xmm;
14616   oappend (names[reg]);
14617 }
14618
14619 static void
14620 CRC32_Fixup (int bytemode, int sizeflag)
14621 {
14622   /* Add proper suffix to "crc32".  */
14623   char *p = mnemonicendp;
14624
14625   switch (bytemode)
14626     {
14627     case b_mode:
14628       if (intel_syntax)
14629         goto skip;
14630
14631       *p++ = 'b';
14632       break;
14633     case v_mode:
14634       if (intel_syntax)
14635         goto skip;
14636
14637       USED_REX (REX_W);
14638       if (rex & REX_W)
14639         *p++ = 'q';
14640       else
14641         {
14642           if (sizeflag & DFLAG)
14643             *p++ = 'l';
14644           else
14645             *p++ = 'w';
14646           used_prefixes |= (prefixes & PREFIX_DATA);
14647         }
14648       break;
14649     default:
14650       oappend (INTERNAL_DISASSEMBLER_ERROR);
14651       break;
14652     }
14653   mnemonicendp = p;
14654   *p = '\0';
14655
14656 skip:
14657   if (modrm.mod == 3)
14658     {
14659       int add;
14660
14661       /* Skip mod/rm byte.  */
14662       MODRM_CHECK;
14663       codep++;
14664
14665       USED_REX (REX_B);
14666       add = (rex & REX_B) ? 8 : 0;
14667       if (bytemode == b_mode)
14668         {
14669           USED_REX (0);
14670           if (rex)
14671             oappend (names8rex[modrm.rm + add]);
14672           else
14673             oappend (names8[modrm.rm + add]);
14674         }
14675       else
14676         {
14677           USED_REX (REX_W);
14678           if (rex & REX_W)
14679             oappend (names64[modrm.rm + add]);
14680           else if ((prefixes & PREFIX_DATA))
14681             oappend (names16[modrm.rm + add]);
14682           else
14683             oappend (names32[modrm.rm + add]);
14684         }
14685     }
14686   else
14687     OP_E (bytemode, sizeflag);
14688 }
14689
14690 static void
14691 FXSAVE_Fixup (int bytemode, int sizeflag)
14692 {
14693   /* Add proper suffix to "fxsave" and "fxrstor".  */
14694   USED_REX (REX_W);
14695   if (rex & REX_W)
14696     {
14697       char *p = mnemonicendp;
14698       *p++ = '6';
14699       *p++ = '4';
14700       *p = '\0';
14701       mnemonicendp = p;
14702     }
14703   OP_M (bytemode, sizeflag);
14704 }
14705
14706 /* Display the destination register operand for instructions with
14707    VEX. */
14708
14709 static void
14710 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14711 {
14712   int reg;
14713   const char **names;
14714
14715   if (!need_vex)
14716     abort ();
14717
14718   if (!need_vex_reg)
14719     return;
14720
14721   reg = vex.register_specifier;
14722   if (bytemode == vex_scalar_mode)
14723     {
14724       oappend (names_xmm[reg]);
14725       return;
14726     }
14727
14728   switch (vex.length)
14729     {
14730     case 128:
14731       switch (bytemode)
14732         {
14733         case vex_mode:
14734         case vex128_mode:
14735         case vex_vsib_q_w_dq_mode:
14736           names = names_xmm;
14737           break;
14738         case dq_mode:
14739           if (vex.w)
14740             names = names64;
14741           else
14742             names = names32;
14743           break;
14744         default:
14745           abort ();
14746           return;
14747         }
14748       break;
14749     case 256:
14750       switch (bytemode)
14751         {
14752         case vex_mode:
14753         case vex256_mode:
14754           names = names_ymm;
14755           break;
14756         case vex_vsib_q_w_dq_mode:
14757           names = vex.w ? names_ymm : names_xmm;
14758           break;
14759         default:
14760           abort ();
14761           return;
14762         }
14763       break;
14764     default:
14765       abort ();
14766       break;
14767     }
14768   oappend (names[reg]);
14769 }
14770
14771 /* Get the VEX immediate byte without moving codep.  */
14772
14773 static unsigned char
14774 get_vex_imm8 (int sizeflag, int opnum)
14775 {
14776   int bytes_before_imm = 0;
14777
14778   if (modrm.mod != 3)
14779     {
14780       /* There are SIB/displacement bytes.  */
14781       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14782         {
14783           /* 32/64 bit address mode */
14784           int base = modrm.rm;
14785
14786           /* Check SIB byte.  */
14787           if (base == 4)
14788             {
14789               FETCH_DATA (the_info, codep + 1);
14790               base = *codep & 7;
14791               /* When decoding the third source, don't increase
14792                  bytes_before_imm as this has already been incremented
14793                  by one in OP_E_memory while decoding the second
14794                  source operand.  */
14795               if (opnum == 0)
14796                 bytes_before_imm++;
14797             }
14798
14799           /* Don't increase bytes_before_imm when decoding the third source,
14800              it has already been incremented by OP_E_memory while decoding
14801              the second source operand.  */
14802           if (opnum == 0)
14803             {
14804               switch (modrm.mod)
14805                 {
14806                   case 0:
14807                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
14808                        SIB == 5, there is a 4 byte displacement.  */
14809                     if (base != 5)
14810                       /* No displacement. */
14811                       break;
14812                   case 2:
14813                     /* 4 byte displacement.  */
14814                     bytes_before_imm += 4;
14815                     break;
14816                   case 1:
14817                     /* 1 byte displacement.  */
14818                     bytes_before_imm++;
14819                     break;
14820                 }
14821             }
14822         }
14823       else
14824         {
14825           /* 16 bit address mode */
14826           /* Don't increase bytes_before_imm when decoding the third source,
14827              it has already been incremented by OP_E_memory while decoding
14828              the second source operand.  */
14829           if (opnum == 0)
14830             {
14831               switch (modrm.mod)
14832                 {
14833                 case 0:
14834                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
14835                   if (modrm.rm != 6)
14836                     /* No displacement. */
14837                     break;
14838                 case 2:
14839                   /* 2 byte displacement.  */
14840                   bytes_before_imm += 2;
14841                   break;
14842                 case 1:
14843                   /* 1 byte displacement: when decoding the third source,
14844                      don't increase bytes_before_imm as this has already
14845                      been incremented by one in OP_E_memory while decoding
14846                      the second source operand.  */
14847                   if (opnum == 0)
14848                     bytes_before_imm++;
14849
14850                   break;
14851                 }
14852             }
14853         }
14854     }
14855
14856   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14857   return codep [bytes_before_imm];
14858 }
14859
14860 static void
14861 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14862 {
14863   const char **names;
14864
14865   if (reg == -1 && modrm.mod != 3)
14866     {
14867       OP_E_memory (bytemode, sizeflag);
14868       return;
14869     }
14870   else
14871     {
14872       if (reg == -1)
14873         {
14874           reg = modrm.rm;
14875           USED_REX (REX_B);
14876           if (rex & REX_B)
14877             reg += 8;
14878         }
14879       else if (reg > 7 && address_mode != mode_64bit)
14880         BadOp ();
14881     }
14882
14883   switch (vex.length)
14884     {
14885     case 128:
14886       names = names_xmm;
14887       break;
14888     case 256:
14889       names = names_ymm;
14890       break;
14891     default:
14892       abort ();
14893     }
14894   oappend (names[reg]);
14895 }
14896
14897 static void
14898 OP_EX_VexImmW (int bytemode, int sizeflag)
14899 {
14900   int reg = -1;
14901   static unsigned char vex_imm8;
14902
14903   if (vex_w_done == 0)
14904     {
14905       vex_w_done = 1;
14906
14907       /* Skip mod/rm byte.  */
14908       MODRM_CHECK;
14909       codep++;
14910
14911       vex_imm8 = get_vex_imm8 (sizeflag, 0);
14912
14913       if (vex.w)
14914           reg = vex_imm8 >> 4;
14915
14916       OP_EX_VexReg (bytemode, sizeflag, reg);
14917     }
14918   else if (vex_w_done == 1)
14919     {
14920       vex_w_done = 2;
14921
14922       if (!vex.w)
14923           reg = vex_imm8 >> 4;
14924
14925       OP_EX_VexReg (bytemode, sizeflag, reg);
14926     }
14927   else
14928     {
14929       /* Output the imm8 directly.  */
14930       scratchbuf[0] = '$';
14931       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
14932       oappend (scratchbuf + intel_syntax);
14933       scratchbuf[0] = '\0';
14934       codep++;
14935     }
14936 }
14937
14938 static void
14939 OP_Vex_2src (int bytemode, int sizeflag)
14940 {
14941   if (modrm.mod == 3)
14942     {
14943       int reg = modrm.rm;
14944       USED_REX (REX_B);
14945       if (rex & REX_B)
14946         reg += 8;
14947       oappend (names_xmm[reg]);
14948     }
14949   else
14950     {
14951       if (intel_syntax
14952           && (bytemode == v_mode || bytemode == v_swap_mode))
14953         {
14954           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14955           used_prefixes |= (prefixes & PREFIX_DATA);
14956         }
14957       OP_E (bytemode, sizeflag);
14958     }
14959 }
14960
14961 static void
14962 OP_Vex_2src_1 (int bytemode, int sizeflag)
14963 {
14964   if (modrm.mod == 3)
14965     {
14966       /* Skip mod/rm byte.   */
14967       MODRM_CHECK;
14968       codep++;
14969     }
14970
14971   if (vex.w)
14972     oappend (names_xmm[vex.register_specifier]);
14973   else
14974     OP_Vex_2src (bytemode, sizeflag);
14975 }
14976
14977 static void
14978 OP_Vex_2src_2 (int bytemode, int sizeflag)
14979 {
14980   if (vex.w)
14981     OP_Vex_2src (bytemode, sizeflag);
14982   else
14983     oappend (names_xmm[vex.register_specifier]);
14984 }
14985
14986 static void
14987 OP_EX_VexW (int bytemode, int sizeflag)
14988 {
14989   int reg = -1;
14990
14991   if (!vex_w_done)
14992     {
14993       vex_w_done = 1;
14994
14995       /* Skip mod/rm byte.  */
14996       MODRM_CHECK;
14997       codep++;
14998
14999       if (vex.w)
15000         reg = get_vex_imm8 (sizeflag, 0) >> 4;
15001     }
15002   else
15003     {
15004       if (!vex.w)
15005         reg = get_vex_imm8 (sizeflag, 1) >> 4;
15006     }
15007
15008   OP_EX_VexReg (bytemode, sizeflag, reg);
15009 }
15010
15011 static void
15012 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
15013              int sizeflag ATTRIBUTE_UNUSED)
15014 {
15015   /* Skip the immediate byte and check for invalid bits.  */
15016   FETCH_DATA (the_info, codep + 1);
15017   if (*codep++ & 0xf)
15018     BadOp ();
15019 }
15020
15021 static void
15022 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15023 {
15024   int reg;
15025   const char **names;
15026
15027   FETCH_DATA (the_info, codep + 1);
15028   reg = *codep++;
15029
15030   if (bytemode != x_mode)
15031     abort ();
15032
15033   if (reg & 0xf)
15034       BadOp ();
15035
15036   reg >>= 4;
15037   if (reg > 7 && address_mode != mode_64bit)
15038     BadOp ();
15039
15040   switch (vex.length)
15041     {
15042     case 128:
15043       names = names_xmm;
15044       break;
15045     case 256:
15046       names = names_ymm;
15047       break;
15048     default:
15049       abort ();
15050     }
15051   oappend (names[reg]);
15052 }
15053
15054 static void
15055 OP_XMM_VexW (int bytemode, int sizeflag)
15056 {
15057   /* Turn off the REX.W bit since it is used for swapping operands
15058      now.  */
15059   rex &= ~REX_W;
15060   OP_XMM (bytemode, sizeflag);
15061 }
15062
15063 static void
15064 OP_EX_Vex (int bytemode, int sizeflag)
15065 {
15066   if (modrm.mod != 3)
15067     {
15068       if (vex.register_specifier != 0)
15069         BadOp ();
15070       need_vex_reg = 0;
15071     }
15072   OP_EX (bytemode, sizeflag);
15073 }
15074
15075 static void
15076 OP_XMM_Vex (int bytemode, int sizeflag)
15077 {
15078   if (modrm.mod != 3)
15079     {
15080       if (vex.register_specifier != 0)
15081         BadOp ();
15082       need_vex_reg = 0;
15083     }
15084   OP_XMM (bytemode, sizeflag);
15085 }
15086
15087 static void
15088 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15089 {
15090   switch (vex.length)
15091     {
15092     case 128:
15093       mnemonicendp = stpcpy (obuf, "vzeroupper");
15094       break;
15095     case 256:
15096       mnemonicendp = stpcpy (obuf, "vzeroall");
15097       break;
15098     default:
15099       abort ();
15100     }
15101 }
15102
15103 static struct op vex_cmp_op[] =
15104 {
15105   { STRING_COMMA_LEN ("eq") },
15106   { STRING_COMMA_LEN ("lt") },
15107   { STRING_COMMA_LEN ("le") },
15108   { STRING_COMMA_LEN ("unord") },
15109   { STRING_COMMA_LEN ("neq") },
15110   { STRING_COMMA_LEN ("nlt") },
15111   { STRING_COMMA_LEN ("nle") },
15112   { STRING_COMMA_LEN ("ord") },
15113   { STRING_COMMA_LEN ("eq_uq") },
15114   { STRING_COMMA_LEN ("nge") },
15115   { STRING_COMMA_LEN ("ngt") },
15116   { STRING_COMMA_LEN ("false") },
15117   { STRING_COMMA_LEN ("neq_oq") },
15118   { STRING_COMMA_LEN ("ge") },
15119   { STRING_COMMA_LEN ("gt") },
15120   { STRING_COMMA_LEN ("true") },
15121   { STRING_COMMA_LEN ("eq_os") },
15122   { STRING_COMMA_LEN ("lt_oq") },
15123   { STRING_COMMA_LEN ("le_oq") },
15124   { STRING_COMMA_LEN ("unord_s") },
15125   { STRING_COMMA_LEN ("neq_us") },
15126   { STRING_COMMA_LEN ("nlt_uq") },
15127   { STRING_COMMA_LEN ("nle_uq") },
15128   { STRING_COMMA_LEN ("ord_s") },
15129   { STRING_COMMA_LEN ("eq_us") },
15130   { STRING_COMMA_LEN ("nge_uq") },
15131   { STRING_COMMA_LEN ("ngt_uq") },
15132   { STRING_COMMA_LEN ("false_os") },
15133   { STRING_COMMA_LEN ("neq_os") },
15134   { STRING_COMMA_LEN ("ge_oq") },
15135   { STRING_COMMA_LEN ("gt_oq") },
15136   { STRING_COMMA_LEN ("true_us") },
15137 };
15138
15139 static void
15140 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15141 {
15142   unsigned int cmp_type;
15143
15144   FETCH_DATA (the_info, codep + 1);
15145   cmp_type = *codep++ & 0xff;
15146   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
15147     {
15148       char suffix [3];
15149       char *p = mnemonicendp - 2;
15150       suffix[0] = p[0];
15151       suffix[1] = p[1];
15152       suffix[2] = '\0';
15153       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
15154       mnemonicendp += vex_cmp_op[cmp_type].len;
15155     }
15156   else
15157     {
15158       /* We have a reserved extension byte.  Output it directly.  */
15159       scratchbuf[0] = '$';
15160       print_operand_value (scratchbuf + 1, 1, cmp_type);
15161       oappend (scratchbuf + intel_syntax);
15162       scratchbuf[0] = '\0';
15163     }
15164 }
15165
15166 static const struct op pclmul_op[] =
15167 {
15168   { STRING_COMMA_LEN ("lql") },
15169   { STRING_COMMA_LEN ("hql") },
15170   { STRING_COMMA_LEN ("lqh") },
15171   { STRING_COMMA_LEN ("hqh") }
15172 };
15173
15174 static void
15175 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
15176               int sizeflag ATTRIBUTE_UNUSED)
15177 {
15178   unsigned int pclmul_type;
15179
15180   FETCH_DATA (the_info, codep + 1);
15181   pclmul_type = *codep++ & 0xff;
15182   switch (pclmul_type)
15183     {
15184     case 0x10:
15185       pclmul_type = 2;
15186       break;
15187     case 0x11:
15188       pclmul_type = 3;
15189       break;
15190     default:
15191       break;
15192     }
15193   if (pclmul_type < ARRAY_SIZE (pclmul_op))
15194     {
15195       char suffix [4];
15196       char *p = mnemonicendp - 3;
15197       suffix[0] = p[0];
15198       suffix[1] = p[1];
15199       suffix[2] = p[2];
15200       suffix[3] = '\0';
15201       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
15202       mnemonicendp += pclmul_op[pclmul_type].len;
15203     }
15204   else
15205     {
15206       /* We have a reserved extension byte.  Output it directly.  */
15207       scratchbuf[0] = '$';
15208       print_operand_value (scratchbuf + 1, 1, pclmul_type);
15209       oappend (scratchbuf + intel_syntax);
15210       scratchbuf[0] = '\0';
15211     }
15212 }
15213
15214 static void
15215 MOVBE_Fixup (int bytemode, int sizeflag)
15216 {
15217   /* Add proper suffix to "movbe".  */
15218   char *p = mnemonicendp;
15219
15220   switch (bytemode)
15221     {
15222     case v_mode:
15223       if (intel_syntax)
15224         goto skip;
15225
15226       USED_REX (REX_W);
15227       if (sizeflag & SUFFIX_ALWAYS)
15228         {
15229           if (rex & REX_W)
15230             *p++ = 'q';
15231           else
15232             {
15233               if (sizeflag & DFLAG)
15234                 *p++ = 'l';
15235               else
15236                 *p++ = 'w';
15237               used_prefixes |= (prefixes & PREFIX_DATA);
15238             }
15239         }
15240       break;
15241     default:
15242       oappend (INTERNAL_DISASSEMBLER_ERROR);
15243       break;
15244     }
15245   mnemonicendp = p;
15246   *p = '\0';
15247
15248 skip:
15249   OP_M (bytemode, sizeflag);
15250 }
15251
15252 static void
15253 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15254 {
15255   int reg;
15256   const char **names;
15257
15258   /* Skip mod/rm byte.  */
15259   MODRM_CHECK;
15260   codep++;
15261
15262   if (vex.w)
15263     names = names64;
15264   else
15265     names = names32;
15266
15267   reg = modrm.rm;
15268   USED_REX (REX_B);
15269   if (rex & REX_B)
15270     reg += 8;
15271
15272   oappend (names[reg]);
15273 }
15274
15275 static void
15276 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15277 {
15278   const char **names;
15279
15280   if (vex.w)
15281     names = names64;
15282   else
15283     names = names32;
15284
15285   oappend (names[vex.register_specifier]);
15286 }