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