Remove trailing { Bad_Opcode }.
[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     { Bad_Opcode },
8597   },
8598
8599   /* VEX_LEN_F3_P_2 */
8600   {
8601     { VEX_W_TABLE (VEX_W_F3_P_2) },
8602   },
8603
8604   /* VEX_LEN_F4_P_2 */
8605   {
8606     { VEX_W_TABLE (VEX_W_F4_P_2) },
8607   },
8608
8609   /* VEX_LEN_F5_P_2 */
8610   {
8611     { VEX_W_TABLE (VEX_W_F5_P_2) },
8612   },
8613
8614   /* VEX_LEN_F6_P_2 */
8615   {
8616     { VEX_W_TABLE (VEX_W_F6_P_2) },
8617   },
8618
8619   /* VEX_LEN_F7_P_2 */
8620   {
8621     { VEX_W_TABLE (VEX_W_F7_P_2) },
8622   },
8623
8624   /* VEX_LEN_F8_P_2 */
8625   {
8626     { VEX_W_TABLE (VEX_W_F8_P_2) },
8627   },
8628
8629   /* VEX_LEN_F9_P_2 */
8630   {
8631     { VEX_W_TABLE (VEX_W_F9_P_2) },
8632   },
8633
8634   /* VEX_LEN_FA_P_2 */
8635   {
8636     { VEX_W_TABLE (VEX_W_FA_P_2) },
8637   },
8638
8639   /* VEX_LEN_FB_P_2 */
8640   {
8641     { VEX_W_TABLE (VEX_W_FB_P_2) },
8642   },
8643
8644   /* VEX_LEN_FC_P_2 */
8645   {
8646     { VEX_W_TABLE (VEX_W_FC_P_2) },
8647   },
8648
8649   /* VEX_LEN_FD_P_2 */
8650   {
8651     { VEX_W_TABLE (VEX_W_FD_P_2) },
8652   },
8653
8654   /* VEX_LEN_FE_P_2 */
8655   {
8656     { VEX_W_TABLE (VEX_W_FE_P_2) },
8657   },
8658
8659   /* VEX_LEN_3800_P_2 */
8660   {
8661     { VEX_W_TABLE (VEX_W_3800_P_2) },
8662   },
8663
8664   /* VEX_LEN_3801_P_2 */
8665   {
8666     { VEX_W_TABLE (VEX_W_3801_P_2) },
8667   },
8668
8669   /* VEX_LEN_3802_P_2 */
8670   {
8671     { VEX_W_TABLE (VEX_W_3802_P_2) },
8672   },
8673
8674   /* VEX_LEN_3803_P_2 */
8675   {
8676     { VEX_W_TABLE (VEX_W_3803_P_2) },
8677   },
8678
8679   /* VEX_LEN_3804_P_2 */
8680   {
8681     { VEX_W_TABLE (VEX_W_3804_P_2) },
8682   },
8683
8684   /* VEX_LEN_3805_P_2 */
8685   {
8686     { VEX_W_TABLE (VEX_W_3805_P_2) },
8687   },
8688
8689   /* VEX_LEN_3806_P_2 */
8690   {
8691     { VEX_W_TABLE (VEX_W_3806_P_2) },
8692   },
8693
8694   /* VEX_LEN_3807_P_2 */
8695   {
8696     { VEX_W_TABLE (VEX_W_3807_P_2) },
8697   },
8698
8699   /* VEX_LEN_3808_P_2 */
8700   {
8701     { VEX_W_TABLE (VEX_W_3808_P_2) },
8702   },
8703
8704   /* VEX_LEN_3809_P_2 */
8705   {
8706     { VEX_W_TABLE (VEX_W_3809_P_2) },
8707   },
8708
8709   /* VEX_LEN_380A_P_2 */
8710   {
8711     { VEX_W_TABLE (VEX_W_380A_P_2) },
8712   },
8713
8714   /* VEX_LEN_380B_P_2 */
8715   {
8716     { VEX_W_TABLE (VEX_W_380B_P_2) },
8717   },
8718
8719   /* VEX_LEN_3819_P_2_M_0 */
8720   {
8721     { Bad_Opcode },
8722     { VEX_W_TABLE (VEX_W_3819_P_2_M_0) },
8723   },
8724
8725   /* VEX_LEN_381A_P_2_M_0 */
8726   {
8727     { Bad_Opcode },
8728     { VEX_W_TABLE (VEX_W_381A_P_2_M_0) },
8729   },
8730
8731   /* VEX_LEN_381C_P_2 */
8732   {
8733     { VEX_W_TABLE (VEX_W_381C_P_2) },
8734   },
8735
8736   /* VEX_LEN_381D_P_2 */
8737   {
8738     { VEX_W_TABLE (VEX_W_381D_P_2) },
8739   },
8740
8741   /* VEX_LEN_381E_P_2 */
8742   {
8743     { VEX_W_TABLE (VEX_W_381E_P_2) },
8744   },
8745
8746   /* VEX_LEN_3820_P_2 */
8747   {
8748     { VEX_W_TABLE (VEX_W_3820_P_2) },
8749   },
8750
8751   /* VEX_LEN_3821_P_2 */
8752   {
8753     { VEX_W_TABLE (VEX_W_3821_P_2) },
8754   },
8755
8756   /* VEX_LEN_3822_P_2 */
8757   {
8758     { VEX_W_TABLE (VEX_W_3822_P_2) },
8759   },
8760
8761   /* VEX_LEN_3823_P_2 */
8762   {
8763     { VEX_W_TABLE (VEX_W_3823_P_2) },
8764   },
8765
8766   /* VEX_LEN_3824_P_2 */
8767   {
8768     { VEX_W_TABLE (VEX_W_3824_P_2) },
8769   },
8770
8771   /* VEX_LEN_3825_P_2 */
8772   {
8773     { VEX_W_TABLE (VEX_W_3825_P_2) },
8774   },
8775
8776   /* VEX_LEN_3828_P_2 */
8777   {
8778     { VEX_W_TABLE (VEX_W_3828_P_2) },
8779   },
8780
8781   /* VEX_LEN_3829_P_2 */
8782   {
8783     { VEX_W_TABLE (VEX_W_3829_P_2) },
8784   },
8785
8786   /* VEX_LEN_382A_P_2_M_0 */
8787   {
8788     { VEX_W_TABLE (VEX_W_382A_P_2_M_0) },
8789   },
8790
8791   /* VEX_LEN_382B_P_2 */
8792   {
8793     { VEX_W_TABLE (VEX_W_382B_P_2) },
8794   },
8795
8796   /* VEX_LEN_3830_P_2 */
8797   {
8798     { VEX_W_TABLE (VEX_W_3830_P_2) },
8799   },
8800
8801   /* VEX_LEN_3831_P_2 */
8802   {
8803     { VEX_W_TABLE (VEX_W_3831_P_2) },
8804   },
8805
8806   /* VEX_LEN_3832_P_2 */
8807   {
8808     { VEX_W_TABLE (VEX_W_3832_P_2) },
8809   },
8810
8811   /* VEX_LEN_3833_P_2 */
8812   {
8813     { VEX_W_TABLE (VEX_W_3833_P_2) },
8814   },
8815
8816   /* VEX_LEN_3834_P_2 */
8817   {
8818     { VEX_W_TABLE (VEX_W_3834_P_2) },
8819   },
8820
8821   /* VEX_LEN_3835_P_2 */
8822   {
8823     { VEX_W_TABLE (VEX_W_3835_P_2) },
8824   },
8825
8826   /* VEX_LEN_3837_P_2 */
8827   {
8828     { VEX_W_TABLE (VEX_W_3837_P_2) },
8829   },
8830
8831   /* VEX_LEN_3838_P_2 */
8832   {
8833     { VEX_W_TABLE (VEX_W_3838_P_2) },
8834   },
8835
8836   /* VEX_LEN_3839_P_2 */
8837   {
8838     { VEX_W_TABLE (VEX_W_3839_P_2) },
8839   },
8840
8841   /* VEX_LEN_383A_P_2 */
8842   {
8843     { VEX_W_TABLE (VEX_W_383A_P_2) },
8844   },
8845
8846   /* VEX_LEN_383B_P_2 */
8847   {
8848     { VEX_W_TABLE (VEX_W_383B_P_2) },
8849   },
8850
8851   /* VEX_LEN_383C_P_2 */
8852   {
8853     { VEX_W_TABLE (VEX_W_383C_P_2) },
8854   },
8855
8856   /* VEX_LEN_383D_P_2 */
8857   {
8858     { VEX_W_TABLE (VEX_W_383D_P_2) },
8859   },
8860
8861   /* VEX_LEN_383E_P_2 */
8862   {
8863     { VEX_W_TABLE (VEX_W_383E_P_2) },
8864   },
8865
8866   /* VEX_LEN_383F_P_2 */
8867   {
8868     { VEX_W_TABLE (VEX_W_383F_P_2) },
8869   },
8870
8871   /* VEX_LEN_3840_P_2 */
8872   {
8873     { VEX_W_TABLE (VEX_W_3840_P_2) },
8874   },
8875
8876   /* VEX_LEN_3841_P_2 */
8877   {
8878     { VEX_W_TABLE (VEX_W_3841_P_2) },
8879   },
8880
8881   /* VEX_LEN_38DB_P_2 */
8882   {
8883     { VEX_W_TABLE (VEX_W_38DB_P_2) },
8884   },
8885
8886   /* VEX_LEN_38DC_P_2 */
8887   {
8888     { VEX_W_TABLE (VEX_W_38DC_P_2) },
8889   },
8890
8891   /* VEX_LEN_38DD_P_2 */
8892   {
8893     { VEX_W_TABLE (VEX_W_38DD_P_2) },
8894   },
8895
8896   /* VEX_LEN_38DE_P_2 */
8897   {
8898     { VEX_W_TABLE (VEX_W_38DE_P_2) },
8899   },
8900
8901   /* VEX_LEN_38DF_P_2 */
8902   {
8903     { VEX_W_TABLE (VEX_W_38DF_P_2) },
8904   },
8905
8906   /* VEX_LEN_3A06_P_2 */
8907   {
8908     { Bad_Opcode },
8909     { VEX_W_TABLE (VEX_W_3A06_P_2) },
8910   },
8911
8912   /* VEX_LEN_3A0A_P_2 */
8913   {
8914     { VEX_W_TABLE (VEX_W_3A0A_P_2) },
8915   },
8916
8917   /* VEX_LEN_3A0B_P_2 */
8918   {
8919     { VEX_W_TABLE (VEX_W_3A0B_P_2) },
8920   },
8921
8922   /* VEX_LEN_3A0E_P_2 */
8923   {
8924     { VEX_W_TABLE (VEX_W_3A0E_P_2) },
8925   },
8926
8927   /* VEX_LEN_3A0F_P_2 */
8928   {
8929     { VEX_W_TABLE (VEX_W_3A0F_P_2) },
8930   },
8931
8932   /* VEX_LEN_3A14_P_2 */
8933   {
8934     { VEX_W_TABLE (VEX_W_3A14_P_2) },
8935   },
8936
8937   /* VEX_LEN_3A15_P_2 */
8938   {
8939     { VEX_W_TABLE (VEX_W_3A15_P_2) },
8940   },
8941
8942   /* VEX_LEN_3A16_P_2  */
8943   {
8944     { "vpextrK",        { Edq, XM, Ib } },
8945   },
8946
8947   /* VEX_LEN_3A17_P_2 */
8948   {
8949     { "vextractps",     { Edqd, XM, Ib } },
8950   },
8951
8952   /* VEX_LEN_3A18_P_2 */
8953   {
8954     { Bad_Opcode },
8955     { VEX_W_TABLE (VEX_W_3A18_P_2) },
8956   },
8957
8958   /* VEX_LEN_3A19_P_2 */
8959   {
8960     { Bad_Opcode },
8961     { VEX_W_TABLE (VEX_W_3A19_P_2) },
8962   },
8963
8964   /* VEX_LEN_3A20_P_2 */
8965   {
8966     { VEX_W_TABLE (VEX_W_3A20_P_2) },
8967   },
8968
8969   /* VEX_LEN_3A21_P_2 */
8970   {
8971     { VEX_W_TABLE (VEX_W_3A21_P_2) },
8972   },
8973
8974   /* VEX_LEN_3A22_P_2 */
8975   {
8976     { "vpinsrK",        { XM, Vex128, Edq, Ib } },
8977   },
8978
8979   /* VEX_LEN_3A41_P_2 */
8980   {
8981     { VEX_W_TABLE (VEX_W_3A41_P_2) },
8982   },
8983
8984   /* VEX_LEN_3A42_P_2 */
8985   {
8986     { VEX_W_TABLE (VEX_W_3A42_P_2) },
8987   },
8988
8989   /* VEX_LEN_3A44_P_2 */
8990   {
8991     { VEX_W_TABLE (VEX_W_3A44_P_2) },
8992   },
8993
8994   /* VEX_LEN_3A4C_P_2 */
8995   {
8996     { VEX_W_TABLE (VEX_W_3A4C_P_2) },
8997   },
8998
8999   /* VEX_LEN_3A60_P_2 */
9000   {
9001     { VEX_W_TABLE (VEX_W_3A60_P_2) },
9002   },
9003
9004   /* VEX_LEN_3A61_P_2 */
9005   {
9006     { VEX_W_TABLE (VEX_W_3A61_P_2) },
9007   },
9008
9009   /* VEX_LEN_3A62_P_2 */
9010   {
9011     { VEX_W_TABLE (VEX_W_3A62_P_2) },
9012   },
9013
9014   /* VEX_LEN_3A63_P_2 */
9015   {
9016     { VEX_W_TABLE (VEX_W_3A63_P_2) },
9017   },
9018
9019   /* VEX_LEN_3A6A_P_2 */
9020   {
9021     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9022   },
9023
9024   /* VEX_LEN_3A6B_P_2 */
9025   {
9026     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9027   },
9028
9029   /* VEX_LEN_3A6E_P_2 */
9030   {
9031     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9032   },
9033
9034   /* VEX_LEN_3A6F_P_2 */
9035   {
9036     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9037   },
9038
9039   /* VEX_LEN_3A7A_P_2 */
9040   {
9041     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9042   },
9043
9044   /* VEX_LEN_3A7B_P_2 */
9045   {
9046     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9047   },
9048
9049   /* VEX_LEN_3A7E_P_2 */
9050   {
9051     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9052   },
9053
9054   /* VEX_LEN_3A7F_P_2 */
9055   {
9056     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9057   },
9058
9059   /* VEX_LEN_3ADF_P_2 */
9060   {
9061     { VEX_W_TABLE (VEX_W_3ADF_P_2) },
9062   },
9063
9064   /* VEX_LEN_XOP_09_80 */
9065   {
9066     { "vfrczps",        { XM, EXxmm } },
9067     { "vfrczps",        { XM, EXymmq } },
9068   },
9069
9070   /* VEX_LEN_XOP_09_81 */
9071   {
9072     { "vfrczpd",        { XM, EXxmm } },
9073     { "vfrczpd",        { XM, EXymmq } },
9074   },
9075 };
9076
9077 static const struct dis386 vex_w_table[][2] = {
9078   {
9079     /* VEX_W_10_P_0 */
9080     { "vmovups",        { XM, EXx } },
9081   },
9082   {
9083     /* VEX_W_10_P_1 */
9084     { "vmovss",         { XMVex, Vex128, EXd } },
9085   },
9086   {
9087     /* VEX_W_10_P_2 */
9088     { "vmovupd",        { XM, EXx } },
9089   },
9090   {
9091     /* VEX_W_10_P_3 */
9092     { "vmovsd",         { XMVex, Vex128, EXq } },
9093   },
9094   {
9095     /* VEX_W_11_P_0 */
9096     { "vmovups",        { EXxS, XM } },
9097   },
9098   {
9099     /* VEX_W_11_P_1 */
9100     { "vmovss",         { EXdVexS, Vex128, XM } },
9101   },
9102   {
9103     /* VEX_W_11_P_2 */
9104     { "vmovupd",        { EXxS, XM } },
9105   },
9106   {
9107     /* VEX_W_11_P_3 */
9108     { "vmovsd",         { EXqVexS, Vex128, XM } },
9109   },
9110   {
9111     /* VEX_W_12_P_0_M_0 */
9112     { "vmovlps",        { XM, Vex128, EXq } },
9113   },
9114   {
9115     /* VEX_W_12_P_0_M_1 */
9116     { "vmovhlps",       { XM, Vex128, EXq } },
9117   },
9118   {
9119     /* VEX_W_12_P_1 */
9120     { "vmovsldup",      { XM, EXx } },
9121   },
9122   {
9123     /* VEX_W_12_P_2 */
9124     { "vmovlpd",        { XM, Vex128, EXq } },
9125   },
9126   {
9127     /* VEX_W_12_P_3 */
9128     { "vmovddup",       { XM, EXymmq } },
9129   },
9130   {
9131     /* VEX_W_13_M_0 */
9132     { "vmovlpX",        { EXq, XM } },
9133   },
9134   {
9135     /* VEX_W_14 */
9136     { "vunpcklpX",      { XM, Vex, EXx } },
9137   },
9138   {
9139     /* VEX_W_15 */
9140     { "vunpckhpX",      { XM, Vex, EXx } },
9141   },
9142   {
9143     /* VEX_W_16_P_0_M_0 */
9144     { "vmovhps",        { XM, Vex128, EXq } },
9145   },
9146   {
9147     /* VEX_W_16_P_0_M_1 */
9148     { "vmovlhps",       { XM, Vex128, EXq } },
9149   },
9150   {
9151     /* VEX_W_16_P_1 */
9152     { "vmovshdup",      { XM, EXx } },
9153   },
9154   {
9155     /* VEX_W_16_P_2 */
9156     { "vmovhpd",        { XM, Vex128, EXq } },
9157   },
9158   {
9159     /* VEX_W_17_M_0 */
9160     { "vmovhpX",        { EXq, XM } },
9161   },
9162   {
9163     /* VEX_W_28 */
9164     { "vmovapX",        { XM, EXx } },
9165   },
9166   {
9167     /* VEX_W_29 */
9168     { "vmovapX",        { EXxS, XM } },
9169   },
9170   {
9171     /* VEX_W_2B_M_0 */
9172     { "vmovntpX",       { Mx, XM } },
9173   },
9174   {
9175     /* VEX_W_2E_P_0 */
9176     { "vucomiss",       { XM, EXd } }, 
9177   },
9178   {
9179     /* VEX_W_2E_P_2 */
9180     { "vucomisd",       { XM, EXq } }, 
9181   },
9182   {
9183     /* VEX_W_2F_P_0 */
9184     { "vcomiss",        { XM, EXd } },
9185   },
9186   {
9187     /* VEX_W_2F_P_2 */
9188     { "vcomisd",        { XM, EXq } },
9189   },
9190   {
9191     /* VEX_W_50_M_0 */
9192     { "vmovmskpX",      { Gdq, XS } },
9193   },
9194   {
9195     /* VEX_W_51_P_0 */
9196     { "vsqrtps",        { XM, EXx } },
9197   },
9198   {
9199     /* VEX_W_51_P_1 */
9200     { "vsqrtss",        { XM, Vex128, EXd } },
9201   },
9202   {
9203     /* VEX_W_51_P_2  */
9204     { "vsqrtpd",        { XM, EXx } },
9205   },
9206   {
9207     /* VEX_W_51_P_3 */
9208     { "vsqrtsd",        { XM, Vex128, EXq } },
9209   },
9210   {
9211     /* VEX_W_52_P_0 */
9212     { "vrsqrtps",       { XM, EXx } },
9213   },
9214   {
9215     /* VEX_W_52_P_1 */
9216     { "vrsqrtss",       { XM, Vex128, EXd } },
9217   },
9218   {
9219     /* VEX_W_53_P_0  */
9220     { "vrcpps",         { XM, EXx } },
9221   },
9222   {
9223     /* VEX_W_53_P_1  */
9224     { "vrcpss",         { XM, Vex128, EXd } },
9225   },
9226   {
9227     /* VEX_W_58_P_0  */
9228     { "vaddps",         { XM, Vex, EXx } },
9229   },
9230   {
9231     /* VEX_W_58_P_1  */
9232     { "vaddss",         { XM, Vex128, EXd } },
9233   },
9234   {
9235     /* VEX_W_58_P_2  */
9236     { "vaddpd",         { XM, Vex, EXx } },
9237   },
9238   {
9239     /* VEX_W_58_P_3  */
9240     { "vaddsd",         { XM, Vex128, EXq } },
9241   },
9242   {
9243     /* VEX_W_59_P_0  */
9244     { "vmulps",         { XM, Vex, EXx } },
9245   },
9246   {
9247     /* VEX_W_59_P_1  */
9248     { "vmulss",         { XM, Vex128, EXd } },
9249   },
9250   {
9251     /* VEX_W_59_P_2  */
9252     { "vmulpd",         { XM, Vex, EXx } },
9253   },
9254   {
9255     /* VEX_W_59_P_3  */
9256     { "vmulsd",         { XM, Vex128, EXq } },
9257   },
9258   {
9259     /* VEX_W_5A_P_0  */
9260     { "vcvtps2pd",      { XM, EXxmmq } },
9261   },
9262   {
9263     /* VEX_W_5A_P_1  */
9264     { "vcvtss2sd",      { XM, Vex128, EXd } },
9265   },
9266   {
9267     /* VEX_W_5A_P_3  */
9268     { "vcvtsd2ss",      { XM, Vex128, EXq } },
9269   },
9270   {
9271     /* VEX_W_5B_P_0  */
9272     { "vcvtdq2ps",      { XM, EXx } },
9273   },
9274   {
9275     /* VEX_W_5B_P_1  */
9276     { "vcvttps2dq",     { XM, EXx } },
9277   },
9278   {
9279     /* VEX_W_5B_P_2  */
9280     { "vcvtps2dq",      { XM, EXx } },
9281   },
9282   {
9283     /* VEX_W_5C_P_0  */
9284     { "vsubps",         { XM, Vex, EXx } },
9285   },
9286   {
9287     /* VEX_W_5C_P_1  */
9288     { "vsubss",         { XM, Vex128, EXd } },
9289   },
9290   {
9291     /* VEX_W_5C_P_2  */
9292     { "vsubpd",         { XM, Vex, EXx } },
9293   },
9294   {
9295     /* VEX_W_5C_P_3  */
9296     { "vsubsd",         { XM, Vex128, EXq } },
9297   },
9298   {
9299     /* VEX_W_5D_P_0  */
9300     { "vminps",         { XM, Vex, EXx } },
9301   },
9302   {
9303     /* VEX_W_5D_P_1  */
9304     { "vminss",         { XM, Vex128, EXd } },
9305   },
9306   {
9307     /* VEX_W_5D_P_2  */
9308     { "vminpd",         { XM, Vex, EXx } },
9309   },
9310   {
9311     /* VEX_W_5D_P_3  */
9312     { "vminsd",         { XM, Vex128, EXq } },
9313   },
9314   {
9315     /* VEX_W_5E_P_0  */
9316     { "vdivps",         { XM, Vex, EXx } },
9317   },
9318   {
9319     /* VEX_W_5E_P_1  */
9320     { "vdivss",         { XM, Vex128, EXd } },
9321   },
9322   {
9323     /* VEX_W_5E_P_2  */
9324     { "vdivpd",         { XM, Vex, EXx } },
9325   },
9326   {
9327     /* VEX_W_5E_P_3  */
9328     { "vdivsd",         { XM, Vex128, EXq } },
9329   },
9330   {
9331     /* VEX_W_5F_P_0  */
9332     { "vmaxps",         { XM, Vex, EXx } },
9333   },
9334   {
9335     /* VEX_W_5F_P_1  */
9336     { "vmaxss",         { XM, Vex128, EXd } },
9337   },
9338   {
9339     /* VEX_W_5F_P_2  */
9340     { "vmaxpd",         { XM, Vex, EXx } },
9341   },
9342   {
9343     /* VEX_W_5F_P_3  */
9344     { "vmaxsd",         { XM, Vex128, EXq } },
9345   },
9346   {
9347     /* VEX_W_60_P_2  */
9348     { "vpunpcklbw",     { XM, Vex128, EXx } },
9349   },
9350   {
9351     /* VEX_W_61_P_2  */
9352     { "vpunpcklwd",     { XM, Vex128, EXx } },
9353   },
9354   {
9355     /* VEX_W_62_P_2  */
9356     { "vpunpckldq",     { XM, Vex128, EXx } },
9357   },
9358   {
9359     /* VEX_W_63_P_2  */
9360     { "vpacksswb",      { XM, Vex128, EXx } },
9361   },
9362   {
9363     /* VEX_W_64_P_2  */
9364     { "vpcmpgtb",       { XM, Vex128, EXx } },
9365   },
9366   {
9367     /* VEX_W_65_P_2  */
9368     { "vpcmpgtw",       { XM, Vex128, EXx } },
9369   },
9370   {
9371     /* VEX_W_66_P_2  */
9372     { "vpcmpgtd",       { XM, Vex128, EXx } },
9373   },
9374   {
9375     /* VEX_W_67_P_2  */
9376     { "vpackuswb",      { XM, Vex128, EXx } },
9377   },
9378   {
9379     /* VEX_W_68_P_2  */
9380     { "vpunpckhbw",     { XM, Vex128, EXx } },
9381   },
9382   {
9383     /* VEX_W_69_P_2  */
9384     { "vpunpckhwd",     { XM, Vex128, EXx } },
9385   },
9386   {
9387     /* VEX_W_6A_P_2  */
9388     { "vpunpckhdq",     { XM, Vex128, EXx } },
9389   },
9390   {
9391     /* VEX_W_6B_P_2  */
9392     { "vpackssdw",      { XM, Vex128, EXx } },
9393   },
9394   {
9395     /* VEX_W_6C_P_2  */
9396     { "vpunpcklqdq",    { XM, Vex128, EXx } },
9397   },
9398   {
9399     /* VEX_W_6D_P_2  */
9400     { "vpunpckhqdq",    { XM, Vex128, EXx } },
9401   },
9402   {
9403     /* VEX_W_6F_P_1  */
9404     { "vmovdqu",        { XM, EXx } },
9405   },
9406   {
9407     /* VEX_W_6F_P_2  */
9408     { "vmovdqa",        { XM, EXx } },
9409   },
9410   {
9411     /* VEX_W_70_P_1 */
9412     { "vpshufhw",       { XM, EXx, Ib } },
9413   },
9414   {
9415     /* VEX_W_70_P_2 */
9416     { "vpshufd",        { XM, EXx, Ib } },
9417   },
9418   {
9419     /* VEX_W_70_P_3 */
9420     { "vpshuflw",       { XM, EXx, Ib } },
9421   },
9422   {
9423     /* VEX_W_71_R_2_P_2  */
9424     { "vpsrlw",         { Vex128, XS, Ib } },
9425   },
9426   {
9427     /* VEX_W_71_R_4_P_2  */
9428     { "vpsraw",         { Vex128, XS, Ib } },
9429   },
9430   {
9431     /* VEX_W_71_R_6_P_2  */
9432     { "vpsllw",         { Vex128, XS, Ib } },
9433   },
9434   {
9435     /* VEX_W_72_R_2_P_2  */
9436     { "vpsrld",         { Vex128, XS, Ib } },
9437   },
9438   {
9439     /* VEX_W_72_R_4_P_2  */
9440     { "vpsrad",         { Vex128, XS, Ib } },
9441   },
9442   {
9443     /* VEX_W_72_R_6_P_2  */
9444     { "vpslld",         { Vex128, XS, Ib } },
9445   },
9446   {
9447     /* VEX_W_73_R_2_P_2  */
9448     { "vpsrlq",         { Vex128, XS, Ib } },
9449   },
9450   {
9451     /* VEX_W_73_R_3_P_2  */
9452     { "vpsrldq",        { Vex128, XS, Ib } },
9453   },
9454   {
9455     /* VEX_W_73_R_6_P_2  */
9456     { "vpsllq",         { Vex128, XS, Ib } },
9457   },
9458   {
9459     /* VEX_W_73_R_7_P_2  */
9460     { "vpslldq",        { Vex128, XS, Ib } },
9461   },
9462   {
9463     /* VEX_W_74_P_2 */
9464     { "vpcmpeqb",       { XM, Vex128, EXx } },
9465   },
9466   {
9467     /* VEX_W_75_P_2 */
9468     { "vpcmpeqw",       { XM, Vex128, EXx } },
9469   },
9470   {
9471     /* VEX_W_76_P_2 */
9472     { "vpcmpeqd",       { XM, Vex128, EXx } },
9473   },
9474   {
9475     /* VEX_W_77_P_0 */
9476     { "",               { VZERO } },
9477   },
9478   {
9479     /* VEX_W_7C_P_2 */
9480     { "vhaddpd",        { XM, Vex, EXx } },
9481   },
9482   {
9483     /* VEX_W_7C_P_3 */
9484     { "vhaddps",        { XM, Vex, EXx } },
9485   },
9486   {
9487     /* VEX_W_7D_P_2 */
9488     { "vhsubpd",        { XM, Vex, EXx } },
9489   },
9490   {
9491     /* VEX_W_7D_P_3 */
9492     { "vhsubps",        { XM, Vex, EXx } },
9493   },
9494   {
9495     /* VEX_W_7E_P_1 */
9496     { "vmovq",          { XM, EXq } },
9497   },
9498   {
9499     /* VEX_W_7F_P_1 */
9500     { "vmovdqu",        { EXxS, XM } },
9501   },
9502   {
9503     /* VEX_W_7F_P_2 */
9504     { "vmovdqa",        { EXxS, XM } },
9505   },
9506   {
9507     /* VEX_W_AE_R_2_M_0 */
9508     { "vldmxcsr",       { Md } },
9509   },
9510   {
9511     /* VEX_W_AE_R_3_M_0 */
9512     { "vstmxcsr",       { Md } },
9513   },
9514   {
9515     /* VEX_W_C2_P_0 */
9516     { "vcmpps",         { XM, Vex, EXx, VCMP } },
9517   },
9518   {
9519     /* VEX_W_C2_P_1 */
9520     { "vcmpss",         { XM, Vex128, EXd, VCMP } },
9521   },
9522   {
9523     /* VEX_W_C2_P_2 */
9524     { "vcmppd",         { XM, Vex, EXx, VCMP } },
9525   },
9526   {
9527     /* VEX_W_C2_P_3 */
9528     { "vcmpsd",         { XM, Vex128, EXq, VCMP } },
9529   },
9530   {
9531     /* VEX_W_C4_P_2 */
9532     { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
9533   },
9534   {
9535     /* VEX_W_C5_P_2 */
9536     { "vpextrw",        { Gdq, XS, Ib } },
9537   },
9538   {
9539     /* VEX_W_D0_P_2 */
9540     { "vaddsubpd",      { XM, Vex, EXx } },
9541   },
9542   {
9543     /* VEX_W_D0_P_3 */
9544     { "vaddsubps",      { XM, Vex, EXx } },
9545   },
9546   {
9547     /* VEX_W_D1_P_2 */
9548     { "vpsrlw",         { XM, Vex128, EXx } },
9549   },
9550   {
9551     /* VEX_W_D2_P_2 */
9552     { "vpsrld",         { XM, Vex128, EXx } },
9553   },
9554   {
9555     /* VEX_W_D3_P_2 */
9556     { "vpsrlq",         { XM, Vex128, EXx } },
9557   },
9558   {
9559     /* VEX_W_D4_P_2 */
9560     { "vpaddq",         { XM, Vex128, EXx } },
9561   },
9562   {
9563     /* VEX_W_D5_P_2 */
9564     { "vpmullw",        { XM, Vex128, EXx } },
9565   },
9566   {
9567     /* VEX_W_D6_P_2 */
9568     { "vmovq",          { EXqS, XM } },
9569   },
9570   {
9571     /* VEX_W_D7_P_2_M_1 */
9572     { "vpmovmskb",      { Gdq, XS } },
9573   },
9574   {
9575     /* VEX_W_D8_P_2 */
9576     { "vpsubusb",       { XM, Vex128, EXx } },
9577   },
9578   {
9579     /* VEX_W_D9_P_2 */
9580     { "vpsubusw",       { XM, Vex128, EXx } },
9581   },
9582   {
9583     /* VEX_W_DA_P_2 */
9584     { "vpminub",        { XM, Vex128, EXx } },
9585   },
9586   {
9587     /* VEX_W_DB_P_2 */
9588     { "vpand",          { XM, Vex128, EXx } },
9589   },
9590   {
9591     /* VEX_W_DC_P_2 */
9592     { "vpaddusb",       { XM, Vex128, EXx } },
9593   },
9594   {
9595     /* VEX_W_DD_P_2 */
9596     { "vpaddusw",       { XM, Vex128, EXx } },
9597   },
9598   {
9599     /* VEX_W_DE_P_2 */
9600     { "vpmaxub",        { XM, Vex128, EXx } },
9601   },
9602   {
9603     /* VEX_W_DF_P_2 */
9604     { "vpandn",         { XM, Vex128, EXx } },
9605   },
9606   {
9607     /* VEX_W_E0_P_2  */
9608     { "vpavgb",         { XM, Vex128, EXx } },
9609   },
9610   {
9611     /* VEX_W_E1_P_2  */
9612     { "vpsraw",         { XM, Vex128, EXx } },
9613   },
9614   {
9615     /* VEX_W_E2_P_2  */
9616     { "vpsrad",         { XM, Vex128, EXx } },
9617   },
9618   {
9619     /* VEX_W_E3_P_2  */
9620     { "vpavgw",         { XM, Vex128, EXx } },
9621   },
9622   {
9623     /* VEX_W_E4_P_2  */
9624     { "vpmulhuw",       { XM, Vex128, EXx } },
9625   },
9626   {
9627     /* VEX_W_E5_P_2  */
9628     { "vpmulhw",        { XM, Vex128, EXx } },
9629   },
9630   {
9631     /* VEX_W_E6_P_1  */
9632     { "vcvtdq2pd",      { XM, EXxmmq } },
9633   },
9634   {
9635     /* VEX_W_E6_P_2  */
9636     { "vcvttpd2dq%XY",  { XMM, EXx } },
9637   },
9638   {
9639     /* VEX_W_E6_P_3  */
9640     { "vcvtpd2dq%XY",   { XMM, EXx } },
9641   },
9642   {
9643     /* VEX_W_E7_P_2_M_0 */
9644     { "vmovntdq",       { Mx, XM } },
9645   },
9646   {
9647     /* VEX_W_E8_P_2  */
9648     { "vpsubsb",        { XM, Vex128, EXx } },
9649   },
9650   {
9651     /* VEX_W_E9_P_2  */
9652     { "vpsubsw",        { XM, Vex128, EXx } },
9653   },
9654   {
9655     /* VEX_W_EA_P_2  */
9656     { "vpminsw",        { XM, Vex128, EXx } },
9657   },
9658   {
9659     /* VEX_W_EB_P_2  */
9660     { "vpor",           { XM, Vex128, EXx } },
9661   },
9662   {
9663     /* VEX_W_EC_P_2  */
9664     { "vpaddsb",        { XM, Vex128, EXx } },
9665   },
9666   {
9667     /* VEX_W_ED_P_2  */
9668     { "vpaddsw",        { XM, Vex128, EXx } },
9669   },
9670   {
9671     /* VEX_W_EE_P_2  */
9672     { "vpmaxsw",        { XM, Vex128, EXx } },
9673   },
9674   {
9675     /* VEX_W_EF_P_2  */
9676     { "vpxor",          { XM, Vex128, EXx } },
9677   },
9678   {
9679     /* VEX_W_F0_P_3_M_0 */
9680     { "vlddqu",         { XM, M } },
9681   },
9682   {
9683     /* VEX_W_F1_P_2 */
9684     { "vpsllw",         { XM, Vex128, EXx } },
9685   },
9686   {
9687     /* VEX_W_F2_P_2 */
9688     { "vpslld",         { XM, Vex128, EXx } },
9689   },
9690   {
9691     /* VEX_W_F3_P_2 */
9692     { "vpsllq",         { XM, Vex128, EXx } },
9693   },
9694   {
9695     /* VEX_W_F4_P_2 */
9696     { "vpmuludq",       { XM, Vex128, EXx } },
9697   },
9698   {
9699     /* VEX_W_F5_P_2 */
9700     { "vpmaddwd",       { XM, Vex128, EXx } },
9701   },
9702   {
9703     /* VEX_W_F6_P_2 */
9704     { "vpsadbw",        { XM, Vex128, EXx } },
9705   },
9706   {
9707     /* VEX_W_F7_P_2 */
9708     { "vmaskmovdqu",    { XM, XS } },
9709   },
9710   {
9711     /* VEX_W_F8_P_2 */
9712     { "vpsubb",         { XM, Vex128, EXx } },
9713   },
9714   {
9715     /* VEX_W_F9_P_2 */
9716     { "vpsubw",         { XM, Vex128, EXx } },
9717   },
9718   {
9719     /* VEX_W_FA_P_2 */
9720     { "vpsubd",         { XM, Vex128, EXx } },
9721   },
9722   {
9723     /* VEX_W_FB_P_2 */
9724     { "vpsubq",         { XM, Vex128, EXx } },
9725   },
9726   {
9727     /* VEX_W_FC_P_2 */
9728     { "vpaddb",         { XM, Vex128, EXx } },
9729   },
9730   {
9731     /* VEX_W_FD_P_2 */
9732     { "vpaddw",         { XM, Vex128, EXx } },
9733   },
9734   {
9735     /* VEX_W_FE_P_2 */
9736     { "vpaddd",         { XM, Vex128, EXx } },
9737   },
9738   {
9739     /* VEX_W_3800_P_2  */
9740     { "vpshufb",        { XM, Vex128, EXx } },
9741   },
9742   {
9743     /* VEX_W_3801_P_2  */
9744     { "vphaddw",        { XM, Vex128, EXx } },
9745   },
9746   {
9747     /* VEX_W_3802_P_2  */
9748     { "vphaddd",        { XM, Vex128, EXx } },
9749   },
9750   {
9751     /* VEX_W_3803_P_2  */
9752     { "vphaddsw",       { XM, Vex128, EXx } },
9753   },
9754   {
9755     /* VEX_W_3804_P_2  */
9756     { "vpmaddubsw",     { XM, Vex128, EXx } },
9757   },
9758   {
9759     /* VEX_W_3805_P_2  */
9760     { "vphsubw",        { XM, Vex128, EXx } },
9761   },
9762   {
9763     /* VEX_W_3806_P_2  */
9764     { "vphsubd",        { XM, Vex128, EXx } },
9765   },
9766   {
9767     /* VEX_W_3807_P_2  */
9768     { "vphsubsw",       { XM, Vex128, EXx } },
9769   },
9770   {
9771     /* VEX_W_3808_P_2  */
9772     { "vpsignb",        { XM, Vex128, EXx } },
9773   },
9774   {
9775     /* VEX_W_3809_P_2  */
9776     { "vpsignw",        { XM, Vex128, EXx } },
9777   },
9778   {
9779     /* VEX_W_380A_P_2  */
9780     { "vpsignd",        { XM, Vex128, EXx } },
9781   },
9782   {
9783     /* VEX_W_380B_P_2  */
9784     { "vpmulhrsw",      { XM, Vex128, EXx } },
9785   },
9786   {
9787     /* VEX_W_380C_P_2  */
9788     { "vpermilps",      { XM, Vex, EXx } },
9789   },
9790   {
9791     /* VEX_W_380D_P_2  */
9792     { "vpermilpd",      { XM, Vex, EXx } },
9793   },
9794   {
9795     /* VEX_W_380E_P_2  */
9796     { "vtestps",        { XM, EXx } },
9797   },
9798   {
9799     /* VEX_W_380F_P_2  */
9800     { "vtestpd",        { XM, EXx } },
9801   },
9802   {
9803     /* VEX_W_3817_P_2 */
9804     { "vptest",         { XM, EXx } },
9805   },
9806   {
9807     /* VEX_W_3818_P_2_M_0 */
9808     { "vbroadcastss",   { XM, Md } },
9809   },
9810   {
9811     /* VEX_W_3819_P_2_M_0 */
9812     { "vbroadcastsd",   { XM, Mq } },
9813   },
9814   {
9815     /* VEX_W_381A_P_2_M_0 */
9816     { "vbroadcastf128", { XM, Mxmm } },
9817   },
9818   {
9819     /* VEX_W_381C_P_2 */
9820     { "vpabsb",         { XM, EXx } },
9821   },
9822   {
9823     /* VEX_W_381D_P_2 */
9824     { "vpabsw",         { XM, EXx } },
9825   },
9826   {
9827     /* VEX_W_381E_P_2 */
9828     { "vpabsd",         { XM, EXx } },
9829   },
9830   {
9831     /* VEX_W_3820_P_2 */
9832     { "vpmovsxbw",      { XM, EXq } },
9833   },
9834   {
9835     /* VEX_W_3821_P_2 */
9836     { "vpmovsxbd",      { XM, EXd } },
9837   },
9838   {
9839     /* VEX_W_3822_P_2 */
9840     { "vpmovsxbq",      { XM, EXw } },
9841   },
9842   {
9843     /* VEX_W_3823_P_2 */
9844     { "vpmovsxwd",      { XM, EXq } },
9845   },
9846   {
9847     /* VEX_W_3824_P_2 */
9848     { "vpmovsxwq",      { XM, EXd } },
9849   },
9850   {
9851     /* VEX_W_3825_P_2 */
9852     { "vpmovsxdq",      { XM, EXq } },
9853   },
9854   {
9855     /* VEX_W_3828_P_2 */
9856     { "vpmuldq",        { XM, Vex128, EXx } },
9857   },
9858   {
9859     /* VEX_W_3829_P_2 */
9860     { "vpcmpeqq",       { XM, Vex128, EXx } },
9861   },
9862   {
9863     /* VEX_W_382A_P_2_M_0 */
9864     { "vmovntdqa",      { XM, Mx } },
9865   },
9866   {
9867     /* VEX_W_382B_P_2 */
9868     { "vpackusdw",      { XM, Vex128, EXx } },
9869   },
9870   {
9871     /* VEX_W_382C_P_2_M_0 */
9872     { "vmaskmovps",     { XM, Vex, Mx } },
9873   },
9874   {
9875     /* VEX_W_382D_P_2_M_0 */
9876     { "vmaskmovpd",     { XM, Vex, Mx } },
9877   },
9878   {
9879     /* VEX_W_382E_P_2_M_0 */
9880     { "vmaskmovps",     { Mx, Vex, XM } },
9881   },
9882   {
9883     /* VEX_W_382F_P_2_M_0 */
9884     { "vmaskmovpd",     { Mx, Vex, XM } },
9885   },
9886   {
9887     /* VEX_W_3830_P_2 */
9888     { "vpmovzxbw",      { XM, EXq } },
9889   },
9890   {
9891     /* VEX_W_3831_P_2 */
9892     { "vpmovzxbd",      { XM, EXd } },
9893   },
9894   {
9895     /* VEX_W_3832_P_2 */
9896     { "vpmovzxbq",      { XM, EXw } },
9897   },
9898   {
9899     /* VEX_W_3833_P_2 */
9900     { "vpmovzxwd",      { XM, EXq } },
9901   },
9902   {
9903     /* VEX_W_3834_P_2 */
9904     { "vpmovzxwq",      { XM, EXd } },
9905   },
9906   {
9907     /* VEX_W_3835_P_2 */
9908     { "vpmovzxdq",      { XM, EXq } },
9909   },
9910   {
9911     /* VEX_W_3837_P_2 */
9912     { "vpcmpgtq",       { XM, Vex128, EXx } },
9913   },
9914   {
9915     /* VEX_W_3838_P_2 */
9916     { "vpminsb",        { XM, Vex128, EXx } },
9917   },
9918   {
9919     /* VEX_W_3839_P_2 */
9920     { "vpminsd",        { XM, Vex128, EXx } },
9921   },
9922   {
9923     /* VEX_W_383A_P_2 */
9924     { "vpminuw",        { XM, Vex128, EXx } },
9925   },
9926   {
9927     /* VEX_W_383B_P_2 */
9928     { "vpminud",        { XM, Vex128, EXx } },
9929   },
9930   {
9931     /* VEX_W_383C_P_2 */
9932     { "vpmaxsb",        { XM, Vex128, EXx } },
9933   },
9934   {
9935     /* VEX_W_383D_P_2 */
9936     { "vpmaxsd",        { XM, Vex128, EXx } },
9937   },
9938   {
9939     /* VEX_W_383E_P_2 */
9940     { "vpmaxuw",        { XM, Vex128, EXx } },
9941   },
9942   {
9943     /* VEX_W_383F_P_2 */
9944     { "vpmaxud",        { XM, Vex128, EXx } },
9945   },
9946   {
9947     /* VEX_W_3840_P_2 */
9948     { "vpmulld",        { XM, Vex128, EXx } },
9949   },
9950   {
9951     /* VEX_W_3841_P_2 */
9952     { "vphminposuw",    { XM, EXx } },
9953   },
9954   {
9955     /* VEX_W_38DB_P_2 */
9956     { "vaesimc",        { XM, EXx } },
9957   },
9958   {
9959     /* VEX_W_38DC_P_2 */
9960     { "vaesenc",        { XM, Vex128, EXx } },
9961   },
9962   {
9963     /* VEX_W_38DD_P_2 */
9964     { "vaesenclast",    { XM, Vex128, EXx } },
9965   },
9966   {
9967     /* VEX_W_38DE_P_2 */
9968     { "vaesdec",        { XM, Vex128, EXx } },
9969   },
9970   {
9971     /* VEX_W_38DF_P_2 */
9972     { "vaesdeclast",    { XM, Vex128, EXx } },
9973   },
9974   {
9975     /* VEX_W_3A04_P_2 */
9976     { "vpermilps",      { XM, EXx, Ib } },
9977   },
9978   {
9979     /* VEX_W_3A05_P_2 */
9980     { "vpermilpd",      { XM, EXx, Ib } },
9981   },
9982   {
9983     /* VEX_W_3A06_P_2 */
9984     { "vperm2f128",     { XM, Vex256, EXx, Ib } },
9985   },
9986   {
9987     /* VEX_W_3A08_P_2 */
9988     { "vroundps",       { XM, EXx, Ib } },
9989   },
9990   {
9991     /* VEX_W_3A09_P_2 */
9992     { "vroundpd",       { XM, EXx, Ib } },
9993   },
9994   {
9995     /* VEX_W_3A0A_P_2 */
9996     { "vroundss",       { XM, Vex128, EXd, Ib } },
9997   },
9998   {
9999     /* VEX_W_3A0B_P_2 */
10000     { "vroundsd",       { XM, Vex128, EXq, Ib } },
10001   },
10002   {
10003     /* VEX_W_3A0C_P_2 */
10004     { "vblendps",       { XM, Vex, EXx, Ib } },
10005   },
10006   {
10007     /* VEX_W_3A0D_P_2 */
10008     { "vblendpd",       { XM, Vex, EXx, Ib } },
10009   },
10010   {
10011     /* VEX_W_3A0E_P_2 */
10012     { "vpblendw",       { XM, Vex128, EXx, Ib } },
10013   },
10014   {
10015     /* VEX_W_3A0F_P_2 */
10016     { "vpalignr",       { XM, Vex128, EXx, Ib } },
10017   },
10018   {
10019     /* VEX_W_3A14_P_2 */
10020     { "vpextrb",        { Edqb, XM, Ib } },
10021   },
10022   {
10023     /* VEX_W_3A15_P_2 */
10024     { "vpextrw",        { Edqw, XM, Ib } },
10025   },
10026   {
10027     /* VEX_W_3A18_P_2 */
10028     { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
10029   },
10030   {
10031     /* VEX_W_3A19_P_2 */
10032     { "vextractf128",   { EXxmm, XM, Ib } },
10033   },
10034   {
10035     /* VEX_W_3A20_P_2 */
10036     { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
10037   },
10038   {
10039     /* VEX_W_3A21_P_2 */
10040     { "vinsertps",      { XM, Vex128, EXd, Ib } },
10041   },
10042   {
10043     /* VEX_W_3A40_P_2 */
10044     { "vdpps",          { XM, Vex, EXx, Ib } },
10045   },
10046   {
10047     /* VEX_W_3A41_P_2 */
10048     { "vdppd",          { XM, Vex128, EXx, Ib } },
10049   },
10050   {
10051     /* VEX_W_3A42_P_2 */
10052     { "vmpsadbw",       { XM, Vex128, EXx, Ib } },
10053   },
10054   {
10055     /* VEX_W_3A44_P_2 */
10056     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL } },
10057   },
10058   {
10059     /* VEX_W_3A4A_P_2 */
10060     { "vblendvps",      { XM, Vex, EXx, XMVexI4 } },
10061   },
10062   {
10063     /* VEX_W_3A4B_P_2 */
10064     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 } },
10065   },
10066   {
10067     /* VEX_W_3A4C_P_2 */
10068     { "vpblendvb",      { XM, Vex128, EXx, XMVexI4 } },
10069   },
10070   {
10071     /* VEX_W_3A60_P_2 */
10072     { "vpcmpestrm",     { XM, EXx, Ib } },
10073   },
10074   {
10075     /* VEX_W_3A61_P_2 */
10076     { "vpcmpestri",     { XM, EXx, Ib } },
10077   },
10078   {
10079     /* VEX_W_3A62_P_2 */
10080     { "vpcmpistrm",     { XM, EXx, Ib } },
10081   },
10082   {
10083     /* VEX_W_3A63_P_2 */
10084     { "vpcmpistri",     { XM, EXx, Ib } },
10085   },
10086   {
10087     /* VEX_W_3ADF_P_2 */
10088     { "vaeskeygenassist", { XM, EXx, Ib } },
10089   },
10090 };
10091
10092 static const struct dis386 mod_table[][2] = {
10093   {
10094     /* MOD_8D */
10095     { "leaS",           { Gv, M } },
10096   },
10097   {
10098     /* MOD_0F01_REG_0 */
10099     { X86_64_TABLE (X86_64_0F01_REG_0) },
10100     { RM_TABLE (RM_0F01_REG_0) },
10101   },
10102   {
10103     /* MOD_0F01_REG_1 */
10104     { X86_64_TABLE (X86_64_0F01_REG_1) },
10105     { RM_TABLE (RM_0F01_REG_1) },
10106   },
10107   {
10108     /* MOD_0F01_REG_2 */
10109     { X86_64_TABLE (X86_64_0F01_REG_2) },
10110     { RM_TABLE (RM_0F01_REG_2) },
10111   },
10112   {
10113     /* MOD_0F01_REG_3 */
10114     { X86_64_TABLE (X86_64_0F01_REG_3) },
10115     { RM_TABLE (RM_0F01_REG_3) },
10116   },
10117   {
10118     /* MOD_0F01_REG_7 */
10119     { "invlpg",         { Mb } },
10120     { RM_TABLE (RM_0F01_REG_7) },
10121   },
10122   {
10123     /* MOD_0F12_PREFIX_0 */
10124     { "movlps",         { XM, EXq } },
10125     { "movhlps",        { XM, EXq } },
10126   },
10127   {
10128     /* MOD_0F13 */
10129     { "movlpX",         { EXq, XM } },
10130   },
10131   {
10132     /* MOD_0F16_PREFIX_0 */
10133     { "movhps",         { XM, EXq } },
10134     { "movlhps",        { XM, EXq } },
10135   },
10136   {
10137     /* MOD_0F17 */
10138     { "movhpX",         { EXq, XM } },
10139   },
10140   {
10141     /* MOD_0F18_REG_0 */
10142     { "prefetchnta",    { Mb } },
10143   },
10144   {
10145     /* MOD_0F18_REG_1 */
10146     { "prefetcht0",     { Mb } },
10147   },
10148   {
10149     /* MOD_0F18_REG_2 */
10150     { "prefetcht1",     { Mb } },
10151   },
10152   {
10153     /* MOD_0F18_REG_3 */
10154     { "prefetcht2",     { Mb } },
10155   },
10156   {
10157     /* MOD_0F20 */
10158     { Bad_Opcode },
10159     { "movZ",           { Rm, Cm } },
10160   },
10161   {
10162     /* MOD_0F21 */
10163     { Bad_Opcode },
10164     { "movZ",           { Rm, Dm } },
10165   },
10166   {
10167     /* MOD_0F22 */
10168     { Bad_Opcode },
10169     { "movZ",           { Cm, Rm } },
10170   },
10171   {
10172     /* MOD_0F23 */
10173     { Bad_Opcode },
10174     { "movZ",           { Dm, Rm } },
10175   },
10176   {
10177     /* MOD_0F24 */
10178     { Bad_Opcode },    
10179     { "movL",           { Rd, Td } },
10180   },
10181   {
10182     /* MOD_0F26 */
10183     { Bad_Opcode },
10184     { "movL",           { Td, Rd } },
10185   },
10186   {
10187     /* MOD_0F2B_PREFIX_0 */
10188     {"movntps",         { Mx, XM } },
10189   },
10190   {
10191     /* MOD_0F2B_PREFIX_1 */
10192     {"movntss",         { Md, XM } },
10193   },
10194   {
10195     /* MOD_0F2B_PREFIX_2 */
10196     {"movntpd",         { Mx, XM } },
10197   },
10198   {
10199     /* MOD_0F2B_PREFIX_3 */
10200     {"movntsd",         { Mq, XM } },
10201   },
10202   {
10203     /* MOD_0F51 */
10204     { Bad_Opcode },
10205     { "movmskpX",       { Gdq, XS } },
10206   },
10207   {
10208     /* MOD_0F71_REG_2 */
10209     { Bad_Opcode },
10210     { "psrlw",          { MS, Ib } },
10211   },
10212   {
10213     /* MOD_0F71_REG_4 */
10214     { Bad_Opcode },
10215     { "psraw",          { MS, Ib } },
10216   },
10217   {
10218     /* MOD_0F71_REG_6 */
10219     { Bad_Opcode },
10220     { "psllw",          { MS, Ib } },
10221   },
10222   {
10223     /* MOD_0F72_REG_2 */
10224     { Bad_Opcode },
10225     { "psrld",          { MS, Ib } },
10226   },
10227   {
10228     /* MOD_0F72_REG_4 */
10229     { Bad_Opcode },
10230     { "psrad",          { MS, Ib } },
10231   },
10232   {
10233     /* MOD_0F72_REG_6 */
10234     { Bad_Opcode },
10235     { "pslld",          { MS, Ib } },
10236   },
10237   {
10238     /* MOD_0F73_REG_2 */
10239     { Bad_Opcode },
10240     { "psrlq",          { MS, Ib } },
10241   },
10242   {
10243     /* MOD_0F73_REG_3 */
10244     { Bad_Opcode },
10245     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10246   },
10247   {
10248     /* MOD_0F73_REG_6 */
10249     { Bad_Opcode },
10250     { "psllq",          { MS, Ib } },
10251   },
10252   {
10253     /* MOD_0F73_REG_7 */
10254     { Bad_Opcode },
10255     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10256   },
10257   {
10258     /* MOD_0FAE_REG_0 */
10259     { "fxsave",         { FXSAVE } },
10260   },
10261   {
10262     /* MOD_0FAE_REG_1 */
10263     { "fxrstor",        { FXSAVE } },
10264   },
10265   {
10266     /* MOD_0FAE_REG_2 */
10267     { "ldmxcsr",        { Md } },
10268   },
10269   {
10270     /* MOD_0FAE_REG_3 */
10271     { "stmxcsr",        { Md } },
10272   },
10273   {
10274     /* MOD_0FAE_REG_4 */
10275     { "xsave",          { FXSAVE } },
10276   },
10277   {
10278     /* MOD_0FAE_REG_5 */
10279     { "xrstor",         { FXSAVE } },
10280     { RM_TABLE (RM_0FAE_REG_5) },
10281   },
10282   {
10283     /* MOD_0FAE_REG_6 */
10284     { Bad_Opcode },
10285     { RM_TABLE (RM_0FAE_REG_6) },
10286   },
10287   {
10288     /* MOD_0FAE_REG_7 */
10289     { "clflush",        { Mb } },
10290     { RM_TABLE (RM_0FAE_REG_7) },
10291   },
10292   {
10293     /* MOD_0FB2 */
10294     { "lssS",           { Gv, Mp } },
10295   },
10296   {
10297     /* MOD_0FB4 */
10298     { "lfsS",           { Gv, Mp } },
10299   },
10300   {
10301     /* MOD_0FB5 */
10302     { "lgsS",           { Gv, Mp } },
10303   },
10304   {
10305     /* MOD_0FC7_REG_6 */
10306     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
10307   },
10308   {
10309     /* MOD_0FC7_REG_7 */
10310     { "vmptrst",        { Mq } },
10311   },
10312   {
10313     /* MOD_0FD7 */
10314     { Bad_Opcode },
10315     { "pmovmskb",       { Gdq, MS } },
10316   },
10317   {
10318     /* MOD_0FE7_PREFIX_2 */
10319     { "movntdq",        { Mx, XM } },
10320   },
10321   {
10322     /* MOD_0FF0_PREFIX_3 */
10323     { "lddqu",          { XM, M } },
10324   },
10325   {
10326     /* MOD_0F382A_PREFIX_2 */
10327     { "movntdqa",       { XM, Mx } },
10328   },
10329   {
10330     /* MOD_62_32BIT */
10331     { "bound{S|}",      { Gv, Ma } },
10332   },
10333   {
10334     /* MOD_C4_32BIT */
10335     { "lesS",           { Gv, Mp } },
10336     { VEX_C4_TABLE (VEX_0F) },
10337   },
10338   {
10339     /* MOD_C5_32BIT */
10340     { "ldsS",           { Gv, Mp } },
10341     { VEX_C5_TABLE (VEX_0F) },
10342   },
10343   {
10344     /* MOD_VEX_12_PREFIX_0 */
10345     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_0) },
10346     { VEX_LEN_TABLE (VEX_LEN_12_P_0_M_1) },
10347   },
10348   {
10349     /* MOD_VEX_13 */
10350     { VEX_LEN_TABLE (VEX_LEN_13_M_0) },
10351   },
10352   {
10353     /* MOD_VEX_16_PREFIX_0 */
10354     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_0) },
10355     { VEX_LEN_TABLE (VEX_LEN_16_P_0_M_1) },
10356   },
10357   {
10358     /* MOD_VEX_17 */
10359     { VEX_LEN_TABLE (VEX_LEN_17_M_0) },
10360   },
10361   {
10362     /* MOD_VEX_2B */
10363     { VEX_W_TABLE (VEX_W_2B_M_0) },
10364   },
10365   {
10366     /* MOD_VEX_50 */
10367     { Bad_Opcode },
10368     { VEX_W_TABLE (VEX_W_50_M_0) },
10369   },
10370   {
10371     /* MOD_VEX_71_REG_2 */
10372     { Bad_Opcode },
10373     { PREFIX_TABLE (PREFIX_VEX_71_REG_2) },
10374   },
10375   {
10376     /* MOD_VEX_71_REG_4 */
10377     { Bad_Opcode },
10378     { PREFIX_TABLE (PREFIX_VEX_71_REG_4) },
10379   },
10380   {
10381     /* MOD_VEX_71_REG_6 */
10382     { Bad_Opcode },
10383     { PREFIX_TABLE (PREFIX_VEX_71_REG_6) },
10384   },
10385   {
10386     /* MOD_VEX_72_REG_2 */
10387     { Bad_Opcode },
10388     { PREFIX_TABLE (PREFIX_VEX_72_REG_2) },
10389   },
10390   {
10391     /* MOD_VEX_72_REG_4 */
10392     { Bad_Opcode },
10393     { PREFIX_TABLE (PREFIX_VEX_72_REG_4) },
10394   },
10395   {
10396     /* MOD_VEX_72_REG_6 */
10397     { Bad_Opcode },
10398     { PREFIX_TABLE (PREFIX_VEX_72_REG_6) },
10399   },
10400   {
10401     /* MOD_VEX_73_REG_2 */
10402     { Bad_Opcode },
10403     { PREFIX_TABLE (PREFIX_VEX_73_REG_2) },
10404   },
10405   {
10406     /* MOD_VEX_73_REG_3 */
10407     { Bad_Opcode },
10408     { PREFIX_TABLE (PREFIX_VEX_73_REG_3) },
10409   },
10410   {
10411     /* MOD_VEX_73_REG_6 */
10412     { Bad_Opcode },
10413     { PREFIX_TABLE (PREFIX_VEX_73_REG_6) },
10414   },
10415   {
10416     /* MOD_VEX_73_REG_7 */
10417     { Bad_Opcode },
10418     { PREFIX_TABLE (PREFIX_VEX_73_REG_7) },
10419   },
10420   {
10421     /* MOD_VEX_AE_REG_2 */
10422     { VEX_LEN_TABLE (VEX_LEN_AE_R_2_M_0) },
10423   },
10424   {
10425     /* MOD_VEX_AE_REG_3 */
10426     { VEX_LEN_TABLE (VEX_LEN_AE_R_3_M_0) },
10427   },
10428   {
10429     /* MOD_VEX_D7_PREFIX_2 */
10430     { Bad_Opcode },
10431     { VEX_LEN_TABLE (VEX_LEN_D7_P_2_M_1) },
10432   },
10433   {
10434     /* MOD_VEX_E7_PREFIX_2 */
10435     { VEX_W_TABLE (VEX_W_E7_P_2_M_0) },
10436   },
10437   {
10438     /* MOD_VEX_F0_PREFIX_3 */
10439     { VEX_W_TABLE (VEX_W_F0_P_3_M_0) },
10440   },
10441   {
10442     /* MOD_VEX_3818_PREFIX_2 */
10443     { VEX_W_TABLE (VEX_W_3818_P_2_M_0) },
10444   },
10445   {
10446     /* MOD_VEX_3819_PREFIX_2 */
10447     { VEX_LEN_TABLE (VEX_LEN_3819_P_2_M_0) },
10448   },
10449   {
10450     /* MOD_VEX_381A_PREFIX_2 */
10451     { VEX_LEN_TABLE (VEX_LEN_381A_P_2_M_0) },
10452   },
10453   {
10454     /* MOD_VEX_382A_PREFIX_2 */
10455     { VEX_LEN_TABLE (VEX_LEN_382A_P_2_M_0) },
10456   },
10457   {
10458     /* MOD_VEX_382C_PREFIX_2 */
10459     { VEX_W_TABLE (VEX_W_382C_P_2_M_0) },
10460   },
10461   {
10462     /* MOD_VEX_382D_PREFIX_2 */
10463     { VEX_W_TABLE (VEX_W_382D_P_2_M_0) },
10464   },
10465   {
10466     /* MOD_VEX_382E_PREFIX_2 */
10467     { VEX_W_TABLE (VEX_W_382E_P_2_M_0) },
10468   },
10469   {
10470     /* MOD_VEX_382F_PREFIX_2 */
10471     { VEX_W_TABLE (VEX_W_382F_P_2_M_0) },
10472   },
10473 };
10474
10475 static const struct dis386 rm_table[][8] = {
10476   {
10477     /* RM_0F01_REG_0 */
10478     { Bad_Opcode },
10479     { "vmcall",         { Skip_MODRM } },
10480     { "vmlaunch",       { Skip_MODRM } },
10481     { "vmresume",       { Skip_MODRM } },
10482     { "vmxoff",         { Skip_MODRM } },
10483   },
10484   {
10485     /* RM_0F01_REG_1 */
10486     { "monitor",        { { OP_Monitor, 0 } } },
10487     { "mwait",          { { OP_Mwait, 0 } } },
10488   },
10489   {
10490     /* RM_0F01_REG_2 */
10491     { "xgetbv",         { Skip_MODRM } },
10492     { "xsetbv",         { Skip_MODRM } },
10493   },
10494   {
10495     /* RM_0F01_REG_3 */
10496     { "vmrun",          { Skip_MODRM } },
10497     { "vmmcall",        { Skip_MODRM } },
10498     { "vmload",         { Skip_MODRM } },
10499     { "vmsave",         { Skip_MODRM } },
10500     { "stgi",           { Skip_MODRM } },
10501     { "clgi",           { Skip_MODRM } },
10502     { "skinit",         { Skip_MODRM } },
10503     { "invlpga",        { Skip_MODRM } },
10504   },
10505   {
10506     /* RM_0F01_REG_7 */
10507     { "swapgs",         { Skip_MODRM } },
10508     { "rdtscp",         { Skip_MODRM } },
10509   },
10510   {
10511     /* RM_0FAE_REG_5 */
10512     { "lfence",         { Skip_MODRM } },
10513   },
10514   {
10515     /* RM_0FAE_REG_6 */
10516     { "mfence",         { Skip_MODRM } },
10517   },
10518   {
10519     /* RM_0FAE_REG_7 */
10520     { "sfence",         { Skip_MODRM } },
10521   },
10522 };
10523
10524 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
10525
10526 /* We use the high bit to indicate different name for the same
10527    prefix.  */
10528 #define ADDR16_PREFIX   (0x67 | 0x100)
10529 #define ADDR32_PREFIX   (0x67 | 0x200)
10530 #define DATA16_PREFIX   (0x66 | 0x100)
10531 #define DATA32_PREFIX   (0x66 | 0x200)
10532 #define REP_PREFIX      (0xf3 | 0x100)
10533
10534 static int
10535 ckprefix (void)
10536 {
10537   int newrex, i, length;
10538   rex = 0;
10539   rex_ignored = 0;
10540   prefixes = 0;
10541   used_prefixes = 0;
10542   rex_used = 0;
10543   last_lock_prefix = -1;
10544   last_repz_prefix = -1;
10545   last_repnz_prefix = -1;
10546   last_data_prefix = -1;
10547   last_addr_prefix = -1;
10548   last_rex_prefix = -1;
10549   last_seg_prefix = -1;
10550   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
10551     all_prefixes[i] = 0;
10552   i = 0;
10553   length = 0;
10554   /* The maximum instruction length is 15bytes.  */
10555   while (length < MAX_CODE_LENGTH - 1)
10556     {
10557       FETCH_DATA (the_info, codep + 1);
10558       newrex = 0;
10559       switch (*codep)
10560         {
10561         /* REX prefixes family.  */
10562         case 0x40:
10563         case 0x41:
10564         case 0x42:
10565         case 0x43:
10566         case 0x44:
10567         case 0x45:
10568         case 0x46:
10569         case 0x47:
10570         case 0x48:
10571         case 0x49:
10572         case 0x4a:
10573         case 0x4b:
10574         case 0x4c:
10575         case 0x4d:
10576         case 0x4e:
10577         case 0x4f:
10578           if (address_mode == mode_64bit)
10579             newrex = *codep;
10580           else
10581             return 1;
10582           last_rex_prefix = i;
10583           break;
10584         case 0xf3:
10585           prefixes |= PREFIX_REPZ;
10586           last_repz_prefix = i;
10587           break;
10588         case 0xf2:
10589           prefixes |= PREFIX_REPNZ;
10590           last_repnz_prefix = i;
10591           break;
10592         case 0xf0:
10593           prefixes |= PREFIX_LOCK;
10594           last_lock_prefix = i;
10595           break;
10596         case 0x2e:
10597           prefixes |= PREFIX_CS;
10598           last_seg_prefix = i;
10599           break;
10600         case 0x36:
10601           prefixes |= PREFIX_SS;
10602           last_seg_prefix = i;
10603           break;
10604         case 0x3e:
10605           prefixes |= PREFIX_DS;
10606           last_seg_prefix = i;
10607           break;
10608         case 0x26:
10609           prefixes |= PREFIX_ES;
10610           last_seg_prefix = i;
10611           break;
10612         case 0x64:
10613           prefixes |= PREFIX_FS;
10614           last_seg_prefix = i;
10615           break;
10616         case 0x65:
10617           prefixes |= PREFIX_GS;
10618           last_seg_prefix = i;
10619           break;
10620         case 0x66:
10621           prefixes |= PREFIX_DATA;
10622           last_data_prefix = i;
10623           break;
10624         case 0x67:
10625           prefixes |= PREFIX_ADDR;
10626           last_addr_prefix = i;
10627           break;
10628         case FWAIT_OPCODE:
10629           /* fwait is really an instruction.  If there are prefixes
10630              before the fwait, they belong to the fwait, *not* to the
10631              following instruction.  */
10632           if (prefixes || rex)
10633             {
10634               prefixes |= PREFIX_FWAIT;
10635               codep++;
10636               return 1;
10637             }
10638           prefixes = PREFIX_FWAIT;
10639           break;
10640         default:
10641           return 1;
10642         }
10643       /* Rex is ignored when followed by another prefix.  */
10644       if (rex)
10645         {
10646           rex_used = rex;
10647           return 1;
10648         }
10649       if (*codep != FWAIT_OPCODE)
10650         all_prefixes[i++] = *codep;
10651       rex = newrex;
10652       codep++;
10653       length++;
10654     }
10655   return 0;
10656 }
10657
10658 static int
10659 seg_prefix (int pref)
10660 {
10661   switch (pref)
10662     {
10663     case 0x2e:
10664       return PREFIX_CS;
10665     case 0x36:
10666       return PREFIX_SS;
10667     case 0x3e:
10668       return PREFIX_DS;
10669     case 0x26:
10670       return PREFIX_ES;
10671     case 0x64:
10672       return PREFIX_FS;
10673     case 0x65:
10674       return PREFIX_GS;
10675     default:
10676       return 0;
10677     }
10678 }
10679
10680 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
10681    prefix byte.  */
10682
10683 static const char *
10684 prefix_name (int pref, int sizeflag)
10685 {
10686   static const char *rexes [16] =
10687     {
10688       "rex",            /* 0x40 */
10689       "rex.B",          /* 0x41 */
10690       "rex.X",          /* 0x42 */
10691       "rex.XB",         /* 0x43 */
10692       "rex.R",          /* 0x44 */
10693       "rex.RB",         /* 0x45 */
10694       "rex.RX",         /* 0x46 */
10695       "rex.RXB",        /* 0x47 */
10696       "rex.W",          /* 0x48 */
10697       "rex.WB",         /* 0x49 */
10698       "rex.WX",         /* 0x4a */
10699       "rex.WXB",        /* 0x4b */
10700       "rex.WR",         /* 0x4c */
10701       "rex.WRB",        /* 0x4d */
10702       "rex.WRX",        /* 0x4e */
10703       "rex.WRXB",       /* 0x4f */
10704     };
10705
10706   switch (pref)
10707     {
10708     /* REX prefixes family.  */
10709     case 0x40:
10710     case 0x41:
10711     case 0x42:
10712     case 0x43:
10713     case 0x44:
10714     case 0x45:
10715     case 0x46:
10716     case 0x47:
10717     case 0x48:
10718     case 0x49:
10719     case 0x4a:
10720     case 0x4b:
10721     case 0x4c:
10722     case 0x4d:
10723     case 0x4e:
10724     case 0x4f:
10725       return rexes [pref - 0x40];
10726     case 0xf3:
10727       return "repz";
10728     case 0xf2:
10729       return "repnz";
10730     case 0xf0:
10731       return "lock";
10732     case 0x2e:
10733       return "cs";
10734     case 0x36:
10735       return "ss";
10736     case 0x3e:
10737       return "ds";
10738     case 0x26:
10739       return "es";
10740     case 0x64:
10741       return "fs";
10742     case 0x65:
10743       return "gs";
10744     case 0x66:
10745       return (sizeflag & DFLAG) ? "data16" : "data32";
10746     case 0x67:
10747       if (address_mode == mode_64bit)
10748         return (sizeflag & AFLAG) ? "addr32" : "addr64";
10749       else
10750         return (sizeflag & AFLAG) ? "addr16" : "addr32";
10751     case FWAIT_OPCODE:
10752       return "fwait";
10753     case ADDR16_PREFIX:
10754       return "addr16";
10755     case ADDR32_PREFIX:
10756       return "addr32";
10757     case DATA16_PREFIX:
10758       return "data16";
10759     case DATA32_PREFIX:
10760       return "data32";
10761     case REP_PREFIX:
10762       return "rep";
10763     default:
10764       return NULL;
10765     }
10766 }
10767
10768 static char op_out[MAX_OPERANDS][100];
10769 static int op_ad, op_index[MAX_OPERANDS];
10770 static int two_source_ops;
10771 static bfd_vma op_address[MAX_OPERANDS];
10772 static bfd_vma op_riprel[MAX_OPERANDS];
10773 static bfd_vma start_pc;
10774
10775 /*
10776  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
10777  *   (see topic "Redundant prefixes" in the "Differences from 8086"
10778  *   section of the "Virtual 8086 Mode" chapter.)
10779  * 'pc' should be the address of this instruction, it will
10780  *   be used to print the target address if this is a relative jump or call
10781  * The function returns the length of this instruction in bytes.
10782  */
10783
10784 static char intel_syntax;
10785 static char intel_mnemonic = !SYSV386_COMPAT;
10786 static char open_char;
10787 static char close_char;
10788 static char separator_char;
10789 static char scale_char;
10790
10791 /* Here for backwards compatibility.  When gdb stops using
10792    print_insn_i386_att and print_insn_i386_intel these functions can
10793    disappear, and print_insn_i386 be merged into print_insn.  */
10794 int
10795 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10796 {
10797   intel_syntax = 0;
10798
10799   return print_insn (pc, info);
10800 }
10801
10802 int
10803 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10804 {
10805   intel_syntax = 1;
10806
10807   return print_insn (pc, info);
10808 }
10809
10810 int
10811 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10812 {
10813   intel_syntax = -1;
10814
10815   return print_insn (pc, info);
10816 }
10817
10818 void
10819 print_i386_disassembler_options (FILE *stream)
10820 {
10821   fprintf (stream, _("\n\
10822 The following i386/x86-64 specific disassembler options are supported for use\n\
10823 with the -M switch (multiple options should be separated by commas):\n"));
10824
10825   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
10826   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
10827   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
10828   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
10829   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
10830   fprintf (stream, _("  att-mnemonic\n"
10831                      "              Display instruction in AT&T mnemonic\n"));
10832   fprintf (stream, _("  intel-mnemonic\n"
10833                      "              Display instruction in Intel mnemonic\n"));
10834   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
10835   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
10836   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
10837   fprintf (stream, _("  data32      Assume 32bit data size\n"));
10838   fprintf (stream, _("  data16      Assume 16bit data size\n"));
10839   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
10840 }
10841
10842 /* Bad opcode.  */
10843 static const struct dis386 bad_opcode = { "(bad)", { XX } };
10844
10845 /* Get a pointer to struct dis386 with a valid name.  */
10846
10847 static const struct dis386 *
10848 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
10849 {
10850   int vindex, vex_table_index;
10851
10852   if (dp->name != NULL)
10853     return dp;
10854
10855   switch (dp->op[0].bytemode)
10856     {
10857     case USE_REG_TABLE:
10858       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
10859       break;
10860
10861     case USE_MOD_TABLE:
10862       vindex = modrm.mod == 0x3 ? 1 : 0;
10863       dp = &mod_table[dp->op[1].bytemode][vindex];
10864       break;
10865
10866     case USE_RM_TABLE:
10867       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
10868       break;
10869
10870     case USE_PREFIX_TABLE:
10871       if (need_vex)
10872         {
10873           /* The prefix in VEX is implicit.  */
10874           switch (vex.prefix)
10875             {
10876             case 0:
10877               vindex = 0;
10878               break;
10879             case REPE_PREFIX_OPCODE:
10880               vindex = 1;
10881               break;
10882             case DATA_PREFIX_OPCODE:
10883               vindex = 2;
10884               break;
10885             case REPNE_PREFIX_OPCODE:
10886               vindex = 3;
10887               break;
10888             default:
10889               abort ();
10890               break;
10891             }
10892         }
10893       else 
10894         {
10895           vindex = 0;
10896           used_prefixes |= (prefixes & PREFIX_REPZ);
10897           if (prefixes & PREFIX_REPZ)
10898             {
10899               vindex = 1;
10900               all_prefixes[last_repz_prefix] = 0;
10901             }
10902           else
10903             {
10904               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
10905                  PREFIX_DATA.  */
10906               used_prefixes |= (prefixes & PREFIX_REPNZ);
10907               if (prefixes & PREFIX_REPNZ)
10908                 {
10909                   vindex = 3;
10910                   all_prefixes[last_repnz_prefix] = 0;
10911                 }
10912               else
10913                 {
10914                   used_prefixes |= (prefixes & PREFIX_DATA);
10915                   if (prefixes & PREFIX_DATA)
10916                     {
10917                       vindex = 2;
10918                       all_prefixes[last_data_prefix] = 0;
10919                     }
10920                 }
10921             }
10922         }
10923       dp = &prefix_table[dp->op[1].bytemode][vindex];
10924       break;
10925
10926     case USE_X86_64_TABLE:
10927       vindex = address_mode == mode_64bit ? 1 : 0;
10928       dp = &x86_64_table[dp->op[1].bytemode][vindex];
10929       break;
10930
10931     case USE_3BYTE_TABLE:
10932       FETCH_DATA (info, codep + 2);
10933       vindex = *codep++;
10934       dp = &three_byte_table[dp->op[1].bytemode][vindex];
10935       modrm.mod = (*codep >> 6) & 3;
10936       modrm.reg = (*codep >> 3) & 7;
10937       modrm.rm = *codep & 7;
10938       break;
10939
10940     case USE_VEX_LEN_TABLE:
10941       if (!need_vex)
10942         abort ();
10943
10944       switch (vex.length)
10945         {
10946         case 128:
10947           vindex = 0;
10948           break;
10949         case 256:
10950           vindex = 1;
10951           break;
10952         default:
10953           abort ();
10954           break;
10955         }
10956
10957       dp = &vex_len_table[dp->op[1].bytemode][vindex];
10958       break;
10959
10960     case USE_XOP_8F_TABLE:
10961       FETCH_DATA (info, codep + 3);
10962       /* All bits in the REX prefix are ignored.  */
10963       rex_ignored = rex;
10964       rex = ~(*codep >> 5) & 0x7;
10965
10966       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
10967       switch ((*codep & 0x1f))
10968         {
10969         default:
10970           BadOp ();
10971         case 0x8:
10972           vex_table_index = XOP_08;
10973           break;
10974         case 0x9:
10975           vex_table_index = XOP_09;
10976           break;
10977         case 0xa:
10978           vex_table_index = XOP_0A;
10979           break;
10980         }
10981       codep++;
10982       vex.w = *codep & 0x80;
10983       if (vex.w && address_mode == mode_64bit)
10984         rex |= REX_W;
10985
10986       vex.register_specifier = (~(*codep >> 3)) & 0xf;
10987       if (address_mode != mode_64bit
10988           && vex.register_specifier > 0x7)
10989         BadOp ();
10990
10991       vex.length = (*codep & 0x4) ? 256 : 128;
10992       switch ((*codep & 0x3))
10993         {
10994         case 0:
10995           vex.prefix = 0;
10996           break;
10997         case 1:
10998           vex.prefix = DATA_PREFIX_OPCODE;
10999           break;
11000         case 2:
11001           vex.prefix = REPE_PREFIX_OPCODE;
11002           break;
11003         case 3:
11004           vex.prefix = REPNE_PREFIX_OPCODE;
11005           break;
11006         }
11007       need_vex = 1;
11008       need_vex_reg = 1;
11009       codep++;
11010       vindex = *codep++;
11011       dp = &xop_table[vex_table_index][vindex];
11012
11013       FETCH_DATA (info, codep + 1);
11014       modrm.mod = (*codep >> 6) & 3;
11015       modrm.reg = (*codep >> 3) & 7;
11016       modrm.rm = *codep & 7;
11017       break;
11018
11019     case USE_VEX_C4_TABLE:
11020       FETCH_DATA (info, codep + 3);
11021       /* All bits in the REX prefix are ignored.  */
11022       rex_ignored = rex;
11023       rex = ~(*codep >> 5) & 0x7;
11024       switch ((*codep & 0x1f))
11025         {
11026         default:
11027           BadOp ();
11028         case 0x1:
11029           vex_table_index = VEX_0F;
11030           break;
11031         case 0x2:
11032           vex_table_index = VEX_0F38;
11033           break;
11034         case 0x3:
11035           vex_table_index = VEX_0F3A;
11036           break;
11037         }
11038       codep++;
11039       vex.w = *codep & 0x80;
11040       if (vex.w && address_mode == mode_64bit)
11041         rex |= REX_W;
11042
11043       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11044       if (address_mode != mode_64bit
11045           && vex.register_specifier > 0x7)
11046         BadOp ();
11047
11048       vex.length = (*codep & 0x4) ? 256 : 128;
11049       switch ((*codep & 0x3))
11050         {
11051         case 0:
11052           vex.prefix = 0;
11053           break;
11054         case 1:
11055           vex.prefix = DATA_PREFIX_OPCODE;
11056           break;
11057         case 2:
11058           vex.prefix = REPE_PREFIX_OPCODE;
11059           break;
11060         case 3:
11061           vex.prefix = REPNE_PREFIX_OPCODE;
11062           break;
11063         }
11064       need_vex = 1;
11065       need_vex_reg = 1;
11066       codep++;
11067       vindex = *codep++;
11068       dp = &vex_table[vex_table_index][vindex];
11069       /* There is no MODRM byte for VEX [82|77].  */
11070       if (vindex != 0x77 && vindex != 0x82)
11071         {
11072           FETCH_DATA (info, codep + 1);
11073           modrm.mod = (*codep >> 6) & 3;
11074           modrm.reg = (*codep >> 3) & 7;
11075           modrm.rm = *codep & 7;
11076         }
11077       break;
11078
11079     case USE_VEX_C5_TABLE:
11080       FETCH_DATA (info, codep + 2);
11081       /* All bits in the REX prefix are ignored.  */
11082       rex_ignored = rex;
11083       rex = (*codep & 0x80) ? 0 : REX_R;
11084
11085       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11086       if (address_mode != mode_64bit
11087           && vex.register_specifier > 0x7)
11088         BadOp ();
11089
11090       vex.w = 0;
11091
11092       vex.length = (*codep & 0x4) ? 256 : 128;
11093       switch ((*codep & 0x3))
11094         {
11095         case 0:
11096           vex.prefix = 0;
11097           break;
11098         case 1:
11099           vex.prefix = DATA_PREFIX_OPCODE;
11100           break;
11101         case 2:
11102           vex.prefix = REPE_PREFIX_OPCODE;
11103           break;
11104         case 3:
11105           vex.prefix = REPNE_PREFIX_OPCODE;
11106           break;
11107         }
11108       need_vex = 1;
11109       need_vex_reg = 1;
11110       codep++;
11111       vindex = *codep++;
11112       dp = &vex_table[dp->op[1].bytemode][vindex];
11113       /* There is no MODRM byte for VEX [82|77].  */
11114       if (vindex != 0x77 && vindex != 0x82)
11115         {
11116           FETCH_DATA (info, codep + 1);
11117           modrm.mod = (*codep >> 6) & 3;
11118           modrm.reg = (*codep >> 3) & 7;
11119           modrm.rm = *codep & 7;
11120         }
11121       break;
11122
11123     case USE_VEX_W_TABLE:
11124       if (!need_vex)
11125         abort ();
11126
11127       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11128       break;
11129
11130     case 0:
11131       dp = &bad_opcode;
11132       break;
11133
11134     default:
11135       abort ();
11136     }
11137
11138   if (dp->name != NULL)
11139     return dp;
11140   else
11141     return get_valid_dis386 (dp, info);
11142 }
11143
11144 static int
11145 print_insn (bfd_vma pc, disassemble_info *info)
11146 {
11147   const struct dis386 *dp;
11148   int i;
11149   char *op_txt[MAX_OPERANDS];
11150   int needcomma;
11151   int sizeflag;
11152   const char *p;
11153   struct dis_private priv;
11154   unsigned char op;
11155   int prefix_length;
11156   int default_prefixes;
11157
11158   if (info->mach == bfd_mach_x86_64_intel_syntax
11159       || info->mach == bfd_mach_x86_64
11160       || info->mach == bfd_mach_l1om
11161       || info->mach == bfd_mach_l1om_intel_syntax)
11162     address_mode = mode_64bit;
11163   else
11164     address_mode = mode_32bit;
11165
11166   if (intel_syntax == (char) -1)
11167     intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
11168                     || info->mach == bfd_mach_x86_64_intel_syntax
11169                     || info->mach == bfd_mach_l1om_intel_syntax);
11170
11171   if (info->mach == bfd_mach_i386_i386
11172       || info->mach == bfd_mach_x86_64
11173       || info->mach == bfd_mach_l1om
11174       || info->mach == bfd_mach_i386_i386_intel_syntax
11175       || info->mach == bfd_mach_x86_64_intel_syntax
11176       || info->mach == bfd_mach_l1om_intel_syntax)
11177     priv.orig_sizeflag = AFLAG | DFLAG;
11178   else if (info->mach == bfd_mach_i386_i8086)
11179     priv.orig_sizeflag = 0;
11180   else
11181     abort ();
11182
11183   for (p = info->disassembler_options; p != NULL; )
11184     {
11185       if (CONST_STRNEQ (p, "x86-64"))
11186         {
11187           address_mode = mode_64bit;
11188           priv.orig_sizeflag = AFLAG | DFLAG;
11189         }
11190       else if (CONST_STRNEQ (p, "i386"))
11191         {
11192           address_mode = mode_32bit;
11193           priv.orig_sizeflag = AFLAG | DFLAG;
11194         }
11195       else if (CONST_STRNEQ (p, "i8086"))
11196         {
11197           address_mode = mode_16bit;
11198           priv.orig_sizeflag = 0;
11199         }
11200       else if (CONST_STRNEQ (p, "intel"))
11201         {
11202           intel_syntax = 1;
11203           if (CONST_STRNEQ (p + 5, "-mnemonic"))
11204             intel_mnemonic = 1;
11205         }
11206       else if (CONST_STRNEQ (p, "att"))
11207         {
11208           intel_syntax = 0;
11209           if (CONST_STRNEQ (p + 3, "-mnemonic"))
11210             intel_mnemonic = 0;
11211         }
11212       else if (CONST_STRNEQ (p, "addr"))
11213         {
11214           if (address_mode == mode_64bit)
11215             {
11216               if (p[4] == '3' && p[5] == '2')
11217                 priv.orig_sizeflag &= ~AFLAG;
11218               else if (p[4] == '6' && p[5] == '4')
11219                 priv.orig_sizeflag |= AFLAG;
11220             }
11221           else
11222             {
11223               if (p[4] == '1' && p[5] == '6')
11224                 priv.orig_sizeflag &= ~AFLAG;
11225               else if (p[4] == '3' && p[5] == '2')
11226                 priv.orig_sizeflag |= AFLAG;
11227             }
11228         }
11229       else if (CONST_STRNEQ (p, "data"))
11230         {
11231           if (p[4] == '1' && p[5] == '6')
11232             priv.orig_sizeflag &= ~DFLAG;
11233           else if (p[4] == '3' && p[5] == '2')
11234             priv.orig_sizeflag |= DFLAG;
11235         }
11236       else if (CONST_STRNEQ (p, "suffix"))
11237         priv.orig_sizeflag |= SUFFIX_ALWAYS;
11238
11239       p = strchr (p, ',');
11240       if (p != NULL)
11241         p++;
11242     }
11243
11244   if (intel_syntax)
11245     {
11246       names64 = intel_names64;
11247       names32 = intel_names32;
11248       names16 = intel_names16;
11249       names8 = intel_names8;
11250       names8rex = intel_names8rex;
11251       names_seg = intel_names_seg;
11252       names_mm = intel_names_mm;
11253       names_xmm = intel_names_xmm;
11254       names_ymm = intel_names_ymm;
11255       index64 = intel_index64;
11256       index32 = intel_index32;
11257       index16 = intel_index16;
11258       open_char = '[';
11259       close_char = ']';
11260       separator_char = '+';
11261       scale_char = '*';
11262     }
11263   else
11264     {
11265       names64 = att_names64;
11266       names32 = att_names32;
11267       names16 = att_names16;
11268       names8 = att_names8;
11269       names8rex = att_names8rex;
11270       names_seg = att_names_seg;
11271       names_mm = att_names_mm;
11272       names_xmm = att_names_xmm;
11273       names_ymm = att_names_ymm;
11274       index64 = att_index64;
11275       index32 = att_index32;
11276       index16 = att_index16;
11277       open_char = '(';
11278       close_char =  ')';
11279       separator_char = ',';
11280       scale_char = ',';
11281     }
11282
11283   /* The output looks better if we put 7 bytes on a line, since that
11284      puts most long word instructions on a single line.  Use 8 bytes
11285      for Intel L1OM.  */
11286   if (info->mach == bfd_mach_l1om
11287       || info->mach == bfd_mach_l1om_intel_syntax)
11288     info->bytes_per_line = 8;
11289   else
11290     info->bytes_per_line = 7;
11291
11292   info->private_data = &priv;
11293   priv.max_fetched = priv.the_buffer;
11294   priv.insn_start = pc;
11295
11296   obuf[0] = 0;
11297   for (i = 0; i < MAX_OPERANDS; ++i)
11298     {
11299       op_out[i][0] = 0;
11300       op_index[i] = -1;
11301     }
11302
11303   the_info = info;
11304   start_pc = pc;
11305   start_codep = priv.the_buffer;
11306   codep = priv.the_buffer;
11307
11308   if (setjmp (priv.bailout) != 0)
11309     {
11310       const char *name;
11311
11312       /* Getting here means we tried for data but didn't get it.  That
11313          means we have an incomplete instruction of some sort.  Just
11314          print the first byte as a prefix or a .byte pseudo-op.  */
11315       if (codep > priv.the_buffer)
11316         {
11317           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
11318           if (name != NULL)
11319             (*info->fprintf_func) (info->stream, "%s", name);
11320           else
11321             {
11322               /* Just print the first byte as a .byte instruction.  */
11323               (*info->fprintf_func) (info->stream, ".byte 0x%x",
11324                                      (unsigned int) priv.the_buffer[0]);
11325             }
11326
11327           return 1;
11328         }
11329
11330       return -1;
11331     }
11332
11333   obufp = obuf;
11334   sizeflag = priv.orig_sizeflag;
11335
11336   if (!ckprefix () || rex_used)
11337     {
11338       /* Too many prefixes or unused REX prefixes.  */
11339       for (i = 0;
11340            all_prefixes[i] && i < (int) ARRAY_SIZE (all_prefixes);
11341            i++)
11342         (*info->fprintf_func) (info->stream, "%s",
11343                                prefix_name (all_prefixes[i], sizeflag));
11344       return 1;
11345     }
11346
11347   insn_codep = codep;
11348
11349   FETCH_DATA (info, codep + 1);
11350   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
11351
11352   if (((prefixes & PREFIX_FWAIT)
11353        && ((*codep < 0xd8) || (*codep > 0xdf))))
11354     {
11355       (*info->fprintf_func) (info->stream, "fwait");
11356       return 1;
11357     }
11358
11359   op = 0;
11360
11361   if (*codep == 0x0f)
11362     {
11363       unsigned char threebyte;
11364       FETCH_DATA (info, codep + 2);
11365       threebyte = *++codep;
11366       dp = &dis386_twobyte[threebyte];
11367       need_modrm = twobyte_has_modrm[*codep];
11368       codep++;
11369     }
11370   else
11371     {
11372       dp = &dis386[*codep];
11373       need_modrm = onebyte_has_modrm[*codep];
11374       codep++;
11375     }
11376
11377   if ((prefixes & PREFIX_REPZ))
11378     used_prefixes |= PREFIX_REPZ;
11379   if ((prefixes & PREFIX_REPNZ))
11380     used_prefixes |= PREFIX_REPNZ;
11381   if ((prefixes & PREFIX_LOCK))
11382     used_prefixes |= PREFIX_LOCK;
11383
11384   default_prefixes = 0;
11385   if (prefixes & PREFIX_ADDR)
11386     {
11387       sizeflag ^= AFLAG;
11388       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
11389         {
11390           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11391             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
11392           else
11393             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
11394           default_prefixes |= PREFIX_ADDR;
11395         }
11396     }
11397
11398   if ((prefixes & PREFIX_DATA))
11399     {
11400       sizeflag ^= DFLAG;
11401       if (dp->op[2].bytemode == cond_jump_mode
11402           && dp->op[0].bytemode == v_mode
11403           && !intel_syntax)
11404         {
11405           if (sizeflag & DFLAG)
11406             all_prefixes[last_data_prefix] = DATA32_PREFIX;
11407           else
11408             all_prefixes[last_data_prefix] = DATA16_PREFIX;
11409           default_prefixes |= PREFIX_DATA;
11410         }
11411       else if (rex & REX_W)
11412         {
11413           /* REX_W will override PREFIX_DATA.  */
11414           default_prefixes |= PREFIX_DATA;
11415         }
11416     }
11417
11418   if (need_modrm)
11419     {
11420       FETCH_DATA (info, codep + 1);
11421       modrm.mod = (*codep >> 6) & 3;
11422       modrm.reg = (*codep >> 3) & 7;
11423       modrm.rm = *codep & 7;
11424     }
11425
11426    need_vex = 0;
11427    need_vex_reg = 0;
11428    vex_w_done = 0;
11429
11430   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
11431     {
11432       dofloat (sizeflag);
11433     }
11434   else
11435     {
11436       dp = get_valid_dis386 (dp, info);
11437       if (dp != NULL && putop (dp->name, sizeflag) == 0)
11438         {
11439           for (i = 0; i < MAX_OPERANDS; ++i)
11440             {
11441               obufp = op_out[i];
11442               op_ad = MAX_OPERANDS - 1 - i;
11443               if (dp->op[i].rtn)
11444                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
11445             }
11446         }
11447     }
11448
11449   /* See if any prefixes were not used.  If so, print the first one
11450      separately.  If we don't do this, we'll wind up printing an
11451      instruction stream which does not precisely correspond to the
11452      bytes we are disassembling.  */
11453   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
11454     {
11455       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11456         if (all_prefixes[i])
11457           {
11458             const char *name;
11459             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
11460             if (name == NULL)
11461               name = INTERNAL_DISASSEMBLER_ERROR;
11462             (*info->fprintf_func) (info->stream, "%s", name);
11463             return 1;
11464           }
11465     }
11466
11467   /* Check if the REX prefix is used.  */
11468   if (rex_ignored == 0 && (rex ^ rex_used) == 0)
11469     all_prefixes[last_rex_prefix] = 0;
11470
11471   /* Check if the SEG prefix is used.  */
11472   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
11473                    | PREFIX_FS | PREFIX_GS)) != 0
11474       && (used_prefixes
11475           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
11476     all_prefixes[last_seg_prefix] = 0;
11477
11478   /* Check if the ADDR prefix is used.  */
11479   if ((prefixes & PREFIX_ADDR) != 0
11480       && (used_prefixes & PREFIX_ADDR) != 0)
11481     all_prefixes[last_addr_prefix] = 0;
11482
11483   /* Check if the DATA prefix is used.  */
11484   if ((prefixes & PREFIX_DATA) != 0
11485       && (used_prefixes & PREFIX_DATA) != 0)
11486     all_prefixes[last_data_prefix] = 0;
11487
11488   prefix_length = 0;
11489   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11490     if (all_prefixes[i])
11491       {
11492         const char *name;
11493         name = prefix_name (all_prefixes[i], sizeflag);
11494         if (name == NULL)
11495           abort ();
11496         prefix_length += strlen (name) + 1;
11497         (*info->fprintf_func) (info->stream, "%s ", name);
11498       }
11499
11500   /* Check maximum code length.  */
11501   if ((codep - start_codep) > MAX_CODE_LENGTH)
11502     {
11503       (*info->fprintf_func) (info->stream, "(bad)");
11504       return MAX_CODE_LENGTH;
11505     }
11506
11507   obufp = mnemonicendp;
11508   for (i = strlen (obuf) + prefix_length; i < 6; i++)
11509     oappend (" ");
11510   oappend (" ");
11511   (*info->fprintf_func) (info->stream, "%s", obuf);
11512
11513   /* The enter and bound instructions are printed with operands in the same
11514      order as the intel book; everything else is printed in reverse order.  */
11515   if (intel_syntax || two_source_ops)
11516     {
11517       bfd_vma riprel;
11518
11519       for (i = 0; i < MAX_OPERANDS; ++i)
11520         op_txt[i] = op_out[i];
11521
11522       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
11523         {
11524           op_ad = op_index[i];
11525           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
11526           op_index[MAX_OPERANDS - 1 - i] = op_ad;
11527           riprel = op_riprel[i];
11528           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
11529           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
11530         }
11531     }
11532   else
11533     {
11534       for (i = 0; i < MAX_OPERANDS; ++i)
11535         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
11536     }
11537
11538   needcomma = 0;
11539   for (i = 0; i < MAX_OPERANDS; ++i)
11540     if (*op_txt[i])
11541       {
11542         if (needcomma)
11543           (*info->fprintf_func) (info->stream, ",");
11544         if (op_index[i] != -1 && !op_riprel[i])
11545           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
11546         else
11547           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
11548         needcomma = 1;
11549       }
11550
11551   for (i = 0; i < MAX_OPERANDS; i++)
11552     if (op_index[i] != -1 && op_riprel[i])
11553       {
11554         (*info->fprintf_func) (info->stream, "        # ");
11555         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
11556                                                 + op_address[op_index[i]]), info);
11557         break;
11558       }
11559   return codep - priv.the_buffer;
11560 }
11561
11562 static const char *float_mem[] = {
11563   /* d8 */
11564   "fadd{s|}",
11565   "fmul{s|}",
11566   "fcom{s|}",
11567   "fcomp{s|}",
11568   "fsub{s|}",
11569   "fsubr{s|}",
11570   "fdiv{s|}",
11571   "fdivr{s|}",
11572   /* d9 */
11573   "fld{s|}",
11574   "(bad)",
11575   "fst{s|}",
11576   "fstp{s|}",
11577   "fldenvIC",
11578   "fldcw",
11579   "fNstenvIC",
11580   "fNstcw",
11581   /* da */
11582   "fiadd{l|}",
11583   "fimul{l|}",
11584   "ficom{l|}",
11585   "ficomp{l|}",
11586   "fisub{l|}",
11587   "fisubr{l|}",
11588   "fidiv{l|}",
11589   "fidivr{l|}",
11590   /* db */
11591   "fild{l|}",
11592   "fisttp{l|}",
11593   "fist{l|}",
11594   "fistp{l|}",
11595   "(bad)",
11596   "fld{t||t|}",
11597   "(bad)",
11598   "fstp{t||t|}",
11599   /* dc */
11600   "fadd{l|}",
11601   "fmul{l|}",
11602   "fcom{l|}",
11603   "fcomp{l|}",
11604   "fsub{l|}",
11605   "fsubr{l|}",
11606   "fdiv{l|}",
11607   "fdivr{l|}",
11608   /* dd */
11609   "fld{l|}",
11610   "fisttp{ll|}",
11611   "fst{l||}",
11612   "fstp{l|}",
11613   "frstorIC",
11614   "(bad)",
11615   "fNsaveIC",
11616   "fNstsw",
11617   /* de */
11618   "fiadd",
11619   "fimul",
11620   "ficom",
11621   "ficomp",
11622   "fisub",
11623   "fisubr",
11624   "fidiv",
11625   "fidivr",
11626   /* df */
11627   "fild",
11628   "fisttp",
11629   "fist",
11630   "fistp",
11631   "fbld",
11632   "fild{ll|}",
11633   "fbstp",
11634   "fistp{ll|}",
11635 };
11636
11637 static const unsigned char float_mem_mode[] = {
11638   /* d8 */
11639   d_mode,
11640   d_mode,
11641   d_mode,
11642   d_mode,
11643   d_mode,
11644   d_mode,
11645   d_mode,
11646   d_mode,
11647   /* d9 */
11648   d_mode,
11649   0,
11650   d_mode,
11651   d_mode,
11652   0,
11653   w_mode,
11654   0,
11655   w_mode,
11656   /* da */
11657   d_mode,
11658   d_mode,
11659   d_mode,
11660   d_mode,
11661   d_mode,
11662   d_mode,
11663   d_mode,
11664   d_mode,
11665   /* db */
11666   d_mode,
11667   d_mode,
11668   d_mode,
11669   d_mode,
11670   0,
11671   t_mode,
11672   0,
11673   t_mode,
11674   /* dc */
11675   q_mode,
11676   q_mode,
11677   q_mode,
11678   q_mode,
11679   q_mode,
11680   q_mode,
11681   q_mode,
11682   q_mode,
11683   /* dd */
11684   q_mode,
11685   q_mode,
11686   q_mode,
11687   q_mode,
11688   0,
11689   0,
11690   0,
11691   w_mode,
11692   /* de */
11693   w_mode,
11694   w_mode,
11695   w_mode,
11696   w_mode,
11697   w_mode,
11698   w_mode,
11699   w_mode,
11700   w_mode,
11701   /* df */
11702   w_mode,
11703   w_mode,
11704   w_mode,
11705   w_mode,
11706   t_mode,
11707   q_mode,
11708   t_mode,
11709   q_mode
11710 };
11711
11712 #define ST { OP_ST, 0 }
11713 #define STi { OP_STi, 0 }
11714
11715 #define FGRPd9_2 NULL, { { NULL, 0 } }
11716 #define FGRPd9_4 NULL, { { NULL, 1 } }
11717 #define FGRPd9_5 NULL, { { NULL, 2 } }
11718 #define FGRPd9_6 NULL, { { NULL, 3 } }
11719 #define FGRPd9_7 NULL, { { NULL, 4 } }
11720 #define FGRPda_5 NULL, { { NULL, 5 } }
11721 #define FGRPdb_4 NULL, { { NULL, 6 } }
11722 #define FGRPde_3 NULL, { { NULL, 7 } }
11723 #define FGRPdf_4 NULL, { { NULL, 8 } }
11724
11725 static const struct dis386 float_reg[][8] = {
11726   /* d8 */
11727   {
11728     { "fadd",   { ST, STi } },
11729     { "fmul",   { ST, STi } },
11730     { "fcom",   { STi } },
11731     { "fcomp",  { STi } },
11732     { "fsub",   { ST, STi } },
11733     { "fsubr",  { ST, STi } },
11734     { "fdiv",   { ST, STi } },
11735     { "fdivr",  { ST, STi } },
11736   },
11737   /* d9 */
11738   {
11739     { "fld",    { STi } },
11740     { "fxch",   { STi } },
11741     { FGRPd9_2 },
11742     { Bad_Opcode },
11743     { FGRPd9_4 },
11744     { FGRPd9_5 },
11745     { FGRPd9_6 },
11746     { FGRPd9_7 },
11747   },
11748   /* da */
11749   {
11750     { "fcmovb", { ST, STi } },
11751     { "fcmove", { ST, STi } },
11752     { "fcmovbe",{ ST, STi } },
11753     { "fcmovu", { ST, STi } },
11754     { Bad_Opcode },
11755     { FGRPda_5 },
11756     { Bad_Opcode },
11757     { Bad_Opcode },
11758   },
11759   /* db */
11760   {
11761     { "fcmovnb",{ ST, STi } },
11762     { "fcmovne",{ ST, STi } },
11763     { "fcmovnbe",{ ST, STi } },
11764     { "fcmovnu",{ ST, STi } },
11765     { FGRPdb_4 },
11766     { "fucomi", { ST, STi } },
11767     { "fcomi",  { ST, STi } },
11768     { Bad_Opcode },
11769   },
11770   /* dc */
11771   {
11772     { "fadd",   { STi, ST } },
11773     { "fmul",   { STi, ST } },
11774     { Bad_Opcode },
11775     { Bad_Opcode },
11776     { "fsub!M", { STi, ST } },
11777     { "fsubM",  { STi, ST } },
11778     { "fdiv!M", { STi, ST } },
11779     { "fdivM",  { STi, ST } },
11780   },
11781   /* dd */
11782   {
11783     { "ffree",  { STi } },
11784     { Bad_Opcode },
11785     { "fst",    { STi } },
11786     { "fstp",   { STi } },
11787     { "fucom",  { STi } },
11788     { "fucomp", { STi } },
11789     { Bad_Opcode },
11790     { Bad_Opcode },
11791   },
11792   /* de */
11793   {
11794     { "faddp",  { STi, ST } },
11795     { "fmulp",  { STi, ST } },
11796     { Bad_Opcode },
11797     { FGRPde_3 },
11798     { "fsub!Mp", { STi, ST } },
11799     { "fsubMp", { STi, ST } },
11800     { "fdiv!Mp", { STi, ST } },
11801     { "fdivMp", { STi, ST } },
11802   },
11803   /* df */
11804   {
11805     { "ffreep", { STi } },
11806     { Bad_Opcode },
11807     { Bad_Opcode },
11808     { Bad_Opcode },
11809     { FGRPdf_4 },
11810     { "fucomip", { ST, STi } },
11811     { "fcomip", { ST, STi } },
11812     { Bad_Opcode },
11813   },
11814 };
11815
11816 static char *fgrps[][8] = {
11817   /* d9_2  0 */
11818   {
11819     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11820   },
11821
11822   /* d9_4  1 */
11823   {
11824     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
11825   },
11826
11827   /* d9_5  2 */
11828   {
11829     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
11830   },
11831
11832   /* d9_6  3 */
11833   {
11834     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
11835   },
11836
11837   /* d9_7  4 */
11838   {
11839     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
11840   },
11841
11842   /* da_5  5 */
11843   {
11844     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11845   },
11846
11847   /* db_4  6 */
11848   {
11849     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
11850     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
11851   },
11852
11853   /* de_3  7 */
11854   {
11855     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11856   },
11857
11858   /* df_4  8 */
11859   {
11860     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
11861   },
11862 };
11863
11864 static void
11865 swap_operand (void)
11866 {
11867   mnemonicendp[0] = '.';
11868   mnemonicendp[1] = 's';
11869   mnemonicendp += 2;
11870 }
11871
11872 static void
11873 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
11874                int sizeflag ATTRIBUTE_UNUSED)
11875 {
11876   /* Skip mod/rm byte.  */
11877   MODRM_CHECK;
11878   codep++;
11879 }
11880
11881 static void
11882 dofloat (int sizeflag)
11883 {
11884   const struct dis386 *dp;
11885   unsigned char floatop;
11886
11887   floatop = codep[-1];
11888
11889   if (modrm.mod != 3)
11890     {
11891       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
11892
11893       putop (float_mem[fp_indx], sizeflag);
11894       obufp = op_out[0];
11895       op_ad = 2;
11896       OP_E (float_mem_mode[fp_indx], sizeflag);
11897       return;
11898     }
11899   /* Skip mod/rm byte.  */
11900   MODRM_CHECK;
11901   codep++;
11902
11903   dp = &float_reg[floatop - 0xd8][modrm.reg];
11904   if (dp->name == NULL)
11905     {
11906       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
11907
11908       /* Instruction fnstsw is only one with strange arg.  */
11909       if (floatop == 0xdf && codep[-1] == 0xe0)
11910         strcpy (op_out[0], names16[0]);
11911     }
11912   else
11913     {
11914       putop (dp->name, sizeflag);
11915
11916       obufp = op_out[0];
11917       op_ad = 2;
11918       if (dp->op[0].rtn)
11919         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
11920
11921       obufp = op_out[1];
11922       op_ad = 1;
11923       if (dp->op[1].rtn)
11924         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
11925     }
11926 }
11927
11928 static void
11929 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11930 {
11931   oappend ("%st" + intel_syntax);
11932 }
11933
11934 static void
11935 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
11936 {
11937   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
11938   oappend (scratchbuf + intel_syntax);
11939 }
11940
11941 /* Capital letters in template are macros.  */
11942 static int
11943 putop (const char *in_template, int sizeflag)
11944 {
11945   const char *p;
11946   int alt = 0;
11947   int cond = 1;
11948   unsigned int l = 0, len = 1;
11949   char last[4];
11950
11951 #define SAVE_LAST(c)                    \
11952   if (l < len && l < sizeof (last))     \
11953     last[l++] = c;                      \
11954   else                                  \
11955     abort ();
11956
11957   for (p = in_template; *p; p++)
11958     {
11959       switch (*p)
11960         {
11961         default:
11962           *obufp++ = *p;
11963           break;
11964         case '%':
11965           len++;
11966           break;
11967         case '!':
11968           cond = 0;
11969           break;
11970         case '{':
11971           alt = 0;
11972           if (intel_syntax)
11973             {
11974               while (*++p != '|')
11975                 if (*p == '}' || *p == '\0')
11976                   abort ();
11977             }
11978           /* Fall through.  */
11979         case 'I':
11980           alt = 1;
11981           continue;
11982         case '|':
11983           while (*++p != '}')
11984             {
11985               if (*p == '\0')
11986                 abort ();
11987             }
11988           break;
11989         case '}':
11990           break;
11991         case 'A':
11992           if (intel_syntax)
11993             break;
11994           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
11995             *obufp++ = 'b';
11996           break;
11997         case 'B':
11998           if (l == 0 && len == 1)
11999             {
12000 case_B:
12001               if (intel_syntax)
12002                 break;
12003               if (sizeflag & SUFFIX_ALWAYS)
12004                 *obufp++ = 'b';
12005             }
12006           else
12007             {
12008               if (l != 1
12009                   || len != 2
12010                   || last[0] != 'L')
12011                 {
12012                   SAVE_LAST (*p);
12013                   break;
12014                 }
12015
12016               if (address_mode == mode_64bit
12017                   && !(prefixes & PREFIX_ADDR))
12018                 {
12019                   *obufp++ = 'a';
12020                   *obufp++ = 'b';
12021                   *obufp++ = 's';
12022                 }
12023
12024               goto case_B;
12025             }
12026           break;
12027         case 'C':
12028           if (intel_syntax && !alt)
12029             break;
12030           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12031             {
12032               if (sizeflag & DFLAG)
12033                 *obufp++ = intel_syntax ? 'd' : 'l';
12034               else
12035                 *obufp++ = intel_syntax ? 'w' : 's';
12036               used_prefixes |= (prefixes & PREFIX_DATA);
12037             }
12038           break;
12039         case 'D':
12040           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12041             break;
12042           USED_REX (REX_W);
12043           if (modrm.mod == 3)
12044             {
12045               if (rex & REX_W)
12046                 *obufp++ = 'q';
12047               else
12048                 {
12049                   if (sizeflag & DFLAG)
12050                     *obufp++ = intel_syntax ? 'd' : 'l';
12051                   else
12052                     *obufp++ = 'w';
12053                   used_prefixes |= (prefixes & PREFIX_DATA);
12054                 }
12055             }
12056           else
12057             *obufp++ = 'w';
12058           break;
12059         case 'E':               /* For jcxz/jecxz */
12060           if (address_mode == mode_64bit)
12061             {
12062               if (sizeflag & AFLAG)
12063                 *obufp++ = 'r';
12064               else
12065                 *obufp++ = 'e';
12066             }
12067           else
12068             if (sizeflag & AFLAG)
12069               *obufp++ = 'e';
12070           used_prefixes |= (prefixes & PREFIX_ADDR);
12071           break;
12072         case 'F':
12073           if (intel_syntax)
12074             break;
12075           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12076             {
12077               if (sizeflag & AFLAG)
12078                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12079               else
12080                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12081               used_prefixes |= (prefixes & PREFIX_ADDR);
12082             }
12083           break;
12084         case 'G':
12085           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12086             break;
12087           if ((rex & REX_W) || (sizeflag & DFLAG))
12088             *obufp++ = 'l';
12089           else
12090             *obufp++ = 'w';
12091           if (!(rex & REX_W))
12092             used_prefixes |= (prefixes & PREFIX_DATA);
12093           break;
12094         case 'H':
12095           if (intel_syntax)
12096             break;
12097           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12098               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12099             {
12100               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12101               *obufp++ = ',';
12102               *obufp++ = 'p';
12103               if (prefixes & PREFIX_DS)
12104                 *obufp++ = 't';
12105               else
12106                 *obufp++ = 'n';
12107             }
12108           break;
12109         case 'J':
12110           if (intel_syntax)
12111             break;
12112           *obufp++ = 'l';
12113           break;
12114         case 'K':
12115           USED_REX (REX_W);
12116           if (rex & REX_W)
12117             *obufp++ = 'q';
12118           else
12119             *obufp++ = 'd';
12120           break;
12121         case 'Z':
12122           if (intel_syntax)
12123             break;
12124           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12125             {
12126               *obufp++ = 'q';
12127               break;
12128             }
12129           /* Fall through.  */
12130           goto case_L;
12131         case 'L':
12132           if (l != 0 || len != 1)
12133             {
12134               SAVE_LAST (*p);
12135               break;
12136             }
12137 case_L:
12138           if (intel_syntax)
12139             break;
12140           if (sizeflag & SUFFIX_ALWAYS)
12141             *obufp++ = 'l';
12142           break;
12143         case 'M':
12144           if (intel_mnemonic != cond)
12145             *obufp++ = 'r';
12146           break;
12147         case 'N':
12148           if ((prefixes & PREFIX_FWAIT) == 0)
12149             *obufp++ = 'n';
12150           else
12151             used_prefixes |= PREFIX_FWAIT;
12152           break;
12153         case 'O':
12154           USED_REX (REX_W);
12155           if (rex & REX_W)
12156             *obufp++ = 'o';
12157           else if (intel_syntax && (sizeflag & DFLAG))
12158             *obufp++ = 'q';
12159           else
12160             *obufp++ = 'd';
12161           if (!(rex & REX_W))
12162             used_prefixes |= (prefixes & PREFIX_DATA);
12163           break;
12164         case 'T':
12165           if (intel_syntax)
12166             break;
12167           if (address_mode == mode_64bit && (sizeflag & DFLAG))
12168             {
12169               *obufp++ = 'q';
12170               break;
12171             }
12172           /* Fall through.  */
12173         case 'P':
12174           if (intel_syntax)
12175             break;
12176           if ((prefixes & PREFIX_DATA)
12177               || (rex & REX_W)
12178               || (sizeflag & SUFFIX_ALWAYS))
12179             {
12180               USED_REX (REX_W);
12181               if (rex & REX_W)
12182                 *obufp++ = 'q';
12183               else
12184                 {
12185                    if (sizeflag & DFLAG)
12186                       *obufp++ = 'l';
12187                    else
12188                      *obufp++ = 'w';
12189                    used_prefixes |= (prefixes & PREFIX_DATA);
12190                 }
12191             }
12192           break;
12193         case 'U':
12194           if (intel_syntax)
12195             break;
12196           if (address_mode == mode_64bit && (sizeflag & DFLAG))
12197             {
12198               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12199                 *obufp++ = 'q';
12200               break;
12201             }
12202           /* Fall through.  */
12203           goto case_Q;
12204         case 'Q':
12205           if (l == 0 && len == 1)
12206             {
12207 case_Q:
12208               if (intel_syntax && !alt)
12209                 break;
12210               USED_REX (REX_W);
12211               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12212                 {
12213                   if (rex & REX_W)
12214                     *obufp++ = 'q';
12215                   else
12216                     {
12217                       if (sizeflag & DFLAG)
12218                         *obufp++ = intel_syntax ? 'd' : 'l';
12219                       else
12220                         *obufp++ = 'w';
12221                       used_prefixes |= (prefixes & PREFIX_DATA);
12222                     }
12223                 }
12224             }
12225           else
12226             {
12227               if (l != 1 || len != 2 || last[0] != 'L')
12228                 {
12229                   SAVE_LAST (*p);
12230                   break;
12231                 }
12232               if (intel_syntax
12233                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12234                 break;
12235               if ((rex & REX_W))
12236                 {
12237                   USED_REX (REX_W);
12238                   *obufp++ = 'q';
12239                 }
12240               else
12241                 *obufp++ = 'l';
12242             }
12243           break;
12244         case 'R':
12245           USED_REX (REX_W);
12246           if (rex & REX_W)
12247             *obufp++ = 'q';
12248           else if (sizeflag & DFLAG)
12249             {
12250               if (intel_syntax)
12251                   *obufp++ = 'd';
12252               else
12253                   *obufp++ = 'l';
12254             }
12255           else
12256             *obufp++ = 'w';
12257           if (intel_syntax && !p[1]
12258               && ((rex & REX_W) || (sizeflag & DFLAG)))
12259             *obufp++ = 'e';
12260           if (!(rex & REX_W))
12261             used_prefixes |= (prefixes & PREFIX_DATA);
12262           break;
12263         case 'V':
12264           if (l == 0 && len == 1)
12265             {
12266               if (intel_syntax)
12267                 break;
12268               if (address_mode == mode_64bit && (sizeflag & DFLAG))
12269                 {
12270                   if (sizeflag & SUFFIX_ALWAYS)
12271                     *obufp++ = 'q';
12272                   break;
12273                 }
12274             }
12275           else
12276             {
12277               if (l != 1
12278                   || len != 2
12279                   || last[0] != 'L')
12280                 {
12281                   SAVE_LAST (*p);
12282                   break;
12283                 }
12284
12285               if (rex & REX_W)
12286                 {
12287                   *obufp++ = 'a';
12288                   *obufp++ = 'b';
12289                   *obufp++ = 's';
12290                 }
12291             }
12292           /* Fall through.  */
12293           goto case_S;
12294         case 'S':
12295           if (l == 0 && len == 1)
12296             {
12297 case_S:
12298               if (intel_syntax)
12299                 break;
12300               if (sizeflag & SUFFIX_ALWAYS)
12301                 {
12302                   if (rex & REX_W)
12303                     *obufp++ = 'q';
12304                   else
12305                     {
12306                       if (sizeflag & DFLAG)
12307                         *obufp++ = 'l';
12308                       else
12309                         *obufp++ = 'w';
12310                       used_prefixes |= (prefixes & PREFIX_DATA);
12311                     }
12312                 }
12313             }
12314           else
12315             {
12316               if (l != 1
12317                   || len != 2
12318                   || last[0] != 'L')
12319                 {
12320                   SAVE_LAST (*p);
12321                   break;
12322                 }
12323
12324               if (address_mode == mode_64bit
12325                   && !(prefixes & PREFIX_ADDR))
12326                 {
12327                   *obufp++ = 'a';
12328                   *obufp++ = 'b';
12329                   *obufp++ = 's';
12330                 }
12331
12332               goto case_S;
12333             }
12334           break;
12335         case 'X':
12336           if (l != 0 || len != 1)
12337             {
12338               SAVE_LAST (*p);
12339               break;
12340             }
12341           if (need_vex && vex.prefix)
12342             {
12343               if (vex.prefix == DATA_PREFIX_OPCODE)
12344                 *obufp++ = 'd';
12345               else
12346                 *obufp++ = 's';
12347             }
12348           else
12349             {
12350               if (prefixes & PREFIX_DATA)
12351                 *obufp++ = 'd';
12352               else
12353                 *obufp++ = 's';
12354               used_prefixes |= (prefixes & PREFIX_DATA);
12355             }
12356           break;
12357         case 'Y':
12358           if (l == 0 && len == 1)
12359             {
12360               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12361                 break;
12362               if (rex & REX_W)
12363                 {
12364                   USED_REX (REX_W);
12365                   *obufp++ = 'q';
12366                 }
12367               break;
12368             }
12369           else
12370             {
12371               if (l != 1 || len != 2 || last[0] != 'X')
12372                 {
12373                   SAVE_LAST (*p);
12374                   break;
12375                 }
12376               if (!need_vex)
12377                 abort ();
12378               if (intel_syntax
12379                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
12380                 break;
12381               switch (vex.length)
12382                 {
12383                 case 128:
12384                   *obufp++ = 'x';
12385                   break;
12386                 case 256:
12387                   *obufp++ = 'y';
12388                   break;
12389                 default:
12390                   abort ();
12391                 }
12392             }
12393           break;
12394         case 'W':
12395           if (l == 0 && len == 1)
12396             {
12397               /* operand size flag for cwtl, cbtw */
12398               USED_REX (REX_W);
12399               if (rex & REX_W)
12400                 {
12401                   if (intel_syntax)
12402                     *obufp++ = 'd';
12403                   else
12404                     *obufp++ = 'l';
12405                 }
12406               else if (sizeflag & DFLAG)
12407                 *obufp++ = 'w';
12408               else
12409                 *obufp++ = 'b';
12410               if (!(rex & REX_W))
12411                 used_prefixes |= (prefixes & PREFIX_DATA);
12412             }
12413           else
12414             {
12415               if (l != 1 || len != 2 || last[0] != 'X')
12416                 {
12417                   SAVE_LAST (*p);
12418                   break;
12419                 }
12420               if (!need_vex)
12421                 abort ();
12422               *obufp++ = vex.w ? 'd': 's';
12423             }
12424           break;
12425         }
12426       alt = 0;
12427     }
12428   *obufp = 0;
12429   mnemonicendp = obufp;
12430   return 0;
12431 }
12432
12433 static void
12434 oappend (const char *s)
12435 {
12436   obufp = stpcpy (obufp, s);
12437 }
12438
12439 static void
12440 append_seg (void)
12441 {
12442   if (prefixes & PREFIX_CS)
12443     {
12444       used_prefixes |= PREFIX_CS;
12445       oappend ("%cs:" + intel_syntax);
12446     }
12447   if (prefixes & PREFIX_DS)
12448     {
12449       used_prefixes |= PREFIX_DS;
12450       oappend ("%ds:" + intel_syntax);
12451     }
12452   if (prefixes & PREFIX_SS)
12453     {
12454       used_prefixes |= PREFIX_SS;
12455       oappend ("%ss:" + intel_syntax);
12456     }
12457   if (prefixes & PREFIX_ES)
12458     {
12459       used_prefixes |= PREFIX_ES;
12460       oappend ("%es:" + intel_syntax);
12461     }
12462   if (prefixes & PREFIX_FS)
12463     {
12464       used_prefixes |= PREFIX_FS;
12465       oappend ("%fs:" + intel_syntax);
12466     }
12467   if (prefixes & PREFIX_GS)
12468     {
12469       used_prefixes |= PREFIX_GS;
12470       oappend ("%gs:" + intel_syntax);
12471     }
12472 }
12473
12474 static void
12475 OP_indirE (int bytemode, int sizeflag)
12476 {
12477   if (!intel_syntax)
12478     oappend ("*");
12479   OP_E (bytemode, sizeflag);
12480 }
12481
12482 static void
12483 print_operand_value (char *buf, int hex, bfd_vma disp)
12484 {
12485   if (address_mode == mode_64bit)
12486     {
12487       if (hex)
12488         {
12489           char tmp[30];
12490           int i;
12491           buf[0] = '0';
12492           buf[1] = 'x';
12493           sprintf_vma (tmp, disp);
12494           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
12495           strcpy (buf + 2, tmp + i);
12496         }
12497       else
12498         {
12499           bfd_signed_vma v = disp;
12500           char tmp[30];
12501           int i;
12502           if (v < 0)
12503             {
12504               *(buf++) = '-';
12505               v = -disp;
12506               /* Check for possible overflow on 0x8000000000000000.  */
12507               if (v < 0)
12508                 {
12509                   strcpy (buf, "9223372036854775808");
12510                   return;
12511                 }
12512             }
12513           if (!v)
12514             {
12515               strcpy (buf, "0");
12516               return;
12517             }
12518
12519           i = 0;
12520           tmp[29] = 0;
12521           while (v)
12522             {
12523               tmp[28 - i] = (v % 10) + '0';
12524               v /= 10;
12525               i++;
12526             }
12527           strcpy (buf, tmp + 29 - i);
12528         }
12529     }
12530   else
12531     {
12532       if (hex)
12533         sprintf (buf, "0x%x", (unsigned int) disp);
12534       else
12535         sprintf (buf, "%d", (int) disp);
12536     }
12537 }
12538
12539 /* Put DISP in BUF as signed hex number.  */
12540
12541 static void
12542 print_displacement (char *buf, bfd_vma disp)
12543 {
12544   bfd_signed_vma val = disp;
12545   char tmp[30];
12546   int i, j = 0;
12547
12548   if (val < 0)
12549     {
12550       buf[j++] = '-';
12551       val = -disp;
12552
12553       /* Check for possible overflow.  */
12554       if (val < 0)
12555         {
12556           switch (address_mode)
12557             {
12558             case mode_64bit:
12559               strcpy (buf + j, "0x8000000000000000");
12560               break;
12561             case mode_32bit:
12562               strcpy (buf + j, "0x80000000");
12563               break;
12564             case mode_16bit:
12565               strcpy (buf + j, "0x8000");
12566               break;
12567             }
12568           return;
12569         }
12570     }
12571
12572   buf[j++] = '0';
12573   buf[j++] = 'x';
12574
12575   sprintf_vma (tmp, (bfd_vma) val);
12576   for (i = 0; tmp[i] == '0'; i++)
12577     continue;
12578   if (tmp[i] == '\0')
12579     i--;
12580   strcpy (buf + j, tmp + i);
12581 }
12582
12583 static void
12584 intel_operand_size (int bytemode, int sizeflag)
12585 {
12586   switch (bytemode)
12587     {
12588     case b_mode:
12589     case b_swap_mode:
12590     case dqb_mode:
12591       oappend ("BYTE PTR ");
12592       break;
12593     case w_mode:
12594     case dqw_mode:
12595       oappend ("WORD PTR ");
12596       break;
12597     case stack_v_mode:
12598       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12599         {
12600           oappend ("QWORD PTR ");
12601           break;
12602         }
12603       /* FALLTHRU */
12604     case v_mode:
12605     case v_swap_mode:
12606     case dq_mode:
12607       USED_REX (REX_W);
12608       if (rex & REX_W)
12609         oappend ("QWORD PTR ");
12610       else
12611         {
12612           if ((sizeflag & DFLAG) || bytemode == dq_mode)
12613             oappend ("DWORD PTR ");
12614           else
12615             oappend ("WORD PTR ");
12616           used_prefixes |= (prefixes & PREFIX_DATA);
12617         }
12618       break;
12619     case z_mode:
12620       if ((rex & REX_W) || (sizeflag & DFLAG))
12621         *obufp++ = 'D';
12622       oappend ("WORD PTR ");
12623       if (!(rex & REX_W))
12624         used_prefixes |= (prefixes & PREFIX_DATA);
12625       break;
12626     case a_mode:
12627       if (sizeflag & DFLAG)
12628         oappend ("QWORD PTR ");
12629       else
12630         oappend ("DWORD PTR ");
12631       used_prefixes |= (prefixes & PREFIX_DATA);
12632       break;
12633     case d_mode:
12634     case d_swap_mode:
12635     case dqd_mode:
12636       oappend ("DWORD PTR ");
12637       break;
12638     case q_mode:
12639     case q_swap_mode:
12640       oappend ("QWORD PTR ");
12641       break;
12642     case m_mode:
12643       if (address_mode == mode_64bit)
12644         oappend ("QWORD PTR ");
12645       else
12646         oappend ("DWORD PTR ");
12647       break;
12648     case f_mode:
12649       if (sizeflag & DFLAG)
12650         oappend ("FWORD PTR ");
12651       else
12652         oappend ("DWORD PTR ");
12653       used_prefixes |= (prefixes & PREFIX_DATA);
12654       break;
12655     case t_mode:
12656       oappend ("TBYTE PTR ");
12657       break;
12658     case x_mode:
12659     case x_swap_mode:
12660       if (need_vex)
12661         {
12662           switch (vex.length)
12663             {
12664             case 128:
12665               oappend ("XMMWORD PTR ");
12666               break;
12667             case 256:
12668               oappend ("YMMWORD PTR ");
12669               break;
12670             default:
12671               abort ();
12672             }
12673         }
12674       else
12675         oappend ("XMMWORD PTR ");
12676       break;
12677     case xmm_mode:
12678       oappend ("XMMWORD PTR ");
12679       break;
12680     case xmmq_mode:
12681       if (!need_vex)
12682         abort ();
12683
12684       switch (vex.length)
12685         {
12686         case 128:
12687           oappend ("QWORD PTR ");
12688           break;
12689         case 256:
12690           oappend ("XMMWORD PTR ");
12691           break;
12692         default:
12693           abort ();
12694         }
12695       break;
12696     case ymmq_mode:
12697       if (!need_vex)
12698         abort ();
12699
12700       switch (vex.length)
12701         {
12702         case 128:
12703           oappend ("QWORD PTR ");
12704           break;
12705         case 256:
12706           oappend ("YMMWORD PTR ");
12707           break;
12708         default:
12709           abort ();
12710         }
12711       break;
12712     case o_mode:
12713       oappend ("OWORD PTR ");
12714       break;
12715     case vex_w_dq_mode:
12716       if (!need_vex)
12717         abort ();
12718
12719       if (vex.w)
12720         oappend ("QWORD PTR ");
12721       else
12722         oappend ("DWORD PTR ");
12723       break;
12724     default:
12725       break;
12726     }
12727 }
12728
12729 static void
12730 OP_E_register (int bytemode, int sizeflag)
12731 {
12732   int reg = modrm.rm;
12733   const char **names;
12734
12735   USED_REX (REX_B);
12736   if ((rex & REX_B))
12737     reg += 8;
12738
12739   if ((sizeflag & SUFFIX_ALWAYS)
12740       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
12741     swap_operand ();
12742
12743   switch (bytemode)
12744     {
12745     case b_mode:
12746     case b_swap_mode:
12747       USED_REX (0);
12748       if (rex)
12749         names = names8rex;
12750       else
12751         names = names8;
12752       break;
12753     case w_mode:
12754       names = names16;
12755       break;
12756     case d_mode:
12757       names = names32;
12758       break;
12759     case q_mode:
12760       names = names64;
12761       break;
12762     case m_mode:
12763       names = address_mode == mode_64bit ? names64 : names32;
12764       break;
12765     case stack_v_mode:
12766       if (address_mode == mode_64bit && (sizeflag & DFLAG))
12767         {
12768           names = names64;
12769           break;
12770         }
12771       bytemode = v_mode;
12772       /* FALLTHRU */
12773     case v_mode:
12774     case v_swap_mode:
12775     case dq_mode:
12776     case dqb_mode:
12777     case dqd_mode:
12778     case dqw_mode:
12779       USED_REX (REX_W);
12780       if (rex & REX_W)
12781         names = names64;
12782       else
12783         {
12784           if ((sizeflag & DFLAG) 
12785               || (bytemode != v_mode
12786                   && bytemode != v_swap_mode))
12787             names = names32;
12788           else
12789             names = names16;
12790           used_prefixes |= (prefixes & PREFIX_DATA);
12791         }
12792       break;
12793     case 0:
12794       return;
12795     default:
12796       oappend (INTERNAL_DISASSEMBLER_ERROR);
12797       return;
12798     }
12799   oappend (names[reg]);
12800 }
12801
12802 static void
12803 OP_E_memory (int bytemode, int sizeflag)
12804 {
12805   bfd_vma disp = 0;
12806   int add = (rex & REX_B) ? 8 : 0;
12807   int riprel = 0;
12808
12809   USED_REX (REX_B);
12810   if (intel_syntax)
12811     intel_operand_size (bytemode, sizeflag);
12812   append_seg ();
12813
12814   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12815     {
12816       /* 32/64 bit address mode */
12817       int havedisp;
12818       int havesib;
12819       int havebase;
12820       int haveindex;
12821       int needindex;
12822       int base, rbase;
12823       int vindex = 0;
12824       int scale = 0;
12825
12826       havesib = 0;
12827       havebase = 1;
12828       haveindex = 0;
12829       base = modrm.rm;
12830
12831       if (base == 4)
12832         {
12833           havesib = 1;
12834           FETCH_DATA (the_info, codep + 1);
12835           vindex = (*codep >> 3) & 7;
12836           scale = (*codep >> 6) & 3;
12837           base = *codep & 7;
12838           USED_REX (REX_X);
12839           if (rex & REX_X)
12840             vindex += 8;
12841           haveindex = vindex != 4;
12842           codep++;
12843         }
12844       rbase = base + add;
12845
12846       switch (modrm.mod)
12847         {
12848         case 0:
12849           if (base == 5)
12850             {
12851               havebase = 0;
12852               if (address_mode == mode_64bit && !havesib)
12853                 riprel = 1;
12854               disp = get32s ();
12855             }
12856           break;
12857         case 1:
12858           FETCH_DATA (the_info, codep + 1);
12859           disp = *codep++;
12860           if ((disp & 0x80) != 0)
12861             disp -= 0x100;
12862           break;
12863         case 2:
12864           disp = get32s ();
12865           break;
12866         }
12867
12868       /* In 32bit mode, we need index register to tell [offset] from
12869          [eiz*1 + offset].  */
12870       needindex = (havesib
12871                    && !havebase
12872                    && !haveindex
12873                    && address_mode == mode_32bit);
12874       havedisp = (havebase
12875                   || needindex
12876                   || (havesib && (haveindex || scale != 0)));
12877
12878       if (!intel_syntax)
12879         if (modrm.mod != 0 || base == 5)
12880           {
12881             if (havedisp || riprel)
12882               print_displacement (scratchbuf, disp);
12883             else
12884               print_operand_value (scratchbuf, 1, disp);
12885             oappend (scratchbuf);
12886             if (riprel)
12887               {
12888                 set_op (disp, 1);
12889                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
12890               }
12891           }
12892
12893       if (havebase || haveindex || riprel)
12894         used_prefixes |= PREFIX_ADDR;
12895
12896       if (havedisp || (intel_syntax && riprel))
12897         {
12898           *obufp++ = open_char;
12899           if (intel_syntax && riprel)
12900             {
12901               set_op (disp, 1);
12902               oappend (sizeflag & AFLAG ? "rip" : "eip");
12903             }
12904           *obufp = '\0';
12905           if (havebase)
12906             oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
12907                      ? names64[rbase] : names32[rbase]);
12908           if (havesib)
12909             {
12910               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
12911                  print index to tell base + index from base.  */
12912               if (scale != 0
12913                   || needindex
12914                   || haveindex
12915                   || (havebase && base != ESP_REG_NUM))
12916                 {
12917                   if (!intel_syntax || havebase)
12918                     {
12919                       *obufp++ = separator_char;
12920                       *obufp = '\0';
12921                     }
12922                   if (haveindex)
12923                     oappend (address_mode == mode_64bit 
12924                              && (sizeflag & AFLAG)
12925                              ? names64[vindex] : names32[vindex]);
12926                   else
12927                     oappend (address_mode == mode_64bit 
12928                              && (sizeflag & AFLAG)
12929                              ? index64 : index32);
12930
12931                   *obufp++ = scale_char;
12932                   *obufp = '\0';
12933                   sprintf (scratchbuf, "%d", 1 << scale);
12934                   oappend (scratchbuf);
12935                 }
12936             }
12937           if (intel_syntax
12938               && (disp || modrm.mod != 0 || base == 5))
12939             {
12940               if (!havedisp || (bfd_signed_vma) disp >= 0)
12941                 {
12942                   *obufp++ = '+';
12943                   *obufp = '\0';
12944                 }
12945               else if (modrm.mod != 1 && disp != -disp)
12946                 {
12947                   *obufp++ = '-';
12948                   *obufp = '\0';
12949                   disp = - (bfd_signed_vma) disp;
12950                 }
12951
12952               if (havedisp)
12953                 print_displacement (scratchbuf, disp);
12954               else
12955                 print_operand_value (scratchbuf, 1, disp);
12956               oappend (scratchbuf);
12957             }
12958
12959           *obufp++ = close_char;
12960           *obufp = '\0';
12961         }
12962       else if (intel_syntax)
12963         {
12964           if (modrm.mod != 0 || base == 5)
12965             {
12966               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
12967                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
12968                 ;
12969               else
12970                 {
12971                   oappend (names_seg[ds_reg - es_reg]);
12972                   oappend (":");
12973                 }
12974               print_operand_value (scratchbuf, 1, disp);
12975               oappend (scratchbuf);
12976             }
12977         }
12978     }
12979   else
12980     {
12981       /* 16 bit address mode */
12982       used_prefixes |= prefixes & PREFIX_ADDR;
12983       switch (modrm.mod)
12984         {
12985         case 0:
12986           if (modrm.rm == 6)
12987             {
12988               disp = get16 ();
12989               if ((disp & 0x8000) != 0)
12990                 disp -= 0x10000;
12991             }
12992           break;
12993         case 1:
12994           FETCH_DATA (the_info, codep + 1);
12995           disp = *codep++;
12996           if ((disp & 0x80) != 0)
12997             disp -= 0x100;
12998           break;
12999         case 2:
13000           disp = get16 ();
13001           if ((disp & 0x8000) != 0)
13002             disp -= 0x10000;
13003           break;
13004         }
13005
13006       if (!intel_syntax)
13007         if (modrm.mod != 0 || modrm.rm == 6)
13008           {
13009             print_displacement (scratchbuf, disp);
13010             oappend (scratchbuf);
13011           }
13012
13013       if (modrm.mod != 0 || modrm.rm != 6)
13014         {
13015           *obufp++ = open_char;
13016           *obufp = '\0';
13017           oappend (index16[modrm.rm]);
13018           if (intel_syntax
13019               && (disp || modrm.mod != 0 || modrm.rm == 6))
13020             {
13021               if ((bfd_signed_vma) disp >= 0)
13022                 {
13023                   *obufp++ = '+';
13024                   *obufp = '\0';
13025                 }
13026               else if (modrm.mod != 1)
13027                 {
13028                   *obufp++ = '-';
13029                   *obufp = '\0';
13030                   disp = - (bfd_signed_vma) disp;
13031                 }
13032
13033               print_displacement (scratchbuf, disp);
13034               oappend (scratchbuf);
13035             }
13036
13037           *obufp++ = close_char;
13038           *obufp = '\0';
13039         }
13040       else if (intel_syntax)
13041         {
13042           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13043                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
13044             ;
13045           else
13046             {
13047               oappend (names_seg[ds_reg - es_reg]);
13048               oappend (":");
13049             }
13050           print_operand_value (scratchbuf, 1, disp & 0xffff);
13051           oappend (scratchbuf);
13052         }
13053     }
13054 }
13055
13056 static void
13057 OP_E (int bytemode, int sizeflag)
13058 {
13059   /* Skip mod/rm byte.  */
13060   MODRM_CHECK;
13061   codep++;
13062
13063   if (modrm.mod == 3)
13064     OP_E_register (bytemode, sizeflag);
13065   else
13066     OP_E_memory (bytemode, sizeflag);
13067 }
13068
13069 static void
13070 OP_G (int bytemode, int sizeflag)
13071 {
13072   int add = 0;
13073   USED_REX (REX_R);
13074   if (rex & REX_R)
13075     add += 8;
13076   switch (bytemode)
13077     {
13078     case b_mode:
13079       USED_REX (0);
13080       if (rex)
13081         oappend (names8rex[modrm.reg + add]);
13082       else
13083         oappend (names8[modrm.reg + add]);
13084       break;
13085     case w_mode:
13086       oappend (names16[modrm.reg + add]);
13087       break;
13088     case d_mode:
13089       oappend (names32[modrm.reg + add]);
13090       break;
13091     case q_mode:
13092       oappend (names64[modrm.reg + add]);
13093       break;
13094     case v_mode:
13095     case dq_mode:
13096     case dqb_mode:
13097     case dqd_mode:
13098     case dqw_mode:
13099       USED_REX (REX_W);
13100       if (rex & REX_W)
13101         oappend (names64[modrm.reg + add]);
13102       else
13103         {
13104           if ((sizeflag & DFLAG) || bytemode != v_mode)
13105             oappend (names32[modrm.reg + add]);
13106           else
13107             oappend (names16[modrm.reg + add]);
13108           used_prefixes |= (prefixes & PREFIX_DATA);
13109         }
13110       break;
13111     case m_mode:
13112       if (address_mode == mode_64bit)
13113         oappend (names64[modrm.reg + add]);
13114       else
13115         oappend (names32[modrm.reg + add]);
13116       break;
13117     default:
13118       oappend (INTERNAL_DISASSEMBLER_ERROR);
13119       break;
13120     }
13121 }
13122
13123 static bfd_vma
13124 get64 (void)
13125 {
13126   bfd_vma x;
13127 #ifdef BFD64
13128   unsigned int a;
13129   unsigned int b;
13130
13131   FETCH_DATA (the_info, codep + 8);
13132   a = *codep++ & 0xff;
13133   a |= (*codep++ & 0xff) << 8;
13134   a |= (*codep++ & 0xff) << 16;
13135   a |= (*codep++ & 0xff) << 24;
13136   b = *codep++ & 0xff;
13137   b |= (*codep++ & 0xff) << 8;
13138   b |= (*codep++ & 0xff) << 16;
13139   b |= (*codep++ & 0xff) << 24;
13140   x = a + ((bfd_vma) b << 32);
13141 #else
13142   abort ();
13143   x = 0;
13144 #endif
13145   return x;
13146 }
13147
13148 static bfd_signed_vma
13149 get32 (void)
13150 {
13151   bfd_signed_vma x = 0;
13152
13153   FETCH_DATA (the_info, codep + 4);
13154   x = *codep++ & (bfd_signed_vma) 0xff;
13155   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13156   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13157   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13158   return x;
13159 }
13160
13161 static bfd_signed_vma
13162 get32s (void)
13163 {
13164   bfd_signed_vma x = 0;
13165
13166   FETCH_DATA (the_info, codep + 4);
13167   x = *codep++ & (bfd_signed_vma) 0xff;
13168   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
13169   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
13170   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
13171
13172   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
13173
13174   return x;
13175 }
13176
13177 static int
13178 get16 (void)
13179 {
13180   int x = 0;
13181
13182   FETCH_DATA (the_info, codep + 2);
13183   x = *codep++ & 0xff;
13184   x |= (*codep++ & 0xff) << 8;
13185   return x;
13186 }
13187
13188 static void
13189 set_op (bfd_vma op, int riprel)
13190 {
13191   op_index[op_ad] = op_ad;
13192   if (address_mode == mode_64bit)
13193     {
13194       op_address[op_ad] = op;
13195       op_riprel[op_ad] = riprel;
13196     }
13197   else
13198     {
13199       /* Mask to get a 32-bit address.  */
13200       op_address[op_ad] = op & 0xffffffff;
13201       op_riprel[op_ad] = riprel & 0xffffffff;
13202     }
13203 }
13204
13205 static void
13206 OP_REG (int code, int sizeflag)
13207 {
13208   const char *s;
13209   int add;
13210   USED_REX (REX_B);
13211   if (rex & REX_B)
13212     add = 8;
13213   else
13214     add = 0;
13215
13216   switch (code)
13217     {
13218     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13219     case sp_reg: case bp_reg: case si_reg: case di_reg:
13220       s = names16[code - ax_reg + add];
13221       break;
13222     case es_reg: case ss_reg: case cs_reg:
13223     case ds_reg: case fs_reg: case gs_reg:
13224       s = names_seg[code - es_reg + add];
13225       break;
13226     case al_reg: case ah_reg: case cl_reg: case ch_reg:
13227     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13228       USED_REX (0);
13229       if (rex)
13230         s = names8rex[code - al_reg + add];
13231       else
13232         s = names8[code - al_reg];
13233       break;
13234     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
13235     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
13236       if (address_mode == mode_64bit && (sizeflag & DFLAG))
13237         {
13238           s = names64[code - rAX_reg + add];
13239           break;
13240         }
13241       code += eAX_reg - rAX_reg;
13242       /* Fall through.  */
13243     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13244     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13245       USED_REX (REX_W);
13246       if (rex & REX_W)
13247         s = names64[code - eAX_reg + add];
13248       else
13249         {
13250           if (sizeflag & DFLAG)
13251             s = names32[code - eAX_reg + add];
13252           else
13253             s = names16[code - eAX_reg + add];
13254           used_prefixes |= (prefixes & PREFIX_DATA);
13255         }
13256       break;
13257     default:
13258       s = INTERNAL_DISASSEMBLER_ERROR;
13259       break;
13260     }
13261   oappend (s);
13262 }
13263
13264 static void
13265 OP_IMREG (int code, int sizeflag)
13266 {
13267   const char *s;
13268
13269   switch (code)
13270     {
13271     case indir_dx_reg:
13272       if (intel_syntax)
13273         s = "dx";
13274       else
13275         s = "(%dx)";
13276       break;
13277     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
13278     case sp_reg: case bp_reg: case si_reg: case di_reg:
13279       s = names16[code - ax_reg];
13280       break;
13281     case es_reg: case ss_reg: case cs_reg:
13282     case ds_reg: case fs_reg: case gs_reg:
13283       s = names_seg[code - es_reg];
13284       break;
13285     case al_reg: case ah_reg: case cl_reg: case ch_reg:
13286     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
13287       USED_REX (0);
13288       if (rex)
13289         s = names8rex[code - al_reg];
13290       else
13291         s = names8[code - al_reg];
13292       break;
13293     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
13294     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
13295       USED_REX (REX_W);
13296       if (rex & REX_W)
13297         s = names64[code - eAX_reg];
13298       else
13299         {
13300           if (sizeflag & DFLAG)
13301             s = names32[code - eAX_reg];
13302           else
13303             s = names16[code - eAX_reg];
13304           used_prefixes |= (prefixes & PREFIX_DATA);
13305         }
13306       break;
13307     case z_mode_ax_reg:
13308       if ((rex & REX_W) || (sizeflag & DFLAG))
13309         s = *names32;
13310       else
13311         s = *names16;
13312       if (!(rex & REX_W))
13313         used_prefixes |= (prefixes & PREFIX_DATA);
13314       break;
13315     default:
13316       s = INTERNAL_DISASSEMBLER_ERROR;
13317       break;
13318     }
13319   oappend (s);
13320 }
13321
13322 static void
13323 OP_I (int bytemode, int sizeflag)
13324 {
13325   bfd_signed_vma op;
13326   bfd_signed_vma mask = -1;
13327
13328   switch (bytemode)
13329     {
13330     case b_mode:
13331       FETCH_DATA (the_info, codep + 1);
13332       op = *codep++;
13333       mask = 0xff;
13334       break;
13335     case q_mode:
13336       if (address_mode == mode_64bit)
13337         {
13338           op = get32s ();
13339           break;
13340         }
13341       /* Fall through.  */
13342     case v_mode:
13343       USED_REX (REX_W);
13344       if (rex & REX_W)
13345         op = get32s ();
13346       else
13347         {
13348           if (sizeflag & DFLAG)
13349             {
13350               op = get32 ();
13351               mask = 0xffffffff;
13352             }
13353           else
13354             {
13355               op = get16 ();
13356               mask = 0xfffff;
13357             }
13358           used_prefixes |= (prefixes & PREFIX_DATA);
13359         }
13360       break;
13361     case w_mode:
13362       mask = 0xfffff;
13363       op = get16 ();
13364       break;
13365     case const_1_mode:
13366       if (intel_syntax)
13367         oappend ("1");
13368       return;
13369     default:
13370       oappend (INTERNAL_DISASSEMBLER_ERROR);
13371       return;
13372     }
13373
13374   op &= mask;
13375   scratchbuf[0] = '$';
13376   print_operand_value (scratchbuf + 1, 1, op);
13377   oappend (scratchbuf + intel_syntax);
13378   scratchbuf[0] = '\0';
13379 }
13380
13381 static void
13382 OP_I64 (int bytemode, int sizeflag)
13383 {
13384   bfd_signed_vma op;
13385   bfd_signed_vma mask = -1;
13386
13387   if (address_mode != mode_64bit)
13388     {
13389       OP_I (bytemode, sizeflag);
13390       return;
13391     }
13392
13393   switch (bytemode)
13394     {
13395     case b_mode:
13396       FETCH_DATA (the_info, codep + 1);
13397       op = *codep++;
13398       mask = 0xff;
13399       break;
13400     case v_mode:
13401       USED_REX (REX_W);
13402       if (rex & REX_W)
13403         op = get64 ();
13404       else
13405         {
13406           if (sizeflag & DFLAG)
13407             {
13408               op = get32 ();
13409               mask = 0xffffffff;
13410             }
13411           else
13412             {
13413               op = get16 ();
13414               mask = 0xfffff;
13415             }
13416           used_prefixes |= (prefixes & PREFIX_DATA);
13417         }
13418       break;
13419     case w_mode:
13420       mask = 0xfffff;
13421       op = get16 ();
13422       break;
13423     default:
13424       oappend (INTERNAL_DISASSEMBLER_ERROR);
13425       return;
13426     }
13427
13428   op &= mask;
13429   scratchbuf[0] = '$';
13430   print_operand_value (scratchbuf + 1, 1, op);
13431   oappend (scratchbuf + intel_syntax);
13432   scratchbuf[0] = '\0';
13433 }
13434
13435 static void
13436 OP_sI (int bytemode, int sizeflag)
13437 {
13438   bfd_signed_vma op;
13439   bfd_signed_vma mask = -1;
13440
13441   switch (bytemode)
13442     {
13443     case b_mode:
13444       FETCH_DATA (the_info, codep + 1);
13445       op = *codep++;
13446       if ((op & 0x80) != 0)
13447         op -= 0x100;
13448       mask = 0xffffffff;
13449       break;
13450     case v_mode:
13451       USED_REX (REX_W);
13452       if (rex & REX_W)
13453         op = get32s ();
13454       else
13455         {
13456           if (sizeflag & DFLAG)
13457             {
13458               op = get32s ();
13459               mask = 0xffffffff;
13460             }
13461           else
13462             {
13463               mask = 0xffffffff;
13464               op = get16 ();
13465               if ((op & 0x8000) != 0)
13466                 op -= 0x10000;
13467             }
13468           used_prefixes |= (prefixes & PREFIX_DATA);
13469         }
13470       break;
13471     case w_mode:
13472       op = get16 ();
13473       mask = 0xffffffff;
13474       if ((op & 0x8000) != 0)
13475         op -= 0x10000;
13476       break;
13477     default:
13478       oappend (INTERNAL_DISASSEMBLER_ERROR);
13479       return;
13480     }
13481
13482   scratchbuf[0] = '$';
13483   print_operand_value (scratchbuf + 1, 1, op);
13484   oappend (scratchbuf + intel_syntax);
13485 }
13486
13487 static void
13488 OP_J (int bytemode, int sizeflag)
13489 {
13490   bfd_vma disp;
13491   bfd_vma mask = -1;
13492   bfd_vma segment = 0;
13493
13494   switch (bytemode)
13495     {
13496     case b_mode:
13497       FETCH_DATA (the_info, codep + 1);
13498       disp = *codep++;
13499       if ((disp & 0x80) != 0)
13500         disp -= 0x100;
13501       break;
13502     case v_mode:
13503       USED_REX (REX_W);
13504       if ((sizeflag & DFLAG) || (rex & REX_W))
13505         disp = get32s ();
13506       else
13507         {
13508           disp = get16 ();
13509           if ((disp & 0x8000) != 0)
13510             disp -= 0x10000;
13511           /* In 16bit mode, address is wrapped around at 64k within
13512              the same segment.  Otherwise, a data16 prefix on a jump
13513              instruction means that the pc is masked to 16 bits after
13514              the displacement is added!  */
13515           mask = 0xffff;
13516           if ((prefixes & PREFIX_DATA) == 0)
13517             segment = ((start_pc + codep - start_codep)
13518                        & ~((bfd_vma) 0xffff));
13519         }
13520       if (!(rex & REX_W))
13521         used_prefixes |= (prefixes & PREFIX_DATA);
13522       break;
13523     default:
13524       oappend (INTERNAL_DISASSEMBLER_ERROR);
13525       return;
13526     }
13527   disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
13528   set_op (disp, 0);
13529   print_operand_value (scratchbuf, 1, disp);
13530   oappend (scratchbuf);
13531 }
13532
13533 static void
13534 OP_SEG (int bytemode, int sizeflag)
13535 {
13536   if (bytemode == w_mode)
13537     oappend (names_seg[modrm.reg]);
13538   else
13539     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
13540 }
13541
13542 static void
13543 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
13544 {
13545   int seg, offset;
13546
13547   if (sizeflag & DFLAG)
13548     {
13549       offset = get32 ();
13550       seg = get16 ();
13551     }
13552   else
13553     {
13554       offset = get16 ();
13555       seg = get16 ();
13556     }
13557   used_prefixes |= (prefixes & PREFIX_DATA);
13558   if (intel_syntax)
13559     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
13560   else
13561     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
13562   oappend (scratchbuf);
13563 }
13564
13565 static void
13566 OP_OFF (int bytemode, int sizeflag)
13567 {
13568   bfd_vma off;
13569
13570   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13571     intel_operand_size (bytemode, sizeflag);
13572   append_seg ();
13573
13574   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
13575     off = get32 ();
13576   else
13577     off = get16 ();
13578
13579   if (intel_syntax)
13580     {
13581       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13582                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13583         {
13584           oappend (names_seg[ds_reg - es_reg]);
13585           oappend (":");
13586         }
13587     }
13588   print_operand_value (scratchbuf, 1, off);
13589   oappend (scratchbuf);
13590 }
13591
13592 static void
13593 OP_OFF64 (int bytemode, int sizeflag)
13594 {
13595   bfd_vma off;
13596
13597   if (address_mode != mode_64bit
13598       || (prefixes & PREFIX_ADDR))
13599     {
13600       OP_OFF (bytemode, sizeflag);
13601       return;
13602     }
13603
13604   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
13605     intel_operand_size (bytemode, sizeflag);
13606   append_seg ();
13607
13608   off = get64 ();
13609
13610   if (intel_syntax)
13611     {
13612       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
13613                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
13614         {
13615           oappend (names_seg[ds_reg - es_reg]);
13616           oappend (":");
13617         }
13618     }
13619   print_operand_value (scratchbuf, 1, off);
13620   oappend (scratchbuf);
13621 }
13622
13623 static void
13624 ptr_reg (int code, int sizeflag)
13625 {
13626   const char *s;
13627
13628   *obufp++ = open_char;
13629   used_prefixes |= (prefixes & PREFIX_ADDR);
13630   if (address_mode == mode_64bit)
13631     {
13632       if (!(sizeflag & AFLAG))
13633         s = names32[code - eAX_reg];
13634       else
13635         s = names64[code - eAX_reg];
13636     }
13637   else if (sizeflag & AFLAG)
13638     s = names32[code - eAX_reg];
13639   else
13640     s = names16[code - eAX_reg];
13641   oappend (s);
13642   *obufp++ = close_char;
13643   *obufp = 0;
13644 }
13645
13646 static void
13647 OP_ESreg (int code, int sizeflag)
13648 {
13649   if (intel_syntax)
13650     {
13651       switch (codep[-1])
13652         {
13653         case 0x6d:      /* insw/insl */
13654           intel_operand_size (z_mode, sizeflag);
13655           break;
13656         case 0xa5:      /* movsw/movsl/movsq */
13657         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13658         case 0xab:      /* stosw/stosl */
13659         case 0xaf:      /* scasw/scasl */
13660           intel_operand_size (v_mode, sizeflag);
13661           break;
13662         default:
13663           intel_operand_size (b_mode, sizeflag);
13664         }
13665     }
13666   oappend ("%es:" + intel_syntax);
13667   ptr_reg (code, sizeflag);
13668 }
13669
13670 static void
13671 OP_DSreg (int code, int sizeflag)
13672 {
13673   if (intel_syntax)
13674     {
13675       switch (codep[-1])
13676         {
13677         case 0x6f:      /* outsw/outsl */
13678           intel_operand_size (z_mode, sizeflag);
13679           break;
13680         case 0xa5:      /* movsw/movsl/movsq */
13681         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
13682         case 0xad:      /* lodsw/lodsl/lodsq */
13683           intel_operand_size (v_mode, sizeflag);
13684           break;
13685         default:
13686           intel_operand_size (b_mode, sizeflag);
13687         }
13688     }
13689   if ((prefixes
13690        & (PREFIX_CS
13691           | PREFIX_DS
13692           | PREFIX_SS
13693           | PREFIX_ES
13694           | PREFIX_FS
13695           | PREFIX_GS)) == 0)
13696     prefixes |= PREFIX_DS;
13697   append_seg ();
13698   ptr_reg (code, sizeflag);
13699 }
13700
13701 static void
13702 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13703 {
13704   int add;
13705   if (rex & REX_R)
13706     {
13707       USED_REX (REX_R);
13708       add = 8;
13709     }
13710   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
13711     {
13712       all_prefixes[last_lock_prefix] = 0;
13713       used_prefixes |= PREFIX_LOCK;
13714       add = 8;
13715     }
13716   else
13717     add = 0;
13718   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
13719   oappend (scratchbuf + intel_syntax);
13720 }
13721
13722 static void
13723 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13724 {
13725   int add;
13726   USED_REX (REX_R);
13727   if (rex & REX_R)
13728     add = 8;
13729   else
13730     add = 0;
13731   if (intel_syntax)
13732     sprintf (scratchbuf, "db%d", modrm.reg + add);
13733   else
13734     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
13735   oappend (scratchbuf);
13736 }
13737
13738 static void
13739 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13740 {
13741   sprintf (scratchbuf, "%%tr%d", modrm.reg);
13742   oappend (scratchbuf + intel_syntax);
13743 }
13744
13745 static void
13746 OP_R (int bytemode, int sizeflag)
13747 {
13748   if (modrm.mod == 3)
13749     OP_E (bytemode, sizeflag);
13750   else
13751     BadOp ();
13752 }
13753
13754 static void
13755 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13756 {
13757   int reg = modrm.reg;
13758   const char **names;
13759
13760   used_prefixes |= (prefixes & PREFIX_DATA);
13761   if (prefixes & PREFIX_DATA)
13762     {
13763       names = names_xmm;
13764       USED_REX (REX_R);
13765       if (rex & REX_R)
13766         reg += 8;
13767     }
13768   else
13769     names = names_mm;
13770   oappend (names[reg]);
13771 }
13772
13773 static void
13774 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13775 {
13776   int reg = modrm.reg;
13777   const char **names;
13778
13779   USED_REX (REX_R);
13780   if (rex & REX_R)
13781     reg += 8;
13782   if (need_vex && bytemode != xmm_mode)
13783     {
13784       switch (vex.length)
13785         {
13786         case 128:
13787           names = names_xmm;
13788           break;
13789         case 256:
13790           names = names_ymm;
13791           break;
13792         default:
13793           abort ();
13794         }
13795     }
13796   else
13797     names = names_xmm;
13798   oappend (names[reg]);
13799 }
13800
13801 static void
13802 OP_EM (int bytemode, int sizeflag)
13803 {
13804   int reg;
13805   const char **names;
13806
13807   if (modrm.mod != 3)
13808     {
13809       if (intel_syntax
13810           && (bytemode == v_mode || bytemode == v_swap_mode))
13811         {
13812           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13813           used_prefixes |= (prefixes & PREFIX_DATA);
13814         }
13815       OP_E (bytemode, sizeflag);
13816       return;
13817     }
13818
13819   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13820     swap_operand ();
13821
13822   /* Skip mod/rm byte.  */
13823   MODRM_CHECK;
13824   codep++;
13825   used_prefixes |= (prefixes & PREFIX_DATA);
13826   reg = modrm.rm;
13827   if (prefixes & PREFIX_DATA)
13828     {
13829       names = names_xmm;
13830       USED_REX (REX_B);
13831       if (rex & REX_B)
13832         reg += 8;
13833     }
13834   else
13835     names = names_mm;
13836   oappend (names[reg]);
13837 }
13838
13839 /* cvt* are the only instructions in sse2 which have
13840    both SSE and MMX operands and also have 0x66 prefix
13841    in their opcode. 0x66 was originally used to differentiate
13842    between SSE and MMX instruction(operands). So we have to handle the
13843    cvt* separately using OP_EMC and OP_MXC */
13844 static void
13845 OP_EMC (int bytemode, int sizeflag)
13846 {
13847   if (modrm.mod != 3)
13848     {
13849       if (intel_syntax && bytemode == v_mode)
13850         {
13851           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
13852           used_prefixes |= (prefixes & PREFIX_DATA);
13853         }
13854       OP_E (bytemode, sizeflag);
13855       return;
13856     }
13857
13858   /* Skip mod/rm byte.  */
13859   MODRM_CHECK;
13860   codep++;
13861   used_prefixes |= (prefixes & PREFIX_DATA);
13862   oappend (names_mm[modrm.rm]);
13863 }
13864
13865 static void
13866 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13867 {
13868   used_prefixes |= (prefixes & PREFIX_DATA);
13869   oappend (names_mm[modrm.reg]);
13870 }
13871
13872 static void
13873 OP_EX (int bytemode, int sizeflag)
13874 {
13875   int reg;
13876   const char **names;
13877
13878   /* Skip mod/rm byte.  */
13879   MODRM_CHECK;
13880   codep++;
13881
13882   if (modrm.mod != 3)
13883     {
13884       OP_E_memory (bytemode, sizeflag);
13885       return;
13886     }
13887
13888   reg = modrm.rm;
13889   USED_REX (REX_B);
13890   if (rex & REX_B)
13891     reg += 8;
13892
13893   if ((sizeflag & SUFFIX_ALWAYS)
13894       && (bytemode == x_swap_mode
13895           || bytemode == d_swap_mode
13896           || bytemode == q_swap_mode))
13897     swap_operand ();
13898
13899   if (need_vex
13900       && bytemode != xmm_mode
13901       && bytemode != xmmq_mode)
13902     {
13903       switch (vex.length)
13904         {
13905         case 128:
13906           names = names_xmm;
13907           break;
13908         case 256:
13909           names = names_ymm;
13910           break;
13911         default:
13912           abort ();
13913         }
13914     }
13915   else
13916     names = names_xmm;
13917   oappend (names[reg]);
13918 }
13919
13920 static void
13921 OP_MS (int bytemode, int sizeflag)
13922 {
13923   if (modrm.mod == 3)
13924     OP_EM (bytemode, sizeflag);
13925   else
13926     BadOp ();
13927 }
13928
13929 static void
13930 OP_XS (int bytemode, int sizeflag)
13931 {
13932   if (modrm.mod == 3)
13933     OP_EX (bytemode, sizeflag);
13934   else
13935     BadOp ();
13936 }
13937
13938 static void
13939 OP_M (int bytemode, int sizeflag)
13940 {
13941   if (modrm.mod == 3)
13942     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13943     BadOp ();
13944   else
13945     OP_E (bytemode, sizeflag);
13946 }
13947
13948 static void
13949 OP_0f07 (int bytemode, int sizeflag)
13950 {
13951   if (modrm.mod != 3 || modrm.rm != 0)
13952     BadOp ();
13953   else
13954     OP_E (bytemode, sizeflag);
13955 }
13956
13957 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13958    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
13959
13960 static void
13961 NOP_Fixup1 (int bytemode, int sizeflag)
13962 {
13963   if ((prefixes & PREFIX_DATA) != 0
13964       || (rex != 0
13965           && rex != 0x48
13966           && address_mode == mode_64bit))
13967     OP_REG (bytemode, sizeflag);
13968   else
13969     strcpy (obuf, "nop");
13970 }
13971
13972 static void
13973 NOP_Fixup2 (int bytemode, int sizeflag)
13974 {
13975   if ((prefixes & PREFIX_DATA) != 0
13976       || (rex != 0
13977           && rex != 0x48
13978           && address_mode == mode_64bit))
13979     OP_IMREG (bytemode, sizeflag);
13980 }
13981
13982 static const char *const Suffix3DNow[] = {
13983 /* 00 */        NULL,           NULL,           NULL,           NULL,
13984 /* 04 */        NULL,           NULL,           NULL,           NULL,
13985 /* 08 */        NULL,           NULL,           NULL,           NULL,
13986 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
13987 /* 10 */        NULL,           NULL,           NULL,           NULL,
13988 /* 14 */        NULL,           NULL,           NULL,           NULL,
13989 /* 18 */        NULL,           NULL,           NULL,           NULL,
13990 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
13991 /* 20 */        NULL,           NULL,           NULL,           NULL,
13992 /* 24 */        NULL,           NULL,           NULL,           NULL,
13993 /* 28 */        NULL,           NULL,           NULL,           NULL,
13994 /* 2C */        NULL,           NULL,           NULL,           NULL,
13995 /* 30 */        NULL,           NULL,           NULL,           NULL,
13996 /* 34 */        NULL,           NULL,           NULL,           NULL,
13997 /* 38 */        NULL,           NULL,           NULL,           NULL,
13998 /* 3C */        NULL,           NULL,           NULL,           NULL,
13999 /* 40 */        NULL,           NULL,           NULL,           NULL,
14000 /* 44 */        NULL,           NULL,           NULL,           NULL,
14001 /* 48 */        NULL,           NULL,           NULL,           NULL,
14002 /* 4C */        NULL,           NULL,           NULL,           NULL,
14003 /* 50 */        NULL,           NULL,           NULL,           NULL,
14004 /* 54 */        NULL,           NULL,           NULL,           NULL,
14005 /* 58 */        NULL,           NULL,           NULL,           NULL,
14006 /* 5C */        NULL,           NULL,           NULL,           NULL,
14007 /* 60 */        NULL,           NULL,           NULL,           NULL,
14008 /* 64 */        NULL,           NULL,           NULL,           NULL,
14009 /* 68 */        NULL,           NULL,           NULL,           NULL,
14010 /* 6C */        NULL,           NULL,           NULL,           NULL,
14011 /* 70 */        NULL,           NULL,           NULL,           NULL,
14012 /* 74 */        NULL,           NULL,           NULL,           NULL,
14013 /* 78 */        NULL,           NULL,           NULL,           NULL,
14014 /* 7C */        NULL,           NULL,           NULL,           NULL,
14015 /* 80 */        NULL,           NULL,           NULL,           NULL,
14016 /* 84 */        NULL,           NULL,           NULL,           NULL,
14017 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
14018 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
14019 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
14020 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
14021 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
14022 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
14023 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
14024 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
14025 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
14026 /* AC */        NULL,           NULL,           "pfacc",        NULL,
14027 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
14028 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
14029 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
14030 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
14031 /* C0 */        NULL,           NULL,           NULL,           NULL,
14032 /* C4 */        NULL,           NULL,           NULL,           NULL,
14033 /* C8 */        NULL,           NULL,           NULL,           NULL,
14034 /* CC */        NULL,           NULL,           NULL,           NULL,
14035 /* D0 */        NULL,           NULL,           NULL,           NULL,
14036 /* D4 */        NULL,           NULL,           NULL,           NULL,
14037 /* D8 */        NULL,           NULL,           NULL,           NULL,
14038 /* DC */        NULL,           NULL,           NULL,           NULL,
14039 /* E0 */        NULL,           NULL,           NULL,           NULL,
14040 /* E4 */        NULL,           NULL,           NULL,           NULL,
14041 /* E8 */        NULL,           NULL,           NULL,           NULL,
14042 /* EC */        NULL,           NULL,           NULL,           NULL,
14043 /* F0 */        NULL,           NULL,           NULL,           NULL,
14044 /* F4 */        NULL,           NULL,           NULL,           NULL,
14045 /* F8 */        NULL,           NULL,           NULL,           NULL,
14046 /* FC */        NULL,           NULL,           NULL,           NULL,
14047 };
14048
14049 static void
14050 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14051 {
14052   const char *mnemonic;
14053
14054   FETCH_DATA (the_info, codep + 1);
14055   /* AMD 3DNow! instructions are specified by an opcode suffix in the
14056      place where an 8-bit immediate would normally go.  ie. the last
14057      byte of the instruction.  */
14058   obufp = mnemonicendp;
14059   mnemonic = Suffix3DNow[*codep++ & 0xff];
14060   if (mnemonic)
14061     oappend (mnemonic);
14062   else
14063     {
14064       /* Since a variable sized modrm/sib chunk is between the start
14065          of the opcode (0x0f0f) and the opcode suffix, we need to do
14066          all the modrm processing first, and don't know until now that
14067          we have a bad opcode.  This necessitates some cleaning up.  */
14068       op_out[0][0] = '\0';
14069       op_out[1][0] = '\0';
14070       BadOp ();
14071     }
14072   mnemonicendp = obufp;
14073 }
14074
14075 static struct op simd_cmp_op[] =
14076 {
14077   { STRING_COMMA_LEN ("eq") },
14078   { STRING_COMMA_LEN ("lt") },
14079   { STRING_COMMA_LEN ("le") },
14080   { STRING_COMMA_LEN ("unord") },
14081   { STRING_COMMA_LEN ("neq") },
14082   { STRING_COMMA_LEN ("nlt") },
14083   { STRING_COMMA_LEN ("nle") },
14084   { STRING_COMMA_LEN ("ord") }
14085 };
14086
14087 static void
14088 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14089 {
14090   unsigned int cmp_type;
14091
14092   FETCH_DATA (the_info, codep + 1);
14093   cmp_type = *codep++ & 0xff;
14094   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
14095     {
14096       char suffix [3];
14097       char *p = mnemonicendp - 2;
14098       suffix[0] = p[0];
14099       suffix[1] = p[1];
14100       suffix[2] = '\0';
14101       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
14102       mnemonicendp += simd_cmp_op[cmp_type].len;
14103     }
14104   else
14105     {
14106       /* We have a reserved extension byte.  Output it directly.  */
14107       scratchbuf[0] = '$';
14108       print_operand_value (scratchbuf + 1, 1, cmp_type);
14109       oappend (scratchbuf + intel_syntax);
14110       scratchbuf[0] = '\0';
14111     }
14112 }
14113
14114 static void
14115 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
14116           int sizeflag ATTRIBUTE_UNUSED)
14117 {
14118   /* mwait %eax,%ecx  */
14119   if (!intel_syntax)
14120     {
14121       const char **names = (address_mode == mode_64bit
14122                             ? names64 : names32);
14123       strcpy (op_out[0], names[0]);
14124       strcpy (op_out[1], names[1]);
14125       two_source_ops = 1;
14126     }
14127   /* Skip mod/rm byte.  */
14128   MODRM_CHECK;
14129   codep++;
14130 }
14131
14132 static void
14133 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
14134             int sizeflag ATTRIBUTE_UNUSED)
14135 {
14136   /* monitor %eax,%ecx,%edx"  */
14137   if (!intel_syntax)
14138     {
14139       const char **op1_names;
14140       const char **names = (address_mode == mode_64bit
14141                             ? names64 : names32);
14142
14143       if (!(prefixes & PREFIX_ADDR))
14144         op1_names = (address_mode == mode_16bit
14145                      ? names16 : names);
14146       else
14147         {
14148           /* Remove "addr16/addr32".  */
14149           all_prefixes[last_addr_prefix] = 0;
14150           op1_names = (address_mode != mode_32bit
14151                        ? names32 : names16);
14152           used_prefixes |= PREFIX_ADDR;
14153         }
14154       strcpy (op_out[0], op1_names[0]);
14155       strcpy (op_out[1], names[1]);
14156       strcpy (op_out[2], names[2]);
14157       two_source_ops = 1;
14158     }
14159   /* Skip mod/rm byte.  */
14160   MODRM_CHECK;
14161   codep++;
14162 }
14163
14164 static void
14165 BadOp (void)
14166 {
14167   /* Throw away prefixes and 1st. opcode byte.  */
14168   codep = insn_codep + 1;
14169   oappend ("(bad)");
14170 }
14171
14172 static void
14173 REP_Fixup (int bytemode, int sizeflag)
14174 {
14175   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
14176      lods and stos.  */
14177   if (prefixes & PREFIX_REPZ)
14178     all_prefixes[last_repz_prefix] = REP_PREFIX;
14179
14180   switch (bytemode)
14181     {
14182     case al_reg:
14183     case eAX_reg:
14184     case indir_dx_reg:
14185       OP_IMREG (bytemode, sizeflag);
14186       break;
14187     case eDI_reg:
14188       OP_ESreg (bytemode, sizeflag);
14189       break;
14190     case eSI_reg:
14191       OP_DSreg (bytemode, sizeflag);
14192       break;
14193     default:
14194       abort ();
14195       break;
14196     }
14197 }
14198
14199 static void
14200 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
14201 {
14202   USED_REX (REX_W);
14203   if (rex & REX_W)
14204     {
14205       /* Change cmpxchg8b to cmpxchg16b.  */
14206       char *p = mnemonicendp - 2;
14207       mnemonicendp = stpcpy (p, "16b");
14208       bytemode = o_mode;
14209     }
14210   OP_M (bytemode, sizeflag);
14211 }
14212
14213 static void
14214 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
14215 {
14216   const char **names;
14217
14218   if (need_vex)
14219     {
14220       switch (vex.length)
14221         {
14222         case 128:
14223           names = names_xmm;
14224           break;
14225         case 256:
14226           names = names_ymm;
14227           break;
14228         default:
14229           abort ();
14230         }
14231     }
14232   else
14233     names = names_xmm;
14234   oappend (names[reg]);
14235 }
14236
14237 static void
14238 CRC32_Fixup (int bytemode, int sizeflag)
14239 {
14240   /* Add proper suffix to "crc32".  */
14241   char *p = mnemonicendp;
14242
14243   switch (bytemode)
14244     {
14245     case b_mode:
14246       if (intel_syntax)
14247         goto skip;
14248
14249       *p++ = 'b';
14250       break;
14251     case v_mode:
14252       if (intel_syntax)
14253         goto skip;
14254
14255       USED_REX (REX_W);
14256       if (rex & REX_W)
14257         *p++ = 'q';
14258       else 
14259         {
14260           if (sizeflag & DFLAG)
14261             *p++ = 'l';
14262           else
14263             *p++ = 'w';
14264           used_prefixes |= (prefixes & PREFIX_DATA);
14265         }
14266       break;
14267     default:
14268       oappend (INTERNAL_DISASSEMBLER_ERROR);
14269       break;
14270     }
14271   mnemonicendp = p;
14272   *p = '\0';
14273
14274 skip:
14275   if (modrm.mod == 3)
14276     {
14277       int add;
14278
14279       /* Skip mod/rm byte.  */
14280       MODRM_CHECK;
14281       codep++;
14282
14283       USED_REX (REX_B);
14284       add = (rex & REX_B) ? 8 : 0;
14285       if (bytemode == b_mode)
14286         {
14287           USED_REX (0);
14288           if (rex)
14289             oappend (names8rex[modrm.rm + add]);
14290           else
14291             oappend (names8[modrm.rm + add]);
14292         }
14293       else
14294         {
14295           USED_REX (REX_W);
14296           if (rex & REX_W)
14297             oappend (names64[modrm.rm + add]);
14298           else if ((prefixes & PREFIX_DATA))
14299             oappend (names16[modrm.rm + add]);
14300           else
14301             oappend (names32[modrm.rm + add]);
14302         }
14303     }
14304   else
14305     OP_E (bytemode, sizeflag);
14306 }
14307
14308 static void
14309 FXSAVE_Fixup (int bytemode, int sizeflag)
14310 {
14311   /* Add proper suffix to "fxsave" and "fxrstor".  */
14312   USED_REX (REX_W);
14313   if (rex & REX_W)
14314     {
14315       char *p = mnemonicendp;
14316       *p++ = '6';
14317       *p++ = '4';
14318       *p = '\0';
14319       mnemonicendp = p;
14320     }
14321   OP_M (bytemode, sizeflag);
14322 }
14323
14324 /* Display the destination register operand for instructions with
14325    VEX. */
14326
14327 static void
14328 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14329 {
14330   const char **names;
14331
14332   if (!need_vex)
14333     abort ();
14334
14335   if (!need_vex_reg)
14336     return;
14337
14338   switch (vex.length)
14339     {
14340     case 128:
14341       switch (bytemode)
14342         {
14343         case vex_mode:
14344         case vex128_mode:
14345           break;
14346         default:
14347           abort ();
14348           return;
14349         }
14350
14351       names = names_xmm;
14352       break;
14353     case 256:
14354       switch (bytemode)
14355         {
14356         case vex_mode:
14357         case vex256_mode:
14358           break;
14359         default:
14360           abort ();
14361           return;
14362         }
14363
14364       names = names_ymm;
14365       break;
14366     default:
14367       abort ();
14368       break;
14369     }
14370   oappend (names[vex.register_specifier]);
14371 }
14372
14373 /* Get the VEX immediate byte without moving codep.  */
14374
14375 static unsigned char
14376 get_vex_imm8 (int sizeflag, int opnum)
14377 {
14378   int bytes_before_imm = 0;
14379
14380   if (modrm.mod != 3)
14381     {
14382       /* There are SIB/displacement bytes.  */
14383       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14384         {
14385           /* 32/64 bit address mode */
14386           int base = modrm.rm;
14387
14388           /* Check SIB byte.  */
14389           if (base == 4)
14390             {
14391               FETCH_DATA (the_info, codep + 1);
14392               base = *codep & 7;
14393               /* When decoding the third source, don't increase
14394                  bytes_before_imm as this has already been incremented
14395                  by one in OP_E_memory while decoding the second
14396                  source operand.  */
14397               if (opnum == 0)
14398                 bytes_before_imm++;
14399             }
14400
14401           /* Don't increase bytes_before_imm when decoding the third source,
14402              it has already been incremented by OP_E_memory while decoding
14403              the second source operand.  */
14404           if (opnum == 0)
14405             {
14406               switch (modrm.mod)
14407                 {
14408                   case 0:
14409                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
14410                        SIB == 5, there is a 4 byte displacement.  */
14411                     if (base != 5)
14412                       /* No displacement. */
14413                       break;
14414                   case 2:
14415                     /* 4 byte displacement.  */
14416                     bytes_before_imm += 4;
14417                     break;
14418                   case 1:
14419                     /* 1 byte displacement.  */
14420                     bytes_before_imm++;
14421                     break;
14422                 }
14423             }
14424         }
14425       else
14426         {
14427           /* 16 bit address mode */
14428           /* Don't increase bytes_before_imm when decoding the third source,
14429              it has already been incremented by OP_E_memory while decoding
14430              the second source operand.  */
14431           if (opnum == 0)
14432             {
14433               switch (modrm.mod)
14434                 {
14435                 case 0:
14436                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
14437                   if (modrm.rm != 6)
14438                     /* No displacement. */
14439                     break;
14440                 case 2:
14441                   /* 2 byte displacement.  */
14442                   bytes_before_imm += 2;
14443                   break;
14444                 case 1:
14445                   /* 1 byte displacement: when decoding the third source,
14446                      don't increase bytes_before_imm as this has already
14447                      been incremented by one in OP_E_memory while decoding
14448                      the second source operand.  */
14449                   if (opnum == 0)
14450                     bytes_before_imm++;
14451
14452                   break;
14453                 }
14454             }
14455         }
14456     }
14457
14458   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
14459   return codep [bytes_before_imm];
14460 }
14461
14462 static void
14463 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
14464 {
14465   const char **names;
14466
14467   if (reg == -1 && modrm.mod != 3)
14468     {
14469       OP_E_memory (bytemode, sizeflag);
14470       return;
14471     }
14472   else
14473     {
14474       if (reg == -1)
14475         {
14476           reg = modrm.rm;
14477           USED_REX (REX_B);
14478           if (rex & REX_B)
14479             reg += 8;
14480         }
14481       else if (reg > 7 && address_mode != mode_64bit)
14482         BadOp ();
14483     }
14484
14485   switch (vex.length)
14486     {
14487     case 128:
14488       names = names_xmm;
14489       break;
14490     case 256:
14491       names = names_ymm;
14492       break;
14493     default:
14494       abort ();
14495     }
14496   oappend (names[reg]);
14497 }
14498
14499 static void
14500 OP_Vex_2src (int bytemode, int sizeflag)
14501 {
14502   if (modrm.mod == 3)
14503     {
14504       int reg = modrm.rm;
14505       USED_REX (REX_B);
14506       if (rex & REX_B)
14507         reg += 8;
14508       oappend (names_xmm[reg]);
14509     }
14510   else
14511     {
14512       if (intel_syntax
14513           && (bytemode == v_mode || bytemode == v_swap_mode))
14514         {
14515           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
14516           used_prefixes |= (prefixes & PREFIX_DATA);
14517         }
14518       OP_E (bytemode, sizeflag);
14519     }
14520 }
14521
14522 static void
14523 OP_Vex_2src_1 (int bytemode, int sizeflag)
14524 {
14525   if (modrm.mod == 3)
14526     {
14527       /* Skip mod/rm byte.   */
14528       MODRM_CHECK;
14529       codep++;
14530     }
14531
14532   if (vex.w)
14533     oappend (names_xmm[vex.register_specifier]);
14534   else
14535     OP_Vex_2src (bytemode, sizeflag);
14536 }
14537
14538 static void
14539 OP_Vex_2src_2 (int bytemode, int sizeflag)
14540 {
14541   if (vex.w)
14542     OP_Vex_2src (bytemode, sizeflag);
14543   else
14544     oappend (names_xmm[vex.register_specifier]);
14545 }
14546
14547 static void
14548 OP_EX_VexW (int bytemode, int sizeflag)
14549 {
14550   int reg = -1;
14551
14552   if (!vex_w_done)
14553     {
14554       vex_w_done = 1;
14555
14556       /* Skip mod/rm byte.  */
14557       MODRM_CHECK;
14558       codep++;
14559
14560       if (vex.w)
14561         reg = get_vex_imm8 (sizeflag, 0) >> 4;
14562     }
14563   else
14564     {
14565       if (!vex.w)
14566         reg = get_vex_imm8 (sizeflag, 1) >> 4;
14567     }
14568
14569   OP_EX_VexReg (bytemode, sizeflag, reg);
14570 }
14571
14572 static void
14573 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
14574              int sizeflag ATTRIBUTE_UNUSED)
14575 {
14576   /* Skip the immediate byte and check for invalid bits.  */
14577   FETCH_DATA (the_info, codep + 1);
14578   if (*codep++ & 0xf)
14579     BadOp ();
14580 }
14581
14582 static void
14583 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14584 {
14585   int reg;
14586   const char **names;
14587
14588   FETCH_DATA (the_info, codep + 1);
14589   reg = *codep++;
14590
14591   if (bytemode != x_mode)
14592     abort ();
14593
14594   if (reg & 0xf)
14595       BadOp ();
14596
14597   reg >>= 4;
14598   if (reg > 7 && address_mode != mode_64bit)
14599     BadOp ();
14600
14601   switch (vex.length)
14602     {
14603     case 128:
14604       names = names_xmm;
14605       break;
14606     case 256:
14607       names = names_ymm;
14608       break;
14609     default:
14610       abort ();
14611     }
14612   oappend (names[reg]);
14613 }
14614
14615 static void
14616 OP_XMM_VexW (int bytemode, int sizeflag)
14617 {
14618   /* Turn off the REX.W bit since it is used for swapping operands
14619      now.  */
14620   rex &= ~REX_W;
14621   OP_XMM (bytemode, sizeflag);
14622 }
14623
14624 static void
14625 OP_EX_Vex (int bytemode, int sizeflag)
14626 {
14627   if (modrm.mod != 3)
14628     {
14629       if (vex.register_specifier != 0)
14630         BadOp ();
14631       need_vex_reg = 0;
14632     }
14633   OP_EX (bytemode, sizeflag);
14634 }
14635
14636 static void
14637 OP_XMM_Vex (int bytemode, int sizeflag)
14638 {
14639   if (modrm.mod != 3)
14640     {
14641       if (vex.register_specifier != 0)
14642         BadOp ();
14643       need_vex_reg = 0;
14644     }
14645   OP_XMM (bytemode, sizeflag);
14646 }
14647
14648 static void
14649 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14650 {
14651   switch (vex.length)
14652     {
14653     case 128:
14654       mnemonicendp = stpcpy (obuf, "vzeroupper");
14655       break;
14656     case 256:
14657       mnemonicendp = stpcpy (obuf, "vzeroall");
14658       break;
14659     default:
14660       abort ();
14661     }
14662 }
14663
14664 static struct op vex_cmp_op[] =
14665 {
14666   { STRING_COMMA_LEN ("eq") },
14667   { STRING_COMMA_LEN ("lt") },
14668   { STRING_COMMA_LEN ("le") },
14669   { STRING_COMMA_LEN ("unord") },
14670   { STRING_COMMA_LEN ("neq") },
14671   { STRING_COMMA_LEN ("nlt") },
14672   { STRING_COMMA_LEN ("nle") },
14673   { STRING_COMMA_LEN ("ord") },
14674   { STRING_COMMA_LEN ("eq_uq") },
14675   { STRING_COMMA_LEN ("nge") },
14676   { STRING_COMMA_LEN ("ngt") },
14677   { STRING_COMMA_LEN ("false") },
14678   { STRING_COMMA_LEN ("neq_oq") },
14679   { STRING_COMMA_LEN ("ge") },
14680   { STRING_COMMA_LEN ("gt") },
14681   { STRING_COMMA_LEN ("true") },
14682   { STRING_COMMA_LEN ("eq_os") },
14683   { STRING_COMMA_LEN ("lt_oq") },
14684   { STRING_COMMA_LEN ("le_oq") },
14685   { STRING_COMMA_LEN ("unord_s") },
14686   { STRING_COMMA_LEN ("neq_us") },
14687   { STRING_COMMA_LEN ("nlt_uq") },
14688   { STRING_COMMA_LEN ("nle_uq") },
14689   { STRING_COMMA_LEN ("ord_s") },
14690   { STRING_COMMA_LEN ("eq_us") },
14691   { STRING_COMMA_LEN ("nge_uq") },
14692   { STRING_COMMA_LEN ("ngt_uq") },
14693   { STRING_COMMA_LEN ("false_os") },
14694   { STRING_COMMA_LEN ("neq_os") },
14695   { STRING_COMMA_LEN ("ge_oq") },
14696   { STRING_COMMA_LEN ("gt_oq") },
14697   { STRING_COMMA_LEN ("true_us") },
14698 };
14699
14700 static void
14701 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14702 {
14703   unsigned int cmp_type;
14704
14705   FETCH_DATA (the_info, codep + 1);
14706   cmp_type = *codep++ & 0xff;
14707   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
14708     {
14709       char suffix [3];
14710       char *p = mnemonicendp - 2;
14711       suffix[0] = p[0];
14712       suffix[1] = p[1];
14713       suffix[2] = '\0';
14714       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
14715       mnemonicendp += vex_cmp_op[cmp_type].len;
14716     }
14717   else
14718     {
14719       /* We have a reserved extension byte.  Output it directly.  */
14720       scratchbuf[0] = '$';
14721       print_operand_value (scratchbuf + 1, 1, cmp_type);
14722       oappend (scratchbuf + intel_syntax);
14723       scratchbuf[0] = '\0';
14724     }
14725 }
14726
14727 static const struct op pclmul_op[] =
14728 {
14729   { STRING_COMMA_LEN ("lql") },
14730   { STRING_COMMA_LEN ("hql") },
14731   { STRING_COMMA_LEN ("lqh") },
14732   { STRING_COMMA_LEN ("hqh") }
14733 };
14734
14735 static void
14736 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
14737               int sizeflag ATTRIBUTE_UNUSED)
14738 {
14739   unsigned int pclmul_type;
14740
14741   FETCH_DATA (the_info, codep + 1);
14742   pclmul_type = *codep++ & 0xff;
14743   switch (pclmul_type)
14744     {
14745     case 0x10:
14746       pclmul_type = 2;
14747       break;
14748     case 0x11:
14749       pclmul_type = 3;
14750       break;
14751     default:
14752       break;
14753     } 
14754   if (pclmul_type < ARRAY_SIZE (pclmul_op))
14755     {
14756       char suffix [4];
14757       char *p = mnemonicendp - 3;
14758       suffix[0] = p[0];
14759       suffix[1] = p[1];
14760       suffix[2] = p[2];
14761       suffix[3] = '\0';
14762       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14763       mnemonicendp += pclmul_op[pclmul_type].len;
14764     }
14765   else
14766     {
14767       /* We have a reserved extension byte.  Output it directly.  */
14768       scratchbuf[0] = '$';
14769       print_operand_value (scratchbuf + 1, 1, pclmul_type);
14770       oappend (scratchbuf + intel_syntax);
14771       scratchbuf[0] = '\0';
14772     }
14773 }
14774
14775 static void
14776 MOVBE_Fixup (int bytemode, int sizeflag)
14777 {
14778   /* Add proper suffix to "movbe".  */
14779   char *p = mnemonicendp;
14780
14781   switch (bytemode)
14782     {
14783     case v_mode:
14784       if (intel_syntax)
14785         goto skip;
14786
14787       USED_REX (REX_W);
14788       if (sizeflag & SUFFIX_ALWAYS)
14789         {
14790           if (rex & REX_W)
14791             *p++ = 'q';
14792           else
14793             {
14794               if (sizeflag & DFLAG)
14795                 *p++ = 'l';
14796               else
14797                 *p++ = 'w';
14798               used_prefixes |= (prefixes & PREFIX_DATA);
14799             }
14800         }
14801       break;
14802     default:
14803       oappend (INTERNAL_DISASSEMBLER_ERROR);
14804       break;
14805     }
14806   mnemonicendp = p;
14807   *p = '\0';
14808
14809 skip:
14810   OP_M (bytemode, sizeflag);
14811 }
14812
14813 static void
14814 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14815 {
14816   int reg;
14817   const char **names;
14818
14819   /* Skip mod/rm byte.  */
14820   MODRM_CHECK;
14821   codep++;
14822
14823   if (vex.w)
14824     names = names64;
14825   else if (vex.length == 256)
14826     names = names32;
14827   else
14828     names = names16;
14829
14830   reg = modrm.rm;
14831   USED_REX (REX_B);
14832   if (rex & REX_B)
14833     reg += 8;
14834
14835   oappend (names[reg]);
14836 }
14837
14838 static void
14839 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
14840 {
14841   const char **names;
14842
14843   if (vex.w)
14844     names = names64;
14845   else if (vex.length == 256)
14846     names = names32;
14847   else
14848     names = names16;
14849
14850   oappend (names[vex.register_specifier]);
14851 }
14852
14853 static void
14854 OP_LWP_I (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
14855 {
14856   if (vex.w || vex.length == 256)
14857     OP_I (q_mode, sizeflag);
14858   else
14859     OP_I (w_mode, sizeflag);
14860 }
14861