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