Update copyright years
[external/binutils.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright (C) 1988-2014 Free Software Foundation, Inc.
3
4    This file is part of the GNU opcodes library.
5
6    This library is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10
11    It is distributed in the hope that it will be useful, but WITHOUT
12    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14    License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23    July 1988
24     modified by John Hassey (hassey@dg-rtp.dg.com)
25     x86-64 support added by Jan Hubicka (jh@suse.cz)
26     VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
27
28 /* The main tables describing the instructions is essentially a copy
29    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30    Programmers Manual.  Usually, there is a capital letter, followed
31    by a small letter.  The capital letter tell the addressing mode,
32    and the small letter tells about the operand size.  Refer to
33    the Intel manual for details.  */
34
35 #include "sysdep.h"
36 #include "dis-asm.h"
37 #include "opintl.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40
41 #include <setjmp.h>
42
43 static int print_insn (bfd_vma, disassemble_info *);
44 static void dofloat (int);
45 static void OP_ST (int, int);
46 static void OP_STi (int, int);
47 static int putop (const char *, int);
48 static void oappend (const char *);
49 static void append_seg (void);
50 static void OP_indirE (int, int);
51 static void print_operand_value (char *, int, bfd_vma);
52 static void OP_E_register (int, int);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma get64 (void);
58 static bfd_signed_vma get32 (void);
59 static bfd_signed_vma get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_R (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_EX_Vex (int, int);
91 static void OP_EX_VexW (int, int);
92 static void OP_EX_VexImmW (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_XMM_VexW (int, int);
95 static void OP_Rounding (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 VPCMP_Fixup (int, int);
102 static void OP_0f07 (int, int);
103 static void OP_Monitor (int, int);
104 static void OP_Mwait (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void BND_Fixup (int, int);
112 static void HLE_Fixup1 (int, int);
113 static void HLE_Fixup2 (int, int);
114 static void HLE_Fixup3 (int, int);
115 static void CMPXCHG8B_Fixup (int, int);
116 static void XMM_Fixup (int, int);
117 static void CRC32_Fixup (int, int);
118 static void FXSAVE_Fixup (int, int);
119 static void OP_LWPCB_E (int, int);
120 static void OP_LWP_E (int, int);
121 static void OP_Vex_2src_1 (int, int);
122 static void OP_Vex_2src_2 (int, int);
123
124 static void MOVBE_Fixup (int, int);
125
126 static void OP_Mask (int, int);
127
128 struct dis_private {
129   /* Points to first byte not fetched.  */
130   bfd_byte *max_fetched;
131   bfd_byte the_buffer[MAX_MNEM_SIZE];
132   bfd_vma insn_start;
133   int orig_sizeflag;
134   jmp_buf bailout;
135 };
136
137 enum address_mode
138 {
139   mode_16bit,
140   mode_32bit,
141   mode_64bit
142 };
143
144 enum address_mode address_mode;
145
146 /* Flags for the prefixes for the current instruction.  See below.  */
147 static int prefixes;
148
149 /* REX prefix the current instruction.  See below.  */
150 static int rex;
151 /* Bits of REX we've already used.  */
152 static int rex_used;
153 /* REX bits in original REX prefix ignored.  */
154 static int rex_ignored;
155 /* Mark parts used in the REX prefix.  When we are testing for
156    empty prefix (for 8bit register REX extension), just mask it
157    out.  Otherwise test for REX bit is excuse for existence of REX
158    only in case value is nonzero.  */
159 #define USED_REX(value)                                 \
160   {                                                     \
161     if (value)                                          \
162       {                                                 \
163         if ((rex & value))                              \
164           rex_used |= (value) | REX_OPCODE;             \
165       }                                                 \
166     else                                                \
167       rex_used |= REX_OPCODE;                           \
168   }
169
170 /* Flags for prefixes which we somehow handled when printing the
171    current instruction.  */
172 static int used_prefixes;
173
174 /* Flags stored in PREFIXES.  */
175 #define PREFIX_REPZ 1
176 #define PREFIX_REPNZ 2
177 #define PREFIX_LOCK 4
178 #define PREFIX_CS 8
179 #define PREFIX_SS 0x10
180 #define PREFIX_DS 0x20
181 #define PREFIX_ES 0x40
182 #define PREFIX_FS 0x80
183 #define PREFIX_GS 0x100
184 #define PREFIX_DATA 0x200
185 #define PREFIX_ADDR 0x400
186 #define PREFIX_FWAIT 0x800
187
188 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
189    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
190    on error.  */
191 #define FETCH_DATA(info, addr) \
192   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
193    ? 1 : fetch_data ((info), (addr)))
194
195 static int
196 fetch_data (struct disassemble_info *info, bfd_byte *addr)
197 {
198   int status;
199   struct dis_private *priv = (struct dis_private *) info->private_data;
200   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
201
202   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
203     status = (*info->read_memory_func) (start,
204                                         priv->max_fetched,
205                                         addr - priv->max_fetched,
206                                         info);
207   else
208     status = -1;
209   if (status != 0)
210     {
211       /* If we did manage to read at least one byte, then
212          print_insn_i386 will do something sensible.  Otherwise, print
213          an error.  We do that here because this is where we know
214          STATUS.  */
215       if (priv->max_fetched == priv->the_buffer)
216         (*info->memory_error_func) (status, start, info);
217       longjmp (priv->bailout, 1);
218     }
219   else
220     priv->max_fetched = addr;
221   return 1;
222 }
223
224 #define XX { NULL, 0 }
225 #define Bad_Opcode NULL, { { NULL, 0 } }
226
227 #define Eb { OP_E, b_mode }
228 #define Ebnd { OP_E, bnd_mode }
229 #define EbS { OP_E, b_swap_mode }
230 #define Ev { OP_E, v_mode }
231 #define Ev_bnd { OP_E, v_bnd_mode }
232 #define EvS { OP_E, v_swap_mode }
233 #define Ed { OP_E, d_mode }
234 #define Edq { OP_E, dq_mode }
235 #define Edqw { OP_E, dqw_mode }
236 #define Edqb { OP_E, dqb_mode }
237 #define Edqd { OP_E, dqd_mode }
238 #define Eq { OP_E, q_mode }
239 #define indirEv { OP_indirE, stack_v_mode }
240 #define indirEp { OP_indirE, f_mode }
241 #define stackEv { OP_E, stack_v_mode }
242 #define Em { OP_E, m_mode }
243 #define Ew { OP_E, w_mode }
244 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
245 #define Ma { OP_M, a_mode }
246 #define Mb { OP_M, b_mode }
247 #define Md { OP_M, d_mode }
248 #define Mo { OP_M, o_mode }
249 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
250 #define Mq { OP_M, q_mode }
251 #define Mx { OP_M, x_mode }
252 #define Mxmm { OP_M, xmm_mode }
253 #define Gb { OP_G, b_mode }
254 #define Gbnd { OP_G, bnd_mode }
255 #define Gv { OP_G, v_mode }
256 #define Gd { OP_G, d_mode }
257 #define Gdq { OP_G, dq_mode }
258 #define Gm { OP_G, m_mode }
259 #define Gw { OP_G, w_mode }
260 #define Rd { OP_R, d_mode }
261 #define Rdq { OP_R, dq_mode }
262 #define Rm { OP_R, m_mode }
263 #define Ib { OP_I, b_mode }
264 #define sIb { OP_sI, b_mode }   /* sign extened byte */
265 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
266 #define Iv { OP_I, v_mode }
267 #define sIv { OP_sI, v_mode }
268 #define Iq { OP_I, q_mode }
269 #define Iv64 { OP_I64, v_mode }
270 #define Iw { OP_I, w_mode }
271 #define I1 { OP_I, const_1_mode }
272 #define Jb { OP_J, b_mode }
273 #define Jv { OP_J, v_mode }
274 #define Cm { OP_C, m_mode }
275 #define Dm { OP_D, m_mode }
276 #define Td { OP_T, d_mode }
277 #define Skip_MODRM { OP_Skip_MODRM, 0 }
278
279 #define RMeAX { OP_REG, eAX_reg }
280 #define RMeBX { OP_REG, eBX_reg }
281 #define RMeCX { OP_REG, eCX_reg }
282 #define RMeDX { OP_REG, eDX_reg }
283 #define RMeSP { OP_REG, eSP_reg }
284 #define RMeBP { OP_REG, eBP_reg }
285 #define RMeSI { OP_REG, eSI_reg }
286 #define RMeDI { OP_REG, eDI_reg }
287 #define RMrAX { OP_REG, rAX_reg }
288 #define RMrBX { OP_REG, rBX_reg }
289 #define RMrCX { OP_REG, rCX_reg }
290 #define RMrDX { OP_REG, rDX_reg }
291 #define RMrSP { OP_REG, rSP_reg }
292 #define RMrBP { OP_REG, rBP_reg }
293 #define RMrSI { OP_REG, rSI_reg }
294 #define RMrDI { OP_REG, rDI_reg }
295 #define RMAL { OP_REG, al_reg }
296 #define RMCL { OP_REG, cl_reg }
297 #define RMDL { OP_REG, dl_reg }
298 #define RMBL { OP_REG, bl_reg }
299 #define RMAH { OP_REG, ah_reg }
300 #define RMCH { OP_REG, ch_reg }
301 #define RMDH { OP_REG, dh_reg }
302 #define RMBH { OP_REG, bh_reg }
303 #define RMAX { OP_REG, ax_reg }
304 #define RMDX { OP_REG, dx_reg }
305
306 #define eAX { OP_IMREG, eAX_reg }
307 #define eBX { OP_IMREG, eBX_reg }
308 #define eCX { OP_IMREG, eCX_reg }
309 #define eDX { OP_IMREG, eDX_reg }
310 #define eSP { OP_IMREG, eSP_reg }
311 #define eBP { OP_IMREG, eBP_reg }
312 #define eSI { OP_IMREG, eSI_reg }
313 #define eDI { OP_IMREG, eDI_reg }
314 #define AL { OP_IMREG, al_reg }
315 #define CL { OP_IMREG, cl_reg }
316 #define DL { OP_IMREG, dl_reg }
317 #define BL { OP_IMREG, bl_reg }
318 #define AH { OP_IMREG, ah_reg }
319 #define CH { OP_IMREG, ch_reg }
320 #define DH { OP_IMREG, dh_reg }
321 #define BH { OP_IMREG, bh_reg }
322 #define AX { OP_IMREG, ax_reg }
323 #define DX { OP_IMREG, dx_reg }
324 #define zAX { OP_IMREG, z_mode_ax_reg }
325 #define indirDX { OP_IMREG, indir_dx_reg }
326
327 #define Sw { OP_SEG, w_mode }
328 #define Sv { OP_SEG, v_mode }
329 #define Ap { OP_DIR, 0 }
330 #define Ob { OP_OFF64, b_mode }
331 #define Ov { OP_OFF64, v_mode }
332 #define Xb { OP_DSreg, eSI_reg }
333 #define Xv { OP_DSreg, eSI_reg }
334 #define Xz { OP_DSreg, eSI_reg }
335 #define Yb { OP_ESreg, eDI_reg }
336 #define Yv { OP_ESreg, eDI_reg }
337 #define DSBX { OP_DSreg, eBX_reg }
338
339 #define es { OP_REG, es_reg }
340 #define ss { OP_REG, ss_reg }
341 #define cs { OP_REG, cs_reg }
342 #define ds { OP_REG, ds_reg }
343 #define fs { OP_REG, fs_reg }
344 #define gs { OP_REG, gs_reg }
345
346 #define MX { OP_MMX, 0 }
347 #define XM { OP_XMM, 0 }
348 #define XMScalar { OP_XMM, scalar_mode }
349 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
350 #define XMM { OP_XMM, xmm_mode }
351 #define XMxmmq { OP_XMM, xmmq_mode }
352 #define EM { OP_EM, v_mode }
353 #define EMS { OP_EM, v_swap_mode }
354 #define EMd { OP_EM, d_mode }
355 #define EMx { OP_EM, x_mode }
356 #define EXw { OP_EX, w_mode }
357 #define EXd { OP_EX, d_mode }
358 #define EXdScalar { OP_EX, d_scalar_mode }
359 #define EXdS { OP_EX, d_swap_mode }
360 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
361 #define EXq { OP_EX, q_mode }
362 #define EXqScalar { OP_EX, q_scalar_mode }
363 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
364 #define EXqS { OP_EX, q_swap_mode }
365 #define EXx { OP_EX, x_mode }
366 #define EXxS { OP_EX, x_swap_mode }
367 #define EXxmm { OP_EX, xmm_mode }
368 #define EXymm { OP_EX, ymm_mode }
369 #define EXxmmq { OP_EX, xmmq_mode }
370 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
371 #define EXxmm_mb { OP_EX, xmm_mb_mode }
372 #define EXxmm_mw { OP_EX, xmm_mw_mode }
373 #define EXxmm_md { OP_EX, xmm_md_mode }
374 #define EXxmm_mq { OP_EX, xmm_mq_mode }
375 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
376 #define EXxmmdw { OP_EX, xmmdw_mode }
377 #define EXxmmqd { OP_EX, xmmqd_mode }
378 #define EXymmq { OP_EX, ymmq_mode }
379 #define EXVexWdq { OP_EX, vex_w_dq_mode }
380 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
381 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
382 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
383 #define MS { OP_MS, v_mode }
384 #define XS { OP_XS, v_mode }
385 #define EMCq { OP_EMC, q_mode }
386 #define MXC { OP_MXC, 0 }
387 #define OPSUF { OP_3DNowSuffix, 0 }
388 #define CMP { CMP_Fixup, 0 }
389 #define XMM0 { XMM_Fixup, 0 }
390 #define FXSAVE { FXSAVE_Fixup, 0 }
391 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
392 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
393
394 #define Vex { OP_VEX, vex_mode }
395 #define VexScalar { OP_VEX, vex_scalar_mode }
396 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
397 #define Vex128 { OP_VEX, vex128_mode }
398 #define Vex256 { OP_VEX, vex256_mode }
399 #define VexGdq { OP_VEX, dq_mode }
400 #define VexI4 { VEXI4_Fixup, 0}
401 #define EXdVex { OP_EX_Vex, d_mode }
402 #define EXdVexS { OP_EX_Vex, d_swap_mode }
403 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
404 #define EXqVex { OP_EX_Vex, q_mode }
405 #define EXqVexS { OP_EX_Vex, q_swap_mode }
406 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
407 #define EXVexW { OP_EX_VexW, x_mode }
408 #define EXdVexW { OP_EX_VexW, d_mode }
409 #define EXqVexW { OP_EX_VexW, q_mode }
410 #define EXVexImmW { OP_EX_VexImmW, x_mode }
411 #define XMVex { OP_XMM_Vex, 0 }
412 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
413 #define XMVexW { OP_XMM_VexW, 0 }
414 #define XMVexI4 { OP_REG_VexI4, x_mode }
415 #define PCLMUL { PCLMUL_Fixup, 0 }
416 #define VZERO { VZERO_Fixup, 0 }
417 #define VCMP { VCMP_Fixup, 0 }
418 #define VPCMP { VPCMP_Fixup, 0 }
419
420 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
421 #define EXxEVexS { OP_Rounding, evex_sae_mode }
422
423 #define XMask { OP_Mask, mask_mode }
424 #define MaskG { OP_G, mask_mode }
425 #define MaskE { OP_E, mask_mode }
426 #define MaskR { OP_R, mask_mode }
427 #define MaskVex { OP_VEX, mask_mode }
428
429 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
430 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
431
432 /* Used handle "rep" prefix for string instructions.  */
433 #define Xbr { REP_Fixup, eSI_reg }
434 #define Xvr { REP_Fixup, eSI_reg }
435 #define Ybr { REP_Fixup, eDI_reg }
436 #define Yvr { REP_Fixup, eDI_reg }
437 #define Yzr { REP_Fixup, eDI_reg }
438 #define indirDXr { REP_Fixup, indir_dx_reg }
439 #define ALr { REP_Fixup, al_reg }
440 #define eAXr { REP_Fixup, eAX_reg }
441
442 /* Used handle HLE prefix for lockable instructions.  */
443 #define Ebh1 { HLE_Fixup1, b_mode }
444 #define Evh1 { HLE_Fixup1, v_mode }
445 #define Ebh2 { HLE_Fixup2, b_mode }
446 #define Evh2 { HLE_Fixup2, v_mode }
447 #define Ebh3 { HLE_Fixup3, b_mode }
448 #define Evh3 { HLE_Fixup3, v_mode }
449
450 #define BND { BND_Fixup, 0 }
451
452 #define cond_jump_flag { NULL, cond_jump_mode }
453 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
454
455 /* bits in sizeflag */
456 #define SUFFIX_ALWAYS 4
457 #define AFLAG 2
458 #define DFLAG 1
459
460 enum
461 {
462   /* byte operand */
463   b_mode = 1,
464   /* byte operand with operand swapped */
465   b_swap_mode,
466   /* byte operand, sign extend like 'T' suffix */
467   b_T_mode,
468   /* operand size depends on prefixes */
469   v_mode,
470   /* operand size depends on prefixes with operand swapped */
471   v_swap_mode,
472   /* word operand */
473   w_mode,
474   /* double word operand  */
475   d_mode,
476   /* double word operand with operand swapped */
477   d_swap_mode,
478   /* quad word operand */
479   q_mode,
480   /* quad word operand with operand swapped */
481   q_swap_mode,
482   /* ten-byte operand */
483   t_mode,
484   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
485      broadcast enabled.  */
486   x_mode,
487   /* Similar to x_mode, but with different EVEX mem shifts.  */
488   evex_x_gscat_mode,
489   /* Similar to x_mode, but with disabled broadcast.  */
490   evex_x_nobcst_mode,
491   /* Similar to x_mode, but with operands swapped and disabled broadcast
492      in EVEX.  */
493   x_swap_mode,
494   /* 16-byte XMM operand */
495   xmm_mode,
496   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
497      memory operand (depending on vector length).  Broadcast isn't
498      allowed.  */
499   xmmq_mode,
500   /* Same as xmmq_mode, but broadcast is allowed.  */
501   evex_half_bcst_xmmq_mode,
502   /* XMM register or byte memory operand */
503   xmm_mb_mode,
504   /* XMM register or word memory operand */
505   xmm_mw_mode,
506   /* XMM register or double word memory operand */
507   xmm_md_mode,
508   /* XMM register or quad word memory operand */
509   xmm_mq_mode,
510   /* XMM register or double/quad word memory operand, depending on
511      VEX.W.  */
512   xmm_mdq_mode,
513   /* 16-byte XMM, word, double word or quad word operand.  */
514   xmmdw_mode,
515   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
516   xmmqd_mode,
517   /* 32-byte YMM operand */
518   ymm_mode,
519   /* quad word, ymmword or zmmword memory operand.  */
520   ymmq_mode,
521   /* 32-byte YMM or 16-byte word operand */
522   ymmxmm_mode,
523   /* d_mode in 32bit, q_mode in 64bit mode.  */
524   m_mode,
525   /* pair of v_mode operands */
526   a_mode,
527   cond_jump_mode,
528   loop_jcxz_mode,
529   v_bnd_mode,
530   /* operand size depends on REX prefixes.  */
531   dq_mode,
532   /* registers like dq_mode, memory like w_mode.  */
533   dqw_mode,
534   bnd_mode,
535   /* 4- or 6-byte pointer operand */
536   f_mode,
537   const_1_mode,
538   /* v_mode for stack-related opcodes.  */
539   stack_v_mode,
540   /* non-quad operand size depends on prefixes */
541   z_mode,
542   /* 16-byte operand */
543   o_mode,
544   /* registers like dq_mode, memory like b_mode.  */
545   dqb_mode,
546   /* registers like dq_mode, memory like d_mode.  */
547   dqd_mode,
548   /* normal vex mode */
549   vex_mode,
550   /* 128bit vex mode */
551   vex128_mode,
552   /* 256bit vex mode */
553   vex256_mode,
554   /* operand size depends on the VEX.W bit.  */
555   vex_w_dq_mode,
556
557   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
558   vex_vsib_d_w_dq_mode,
559   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
560   vex_vsib_q_w_dq_mode,
561
562   /* scalar, ignore vector length.  */
563   scalar_mode,
564   /* like d_mode, ignore vector length.  */
565   d_scalar_mode,
566   /* like d_swap_mode, ignore vector length.  */
567   d_scalar_swap_mode,
568   /* like q_mode, ignore vector length.  */
569   q_scalar_mode,
570   /* like q_swap_mode, ignore vector length.  */
571   q_scalar_swap_mode,
572   /* like vex_mode, ignore vector length.  */
573   vex_scalar_mode,
574   /* like vex_w_dq_mode, ignore vector length.  */
575   vex_scalar_w_dq_mode,
576
577   /* Static rounding.  */
578   evex_rounding_mode,
579   /* Supress all exceptions.  */
580   evex_sae_mode,
581
582   /* Mask register operand.  */
583   mask_mode,
584
585   es_reg,
586   cs_reg,
587   ss_reg,
588   ds_reg,
589   fs_reg,
590   gs_reg,
591
592   eAX_reg,
593   eCX_reg,
594   eDX_reg,
595   eBX_reg,
596   eSP_reg,
597   eBP_reg,
598   eSI_reg,
599   eDI_reg,
600
601   al_reg,
602   cl_reg,
603   dl_reg,
604   bl_reg,
605   ah_reg,
606   ch_reg,
607   dh_reg,
608   bh_reg,
609
610   ax_reg,
611   cx_reg,
612   dx_reg,
613   bx_reg,
614   sp_reg,
615   bp_reg,
616   si_reg,
617   di_reg,
618
619   rAX_reg,
620   rCX_reg,
621   rDX_reg,
622   rBX_reg,
623   rSP_reg,
624   rBP_reg,
625   rSI_reg,
626   rDI_reg,
627
628   z_mode_ax_reg,
629   indir_dx_reg
630 };
631
632 enum
633 {
634   FLOATCODE = 1,
635   USE_REG_TABLE,
636   USE_MOD_TABLE,
637   USE_RM_TABLE,
638   USE_PREFIX_TABLE,
639   USE_X86_64_TABLE,
640   USE_3BYTE_TABLE,
641   USE_XOP_8F_TABLE,
642   USE_VEX_C4_TABLE,
643   USE_VEX_C5_TABLE,
644   USE_VEX_LEN_TABLE,
645   USE_VEX_W_TABLE,
646   USE_EVEX_TABLE
647 };
648
649 #define FLOAT                   NULL, { { NULL, FLOATCODE } }
650
651 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }
652 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
653 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
654 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
655 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
656 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
657 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
658 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
659 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
660 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
661 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
662 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
663 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
664
665 enum
666 {
667   REG_80 = 0,
668   REG_81,
669   REG_82,
670   REG_8F,
671   REG_C0,
672   REG_C1,
673   REG_C6,
674   REG_C7,
675   REG_D0,
676   REG_D1,
677   REG_D2,
678   REG_D3,
679   REG_F6,
680   REG_F7,
681   REG_FE,
682   REG_FF,
683   REG_0F00,
684   REG_0F01,
685   REG_0F0D,
686   REG_0F18,
687   REG_0F71,
688   REG_0F72,
689   REG_0F73,
690   REG_0FA6,
691   REG_0FA7,
692   REG_0FAE,
693   REG_0FBA,
694   REG_0FC7,
695   REG_VEX_0F71,
696   REG_VEX_0F72,
697   REG_VEX_0F73,
698   REG_VEX_0FAE,
699   REG_VEX_0F38F3,
700   REG_XOP_LWPCB,
701   REG_XOP_LWP,
702   REG_XOP_TBM_01,
703   REG_XOP_TBM_02,
704
705   REG_EVEX_0F72,
706   REG_EVEX_0F73,
707   REG_EVEX_0F38C6,
708   REG_EVEX_0F38C7
709 };
710
711 enum
712 {
713   MOD_8D = 0,
714   MOD_C6_REG_7,
715   MOD_C7_REG_7,
716   MOD_FF_REG_3,
717   MOD_FF_REG_5,
718   MOD_0F01_REG_0,
719   MOD_0F01_REG_1,
720   MOD_0F01_REG_2,
721   MOD_0F01_REG_3,
722   MOD_0F01_REG_7,
723   MOD_0F12_PREFIX_0,
724   MOD_0F13,
725   MOD_0F16_PREFIX_0,
726   MOD_0F17,
727   MOD_0F18_REG_0,
728   MOD_0F18_REG_1,
729   MOD_0F18_REG_2,
730   MOD_0F18_REG_3,
731   MOD_0F18_REG_4,
732   MOD_0F18_REG_5,
733   MOD_0F18_REG_6,
734   MOD_0F18_REG_7,
735   MOD_0F1A_PREFIX_0,
736   MOD_0F1B_PREFIX_0,
737   MOD_0F1B_PREFIX_1,
738   MOD_0F20,
739   MOD_0F21,
740   MOD_0F22,
741   MOD_0F23,
742   MOD_0F24,
743   MOD_0F26,
744   MOD_0F2B_PREFIX_0,
745   MOD_0F2B_PREFIX_1,
746   MOD_0F2B_PREFIX_2,
747   MOD_0F2B_PREFIX_3,
748   MOD_0F51,
749   MOD_0F71_REG_2,
750   MOD_0F71_REG_4,
751   MOD_0F71_REG_6,
752   MOD_0F72_REG_2,
753   MOD_0F72_REG_4,
754   MOD_0F72_REG_6,
755   MOD_0F73_REG_2,
756   MOD_0F73_REG_3,
757   MOD_0F73_REG_6,
758   MOD_0F73_REG_7,
759   MOD_0FAE_REG_0,
760   MOD_0FAE_REG_1,
761   MOD_0FAE_REG_2,
762   MOD_0FAE_REG_3,
763   MOD_0FAE_REG_4,
764   MOD_0FAE_REG_5,
765   MOD_0FAE_REG_6,
766   MOD_0FAE_REG_7,
767   MOD_0FB2,
768   MOD_0FB4,
769   MOD_0FB5,
770   MOD_0FC7_REG_3,
771   MOD_0FC7_REG_4,
772   MOD_0FC7_REG_5,
773   MOD_0FC7_REG_6,
774   MOD_0FC7_REG_7,
775   MOD_0FD7,
776   MOD_0FE7_PREFIX_2,
777   MOD_0FF0_PREFIX_3,
778   MOD_0F382A_PREFIX_2,
779   MOD_62_32BIT,
780   MOD_C4_32BIT,
781   MOD_C5_32BIT,
782   MOD_VEX_0F12_PREFIX_0,
783   MOD_VEX_0F13,
784   MOD_VEX_0F16_PREFIX_0,
785   MOD_VEX_0F17,
786   MOD_VEX_0F2B,
787   MOD_VEX_0F50,
788   MOD_VEX_0F71_REG_2,
789   MOD_VEX_0F71_REG_4,
790   MOD_VEX_0F71_REG_6,
791   MOD_VEX_0F72_REG_2,
792   MOD_VEX_0F72_REG_4,
793   MOD_VEX_0F72_REG_6,
794   MOD_VEX_0F73_REG_2,
795   MOD_VEX_0F73_REG_3,
796   MOD_VEX_0F73_REG_6,
797   MOD_VEX_0F73_REG_7,
798   MOD_VEX_0FAE_REG_2,
799   MOD_VEX_0FAE_REG_3,
800   MOD_VEX_0FD7_PREFIX_2,
801   MOD_VEX_0FE7_PREFIX_2,
802   MOD_VEX_0FF0_PREFIX_3,
803   MOD_VEX_0F381A_PREFIX_2,
804   MOD_VEX_0F382A_PREFIX_2,
805   MOD_VEX_0F382C_PREFIX_2,
806   MOD_VEX_0F382D_PREFIX_2,
807   MOD_VEX_0F382E_PREFIX_2,
808   MOD_VEX_0F382F_PREFIX_2,
809   MOD_VEX_0F385A_PREFIX_2,
810   MOD_VEX_0F388C_PREFIX_2,
811   MOD_VEX_0F388E_PREFIX_2,
812
813   MOD_EVEX_0F10_PREFIX_1,
814   MOD_EVEX_0F10_PREFIX_3,
815   MOD_EVEX_0F11_PREFIX_1,
816   MOD_EVEX_0F11_PREFIX_3,
817   MOD_EVEX_0F12_PREFIX_0,
818   MOD_EVEX_0F16_PREFIX_0,
819   MOD_EVEX_0F38C6_REG_1,
820   MOD_EVEX_0F38C6_REG_2,
821   MOD_EVEX_0F38C6_REG_5,
822   MOD_EVEX_0F38C6_REG_6,
823   MOD_EVEX_0F38C7_REG_1,
824   MOD_EVEX_0F38C7_REG_2,
825   MOD_EVEX_0F38C7_REG_5,
826   MOD_EVEX_0F38C7_REG_6
827 };
828
829 enum
830 {
831   RM_C6_REG_7 = 0,
832   RM_C7_REG_7,
833   RM_0F01_REG_0,
834   RM_0F01_REG_1,
835   RM_0F01_REG_2,
836   RM_0F01_REG_3,
837   RM_0F01_REG_7,
838   RM_0FAE_REG_5,
839   RM_0FAE_REG_6,
840   RM_0FAE_REG_7
841 };
842
843 enum
844 {
845   PREFIX_90 = 0,
846   PREFIX_0F10,
847   PREFIX_0F11,
848   PREFIX_0F12,
849   PREFIX_0F16,
850   PREFIX_0F1A,
851   PREFIX_0F1B,
852   PREFIX_0F2A,
853   PREFIX_0F2B,
854   PREFIX_0F2C,
855   PREFIX_0F2D,
856   PREFIX_0F2E,
857   PREFIX_0F2F,
858   PREFIX_0F51,
859   PREFIX_0F52,
860   PREFIX_0F53,
861   PREFIX_0F58,
862   PREFIX_0F59,
863   PREFIX_0F5A,
864   PREFIX_0F5B,
865   PREFIX_0F5C,
866   PREFIX_0F5D,
867   PREFIX_0F5E,
868   PREFIX_0F5F,
869   PREFIX_0F60,
870   PREFIX_0F61,
871   PREFIX_0F62,
872   PREFIX_0F6C,
873   PREFIX_0F6D,
874   PREFIX_0F6F,
875   PREFIX_0F70,
876   PREFIX_0F73_REG_3,
877   PREFIX_0F73_REG_7,
878   PREFIX_0F78,
879   PREFIX_0F79,
880   PREFIX_0F7C,
881   PREFIX_0F7D,
882   PREFIX_0F7E,
883   PREFIX_0F7F,
884   PREFIX_0FAE_REG_0,
885   PREFIX_0FAE_REG_1,
886   PREFIX_0FAE_REG_2,
887   PREFIX_0FAE_REG_3,
888   PREFIX_0FAE_REG_7,
889   PREFIX_0FB8,
890   PREFIX_0FBC,
891   PREFIX_0FBD,
892   PREFIX_0FC2,
893   PREFIX_0FC3,
894   PREFIX_0FC7_REG_6,
895   PREFIX_0FD0,
896   PREFIX_0FD6,
897   PREFIX_0FE6,
898   PREFIX_0FE7,
899   PREFIX_0FF0,
900   PREFIX_0FF7,
901   PREFIX_0F3810,
902   PREFIX_0F3814,
903   PREFIX_0F3815,
904   PREFIX_0F3817,
905   PREFIX_0F3820,
906   PREFIX_0F3821,
907   PREFIX_0F3822,
908   PREFIX_0F3823,
909   PREFIX_0F3824,
910   PREFIX_0F3825,
911   PREFIX_0F3828,
912   PREFIX_0F3829,
913   PREFIX_0F382A,
914   PREFIX_0F382B,
915   PREFIX_0F3830,
916   PREFIX_0F3831,
917   PREFIX_0F3832,
918   PREFIX_0F3833,
919   PREFIX_0F3834,
920   PREFIX_0F3835,
921   PREFIX_0F3837,
922   PREFIX_0F3838,
923   PREFIX_0F3839,
924   PREFIX_0F383A,
925   PREFIX_0F383B,
926   PREFIX_0F383C,
927   PREFIX_0F383D,
928   PREFIX_0F383E,
929   PREFIX_0F383F,
930   PREFIX_0F3840,
931   PREFIX_0F3841,
932   PREFIX_0F3880,
933   PREFIX_0F3881,
934   PREFIX_0F3882,
935   PREFIX_0F38C8,
936   PREFIX_0F38C9,
937   PREFIX_0F38CA,
938   PREFIX_0F38CB,
939   PREFIX_0F38CC,
940   PREFIX_0F38CD,
941   PREFIX_0F38DB,
942   PREFIX_0F38DC,
943   PREFIX_0F38DD,
944   PREFIX_0F38DE,
945   PREFIX_0F38DF,
946   PREFIX_0F38F0,
947   PREFIX_0F38F1,
948   PREFIX_0F38F6,
949   PREFIX_0F3A08,
950   PREFIX_0F3A09,
951   PREFIX_0F3A0A,
952   PREFIX_0F3A0B,
953   PREFIX_0F3A0C,
954   PREFIX_0F3A0D,
955   PREFIX_0F3A0E,
956   PREFIX_0F3A14,
957   PREFIX_0F3A15,
958   PREFIX_0F3A16,
959   PREFIX_0F3A17,
960   PREFIX_0F3A20,
961   PREFIX_0F3A21,
962   PREFIX_0F3A22,
963   PREFIX_0F3A40,
964   PREFIX_0F3A41,
965   PREFIX_0F3A42,
966   PREFIX_0F3A44,
967   PREFIX_0F3A60,
968   PREFIX_0F3A61,
969   PREFIX_0F3A62,
970   PREFIX_0F3A63,
971   PREFIX_0F3ACC,
972   PREFIX_0F3ADF,
973   PREFIX_VEX_0F10,
974   PREFIX_VEX_0F11,
975   PREFIX_VEX_0F12,
976   PREFIX_VEX_0F16,
977   PREFIX_VEX_0F2A,
978   PREFIX_VEX_0F2C,
979   PREFIX_VEX_0F2D,
980   PREFIX_VEX_0F2E,
981   PREFIX_VEX_0F2F,
982   PREFIX_VEX_0F41,
983   PREFIX_VEX_0F42,
984   PREFIX_VEX_0F44,
985   PREFIX_VEX_0F45,
986   PREFIX_VEX_0F46,
987   PREFIX_VEX_0F47,
988   PREFIX_VEX_0F4B,
989   PREFIX_VEX_0F51,
990   PREFIX_VEX_0F52,
991   PREFIX_VEX_0F53,
992   PREFIX_VEX_0F58,
993   PREFIX_VEX_0F59,
994   PREFIX_VEX_0F5A,
995   PREFIX_VEX_0F5B,
996   PREFIX_VEX_0F5C,
997   PREFIX_VEX_0F5D,
998   PREFIX_VEX_0F5E,
999   PREFIX_VEX_0F5F,
1000   PREFIX_VEX_0F60,
1001   PREFIX_VEX_0F61,
1002   PREFIX_VEX_0F62,
1003   PREFIX_VEX_0F63,
1004   PREFIX_VEX_0F64,
1005   PREFIX_VEX_0F65,
1006   PREFIX_VEX_0F66,
1007   PREFIX_VEX_0F67,
1008   PREFIX_VEX_0F68,
1009   PREFIX_VEX_0F69,
1010   PREFIX_VEX_0F6A,
1011   PREFIX_VEX_0F6B,
1012   PREFIX_VEX_0F6C,
1013   PREFIX_VEX_0F6D,
1014   PREFIX_VEX_0F6E,
1015   PREFIX_VEX_0F6F,
1016   PREFIX_VEX_0F70,
1017   PREFIX_VEX_0F71_REG_2,
1018   PREFIX_VEX_0F71_REG_4,
1019   PREFIX_VEX_0F71_REG_6,
1020   PREFIX_VEX_0F72_REG_2,
1021   PREFIX_VEX_0F72_REG_4,
1022   PREFIX_VEX_0F72_REG_6,
1023   PREFIX_VEX_0F73_REG_2,
1024   PREFIX_VEX_0F73_REG_3,
1025   PREFIX_VEX_0F73_REG_6,
1026   PREFIX_VEX_0F73_REG_7,
1027   PREFIX_VEX_0F74,
1028   PREFIX_VEX_0F75,
1029   PREFIX_VEX_0F76,
1030   PREFIX_VEX_0F77,
1031   PREFIX_VEX_0F7C,
1032   PREFIX_VEX_0F7D,
1033   PREFIX_VEX_0F7E,
1034   PREFIX_VEX_0F7F,
1035   PREFIX_VEX_0F90,
1036   PREFIX_VEX_0F91,
1037   PREFIX_VEX_0F92,
1038   PREFIX_VEX_0F93,
1039   PREFIX_VEX_0F98,
1040   PREFIX_VEX_0FC2,
1041   PREFIX_VEX_0FC4,
1042   PREFIX_VEX_0FC5,
1043   PREFIX_VEX_0FD0,
1044   PREFIX_VEX_0FD1,
1045   PREFIX_VEX_0FD2,
1046   PREFIX_VEX_0FD3,
1047   PREFIX_VEX_0FD4,
1048   PREFIX_VEX_0FD5,
1049   PREFIX_VEX_0FD6,
1050   PREFIX_VEX_0FD7,
1051   PREFIX_VEX_0FD8,
1052   PREFIX_VEX_0FD9,
1053   PREFIX_VEX_0FDA,
1054   PREFIX_VEX_0FDB,
1055   PREFIX_VEX_0FDC,
1056   PREFIX_VEX_0FDD,
1057   PREFIX_VEX_0FDE,
1058   PREFIX_VEX_0FDF,
1059   PREFIX_VEX_0FE0,
1060   PREFIX_VEX_0FE1,
1061   PREFIX_VEX_0FE2,
1062   PREFIX_VEX_0FE3,
1063   PREFIX_VEX_0FE4,
1064   PREFIX_VEX_0FE5,
1065   PREFIX_VEX_0FE6,
1066   PREFIX_VEX_0FE7,
1067   PREFIX_VEX_0FE8,
1068   PREFIX_VEX_0FE9,
1069   PREFIX_VEX_0FEA,
1070   PREFIX_VEX_0FEB,
1071   PREFIX_VEX_0FEC,
1072   PREFIX_VEX_0FED,
1073   PREFIX_VEX_0FEE,
1074   PREFIX_VEX_0FEF,
1075   PREFIX_VEX_0FF0,
1076   PREFIX_VEX_0FF1,
1077   PREFIX_VEX_0FF2,
1078   PREFIX_VEX_0FF3,
1079   PREFIX_VEX_0FF4,
1080   PREFIX_VEX_0FF5,
1081   PREFIX_VEX_0FF6,
1082   PREFIX_VEX_0FF7,
1083   PREFIX_VEX_0FF8,
1084   PREFIX_VEX_0FF9,
1085   PREFIX_VEX_0FFA,
1086   PREFIX_VEX_0FFB,
1087   PREFIX_VEX_0FFC,
1088   PREFIX_VEX_0FFD,
1089   PREFIX_VEX_0FFE,
1090   PREFIX_VEX_0F3800,
1091   PREFIX_VEX_0F3801,
1092   PREFIX_VEX_0F3802,
1093   PREFIX_VEX_0F3803,
1094   PREFIX_VEX_0F3804,
1095   PREFIX_VEX_0F3805,
1096   PREFIX_VEX_0F3806,
1097   PREFIX_VEX_0F3807,
1098   PREFIX_VEX_0F3808,
1099   PREFIX_VEX_0F3809,
1100   PREFIX_VEX_0F380A,
1101   PREFIX_VEX_0F380B,
1102   PREFIX_VEX_0F380C,
1103   PREFIX_VEX_0F380D,
1104   PREFIX_VEX_0F380E,
1105   PREFIX_VEX_0F380F,
1106   PREFIX_VEX_0F3813,
1107   PREFIX_VEX_0F3816,
1108   PREFIX_VEX_0F3817,
1109   PREFIX_VEX_0F3818,
1110   PREFIX_VEX_0F3819,
1111   PREFIX_VEX_0F381A,
1112   PREFIX_VEX_0F381C,
1113   PREFIX_VEX_0F381D,
1114   PREFIX_VEX_0F381E,
1115   PREFIX_VEX_0F3820,
1116   PREFIX_VEX_0F3821,
1117   PREFIX_VEX_0F3822,
1118   PREFIX_VEX_0F3823,
1119   PREFIX_VEX_0F3824,
1120   PREFIX_VEX_0F3825,
1121   PREFIX_VEX_0F3828,
1122   PREFIX_VEX_0F3829,
1123   PREFIX_VEX_0F382A,
1124   PREFIX_VEX_0F382B,
1125   PREFIX_VEX_0F382C,
1126   PREFIX_VEX_0F382D,
1127   PREFIX_VEX_0F382E,
1128   PREFIX_VEX_0F382F,
1129   PREFIX_VEX_0F3830,
1130   PREFIX_VEX_0F3831,
1131   PREFIX_VEX_0F3832,
1132   PREFIX_VEX_0F3833,
1133   PREFIX_VEX_0F3834,
1134   PREFIX_VEX_0F3835,
1135   PREFIX_VEX_0F3836,
1136   PREFIX_VEX_0F3837,
1137   PREFIX_VEX_0F3838,
1138   PREFIX_VEX_0F3839,
1139   PREFIX_VEX_0F383A,
1140   PREFIX_VEX_0F383B,
1141   PREFIX_VEX_0F383C,
1142   PREFIX_VEX_0F383D,
1143   PREFIX_VEX_0F383E,
1144   PREFIX_VEX_0F383F,
1145   PREFIX_VEX_0F3840,
1146   PREFIX_VEX_0F3841,
1147   PREFIX_VEX_0F3845,
1148   PREFIX_VEX_0F3846,
1149   PREFIX_VEX_0F3847,
1150   PREFIX_VEX_0F3858,
1151   PREFIX_VEX_0F3859,
1152   PREFIX_VEX_0F385A,
1153   PREFIX_VEX_0F3878,
1154   PREFIX_VEX_0F3879,
1155   PREFIX_VEX_0F388C,
1156   PREFIX_VEX_0F388E,
1157   PREFIX_VEX_0F3890,
1158   PREFIX_VEX_0F3891,
1159   PREFIX_VEX_0F3892,
1160   PREFIX_VEX_0F3893,
1161   PREFIX_VEX_0F3896,
1162   PREFIX_VEX_0F3897,
1163   PREFIX_VEX_0F3898,
1164   PREFIX_VEX_0F3899,
1165   PREFIX_VEX_0F389A,
1166   PREFIX_VEX_0F389B,
1167   PREFIX_VEX_0F389C,
1168   PREFIX_VEX_0F389D,
1169   PREFIX_VEX_0F389E,
1170   PREFIX_VEX_0F389F,
1171   PREFIX_VEX_0F38A6,
1172   PREFIX_VEX_0F38A7,
1173   PREFIX_VEX_0F38A8,
1174   PREFIX_VEX_0F38A9,
1175   PREFIX_VEX_0F38AA,
1176   PREFIX_VEX_0F38AB,
1177   PREFIX_VEX_0F38AC,
1178   PREFIX_VEX_0F38AD,
1179   PREFIX_VEX_0F38AE,
1180   PREFIX_VEX_0F38AF,
1181   PREFIX_VEX_0F38B6,
1182   PREFIX_VEX_0F38B7,
1183   PREFIX_VEX_0F38B8,
1184   PREFIX_VEX_0F38B9,
1185   PREFIX_VEX_0F38BA,
1186   PREFIX_VEX_0F38BB,
1187   PREFIX_VEX_0F38BC,
1188   PREFIX_VEX_0F38BD,
1189   PREFIX_VEX_0F38BE,
1190   PREFIX_VEX_0F38BF,
1191   PREFIX_VEX_0F38DB,
1192   PREFIX_VEX_0F38DC,
1193   PREFIX_VEX_0F38DD,
1194   PREFIX_VEX_0F38DE,
1195   PREFIX_VEX_0F38DF,
1196   PREFIX_VEX_0F38F2,
1197   PREFIX_VEX_0F38F3_REG_1,
1198   PREFIX_VEX_0F38F3_REG_2,
1199   PREFIX_VEX_0F38F3_REG_3,
1200   PREFIX_VEX_0F38F5,
1201   PREFIX_VEX_0F38F6,
1202   PREFIX_VEX_0F38F7,
1203   PREFIX_VEX_0F3A00,
1204   PREFIX_VEX_0F3A01,
1205   PREFIX_VEX_0F3A02,
1206   PREFIX_VEX_0F3A04,
1207   PREFIX_VEX_0F3A05,
1208   PREFIX_VEX_0F3A06,
1209   PREFIX_VEX_0F3A08,
1210   PREFIX_VEX_0F3A09,
1211   PREFIX_VEX_0F3A0A,
1212   PREFIX_VEX_0F3A0B,
1213   PREFIX_VEX_0F3A0C,
1214   PREFIX_VEX_0F3A0D,
1215   PREFIX_VEX_0F3A0E,
1216   PREFIX_VEX_0F3A0F,
1217   PREFIX_VEX_0F3A14,
1218   PREFIX_VEX_0F3A15,
1219   PREFIX_VEX_0F3A16,
1220   PREFIX_VEX_0F3A17,
1221   PREFIX_VEX_0F3A18,
1222   PREFIX_VEX_0F3A19,
1223   PREFIX_VEX_0F3A1D,
1224   PREFIX_VEX_0F3A20,
1225   PREFIX_VEX_0F3A21,
1226   PREFIX_VEX_0F3A22,
1227   PREFIX_VEX_0F3A30,
1228   PREFIX_VEX_0F3A32,
1229   PREFIX_VEX_0F3A38,
1230   PREFIX_VEX_0F3A39,
1231   PREFIX_VEX_0F3A40,
1232   PREFIX_VEX_0F3A41,
1233   PREFIX_VEX_0F3A42,
1234   PREFIX_VEX_0F3A44,
1235   PREFIX_VEX_0F3A46,
1236   PREFIX_VEX_0F3A48,
1237   PREFIX_VEX_0F3A49,
1238   PREFIX_VEX_0F3A4A,
1239   PREFIX_VEX_0F3A4B,
1240   PREFIX_VEX_0F3A4C,
1241   PREFIX_VEX_0F3A5C,
1242   PREFIX_VEX_0F3A5D,
1243   PREFIX_VEX_0F3A5E,
1244   PREFIX_VEX_0F3A5F,
1245   PREFIX_VEX_0F3A60,
1246   PREFIX_VEX_0F3A61,
1247   PREFIX_VEX_0F3A62,
1248   PREFIX_VEX_0F3A63,
1249   PREFIX_VEX_0F3A68,
1250   PREFIX_VEX_0F3A69,
1251   PREFIX_VEX_0F3A6A,
1252   PREFIX_VEX_0F3A6B,
1253   PREFIX_VEX_0F3A6C,
1254   PREFIX_VEX_0F3A6D,
1255   PREFIX_VEX_0F3A6E,
1256   PREFIX_VEX_0F3A6F,
1257   PREFIX_VEX_0F3A78,
1258   PREFIX_VEX_0F3A79,
1259   PREFIX_VEX_0F3A7A,
1260   PREFIX_VEX_0F3A7B,
1261   PREFIX_VEX_0F3A7C,
1262   PREFIX_VEX_0F3A7D,
1263   PREFIX_VEX_0F3A7E,
1264   PREFIX_VEX_0F3A7F,
1265   PREFIX_VEX_0F3ADF,
1266   PREFIX_VEX_0F3AF0,
1267
1268   PREFIX_EVEX_0F10,
1269   PREFIX_EVEX_0F11,
1270   PREFIX_EVEX_0F12,
1271   PREFIX_EVEX_0F13,
1272   PREFIX_EVEX_0F14,
1273   PREFIX_EVEX_0F15,
1274   PREFIX_EVEX_0F16,
1275   PREFIX_EVEX_0F17,
1276   PREFIX_EVEX_0F28,
1277   PREFIX_EVEX_0F29,
1278   PREFIX_EVEX_0F2A,
1279   PREFIX_EVEX_0F2B,
1280   PREFIX_EVEX_0F2C,
1281   PREFIX_EVEX_0F2D,
1282   PREFIX_EVEX_0F2E,
1283   PREFIX_EVEX_0F2F,
1284   PREFIX_EVEX_0F51,
1285   PREFIX_EVEX_0F58,
1286   PREFIX_EVEX_0F59,
1287   PREFIX_EVEX_0F5A,
1288   PREFIX_EVEX_0F5B,
1289   PREFIX_EVEX_0F5C,
1290   PREFIX_EVEX_0F5D,
1291   PREFIX_EVEX_0F5E,
1292   PREFIX_EVEX_0F5F,
1293   PREFIX_EVEX_0F62,
1294   PREFIX_EVEX_0F66,
1295   PREFIX_EVEX_0F6A,
1296   PREFIX_EVEX_0F6C,
1297   PREFIX_EVEX_0F6D,
1298   PREFIX_EVEX_0F6E,
1299   PREFIX_EVEX_0F6F,
1300   PREFIX_EVEX_0F70,
1301   PREFIX_EVEX_0F72_REG_0,
1302   PREFIX_EVEX_0F72_REG_1,
1303   PREFIX_EVEX_0F72_REG_2,
1304   PREFIX_EVEX_0F72_REG_4,
1305   PREFIX_EVEX_0F72_REG_6,
1306   PREFIX_EVEX_0F73_REG_2,
1307   PREFIX_EVEX_0F73_REG_6,
1308   PREFIX_EVEX_0F76,
1309   PREFIX_EVEX_0F78,
1310   PREFIX_EVEX_0F79,
1311   PREFIX_EVEX_0F7A,
1312   PREFIX_EVEX_0F7B,
1313   PREFIX_EVEX_0F7E,
1314   PREFIX_EVEX_0F7F,
1315   PREFIX_EVEX_0FC2,
1316   PREFIX_EVEX_0FC6,
1317   PREFIX_EVEX_0FD2,
1318   PREFIX_EVEX_0FD3,
1319   PREFIX_EVEX_0FD4,
1320   PREFIX_EVEX_0FD6,
1321   PREFIX_EVEX_0FDB,
1322   PREFIX_EVEX_0FDF,
1323   PREFIX_EVEX_0FE2,
1324   PREFIX_EVEX_0FE6,
1325   PREFIX_EVEX_0FE7,
1326   PREFIX_EVEX_0FEB,
1327   PREFIX_EVEX_0FEF,
1328   PREFIX_EVEX_0FF2,
1329   PREFIX_EVEX_0FF3,
1330   PREFIX_EVEX_0FF4,
1331   PREFIX_EVEX_0FFA,
1332   PREFIX_EVEX_0FFB,
1333   PREFIX_EVEX_0FFE,
1334   PREFIX_EVEX_0F380C,
1335   PREFIX_EVEX_0F380D,
1336   PREFIX_EVEX_0F3811,
1337   PREFIX_EVEX_0F3812,
1338   PREFIX_EVEX_0F3813,
1339   PREFIX_EVEX_0F3814,
1340   PREFIX_EVEX_0F3815,
1341   PREFIX_EVEX_0F3816,
1342   PREFIX_EVEX_0F3818,
1343   PREFIX_EVEX_0F3819,
1344   PREFIX_EVEX_0F381A,
1345   PREFIX_EVEX_0F381B,
1346   PREFIX_EVEX_0F381E,
1347   PREFIX_EVEX_0F381F,
1348   PREFIX_EVEX_0F3821,
1349   PREFIX_EVEX_0F3822,
1350   PREFIX_EVEX_0F3823,
1351   PREFIX_EVEX_0F3824,
1352   PREFIX_EVEX_0F3825,
1353   PREFIX_EVEX_0F3827,
1354   PREFIX_EVEX_0F3828,
1355   PREFIX_EVEX_0F3829,
1356   PREFIX_EVEX_0F382A,
1357   PREFIX_EVEX_0F382C,
1358   PREFIX_EVEX_0F382D,
1359   PREFIX_EVEX_0F3831,
1360   PREFIX_EVEX_0F3832,
1361   PREFIX_EVEX_0F3833,
1362   PREFIX_EVEX_0F3834,
1363   PREFIX_EVEX_0F3835,
1364   PREFIX_EVEX_0F3836,
1365   PREFIX_EVEX_0F3837,
1366   PREFIX_EVEX_0F3839,
1367   PREFIX_EVEX_0F383A,
1368   PREFIX_EVEX_0F383B,
1369   PREFIX_EVEX_0F383D,
1370   PREFIX_EVEX_0F383F,
1371   PREFIX_EVEX_0F3840,
1372   PREFIX_EVEX_0F3842,
1373   PREFIX_EVEX_0F3843,
1374   PREFIX_EVEX_0F3844,
1375   PREFIX_EVEX_0F3845,
1376   PREFIX_EVEX_0F3846,
1377   PREFIX_EVEX_0F3847,
1378   PREFIX_EVEX_0F384C,
1379   PREFIX_EVEX_0F384D,
1380   PREFIX_EVEX_0F384E,
1381   PREFIX_EVEX_0F384F,
1382   PREFIX_EVEX_0F3858,
1383   PREFIX_EVEX_0F3859,
1384   PREFIX_EVEX_0F385A,
1385   PREFIX_EVEX_0F385B,
1386   PREFIX_EVEX_0F3864,
1387   PREFIX_EVEX_0F3865,
1388   PREFIX_EVEX_0F3876,
1389   PREFIX_EVEX_0F3877,
1390   PREFIX_EVEX_0F387C,
1391   PREFIX_EVEX_0F387E,
1392   PREFIX_EVEX_0F387F,
1393   PREFIX_EVEX_0F3888,
1394   PREFIX_EVEX_0F3889,
1395   PREFIX_EVEX_0F388A,
1396   PREFIX_EVEX_0F388B,
1397   PREFIX_EVEX_0F3890,
1398   PREFIX_EVEX_0F3891,
1399   PREFIX_EVEX_0F3892,
1400   PREFIX_EVEX_0F3893,
1401   PREFIX_EVEX_0F3896,
1402   PREFIX_EVEX_0F3897,
1403   PREFIX_EVEX_0F3898,
1404   PREFIX_EVEX_0F3899,
1405   PREFIX_EVEX_0F389A,
1406   PREFIX_EVEX_0F389B,
1407   PREFIX_EVEX_0F389C,
1408   PREFIX_EVEX_0F389D,
1409   PREFIX_EVEX_0F389E,
1410   PREFIX_EVEX_0F389F,
1411   PREFIX_EVEX_0F38A0,
1412   PREFIX_EVEX_0F38A1,
1413   PREFIX_EVEX_0F38A2,
1414   PREFIX_EVEX_0F38A3,
1415   PREFIX_EVEX_0F38A6,
1416   PREFIX_EVEX_0F38A7,
1417   PREFIX_EVEX_0F38A8,
1418   PREFIX_EVEX_0F38A9,
1419   PREFIX_EVEX_0F38AA,
1420   PREFIX_EVEX_0F38AB,
1421   PREFIX_EVEX_0F38AC,
1422   PREFIX_EVEX_0F38AD,
1423   PREFIX_EVEX_0F38AE,
1424   PREFIX_EVEX_0F38AF,
1425   PREFIX_EVEX_0F38B6,
1426   PREFIX_EVEX_0F38B7,
1427   PREFIX_EVEX_0F38B8,
1428   PREFIX_EVEX_0F38B9,
1429   PREFIX_EVEX_0F38BA,
1430   PREFIX_EVEX_0F38BB,
1431   PREFIX_EVEX_0F38BC,
1432   PREFIX_EVEX_0F38BD,
1433   PREFIX_EVEX_0F38BE,
1434   PREFIX_EVEX_0F38BF,
1435   PREFIX_EVEX_0F38C4,
1436   PREFIX_EVEX_0F38C6_REG_1,
1437   PREFIX_EVEX_0F38C6_REG_2,
1438   PREFIX_EVEX_0F38C6_REG_5,
1439   PREFIX_EVEX_0F38C6_REG_6,
1440   PREFIX_EVEX_0F38C7_REG_1,
1441   PREFIX_EVEX_0F38C7_REG_2,
1442   PREFIX_EVEX_0F38C7_REG_5,
1443   PREFIX_EVEX_0F38C7_REG_6,
1444   PREFIX_EVEX_0F38C8,
1445   PREFIX_EVEX_0F38CA,
1446   PREFIX_EVEX_0F38CB,
1447   PREFIX_EVEX_0F38CC,
1448   PREFIX_EVEX_0F38CD,
1449
1450   PREFIX_EVEX_0F3A00,
1451   PREFIX_EVEX_0F3A01,
1452   PREFIX_EVEX_0F3A03,
1453   PREFIX_EVEX_0F3A04,
1454   PREFIX_EVEX_0F3A05,
1455   PREFIX_EVEX_0F3A08,
1456   PREFIX_EVEX_0F3A09,
1457   PREFIX_EVEX_0F3A0A,
1458   PREFIX_EVEX_0F3A0B,
1459   PREFIX_EVEX_0F3A17,
1460   PREFIX_EVEX_0F3A18,
1461   PREFIX_EVEX_0F3A19,
1462   PREFIX_EVEX_0F3A1A,
1463   PREFIX_EVEX_0F3A1B,
1464   PREFIX_EVEX_0F3A1D,
1465   PREFIX_EVEX_0F3A1E,
1466   PREFIX_EVEX_0F3A1F,
1467   PREFIX_EVEX_0F3A21,
1468   PREFIX_EVEX_0F3A23,
1469   PREFIX_EVEX_0F3A25,
1470   PREFIX_EVEX_0F3A26,
1471   PREFIX_EVEX_0F3A27,
1472   PREFIX_EVEX_0F3A38,
1473   PREFIX_EVEX_0F3A39,
1474   PREFIX_EVEX_0F3A3A,
1475   PREFIX_EVEX_0F3A3B,
1476   PREFIX_EVEX_0F3A43,
1477   PREFIX_EVEX_0F3A54,
1478   PREFIX_EVEX_0F3A55,
1479 };
1480
1481 enum
1482 {
1483   X86_64_06 = 0,
1484   X86_64_07,
1485   X86_64_0D,
1486   X86_64_16,
1487   X86_64_17,
1488   X86_64_1E,
1489   X86_64_1F,
1490   X86_64_27,
1491   X86_64_2F,
1492   X86_64_37,
1493   X86_64_3F,
1494   X86_64_60,
1495   X86_64_61,
1496   X86_64_62,
1497   X86_64_63,
1498   X86_64_6D,
1499   X86_64_6F,
1500   X86_64_9A,
1501   X86_64_C4,
1502   X86_64_C5,
1503   X86_64_CE,
1504   X86_64_D4,
1505   X86_64_D5,
1506   X86_64_EA,
1507   X86_64_0F01_REG_0,
1508   X86_64_0F01_REG_1,
1509   X86_64_0F01_REG_2,
1510   X86_64_0F01_REG_3
1511 };
1512
1513 enum
1514 {
1515   THREE_BYTE_0F38 = 0,
1516   THREE_BYTE_0F3A,
1517   THREE_BYTE_0F7A
1518 };
1519
1520 enum
1521 {
1522   XOP_08 = 0,
1523   XOP_09,
1524   XOP_0A
1525 };
1526
1527 enum
1528 {
1529   VEX_0F = 0,
1530   VEX_0F38,
1531   VEX_0F3A
1532 };
1533
1534 enum
1535 {
1536   EVEX_0F = 0,
1537   EVEX_0F38,
1538   EVEX_0F3A
1539 };
1540
1541 enum
1542 {
1543   VEX_LEN_0F10_P_1 = 0,
1544   VEX_LEN_0F10_P_3,
1545   VEX_LEN_0F11_P_1,
1546   VEX_LEN_0F11_P_3,
1547   VEX_LEN_0F12_P_0_M_0,
1548   VEX_LEN_0F12_P_0_M_1,
1549   VEX_LEN_0F12_P_2,
1550   VEX_LEN_0F13_M_0,
1551   VEX_LEN_0F16_P_0_M_0,
1552   VEX_LEN_0F16_P_0_M_1,
1553   VEX_LEN_0F16_P_2,
1554   VEX_LEN_0F17_M_0,
1555   VEX_LEN_0F2A_P_1,
1556   VEX_LEN_0F2A_P_3,
1557   VEX_LEN_0F2C_P_1,
1558   VEX_LEN_0F2C_P_3,
1559   VEX_LEN_0F2D_P_1,
1560   VEX_LEN_0F2D_P_3,
1561   VEX_LEN_0F2E_P_0,
1562   VEX_LEN_0F2E_P_2,
1563   VEX_LEN_0F2F_P_0,
1564   VEX_LEN_0F2F_P_2,
1565   VEX_LEN_0F41_P_0,
1566   VEX_LEN_0F42_P_0,
1567   VEX_LEN_0F44_P_0,
1568   VEX_LEN_0F45_P_0,
1569   VEX_LEN_0F46_P_0,
1570   VEX_LEN_0F47_P_0,
1571   VEX_LEN_0F4B_P_2,
1572   VEX_LEN_0F51_P_1,
1573   VEX_LEN_0F51_P_3,
1574   VEX_LEN_0F52_P_1,
1575   VEX_LEN_0F53_P_1,
1576   VEX_LEN_0F58_P_1,
1577   VEX_LEN_0F58_P_3,
1578   VEX_LEN_0F59_P_1,
1579   VEX_LEN_0F59_P_3,
1580   VEX_LEN_0F5A_P_1,
1581   VEX_LEN_0F5A_P_3,
1582   VEX_LEN_0F5C_P_1,
1583   VEX_LEN_0F5C_P_3,
1584   VEX_LEN_0F5D_P_1,
1585   VEX_LEN_0F5D_P_3,
1586   VEX_LEN_0F5E_P_1,
1587   VEX_LEN_0F5E_P_3,
1588   VEX_LEN_0F5F_P_1,
1589   VEX_LEN_0F5F_P_3,
1590   VEX_LEN_0F6E_P_2,
1591   VEX_LEN_0F7E_P_1,
1592   VEX_LEN_0F7E_P_2,
1593   VEX_LEN_0F90_P_0,
1594   VEX_LEN_0F91_P_0,
1595   VEX_LEN_0F92_P_0,
1596   VEX_LEN_0F93_P_0,
1597   VEX_LEN_0F98_P_0,
1598   VEX_LEN_0FAE_R_2_M_0,
1599   VEX_LEN_0FAE_R_3_M_0,
1600   VEX_LEN_0FC2_P_1,
1601   VEX_LEN_0FC2_P_3,
1602   VEX_LEN_0FC4_P_2,
1603   VEX_LEN_0FC5_P_2,
1604   VEX_LEN_0FD6_P_2,
1605   VEX_LEN_0FF7_P_2,
1606   VEX_LEN_0F3816_P_2,
1607   VEX_LEN_0F3819_P_2,
1608   VEX_LEN_0F381A_P_2_M_0,
1609   VEX_LEN_0F3836_P_2,
1610   VEX_LEN_0F3841_P_2,
1611   VEX_LEN_0F385A_P_2_M_0,
1612   VEX_LEN_0F38DB_P_2,
1613   VEX_LEN_0F38DC_P_2,
1614   VEX_LEN_0F38DD_P_2,
1615   VEX_LEN_0F38DE_P_2,
1616   VEX_LEN_0F38DF_P_2,
1617   VEX_LEN_0F38F2_P_0,
1618   VEX_LEN_0F38F3_R_1_P_0,
1619   VEX_LEN_0F38F3_R_2_P_0,
1620   VEX_LEN_0F38F3_R_3_P_0,
1621   VEX_LEN_0F38F5_P_0,
1622   VEX_LEN_0F38F5_P_1,
1623   VEX_LEN_0F38F5_P_3,
1624   VEX_LEN_0F38F6_P_3,
1625   VEX_LEN_0F38F7_P_0,
1626   VEX_LEN_0F38F7_P_1,
1627   VEX_LEN_0F38F7_P_2,
1628   VEX_LEN_0F38F7_P_3,
1629   VEX_LEN_0F3A00_P_2,
1630   VEX_LEN_0F3A01_P_2,
1631   VEX_LEN_0F3A06_P_2,
1632   VEX_LEN_0F3A0A_P_2,
1633   VEX_LEN_0F3A0B_P_2,
1634   VEX_LEN_0F3A14_P_2,
1635   VEX_LEN_0F3A15_P_2,
1636   VEX_LEN_0F3A16_P_2,
1637   VEX_LEN_0F3A17_P_2,
1638   VEX_LEN_0F3A18_P_2,
1639   VEX_LEN_0F3A19_P_2,
1640   VEX_LEN_0F3A20_P_2,
1641   VEX_LEN_0F3A21_P_2,
1642   VEX_LEN_0F3A22_P_2,
1643   VEX_LEN_0F3A30_P_2,
1644   VEX_LEN_0F3A32_P_2,
1645   VEX_LEN_0F3A38_P_2,
1646   VEX_LEN_0F3A39_P_2,
1647   VEX_LEN_0F3A41_P_2,
1648   VEX_LEN_0F3A44_P_2,
1649   VEX_LEN_0F3A46_P_2,
1650   VEX_LEN_0F3A60_P_2,
1651   VEX_LEN_0F3A61_P_2,
1652   VEX_LEN_0F3A62_P_2,
1653   VEX_LEN_0F3A63_P_2,
1654   VEX_LEN_0F3A6A_P_2,
1655   VEX_LEN_0F3A6B_P_2,
1656   VEX_LEN_0F3A6E_P_2,
1657   VEX_LEN_0F3A6F_P_2,
1658   VEX_LEN_0F3A7A_P_2,
1659   VEX_LEN_0F3A7B_P_2,
1660   VEX_LEN_0F3A7E_P_2,
1661   VEX_LEN_0F3A7F_P_2,
1662   VEX_LEN_0F3ADF_P_2,
1663   VEX_LEN_0F3AF0_P_3,
1664   VEX_LEN_0FXOP_08_CC,
1665   VEX_LEN_0FXOP_08_CD,
1666   VEX_LEN_0FXOP_08_CE,
1667   VEX_LEN_0FXOP_08_CF,
1668   VEX_LEN_0FXOP_08_EC,
1669   VEX_LEN_0FXOP_08_ED,
1670   VEX_LEN_0FXOP_08_EE,
1671   VEX_LEN_0FXOP_08_EF,
1672   VEX_LEN_0FXOP_09_80,
1673   VEX_LEN_0FXOP_09_81
1674 };
1675
1676 enum
1677 {
1678   VEX_W_0F10_P_0 = 0,
1679   VEX_W_0F10_P_1,
1680   VEX_W_0F10_P_2,
1681   VEX_W_0F10_P_3,
1682   VEX_W_0F11_P_0,
1683   VEX_W_0F11_P_1,
1684   VEX_W_0F11_P_2,
1685   VEX_W_0F11_P_3,
1686   VEX_W_0F12_P_0_M_0,
1687   VEX_W_0F12_P_0_M_1,
1688   VEX_W_0F12_P_1,
1689   VEX_W_0F12_P_2,
1690   VEX_W_0F12_P_3,
1691   VEX_W_0F13_M_0,
1692   VEX_W_0F14,
1693   VEX_W_0F15,
1694   VEX_W_0F16_P_0_M_0,
1695   VEX_W_0F16_P_0_M_1,
1696   VEX_W_0F16_P_1,
1697   VEX_W_0F16_P_2,
1698   VEX_W_0F17_M_0,
1699   VEX_W_0F28,
1700   VEX_W_0F29,
1701   VEX_W_0F2B_M_0,
1702   VEX_W_0F2E_P_0,
1703   VEX_W_0F2E_P_2,
1704   VEX_W_0F2F_P_0,
1705   VEX_W_0F2F_P_2,
1706   VEX_W_0F41_P_0_LEN_1,
1707   VEX_W_0F42_P_0_LEN_1,
1708   VEX_W_0F44_P_0_LEN_0,
1709   VEX_W_0F45_P_0_LEN_1,
1710   VEX_W_0F46_P_0_LEN_1,
1711   VEX_W_0F47_P_0_LEN_1,
1712   VEX_W_0F4B_P_2_LEN_1,
1713   VEX_W_0F50_M_0,
1714   VEX_W_0F51_P_0,
1715   VEX_W_0F51_P_1,
1716   VEX_W_0F51_P_2,
1717   VEX_W_0F51_P_3,
1718   VEX_W_0F52_P_0,
1719   VEX_W_0F52_P_1,
1720   VEX_W_0F53_P_0,
1721   VEX_W_0F53_P_1,
1722   VEX_W_0F58_P_0,
1723   VEX_W_0F58_P_1,
1724   VEX_W_0F58_P_2,
1725   VEX_W_0F58_P_3,
1726   VEX_W_0F59_P_0,
1727   VEX_W_0F59_P_1,
1728   VEX_W_0F59_P_2,
1729   VEX_W_0F59_P_3,
1730   VEX_W_0F5A_P_0,
1731   VEX_W_0F5A_P_1,
1732   VEX_W_0F5A_P_3,
1733   VEX_W_0F5B_P_0,
1734   VEX_W_0F5B_P_1,
1735   VEX_W_0F5B_P_2,
1736   VEX_W_0F5C_P_0,
1737   VEX_W_0F5C_P_1,
1738   VEX_W_0F5C_P_2,
1739   VEX_W_0F5C_P_3,
1740   VEX_W_0F5D_P_0,
1741   VEX_W_0F5D_P_1,
1742   VEX_W_0F5D_P_2,
1743   VEX_W_0F5D_P_3,
1744   VEX_W_0F5E_P_0,
1745   VEX_W_0F5E_P_1,
1746   VEX_W_0F5E_P_2,
1747   VEX_W_0F5E_P_3,
1748   VEX_W_0F5F_P_0,
1749   VEX_W_0F5F_P_1,
1750   VEX_W_0F5F_P_2,
1751   VEX_W_0F5F_P_3,
1752   VEX_W_0F60_P_2,
1753   VEX_W_0F61_P_2,
1754   VEX_W_0F62_P_2,
1755   VEX_W_0F63_P_2,
1756   VEX_W_0F64_P_2,
1757   VEX_W_0F65_P_2,
1758   VEX_W_0F66_P_2,
1759   VEX_W_0F67_P_2,
1760   VEX_W_0F68_P_2,
1761   VEX_W_0F69_P_2,
1762   VEX_W_0F6A_P_2,
1763   VEX_W_0F6B_P_2,
1764   VEX_W_0F6C_P_2,
1765   VEX_W_0F6D_P_2,
1766   VEX_W_0F6F_P_1,
1767   VEX_W_0F6F_P_2,
1768   VEX_W_0F70_P_1,
1769   VEX_W_0F70_P_2,
1770   VEX_W_0F70_P_3,
1771   VEX_W_0F71_R_2_P_2,
1772   VEX_W_0F71_R_4_P_2,
1773   VEX_W_0F71_R_6_P_2,
1774   VEX_W_0F72_R_2_P_2,
1775   VEX_W_0F72_R_4_P_2,
1776   VEX_W_0F72_R_6_P_2,
1777   VEX_W_0F73_R_2_P_2,
1778   VEX_W_0F73_R_3_P_2,
1779   VEX_W_0F73_R_6_P_2,
1780   VEX_W_0F73_R_7_P_2,
1781   VEX_W_0F74_P_2,
1782   VEX_W_0F75_P_2,
1783   VEX_W_0F76_P_2,
1784   VEX_W_0F77_P_0,
1785   VEX_W_0F7C_P_2,
1786   VEX_W_0F7C_P_3,
1787   VEX_W_0F7D_P_2,
1788   VEX_W_0F7D_P_3,
1789   VEX_W_0F7E_P_1,
1790   VEX_W_0F7F_P_1,
1791   VEX_W_0F7F_P_2,
1792   VEX_W_0F90_P_0_LEN_0,
1793   VEX_W_0F91_P_0_LEN_0,
1794   VEX_W_0F92_P_0_LEN_0,
1795   VEX_W_0F93_P_0_LEN_0,
1796   VEX_W_0F98_P_0_LEN_0,
1797   VEX_W_0FAE_R_2_M_0,
1798   VEX_W_0FAE_R_3_M_0,
1799   VEX_W_0FC2_P_0,
1800   VEX_W_0FC2_P_1,
1801   VEX_W_0FC2_P_2,
1802   VEX_W_0FC2_P_3,
1803   VEX_W_0FC4_P_2,
1804   VEX_W_0FC5_P_2,
1805   VEX_W_0FD0_P_2,
1806   VEX_W_0FD0_P_3,
1807   VEX_W_0FD1_P_2,
1808   VEX_W_0FD2_P_2,
1809   VEX_W_0FD3_P_2,
1810   VEX_W_0FD4_P_2,
1811   VEX_W_0FD5_P_2,
1812   VEX_W_0FD6_P_2,
1813   VEX_W_0FD7_P_2_M_1,
1814   VEX_W_0FD8_P_2,
1815   VEX_W_0FD9_P_2,
1816   VEX_W_0FDA_P_2,
1817   VEX_W_0FDB_P_2,
1818   VEX_W_0FDC_P_2,
1819   VEX_W_0FDD_P_2,
1820   VEX_W_0FDE_P_2,
1821   VEX_W_0FDF_P_2,
1822   VEX_W_0FE0_P_2,
1823   VEX_W_0FE1_P_2,
1824   VEX_W_0FE2_P_2,
1825   VEX_W_0FE3_P_2,
1826   VEX_W_0FE4_P_2,
1827   VEX_W_0FE5_P_2,
1828   VEX_W_0FE6_P_1,
1829   VEX_W_0FE6_P_2,
1830   VEX_W_0FE6_P_3,
1831   VEX_W_0FE7_P_2_M_0,
1832   VEX_W_0FE8_P_2,
1833   VEX_W_0FE9_P_2,
1834   VEX_W_0FEA_P_2,
1835   VEX_W_0FEB_P_2,
1836   VEX_W_0FEC_P_2,
1837   VEX_W_0FED_P_2,
1838   VEX_W_0FEE_P_2,
1839   VEX_W_0FEF_P_2,
1840   VEX_W_0FF0_P_3_M_0,
1841   VEX_W_0FF1_P_2,
1842   VEX_W_0FF2_P_2,
1843   VEX_W_0FF3_P_2,
1844   VEX_W_0FF4_P_2,
1845   VEX_W_0FF5_P_2,
1846   VEX_W_0FF6_P_2,
1847   VEX_W_0FF7_P_2,
1848   VEX_W_0FF8_P_2,
1849   VEX_W_0FF9_P_2,
1850   VEX_W_0FFA_P_2,
1851   VEX_W_0FFB_P_2,
1852   VEX_W_0FFC_P_2,
1853   VEX_W_0FFD_P_2,
1854   VEX_W_0FFE_P_2,
1855   VEX_W_0F3800_P_2,
1856   VEX_W_0F3801_P_2,
1857   VEX_W_0F3802_P_2,
1858   VEX_W_0F3803_P_2,
1859   VEX_W_0F3804_P_2,
1860   VEX_W_0F3805_P_2,
1861   VEX_W_0F3806_P_2,
1862   VEX_W_0F3807_P_2,
1863   VEX_W_0F3808_P_2,
1864   VEX_W_0F3809_P_2,
1865   VEX_W_0F380A_P_2,
1866   VEX_W_0F380B_P_2,
1867   VEX_W_0F380C_P_2,
1868   VEX_W_0F380D_P_2,
1869   VEX_W_0F380E_P_2,
1870   VEX_W_0F380F_P_2,
1871   VEX_W_0F3816_P_2,
1872   VEX_W_0F3817_P_2,
1873   VEX_W_0F3818_P_2,
1874   VEX_W_0F3819_P_2,
1875   VEX_W_0F381A_P_2_M_0,
1876   VEX_W_0F381C_P_2,
1877   VEX_W_0F381D_P_2,
1878   VEX_W_0F381E_P_2,
1879   VEX_W_0F3820_P_2,
1880   VEX_W_0F3821_P_2,
1881   VEX_W_0F3822_P_2,
1882   VEX_W_0F3823_P_2,
1883   VEX_W_0F3824_P_2,
1884   VEX_W_0F3825_P_2,
1885   VEX_W_0F3828_P_2,
1886   VEX_W_0F3829_P_2,
1887   VEX_W_0F382A_P_2_M_0,
1888   VEX_W_0F382B_P_2,
1889   VEX_W_0F382C_P_2_M_0,
1890   VEX_W_0F382D_P_2_M_0,
1891   VEX_W_0F382E_P_2_M_0,
1892   VEX_W_0F382F_P_2_M_0,
1893   VEX_W_0F3830_P_2,
1894   VEX_W_0F3831_P_2,
1895   VEX_W_0F3832_P_2,
1896   VEX_W_0F3833_P_2,
1897   VEX_W_0F3834_P_2,
1898   VEX_W_0F3835_P_2,
1899   VEX_W_0F3836_P_2,
1900   VEX_W_0F3837_P_2,
1901   VEX_W_0F3838_P_2,
1902   VEX_W_0F3839_P_2,
1903   VEX_W_0F383A_P_2,
1904   VEX_W_0F383B_P_2,
1905   VEX_W_0F383C_P_2,
1906   VEX_W_0F383D_P_2,
1907   VEX_W_0F383E_P_2,
1908   VEX_W_0F383F_P_2,
1909   VEX_W_0F3840_P_2,
1910   VEX_W_0F3841_P_2,
1911   VEX_W_0F3846_P_2,
1912   VEX_W_0F3858_P_2,
1913   VEX_W_0F3859_P_2,
1914   VEX_W_0F385A_P_2_M_0,
1915   VEX_W_0F3878_P_2,
1916   VEX_W_0F3879_P_2,
1917   VEX_W_0F38DB_P_2,
1918   VEX_W_0F38DC_P_2,
1919   VEX_W_0F38DD_P_2,
1920   VEX_W_0F38DE_P_2,
1921   VEX_W_0F38DF_P_2,
1922   VEX_W_0F3A00_P_2,
1923   VEX_W_0F3A01_P_2,
1924   VEX_W_0F3A02_P_2,
1925   VEX_W_0F3A04_P_2,
1926   VEX_W_0F3A05_P_2,
1927   VEX_W_0F3A06_P_2,
1928   VEX_W_0F3A08_P_2,
1929   VEX_W_0F3A09_P_2,
1930   VEX_W_0F3A0A_P_2,
1931   VEX_W_0F3A0B_P_2,
1932   VEX_W_0F3A0C_P_2,
1933   VEX_W_0F3A0D_P_2,
1934   VEX_W_0F3A0E_P_2,
1935   VEX_W_0F3A0F_P_2,
1936   VEX_W_0F3A14_P_2,
1937   VEX_W_0F3A15_P_2,
1938   VEX_W_0F3A18_P_2,
1939   VEX_W_0F3A19_P_2,
1940   VEX_W_0F3A20_P_2,
1941   VEX_W_0F3A21_P_2,
1942   VEX_W_0F3A30_P_2_LEN_0,
1943   VEX_W_0F3A32_P_2_LEN_0,
1944   VEX_W_0F3A38_P_2,
1945   VEX_W_0F3A39_P_2,
1946   VEX_W_0F3A40_P_2,
1947   VEX_W_0F3A41_P_2,
1948   VEX_W_0F3A42_P_2,
1949   VEX_W_0F3A44_P_2,
1950   VEX_W_0F3A46_P_2,
1951   VEX_W_0F3A48_P_2,
1952   VEX_W_0F3A49_P_2,
1953   VEX_W_0F3A4A_P_2,
1954   VEX_W_0F3A4B_P_2,
1955   VEX_W_0F3A4C_P_2,
1956   VEX_W_0F3A60_P_2,
1957   VEX_W_0F3A61_P_2,
1958   VEX_W_0F3A62_P_2,
1959   VEX_W_0F3A63_P_2,
1960   VEX_W_0F3ADF_P_2,
1961
1962   EVEX_W_0F10_P_0,
1963   EVEX_W_0F10_P_1_M_0,
1964   EVEX_W_0F10_P_1_M_1,
1965   EVEX_W_0F10_P_2,
1966   EVEX_W_0F10_P_3_M_0,
1967   EVEX_W_0F10_P_3_M_1,
1968   EVEX_W_0F11_P_0,
1969   EVEX_W_0F11_P_1_M_0,
1970   EVEX_W_0F11_P_1_M_1,
1971   EVEX_W_0F11_P_2,
1972   EVEX_W_0F11_P_3_M_0,
1973   EVEX_W_0F11_P_3_M_1,
1974   EVEX_W_0F12_P_0_M_0,
1975   EVEX_W_0F12_P_0_M_1,
1976   EVEX_W_0F12_P_1,
1977   EVEX_W_0F12_P_2,
1978   EVEX_W_0F12_P_3,
1979   EVEX_W_0F13_P_0,
1980   EVEX_W_0F13_P_2,
1981   EVEX_W_0F14_P_0,
1982   EVEX_W_0F14_P_2,
1983   EVEX_W_0F15_P_0,
1984   EVEX_W_0F15_P_2,
1985   EVEX_W_0F16_P_0_M_0,
1986   EVEX_W_0F16_P_0_M_1,
1987   EVEX_W_0F16_P_1,
1988   EVEX_W_0F16_P_2,
1989   EVEX_W_0F17_P_0,
1990   EVEX_W_0F17_P_2,
1991   EVEX_W_0F28_P_0,
1992   EVEX_W_0F28_P_2,
1993   EVEX_W_0F29_P_0,
1994   EVEX_W_0F29_P_2,
1995   EVEX_W_0F2A_P_1,
1996   EVEX_W_0F2A_P_3,
1997   EVEX_W_0F2B_P_0,
1998   EVEX_W_0F2B_P_2,
1999   EVEX_W_0F2E_P_0,
2000   EVEX_W_0F2E_P_2,
2001   EVEX_W_0F2F_P_0,
2002   EVEX_W_0F2F_P_2,
2003   EVEX_W_0F51_P_0,
2004   EVEX_W_0F51_P_1,
2005   EVEX_W_0F51_P_2,
2006   EVEX_W_0F51_P_3,
2007   EVEX_W_0F58_P_0,
2008   EVEX_W_0F58_P_1,
2009   EVEX_W_0F58_P_2,
2010   EVEX_W_0F58_P_3,
2011   EVEX_W_0F59_P_0,
2012   EVEX_W_0F59_P_1,
2013   EVEX_W_0F59_P_2,
2014   EVEX_W_0F59_P_3,
2015   EVEX_W_0F5A_P_0,
2016   EVEX_W_0F5A_P_1,
2017   EVEX_W_0F5A_P_2,
2018   EVEX_W_0F5A_P_3,
2019   EVEX_W_0F5B_P_0,
2020   EVEX_W_0F5B_P_1,
2021   EVEX_W_0F5B_P_2,
2022   EVEX_W_0F5C_P_0,
2023   EVEX_W_0F5C_P_1,
2024   EVEX_W_0F5C_P_2,
2025   EVEX_W_0F5C_P_3,
2026   EVEX_W_0F5D_P_0,
2027   EVEX_W_0F5D_P_1,
2028   EVEX_W_0F5D_P_2,
2029   EVEX_W_0F5D_P_3,
2030   EVEX_W_0F5E_P_0,
2031   EVEX_W_0F5E_P_1,
2032   EVEX_W_0F5E_P_2,
2033   EVEX_W_0F5E_P_3,
2034   EVEX_W_0F5F_P_0,
2035   EVEX_W_0F5F_P_1,
2036   EVEX_W_0F5F_P_2,
2037   EVEX_W_0F5F_P_3,
2038   EVEX_W_0F62_P_2,
2039   EVEX_W_0F66_P_2,
2040   EVEX_W_0F6A_P_2,
2041   EVEX_W_0F6C_P_2,
2042   EVEX_W_0F6D_P_2,
2043   EVEX_W_0F6E_P_2,
2044   EVEX_W_0F6F_P_1,
2045   EVEX_W_0F6F_P_2,
2046   EVEX_W_0F70_P_2,
2047   EVEX_W_0F72_R_2_P_2,
2048   EVEX_W_0F72_R_6_P_2,
2049   EVEX_W_0F73_R_2_P_2,
2050   EVEX_W_0F73_R_6_P_2,
2051   EVEX_W_0F76_P_2,
2052   EVEX_W_0F78_P_0,
2053   EVEX_W_0F79_P_0,
2054   EVEX_W_0F7A_P_1,
2055   EVEX_W_0F7A_P_3,
2056   EVEX_W_0F7B_P_1,
2057   EVEX_W_0F7B_P_3,
2058   EVEX_W_0F7E_P_1,
2059   EVEX_W_0F7E_P_2,
2060   EVEX_W_0F7F_P_1,
2061   EVEX_W_0F7F_P_2,
2062   EVEX_W_0FC2_P_0,
2063   EVEX_W_0FC2_P_1,
2064   EVEX_W_0FC2_P_2,
2065   EVEX_W_0FC2_P_3,
2066   EVEX_W_0FC6_P_0,
2067   EVEX_W_0FC6_P_2,
2068   EVEX_W_0FD2_P_2,
2069   EVEX_W_0FD3_P_2,
2070   EVEX_W_0FD4_P_2,
2071   EVEX_W_0FD6_P_2,
2072   EVEX_W_0FE6_P_1,
2073   EVEX_W_0FE6_P_2,
2074   EVEX_W_0FE6_P_3,
2075   EVEX_W_0FE7_P_2,
2076   EVEX_W_0FF2_P_2,
2077   EVEX_W_0FF3_P_2,
2078   EVEX_W_0FF4_P_2,
2079   EVEX_W_0FFA_P_2,
2080   EVEX_W_0FFB_P_2,
2081   EVEX_W_0FFE_P_2,
2082   EVEX_W_0F380C_P_2,
2083   EVEX_W_0F380D_P_2,
2084   EVEX_W_0F3811_P_1,
2085   EVEX_W_0F3812_P_1,
2086   EVEX_W_0F3813_P_1,
2087   EVEX_W_0F3813_P_2,
2088   EVEX_W_0F3814_P_1,
2089   EVEX_W_0F3815_P_1,
2090   EVEX_W_0F3818_P_2,
2091   EVEX_W_0F3819_P_2,
2092   EVEX_W_0F381A_P_2,
2093   EVEX_W_0F381B_P_2,
2094   EVEX_W_0F381E_P_2,
2095   EVEX_W_0F381F_P_2,
2096   EVEX_W_0F3821_P_1,
2097   EVEX_W_0F3822_P_1,
2098   EVEX_W_0F3823_P_1,
2099   EVEX_W_0F3824_P_1,
2100   EVEX_W_0F3825_P_1,
2101   EVEX_W_0F3825_P_2,
2102   EVEX_W_0F3828_P_2,
2103   EVEX_W_0F3829_P_2,
2104   EVEX_W_0F382A_P_1,
2105   EVEX_W_0F382A_P_2,
2106   EVEX_W_0F3831_P_1,
2107   EVEX_W_0F3832_P_1,
2108   EVEX_W_0F3833_P_1,
2109   EVEX_W_0F3834_P_1,
2110   EVEX_W_0F3835_P_1,
2111   EVEX_W_0F3835_P_2,
2112   EVEX_W_0F3837_P_2,
2113   EVEX_W_0F383A_P_1,
2114   EVEX_W_0F3840_P_2,
2115   EVEX_W_0F3858_P_2,
2116   EVEX_W_0F3859_P_2,
2117   EVEX_W_0F385A_P_2,
2118   EVEX_W_0F385B_P_2,
2119   EVEX_W_0F3891_P_2,
2120   EVEX_W_0F3893_P_2,
2121   EVEX_W_0F38A1_P_2,
2122   EVEX_W_0F38A3_P_2,
2123   EVEX_W_0F38C7_R_1_P_2,
2124   EVEX_W_0F38C7_R_2_P_2,
2125   EVEX_W_0F38C7_R_5_P_2,
2126   EVEX_W_0F38C7_R_6_P_2,
2127
2128   EVEX_W_0F3A00_P_2,
2129   EVEX_W_0F3A01_P_2,
2130   EVEX_W_0F3A04_P_2,
2131   EVEX_W_0F3A05_P_2,
2132   EVEX_W_0F3A08_P_2,
2133   EVEX_W_0F3A09_P_2,
2134   EVEX_W_0F3A0A_P_2,
2135   EVEX_W_0F3A0B_P_2,
2136   EVEX_W_0F3A18_P_2,
2137   EVEX_W_0F3A19_P_2,
2138   EVEX_W_0F3A1A_P_2,
2139   EVEX_W_0F3A1B_P_2,
2140   EVEX_W_0F3A1D_P_2,
2141   EVEX_W_0F3A21_P_2,
2142   EVEX_W_0F3A23_P_2,
2143   EVEX_W_0F3A38_P_2,
2144   EVEX_W_0F3A39_P_2,
2145   EVEX_W_0F3A3A_P_2,
2146   EVEX_W_0F3A3B_P_2,
2147   EVEX_W_0F3A43_P_2,
2148 };
2149
2150 typedef void (*op_rtn) (int bytemode, int sizeflag);
2151
2152 struct dis386 {
2153   const char *name;
2154   struct
2155     {
2156       op_rtn rtn;
2157       int bytemode;
2158     } op[MAX_OPERANDS];
2159 };
2160
2161 /* Upper case letters in the instruction names here are macros.
2162    'A' => print 'b' if no register operands or suffix_always is true
2163    'B' => print 'b' if suffix_always is true
2164    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2165           size prefix
2166    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2167           suffix_always is true
2168    'E' => print 'e' if 32-bit form of jcxz
2169    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2170    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2171    'H' => print ",pt" or ",pn" branch hint
2172    'I' => honor following macro letter even in Intel mode (implemented only
2173           for some of the macro letters)
2174    'J' => print 'l'
2175    'K' => print 'd' or 'q' if rex prefix is present.
2176    'L' => print 'l' if suffix_always is true
2177    'M' => print 'r' if intel_mnemonic is false.
2178    'N' => print 'n' if instruction has no wait "prefix"
2179    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2180    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2181           or suffix_always is true.  print 'q' if rex prefix is present.
2182    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2183           is true
2184    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2185    'S' => print 'w', 'l' or 'q' if suffix_always is true
2186    'T' => print 'q' in 64bit mode and behave as 'P' otherwise
2187    'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
2188    'V' => print 'q' in 64bit mode and behave as 'S' otherwise
2189    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2190    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2191    'Y' => 'q' if instruction has an REX 64bit overwrite prefix and
2192           suffix_always is true.
2193    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2194    '!' => change condition from true to false or from false to true.
2195    '%' => add 1 upper case letter to the macro.
2196
2197    2 upper case letter macros:
2198    "XY" => print 'x' or 'y' if no register operands or suffix_always
2199            is true.
2200    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2201    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2202            or suffix_always is true
2203    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2204    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2205    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2206    "LW" => print 'd', 'q' depending on the VEX.W bit
2207
2208    Many of the above letters print nothing in Intel mode.  See "putop"
2209    for the details.
2210
2211    Braces '{' and '}', and vertical bars '|', indicate alternative
2212    mnemonic strings for AT&T and Intel.  */
2213
2214 static const struct dis386 dis386[] = {
2215   /* 00 */
2216   { "addB",             { Ebh1, Gb } },
2217   { "addS",             { Evh1, Gv } },
2218   { "addB",             { Gb, EbS } },
2219   { "addS",             { Gv, EvS } },
2220   { "addB",             { AL, Ib } },
2221   { "addS",             { eAX, Iv } },
2222   { X86_64_TABLE (X86_64_06) },
2223   { X86_64_TABLE (X86_64_07) },
2224   /* 08 */
2225   { "orB",              { Ebh1, Gb } },
2226   { "orS",              { Evh1, Gv } },
2227   { "orB",              { Gb, EbS } },
2228   { "orS",              { Gv, EvS } },
2229   { "orB",              { AL, Ib } },
2230   { "orS",              { eAX, Iv } },
2231   { X86_64_TABLE (X86_64_0D) },
2232   { Bad_Opcode },       /* 0x0f extended opcode escape */
2233   /* 10 */
2234   { "adcB",             { Ebh1, Gb } },
2235   { "adcS",             { Evh1, Gv } },
2236   { "adcB",             { Gb, EbS } },
2237   { "adcS",             { Gv, EvS } },
2238   { "adcB",             { AL, Ib } },
2239   { "adcS",             { eAX, Iv } },
2240   { X86_64_TABLE (X86_64_16) },
2241   { X86_64_TABLE (X86_64_17) },
2242   /* 18 */
2243   { "sbbB",             { Ebh1, Gb } },
2244   { "sbbS",             { Evh1, Gv } },
2245   { "sbbB",             { Gb, EbS } },
2246   { "sbbS",             { Gv, EvS } },
2247   { "sbbB",             { AL, Ib } },
2248   { "sbbS",             { eAX, Iv } },
2249   { X86_64_TABLE (X86_64_1E) },
2250   { X86_64_TABLE (X86_64_1F) },
2251   /* 20 */
2252   { "andB",             { Ebh1, Gb } },
2253   { "andS",             { Evh1, Gv } },
2254   { "andB",             { Gb, EbS } },
2255   { "andS",             { Gv, EvS } },
2256   { "andB",             { AL, Ib } },
2257   { "andS",             { eAX, Iv } },
2258   { Bad_Opcode },       /* SEG ES prefix */
2259   { X86_64_TABLE (X86_64_27) },
2260   /* 28 */
2261   { "subB",             { Ebh1, Gb } },
2262   { "subS",             { Evh1, Gv } },
2263   { "subB",             { Gb, EbS } },
2264   { "subS",             { Gv, EvS } },
2265   { "subB",             { AL, Ib } },
2266   { "subS",             { eAX, Iv } },
2267   { Bad_Opcode },       /* SEG CS prefix */
2268   { X86_64_TABLE (X86_64_2F) },
2269   /* 30 */
2270   { "xorB",             { Ebh1, Gb } },
2271   { "xorS",             { Evh1, Gv } },
2272   { "xorB",             { Gb, EbS } },
2273   { "xorS",             { Gv, EvS } },
2274   { "xorB",             { AL, Ib } },
2275   { "xorS",             { eAX, Iv } },
2276   { Bad_Opcode },       /* SEG SS prefix */
2277   { X86_64_TABLE (X86_64_37) },
2278   /* 38 */
2279   { "cmpB",             { Eb, Gb } },
2280   { "cmpS",             { Ev, Gv } },
2281   { "cmpB",             { Gb, EbS } },
2282   { "cmpS",             { Gv, EvS } },
2283   { "cmpB",             { AL, Ib } },
2284   { "cmpS",             { eAX, Iv } },
2285   { Bad_Opcode },       /* SEG DS prefix */
2286   { X86_64_TABLE (X86_64_3F) },
2287   /* 40 */
2288   { "inc{S|}",          { RMeAX } },
2289   { "inc{S|}",          { RMeCX } },
2290   { "inc{S|}",          { RMeDX } },
2291   { "inc{S|}",          { RMeBX } },
2292   { "inc{S|}",          { RMeSP } },
2293   { "inc{S|}",          { RMeBP } },
2294   { "inc{S|}",          { RMeSI } },
2295   { "inc{S|}",          { RMeDI } },
2296   /* 48 */
2297   { "dec{S|}",          { RMeAX } },
2298   { "dec{S|}",          { RMeCX } },
2299   { "dec{S|}",          { RMeDX } },
2300   { "dec{S|}",          { RMeBX } },
2301   { "dec{S|}",          { RMeSP } },
2302   { "dec{S|}",          { RMeBP } },
2303   { "dec{S|}",          { RMeSI } },
2304   { "dec{S|}",          { RMeDI } },
2305   /* 50 */
2306   { "pushV",            { RMrAX } },
2307   { "pushV",            { RMrCX } },
2308   { "pushV",            { RMrDX } },
2309   { "pushV",            { RMrBX } },
2310   { "pushV",            { RMrSP } },
2311   { "pushV",            { RMrBP } },
2312   { "pushV",            { RMrSI } },
2313   { "pushV",            { RMrDI } },
2314   /* 58 */
2315   { "popV",             { RMrAX } },
2316   { "popV",             { RMrCX } },
2317   { "popV",             { RMrDX } },
2318   { "popV",             { RMrBX } },
2319   { "popV",             { RMrSP } },
2320   { "popV",             { RMrBP } },
2321   { "popV",             { RMrSI } },
2322   { "popV",             { RMrDI } },
2323   /* 60 */
2324   { X86_64_TABLE (X86_64_60) },
2325   { X86_64_TABLE (X86_64_61) },
2326   { X86_64_TABLE (X86_64_62) },
2327   { X86_64_TABLE (X86_64_63) },
2328   { Bad_Opcode },       /* seg fs */
2329   { Bad_Opcode },       /* seg gs */
2330   { Bad_Opcode },       /* op size prefix */
2331   { Bad_Opcode },       /* adr size prefix */
2332   /* 68 */
2333   { "pushT",            { sIv } },
2334   { "imulS",            { Gv, Ev, Iv } },
2335   { "pushT",            { sIbT } },
2336   { "imulS",            { Gv, Ev, sIb } },
2337   { "ins{b|}",          { Ybr, indirDX } },
2338   { X86_64_TABLE (X86_64_6D) },
2339   { "outs{b|}",         { indirDXr, Xb } },
2340   { X86_64_TABLE (X86_64_6F) },
2341   /* 70 */
2342   { "joH",              { Jb, BND, cond_jump_flag } },
2343   { "jnoH",             { Jb, BND, cond_jump_flag } },
2344   { "jbH",              { Jb, BND, cond_jump_flag } },
2345   { "jaeH",             { Jb, BND, cond_jump_flag } },
2346   { "jeH",              { Jb, BND, cond_jump_flag } },
2347   { "jneH",             { Jb, BND, cond_jump_flag } },
2348   { "jbeH",             { Jb, BND, cond_jump_flag } },
2349   { "jaH",              { Jb, BND, cond_jump_flag } },
2350   /* 78 */
2351   { "jsH",              { Jb, BND, cond_jump_flag } },
2352   { "jnsH",             { Jb, BND, cond_jump_flag } },
2353   { "jpH",              { Jb, BND, cond_jump_flag } },
2354   { "jnpH",             { Jb, BND, cond_jump_flag } },
2355   { "jlH",              { Jb, BND, cond_jump_flag } },
2356   { "jgeH",             { Jb, BND, cond_jump_flag } },
2357   { "jleH",             { Jb, BND, cond_jump_flag } },
2358   { "jgH",              { Jb, BND, cond_jump_flag } },
2359   /* 80 */
2360   { REG_TABLE (REG_80) },
2361   { REG_TABLE (REG_81) },
2362   { Bad_Opcode },
2363   { REG_TABLE (REG_82) },
2364   { "testB",            { Eb, Gb } },
2365   { "testS",            { Ev, Gv } },
2366   { "xchgB",            { Ebh2, Gb } },
2367   { "xchgS",            { Evh2, Gv } },
2368   /* 88 */
2369   { "movB",             { Ebh3, Gb } },
2370   { "movS",             { Evh3, Gv } },
2371   { "movB",             { Gb, EbS } },
2372   { "movS",             { Gv, EvS } },
2373   { "movD",             { Sv, Sw } },
2374   { MOD_TABLE (MOD_8D) },
2375   { "movD",             { Sw, Sv } },
2376   { REG_TABLE (REG_8F) },
2377   /* 90 */
2378   { PREFIX_TABLE (PREFIX_90) },
2379   { "xchgS",            { RMeCX, eAX } },
2380   { "xchgS",            { RMeDX, eAX } },
2381   { "xchgS",            { RMeBX, eAX } },
2382   { "xchgS",            { RMeSP, eAX } },
2383   { "xchgS",            { RMeBP, eAX } },
2384   { "xchgS",            { RMeSI, eAX } },
2385   { "xchgS",            { RMeDI, eAX } },
2386   /* 98 */
2387   { "cW{t|}R",          { XX } },
2388   { "cR{t|}O",          { XX } },
2389   { X86_64_TABLE (X86_64_9A) },
2390   { Bad_Opcode },       /* fwait */
2391   { "pushfT",           { XX } },
2392   { "popfT",            { XX } },
2393   { "sahf",             { XX } },
2394   { "lahf",             { XX } },
2395   /* a0 */
2396   { "mov%LB",           { AL, Ob } },
2397   { "mov%LS",           { eAX, Ov } },
2398   { "mov%LB",           { Ob, AL } },
2399   { "mov%LS",           { Ov, eAX } },
2400   { "movs{b|}",         { Ybr, Xb } },
2401   { "movs{R|}",         { Yvr, Xv } },
2402   { "cmps{b|}",         { Xb, Yb } },
2403   { "cmps{R|}",         { Xv, Yv } },
2404   /* a8 */
2405   { "testB",            { AL, Ib } },
2406   { "testS",            { eAX, Iv } },
2407   { "stosB",            { Ybr, AL } },
2408   { "stosS",            { Yvr, eAX } },
2409   { "lodsB",            { ALr, Xb } },
2410   { "lodsS",            { eAXr, Xv } },
2411   { "scasB",            { AL, Yb } },
2412   { "scasS",            { eAX, Yv } },
2413   /* b0 */
2414   { "movB",             { RMAL, Ib } },
2415   { "movB",             { RMCL, Ib } },
2416   { "movB",             { RMDL, Ib } },
2417   { "movB",             { RMBL, Ib } },
2418   { "movB",             { RMAH, Ib } },
2419   { "movB",             { RMCH, Ib } },
2420   { "movB",             { RMDH, Ib } },
2421   { "movB",             { RMBH, Ib } },
2422   /* b8 */
2423   { "mov%LV",           { RMeAX, Iv64 } },
2424   { "mov%LV",           { RMeCX, Iv64 } },
2425   { "mov%LV",           { RMeDX, Iv64 } },
2426   { "mov%LV",           { RMeBX, Iv64 } },
2427   { "mov%LV",           { RMeSP, Iv64 } },
2428   { "mov%LV",           { RMeBP, Iv64 } },
2429   { "mov%LV",           { RMeSI, Iv64 } },
2430   { "mov%LV",           { RMeDI, Iv64 } },
2431   /* c0 */
2432   { REG_TABLE (REG_C0) },
2433   { REG_TABLE (REG_C1) },
2434   { "retT",             { Iw, BND } },
2435   { "retT",             { BND } },
2436   { X86_64_TABLE (X86_64_C4) },
2437   { X86_64_TABLE (X86_64_C5) },
2438   { REG_TABLE (REG_C6) },
2439   { REG_TABLE (REG_C7) },
2440   /* c8 */
2441   { "enterT",           { Iw, Ib } },
2442   { "leaveT",           { XX } },
2443   { "Jret{|f}P",        { Iw } },
2444   { "Jret{|f}P",        { XX } },
2445   { "int3",             { XX } },
2446   { "int",              { Ib } },
2447   { X86_64_TABLE (X86_64_CE) },
2448   { "iretP",            { XX } },
2449   /* d0 */
2450   { REG_TABLE (REG_D0) },
2451   { REG_TABLE (REG_D1) },
2452   { REG_TABLE (REG_D2) },
2453   { REG_TABLE (REG_D3) },
2454   { X86_64_TABLE (X86_64_D4) },
2455   { X86_64_TABLE (X86_64_D5) },
2456   { Bad_Opcode },
2457   { "xlat",             { DSBX } },
2458   /* d8 */
2459   { FLOAT },
2460   { FLOAT },
2461   { FLOAT },
2462   { FLOAT },
2463   { FLOAT },
2464   { FLOAT },
2465   { FLOAT },
2466   { FLOAT },
2467   /* e0 */
2468   { "loopneFH",         { Jb, XX, loop_jcxz_flag } },
2469   { "loopeFH",          { Jb, XX, loop_jcxz_flag } },
2470   { "loopFH",           { Jb, XX, loop_jcxz_flag } },
2471   { "jEcxzH",           { Jb, XX, loop_jcxz_flag } },
2472   { "inB",              { AL, Ib } },
2473   { "inG",              { zAX, Ib } },
2474   { "outB",             { Ib, AL } },
2475   { "outG",             { Ib, zAX } },
2476   /* e8 */
2477   { "callT",            { Jv, BND } },
2478   { "jmpT",             { Jv, BND } },
2479   { X86_64_TABLE (X86_64_EA) },
2480   { "jmp",              { Jb, BND } },
2481   { "inB",              { AL, indirDX } },
2482   { "inG",              { zAX, indirDX } },
2483   { "outB",             { indirDX, AL } },
2484   { "outG",             { indirDX, zAX } },
2485   /* f0 */
2486   { Bad_Opcode },       /* lock prefix */
2487   { "icebp",            { XX } },
2488   { Bad_Opcode },       /* repne */
2489   { Bad_Opcode },       /* repz */
2490   { "hlt",              { XX } },
2491   { "cmc",              { XX } },
2492   { REG_TABLE (REG_F6) },
2493   { REG_TABLE (REG_F7) },
2494   /* f8 */
2495   { "clc",              { XX } },
2496   { "stc",              { XX } },
2497   { "cli",              { XX } },
2498   { "sti",              { XX } },
2499   { "cld",              { XX } },
2500   { "std",              { XX } },
2501   { REG_TABLE (REG_FE) },
2502   { REG_TABLE (REG_FF) },
2503 };
2504
2505 static const struct dis386 dis386_twobyte[] = {
2506   /* 00 */
2507   { REG_TABLE (REG_0F00 ) },
2508   { REG_TABLE (REG_0F01 ) },
2509   { "larS",             { Gv, Ew } },
2510   { "lslS",             { Gv, Ew } },
2511   { Bad_Opcode },
2512   { "syscall",          { XX } },
2513   { "clts",             { XX } },
2514   { "sysretP",          { XX } },
2515   /* 08 */
2516   { "invd",             { XX } },
2517   { "wbinvd",           { XX } },
2518   { Bad_Opcode },
2519   { "ud2",              { XX } },
2520   { Bad_Opcode },
2521   { REG_TABLE (REG_0F0D) },
2522   { "femms",            { XX } },
2523   { "",                 { MX, EM, OPSUF } }, /* See OP_3DNowSuffix.  */
2524   /* 10 */
2525   { PREFIX_TABLE (PREFIX_0F10) },
2526   { PREFIX_TABLE (PREFIX_0F11) },
2527   { PREFIX_TABLE (PREFIX_0F12) },
2528   { MOD_TABLE (MOD_0F13) },
2529   { "unpcklpX",         { XM, EXx } },
2530   { "unpckhpX",         { XM, EXx } },
2531   { PREFIX_TABLE (PREFIX_0F16) },
2532   { MOD_TABLE (MOD_0F17) },
2533   /* 18 */
2534   { REG_TABLE (REG_0F18) },
2535   { "nopQ",             { Ev } },
2536   { PREFIX_TABLE (PREFIX_0F1A) },
2537   { PREFIX_TABLE (PREFIX_0F1B) },
2538   { "nopQ",             { Ev } },
2539   { "nopQ",             { Ev } },
2540   { "nopQ",             { Ev } },
2541   { "nopQ",             { Ev } },
2542   /* 20 */
2543   { MOD_TABLE (MOD_0F20) },
2544   { MOD_TABLE (MOD_0F21) },
2545   { MOD_TABLE (MOD_0F22) },
2546   { MOD_TABLE (MOD_0F23) },
2547   { MOD_TABLE (MOD_0F24) },
2548   { Bad_Opcode },
2549   { MOD_TABLE (MOD_0F26) },
2550   { Bad_Opcode },
2551   /* 28 */
2552   { "movapX",           { XM, EXx } },
2553   { "movapX",           { EXxS, XM } },
2554   { PREFIX_TABLE (PREFIX_0F2A) },
2555   { PREFIX_TABLE (PREFIX_0F2B) },
2556   { PREFIX_TABLE (PREFIX_0F2C) },
2557   { PREFIX_TABLE (PREFIX_0F2D) },
2558   { PREFIX_TABLE (PREFIX_0F2E) },
2559   { PREFIX_TABLE (PREFIX_0F2F) },
2560   /* 30 */
2561   { "wrmsr",            { XX } },
2562   { "rdtsc",            { XX } },
2563   { "rdmsr",            { XX } },
2564   { "rdpmc",            { XX } },
2565   { "sysenter",         { XX } },
2566   { "sysexit",          { XX } },
2567   { Bad_Opcode },
2568   { "getsec",           { XX } },
2569   /* 38 */
2570   { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2571   { Bad_Opcode },
2572   { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2573   { Bad_Opcode },
2574   { Bad_Opcode },
2575   { Bad_Opcode },
2576   { Bad_Opcode },
2577   { Bad_Opcode },
2578   /* 40 */
2579   { "cmovoS",           { Gv, Ev } },
2580   { "cmovnoS",          { Gv, Ev } },
2581   { "cmovbS",           { Gv, Ev } },
2582   { "cmovaeS",          { Gv, Ev } },
2583   { "cmoveS",           { Gv, Ev } },
2584   { "cmovneS",          { Gv, Ev } },
2585   { "cmovbeS",          { Gv, Ev } },
2586   { "cmovaS",           { Gv, Ev } },
2587   /* 48 */
2588   { "cmovsS",           { Gv, Ev } },
2589   { "cmovnsS",          { Gv, Ev } },
2590   { "cmovpS",           { Gv, Ev } },
2591   { "cmovnpS",          { Gv, Ev } },
2592   { "cmovlS",           { Gv, Ev } },
2593   { "cmovgeS",          { Gv, Ev } },
2594   { "cmovleS",          { Gv, Ev } },
2595   { "cmovgS",           { Gv, Ev } },
2596   /* 50 */
2597   { MOD_TABLE (MOD_0F51) },
2598   { PREFIX_TABLE (PREFIX_0F51) },
2599   { PREFIX_TABLE (PREFIX_0F52) },
2600   { PREFIX_TABLE (PREFIX_0F53) },
2601   { "andpX",            { XM, EXx } },
2602   { "andnpX",           { XM, EXx } },
2603   { "orpX",             { XM, EXx } },
2604   { "xorpX",            { XM, EXx } },
2605   /* 58 */
2606   { PREFIX_TABLE (PREFIX_0F58) },
2607   { PREFIX_TABLE (PREFIX_0F59) },
2608   { PREFIX_TABLE (PREFIX_0F5A) },
2609   { PREFIX_TABLE (PREFIX_0F5B) },
2610   { PREFIX_TABLE (PREFIX_0F5C) },
2611   { PREFIX_TABLE (PREFIX_0F5D) },
2612   { PREFIX_TABLE (PREFIX_0F5E) },
2613   { PREFIX_TABLE (PREFIX_0F5F) },
2614   /* 60 */
2615   { PREFIX_TABLE (PREFIX_0F60) },
2616   { PREFIX_TABLE (PREFIX_0F61) },
2617   { PREFIX_TABLE (PREFIX_0F62) },
2618   { "packsswb",         { MX, EM } },
2619   { "pcmpgtb",          { MX, EM } },
2620   { "pcmpgtw",          { MX, EM } },
2621   { "pcmpgtd",          { MX, EM } },
2622   { "packuswb",         { MX, EM } },
2623   /* 68 */
2624   { "punpckhbw",        { MX, EM } },
2625   { "punpckhwd",        { MX, EM } },
2626   { "punpckhdq",        { MX, EM } },
2627   { "packssdw",         { MX, EM } },
2628   { PREFIX_TABLE (PREFIX_0F6C) },
2629   { PREFIX_TABLE (PREFIX_0F6D) },
2630   { "movK",             { MX, Edq } },
2631   { PREFIX_TABLE (PREFIX_0F6F) },
2632   /* 70 */
2633   { PREFIX_TABLE (PREFIX_0F70) },
2634   { REG_TABLE (REG_0F71) },
2635   { REG_TABLE (REG_0F72) },
2636   { REG_TABLE (REG_0F73) },
2637   { "pcmpeqb",          { MX, EM } },
2638   { "pcmpeqw",          { MX, EM } },
2639   { "pcmpeqd",          { MX, EM } },
2640   { "emms",             { XX } },
2641   /* 78 */
2642   { PREFIX_TABLE (PREFIX_0F78) },
2643   { PREFIX_TABLE (PREFIX_0F79) },
2644   { THREE_BYTE_TABLE (THREE_BYTE_0F7A) },
2645   { Bad_Opcode },
2646   { PREFIX_TABLE (PREFIX_0F7C) },
2647   { PREFIX_TABLE (PREFIX_0F7D) },
2648   { PREFIX_TABLE (PREFIX_0F7E) },
2649   { PREFIX_TABLE (PREFIX_0F7F) },
2650   /* 80 */
2651   { "joH",              { Jv, BND, cond_jump_flag } },
2652   { "jnoH",             { Jv, BND, cond_jump_flag } },
2653   { "jbH",              { Jv, BND, cond_jump_flag } },
2654   { "jaeH",             { Jv, BND, cond_jump_flag } },
2655   { "jeH",              { Jv, BND, cond_jump_flag } },
2656   { "jneH",             { Jv, BND, cond_jump_flag } },
2657   { "jbeH",             { Jv, BND, cond_jump_flag } },
2658   { "jaH",              { Jv, BND, cond_jump_flag } },
2659   /* 88 */
2660   { "jsH",              { Jv, BND, cond_jump_flag } },
2661   { "jnsH",             { Jv, BND, cond_jump_flag } },
2662   { "jpH",              { Jv, BND, cond_jump_flag } },
2663   { "jnpH",             { Jv, BND, cond_jump_flag } },
2664   { "jlH",              { Jv, BND, cond_jump_flag } },
2665   { "jgeH",             { Jv, BND, cond_jump_flag } },
2666   { "jleH",             { Jv, BND, cond_jump_flag } },
2667   { "jgH",              { Jv, BND, cond_jump_flag } },
2668   /* 90 */
2669   { "seto",             { Eb } },
2670   { "setno",            { Eb } },
2671   { "setb",             { Eb } },
2672   { "setae",            { Eb } },
2673   { "sete",             { Eb } },
2674   { "setne",            { Eb } },
2675   { "setbe",            { Eb } },
2676   { "seta",             { Eb } },
2677   /* 98 */
2678   { "sets",             { Eb } },
2679   { "setns",            { Eb } },
2680   { "setp",             { Eb } },
2681   { "setnp",            { Eb } },
2682   { "setl",             { Eb } },
2683   { "setge",            { Eb } },
2684   { "setle",            { Eb } },
2685   { "setg",             { Eb } },
2686   /* a0 */
2687   { "pushT",            { fs } },
2688   { "popT",             { fs } },
2689   { "cpuid",            { XX } },
2690   { "btS",              { Ev, Gv } },
2691   { "shldS",            { Ev, Gv, Ib } },
2692   { "shldS",            { Ev, Gv, CL } },
2693   { REG_TABLE (REG_0FA6) },
2694   { REG_TABLE (REG_0FA7) },
2695   /* a8 */
2696   { "pushT",            { gs } },
2697   { "popT",             { gs } },
2698   { "rsm",              { XX } },
2699   { "btsS",             { Evh1, Gv } },
2700   { "shrdS",            { Ev, Gv, Ib } },
2701   { "shrdS",            { Ev, Gv, CL } },
2702   { REG_TABLE (REG_0FAE) },
2703   { "imulS",            { Gv, Ev } },
2704   /* b0 */
2705   { "cmpxchgB",         { Ebh1, Gb } },
2706   { "cmpxchgS",         { Evh1, Gv } },
2707   { MOD_TABLE (MOD_0FB2) },
2708   { "btrS",             { Evh1, Gv } },
2709   { MOD_TABLE (MOD_0FB4) },
2710   { MOD_TABLE (MOD_0FB5) },
2711   { "movz{bR|x}",       { Gv, Eb } },
2712   { "movz{wR|x}",       { Gv, Ew } }, /* yes, there really is movzww ! */
2713   /* b8 */
2714   { PREFIX_TABLE (PREFIX_0FB8) },
2715   { "ud1",              { XX } },
2716   { REG_TABLE (REG_0FBA) },
2717   { "btcS",             { Evh1, Gv } },
2718   { PREFIX_TABLE (PREFIX_0FBC) },
2719   { PREFIX_TABLE (PREFIX_0FBD) },
2720   { "movs{bR|x}",       { Gv, Eb } },
2721   { "movs{wR|x}",       { Gv, Ew } }, /* yes, there really is movsww ! */
2722   /* c0 */
2723   { "xaddB",            { Ebh1, Gb } },
2724   { "xaddS",            { Evh1, Gv } },
2725   { PREFIX_TABLE (PREFIX_0FC2) },
2726   { PREFIX_TABLE (PREFIX_0FC3) },
2727   { "pinsrw",           { MX, Edqw, Ib } },
2728   { "pextrw",           { Gdq, MS, Ib } },
2729   { "shufpX",           { XM, EXx, Ib } },
2730   { REG_TABLE (REG_0FC7) },
2731   /* c8 */
2732   { "bswap",            { RMeAX } },
2733   { "bswap",            { RMeCX } },
2734   { "bswap",            { RMeDX } },
2735   { "bswap",            { RMeBX } },
2736   { "bswap",            { RMeSP } },
2737   { "bswap",            { RMeBP } },
2738   { "bswap",            { RMeSI } },
2739   { "bswap",            { RMeDI } },
2740   /* d0 */
2741   { PREFIX_TABLE (PREFIX_0FD0) },
2742   { "psrlw",            { MX, EM } },
2743   { "psrld",            { MX, EM } },
2744   { "psrlq",            { MX, EM } },
2745   { "paddq",            { MX, EM } },
2746   { "pmullw",           { MX, EM } },
2747   { PREFIX_TABLE (PREFIX_0FD6) },
2748   { MOD_TABLE (MOD_0FD7) },
2749   /* d8 */
2750   { "psubusb",          { MX, EM } },
2751   { "psubusw",          { MX, EM } },
2752   { "pminub",           { MX, EM } },
2753   { "pand",             { MX, EM } },
2754   { "paddusb",          { MX, EM } },
2755   { "paddusw",          { MX, EM } },
2756   { "pmaxub",           { MX, EM } },
2757   { "pandn",            { MX, EM } },
2758   /* e0 */
2759   { "pavgb",            { MX, EM } },
2760   { "psraw",            { MX, EM } },
2761   { "psrad",            { MX, EM } },
2762   { "pavgw",            { MX, EM } },
2763   { "pmulhuw",          { MX, EM } },
2764   { "pmulhw",           { MX, EM } },
2765   { PREFIX_TABLE (PREFIX_0FE6) },
2766   { PREFIX_TABLE (PREFIX_0FE7) },
2767   /* e8 */
2768   { "psubsb",           { MX, EM } },
2769   { "psubsw",           { MX, EM } },
2770   { "pminsw",           { MX, EM } },
2771   { "por",              { MX, EM } },
2772   { "paddsb",           { MX, EM } },
2773   { "paddsw",           { MX, EM } },
2774   { "pmaxsw",           { MX, EM } },
2775   { "pxor",             { MX, EM } },
2776   /* f0 */
2777   { PREFIX_TABLE (PREFIX_0FF0) },
2778   { "psllw",            { MX, EM } },
2779   { "pslld",            { MX, EM } },
2780   { "psllq",            { MX, EM } },
2781   { "pmuludq",          { MX, EM } },
2782   { "pmaddwd",          { MX, EM } },
2783   { "psadbw",           { MX, EM } },
2784   { PREFIX_TABLE (PREFIX_0FF7) },
2785   /* f8 */
2786   { "psubb",            { MX, EM } },
2787   { "psubw",            { MX, EM } },
2788   { "psubd",            { MX, EM } },
2789   { "psubq",            { MX, EM } },
2790   { "paddb",            { MX, EM } },
2791   { "paddw",            { MX, EM } },
2792   { "paddd",            { MX, EM } },
2793   { Bad_Opcode },
2794 };
2795
2796 static const unsigned char onebyte_has_modrm[256] = {
2797   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2798   /*       -------------------------------        */
2799   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2800   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2801   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2802   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2803   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2804   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2805   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2806   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2807   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2808   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2809   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2810   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2811   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2812   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2813   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2814   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2815   /*       -------------------------------        */
2816   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2817 };
2818
2819 static const unsigned char twobyte_has_modrm[256] = {
2820   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2821   /*       -------------------------------        */
2822   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2823   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2824   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2825   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2826   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2827   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2828   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2829   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2830   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2831   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2832   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2833   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
2834   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2835   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2836   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2837   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
2838   /*       -------------------------------        */
2839   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2840 };
2841
2842 static char obuf[100];
2843 static char *obufp;
2844 static char *mnemonicendp;
2845 static char scratchbuf[100];
2846 static unsigned char *start_codep;
2847 static unsigned char *insn_codep;
2848 static unsigned char *codep;
2849 static int last_lock_prefix;
2850 static int last_repz_prefix;
2851 static int last_repnz_prefix;
2852 static int last_data_prefix;
2853 static int last_addr_prefix;
2854 static int last_rex_prefix;
2855 static int last_seg_prefix;
2856 #define MAX_CODE_LENGTH 15
2857 /* We can up to 14 prefixes since the maximum instruction length is
2858    15bytes.  */
2859 static int all_prefixes[MAX_CODE_LENGTH - 1];
2860 static disassemble_info *the_info;
2861 static struct
2862   {
2863     int mod;
2864     int reg;
2865     int rm;
2866   }
2867 modrm;
2868 static unsigned char need_modrm;
2869 static struct
2870   {
2871     int scale;
2872     int index;
2873     int base;
2874   }
2875 sib;
2876 static struct
2877   {
2878     int register_specifier;
2879     int length;
2880     int prefix;
2881     int w;
2882     int evex;
2883     int r;
2884     int v;
2885     int mask_register_specifier;
2886     int zeroing;
2887     int ll;
2888     int b;
2889   }
2890 vex;
2891 static unsigned char need_vex;
2892 static unsigned char need_vex_reg;
2893 static unsigned char vex_w_done;
2894
2895 struct op
2896   {
2897     const char *name;
2898     unsigned int len;
2899   };
2900
2901 /* If we are accessing mod/rm/reg without need_modrm set, then the
2902    values are stale.  Hitting this abort likely indicates that you
2903    need to update onebyte_has_modrm or twobyte_has_modrm.  */
2904 #define MODRM_CHECK  if (!need_modrm) abort ()
2905
2906 static const char **names64;
2907 static const char **names32;
2908 static const char **names16;
2909 static const char **names8;
2910 static const char **names8rex;
2911 static const char **names_seg;
2912 static const char *index64;
2913 static const char *index32;
2914 static const char **index16;
2915 static const char **names_bnd;
2916
2917 static const char *intel_names64[] = {
2918   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
2919   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2920 };
2921 static const char *intel_names32[] = {
2922   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
2923   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
2924 };
2925 static const char *intel_names16[] = {
2926   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
2927   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
2928 };
2929 static const char *intel_names8[] = {
2930   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
2931 };
2932 static const char *intel_names8rex[] = {
2933   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
2934   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
2935 };
2936 static const char *intel_names_seg[] = {
2937   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
2938 };
2939 static const char *intel_index64 = "riz";
2940 static const char *intel_index32 = "eiz";
2941 static const char *intel_index16[] = {
2942   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2943 };
2944
2945 static const char *att_names64[] = {
2946   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2947   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2948 };
2949 static const char *att_names32[] = {
2950   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2951   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2952 };
2953 static const char *att_names16[] = {
2954   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2955   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2956 };
2957 static const char *att_names8[] = {
2958   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2959 };
2960 static const char *att_names8rex[] = {
2961   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2962   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2963 };
2964 static const char *att_names_seg[] = {
2965   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2966 };
2967 static const char *att_index64 = "%riz";
2968 static const char *att_index32 = "%eiz";
2969 static const char *att_index16[] = {
2970   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2971 };
2972
2973 static const char **names_mm;
2974 static const char *intel_names_mm[] = {
2975   "mm0", "mm1", "mm2", "mm3",
2976   "mm4", "mm5", "mm6", "mm7"
2977 };
2978 static const char *att_names_mm[] = {
2979   "%mm0", "%mm1", "%mm2", "%mm3",
2980   "%mm4", "%mm5", "%mm6", "%mm7"
2981 };
2982
2983 static const char *intel_names_bnd[] = {
2984   "bnd0", "bnd1", "bnd2", "bnd3"
2985 };
2986
2987 static const char *att_names_bnd[] = {
2988   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2989 };
2990
2991 static const char **names_xmm;
2992 static const char *intel_names_xmm[] = {
2993   "xmm0", "xmm1", "xmm2", "xmm3",
2994   "xmm4", "xmm5", "xmm6", "xmm7",
2995   "xmm8", "xmm9", "xmm10", "xmm11",
2996   "xmm12", "xmm13", "xmm14", "xmm15",
2997   "xmm16", "xmm17", "xmm18", "xmm19",
2998   "xmm20", "xmm21", "xmm22", "xmm23",
2999   "xmm24", "xmm25", "xmm26", "xmm27",
3000   "xmm28", "xmm29", "xmm30", "xmm31"
3001 };
3002 static const char *att_names_xmm[] = {
3003   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3004   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3005   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3006   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3007   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3008   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3009   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3010   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3011 };
3012
3013 static const char **names_ymm;
3014 static const char *intel_names_ymm[] = {
3015   "ymm0", "ymm1", "ymm2", "ymm3",
3016   "ymm4", "ymm5", "ymm6", "ymm7",
3017   "ymm8", "ymm9", "ymm10", "ymm11",
3018   "ymm12", "ymm13", "ymm14", "ymm15",
3019   "ymm16", "ymm17", "ymm18", "ymm19",
3020   "ymm20", "ymm21", "ymm22", "ymm23",
3021   "ymm24", "ymm25", "ymm26", "ymm27",
3022   "ymm28", "ymm29", "ymm30", "ymm31"
3023 };
3024 static const char *att_names_ymm[] = {
3025   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3026   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3027   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3028   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3029   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3030   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3031   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3032   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3033 };
3034
3035 static const char **names_zmm;
3036 static const char *intel_names_zmm[] = {
3037   "zmm0", "zmm1", "zmm2", "zmm3",
3038   "zmm4", "zmm5", "zmm6", "zmm7",
3039   "zmm8", "zmm9", "zmm10", "zmm11",
3040   "zmm12", "zmm13", "zmm14", "zmm15",
3041   "zmm16", "zmm17", "zmm18", "zmm19",
3042   "zmm20", "zmm21", "zmm22", "zmm23",
3043   "zmm24", "zmm25", "zmm26", "zmm27",
3044   "zmm28", "zmm29", "zmm30", "zmm31"
3045 };
3046 static const char *att_names_zmm[] = {
3047   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3048   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3049   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3050   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3051   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3052   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3053   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3054   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3055 };
3056
3057 static const char **names_mask;
3058 static const char *intel_names_mask[] = {
3059   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3060 };
3061 static const char *att_names_mask[] = {
3062   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3063 };
3064
3065 static const char *names_rounding[] =
3066 {
3067   "{rn-sae}",
3068   "{rd-sae}",
3069   "{ru-sae}",
3070   "{rz-sae}"
3071 };
3072
3073 static const struct dis386 reg_table[][8] = {
3074   /* REG_80 */
3075   {
3076     { "addA",   { Ebh1, Ib } },
3077     { "orA",    { Ebh1, Ib } },
3078     { "adcA",   { Ebh1, Ib } },
3079     { "sbbA",   { Ebh1, Ib } },
3080     { "andA",   { Ebh1, Ib } },
3081     { "subA",   { Ebh1, Ib } },
3082     { "xorA",   { Ebh1, Ib } },
3083     { "cmpA",   { Eb, Ib } },
3084   },
3085   /* REG_81 */
3086   {
3087     { "addQ",   { Evh1, Iv } },
3088     { "orQ",    { Evh1, Iv } },
3089     { "adcQ",   { Evh1, Iv } },
3090     { "sbbQ",   { Evh1, Iv } },
3091     { "andQ",   { Evh1, Iv } },
3092     { "subQ",   { Evh1, Iv } },
3093     { "xorQ",   { Evh1, Iv } },
3094     { "cmpQ",   { Ev, Iv } },
3095   },
3096   /* REG_82 */
3097   {
3098     { "addQ",   { Evh1, sIb } },
3099     { "orQ",    { Evh1, sIb } },
3100     { "adcQ",   { Evh1, sIb } },
3101     { "sbbQ",   { Evh1, sIb } },
3102     { "andQ",   { Evh1, sIb } },
3103     { "subQ",   { Evh1, sIb } },
3104     { "xorQ",   { Evh1, sIb } },
3105     { "cmpQ",   { Ev, sIb } },
3106   },
3107   /* REG_8F */
3108   {
3109     { "popU",   { stackEv } },
3110     { XOP_8F_TABLE (XOP_09) },
3111     { Bad_Opcode },
3112     { Bad_Opcode },
3113     { Bad_Opcode },
3114     { XOP_8F_TABLE (XOP_09) },
3115   },
3116   /* REG_C0 */
3117   {
3118     { "rolA",   { Eb, Ib } },
3119     { "rorA",   { Eb, Ib } },
3120     { "rclA",   { Eb, Ib } },
3121     { "rcrA",   { Eb, Ib } },
3122     { "shlA",   { Eb, Ib } },
3123     { "shrA",   { Eb, Ib } },
3124     { Bad_Opcode },
3125     { "sarA",   { Eb, Ib } },
3126   },
3127   /* REG_C1 */
3128   {
3129     { "rolQ",   { Ev, Ib } },
3130     { "rorQ",   { Ev, Ib } },
3131     { "rclQ",   { Ev, Ib } },
3132     { "rcrQ",   { Ev, Ib } },
3133     { "shlQ",   { Ev, Ib } },
3134     { "shrQ",   { Ev, Ib } },
3135     { Bad_Opcode },
3136     { "sarQ",   { Ev, Ib } },
3137   },
3138   /* REG_C6 */
3139   {
3140     { "movA",   { Ebh3, Ib } },
3141     { Bad_Opcode },
3142     { Bad_Opcode },
3143     { Bad_Opcode },
3144     { Bad_Opcode },
3145     { Bad_Opcode },
3146     { Bad_Opcode },
3147     { MOD_TABLE (MOD_C6_REG_7) },
3148   },
3149   /* REG_C7 */
3150   {
3151     { "movQ",   { Evh3, Iv } },
3152     { Bad_Opcode },
3153     { Bad_Opcode },
3154     { Bad_Opcode },
3155     { Bad_Opcode },
3156     { Bad_Opcode },
3157     { Bad_Opcode },
3158     { MOD_TABLE (MOD_C7_REG_7) },
3159   },
3160   /* REG_D0 */
3161   {
3162     { "rolA",   { Eb, I1 } },
3163     { "rorA",   { Eb, I1 } },
3164     { "rclA",   { Eb, I1 } },
3165     { "rcrA",   { Eb, I1 } },
3166     { "shlA",   { Eb, I1 } },
3167     { "shrA",   { Eb, I1 } },
3168     { Bad_Opcode },
3169     { "sarA",   { Eb, I1 } },
3170   },
3171   /* REG_D1 */
3172   {
3173     { "rolQ",   { Ev, I1 } },
3174     { "rorQ",   { Ev, I1 } },
3175     { "rclQ",   { Ev, I1 } },
3176     { "rcrQ",   { Ev, I1 } },
3177     { "shlQ",   { Ev, I1 } },
3178     { "shrQ",   { Ev, I1 } },
3179     { Bad_Opcode },
3180     { "sarQ",   { Ev, I1 } },
3181   },
3182   /* REG_D2 */
3183   {
3184     { "rolA",   { Eb, CL } },
3185     { "rorA",   { Eb, CL } },
3186     { "rclA",   { Eb, CL } },
3187     { "rcrA",   { Eb, CL } },
3188     { "shlA",   { Eb, CL } },
3189     { "shrA",   { Eb, CL } },
3190     { Bad_Opcode },
3191     { "sarA",   { Eb, CL } },
3192   },
3193   /* REG_D3 */
3194   {
3195     { "rolQ",   { Ev, CL } },
3196     { "rorQ",   { Ev, CL } },
3197     { "rclQ",   { Ev, CL } },
3198     { "rcrQ",   { Ev, CL } },
3199     { "shlQ",   { Ev, CL } },
3200     { "shrQ",   { Ev, CL } },
3201     { Bad_Opcode },
3202     { "sarQ",   { Ev, CL } },
3203   },
3204   /* REG_F6 */
3205   {
3206     { "testA",  { Eb, Ib } },
3207     { Bad_Opcode },
3208     { "notA",   { Ebh1 } },
3209     { "negA",   { Ebh1 } },
3210     { "mulA",   { Eb } },       /* Don't print the implicit %al register,  */
3211     { "imulA",  { Eb } },       /* to distinguish these opcodes from other */
3212     { "divA",   { Eb } },       /* mul/imul opcodes.  Do the same for div  */
3213     { "idivA",  { Eb } },       /* and idiv for consistency.               */
3214   },
3215   /* REG_F7 */
3216   {
3217     { "testQ",  { Ev, Iv } },
3218     { Bad_Opcode },
3219     { "notQ",   { Evh1 } },
3220     { "negQ",   { Evh1 } },
3221     { "mulQ",   { Ev } },       /* Don't print the implicit register.  */
3222     { "imulQ",  { Ev } },
3223     { "divQ",   { Ev } },
3224     { "idivQ",  { Ev } },
3225   },
3226   /* REG_FE */
3227   {
3228     { "incA",   { Ebh1 } },
3229     { "decA",   { Ebh1 } },
3230   },
3231   /* REG_FF */
3232   {
3233     { "incQ",   { Evh1 } },
3234     { "decQ",   { Evh1 } },
3235     { "call{T|}", { indirEv, BND } },
3236     { MOD_TABLE (MOD_FF_REG_3) },
3237     { "jmp{T|}", { indirEv, BND } },
3238     { MOD_TABLE (MOD_FF_REG_5) },
3239     { "pushU",  { stackEv } },
3240     { Bad_Opcode },
3241   },
3242   /* REG_0F00 */
3243   {
3244     { "sldtD",  { Sv } },
3245     { "strD",   { Sv } },
3246     { "lldt",   { Ew } },
3247     { "ltr",    { Ew } },
3248     { "verr",   { Ew } },
3249     { "verw",   { Ew } },
3250     { Bad_Opcode },
3251     { Bad_Opcode },
3252   },
3253   /* REG_0F01 */
3254   {
3255     { MOD_TABLE (MOD_0F01_REG_0) },
3256     { MOD_TABLE (MOD_0F01_REG_1) },
3257     { MOD_TABLE (MOD_0F01_REG_2) },
3258     { MOD_TABLE (MOD_0F01_REG_3) },
3259     { "smswD",  { Sv } },
3260     { Bad_Opcode },
3261     { "lmsw",   { Ew } },
3262     { MOD_TABLE (MOD_0F01_REG_7) },
3263   },
3264   /* REG_0F0D */
3265   {
3266     { "prefetch",       { Mb } },
3267     { "prefetchw",      { Mb } },
3268     { "prefetchwt1",    { Mb } },
3269     { "prefetch",       { Mb } },
3270     { "prefetch",       { Mb } },
3271     { "prefetch",       { Mb } },
3272     { "prefetch",       { Mb } },
3273     { "prefetch",       { Mb } },
3274   },
3275   /* REG_0F18 */
3276   {
3277     { MOD_TABLE (MOD_0F18_REG_0) },
3278     { MOD_TABLE (MOD_0F18_REG_1) },
3279     { MOD_TABLE (MOD_0F18_REG_2) },
3280     { MOD_TABLE (MOD_0F18_REG_3) },
3281     { MOD_TABLE (MOD_0F18_REG_4) },
3282     { MOD_TABLE (MOD_0F18_REG_5) },
3283     { MOD_TABLE (MOD_0F18_REG_6) },
3284     { MOD_TABLE (MOD_0F18_REG_7) },
3285   },
3286   /* REG_0F71 */
3287   {
3288     { Bad_Opcode },
3289     { Bad_Opcode },
3290     { MOD_TABLE (MOD_0F71_REG_2) },
3291     { Bad_Opcode },
3292     { MOD_TABLE (MOD_0F71_REG_4) },
3293     { Bad_Opcode },
3294     { MOD_TABLE (MOD_0F71_REG_6) },
3295   },
3296   /* REG_0F72 */
3297   {
3298     { Bad_Opcode },
3299     { Bad_Opcode },
3300     { MOD_TABLE (MOD_0F72_REG_2) },
3301     { Bad_Opcode },
3302     { MOD_TABLE (MOD_0F72_REG_4) },
3303     { Bad_Opcode },
3304     { MOD_TABLE (MOD_0F72_REG_6) },
3305   },
3306   /* REG_0F73 */
3307   {
3308     { Bad_Opcode },
3309     { Bad_Opcode },
3310     { MOD_TABLE (MOD_0F73_REG_2) },
3311     { MOD_TABLE (MOD_0F73_REG_3) },
3312     { Bad_Opcode },
3313     { Bad_Opcode },
3314     { MOD_TABLE (MOD_0F73_REG_6) },
3315     { MOD_TABLE (MOD_0F73_REG_7) },
3316   },
3317   /* REG_0FA6 */
3318   {
3319     { "montmul",        { { OP_0f07, 0 } } },
3320     { "xsha1",          { { OP_0f07, 0 } } },
3321     { "xsha256",        { { OP_0f07, 0 } } },
3322   },
3323   /* REG_0FA7 */
3324   {
3325     { "xstore-rng",     { { OP_0f07, 0 } } },
3326     { "xcrypt-ecb",     { { OP_0f07, 0 } } },
3327     { "xcrypt-cbc",     { { OP_0f07, 0 } } },
3328     { "xcrypt-ctr",     { { OP_0f07, 0 } } },
3329     { "xcrypt-cfb",     { { OP_0f07, 0 } } },
3330     { "xcrypt-ofb",     { { OP_0f07, 0 } } },
3331   },
3332   /* REG_0FAE */
3333   {
3334     { MOD_TABLE (MOD_0FAE_REG_0) },
3335     { MOD_TABLE (MOD_0FAE_REG_1) },
3336     { MOD_TABLE (MOD_0FAE_REG_2) },
3337     { MOD_TABLE (MOD_0FAE_REG_3) },
3338     { MOD_TABLE (MOD_0FAE_REG_4) },
3339     { MOD_TABLE (MOD_0FAE_REG_5) },
3340     { MOD_TABLE (MOD_0FAE_REG_6) },
3341     { MOD_TABLE (MOD_0FAE_REG_7) },
3342   },
3343   /* REG_0FBA */
3344   {
3345     { Bad_Opcode },
3346     { Bad_Opcode },
3347     { Bad_Opcode },
3348     { Bad_Opcode },
3349     { "btQ",    { Ev, Ib } },
3350     { "btsQ",   { Evh1, Ib } },
3351     { "btrQ",   { Evh1, Ib } },
3352     { "btcQ",   { Evh1, Ib } },
3353   },
3354   /* REG_0FC7 */
3355   {
3356     { Bad_Opcode },
3357     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
3358     { Bad_Opcode },
3359     { MOD_TABLE (MOD_0FC7_REG_3) },
3360     { MOD_TABLE (MOD_0FC7_REG_4) },
3361     { MOD_TABLE (MOD_0FC7_REG_5) },
3362     { MOD_TABLE (MOD_0FC7_REG_6) },
3363     { MOD_TABLE (MOD_0FC7_REG_7) },
3364   },
3365   /* REG_VEX_0F71 */
3366   {
3367     { Bad_Opcode },
3368     { Bad_Opcode },
3369     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3370     { Bad_Opcode },
3371     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3372     { Bad_Opcode },
3373     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3374   },
3375   /* REG_VEX_0F72 */
3376   {
3377     { Bad_Opcode },
3378     { Bad_Opcode },
3379     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3380     { Bad_Opcode },
3381     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3382     { Bad_Opcode },
3383     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3384   },
3385   /* REG_VEX_0F73 */
3386   {
3387     { Bad_Opcode },
3388     { Bad_Opcode },
3389     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3390     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3391     { Bad_Opcode },
3392     { Bad_Opcode },
3393     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3394     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3395   },
3396   /* REG_VEX_0FAE */
3397   {
3398     { Bad_Opcode },
3399     { Bad_Opcode },
3400     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3401     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3402   },
3403   /* REG_VEX_0F38F3 */
3404   {
3405     { Bad_Opcode },
3406     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3407     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3408     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3409   },
3410   /* REG_XOP_LWPCB */
3411   {
3412     { "llwpcb", { { OP_LWPCB_E, 0 } } },
3413     { "slwpcb", { { OP_LWPCB_E, 0 } } },
3414   },
3415   /* REG_XOP_LWP */
3416   {
3417     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq } },
3418     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq } },
3419   },
3420   /* REG_XOP_TBM_01 */
3421   {
3422     { Bad_Opcode },
3423     { "blcfill",        { { OP_LWP_E, 0 }, Ev } },
3424     { "blsfill",        { { OP_LWP_E, 0 }, Ev } },
3425     { "blcs",   { { OP_LWP_E, 0 }, Ev } },
3426     { "tzmsk",  { { OP_LWP_E, 0 }, Ev } },
3427     { "blcic",  { { OP_LWP_E, 0 }, Ev } },
3428     { "blsic",  { { OP_LWP_E, 0 }, Ev } },
3429     { "t1mskc", { { OP_LWP_E, 0 }, Ev } },
3430   },
3431   /* REG_XOP_TBM_02 */
3432   {
3433     { Bad_Opcode },
3434     { "blcmsk", { { OP_LWP_E, 0 }, Ev } },
3435     { Bad_Opcode },
3436     { Bad_Opcode },
3437     { Bad_Opcode },
3438     { Bad_Opcode },
3439     { "blci",   { { OP_LWP_E, 0 }, Ev } },
3440   },
3441 #define NEED_REG_TABLE
3442 #include "i386-dis-evex.h"
3443 #undef NEED_REG_TABLE
3444 };
3445
3446 static const struct dis386 prefix_table[][4] = {
3447   /* PREFIX_90 */
3448   {
3449     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
3450     { "pause", { XX } },
3451     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
3452   },
3453
3454   /* PREFIX_0F10 */
3455   {
3456     { "movups", { XM, EXx } },
3457     { "movss",  { XM, EXd } },
3458     { "movupd", { XM, EXx } },
3459     { "movsd",  { XM, EXq } },
3460   },
3461
3462   /* PREFIX_0F11 */
3463   {
3464     { "movups", { EXxS, XM } },
3465     { "movss",  { EXdS, XM } },
3466     { "movupd", { EXxS, XM } },
3467     { "movsd",  { EXqS, XM } },
3468   },
3469
3470   /* PREFIX_0F12 */
3471   {
3472     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3473     { "movsldup", { XM, EXx } },
3474     { "movlpd", { XM, EXq } },
3475     { "movddup", { XM, EXq } },
3476   },
3477
3478   /* PREFIX_0F16 */
3479   {
3480     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3481     { "movshdup", { XM, EXx } },
3482     { "movhpd", { XM, EXq } },
3483   },
3484
3485   /* PREFIX_0F1A */
3486   {
3487     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3488     { "bndcl",  { Gbnd, Ev_bnd } },
3489     { "bndmov", { Gbnd, Ebnd } },
3490     { "bndcu",  { Gbnd, Ev_bnd } },
3491   },
3492
3493   /* PREFIX_0F1B */
3494   {
3495     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3496     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3497     { "bndmov", { Ebnd, Gbnd } },
3498     { "bndcn",  { Gbnd, Ev_bnd } },
3499   },
3500
3501   /* PREFIX_0F2A */
3502   {
3503     { "cvtpi2ps", { XM, EMCq } },
3504     { "cvtsi2ss%LQ", { XM, Ev } },
3505     { "cvtpi2pd", { XM, EMCq } },
3506     { "cvtsi2sd%LQ", { XM, Ev } },
3507   },
3508
3509   /* PREFIX_0F2B */
3510   {
3511     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3512     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3513     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3514     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3515   },
3516
3517   /* PREFIX_0F2C */
3518   {
3519     { "cvttps2pi", { MXC, EXq } },
3520     { "cvttss2siY", { Gv, EXd } },
3521     { "cvttpd2pi", { MXC, EXx } },
3522     { "cvttsd2siY", { Gv, EXq } },
3523   },
3524
3525   /* PREFIX_0F2D */
3526   {
3527     { "cvtps2pi", { MXC, EXq } },
3528     { "cvtss2siY", { Gv, EXd } },
3529     { "cvtpd2pi", { MXC, EXx } },
3530     { "cvtsd2siY", { Gv, EXq } },
3531   },
3532
3533   /* PREFIX_0F2E */
3534   {
3535     { "ucomiss",{ XM, EXd } },
3536     { Bad_Opcode },
3537     { "ucomisd",{ XM, EXq } },
3538   },
3539
3540   /* PREFIX_0F2F */
3541   {
3542     { "comiss", { XM, EXd } },
3543     { Bad_Opcode },
3544     { "comisd", { XM, EXq } },
3545   },
3546
3547   /* PREFIX_0F51 */
3548   {
3549     { "sqrtps", { XM, EXx } },
3550     { "sqrtss", { XM, EXd } },
3551     { "sqrtpd", { XM, EXx } },
3552     { "sqrtsd", { XM, EXq } },
3553   },
3554
3555   /* PREFIX_0F52 */
3556   {
3557     { "rsqrtps",{ XM, EXx } },
3558     { "rsqrtss",{ XM, EXd } },
3559   },
3560
3561   /* PREFIX_0F53 */
3562   {
3563     { "rcpps",  { XM, EXx } },
3564     { "rcpss",  { XM, EXd } },
3565   },
3566
3567   /* PREFIX_0F58 */
3568   {
3569     { "addps", { XM, EXx } },
3570     { "addss", { XM, EXd } },
3571     { "addpd", { XM, EXx } },
3572     { "addsd", { XM, EXq } },
3573   },
3574
3575   /* PREFIX_0F59 */
3576   {
3577     { "mulps",  { XM, EXx } },
3578     { "mulss",  { XM, EXd } },
3579     { "mulpd",  { XM, EXx } },
3580     { "mulsd",  { XM, EXq } },
3581   },
3582
3583   /* PREFIX_0F5A */
3584   {
3585     { "cvtps2pd", { XM, EXq } },
3586     { "cvtss2sd", { XM, EXd } },
3587     { "cvtpd2ps", { XM, EXx } },
3588     { "cvtsd2ss", { XM, EXq } },
3589   },
3590
3591   /* PREFIX_0F5B */
3592   {
3593     { "cvtdq2ps", { XM, EXx } },
3594     { "cvttps2dq", { XM, EXx } },
3595     { "cvtps2dq", { XM, EXx } },
3596   },
3597
3598   /* PREFIX_0F5C */
3599   {
3600     { "subps",  { XM, EXx } },
3601     { "subss",  { XM, EXd } },
3602     { "subpd",  { XM, EXx } },
3603     { "subsd",  { XM, EXq } },
3604   },
3605
3606   /* PREFIX_0F5D */
3607   {
3608     { "minps",  { XM, EXx } },
3609     { "minss",  { XM, EXd } },
3610     { "minpd",  { XM, EXx } },
3611     { "minsd",  { XM, EXq } },
3612   },
3613
3614   /* PREFIX_0F5E */
3615   {
3616     { "divps",  { XM, EXx } },
3617     { "divss",  { XM, EXd } },
3618     { "divpd",  { XM, EXx } },
3619     { "divsd",  { XM, EXq } },
3620   },
3621
3622   /* PREFIX_0F5F */
3623   {
3624     { "maxps",  { XM, EXx } },
3625     { "maxss",  { XM, EXd } },
3626     { "maxpd",  { XM, EXx } },
3627     { "maxsd",  { XM, EXq } },
3628   },
3629
3630   /* PREFIX_0F60 */
3631   {
3632     { "punpcklbw",{ MX, EMd } },
3633     { Bad_Opcode },
3634     { "punpcklbw",{ MX, EMx } },
3635   },
3636
3637   /* PREFIX_0F61 */
3638   {
3639     { "punpcklwd",{ MX, EMd } },
3640     { Bad_Opcode },
3641     { "punpcklwd",{ MX, EMx } },
3642   },
3643
3644   /* PREFIX_0F62 */
3645   {
3646     { "punpckldq",{ MX, EMd } },
3647     { Bad_Opcode },
3648     { "punpckldq",{ MX, EMx } },
3649   },
3650
3651   /* PREFIX_0F6C */
3652   {
3653     { Bad_Opcode },
3654     { Bad_Opcode },
3655     { "punpcklqdq", { XM, EXx } },
3656   },
3657
3658   /* PREFIX_0F6D */
3659   {
3660     { Bad_Opcode },
3661     { Bad_Opcode },
3662     { "punpckhqdq", { XM, EXx } },
3663   },
3664
3665   /* PREFIX_0F6F */
3666   {
3667     { "movq",   { MX, EM } },
3668     { "movdqu", { XM, EXx } },
3669     { "movdqa", { XM, EXx } },
3670   },
3671
3672   /* PREFIX_0F70 */
3673   {
3674     { "pshufw", { MX, EM, Ib } },
3675     { "pshufhw",{ XM, EXx, Ib } },
3676     { "pshufd", { XM, EXx, Ib } },
3677     { "pshuflw",{ XM, EXx, Ib } },
3678   },
3679
3680   /* PREFIX_0F73_REG_3 */
3681   {
3682     { Bad_Opcode },
3683     { Bad_Opcode },
3684     { "psrldq", { XS, Ib } },
3685   },
3686
3687   /* PREFIX_0F73_REG_7 */
3688   {
3689     { Bad_Opcode },
3690     { Bad_Opcode },
3691     { "pslldq", { XS, Ib } },
3692   },
3693
3694   /* PREFIX_0F78 */
3695   {
3696     {"vmread",  { Em, Gm } },
3697     { Bad_Opcode },
3698     {"extrq",   { XS, Ib, Ib } },
3699     {"insertq", { XM, XS, Ib, Ib } },
3700   },
3701
3702   /* PREFIX_0F79 */
3703   {
3704     {"vmwrite", { Gm, Em } },
3705     { Bad_Opcode },
3706     {"extrq",   { XM, XS } },
3707     {"insertq", { XM, XS } },
3708   },
3709
3710   /* PREFIX_0F7C */
3711   {
3712     { Bad_Opcode },
3713     { Bad_Opcode },
3714     { "haddpd", { XM, EXx } },
3715     { "haddps", { XM, EXx } },
3716   },
3717
3718   /* PREFIX_0F7D */
3719   {
3720     { Bad_Opcode },
3721     { Bad_Opcode },
3722     { "hsubpd", { XM, EXx } },
3723     { "hsubps", { XM, EXx } },
3724   },
3725
3726   /* PREFIX_0F7E */
3727   {
3728     { "movK",   { Edq, MX } },
3729     { "movq",   { XM, EXq } },
3730     { "movK",   { Edq, XM } },
3731   },
3732
3733   /* PREFIX_0F7F */
3734   {
3735     { "movq",   { EMS, MX } },
3736     { "movdqu", { EXxS, XM } },
3737     { "movdqa", { EXxS, XM } },
3738   },
3739
3740   /* PREFIX_0FAE_REG_0 */
3741   {
3742     { Bad_Opcode },
3743     { "rdfsbase", { Ev } },
3744   },
3745
3746   /* PREFIX_0FAE_REG_1 */
3747   {
3748     { Bad_Opcode },
3749     { "rdgsbase", { Ev } },
3750   },
3751
3752   /* PREFIX_0FAE_REG_2 */
3753   {
3754     { Bad_Opcode },
3755     { "wrfsbase", { Ev } },
3756   },
3757
3758   /* PREFIX_0FAE_REG_3 */
3759   {
3760     { Bad_Opcode },
3761     { "wrgsbase", { Ev } },
3762   },
3763
3764   /* PREFIX_0FAE_REG_7 */
3765   {
3766     { "clflush",        { Mb } },
3767     { Bad_Opcode },
3768     { "clflushopt",     { Mb } },
3769   },
3770
3771   /* PREFIX_0FB8 */
3772   {
3773     { Bad_Opcode },
3774     { "popcntS", { Gv, Ev } },
3775   },
3776
3777   /* PREFIX_0FBC */
3778   {
3779     { "bsfS",   { Gv, Ev } },
3780     { "tzcntS", { Gv, Ev } },
3781     { "bsfS",   { Gv, Ev } },
3782   },
3783
3784   /* PREFIX_0FBD */
3785   {
3786     { "bsrS",   { Gv, Ev } },
3787     { "lzcntS", { Gv, Ev } },
3788     { "bsrS",   { Gv, Ev } },
3789   },
3790
3791   /* PREFIX_0FC2 */
3792   {
3793     { "cmpps",  { XM, EXx, CMP } },
3794     { "cmpss",  { XM, EXd, CMP } },
3795     { "cmppd",  { XM, EXx, CMP } },
3796     { "cmpsd",  { XM, EXq, CMP } },
3797   },
3798
3799   /* PREFIX_0FC3 */
3800   {
3801     { "movntiS", { Ma, Gv } },
3802   },
3803
3804   /* PREFIX_0FC7_REG_6 */
3805   {
3806     { "vmptrld",{ Mq } },
3807     { "vmxon",  { Mq } },
3808     { "vmclear",{ Mq } },
3809   },
3810
3811   /* PREFIX_0FD0 */
3812   {
3813     { Bad_Opcode },
3814     { Bad_Opcode },
3815     { "addsubpd", { XM, EXx } },
3816     { "addsubps", { XM, EXx } },
3817   },
3818
3819   /* PREFIX_0FD6 */
3820   {
3821     { Bad_Opcode },
3822     { "movq2dq",{ XM, MS } },
3823     { "movq",   { EXqS, XM } },
3824     { "movdq2q",{ MX, XS } },
3825   },
3826
3827   /* PREFIX_0FE6 */
3828   {
3829     { Bad_Opcode },
3830     { "cvtdq2pd", { XM, EXq } },
3831     { "cvttpd2dq", { XM, EXx } },
3832     { "cvtpd2dq", { XM, EXx } },
3833   },
3834
3835   /* PREFIX_0FE7 */
3836   {
3837     { "movntq", { Mq, MX } },
3838     { Bad_Opcode },
3839     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3840   },
3841
3842   /* PREFIX_0FF0 */
3843   {
3844     { Bad_Opcode },
3845     { Bad_Opcode },
3846     { Bad_Opcode },
3847     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3848   },
3849
3850   /* PREFIX_0FF7 */
3851   {
3852     { "maskmovq", { MX, MS } },
3853     { Bad_Opcode },
3854     { "maskmovdqu", { XM, XS } },
3855   },
3856
3857   /* PREFIX_0F3810 */
3858   {
3859     { Bad_Opcode },
3860     { Bad_Opcode },
3861     { "pblendvb", { XM, EXx, XMM0 } },
3862   },
3863
3864   /* PREFIX_0F3814 */
3865   {
3866     { Bad_Opcode },
3867     { Bad_Opcode },
3868     { "blendvps", { XM, EXx, XMM0 } },
3869   },
3870
3871   /* PREFIX_0F3815 */
3872   {
3873     { Bad_Opcode },
3874     { Bad_Opcode },
3875     { "blendvpd", { XM, EXx, XMM0 } },
3876   },
3877
3878   /* PREFIX_0F3817 */
3879   {
3880     { Bad_Opcode },
3881     { Bad_Opcode },
3882     { "ptest",  { XM, EXx } },
3883   },
3884
3885   /* PREFIX_0F3820 */
3886   {
3887     { Bad_Opcode },
3888     { Bad_Opcode },
3889     { "pmovsxbw", { XM, EXq } },
3890   },
3891
3892   /* PREFIX_0F3821 */
3893   {
3894     { Bad_Opcode },
3895     { Bad_Opcode },
3896     { "pmovsxbd", { XM, EXd } },
3897   },
3898
3899   /* PREFIX_0F3822 */
3900   {
3901     { Bad_Opcode },
3902     { Bad_Opcode },
3903     { "pmovsxbq", { XM, EXw } },
3904   },
3905
3906   /* PREFIX_0F3823 */
3907   {
3908     { Bad_Opcode },
3909     { Bad_Opcode },
3910     { "pmovsxwd", { XM, EXq } },
3911   },
3912
3913   /* PREFIX_0F3824 */
3914   {
3915     { Bad_Opcode },
3916     { Bad_Opcode },
3917     { "pmovsxwq", { XM, EXd } },
3918   },
3919
3920   /* PREFIX_0F3825 */
3921   {
3922     { Bad_Opcode },
3923     { Bad_Opcode },
3924     { "pmovsxdq", { XM, EXq } },
3925   },
3926
3927   /* PREFIX_0F3828 */
3928   {
3929     { Bad_Opcode },
3930     { Bad_Opcode },
3931     { "pmuldq", { XM, EXx } },
3932   },
3933
3934   /* PREFIX_0F3829 */
3935   {
3936     { Bad_Opcode },
3937     { Bad_Opcode },
3938     { "pcmpeqq", { XM, EXx } },
3939   },
3940
3941   /* PREFIX_0F382A */
3942   {
3943     { Bad_Opcode },
3944     { Bad_Opcode },
3945     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
3946   },
3947
3948   /* PREFIX_0F382B */
3949   {
3950     { Bad_Opcode },
3951     { Bad_Opcode },
3952     { "packusdw", { XM, EXx } },
3953   },
3954
3955   /* PREFIX_0F3830 */
3956   {
3957     { Bad_Opcode },
3958     { Bad_Opcode },
3959     { "pmovzxbw", { XM, EXq } },
3960   },
3961
3962   /* PREFIX_0F3831 */
3963   {
3964     { Bad_Opcode },
3965     { Bad_Opcode },
3966     { "pmovzxbd", { XM, EXd } },
3967   },
3968
3969   /* PREFIX_0F3832 */
3970   {
3971     { Bad_Opcode },
3972     { Bad_Opcode },
3973     { "pmovzxbq", { XM, EXw } },
3974   },
3975
3976   /* PREFIX_0F3833 */
3977   {
3978     { Bad_Opcode },
3979     { Bad_Opcode },
3980     { "pmovzxwd", { XM, EXq } },
3981   },
3982
3983   /* PREFIX_0F3834 */
3984   {
3985     { Bad_Opcode },
3986     { Bad_Opcode },
3987     { "pmovzxwq", { XM, EXd } },
3988   },
3989
3990   /* PREFIX_0F3835 */
3991   {
3992     { Bad_Opcode },
3993     { Bad_Opcode },
3994     { "pmovzxdq", { XM, EXq } },
3995   },
3996
3997   /* PREFIX_0F3837 */
3998   {
3999     { Bad_Opcode },
4000     { Bad_Opcode },
4001     { "pcmpgtq", { XM, EXx } },
4002   },
4003
4004   /* PREFIX_0F3838 */
4005   {
4006     { Bad_Opcode },
4007     { Bad_Opcode },
4008     { "pminsb", { XM, EXx } },
4009   },
4010
4011   /* PREFIX_0F3839 */
4012   {
4013     { Bad_Opcode },
4014     { Bad_Opcode },
4015     { "pminsd", { XM, EXx } },
4016   },
4017
4018   /* PREFIX_0F383A */
4019   {
4020     { Bad_Opcode },
4021     { Bad_Opcode },
4022     { "pminuw", { XM, EXx } },
4023   },
4024
4025   /* PREFIX_0F383B */
4026   {
4027     { Bad_Opcode },
4028     { Bad_Opcode },
4029     { "pminud", { XM, EXx } },
4030   },
4031
4032   /* PREFIX_0F383C */
4033   {
4034     { Bad_Opcode },
4035     { Bad_Opcode },
4036     { "pmaxsb", { XM, EXx } },
4037   },
4038
4039   /* PREFIX_0F383D */
4040   {
4041     { Bad_Opcode },
4042     { Bad_Opcode },
4043     { "pmaxsd", { XM, EXx } },
4044   },
4045
4046   /* PREFIX_0F383E */
4047   {
4048     { Bad_Opcode },
4049     { Bad_Opcode },
4050     { "pmaxuw", { XM, EXx } },
4051   },
4052
4053   /* PREFIX_0F383F */
4054   {
4055     { Bad_Opcode },
4056     { Bad_Opcode },
4057     { "pmaxud", { XM, EXx } },
4058   },
4059
4060   /* PREFIX_0F3840 */
4061   {
4062     { Bad_Opcode },
4063     { Bad_Opcode },
4064     { "pmulld", { XM, EXx } },
4065   },
4066
4067   /* PREFIX_0F3841 */
4068   {
4069     { Bad_Opcode },
4070     { Bad_Opcode },
4071     { "phminposuw", { XM, EXx } },
4072   },
4073
4074   /* PREFIX_0F3880 */
4075   {
4076     { Bad_Opcode },
4077     { Bad_Opcode },
4078     { "invept", { Gm, Mo } },
4079   },
4080
4081   /* PREFIX_0F3881 */
4082   {
4083     { Bad_Opcode },
4084     { Bad_Opcode },
4085     { "invvpid", { Gm, Mo } },
4086   },
4087
4088   /* PREFIX_0F3882 */
4089   {
4090     { Bad_Opcode },
4091     { Bad_Opcode },
4092     { "invpcid", { Gm, M } },
4093   },
4094
4095   /* PREFIX_0F38C8 */
4096   {
4097     { "sha1nexte", { XM, EXxmm } },
4098   },
4099
4100   /* PREFIX_0F38C9 */
4101   {
4102     { "sha1msg1", { XM, EXxmm } },
4103   },
4104
4105   /* PREFIX_0F38CA */
4106   {
4107     { "sha1msg2", { XM, EXxmm } },
4108   },
4109
4110   /* PREFIX_0F38CB */
4111   {
4112     { "sha256rnds2", { XM, EXxmm, XMM0 } },
4113   },
4114
4115   /* PREFIX_0F38CC */
4116   {
4117     { "sha256msg1", { XM, EXxmm } },
4118   },
4119
4120   /* PREFIX_0F38CD */
4121   {
4122     { "sha256msg2", { XM, EXxmm } },
4123   },
4124
4125   /* PREFIX_0F38DB */
4126   {
4127     { Bad_Opcode },
4128     { Bad_Opcode },
4129     { "aesimc", { XM, EXx } },
4130   },
4131
4132   /* PREFIX_0F38DC */
4133   {
4134     { Bad_Opcode },
4135     { Bad_Opcode },
4136     { "aesenc", { XM, EXx } },
4137   },
4138
4139   /* PREFIX_0F38DD */
4140   {
4141     { Bad_Opcode },
4142     { Bad_Opcode },
4143     { "aesenclast", { XM, EXx } },
4144   },
4145
4146   /* PREFIX_0F38DE */
4147   {
4148     { Bad_Opcode },
4149     { Bad_Opcode },
4150     { "aesdec", { XM, EXx } },
4151   },
4152
4153   /* PREFIX_0F38DF */
4154   {
4155     { Bad_Opcode },
4156     { Bad_Opcode },
4157     { "aesdeclast", { XM, EXx } },
4158   },
4159
4160   /* PREFIX_0F38F0 */
4161   {
4162     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4163     { Bad_Opcode },
4164     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } } },
4165     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } } },
4166   },
4167
4168   /* PREFIX_0F38F1 */
4169   {
4170     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4171     { Bad_Opcode },
4172     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv } },
4173     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } } },
4174   },
4175
4176   /* PREFIX_0F38F6 */
4177   {
4178     { Bad_Opcode },
4179     { "adoxS",  { Gdq, Edq} },
4180     { "adcxS",  { Gdq, Edq} },
4181     { Bad_Opcode },
4182   },
4183
4184   /* PREFIX_0F3A08 */
4185   {
4186     { Bad_Opcode },
4187     { Bad_Opcode },
4188     { "roundps", { XM, EXx, Ib } },
4189   },
4190
4191   /* PREFIX_0F3A09 */
4192   {
4193     { Bad_Opcode },
4194     { Bad_Opcode },
4195     { "roundpd", { XM, EXx, Ib } },
4196   },
4197
4198   /* PREFIX_0F3A0A */
4199   {
4200     { Bad_Opcode },
4201     { Bad_Opcode },
4202     { "roundss", { XM, EXd, Ib } },
4203   },
4204
4205   /* PREFIX_0F3A0B */
4206   {
4207     { Bad_Opcode },
4208     { Bad_Opcode },
4209     { "roundsd", { XM, EXq, Ib } },
4210   },
4211
4212   /* PREFIX_0F3A0C */
4213   {
4214     { Bad_Opcode },
4215     { Bad_Opcode },
4216     { "blendps", { XM, EXx, Ib } },
4217   },
4218
4219   /* PREFIX_0F3A0D */
4220   {
4221     { Bad_Opcode },
4222     { Bad_Opcode },
4223     { "blendpd", { XM, EXx, Ib } },
4224   },
4225
4226   /* PREFIX_0F3A0E */
4227   {
4228     { Bad_Opcode },
4229     { Bad_Opcode },
4230     { "pblendw", { XM, EXx, Ib } },
4231   },
4232
4233   /* PREFIX_0F3A14 */
4234   {
4235     { Bad_Opcode },
4236     { Bad_Opcode },
4237     { "pextrb", { Edqb, XM, Ib } },
4238   },
4239
4240   /* PREFIX_0F3A15 */
4241   {
4242     { Bad_Opcode },
4243     { Bad_Opcode },
4244     { "pextrw", { Edqw, XM, Ib } },
4245   },
4246
4247   /* PREFIX_0F3A16 */
4248   {
4249     { Bad_Opcode },
4250     { Bad_Opcode },
4251     { "pextrK", { Edq, XM, Ib } },
4252   },
4253
4254   /* PREFIX_0F3A17 */
4255   {
4256     { Bad_Opcode },
4257     { Bad_Opcode },
4258     { "extractps", { Edqd, XM, Ib } },
4259   },
4260
4261   /* PREFIX_0F3A20 */
4262   {
4263     { Bad_Opcode },
4264     { Bad_Opcode },
4265     { "pinsrb", { XM, Edqb, Ib } },
4266   },
4267
4268   /* PREFIX_0F3A21 */
4269   {
4270     { Bad_Opcode },
4271     { Bad_Opcode },
4272     { "insertps", { XM, EXd, Ib } },
4273   },
4274
4275   /* PREFIX_0F3A22 */
4276   {
4277     { Bad_Opcode },
4278     { Bad_Opcode },
4279     { "pinsrK", { XM, Edq, Ib } },
4280   },
4281
4282   /* PREFIX_0F3A40 */
4283   {
4284     { Bad_Opcode },
4285     { Bad_Opcode },
4286     { "dpps",   { XM, EXx, Ib } },
4287   },
4288
4289   /* PREFIX_0F3A41 */
4290   {
4291     { Bad_Opcode },
4292     { Bad_Opcode },
4293     { "dppd",   { XM, EXx, Ib } },
4294   },
4295
4296   /* PREFIX_0F3A42 */
4297   {
4298     { Bad_Opcode },
4299     { Bad_Opcode },
4300     { "mpsadbw", { XM, EXx, Ib } },
4301   },
4302
4303   /* PREFIX_0F3A44 */
4304   {
4305     { Bad_Opcode },
4306     { Bad_Opcode },
4307     { "pclmulqdq", { XM, EXx, PCLMUL } },
4308   },
4309
4310   /* PREFIX_0F3A60 */
4311   {
4312     { Bad_Opcode },
4313     { Bad_Opcode },
4314     { "pcmpestrm", { XM, EXx, Ib } },
4315   },
4316
4317   /* PREFIX_0F3A61 */
4318   {
4319     { Bad_Opcode },
4320     { Bad_Opcode },
4321     { "pcmpestri", { XM, EXx, Ib } },
4322   },
4323
4324   /* PREFIX_0F3A62 */
4325   {
4326     { Bad_Opcode },
4327     { Bad_Opcode },
4328     { "pcmpistrm", { XM, EXx, Ib } },
4329   },
4330
4331   /* PREFIX_0F3A63 */
4332   {
4333     { Bad_Opcode },
4334     { Bad_Opcode },
4335     { "pcmpistri", { XM, EXx, Ib } },
4336   },
4337
4338   /* PREFIX_0F3ACC */
4339   {
4340     { "sha1rnds4", { XM, EXxmm, Ib } },
4341   },
4342
4343   /* PREFIX_0F3ADF */
4344   {
4345     { Bad_Opcode },
4346     { Bad_Opcode },
4347     { "aeskeygenassist", { XM, EXx, Ib } },
4348   },
4349
4350   /* PREFIX_VEX_0F10 */
4351   {
4352     { VEX_W_TABLE (VEX_W_0F10_P_0) },
4353     { VEX_LEN_TABLE (VEX_LEN_0F10_P_1) },
4354     { VEX_W_TABLE (VEX_W_0F10_P_2) },
4355     { VEX_LEN_TABLE (VEX_LEN_0F10_P_3) },
4356   },
4357
4358   /* PREFIX_VEX_0F11 */
4359   {
4360     { VEX_W_TABLE (VEX_W_0F11_P_0) },
4361     { VEX_LEN_TABLE (VEX_LEN_0F11_P_1) },
4362     { VEX_W_TABLE (VEX_W_0F11_P_2) },
4363     { VEX_LEN_TABLE (VEX_LEN_0F11_P_3) },
4364   },
4365
4366   /* PREFIX_VEX_0F12 */
4367   {
4368     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4369     { VEX_W_TABLE (VEX_W_0F12_P_1) },
4370     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4371     { VEX_W_TABLE (VEX_W_0F12_P_3) },
4372   },
4373
4374   /* PREFIX_VEX_0F16 */
4375   {
4376     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4377     { VEX_W_TABLE (VEX_W_0F16_P_1) },
4378     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4379   },
4380
4381   /* PREFIX_VEX_0F2A */
4382   {
4383     { Bad_Opcode },
4384     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4385     { Bad_Opcode },
4386     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4387   },
4388
4389   /* PREFIX_VEX_0F2C */
4390   {
4391     { Bad_Opcode },
4392     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4393     { Bad_Opcode },
4394     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4395   },
4396
4397   /* PREFIX_VEX_0F2D */
4398   {
4399     { Bad_Opcode },
4400     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4401     { Bad_Opcode },
4402     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4403   },
4404
4405   /* PREFIX_VEX_0F2E */
4406   {
4407     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_0) },
4408     { Bad_Opcode },
4409     { VEX_LEN_TABLE (VEX_LEN_0F2E_P_2) },
4410   },
4411
4412   /* PREFIX_VEX_0F2F */
4413   {
4414     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_0) },
4415     { Bad_Opcode },
4416     { VEX_LEN_TABLE (VEX_LEN_0F2F_P_2) },
4417   },
4418
4419   /* PREFIX_VEX_0F41 */
4420   {
4421     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4422   },
4423
4424   /* PREFIX_VEX_0F42 */
4425   {
4426     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4427   },
4428
4429   /* PREFIX_VEX_0F44 */
4430   {
4431     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4432   },
4433
4434   /* PREFIX_VEX_0F45 */
4435   {
4436     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4437   },
4438
4439   /* PREFIX_VEX_0F46 */
4440   {
4441     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4442   },
4443
4444   /* PREFIX_VEX_0F47 */
4445   {
4446     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4447   },
4448
4449   /* PREFIX_VEX_0F4B */
4450   {
4451     { Bad_Opcode },
4452     { Bad_Opcode },
4453     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4454   },
4455
4456   /* PREFIX_VEX_0F51 */
4457   {
4458     { VEX_W_TABLE (VEX_W_0F51_P_0) },
4459     { VEX_LEN_TABLE (VEX_LEN_0F51_P_1) },
4460     { VEX_W_TABLE (VEX_W_0F51_P_2) },
4461     { VEX_LEN_TABLE (VEX_LEN_0F51_P_3) },
4462   },
4463
4464   /* PREFIX_VEX_0F52 */
4465   {
4466     { VEX_W_TABLE (VEX_W_0F52_P_0) },
4467     { VEX_LEN_TABLE (VEX_LEN_0F52_P_1) },
4468   },
4469
4470   /* PREFIX_VEX_0F53 */
4471   {
4472     { VEX_W_TABLE (VEX_W_0F53_P_0) },
4473     { VEX_LEN_TABLE (VEX_LEN_0F53_P_1) },
4474   },
4475
4476   /* PREFIX_VEX_0F58 */
4477   {
4478     { VEX_W_TABLE (VEX_W_0F58_P_0) },
4479     { VEX_LEN_TABLE (VEX_LEN_0F58_P_1) },
4480     { VEX_W_TABLE (VEX_W_0F58_P_2) },
4481     { VEX_LEN_TABLE (VEX_LEN_0F58_P_3) },
4482   },
4483
4484   /* PREFIX_VEX_0F59 */
4485   {
4486     { VEX_W_TABLE (VEX_W_0F59_P_0) },
4487     { VEX_LEN_TABLE (VEX_LEN_0F59_P_1) },
4488     { VEX_W_TABLE (VEX_W_0F59_P_2) },
4489     { VEX_LEN_TABLE (VEX_LEN_0F59_P_3) },
4490   },
4491
4492   /* PREFIX_VEX_0F5A */
4493   {
4494     { VEX_W_TABLE (VEX_W_0F5A_P_0) },
4495     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_1) },
4496     { "vcvtpd2ps%XY", { XMM, EXx } },
4497     { VEX_LEN_TABLE (VEX_LEN_0F5A_P_3) },
4498   },
4499
4500   /* PREFIX_VEX_0F5B */
4501   {
4502     { VEX_W_TABLE (VEX_W_0F5B_P_0) },
4503     { VEX_W_TABLE (VEX_W_0F5B_P_1) },
4504     { VEX_W_TABLE (VEX_W_0F5B_P_2) },
4505   },
4506
4507   /* PREFIX_VEX_0F5C */
4508   {
4509     { VEX_W_TABLE (VEX_W_0F5C_P_0) },
4510     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_1) },
4511     { VEX_W_TABLE (VEX_W_0F5C_P_2) },
4512     { VEX_LEN_TABLE (VEX_LEN_0F5C_P_3) },
4513   },
4514
4515   /* PREFIX_VEX_0F5D */
4516   {
4517     { VEX_W_TABLE (VEX_W_0F5D_P_0) },
4518     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_1) },
4519     { VEX_W_TABLE (VEX_W_0F5D_P_2) },
4520     { VEX_LEN_TABLE (VEX_LEN_0F5D_P_3) },
4521   },
4522
4523   /* PREFIX_VEX_0F5E */
4524   {
4525     { VEX_W_TABLE (VEX_W_0F5E_P_0) },
4526     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_1) },
4527     { VEX_W_TABLE (VEX_W_0F5E_P_2) },
4528     { VEX_LEN_TABLE (VEX_LEN_0F5E_P_3) },
4529   },
4530
4531   /* PREFIX_VEX_0F5F */
4532   {
4533     { VEX_W_TABLE (VEX_W_0F5F_P_0) },
4534     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_1) },
4535     { VEX_W_TABLE (VEX_W_0F5F_P_2) },
4536     { VEX_LEN_TABLE (VEX_LEN_0F5F_P_3) },
4537   },
4538
4539   /* PREFIX_VEX_0F60 */
4540   {
4541     { Bad_Opcode },
4542     { Bad_Opcode },
4543     { VEX_W_TABLE (VEX_W_0F60_P_2) },
4544   },
4545
4546   /* PREFIX_VEX_0F61 */
4547   {
4548     { Bad_Opcode },
4549     { Bad_Opcode },
4550     { VEX_W_TABLE (VEX_W_0F61_P_2) },
4551   },
4552
4553   /* PREFIX_VEX_0F62 */
4554   {
4555     { Bad_Opcode },
4556     { Bad_Opcode },
4557     { VEX_W_TABLE (VEX_W_0F62_P_2) },
4558   },
4559
4560   /* PREFIX_VEX_0F63 */
4561   {
4562     { Bad_Opcode },
4563     { Bad_Opcode },
4564     { VEX_W_TABLE (VEX_W_0F63_P_2) },
4565   },
4566
4567   /* PREFIX_VEX_0F64 */
4568   {
4569     { Bad_Opcode },
4570     { Bad_Opcode },
4571     { VEX_W_TABLE (VEX_W_0F64_P_2) },
4572   },
4573
4574   /* PREFIX_VEX_0F65 */
4575   {
4576     { Bad_Opcode },
4577     { Bad_Opcode },
4578     { VEX_W_TABLE (VEX_W_0F65_P_2) },
4579   },
4580
4581   /* PREFIX_VEX_0F66 */
4582   {
4583     { Bad_Opcode },
4584     { Bad_Opcode },
4585     { VEX_W_TABLE (VEX_W_0F66_P_2) },
4586   },
4587
4588   /* PREFIX_VEX_0F67 */
4589   {
4590     { Bad_Opcode },
4591     { Bad_Opcode },
4592     { VEX_W_TABLE (VEX_W_0F67_P_2) },
4593   },
4594
4595   /* PREFIX_VEX_0F68 */
4596   {
4597     { Bad_Opcode },
4598     { Bad_Opcode },
4599     { VEX_W_TABLE (VEX_W_0F68_P_2) },
4600   },
4601
4602   /* PREFIX_VEX_0F69 */
4603   {
4604     { Bad_Opcode },
4605     { Bad_Opcode },
4606     { VEX_W_TABLE (VEX_W_0F69_P_2) },
4607   },
4608
4609   /* PREFIX_VEX_0F6A */
4610   {
4611     { Bad_Opcode },
4612     { Bad_Opcode },
4613     { VEX_W_TABLE (VEX_W_0F6A_P_2) },
4614   },
4615
4616   /* PREFIX_VEX_0F6B */
4617   {
4618     { Bad_Opcode },
4619     { Bad_Opcode },
4620     { VEX_W_TABLE (VEX_W_0F6B_P_2) },
4621   },
4622
4623   /* PREFIX_VEX_0F6C */
4624   {
4625     { Bad_Opcode },
4626     { Bad_Opcode },
4627     { VEX_W_TABLE (VEX_W_0F6C_P_2) },
4628   },
4629
4630   /* PREFIX_VEX_0F6D */
4631   {
4632     { Bad_Opcode },
4633     { Bad_Opcode },
4634     { VEX_W_TABLE (VEX_W_0F6D_P_2) },
4635   },
4636
4637   /* PREFIX_VEX_0F6E */
4638   {
4639     { Bad_Opcode },
4640     { Bad_Opcode },
4641     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4642   },
4643
4644   /* PREFIX_VEX_0F6F */
4645   {
4646     { Bad_Opcode },
4647     { VEX_W_TABLE (VEX_W_0F6F_P_1) },
4648     { VEX_W_TABLE (VEX_W_0F6F_P_2) },
4649   },
4650
4651   /* PREFIX_VEX_0F70 */
4652   {
4653     { Bad_Opcode },
4654     { VEX_W_TABLE (VEX_W_0F70_P_1) },
4655     { VEX_W_TABLE (VEX_W_0F70_P_2) },
4656     { VEX_W_TABLE (VEX_W_0F70_P_3) },
4657   },
4658
4659   /* PREFIX_VEX_0F71_REG_2 */
4660   {
4661     { Bad_Opcode },
4662     { Bad_Opcode },
4663     { VEX_W_TABLE (VEX_W_0F71_R_2_P_2) },
4664   },
4665
4666   /* PREFIX_VEX_0F71_REG_4 */
4667   {
4668     { Bad_Opcode },
4669     { Bad_Opcode },
4670     { VEX_W_TABLE (VEX_W_0F71_R_4_P_2) },
4671   },
4672
4673   /* PREFIX_VEX_0F71_REG_6 */
4674   {
4675     { Bad_Opcode },
4676     { Bad_Opcode },
4677     { VEX_W_TABLE (VEX_W_0F71_R_6_P_2) },
4678   },
4679
4680   /* PREFIX_VEX_0F72_REG_2 */
4681   {
4682     { Bad_Opcode },
4683     { Bad_Opcode },
4684     { VEX_W_TABLE (VEX_W_0F72_R_2_P_2) },
4685   },
4686
4687   /* PREFIX_VEX_0F72_REG_4 */
4688   {
4689     { Bad_Opcode },
4690     { Bad_Opcode },
4691     { VEX_W_TABLE (VEX_W_0F72_R_4_P_2) },
4692   },
4693
4694   /* PREFIX_VEX_0F72_REG_6 */
4695   {
4696     { Bad_Opcode },
4697     { Bad_Opcode },
4698     { VEX_W_TABLE (VEX_W_0F72_R_6_P_2) },
4699   },
4700
4701   /* PREFIX_VEX_0F73_REG_2 */
4702   {
4703     { Bad_Opcode },
4704     { Bad_Opcode },
4705     { VEX_W_TABLE (VEX_W_0F73_R_2_P_2) },
4706   },
4707
4708   /* PREFIX_VEX_0F73_REG_3 */
4709   {
4710     { Bad_Opcode },
4711     { Bad_Opcode },
4712     { VEX_W_TABLE (VEX_W_0F73_R_3_P_2) },
4713   },
4714
4715   /* PREFIX_VEX_0F73_REG_6 */
4716   {
4717     { Bad_Opcode },
4718     { Bad_Opcode },
4719     { VEX_W_TABLE (VEX_W_0F73_R_6_P_2) },
4720   },
4721
4722   /* PREFIX_VEX_0F73_REG_7 */
4723   {
4724     { Bad_Opcode },
4725     { Bad_Opcode },
4726     { VEX_W_TABLE (VEX_W_0F73_R_7_P_2) },
4727   },
4728
4729   /* PREFIX_VEX_0F74 */
4730   {
4731     { Bad_Opcode },
4732     { Bad_Opcode },
4733     { VEX_W_TABLE (VEX_W_0F74_P_2) },
4734   },
4735
4736   /* PREFIX_VEX_0F75 */
4737   {
4738     { Bad_Opcode },
4739     { Bad_Opcode },
4740     { VEX_W_TABLE (VEX_W_0F75_P_2) },
4741   },
4742
4743   /* PREFIX_VEX_0F76 */
4744   {
4745     { Bad_Opcode },
4746     { Bad_Opcode },
4747     { VEX_W_TABLE (VEX_W_0F76_P_2) },
4748   },
4749
4750   /* PREFIX_VEX_0F77 */
4751   {
4752     { VEX_W_TABLE (VEX_W_0F77_P_0) },
4753   },
4754
4755   /* PREFIX_VEX_0F7C */
4756   {
4757     { Bad_Opcode },
4758     { Bad_Opcode },
4759     { VEX_W_TABLE (VEX_W_0F7C_P_2) },
4760     { VEX_W_TABLE (VEX_W_0F7C_P_3) },
4761   },
4762
4763   /* PREFIX_VEX_0F7D */
4764   {
4765     { Bad_Opcode },
4766     { Bad_Opcode },
4767     { VEX_W_TABLE (VEX_W_0F7D_P_2) },
4768     { VEX_W_TABLE (VEX_W_0F7D_P_3) },
4769   },
4770
4771   /* PREFIX_VEX_0F7E */
4772   {
4773     { Bad_Opcode },
4774     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
4775     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
4776   },
4777
4778   /* PREFIX_VEX_0F7F */
4779   {
4780     { Bad_Opcode },
4781     { VEX_W_TABLE (VEX_W_0F7F_P_1) },
4782     { VEX_W_TABLE (VEX_W_0F7F_P_2) },
4783   },
4784
4785   /* PREFIX_VEX_0F90 */
4786   {
4787     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
4788   },
4789
4790   /* PREFIX_VEX_0F91 */
4791   {
4792     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
4793   },
4794
4795   /* PREFIX_VEX_0F92 */
4796   {
4797     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
4798   },
4799
4800   /* PREFIX_VEX_0F93 */
4801   {
4802     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
4803   },
4804
4805   /* PREFIX_VEX_0F98 */
4806   {
4807     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
4808   },
4809
4810   /* PREFIX_VEX_0FC2 */
4811   {
4812     { VEX_W_TABLE (VEX_W_0FC2_P_0) },
4813     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_1) },
4814     { VEX_W_TABLE (VEX_W_0FC2_P_2) },
4815     { VEX_LEN_TABLE (VEX_LEN_0FC2_P_3) },
4816   },
4817
4818   /* PREFIX_VEX_0FC4 */
4819   {
4820     { Bad_Opcode },
4821     { Bad_Opcode },
4822     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
4823   },
4824
4825   /* PREFIX_VEX_0FC5 */
4826   {
4827     { Bad_Opcode },
4828     { Bad_Opcode },
4829     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
4830   },
4831
4832   /* PREFIX_VEX_0FD0 */
4833   {
4834     { Bad_Opcode },
4835     { Bad_Opcode },
4836     { VEX_W_TABLE (VEX_W_0FD0_P_2) },
4837     { VEX_W_TABLE (VEX_W_0FD0_P_3) },
4838   },
4839
4840   /* PREFIX_VEX_0FD1 */
4841   {
4842     { Bad_Opcode },
4843     { Bad_Opcode },
4844     { VEX_W_TABLE (VEX_W_0FD1_P_2) },
4845   },
4846
4847   /* PREFIX_VEX_0FD2 */
4848   {
4849     { Bad_Opcode },
4850     { Bad_Opcode },
4851     { VEX_W_TABLE (VEX_W_0FD2_P_2) },
4852   },
4853
4854   /* PREFIX_VEX_0FD3 */
4855   {
4856     { Bad_Opcode },
4857     { Bad_Opcode },
4858     { VEX_W_TABLE (VEX_W_0FD3_P_2) },
4859   },
4860
4861   /* PREFIX_VEX_0FD4 */
4862   {
4863     { Bad_Opcode },
4864     { Bad_Opcode },
4865     { VEX_W_TABLE (VEX_W_0FD4_P_2) },
4866   },
4867
4868   /* PREFIX_VEX_0FD5 */
4869   {
4870     { Bad_Opcode },
4871     { Bad_Opcode },
4872     { VEX_W_TABLE (VEX_W_0FD5_P_2) },
4873   },
4874
4875   /* PREFIX_VEX_0FD6 */
4876   {
4877     { Bad_Opcode },
4878     { Bad_Opcode },
4879     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
4880   },
4881
4882   /* PREFIX_VEX_0FD7 */
4883   {
4884     { Bad_Opcode },
4885     { Bad_Opcode },
4886     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
4887   },
4888
4889   /* PREFIX_VEX_0FD8 */
4890   {
4891     { Bad_Opcode },
4892     { Bad_Opcode },
4893     { VEX_W_TABLE (VEX_W_0FD8_P_2) },
4894   },
4895
4896   /* PREFIX_VEX_0FD9 */
4897   {
4898     { Bad_Opcode },
4899     { Bad_Opcode },
4900     { VEX_W_TABLE (VEX_W_0FD9_P_2) },
4901   },
4902
4903   /* PREFIX_VEX_0FDA */
4904   {
4905     { Bad_Opcode },
4906     { Bad_Opcode },
4907     { VEX_W_TABLE (VEX_W_0FDA_P_2) },
4908   },
4909
4910   /* PREFIX_VEX_0FDB */
4911   {
4912     { Bad_Opcode },
4913     { Bad_Opcode },
4914     { VEX_W_TABLE (VEX_W_0FDB_P_2) },
4915   },
4916
4917   /* PREFIX_VEX_0FDC */
4918   {
4919     { Bad_Opcode },
4920     { Bad_Opcode },
4921     { VEX_W_TABLE (VEX_W_0FDC_P_2) },
4922   },
4923
4924   /* PREFIX_VEX_0FDD */
4925   {
4926     { Bad_Opcode },
4927     { Bad_Opcode },
4928     { VEX_W_TABLE (VEX_W_0FDD_P_2) },
4929   },
4930
4931   /* PREFIX_VEX_0FDE */
4932   {
4933     { Bad_Opcode },
4934     { Bad_Opcode },
4935     { VEX_W_TABLE (VEX_W_0FDE_P_2) },
4936   },
4937
4938   /* PREFIX_VEX_0FDF */
4939   {
4940     { Bad_Opcode },
4941     { Bad_Opcode },
4942     { VEX_W_TABLE (VEX_W_0FDF_P_2) },
4943   },
4944
4945   /* PREFIX_VEX_0FE0 */
4946   {
4947     { Bad_Opcode },
4948     { Bad_Opcode },
4949     { VEX_W_TABLE (VEX_W_0FE0_P_2) },
4950   },
4951
4952   /* PREFIX_VEX_0FE1 */
4953   {
4954     { Bad_Opcode },
4955     { Bad_Opcode },
4956     { VEX_W_TABLE (VEX_W_0FE1_P_2) },
4957   },
4958
4959   /* PREFIX_VEX_0FE2 */
4960   {
4961     { Bad_Opcode },
4962     { Bad_Opcode },
4963     { VEX_W_TABLE (VEX_W_0FE2_P_2) },
4964   },
4965
4966   /* PREFIX_VEX_0FE3 */
4967   {
4968     { Bad_Opcode },
4969     { Bad_Opcode },
4970     { VEX_W_TABLE (VEX_W_0FE3_P_2) },
4971   },
4972
4973   /* PREFIX_VEX_0FE4 */
4974   {
4975     { Bad_Opcode },
4976     { Bad_Opcode },
4977     { VEX_W_TABLE (VEX_W_0FE4_P_2) },
4978   },
4979
4980   /* PREFIX_VEX_0FE5 */
4981   {
4982     { Bad_Opcode },
4983     { Bad_Opcode },
4984     { VEX_W_TABLE (VEX_W_0FE5_P_2) },
4985   },
4986
4987   /* PREFIX_VEX_0FE6 */
4988   {
4989     { Bad_Opcode },
4990     { VEX_W_TABLE (VEX_W_0FE6_P_1) },
4991     { VEX_W_TABLE (VEX_W_0FE6_P_2) },
4992     { VEX_W_TABLE (VEX_W_0FE6_P_3) },
4993   },
4994
4995   /* PREFIX_VEX_0FE7 */
4996   {
4997     { Bad_Opcode },
4998     { Bad_Opcode },
4999     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5000   },
5001
5002   /* PREFIX_VEX_0FE8 */
5003   {
5004     { Bad_Opcode },
5005     { Bad_Opcode },
5006     { VEX_W_TABLE (VEX_W_0FE8_P_2) },
5007   },
5008
5009   /* PREFIX_VEX_0FE9 */
5010   {
5011     { Bad_Opcode },
5012     { Bad_Opcode },
5013     { VEX_W_TABLE (VEX_W_0FE9_P_2) },
5014   },
5015
5016   /* PREFIX_VEX_0FEA */
5017   {
5018     { Bad_Opcode },
5019     { Bad_Opcode },
5020     { VEX_W_TABLE (VEX_W_0FEA_P_2) },
5021   },
5022
5023   /* PREFIX_VEX_0FEB */
5024   {
5025     { Bad_Opcode },
5026     { Bad_Opcode },
5027     { VEX_W_TABLE (VEX_W_0FEB_P_2) },
5028   },
5029
5030   /* PREFIX_VEX_0FEC */
5031   {
5032     { Bad_Opcode },
5033     { Bad_Opcode },
5034     { VEX_W_TABLE (VEX_W_0FEC_P_2) },
5035   },
5036
5037   /* PREFIX_VEX_0FED */
5038   {
5039     { Bad_Opcode },
5040     { Bad_Opcode },
5041     { VEX_W_TABLE (VEX_W_0FED_P_2) },
5042   },
5043
5044   /* PREFIX_VEX_0FEE */
5045   {
5046     { Bad_Opcode },
5047     { Bad_Opcode },
5048     { VEX_W_TABLE (VEX_W_0FEE_P_2) },
5049   },
5050
5051   /* PREFIX_VEX_0FEF */
5052   {
5053     { Bad_Opcode },
5054     { Bad_Opcode },
5055     { VEX_W_TABLE (VEX_W_0FEF_P_2) },
5056   },
5057
5058   /* PREFIX_VEX_0FF0 */
5059   {
5060     { Bad_Opcode },
5061     { Bad_Opcode },
5062     { Bad_Opcode },
5063     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5064   },
5065
5066   /* PREFIX_VEX_0FF1 */
5067   {
5068     { Bad_Opcode },
5069     { Bad_Opcode },
5070     { VEX_W_TABLE (VEX_W_0FF1_P_2) },
5071   },
5072
5073   /* PREFIX_VEX_0FF2 */
5074   {
5075     { Bad_Opcode },
5076     { Bad_Opcode },
5077     { VEX_W_TABLE (VEX_W_0FF2_P_2) },
5078   },
5079
5080   /* PREFIX_VEX_0FF3 */
5081   {
5082     { Bad_Opcode },
5083     { Bad_Opcode },
5084     { VEX_W_TABLE (VEX_W_0FF3_P_2) },
5085   },
5086
5087   /* PREFIX_VEX_0FF4 */
5088   {
5089     { Bad_Opcode },
5090     { Bad_Opcode },
5091     { VEX_W_TABLE (VEX_W_0FF4_P_2) },
5092   },
5093
5094   /* PREFIX_VEX_0FF5 */
5095   {
5096     { Bad_Opcode },
5097     { Bad_Opcode },
5098     { VEX_W_TABLE (VEX_W_0FF5_P_2) },
5099   },
5100
5101   /* PREFIX_VEX_0FF6 */
5102   {
5103     { Bad_Opcode },
5104     { Bad_Opcode },
5105     { VEX_W_TABLE (VEX_W_0FF6_P_2) },
5106   },
5107
5108   /* PREFIX_VEX_0FF7 */
5109   {
5110     { Bad_Opcode },
5111     { Bad_Opcode },
5112     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5113   },
5114
5115   /* PREFIX_VEX_0FF8 */
5116   {
5117     { Bad_Opcode },
5118     { Bad_Opcode },
5119     { VEX_W_TABLE (VEX_W_0FF8_P_2) },
5120   },
5121
5122   /* PREFIX_VEX_0FF9 */
5123   {
5124     { Bad_Opcode },
5125     { Bad_Opcode },
5126     { VEX_W_TABLE (VEX_W_0FF9_P_2) },
5127   },
5128
5129   /* PREFIX_VEX_0FFA */
5130   {
5131     { Bad_Opcode },
5132     { Bad_Opcode },
5133     { VEX_W_TABLE (VEX_W_0FFA_P_2) },
5134   },
5135
5136   /* PREFIX_VEX_0FFB */
5137   {
5138     { Bad_Opcode },
5139     { Bad_Opcode },
5140     { VEX_W_TABLE (VEX_W_0FFB_P_2) },
5141   },
5142
5143   /* PREFIX_VEX_0FFC */
5144   {
5145     { Bad_Opcode },
5146     { Bad_Opcode },
5147     { VEX_W_TABLE (VEX_W_0FFC_P_2) },
5148   },
5149
5150   /* PREFIX_VEX_0FFD */
5151   {
5152     { Bad_Opcode },
5153     { Bad_Opcode },
5154     { VEX_W_TABLE (VEX_W_0FFD_P_2) },
5155   },
5156
5157   /* PREFIX_VEX_0FFE */
5158   {
5159     { Bad_Opcode },
5160     { Bad_Opcode },
5161     { VEX_W_TABLE (VEX_W_0FFE_P_2) },
5162   },
5163
5164   /* PREFIX_VEX_0F3800 */
5165   {
5166     { Bad_Opcode },
5167     { Bad_Opcode },
5168     { VEX_W_TABLE (VEX_W_0F3800_P_2) },
5169   },
5170
5171   /* PREFIX_VEX_0F3801 */
5172   {
5173     { Bad_Opcode },
5174     { Bad_Opcode },
5175     { VEX_W_TABLE (VEX_W_0F3801_P_2) },
5176   },
5177
5178   /* PREFIX_VEX_0F3802 */
5179   {
5180     { Bad_Opcode },
5181     { Bad_Opcode },
5182     { VEX_W_TABLE (VEX_W_0F3802_P_2) },
5183   },
5184
5185   /* PREFIX_VEX_0F3803 */
5186   {
5187     { Bad_Opcode },
5188     { Bad_Opcode },
5189     { VEX_W_TABLE (VEX_W_0F3803_P_2) },
5190   },
5191
5192   /* PREFIX_VEX_0F3804 */
5193   {
5194     { Bad_Opcode },
5195     { Bad_Opcode },
5196     { VEX_W_TABLE (VEX_W_0F3804_P_2) },
5197   },
5198
5199   /* PREFIX_VEX_0F3805 */
5200   {
5201     { Bad_Opcode },
5202     { Bad_Opcode },
5203     { VEX_W_TABLE (VEX_W_0F3805_P_2) },
5204   },
5205
5206   /* PREFIX_VEX_0F3806 */
5207   {
5208     { Bad_Opcode },
5209     { Bad_Opcode },
5210     { VEX_W_TABLE (VEX_W_0F3806_P_2) },
5211   },
5212
5213   /* PREFIX_VEX_0F3807 */
5214   {
5215     { Bad_Opcode },
5216     { Bad_Opcode },
5217     { VEX_W_TABLE (VEX_W_0F3807_P_2) },
5218   },
5219
5220   /* PREFIX_VEX_0F3808 */
5221   {
5222     { Bad_Opcode },
5223     { Bad_Opcode },
5224     { VEX_W_TABLE (VEX_W_0F3808_P_2) },
5225   },
5226
5227   /* PREFIX_VEX_0F3809 */
5228   {
5229     { Bad_Opcode },
5230     { Bad_Opcode },
5231     { VEX_W_TABLE (VEX_W_0F3809_P_2) },
5232   },
5233
5234   /* PREFIX_VEX_0F380A */
5235   {
5236     { Bad_Opcode },
5237     { Bad_Opcode },
5238     { VEX_W_TABLE (VEX_W_0F380A_P_2) },
5239   },
5240
5241   /* PREFIX_VEX_0F380B */
5242   {
5243     { Bad_Opcode },
5244     { Bad_Opcode },
5245     { VEX_W_TABLE (VEX_W_0F380B_P_2) },
5246   },
5247
5248   /* PREFIX_VEX_0F380C */
5249   {
5250     { Bad_Opcode },
5251     { Bad_Opcode },
5252     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5253   },
5254
5255   /* PREFIX_VEX_0F380D */
5256   {
5257     { Bad_Opcode },
5258     { Bad_Opcode },
5259     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5260   },
5261
5262   /* PREFIX_VEX_0F380E */
5263   {
5264     { Bad_Opcode },
5265     { Bad_Opcode },
5266     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5267   },
5268
5269   /* PREFIX_VEX_0F380F */
5270   {
5271     { Bad_Opcode },
5272     { Bad_Opcode },
5273     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5274   },
5275
5276   /* PREFIX_VEX_0F3813 */
5277   {
5278     { Bad_Opcode },
5279     { Bad_Opcode },
5280     { "vcvtph2ps", { XM, EXxmmq } },
5281   },
5282
5283   /* PREFIX_VEX_0F3816 */
5284   {
5285     { Bad_Opcode },
5286     { Bad_Opcode },
5287     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5288   },
5289
5290   /* PREFIX_VEX_0F3817 */
5291   {
5292     { Bad_Opcode },
5293     { Bad_Opcode },
5294     { VEX_W_TABLE (VEX_W_0F3817_P_2) },
5295   },
5296
5297   /* PREFIX_VEX_0F3818 */
5298   {
5299     { Bad_Opcode },
5300     { Bad_Opcode },
5301     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5302   },
5303
5304   /* PREFIX_VEX_0F3819 */
5305   {
5306     { Bad_Opcode },
5307     { Bad_Opcode },
5308     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5309   },
5310
5311   /* PREFIX_VEX_0F381A */
5312   {
5313     { Bad_Opcode },
5314     { Bad_Opcode },
5315     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5316   },
5317
5318   /* PREFIX_VEX_0F381C */
5319   {
5320     { Bad_Opcode },
5321     { Bad_Opcode },
5322     { VEX_W_TABLE (VEX_W_0F381C_P_2) },
5323   },
5324
5325   /* PREFIX_VEX_0F381D */
5326   {
5327     { Bad_Opcode },
5328     { Bad_Opcode },
5329     { VEX_W_TABLE (VEX_W_0F381D_P_2) },
5330   },
5331
5332   /* PREFIX_VEX_0F381E */
5333   {
5334     { Bad_Opcode },
5335     { Bad_Opcode },
5336     { VEX_W_TABLE (VEX_W_0F381E_P_2) },
5337   },
5338
5339   /* PREFIX_VEX_0F3820 */
5340   {
5341     { Bad_Opcode },
5342     { Bad_Opcode },
5343     { VEX_W_TABLE (VEX_W_0F3820_P_2) },
5344   },
5345
5346   /* PREFIX_VEX_0F3821 */
5347   {
5348     { Bad_Opcode },
5349     { Bad_Opcode },
5350     { VEX_W_TABLE (VEX_W_0F3821_P_2) },
5351   },
5352
5353   /* PREFIX_VEX_0F3822 */
5354   {
5355     { Bad_Opcode },
5356     { Bad_Opcode },
5357     { VEX_W_TABLE (VEX_W_0F3822_P_2) },
5358   },
5359
5360   /* PREFIX_VEX_0F3823 */
5361   {
5362     { Bad_Opcode },
5363     { Bad_Opcode },
5364     { VEX_W_TABLE (VEX_W_0F3823_P_2) },
5365   },
5366
5367   /* PREFIX_VEX_0F3824 */
5368   {
5369     { Bad_Opcode },
5370     { Bad_Opcode },
5371     { VEX_W_TABLE (VEX_W_0F3824_P_2) },
5372   },
5373
5374   /* PREFIX_VEX_0F3825 */
5375   {
5376     { Bad_Opcode },
5377     { Bad_Opcode },
5378     { VEX_W_TABLE (VEX_W_0F3825_P_2) },
5379   },
5380
5381   /* PREFIX_VEX_0F3828 */
5382   {
5383     { Bad_Opcode },
5384     { Bad_Opcode },
5385     { VEX_W_TABLE (VEX_W_0F3828_P_2) },
5386   },
5387
5388   /* PREFIX_VEX_0F3829 */
5389   {
5390     { Bad_Opcode },
5391     { Bad_Opcode },
5392     { VEX_W_TABLE (VEX_W_0F3829_P_2) },
5393   },
5394
5395   /* PREFIX_VEX_0F382A */
5396   {
5397     { Bad_Opcode },
5398     { Bad_Opcode },
5399     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5400   },
5401
5402   /* PREFIX_VEX_0F382B */
5403   {
5404     { Bad_Opcode },
5405     { Bad_Opcode },
5406     { VEX_W_TABLE (VEX_W_0F382B_P_2) },
5407   },
5408
5409   /* PREFIX_VEX_0F382C */
5410   {
5411     { Bad_Opcode },
5412     { Bad_Opcode },
5413      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5414   },
5415
5416   /* PREFIX_VEX_0F382D */
5417   {
5418     { Bad_Opcode },
5419     { Bad_Opcode },
5420      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5421   },
5422
5423   /* PREFIX_VEX_0F382E */
5424   {
5425     { Bad_Opcode },
5426     { Bad_Opcode },
5427      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5428   },
5429
5430   /* PREFIX_VEX_0F382F */
5431   {
5432     { Bad_Opcode },
5433     { Bad_Opcode },
5434      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5435   },
5436
5437   /* PREFIX_VEX_0F3830 */
5438   {
5439     { Bad_Opcode },
5440     { Bad_Opcode },
5441     { VEX_W_TABLE (VEX_W_0F3830_P_2) },
5442   },
5443
5444   /* PREFIX_VEX_0F3831 */
5445   {
5446     { Bad_Opcode },
5447     { Bad_Opcode },
5448     { VEX_W_TABLE (VEX_W_0F3831_P_2) },
5449   },
5450
5451   /* PREFIX_VEX_0F3832 */
5452   {
5453     { Bad_Opcode },
5454     { Bad_Opcode },
5455     { VEX_W_TABLE (VEX_W_0F3832_P_2) },
5456   },
5457
5458   /* PREFIX_VEX_0F3833 */
5459   {
5460     { Bad_Opcode },
5461     { Bad_Opcode },
5462     { VEX_W_TABLE (VEX_W_0F3833_P_2) },
5463   },
5464
5465   /* PREFIX_VEX_0F3834 */
5466   {
5467     { Bad_Opcode },
5468     { Bad_Opcode },
5469     { VEX_W_TABLE (VEX_W_0F3834_P_2) },
5470   },
5471
5472   /* PREFIX_VEX_0F3835 */
5473   {
5474     { Bad_Opcode },
5475     { Bad_Opcode },
5476     { VEX_W_TABLE (VEX_W_0F3835_P_2) },
5477   },
5478
5479   /* PREFIX_VEX_0F3836 */
5480   {
5481     { Bad_Opcode },
5482     { Bad_Opcode },
5483     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5484   },
5485
5486   /* PREFIX_VEX_0F3837 */
5487   {
5488     { Bad_Opcode },
5489     { Bad_Opcode },
5490     { VEX_W_TABLE (VEX_W_0F3837_P_2) },
5491   },
5492
5493   /* PREFIX_VEX_0F3838 */
5494   {
5495     { Bad_Opcode },
5496     { Bad_Opcode },
5497     { VEX_W_TABLE (VEX_W_0F3838_P_2) },
5498   },
5499
5500   /* PREFIX_VEX_0F3839 */
5501   {
5502     { Bad_Opcode },
5503     { Bad_Opcode },
5504     { VEX_W_TABLE (VEX_W_0F3839_P_2) },
5505   },
5506
5507   /* PREFIX_VEX_0F383A */
5508   {
5509     { Bad_Opcode },
5510     { Bad_Opcode },
5511     { VEX_W_TABLE (VEX_W_0F383A_P_2) },
5512   },
5513
5514   /* PREFIX_VEX_0F383B */
5515   {
5516     { Bad_Opcode },
5517     { Bad_Opcode },
5518     { VEX_W_TABLE (VEX_W_0F383B_P_2) },
5519   },
5520
5521   /* PREFIX_VEX_0F383C */
5522   {
5523     { Bad_Opcode },
5524     { Bad_Opcode },
5525     { VEX_W_TABLE (VEX_W_0F383C_P_2) },
5526   },
5527
5528   /* PREFIX_VEX_0F383D */
5529   {
5530     { Bad_Opcode },
5531     { Bad_Opcode },
5532     { VEX_W_TABLE (VEX_W_0F383D_P_2) },
5533   },
5534
5535   /* PREFIX_VEX_0F383E */
5536   {
5537     { Bad_Opcode },
5538     { Bad_Opcode },
5539     { VEX_W_TABLE (VEX_W_0F383E_P_2) },
5540   },
5541
5542   /* PREFIX_VEX_0F383F */
5543   {
5544     { Bad_Opcode },
5545     { Bad_Opcode },
5546     { VEX_W_TABLE (VEX_W_0F383F_P_2) },
5547   },
5548
5549   /* PREFIX_VEX_0F3840 */
5550   {
5551     { Bad_Opcode },
5552     { Bad_Opcode },
5553     { VEX_W_TABLE (VEX_W_0F3840_P_2) },
5554   },
5555
5556   /* PREFIX_VEX_0F3841 */
5557   {
5558     { Bad_Opcode },
5559     { Bad_Opcode },
5560     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5561   },
5562
5563   /* PREFIX_VEX_0F3845 */
5564   {
5565     { Bad_Opcode },
5566     { Bad_Opcode },
5567     { "vpsrlv%LW", { XM, Vex, EXx } },
5568   },
5569
5570   /* PREFIX_VEX_0F3846 */
5571   {
5572     { Bad_Opcode },
5573     { Bad_Opcode },
5574     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5575   },
5576
5577   /* PREFIX_VEX_0F3847 */
5578   {
5579     { Bad_Opcode },
5580     { Bad_Opcode },
5581     { "vpsllv%LW", { XM, Vex, EXx } },
5582   },
5583
5584   /* PREFIX_VEX_0F3858 */
5585   {
5586     { Bad_Opcode },
5587     { Bad_Opcode },
5588     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5589   },
5590
5591   /* PREFIX_VEX_0F3859 */
5592   {
5593     { Bad_Opcode },
5594     { Bad_Opcode },
5595     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5596   },
5597
5598   /* PREFIX_VEX_0F385A */
5599   {
5600     { Bad_Opcode },
5601     { Bad_Opcode },
5602     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5603   },
5604
5605   /* PREFIX_VEX_0F3878 */
5606   {
5607     { Bad_Opcode },
5608     { Bad_Opcode },
5609     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5610   },
5611
5612   /* PREFIX_VEX_0F3879 */
5613   {
5614     { Bad_Opcode },
5615     { Bad_Opcode },
5616     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5617   },
5618
5619   /* PREFIX_VEX_0F388C */
5620   {
5621     { Bad_Opcode },
5622     { Bad_Opcode },
5623     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5624   },
5625
5626   /* PREFIX_VEX_0F388E */
5627   {
5628     { Bad_Opcode },
5629     { Bad_Opcode },
5630     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5631   },
5632
5633   /* PREFIX_VEX_0F3890 */
5634   {
5635     { Bad_Opcode },
5636     { Bad_Opcode },
5637     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex } },
5638   },
5639
5640   /* PREFIX_VEX_0F3891 */
5641   {
5642     { Bad_Opcode },
5643     { Bad_Opcode },
5644     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
5645   },
5646
5647   /* PREFIX_VEX_0F3892 */
5648   {
5649     { Bad_Opcode },
5650     { Bad_Opcode },
5651     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex } },
5652   },
5653
5654   /* PREFIX_VEX_0F3893 */
5655   {
5656     { Bad_Opcode },
5657     { Bad_Opcode },
5658     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ } },
5659   },
5660
5661   /* PREFIX_VEX_0F3896 */
5662   {
5663     { Bad_Opcode },
5664     { Bad_Opcode },
5665     { "vfmaddsub132p%XW", { XM, Vex, EXx } },
5666   },
5667
5668   /* PREFIX_VEX_0F3897 */
5669   {
5670     { Bad_Opcode },
5671     { Bad_Opcode },
5672     { "vfmsubadd132p%XW", { XM, Vex, EXx } },
5673   },
5674
5675   /* PREFIX_VEX_0F3898 */
5676   {
5677     { Bad_Opcode },
5678     { Bad_Opcode },
5679     { "vfmadd132p%XW", { XM, Vex, EXx } },
5680   },
5681
5682   /* PREFIX_VEX_0F3899 */
5683   {
5684     { Bad_Opcode },
5685     { Bad_Opcode },
5686     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5687   },
5688
5689   /* PREFIX_VEX_0F389A */
5690   {
5691     { Bad_Opcode },
5692     { Bad_Opcode },
5693     { "vfmsub132p%XW", { XM, Vex, EXx } },
5694   },
5695
5696   /* PREFIX_VEX_0F389B */
5697   {
5698     { Bad_Opcode },
5699     { Bad_Opcode },
5700     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5701   },
5702
5703   /* PREFIX_VEX_0F389C */
5704   {
5705     { Bad_Opcode },
5706     { Bad_Opcode },
5707     { "vfnmadd132p%XW", { XM, Vex, EXx } },
5708   },
5709
5710   /* PREFIX_VEX_0F389D */
5711   {
5712     { Bad_Opcode },
5713     { Bad_Opcode },
5714     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5715   },
5716
5717   /* PREFIX_VEX_0F389E */
5718   {
5719     { Bad_Opcode },
5720     { Bad_Opcode },
5721     { "vfnmsub132p%XW", { XM, Vex, EXx } },
5722   },
5723
5724   /* PREFIX_VEX_0F389F */
5725   {
5726     { Bad_Opcode },
5727     { Bad_Opcode },
5728     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5729   },
5730
5731   /* PREFIX_VEX_0F38A6 */
5732   {
5733     { Bad_Opcode },
5734     { Bad_Opcode },
5735     { "vfmaddsub213p%XW", { XM, Vex, EXx } },
5736     { Bad_Opcode },
5737   },
5738
5739   /* PREFIX_VEX_0F38A7 */
5740   {
5741     { Bad_Opcode },
5742     { Bad_Opcode },
5743     { "vfmsubadd213p%XW", { XM, Vex, EXx } },
5744   },
5745
5746   /* PREFIX_VEX_0F38A8 */
5747   {
5748     { Bad_Opcode },
5749     { Bad_Opcode },
5750     { "vfmadd213p%XW", { XM, Vex, EXx } },
5751   },
5752
5753   /* PREFIX_VEX_0F38A9 */
5754   {
5755     { Bad_Opcode },
5756     { Bad_Opcode },
5757     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5758   },
5759
5760   /* PREFIX_VEX_0F38AA */
5761   {
5762     { Bad_Opcode },
5763     { Bad_Opcode },
5764     { "vfmsub213p%XW", { XM, Vex, EXx } },
5765   },
5766
5767   /* PREFIX_VEX_0F38AB */
5768   {
5769     { Bad_Opcode },
5770     { Bad_Opcode },
5771     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5772   },
5773
5774   /* PREFIX_VEX_0F38AC */
5775   {
5776     { Bad_Opcode },
5777     { Bad_Opcode },
5778     { "vfnmadd213p%XW", { XM, Vex, EXx } },
5779   },
5780
5781   /* PREFIX_VEX_0F38AD */
5782   {
5783     { Bad_Opcode },
5784     { Bad_Opcode },
5785     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5786   },
5787
5788   /* PREFIX_VEX_0F38AE */
5789   {
5790     { Bad_Opcode },
5791     { Bad_Opcode },
5792     { "vfnmsub213p%XW", { XM, Vex, EXx } },
5793   },
5794
5795   /* PREFIX_VEX_0F38AF */
5796   {
5797     { Bad_Opcode },
5798     { Bad_Opcode },
5799     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5800   },
5801
5802   /* PREFIX_VEX_0F38B6 */
5803   {
5804     { Bad_Opcode },
5805     { Bad_Opcode },
5806     { "vfmaddsub231p%XW", { XM, Vex, EXx } },
5807   },
5808
5809   /* PREFIX_VEX_0F38B7 */
5810   {
5811     { Bad_Opcode },
5812     { Bad_Opcode },
5813     { "vfmsubadd231p%XW", { XM, Vex, EXx } },
5814   },
5815
5816   /* PREFIX_VEX_0F38B8 */
5817   {
5818     { Bad_Opcode },
5819     { Bad_Opcode },
5820     { "vfmadd231p%XW", { XM, Vex, EXx } },
5821   },
5822
5823   /* PREFIX_VEX_0F38B9 */
5824   {
5825     { Bad_Opcode },
5826     { Bad_Opcode },
5827     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5828   },
5829
5830   /* PREFIX_VEX_0F38BA */
5831   {
5832     { Bad_Opcode },
5833     { Bad_Opcode },
5834     { "vfmsub231p%XW", { XM, Vex, EXx } },
5835   },
5836
5837   /* PREFIX_VEX_0F38BB */
5838   {
5839     { Bad_Opcode },
5840     { Bad_Opcode },
5841     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5842   },
5843
5844   /* PREFIX_VEX_0F38BC */
5845   {
5846     { Bad_Opcode },
5847     { Bad_Opcode },
5848     { "vfnmadd231p%XW", { XM, Vex, EXx } },
5849   },
5850
5851   /* PREFIX_VEX_0F38BD */
5852   {
5853     { Bad_Opcode },
5854     { Bad_Opcode },
5855     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5856   },
5857
5858   /* PREFIX_VEX_0F38BE */
5859   {
5860     { Bad_Opcode },
5861     { Bad_Opcode },
5862     { "vfnmsub231p%XW", { XM, Vex, EXx } },
5863   },
5864
5865   /* PREFIX_VEX_0F38BF */
5866   {
5867     { Bad_Opcode },
5868     { Bad_Opcode },
5869     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar } },
5870   },
5871
5872   /* PREFIX_VEX_0F38DB */
5873   {
5874     { Bad_Opcode },
5875     { Bad_Opcode },
5876     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
5877   },
5878
5879   /* PREFIX_VEX_0F38DC */
5880   {
5881     { Bad_Opcode },
5882     { Bad_Opcode },
5883     { VEX_LEN_TABLE (VEX_LEN_0F38DC_P_2) },
5884   },
5885
5886   /* PREFIX_VEX_0F38DD */
5887   {
5888     { Bad_Opcode },
5889     { Bad_Opcode },
5890     { VEX_LEN_TABLE (VEX_LEN_0F38DD_P_2) },
5891   },
5892
5893   /* PREFIX_VEX_0F38DE */
5894   {
5895     { Bad_Opcode },
5896     { Bad_Opcode },
5897     { VEX_LEN_TABLE (VEX_LEN_0F38DE_P_2) },
5898   },
5899
5900   /* PREFIX_VEX_0F38DF */
5901   {
5902     { Bad_Opcode },
5903     { Bad_Opcode },
5904     { VEX_LEN_TABLE (VEX_LEN_0F38DF_P_2) },
5905   },
5906
5907   /* PREFIX_VEX_0F38F2 */
5908   {
5909     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
5910   },
5911
5912   /* PREFIX_VEX_0F38F3_REG_1 */
5913   {
5914     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
5915   },
5916
5917   /* PREFIX_VEX_0F38F3_REG_2 */
5918   {
5919     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
5920   },
5921
5922   /* PREFIX_VEX_0F38F3_REG_3 */
5923   {
5924     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
5925   },
5926
5927   /* PREFIX_VEX_0F38F5 */
5928   {
5929     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
5930     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
5931     { Bad_Opcode },
5932     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
5933   },
5934
5935   /* PREFIX_VEX_0F38F6 */
5936   {
5937     { Bad_Opcode },
5938     { Bad_Opcode },
5939     { Bad_Opcode },
5940     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
5941   },
5942
5943   /* PREFIX_VEX_0F38F7 */
5944   {
5945     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
5946     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
5947     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
5948     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
5949   },
5950
5951   /* PREFIX_VEX_0F3A00 */
5952   {
5953     { Bad_Opcode },
5954     { Bad_Opcode },
5955     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
5956   },
5957
5958   /* PREFIX_VEX_0F3A01 */
5959   {
5960     { Bad_Opcode },
5961     { Bad_Opcode },
5962     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
5963   },
5964
5965   /* PREFIX_VEX_0F3A02 */
5966   {
5967     { Bad_Opcode },
5968     { Bad_Opcode },
5969     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
5970   },
5971
5972   /* PREFIX_VEX_0F3A04 */
5973   {
5974     { Bad_Opcode },
5975     { Bad_Opcode },
5976     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
5977   },
5978
5979   /* PREFIX_VEX_0F3A05 */
5980   {
5981     { Bad_Opcode },
5982     { Bad_Opcode },
5983     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
5984   },
5985
5986   /* PREFIX_VEX_0F3A06 */
5987   {
5988     { Bad_Opcode },
5989     { Bad_Opcode },
5990     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
5991   },
5992
5993   /* PREFIX_VEX_0F3A08 */
5994   {
5995     { Bad_Opcode },
5996     { Bad_Opcode },
5997     { VEX_W_TABLE (VEX_W_0F3A08_P_2) },
5998   },
5999
6000   /* PREFIX_VEX_0F3A09 */
6001   {
6002     { Bad_Opcode },
6003     { Bad_Opcode },
6004     { VEX_W_TABLE (VEX_W_0F3A09_P_2) },
6005   },
6006
6007   /* PREFIX_VEX_0F3A0A */
6008   {
6009     { Bad_Opcode },
6010     { Bad_Opcode },
6011     { VEX_LEN_TABLE (VEX_LEN_0F3A0A_P_2) },
6012   },
6013
6014   /* PREFIX_VEX_0F3A0B */
6015   {
6016     { Bad_Opcode },
6017     { Bad_Opcode },
6018     { VEX_LEN_TABLE (VEX_LEN_0F3A0B_P_2) },
6019   },
6020
6021   /* PREFIX_VEX_0F3A0C */
6022   {
6023     { Bad_Opcode },
6024     { Bad_Opcode },
6025     { VEX_W_TABLE (VEX_W_0F3A0C_P_2) },
6026   },
6027
6028   /* PREFIX_VEX_0F3A0D */
6029   {
6030     { Bad_Opcode },
6031     { Bad_Opcode },
6032     { VEX_W_TABLE (VEX_W_0F3A0D_P_2) },
6033   },
6034
6035   /* PREFIX_VEX_0F3A0E */
6036   {
6037     { Bad_Opcode },
6038     { Bad_Opcode },
6039     { VEX_W_TABLE (VEX_W_0F3A0E_P_2) },
6040   },
6041
6042   /* PREFIX_VEX_0F3A0F */
6043   {
6044     { Bad_Opcode },
6045     { Bad_Opcode },
6046     { VEX_W_TABLE (VEX_W_0F3A0F_P_2) },
6047   },
6048
6049   /* PREFIX_VEX_0F3A14 */
6050   {
6051     { Bad_Opcode },
6052     { Bad_Opcode },
6053     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6054   },
6055
6056   /* PREFIX_VEX_0F3A15 */
6057   {
6058     { Bad_Opcode },
6059     { Bad_Opcode },
6060     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6061   },
6062
6063   /* PREFIX_VEX_0F3A16 */
6064   {
6065     { Bad_Opcode },
6066     { Bad_Opcode },
6067     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6068   },
6069
6070   /* PREFIX_VEX_0F3A17 */
6071   {
6072     { Bad_Opcode },
6073     { Bad_Opcode },
6074     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6075   },
6076
6077   /* PREFIX_VEX_0F3A18 */
6078   {
6079     { Bad_Opcode },
6080     { Bad_Opcode },
6081     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6082   },
6083
6084   /* PREFIX_VEX_0F3A19 */
6085   {
6086     { Bad_Opcode },
6087     { Bad_Opcode },
6088     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6089   },
6090
6091   /* PREFIX_VEX_0F3A1D */
6092   {
6093     { Bad_Opcode },
6094     { Bad_Opcode },
6095     { "vcvtps2ph", { EXxmmq, XM, Ib } },
6096   },
6097
6098   /* PREFIX_VEX_0F3A20 */
6099   {
6100     { Bad_Opcode },
6101     { Bad_Opcode },
6102     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6103   },
6104
6105   /* PREFIX_VEX_0F3A21 */
6106   {
6107     { Bad_Opcode },
6108     { Bad_Opcode },
6109     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6110   },
6111
6112   /* PREFIX_VEX_0F3A22 */
6113   {
6114     { Bad_Opcode },
6115     { Bad_Opcode },
6116     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6117   },
6118
6119   /* PREFIX_VEX_0F3A30 */
6120   {
6121     { Bad_Opcode },
6122     { Bad_Opcode },
6123     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6124   },
6125
6126   /* PREFIX_VEX_0F3A32 */
6127   {
6128     { Bad_Opcode },
6129     { Bad_Opcode },
6130     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6131   },
6132
6133   /* PREFIX_VEX_0F3A38 */
6134   {
6135     { Bad_Opcode },
6136     { Bad_Opcode },
6137     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6138   },
6139
6140   /* PREFIX_VEX_0F3A39 */
6141   {
6142     { Bad_Opcode },
6143     { Bad_Opcode },
6144     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6145   },
6146
6147   /* PREFIX_VEX_0F3A40 */
6148   {
6149     { Bad_Opcode },
6150     { Bad_Opcode },
6151     { VEX_W_TABLE (VEX_W_0F3A40_P_2) },
6152   },
6153
6154   /* PREFIX_VEX_0F3A41 */
6155   {
6156     { Bad_Opcode },
6157     { Bad_Opcode },
6158     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6159   },
6160
6161   /* PREFIX_VEX_0F3A42 */
6162   {
6163     { Bad_Opcode },
6164     { Bad_Opcode },
6165     { VEX_W_TABLE (VEX_W_0F3A42_P_2) },
6166   },
6167
6168   /* PREFIX_VEX_0F3A44 */
6169   {
6170     { Bad_Opcode },
6171     { Bad_Opcode },
6172     { VEX_LEN_TABLE (VEX_LEN_0F3A44_P_2) },
6173   },
6174
6175   /* PREFIX_VEX_0F3A46 */
6176   {
6177     { Bad_Opcode },
6178     { Bad_Opcode },
6179     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6180   },
6181
6182   /* PREFIX_VEX_0F3A48 */
6183   {
6184     { Bad_Opcode },
6185     { Bad_Opcode },
6186     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6187   },
6188
6189   /* PREFIX_VEX_0F3A49 */
6190   {
6191     { Bad_Opcode },
6192     { Bad_Opcode },
6193     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6194   },
6195
6196   /* PREFIX_VEX_0F3A4A */
6197   {
6198     { Bad_Opcode },
6199     { Bad_Opcode },
6200     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6201   },
6202
6203   /* PREFIX_VEX_0F3A4B */
6204   {
6205     { Bad_Opcode },
6206     { Bad_Opcode },
6207     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6208   },
6209
6210   /* PREFIX_VEX_0F3A4C */
6211   {
6212     { Bad_Opcode },
6213     { Bad_Opcode },
6214     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6215   },
6216
6217   /* PREFIX_VEX_0F3A5C */
6218   {
6219     { Bad_Opcode },
6220     { Bad_Opcode },
6221     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6222   },
6223
6224   /* PREFIX_VEX_0F3A5D */
6225   {
6226     { Bad_Opcode },
6227     { Bad_Opcode },
6228     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6229   },
6230
6231   /* PREFIX_VEX_0F3A5E */
6232   {
6233     { Bad_Opcode },
6234     { Bad_Opcode },
6235     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6236   },
6237
6238   /* PREFIX_VEX_0F3A5F */
6239   {
6240     { Bad_Opcode },
6241     { Bad_Opcode },
6242     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6243   },
6244
6245   /* PREFIX_VEX_0F3A60 */
6246   {
6247     { Bad_Opcode },
6248     { Bad_Opcode },
6249     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6250     { Bad_Opcode },
6251   },
6252
6253   /* PREFIX_VEX_0F3A61 */
6254   {
6255     { Bad_Opcode },
6256     { Bad_Opcode },
6257     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6258   },
6259
6260   /* PREFIX_VEX_0F3A62 */
6261   {
6262     { Bad_Opcode },
6263     { Bad_Opcode },
6264     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6265   },
6266
6267   /* PREFIX_VEX_0F3A63 */
6268   {
6269     { Bad_Opcode },
6270     { Bad_Opcode },
6271     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6272   },
6273
6274   /* PREFIX_VEX_0F3A68 */
6275   {
6276     { Bad_Opcode },
6277     { Bad_Opcode },
6278     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6279   },
6280
6281   /* PREFIX_VEX_0F3A69 */
6282   {
6283     { Bad_Opcode },
6284     { Bad_Opcode },
6285     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6286   },
6287
6288   /* PREFIX_VEX_0F3A6A */
6289   {
6290     { Bad_Opcode },
6291     { Bad_Opcode },
6292     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6293   },
6294
6295   /* PREFIX_VEX_0F3A6B */
6296   {
6297     { Bad_Opcode },
6298     { Bad_Opcode },
6299     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6300   },
6301
6302   /* PREFIX_VEX_0F3A6C */
6303   {
6304     { Bad_Opcode },
6305     { Bad_Opcode },
6306     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6307   },
6308
6309   /* PREFIX_VEX_0F3A6D */
6310   {
6311     { Bad_Opcode },
6312     { Bad_Opcode },
6313     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6314   },
6315
6316   /* PREFIX_VEX_0F3A6E */
6317   {
6318     { Bad_Opcode },
6319     { Bad_Opcode },
6320     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6321   },
6322
6323   /* PREFIX_VEX_0F3A6F */
6324   {
6325     { Bad_Opcode },
6326     { Bad_Opcode },
6327     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6328   },
6329
6330   /* PREFIX_VEX_0F3A78 */
6331   {
6332     { Bad_Opcode },
6333     { Bad_Opcode },
6334     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6335   },
6336
6337   /* PREFIX_VEX_0F3A79 */
6338   {
6339     { Bad_Opcode },
6340     { Bad_Opcode },
6341     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6342   },
6343
6344   /* PREFIX_VEX_0F3A7A */
6345   {
6346     { Bad_Opcode },
6347     { Bad_Opcode },
6348     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6349   },
6350
6351   /* PREFIX_VEX_0F3A7B */
6352   {
6353     { Bad_Opcode },
6354     { Bad_Opcode },
6355     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6356   },
6357
6358   /* PREFIX_VEX_0F3A7C */
6359   {
6360     { Bad_Opcode },
6361     { Bad_Opcode },
6362     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6363     { Bad_Opcode },
6364   },
6365
6366   /* PREFIX_VEX_0F3A7D */
6367   {
6368     { Bad_Opcode },
6369     { Bad_Opcode },
6370     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
6371   },
6372
6373   /* PREFIX_VEX_0F3A7E */
6374   {
6375     { Bad_Opcode },
6376     { Bad_Opcode },
6377     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6378   },
6379
6380   /* PREFIX_VEX_0F3A7F */
6381   {
6382     { Bad_Opcode },
6383     { Bad_Opcode },
6384     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6385   },
6386
6387   /* PREFIX_VEX_0F3ADF */
6388   {
6389     { Bad_Opcode },
6390     { Bad_Opcode },
6391     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6392   },
6393
6394   /* PREFIX_VEX_0F3AF0 */
6395   {
6396     { Bad_Opcode },
6397     { Bad_Opcode },
6398     { Bad_Opcode },
6399     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6400   },
6401
6402 #define NEED_PREFIX_TABLE
6403 #include "i386-dis-evex.h"
6404 #undef NEED_PREFIX_TABLE
6405 };
6406
6407 static const struct dis386 x86_64_table[][2] = {
6408   /* X86_64_06 */
6409   {
6410     { "pushP", { es } },
6411   },
6412
6413   /* X86_64_07 */
6414   {
6415     { "popP", { es } },
6416   },
6417
6418   /* X86_64_0D */
6419   {
6420     { "pushP", { cs } },
6421   },
6422
6423   /* X86_64_16 */
6424   {
6425     { "pushP", { ss } },
6426   },
6427
6428   /* X86_64_17 */
6429   {
6430     { "popP", { ss } },
6431   },
6432
6433   /* X86_64_1E */
6434   {
6435     { "pushP", { ds } },
6436   },
6437
6438   /* X86_64_1F */
6439   {
6440     { "popP", { ds } },
6441   },
6442
6443   /* X86_64_27 */
6444   {
6445     { "daa", { XX } },
6446   },
6447
6448   /* X86_64_2F */
6449   {
6450     { "das", { XX } },
6451   },
6452
6453   /* X86_64_37 */
6454   {
6455     { "aaa", { XX } },
6456   },
6457
6458   /* X86_64_3F */
6459   {
6460     { "aas", { XX } },
6461   },
6462
6463   /* X86_64_60 */
6464   {
6465     { "pushaP", { XX } },
6466   },
6467
6468   /* X86_64_61 */
6469   {
6470     { "popaP", { XX } },
6471   },
6472
6473   /* X86_64_62 */
6474   {
6475     { MOD_TABLE (MOD_62_32BIT) },
6476     { EVEX_TABLE (EVEX_0F) },
6477   },
6478
6479   /* X86_64_63 */
6480   {
6481     { "arpl", { Ew, Gw } },
6482     { "movs{lq|xd}", { Gv, Ed } },
6483   },
6484
6485   /* X86_64_6D */
6486   {
6487     { "ins{R|}", { Yzr, indirDX } },
6488     { "ins{G|}", { Yzr, indirDX } },
6489   },
6490
6491   /* X86_64_6F */
6492   {
6493     { "outs{R|}", { indirDXr, Xz } },
6494     { "outs{G|}", { indirDXr, Xz } },
6495   },
6496
6497   /* X86_64_9A */
6498   {
6499     { "Jcall{T|}", { Ap } },
6500   },
6501
6502   /* X86_64_C4 */
6503   {
6504     { MOD_TABLE (MOD_C4_32BIT) },
6505     { VEX_C4_TABLE (VEX_0F) },
6506   },
6507
6508   /* X86_64_C5 */
6509   {
6510     { MOD_TABLE (MOD_C5_32BIT) },
6511     { VEX_C5_TABLE (VEX_0F) },
6512   },
6513
6514   /* X86_64_CE */
6515   {
6516     { "into", { XX } },
6517   },
6518
6519   /* X86_64_D4 */
6520   {
6521     { "aam", { Ib } },
6522   },
6523
6524   /* X86_64_D5 */
6525   {
6526     { "aad", { Ib } },
6527   },
6528
6529   /* X86_64_EA */
6530   {
6531     { "Jjmp{T|}", { Ap } },
6532   },
6533
6534   /* X86_64_0F01_REG_0 */
6535   {
6536     { "sgdt{Q|IQ}", { M } },
6537     { "sgdt", { M } },
6538   },
6539
6540   /* X86_64_0F01_REG_1 */
6541   {
6542     { "sidt{Q|IQ}", { M } },
6543     { "sidt", { M } },
6544   },
6545
6546   /* X86_64_0F01_REG_2 */
6547   {
6548     { "lgdt{Q|Q}", { M } },
6549     { "lgdt", { M } },
6550   },
6551
6552   /* X86_64_0F01_REG_3 */
6553   {
6554     { "lidt{Q|Q}", { M } },
6555     { "lidt", { M } },
6556   },
6557 };
6558
6559 static const struct dis386 three_byte_table[][256] = {
6560
6561   /* THREE_BYTE_0F38 */
6562   {
6563     /* 00 */
6564     { "pshufb",         { MX, EM } },
6565     { "phaddw",         { MX, EM } },
6566     { "phaddd",         { MX, EM } },
6567     { "phaddsw",        { MX, EM } },
6568     { "pmaddubsw",      { MX, EM } },
6569     { "phsubw",         { MX, EM } },
6570     { "phsubd",         { MX, EM } },
6571     { "phsubsw",        { MX, EM } },
6572     /* 08 */
6573     { "psignb",         { MX, EM } },
6574     { "psignw",         { MX, EM } },
6575     { "psignd",         { MX, EM } },
6576     { "pmulhrsw",       { MX, EM } },
6577     { Bad_Opcode },
6578     { Bad_Opcode },
6579     { Bad_Opcode },
6580     { Bad_Opcode },
6581     /* 10 */
6582     { PREFIX_TABLE (PREFIX_0F3810) },
6583     { Bad_Opcode },
6584     { Bad_Opcode },
6585     { Bad_Opcode },
6586     { PREFIX_TABLE (PREFIX_0F3814) },
6587     { PREFIX_TABLE (PREFIX_0F3815) },
6588     { Bad_Opcode },
6589     { PREFIX_TABLE (PREFIX_0F3817) },
6590     /* 18 */
6591     { Bad_Opcode },
6592     { Bad_Opcode },
6593     { Bad_Opcode },
6594     { Bad_Opcode },
6595     { "pabsb",          { MX, EM } },
6596     { "pabsw",          { MX, EM } },
6597     { "pabsd",          { MX, EM } },
6598     { Bad_Opcode },
6599     /* 20 */
6600     { PREFIX_TABLE (PREFIX_0F3820) },
6601     { PREFIX_TABLE (PREFIX_0F3821) },
6602     { PREFIX_TABLE (PREFIX_0F3822) },
6603     { PREFIX_TABLE (PREFIX_0F3823) },
6604     { PREFIX_TABLE (PREFIX_0F3824) },
6605     { PREFIX_TABLE (PREFIX_0F3825) },
6606     { Bad_Opcode },
6607     { Bad_Opcode },
6608     /* 28 */
6609     { PREFIX_TABLE (PREFIX_0F3828) },
6610     { PREFIX_TABLE (PREFIX_0F3829) },
6611     { PREFIX_TABLE (PREFIX_0F382A) },
6612     { PREFIX_TABLE (PREFIX_0F382B) },
6613     { Bad_Opcode },
6614     { Bad_Opcode },
6615     { Bad_Opcode },
6616     { Bad_Opcode },
6617     /* 30 */
6618     { PREFIX_TABLE (PREFIX_0F3830) },
6619     { PREFIX_TABLE (PREFIX_0F3831) },
6620     { PREFIX_TABLE (PREFIX_0F3832) },
6621     { PREFIX_TABLE (PREFIX_0F3833) },
6622     { PREFIX_TABLE (PREFIX_0F3834) },
6623     { PREFIX_TABLE (PREFIX_0F3835) },
6624     { Bad_Opcode },
6625     { PREFIX_TABLE (PREFIX_0F3837) },
6626     /* 38 */
6627     { PREFIX_TABLE (PREFIX_0F3838) },
6628     { PREFIX_TABLE (PREFIX_0F3839) },
6629     { PREFIX_TABLE (PREFIX_0F383A) },
6630     { PREFIX_TABLE (PREFIX_0F383B) },
6631     { PREFIX_TABLE (PREFIX_0F383C) },
6632     { PREFIX_TABLE (PREFIX_0F383D) },
6633     { PREFIX_TABLE (PREFIX_0F383E) },
6634     { PREFIX_TABLE (PREFIX_0F383F) },
6635     /* 40 */
6636     { PREFIX_TABLE (PREFIX_0F3840) },
6637     { PREFIX_TABLE (PREFIX_0F3841) },
6638     { Bad_Opcode },
6639     { Bad_Opcode },
6640     { Bad_Opcode },
6641     { Bad_Opcode },
6642     { Bad_Opcode },
6643     { Bad_Opcode },
6644     /* 48 */
6645     { Bad_Opcode },
6646     { Bad_Opcode },
6647     { Bad_Opcode },
6648     { Bad_Opcode },
6649     { Bad_Opcode },
6650     { Bad_Opcode },
6651     { Bad_Opcode },
6652     { Bad_Opcode },
6653     /* 50 */
6654     { Bad_Opcode },
6655     { Bad_Opcode },
6656     { Bad_Opcode },
6657     { Bad_Opcode },
6658     { Bad_Opcode },
6659     { Bad_Opcode },
6660     { Bad_Opcode },
6661     { Bad_Opcode },
6662     /* 58 */
6663     { Bad_Opcode },
6664     { Bad_Opcode },
6665     { Bad_Opcode },
6666     { Bad_Opcode },
6667     { Bad_Opcode },
6668     { Bad_Opcode },
6669     { Bad_Opcode },
6670     { Bad_Opcode },
6671     /* 60 */
6672     { Bad_Opcode },
6673     { Bad_Opcode },
6674     { Bad_Opcode },
6675     { Bad_Opcode },
6676     { Bad_Opcode },
6677     { Bad_Opcode },
6678     { Bad_Opcode },
6679     { Bad_Opcode },
6680     /* 68 */
6681     { Bad_Opcode },
6682     { Bad_Opcode },
6683     { Bad_Opcode },
6684     { Bad_Opcode },
6685     { Bad_Opcode },
6686     { Bad_Opcode },
6687     { Bad_Opcode },
6688     { Bad_Opcode },
6689     /* 70 */
6690     { Bad_Opcode },
6691     { Bad_Opcode },
6692     { Bad_Opcode },
6693     { Bad_Opcode },
6694     { Bad_Opcode },
6695     { Bad_Opcode },
6696     { Bad_Opcode },
6697     { Bad_Opcode },
6698     /* 78 */
6699     { Bad_Opcode },
6700     { Bad_Opcode },
6701     { Bad_Opcode },
6702     { Bad_Opcode },
6703     { Bad_Opcode },
6704     { Bad_Opcode },
6705     { Bad_Opcode },
6706     { Bad_Opcode },
6707     /* 80 */
6708     { PREFIX_TABLE (PREFIX_0F3880) },
6709     { PREFIX_TABLE (PREFIX_0F3881) },
6710     { PREFIX_TABLE (PREFIX_0F3882) },
6711     { Bad_Opcode },
6712     { Bad_Opcode },
6713     { Bad_Opcode },
6714     { Bad_Opcode },
6715     { Bad_Opcode },
6716     /* 88 */
6717     { Bad_Opcode },
6718     { Bad_Opcode },
6719     { Bad_Opcode },
6720     { Bad_Opcode },
6721     { Bad_Opcode },
6722     { Bad_Opcode },
6723     { Bad_Opcode },
6724     { Bad_Opcode },
6725     /* 90 */
6726     { Bad_Opcode },
6727     { Bad_Opcode },
6728     { Bad_Opcode },
6729     { Bad_Opcode },
6730     { Bad_Opcode },
6731     { Bad_Opcode },
6732     { Bad_Opcode },
6733     { Bad_Opcode },
6734     /* 98 */
6735     { Bad_Opcode },
6736     { Bad_Opcode },
6737     { Bad_Opcode },
6738     { Bad_Opcode },
6739     { Bad_Opcode },
6740     { Bad_Opcode },
6741     { Bad_Opcode },
6742     { Bad_Opcode },
6743     /* a0 */
6744     { Bad_Opcode },
6745     { Bad_Opcode },
6746     { Bad_Opcode },
6747     { Bad_Opcode },
6748     { Bad_Opcode },
6749     { Bad_Opcode },
6750     { Bad_Opcode },
6751     { Bad_Opcode },
6752     /* a8 */
6753     { Bad_Opcode },
6754     { Bad_Opcode },
6755     { Bad_Opcode },
6756     { Bad_Opcode },
6757     { Bad_Opcode },
6758     { Bad_Opcode },
6759     { Bad_Opcode },
6760     { Bad_Opcode },
6761     /* b0 */
6762     { Bad_Opcode },
6763     { Bad_Opcode },
6764     { Bad_Opcode },
6765     { Bad_Opcode },
6766     { Bad_Opcode },
6767     { Bad_Opcode },
6768     { Bad_Opcode },
6769     { Bad_Opcode },
6770     /* b8 */
6771     { Bad_Opcode },
6772     { Bad_Opcode },
6773     { Bad_Opcode },
6774     { Bad_Opcode },
6775     { Bad_Opcode },
6776     { Bad_Opcode },
6777     { Bad_Opcode },
6778     { Bad_Opcode },
6779     /* c0 */
6780     { Bad_Opcode },
6781     { Bad_Opcode },
6782     { Bad_Opcode },
6783     { Bad_Opcode },
6784     { Bad_Opcode },
6785     { Bad_Opcode },
6786     { Bad_Opcode },
6787     { Bad_Opcode },
6788     /* c8 */
6789     { PREFIX_TABLE (PREFIX_0F38C8) },
6790     { PREFIX_TABLE (PREFIX_0F38C9) },
6791     { PREFIX_TABLE (PREFIX_0F38CA) },
6792     { PREFIX_TABLE (PREFIX_0F38CB) },
6793     { PREFIX_TABLE (PREFIX_0F38CC) },
6794     { PREFIX_TABLE (PREFIX_0F38CD) },
6795     { Bad_Opcode },
6796     { Bad_Opcode },
6797     /* d0 */
6798     { Bad_Opcode },
6799     { Bad_Opcode },
6800     { Bad_Opcode },
6801     { Bad_Opcode },
6802     { Bad_Opcode },
6803     { Bad_Opcode },
6804     { Bad_Opcode },
6805     { Bad_Opcode },
6806     /* d8 */
6807     { Bad_Opcode },
6808     { Bad_Opcode },
6809     { Bad_Opcode },
6810     { PREFIX_TABLE (PREFIX_0F38DB) },
6811     { PREFIX_TABLE (PREFIX_0F38DC) },
6812     { PREFIX_TABLE (PREFIX_0F38DD) },
6813     { PREFIX_TABLE (PREFIX_0F38DE) },
6814     { PREFIX_TABLE (PREFIX_0F38DF) },
6815     /* e0 */
6816     { Bad_Opcode },
6817     { Bad_Opcode },
6818     { Bad_Opcode },
6819     { Bad_Opcode },
6820     { Bad_Opcode },
6821     { Bad_Opcode },
6822     { Bad_Opcode },
6823     { Bad_Opcode },
6824     /* e8 */
6825     { Bad_Opcode },
6826     { Bad_Opcode },
6827     { Bad_Opcode },
6828     { Bad_Opcode },
6829     { Bad_Opcode },
6830     { Bad_Opcode },
6831     { Bad_Opcode },
6832     { Bad_Opcode },
6833     /* f0 */
6834     { PREFIX_TABLE (PREFIX_0F38F0) },
6835     { PREFIX_TABLE (PREFIX_0F38F1) },
6836     { Bad_Opcode },
6837     { Bad_Opcode },
6838     { Bad_Opcode },
6839     { Bad_Opcode },
6840     { PREFIX_TABLE (PREFIX_0F38F6) },
6841     { Bad_Opcode },
6842     /* f8 */
6843     { Bad_Opcode },
6844     { Bad_Opcode },
6845     { Bad_Opcode },
6846     { Bad_Opcode },
6847     { Bad_Opcode },
6848     { Bad_Opcode },
6849     { Bad_Opcode },
6850     { Bad_Opcode },
6851   },
6852   /* THREE_BYTE_0F3A */
6853   {
6854     /* 00 */
6855     { Bad_Opcode },
6856     { Bad_Opcode },
6857     { Bad_Opcode },
6858     { Bad_Opcode },
6859     { Bad_Opcode },
6860     { Bad_Opcode },
6861     { Bad_Opcode },
6862     { Bad_Opcode },
6863     /* 08 */
6864     { PREFIX_TABLE (PREFIX_0F3A08) },
6865     { PREFIX_TABLE (PREFIX_0F3A09) },
6866     { PREFIX_TABLE (PREFIX_0F3A0A) },
6867     { PREFIX_TABLE (PREFIX_0F3A0B) },
6868     { PREFIX_TABLE (PREFIX_0F3A0C) },
6869     { PREFIX_TABLE (PREFIX_0F3A0D) },
6870     { PREFIX_TABLE (PREFIX_0F3A0E) },
6871     { "palignr",        { MX, EM, Ib } },
6872     /* 10 */
6873     { Bad_Opcode },
6874     { Bad_Opcode },
6875     { Bad_Opcode },
6876     { Bad_Opcode },
6877     { PREFIX_TABLE (PREFIX_0F3A14) },
6878     { PREFIX_TABLE (PREFIX_0F3A15) },
6879     { PREFIX_TABLE (PREFIX_0F3A16) },
6880     { PREFIX_TABLE (PREFIX_0F3A17) },
6881     /* 18 */
6882     { Bad_Opcode },
6883     { Bad_Opcode },
6884     { Bad_Opcode },
6885     { Bad_Opcode },
6886     { Bad_Opcode },
6887     { Bad_Opcode },
6888     { Bad_Opcode },
6889     { Bad_Opcode },
6890     /* 20 */
6891     { PREFIX_TABLE (PREFIX_0F3A20) },
6892     { PREFIX_TABLE (PREFIX_0F3A21) },
6893     { PREFIX_TABLE (PREFIX_0F3A22) },
6894     { Bad_Opcode },
6895     { Bad_Opcode },
6896     { Bad_Opcode },
6897     { Bad_Opcode },
6898     { Bad_Opcode },
6899     /* 28 */
6900     { Bad_Opcode },
6901     { Bad_Opcode },
6902     { Bad_Opcode },
6903     { Bad_Opcode },
6904     { Bad_Opcode },
6905     { Bad_Opcode },
6906     { Bad_Opcode },
6907     { Bad_Opcode },
6908     /* 30 */
6909     { Bad_Opcode },
6910     { Bad_Opcode },
6911     { Bad_Opcode },
6912     { Bad_Opcode },
6913     { Bad_Opcode },
6914     { Bad_Opcode },
6915     { Bad_Opcode },
6916     { Bad_Opcode },
6917     /* 38 */
6918     { Bad_Opcode },
6919     { Bad_Opcode },
6920     { Bad_Opcode },
6921     { Bad_Opcode },
6922     { Bad_Opcode },
6923     { Bad_Opcode },
6924     { Bad_Opcode },
6925     { Bad_Opcode },
6926     /* 40 */
6927     { PREFIX_TABLE (PREFIX_0F3A40) },
6928     { PREFIX_TABLE (PREFIX_0F3A41) },
6929     { PREFIX_TABLE (PREFIX_0F3A42) },
6930     { Bad_Opcode },
6931     { PREFIX_TABLE (PREFIX_0F3A44) },
6932     { Bad_Opcode },
6933     { Bad_Opcode },
6934     { Bad_Opcode },
6935     /* 48 */
6936     { Bad_Opcode },
6937     { Bad_Opcode },
6938     { Bad_Opcode },
6939     { Bad_Opcode },
6940     { Bad_Opcode },
6941     { Bad_Opcode },
6942     { Bad_Opcode },
6943     { Bad_Opcode },
6944     /* 50 */
6945     { Bad_Opcode },
6946     { Bad_Opcode },
6947     { Bad_Opcode },
6948     { Bad_Opcode },
6949     { Bad_Opcode },
6950     { Bad_Opcode },
6951     { Bad_Opcode },
6952     { Bad_Opcode },
6953     /* 58 */
6954     { Bad_Opcode },
6955     { Bad_Opcode },
6956     { Bad_Opcode },
6957     { Bad_Opcode },
6958     { Bad_Opcode },
6959     { Bad_Opcode },
6960     { Bad_Opcode },
6961     { Bad_Opcode },
6962     /* 60 */
6963     { PREFIX_TABLE (PREFIX_0F3A60) },
6964     { PREFIX_TABLE (PREFIX_0F3A61) },
6965     { PREFIX_TABLE (PREFIX_0F3A62) },
6966     { PREFIX_TABLE (PREFIX_0F3A63) },
6967     { Bad_Opcode },
6968     { Bad_Opcode },
6969     { Bad_Opcode },
6970     { Bad_Opcode },
6971     /* 68 */
6972     { Bad_Opcode },
6973     { Bad_Opcode },
6974     { Bad_Opcode },
6975     { Bad_Opcode },
6976     { Bad_Opcode },
6977     { Bad_Opcode },
6978     { Bad_Opcode },
6979     { Bad_Opcode },
6980     /* 70 */
6981     { Bad_Opcode },
6982     { Bad_Opcode },
6983     { Bad_Opcode },
6984     { Bad_Opcode },
6985     { Bad_Opcode },
6986     { Bad_Opcode },
6987     { Bad_Opcode },
6988     { Bad_Opcode },
6989     /* 78 */
6990     { Bad_Opcode },
6991     { Bad_Opcode },
6992     { Bad_Opcode },
6993     { Bad_Opcode },
6994     { Bad_Opcode },
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     { Bad_Opcode },
6998     /* 80 */
6999     { Bad_Opcode },
7000     { Bad_Opcode },
7001     { Bad_Opcode },
7002     { Bad_Opcode },
7003     { Bad_Opcode },
7004     { Bad_Opcode },
7005     { Bad_Opcode },
7006     { Bad_Opcode },
7007     /* 88 */
7008     { Bad_Opcode },
7009     { Bad_Opcode },
7010     { Bad_Opcode },
7011     { Bad_Opcode },
7012     { Bad_Opcode },
7013     { Bad_Opcode },
7014     { Bad_Opcode },
7015     { Bad_Opcode },
7016     /* 90 */
7017     { Bad_Opcode },
7018     { Bad_Opcode },
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     { Bad_Opcode },
7022     { Bad_Opcode },
7023     { Bad_Opcode },
7024     { Bad_Opcode },
7025     /* 98 */
7026     { Bad_Opcode },
7027     { Bad_Opcode },
7028     { Bad_Opcode },
7029     { Bad_Opcode },
7030     { Bad_Opcode },
7031     { Bad_Opcode },
7032     { Bad_Opcode },
7033     { Bad_Opcode },
7034     /* a0 */
7035     { Bad_Opcode },
7036     { Bad_Opcode },
7037     { Bad_Opcode },
7038     { Bad_Opcode },
7039     { Bad_Opcode },
7040     { Bad_Opcode },
7041     { Bad_Opcode },
7042     { Bad_Opcode },
7043     /* a8 */
7044     { Bad_Opcode },
7045     { Bad_Opcode },
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     { Bad_Opcode },
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     /* b0 */
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     { Bad_Opcode },
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     /* b8 */
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     { Bad_Opcode },
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     /* c0 */
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     { Bad_Opcode },
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     /* c8 */
7080     { Bad_Opcode },
7081     { Bad_Opcode },
7082     { Bad_Opcode },
7083     { Bad_Opcode },
7084     { PREFIX_TABLE (PREFIX_0F3ACC) },
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     /* d0 */
7089     { Bad_Opcode },
7090     { Bad_Opcode },
7091     { Bad_Opcode },
7092     { Bad_Opcode },
7093     { Bad_Opcode },
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     /* d8 */
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     { Bad_Opcode },
7101     { Bad_Opcode },
7102     { Bad_Opcode },
7103     { Bad_Opcode },
7104     { Bad_Opcode },
7105     { PREFIX_TABLE (PREFIX_0F3ADF) },
7106     /* e0 */
7107     { Bad_Opcode },
7108     { Bad_Opcode },
7109     { Bad_Opcode },
7110     { Bad_Opcode },
7111     { Bad_Opcode },
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     { Bad_Opcode },
7115     /* e8 */
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     { Bad_Opcode },
7119     { Bad_Opcode },
7120     { Bad_Opcode },
7121     { Bad_Opcode },
7122     { Bad_Opcode },
7123     { Bad_Opcode },
7124     /* f0 */
7125     { Bad_Opcode },
7126     { Bad_Opcode },
7127     { Bad_Opcode },
7128     { Bad_Opcode },
7129     { Bad_Opcode },
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     /* f8 */
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     { Bad_Opcode },
7139     { Bad_Opcode },
7140     { Bad_Opcode },
7141     { Bad_Opcode },
7142   },
7143
7144   /* THREE_BYTE_0F7A */
7145   {
7146     /* 00 */
7147     { Bad_Opcode },
7148     { Bad_Opcode },
7149     { Bad_Opcode },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     { Bad_Opcode },
7154     { Bad_Opcode },
7155     /* 08 */
7156     { Bad_Opcode },
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     { Bad_Opcode },
7163     { Bad_Opcode },
7164     /* 10 */
7165     { Bad_Opcode },
7166     { Bad_Opcode },
7167     { Bad_Opcode },
7168     { Bad_Opcode },
7169     { Bad_Opcode },
7170     { Bad_Opcode },
7171     { Bad_Opcode },
7172     { Bad_Opcode },
7173     /* 18 */
7174     { Bad_Opcode },
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     { Bad_Opcode },
7178     { Bad_Opcode },
7179     { Bad_Opcode },
7180     { Bad_Opcode },
7181     { Bad_Opcode },
7182     /* 20 */
7183     { "ptest",          { XX } },
7184     { Bad_Opcode },
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     { Bad_Opcode },
7190     { Bad_Opcode },
7191     /* 28 */
7192     { Bad_Opcode },
7193     { Bad_Opcode },
7194     { Bad_Opcode },
7195     { Bad_Opcode },
7196     { Bad_Opcode },
7197     { Bad_Opcode },
7198     { Bad_Opcode },
7199     { Bad_Opcode },
7200     /* 30 */
7201     { Bad_Opcode },
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     { Bad_Opcode },
7207     { Bad_Opcode },
7208     { Bad_Opcode },
7209     /* 38 */
7210     { Bad_Opcode },
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     { Bad_Opcode },
7214     { Bad_Opcode },
7215     { Bad_Opcode },
7216     { Bad_Opcode },
7217     { Bad_Opcode },
7218     /* 40 */
7219     { Bad_Opcode },
7220     { "phaddbw",        { XM, EXq } },
7221     { "phaddbd",        { XM, EXq } },
7222     { "phaddbq",        { XM, EXq } },
7223     { Bad_Opcode },
7224     { Bad_Opcode },
7225     { "phaddwd",        { XM, EXq } },
7226     { "phaddwq",        { XM, EXq } },
7227     /* 48 */
7228     { Bad_Opcode },
7229     { Bad_Opcode },
7230     { Bad_Opcode },
7231     { "phadddq",        { XM, EXq } },
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     { Bad_Opcode },
7235     { Bad_Opcode },
7236     /* 50 */
7237     { Bad_Opcode },
7238     { "phaddubw",       { XM, EXq } },
7239     { "phaddubd",       { XM, EXq } },
7240     { "phaddubq",       { XM, EXq } },
7241     { Bad_Opcode },
7242     { Bad_Opcode },
7243     { "phadduwd",       { XM, EXq } },
7244     { "phadduwq",       { XM, EXq } },
7245     /* 58 */
7246     { Bad_Opcode },
7247     { Bad_Opcode },
7248     { Bad_Opcode },
7249     { "phaddudq",       { XM, EXq } },
7250     { Bad_Opcode },
7251     { Bad_Opcode },
7252     { Bad_Opcode },
7253     { Bad_Opcode },
7254     /* 60 */
7255     { Bad_Opcode },
7256     { "phsubbw",        { XM, EXq } },
7257     { "phsubbd",        { XM, EXq } },
7258     { "phsubbq",        { XM, EXq } },
7259     { Bad_Opcode },
7260     { Bad_Opcode },
7261     { Bad_Opcode },
7262     { Bad_Opcode },
7263     /* 68 */
7264     { Bad_Opcode },
7265     { Bad_Opcode },
7266     { Bad_Opcode },
7267     { Bad_Opcode },
7268     { Bad_Opcode },
7269     { Bad_Opcode },
7270     { Bad_Opcode },
7271     { Bad_Opcode },
7272     /* 70 */
7273     { Bad_Opcode },
7274     { Bad_Opcode },
7275     { Bad_Opcode },
7276     { Bad_Opcode },
7277     { Bad_Opcode },
7278     { Bad_Opcode },
7279     { Bad_Opcode },
7280     { Bad_Opcode },
7281     /* 78 */
7282     { Bad_Opcode },
7283     { Bad_Opcode },
7284     { Bad_Opcode },
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     { Bad_Opcode },
7289     { Bad_Opcode },
7290     /* 80 */
7291     { Bad_Opcode },
7292     { Bad_Opcode },
7293     { Bad_Opcode },
7294     { Bad_Opcode },
7295     { Bad_Opcode },
7296     { Bad_Opcode },
7297     { Bad_Opcode },
7298     { Bad_Opcode },
7299     /* 88 */
7300     { Bad_Opcode },
7301     { Bad_Opcode },
7302     { Bad_Opcode },
7303     { Bad_Opcode },
7304     { Bad_Opcode },
7305     { Bad_Opcode },
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     /* 90 */
7309     { Bad_Opcode },
7310     { Bad_Opcode },
7311     { Bad_Opcode },
7312     { Bad_Opcode },
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     /* 98 */
7318     { Bad_Opcode },
7319     { Bad_Opcode },
7320     { Bad_Opcode },
7321     { Bad_Opcode },
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     /* a0 */
7327     { Bad_Opcode },
7328     { Bad_Opcode },
7329     { Bad_Opcode },
7330     { Bad_Opcode },
7331     { Bad_Opcode },
7332     { Bad_Opcode },
7333     { Bad_Opcode },
7334     { Bad_Opcode },
7335     /* a8 */
7336     { Bad_Opcode },
7337     { Bad_Opcode },
7338     { Bad_Opcode },
7339     { Bad_Opcode },
7340     { Bad_Opcode },
7341     { Bad_Opcode },
7342     { Bad_Opcode },
7343     { Bad_Opcode },
7344     /* b0 */
7345     { Bad_Opcode },
7346     { Bad_Opcode },
7347     { Bad_Opcode },
7348     { Bad_Opcode },
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     /* b8 */
7354     { Bad_Opcode },
7355     { Bad_Opcode },
7356     { Bad_Opcode },
7357     { Bad_Opcode },
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     /* c0 */
7363     { Bad_Opcode },
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     { Bad_Opcode },
7370     { Bad_Opcode },
7371     /* c8 */
7372     { Bad_Opcode },
7373     { Bad_Opcode },
7374     { Bad_Opcode },
7375     { Bad_Opcode },
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     { Bad_Opcode },
7379     { Bad_Opcode },
7380     /* d0 */
7381     { Bad_Opcode },
7382     { Bad_Opcode },
7383     { Bad_Opcode },
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     /* d8 */
7390     { Bad_Opcode },
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     /* e0 */
7399     { Bad_Opcode },
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     { Bad_Opcode },
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     /* e8 */
7408     { Bad_Opcode },
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     { Bad_Opcode },
7412     { Bad_Opcode },
7413     { Bad_Opcode },
7414     { Bad_Opcode },
7415     { Bad_Opcode },
7416     /* f0 */
7417     { Bad_Opcode },
7418     { Bad_Opcode },
7419     { Bad_Opcode },
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     /* f8 */
7426     { Bad_Opcode },
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434   },
7435 };
7436
7437 static const struct dis386 xop_table[][256] = {
7438   /* XOP_08 */
7439   {
7440     /* 00 */
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     { Bad_Opcode },
7445     { Bad_Opcode },
7446     { Bad_Opcode },
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     /* 08 */
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     { Bad_Opcode },
7454     { Bad_Opcode },
7455     { Bad_Opcode },
7456     { Bad_Opcode },
7457     { Bad_Opcode },
7458     /* 10 */
7459     { Bad_Opcode },
7460     { Bad_Opcode },
7461     { Bad_Opcode },
7462     { Bad_Opcode },
7463     { Bad_Opcode },
7464     { Bad_Opcode },
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     /* 18 */
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471     { Bad_Opcode },
7472     { Bad_Opcode },
7473     { Bad_Opcode },
7474     { Bad_Opcode },
7475     { Bad_Opcode },
7476     /* 20 */
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { Bad_Opcode },
7480     { Bad_Opcode },
7481     { Bad_Opcode },
7482     { Bad_Opcode },
7483     { Bad_Opcode },
7484     { Bad_Opcode },
7485     /* 28 */
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { Bad_Opcode },
7489     { Bad_Opcode },
7490     { Bad_Opcode },
7491     { Bad_Opcode },
7492     { Bad_Opcode },
7493     { Bad_Opcode },
7494     /* 30 */
7495     { Bad_Opcode },
7496     { Bad_Opcode },
7497     { Bad_Opcode },
7498     { Bad_Opcode },
7499     { Bad_Opcode },
7500     { Bad_Opcode },
7501     { Bad_Opcode },
7502     { Bad_Opcode },
7503     /* 38 */
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     { Bad_Opcode },
7508     { Bad_Opcode },
7509     { Bad_Opcode },
7510     { Bad_Opcode },
7511     { Bad_Opcode },
7512     /* 40 */
7513     { Bad_Opcode },
7514     { Bad_Opcode },
7515     { Bad_Opcode },
7516     { Bad_Opcode },
7517     { Bad_Opcode },
7518     { Bad_Opcode },
7519     { Bad_Opcode },
7520     { Bad_Opcode },
7521     /* 48 */
7522     { Bad_Opcode },
7523     { Bad_Opcode },
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     { Bad_Opcode },
7529     { Bad_Opcode },
7530     /* 50 */
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { Bad_Opcode },
7534     { Bad_Opcode },
7535     { Bad_Opcode },
7536     { Bad_Opcode },
7537     { Bad_Opcode },
7538     { Bad_Opcode },
7539     /* 58 */
7540     { Bad_Opcode },
7541     { Bad_Opcode },
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     { Bad_Opcode },
7545     { Bad_Opcode },
7546     { Bad_Opcode },
7547     { Bad_Opcode },
7548     /* 60 */
7549     { Bad_Opcode },
7550     { Bad_Opcode },
7551     { Bad_Opcode },
7552     { Bad_Opcode },
7553     { Bad_Opcode },
7554     { Bad_Opcode },
7555     { Bad_Opcode },
7556     { Bad_Opcode },
7557     /* 68 */
7558     { Bad_Opcode },
7559     { Bad_Opcode },
7560     { Bad_Opcode },
7561     { Bad_Opcode },
7562     { Bad_Opcode },
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     /* 70 */
7567     { Bad_Opcode },
7568     { Bad_Opcode },
7569     { Bad_Opcode },
7570     { Bad_Opcode },
7571     { Bad_Opcode },
7572     { Bad_Opcode },
7573     { Bad_Opcode },
7574     { Bad_Opcode },
7575     /* 78 */
7576     { Bad_Opcode },
7577     { Bad_Opcode },
7578     { Bad_Opcode },
7579     { Bad_Opcode },
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     /* 80 */
7585     { Bad_Opcode },
7586     { Bad_Opcode },
7587     { Bad_Opcode },
7588     { Bad_Opcode },
7589     { Bad_Opcode },
7590     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7591     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7592     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7593     /* 88 */
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     { Bad_Opcode },
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7601     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7602     /* 90 */
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     { Bad_Opcode },
7607     { Bad_Opcode },
7608     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7609     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7610     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7611     /* 98 */
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     { Bad_Opcode },
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7619     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7620     /* a0 */
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7624     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7628     { Bad_Opcode },
7629     /* a8 */
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     { Bad_Opcode },
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     /* b0 */
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     { Bad_Opcode },
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW, VexI4 } },
7646     { Bad_Opcode },
7647     /* b8 */
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     { Bad_Opcode },
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     /* c0 */
7657     { "vprotb",         { XM, Vex_2src_1, Ib } },
7658     { "vprotw",         { XM, Vex_2src_1, Ib } },
7659     { "vprotd",         { XM, Vex_2src_1, Ib } },
7660     { "vprotq",         { XM, Vex_2src_1, Ib } },
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     /* c8 */
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     { Bad_Opcode },
7670     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7671     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7672     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7673     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7674     /* d0 */
7675     { Bad_Opcode },
7676     { Bad_Opcode },
7677     { Bad_Opcode },
7678     { Bad_Opcode },
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { Bad_Opcode },
7683     /* d8 */
7684     { Bad_Opcode },
7685     { Bad_Opcode },
7686     { Bad_Opcode },
7687     { Bad_Opcode },
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     /* e0 */
7693     { Bad_Opcode },
7694     { Bad_Opcode },
7695     { Bad_Opcode },
7696     { Bad_Opcode },
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { Bad_Opcode },
7701     /* e8 */
7702     { Bad_Opcode },
7703     { Bad_Opcode },
7704     { Bad_Opcode },
7705     { Bad_Opcode },
7706     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7707     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7708     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7709     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7710     /* f0 */
7711     { Bad_Opcode },
7712     { Bad_Opcode },
7713     { Bad_Opcode },
7714     { Bad_Opcode },
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     /* f8 */
7720     { Bad_Opcode },
7721     { Bad_Opcode },
7722     { Bad_Opcode },
7723     { Bad_Opcode },
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { Bad_Opcode },
7728   },
7729   /* XOP_09 */
7730   {
7731     /* 00 */
7732     { Bad_Opcode },
7733     { REG_TABLE (REG_XOP_TBM_01) },
7734     { REG_TABLE (REG_XOP_TBM_02) },
7735     { Bad_Opcode },
7736     { Bad_Opcode },
7737     { Bad_Opcode },
7738     { Bad_Opcode },
7739     { Bad_Opcode },
7740     /* 08 */
7741     { Bad_Opcode },
7742     { Bad_Opcode },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     { Bad_Opcode },
7746     { Bad_Opcode },
7747     { Bad_Opcode },
7748     { Bad_Opcode },
7749     /* 10 */
7750     { Bad_Opcode },
7751     { Bad_Opcode },
7752     { REG_TABLE (REG_XOP_LWPCB) },
7753     { Bad_Opcode },
7754     { Bad_Opcode },
7755     { Bad_Opcode },
7756     { Bad_Opcode },
7757     { Bad_Opcode },
7758     /* 18 */
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764     { Bad_Opcode },
7765     { Bad_Opcode },
7766     { Bad_Opcode },
7767     /* 20 */
7768     { Bad_Opcode },
7769     { Bad_Opcode },
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     { Bad_Opcode },
7776     /* 28 */
7777     { Bad_Opcode },
7778     { Bad_Opcode },
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     { Bad_Opcode },
7784     { Bad_Opcode },
7785     /* 30 */
7786     { Bad_Opcode },
7787     { Bad_Opcode },
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     { Bad_Opcode },
7791     { Bad_Opcode },
7792     { Bad_Opcode },
7793     { Bad_Opcode },
7794     /* 38 */
7795     { Bad_Opcode },
7796     { Bad_Opcode },
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     { Bad_Opcode },
7803     /* 40 */
7804     { Bad_Opcode },
7805     { Bad_Opcode },
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810     { Bad_Opcode },
7811     { Bad_Opcode },
7812     /* 48 */
7813     { Bad_Opcode },
7814     { Bad_Opcode },
7815     { Bad_Opcode },
7816     { Bad_Opcode },
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     { Bad_Opcode },
7821     /* 50 */
7822     { Bad_Opcode },
7823     { Bad_Opcode },
7824     { Bad_Opcode },
7825     { Bad_Opcode },
7826     { Bad_Opcode },
7827     { Bad_Opcode },
7828     { Bad_Opcode },
7829     { Bad_Opcode },
7830     /* 58 */
7831     { Bad_Opcode },
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     { Bad_Opcode },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     { Bad_Opcode },
7839     /* 60 */
7840     { Bad_Opcode },
7841     { Bad_Opcode },
7842     { Bad_Opcode },
7843     { Bad_Opcode },
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     { Bad_Opcode },
7848     /* 68 */
7849     { Bad_Opcode },
7850     { Bad_Opcode },
7851     { Bad_Opcode },
7852     { Bad_Opcode },
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     /* 70 */
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     { Bad_Opcode },
7861     { Bad_Opcode },
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     { Bad_Opcode },
7865     { Bad_Opcode },
7866     /* 78 */
7867     { Bad_Opcode },
7868     { Bad_Opcode },
7869     { Bad_Opcode },
7870     { Bad_Opcode },
7871     { Bad_Opcode },
7872     { Bad_Opcode },
7873     { Bad_Opcode },
7874     { Bad_Opcode },
7875     /* 80 */
7876     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7877     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7878     { "vfrczss",        { XM, EXd } },
7879     { "vfrczsd",        { XM, EXq } },
7880     { Bad_Opcode },
7881     { Bad_Opcode },
7882     { Bad_Opcode },
7883     { Bad_Opcode },
7884     /* 88 */
7885     { Bad_Opcode },
7886     { Bad_Opcode },
7887     { Bad_Opcode },
7888     { Bad_Opcode },
7889     { Bad_Opcode },
7890     { Bad_Opcode },
7891     { Bad_Opcode },
7892     { Bad_Opcode },
7893     /* 90 */
7894     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 } },
7895     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 } },
7896     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 } },
7897     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 } },
7898     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 } },
7899     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 } },
7900     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 } },
7901     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 } },
7902     /* 98 */
7903     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 } },
7904     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 } },
7905     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 } },
7906     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 } },
7907     { Bad_Opcode },
7908     { Bad_Opcode },
7909     { Bad_Opcode },
7910     { Bad_Opcode },
7911     /* a0 */
7912     { Bad_Opcode },
7913     { Bad_Opcode },
7914     { Bad_Opcode },
7915     { Bad_Opcode },
7916     { Bad_Opcode },
7917     { Bad_Opcode },
7918     { Bad_Opcode },
7919     { Bad_Opcode },
7920     /* a8 */
7921     { Bad_Opcode },
7922     { Bad_Opcode },
7923     { Bad_Opcode },
7924     { Bad_Opcode },
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     /* b0 */
7930     { Bad_Opcode },
7931     { Bad_Opcode },
7932     { Bad_Opcode },
7933     { Bad_Opcode },
7934     { Bad_Opcode },
7935     { Bad_Opcode },
7936     { Bad_Opcode },
7937     { Bad_Opcode },
7938     /* b8 */
7939     { Bad_Opcode },
7940     { Bad_Opcode },
7941     { Bad_Opcode },
7942     { Bad_Opcode },
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     /* c0 */
7948     { Bad_Opcode },
7949     { "vphaddbw",       { XM, EXxmm } },
7950     { "vphaddbd",       { XM, EXxmm } },
7951     { "vphaddbq",       { XM, EXxmm } },
7952     { Bad_Opcode },
7953     { Bad_Opcode },
7954     { "vphaddwd",       { XM, EXxmm } },
7955     { "vphaddwq",       { XM, EXxmm } },
7956     /* c8 */
7957     { Bad_Opcode },
7958     { Bad_Opcode },
7959     { Bad_Opcode },
7960     { "vphadddq",       { XM, EXxmm } },
7961     { Bad_Opcode },
7962     { Bad_Opcode },
7963     { Bad_Opcode },
7964     { Bad_Opcode },
7965     /* d0 */
7966     { Bad_Opcode },
7967     { "vphaddubw",      { XM, EXxmm } },
7968     { "vphaddubd",      { XM, EXxmm } },
7969     { "vphaddubq",      { XM, EXxmm } },
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { "vphadduwd",      { XM, EXxmm } },
7973     { "vphadduwq",      { XM, EXxmm } },
7974     /* d8 */
7975     { Bad_Opcode },
7976     { Bad_Opcode },
7977     { Bad_Opcode },
7978     { "vphaddudq",      { XM, EXxmm } },
7979     { Bad_Opcode },
7980     { Bad_Opcode },
7981     { Bad_Opcode },
7982     { Bad_Opcode },
7983     /* e0 */
7984     { Bad_Opcode },
7985     { "vphsubbw",       { XM, EXxmm } },
7986     { "vphsubwd",       { XM, EXxmm } },
7987     { "vphsubdq",       { XM, EXxmm } },
7988     { Bad_Opcode },
7989     { Bad_Opcode },
7990     { Bad_Opcode },
7991     { Bad_Opcode },
7992     /* e8 */
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     { Bad_Opcode },
7996     { Bad_Opcode },
7997     { Bad_Opcode },
7998     { Bad_Opcode },
7999     { Bad_Opcode },
8000     { Bad_Opcode },
8001     /* f0 */
8002     { Bad_Opcode },
8003     { Bad_Opcode },
8004     { Bad_Opcode },
8005     { Bad_Opcode },
8006     { Bad_Opcode },
8007     { Bad_Opcode },
8008     { Bad_Opcode },
8009     { Bad_Opcode },
8010     /* f8 */
8011     { Bad_Opcode },
8012     { Bad_Opcode },
8013     { Bad_Opcode },
8014     { Bad_Opcode },
8015     { Bad_Opcode },
8016     { Bad_Opcode },
8017     { Bad_Opcode },
8018     { Bad_Opcode },
8019   },
8020   /* XOP_0A */
8021   {
8022     /* 00 */
8023     { Bad_Opcode },
8024     { Bad_Opcode },
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     { Bad_Opcode },
8031     /* 08 */
8032     { Bad_Opcode },
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { Bad_Opcode },
8037     { Bad_Opcode },
8038     { Bad_Opcode },
8039     { Bad_Opcode },
8040     /* 10 */
8041     { "bextr",  { Gv, Ev, Iq } },
8042     { Bad_Opcode },
8043     { REG_TABLE (REG_XOP_LWP) },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     { Bad_Opcode },
8048     { Bad_Opcode },
8049     /* 18 */
8050     { Bad_Opcode },
8051     { Bad_Opcode },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     { Bad_Opcode },
8055     { Bad_Opcode },
8056     { Bad_Opcode },
8057     { Bad_Opcode },
8058     /* 20 */
8059     { Bad_Opcode },
8060     { Bad_Opcode },
8061     { Bad_Opcode },
8062     { Bad_Opcode },
8063     { Bad_Opcode },
8064     { Bad_Opcode },
8065     { Bad_Opcode },
8066     { Bad_Opcode },
8067     /* 28 */
8068     { Bad_Opcode },
8069     { Bad_Opcode },
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     { Bad_Opcode },
8075     { Bad_Opcode },
8076     /* 30 */
8077     { Bad_Opcode },
8078     { Bad_Opcode },
8079     { Bad_Opcode },
8080     { Bad_Opcode },
8081     { Bad_Opcode },
8082     { Bad_Opcode },
8083     { Bad_Opcode },
8084     { Bad_Opcode },
8085     /* 38 */
8086     { Bad_Opcode },
8087     { Bad_Opcode },
8088     { Bad_Opcode },
8089     { Bad_Opcode },
8090     { Bad_Opcode },
8091     { Bad_Opcode },
8092     { Bad_Opcode },
8093     { Bad_Opcode },
8094     /* 40 */
8095     { Bad_Opcode },
8096     { Bad_Opcode },
8097     { Bad_Opcode },
8098     { Bad_Opcode },
8099     { Bad_Opcode },
8100     { Bad_Opcode },
8101     { Bad_Opcode },
8102     { Bad_Opcode },
8103     /* 48 */
8104     { Bad_Opcode },
8105     { Bad_Opcode },
8106     { Bad_Opcode },
8107     { Bad_Opcode },
8108     { Bad_Opcode },
8109     { Bad_Opcode },
8110     { Bad_Opcode },
8111     { Bad_Opcode },
8112     /* 50 */
8113     { Bad_Opcode },
8114     { Bad_Opcode },
8115     { Bad_Opcode },
8116     { Bad_Opcode },
8117     { Bad_Opcode },
8118     { Bad_Opcode },
8119     { Bad_Opcode },
8120     { Bad_Opcode },
8121     /* 58 */
8122     { Bad_Opcode },
8123     { Bad_Opcode },
8124     { Bad_Opcode },
8125     { Bad_Opcode },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     { Bad_Opcode },
8130     /* 60 */
8131     { Bad_Opcode },
8132     { Bad_Opcode },
8133     { Bad_Opcode },
8134     { Bad_Opcode },
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     { Bad_Opcode },
8139     /* 68 */
8140     { Bad_Opcode },
8141     { Bad_Opcode },
8142     { Bad_Opcode },
8143     { Bad_Opcode },
8144     { Bad_Opcode },
8145     { Bad_Opcode },
8146     { Bad_Opcode },
8147     { Bad_Opcode },
8148     /* 70 */
8149     { Bad_Opcode },
8150     { Bad_Opcode },
8151     { Bad_Opcode },
8152     { Bad_Opcode },
8153     { Bad_Opcode },
8154     { Bad_Opcode },
8155     { Bad_Opcode },
8156     { Bad_Opcode },
8157     /* 78 */
8158     { Bad_Opcode },
8159     { Bad_Opcode },
8160     { Bad_Opcode },
8161     { Bad_Opcode },
8162     { Bad_Opcode },
8163     { Bad_Opcode },
8164     { Bad_Opcode },
8165     { Bad_Opcode },
8166     /* 80 */
8167     { Bad_Opcode },
8168     { Bad_Opcode },
8169     { Bad_Opcode },
8170     { Bad_Opcode },
8171     { Bad_Opcode },
8172     { Bad_Opcode },
8173     { Bad_Opcode },
8174     { Bad_Opcode },
8175     /* 88 */
8176     { Bad_Opcode },
8177     { Bad_Opcode },
8178     { Bad_Opcode },
8179     { Bad_Opcode },
8180     { Bad_Opcode },
8181     { Bad_Opcode },
8182     { Bad_Opcode },
8183     { Bad_Opcode },
8184     /* 90 */
8185     { Bad_Opcode },
8186     { Bad_Opcode },
8187     { Bad_Opcode },
8188     { Bad_Opcode },
8189     { Bad_Opcode },
8190     { Bad_Opcode },
8191     { Bad_Opcode },
8192     { Bad_Opcode },
8193     /* 98 */
8194     { Bad_Opcode },
8195     { Bad_Opcode },
8196     { Bad_Opcode },
8197     { Bad_Opcode },
8198     { Bad_Opcode },
8199     { Bad_Opcode },
8200     { Bad_Opcode },
8201     { Bad_Opcode },
8202     /* a0 */
8203     { Bad_Opcode },
8204     { Bad_Opcode },
8205     { Bad_Opcode },
8206     { Bad_Opcode },
8207     { Bad_Opcode },
8208     { Bad_Opcode },
8209     { Bad_Opcode },
8210     { Bad_Opcode },
8211     /* a8 */
8212     { Bad_Opcode },
8213     { Bad_Opcode },
8214     { Bad_Opcode },
8215     { Bad_Opcode },
8216     { Bad_Opcode },
8217     { Bad_Opcode },
8218     { Bad_Opcode },
8219     { Bad_Opcode },
8220     /* b0 */
8221     { Bad_Opcode },
8222     { Bad_Opcode },
8223     { Bad_Opcode },
8224     { Bad_Opcode },
8225     { Bad_Opcode },
8226     { Bad_Opcode },
8227     { Bad_Opcode },
8228     { Bad_Opcode },
8229     /* b8 */
8230     { Bad_Opcode },
8231     { Bad_Opcode },
8232     { Bad_Opcode },
8233     { Bad_Opcode },
8234     { Bad_Opcode },
8235     { Bad_Opcode },
8236     { Bad_Opcode },
8237     { Bad_Opcode },
8238     /* c0 */
8239     { Bad_Opcode },
8240     { Bad_Opcode },
8241     { Bad_Opcode },
8242     { Bad_Opcode },
8243     { Bad_Opcode },
8244     { Bad_Opcode },
8245     { Bad_Opcode },
8246     { Bad_Opcode },
8247     /* c8 */
8248     { Bad_Opcode },
8249     { Bad_Opcode },
8250     { Bad_Opcode },
8251     { Bad_Opcode },
8252     { Bad_Opcode },
8253     { Bad_Opcode },
8254     { Bad_Opcode },
8255     { Bad_Opcode },
8256     /* d0 */
8257     { Bad_Opcode },
8258     { Bad_Opcode },
8259     { Bad_Opcode },
8260     { Bad_Opcode },
8261     { Bad_Opcode },
8262     { Bad_Opcode },
8263     { Bad_Opcode },
8264     { Bad_Opcode },
8265     /* d8 */
8266     { Bad_Opcode },
8267     { Bad_Opcode },
8268     { Bad_Opcode },
8269     { Bad_Opcode },
8270     { Bad_Opcode },
8271     { Bad_Opcode },
8272     { Bad_Opcode },
8273     { Bad_Opcode },
8274     /* e0 */
8275     { Bad_Opcode },
8276     { Bad_Opcode },
8277     { Bad_Opcode },
8278     { Bad_Opcode },
8279     { Bad_Opcode },
8280     { Bad_Opcode },
8281     { Bad_Opcode },
8282     { Bad_Opcode },
8283     /* e8 */
8284     { Bad_Opcode },
8285     { Bad_Opcode },
8286     { Bad_Opcode },
8287     { Bad_Opcode },
8288     { Bad_Opcode },
8289     { Bad_Opcode },
8290     { Bad_Opcode },
8291     { Bad_Opcode },
8292     /* f0 */
8293     { Bad_Opcode },
8294     { Bad_Opcode },
8295     { Bad_Opcode },
8296     { Bad_Opcode },
8297     { Bad_Opcode },
8298     { Bad_Opcode },
8299     { Bad_Opcode },
8300     { Bad_Opcode },
8301     /* f8 */
8302     { Bad_Opcode },
8303     { Bad_Opcode },
8304     { Bad_Opcode },
8305     { Bad_Opcode },
8306     { Bad_Opcode },
8307     { Bad_Opcode },
8308     { Bad_Opcode },
8309     { Bad_Opcode },
8310   },
8311 };
8312
8313 static const struct dis386 vex_table[][256] = {
8314   /* VEX_0F */
8315   {
8316     /* 00 */
8317     { Bad_Opcode },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     { Bad_Opcode },
8321     { Bad_Opcode },
8322     { Bad_Opcode },
8323     { Bad_Opcode },
8324     { Bad_Opcode },
8325     /* 08 */
8326     { Bad_Opcode },
8327     { Bad_Opcode },
8328     { Bad_Opcode },
8329     { Bad_Opcode },
8330     { Bad_Opcode },
8331     { Bad_Opcode },
8332     { Bad_Opcode },
8333     { Bad_Opcode },
8334     /* 10 */
8335     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8336     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8337     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8338     { MOD_TABLE (MOD_VEX_0F13) },
8339     { VEX_W_TABLE (VEX_W_0F14) },
8340     { VEX_W_TABLE (VEX_W_0F15) },
8341     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8342     { MOD_TABLE (MOD_VEX_0F17) },
8343     /* 18 */
8344     { Bad_Opcode },
8345     { Bad_Opcode },
8346     { Bad_Opcode },
8347     { Bad_Opcode },
8348     { Bad_Opcode },
8349     { Bad_Opcode },
8350     { Bad_Opcode },
8351     { Bad_Opcode },
8352     /* 20 */
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     { Bad_Opcode },
8357     { Bad_Opcode },
8358     { Bad_Opcode },
8359     { Bad_Opcode },
8360     { Bad_Opcode },
8361     /* 28 */
8362     { VEX_W_TABLE (VEX_W_0F28) },
8363     { VEX_W_TABLE (VEX_W_0F29) },
8364     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8365     { MOD_TABLE (MOD_VEX_0F2B) },
8366     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8367     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8368     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8369     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8370     /* 30 */
8371     { Bad_Opcode },
8372     { Bad_Opcode },
8373     { Bad_Opcode },
8374     { Bad_Opcode },
8375     { Bad_Opcode },
8376     { Bad_Opcode },
8377     { Bad_Opcode },
8378     { Bad_Opcode },
8379     /* 38 */
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     { Bad_Opcode },
8384     { Bad_Opcode },
8385     { Bad_Opcode },
8386     { Bad_Opcode },
8387     { Bad_Opcode },
8388     /* 40 */
8389     { Bad_Opcode },
8390     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8391     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8392     { Bad_Opcode },
8393     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8394     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8395     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8396     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8397     /* 48 */
8398     { Bad_Opcode },
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8402     { Bad_Opcode },
8403     { Bad_Opcode },
8404     { Bad_Opcode },
8405     { Bad_Opcode },
8406     /* 50 */
8407     { MOD_TABLE (MOD_VEX_0F50) },
8408     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8409     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8410     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8411     { "vandpX",         { XM, Vex, EXx } },
8412     { "vandnpX",        { XM, Vex, EXx } },
8413     { "vorpX",          { XM, Vex, EXx } },
8414     { "vxorpX",         { XM, Vex, EXx } },
8415     /* 58 */
8416     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8417     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8418     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8419     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8420     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8421     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8422     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8423     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8424     /* 60 */
8425     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8426     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8427     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8428     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8429     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8430     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8431     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8432     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8433     /* 68 */
8434     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8435     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8436     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8437     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8438     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8439     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8440     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8441     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8442     /* 70 */
8443     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8444     { REG_TABLE (REG_VEX_0F71) },
8445     { REG_TABLE (REG_VEX_0F72) },
8446     { REG_TABLE (REG_VEX_0F73) },
8447     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8448     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8449     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8450     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8451     /* 78 */
8452     { Bad_Opcode },
8453     { Bad_Opcode },
8454     { Bad_Opcode },
8455     { Bad_Opcode },
8456     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8457     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8458     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8459     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8460     /* 80 */
8461     { Bad_Opcode },
8462     { Bad_Opcode },
8463     { Bad_Opcode },
8464     { Bad_Opcode },
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     /* 88 */
8470     { Bad_Opcode },
8471     { Bad_Opcode },
8472     { Bad_Opcode },
8473     { Bad_Opcode },
8474     { Bad_Opcode },
8475     { Bad_Opcode },
8476     { Bad_Opcode },
8477     { Bad_Opcode },
8478     /* 90 */
8479     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8480     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8481     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8482     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8483     { Bad_Opcode },
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     { Bad_Opcode },
8487     /* 98 */
8488     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8489     { Bad_Opcode },
8490     { Bad_Opcode },
8491     { Bad_Opcode },
8492     { Bad_Opcode },
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     { Bad_Opcode },
8496     /* a0 */
8497     { Bad_Opcode },
8498     { Bad_Opcode },
8499     { Bad_Opcode },
8500     { Bad_Opcode },
8501     { Bad_Opcode },
8502     { Bad_Opcode },
8503     { Bad_Opcode },
8504     { Bad_Opcode },
8505     /* a8 */
8506     { Bad_Opcode },
8507     { Bad_Opcode },
8508     { Bad_Opcode },
8509     { Bad_Opcode },
8510     { Bad_Opcode },
8511     { Bad_Opcode },
8512     { REG_TABLE (REG_VEX_0FAE) },
8513     { Bad_Opcode },
8514     /* b0 */
8515     { Bad_Opcode },
8516     { Bad_Opcode },
8517     { Bad_Opcode },
8518     { Bad_Opcode },
8519     { Bad_Opcode },
8520     { Bad_Opcode },
8521     { Bad_Opcode },
8522     { Bad_Opcode },
8523     /* b8 */
8524     { Bad_Opcode },
8525     { Bad_Opcode },
8526     { Bad_Opcode },
8527     { Bad_Opcode },
8528     { Bad_Opcode },
8529     { Bad_Opcode },
8530     { Bad_Opcode },
8531     { Bad_Opcode },
8532     /* c0 */
8533     { Bad_Opcode },
8534     { Bad_Opcode },
8535     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8536     { Bad_Opcode },
8537     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8538     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8539     { "vshufpX",        { XM, Vex, EXx, Ib } },
8540     { Bad_Opcode },
8541     /* c8 */
8542     { Bad_Opcode },
8543     { Bad_Opcode },
8544     { Bad_Opcode },
8545     { Bad_Opcode },
8546     { Bad_Opcode },
8547     { Bad_Opcode },
8548     { Bad_Opcode },
8549     { Bad_Opcode },
8550     /* d0 */
8551     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8552     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8553     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8554     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8555     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8556     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8557     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8558     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8559     /* d8 */
8560     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8561     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8562     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8563     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8564     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8565     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8566     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8567     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8568     /* e0 */
8569     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8570     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8571     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8572     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8573     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8574     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8575     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8576     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8577     /* e8 */
8578     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8579     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8580     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8581     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8582     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8583     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8584     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8585     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8586     /* f0 */
8587     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8588     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8589     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8590     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8591     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8592     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8593     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8594     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8595     /* f8 */
8596     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8597     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8598     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8599     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8600     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8601     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8602     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8603     { Bad_Opcode },
8604   },
8605   /* VEX_0F38 */
8606   {
8607     /* 00 */
8608     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8609     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8610     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8611     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8612     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8613     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8614     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8615     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8616     /* 08 */
8617     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8618     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8619     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8620     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8621     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8622     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8623     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8624     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8625     /* 10 */
8626     { Bad_Opcode },
8627     { Bad_Opcode },
8628     { Bad_Opcode },
8629     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8630     { Bad_Opcode },
8631     { Bad_Opcode },
8632     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8633     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8634     /* 18 */
8635     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8636     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8637     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8638     { Bad_Opcode },
8639     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8640     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8641     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8642     { Bad_Opcode },
8643     /* 20 */
8644     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8645     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8646     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8647     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8648     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8649     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8650     { Bad_Opcode },
8651     { Bad_Opcode },
8652     /* 28 */
8653     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8654     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8655     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8656     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8657     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8658     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8659     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8660     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8661     /* 30 */
8662     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8663     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8664     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8665     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8666     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8667     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8668     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8669     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8670     /* 38 */
8671     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8672     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8673     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8674     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8675     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8676     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8677     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8678     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8679     /* 40 */
8680     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8681     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8682     { Bad_Opcode },
8683     { Bad_Opcode },
8684     { Bad_Opcode },
8685     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8686     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8687     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8688     /* 48 */
8689     { Bad_Opcode },
8690     { Bad_Opcode },
8691     { Bad_Opcode },
8692     { Bad_Opcode },
8693     { Bad_Opcode },
8694     { Bad_Opcode },
8695     { Bad_Opcode },
8696     { Bad_Opcode },
8697     /* 50 */
8698     { Bad_Opcode },
8699     { Bad_Opcode },
8700     { Bad_Opcode },
8701     { Bad_Opcode },
8702     { Bad_Opcode },
8703     { Bad_Opcode },
8704     { Bad_Opcode },
8705     { Bad_Opcode },
8706     /* 58 */
8707     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8708     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8709     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8710     { Bad_Opcode },
8711     { Bad_Opcode },
8712     { Bad_Opcode },
8713     { Bad_Opcode },
8714     { Bad_Opcode },
8715     /* 60 */
8716     { Bad_Opcode },
8717     { Bad_Opcode },
8718     { Bad_Opcode },
8719     { Bad_Opcode },
8720     { Bad_Opcode },
8721     { Bad_Opcode },
8722     { Bad_Opcode },
8723     { Bad_Opcode },
8724     /* 68 */
8725     { Bad_Opcode },
8726     { Bad_Opcode },
8727     { Bad_Opcode },
8728     { Bad_Opcode },
8729     { Bad_Opcode },
8730     { Bad_Opcode },
8731     { Bad_Opcode },
8732     { Bad_Opcode },
8733     /* 70 */
8734     { Bad_Opcode },
8735     { Bad_Opcode },
8736     { Bad_Opcode },
8737     { Bad_Opcode },
8738     { Bad_Opcode },
8739     { Bad_Opcode },
8740     { Bad_Opcode },
8741     { Bad_Opcode },
8742     /* 78 */
8743     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8744     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8745     { Bad_Opcode },
8746     { Bad_Opcode },
8747     { Bad_Opcode },
8748     { Bad_Opcode },
8749     { Bad_Opcode },
8750     { Bad_Opcode },
8751     /* 80 */
8752     { Bad_Opcode },
8753     { Bad_Opcode },
8754     { Bad_Opcode },
8755     { Bad_Opcode },
8756     { Bad_Opcode },
8757     { Bad_Opcode },
8758     { Bad_Opcode },
8759     { Bad_Opcode },
8760     /* 88 */
8761     { Bad_Opcode },
8762     { Bad_Opcode },
8763     { Bad_Opcode },
8764     { Bad_Opcode },
8765     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8766     { Bad_Opcode },
8767     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8768     { Bad_Opcode },
8769     /* 90 */
8770     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8771     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8772     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8773     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8774     { Bad_Opcode },
8775     { Bad_Opcode },
8776     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8777     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8778     /* 98 */
8779     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8780     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8781     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8782     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8783     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8784     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8785     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8786     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8787     /* a0 */
8788     { Bad_Opcode },
8789     { Bad_Opcode },
8790     { Bad_Opcode },
8791     { Bad_Opcode },
8792     { Bad_Opcode },
8793     { Bad_Opcode },
8794     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8795     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8796     /* a8 */
8797     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8798     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8799     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8800     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8801     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8802     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8803     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8804     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8805     /* b0 */
8806     { Bad_Opcode },
8807     { Bad_Opcode },
8808     { Bad_Opcode },
8809     { Bad_Opcode },
8810     { Bad_Opcode },
8811     { Bad_Opcode },
8812     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8813     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8814     /* b8 */
8815     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8816     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8817     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8818     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8819     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8820     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8821     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8822     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8823     /* c0 */
8824     { Bad_Opcode },
8825     { Bad_Opcode },
8826     { Bad_Opcode },
8827     { Bad_Opcode },
8828     { Bad_Opcode },
8829     { Bad_Opcode },
8830     { Bad_Opcode },
8831     { Bad_Opcode },
8832     /* c8 */
8833     { Bad_Opcode },
8834     { Bad_Opcode },
8835     { Bad_Opcode },
8836     { Bad_Opcode },
8837     { Bad_Opcode },
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     { Bad_Opcode },
8841     /* d0 */
8842     { Bad_Opcode },
8843     { Bad_Opcode },
8844     { Bad_Opcode },
8845     { Bad_Opcode },
8846     { Bad_Opcode },
8847     { Bad_Opcode },
8848     { Bad_Opcode },
8849     { Bad_Opcode },
8850     /* d8 */
8851     { Bad_Opcode },
8852     { Bad_Opcode },
8853     { Bad_Opcode },
8854     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8855     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8856     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8857     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8858     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8859     /* e0 */
8860     { Bad_Opcode },
8861     { Bad_Opcode },
8862     { Bad_Opcode },
8863     { Bad_Opcode },
8864     { Bad_Opcode },
8865     { Bad_Opcode },
8866     { Bad_Opcode },
8867     { Bad_Opcode },
8868     /* e8 */
8869     { Bad_Opcode },
8870     { Bad_Opcode },
8871     { Bad_Opcode },
8872     { Bad_Opcode },
8873     { Bad_Opcode },
8874     { Bad_Opcode },
8875     { Bad_Opcode },
8876     { Bad_Opcode },
8877     /* f0 */
8878     { Bad_Opcode },
8879     { Bad_Opcode },
8880     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8881     { REG_TABLE (REG_VEX_0F38F3) },
8882     { Bad_Opcode },
8883     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8884     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8885     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8886     /* f8 */
8887     { Bad_Opcode },
8888     { Bad_Opcode },
8889     { Bad_Opcode },
8890     { Bad_Opcode },
8891     { Bad_Opcode },
8892     { Bad_Opcode },
8893     { Bad_Opcode },
8894     { Bad_Opcode },
8895   },
8896   /* VEX_0F3A */
8897   {
8898     /* 00 */
8899     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8900     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8901     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8902     { Bad_Opcode },
8903     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8904     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
8905     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
8906     { Bad_Opcode },
8907     /* 08 */
8908     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
8909     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
8910     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
8911     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
8912     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
8913     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
8914     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
8915     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
8916     /* 10 */
8917     { Bad_Opcode },
8918     { Bad_Opcode },
8919     { Bad_Opcode },
8920     { Bad_Opcode },
8921     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
8922     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
8923     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
8924     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
8925     /* 18 */
8926     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
8927     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
8928     { Bad_Opcode },
8929     { Bad_Opcode },
8930     { Bad_Opcode },
8931     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
8932     { Bad_Opcode },
8933     { Bad_Opcode },
8934     /* 20 */
8935     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
8936     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
8937     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
8938     { Bad_Opcode },
8939     { Bad_Opcode },
8940     { Bad_Opcode },
8941     { Bad_Opcode },
8942     { Bad_Opcode },
8943     /* 28 */
8944     { Bad_Opcode },
8945     { Bad_Opcode },
8946     { Bad_Opcode },
8947     { Bad_Opcode },
8948     { Bad_Opcode },
8949     { Bad_Opcode },
8950     { Bad_Opcode },
8951     { Bad_Opcode },
8952     /* 30 */
8953     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
8954     { Bad_Opcode },
8955     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
8956     { Bad_Opcode },
8957     { Bad_Opcode },
8958     { Bad_Opcode },
8959     { Bad_Opcode },
8960     { Bad_Opcode },
8961     /* 38 */
8962     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
8963     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
8964     { Bad_Opcode },
8965     { Bad_Opcode },
8966     { Bad_Opcode },
8967     { Bad_Opcode },
8968     { Bad_Opcode },
8969     { Bad_Opcode },
8970     /* 40 */
8971     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
8972     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
8973     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
8974     { Bad_Opcode },
8975     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
8976     { Bad_Opcode },
8977     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
8978     { Bad_Opcode },
8979     /* 48 */
8980     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
8981     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
8982     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
8983     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
8984     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
8985     { Bad_Opcode },
8986     { Bad_Opcode },
8987     { Bad_Opcode },
8988     /* 50 */
8989     { Bad_Opcode },
8990     { Bad_Opcode },
8991     { Bad_Opcode },
8992     { Bad_Opcode },
8993     { Bad_Opcode },
8994     { Bad_Opcode },
8995     { Bad_Opcode },
8996     { Bad_Opcode },
8997     /* 58 */
8998     { Bad_Opcode },
8999     { Bad_Opcode },
9000     { Bad_Opcode },
9001     { Bad_Opcode },
9002     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9003     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9004     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9005     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9006     /* 60 */
9007     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9008     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9009     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9010     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9011     { Bad_Opcode },
9012     { Bad_Opcode },
9013     { Bad_Opcode },
9014     { Bad_Opcode },
9015     /* 68 */
9016     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9017     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9018     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9019     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9020     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9021     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9022     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9023     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9024     /* 70 */
9025     { Bad_Opcode },
9026     { Bad_Opcode },
9027     { Bad_Opcode },
9028     { Bad_Opcode },
9029     { Bad_Opcode },
9030     { Bad_Opcode },
9031     { Bad_Opcode },
9032     { Bad_Opcode },
9033     /* 78 */
9034     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9035     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9036     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9037     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9038     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9039     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9040     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9041     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9042     /* 80 */
9043     { Bad_Opcode },
9044     { Bad_Opcode },
9045     { Bad_Opcode },
9046     { Bad_Opcode },
9047     { Bad_Opcode },
9048     { Bad_Opcode },
9049     { Bad_Opcode },
9050     { Bad_Opcode },
9051     /* 88 */
9052     { Bad_Opcode },
9053     { Bad_Opcode },
9054     { Bad_Opcode },
9055     { Bad_Opcode },
9056     { Bad_Opcode },
9057     { Bad_Opcode },
9058     { Bad_Opcode },
9059     { Bad_Opcode },
9060     /* 90 */
9061     { Bad_Opcode },
9062     { Bad_Opcode },
9063     { Bad_Opcode },
9064     { Bad_Opcode },
9065     { Bad_Opcode },
9066     { Bad_Opcode },
9067     { Bad_Opcode },
9068     { Bad_Opcode },
9069     /* 98 */
9070     { Bad_Opcode },
9071     { Bad_Opcode },
9072     { Bad_Opcode },
9073     { Bad_Opcode },
9074     { Bad_Opcode },
9075     { Bad_Opcode },
9076     { Bad_Opcode },
9077     { Bad_Opcode },
9078     /* a0 */
9079     { Bad_Opcode },
9080     { Bad_Opcode },
9081     { Bad_Opcode },
9082     { Bad_Opcode },
9083     { Bad_Opcode },
9084     { Bad_Opcode },
9085     { Bad_Opcode },
9086     { Bad_Opcode },
9087     /* a8 */
9088     { Bad_Opcode },
9089     { Bad_Opcode },
9090     { Bad_Opcode },
9091     { Bad_Opcode },
9092     { Bad_Opcode },
9093     { Bad_Opcode },
9094     { Bad_Opcode },
9095     { Bad_Opcode },
9096     /* b0 */
9097     { Bad_Opcode },
9098     { Bad_Opcode },
9099     { Bad_Opcode },
9100     { Bad_Opcode },
9101     { Bad_Opcode },
9102     { Bad_Opcode },
9103     { Bad_Opcode },
9104     { Bad_Opcode },
9105     /* b8 */
9106     { Bad_Opcode },
9107     { Bad_Opcode },
9108     { Bad_Opcode },
9109     { Bad_Opcode },
9110     { Bad_Opcode },
9111     { Bad_Opcode },
9112     { Bad_Opcode },
9113     { Bad_Opcode },
9114     /* c0 */
9115     { Bad_Opcode },
9116     { Bad_Opcode },
9117     { Bad_Opcode },
9118     { Bad_Opcode },
9119     { Bad_Opcode },
9120     { Bad_Opcode },
9121     { Bad_Opcode },
9122     { Bad_Opcode },
9123     /* c8 */
9124     { Bad_Opcode },
9125     { Bad_Opcode },
9126     { Bad_Opcode },
9127     { Bad_Opcode },
9128     { Bad_Opcode },
9129     { Bad_Opcode },
9130     { Bad_Opcode },
9131     { Bad_Opcode },
9132     /* d0 */
9133     { Bad_Opcode },
9134     { Bad_Opcode },
9135     { Bad_Opcode },
9136     { Bad_Opcode },
9137     { Bad_Opcode },
9138     { Bad_Opcode },
9139     { Bad_Opcode },
9140     { Bad_Opcode },
9141     /* d8 */
9142     { Bad_Opcode },
9143     { Bad_Opcode },
9144     { Bad_Opcode },
9145     { Bad_Opcode },
9146     { Bad_Opcode },
9147     { Bad_Opcode },
9148     { Bad_Opcode },
9149     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9150     /* e0 */
9151     { Bad_Opcode },
9152     { Bad_Opcode },
9153     { Bad_Opcode },
9154     { Bad_Opcode },
9155     { Bad_Opcode },
9156     { Bad_Opcode },
9157     { Bad_Opcode },
9158     { Bad_Opcode },
9159     /* e8 */
9160     { Bad_Opcode },
9161     { Bad_Opcode },
9162     { Bad_Opcode },
9163     { Bad_Opcode },
9164     { Bad_Opcode },
9165     { Bad_Opcode },
9166     { Bad_Opcode },
9167     { Bad_Opcode },
9168     /* f0 */
9169     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9170     { Bad_Opcode },
9171     { Bad_Opcode },
9172     { Bad_Opcode },
9173     { Bad_Opcode },
9174     { Bad_Opcode },
9175     { Bad_Opcode },
9176     { Bad_Opcode },
9177     /* f8 */
9178     { Bad_Opcode },
9179     { Bad_Opcode },
9180     { Bad_Opcode },
9181     { Bad_Opcode },
9182     { Bad_Opcode },
9183     { Bad_Opcode },
9184     { Bad_Opcode },
9185     { Bad_Opcode },
9186   },
9187 };
9188
9189 #define NEED_OPCODE_TABLE
9190 #include "i386-dis-evex.h"
9191 #undef NEED_OPCODE_TABLE
9192 static const struct dis386 vex_len_table[][2] = {
9193   /* VEX_LEN_0F10_P_1 */
9194   {
9195     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9196     { VEX_W_TABLE (VEX_W_0F10_P_1) },
9197   },
9198
9199   /* VEX_LEN_0F10_P_3 */
9200   {
9201     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9202     { VEX_W_TABLE (VEX_W_0F10_P_3) },
9203   },
9204
9205   /* VEX_LEN_0F11_P_1 */
9206   {
9207     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9208     { VEX_W_TABLE (VEX_W_0F11_P_1) },
9209   },
9210
9211   /* VEX_LEN_0F11_P_3 */
9212   {
9213     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9214     { VEX_W_TABLE (VEX_W_0F11_P_3) },
9215   },
9216
9217   /* VEX_LEN_0F12_P_0_M_0 */
9218   {
9219     { VEX_W_TABLE (VEX_W_0F12_P_0_M_0) },
9220   },
9221
9222   /* VEX_LEN_0F12_P_0_M_1 */
9223   {
9224     { VEX_W_TABLE (VEX_W_0F12_P_0_M_1) },
9225   },
9226
9227   /* VEX_LEN_0F12_P_2 */
9228   {
9229     { VEX_W_TABLE (VEX_W_0F12_P_2) },
9230   },
9231
9232   /* VEX_LEN_0F13_M_0 */
9233   {
9234     { VEX_W_TABLE (VEX_W_0F13_M_0) },
9235   },
9236
9237   /* VEX_LEN_0F16_P_0_M_0 */
9238   {
9239     { VEX_W_TABLE (VEX_W_0F16_P_0_M_0) },
9240   },
9241
9242   /* VEX_LEN_0F16_P_0_M_1 */
9243   {
9244     { VEX_W_TABLE (VEX_W_0F16_P_0_M_1) },
9245   },
9246
9247   /* VEX_LEN_0F16_P_2 */
9248   {
9249     { VEX_W_TABLE (VEX_W_0F16_P_2) },
9250   },
9251
9252   /* VEX_LEN_0F17_M_0 */
9253   {
9254     { VEX_W_TABLE (VEX_W_0F17_M_0) },
9255   },
9256
9257   /* VEX_LEN_0F2A_P_1 */
9258   {
9259     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev } },
9260     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev } },
9261   },
9262
9263   /* VEX_LEN_0F2A_P_3 */
9264   {
9265     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev } },
9266     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev } },
9267   },
9268
9269   /* VEX_LEN_0F2C_P_1 */
9270   {
9271     { "vcvttss2siY",    { Gv, EXdScalar } },
9272     { "vcvttss2siY",    { Gv, EXdScalar } },
9273   },
9274
9275   /* VEX_LEN_0F2C_P_3 */
9276   {
9277     { "vcvttsd2siY",    { Gv, EXqScalar } },
9278     { "vcvttsd2siY",    { Gv, EXqScalar } },
9279   },
9280
9281   /* VEX_LEN_0F2D_P_1 */
9282   {
9283     { "vcvtss2siY",     { Gv, EXdScalar } },
9284     { "vcvtss2siY",     { Gv, EXdScalar } },
9285   },
9286
9287   /* VEX_LEN_0F2D_P_3 */
9288   {
9289     { "vcvtsd2siY",     { Gv, EXqScalar } },
9290     { "vcvtsd2siY",     { Gv, EXqScalar } },
9291   },
9292
9293   /* VEX_LEN_0F2E_P_0 */
9294   {
9295     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9296     { VEX_W_TABLE (VEX_W_0F2E_P_0) },
9297   },
9298
9299   /* VEX_LEN_0F2E_P_2 */
9300   {
9301     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9302     { VEX_W_TABLE (VEX_W_0F2E_P_2) },
9303   },
9304
9305   /* VEX_LEN_0F2F_P_0 */
9306   {
9307     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9308     { VEX_W_TABLE (VEX_W_0F2F_P_0) },
9309   },
9310
9311   /* VEX_LEN_0F2F_P_2 */
9312   {
9313     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9314     { VEX_W_TABLE (VEX_W_0F2F_P_2) },
9315   },
9316
9317   /* VEX_LEN_0F41_P_0 */
9318   {
9319     { Bad_Opcode },
9320     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9321   },
9322   /* VEX_LEN_0F42_P_0 */
9323   {
9324     { Bad_Opcode },
9325     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9326   },
9327   /* VEX_LEN_0F44_P_0 */
9328   {
9329     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9330   },
9331   /* VEX_LEN_0F45_P_0 */
9332   {
9333     { Bad_Opcode },
9334     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9335   },
9336   /* VEX_LEN_0F46_P_0 */
9337   {
9338     { Bad_Opcode },
9339     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9340   },
9341   /* VEX_LEN_0F47_P_0 */
9342   {
9343     { Bad_Opcode },
9344     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9345   },
9346   /* VEX_LEN_0F4B_P_2 */
9347   {
9348     { Bad_Opcode },
9349     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9350   },
9351
9352   /* VEX_LEN_0F51_P_1 */
9353   {
9354     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9355     { VEX_W_TABLE (VEX_W_0F51_P_1) },
9356   },
9357
9358   /* VEX_LEN_0F51_P_3 */
9359   {
9360     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9361     { VEX_W_TABLE (VEX_W_0F51_P_3) },
9362   },
9363
9364   /* VEX_LEN_0F52_P_1 */
9365   {
9366     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9367     { VEX_W_TABLE (VEX_W_0F52_P_1) },
9368   },
9369
9370   /* VEX_LEN_0F53_P_1 */
9371   {
9372     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9373     { VEX_W_TABLE (VEX_W_0F53_P_1) },
9374   },
9375
9376   /* VEX_LEN_0F58_P_1 */
9377   {
9378     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9379     { VEX_W_TABLE (VEX_W_0F58_P_1) },
9380   },
9381
9382   /* VEX_LEN_0F58_P_3 */
9383   {
9384     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9385     { VEX_W_TABLE (VEX_W_0F58_P_3) },
9386   },
9387
9388   /* VEX_LEN_0F59_P_1 */
9389   {
9390     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9391     { VEX_W_TABLE (VEX_W_0F59_P_1) },
9392   },
9393
9394   /* VEX_LEN_0F59_P_3 */
9395   {
9396     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9397     { VEX_W_TABLE (VEX_W_0F59_P_3) },
9398   },
9399
9400   /* VEX_LEN_0F5A_P_1 */
9401   {
9402     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9403     { VEX_W_TABLE (VEX_W_0F5A_P_1) },
9404   },
9405
9406   /* VEX_LEN_0F5A_P_3 */
9407   {
9408     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9409     { VEX_W_TABLE (VEX_W_0F5A_P_3) },
9410   },
9411
9412   /* VEX_LEN_0F5C_P_1 */
9413   {
9414     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9415     { VEX_W_TABLE (VEX_W_0F5C_P_1) },
9416   },
9417
9418   /* VEX_LEN_0F5C_P_3 */
9419   {
9420     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9421     { VEX_W_TABLE (VEX_W_0F5C_P_3) },
9422   },
9423
9424   /* VEX_LEN_0F5D_P_1 */
9425   {
9426     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9427     { VEX_W_TABLE (VEX_W_0F5D_P_1) },
9428   },
9429
9430   /* VEX_LEN_0F5D_P_3 */
9431   {
9432     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9433     { VEX_W_TABLE (VEX_W_0F5D_P_3) },
9434   },
9435
9436   /* VEX_LEN_0F5E_P_1 */
9437   {
9438     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9439     { VEX_W_TABLE (VEX_W_0F5E_P_1) },
9440   },
9441
9442   /* VEX_LEN_0F5E_P_3 */
9443   {
9444     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9445     { VEX_W_TABLE (VEX_W_0F5E_P_3) },
9446   },
9447
9448   /* VEX_LEN_0F5F_P_1 */
9449   {
9450     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9451     { VEX_W_TABLE (VEX_W_0F5F_P_1) },
9452   },
9453
9454   /* VEX_LEN_0F5F_P_3 */
9455   {
9456     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9457     { VEX_W_TABLE (VEX_W_0F5F_P_3) },
9458   },
9459
9460   /* VEX_LEN_0F6E_P_2 */
9461   {
9462     { "vmovK",          { XMScalar, Edq } },
9463     { "vmovK",          { XMScalar, Edq } },
9464   },
9465
9466   /* VEX_LEN_0F7E_P_1 */
9467   {
9468     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9469     { VEX_W_TABLE (VEX_W_0F7E_P_1) },
9470   },
9471
9472   /* VEX_LEN_0F7E_P_2 */
9473   {
9474     { "vmovK",          { Edq, XMScalar } },
9475     { "vmovK",          { Edq, XMScalar } },
9476   },
9477
9478   /* VEX_LEN_0F90_P_0 */
9479   {
9480     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9481   },
9482
9483   /* VEX_LEN_0F91_P_0 */
9484   {
9485     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9486   },
9487
9488   /* VEX_LEN_0F92_P_0 */
9489   {
9490     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9491   },
9492
9493   /* VEX_LEN_0F93_P_0 */
9494   {
9495     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9496   },
9497
9498   /* VEX_LEN_0F98_P_0 */
9499   {
9500     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9501   },
9502
9503   /* VEX_LEN_0FAE_R_2_M_0 */
9504   {
9505     { VEX_W_TABLE (VEX_W_0FAE_R_2_M_0) },
9506   },
9507
9508   /* VEX_LEN_0FAE_R_3_M_0 */
9509   {
9510     { VEX_W_TABLE (VEX_W_0FAE_R_3_M_0) },
9511   },
9512
9513   /* VEX_LEN_0FC2_P_1 */
9514   {
9515     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9516     { VEX_W_TABLE (VEX_W_0FC2_P_1) },
9517   },
9518
9519   /* VEX_LEN_0FC2_P_3 */
9520   {
9521     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9522     { VEX_W_TABLE (VEX_W_0FC2_P_3) },
9523   },
9524
9525   /* VEX_LEN_0FC4_P_2 */
9526   {
9527     { VEX_W_TABLE (VEX_W_0FC4_P_2) },
9528   },
9529
9530   /* VEX_LEN_0FC5_P_2 */
9531   {
9532     { VEX_W_TABLE (VEX_W_0FC5_P_2) },
9533   },
9534
9535   /* VEX_LEN_0FD6_P_2 */
9536   {
9537     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9538     { VEX_W_TABLE (VEX_W_0FD6_P_2) },
9539   },
9540
9541   /* VEX_LEN_0FF7_P_2 */
9542   {
9543     { VEX_W_TABLE (VEX_W_0FF7_P_2) },
9544   },
9545
9546   /* VEX_LEN_0F3816_P_2 */
9547   {
9548     { Bad_Opcode },
9549     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9550   },
9551
9552   /* VEX_LEN_0F3819_P_2 */
9553   {
9554     { Bad_Opcode },
9555     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9556   },
9557
9558   /* VEX_LEN_0F381A_P_2_M_0 */
9559   {
9560     { Bad_Opcode },
9561     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9562   },
9563
9564   /* VEX_LEN_0F3836_P_2 */
9565   {
9566     { Bad_Opcode },
9567     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9568   },
9569
9570   /* VEX_LEN_0F3841_P_2 */
9571   {
9572     { VEX_W_TABLE (VEX_W_0F3841_P_2) },
9573   },
9574
9575   /* VEX_LEN_0F385A_P_2_M_0 */
9576   {
9577     { Bad_Opcode },
9578     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9579   },
9580
9581   /* VEX_LEN_0F38DB_P_2 */
9582   {
9583     { VEX_W_TABLE (VEX_W_0F38DB_P_2) },
9584   },
9585
9586   /* VEX_LEN_0F38DC_P_2 */
9587   {
9588     { VEX_W_TABLE (VEX_W_0F38DC_P_2) },
9589   },
9590
9591   /* VEX_LEN_0F38DD_P_2 */
9592   {
9593     { VEX_W_TABLE (VEX_W_0F38DD_P_2) },
9594   },
9595
9596   /* VEX_LEN_0F38DE_P_2 */
9597   {
9598     { VEX_W_TABLE (VEX_W_0F38DE_P_2) },
9599   },
9600
9601   /* VEX_LEN_0F38DF_P_2 */
9602   {
9603     { VEX_W_TABLE (VEX_W_0F38DF_P_2) },
9604   },
9605
9606   /* VEX_LEN_0F38F2_P_0 */
9607   {
9608     { "andnS",          { Gdq, VexGdq, Edq } },
9609   },
9610
9611   /* VEX_LEN_0F38F3_R_1_P_0 */
9612   {
9613     { "blsrS",          { VexGdq, Edq } },
9614   },
9615
9616   /* VEX_LEN_0F38F3_R_2_P_0 */
9617   {
9618     { "blsmskS",        { VexGdq, Edq } },
9619   },
9620
9621   /* VEX_LEN_0F38F3_R_3_P_0 */
9622   {
9623     { "blsiS",          { VexGdq, Edq } },
9624   },
9625
9626   /* VEX_LEN_0F38F5_P_0 */
9627   {
9628     { "bzhiS",          { Gdq, Edq, VexGdq } },
9629   },
9630
9631   /* VEX_LEN_0F38F5_P_1 */
9632   {
9633     { "pextS",          { Gdq, VexGdq, Edq } },
9634   },
9635
9636   /* VEX_LEN_0F38F5_P_3 */
9637   {
9638     { "pdepS",          { Gdq, VexGdq, Edq } },
9639   },
9640
9641   /* VEX_LEN_0F38F6_P_3 */
9642   {
9643     { "mulxS",          { Gdq, VexGdq, Edq } },
9644   },
9645
9646   /* VEX_LEN_0F38F7_P_0 */
9647   {
9648     { "bextrS",         { Gdq, Edq, VexGdq } },
9649   },
9650
9651   /* VEX_LEN_0F38F7_P_1 */
9652   {
9653     { "sarxS",          { Gdq, Edq, VexGdq } },
9654   },
9655
9656   /* VEX_LEN_0F38F7_P_2 */
9657   {
9658     { "shlxS",          { Gdq, Edq, VexGdq } },
9659   },
9660
9661   /* VEX_LEN_0F38F7_P_3 */
9662   {
9663     { "shrxS",          { Gdq, Edq, VexGdq } },
9664   },
9665
9666   /* VEX_LEN_0F3A00_P_2 */
9667   {
9668     { Bad_Opcode },
9669     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9670   },
9671
9672   /* VEX_LEN_0F3A01_P_2 */
9673   {
9674     { Bad_Opcode },
9675     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9676   },
9677
9678   /* VEX_LEN_0F3A06_P_2 */
9679   {
9680     { Bad_Opcode },
9681     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9682   },
9683
9684   /* VEX_LEN_0F3A0A_P_2 */
9685   {
9686     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9687     { VEX_W_TABLE (VEX_W_0F3A0A_P_2) },
9688   },
9689
9690   /* VEX_LEN_0F3A0B_P_2 */
9691   {
9692     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9693     { VEX_W_TABLE (VEX_W_0F3A0B_P_2) },
9694   },
9695
9696   /* VEX_LEN_0F3A14_P_2 */
9697   {
9698     { VEX_W_TABLE (VEX_W_0F3A14_P_2) },
9699   },
9700
9701   /* VEX_LEN_0F3A15_P_2 */
9702   {
9703     { VEX_W_TABLE (VEX_W_0F3A15_P_2) },
9704   },
9705
9706   /* VEX_LEN_0F3A16_P_2  */
9707   {
9708     { "vpextrK",        { Edq, XM, Ib } },
9709   },
9710
9711   /* VEX_LEN_0F3A17_P_2 */
9712   {
9713     { "vextractps",     { Edqd, XM, Ib } },
9714   },
9715
9716   /* VEX_LEN_0F3A18_P_2 */
9717   {
9718     { Bad_Opcode },
9719     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9720   },
9721
9722   /* VEX_LEN_0F3A19_P_2 */
9723   {
9724     { Bad_Opcode },
9725     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9726   },
9727
9728   /* VEX_LEN_0F3A20_P_2 */
9729   {
9730     { VEX_W_TABLE (VEX_W_0F3A20_P_2) },
9731   },
9732
9733   /* VEX_LEN_0F3A21_P_2 */
9734   {
9735     { VEX_W_TABLE (VEX_W_0F3A21_P_2) },
9736   },
9737
9738   /* VEX_LEN_0F3A22_P_2 */
9739   {
9740     { "vpinsrK",        { XM, Vex128, Edq, Ib } },
9741   },
9742
9743   /* VEX_LEN_0F3A30_P_2 */
9744   {
9745     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9746   },
9747
9748   /* VEX_LEN_0F3A32_P_2 */
9749   {
9750     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9751   },
9752
9753   /* VEX_LEN_0F3A38_P_2 */
9754   {
9755     { Bad_Opcode },
9756     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9757   },
9758
9759   /* VEX_LEN_0F3A39_P_2 */
9760   {
9761     { Bad_Opcode },
9762     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9763   },
9764
9765   /* VEX_LEN_0F3A41_P_2 */
9766   {
9767     { VEX_W_TABLE (VEX_W_0F3A41_P_2) },
9768   },
9769
9770   /* VEX_LEN_0F3A44_P_2 */
9771   {
9772     { VEX_W_TABLE (VEX_W_0F3A44_P_2) },
9773   },
9774
9775   /* VEX_LEN_0F3A46_P_2 */
9776   {
9777     { Bad_Opcode },
9778     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9779   },
9780
9781   /* VEX_LEN_0F3A60_P_2 */
9782   {
9783     { VEX_W_TABLE (VEX_W_0F3A60_P_2) },
9784   },
9785
9786   /* VEX_LEN_0F3A61_P_2 */
9787   {
9788     { VEX_W_TABLE (VEX_W_0F3A61_P_2) },
9789   },
9790
9791   /* VEX_LEN_0F3A62_P_2 */
9792   {
9793     { VEX_W_TABLE (VEX_W_0F3A62_P_2) },
9794   },
9795
9796   /* VEX_LEN_0F3A63_P_2 */
9797   {
9798     { VEX_W_TABLE (VEX_W_0F3A63_P_2) },
9799   },
9800
9801   /* VEX_LEN_0F3A6A_P_2 */
9802   {
9803     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9804   },
9805
9806   /* VEX_LEN_0F3A6B_P_2 */
9807   {
9808     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9809   },
9810
9811   /* VEX_LEN_0F3A6E_P_2 */
9812   {
9813     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9814   },
9815
9816   /* VEX_LEN_0F3A6F_P_2 */
9817   {
9818     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9819   },
9820
9821   /* VEX_LEN_0F3A7A_P_2 */
9822   {
9823     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9824   },
9825
9826   /* VEX_LEN_0F3A7B_P_2 */
9827   {
9828     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9829   },
9830
9831   /* VEX_LEN_0F3A7E_P_2 */
9832   {
9833     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW, VexI4 } },
9834   },
9835
9836   /* VEX_LEN_0F3A7F_P_2 */
9837   {
9838     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW, VexI4 } },
9839   },
9840
9841   /* VEX_LEN_0F3ADF_P_2 */
9842   {
9843     { VEX_W_TABLE (VEX_W_0F3ADF_P_2) },
9844   },
9845
9846   /* VEX_LEN_0F3AF0_P_3 */
9847   {
9848     { "rorxS",          { Gdq, Edq, Ib } },
9849   },
9850
9851   /* VEX_LEN_0FXOP_08_CC */
9852   {
9853      { "vpcomb",        { XM, Vex128, EXx, Ib } },
9854   },
9855
9856   /* VEX_LEN_0FXOP_08_CD */
9857   {
9858      { "vpcomw",        { XM, Vex128, EXx, Ib } },
9859   },
9860
9861   /* VEX_LEN_0FXOP_08_CE */
9862   {
9863      { "vpcomd",        { XM, Vex128, EXx, Ib } },
9864   },
9865
9866   /* VEX_LEN_0FXOP_08_CF */
9867   {
9868      { "vpcomq",        { XM, Vex128, EXx, Ib } },
9869   },
9870
9871   /* VEX_LEN_0FXOP_08_EC */
9872   {
9873      { "vpcomub",       { XM, Vex128, EXx, Ib } },
9874   },
9875
9876   /* VEX_LEN_0FXOP_08_ED */
9877   {
9878      { "vpcomuw",       { XM, Vex128, EXx, Ib } },
9879   },
9880
9881   /* VEX_LEN_0FXOP_08_EE */
9882   {
9883      { "vpcomud",       { XM, Vex128, EXx, Ib } },
9884   },
9885
9886   /* VEX_LEN_0FXOP_08_EF */
9887   {
9888      { "vpcomuq",       { XM, Vex128, EXx, Ib } },
9889   },
9890
9891   /* VEX_LEN_0FXOP_09_80 */
9892   {
9893     { "vfrczps",        { XM, EXxmm } },
9894     { "vfrczps",        { XM, EXymmq } },
9895   },
9896
9897   /* VEX_LEN_0FXOP_09_81 */
9898   {
9899     { "vfrczpd",        { XM, EXxmm } },
9900     { "vfrczpd",        { XM, EXymmq } },
9901   },
9902 };
9903
9904 static const struct dis386 vex_w_table[][2] = {
9905   {
9906     /* VEX_W_0F10_P_0 */
9907     { "vmovups",        { XM, EXx } },
9908   },
9909   {
9910     /* VEX_W_0F10_P_1 */
9911     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar } },
9912   },
9913   {
9914     /* VEX_W_0F10_P_2 */
9915     { "vmovupd",        { XM, EXx } },
9916   },
9917   {
9918     /* VEX_W_0F10_P_3 */
9919     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar } },
9920   },
9921   {
9922     /* VEX_W_0F11_P_0 */
9923     { "vmovups",        { EXxS, XM } },
9924   },
9925   {
9926     /* VEX_W_0F11_P_1 */
9927     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar } },
9928   },
9929   {
9930     /* VEX_W_0F11_P_2 */
9931     { "vmovupd",        { EXxS, XM } },
9932   },
9933   {
9934     /* VEX_W_0F11_P_3 */
9935     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar } },
9936   },
9937   {
9938     /* VEX_W_0F12_P_0_M_0 */
9939     { "vmovlps",        { XM, Vex128, EXq } },
9940   },
9941   {
9942     /* VEX_W_0F12_P_0_M_1 */
9943     { "vmovhlps",       { XM, Vex128, EXq } },
9944   },
9945   {
9946     /* VEX_W_0F12_P_1 */
9947     { "vmovsldup",      { XM, EXx } },
9948   },
9949   {
9950     /* VEX_W_0F12_P_2 */
9951     { "vmovlpd",        { XM, Vex128, EXq } },
9952   },
9953   {
9954     /* VEX_W_0F12_P_3 */
9955     { "vmovddup",       { XM, EXymmq } },
9956   },
9957   {
9958     /* VEX_W_0F13_M_0 */
9959     { "vmovlpX",        { EXq, XM } },
9960   },
9961   {
9962     /* VEX_W_0F14 */
9963     { "vunpcklpX",      { XM, Vex, EXx } },
9964   },
9965   {
9966     /* VEX_W_0F15 */
9967     { "vunpckhpX",      { XM, Vex, EXx } },
9968   },
9969   {
9970     /* VEX_W_0F16_P_0_M_0 */
9971     { "vmovhps",        { XM, Vex128, EXq } },
9972   },
9973   {
9974     /* VEX_W_0F16_P_0_M_1 */
9975     { "vmovlhps",       { XM, Vex128, EXq } },
9976   },
9977   {
9978     /* VEX_W_0F16_P_1 */
9979     { "vmovshdup",      { XM, EXx } },
9980   },
9981   {
9982     /* VEX_W_0F16_P_2 */
9983     { "vmovhpd",        { XM, Vex128, EXq } },
9984   },
9985   {
9986     /* VEX_W_0F17_M_0 */
9987     { "vmovhpX",        { EXq, XM } },
9988   },
9989   {
9990     /* VEX_W_0F28 */
9991     { "vmovapX",        { XM, EXx } },
9992   },
9993   {
9994     /* VEX_W_0F29 */
9995     { "vmovapX",        { EXxS, XM } },
9996   },
9997   {
9998     /* VEX_W_0F2B_M_0 */
9999     { "vmovntpX",       { Mx, XM } },
10000   },
10001   {
10002     /* VEX_W_0F2E_P_0 */
10003     { "vucomiss",       { XMScalar, EXdScalar } },
10004   },
10005   {
10006     /* VEX_W_0F2E_P_2 */
10007     { "vucomisd",       { XMScalar, EXqScalar } },
10008   },
10009   {
10010     /* VEX_W_0F2F_P_0 */
10011     { "vcomiss",        { XMScalar, EXdScalar } },
10012   },
10013   {
10014     /* VEX_W_0F2F_P_2 */
10015     { "vcomisd",        { XMScalar, EXqScalar } },
10016   },
10017   {
10018     /* VEX_W_0F41_P_0_LEN_1 */
10019     { "kandw",          { MaskG, MaskVex, MaskR } },
10020   },
10021   {
10022     /* VEX_W_0F42_P_0_LEN_1 */
10023     { "kandnw",         { MaskG, MaskVex, MaskR } },
10024   },
10025   {
10026     /* VEX_W_0F44_P_0_LEN_0 */
10027     { "knotw",          { MaskG, MaskR } },
10028   },
10029   {
10030     /* VEX_W_0F45_P_0_LEN_1 */
10031     { "korw",           { MaskG, MaskVex, MaskR } },
10032   },
10033   {
10034     /* VEX_W_0F46_P_0_LEN_1 */
10035     { "kxnorw",         { MaskG, MaskVex, MaskR } },
10036   },
10037   {
10038     /* VEX_W_0F47_P_0_LEN_1 */
10039     { "kxorw",          { MaskG, MaskVex, MaskR } },
10040   },
10041   {
10042     /* VEX_W_0F4B_P_2_LEN_1 */
10043     { "kunpckbw",       { MaskG, MaskVex, MaskR } },
10044   },
10045   {
10046     /* VEX_W_0F50_M_0 */
10047     { "vmovmskpX",      { Gdq, XS } },
10048   },
10049   {
10050     /* VEX_W_0F51_P_0 */
10051     { "vsqrtps",        { XM, EXx } },
10052   },
10053   {
10054     /* VEX_W_0F51_P_1 */
10055     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar } },
10056   },
10057   {
10058     /* VEX_W_0F51_P_2  */
10059     { "vsqrtpd",        { XM, EXx } },
10060   },
10061   {
10062     /* VEX_W_0F51_P_3 */
10063     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar } },
10064   },
10065   {
10066     /* VEX_W_0F52_P_0 */
10067     { "vrsqrtps",       { XM, EXx } },
10068   },
10069   {
10070     /* VEX_W_0F52_P_1 */
10071     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar } },
10072   },
10073   {
10074     /* VEX_W_0F53_P_0  */
10075     { "vrcpps",         { XM, EXx } },
10076   },
10077   {
10078     /* VEX_W_0F53_P_1  */
10079     { "vrcpss",         { XMScalar, VexScalar, EXdScalar } },
10080   },
10081   {
10082     /* VEX_W_0F58_P_0  */
10083     { "vaddps",         { XM, Vex, EXx } },
10084   },
10085   {
10086     /* VEX_W_0F58_P_1  */
10087     { "vaddss",         { XMScalar, VexScalar, EXdScalar } },
10088   },
10089   {
10090     /* VEX_W_0F58_P_2  */
10091     { "vaddpd",         { XM, Vex, EXx } },
10092   },
10093   {
10094     /* VEX_W_0F58_P_3  */
10095     { "vaddsd",         { XMScalar, VexScalar, EXqScalar } },
10096   },
10097   {
10098     /* VEX_W_0F59_P_0  */
10099     { "vmulps",         { XM, Vex, EXx } },
10100   },
10101   {
10102     /* VEX_W_0F59_P_1  */
10103     { "vmulss",         { XMScalar, VexScalar, EXdScalar } },
10104   },
10105   {
10106     /* VEX_W_0F59_P_2  */
10107     { "vmulpd",         { XM, Vex, EXx } },
10108   },
10109   {
10110     /* VEX_W_0F59_P_3  */
10111     { "vmulsd",         { XMScalar, VexScalar, EXqScalar } },
10112   },
10113   {
10114     /* VEX_W_0F5A_P_0  */
10115     { "vcvtps2pd",      { XM, EXxmmq } },
10116   },
10117   {
10118     /* VEX_W_0F5A_P_1  */
10119     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar } },
10120   },
10121   {
10122     /* VEX_W_0F5A_P_3  */
10123     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar } },
10124   },
10125   {
10126     /* VEX_W_0F5B_P_0  */
10127     { "vcvtdq2ps",      { XM, EXx } },
10128   },
10129   {
10130     /* VEX_W_0F5B_P_1  */
10131     { "vcvttps2dq",     { XM, EXx } },
10132   },
10133   {
10134     /* VEX_W_0F5B_P_2  */
10135     { "vcvtps2dq",      { XM, EXx } },
10136   },
10137   {
10138     /* VEX_W_0F5C_P_0  */
10139     { "vsubps",         { XM, Vex, EXx } },
10140   },
10141   {
10142     /* VEX_W_0F5C_P_1  */
10143     { "vsubss",         { XMScalar, VexScalar, EXdScalar } },
10144   },
10145   {
10146     /* VEX_W_0F5C_P_2  */
10147     { "vsubpd",         { XM, Vex, EXx } },
10148   },
10149   {
10150     /* VEX_W_0F5C_P_3  */
10151     { "vsubsd",         { XMScalar, VexScalar, EXqScalar } },
10152   },
10153   {
10154     /* VEX_W_0F5D_P_0  */
10155     { "vminps",         { XM, Vex, EXx } },
10156   },
10157   {
10158     /* VEX_W_0F5D_P_1  */
10159     { "vminss",         { XMScalar, VexScalar, EXdScalar } },
10160   },
10161   {
10162     /* VEX_W_0F5D_P_2  */
10163     { "vminpd",         { XM, Vex, EXx } },
10164   },
10165   {
10166     /* VEX_W_0F5D_P_3  */
10167     { "vminsd",         { XMScalar, VexScalar, EXqScalar } },
10168   },
10169   {
10170     /* VEX_W_0F5E_P_0  */
10171     { "vdivps",         { XM, Vex, EXx } },
10172   },
10173   {
10174     /* VEX_W_0F5E_P_1  */
10175     { "vdivss",         { XMScalar, VexScalar, EXdScalar } },
10176   },
10177   {
10178     /* VEX_W_0F5E_P_2  */
10179     { "vdivpd",         { XM, Vex, EXx } },
10180   },
10181   {
10182     /* VEX_W_0F5E_P_3  */
10183     { "vdivsd",         { XMScalar, VexScalar, EXqScalar } },
10184   },
10185   {
10186     /* VEX_W_0F5F_P_0  */
10187     { "vmaxps",         { XM, Vex, EXx } },
10188   },
10189   {
10190     /* VEX_W_0F5F_P_1  */
10191     { "vmaxss",         { XMScalar, VexScalar, EXdScalar } },
10192   },
10193   {
10194     /* VEX_W_0F5F_P_2  */
10195     { "vmaxpd",         { XM, Vex, EXx } },
10196   },
10197   {
10198     /* VEX_W_0F5F_P_3  */
10199     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar } },
10200   },
10201   {
10202     /* VEX_W_0F60_P_2  */
10203     { "vpunpcklbw",     { XM, Vex, EXx } },
10204   },
10205   {
10206     /* VEX_W_0F61_P_2  */
10207     { "vpunpcklwd",     { XM, Vex, EXx } },
10208   },
10209   {
10210     /* VEX_W_0F62_P_2  */
10211     { "vpunpckldq",     { XM, Vex, EXx } },
10212   },
10213   {
10214     /* VEX_W_0F63_P_2  */
10215     { "vpacksswb",      { XM, Vex, EXx } },
10216   },
10217   {
10218     /* VEX_W_0F64_P_2  */
10219     { "vpcmpgtb",       { XM, Vex, EXx } },
10220   },
10221   {
10222     /* VEX_W_0F65_P_2  */
10223     { "vpcmpgtw",       { XM, Vex, EXx } },
10224   },
10225   {
10226     /* VEX_W_0F66_P_2  */
10227     { "vpcmpgtd",       { XM, Vex, EXx } },
10228   },
10229   {
10230     /* VEX_W_0F67_P_2  */
10231     { "vpackuswb",      { XM, Vex, EXx } },
10232   },
10233   {
10234     /* VEX_W_0F68_P_2  */
10235     { "vpunpckhbw",     { XM, Vex, EXx } },
10236   },
10237   {
10238     /* VEX_W_0F69_P_2  */
10239     { "vpunpckhwd",     { XM, Vex, EXx } },
10240   },
10241   {
10242     /* VEX_W_0F6A_P_2  */
10243     { "vpunpckhdq",     { XM, Vex, EXx } },
10244   },
10245   {
10246     /* VEX_W_0F6B_P_2  */
10247     { "vpackssdw",      { XM, Vex, EXx } },
10248   },
10249   {
10250     /* VEX_W_0F6C_P_2  */
10251     { "vpunpcklqdq",    { XM, Vex, EXx } },
10252   },
10253   {
10254     /* VEX_W_0F6D_P_2  */
10255     { "vpunpckhqdq",    { XM, Vex, EXx } },
10256   },
10257   {
10258     /* VEX_W_0F6F_P_1  */
10259     { "vmovdqu",        { XM, EXx } },
10260   },
10261   {
10262     /* VEX_W_0F6F_P_2  */
10263     { "vmovdqa",        { XM, EXx } },
10264   },
10265   {
10266     /* VEX_W_0F70_P_1 */
10267     { "vpshufhw",       { XM, EXx, Ib } },
10268   },
10269   {
10270     /* VEX_W_0F70_P_2 */
10271     { "vpshufd",        { XM, EXx, Ib } },
10272   },
10273   {
10274     /* VEX_W_0F70_P_3 */
10275     { "vpshuflw",       { XM, EXx, Ib } },
10276   },
10277   {
10278     /* VEX_W_0F71_R_2_P_2  */
10279     { "vpsrlw",         { Vex, XS, Ib } },
10280   },
10281   {
10282     /* VEX_W_0F71_R_4_P_2  */
10283     { "vpsraw",         { Vex, XS, Ib } },
10284   },
10285   {
10286     /* VEX_W_0F71_R_6_P_2  */
10287     { "vpsllw",         { Vex, XS, Ib } },
10288   },
10289   {
10290     /* VEX_W_0F72_R_2_P_2  */
10291     { "vpsrld",         { Vex, XS, Ib } },
10292   },
10293   {
10294     /* VEX_W_0F72_R_4_P_2  */
10295     { "vpsrad",         { Vex, XS, Ib } },
10296   },
10297   {
10298     /* VEX_W_0F72_R_6_P_2  */
10299     { "vpslld",         { Vex, XS, Ib } },
10300   },
10301   {
10302     /* VEX_W_0F73_R_2_P_2  */
10303     { "vpsrlq",         { Vex, XS, Ib } },
10304   },
10305   {
10306     /* VEX_W_0F73_R_3_P_2  */
10307     { "vpsrldq",        { Vex, XS, Ib } },
10308   },
10309   {
10310     /* VEX_W_0F73_R_6_P_2  */
10311     { "vpsllq",         { Vex, XS, Ib } },
10312   },
10313   {
10314     /* VEX_W_0F73_R_7_P_2  */
10315     { "vpslldq",        { Vex, XS, Ib } },
10316   },
10317   {
10318     /* VEX_W_0F74_P_2 */
10319     { "vpcmpeqb",       { XM, Vex, EXx } },
10320   },
10321   {
10322     /* VEX_W_0F75_P_2 */
10323     { "vpcmpeqw",       { XM, Vex, EXx } },
10324   },
10325   {
10326     /* VEX_W_0F76_P_2 */
10327     { "vpcmpeqd",       { XM, Vex, EXx } },
10328   },
10329   {
10330     /* VEX_W_0F77_P_0 */
10331     { "",               { VZERO } },
10332   },
10333   {
10334     /* VEX_W_0F7C_P_2 */
10335     { "vhaddpd",        { XM, Vex, EXx } },
10336   },
10337   {
10338     /* VEX_W_0F7C_P_3 */
10339     { "vhaddps",        { XM, Vex, EXx } },
10340   },
10341   {
10342     /* VEX_W_0F7D_P_2 */
10343     { "vhsubpd",        { XM, Vex, EXx } },
10344   },
10345   {
10346     /* VEX_W_0F7D_P_3 */
10347     { "vhsubps",        { XM, Vex, EXx } },
10348   },
10349   {
10350     /* VEX_W_0F7E_P_1 */
10351     { "vmovq",          { XMScalar, EXqScalar } },
10352   },
10353   {
10354     /* VEX_W_0F7F_P_1 */
10355     { "vmovdqu",        { EXxS, XM } },
10356   },
10357   {
10358     /* VEX_W_0F7F_P_2 */
10359     { "vmovdqa",        { EXxS, XM } },
10360   },
10361   {
10362     /* VEX_W_0F90_P_0_LEN_0 */
10363     { "kmovw",          { MaskG, MaskE } },
10364   },
10365   {
10366     /* VEX_W_0F91_P_0_LEN_0 */
10367     { "kmovw",          { Ew, MaskG } },
10368   },
10369   {
10370     /* VEX_W_0F92_P_0_LEN_0 */
10371     { "kmovw",          { MaskG, Rdq } },
10372   },
10373   {
10374     /* VEX_W_0F93_P_0_LEN_0 */
10375     { "kmovw",          { Gdq, MaskR } },
10376   },
10377   {
10378     /* VEX_W_0F98_P_0_LEN_0 */
10379     { "kortestw",       { MaskG, MaskR } },
10380   },
10381   {
10382     /* VEX_W_0FAE_R_2_M_0 */
10383     { "vldmxcsr",       { Md } },
10384   },
10385   {
10386     /* VEX_W_0FAE_R_3_M_0 */
10387     { "vstmxcsr",       { Md } },
10388   },
10389   {
10390     /* VEX_W_0FC2_P_0 */
10391     { "vcmpps",         { XM, Vex, EXx, VCMP } },
10392   },
10393   {
10394     /* VEX_W_0FC2_P_1 */
10395     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP } },
10396   },
10397   {
10398     /* VEX_W_0FC2_P_2 */
10399     { "vcmppd",         { XM, Vex, EXx, VCMP } },
10400   },
10401   {
10402     /* VEX_W_0FC2_P_3 */
10403     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP } },
10404   },
10405   {
10406     /* VEX_W_0FC4_P_2 */
10407     { "vpinsrw",        { XM, Vex128, Edqw, Ib } },
10408   },
10409   {
10410     /* VEX_W_0FC5_P_2 */
10411     { "vpextrw",        { Gdq, XS, Ib } },
10412   },
10413   {
10414     /* VEX_W_0FD0_P_2 */
10415     { "vaddsubpd",      { XM, Vex, EXx } },
10416   },
10417   {
10418     /* VEX_W_0FD0_P_3 */
10419     { "vaddsubps",      { XM, Vex, EXx } },
10420   },
10421   {
10422     /* VEX_W_0FD1_P_2 */
10423     { "vpsrlw",         { XM, Vex, EXxmm } },
10424   },
10425   {
10426     /* VEX_W_0FD2_P_2 */
10427     { "vpsrld",         { XM, Vex, EXxmm } },
10428   },
10429   {
10430     /* VEX_W_0FD3_P_2 */
10431     { "vpsrlq",         { XM, Vex, EXxmm } },
10432   },
10433   {
10434     /* VEX_W_0FD4_P_2 */
10435     { "vpaddq",         { XM, Vex, EXx } },
10436   },
10437   {
10438     /* VEX_W_0FD5_P_2 */
10439     { "vpmullw",        { XM, Vex, EXx } },
10440   },
10441   {
10442     /* VEX_W_0FD6_P_2 */
10443     { "vmovq",          { EXqScalarS, XMScalar } },
10444   },
10445   {
10446     /* VEX_W_0FD7_P_2_M_1 */
10447     { "vpmovmskb",      { Gdq, XS } },
10448   },
10449   {
10450     /* VEX_W_0FD8_P_2 */
10451     { "vpsubusb",       { XM, Vex, EXx } },
10452   },
10453   {
10454     /* VEX_W_0FD9_P_2 */
10455     { "vpsubusw",       { XM, Vex, EXx } },
10456   },
10457   {
10458     /* VEX_W_0FDA_P_2 */
10459     { "vpminub",        { XM, Vex, EXx } },
10460   },
10461   {
10462     /* VEX_W_0FDB_P_2 */
10463     { "vpand",          { XM, Vex, EXx } },
10464   },
10465   {
10466     /* VEX_W_0FDC_P_2 */
10467     { "vpaddusb",       { XM, Vex, EXx } },
10468   },
10469   {
10470     /* VEX_W_0FDD_P_2 */
10471     { "vpaddusw",       { XM, Vex, EXx } },
10472   },
10473   {
10474     /* VEX_W_0FDE_P_2 */
10475     { "vpmaxub",        { XM, Vex, EXx } },
10476   },
10477   {
10478     /* VEX_W_0FDF_P_2 */
10479     { "vpandn",         { XM, Vex, EXx } },
10480   },
10481   {
10482     /* VEX_W_0FE0_P_2  */
10483     { "vpavgb",         { XM, Vex, EXx } },
10484   },
10485   {
10486     /* VEX_W_0FE1_P_2  */
10487     { "vpsraw",         { XM, Vex, EXxmm } },
10488   },
10489   {
10490     /* VEX_W_0FE2_P_2  */
10491     { "vpsrad",         { XM, Vex, EXxmm } },
10492   },
10493   {
10494     /* VEX_W_0FE3_P_2  */
10495     { "vpavgw",         { XM, Vex, EXx } },
10496   },
10497   {
10498     /* VEX_W_0FE4_P_2  */
10499     { "vpmulhuw",       { XM, Vex, EXx } },
10500   },
10501   {
10502     /* VEX_W_0FE5_P_2  */
10503     { "vpmulhw",        { XM, Vex, EXx } },
10504   },
10505   {
10506     /* VEX_W_0FE6_P_1  */
10507     { "vcvtdq2pd",      { XM, EXxmmq } },
10508   },
10509   {
10510     /* VEX_W_0FE6_P_2  */
10511     { "vcvttpd2dq%XY",  { XMM, EXx } },
10512   },
10513   {
10514     /* VEX_W_0FE6_P_3  */
10515     { "vcvtpd2dq%XY",   { XMM, EXx } },
10516   },
10517   {
10518     /* VEX_W_0FE7_P_2_M_0 */
10519     { "vmovntdq",       { Mx, XM } },
10520   },
10521   {
10522     /* VEX_W_0FE8_P_2  */
10523     { "vpsubsb",        { XM, Vex, EXx } },
10524   },
10525   {
10526     /* VEX_W_0FE9_P_2  */
10527     { "vpsubsw",        { XM, Vex, EXx } },
10528   },
10529   {
10530     /* VEX_W_0FEA_P_2  */
10531     { "vpminsw",        { XM, Vex, EXx } },
10532   },
10533   {
10534     /* VEX_W_0FEB_P_2  */
10535     { "vpor",           { XM, Vex, EXx } },
10536   },
10537   {
10538     /* VEX_W_0FEC_P_2  */
10539     { "vpaddsb",        { XM, Vex, EXx } },
10540   },
10541   {
10542     /* VEX_W_0FED_P_2  */
10543     { "vpaddsw",        { XM, Vex, EXx } },
10544   },
10545   {
10546     /* VEX_W_0FEE_P_2  */
10547     { "vpmaxsw",        { XM, Vex, EXx } },
10548   },
10549   {
10550     /* VEX_W_0FEF_P_2  */
10551     { "vpxor",          { XM, Vex, EXx } },
10552   },
10553   {
10554     /* VEX_W_0FF0_P_3_M_0 */
10555     { "vlddqu",         { XM, M } },
10556   },
10557   {
10558     /* VEX_W_0FF1_P_2 */
10559     { "vpsllw",         { XM, Vex, EXxmm } },
10560   },
10561   {
10562     /* VEX_W_0FF2_P_2 */
10563     { "vpslld",         { XM, Vex, EXxmm } },
10564   },
10565   {
10566     /* VEX_W_0FF3_P_2 */
10567     { "vpsllq",         { XM, Vex, EXxmm } },
10568   },
10569   {
10570     /* VEX_W_0FF4_P_2 */
10571     { "vpmuludq",       { XM, Vex, EXx } },
10572   },
10573   {
10574     /* VEX_W_0FF5_P_2 */
10575     { "vpmaddwd",       { XM, Vex, EXx } },
10576   },
10577   {
10578     /* VEX_W_0FF6_P_2 */
10579     { "vpsadbw",        { XM, Vex, EXx } },
10580   },
10581   {
10582     /* VEX_W_0FF7_P_2 */
10583     { "vmaskmovdqu",    { XM, XS } },
10584   },
10585   {
10586     /* VEX_W_0FF8_P_2 */
10587     { "vpsubb",         { XM, Vex, EXx } },
10588   },
10589   {
10590     /* VEX_W_0FF9_P_2 */
10591     { "vpsubw",         { XM, Vex, EXx } },
10592   },
10593   {
10594     /* VEX_W_0FFA_P_2 */
10595     { "vpsubd",         { XM, Vex, EXx } },
10596   },
10597   {
10598     /* VEX_W_0FFB_P_2 */
10599     { "vpsubq",         { XM, Vex, EXx } },
10600   },
10601   {
10602     /* VEX_W_0FFC_P_2 */
10603     { "vpaddb",         { XM, Vex, EXx } },
10604   },
10605   {
10606     /* VEX_W_0FFD_P_2 */
10607     { "vpaddw",         { XM, Vex, EXx } },
10608   },
10609   {
10610     /* VEX_W_0FFE_P_2 */
10611     { "vpaddd",         { XM, Vex, EXx } },
10612   },
10613   {
10614     /* VEX_W_0F3800_P_2  */
10615     { "vpshufb",        { XM, Vex, EXx } },
10616   },
10617   {
10618     /* VEX_W_0F3801_P_2  */
10619     { "vphaddw",        { XM, Vex, EXx } },
10620   },
10621   {
10622     /* VEX_W_0F3802_P_2  */
10623     { "vphaddd",        { XM, Vex, EXx } },
10624   },
10625   {
10626     /* VEX_W_0F3803_P_2  */
10627     { "vphaddsw",       { XM, Vex, EXx } },
10628   },
10629   {
10630     /* VEX_W_0F3804_P_2  */
10631     { "vpmaddubsw",     { XM, Vex, EXx } },
10632   },
10633   {
10634     /* VEX_W_0F3805_P_2  */
10635     { "vphsubw",        { XM, Vex, EXx } },
10636   },
10637   {
10638     /* VEX_W_0F3806_P_2  */
10639     { "vphsubd",        { XM, Vex, EXx } },
10640   },
10641   {
10642     /* VEX_W_0F3807_P_2  */
10643     { "vphsubsw",       { XM, Vex, EXx } },
10644   },
10645   {
10646     /* VEX_W_0F3808_P_2  */
10647     { "vpsignb",        { XM, Vex, EXx } },
10648   },
10649   {
10650     /* VEX_W_0F3809_P_2  */
10651     { "vpsignw",        { XM, Vex, EXx } },
10652   },
10653   {
10654     /* VEX_W_0F380A_P_2  */
10655     { "vpsignd",        { XM, Vex, EXx } },
10656   },
10657   {
10658     /* VEX_W_0F380B_P_2  */
10659     { "vpmulhrsw",      { XM, Vex, EXx } },
10660   },
10661   {
10662     /* VEX_W_0F380C_P_2  */
10663     { "vpermilps",      { XM, Vex, EXx } },
10664   },
10665   {
10666     /* VEX_W_0F380D_P_2  */
10667     { "vpermilpd",      { XM, Vex, EXx } },
10668   },
10669   {
10670     /* VEX_W_0F380E_P_2  */
10671     { "vtestps",        { XM, EXx } },
10672   },
10673   {
10674     /* VEX_W_0F380F_P_2  */
10675     { "vtestpd",        { XM, EXx } },
10676   },
10677   {
10678     /* VEX_W_0F3816_P_2  */
10679     { "vpermps",        { XM, Vex, EXx } },
10680   },
10681   {
10682     /* VEX_W_0F3817_P_2 */
10683     { "vptest",         { XM, EXx } },
10684   },
10685   {
10686     /* VEX_W_0F3818_P_2 */
10687     { "vbroadcastss",   { XM, EXxmm_md } },
10688   },
10689   {
10690     /* VEX_W_0F3819_P_2 */
10691     { "vbroadcastsd",   { XM, EXxmm_mq } },
10692   },
10693   {
10694     /* VEX_W_0F381A_P_2_M_0 */
10695     { "vbroadcastf128", { XM, Mxmm } },
10696   },
10697   {
10698     /* VEX_W_0F381C_P_2 */
10699     { "vpabsb",         { XM, EXx } },
10700   },
10701   {
10702     /* VEX_W_0F381D_P_2 */
10703     { "vpabsw",         { XM, EXx } },
10704   },
10705   {
10706     /* VEX_W_0F381E_P_2 */
10707     { "vpabsd",         { XM, EXx } },
10708   },
10709   {
10710     /* VEX_W_0F3820_P_2 */
10711     { "vpmovsxbw",      { XM, EXxmmq } },
10712   },
10713   {
10714     /* VEX_W_0F3821_P_2 */
10715     { "vpmovsxbd",      { XM, EXxmmqd } },
10716   },
10717   {
10718     /* VEX_W_0F3822_P_2 */
10719     { "vpmovsxbq",      { XM, EXxmmdw } },
10720   },
10721   {
10722     /* VEX_W_0F3823_P_2 */
10723     { "vpmovsxwd",      { XM, EXxmmq } },
10724   },
10725   {
10726     /* VEX_W_0F3824_P_2 */
10727     { "vpmovsxwq",      { XM, EXxmmqd } },
10728   },
10729   {
10730     /* VEX_W_0F3825_P_2 */
10731     { "vpmovsxdq",      { XM, EXxmmq } },
10732   },
10733   {
10734     /* VEX_W_0F3828_P_2 */
10735     { "vpmuldq",        { XM, Vex, EXx } },
10736   },
10737   {
10738     /* VEX_W_0F3829_P_2 */
10739     { "vpcmpeqq",       { XM, Vex, EXx } },
10740   },
10741   {
10742     /* VEX_W_0F382A_P_2_M_0 */
10743     { "vmovntdqa",      { XM, Mx } },
10744   },
10745   {
10746     /* VEX_W_0F382B_P_2 */
10747     { "vpackusdw",      { XM, Vex, EXx } },
10748   },
10749   {
10750     /* VEX_W_0F382C_P_2_M_0 */
10751     { "vmaskmovps",     { XM, Vex, Mx } },
10752   },
10753   {
10754     /* VEX_W_0F382D_P_2_M_0 */
10755     { "vmaskmovpd",     { XM, Vex, Mx } },
10756   },
10757   {
10758     /* VEX_W_0F382E_P_2_M_0 */
10759     { "vmaskmovps",     { Mx, Vex, XM } },
10760   },
10761   {
10762     /* VEX_W_0F382F_P_2_M_0 */
10763     { "vmaskmovpd",     { Mx, Vex, XM } },
10764   },
10765   {
10766     /* VEX_W_0F3830_P_2 */
10767     { "vpmovzxbw",      { XM, EXxmmq } },
10768   },
10769   {
10770     /* VEX_W_0F3831_P_2 */
10771     { "vpmovzxbd",      { XM, EXxmmqd } },
10772   },
10773   {
10774     /* VEX_W_0F3832_P_2 */
10775     { "vpmovzxbq",      { XM, EXxmmdw } },
10776   },
10777   {
10778     /* VEX_W_0F3833_P_2 */
10779     { "vpmovzxwd",      { XM, EXxmmq } },
10780   },
10781   {
10782     /* VEX_W_0F3834_P_2 */
10783     { "vpmovzxwq",      { XM, EXxmmqd } },
10784   },
10785   {
10786     /* VEX_W_0F3835_P_2 */
10787     { "vpmovzxdq",      { XM, EXxmmq } },
10788   },
10789   {
10790     /* VEX_W_0F3836_P_2  */
10791     { "vpermd",         { XM, Vex, EXx } },
10792   },
10793   {
10794     /* VEX_W_0F3837_P_2 */
10795     { "vpcmpgtq",       { XM, Vex, EXx } },
10796   },
10797   {
10798     /* VEX_W_0F3838_P_2 */
10799     { "vpminsb",        { XM, Vex, EXx } },
10800   },
10801   {
10802     /* VEX_W_0F3839_P_2 */
10803     { "vpminsd",        { XM, Vex, EXx } },
10804   },
10805   {
10806     /* VEX_W_0F383A_P_2 */
10807     { "vpminuw",        { XM, Vex, EXx } },
10808   },
10809   {
10810     /* VEX_W_0F383B_P_2 */
10811     { "vpminud",        { XM, Vex, EXx } },
10812   },
10813   {
10814     /* VEX_W_0F383C_P_2 */
10815     { "vpmaxsb",        { XM, Vex, EXx } },
10816   },
10817   {
10818     /* VEX_W_0F383D_P_2 */
10819     { "vpmaxsd",        { XM, Vex, EXx } },
10820   },
10821   {
10822     /* VEX_W_0F383E_P_2 */
10823     { "vpmaxuw",        { XM, Vex, EXx } },
10824   },
10825   {
10826     /* VEX_W_0F383F_P_2 */
10827     { "vpmaxud",        { XM, Vex, EXx } },
10828   },
10829   {
10830     /* VEX_W_0F3840_P_2 */
10831     { "vpmulld",        { XM, Vex, EXx } },
10832   },
10833   {
10834     /* VEX_W_0F3841_P_2 */
10835     { "vphminposuw",    { XM, EXx } },
10836   },
10837   {
10838     /* VEX_W_0F3846_P_2 */
10839     { "vpsravd",        { XM, Vex, EXx } },
10840   },
10841   {
10842     /* VEX_W_0F3858_P_2 */
10843     { "vpbroadcastd", { XM, EXxmm_md } },
10844   },
10845   {
10846     /* VEX_W_0F3859_P_2 */
10847     { "vpbroadcastq",   { XM, EXxmm_mq } },
10848   },
10849   {
10850     /* VEX_W_0F385A_P_2_M_0 */
10851     { "vbroadcasti128", { XM, Mxmm } },
10852   },
10853   {
10854     /* VEX_W_0F3878_P_2 */
10855     { "vpbroadcastb",   { XM, EXxmm_mb } },
10856   },
10857   {
10858     /* VEX_W_0F3879_P_2 */
10859     { "vpbroadcastw",   { XM, EXxmm_mw } },
10860   },
10861   {
10862     /* VEX_W_0F38DB_P_2 */
10863     { "vaesimc",        { XM, EXx } },
10864   },
10865   {
10866     /* VEX_W_0F38DC_P_2 */
10867     { "vaesenc",        { XM, Vex128, EXx } },
10868   },
10869   {
10870     /* VEX_W_0F38DD_P_2 */
10871     { "vaesenclast",    { XM, Vex128, EXx } },
10872   },
10873   {
10874     /* VEX_W_0F38DE_P_2 */
10875     { "vaesdec",        { XM, Vex128, EXx } },
10876   },
10877   {
10878     /* VEX_W_0F38DF_P_2 */
10879     { "vaesdeclast",    { XM, Vex128, EXx } },
10880   },
10881   {
10882     /* VEX_W_0F3A00_P_2 */
10883     { Bad_Opcode },
10884     { "vpermq",         { XM, EXx, Ib } },
10885   },
10886   {
10887     /* VEX_W_0F3A01_P_2 */
10888     { Bad_Opcode },
10889     { "vpermpd",        { XM, EXx, Ib } },
10890   },
10891   {
10892     /* VEX_W_0F3A02_P_2 */
10893     { "vpblendd",       { XM, Vex, EXx, Ib } },
10894   },
10895   {
10896     /* VEX_W_0F3A04_P_2 */
10897     { "vpermilps",      { XM, EXx, Ib } },
10898   },
10899   {
10900     /* VEX_W_0F3A05_P_2 */
10901     { "vpermilpd",      { XM, EXx, Ib } },
10902   },
10903   {
10904     /* VEX_W_0F3A06_P_2 */
10905     { "vperm2f128",     { XM, Vex256, EXx, Ib } },
10906   },
10907   {
10908     /* VEX_W_0F3A08_P_2 */
10909     { "vroundps",       { XM, EXx, Ib } },
10910   },
10911   {
10912     /* VEX_W_0F3A09_P_2 */
10913     { "vroundpd",       { XM, EXx, Ib } },
10914   },
10915   {
10916     /* VEX_W_0F3A0A_P_2 */
10917     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib } },
10918   },
10919   {
10920     /* VEX_W_0F3A0B_P_2 */
10921     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib } },
10922   },
10923   {
10924     /* VEX_W_0F3A0C_P_2 */
10925     { "vblendps",       { XM, Vex, EXx, Ib } },
10926   },
10927   {
10928     /* VEX_W_0F3A0D_P_2 */
10929     { "vblendpd",       { XM, Vex, EXx, Ib } },
10930   },
10931   {
10932     /* VEX_W_0F3A0E_P_2 */
10933     { "vpblendw",       { XM, Vex, EXx, Ib } },
10934   },
10935   {
10936     /* VEX_W_0F3A0F_P_2 */
10937     { "vpalignr",       { XM, Vex, EXx, Ib } },
10938   },
10939   {
10940     /* VEX_W_0F3A14_P_2 */
10941     { "vpextrb",        { Edqb, XM, Ib } },
10942   },
10943   {
10944     /* VEX_W_0F3A15_P_2 */
10945     { "vpextrw",        { Edqw, XM, Ib } },
10946   },
10947   {
10948     /* VEX_W_0F3A18_P_2 */
10949     { "vinsertf128",    { XM, Vex256, EXxmm, Ib } },
10950   },
10951   {
10952     /* VEX_W_0F3A19_P_2 */
10953     { "vextractf128",   { EXxmm, XM, Ib } },
10954   },
10955   {
10956     /* VEX_W_0F3A20_P_2 */
10957     { "vpinsrb",        { XM, Vex128, Edqb, Ib } },
10958   },
10959   {
10960     /* VEX_W_0F3A21_P_2 */
10961     { "vinsertps",      { XM, Vex128, EXd, Ib } },
10962   },
10963   {
10964     /* VEX_W_0F3A30_P_2 */
10965     { Bad_Opcode },
10966     { "kshiftrw",       { MaskG, MaskR, Ib } },
10967   },
10968   {
10969     /* VEX_W_0F3A32_P_2 */
10970     { Bad_Opcode },
10971     { "kshiftlw",       { MaskG, MaskR, Ib } },
10972   },
10973   {
10974     /* VEX_W_0F3A38_P_2 */
10975     { "vinserti128",    { XM, Vex256, EXxmm, Ib } },
10976   },
10977   {
10978     /* VEX_W_0F3A39_P_2 */
10979     { "vextracti128",   { EXxmm, XM, Ib } },
10980   },
10981   {
10982     /* VEX_W_0F3A40_P_2 */
10983     { "vdpps",          { XM, Vex, EXx, Ib } },
10984   },
10985   {
10986     /* VEX_W_0F3A41_P_2 */
10987     { "vdppd",          { XM, Vex128, EXx, Ib } },
10988   },
10989   {
10990     /* VEX_W_0F3A42_P_2 */
10991     { "vmpsadbw",       { XM, Vex, EXx, Ib } },
10992   },
10993   {
10994     /* VEX_W_0F3A44_P_2 */
10995     { "vpclmulqdq",     { XM, Vex128, EXx, PCLMUL } },
10996   },
10997   {
10998     /* VEX_W_0F3A46_P_2 */
10999     { "vperm2i128",     { XM, Vex256, EXx, Ib } },
11000   },
11001   {
11002     /* VEX_W_0F3A48_P_2 */
11003     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
11004     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
11005   },
11006   {
11007     /* VEX_W_0F3A49_P_2 */
11008     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
11009     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW } },
11010   },
11011   {
11012     /* VEX_W_0F3A4A_P_2 */
11013     { "vblendvps",      { XM, Vex, EXx, XMVexI4 } },
11014   },
11015   {
11016     /* VEX_W_0F3A4B_P_2 */
11017     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 } },
11018   },
11019   {
11020     /* VEX_W_0F3A4C_P_2 */
11021     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 } },
11022   },
11023   {
11024     /* VEX_W_0F3A60_P_2 */
11025     { "vpcmpestrm",     { XM, EXx, Ib } },
11026   },
11027   {
11028     /* VEX_W_0F3A61_P_2 */
11029     { "vpcmpestri",     { XM, EXx, Ib } },
11030   },
11031   {
11032     /* VEX_W_0F3A62_P_2 */
11033     { "vpcmpistrm",     { XM, EXx, Ib } },
11034   },
11035   {
11036     /* VEX_W_0F3A63_P_2 */
11037     { "vpcmpistri",     { XM, EXx, Ib } },
11038   },
11039   {
11040     /* VEX_W_0F3ADF_P_2 */
11041     { "vaeskeygenassist", { XM, EXx, Ib } },
11042   },
11043 #define NEED_VEX_W_TABLE
11044 #include "i386-dis-evex.h"
11045 #undef NEED_VEX_W_TABLE
11046 };
11047
11048 static const struct dis386 mod_table[][2] = {
11049   {
11050     /* MOD_8D */
11051     { "leaS",           { Gv, M } },
11052   },
11053   {
11054     /* MOD_C6_REG_7 */
11055     { Bad_Opcode },
11056     { RM_TABLE (RM_C6_REG_7) },
11057   },
11058   {
11059     /* MOD_C7_REG_7 */
11060     { Bad_Opcode },
11061     { RM_TABLE (RM_C7_REG_7) },
11062   },
11063   {
11064     /* MOD_FF_REG_3 */
11065     { "Jcall{T|}", { indirEp } },
11066   },
11067   {
11068     /* MOD_FF_REG_5 */
11069     { "Jjmp{T|}", { indirEp } },
11070   },
11071   {
11072     /* MOD_0F01_REG_0 */
11073     { X86_64_TABLE (X86_64_0F01_REG_0) },
11074     { RM_TABLE (RM_0F01_REG_0) },
11075   },
11076   {
11077     /* MOD_0F01_REG_1 */
11078     { X86_64_TABLE (X86_64_0F01_REG_1) },
11079     { RM_TABLE (RM_0F01_REG_1) },
11080   },
11081   {
11082     /* MOD_0F01_REG_2 */
11083     { X86_64_TABLE (X86_64_0F01_REG_2) },
11084     { RM_TABLE (RM_0F01_REG_2) },
11085   },
11086   {
11087     /* MOD_0F01_REG_3 */
11088     { X86_64_TABLE (X86_64_0F01_REG_3) },
11089     { RM_TABLE (RM_0F01_REG_3) },
11090   },
11091   {
11092     /* MOD_0F01_REG_7 */
11093     { "invlpg",         { Mb } },
11094     { RM_TABLE (RM_0F01_REG_7) },
11095   },
11096   {
11097     /* MOD_0F12_PREFIX_0 */
11098     { "movlps",         { XM, EXq } },
11099     { "movhlps",        { XM, EXq } },
11100   },
11101   {
11102     /* MOD_0F13 */
11103     { "movlpX",         { EXq, XM } },
11104   },
11105   {
11106     /* MOD_0F16_PREFIX_0 */
11107     { "movhps",         { XM, EXq } },
11108     { "movlhps",        { XM, EXq } },
11109   },
11110   {
11111     /* MOD_0F17 */
11112     { "movhpX",         { EXq, XM } },
11113   },
11114   {
11115     /* MOD_0F18_REG_0 */
11116     { "prefetchnta",    { Mb } },
11117   },
11118   {
11119     /* MOD_0F18_REG_1 */
11120     { "prefetcht0",     { Mb } },
11121   },
11122   {
11123     /* MOD_0F18_REG_2 */
11124     { "prefetcht1",     { Mb } },
11125   },
11126   {
11127     /* MOD_0F18_REG_3 */
11128     { "prefetcht2",     { Mb } },
11129   },
11130   {
11131     /* MOD_0F18_REG_4 */
11132     { "nop/reserved",   { Mb } },
11133   },
11134   {
11135     /* MOD_0F18_REG_5 */
11136     { "nop/reserved",   { Mb } },
11137   },
11138   {
11139     /* MOD_0F18_REG_6 */
11140     { "nop/reserved",   { Mb } },
11141   },
11142   {
11143     /* MOD_0F18_REG_7 */
11144     { "nop/reserved",   { Mb } },
11145   },
11146   {
11147     /* MOD_0F1A_PREFIX_0 */
11148     { "bndldx",         { Gbnd, Ev_bnd } },
11149     { "nopQ",           { Ev } },
11150   },
11151   {
11152     /* MOD_0F1B_PREFIX_0 */
11153     { "bndstx",         { Ev_bnd, Gbnd } },
11154     { "nopQ",           { Ev } },
11155   },
11156   {
11157     /* MOD_0F1B_PREFIX_1 */
11158     { "bndmk",          { Gbnd, Ev_bnd } },
11159     { "nopQ",           { Ev } },
11160   },
11161   {
11162     /* MOD_0F20 */
11163     { Bad_Opcode },
11164     { "movZ",           { Rm, Cm } },
11165   },
11166   {
11167     /* MOD_0F21 */
11168     { Bad_Opcode },
11169     { "movZ",           { Rm, Dm } },
11170   },
11171   {
11172     /* MOD_0F22 */
11173     { Bad_Opcode },
11174     { "movZ",           { Cm, Rm } },
11175   },
11176   {
11177     /* MOD_0F23 */
11178     { Bad_Opcode },
11179     { "movZ",           { Dm, Rm } },
11180   },
11181   {
11182     /* MOD_0F24 */
11183     { Bad_Opcode },
11184     { "movL",           { Rd, Td } },
11185   },
11186   {
11187     /* MOD_0F26 */
11188     { Bad_Opcode },
11189     { "movL",           { Td, Rd } },
11190   },
11191   {
11192     /* MOD_0F2B_PREFIX_0 */
11193     {"movntps",         { Mx, XM } },
11194   },
11195   {
11196     /* MOD_0F2B_PREFIX_1 */
11197     {"movntss",         { Md, XM } },
11198   },
11199   {
11200     /* MOD_0F2B_PREFIX_2 */
11201     {"movntpd",         { Mx, XM } },
11202   },
11203   {
11204     /* MOD_0F2B_PREFIX_3 */
11205     {"movntsd",         { Mq, XM } },
11206   },
11207   {
11208     /* MOD_0F51 */
11209     { Bad_Opcode },
11210     { "movmskpX",       { Gdq, XS } },
11211   },
11212   {
11213     /* MOD_0F71_REG_2 */
11214     { Bad_Opcode },
11215     { "psrlw",          { MS, Ib } },
11216   },
11217   {
11218     /* MOD_0F71_REG_4 */
11219     { Bad_Opcode },
11220     { "psraw",          { MS, Ib } },
11221   },
11222   {
11223     /* MOD_0F71_REG_6 */
11224     { Bad_Opcode },
11225     { "psllw",          { MS, Ib } },
11226   },
11227   {
11228     /* MOD_0F72_REG_2 */
11229     { Bad_Opcode },
11230     { "psrld",          { MS, Ib } },
11231   },
11232   {
11233     /* MOD_0F72_REG_4 */
11234     { Bad_Opcode },
11235     { "psrad",          { MS, Ib } },
11236   },
11237   {
11238     /* MOD_0F72_REG_6 */
11239     { Bad_Opcode },
11240     { "pslld",          { MS, Ib } },
11241   },
11242   {
11243     /* MOD_0F73_REG_2 */
11244     { Bad_Opcode },
11245     { "psrlq",          { MS, Ib } },
11246   },
11247   {
11248     /* MOD_0F73_REG_3 */
11249     { Bad_Opcode },
11250     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
11251   },
11252   {
11253     /* MOD_0F73_REG_6 */
11254     { Bad_Opcode },
11255     { "psllq",          { MS, Ib } },
11256   },
11257   {
11258     /* MOD_0F73_REG_7 */
11259     { Bad_Opcode },
11260     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
11261   },
11262   {
11263     /* MOD_0FAE_REG_0 */
11264     { "fxsave",         { FXSAVE } },
11265     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
11266   },
11267   {
11268     /* MOD_0FAE_REG_1 */
11269     { "fxrstor",        { FXSAVE } },
11270     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
11271   },
11272   {
11273     /* MOD_0FAE_REG_2 */
11274     { "ldmxcsr",        { Md } },
11275     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
11276   },
11277   {
11278     /* MOD_0FAE_REG_3 */
11279     { "stmxcsr",        { Md } },
11280     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
11281   },
11282   {
11283     /* MOD_0FAE_REG_4 */
11284     { "xsave",          { FXSAVE } },
11285   },
11286   {
11287     /* MOD_0FAE_REG_5 */
11288     { "xrstor",         { FXSAVE } },
11289     { RM_TABLE (RM_0FAE_REG_5) },
11290   },
11291   {
11292     /* MOD_0FAE_REG_6 */
11293     { "xsaveopt",       { FXSAVE } },
11294     { RM_TABLE (RM_0FAE_REG_6) },
11295   },
11296   {
11297     /* MOD_0FAE_REG_7 */
11298     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
11299     { RM_TABLE (RM_0FAE_REG_7) },
11300   },
11301   {
11302     /* MOD_0FB2 */
11303     { "lssS",           { Gv, Mp } },
11304   },
11305   {
11306     /* MOD_0FB4 */
11307     { "lfsS",           { Gv, Mp } },
11308   },
11309   {
11310     /* MOD_0FB5 */
11311     { "lgsS",           { Gv, Mp } },
11312   },
11313   {
11314     /* MOD_0FC7_REG_3 */
11315     { "xrstors",                { FXSAVE } },
11316   },
11317   {
11318     /* MOD_0FC7_REG_4 */
11319     { "xsavec",         { FXSAVE } },
11320   },
11321   {
11322     /* MOD_0FC7_REG_5 */
11323     { "xsaves",         { FXSAVE } },
11324   },
11325   {
11326     /* MOD_0FC7_REG_6 */
11327     { PREFIX_TABLE (PREFIX_0FC7_REG_6) },
11328     { "rdrand",         { Ev } },
11329   },
11330   {
11331     /* MOD_0FC7_REG_7 */
11332     { "vmptrst",        { Mq } },
11333     { "rdseed",         { Ev } },
11334   },
11335   {
11336     /* MOD_0FD7 */
11337     { Bad_Opcode },
11338     { "pmovmskb",       { Gdq, MS } },
11339   },
11340   {
11341     /* MOD_0FE7_PREFIX_2 */
11342     { "movntdq",        { Mx, XM } },
11343   },
11344   {
11345     /* MOD_0FF0_PREFIX_3 */
11346     { "lddqu",          { XM, M } },
11347   },
11348   {
11349     /* MOD_0F382A_PREFIX_2 */
11350     { "movntdqa",       { XM, Mx } },
11351   },
11352   {
11353     /* MOD_62_32BIT */
11354     { "bound{S|}",      { Gv, Ma } },
11355     { EVEX_TABLE (EVEX_0F) },
11356   },
11357   {
11358     /* MOD_C4_32BIT */
11359     { "lesS",           { Gv, Mp } },
11360     { VEX_C4_TABLE (VEX_0F) },
11361   },
11362   {
11363     /* MOD_C5_32BIT */
11364     { "ldsS",           { Gv, Mp } },
11365     { VEX_C5_TABLE (VEX_0F) },
11366   },
11367   {
11368     /* MOD_VEX_0F12_PREFIX_0 */
11369     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
11370     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
11371   },
11372   {
11373     /* MOD_VEX_0F13 */
11374     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
11375   },
11376   {
11377     /* MOD_VEX_0F16_PREFIX_0 */
11378     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
11379     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
11380   },
11381   {
11382     /* MOD_VEX_0F17 */
11383     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
11384   },
11385   {
11386     /* MOD_VEX_0F2B */
11387     { VEX_W_TABLE (VEX_W_0F2B_M_0) },
11388   },
11389   {
11390     /* MOD_VEX_0F50 */
11391     { Bad_Opcode },
11392     { VEX_W_TABLE (VEX_W_0F50_M_0) },
11393   },
11394   {
11395     /* MOD_VEX_0F71_REG_2 */
11396     { Bad_Opcode },
11397     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
11398   },
11399   {
11400     /* MOD_VEX_0F71_REG_4 */
11401     { Bad_Opcode },
11402     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
11403   },
11404   {
11405     /* MOD_VEX_0F71_REG_6 */
11406     { Bad_Opcode },
11407     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
11408   },
11409   {
11410     /* MOD_VEX_0F72_REG_2 */
11411     { Bad_Opcode },
11412     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
11413   },
11414   {
11415     /* MOD_VEX_0F72_REG_4 */
11416     { Bad_Opcode },
11417     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
11418   },
11419   {
11420     /* MOD_VEX_0F72_REG_6 */
11421     { Bad_Opcode },
11422     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
11423   },
11424   {
11425     /* MOD_VEX_0F73_REG_2 */
11426     { Bad_Opcode },
11427     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
11428   },
11429   {
11430     /* MOD_VEX_0F73_REG_3 */
11431     { Bad_Opcode },
11432     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
11433   },
11434   {
11435     /* MOD_VEX_0F73_REG_6 */
11436     { Bad_Opcode },
11437     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
11438   },
11439   {
11440     /* MOD_VEX_0F73_REG_7 */
11441     { Bad_Opcode },
11442     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
11443   },
11444   {
11445     /* MOD_VEX_0FAE_REG_2 */
11446     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
11447   },
11448   {
11449     /* MOD_VEX_0FAE_REG_3 */
11450     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
11451   },
11452   {
11453     /* MOD_VEX_0FD7_PREFIX_2 */
11454     { Bad_Opcode },
11455     { VEX_W_TABLE (VEX_W_0FD7_P_2_M_1) },
11456   },
11457   {
11458     /* MOD_VEX_0FE7_PREFIX_2 */
11459     { VEX_W_TABLE (VEX_W_0FE7_P_2_M_0) },
11460   },
11461   {
11462     /* MOD_VEX_0FF0_PREFIX_3 */
11463     { VEX_W_TABLE (VEX_W_0FF0_P_3_M_0) },
11464   },
11465   {
11466     /* MOD_VEX_0F381A_PREFIX_2 */
11467     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
11468   },
11469   {
11470     /* MOD_VEX_0F382A_PREFIX_2 */
11471     { VEX_W_TABLE (VEX_W_0F382A_P_2_M_0) },
11472   },
11473   {
11474     /* MOD_VEX_0F382C_PREFIX_2 */
11475     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
11476   },
11477   {
11478     /* MOD_VEX_0F382D_PREFIX_2 */
11479     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
11480   },
11481   {
11482     /* MOD_VEX_0F382E_PREFIX_2 */
11483     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
11484   },
11485   {
11486     /* MOD_VEX_0F382F_PREFIX_2 */
11487     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
11488   },
11489   {
11490     /* MOD_VEX_0F385A_PREFIX_2 */
11491     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
11492   },
11493   {
11494     /* MOD_VEX_0F388C_PREFIX_2 */
11495     { "vpmaskmov%LW",   { XM, Vex, Mx } },
11496   },
11497   {
11498     /* MOD_VEX_0F388E_PREFIX_2 */
11499     { "vpmaskmov%LW",   { Mx, Vex, XM } },
11500   },
11501 #define NEED_MOD_TABLE
11502 #include "i386-dis-evex.h"
11503 #undef NEED_MOD_TABLE
11504 };
11505
11506 static const struct dis386 rm_table[][8] = {
11507   {
11508     /* RM_C6_REG_7 */
11509     { "xabort",         { Skip_MODRM, Ib } },
11510   },
11511   {
11512     /* RM_C7_REG_7 */
11513     { "xbeginT",        { Skip_MODRM, Jv } },
11514   },
11515   {
11516     /* RM_0F01_REG_0 */
11517     { Bad_Opcode },
11518     { "vmcall",         { Skip_MODRM } },
11519     { "vmlaunch",       { Skip_MODRM } },
11520     { "vmresume",       { Skip_MODRM } },
11521     { "vmxoff",         { Skip_MODRM } },
11522   },
11523   {
11524     /* RM_0F01_REG_1 */
11525     { "monitor",        { { OP_Monitor, 0 } } },
11526     { "mwait",          { { OP_Mwait, 0 } } },
11527     { "clac",           { Skip_MODRM } },
11528     { "stac",           { Skip_MODRM } },
11529   },
11530   {
11531     /* RM_0F01_REG_2 */
11532     { "xgetbv",         { Skip_MODRM } },
11533     { "xsetbv",         { Skip_MODRM } },
11534     { Bad_Opcode },
11535     { Bad_Opcode },
11536     { "vmfunc",         { Skip_MODRM } },
11537     { "xend",           { Skip_MODRM } },
11538     { "xtest",          { Skip_MODRM } },
11539     { Bad_Opcode },
11540   },
11541   {
11542     /* RM_0F01_REG_3 */
11543     { "vmrun",          { Skip_MODRM } },
11544     { "vmmcall",        { Skip_MODRM } },
11545     { "vmload",         { Skip_MODRM } },
11546     { "vmsave",         { Skip_MODRM } },
11547     { "stgi",           { Skip_MODRM } },
11548     { "clgi",           { Skip_MODRM } },
11549     { "skinit",         { Skip_MODRM } },
11550     { "invlpga",        { Skip_MODRM } },
11551   },
11552   {
11553     /* RM_0F01_REG_7 */
11554     { "swapgs",         { Skip_MODRM } },
11555     { "rdtscp",         { Skip_MODRM } },
11556   },
11557   {
11558     /* RM_0FAE_REG_5 */
11559     { "lfence",         { Skip_MODRM } },
11560   },
11561   {
11562     /* RM_0FAE_REG_6 */
11563     { "mfence",         { Skip_MODRM } },
11564   },
11565   {
11566     /* RM_0FAE_REG_7 */
11567     { "sfence",         { Skip_MODRM } },
11568   },
11569 };
11570
11571 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11572
11573 /* We use the high bit to indicate different name for the same
11574    prefix.  */
11575 #define ADDR16_PREFIX   (0x67 | 0x100)
11576 #define ADDR32_PREFIX   (0x67 | 0x200)
11577 #define DATA16_PREFIX   (0x66 | 0x100)
11578 #define DATA32_PREFIX   (0x66 | 0x200)
11579 #define REP_PREFIX      (0xf3 | 0x100)
11580 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11581 #define XRELEASE_PREFIX (0xf3 | 0x400)
11582 #define BND_PREFIX      (0xf2 | 0x400)
11583
11584 static int
11585 ckprefix (void)
11586 {
11587   int newrex, i, length;
11588   rex = 0;
11589   rex_ignored = 0;
11590   prefixes = 0;
11591   used_prefixes = 0;
11592   rex_used = 0;
11593   last_lock_prefix = -1;
11594   last_repz_prefix = -1;
11595   last_repnz_prefix = -1;
11596   last_data_prefix = -1;
11597   last_addr_prefix = -1;
11598   last_rex_prefix = -1;
11599   last_seg_prefix = -1;
11600   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11601     all_prefixes[i] = 0;
11602   i = 0;
11603   length = 0;
11604   /* The maximum instruction length is 15bytes.  */
11605   while (length < MAX_CODE_LENGTH - 1)
11606     {
11607       FETCH_DATA (the_info, codep + 1);
11608       newrex = 0;
11609       switch (*codep)
11610         {
11611         /* REX prefixes family.  */
11612         case 0x40:
11613         case 0x41:
11614         case 0x42:
11615         case 0x43:
11616         case 0x44:
11617         case 0x45:
11618         case 0x46:
11619         case 0x47:
11620         case 0x48:
11621         case 0x49:
11622         case 0x4a:
11623         case 0x4b:
11624         case 0x4c:
11625         case 0x4d:
11626         case 0x4e:
11627         case 0x4f:
11628           if (address_mode == mode_64bit)
11629             newrex = *codep;
11630           else
11631             return 1;
11632           last_rex_prefix = i;
11633           break;
11634         case 0xf3:
11635           prefixes |= PREFIX_REPZ;
11636           last_repz_prefix = i;
11637           break;
11638         case 0xf2:
11639           prefixes |= PREFIX_REPNZ;
11640           last_repnz_prefix = i;
11641           break;
11642         case 0xf0:
11643           prefixes |= PREFIX_LOCK;
11644           last_lock_prefix = i;
11645           break;
11646         case 0x2e:
11647           prefixes |= PREFIX_CS;
11648           last_seg_prefix = i;
11649           break;
11650         case 0x36:
11651           prefixes |= PREFIX_SS;
11652           last_seg_prefix = i;
11653           break;
11654         case 0x3e:
11655           prefixes |= PREFIX_DS;
11656           last_seg_prefix = i;
11657           break;
11658         case 0x26:
11659           prefixes |= PREFIX_ES;
11660           last_seg_prefix = i;
11661           break;
11662         case 0x64:
11663           prefixes |= PREFIX_FS;
11664           last_seg_prefix = i;
11665           break;
11666         case 0x65:
11667           prefixes |= PREFIX_GS;
11668           last_seg_prefix = i;
11669           break;
11670         case 0x66:
11671           prefixes |= PREFIX_DATA;
11672           last_data_prefix = i;
11673           break;
11674         case 0x67:
11675           prefixes |= PREFIX_ADDR;
11676           last_addr_prefix = i;
11677           break;
11678         case FWAIT_OPCODE:
11679           /* fwait is really an instruction.  If there are prefixes
11680              before the fwait, they belong to the fwait, *not* to the
11681              following instruction.  */
11682           if (prefixes || rex)
11683             {
11684               prefixes |= PREFIX_FWAIT;
11685               codep++;
11686               /* This ensures that the previous REX prefixes are noticed
11687                  as unused prefixes, as in the return case below.  */
11688               rex_used = rex;
11689               return 1;
11690             }
11691           prefixes = PREFIX_FWAIT;
11692           break;
11693         default:
11694           return 1;
11695         }
11696       /* Rex is ignored when followed by another prefix.  */
11697       if (rex)
11698         {
11699           rex_used = rex;
11700           return 1;
11701         }
11702       if (*codep != FWAIT_OPCODE)
11703         all_prefixes[i++] = *codep;
11704       rex = newrex;
11705       codep++;
11706       length++;
11707     }
11708   return 0;
11709 }
11710
11711 static int
11712 seg_prefix (int pref)
11713 {
11714   switch (pref)
11715     {
11716     case 0x2e:
11717       return PREFIX_CS;
11718     case 0x36:
11719       return PREFIX_SS;
11720     case 0x3e:
11721       return PREFIX_DS;
11722     case 0x26:
11723       return PREFIX_ES;
11724     case 0x64:
11725       return PREFIX_FS;
11726     case 0x65:
11727       return PREFIX_GS;
11728     default:
11729       return 0;
11730     }
11731 }
11732
11733 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11734    prefix byte.  */
11735
11736 static const char *
11737 prefix_name (int pref, int sizeflag)
11738 {
11739   static const char *rexes [16] =
11740     {
11741       "rex",            /* 0x40 */
11742       "rex.B",          /* 0x41 */
11743       "rex.X",          /* 0x42 */
11744       "rex.XB",         /* 0x43 */
11745       "rex.R",          /* 0x44 */
11746       "rex.RB",         /* 0x45 */
11747       "rex.RX",         /* 0x46 */
11748       "rex.RXB",        /* 0x47 */
11749       "rex.W",          /* 0x48 */
11750       "rex.WB",         /* 0x49 */
11751       "rex.WX",         /* 0x4a */
11752       "rex.WXB",        /* 0x4b */
11753       "rex.WR",         /* 0x4c */
11754       "rex.WRB",        /* 0x4d */
11755       "rex.WRX",        /* 0x4e */
11756       "rex.WRXB",       /* 0x4f */
11757     };
11758
11759   switch (pref)
11760     {
11761     /* REX prefixes family.  */
11762     case 0x40:
11763     case 0x41:
11764     case 0x42:
11765     case 0x43:
11766     case 0x44:
11767     case 0x45:
11768     case 0x46:
11769     case 0x47:
11770     case 0x48:
11771     case 0x49:
11772     case 0x4a:
11773     case 0x4b:
11774     case 0x4c:
11775     case 0x4d:
11776     case 0x4e:
11777     case 0x4f:
11778       return rexes [pref - 0x40];
11779     case 0xf3:
11780       return "repz";
11781     case 0xf2:
11782       return "repnz";
11783     case 0xf0:
11784       return "lock";
11785     case 0x2e:
11786       return "cs";
11787     case 0x36:
11788       return "ss";
11789     case 0x3e:
11790       return "ds";
11791     case 0x26:
11792       return "es";
11793     case 0x64:
11794       return "fs";
11795     case 0x65:
11796       return "gs";
11797     case 0x66:
11798       return (sizeflag & DFLAG) ? "data16" : "data32";
11799     case 0x67:
11800       if (address_mode == mode_64bit)
11801         return (sizeflag & AFLAG) ? "addr32" : "addr64";
11802       else
11803         return (sizeflag & AFLAG) ? "addr16" : "addr32";
11804     case FWAIT_OPCODE:
11805       return "fwait";
11806     case ADDR16_PREFIX:
11807       return "addr16";
11808     case ADDR32_PREFIX:
11809       return "addr32";
11810     case DATA16_PREFIX:
11811       return "data16";
11812     case DATA32_PREFIX:
11813       return "data32";
11814     case REP_PREFIX:
11815       return "rep";
11816     case XACQUIRE_PREFIX:
11817       return "xacquire";
11818     case XRELEASE_PREFIX:
11819       return "xrelease";
11820     case BND_PREFIX:
11821       return "bnd";
11822     default:
11823       return NULL;
11824     }
11825 }
11826
11827 static char op_out[MAX_OPERANDS][100];
11828 static int op_ad, op_index[MAX_OPERANDS];
11829 static int two_source_ops;
11830 static bfd_vma op_address[MAX_OPERANDS];
11831 static bfd_vma op_riprel[MAX_OPERANDS];
11832 static bfd_vma start_pc;
11833
11834 /*
11835  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11836  *   (see topic "Redundant prefixes" in the "Differences from 8086"
11837  *   section of the "Virtual 8086 Mode" chapter.)
11838  * 'pc' should be the address of this instruction, it will
11839  *   be used to print the target address if this is a relative jump or call
11840  * The function returns the length of this instruction in bytes.
11841  */
11842
11843 static char intel_syntax;
11844 static char intel_mnemonic = !SYSV386_COMPAT;
11845 static char open_char;
11846 static char close_char;
11847 static char separator_char;
11848 static char scale_char;
11849
11850 /* Here for backwards compatibility.  When gdb stops using
11851    print_insn_i386_att and print_insn_i386_intel these functions can
11852    disappear, and print_insn_i386 be merged into print_insn.  */
11853 int
11854 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11855 {
11856   intel_syntax = 0;
11857
11858   return print_insn (pc, info);
11859 }
11860
11861 int
11862 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11863 {
11864   intel_syntax = 1;
11865
11866   return print_insn (pc, info);
11867 }
11868
11869 int
11870 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11871 {
11872   intel_syntax = -1;
11873
11874   return print_insn (pc, info);
11875 }
11876
11877 void
11878 print_i386_disassembler_options (FILE *stream)
11879 {
11880   fprintf (stream, _("\n\
11881 The following i386/x86-64 specific disassembler options are supported for use\n\
11882 with the -M switch (multiple options should be separated by commas):\n"));
11883
11884   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
11885   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
11886   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
11887   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
11888   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
11889   fprintf (stream, _("  att-mnemonic\n"
11890                      "              Display instruction in AT&T mnemonic\n"));
11891   fprintf (stream, _("  intel-mnemonic\n"
11892                      "              Display instruction in Intel mnemonic\n"));
11893   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
11894   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
11895   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
11896   fprintf (stream, _("  data32      Assume 32bit data size\n"));
11897   fprintf (stream, _("  data16      Assume 16bit data size\n"));
11898   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
11899 }
11900
11901 /* Bad opcode.  */
11902 static const struct dis386 bad_opcode = { "(bad)", { XX } };
11903
11904 /* Get a pointer to struct dis386 with a valid name.  */
11905
11906 static const struct dis386 *
11907 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11908 {
11909   int vindex, vex_table_index;
11910
11911   if (dp->name != NULL)
11912     return dp;
11913
11914   switch (dp->op[0].bytemode)
11915     {
11916     case USE_REG_TABLE:
11917       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11918       break;
11919
11920     case USE_MOD_TABLE:
11921       vindex = modrm.mod == 0x3 ? 1 : 0;
11922       dp = &mod_table[dp->op[1].bytemode][vindex];
11923       break;
11924
11925     case USE_RM_TABLE:
11926       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11927       break;
11928
11929     case USE_PREFIX_TABLE:
11930       if (need_vex)
11931         {
11932           /* The prefix in VEX is implicit.  */
11933           switch (vex.prefix)
11934             {
11935             case 0:
11936               vindex = 0;
11937               break;
11938             case REPE_PREFIX_OPCODE:
11939               vindex = 1;
11940               break;
11941             case DATA_PREFIX_OPCODE:
11942               vindex = 2;
11943               break;
11944             case REPNE_PREFIX_OPCODE:
11945               vindex = 3;
11946               break;
11947             default:
11948               abort ();
11949               break;
11950             }
11951         }
11952       else
11953         {
11954           vindex = 0;
11955           used_prefixes |= (prefixes & PREFIX_REPZ);
11956           if (prefixes & PREFIX_REPZ)
11957             {
11958               vindex = 1;
11959               all_prefixes[last_repz_prefix] = 0;
11960             }
11961           else
11962             {
11963               /* We should check PREFIX_REPNZ and PREFIX_REPZ before
11964                  PREFIX_DATA.  */
11965               used_prefixes |= (prefixes & PREFIX_REPNZ);
11966               if (prefixes & PREFIX_REPNZ)
11967                 {
11968                   vindex = 3;
11969                   all_prefixes[last_repnz_prefix] = 0;
11970                 }
11971               else
11972                 {
11973                   used_prefixes |= (prefixes & PREFIX_DATA);
11974                   if (prefixes & PREFIX_DATA)
11975                     {
11976                       vindex = 2;
11977                       all_prefixes[last_data_prefix] = 0;
11978                     }
11979                 }
11980             }
11981         }
11982       dp = &prefix_table[dp->op[1].bytemode][vindex];
11983       break;
11984
11985     case USE_X86_64_TABLE:
11986       vindex = address_mode == mode_64bit ? 1 : 0;
11987       dp = &x86_64_table[dp->op[1].bytemode][vindex];
11988       break;
11989
11990     case USE_3BYTE_TABLE:
11991       FETCH_DATA (info, codep + 2);
11992       vindex = *codep++;
11993       dp = &three_byte_table[dp->op[1].bytemode][vindex];
11994       modrm.mod = (*codep >> 6) & 3;
11995       modrm.reg = (*codep >> 3) & 7;
11996       modrm.rm = *codep & 7;
11997       break;
11998
11999     case USE_VEX_LEN_TABLE:
12000       if (!need_vex)
12001         abort ();
12002
12003       switch (vex.length)
12004         {
12005         case 128:
12006           vindex = 0;
12007           break;
12008         case 256:
12009           vindex = 1;
12010           break;
12011         default:
12012           abort ();
12013           break;
12014         }
12015
12016       dp = &vex_len_table[dp->op[1].bytemode][vindex];
12017       break;
12018
12019     case USE_XOP_8F_TABLE:
12020       FETCH_DATA (info, codep + 3);
12021       /* All bits in the REX prefix are ignored.  */
12022       rex_ignored = rex;
12023       rex = ~(*codep >> 5) & 0x7;
12024
12025       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
12026       switch ((*codep & 0x1f))
12027         {
12028         default:
12029           dp = &bad_opcode;
12030           return dp;
12031         case 0x8:
12032           vex_table_index = XOP_08;
12033           break;
12034         case 0x9:
12035           vex_table_index = XOP_09;
12036           break;
12037         case 0xa:
12038           vex_table_index = XOP_0A;
12039           break;
12040         }
12041       codep++;
12042       vex.w = *codep & 0x80;
12043       if (vex.w && address_mode == mode_64bit)
12044         rex |= REX_W;
12045
12046       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12047       if (address_mode != mode_64bit
12048           && vex.register_specifier > 0x7)
12049         {
12050           dp = &bad_opcode;
12051           return dp;
12052         }
12053
12054       vex.length = (*codep & 0x4) ? 256 : 128;
12055       switch ((*codep & 0x3))
12056         {
12057         case 0:
12058           vex.prefix = 0;
12059           break;
12060         case 1:
12061           vex.prefix = DATA_PREFIX_OPCODE;
12062           break;
12063         case 2:
12064           vex.prefix = REPE_PREFIX_OPCODE;
12065           break;
12066         case 3:
12067           vex.prefix = REPNE_PREFIX_OPCODE;
12068           break;
12069         }
12070       need_vex = 1;
12071       need_vex_reg = 1;
12072       codep++;
12073       vindex = *codep++;
12074       dp = &xop_table[vex_table_index][vindex];
12075
12076       FETCH_DATA (info, codep + 1);
12077       modrm.mod = (*codep >> 6) & 3;
12078       modrm.reg = (*codep >> 3) & 7;
12079       modrm.rm = *codep & 7;
12080       break;
12081
12082     case USE_VEX_C4_TABLE:
12083       /* VEX prefix.  */
12084       FETCH_DATA (info, codep + 3);
12085       /* All bits in the REX prefix are ignored.  */
12086       rex_ignored = rex;
12087       rex = ~(*codep >> 5) & 0x7;
12088       switch ((*codep & 0x1f))
12089         {
12090         default:
12091           dp = &bad_opcode;
12092           return dp;
12093         case 0x1:
12094           vex_table_index = VEX_0F;
12095           break;
12096         case 0x2:
12097           vex_table_index = VEX_0F38;
12098           break;
12099         case 0x3:
12100           vex_table_index = VEX_0F3A;
12101           break;
12102         }
12103       codep++;
12104       vex.w = *codep & 0x80;
12105       if (vex.w && address_mode == mode_64bit)
12106         rex |= REX_W;
12107
12108       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12109       if (address_mode != mode_64bit
12110           && vex.register_specifier > 0x7)
12111         {
12112           dp = &bad_opcode;
12113           return dp;
12114         }
12115
12116       vex.length = (*codep & 0x4) ? 256 : 128;
12117       switch ((*codep & 0x3))
12118         {
12119         case 0:
12120           vex.prefix = 0;
12121           break;
12122         case 1:
12123           vex.prefix = DATA_PREFIX_OPCODE;
12124           break;
12125         case 2:
12126           vex.prefix = REPE_PREFIX_OPCODE;
12127           break;
12128         case 3:
12129           vex.prefix = REPNE_PREFIX_OPCODE;
12130           break;
12131         }
12132       need_vex = 1;
12133       need_vex_reg = 1;
12134       codep++;
12135       vindex = *codep++;
12136       dp = &vex_table[vex_table_index][vindex];
12137       /* There is no MODRM byte for VEX [82|77].  */
12138       if (vindex != 0x77 && vindex != 0x82)
12139         {
12140           FETCH_DATA (info, codep + 1);
12141           modrm.mod = (*codep >> 6) & 3;
12142           modrm.reg = (*codep >> 3) & 7;
12143           modrm.rm = *codep & 7;
12144         }
12145       break;
12146
12147     case USE_VEX_C5_TABLE:
12148       /* VEX prefix.  */
12149       FETCH_DATA (info, codep + 2);
12150       /* All bits in the REX prefix are ignored.  */
12151       rex_ignored = rex;
12152       rex = (*codep & 0x80) ? 0 : REX_R;
12153
12154       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12155       if (address_mode != mode_64bit
12156           && vex.register_specifier > 0x7)
12157         {
12158           dp = &bad_opcode;
12159           return dp;
12160         }
12161
12162       vex.w = 0;
12163
12164       vex.length = (*codep & 0x4) ? 256 : 128;
12165       switch ((*codep & 0x3))
12166         {
12167         case 0:
12168           vex.prefix = 0;
12169           break;
12170         case 1:
12171           vex.prefix = DATA_PREFIX_OPCODE;
12172           break;
12173         case 2:
12174           vex.prefix = REPE_PREFIX_OPCODE;
12175           break;
12176         case 3:
12177           vex.prefix = REPNE_PREFIX_OPCODE;
12178           break;
12179         }
12180       need_vex = 1;
12181       need_vex_reg = 1;
12182       codep++;
12183       vindex = *codep++;
12184       dp = &vex_table[dp->op[1].bytemode][vindex];
12185       /* There is no MODRM byte for VEX [82|77].  */
12186       if (vindex != 0x77 && vindex != 0x82)
12187         {
12188           FETCH_DATA (info, codep + 1);
12189           modrm.mod = (*codep >> 6) & 3;
12190           modrm.reg = (*codep >> 3) & 7;
12191           modrm.rm = *codep & 7;
12192         }
12193       break;
12194
12195     case USE_VEX_W_TABLE:
12196       if (!need_vex)
12197         abort ();
12198
12199       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
12200       break;
12201
12202     case USE_EVEX_TABLE:
12203       two_source_ops = 0;
12204       /* EVEX prefix.  */
12205       vex.evex = 1;
12206       FETCH_DATA (info, codep + 4);
12207       /* All bits in the REX prefix are ignored.  */
12208       rex_ignored = rex;
12209       /* The first byte after 0x62.  */
12210       rex = ~(*codep >> 5) & 0x7;
12211       vex.r = *codep & 0x10;
12212       switch ((*codep & 0xf))
12213         {
12214         default:
12215           return &bad_opcode;
12216         case 0x1:
12217           vex_table_index = EVEX_0F;
12218           break;
12219         case 0x2:
12220           vex_table_index = EVEX_0F38;
12221           break;
12222         case 0x3:
12223           vex_table_index = EVEX_0F3A;
12224           break;
12225         }
12226
12227       /* The second byte after 0x62.  */
12228       codep++;
12229       vex.w = *codep & 0x80;
12230       if (vex.w && address_mode == mode_64bit)
12231         rex |= REX_W;
12232
12233       vex.register_specifier = (~(*codep >> 3)) & 0xf;
12234       if (address_mode != mode_64bit)
12235         {
12236           /* In 16/32-bit mode silently ignore following bits.  */
12237           rex &= ~REX_B;
12238           vex.r = 1;
12239           vex.v = 1;
12240           vex.register_specifier &= 0x7;
12241         }
12242
12243       /* The U bit.  */
12244       if (!(*codep & 0x4))
12245         return &bad_opcode;
12246
12247       switch ((*codep & 0x3))
12248         {
12249         case 0:
12250           vex.prefix = 0;
12251           break;
12252         case 1:
12253           vex.prefix = DATA_PREFIX_OPCODE;
12254           break;
12255         case 2:
12256           vex.prefix = REPE_PREFIX_OPCODE;
12257           break;
12258         case 3:
12259           vex.prefix = REPNE_PREFIX_OPCODE;
12260           break;
12261         }
12262
12263       /* The third byte after 0x62.  */
12264       codep++;
12265
12266       /* Remember the static rounding bits.  */
12267       vex.ll = (*codep >> 5) & 3;
12268       vex.b = (*codep & 0x10) != 0;
12269
12270       vex.v = *codep & 0x8;
12271       vex.mask_register_specifier = *codep & 0x7;
12272       vex.zeroing = *codep & 0x80;
12273
12274       need_vex = 1;
12275       need_vex_reg = 1;
12276       codep++;
12277       vindex = *codep++;
12278       dp = &evex_table[vex_table_index][vindex];
12279       FETCH_DATA (info, codep + 1);
12280       modrm.mod = (*codep >> 6) & 3;
12281       modrm.reg = (*codep >> 3) & 7;
12282       modrm.rm = *codep & 7;
12283
12284       /* Set vector length.  */
12285       if (modrm.mod == 3 && vex.b)
12286         vex.length = 512;
12287       else
12288         {
12289           switch (vex.ll)
12290             {
12291             case 0x0:
12292               vex.length = 128;
12293               break;
12294             case 0x1:
12295               vex.length = 256;
12296               break;
12297             case 0x2:
12298               vex.length = 512;
12299               break;
12300             default:
12301               return &bad_opcode;
12302             }
12303         }
12304       break;
12305
12306     case 0:
12307       dp = &bad_opcode;
12308       break;
12309
12310     default:
12311       abort ();
12312     }
12313
12314   if (dp->name != NULL)
12315     return dp;
12316   else
12317     return get_valid_dis386 (dp, info);
12318 }
12319
12320 static void
12321 get_sib (disassemble_info *info, int sizeflag)
12322 {
12323   /* If modrm.mod == 3, operand must be register.  */
12324   if (need_modrm
12325       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
12326       && modrm.mod != 3
12327       && modrm.rm == 4)
12328     {
12329       FETCH_DATA (info, codep + 2);
12330       sib.index = (codep [1] >> 3) & 7;
12331       sib.scale = (codep [1] >> 6) & 3;
12332       sib.base = codep [1] & 7;
12333     }
12334 }
12335
12336 static int
12337 print_insn (bfd_vma pc, disassemble_info *info)
12338 {
12339   const struct dis386 *dp;
12340   int i;
12341   char *op_txt[MAX_OPERANDS];
12342   int needcomma;
12343   int sizeflag;
12344   const char *p;
12345   struct dis_private priv;
12346   int prefix_length;
12347   int default_prefixes;
12348
12349   priv.orig_sizeflag = AFLAG | DFLAG;
12350   if ((info->mach & bfd_mach_i386_i386) != 0)
12351     address_mode = mode_32bit;
12352   else if (info->mach == bfd_mach_i386_i8086)
12353     {
12354       address_mode = mode_16bit;
12355       priv.orig_sizeflag = 0;
12356     }
12357   else
12358     address_mode = mode_64bit;
12359
12360   if (intel_syntax == (char) -1)
12361     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
12362
12363   for (p = info->disassembler_options; p != NULL; )
12364     {
12365       if (CONST_STRNEQ (p, "x86-64"))
12366         {
12367           address_mode = mode_64bit;
12368           priv.orig_sizeflag = AFLAG | DFLAG;
12369         }
12370       else if (CONST_STRNEQ (p, "i386"))
12371         {
12372           address_mode = mode_32bit;
12373           priv.orig_sizeflag = AFLAG | DFLAG;
12374         }
12375       else if (CONST_STRNEQ (p, "i8086"))
12376         {
12377           address_mode = mode_16bit;
12378           priv.orig_sizeflag = 0;
12379         }
12380       else if (CONST_STRNEQ (p, "intel"))
12381         {
12382           intel_syntax = 1;
12383           if (CONST_STRNEQ (p + 5, "-mnemonic"))
12384             intel_mnemonic = 1;
12385         }
12386       else if (CONST_STRNEQ (p, "att"))
12387         {
12388           intel_syntax = 0;
12389           if (CONST_STRNEQ (p + 3, "-mnemonic"))
12390             intel_mnemonic = 0;
12391         }
12392       else if (CONST_STRNEQ (p, "addr"))
12393         {
12394           if (address_mode == mode_64bit)
12395             {
12396               if (p[4] == '3' && p[5] == '2')
12397                 priv.orig_sizeflag &= ~AFLAG;
12398               else if (p[4] == '6' && p[5] == '4')
12399                 priv.orig_sizeflag |= AFLAG;
12400             }
12401           else
12402             {
12403               if (p[4] == '1' && p[5] == '6')
12404                 priv.orig_sizeflag &= ~AFLAG;
12405               else if (p[4] == '3' && p[5] == '2')
12406                 priv.orig_sizeflag |= AFLAG;
12407             }
12408         }
12409       else if (CONST_STRNEQ (p, "data"))
12410         {
12411           if (p[4] == '1' && p[5] == '6')
12412             priv.orig_sizeflag &= ~DFLAG;
12413           else if (p[4] == '3' && p[5] == '2')
12414             priv.orig_sizeflag |= DFLAG;
12415         }
12416       else if (CONST_STRNEQ (p, "suffix"))
12417         priv.orig_sizeflag |= SUFFIX_ALWAYS;
12418
12419       p = strchr (p, ',');
12420       if (p != NULL)
12421         p++;
12422     }
12423
12424   if (intel_syntax)
12425     {
12426       names64 = intel_names64;
12427       names32 = intel_names32;
12428       names16 = intel_names16;
12429       names8 = intel_names8;
12430       names8rex = intel_names8rex;
12431       names_seg = intel_names_seg;
12432       names_mm = intel_names_mm;
12433       names_bnd = intel_names_bnd;
12434       names_xmm = intel_names_xmm;
12435       names_ymm = intel_names_ymm;
12436       names_zmm = intel_names_zmm;
12437       index64 = intel_index64;
12438       index32 = intel_index32;
12439       names_mask = intel_names_mask;
12440       index16 = intel_index16;
12441       open_char = '[';
12442       close_char = ']';
12443       separator_char = '+';
12444       scale_char = '*';
12445     }
12446   else
12447     {
12448       names64 = att_names64;
12449       names32 = att_names32;
12450       names16 = att_names16;
12451       names8 = att_names8;
12452       names8rex = att_names8rex;
12453       names_seg = att_names_seg;
12454       names_mm = att_names_mm;
12455       names_bnd = att_names_bnd;
12456       names_xmm = att_names_xmm;
12457       names_ymm = att_names_ymm;
12458       names_zmm = att_names_zmm;
12459       index64 = att_index64;
12460       index32 = att_index32;
12461       names_mask = att_names_mask;
12462       index16 = att_index16;
12463       open_char = '(';
12464       close_char =  ')';
12465       separator_char = ',';
12466       scale_char = ',';
12467     }
12468
12469   /* The output looks better if we put 7 bytes on a line, since that
12470      puts most long word instructions on a single line.  Use 8 bytes
12471      for Intel L1OM.  */
12472   if ((info->mach & bfd_mach_l1om) != 0)
12473     info->bytes_per_line = 8;
12474   else
12475     info->bytes_per_line = 7;
12476
12477   info->private_data = &priv;
12478   priv.max_fetched = priv.the_buffer;
12479   priv.insn_start = pc;
12480
12481   obuf[0] = 0;
12482   for (i = 0; i < MAX_OPERANDS; ++i)
12483     {
12484       op_out[i][0] = 0;
12485       op_index[i] = -1;
12486     }
12487
12488   the_info = info;
12489   start_pc = pc;
12490   start_codep = priv.the_buffer;
12491   codep = priv.the_buffer;
12492
12493   if (setjmp (priv.bailout) != 0)
12494     {
12495       const char *name;
12496
12497       /* Getting here means we tried for data but didn't get it.  That
12498          means we have an incomplete instruction of some sort.  Just
12499          print the first byte as a prefix or a .byte pseudo-op.  */
12500       if (codep > priv.the_buffer)
12501         {
12502           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12503           if (name != NULL)
12504             (*info->fprintf_func) (info->stream, "%s", name);
12505           else
12506             {
12507               /* Just print the first byte as a .byte instruction.  */
12508               (*info->fprintf_func) (info->stream, ".byte 0x%x",
12509                                      (unsigned int) priv.the_buffer[0]);
12510             }
12511
12512           return 1;
12513         }
12514
12515       return -1;
12516     }
12517
12518   obufp = obuf;
12519   sizeflag = priv.orig_sizeflag;
12520
12521   if (!ckprefix () || rex_used)
12522     {
12523       /* Too many prefixes or unused REX prefixes.  */
12524       for (i = 0;
12525            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12526            i++)
12527         (*info->fprintf_func) (info->stream, "%s%s",
12528                                i == 0 ? "" : " ",
12529                                prefix_name (all_prefixes[i], sizeflag));
12530       return i;
12531     }
12532
12533   insn_codep = codep;
12534
12535   FETCH_DATA (info, codep + 1);
12536   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12537
12538   if (((prefixes & PREFIX_FWAIT)
12539        && ((*codep < 0xd8) || (*codep > 0xdf))))
12540     {
12541       (*info->fprintf_func) (info->stream, "fwait");
12542       return 1;
12543     }
12544
12545   if (*codep == 0x0f)
12546     {
12547       unsigned char threebyte;
12548       FETCH_DATA (info, codep + 2);
12549       threebyte = *++codep;
12550       dp = &dis386_twobyte[threebyte];
12551       need_modrm = twobyte_has_modrm[*codep];
12552       codep++;
12553     }
12554   else
12555     {
12556       dp = &dis386[*codep];
12557       need_modrm = onebyte_has_modrm[*codep];
12558       codep++;
12559     }
12560
12561   if ((prefixes & PREFIX_REPZ))
12562     used_prefixes |= PREFIX_REPZ;
12563   if ((prefixes & PREFIX_REPNZ))
12564     used_prefixes |= PREFIX_REPNZ;
12565   if ((prefixes & PREFIX_LOCK))
12566     used_prefixes |= PREFIX_LOCK;
12567
12568   default_prefixes = 0;
12569   if (prefixes & PREFIX_ADDR)
12570     {
12571       sizeflag ^= AFLAG;
12572       if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
12573         {
12574           if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12575             all_prefixes[last_addr_prefix] = ADDR32_PREFIX;
12576           else
12577             all_prefixes[last_addr_prefix] = ADDR16_PREFIX;
12578           default_prefixes |= PREFIX_ADDR;
12579         }
12580     }
12581
12582   if ((prefixes & PREFIX_DATA))
12583     {
12584       sizeflag ^= DFLAG;
12585       if (dp->op[2].bytemode == cond_jump_mode
12586           && dp->op[0].bytemode == v_mode
12587           && !intel_syntax)
12588         {
12589           if (sizeflag & DFLAG)
12590             all_prefixes[last_data_prefix] = DATA32_PREFIX;
12591           else
12592             all_prefixes[last_data_prefix] = DATA16_PREFIX;
12593           default_prefixes |= PREFIX_DATA;
12594         }
12595       else if (rex & REX_W)
12596         {
12597           /* REX_W will override PREFIX_DATA.  */
12598           default_prefixes |= PREFIX_DATA;
12599         }
12600     }
12601
12602   if (need_modrm)
12603     {
12604       FETCH_DATA (info, codep + 1);
12605       modrm.mod = (*codep >> 6) & 3;
12606       modrm.reg = (*codep >> 3) & 7;
12607       modrm.rm = *codep & 7;
12608     }
12609
12610   need_vex = 0;
12611   need_vex_reg = 0;
12612   vex_w_done = 0;
12613   vex.evex = 0;
12614
12615   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12616     {
12617       get_sib (info, sizeflag);
12618       dofloat (sizeflag);
12619     }
12620   else
12621     {
12622       dp = get_valid_dis386 (dp, info);
12623       if (dp != NULL && putop (dp->name, sizeflag) == 0)
12624         {
12625           get_sib (info, sizeflag);
12626           for (i = 0; i < MAX_OPERANDS; ++i)
12627             {
12628               obufp = op_out[i];
12629               op_ad = MAX_OPERANDS - 1 - i;
12630               if (dp->op[i].rtn)
12631                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12632               /* For EVEX instruction after the last operand masking
12633                  should be printed.  */
12634               if (i == 0 && vex.evex)
12635                 {
12636                   /* Don't print {%k0}.  */
12637                   if (vex.mask_register_specifier)
12638                     {
12639                       oappend ("{");
12640                       oappend (names_mask[vex.mask_register_specifier]);
12641                       oappend ("}");
12642                     }
12643                   if (vex.zeroing)
12644                     oappend ("{z}");
12645                 }
12646             }
12647         }
12648     }
12649
12650   /* See if any prefixes were not used.  If so, print the first one
12651      separately.  If we don't do this, we'll wind up printing an
12652      instruction stream which does not precisely correspond to the
12653      bytes we are disassembling.  */
12654   if ((prefixes & ~(used_prefixes | default_prefixes)) != 0)
12655     {
12656       for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12657         if (all_prefixes[i])
12658           {
12659             const char *name;
12660             name = prefix_name (all_prefixes[i], priv.orig_sizeflag);
12661             if (name == NULL)
12662               name = INTERNAL_DISASSEMBLER_ERROR;
12663             (*info->fprintf_func) (info->stream, "%s", name);
12664             return 1;
12665           }
12666     }
12667
12668   /* Check if the REX prefix is used.  */
12669   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12670     all_prefixes[last_rex_prefix] = 0;
12671
12672   /* Check if the SEG prefix is used.  */
12673   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12674                    | PREFIX_FS | PREFIX_GS)) != 0
12675       && (used_prefixes
12676           & seg_prefix (all_prefixes[last_seg_prefix])) != 0)
12677     all_prefixes[last_seg_prefix] = 0;
12678
12679   /* Check if the ADDR prefix is used.  */
12680   if ((prefixes & PREFIX_ADDR) != 0
12681       && (used_prefixes & PREFIX_ADDR) != 0)
12682     all_prefixes[last_addr_prefix] = 0;
12683
12684   /* Check if the DATA prefix is used.  */
12685   if ((prefixes & PREFIX_DATA) != 0
12686       && (used_prefixes & PREFIX_DATA) != 0)
12687     all_prefixes[last_data_prefix] = 0;
12688
12689   prefix_length = 0;
12690   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12691     if (all_prefixes[i])
12692       {
12693         const char *name;
12694         name = prefix_name (all_prefixes[i], sizeflag);
12695         if (name == NULL)
12696           abort ();
12697         prefix_length += strlen (name) + 1;
12698         (*info->fprintf_func) (info->stream, "%s ", name);
12699       }
12700
12701   /* Check maximum code length.  */
12702   if ((codep - start_codep) > MAX_CODE_LENGTH)
12703     {
12704       (*info->fprintf_func) (info->stream, "(bad)");
12705       return MAX_CODE_LENGTH;
12706     }
12707
12708   obufp = mnemonicendp;
12709   for (i = strlen (obuf) + prefix_length; i < 6; i++)
12710     oappend (" ");
12711   oappend (" ");
12712   (*info->fprintf_func) (info->stream, "%s", obuf);
12713
12714   /* The enter and bound instructions are printed with operands in the same
12715      order as the intel book; everything else is printed in reverse order.  */
12716   if (intel_syntax || two_source_ops)
12717     {
12718       bfd_vma riprel;
12719
12720       for (i = 0; i < MAX_OPERANDS; ++i)
12721         op_txt[i] = op_out[i];
12722
12723       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12724         {
12725           op_ad = op_index[i];
12726           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12727           op_index[MAX_OPERANDS - 1 - i] = op_ad;
12728           riprel = op_riprel[i];
12729           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12730           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12731         }
12732     }
12733   else
12734     {
12735       for (i = 0; i < MAX_OPERANDS; ++i)
12736         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12737     }
12738
12739   needcomma = 0;
12740   for (i = 0; i < MAX_OPERANDS; ++i)
12741     if (*op_txt[i])
12742       {
12743         if (needcomma)
12744           (*info->fprintf_func) (info->stream, ",");
12745         if (op_index[i] != -1 && !op_riprel[i])
12746           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12747         else
12748           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12749         needcomma = 1;
12750       }
12751
12752   for (i = 0; i < MAX_OPERANDS; i++)
12753     if (op_index[i] != -1 && op_riprel[i])
12754       {
12755         (*info->fprintf_func) (info->stream, "        # ");
12756         (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
12757                                                 + op_address[op_index[i]]), info);
12758         break;
12759       }
12760   return codep - priv.the_buffer;
12761 }
12762
12763 static const char *float_mem[] = {
12764   /* d8 */
12765   "fadd{s|}",
12766   "fmul{s|}",
12767   "fcom{s|}",
12768   "fcomp{s|}",
12769   "fsub{s|}",
12770   "fsubr{s|}",
12771   "fdiv{s|}",
12772   "fdivr{s|}",
12773   /* d9 */
12774   "fld{s|}",
12775   "(bad)",
12776   "fst{s|}",
12777   "fstp{s|}",
12778   "fldenvIC",
12779   "fldcw",
12780   "fNstenvIC",
12781   "fNstcw",
12782   /* da */
12783   "fiadd{l|}",
12784   "fimul{l|}",
12785   "ficom{l|}",
12786   "ficomp{l|}",
12787   "fisub{l|}",
12788   "fisubr{l|}",
12789   "fidiv{l|}",
12790   "fidivr{l|}",
12791   /* db */
12792   "fild{l|}",
12793   "fisttp{l|}",
12794   "fist{l|}",
12795   "fistp{l|}",
12796   "(bad)",
12797   "fld{t||t|}",
12798   "(bad)",
12799   "fstp{t||t|}",
12800   /* dc */
12801   "fadd{l|}",
12802   "fmul{l|}",
12803   "fcom{l|}",
12804   "fcomp{l|}",
12805   "fsub{l|}",
12806   "fsubr{l|}",
12807   "fdiv{l|}",
12808   "fdivr{l|}",
12809   /* dd */
12810   "fld{l|}",
12811   "fisttp{ll|}",
12812   "fst{l||}",
12813   "fstp{l|}",
12814   "frstorIC",
12815   "(bad)",
12816   "fNsaveIC",
12817   "fNstsw",
12818   /* de */
12819   "fiadd",
12820   "fimul",
12821   "ficom",
12822   "ficomp",
12823   "fisub",
12824   "fisubr",
12825   "fidiv",
12826   "fidivr",
12827   /* df */
12828   "fild",
12829   "fisttp",
12830   "fist",
12831   "fistp",
12832   "fbld",
12833   "fild{ll|}",
12834   "fbstp",
12835   "fistp{ll|}",
12836 };
12837
12838 static const unsigned char float_mem_mode[] = {
12839   /* d8 */
12840   d_mode,
12841   d_mode,
12842   d_mode,
12843   d_mode,
12844   d_mode,
12845   d_mode,
12846   d_mode,
12847   d_mode,
12848   /* d9 */
12849   d_mode,
12850   0,
12851   d_mode,
12852   d_mode,
12853   0,
12854   w_mode,
12855   0,
12856   w_mode,
12857   /* da */
12858   d_mode,
12859   d_mode,
12860   d_mode,
12861   d_mode,
12862   d_mode,
12863   d_mode,
12864   d_mode,
12865   d_mode,
12866   /* db */
12867   d_mode,
12868   d_mode,
12869   d_mode,
12870   d_mode,
12871   0,
12872   t_mode,
12873   0,
12874   t_mode,
12875   /* dc */
12876   q_mode,
12877   q_mode,
12878   q_mode,
12879   q_mode,
12880   q_mode,
12881   q_mode,
12882   q_mode,
12883   q_mode,
12884   /* dd */
12885   q_mode,
12886   q_mode,
12887   q_mode,
12888   q_mode,
12889   0,
12890   0,
12891   0,
12892   w_mode,
12893   /* de */
12894   w_mode,
12895   w_mode,
12896   w_mode,
12897   w_mode,
12898   w_mode,
12899   w_mode,
12900   w_mode,
12901   w_mode,
12902   /* df */
12903   w_mode,
12904   w_mode,
12905   w_mode,
12906   w_mode,
12907   t_mode,
12908   q_mode,
12909   t_mode,
12910   q_mode
12911 };
12912
12913 #define ST { OP_ST, 0 }
12914 #define STi { OP_STi, 0 }
12915
12916 #define FGRPd9_2 NULL, { { NULL, 0 } }
12917 #define FGRPd9_4 NULL, { { NULL, 1 } }
12918 #define FGRPd9_5 NULL, { { NULL, 2 } }
12919 #define FGRPd9_6 NULL, { { NULL, 3 } }
12920 #define FGRPd9_7 NULL, { { NULL, 4 } }
12921 #define FGRPda_5 NULL, { { NULL, 5 } }
12922 #define FGRPdb_4 NULL, { { NULL, 6 } }
12923 #define FGRPde_3 NULL, { { NULL, 7 } }
12924 #define FGRPdf_4 NULL, { { NULL, 8 } }
12925
12926 static const struct dis386 float_reg[][8] = {
12927   /* d8 */
12928   {
12929     { "fadd",   { ST, STi } },
12930     { "fmul",   { ST, STi } },
12931     { "fcom",   { STi } },
12932     { "fcomp",  { STi } },
12933     { "fsub",   { ST, STi } },
12934     { "fsubr",  { ST, STi } },
12935     { "fdiv",   { ST, STi } },
12936     { "fdivr",  { ST, STi } },
12937   },
12938   /* d9 */
12939   {
12940     { "fld",    { STi } },
12941     { "fxch",   { STi } },
12942     { FGRPd9_2 },
12943     { Bad_Opcode },
12944     { FGRPd9_4 },
12945     { FGRPd9_5 },
12946     { FGRPd9_6 },
12947     { FGRPd9_7 },
12948   },
12949   /* da */
12950   {
12951     { "fcmovb", { ST, STi } },
12952     { "fcmove", { ST, STi } },
12953     { "fcmovbe",{ ST, STi } },
12954     { "fcmovu", { ST, STi } },
12955     { Bad_Opcode },
12956     { FGRPda_5 },
12957     { Bad_Opcode },
12958     { Bad_Opcode },
12959   },
12960   /* db */
12961   {
12962     { "fcmovnb",{ ST, STi } },
12963     { "fcmovne",{ ST, STi } },
12964     { "fcmovnbe",{ ST, STi } },
12965     { "fcmovnu",{ ST, STi } },
12966     { FGRPdb_4 },
12967     { "fucomi", { ST, STi } },
12968     { "fcomi",  { ST, STi } },
12969     { Bad_Opcode },
12970   },
12971   /* dc */
12972   {
12973     { "fadd",   { STi, ST } },
12974     { "fmul",   { STi, ST } },
12975     { Bad_Opcode },
12976     { Bad_Opcode },
12977     { "fsub!M", { STi, ST } },
12978     { "fsubM",  { STi, ST } },
12979     { "fdiv!M", { STi, ST } },
12980     { "fdivM",  { STi, ST } },
12981   },
12982   /* dd */
12983   {
12984     { "ffree",  { STi } },
12985     { Bad_Opcode },
12986     { "fst",    { STi } },
12987     { "fstp",   { STi } },
12988     { "fucom",  { STi } },
12989     { "fucomp", { STi } },
12990     { Bad_Opcode },
12991     { Bad_Opcode },
12992   },
12993   /* de */
12994   {
12995     { "faddp",  { STi, ST } },
12996     { "fmulp",  { STi, ST } },
12997     { Bad_Opcode },
12998     { FGRPde_3 },
12999     { "fsub!Mp", { STi, ST } },
13000     { "fsubMp", { STi, ST } },
13001     { "fdiv!Mp", { STi, ST } },
13002     { "fdivMp", { STi, ST } },
13003   },
13004   /* df */
13005   {
13006     { "ffreep", { STi } },
13007     { Bad_Opcode },
13008     { Bad_Opcode },
13009     { Bad_Opcode },
13010     { FGRPdf_4 },
13011     { "fucomip", { ST, STi } },
13012     { "fcomip", { ST, STi } },
13013     { Bad_Opcode },
13014   },
13015 };
13016
13017 static char *fgrps[][8] = {
13018   /* d9_2  0 */
13019   {
13020     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13021   },
13022
13023   /* d9_4  1 */
13024   {
13025     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
13026   },
13027
13028   /* d9_5  2 */
13029   {
13030     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
13031   },
13032
13033   /* d9_6  3 */
13034   {
13035     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
13036   },
13037
13038   /* d9_7  4 */
13039   {
13040     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
13041   },
13042
13043   /* da_5  5 */
13044   {
13045     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13046   },
13047
13048   /* db_4  6 */
13049   {
13050     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
13051     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
13052   },
13053
13054   /* de_3  7 */
13055   {
13056     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13057   },
13058
13059   /* df_4  8 */
13060   {
13061     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
13062   },
13063 };
13064
13065 static void
13066 swap_operand (void)
13067 {
13068   mnemonicendp[0] = '.';
13069   mnemonicendp[1] = 's';
13070   mnemonicendp += 2;
13071 }
13072
13073 static void
13074 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
13075                int sizeflag ATTRIBUTE_UNUSED)
13076 {
13077   /* Skip mod/rm byte.  */
13078   MODRM_CHECK;
13079   codep++;
13080 }
13081
13082 static void
13083 dofloat (int sizeflag)
13084 {
13085   const struct dis386 *dp;
13086   unsigned char floatop;
13087
13088   floatop = codep[-1];
13089
13090   if (modrm.mod != 3)
13091     {
13092       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
13093
13094       putop (float_mem[fp_indx], sizeflag);
13095       obufp = op_out[0];
13096       op_ad = 2;
13097       OP_E (float_mem_mode[fp_indx], sizeflag);
13098       return;
13099     }
13100   /* Skip mod/rm byte.  */
13101   MODRM_CHECK;
13102   codep++;
13103
13104   dp = &float_reg[floatop - 0xd8][modrm.reg];
13105   if (dp->name == NULL)
13106     {
13107       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
13108
13109       /* Instruction fnstsw is only one with strange arg.  */
13110       if (floatop == 0xdf && codep[-1] == 0xe0)
13111         strcpy (op_out[0], names16[0]);
13112     }
13113   else
13114     {
13115       putop (dp->name, sizeflag);
13116
13117       obufp = op_out[0];
13118       op_ad = 2;
13119       if (dp->op[0].rtn)
13120         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
13121
13122       obufp = op_out[1];
13123       op_ad = 1;
13124       if (dp->op[1].rtn)
13125         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
13126     }
13127 }
13128
13129 /* Like oappend (below), but S is a string starting with '%'.
13130    In Intel syntax, the '%' is elided.  */
13131 static void
13132 oappend_maybe_intel (const char *s)
13133 {
13134   oappend (s + intel_syntax);
13135 }
13136
13137 static void
13138 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13139 {
13140   oappend_maybe_intel ("%st");
13141 }
13142
13143 static void
13144 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13145 {
13146   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
13147   oappend_maybe_intel (scratchbuf);
13148 }
13149
13150 /* Capital letters in template are macros.  */
13151 static int
13152 putop (const char *in_template, int sizeflag)
13153 {
13154   const char *p;
13155   int alt = 0;
13156   int cond = 1;
13157   unsigned int l = 0, len = 1;
13158   char last[4];
13159
13160 #define SAVE_LAST(c)                    \
13161   if (l < len && l < sizeof (last))     \
13162     last[l++] = c;                      \
13163   else                                  \
13164     abort ();
13165
13166   for (p = in_template; *p; p++)
13167     {
13168       switch (*p)
13169         {
13170         default:
13171           *obufp++ = *p;
13172           break;
13173         case '%':
13174           len++;
13175           break;
13176         case '!':
13177           cond = 0;
13178           break;
13179         case '{':
13180           alt = 0;
13181           if (intel_syntax)
13182             {
13183               while (*++p != '|')
13184                 if (*p == '}' || *p == '\0')
13185                   abort ();
13186             }
13187           /* Fall through.  */
13188         case 'I':
13189           alt = 1;
13190           continue;
13191         case '|':
13192           while (*++p != '}')
13193             {
13194               if (*p == '\0')
13195                 abort ();
13196             }
13197           break;
13198         case '}':
13199           break;
13200         case 'A':
13201           if (intel_syntax)
13202             break;
13203           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13204             *obufp++ = 'b';
13205           break;
13206         case 'B':
13207           if (l == 0 && len == 1)
13208             {
13209 case_B:
13210               if (intel_syntax)
13211                 break;
13212               if (sizeflag & SUFFIX_ALWAYS)
13213                 *obufp++ = 'b';
13214             }
13215           else
13216             {
13217               if (l != 1
13218                   || len != 2
13219                   || last[0] != 'L')
13220                 {
13221                   SAVE_LAST (*p);
13222                   break;
13223                 }
13224
13225               if (address_mode == mode_64bit
13226                   && !(prefixes & PREFIX_ADDR))
13227                 {
13228                   *obufp++ = 'a';
13229                   *obufp++ = 'b';
13230                   *obufp++ = 's';
13231                 }
13232
13233               goto case_B;
13234             }
13235           break;
13236         case 'C':
13237           if (intel_syntax && !alt)
13238             break;
13239           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13240             {
13241               if (sizeflag & DFLAG)
13242                 *obufp++ = intel_syntax ? 'd' : 'l';
13243               else
13244                 *obufp++ = intel_syntax ? 'w' : 's';
13245               used_prefixes |= (prefixes & PREFIX_DATA);
13246             }
13247           break;
13248         case 'D':
13249           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13250             break;
13251           USED_REX (REX_W);
13252           if (modrm.mod == 3)
13253             {
13254               if (rex & REX_W)
13255                 *obufp++ = 'q';
13256               else
13257                 {
13258                   if (sizeflag & DFLAG)
13259                     *obufp++ = intel_syntax ? 'd' : 'l';
13260                   else
13261                     *obufp++ = 'w';
13262                   used_prefixes |= (prefixes & PREFIX_DATA);
13263                 }
13264             }
13265           else
13266             *obufp++ = 'w';
13267           break;
13268         case 'E':               /* For jcxz/jecxz */
13269           if (address_mode == mode_64bit)
13270             {
13271               if (sizeflag & AFLAG)
13272                 *obufp++ = 'r';
13273               else
13274                 *obufp++ = 'e';
13275             }
13276           else
13277             if (sizeflag & AFLAG)
13278               *obufp++ = 'e';
13279           used_prefixes |= (prefixes & PREFIX_ADDR);
13280           break;
13281         case 'F':
13282           if (intel_syntax)
13283             break;
13284           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
13285             {
13286               if (sizeflag & AFLAG)
13287                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
13288               else
13289                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
13290               used_prefixes |= (prefixes & PREFIX_ADDR);
13291             }
13292           break;
13293         case 'G':
13294           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
13295             break;
13296           if ((rex & REX_W) || (sizeflag & DFLAG))
13297             *obufp++ = 'l';
13298           else
13299             *obufp++ = 'w';
13300           if (!(rex & REX_W))
13301             used_prefixes |= (prefixes & PREFIX_DATA);
13302           break;
13303         case 'H':
13304           if (intel_syntax)
13305             break;
13306           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
13307               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
13308             {
13309               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
13310               *obufp++ = ',';
13311               *obufp++ = 'p';
13312               if (prefixes & PREFIX_DS)
13313                 *obufp++ = 't';
13314               else
13315                 *obufp++ = 'n';
13316             }
13317           break;
13318         case 'J':
13319           if (intel_syntax)
13320             break;
13321           *obufp++ = 'l';
13322           break;
13323         case 'K':
13324           USED_REX (REX_W);
13325           if (rex & REX_W)
13326             *obufp++ = 'q';
13327           else
13328             *obufp++ = 'd';
13329           break;
13330         case 'Z':
13331           if (intel_syntax)
13332             break;
13333           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
13334             {
13335               *obufp++ = 'q';
13336               break;
13337             }
13338           /* Fall through.  */
13339           goto case_L;
13340         case 'L':
13341           if (l != 0 || len != 1)
13342             {
13343               SAVE_LAST (*p);
13344               break;
13345             }
13346 case_L:
13347           if (intel_syntax)
13348             break;
13349           if (sizeflag & SUFFIX_ALWAYS)
13350             *obufp++ = 'l';
13351           break;
13352         case 'M':
13353           if (intel_mnemonic != cond)
13354             *obufp++ = 'r';
13355           break;
13356         case 'N':
13357           if ((prefixes & PREFIX_FWAIT) == 0)
13358             *obufp++ = 'n';
13359           else
13360             used_prefixes |= PREFIX_FWAIT;
13361           break;
13362         case 'O':
13363           USED_REX (REX_W);
13364           if (rex & REX_W)
13365             *obufp++ = 'o';
13366           else if (intel_syntax && (sizeflag & DFLAG))
13367             *obufp++ = 'q';
13368           else
13369             *obufp++ = 'd';
13370           if (!(rex & REX_W))
13371             used_prefixes |= (prefixes & PREFIX_DATA);
13372           break;
13373         case 'T':
13374           if (!intel_syntax
13375               && address_mode == mode_64bit
13376               && ((sizeflag & DFLAG) || (rex & REX_W)))
13377             {
13378               *obufp++ = 'q';
13379               break;
13380             }
13381           /* Fall through.  */
13382         case 'P':
13383           if (intel_syntax)
13384             {
13385               if ((rex & REX_W) == 0
13386                   && (prefixes & PREFIX_DATA))
13387                 {
13388                   if ((sizeflag & DFLAG) == 0)
13389                     *obufp++ = 'w';
13390                    used_prefixes |= (prefixes & PREFIX_DATA);
13391                 }
13392               break;
13393             }
13394           if ((prefixes & PREFIX_DATA)
13395               || (rex & REX_W)
13396               || (sizeflag & SUFFIX_ALWAYS))
13397             {
13398               USED_REX (REX_W);
13399               if (rex & REX_W)
13400                 *obufp++ = 'q';
13401               else
13402                 {
13403                    if (sizeflag & DFLAG)
13404                       *obufp++ = 'l';
13405                    else
13406                      *obufp++ = 'w';
13407                    used_prefixes |= (prefixes & PREFIX_DATA);
13408                 }
13409             }
13410           break;
13411         case 'U':
13412           if (intel_syntax)
13413             break;
13414           if (address_mode == mode_64bit
13415               && ((sizeflag & DFLAG) || (rex & REX_W)))
13416             {
13417               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13418                 *obufp++ = 'q';
13419               break;
13420             }
13421           /* Fall through.  */
13422           goto case_Q;
13423         case 'Q':
13424           if (l == 0 && len == 1)
13425             {
13426 case_Q:
13427               if (intel_syntax && !alt)
13428                 break;
13429               USED_REX (REX_W);
13430               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13431                 {
13432                   if (rex & REX_W)
13433                     *obufp++ = 'q';
13434                   else
13435                     {
13436                       if (sizeflag & DFLAG)
13437                         *obufp++ = intel_syntax ? 'd' : 'l';
13438                       else
13439                         *obufp++ = 'w';
13440                       used_prefixes |= (prefixes & PREFIX_DATA);
13441                     }
13442                 }
13443             }
13444           else
13445             {
13446               if (l != 1 || len != 2 || last[0] != 'L')
13447                 {
13448                   SAVE_LAST (*p);
13449                   break;
13450                 }
13451               if (intel_syntax
13452                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13453                 break;
13454               if ((rex & REX_W))
13455                 {
13456                   USED_REX (REX_W);
13457                   *obufp++ = 'q';
13458                 }
13459               else
13460                 *obufp++ = 'l';
13461             }
13462           break;
13463         case 'R':
13464           USED_REX (REX_W);
13465           if (rex & REX_W)
13466             *obufp++ = 'q';
13467           else if (sizeflag & DFLAG)
13468             {
13469               if (intel_syntax)
13470                   *obufp++ = 'd';
13471               else
13472                   *obufp++ = 'l';
13473             }
13474           else
13475             *obufp++ = 'w';
13476           if (intel_syntax && !p[1]
13477               && ((rex & REX_W) || (sizeflag & DFLAG)))
13478             *obufp++ = 'e';
13479           if (!(rex & REX_W))
13480             used_prefixes |= (prefixes & PREFIX_DATA);
13481           break;
13482         case 'V':
13483           if (l == 0 && len == 1)
13484             {
13485               if (intel_syntax)
13486                 break;
13487               if (address_mode == mode_64bit
13488                   && ((sizeflag & DFLAG) || (rex & REX_W)))
13489                 {
13490                   if (sizeflag & SUFFIX_ALWAYS)
13491                     *obufp++ = 'q';
13492                   break;
13493                 }
13494             }
13495           else
13496             {
13497               if (l != 1
13498                   || len != 2
13499                   || last[0] != 'L')
13500                 {
13501                   SAVE_LAST (*p);
13502                   break;
13503                 }
13504
13505               if (rex & REX_W)
13506                 {
13507                   *obufp++ = 'a';
13508                   *obufp++ = 'b';
13509                   *obufp++ = 's';
13510                 }
13511             }
13512           /* Fall through.  */
13513           goto case_S;
13514         case 'S':
13515           if (l == 0 && len == 1)
13516             {
13517 case_S:
13518               if (intel_syntax)
13519                 break;
13520               if (sizeflag & SUFFIX_ALWAYS)
13521                 {
13522                   if (rex & REX_W)
13523                     *obufp++ = 'q';
13524                   else
13525                     {
13526                       if (sizeflag & DFLAG)
13527                         *obufp++ = 'l';
13528                       else
13529                         *obufp++ = 'w';
13530                       used_prefixes |= (prefixes & PREFIX_DATA);
13531                     }
13532                 }
13533             }
13534           else
13535             {
13536               if (l != 1
13537                   || len != 2
13538                   || last[0] != 'L')
13539                 {
13540                   SAVE_LAST (*p);
13541                   break;
13542                 }
13543
13544               if (address_mode == mode_64bit
13545                   && !(prefixes & PREFIX_ADDR))
13546                 {
13547                   *obufp++ = 'a';
13548                   *obufp++ = 'b';
13549                   *obufp++ = 's';
13550                 }
13551
13552               goto case_S;
13553             }
13554           break;
13555         case 'X':
13556           if (l != 0 || len != 1)
13557             {
13558               SAVE_LAST (*p);
13559               break;
13560             }
13561           if (need_vex && vex.prefix)
13562             {
13563               if (vex.prefix == DATA_PREFIX_OPCODE)
13564                 *obufp++ = 'd';
13565               else
13566                 *obufp++ = 's';
13567             }
13568           else
13569             {
13570               if (prefixes & PREFIX_DATA)
13571                 *obufp++ = 'd';
13572               else
13573                 *obufp++ = 's';
13574               used_prefixes |= (prefixes & PREFIX_DATA);
13575             }
13576           break;
13577         case 'Y':
13578           if (l == 0 && len == 1)
13579             {
13580               if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
13581                 break;
13582               if (rex & REX_W)
13583                 {
13584                   USED_REX (REX_W);
13585                   *obufp++ = 'q';
13586                 }
13587               break;
13588             }
13589           else
13590             {
13591               if (l != 1 || len != 2 || last[0] != 'X')
13592                 {
13593                   SAVE_LAST (*p);
13594                   break;
13595                 }
13596               if (!need_vex)
13597                 abort ();
13598               if (intel_syntax
13599                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13600                 break;
13601               switch (vex.length)
13602                 {
13603                 case 128:
13604                   *obufp++ = 'x';
13605                   break;
13606                 case 256:
13607                   *obufp++ = 'y';
13608                   break;
13609                 default:
13610                   abort ();
13611                 }
13612             }
13613           break;
13614         case 'W':
13615           if (l == 0 && len == 1)
13616             {
13617               /* operand size flag for cwtl, cbtw */
13618               USED_REX (REX_W);
13619               if (rex & REX_W)
13620                 {
13621                   if (intel_syntax)
13622                     *obufp++ = 'd';
13623                   else
13624                     *obufp++ = 'l';
13625                 }
13626               else if (sizeflag & DFLAG)
13627                 *obufp++ = 'w';
13628               else
13629                 *obufp++ = 'b';
13630               if (!(rex & REX_W))
13631                 used_prefixes |= (prefixes & PREFIX_DATA);
13632             }
13633           else
13634             {
13635               if (l != 1
13636                   || len != 2
13637                   || (last[0] != 'X'
13638                       && last[0] != 'L'))
13639                 {
13640                   SAVE_LAST (*p);
13641                   break;
13642                 }
13643               if (!need_vex)
13644                 abort ();
13645               if (last[0] == 'X')
13646                 *obufp++ = vex.w ? 'd': 's';
13647               else
13648                 *obufp++ = vex.w ? 'q': 'd';
13649             }
13650           break;
13651         }
13652       alt = 0;
13653     }
13654   *obufp = 0;
13655   mnemonicendp = obufp;
13656   return 0;
13657 }
13658
13659 static void
13660 oappend (const char *s)
13661 {
13662   obufp = stpcpy (obufp, s);
13663 }
13664
13665 static void
13666 append_seg (void)
13667 {
13668   if (prefixes & PREFIX_CS)
13669     {
13670       used_prefixes |= PREFIX_CS;
13671       oappend_maybe_intel ("%cs:");
13672     }
13673   if (prefixes & PREFIX_DS)
13674     {
13675       used_prefixes |= PREFIX_DS;
13676       oappend_maybe_intel ("%ds:");
13677     }
13678   if (prefixes & PREFIX_SS)
13679     {
13680       used_prefixes |= PREFIX_SS;
13681       oappend_maybe_intel ("%ss:");
13682     }
13683   if (prefixes & PREFIX_ES)
13684     {
13685       used_prefixes |= PREFIX_ES;
13686       oappend_maybe_intel ("%es:");
13687     }
13688   if (prefixes & PREFIX_FS)
13689     {
13690       used_prefixes |= PREFIX_FS;
13691       oappend_maybe_intel ("%fs:");
13692     }
13693   if (prefixes & PREFIX_GS)
13694     {
13695       used_prefixes |= PREFIX_GS;
13696       oappend_maybe_intel ("%gs:");
13697     }
13698 }
13699
13700 static void
13701 OP_indirE (int bytemode, int sizeflag)
13702 {
13703   if (!intel_syntax)
13704     oappend ("*");
13705   OP_E (bytemode, sizeflag);
13706 }
13707
13708 static void
13709 print_operand_value (char *buf, int hex, bfd_vma disp)
13710 {
13711   if (address_mode == mode_64bit)
13712     {
13713       if (hex)
13714         {
13715           char tmp[30];
13716           int i;
13717           buf[0] = '0';
13718           buf[1] = 'x';
13719           sprintf_vma (tmp, disp);
13720           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13721           strcpy (buf + 2, tmp + i);
13722         }
13723       else
13724         {
13725           bfd_signed_vma v = disp;
13726           char tmp[30];
13727           int i;
13728           if (v < 0)
13729             {
13730               *(buf++) = '-';
13731               v = -disp;
13732               /* Check for possible overflow on 0x8000000000000000.  */
13733               if (v < 0)
13734                 {
13735                   strcpy (buf, "9223372036854775808");
13736                   return;
13737                 }
13738             }
13739           if (!v)
13740             {
13741               strcpy (buf, "0");
13742               return;
13743             }
13744
13745           i = 0;
13746           tmp[29] = 0;
13747           while (v)
13748             {
13749               tmp[28 - i] = (v % 10) + '0';
13750               v /= 10;
13751               i++;
13752             }
13753           strcpy (buf, tmp + 29 - i);
13754         }
13755     }
13756   else
13757     {
13758       if (hex)
13759         sprintf (buf, "0x%x", (unsigned int) disp);
13760       else
13761         sprintf (buf, "%d", (int) disp);
13762     }
13763 }
13764
13765 /* Put DISP in BUF as signed hex number.  */
13766
13767 static void
13768 print_displacement (char *buf, bfd_vma disp)
13769 {
13770   bfd_signed_vma val = disp;
13771   char tmp[30];
13772   int i, j = 0;
13773
13774   if (val < 0)
13775     {
13776       buf[j++] = '-';
13777       val = -disp;
13778
13779       /* Check for possible overflow.  */
13780       if (val < 0)
13781         {
13782           switch (address_mode)
13783             {
13784             case mode_64bit:
13785               strcpy (buf + j, "0x8000000000000000");
13786               break;
13787             case mode_32bit:
13788               strcpy (buf + j, "0x80000000");
13789               break;
13790             case mode_16bit:
13791               strcpy (buf + j, "0x8000");
13792               break;
13793             }
13794           return;
13795         }
13796     }
13797
13798   buf[j++] = '0';
13799   buf[j++] = 'x';
13800
13801   sprintf_vma (tmp, (bfd_vma) val);
13802   for (i = 0; tmp[i] == '0'; i++)
13803     continue;
13804   if (tmp[i] == '\0')
13805     i--;
13806   strcpy (buf + j, tmp + i);
13807 }
13808
13809 static void
13810 intel_operand_size (int bytemode, int sizeflag)
13811 {
13812   if (vex.evex
13813       && vex.b
13814       && (bytemode == x_mode
13815           || bytemode == evex_half_bcst_xmmq_mode))
13816     {
13817       if (vex.w)
13818         oappend ("QWORD PTR ");
13819       else
13820         oappend ("DWORD PTR ");
13821       return;
13822     }
13823   switch (bytemode)
13824     {
13825     case b_mode:
13826     case b_swap_mode:
13827     case dqb_mode:
13828       oappend ("BYTE PTR ");
13829       break;
13830     case w_mode:
13831     case dqw_mode:
13832       oappend ("WORD PTR ");
13833       break;
13834     case stack_v_mode:
13835       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13836         {
13837           oappend ("QWORD PTR ");
13838           break;
13839         }
13840       /* FALLTHRU */
13841     case v_mode:
13842     case v_swap_mode:
13843     case dq_mode:
13844       USED_REX (REX_W);
13845       if (rex & REX_W)
13846         oappend ("QWORD PTR ");
13847       else
13848         {
13849           if ((sizeflag & DFLAG) || bytemode == dq_mode)
13850             oappend ("DWORD PTR ");
13851           else
13852             oappend ("WORD PTR ");
13853           used_prefixes |= (prefixes & PREFIX_DATA);
13854         }
13855       break;
13856     case z_mode:
13857       if ((rex & REX_W) || (sizeflag & DFLAG))
13858         *obufp++ = 'D';
13859       oappend ("WORD PTR ");
13860       if (!(rex & REX_W))
13861         used_prefixes |= (prefixes & PREFIX_DATA);
13862       break;
13863     case a_mode:
13864       if (sizeflag & DFLAG)
13865         oappend ("QWORD PTR ");
13866       else
13867         oappend ("DWORD PTR ");
13868       used_prefixes |= (prefixes & PREFIX_DATA);
13869       break;
13870     case d_mode:
13871     case d_scalar_mode:
13872     case d_scalar_swap_mode:
13873     case d_swap_mode:
13874     case dqd_mode:
13875       oappend ("DWORD PTR ");
13876       break;
13877     case q_mode:
13878     case q_scalar_mode:
13879     case q_scalar_swap_mode:
13880     case q_swap_mode:
13881       oappend ("QWORD PTR ");
13882       break;
13883     case m_mode:
13884       if (address_mode == mode_64bit)
13885         oappend ("QWORD PTR ");
13886       else
13887         oappend ("DWORD PTR ");
13888       break;
13889     case f_mode:
13890       if (sizeflag & DFLAG)
13891         oappend ("FWORD PTR ");
13892       else
13893         oappend ("DWORD PTR ");
13894       used_prefixes |= (prefixes & PREFIX_DATA);
13895       break;
13896     case t_mode:
13897       oappend ("TBYTE PTR ");
13898       break;
13899     case x_mode:
13900     case x_swap_mode:
13901     case evex_x_gscat_mode:
13902     case evex_x_nobcst_mode:
13903       if (need_vex)
13904         {
13905           switch (vex.length)
13906             {
13907             case 128:
13908               oappend ("XMMWORD PTR ");
13909               break;
13910             case 256:
13911               oappend ("YMMWORD PTR ");
13912               break;
13913             case 512:
13914               oappend ("ZMMWORD PTR ");
13915               break;
13916             default:
13917               abort ();
13918             }
13919         }
13920       else
13921         oappend ("XMMWORD PTR ");
13922       break;
13923     case xmm_mode:
13924       oappend ("XMMWORD PTR ");
13925       break;
13926     case ymm_mode:
13927       oappend ("YMMWORD PTR ");
13928       break;
13929     case xmmq_mode:
13930     case evex_half_bcst_xmmq_mode:
13931       if (!need_vex)
13932         abort ();
13933
13934       switch (vex.length)
13935         {
13936         case 128:
13937           oappend ("QWORD PTR ");
13938           break;
13939         case 256:
13940           oappend ("XMMWORD PTR ");
13941           break;
13942         case 512:
13943           oappend ("YMMWORD PTR ");
13944           break;
13945         default:
13946           abort ();
13947         }
13948       break;
13949     case xmm_mb_mode:
13950       if (!need_vex)
13951         abort ();
13952
13953       switch (vex.length)
13954         {
13955         case 128:
13956         case 256:
13957         case 512:
13958           oappend ("BYTE PTR ");
13959           break;
13960         default:
13961           abort ();
13962         }
13963       break;
13964     case xmm_mw_mode:
13965       if (!need_vex)
13966         abort ();
13967
13968       switch (vex.length)
13969         {
13970         case 128:
13971         case 256:
13972         case 512:
13973           oappend ("WORD PTR ");
13974           break;
13975         default:
13976           abort ();
13977         }
13978       break;
13979     case xmm_md_mode:
13980       if (!need_vex)
13981         abort ();
13982
13983       switch (vex.length)
13984         {
13985         case 128:
13986         case 256:
13987         case 512:
13988           oappend ("DWORD PTR ");
13989           break;
13990         default:
13991           abort ();
13992         }
13993       break;
13994     case xmm_mq_mode:
13995       if (!need_vex)
13996         abort ();
13997
13998       switch (vex.length)
13999         {
14000         case 128:
14001         case 256:
14002         case 512:
14003           oappend ("QWORD PTR ");
14004           break;
14005         default:
14006           abort ();
14007         }
14008       break;
14009     case xmmdw_mode:
14010       if (!need_vex)
14011         abort ();
14012
14013       switch (vex.length)
14014         {
14015         case 128:
14016           oappend ("WORD PTR ");
14017           break;
14018         case 256:
14019           oappend ("DWORD PTR ");
14020           break;
14021         case 512:
14022           oappend ("QWORD PTR ");
14023           break;
14024         default:
14025           abort ();
14026         }
14027       break;
14028     case xmmqd_mode:
14029       if (!need_vex)
14030         abort ();
14031
14032       switch (vex.length)
14033         {
14034         case 128:
14035           oappend ("DWORD PTR ");
14036           break;
14037         case 256:
14038           oappend ("QWORD PTR ");
14039           break;
14040         case 512:
14041           oappend ("XMMWORD PTR ");
14042           break;
14043         default:
14044           abort ();
14045         }
14046       break;
14047     case ymmq_mode:
14048       if (!need_vex)
14049         abort ();
14050
14051       switch (vex.length)
14052         {
14053         case 128:
14054           oappend ("QWORD PTR ");
14055           break;
14056         case 256:
14057           oappend ("YMMWORD PTR ");
14058           break;
14059         case 512:
14060           oappend ("ZMMWORD PTR ");
14061           break;
14062         default:
14063           abort ();
14064         }
14065       break;
14066     case ymmxmm_mode:
14067       if (!need_vex)
14068         abort ();
14069
14070       switch (vex.length)
14071         {
14072         case 128:
14073         case 256:
14074           oappend ("XMMWORD PTR ");
14075           break;
14076         default:
14077           abort ();
14078         }
14079       break;
14080     case o_mode:
14081       oappend ("OWORD PTR ");
14082       break;
14083     case xmm_mdq_mode:
14084     case vex_w_dq_mode:
14085     case vex_scalar_w_dq_mode:
14086       if (!need_vex)
14087         abort ();
14088
14089       if (vex.w)
14090         oappend ("QWORD PTR ");
14091       else
14092         oappend ("DWORD PTR ");
14093       break;
14094     case vex_vsib_d_w_dq_mode:
14095     case vex_vsib_q_w_dq_mode:
14096       if (!need_vex)
14097         abort ();
14098
14099       if (!vex.evex)
14100         {
14101           if (vex.w)
14102             oappend ("QWORD PTR ");
14103           else
14104             oappend ("DWORD PTR ");
14105         }
14106       else
14107         {
14108           if (vex.length != 512)
14109             abort ();
14110           oappend ("ZMMWORD PTR ");
14111         }
14112       break;
14113     case mask_mode:
14114       if (!need_vex)
14115         abort ();
14116       /* Currently the only instructions, which allows either mask or
14117          memory operand, are AVX512's KMOVW instructions.  They need
14118          Word-sized operand.  */
14119       if (vex.w || vex.length != 128)
14120         abort ();
14121       oappend ("WORD PTR ");
14122       break;
14123     case v_bnd_mode:
14124     default:
14125       break;
14126     }
14127 }
14128
14129 static void
14130 OP_E_register (int bytemode, int sizeflag)
14131 {
14132   int reg = modrm.rm;
14133   const char **names;
14134
14135   USED_REX (REX_B);
14136   if ((rex & REX_B))
14137     reg += 8;
14138
14139   if ((sizeflag & SUFFIX_ALWAYS)
14140       && (bytemode == b_swap_mode || bytemode == v_swap_mode))
14141     swap_operand ();
14142
14143   switch (bytemode)
14144     {
14145     case b_mode:
14146     case b_swap_mode:
14147       USED_REX (0);
14148       if (rex)
14149         names = names8rex;
14150       else
14151         names = names8;
14152       break;
14153     case w_mode:
14154       names = names16;
14155       break;
14156     case d_mode:
14157       names = names32;
14158       break;
14159     case q_mode:
14160       names = names64;
14161       break;
14162     case m_mode:
14163     case v_bnd_mode:
14164       names = address_mode == mode_64bit ? names64 : names32;
14165       break;
14166     case bnd_mode:
14167       names = names_bnd;
14168       break;
14169     case stack_v_mode:
14170       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
14171         {
14172           names = names64;
14173           break;
14174         }
14175       bytemode = v_mode;
14176       /* FALLTHRU */
14177     case v_mode:
14178     case v_swap_mode:
14179     case dq_mode:
14180     case dqb_mode:
14181     case dqd_mode:
14182     case dqw_mode:
14183       USED_REX (REX_W);
14184       if (rex & REX_W)
14185         names = names64;
14186       else
14187         {
14188           if ((sizeflag & DFLAG)
14189               || (bytemode != v_mode
14190                   && bytemode != v_swap_mode))
14191             names = names32;
14192           else
14193             names = names16;
14194           used_prefixes |= (prefixes & PREFIX_DATA);
14195         }
14196       break;
14197     case mask_mode:
14198       names = names_mask;
14199       break;
14200     case 0:
14201       return;
14202     default:
14203       oappend (INTERNAL_DISASSEMBLER_ERROR);
14204       return;
14205     }
14206   oappend (names[reg]);
14207 }
14208
14209 static void
14210 OP_E_memory (int bytemode, int sizeflag)
14211 {
14212   bfd_vma disp = 0;
14213   int add = (rex & REX_B) ? 8 : 0;
14214   int riprel = 0;
14215   int shift;
14216
14217   if (vex.evex)
14218     {
14219       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
14220       if (vex.b
14221           && bytemode != x_mode
14222           && bytemode != evex_half_bcst_xmmq_mode)
14223         {
14224           BadOp ();
14225           return;
14226         }
14227       switch (bytemode)
14228         {
14229         case vex_vsib_d_w_dq_mode:
14230         case vex_vsib_q_w_dq_mode:
14231         case evex_x_gscat_mode:
14232         case xmm_mdq_mode:
14233           shift = vex.w ? 3 : 2;
14234           break;
14235         case x_mode:
14236         case evex_half_bcst_xmmq_mode:
14237           if (vex.b)
14238             {
14239               shift = vex.w ? 3 : 2;
14240               break;
14241             }
14242           /* Fall through if vex.b == 0.  */
14243         case xmmqd_mode:
14244         case xmmdw_mode:
14245         case xmmq_mode:
14246         case ymmq_mode:
14247         case evex_x_nobcst_mode:
14248         case x_swap_mode:
14249           switch (vex.length)
14250             {
14251             case 128:
14252               shift = 4;
14253               break;
14254             case 256:
14255               shift = 5;
14256               break;
14257             case 512:
14258               shift = 6;
14259               break;
14260             default:
14261               abort ();
14262             }
14263           break;
14264         case ymm_mode:
14265           shift = 5;
14266           break;
14267         case xmm_mode:
14268           shift = 4;
14269           break;
14270         case xmm_mq_mode:
14271         case q_mode:
14272         case q_scalar_mode:
14273         case q_swap_mode:
14274         case q_scalar_swap_mode:
14275           shift = 3;
14276           break;
14277         case dqd_mode:
14278         case xmm_md_mode:
14279         case d_mode:
14280         case d_scalar_mode:
14281         case d_swap_mode:
14282         case d_scalar_swap_mode:
14283           shift = 2;
14284           break;
14285         case xmm_mw_mode:
14286           shift = 1;
14287           break;
14288         case xmm_mb_mode:
14289           shift = 0;
14290           break;
14291         default:
14292           abort ();
14293         }
14294       /* Make necessary corrections to shift for modes that need it.
14295          For these modes we currently have shift 4, 5 or 6 depending on
14296          vex.length (it corresponds to xmmword, ymmword or zmmword
14297          operand).  We might want to make it 3, 4 or 5 (e.g. for
14298          xmmq_mode).  In case of broadcast enabled the corrections
14299          aren't needed, as element size is always 32 or 64 bits.  */
14300       if (bytemode == xmmq_mode
14301           || (bytemode == evex_half_bcst_xmmq_mode
14302               && !vex.b))
14303         shift -= 1;
14304       else if (bytemode == xmmqd_mode)
14305         shift -= 2;
14306       else if (bytemode == xmmdw_mode)
14307         shift -= 3;
14308     }
14309   else
14310     shift = 0;
14311
14312   USED_REX (REX_B);
14313   if (intel_syntax)
14314     intel_operand_size (bytemode, sizeflag);
14315   append_seg ();
14316
14317   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14318     {
14319       /* 32/64 bit address mode */
14320       int havedisp;
14321       int havesib;
14322       int havebase;
14323       int haveindex;
14324       int needindex;
14325       int base, rbase;
14326       int vindex = 0;
14327       int scale = 0;
14328       int addr32flag = !((sizeflag & AFLAG)
14329                          || bytemode == v_bnd_mode
14330                          || bytemode == bnd_mode);
14331       const char **indexes64 = names64;
14332       const char **indexes32 = names32;
14333
14334       havesib = 0;
14335       havebase = 1;
14336       haveindex = 0;
14337       base = modrm.rm;
14338
14339       if (base == 4)
14340         {
14341           havesib = 1;
14342           vindex = sib.index;
14343           USED_REX (REX_X);
14344           if (rex & REX_X)
14345             vindex += 8;
14346           switch (bytemode)
14347             {
14348             case vex_vsib_d_w_dq_mode:
14349             case vex_vsib_q_w_dq_mode:
14350               if (!need_vex)
14351                 abort ();
14352               if (vex.evex)
14353                 {
14354                   if (!vex.v)
14355                     vindex += 16;
14356                 }
14357
14358               haveindex = 1;
14359               switch (vex.length)
14360                 {
14361                 case 128:
14362                   indexes64 = indexes32 = names_xmm;
14363                   break;
14364                 case 256:
14365                   if (!vex.w || bytemode == vex_vsib_q_w_dq_mode)
14366                     indexes64 = indexes32 = names_ymm;
14367                   else
14368                     indexes64 = indexes32 = names_xmm;
14369                   break;
14370                 case 512:
14371                   if (!vex.w || bytemode == vex_vsib_q_w_dq_mode)
14372                     indexes64 = indexes32 = names_zmm;
14373                   else
14374                     indexes64 = indexes32 = names_ymm;
14375                   break;
14376                 default:
14377                   abort ();
14378                 }
14379               break;
14380             default:
14381               haveindex = vindex != 4;
14382               break;
14383             }
14384           scale = sib.scale;
14385           base = sib.base;
14386           codep++;
14387         }
14388       rbase = base + add;
14389
14390       switch (modrm.mod)
14391         {
14392         case 0:
14393           if (base == 5)
14394             {
14395               havebase = 0;
14396               if (address_mode == mode_64bit && !havesib)
14397                 riprel = 1;
14398               disp = get32s ();
14399             }
14400           break;
14401         case 1:
14402           FETCH_DATA (the_info, codep + 1);
14403           disp = *codep++;
14404           if ((disp & 0x80) != 0)
14405             disp -= 0x100;
14406           if (vex.evex && shift > 0)
14407             disp <<= shift;
14408           break;
14409         case 2:
14410           disp = get32s ();
14411           break;
14412         }
14413
14414       /* In 32bit mode, we need index register to tell [offset] from
14415          [eiz*1 + offset].  */
14416       needindex = (havesib
14417                    && !havebase
14418                    && !haveindex
14419                    && address_mode == mode_32bit);
14420       havedisp = (havebase
14421                   || needindex
14422                   || (havesib && (haveindex || scale != 0)));
14423
14424       if (!intel_syntax)
14425         if (modrm.mod != 0 || base == 5)
14426           {
14427             if (havedisp || riprel)
14428               print_displacement (scratchbuf, disp);
14429             else
14430               print_operand_value (scratchbuf, 1, disp);
14431             oappend (scratchbuf);
14432             if (riprel)
14433               {
14434                 set_op (disp, 1);
14435                 oappend (sizeflag & AFLAG ? "(%rip)" : "(%eip)");
14436               }
14437           }
14438
14439       if ((havebase || haveindex || riprel)
14440           && (bytemode != v_bnd_mode)
14441           && (bytemode != bnd_mode))
14442         used_prefixes |= PREFIX_ADDR;
14443
14444       if (havedisp || (intel_syntax && riprel))
14445         {
14446           *obufp++ = open_char;
14447           if (intel_syntax && riprel)
14448             {
14449               set_op (disp, 1);
14450               oappend (sizeflag & AFLAG ? "rip" : "eip");
14451             }
14452           *obufp = '\0';
14453           if (havebase)
14454             oappend (address_mode == mode_64bit && !addr32flag
14455                      ? names64[rbase] : names32[rbase]);
14456           if (havesib)
14457             {
14458               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
14459                  print index to tell base + index from base.  */
14460               if (scale != 0
14461                   || needindex
14462                   || haveindex
14463                   || (havebase && base != ESP_REG_NUM))
14464                 {
14465                   if (!intel_syntax || havebase)
14466                     {
14467                       *obufp++ = separator_char;
14468                       *obufp = '\0';
14469                     }
14470                   if (haveindex)
14471                     oappend (address_mode == mode_64bit && !addr32flag
14472                              ? indexes64[vindex] : indexes32[vindex]);
14473                   else
14474                     oappend (address_mode == mode_64bit && !addr32flag
14475                              ? index64 : index32);
14476
14477                   *obufp++ = scale_char;
14478                   *obufp = '\0';
14479                   sprintf (scratchbuf, "%d", 1 << scale);
14480                   oappend (scratchbuf);
14481                 }
14482             }
14483           if (intel_syntax
14484               && (disp || modrm.mod != 0 || base == 5))
14485             {
14486               if (!havedisp || (bfd_signed_vma) disp >= 0)
14487                 {
14488                   *obufp++ = '+';
14489                   *obufp = '\0';
14490                 }
14491               else if (modrm.mod != 1 && disp != -disp)
14492                 {
14493                   *obufp++ = '-';
14494                   *obufp = '\0';
14495                   disp = - (bfd_signed_vma) disp;
14496                 }
14497
14498               if (havedisp)
14499                 print_displacement (scratchbuf, disp);
14500               else
14501                 print_operand_value (scratchbuf, 1, disp);
14502               oappend (scratchbuf);
14503             }
14504
14505           *obufp++ = close_char;
14506           *obufp = '\0';
14507         }
14508       else if (intel_syntax)
14509         {
14510           if (modrm.mod != 0 || base == 5)
14511             {
14512               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
14513                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
14514                 ;
14515               else
14516                 {
14517                   oappend (names_seg[ds_reg - es_reg]);
14518                   oappend (":");
14519                 }
14520               print_operand_value (scratchbuf, 1, disp);
14521               oappend (scratchbuf);
14522             }
14523         }
14524     }
14525   else
14526     {
14527       /* 16 bit address mode */
14528       used_prefixes |= prefixes & PREFIX_ADDR;
14529       switch (modrm.mod)
14530         {
14531         case 0:
14532           if (modrm.rm == 6)
14533             {
14534               disp = get16 ();
14535               if ((disp & 0x8000) != 0)
14536                 disp -= 0x10000;
14537             }
14538           break;
14539         case 1:
14540           FETCH_DATA (the_info, codep + 1);
14541           disp = *codep++;
14542           if ((disp & 0x80) != 0)
14543             disp -= 0x100;
14544           break;
14545         case 2:
14546           disp = get16 ();
14547           if ((disp & 0x8000) != 0)
14548             disp -= 0x10000;
14549           break;
14550         }
14551
14552       if (!intel_syntax)
14553         if (modrm.mod != 0 || modrm.rm == 6)
14554           {
14555             print_displacement (scratchbuf, disp);
14556             oappend (scratchbuf);
14557           }
14558
14559       if (modrm.mod != 0 || modrm.rm != 6)
14560         {
14561           *obufp++ = open_char;
14562           *obufp = '\0';
14563           oappend (index16[modrm.rm]);
14564           if (intel_syntax
14565               && (disp || modrm.mod != 0 || modrm.rm == 6))
14566             {
14567               if ((bfd_signed_vma) disp >= 0)
14568                 {
14569                   *obufp++ = '+';
14570                   *obufp = '\0';
14571                 }
14572               else if (modrm.mod != 1)
14573                 {
14574                   *obufp++ = '-';
14575                   *obufp = '\0';
14576                   disp = - (bfd_signed_vma) disp;
14577                 }
14578
14579               print_displacement (scratchbuf, disp);
14580               oappend (scratchbuf);
14581             }
14582
14583           *obufp++ = close_char;
14584           *obufp = '\0';
14585         }
14586       else if (intel_syntax)
14587         {
14588           if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
14589                           | PREFIX_ES | PREFIX_FS | PREFIX_GS))
14590             ;
14591           else
14592             {
14593               oappend (names_seg[ds_reg - es_reg]);
14594               oappend (":");
14595             }
14596           print_operand_value (scratchbuf, 1, disp & 0xffff);
14597           oappend (scratchbuf);
14598         }
14599     }
14600   if (vex.evex && vex.b
14601       && (bytemode == x_mode
14602           || bytemode == evex_half_bcst_xmmq_mode))
14603     {
14604       if (vex.w || bytemode == evex_half_bcst_xmmq_mode)
14605         oappend ("{1to8}");
14606       else
14607         oappend ("{1to16}");
14608     }
14609 }
14610
14611 static void
14612 OP_E (int bytemode, int sizeflag)
14613 {
14614   /* Skip mod/rm byte.  */
14615   MODRM_CHECK;
14616   codep++;
14617
14618   if (modrm.mod == 3)
14619     OP_E_register (bytemode, sizeflag);
14620   else
14621     OP_E_memory (bytemode, sizeflag);
14622 }
14623
14624 static void
14625 OP_G (int bytemode, int sizeflag)
14626 {
14627   int add = 0;
14628   USED_REX (REX_R);
14629   if (rex & REX_R)
14630     add += 8;
14631   switch (bytemode)
14632     {
14633     case b_mode:
14634       USED_REX (0);
14635       if (rex)
14636         oappend (names8rex[modrm.reg + add]);
14637       else
14638         oappend (names8[modrm.reg + add]);
14639       break;
14640     case w_mode:
14641       oappend (names16[modrm.reg + add]);
14642       break;
14643     case d_mode:
14644       oappend (names32[modrm.reg + add]);
14645       break;
14646     case q_mode:
14647       oappend (names64[modrm.reg + add]);
14648       break;
14649     case bnd_mode:
14650       oappend (names_bnd[modrm.reg]);
14651       break;
14652     case v_mode:
14653     case dq_mode:
14654     case dqb_mode:
14655     case dqd_mode:
14656     case dqw_mode:
14657       USED_REX (REX_W);
14658       if (rex & REX_W)
14659         oappend (names64[modrm.reg + add]);
14660       else
14661         {
14662           if ((sizeflag & DFLAG) || bytemode != v_mode)
14663             oappend (names32[modrm.reg + add]);
14664           else
14665             oappend (names16[modrm.reg + add]);
14666           used_prefixes |= (prefixes & PREFIX_DATA);
14667         }
14668       break;
14669     case m_mode:
14670       if (address_mode == mode_64bit)
14671         oappend (names64[modrm.reg + add]);
14672       else
14673         oappend (names32[modrm.reg + add]);
14674       break;
14675     case mask_mode:
14676       oappend (names_mask[modrm.reg + add]);
14677       break;
14678     default:
14679       oappend (INTERNAL_DISASSEMBLER_ERROR);
14680       break;
14681     }
14682 }
14683
14684 static bfd_vma
14685 get64 (void)
14686 {
14687   bfd_vma x;
14688 #ifdef BFD64
14689   unsigned int a;
14690   unsigned int b;
14691
14692   FETCH_DATA (the_info, codep + 8);
14693   a = *codep++ & 0xff;
14694   a |= (*codep++ & 0xff) << 8;
14695   a |= (*codep++ & 0xff) << 16;
14696   a |= (*codep++ & 0xff) << 24;
14697   b = *codep++ & 0xff;
14698   b |= (*codep++ & 0xff) << 8;
14699   b |= (*codep++ & 0xff) << 16;
14700   b |= (*codep++ & 0xff) << 24;
14701   x = a + ((bfd_vma) b << 32);
14702 #else
14703   abort ();
14704   x = 0;
14705 #endif
14706   return x;
14707 }
14708
14709 static bfd_signed_vma
14710 get32 (void)
14711 {
14712   bfd_signed_vma x = 0;
14713
14714   FETCH_DATA (the_info, codep + 4);
14715   x = *codep++ & (bfd_signed_vma) 0xff;
14716   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14717   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14718   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14719   return x;
14720 }
14721
14722 static bfd_signed_vma
14723 get32s (void)
14724 {
14725   bfd_signed_vma x = 0;
14726
14727   FETCH_DATA (the_info, codep + 4);
14728   x = *codep++ & (bfd_signed_vma) 0xff;
14729   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14730   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14731   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14732
14733   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14734
14735   return x;
14736 }
14737
14738 static int
14739 get16 (void)
14740 {
14741   int x = 0;
14742
14743   FETCH_DATA (the_info, codep + 2);
14744   x = *codep++ & 0xff;
14745   x |= (*codep++ & 0xff) << 8;
14746   return x;
14747 }
14748
14749 static void
14750 set_op (bfd_vma op, int riprel)
14751 {
14752   op_index[op_ad] = op_ad;
14753   if (address_mode == mode_64bit)
14754     {
14755       op_address[op_ad] = op;
14756       op_riprel[op_ad] = riprel;
14757     }
14758   else
14759     {
14760       /* Mask to get a 32-bit address.  */
14761       op_address[op_ad] = op & 0xffffffff;
14762       op_riprel[op_ad] = riprel & 0xffffffff;
14763     }
14764 }
14765
14766 static void
14767 OP_REG (int code, int sizeflag)
14768 {
14769   const char *s;
14770   int add;
14771
14772   switch (code)
14773     {
14774     case es_reg: case ss_reg: case cs_reg:
14775     case ds_reg: case fs_reg: case gs_reg:
14776       oappend (names_seg[code - es_reg]);
14777       return;
14778     }
14779
14780   USED_REX (REX_B);
14781   if (rex & REX_B)
14782     add = 8;
14783   else
14784     add = 0;
14785
14786   switch (code)
14787     {
14788     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14789     case sp_reg: case bp_reg: case si_reg: case di_reg:
14790       s = names16[code - ax_reg + add];
14791       break;
14792     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14793     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14794       USED_REX (0);
14795       if (rex)
14796         s = names8rex[code - al_reg + add];
14797       else
14798         s = names8[code - al_reg];
14799       break;
14800     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14801     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14802       if (address_mode == mode_64bit
14803           && ((sizeflag & DFLAG) || (rex & REX_W)))
14804         {
14805           s = names64[code - rAX_reg + add];
14806           break;
14807         }
14808       code += eAX_reg - rAX_reg;
14809       /* Fall through.  */
14810     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14811     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14812       USED_REX (REX_W);
14813       if (rex & REX_W)
14814         s = names64[code - eAX_reg + add];
14815       else
14816         {
14817           if (sizeflag & DFLAG)
14818             s = names32[code - eAX_reg + add];
14819           else
14820             s = names16[code - eAX_reg + add];
14821           used_prefixes |= (prefixes & PREFIX_DATA);
14822         }
14823       break;
14824     default:
14825       s = INTERNAL_DISASSEMBLER_ERROR;
14826       break;
14827     }
14828   oappend (s);
14829 }
14830
14831 static void
14832 OP_IMREG (int code, int sizeflag)
14833 {
14834   const char *s;
14835
14836   switch (code)
14837     {
14838     case indir_dx_reg:
14839       if (intel_syntax)
14840         s = "dx";
14841       else
14842         s = "(%dx)";
14843       break;
14844     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14845     case sp_reg: case bp_reg: case si_reg: case di_reg:
14846       s = names16[code - ax_reg];
14847       break;
14848     case es_reg: case ss_reg: case cs_reg:
14849     case ds_reg: case fs_reg: case gs_reg:
14850       s = names_seg[code - es_reg];
14851       break;
14852     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14853     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14854       USED_REX (0);
14855       if (rex)
14856         s = names8rex[code - al_reg];
14857       else
14858         s = names8[code - al_reg];
14859       break;
14860     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14861     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14862       USED_REX (REX_W);
14863       if (rex & REX_W)
14864         s = names64[code - eAX_reg];
14865       else
14866         {
14867           if (sizeflag & DFLAG)
14868             s = names32[code - eAX_reg];
14869           else
14870             s = names16[code - eAX_reg];
14871           used_prefixes |= (prefixes & PREFIX_DATA);
14872         }
14873       break;
14874     case z_mode_ax_reg:
14875       if ((rex & REX_W) || (sizeflag & DFLAG))
14876         s = *names32;
14877       else
14878         s = *names16;
14879       if (!(rex & REX_W))
14880         used_prefixes |= (prefixes & PREFIX_DATA);
14881       break;
14882     default:
14883       s = INTERNAL_DISASSEMBLER_ERROR;
14884       break;
14885     }
14886   oappend (s);
14887 }
14888
14889 static void
14890 OP_I (int bytemode, int sizeflag)
14891 {
14892   bfd_signed_vma op;
14893   bfd_signed_vma mask = -1;
14894
14895   switch (bytemode)
14896     {
14897     case b_mode:
14898       FETCH_DATA (the_info, codep + 1);
14899       op = *codep++;
14900       mask = 0xff;
14901       break;
14902     case q_mode:
14903       if (address_mode == mode_64bit)
14904         {
14905           op = get32s ();
14906           break;
14907         }
14908       /* Fall through.  */
14909     case v_mode:
14910       USED_REX (REX_W);
14911       if (rex & REX_W)
14912         op = get32s ();
14913       else
14914         {
14915           if (sizeflag & DFLAG)
14916             {
14917               op = get32 ();
14918               mask = 0xffffffff;
14919             }
14920           else
14921             {
14922               op = get16 ();
14923               mask = 0xfffff;
14924             }
14925           used_prefixes |= (prefixes & PREFIX_DATA);
14926         }
14927       break;
14928     case w_mode:
14929       mask = 0xfffff;
14930       op = get16 ();
14931       break;
14932     case const_1_mode:
14933       if (intel_syntax)
14934         oappend ("1");
14935       return;
14936     default:
14937       oappend (INTERNAL_DISASSEMBLER_ERROR);
14938       return;
14939     }
14940
14941   op &= mask;
14942   scratchbuf[0] = '$';
14943   print_operand_value (scratchbuf + 1, 1, op);
14944   oappend_maybe_intel (scratchbuf);
14945   scratchbuf[0] = '\0';
14946 }
14947
14948 static void
14949 OP_I64 (int bytemode, int sizeflag)
14950 {
14951   bfd_signed_vma op;
14952   bfd_signed_vma mask = -1;
14953
14954   if (address_mode != mode_64bit)
14955     {
14956       OP_I (bytemode, sizeflag);
14957       return;
14958     }
14959
14960   switch (bytemode)
14961     {
14962     case b_mode:
14963       FETCH_DATA (the_info, codep + 1);
14964       op = *codep++;
14965       mask = 0xff;
14966       break;
14967     case v_mode:
14968       USED_REX (REX_W);
14969       if (rex & REX_W)
14970         op = get64 ();
14971       else
14972         {
14973           if (sizeflag & DFLAG)
14974             {
14975               op = get32 ();
14976               mask = 0xffffffff;
14977             }
14978           else
14979             {
14980               op = get16 ();
14981               mask = 0xfffff;
14982             }
14983           used_prefixes |= (prefixes & PREFIX_DATA);
14984         }
14985       break;
14986     case w_mode:
14987       mask = 0xfffff;
14988       op = get16 ();
14989       break;
14990     default:
14991       oappend (INTERNAL_DISASSEMBLER_ERROR);
14992       return;
14993     }
14994
14995   op &= mask;
14996   scratchbuf[0] = '$';
14997   print_operand_value (scratchbuf + 1, 1, op);
14998   oappend_maybe_intel (scratchbuf);
14999   scratchbuf[0] = '\0';
15000 }
15001
15002 static void
15003 OP_sI (int bytemode, int sizeflag)
15004 {
15005   bfd_signed_vma op;
15006
15007   switch (bytemode)
15008     {
15009     case b_mode:
15010     case b_T_mode:
15011       FETCH_DATA (the_info, codep + 1);
15012       op = *codep++;
15013       if ((op & 0x80) != 0)
15014         op -= 0x100;
15015       if (bytemode == b_T_mode)
15016         {
15017           if (address_mode != mode_64bit
15018               || !((sizeflag & DFLAG) || (rex & REX_W)))
15019             {
15020               /* The operand-size prefix is overridden by a REX prefix.  */
15021               if ((sizeflag & DFLAG) || (rex & REX_W))
15022                 op &= 0xffffffff;
15023               else
15024                 op &= 0xffff;
15025           }
15026         }
15027       else
15028         {
15029           if (!(rex & REX_W))
15030             {
15031               if (sizeflag & DFLAG)
15032                 op &= 0xffffffff;
15033               else
15034                 op &= 0xffff;
15035             }
15036         }
15037       break;
15038     case v_mode:
15039       /* The operand-size prefix is overridden by a REX prefix.  */
15040       if ((sizeflag & DFLAG) || (rex & REX_W))
15041         op = get32s ();
15042       else
15043         op = get16 ();
15044       break;
15045     default:
15046       oappend (INTERNAL_DISASSEMBLER_ERROR);
15047       return;
15048     }
15049
15050   scratchbuf[0] = '$';
15051   print_operand_value (scratchbuf + 1, 1, op);
15052   oappend_maybe_intel (scratchbuf);
15053 }
15054
15055 static void
15056 OP_J (int bytemode, int sizeflag)
15057 {
15058   bfd_vma disp;
15059   bfd_vma mask = -1;
15060   bfd_vma segment = 0;
15061
15062   switch (bytemode)
15063     {
15064     case b_mode:
15065       FETCH_DATA (the_info, codep + 1);
15066       disp = *codep++;
15067       if ((disp & 0x80) != 0)
15068         disp -= 0x100;
15069       break;
15070     case v_mode:
15071       USED_REX (REX_W);
15072       if ((sizeflag & DFLAG) || (rex & REX_W))
15073         disp = get32s ();
15074       else
15075         {
15076           disp = get16 ();
15077           if ((disp & 0x8000) != 0)
15078             disp -= 0x10000;
15079           /* In 16bit mode, address is wrapped around at 64k within
15080              the same segment.  Otherwise, a data16 prefix on a jump
15081              instruction means that the pc is masked to 16 bits after
15082              the displacement is added!  */
15083           mask = 0xffff;
15084           if ((prefixes & PREFIX_DATA) == 0)
15085             segment = ((start_pc + codep - start_codep)
15086                        & ~((bfd_vma) 0xffff));
15087         }
15088       if (!(rex & REX_W))
15089         used_prefixes |= (prefixes & PREFIX_DATA);
15090       break;
15091     default:
15092       oappend (INTERNAL_DISASSEMBLER_ERROR);
15093       return;
15094     }
15095   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
15096   set_op (disp, 0);
15097   print_operand_value (scratchbuf, 1, disp);
15098   oappend (scratchbuf);
15099 }
15100
15101 static void
15102 OP_SEG (int bytemode, int sizeflag)
15103 {
15104   if (bytemode == w_mode)
15105     oappend (names_seg[modrm.reg]);
15106   else
15107     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
15108 }
15109
15110 static void
15111 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
15112 {
15113   int seg, offset;
15114
15115   if (sizeflag & DFLAG)
15116     {
15117       offset = get32 ();
15118       seg = get16 ();
15119     }
15120   else
15121     {
15122       offset = get16 ();
15123       seg = get16 ();
15124     }
15125   used_prefixes |= (prefixes & PREFIX_DATA);
15126   if (intel_syntax)
15127     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
15128   else
15129     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
15130   oappend (scratchbuf);
15131 }
15132
15133 static void
15134 OP_OFF (int bytemode, int sizeflag)
15135 {
15136   bfd_vma off;
15137
15138   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15139     intel_operand_size (bytemode, sizeflag);
15140   append_seg ();
15141
15142   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15143     off = get32 ();
15144   else
15145     off = get16 ();
15146
15147   if (intel_syntax)
15148     {
15149       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
15150                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
15151         {
15152           oappend (names_seg[ds_reg - es_reg]);
15153           oappend (":");
15154         }
15155     }
15156   print_operand_value (scratchbuf, 1, off);
15157   oappend (scratchbuf);
15158 }
15159
15160 static void
15161 OP_OFF64 (int bytemode, int sizeflag)
15162 {
15163   bfd_vma off;
15164
15165   if (address_mode != mode_64bit
15166       || (prefixes & PREFIX_ADDR))
15167     {
15168       OP_OFF (bytemode, sizeflag);
15169       return;
15170     }
15171
15172   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15173     intel_operand_size (bytemode, sizeflag);
15174   append_seg ();
15175
15176   off = get64 ();
15177
15178   if (intel_syntax)
15179     {
15180       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
15181                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
15182         {
15183           oappend (names_seg[ds_reg - es_reg]);
15184           oappend (":");
15185         }
15186     }
15187   print_operand_value (scratchbuf, 1, off);
15188   oappend (scratchbuf);
15189 }
15190
15191 static void
15192 ptr_reg (int code, int sizeflag)
15193 {
15194   const char *s;
15195
15196   *obufp++ = open_char;
15197   used_prefixes |= (prefixes & PREFIX_ADDR);
15198   if (address_mode == mode_64bit)
15199     {
15200       if (!(sizeflag & AFLAG))
15201         s = names32[code - eAX_reg];
15202       else
15203         s = names64[code - eAX_reg];
15204     }
15205   else if (sizeflag & AFLAG)
15206     s = names32[code - eAX_reg];
15207   else
15208     s = names16[code - eAX_reg];
15209   oappend (s);
15210   *obufp++ = close_char;
15211   *obufp = 0;
15212 }
15213
15214 static void
15215 OP_ESreg (int code, int sizeflag)
15216 {
15217   if (intel_syntax)
15218     {
15219       switch (codep[-1])
15220         {
15221         case 0x6d:      /* insw/insl */
15222           intel_operand_size (z_mode, sizeflag);
15223           break;
15224         case 0xa5:      /* movsw/movsl/movsq */
15225         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15226         case 0xab:      /* stosw/stosl */
15227         case 0xaf:      /* scasw/scasl */
15228           intel_operand_size (v_mode, sizeflag);
15229           break;
15230         default:
15231           intel_operand_size (b_mode, sizeflag);
15232         }
15233     }
15234   oappend_maybe_intel ("%es:");
15235   ptr_reg (code, sizeflag);
15236 }
15237
15238 static void
15239 OP_DSreg (int code, int sizeflag)
15240 {
15241   if (intel_syntax)
15242     {
15243       switch (codep[-1])
15244         {
15245         case 0x6f:      /* outsw/outsl */
15246           intel_operand_size (z_mode, sizeflag);
15247           break;
15248         case 0xa5:      /* movsw/movsl/movsq */
15249         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15250         case 0xad:      /* lodsw/lodsl/lodsq */
15251           intel_operand_size (v_mode, sizeflag);
15252           break;
15253         default:
15254           intel_operand_size (b_mode, sizeflag);
15255         }
15256     }
15257   if ((prefixes
15258        & (PREFIX_CS
15259           | PREFIX_DS
15260           | PREFIX_SS
15261           | PREFIX_ES
15262           | PREFIX_FS
15263           | PREFIX_GS)) == 0)
15264     prefixes |= PREFIX_DS;
15265   append_seg ();
15266   ptr_reg (code, sizeflag);
15267 }
15268
15269 static void
15270 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15271 {
15272   int add;
15273   if (rex & REX_R)
15274     {
15275       USED_REX (REX_R);
15276       add = 8;
15277     }
15278   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15279     {
15280       all_prefixes[last_lock_prefix] = 0;
15281       used_prefixes |= PREFIX_LOCK;
15282       add = 8;
15283     }
15284   else
15285     add = 0;
15286   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15287   oappend_maybe_intel (scratchbuf);
15288 }
15289
15290 static void
15291 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15292 {
15293   int add;
15294   USED_REX (REX_R);
15295   if (rex & REX_R)
15296     add = 8;
15297   else
15298     add = 0;
15299   if (intel_syntax)
15300     sprintf (scratchbuf, "db%d", modrm.reg + add);
15301   else
15302     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15303   oappend (scratchbuf);
15304 }
15305
15306 static void
15307 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15308 {
15309   sprintf (scratchbuf, "%%tr%d", modrm.reg);
15310   oappend_maybe_intel (scratchbuf);
15311 }
15312
15313 static void
15314 OP_R (int bytemode, int sizeflag)
15315 {
15316   if (modrm.mod == 3)
15317     OP_E (bytemode, sizeflag);
15318   else
15319     BadOp ();
15320 }
15321
15322 static void
15323 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15324 {
15325   int reg = modrm.reg;
15326   const char **names;
15327
15328   used_prefixes |= (prefixes & PREFIX_DATA);
15329   if (prefixes & PREFIX_DATA)
15330     {
15331       names = names_xmm;
15332       USED_REX (REX_R);
15333       if (rex & REX_R)
15334         reg += 8;
15335     }
15336   else
15337     names = names_mm;
15338   oappend (names[reg]);
15339 }
15340
15341 static void
15342 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15343 {
15344   int reg = modrm.reg;
15345   const char **names;
15346
15347   USED_REX (REX_R);
15348   if (rex & REX_R)
15349     reg += 8;
15350   if (vex.evex)
15351     {
15352       if (!vex.r)
15353         reg += 16;
15354     }
15355
15356   if (need_vex
15357       && bytemode != xmm_mode
15358       && bytemode != xmmq_mode
15359       && bytemode != evex_half_bcst_xmmq_mode
15360       && bytemode != ymm_mode
15361       && bytemode != scalar_mode)
15362     {
15363       switch (vex.length)
15364         {
15365         case 128:
15366           names = names_xmm;
15367           break;
15368         case 256:
15369           if (vex.w || bytemode != vex_vsib_q_w_dq_mode)
15370             names = names_ymm;
15371           else
15372             names = names_xmm;
15373           break;
15374         case 512:
15375           names = names_zmm;
15376           break;
15377         default:
15378           abort ();
15379         }
15380     }
15381   else if (bytemode == xmmq_mode
15382            || bytemode == evex_half_bcst_xmmq_mode)
15383     {
15384       switch (vex.length)
15385         {
15386         case 128:
15387         case 256:
15388           names = names_xmm;
15389           break;
15390         case 512:
15391           names = names_ymm;
15392           break;
15393         default:
15394           abort ();
15395         }
15396     }
15397   else if (bytemode == ymm_mode)
15398     names = names_ymm;
15399   else
15400     names = names_xmm;
15401   oappend (names[reg]);
15402 }
15403
15404 static void
15405 OP_EM (int bytemode, int sizeflag)
15406 {
15407   int reg;
15408   const char **names;
15409
15410   if (modrm.mod != 3)
15411     {
15412       if (intel_syntax
15413           && (bytemode == v_mode || bytemode == v_swap_mode))
15414         {
15415           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15416           used_prefixes |= (prefixes & PREFIX_DATA);
15417         }
15418       OP_E (bytemode, sizeflag);
15419       return;
15420     }
15421
15422   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15423     swap_operand ();
15424
15425   /* Skip mod/rm byte.  */
15426   MODRM_CHECK;
15427   codep++;
15428   used_prefixes |= (prefixes & PREFIX_DATA);
15429   reg = modrm.rm;
15430   if (prefixes & PREFIX_DATA)
15431     {
15432       names = names_xmm;
15433       USED_REX (REX_B);
15434       if (rex & REX_B)
15435         reg += 8;
15436     }
15437   else
15438     names = names_mm;
15439   oappend (names[reg]);
15440 }
15441
15442 /* cvt* are the only instructions in sse2 which have
15443    both SSE and MMX operands and also have 0x66 prefix
15444    in their opcode. 0x66 was originally used to differentiate
15445    between SSE and MMX instruction(operands). So we have to handle the
15446    cvt* separately using OP_EMC and OP_MXC */
15447 static void
15448 OP_EMC (int bytemode, int sizeflag)
15449 {
15450   if (modrm.mod != 3)
15451     {
15452       if (intel_syntax && bytemode == v_mode)
15453         {
15454           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15455           used_prefixes |= (prefixes & PREFIX_DATA);
15456         }
15457       OP_E (bytemode, sizeflag);
15458       return;
15459     }
15460
15461   /* Skip mod/rm byte.  */
15462   MODRM_CHECK;
15463   codep++;
15464   used_prefixes |= (prefixes & PREFIX_DATA);
15465   oappend (names_mm[modrm.rm]);
15466 }
15467
15468 static void
15469 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15470 {
15471   used_prefixes |= (prefixes & PREFIX_DATA);
15472   oappend (names_mm[modrm.reg]);
15473 }
15474
15475 static void
15476 OP_EX (int bytemode, int sizeflag)
15477 {
15478   int reg;
15479   const char **names;
15480
15481   /* Skip mod/rm byte.  */
15482   MODRM_CHECK;
15483   codep++;
15484
15485   if (modrm.mod != 3)
15486     {
15487       OP_E_memory (bytemode, sizeflag);
15488       return;
15489     }
15490
15491   reg = modrm.rm;
15492   USED_REX (REX_B);
15493   if (rex & REX_B)
15494     reg += 8;
15495   if (vex.evex)
15496     {
15497       USED_REX (REX_X);
15498       if ((rex & REX_X))
15499         reg += 16;
15500     }
15501
15502   if ((sizeflag & SUFFIX_ALWAYS)
15503       && (bytemode == x_swap_mode
15504           || bytemode == d_swap_mode
15505           || bytemode == d_scalar_swap_mode
15506           || bytemode == q_swap_mode
15507           || bytemode == q_scalar_swap_mode))
15508     swap_operand ();
15509
15510   if (need_vex
15511       && bytemode != xmm_mode
15512       && bytemode != xmmdw_mode
15513       && bytemode != xmmqd_mode
15514       && bytemode != xmm_mb_mode
15515       && bytemode != xmm_mw_mode
15516       && bytemode != xmm_md_mode
15517       && bytemode != xmm_mq_mode
15518       && bytemode != xmm_mdq_mode
15519       && bytemode != xmmq_mode
15520       && bytemode != evex_half_bcst_xmmq_mode
15521       && bytemode != ymm_mode
15522       && bytemode != d_scalar_mode
15523       && bytemode != d_scalar_swap_mode
15524       && bytemode != q_scalar_mode
15525       && bytemode != q_scalar_swap_mode
15526       && bytemode != vex_scalar_w_dq_mode)
15527     {
15528       switch (vex.length)
15529         {
15530         case 128:
15531           names = names_xmm;
15532           break;
15533         case 256:
15534           names = names_ymm;
15535           break;
15536         case 512:
15537           names = names_zmm;
15538           break;
15539         default:
15540           abort ();
15541         }
15542     }
15543   else if (bytemode == xmmq_mode
15544            || bytemode == evex_half_bcst_xmmq_mode)
15545     {
15546       switch (vex.length)
15547         {
15548         case 128:
15549         case 256:
15550           names = names_xmm;
15551           break;
15552         case 512:
15553           names = names_ymm;
15554           break;
15555         default:
15556           abort ();
15557         }
15558     }
15559   else if (bytemode == ymm_mode)
15560     names = names_ymm;
15561   else
15562     names = names_xmm;
15563   oappend (names[reg]);
15564 }
15565
15566 static void
15567 OP_MS (int bytemode, int sizeflag)
15568 {
15569   if (modrm.mod == 3)
15570     OP_EM (bytemode, sizeflag);
15571   else
15572     BadOp ();
15573 }
15574
15575 static void
15576 OP_XS (int bytemode, int sizeflag)
15577 {
15578   if (modrm.mod == 3)
15579     OP_EX (bytemode, sizeflag);
15580   else
15581     BadOp ();
15582 }
15583
15584 static void
15585 OP_M (int bytemode, int sizeflag)
15586 {
15587   if (modrm.mod == 3)
15588     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15589     BadOp ();
15590   else
15591     OP_E (bytemode, sizeflag);
15592 }
15593
15594 static void
15595 OP_0f07 (int bytemode, int sizeflag)
15596 {
15597   if (modrm.mod != 3 || modrm.rm != 0)
15598     BadOp ();
15599   else
15600     OP_E (bytemode, sizeflag);
15601 }
15602
15603 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15604    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
15605
15606 static void
15607 NOP_Fixup1 (int bytemode, int sizeflag)
15608 {
15609   if ((prefixes & PREFIX_DATA) != 0
15610       || (rex != 0
15611           && rex != 0x48
15612           && address_mode == mode_64bit))
15613     OP_REG (bytemode, sizeflag);
15614   else
15615     strcpy (obuf, "nop");
15616 }
15617
15618 static void
15619 NOP_Fixup2 (int bytemode, int sizeflag)
15620 {
15621   if ((prefixes & PREFIX_DATA) != 0
15622       || (rex != 0
15623           && rex != 0x48
15624           && address_mode == mode_64bit))
15625     OP_IMREG (bytemode, sizeflag);
15626 }
15627
15628 static const char *const Suffix3DNow[] = {
15629 /* 00 */        NULL,           NULL,           NULL,           NULL,
15630 /* 04 */        NULL,           NULL,           NULL,           NULL,
15631 /* 08 */        NULL,           NULL,           NULL,           NULL,
15632 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
15633 /* 10 */        NULL,           NULL,           NULL,           NULL,
15634 /* 14 */        NULL,           NULL,           NULL,           NULL,
15635 /* 18 */        NULL,           NULL,           NULL,           NULL,
15636 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
15637 /* 20 */        NULL,           NULL,           NULL,           NULL,
15638 /* 24 */        NULL,           NULL,           NULL,           NULL,
15639 /* 28 */        NULL,           NULL,           NULL,           NULL,
15640 /* 2C */        NULL,           NULL,           NULL,           NULL,
15641 /* 30 */        NULL,           NULL,           NULL,           NULL,
15642 /* 34 */        NULL,           NULL,           NULL,           NULL,
15643 /* 38 */        NULL,           NULL,           NULL,           NULL,
15644 /* 3C */        NULL,           NULL,           NULL,           NULL,
15645 /* 40 */        NULL,           NULL,           NULL,           NULL,
15646 /* 44 */        NULL,           NULL,           NULL,           NULL,
15647 /* 48 */        NULL,           NULL,           NULL,           NULL,
15648 /* 4C */        NULL,           NULL,           NULL,           NULL,
15649 /* 50 */        NULL,           NULL,           NULL,           NULL,
15650 /* 54 */        NULL,           NULL,           NULL,           NULL,
15651 /* 58 */        NULL,           NULL,           NULL,           NULL,
15652 /* 5C */        NULL,           NULL,           NULL,           NULL,
15653 /* 60 */        NULL,           NULL,           NULL,           NULL,
15654 /* 64 */        NULL,           NULL,           NULL,           NULL,
15655 /* 68 */        NULL,           NULL,           NULL,           NULL,
15656 /* 6C */        NULL,           NULL,           NULL,           NULL,
15657 /* 70 */        NULL,           NULL,           NULL,           NULL,
15658 /* 74 */        NULL,           NULL,           NULL,           NULL,
15659 /* 78 */        NULL,           NULL,           NULL,           NULL,
15660 /* 7C */        NULL,           NULL,           NULL,           NULL,
15661 /* 80 */        NULL,           NULL,           NULL,           NULL,
15662 /* 84 */        NULL,           NULL,           NULL,           NULL,
15663 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
15664 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
15665 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
15666 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
15667 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
15668 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
15669 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
15670 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
15671 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
15672 /* AC */        NULL,           NULL,           "pfacc",        NULL,
15673 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
15674 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
15675 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
15676 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
15677 /* C0 */        NULL,           NULL,           NULL,           NULL,
15678 /* C4 */        NULL,           NULL,           NULL,           NULL,
15679 /* C8 */        NULL,           NULL,           NULL,           NULL,
15680 /* CC */        NULL,           NULL,           NULL,           NULL,
15681 /* D0 */        NULL,           NULL,           NULL,           NULL,
15682 /* D4 */        NULL,           NULL,           NULL,           NULL,
15683 /* D8 */        NULL,           NULL,           NULL,           NULL,
15684 /* DC */        NULL,           NULL,           NULL,           NULL,
15685 /* E0 */        NULL,           NULL,           NULL,           NULL,
15686 /* E4 */        NULL,           NULL,           NULL,           NULL,
15687 /* E8 */        NULL,           NULL,           NULL,           NULL,
15688 /* EC */        NULL,           NULL,           NULL,           NULL,
15689 /* F0 */        NULL,           NULL,           NULL,           NULL,
15690 /* F4 */        NULL,           NULL,           NULL,           NULL,
15691 /* F8 */        NULL,           NULL,           NULL,           NULL,
15692 /* FC */        NULL,           NULL,           NULL,           NULL,
15693 };
15694
15695 static void
15696 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15697 {
15698   const char *mnemonic;
15699
15700   FETCH_DATA (the_info, codep + 1);
15701   /* AMD 3DNow! instructions are specified by an opcode suffix in the
15702      place where an 8-bit immediate would normally go.  ie. the last
15703      byte of the instruction.  */
15704   obufp = mnemonicendp;
15705   mnemonic = Suffix3DNow[*codep++ & 0xff];
15706   if (mnemonic)
15707     oappend (mnemonic);
15708   else
15709     {
15710       /* Since a variable sized modrm/sib chunk is between the start
15711          of the opcode (0x0f0f) and the opcode suffix, we need to do
15712          all the modrm processing first, and don't know until now that
15713          we have a bad opcode.  This necessitates some cleaning up.  */
15714       op_out[0][0] = '\0';
15715       op_out[1][0] = '\0';
15716       BadOp ();
15717     }
15718   mnemonicendp = obufp;
15719 }
15720
15721 static struct op simd_cmp_op[] =
15722 {
15723   { STRING_COMMA_LEN ("eq") },
15724   { STRING_COMMA_LEN ("lt") },
15725   { STRING_COMMA_LEN ("le") },
15726   { STRING_COMMA_LEN ("unord") },
15727   { STRING_COMMA_LEN ("neq") },
15728   { STRING_COMMA_LEN ("nlt") },
15729   { STRING_COMMA_LEN ("nle") },
15730   { STRING_COMMA_LEN ("ord") }
15731 };
15732
15733 static void
15734 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15735 {
15736   unsigned int cmp_type;
15737
15738   FETCH_DATA (the_info, codep + 1);
15739   cmp_type = *codep++ & 0xff;
15740   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15741     {
15742       char suffix [3];
15743       char *p = mnemonicendp - 2;
15744       suffix[0] = p[0];
15745       suffix[1] = p[1];
15746       suffix[2] = '\0';
15747       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15748       mnemonicendp += simd_cmp_op[cmp_type].len;
15749     }
15750   else
15751     {
15752       /* We have a reserved extension byte.  Output it directly.  */
15753       scratchbuf[0] = '$';
15754       print_operand_value (scratchbuf + 1, 1, cmp_type);
15755       oappend_maybe_intel (scratchbuf);
15756       scratchbuf[0] = '\0';
15757     }
15758 }
15759
15760 static void
15761 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15762           int sizeflag ATTRIBUTE_UNUSED)
15763 {
15764   /* mwait %eax,%ecx  */
15765   if (!intel_syntax)
15766     {
15767       const char **names = (address_mode == mode_64bit
15768                             ? names64 : names32);
15769       strcpy (op_out[0], names[0]);
15770       strcpy (op_out[1], names[1]);
15771       two_source_ops = 1;
15772     }
15773   /* Skip mod/rm byte.  */
15774   MODRM_CHECK;
15775   codep++;
15776 }
15777
15778 static void
15779 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15780             int sizeflag ATTRIBUTE_UNUSED)
15781 {
15782   /* monitor %eax,%ecx,%edx"  */
15783   if (!intel_syntax)
15784     {
15785       const char **op1_names;
15786       const char **names = (address_mode == mode_64bit
15787                             ? names64 : names32);
15788
15789       if (!(prefixes & PREFIX_ADDR))
15790         op1_names = (address_mode == mode_16bit
15791                      ? names16 : names);
15792       else
15793         {
15794           /* Remove "addr16/addr32".  */
15795           all_prefixes[last_addr_prefix] = 0;
15796           op1_names = (address_mode != mode_32bit
15797                        ? names32 : names16);
15798           used_prefixes |= PREFIX_ADDR;
15799         }
15800       strcpy (op_out[0], op1_names[0]);
15801       strcpy (op_out[1], names[1]);
15802       strcpy (op_out[2], names[2]);
15803       two_source_ops = 1;
15804     }
15805   /* Skip mod/rm byte.  */
15806   MODRM_CHECK;
15807   codep++;
15808 }
15809
15810 static void
15811 BadOp (void)
15812 {
15813   /* Throw away prefixes and 1st. opcode byte.  */
15814   codep = insn_codep + 1;
15815   oappend ("(bad)");
15816 }
15817
15818 static void
15819 REP_Fixup (int bytemode, int sizeflag)
15820 {
15821   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15822      lods and stos.  */
15823   if (prefixes & PREFIX_REPZ)
15824     all_prefixes[last_repz_prefix] = REP_PREFIX;
15825
15826   switch (bytemode)
15827     {
15828     case al_reg:
15829     case eAX_reg:
15830     case indir_dx_reg:
15831       OP_IMREG (bytemode, sizeflag);
15832       break;
15833     case eDI_reg:
15834       OP_ESreg (bytemode, sizeflag);
15835       break;
15836     case eSI_reg:
15837       OP_DSreg (bytemode, sizeflag);
15838       break;
15839     default:
15840       abort ();
15841       break;
15842     }
15843 }
15844
15845 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15846    "bnd".  */
15847
15848 static void
15849 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15850 {
15851   if (prefixes & PREFIX_REPNZ)
15852     all_prefixes[last_repnz_prefix] = BND_PREFIX;
15853 }
15854
15855 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15856    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15857  */
15858
15859 static void
15860 HLE_Fixup1 (int bytemode, int sizeflag)
15861 {
15862   if (modrm.mod != 3
15863       && (prefixes & PREFIX_LOCK) != 0)
15864     {
15865       if (prefixes & PREFIX_REPZ)
15866         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15867       if (prefixes & PREFIX_REPNZ)
15868         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15869     }
15870
15871   OP_E (bytemode, sizeflag);
15872 }
15873
15874 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15875    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
15876  */
15877
15878 static void
15879 HLE_Fixup2 (int bytemode, int sizeflag)
15880 {
15881   if (modrm.mod != 3)
15882     {
15883       if (prefixes & PREFIX_REPZ)
15884         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15885       if (prefixes & PREFIX_REPNZ)
15886         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15887     }
15888
15889   OP_E (bytemode, sizeflag);
15890 }
15891
15892 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
15893    "xrelease" for memory operand.  No check for LOCK prefix.   */
15894
15895 static void
15896 HLE_Fixup3 (int bytemode, int sizeflag)
15897 {
15898   if (modrm.mod != 3
15899       && last_repz_prefix > last_repnz_prefix
15900       && (prefixes & PREFIX_REPZ) != 0)
15901     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15902
15903   OP_E (bytemode, sizeflag);
15904 }
15905
15906 static void
15907 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15908 {
15909   USED_REX (REX_W);
15910   if (rex & REX_W)
15911     {
15912       /* Change cmpxchg8b to cmpxchg16b.  */
15913       char *p = mnemonicendp - 2;
15914       mnemonicendp = stpcpy (p, "16b");
15915       bytemode = o_mode;
15916     }
15917   else if ((prefixes & PREFIX_LOCK) != 0)
15918     {
15919       if (prefixes & PREFIX_REPZ)
15920         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15921       if (prefixes & PREFIX_REPNZ)
15922         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15923     }
15924
15925   OP_M (bytemode, sizeflag);
15926 }
15927
15928 static void
15929 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15930 {
15931   const char **names;
15932
15933   if (need_vex)
15934     {
15935       switch (vex.length)
15936         {
15937         case 128:
15938           names = names_xmm;
15939           break;
15940         case 256:
15941           names = names_ymm;
15942           break;
15943         default:
15944           abort ();
15945         }
15946     }
15947   else
15948     names = names_xmm;
15949   oappend (names[reg]);
15950 }
15951
15952 static void
15953 CRC32_Fixup (int bytemode, int sizeflag)
15954 {
15955   /* Add proper suffix to "crc32".  */
15956   char *p = mnemonicendp;
15957
15958   switch (bytemode)
15959     {
15960     case b_mode:
15961       if (intel_syntax)
15962         goto skip;
15963
15964       *p++ = 'b';
15965       break;
15966     case v_mode:
15967       if (intel_syntax)
15968         goto skip;
15969
15970       USED_REX (REX_W);
15971       if (rex & REX_W)
15972         *p++ = 'q';
15973       else
15974         {
15975           if (sizeflag & DFLAG)
15976             *p++ = 'l';
15977           else
15978             *p++ = 'w';
15979           used_prefixes |= (prefixes & PREFIX_DATA);
15980         }
15981       break;
15982     default:
15983       oappend (INTERNAL_DISASSEMBLER_ERROR);
15984       break;
15985     }
15986   mnemonicendp = p;
15987   *p = '\0';
15988
15989 skip:
15990   if (modrm.mod == 3)
15991     {
15992       int add;
15993
15994       /* Skip mod/rm byte.  */
15995       MODRM_CHECK;
15996       codep++;
15997
15998       USED_REX (REX_B);
15999       add = (rex & REX_B) ? 8 : 0;
16000       if (bytemode == b_mode)
16001         {
16002           USED_REX (0);
16003           if (rex)
16004             oappend (names8rex[modrm.rm + add]);
16005           else
16006             oappend (names8[modrm.rm + add]);
16007         }
16008       else
16009         {
16010           USED_REX (REX_W);
16011           if (rex & REX_W)
16012             oappend (names64[modrm.rm + add]);
16013           else if ((prefixes & PREFIX_DATA))
16014             oappend (names16[modrm.rm + add]);
16015           else
16016             oappend (names32[modrm.rm + add]);
16017         }
16018     }
16019   else
16020     OP_E (bytemode, sizeflag);
16021 }
16022
16023 static void
16024 FXSAVE_Fixup (int bytemode, int sizeflag)
16025 {
16026   /* Add proper suffix to "fxsave" and "fxrstor".  */
16027   USED_REX (REX_W);
16028   if (rex & REX_W)
16029     {
16030       char *p = mnemonicendp;
16031       *p++ = '6';
16032       *p++ = '4';
16033       *p = '\0';
16034       mnemonicendp = p;
16035     }
16036   OP_M (bytemode, sizeflag);
16037 }
16038
16039 /* Display the destination register operand for instructions with
16040    VEX. */
16041
16042 static void
16043 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16044 {
16045   int reg;
16046   const char **names;
16047
16048   if (!need_vex)
16049     abort ();
16050
16051   if (!need_vex_reg)
16052     return;
16053
16054   reg = vex.register_specifier;
16055   if (vex.evex)
16056     {
16057       if (!vex.v)
16058         reg += 16;
16059     }
16060
16061   if (bytemode == vex_scalar_mode)
16062     {
16063       oappend (names_xmm[reg]);
16064       return;
16065     }
16066
16067   switch (vex.length)
16068     {
16069     case 128:
16070       switch (bytemode)
16071         {
16072         case vex_mode:
16073         case vex128_mode:
16074         case vex_vsib_q_w_dq_mode:
16075           names = names_xmm;
16076           break;
16077         case dq_mode:
16078           if (vex.w)
16079             names = names64;
16080           else
16081             names = names32;
16082           break;
16083         case mask_mode:
16084           names = names_mask;
16085           break;
16086         default:
16087           abort ();
16088           return;
16089         }
16090       break;
16091     case 256:
16092       switch (bytemode)
16093         {
16094         case vex_mode:
16095         case vex256_mode:
16096           names = names_ymm;
16097           break;
16098         case vex_vsib_q_w_dq_mode:
16099           names = vex.w ? names_ymm : names_xmm;
16100           break;
16101         case mask_mode:
16102           names = names_mask;
16103           break;
16104         default:
16105           abort ();
16106           return;
16107         }
16108       break;
16109     case 512:
16110       names = names_zmm;
16111       break;
16112     default:
16113       abort ();
16114       break;
16115     }
16116   oappend (names[reg]);
16117 }
16118
16119 /* Get the VEX immediate byte without moving codep.  */
16120
16121 static unsigned char
16122 get_vex_imm8 (int sizeflag, int opnum)
16123 {
16124   int bytes_before_imm = 0;
16125
16126   if (modrm.mod != 3)
16127     {
16128       /* There are SIB/displacement bytes.  */
16129       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16130         {
16131           /* 32/64 bit address mode */
16132           int base = modrm.rm;
16133
16134           /* Check SIB byte.  */
16135           if (base == 4)
16136             {
16137               FETCH_DATA (the_info, codep + 1);
16138               base = *codep & 7;
16139               /* When decoding the third source, don't increase
16140                  bytes_before_imm as this has already been incremented
16141                  by one in OP_E_memory while decoding the second
16142                  source operand.  */
16143               if (opnum == 0)
16144                 bytes_before_imm++;
16145             }
16146
16147           /* Don't increase bytes_before_imm when decoding the third source,
16148              it has already been incremented by OP_E_memory while decoding
16149              the second source operand.  */
16150           if (opnum == 0)
16151             {
16152               switch (modrm.mod)
16153                 {
16154                   case 0:
16155                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16156                        SIB == 5, there is a 4 byte displacement.  */
16157                     if (base != 5)
16158                       /* No displacement. */
16159                       break;
16160                   case 2:
16161                     /* 4 byte displacement.  */
16162                     bytes_before_imm += 4;
16163                     break;
16164                   case 1:
16165                     /* 1 byte displacement.  */
16166                     bytes_before_imm++;
16167                     break;
16168                 }
16169             }
16170         }
16171       else
16172         {
16173           /* 16 bit address mode */
16174           /* Don't increase bytes_before_imm when decoding the third source,
16175              it has already been incremented by OP_E_memory while decoding
16176              the second source operand.  */
16177           if (opnum == 0)
16178             {
16179               switch (modrm.mod)
16180                 {
16181                 case 0:
16182                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16183                   if (modrm.rm != 6)
16184                     /* No displacement. */
16185                     break;
16186                 case 2:
16187                   /* 2 byte displacement.  */
16188                   bytes_before_imm += 2;
16189                   break;
16190                 case 1:
16191                   /* 1 byte displacement: when decoding the third source,
16192                      don't increase bytes_before_imm as this has already
16193                      been incremented by one in OP_E_memory while decoding
16194                      the second source operand.  */
16195                   if (opnum == 0)
16196                     bytes_before_imm++;
16197
16198                   break;
16199                 }
16200             }
16201         }
16202     }
16203
16204   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16205   return codep [bytes_before_imm];
16206 }
16207
16208 static void
16209 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16210 {
16211   const char **names;
16212
16213   if (reg == -1 && modrm.mod != 3)
16214     {
16215       OP_E_memory (bytemode, sizeflag);
16216       return;
16217     }
16218   else
16219     {
16220       if (reg == -1)
16221         {
16222           reg = modrm.rm;
16223           USED_REX (REX_B);
16224           if (rex & REX_B)
16225             reg += 8;
16226         }
16227       else if (reg > 7 && address_mode != mode_64bit)
16228         BadOp ();
16229     }
16230
16231   switch (vex.length)
16232     {
16233     case 128:
16234       names = names_xmm;
16235       break;
16236     case 256:
16237       names = names_ymm;
16238       break;
16239     default:
16240       abort ();
16241     }
16242   oappend (names[reg]);
16243 }
16244
16245 static void
16246 OP_EX_VexImmW (int bytemode, int sizeflag)
16247 {
16248   int reg = -1;
16249   static unsigned char vex_imm8;
16250
16251   if (vex_w_done == 0)
16252     {
16253       vex_w_done = 1;
16254
16255       /* Skip mod/rm byte.  */
16256       MODRM_CHECK;
16257       codep++;
16258
16259       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16260
16261       if (vex.w)
16262           reg = vex_imm8 >> 4;
16263
16264       OP_EX_VexReg (bytemode, sizeflag, reg);
16265     }
16266   else if (vex_w_done == 1)
16267     {
16268       vex_w_done = 2;
16269
16270       if (!vex.w)
16271           reg = vex_imm8 >> 4;
16272
16273       OP_EX_VexReg (bytemode, sizeflag, reg);
16274     }
16275   else
16276     {
16277       /* Output the imm8 directly.  */
16278       scratchbuf[0] = '$';
16279       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16280       oappend_maybe_intel (scratchbuf);
16281       scratchbuf[0] = '\0';
16282       codep++;
16283     }
16284 }
16285
16286 static void
16287 OP_Vex_2src (int bytemode, int sizeflag)
16288 {
16289   if (modrm.mod == 3)
16290     {
16291       int reg = modrm.rm;
16292       USED_REX (REX_B);
16293       if (rex & REX_B)
16294         reg += 8;
16295       oappend (names_xmm[reg]);
16296     }
16297   else
16298     {
16299       if (intel_syntax
16300           && (bytemode == v_mode || bytemode == v_swap_mode))
16301         {
16302           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16303           used_prefixes |= (prefixes & PREFIX_DATA);
16304         }
16305       OP_E (bytemode, sizeflag);
16306     }
16307 }
16308
16309 static void
16310 OP_Vex_2src_1 (int bytemode, int sizeflag)
16311 {
16312   if (modrm.mod == 3)
16313     {
16314       /* Skip mod/rm byte.   */
16315       MODRM_CHECK;
16316       codep++;
16317     }
16318
16319   if (vex.w)
16320     oappend (names_xmm[vex.register_specifier]);
16321   else
16322     OP_Vex_2src (bytemode, sizeflag);
16323 }
16324
16325 static void
16326 OP_Vex_2src_2 (int bytemode, int sizeflag)
16327 {
16328   if (vex.w)
16329     OP_Vex_2src (bytemode, sizeflag);
16330   else
16331     oappend (names_xmm[vex.register_specifier]);
16332 }
16333
16334 static void
16335 OP_EX_VexW (int bytemode, int sizeflag)
16336 {
16337   int reg = -1;
16338
16339   if (!vex_w_done)
16340     {
16341       vex_w_done = 1;
16342
16343       /* Skip mod/rm byte.  */
16344       MODRM_CHECK;
16345       codep++;
16346
16347       if (vex.w)
16348         reg = get_vex_imm8 (sizeflag, 0) >> 4;
16349     }
16350   else
16351     {
16352       if (!vex.w)
16353         reg = get_vex_imm8 (sizeflag, 1) >> 4;
16354     }
16355
16356   OP_EX_VexReg (bytemode, sizeflag, reg);
16357 }
16358
16359 static void
16360 VEXI4_Fixup (int bytemode ATTRIBUTE_UNUSED,
16361              int sizeflag ATTRIBUTE_UNUSED)
16362 {
16363   /* Skip the immediate byte and check for invalid bits.  */
16364   FETCH_DATA (the_info, codep + 1);
16365   if (*codep++ & 0xf)
16366     BadOp ();
16367 }
16368
16369 static void
16370 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16371 {
16372   int reg;
16373   const char **names;
16374
16375   FETCH_DATA (the_info, codep + 1);
16376   reg = *codep++;
16377
16378   if (bytemode != x_mode)
16379     abort ();
16380
16381   if (reg & 0xf)
16382       BadOp ();
16383
16384   reg >>= 4;
16385   if (reg > 7 && address_mode != mode_64bit)
16386     BadOp ();
16387
16388   switch (vex.length)
16389     {
16390     case 128:
16391       names = names_xmm;
16392       break;
16393     case 256:
16394       names = names_ymm;
16395       break;
16396     default:
16397       abort ();
16398     }
16399   oappend (names[reg]);
16400 }
16401
16402 static void
16403 OP_XMM_VexW (int bytemode, int sizeflag)
16404 {
16405   /* Turn off the REX.W bit since it is used for swapping operands
16406      now.  */
16407   rex &= ~REX_W;
16408   OP_XMM (bytemode, sizeflag);
16409 }
16410
16411 static void
16412 OP_EX_Vex (int bytemode, int sizeflag)
16413 {
16414   if (modrm.mod != 3)
16415     {
16416       if (vex.register_specifier != 0)
16417         BadOp ();
16418       need_vex_reg = 0;
16419     }
16420   OP_EX (bytemode, sizeflag);
16421 }
16422
16423 static void
16424 OP_XMM_Vex (int bytemode, int sizeflag)
16425 {
16426   if (modrm.mod != 3)
16427     {
16428       if (vex.register_specifier != 0)
16429         BadOp ();
16430       need_vex_reg = 0;
16431     }
16432   OP_XMM (bytemode, sizeflag);
16433 }
16434
16435 static void
16436 VZERO_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16437 {
16438   switch (vex.length)
16439     {
16440     case 128:
16441       mnemonicendp = stpcpy (obuf, "vzeroupper");
16442       break;
16443     case 256:
16444       mnemonicendp = stpcpy (obuf, "vzeroall");
16445       break;
16446     default:
16447       abort ();
16448     }
16449 }
16450
16451 static struct op vex_cmp_op[] =
16452 {
16453   { STRING_COMMA_LEN ("eq") },
16454   { STRING_COMMA_LEN ("lt") },
16455   { STRING_COMMA_LEN ("le") },
16456   { STRING_COMMA_LEN ("unord") },
16457   { STRING_COMMA_LEN ("neq") },
16458   { STRING_COMMA_LEN ("nlt") },
16459   { STRING_COMMA_LEN ("nle") },
16460   { STRING_COMMA_LEN ("ord") },
16461   { STRING_COMMA_LEN ("eq_uq") },
16462   { STRING_COMMA_LEN ("nge") },
16463   { STRING_COMMA_LEN ("ngt") },
16464   { STRING_COMMA_LEN ("false") },
16465   { STRING_COMMA_LEN ("neq_oq") },
16466   { STRING_COMMA_LEN ("ge") },
16467   { STRING_COMMA_LEN ("gt") },
16468   { STRING_COMMA_LEN ("true") },
16469   { STRING_COMMA_LEN ("eq_os") },
16470   { STRING_COMMA_LEN ("lt_oq") },
16471   { STRING_COMMA_LEN ("le_oq") },
16472   { STRING_COMMA_LEN ("unord_s") },
16473   { STRING_COMMA_LEN ("neq_us") },
16474   { STRING_COMMA_LEN ("nlt_uq") },
16475   { STRING_COMMA_LEN ("nle_uq") },
16476   { STRING_COMMA_LEN ("ord_s") },
16477   { STRING_COMMA_LEN ("eq_us") },
16478   { STRING_COMMA_LEN ("nge_uq") },
16479   { STRING_COMMA_LEN ("ngt_uq") },
16480   { STRING_COMMA_LEN ("false_os") },
16481   { STRING_COMMA_LEN ("neq_os") },
16482   { STRING_COMMA_LEN ("ge_oq") },
16483   { STRING_COMMA_LEN ("gt_oq") },
16484   { STRING_COMMA_LEN ("true_us") },
16485 };
16486
16487 static void
16488 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16489 {
16490   unsigned int cmp_type;
16491
16492   FETCH_DATA (the_info, codep + 1);
16493   cmp_type = *codep++ & 0xff;
16494   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16495     {
16496       char suffix [3];
16497       char *p = mnemonicendp - 2;
16498       suffix[0] = p[0];
16499       suffix[1] = p[1];
16500       suffix[2] = '\0';
16501       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16502       mnemonicendp += vex_cmp_op[cmp_type].len;
16503     }
16504   else
16505     {
16506       /* We have a reserved extension byte.  Output it directly.  */
16507       scratchbuf[0] = '$';
16508       print_operand_value (scratchbuf + 1, 1, cmp_type);
16509       oappend_maybe_intel (scratchbuf);
16510       scratchbuf[0] = '\0';
16511     }
16512 }
16513
16514 static void
16515 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16516              int sizeflag ATTRIBUTE_UNUSED)
16517 {
16518   unsigned int cmp_type;
16519
16520   if (!vex.evex)
16521     abort ();
16522
16523   FETCH_DATA (the_info, codep + 1);
16524   cmp_type = *codep++ & 0xff;
16525   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16526      If it's the case, print suffix, otherwise - print the immediate.  */
16527   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16528       && cmp_type != 3
16529       && cmp_type != 7)
16530     {
16531       char suffix [3];
16532       char *p = mnemonicendp - 2;
16533
16534       /* vpcmp* can have both one- and two-lettered suffix.  */
16535       if (p[0] == 'p')
16536         {
16537           p++;
16538           suffix[0] = p[0];
16539           suffix[1] = '\0';
16540         }
16541       else
16542         {
16543           suffix[0] = p[0];
16544           suffix[1] = p[1];
16545           suffix[2] = '\0';
16546         }
16547
16548       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16549       mnemonicendp += simd_cmp_op[cmp_type].len;
16550     }
16551   else
16552     {
16553       /* We have a reserved extension byte.  Output it directly.  */
16554       scratchbuf[0] = '$';
16555       print_operand_value (scratchbuf + 1, 1, cmp_type);
16556       oappend_maybe_intel (scratchbuf);
16557       scratchbuf[0] = '\0';
16558     }
16559 }
16560
16561 static const struct op pclmul_op[] =
16562 {
16563   { STRING_COMMA_LEN ("lql") },
16564   { STRING_COMMA_LEN ("hql") },
16565   { STRING_COMMA_LEN ("lqh") },
16566   { STRING_COMMA_LEN ("hqh") }
16567 };
16568
16569 static void
16570 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16571               int sizeflag ATTRIBUTE_UNUSED)
16572 {
16573   unsigned int pclmul_type;
16574
16575   FETCH_DATA (the_info, codep + 1);
16576   pclmul_type = *codep++ & 0xff;
16577   switch (pclmul_type)
16578     {
16579     case 0x10:
16580       pclmul_type = 2;
16581       break;
16582     case 0x11:
16583       pclmul_type = 3;
16584       break;
16585     default:
16586       break;
16587     }
16588   if (pclmul_type < ARRAY_SIZE (pclmul_op))
16589     {
16590       char suffix [4];
16591       char *p = mnemonicendp - 3;
16592       suffix[0] = p[0];
16593       suffix[1] = p[1];
16594       suffix[2] = p[2];
16595       suffix[3] = '\0';
16596       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16597       mnemonicendp += pclmul_op[pclmul_type].len;
16598     }
16599   else
16600     {
16601       /* We have a reserved extension byte.  Output it directly.  */
16602       scratchbuf[0] = '$';
16603       print_operand_value (scratchbuf + 1, 1, pclmul_type);
16604       oappend_maybe_intel (scratchbuf);
16605       scratchbuf[0] = '\0';
16606     }
16607 }
16608
16609 static void
16610 MOVBE_Fixup (int bytemode, int sizeflag)
16611 {
16612   /* Add proper suffix to "movbe".  */
16613   char *p = mnemonicendp;
16614
16615   switch (bytemode)
16616     {
16617     case v_mode:
16618       if (intel_syntax)
16619         goto skip;
16620
16621       USED_REX (REX_W);
16622       if (sizeflag & SUFFIX_ALWAYS)
16623         {
16624           if (rex & REX_W)
16625             *p++ = 'q';
16626           else
16627             {
16628               if (sizeflag & DFLAG)
16629                 *p++ = 'l';
16630               else
16631                 *p++ = 'w';
16632               used_prefixes |= (prefixes & PREFIX_DATA);
16633             }
16634         }
16635       break;
16636     default:
16637       oappend (INTERNAL_DISASSEMBLER_ERROR);
16638       break;
16639     }
16640   mnemonicendp = p;
16641   *p = '\0';
16642
16643 skip:
16644   OP_M (bytemode, sizeflag);
16645 }
16646
16647 static void
16648 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16649 {
16650   int reg;
16651   const char **names;
16652
16653   /* Skip mod/rm byte.  */
16654   MODRM_CHECK;
16655   codep++;
16656
16657   if (vex.w)
16658     names = names64;
16659   else
16660     names = names32;
16661
16662   reg = modrm.rm;
16663   USED_REX (REX_B);
16664   if (rex & REX_B)
16665     reg += 8;
16666
16667   oappend (names[reg]);
16668 }
16669
16670 static void
16671 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16672 {
16673   const char **names;
16674
16675   if (vex.w)
16676     names = names64;
16677   else
16678     names = names32;
16679
16680   oappend (names[vex.register_specifier]);
16681 }
16682
16683 static void
16684 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16685 {
16686   if (!vex.evex
16687       || bytemode != mask_mode)
16688     abort ();
16689
16690   USED_REX (REX_R);
16691   if ((rex & REX_R) != 0 || !vex.r)
16692     {
16693       BadOp ();
16694       return;
16695     }
16696
16697   oappend (names_mask [modrm.reg]);
16698 }
16699
16700 static void
16701 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16702 {
16703   if (!vex.evex
16704       || (bytemode != evex_rounding_mode
16705           && bytemode != evex_sae_mode))
16706     abort ();
16707   if (modrm.mod == 3 && vex.b)
16708     switch (bytemode)
16709       {
16710       case evex_rounding_mode:
16711         oappend (names_rounding[vex.ll]);
16712         break;
16713       case evex_sae_mode:
16714         oappend ("{sae}");
16715         break;
16716       default:
16717         break;
16718       }
16719 }