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