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