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