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