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