Replace "the the" with "the"
[external/binutils.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright (C) 1988-2019 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 "disassemble.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 VCMP_Fixup (int, int);
99 static void VPCMP_Fixup (int, int);
100 static void VPCOM_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void OP_Mwaitx (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 NOTRACK_Fixup (int, int);
113 static void HLE_Fixup1 (int, int);
114 static void HLE_Fixup2 (int, int);
115 static void HLE_Fixup3 (int, int);
116 static void CMPXCHG8B_Fixup (int, int);
117 static void XMM_Fixup (int, int);
118 static void CRC32_Fixup (int, int);
119 static void FXSAVE_Fixup (int, int);
120 static void PCMPESTR_Fixup (int, int);
121 static void OP_LWPCB_E (int, int);
122 static void OP_LWP_E (int, int);
123 static void OP_Vex_2src_1 (int, int);
124 static void OP_Vex_2src_2 (int, int);
125
126 static void MOVBE_Fixup (int, int);
127
128 static void OP_Mask (int, int);
129
130 struct dis_private {
131   /* Points to first byte not fetched.  */
132   bfd_byte *max_fetched;
133   bfd_byte the_buffer[MAX_MNEM_SIZE];
134   bfd_vma insn_start;
135   int orig_sizeflag;
136   OPCODES_SIGJMP_BUF bailout;
137 };
138
139 enum address_mode
140 {
141   mode_16bit,
142   mode_32bit,
143   mode_64bit
144 };
145
146 enum address_mode address_mode;
147
148 /* Flags for the prefixes for the current instruction.  See below.  */
149 static int prefixes;
150
151 /* REX prefix the current instruction.  See below.  */
152 static int rex;
153 /* Bits of REX we've already used.  */
154 static int rex_used;
155 /* REX bits in original REX prefix ignored.  */
156 static int rex_ignored;
157 /* Mark parts used in the REX prefix.  When we are testing for
158    empty prefix (for 8bit register REX extension), just mask it
159    out.  Otherwise test for REX bit is excuse for existence of REX
160    only in case value is nonzero.  */
161 #define USED_REX(value)                                 \
162   {                                                     \
163     if (value)                                          \
164       {                                                 \
165         if ((rex & value))                              \
166           rex_used |= (value) | REX_OPCODE;             \
167       }                                                 \
168     else                                                \
169       rex_used |= REX_OPCODE;                           \
170   }
171
172 /* Flags for prefixes which we somehow handled when printing the
173    current instruction.  */
174 static int used_prefixes;
175
176 /* Flags stored in PREFIXES.  */
177 #define PREFIX_REPZ 1
178 #define PREFIX_REPNZ 2
179 #define PREFIX_LOCK 4
180 #define PREFIX_CS 8
181 #define PREFIX_SS 0x10
182 #define PREFIX_DS 0x20
183 #define PREFIX_ES 0x40
184 #define PREFIX_FS 0x80
185 #define PREFIX_GS 0x100
186 #define PREFIX_DATA 0x200
187 #define PREFIX_ADDR 0x400
188 #define PREFIX_FWAIT 0x800
189
190 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
191    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
192    on error.  */
193 #define FETCH_DATA(info, addr) \
194   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
195    ? 1 : fetch_data ((info), (addr)))
196
197 static int
198 fetch_data (struct disassemble_info *info, bfd_byte *addr)
199 {
200   int status;
201   struct dis_private *priv = (struct dis_private *) info->private_data;
202   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
203
204   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
205     status = (*info->read_memory_func) (start,
206                                         priv->max_fetched,
207                                         addr - priv->max_fetched,
208                                         info);
209   else
210     status = -1;
211   if (status != 0)
212     {
213       /* If we did manage to read at least one byte, then
214          print_insn_i386 will do something sensible.  Otherwise, print
215          an error.  We do that here because this is where we know
216          STATUS.  */
217       if (priv->max_fetched == priv->the_buffer)
218         (*info->memory_error_func) (status, start, info);
219       OPCODES_SIGLONGJMP (priv->bailout, 1);
220     }
221   else
222     priv->max_fetched = addr;
223   return 1;
224 }
225
226 /* Possible values for prefix requirement.  */
227 #define PREFIX_IGNORED_SHIFT    16
228 #define PREFIX_IGNORED_REPZ     (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_REPNZ    (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_DATA     (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_ADDR     (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
232 #define PREFIX_IGNORED_LOCK     (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
233
234 /* Opcode prefixes.  */
235 #define PREFIX_OPCODE           (PREFIX_REPZ \
236                                  | PREFIX_REPNZ \
237                                  | PREFIX_DATA)
238
239 /* Prefixes ignored.  */
240 #define PREFIX_IGNORED          (PREFIX_IGNORED_REPZ \
241                                  | PREFIX_IGNORED_REPNZ \
242                                  | PREFIX_IGNORED_DATA)
243
244 #define XX { NULL, 0 }
245 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
246
247 #define Eb { OP_E, b_mode }
248 #define Ebnd { OP_E, bnd_mode }
249 #define EbS { OP_E, b_swap_mode }
250 #define EbndS { OP_E, bnd_swap_mode }
251 #define Ev { OP_E, v_mode }
252 #define Eva { OP_E, va_mode }
253 #define Ev_bnd { OP_E, v_bnd_mode }
254 #define EvS { OP_E, v_swap_mode }
255 #define Ed { OP_E, d_mode }
256 #define Edq { OP_E, dq_mode }
257 #define Edqw { OP_E, dqw_mode }
258 #define Edqb { OP_E, dqb_mode }
259 #define Edb { OP_E, db_mode }
260 #define Edw { OP_E, dw_mode }
261 #define Edqd { OP_E, dqd_mode }
262 #define Edqa { OP_E, dqa_mode }
263 #define Eq { OP_E, q_mode }
264 #define indirEv { OP_indirE, indir_v_mode }
265 #define indirEp { OP_indirE, f_mode }
266 #define stackEv { OP_E, stack_v_mode }
267 #define Em { OP_E, m_mode }
268 #define Ew { OP_E, w_mode }
269 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
270 #define Ma { OP_M, a_mode }
271 #define Mb { OP_M, b_mode }
272 #define Md { OP_M, d_mode }
273 #define Mo { OP_M, o_mode }
274 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
275 #define Mq { OP_M, q_mode }
276 #define Mv_bnd { OP_M, v_bndmk_mode }
277 #define Mx { OP_M, x_mode }
278 #define Mxmm { OP_M, xmm_mode }
279 #define Gb { OP_G, b_mode }
280 #define Gbnd { OP_G, bnd_mode }
281 #define Gv { OP_G, v_mode }
282 #define Gd { OP_G, d_mode }
283 #define Gdq { OP_G, dq_mode }
284 #define Gm { OP_G, m_mode }
285 #define Gva { OP_G, va_mode }
286 #define Gw { OP_G, w_mode }
287 #define Rd { OP_R, d_mode }
288 #define Rdq { OP_R, dq_mode }
289 #define Rm { OP_R, m_mode }
290 #define Ib { OP_I, b_mode }
291 #define sIb { OP_sI, b_mode }   /* sign extened byte */
292 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
293 #define Iv { OP_I, v_mode }
294 #define sIv { OP_sI, v_mode }
295 #define Iq { OP_I, q_mode }
296 #define Iv64 { OP_I64, v_mode }
297 #define Iw { OP_I, w_mode }
298 #define I1 { OP_I, const_1_mode }
299 #define Jb { OP_J, b_mode }
300 #define Jv { OP_J, v_mode }
301 #define Cm { OP_C, m_mode }
302 #define Dm { OP_D, m_mode }
303 #define Td { OP_T, d_mode }
304 #define Skip_MODRM { OP_Skip_MODRM, 0 }
305
306 #define RMeAX { OP_REG, eAX_reg }
307 #define RMeBX { OP_REG, eBX_reg }
308 #define RMeCX { OP_REG, eCX_reg }
309 #define RMeDX { OP_REG, eDX_reg }
310 #define RMeSP { OP_REG, eSP_reg }
311 #define RMeBP { OP_REG, eBP_reg }
312 #define RMeSI { OP_REG, eSI_reg }
313 #define RMeDI { OP_REG, eDI_reg }
314 #define RMrAX { OP_REG, rAX_reg }
315 #define RMrBX { OP_REG, rBX_reg }
316 #define RMrCX { OP_REG, rCX_reg }
317 #define RMrDX { OP_REG, rDX_reg }
318 #define RMrSP { OP_REG, rSP_reg }
319 #define RMrBP { OP_REG, rBP_reg }
320 #define RMrSI { OP_REG, rSI_reg }
321 #define RMrDI { OP_REG, rDI_reg }
322 #define RMAL { OP_REG, al_reg }
323 #define RMCL { OP_REG, cl_reg }
324 #define RMDL { OP_REG, dl_reg }
325 #define RMBL { OP_REG, bl_reg }
326 #define RMAH { OP_REG, ah_reg }
327 #define RMCH { OP_REG, ch_reg }
328 #define RMDH { OP_REG, dh_reg }
329 #define RMBH { OP_REG, bh_reg }
330 #define RMAX { OP_REG, ax_reg }
331 #define RMDX { OP_REG, dx_reg }
332
333 #define eAX { OP_IMREG, eAX_reg }
334 #define eBX { OP_IMREG, eBX_reg }
335 #define eCX { OP_IMREG, eCX_reg }
336 #define eDX { OP_IMREG, eDX_reg }
337 #define eSP { OP_IMREG, eSP_reg }
338 #define eBP { OP_IMREG, eBP_reg }
339 #define eSI { OP_IMREG, eSI_reg }
340 #define eDI { OP_IMREG, eDI_reg }
341 #define AL { OP_IMREG, al_reg }
342 #define CL { OP_IMREG, cl_reg }
343 #define DL { OP_IMREG, dl_reg }
344 #define BL { OP_IMREG, bl_reg }
345 #define AH { OP_IMREG, ah_reg }
346 #define CH { OP_IMREG, ch_reg }
347 #define DH { OP_IMREG, dh_reg }
348 #define BH { OP_IMREG, bh_reg }
349 #define AX { OP_IMREG, ax_reg }
350 #define DX { OP_IMREG, dx_reg }
351 #define zAX { OP_IMREG, z_mode_ax_reg }
352 #define indirDX { OP_IMREG, indir_dx_reg }
353
354 #define Sw { OP_SEG, w_mode }
355 #define Sv { OP_SEG, v_mode }
356 #define Ap { OP_DIR, 0 }
357 #define Ob { OP_OFF64, b_mode }
358 #define Ov { OP_OFF64, v_mode }
359 #define Xb { OP_DSreg, eSI_reg }
360 #define Xv { OP_DSreg, eSI_reg }
361 #define Xz { OP_DSreg, eSI_reg }
362 #define Yb { OP_ESreg, eDI_reg }
363 #define Yv { OP_ESreg, eDI_reg }
364 #define DSBX { OP_DSreg, eBX_reg }
365
366 #define es { OP_REG, es_reg }
367 #define ss { OP_REG, ss_reg }
368 #define cs { OP_REG, cs_reg }
369 #define ds { OP_REG, ds_reg }
370 #define fs { OP_REG, fs_reg }
371 #define gs { OP_REG, gs_reg }
372
373 #define MX { OP_MMX, 0 }
374 #define XM { OP_XMM, 0 }
375 #define XMScalar { OP_XMM, scalar_mode }
376 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
377 #define XMM { OP_XMM, xmm_mode }
378 #define XMxmmq { OP_XMM, xmmq_mode }
379 #define EM { OP_EM, v_mode }
380 #define EMS { OP_EM, v_swap_mode }
381 #define EMd { OP_EM, d_mode }
382 #define EMx { OP_EM, x_mode }
383 #define EXbScalar { OP_EX, b_scalar_mode }
384 #define EXw { OP_EX, w_mode }
385 #define EXwScalar { OP_EX, w_scalar_mode }
386 #define EXd { OP_EX, d_mode }
387 #define EXdScalar { OP_EX, d_scalar_mode }
388 #define EXdS { OP_EX, d_swap_mode }
389 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
390 #define EXq { OP_EX, q_mode }
391 #define EXqScalar { OP_EX, q_scalar_mode }
392 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
393 #define EXqS { OP_EX, q_swap_mode }
394 #define EXx { OP_EX, x_mode }
395 #define EXxS { OP_EX, x_swap_mode }
396 #define EXxmm { OP_EX, xmm_mode }
397 #define EXymm { OP_EX, ymm_mode }
398 #define EXxmmq { OP_EX, xmmq_mode }
399 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
400 #define EXxmm_mb { OP_EX, xmm_mb_mode }
401 #define EXxmm_mw { OP_EX, xmm_mw_mode }
402 #define EXxmm_md { OP_EX, xmm_md_mode }
403 #define EXxmm_mq { OP_EX, xmm_mq_mode }
404 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
405 #define EXxmmdw { OP_EX, xmmdw_mode }
406 #define EXxmmqd { OP_EX, xmmqd_mode }
407 #define EXymmq { OP_EX, ymmq_mode }
408 #define EXVexWdq { OP_EX, vex_w_dq_mode }
409 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
410 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
411 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
412 #define MS { OP_MS, v_mode }
413 #define XS { OP_XS, v_mode }
414 #define EMCq { OP_EMC, q_mode }
415 #define MXC { OP_MXC, 0 }
416 #define OPSUF { OP_3DNowSuffix, 0 }
417 #define CMP { CMP_Fixup, 0 }
418 #define XMM0 { XMM_Fixup, 0 }
419 #define FXSAVE { FXSAVE_Fixup, 0 }
420 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
421 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
422
423 #define Vex { OP_VEX, vex_mode }
424 #define VexScalar { OP_VEX, vex_scalar_mode }
425 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
426 #define Vex128 { OP_VEX, vex128_mode }
427 #define Vex256 { OP_VEX, vex256_mode }
428 #define VexGdq { OP_VEX, dq_mode }
429 #define EXdVex { OP_EX_Vex, d_mode }
430 #define EXdVexS { OP_EX_Vex, d_swap_mode }
431 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
432 #define EXqVex { OP_EX_Vex, q_mode }
433 #define EXqVexS { OP_EX_Vex, q_swap_mode }
434 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
435 #define EXVexW { OP_EX_VexW, x_mode }
436 #define EXdVexW { OP_EX_VexW, d_mode }
437 #define EXqVexW { OP_EX_VexW, q_mode }
438 #define EXVexImmW { OP_EX_VexImmW, x_mode }
439 #define XMVex { OP_XMM_Vex, 0 }
440 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
441 #define XMVexW { OP_XMM_VexW, 0 }
442 #define XMVexI4 { OP_REG_VexI4, x_mode }
443 #define PCLMUL { PCLMUL_Fixup, 0 }
444 #define VCMP { VCMP_Fixup, 0 }
445 #define VPCMP { VPCMP_Fixup, 0 }
446 #define VPCOM { VPCOM_Fixup, 0 }
447
448 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
449 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
450 #define EXxEVexS { OP_Rounding, evex_sae_mode }
451
452 #define XMask { OP_Mask, mask_mode }
453 #define MaskG { OP_G, mask_mode }
454 #define MaskE { OP_E, mask_mode }
455 #define MaskBDE { OP_E, mask_bd_mode }
456 #define MaskR { OP_R, mask_mode }
457 #define MaskVex { OP_VEX, mask_mode }
458
459 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
460 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
461 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
462 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
463
464 /* Used handle "rep" prefix for string instructions.  */
465 #define Xbr { REP_Fixup, eSI_reg }
466 #define Xvr { REP_Fixup, eSI_reg }
467 #define Ybr { REP_Fixup, eDI_reg }
468 #define Yvr { REP_Fixup, eDI_reg }
469 #define Yzr { REP_Fixup, eDI_reg }
470 #define indirDXr { REP_Fixup, indir_dx_reg }
471 #define ALr { REP_Fixup, al_reg }
472 #define eAXr { REP_Fixup, eAX_reg }
473
474 /* Used handle HLE prefix for lockable instructions.  */
475 #define Ebh1 { HLE_Fixup1, b_mode }
476 #define Evh1 { HLE_Fixup1, v_mode }
477 #define Ebh2 { HLE_Fixup2, b_mode }
478 #define Evh2 { HLE_Fixup2, v_mode }
479 #define Ebh3 { HLE_Fixup3, b_mode }
480 #define Evh3 { HLE_Fixup3, v_mode }
481
482 #define BND { BND_Fixup, 0 }
483 #define NOTRACK { NOTRACK_Fixup, 0 }
484
485 #define cond_jump_flag { NULL, cond_jump_mode }
486 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
487
488 /* bits in sizeflag */
489 #define SUFFIX_ALWAYS 4
490 #define AFLAG 2
491 #define DFLAG 1
492
493 enum
494 {
495   /* byte operand */
496   b_mode = 1,
497   /* byte operand with operand swapped */
498   b_swap_mode,
499   /* byte operand, sign extend like 'T' suffix */
500   b_T_mode,
501   /* operand size depends on prefixes */
502   v_mode,
503   /* operand size depends on prefixes with operand swapped */
504   v_swap_mode,
505   /* operand size depends on address prefix */
506   va_mode,
507   /* word operand */
508   w_mode,
509   /* double word operand  */
510   d_mode,
511   /* double word operand with operand swapped */
512   d_swap_mode,
513   /* quad word operand */
514   q_mode,
515   /* quad word operand with operand swapped */
516   q_swap_mode,
517   /* ten-byte operand */
518   t_mode,
519   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
520      broadcast enabled.  */
521   x_mode,
522   /* Similar to x_mode, but with different EVEX mem shifts.  */
523   evex_x_gscat_mode,
524   /* Similar to x_mode, but with disabled broadcast.  */
525   evex_x_nobcst_mode,
526   /* Similar to x_mode, but with operands swapped and disabled broadcast
527      in EVEX.  */
528   x_swap_mode,
529   /* 16-byte XMM operand */
530   xmm_mode,
531   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
532      memory operand (depending on vector length).  Broadcast isn't
533      allowed.  */
534   xmmq_mode,
535   /* Same as xmmq_mode, but broadcast is allowed.  */
536   evex_half_bcst_xmmq_mode,
537   /* XMM register or byte memory operand */
538   xmm_mb_mode,
539   /* XMM register or word memory operand */
540   xmm_mw_mode,
541   /* XMM register or double word memory operand */
542   xmm_md_mode,
543   /* XMM register or quad word memory operand */
544   xmm_mq_mode,
545   /* XMM register or double/quad word memory operand, depending on
546      VEX.W.  */
547   xmm_mdq_mode,
548   /* 16-byte XMM, word, double word or quad word operand.  */
549   xmmdw_mode,
550   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
551   xmmqd_mode,
552   /* 32-byte YMM operand */
553   ymm_mode,
554   /* quad word, ymmword or zmmword memory operand.  */
555   ymmq_mode,
556   /* 32-byte YMM or 16-byte word operand */
557   ymmxmm_mode,
558   /* d_mode in 32bit, q_mode in 64bit mode.  */
559   m_mode,
560   /* pair of v_mode operands */
561   a_mode,
562   cond_jump_mode,
563   loop_jcxz_mode,
564   v_bnd_mode,
565   /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
566   v_bndmk_mode,
567   /* operand size depends on REX prefixes.  */
568   dq_mode,
569   /* registers like dq_mode, memory like w_mode.  */
570   dqw_mode,
571   /* bounds operand */
572   bnd_mode,
573   /* bounds operand with operand swapped */
574   bnd_swap_mode,
575   /* 4- or 6-byte pointer operand */
576   f_mode,
577   const_1_mode,
578   /* v_mode for indirect branch opcodes.  */
579   indir_v_mode,
580   /* v_mode for stack-related opcodes.  */
581   stack_v_mode,
582   /* non-quad operand size depends on prefixes */
583   z_mode,
584   /* 16-byte operand */
585   o_mode,
586   /* registers like dq_mode, memory like b_mode.  */
587   dqb_mode,
588   /* registers like d_mode, memory like b_mode.  */
589   db_mode,
590   /* registers like d_mode, memory like w_mode.  */
591   dw_mode,
592   /* registers like dq_mode, memory like d_mode.  */
593   dqd_mode,
594   /* operand size depends on the W bit as well as address mode.  */
595   dqa_mode,
596   /* normal vex mode */
597   vex_mode,
598   /* 128bit vex mode */
599   vex128_mode,
600   /* 256bit vex mode */
601   vex256_mode,
602   /* operand size depends on the VEX.W bit.  */
603   vex_w_dq_mode,
604
605   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
606   vex_vsib_d_w_dq_mode,
607   /* Similar to vex_vsib_d_w_dq_mode, with smaller memory.  */
608   vex_vsib_d_w_d_mode,
609   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
610   vex_vsib_q_w_dq_mode,
611   /* Similar to vex_vsib_q_w_dq_mode, with smaller memory.  */
612   vex_vsib_q_w_d_mode,
613
614   /* scalar, ignore vector length.  */
615   scalar_mode,
616   /* like b_mode, ignore vector length.  */
617   b_scalar_mode,
618   /* like w_mode, ignore vector length.  */
619   w_scalar_mode,
620   /* like d_mode, ignore vector length.  */
621   d_scalar_mode,
622   /* like d_swap_mode, ignore vector length.  */
623   d_scalar_swap_mode,
624   /* like q_mode, ignore vector length.  */
625   q_scalar_mode,
626   /* like q_swap_mode, ignore vector length.  */
627   q_scalar_swap_mode,
628   /* like vex_mode, ignore vector length.  */
629   vex_scalar_mode,
630   /* like vex_w_dq_mode, ignore vector length.  */
631   vex_scalar_w_dq_mode,
632
633   /* Static rounding.  */
634   evex_rounding_mode,
635   /* Static rounding, 64-bit mode only.  */
636   evex_rounding_64_mode,
637   /* Supress all exceptions.  */
638   evex_sae_mode,
639
640   /* Mask register operand.  */
641   mask_mode,
642   /* Mask register operand.  */
643   mask_bd_mode,
644
645   es_reg,
646   cs_reg,
647   ss_reg,
648   ds_reg,
649   fs_reg,
650   gs_reg,
651
652   eAX_reg,
653   eCX_reg,
654   eDX_reg,
655   eBX_reg,
656   eSP_reg,
657   eBP_reg,
658   eSI_reg,
659   eDI_reg,
660
661   al_reg,
662   cl_reg,
663   dl_reg,
664   bl_reg,
665   ah_reg,
666   ch_reg,
667   dh_reg,
668   bh_reg,
669
670   ax_reg,
671   cx_reg,
672   dx_reg,
673   bx_reg,
674   sp_reg,
675   bp_reg,
676   si_reg,
677   di_reg,
678
679   rAX_reg,
680   rCX_reg,
681   rDX_reg,
682   rBX_reg,
683   rSP_reg,
684   rBP_reg,
685   rSI_reg,
686   rDI_reg,
687
688   z_mode_ax_reg,
689   indir_dx_reg
690 };
691
692 enum
693 {
694   FLOATCODE = 1,
695   USE_REG_TABLE,
696   USE_MOD_TABLE,
697   USE_RM_TABLE,
698   USE_PREFIX_TABLE,
699   USE_X86_64_TABLE,
700   USE_3BYTE_TABLE,
701   USE_XOP_8F_TABLE,
702   USE_VEX_C4_TABLE,
703   USE_VEX_C5_TABLE,
704   USE_VEX_LEN_TABLE,
705   USE_VEX_W_TABLE,
706   USE_EVEX_TABLE,
707   USE_EVEX_LEN_TABLE
708 };
709
710 #define FLOAT                   NULL, { { NULL, FLOATCODE } }, 0
711
712 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
713 #define DIS386_PREFIX(T, I, P)          NULL, { { NULL, (T)}, { NULL,  (I) } }, P
714 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
715 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
716 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
717 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
718 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
719 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
720 #define THREE_BYTE_TABLE_PREFIX(I, P)   DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
721 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
722 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
723 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
724 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
725 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
726 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
727 #define EVEX_LEN_TABLE(I)       DIS386 (USE_EVEX_LEN_TABLE, (I))
728
729 enum
730 {
731   REG_80 = 0,
732   REG_81,
733   REG_83,
734   REG_8F,
735   REG_C0,
736   REG_C1,
737   REG_C6,
738   REG_C7,
739   REG_D0,
740   REG_D1,
741   REG_D2,
742   REG_D3,
743   REG_F6,
744   REG_F7,
745   REG_FE,
746   REG_FF,
747   REG_0F00,
748   REG_0F01,
749   REG_0F0D,
750   REG_0F18,
751   REG_0F1C_MOD_0,
752   REG_0F1E_MOD_3,
753   REG_0F71,
754   REG_0F72,
755   REG_0F73,
756   REG_0FA6,
757   REG_0FA7,
758   REG_0FAE,
759   REG_0FBA,
760   REG_0FC7,
761   REG_VEX_0F71,
762   REG_VEX_0F72,
763   REG_VEX_0F73,
764   REG_VEX_0FAE,
765   REG_VEX_0F38F3,
766   REG_XOP_LWPCB,
767   REG_XOP_LWP,
768   REG_XOP_TBM_01,
769   REG_XOP_TBM_02,
770
771   REG_EVEX_0F71,
772   REG_EVEX_0F72,
773   REG_EVEX_0F73,
774   REG_EVEX_0F38C6,
775   REG_EVEX_0F38C7
776 };
777
778 enum
779 {
780   MOD_8D = 0,
781   MOD_C6_REG_7,
782   MOD_C7_REG_7,
783   MOD_FF_REG_3,
784   MOD_FF_REG_5,
785   MOD_0F01_REG_0,
786   MOD_0F01_REG_1,
787   MOD_0F01_REG_2,
788   MOD_0F01_REG_3,
789   MOD_0F01_REG_5,
790   MOD_0F01_REG_7,
791   MOD_0F12_PREFIX_0,
792   MOD_0F13,
793   MOD_0F16_PREFIX_0,
794   MOD_0F17,
795   MOD_0F18_REG_0,
796   MOD_0F18_REG_1,
797   MOD_0F18_REG_2,
798   MOD_0F18_REG_3,
799   MOD_0F18_REG_4,
800   MOD_0F18_REG_5,
801   MOD_0F18_REG_6,
802   MOD_0F18_REG_7,
803   MOD_0F1A_PREFIX_0,
804   MOD_0F1B_PREFIX_0,
805   MOD_0F1B_PREFIX_1,
806   MOD_0F1C_PREFIX_0,
807   MOD_0F1E_PREFIX_1,
808   MOD_0F24,
809   MOD_0F26,
810   MOD_0F2B_PREFIX_0,
811   MOD_0F2B_PREFIX_1,
812   MOD_0F2B_PREFIX_2,
813   MOD_0F2B_PREFIX_3,
814   MOD_0F51,
815   MOD_0F71_REG_2,
816   MOD_0F71_REG_4,
817   MOD_0F71_REG_6,
818   MOD_0F72_REG_2,
819   MOD_0F72_REG_4,
820   MOD_0F72_REG_6,
821   MOD_0F73_REG_2,
822   MOD_0F73_REG_3,
823   MOD_0F73_REG_6,
824   MOD_0F73_REG_7,
825   MOD_0FAE_REG_0,
826   MOD_0FAE_REG_1,
827   MOD_0FAE_REG_2,
828   MOD_0FAE_REG_3,
829   MOD_0FAE_REG_4,
830   MOD_0FAE_REG_5,
831   MOD_0FAE_REG_6,
832   MOD_0FAE_REG_7,
833   MOD_0FB2,
834   MOD_0FB4,
835   MOD_0FB5,
836   MOD_0FC3,
837   MOD_0FC7_REG_3,
838   MOD_0FC7_REG_4,
839   MOD_0FC7_REG_5,
840   MOD_0FC7_REG_6,
841   MOD_0FC7_REG_7,
842   MOD_0FD7,
843   MOD_0FE7_PREFIX_2,
844   MOD_0FF0_PREFIX_3,
845   MOD_0F382A_PREFIX_2,
846   MOD_0F38F5_PREFIX_2,
847   MOD_0F38F6_PREFIX_0,
848   MOD_0F38F8_PREFIX_2,
849   MOD_0F38F9_PREFIX_0,
850   MOD_62_32BIT,
851   MOD_C4_32BIT,
852   MOD_C5_32BIT,
853   MOD_VEX_0F12_PREFIX_0,
854   MOD_VEX_0F13,
855   MOD_VEX_0F16_PREFIX_0,
856   MOD_VEX_0F17,
857   MOD_VEX_0F2B,
858   MOD_VEX_W_0_0F41_P_0_LEN_1,
859   MOD_VEX_W_1_0F41_P_0_LEN_1,
860   MOD_VEX_W_0_0F41_P_2_LEN_1,
861   MOD_VEX_W_1_0F41_P_2_LEN_1,
862   MOD_VEX_W_0_0F42_P_0_LEN_1,
863   MOD_VEX_W_1_0F42_P_0_LEN_1,
864   MOD_VEX_W_0_0F42_P_2_LEN_1,
865   MOD_VEX_W_1_0F42_P_2_LEN_1,
866   MOD_VEX_W_0_0F44_P_0_LEN_1,
867   MOD_VEX_W_1_0F44_P_0_LEN_1,
868   MOD_VEX_W_0_0F44_P_2_LEN_1,
869   MOD_VEX_W_1_0F44_P_2_LEN_1,
870   MOD_VEX_W_0_0F45_P_0_LEN_1,
871   MOD_VEX_W_1_0F45_P_0_LEN_1,
872   MOD_VEX_W_0_0F45_P_2_LEN_1,
873   MOD_VEX_W_1_0F45_P_2_LEN_1,
874   MOD_VEX_W_0_0F46_P_0_LEN_1,
875   MOD_VEX_W_1_0F46_P_0_LEN_1,
876   MOD_VEX_W_0_0F46_P_2_LEN_1,
877   MOD_VEX_W_1_0F46_P_2_LEN_1,
878   MOD_VEX_W_0_0F47_P_0_LEN_1,
879   MOD_VEX_W_1_0F47_P_0_LEN_1,
880   MOD_VEX_W_0_0F47_P_2_LEN_1,
881   MOD_VEX_W_1_0F47_P_2_LEN_1,
882   MOD_VEX_W_0_0F4A_P_0_LEN_1,
883   MOD_VEX_W_1_0F4A_P_0_LEN_1,
884   MOD_VEX_W_0_0F4A_P_2_LEN_1,
885   MOD_VEX_W_1_0F4A_P_2_LEN_1,
886   MOD_VEX_W_0_0F4B_P_0_LEN_1,
887   MOD_VEX_W_1_0F4B_P_0_LEN_1,
888   MOD_VEX_W_0_0F4B_P_2_LEN_1,
889   MOD_VEX_0F50,
890   MOD_VEX_0F71_REG_2,
891   MOD_VEX_0F71_REG_4,
892   MOD_VEX_0F71_REG_6,
893   MOD_VEX_0F72_REG_2,
894   MOD_VEX_0F72_REG_4,
895   MOD_VEX_0F72_REG_6,
896   MOD_VEX_0F73_REG_2,
897   MOD_VEX_0F73_REG_3,
898   MOD_VEX_0F73_REG_6,
899   MOD_VEX_0F73_REG_7,
900   MOD_VEX_W_0_0F91_P_0_LEN_0,
901   MOD_VEX_W_1_0F91_P_0_LEN_0,
902   MOD_VEX_W_0_0F91_P_2_LEN_0,
903   MOD_VEX_W_1_0F91_P_2_LEN_0,
904   MOD_VEX_W_0_0F92_P_0_LEN_0,
905   MOD_VEX_W_0_0F92_P_2_LEN_0,
906   MOD_VEX_0F92_P_3_LEN_0,
907   MOD_VEX_W_0_0F93_P_0_LEN_0,
908   MOD_VEX_W_0_0F93_P_2_LEN_0,
909   MOD_VEX_0F93_P_3_LEN_0,
910   MOD_VEX_W_0_0F98_P_0_LEN_0,
911   MOD_VEX_W_1_0F98_P_0_LEN_0,
912   MOD_VEX_W_0_0F98_P_2_LEN_0,
913   MOD_VEX_W_1_0F98_P_2_LEN_0,
914   MOD_VEX_W_0_0F99_P_0_LEN_0,
915   MOD_VEX_W_1_0F99_P_0_LEN_0,
916   MOD_VEX_W_0_0F99_P_2_LEN_0,
917   MOD_VEX_W_1_0F99_P_2_LEN_0,
918   MOD_VEX_0FAE_REG_2,
919   MOD_VEX_0FAE_REG_3,
920   MOD_VEX_0FD7_PREFIX_2,
921   MOD_VEX_0FE7_PREFIX_2,
922   MOD_VEX_0FF0_PREFIX_3,
923   MOD_VEX_0F381A_PREFIX_2,
924   MOD_VEX_0F382A_PREFIX_2,
925   MOD_VEX_0F382C_PREFIX_2,
926   MOD_VEX_0F382D_PREFIX_2,
927   MOD_VEX_0F382E_PREFIX_2,
928   MOD_VEX_0F382F_PREFIX_2,
929   MOD_VEX_0F385A_PREFIX_2,
930   MOD_VEX_0F388C_PREFIX_2,
931   MOD_VEX_0F388E_PREFIX_2,
932   MOD_VEX_W_0_0F3A30_P_2_LEN_0,
933   MOD_VEX_W_1_0F3A30_P_2_LEN_0,
934   MOD_VEX_W_0_0F3A31_P_2_LEN_0,
935   MOD_VEX_W_1_0F3A31_P_2_LEN_0,
936   MOD_VEX_W_0_0F3A32_P_2_LEN_0,
937   MOD_VEX_W_1_0F3A32_P_2_LEN_0,
938   MOD_VEX_W_0_0F3A33_P_2_LEN_0,
939   MOD_VEX_W_1_0F3A33_P_2_LEN_0,
940
941   MOD_EVEX_0F10_PREFIX_1,
942   MOD_EVEX_0F10_PREFIX_3,
943   MOD_EVEX_0F11_PREFIX_1,
944   MOD_EVEX_0F11_PREFIX_3,
945   MOD_EVEX_0F12_PREFIX_0,
946   MOD_EVEX_0F16_PREFIX_0,
947   MOD_EVEX_0F38C6_REG_1,
948   MOD_EVEX_0F38C6_REG_2,
949   MOD_EVEX_0F38C6_REG_5,
950   MOD_EVEX_0F38C6_REG_6,
951   MOD_EVEX_0F38C7_REG_1,
952   MOD_EVEX_0F38C7_REG_2,
953   MOD_EVEX_0F38C7_REG_5,
954   MOD_EVEX_0F38C7_REG_6
955 };
956
957 enum
958 {
959   RM_C6_REG_7 = 0,
960   RM_C7_REG_7,
961   RM_0F01_REG_0,
962   RM_0F01_REG_1,
963   RM_0F01_REG_2,
964   RM_0F01_REG_3,
965   RM_0F01_REG_5,
966   RM_0F01_REG_7,
967   RM_0F1E_MOD_3_REG_7,
968   RM_0FAE_REG_6,
969   RM_0FAE_REG_7
970 };
971
972 enum
973 {
974   PREFIX_90 = 0,
975   PREFIX_MOD_0_0F01_REG_5,
976   PREFIX_MOD_3_0F01_REG_5_RM_0,
977   PREFIX_MOD_3_0F01_REG_5_RM_2,
978   PREFIX_0F09,
979   PREFIX_0F10,
980   PREFIX_0F11,
981   PREFIX_0F12,
982   PREFIX_0F16,
983   PREFIX_0F1A,
984   PREFIX_0F1B,
985   PREFIX_0F1C,
986   PREFIX_0F1E,
987   PREFIX_0F2A,
988   PREFIX_0F2B,
989   PREFIX_0F2C,
990   PREFIX_0F2D,
991   PREFIX_0F2E,
992   PREFIX_0F2F,
993   PREFIX_0F51,
994   PREFIX_0F52,
995   PREFIX_0F53,
996   PREFIX_0F58,
997   PREFIX_0F59,
998   PREFIX_0F5A,
999   PREFIX_0F5B,
1000   PREFIX_0F5C,
1001   PREFIX_0F5D,
1002   PREFIX_0F5E,
1003   PREFIX_0F5F,
1004   PREFIX_0F60,
1005   PREFIX_0F61,
1006   PREFIX_0F62,
1007   PREFIX_0F6C,
1008   PREFIX_0F6D,
1009   PREFIX_0F6F,
1010   PREFIX_0F70,
1011   PREFIX_0F73_REG_3,
1012   PREFIX_0F73_REG_7,
1013   PREFIX_0F78,
1014   PREFIX_0F79,
1015   PREFIX_0F7C,
1016   PREFIX_0F7D,
1017   PREFIX_0F7E,
1018   PREFIX_0F7F,
1019   PREFIX_0FAE_REG_0,
1020   PREFIX_0FAE_REG_1,
1021   PREFIX_0FAE_REG_2,
1022   PREFIX_0FAE_REG_3,
1023   PREFIX_MOD_0_0FAE_REG_4,
1024   PREFIX_MOD_3_0FAE_REG_4,
1025   PREFIX_MOD_0_0FAE_REG_5,
1026   PREFIX_MOD_3_0FAE_REG_5,
1027   PREFIX_MOD_0_0FAE_REG_6,
1028   PREFIX_MOD_1_0FAE_REG_6,
1029   PREFIX_0FAE_REG_7,
1030   PREFIX_0FB8,
1031   PREFIX_0FBC,
1032   PREFIX_0FBD,
1033   PREFIX_0FC2,
1034   PREFIX_MOD_0_0FC3,
1035   PREFIX_MOD_0_0FC7_REG_6,
1036   PREFIX_MOD_3_0FC7_REG_6,
1037   PREFIX_MOD_3_0FC7_REG_7,
1038   PREFIX_0FD0,
1039   PREFIX_0FD6,
1040   PREFIX_0FE6,
1041   PREFIX_0FE7,
1042   PREFIX_0FF0,
1043   PREFIX_0FF7,
1044   PREFIX_0F3810,
1045   PREFIX_0F3814,
1046   PREFIX_0F3815,
1047   PREFIX_0F3817,
1048   PREFIX_0F3820,
1049   PREFIX_0F3821,
1050   PREFIX_0F3822,
1051   PREFIX_0F3823,
1052   PREFIX_0F3824,
1053   PREFIX_0F3825,
1054   PREFIX_0F3828,
1055   PREFIX_0F3829,
1056   PREFIX_0F382A,
1057   PREFIX_0F382B,
1058   PREFIX_0F3830,
1059   PREFIX_0F3831,
1060   PREFIX_0F3832,
1061   PREFIX_0F3833,
1062   PREFIX_0F3834,
1063   PREFIX_0F3835,
1064   PREFIX_0F3837,
1065   PREFIX_0F3838,
1066   PREFIX_0F3839,
1067   PREFIX_0F383A,
1068   PREFIX_0F383B,
1069   PREFIX_0F383C,
1070   PREFIX_0F383D,
1071   PREFIX_0F383E,
1072   PREFIX_0F383F,
1073   PREFIX_0F3840,
1074   PREFIX_0F3841,
1075   PREFIX_0F3880,
1076   PREFIX_0F3881,
1077   PREFIX_0F3882,
1078   PREFIX_0F38C8,
1079   PREFIX_0F38C9,
1080   PREFIX_0F38CA,
1081   PREFIX_0F38CB,
1082   PREFIX_0F38CC,
1083   PREFIX_0F38CD,
1084   PREFIX_0F38CF,
1085   PREFIX_0F38DB,
1086   PREFIX_0F38DC,
1087   PREFIX_0F38DD,
1088   PREFIX_0F38DE,
1089   PREFIX_0F38DF,
1090   PREFIX_0F38F0,
1091   PREFIX_0F38F1,
1092   PREFIX_0F38F5,
1093   PREFIX_0F38F6,
1094   PREFIX_0F38F8,
1095   PREFIX_0F38F9,
1096   PREFIX_0F3A08,
1097   PREFIX_0F3A09,
1098   PREFIX_0F3A0A,
1099   PREFIX_0F3A0B,
1100   PREFIX_0F3A0C,
1101   PREFIX_0F3A0D,
1102   PREFIX_0F3A0E,
1103   PREFIX_0F3A14,
1104   PREFIX_0F3A15,
1105   PREFIX_0F3A16,
1106   PREFIX_0F3A17,
1107   PREFIX_0F3A20,
1108   PREFIX_0F3A21,
1109   PREFIX_0F3A22,
1110   PREFIX_0F3A40,
1111   PREFIX_0F3A41,
1112   PREFIX_0F3A42,
1113   PREFIX_0F3A44,
1114   PREFIX_0F3A60,
1115   PREFIX_0F3A61,
1116   PREFIX_0F3A62,
1117   PREFIX_0F3A63,
1118   PREFIX_0F3ACC,
1119   PREFIX_0F3ACE,
1120   PREFIX_0F3ACF,
1121   PREFIX_0F3ADF,
1122   PREFIX_VEX_0F10,
1123   PREFIX_VEX_0F11,
1124   PREFIX_VEX_0F12,
1125   PREFIX_VEX_0F16,
1126   PREFIX_VEX_0F2A,
1127   PREFIX_VEX_0F2C,
1128   PREFIX_VEX_0F2D,
1129   PREFIX_VEX_0F2E,
1130   PREFIX_VEX_0F2F,
1131   PREFIX_VEX_0F41,
1132   PREFIX_VEX_0F42,
1133   PREFIX_VEX_0F44,
1134   PREFIX_VEX_0F45,
1135   PREFIX_VEX_0F46,
1136   PREFIX_VEX_0F47,
1137   PREFIX_VEX_0F4A,
1138   PREFIX_VEX_0F4B,
1139   PREFIX_VEX_0F51,
1140   PREFIX_VEX_0F52,
1141   PREFIX_VEX_0F53,
1142   PREFIX_VEX_0F58,
1143   PREFIX_VEX_0F59,
1144   PREFIX_VEX_0F5A,
1145   PREFIX_VEX_0F5B,
1146   PREFIX_VEX_0F5C,
1147   PREFIX_VEX_0F5D,
1148   PREFIX_VEX_0F5E,
1149   PREFIX_VEX_0F5F,
1150   PREFIX_VEX_0F60,
1151   PREFIX_VEX_0F61,
1152   PREFIX_VEX_0F62,
1153   PREFIX_VEX_0F63,
1154   PREFIX_VEX_0F64,
1155   PREFIX_VEX_0F65,
1156   PREFIX_VEX_0F66,
1157   PREFIX_VEX_0F67,
1158   PREFIX_VEX_0F68,
1159   PREFIX_VEX_0F69,
1160   PREFIX_VEX_0F6A,
1161   PREFIX_VEX_0F6B,
1162   PREFIX_VEX_0F6C,
1163   PREFIX_VEX_0F6D,
1164   PREFIX_VEX_0F6E,
1165   PREFIX_VEX_0F6F,
1166   PREFIX_VEX_0F70,
1167   PREFIX_VEX_0F71_REG_2,
1168   PREFIX_VEX_0F71_REG_4,
1169   PREFIX_VEX_0F71_REG_6,
1170   PREFIX_VEX_0F72_REG_2,
1171   PREFIX_VEX_0F72_REG_4,
1172   PREFIX_VEX_0F72_REG_6,
1173   PREFIX_VEX_0F73_REG_2,
1174   PREFIX_VEX_0F73_REG_3,
1175   PREFIX_VEX_0F73_REG_6,
1176   PREFIX_VEX_0F73_REG_7,
1177   PREFIX_VEX_0F74,
1178   PREFIX_VEX_0F75,
1179   PREFIX_VEX_0F76,
1180   PREFIX_VEX_0F77,
1181   PREFIX_VEX_0F7C,
1182   PREFIX_VEX_0F7D,
1183   PREFIX_VEX_0F7E,
1184   PREFIX_VEX_0F7F,
1185   PREFIX_VEX_0F90,
1186   PREFIX_VEX_0F91,
1187   PREFIX_VEX_0F92,
1188   PREFIX_VEX_0F93,
1189   PREFIX_VEX_0F98,
1190   PREFIX_VEX_0F99,
1191   PREFIX_VEX_0FC2,
1192   PREFIX_VEX_0FC4,
1193   PREFIX_VEX_0FC5,
1194   PREFIX_VEX_0FD0,
1195   PREFIX_VEX_0FD1,
1196   PREFIX_VEX_0FD2,
1197   PREFIX_VEX_0FD3,
1198   PREFIX_VEX_0FD4,
1199   PREFIX_VEX_0FD5,
1200   PREFIX_VEX_0FD6,
1201   PREFIX_VEX_0FD7,
1202   PREFIX_VEX_0FD8,
1203   PREFIX_VEX_0FD9,
1204   PREFIX_VEX_0FDA,
1205   PREFIX_VEX_0FDB,
1206   PREFIX_VEX_0FDC,
1207   PREFIX_VEX_0FDD,
1208   PREFIX_VEX_0FDE,
1209   PREFIX_VEX_0FDF,
1210   PREFIX_VEX_0FE0,
1211   PREFIX_VEX_0FE1,
1212   PREFIX_VEX_0FE2,
1213   PREFIX_VEX_0FE3,
1214   PREFIX_VEX_0FE4,
1215   PREFIX_VEX_0FE5,
1216   PREFIX_VEX_0FE6,
1217   PREFIX_VEX_0FE7,
1218   PREFIX_VEX_0FE8,
1219   PREFIX_VEX_0FE9,
1220   PREFIX_VEX_0FEA,
1221   PREFIX_VEX_0FEB,
1222   PREFIX_VEX_0FEC,
1223   PREFIX_VEX_0FED,
1224   PREFIX_VEX_0FEE,
1225   PREFIX_VEX_0FEF,
1226   PREFIX_VEX_0FF0,
1227   PREFIX_VEX_0FF1,
1228   PREFIX_VEX_0FF2,
1229   PREFIX_VEX_0FF3,
1230   PREFIX_VEX_0FF4,
1231   PREFIX_VEX_0FF5,
1232   PREFIX_VEX_0FF6,
1233   PREFIX_VEX_0FF7,
1234   PREFIX_VEX_0FF8,
1235   PREFIX_VEX_0FF9,
1236   PREFIX_VEX_0FFA,
1237   PREFIX_VEX_0FFB,
1238   PREFIX_VEX_0FFC,
1239   PREFIX_VEX_0FFD,
1240   PREFIX_VEX_0FFE,
1241   PREFIX_VEX_0F3800,
1242   PREFIX_VEX_0F3801,
1243   PREFIX_VEX_0F3802,
1244   PREFIX_VEX_0F3803,
1245   PREFIX_VEX_0F3804,
1246   PREFIX_VEX_0F3805,
1247   PREFIX_VEX_0F3806,
1248   PREFIX_VEX_0F3807,
1249   PREFIX_VEX_0F3808,
1250   PREFIX_VEX_0F3809,
1251   PREFIX_VEX_0F380A,
1252   PREFIX_VEX_0F380B,
1253   PREFIX_VEX_0F380C,
1254   PREFIX_VEX_0F380D,
1255   PREFIX_VEX_0F380E,
1256   PREFIX_VEX_0F380F,
1257   PREFIX_VEX_0F3813,
1258   PREFIX_VEX_0F3816,
1259   PREFIX_VEX_0F3817,
1260   PREFIX_VEX_0F3818,
1261   PREFIX_VEX_0F3819,
1262   PREFIX_VEX_0F381A,
1263   PREFIX_VEX_0F381C,
1264   PREFIX_VEX_0F381D,
1265   PREFIX_VEX_0F381E,
1266   PREFIX_VEX_0F3820,
1267   PREFIX_VEX_0F3821,
1268   PREFIX_VEX_0F3822,
1269   PREFIX_VEX_0F3823,
1270   PREFIX_VEX_0F3824,
1271   PREFIX_VEX_0F3825,
1272   PREFIX_VEX_0F3828,
1273   PREFIX_VEX_0F3829,
1274   PREFIX_VEX_0F382A,
1275   PREFIX_VEX_0F382B,
1276   PREFIX_VEX_0F382C,
1277   PREFIX_VEX_0F382D,
1278   PREFIX_VEX_0F382E,
1279   PREFIX_VEX_0F382F,
1280   PREFIX_VEX_0F3830,
1281   PREFIX_VEX_0F3831,
1282   PREFIX_VEX_0F3832,
1283   PREFIX_VEX_0F3833,
1284   PREFIX_VEX_0F3834,
1285   PREFIX_VEX_0F3835,
1286   PREFIX_VEX_0F3836,
1287   PREFIX_VEX_0F3837,
1288   PREFIX_VEX_0F3838,
1289   PREFIX_VEX_0F3839,
1290   PREFIX_VEX_0F383A,
1291   PREFIX_VEX_0F383B,
1292   PREFIX_VEX_0F383C,
1293   PREFIX_VEX_0F383D,
1294   PREFIX_VEX_0F383E,
1295   PREFIX_VEX_0F383F,
1296   PREFIX_VEX_0F3840,
1297   PREFIX_VEX_0F3841,
1298   PREFIX_VEX_0F3845,
1299   PREFIX_VEX_0F3846,
1300   PREFIX_VEX_0F3847,
1301   PREFIX_VEX_0F3858,
1302   PREFIX_VEX_0F3859,
1303   PREFIX_VEX_0F385A,
1304   PREFIX_VEX_0F3878,
1305   PREFIX_VEX_0F3879,
1306   PREFIX_VEX_0F388C,
1307   PREFIX_VEX_0F388E,
1308   PREFIX_VEX_0F3890,
1309   PREFIX_VEX_0F3891,
1310   PREFIX_VEX_0F3892,
1311   PREFIX_VEX_0F3893,
1312   PREFIX_VEX_0F3896,
1313   PREFIX_VEX_0F3897,
1314   PREFIX_VEX_0F3898,
1315   PREFIX_VEX_0F3899,
1316   PREFIX_VEX_0F389A,
1317   PREFIX_VEX_0F389B,
1318   PREFIX_VEX_0F389C,
1319   PREFIX_VEX_0F389D,
1320   PREFIX_VEX_0F389E,
1321   PREFIX_VEX_0F389F,
1322   PREFIX_VEX_0F38A6,
1323   PREFIX_VEX_0F38A7,
1324   PREFIX_VEX_0F38A8,
1325   PREFIX_VEX_0F38A9,
1326   PREFIX_VEX_0F38AA,
1327   PREFIX_VEX_0F38AB,
1328   PREFIX_VEX_0F38AC,
1329   PREFIX_VEX_0F38AD,
1330   PREFIX_VEX_0F38AE,
1331   PREFIX_VEX_0F38AF,
1332   PREFIX_VEX_0F38B6,
1333   PREFIX_VEX_0F38B7,
1334   PREFIX_VEX_0F38B8,
1335   PREFIX_VEX_0F38B9,
1336   PREFIX_VEX_0F38BA,
1337   PREFIX_VEX_0F38BB,
1338   PREFIX_VEX_0F38BC,
1339   PREFIX_VEX_0F38BD,
1340   PREFIX_VEX_0F38BE,
1341   PREFIX_VEX_0F38BF,
1342   PREFIX_VEX_0F38CF,
1343   PREFIX_VEX_0F38DB,
1344   PREFIX_VEX_0F38DC,
1345   PREFIX_VEX_0F38DD,
1346   PREFIX_VEX_0F38DE,
1347   PREFIX_VEX_0F38DF,
1348   PREFIX_VEX_0F38F2,
1349   PREFIX_VEX_0F38F3_REG_1,
1350   PREFIX_VEX_0F38F3_REG_2,
1351   PREFIX_VEX_0F38F3_REG_3,
1352   PREFIX_VEX_0F38F5,
1353   PREFIX_VEX_0F38F6,
1354   PREFIX_VEX_0F38F7,
1355   PREFIX_VEX_0F3A00,
1356   PREFIX_VEX_0F3A01,
1357   PREFIX_VEX_0F3A02,
1358   PREFIX_VEX_0F3A04,
1359   PREFIX_VEX_0F3A05,
1360   PREFIX_VEX_0F3A06,
1361   PREFIX_VEX_0F3A08,
1362   PREFIX_VEX_0F3A09,
1363   PREFIX_VEX_0F3A0A,
1364   PREFIX_VEX_0F3A0B,
1365   PREFIX_VEX_0F3A0C,
1366   PREFIX_VEX_0F3A0D,
1367   PREFIX_VEX_0F3A0E,
1368   PREFIX_VEX_0F3A0F,
1369   PREFIX_VEX_0F3A14,
1370   PREFIX_VEX_0F3A15,
1371   PREFIX_VEX_0F3A16,
1372   PREFIX_VEX_0F3A17,
1373   PREFIX_VEX_0F3A18,
1374   PREFIX_VEX_0F3A19,
1375   PREFIX_VEX_0F3A1D,
1376   PREFIX_VEX_0F3A20,
1377   PREFIX_VEX_0F3A21,
1378   PREFIX_VEX_0F3A22,
1379   PREFIX_VEX_0F3A30,
1380   PREFIX_VEX_0F3A31,
1381   PREFIX_VEX_0F3A32,
1382   PREFIX_VEX_0F3A33,
1383   PREFIX_VEX_0F3A38,
1384   PREFIX_VEX_0F3A39,
1385   PREFIX_VEX_0F3A40,
1386   PREFIX_VEX_0F3A41,
1387   PREFIX_VEX_0F3A42,
1388   PREFIX_VEX_0F3A44,
1389   PREFIX_VEX_0F3A46,
1390   PREFIX_VEX_0F3A48,
1391   PREFIX_VEX_0F3A49,
1392   PREFIX_VEX_0F3A4A,
1393   PREFIX_VEX_0F3A4B,
1394   PREFIX_VEX_0F3A4C,
1395   PREFIX_VEX_0F3A5C,
1396   PREFIX_VEX_0F3A5D,
1397   PREFIX_VEX_0F3A5E,
1398   PREFIX_VEX_0F3A5F,
1399   PREFIX_VEX_0F3A60,
1400   PREFIX_VEX_0F3A61,
1401   PREFIX_VEX_0F3A62,
1402   PREFIX_VEX_0F3A63,
1403   PREFIX_VEX_0F3A68,
1404   PREFIX_VEX_0F3A69,
1405   PREFIX_VEX_0F3A6A,
1406   PREFIX_VEX_0F3A6B,
1407   PREFIX_VEX_0F3A6C,
1408   PREFIX_VEX_0F3A6D,
1409   PREFIX_VEX_0F3A6E,
1410   PREFIX_VEX_0F3A6F,
1411   PREFIX_VEX_0F3A78,
1412   PREFIX_VEX_0F3A79,
1413   PREFIX_VEX_0F3A7A,
1414   PREFIX_VEX_0F3A7B,
1415   PREFIX_VEX_0F3A7C,
1416   PREFIX_VEX_0F3A7D,
1417   PREFIX_VEX_0F3A7E,
1418   PREFIX_VEX_0F3A7F,
1419   PREFIX_VEX_0F3ACE,
1420   PREFIX_VEX_0F3ACF,
1421   PREFIX_VEX_0F3ADF,
1422   PREFIX_VEX_0F3AF0,
1423
1424   PREFIX_EVEX_0F10,
1425   PREFIX_EVEX_0F11,
1426   PREFIX_EVEX_0F12,
1427   PREFIX_EVEX_0F13,
1428   PREFIX_EVEX_0F14,
1429   PREFIX_EVEX_0F15,
1430   PREFIX_EVEX_0F16,
1431   PREFIX_EVEX_0F17,
1432   PREFIX_EVEX_0F28,
1433   PREFIX_EVEX_0F29,
1434   PREFIX_EVEX_0F2A,
1435   PREFIX_EVEX_0F2B,
1436   PREFIX_EVEX_0F2C,
1437   PREFIX_EVEX_0F2D,
1438   PREFIX_EVEX_0F2E,
1439   PREFIX_EVEX_0F2F,
1440   PREFIX_EVEX_0F51,
1441   PREFIX_EVEX_0F54,
1442   PREFIX_EVEX_0F55,
1443   PREFIX_EVEX_0F56,
1444   PREFIX_EVEX_0F57,
1445   PREFIX_EVEX_0F58,
1446   PREFIX_EVEX_0F59,
1447   PREFIX_EVEX_0F5A,
1448   PREFIX_EVEX_0F5B,
1449   PREFIX_EVEX_0F5C,
1450   PREFIX_EVEX_0F5D,
1451   PREFIX_EVEX_0F5E,
1452   PREFIX_EVEX_0F5F,
1453   PREFIX_EVEX_0F60,
1454   PREFIX_EVEX_0F61,
1455   PREFIX_EVEX_0F62,
1456   PREFIX_EVEX_0F63,
1457   PREFIX_EVEX_0F64,
1458   PREFIX_EVEX_0F65,
1459   PREFIX_EVEX_0F66,
1460   PREFIX_EVEX_0F67,
1461   PREFIX_EVEX_0F68,
1462   PREFIX_EVEX_0F69,
1463   PREFIX_EVEX_0F6A,
1464   PREFIX_EVEX_0F6B,
1465   PREFIX_EVEX_0F6C,
1466   PREFIX_EVEX_0F6D,
1467   PREFIX_EVEX_0F6E,
1468   PREFIX_EVEX_0F6F,
1469   PREFIX_EVEX_0F70,
1470   PREFIX_EVEX_0F71_REG_2,
1471   PREFIX_EVEX_0F71_REG_4,
1472   PREFIX_EVEX_0F71_REG_6,
1473   PREFIX_EVEX_0F72_REG_0,
1474   PREFIX_EVEX_0F72_REG_1,
1475   PREFIX_EVEX_0F72_REG_2,
1476   PREFIX_EVEX_0F72_REG_4,
1477   PREFIX_EVEX_0F72_REG_6,
1478   PREFIX_EVEX_0F73_REG_2,
1479   PREFIX_EVEX_0F73_REG_3,
1480   PREFIX_EVEX_0F73_REG_6,
1481   PREFIX_EVEX_0F73_REG_7,
1482   PREFIX_EVEX_0F74,
1483   PREFIX_EVEX_0F75,
1484   PREFIX_EVEX_0F76,
1485   PREFIX_EVEX_0F78,
1486   PREFIX_EVEX_0F79,
1487   PREFIX_EVEX_0F7A,
1488   PREFIX_EVEX_0F7B,
1489   PREFIX_EVEX_0F7E,
1490   PREFIX_EVEX_0F7F,
1491   PREFIX_EVEX_0FC2,
1492   PREFIX_EVEX_0FC4,
1493   PREFIX_EVEX_0FC5,
1494   PREFIX_EVEX_0FC6,
1495   PREFIX_EVEX_0FD1,
1496   PREFIX_EVEX_0FD2,
1497   PREFIX_EVEX_0FD3,
1498   PREFIX_EVEX_0FD4,
1499   PREFIX_EVEX_0FD5,
1500   PREFIX_EVEX_0FD6,
1501   PREFIX_EVEX_0FD8,
1502   PREFIX_EVEX_0FD9,
1503   PREFIX_EVEX_0FDA,
1504   PREFIX_EVEX_0FDB,
1505   PREFIX_EVEX_0FDC,
1506   PREFIX_EVEX_0FDD,
1507   PREFIX_EVEX_0FDE,
1508   PREFIX_EVEX_0FDF,
1509   PREFIX_EVEX_0FE0,
1510   PREFIX_EVEX_0FE1,
1511   PREFIX_EVEX_0FE2,
1512   PREFIX_EVEX_0FE3,
1513   PREFIX_EVEX_0FE4,
1514   PREFIX_EVEX_0FE5,
1515   PREFIX_EVEX_0FE6,
1516   PREFIX_EVEX_0FE7,
1517   PREFIX_EVEX_0FE8,
1518   PREFIX_EVEX_0FE9,
1519   PREFIX_EVEX_0FEA,
1520   PREFIX_EVEX_0FEB,
1521   PREFIX_EVEX_0FEC,
1522   PREFIX_EVEX_0FED,
1523   PREFIX_EVEX_0FEE,
1524   PREFIX_EVEX_0FEF,
1525   PREFIX_EVEX_0FF1,
1526   PREFIX_EVEX_0FF2,
1527   PREFIX_EVEX_0FF3,
1528   PREFIX_EVEX_0FF4,
1529   PREFIX_EVEX_0FF5,
1530   PREFIX_EVEX_0FF6,
1531   PREFIX_EVEX_0FF8,
1532   PREFIX_EVEX_0FF9,
1533   PREFIX_EVEX_0FFA,
1534   PREFIX_EVEX_0FFB,
1535   PREFIX_EVEX_0FFC,
1536   PREFIX_EVEX_0FFD,
1537   PREFIX_EVEX_0FFE,
1538   PREFIX_EVEX_0F3800,
1539   PREFIX_EVEX_0F3804,
1540   PREFIX_EVEX_0F380B,
1541   PREFIX_EVEX_0F380C,
1542   PREFIX_EVEX_0F380D,
1543   PREFIX_EVEX_0F3810,
1544   PREFIX_EVEX_0F3811,
1545   PREFIX_EVEX_0F3812,
1546   PREFIX_EVEX_0F3813,
1547   PREFIX_EVEX_0F3814,
1548   PREFIX_EVEX_0F3815,
1549   PREFIX_EVEX_0F3816,
1550   PREFIX_EVEX_0F3818,
1551   PREFIX_EVEX_0F3819,
1552   PREFIX_EVEX_0F381A,
1553   PREFIX_EVEX_0F381B,
1554   PREFIX_EVEX_0F381C,
1555   PREFIX_EVEX_0F381D,
1556   PREFIX_EVEX_0F381E,
1557   PREFIX_EVEX_0F381F,
1558   PREFIX_EVEX_0F3820,
1559   PREFIX_EVEX_0F3821,
1560   PREFIX_EVEX_0F3822,
1561   PREFIX_EVEX_0F3823,
1562   PREFIX_EVEX_0F3824,
1563   PREFIX_EVEX_0F3825,
1564   PREFIX_EVEX_0F3826,
1565   PREFIX_EVEX_0F3827,
1566   PREFIX_EVEX_0F3828,
1567   PREFIX_EVEX_0F3829,
1568   PREFIX_EVEX_0F382A,
1569   PREFIX_EVEX_0F382B,
1570   PREFIX_EVEX_0F382C,
1571   PREFIX_EVEX_0F382D,
1572   PREFIX_EVEX_0F3830,
1573   PREFIX_EVEX_0F3831,
1574   PREFIX_EVEX_0F3832,
1575   PREFIX_EVEX_0F3833,
1576   PREFIX_EVEX_0F3834,
1577   PREFIX_EVEX_0F3835,
1578   PREFIX_EVEX_0F3836,
1579   PREFIX_EVEX_0F3837,
1580   PREFIX_EVEX_0F3838,
1581   PREFIX_EVEX_0F3839,
1582   PREFIX_EVEX_0F383A,
1583   PREFIX_EVEX_0F383B,
1584   PREFIX_EVEX_0F383C,
1585   PREFIX_EVEX_0F383D,
1586   PREFIX_EVEX_0F383E,
1587   PREFIX_EVEX_0F383F,
1588   PREFIX_EVEX_0F3840,
1589   PREFIX_EVEX_0F3842,
1590   PREFIX_EVEX_0F3843,
1591   PREFIX_EVEX_0F3844,
1592   PREFIX_EVEX_0F3845,
1593   PREFIX_EVEX_0F3846,
1594   PREFIX_EVEX_0F3847,
1595   PREFIX_EVEX_0F384C,
1596   PREFIX_EVEX_0F384D,
1597   PREFIX_EVEX_0F384E,
1598   PREFIX_EVEX_0F384F,
1599   PREFIX_EVEX_0F3850,
1600   PREFIX_EVEX_0F3851,
1601   PREFIX_EVEX_0F3852,
1602   PREFIX_EVEX_0F3853,
1603   PREFIX_EVEX_0F3854,
1604   PREFIX_EVEX_0F3855,
1605   PREFIX_EVEX_0F3858,
1606   PREFIX_EVEX_0F3859,
1607   PREFIX_EVEX_0F385A,
1608   PREFIX_EVEX_0F385B,
1609   PREFIX_EVEX_0F3862,
1610   PREFIX_EVEX_0F3863,
1611   PREFIX_EVEX_0F3864,
1612   PREFIX_EVEX_0F3865,
1613   PREFIX_EVEX_0F3866,
1614   PREFIX_EVEX_0F3870,
1615   PREFIX_EVEX_0F3871,
1616   PREFIX_EVEX_0F3872,
1617   PREFIX_EVEX_0F3873,
1618   PREFIX_EVEX_0F3875,
1619   PREFIX_EVEX_0F3876,
1620   PREFIX_EVEX_0F3877,
1621   PREFIX_EVEX_0F3878,
1622   PREFIX_EVEX_0F3879,
1623   PREFIX_EVEX_0F387A,
1624   PREFIX_EVEX_0F387B,
1625   PREFIX_EVEX_0F387C,
1626   PREFIX_EVEX_0F387D,
1627   PREFIX_EVEX_0F387E,
1628   PREFIX_EVEX_0F387F,
1629   PREFIX_EVEX_0F3883,
1630   PREFIX_EVEX_0F3888,
1631   PREFIX_EVEX_0F3889,
1632   PREFIX_EVEX_0F388A,
1633   PREFIX_EVEX_0F388B,
1634   PREFIX_EVEX_0F388D,
1635   PREFIX_EVEX_0F388F,
1636   PREFIX_EVEX_0F3890,
1637   PREFIX_EVEX_0F3891,
1638   PREFIX_EVEX_0F3892,
1639   PREFIX_EVEX_0F3893,
1640   PREFIX_EVEX_0F3896,
1641   PREFIX_EVEX_0F3897,
1642   PREFIX_EVEX_0F3898,
1643   PREFIX_EVEX_0F3899,
1644   PREFIX_EVEX_0F389A,
1645   PREFIX_EVEX_0F389B,
1646   PREFIX_EVEX_0F389C,
1647   PREFIX_EVEX_0F389D,
1648   PREFIX_EVEX_0F389E,
1649   PREFIX_EVEX_0F389F,
1650   PREFIX_EVEX_0F38A0,
1651   PREFIX_EVEX_0F38A1,
1652   PREFIX_EVEX_0F38A2,
1653   PREFIX_EVEX_0F38A3,
1654   PREFIX_EVEX_0F38A6,
1655   PREFIX_EVEX_0F38A7,
1656   PREFIX_EVEX_0F38A8,
1657   PREFIX_EVEX_0F38A9,
1658   PREFIX_EVEX_0F38AA,
1659   PREFIX_EVEX_0F38AB,
1660   PREFIX_EVEX_0F38AC,
1661   PREFIX_EVEX_0F38AD,
1662   PREFIX_EVEX_0F38AE,
1663   PREFIX_EVEX_0F38AF,
1664   PREFIX_EVEX_0F38B4,
1665   PREFIX_EVEX_0F38B5,
1666   PREFIX_EVEX_0F38B6,
1667   PREFIX_EVEX_0F38B7,
1668   PREFIX_EVEX_0F38B8,
1669   PREFIX_EVEX_0F38B9,
1670   PREFIX_EVEX_0F38BA,
1671   PREFIX_EVEX_0F38BB,
1672   PREFIX_EVEX_0F38BC,
1673   PREFIX_EVEX_0F38BD,
1674   PREFIX_EVEX_0F38BE,
1675   PREFIX_EVEX_0F38BF,
1676   PREFIX_EVEX_0F38C4,
1677   PREFIX_EVEX_0F38C6_REG_1,
1678   PREFIX_EVEX_0F38C6_REG_2,
1679   PREFIX_EVEX_0F38C6_REG_5,
1680   PREFIX_EVEX_0F38C6_REG_6,
1681   PREFIX_EVEX_0F38C7_REG_1,
1682   PREFIX_EVEX_0F38C7_REG_2,
1683   PREFIX_EVEX_0F38C7_REG_5,
1684   PREFIX_EVEX_0F38C7_REG_6,
1685   PREFIX_EVEX_0F38C8,
1686   PREFIX_EVEX_0F38CA,
1687   PREFIX_EVEX_0F38CB,
1688   PREFIX_EVEX_0F38CC,
1689   PREFIX_EVEX_0F38CD,
1690   PREFIX_EVEX_0F38CF,
1691   PREFIX_EVEX_0F38DC,
1692   PREFIX_EVEX_0F38DD,
1693   PREFIX_EVEX_0F38DE,
1694   PREFIX_EVEX_0F38DF,
1695
1696   PREFIX_EVEX_0F3A00,
1697   PREFIX_EVEX_0F3A01,
1698   PREFIX_EVEX_0F3A03,
1699   PREFIX_EVEX_0F3A04,
1700   PREFIX_EVEX_0F3A05,
1701   PREFIX_EVEX_0F3A08,
1702   PREFIX_EVEX_0F3A09,
1703   PREFIX_EVEX_0F3A0A,
1704   PREFIX_EVEX_0F3A0B,
1705   PREFIX_EVEX_0F3A0F,
1706   PREFIX_EVEX_0F3A14,
1707   PREFIX_EVEX_0F3A15,
1708   PREFIX_EVEX_0F3A16,
1709   PREFIX_EVEX_0F3A17,
1710   PREFIX_EVEX_0F3A18,
1711   PREFIX_EVEX_0F3A19,
1712   PREFIX_EVEX_0F3A1A,
1713   PREFIX_EVEX_0F3A1B,
1714   PREFIX_EVEX_0F3A1D,
1715   PREFIX_EVEX_0F3A1E,
1716   PREFIX_EVEX_0F3A1F,
1717   PREFIX_EVEX_0F3A20,
1718   PREFIX_EVEX_0F3A21,
1719   PREFIX_EVEX_0F3A22,
1720   PREFIX_EVEX_0F3A23,
1721   PREFIX_EVEX_0F3A25,
1722   PREFIX_EVEX_0F3A26,
1723   PREFIX_EVEX_0F3A27,
1724   PREFIX_EVEX_0F3A38,
1725   PREFIX_EVEX_0F3A39,
1726   PREFIX_EVEX_0F3A3A,
1727   PREFIX_EVEX_0F3A3B,
1728   PREFIX_EVEX_0F3A3E,
1729   PREFIX_EVEX_0F3A3F,
1730   PREFIX_EVEX_0F3A42,
1731   PREFIX_EVEX_0F3A43,
1732   PREFIX_EVEX_0F3A44,
1733   PREFIX_EVEX_0F3A50,
1734   PREFIX_EVEX_0F3A51,
1735   PREFIX_EVEX_0F3A54,
1736   PREFIX_EVEX_0F3A55,
1737   PREFIX_EVEX_0F3A56,
1738   PREFIX_EVEX_0F3A57,
1739   PREFIX_EVEX_0F3A66,
1740   PREFIX_EVEX_0F3A67,
1741   PREFIX_EVEX_0F3A70,
1742   PREFIX_EVEX_0F3A71,
1743   PREFIX_EVEX_0F3A72,
1744   PREFIX_EVEX_0F3A73,
1745   PREFIX_EVEX_0F3ACE,
1746   PREFIX_EVEX_0F3ACF
1747 };
1748
1749 enum
1750 {
1751   X86_64_06 = 0,
1752   X86_64_07,
1753   X86_64_0D,
1754   X86_64_16,
1755   X86_64_17,
1756   X86_64_1E,
1757   X86_64_1F,
1758   X86_64_27,
1759   X86_64_2F,
1760   X86_64_37,
1761   X86_64_3F,
1762   X86_64_60,
1763   X86_64_61,
1764   X86_64_62,
1765   X86_64_63,
1766   X86_64_6D,
1767   X86_64_6F,
1768   X86_64_82,
1769   X86_64_9A,
1770   X86_64_C4,
1771   X86_64_C5,
1772   X86_64_CE,
1773   X86_64_D4,
1774   X86_64_D5,
1775   X86_64_E8,
1776   X86_64_E9,
1777   X86_64_EA,
1778   X86_64_0F01_REG_0,
1779   X86_64_0F01_REG_1,
1780   X86_64_0F01_REG_2,
1781   X86_64_0F01_REG_3
1782 };
1783
1784 enum
1785 {
1786   THREE_BYTE_0F38 = 0,
1787   THREE_BYTE_0F3A
1788 };
1789
1790 enum
1791 {
1792   XOP_08 = 0,
1793   XOP_09,
1794   XOP_0A
1795 };
1796
1797 enum
1798 {
1799   VEX_0F = 0,
1800   VEX_0F38,
1801   VEX_0F3A
1802 };
1803
1804 enum
1805 {
1806   EVEX_0F = 0,
1807   EVEX_0F38,
1808   EVEX_0F3A
1809 };
1810
1811 enum
1812 {
1813   VEX_LEN_0F12_P_0_M_0 = 0,
1814   VEX_LEN_0F12_P_0_M_1,
1815   VEX_LEN_0F12_P_2,
1816   VEX_LEN_0F13_M_0,
1817   VEX_LEN_0F16_P_0_M_0,
1818   VEX_LEN_0F16_P_0_M_1,
1819   VEX_LEN_0F16_P_2,
1820   VEX_LEN_0F17_M_0,
1821   VEX_LEN_0F2A_P_1,
1822   VEX_LEN_0F2A_P_3,
1823   VEX_LEN_0F2C_P_1,
1824   VEX_LEN_0F2C_P_3,
1825   VEX_LEN_0F2D_P_1,
1826   VEX_LEN_0F2D_P_3,
1827   VEX_LEN_0F41_P_0,
1828   VEX_LEN_0F41_P_2,
1829   VEX_LEN_0F42_P_0,
1830   VEX_LEN_0F42_P_2,
1831   VEX_LEN_0F44_P_0,
1832   VEX_LEN_0F44_P_2,
1833   VEX_LEN_0F45_P_0,
1834   VEX_LEN_0F45_P_2,
1835   VEX_LEN_0F46_P_0,
1836   VEX_LEN_0F46_P_2,
1837   VEX_LEN_0F47_P_0,
1838   VEX_LEN_0F47_P_2,
1839   VEX_LEN_0F4A_P_0,
1840   VEX_LEN_0F4A_P_2,
1841   VEX_LEN_0F4B_P_0,
1842   VEX_LEN_0F4B_P_2,
1843   VEX_LEN_0F6E_P_2,
1844   VEX_LEN_0F77_P_0,
1845   VEX_LEN_0F7E_P_1,
1846   VEX_LEN_0F7E_P_2,
1847   VEX_LEN_0F90_P_0,
1848   VEX_LEN_0F90_P_2,
1849   VEX_LEN_0F91_P_0,
1850   VEX_LEN_0F91_P_2,
1851   VEX_LEN_0F92_P_0,
1852   VEX_LEN_0F92_P_2,
1853   VEX_LEN_0F92_P_3,
1854   VEX_LEN_0F93_P_0,
1855   VEX_LEN_0F93_P_2,
1856   VEX_LEN_0F93_P_3,
1857   VEX_LEN_0F98_P_0,
1858   VEX_LEN_0F98_P_2,
1859   VEX_LEN_0F99_P_0,
1860   VEX_LEN_0F99_P_2,
1861   VEX_LEN_0FAE_R_2_M_0,
1862   VEX_LEN_0FAE_R_3_M_0,
1863   VEX_LEN_0FC4_P_2,
1864   VEX_LEN_0FC5_P_2,
1865   VEX_LEN_0FD6_P_2,
1866   VEX_LEN_0FF7_P_2,
1867   VEX_LEN_0F3816_P_2,
1868   VEX_LEN_0F3819_P_2,
1869   VEX_LEN_0F381A_P_2_M_0,
1870   VEX_LEN_0F3836_P_2,
1871   VEX_LEN_0F3841_P_2,
1872   VEX_LEN_0F385A_P_2_M_0,
1873   VEX_LEN_0F38DB_P_2,
1874   VEX_LEN_0F38F2_P_0,
1875   VEX_LEN_0F38F3_R_1_P_0,
1876   VEX_LEN_0F38F3_R_2_P_0,
1877   VEX_LEN_0F38F3_R_3_P_0,
1878   VEX_LEN_0F38F5_P_0,
1879   VEX_LEN_0F38F5_P_1,
1880   VEX_LEN_0F38F5_P_3,
1881   VEX_LEN_0F38F6_P_3,
1882   VEX_LEN_0F38F7_P_0,
1883   VEX_LEN_0F38F7_P_1,
1884   VEX_LEN_0F38F7_P_2,
1885   VEX_LEN_0F38F7_P_3,
1886   VEX_LEN_0F3A00_P_2,
1887   VEX_LEN_0F3A01_P_2,
1888   VEX_LEN_0F3A06_P_2,
1889   VEX_LEN_0F3A14_P_2,
1890   VEX_LEN_0F3A15_P_2,
1891   VEX_LEN_0F3A16_P_2,
1892   VEX_LEN_0F3A17_P_2,
1893   VEX_LEN_0F3A18_P_2,
1894   VEX_LEN_0F3A19_P_2,
1895   VEX_LEN_0F3A20_P_2,
1896   VEX_LEN_0F3A21_P_2,
1897   VEX_LEN_0F3A22_P_2,
1898   VEX_LEN_0F3A30_P_2,
1899   VEX_LEN_0F3A31_P_2,
1900   VEX_LEN_0F3A32_P_2,
1901   VEX_LEN_0F3A33_P_2,
1902   VEX_LEN_0F3A38_P_2,
1903   VEX_LEN_0F3A39_P_2,
1904   VEX_LEN_0F3A41_P_2,
1905   VEX_LEN_0F3A46_P_2,
1906   VEX_LEN_0F3A60_P_2,
1907   VEX_LEN_0F3A61_P_2,
1908   VEX_LEN_0F3A62_P_2,
1909   VEX_LEN_0F3A63_P_2,
1910   VEX_LEN_0F3A6A_P_2,
1911   VEX_LEN_0F3A6B_P_2,
1912   VEX_LEN_0F3A6E_P_2,
1913   VEX_LEN_0F3A6F_P_2,
1914   VEX_LEN_0F3A7A_P_2,
1915   VEX_LEN_0F3A7B_P_2,
1916   VEX_LEN_0F3A7E_P_2,
1917   VEX_LEN_0F3A7F_P_2,
1918   VEX_LEN_0F3ADF_P_2,
1919   VEX_LEN_0F3AF0_P_3,
1920   VEX_LEN_0FXOP_08_CC,
1921   VEX_LEN_0FXOP_08_CD,
1922   VEX_LEN_0FXOP_08_CE,
1923   VEX_LEN_0FXOP_08_CF,
1924   VEX_LEN_0FXOP_08_EC,
1925   VEX_LEN_0FXOP_08_ED,
1926   VEX_LEN_0FXOP_08_EE,
1927   VEX_LEN_0FXOP_08_EF,
1928   VEX_LEN_0FXOP_09_80,
1929   VEX_LEN_0FXOP_09_81
1930 };
1931
1932 enum
1933 {
1934   EVEX_LEN_0F6E_P_2 = 0,
1935   EVEX_LEN_0F7E_P_1,
1936   EVEX_LEN_0F7E_P_2,
1937   EVEX_LEN_0FD6_P_2
1938 };
1939
1940 enum
1941 {
1942   VEX_W_0F41_P_0_LEN_1 = 0,
1943   VEX_W_0F41_P_2_LEN_1,
1944   VEX_W_0F42_P_0_LEN_1,
1945   VEX_W_0F42_P_2_LEN_1,
1946   VEX_W_0F44_P_0_LEN_0,
1947   VEX_W_0F44_P_2_LEN_0,
1948   VEX_W_0F45_P_0_LEN_1,
1949   VEX_W_0F45_P_2_LEN_1,
1950   VEX_W_0F46_P_0_LEN_1,
1951   VEX_W_0F46_P_2_LEN_1,
1952   VEX_W_0F47_P_0_LEN_1,
1953   VEX_W_0F47_P_2_LEN_1,
1954   VEX_W_0F4A_P_0_LEN_1,
1955   VEX_W_0F4A_P_2_LEN_1,
1956   VEX_W_0F4B_P_0_LEN_1,
1957   VEX_W_0F4B_P_2_LEN_1,
1958   VEX_W_0F90_P_0_LEN_0,
1959   VEX_W_0F90_P_2_LEN_0,
1960   VEX_W_0F91_P_0_LEN_0,
1961   VEX_W_0F91_P_2_LEN_0,
1962   VEX_W_0F92_P_0_LEN_0,
1963   VEX_W_0F92_P_2_LEN_0,
1964   VEX_W_0F93_P_0_LEN_0,
1965   VEX_W_0F93_P_2_LEN_0,
1966   VEX_W_0F98_P_0_LEN_0,
1967   VEX_W_0F98_P_2_LEN_0,
1968   VEX_W_0F99_P_0_LEN_0,
1969   VEX_W_0F99_P_2_LEN_0,
1970   VEX_W_0F380C_P_2,
1971   VEX_W_0F380D_P_2,
1972   VEX_W_0F380E_P_2,
1973   VEX_W_0F380F_P_2,
1974   VEX_W_0F3816_P_2,
1975   VEX_W_0F3818_P_2,
1976   VEX_W_0F3819_P_2,
1977   VEX_W_0F381A_P_2_M_0,
1978   VEX_W_0F382C_P_2_M_0,
1979   VEX_W_0F382D_P_2_M_0,
1980   VEX_W_0F382E_P_2_M_0,
1981   VEX_W_0F382F_P_2_M_0,
1982   VEX_W_0F3836_P_2,
1983   VEX_W_0F3846_P_2,
1984   VEX_W_0F3858_P_2,
1985   VEX_W_0F3859_P_2,
1986   VEX_W_0F385A_P_2_M_0,
1987   VEX_W_0F3878_P_2,
1988   VEX_W_0F3879_P_2,
1989   VEX_W_0F38CF_P_2,
1990   VEX_W_0F3A00_P_2,
1991   VEX_W_0F3A01_P_2,
1992   VEX_W_0F3A02_P_2,
1993   VEX_W_0F3A04_P_2,
1994   VEX_W_0F3A05_P_2,
1995   VEX_W_0F3A06_P_2,
1996   VEX_W_0F3A18_P_2,
1997   VEX_W_0F3A19_P_2,
1998   VEX_W_0F3A30_P_2_LEN_0,
1999   VEX_W_0F3A31_P_2_LEN_0,
2000   VEX_W_0F3A32_P_2_LEN_0,
2001   VEX_W_0F3A33_P_2_LEN_0,
2002   VEX_W_0F3A38_P_2,
2003   VEX_W_0F3A39_P_2,
2004   VEX_W_0F3A46_P_2,
2005   VEX_W_0F3A48_P_2,
2006   VEX_W_0F3A49_P_2,
2007   VEX_W_0F3A4A_P_2,
2008   VEX_W_0F3A4B_P_2,
2009   VEX_W_0F3A4C_P_2,
2010   VEX_W_0F3ACE_P_2,
2011   VEX_W_0F3ACF_P_2,
2012
2013   EVEX_W_0F10_P_0,
2014   EVEX_W_0F10_P_1_M_0,
2015   EVEX_W_0F10_P_1_M_1,
2016   EVEX_W_0F10_P_2,
2017   EVEX_W_0F10_P_3_M_0,
2018   EVEX_W_0F10_P_3_M_1,
2019   EVEX_W_0F11_P_0,
2020   EVEX_W_0F11_P_1_M_0,
2021   EVEX_W_0F11_P_1_M_1,
2022   EVEX_W_0F11_P_2,
2023   EVEX_W_0F11_P_3_M_0,
2024   EVEX_W_0F11_P_3_M_1,
2025   EVEX_W_0F12_P_0_M_0,
2026   EVEX_W_0F12_P_0_M_1,
2027   EVEX_W_0F12_P_1,
2028   EVEX_W_0F12_P_2,
2029   EVEX_W_0F12_P_3,
2030   EVEX_W_0F13_P_0,
2031   EVEX_W_0F13_P_2,
2032   EVEX_W_0F14_P_0,
2033   EVEX_W_0F14_P_2,
2034   EVEX_W_0F15_P_0,
2035   EVEX_W_0F15_P_2,
2036   EVEX_W_0F16_P_0_M_0,
2037   EVEX_W_0F16_P_0_M_1,
2038   EVEX_W_0F16_P_1,
2039   EVEX_W_0F16_P_2,
2040   EVEX_W_0F17_P_0,
2041   EVEX_W_0F17_P_2,
2042   EVEX_W_0F28_P_0,
2043   EVEX_W_0F28_P_2,
2044   EVEX_W_0F29_P_0,
2045   EVEX_W_0F29_P_2,
2046   EVEX_W_0F2A_P_1,
2047   EVEX_W_0F2A_P_3,
2048   EVEX_W_0F2B_P_0,
2049   EVEX_W_0F2B_P_2,
2050   EVEX_W_0F2E_P_0,
2051   EVEX_W_0F2E_P_2,
2052   EVEX_W_0F2F_P_0,
2053   EVEX_W_0F2F_P_2,
2054   EVEX_W_0F51_P_0,
2055   EVEX_W_0F51_P_1,
2056   EVEX_W_0F51_P_2,
2057   EVEX_W_0F51_P_3,
2058   EVEX_W_0F54_P_0,
2059   EVEX_W_0F54_P_2,
2060   EVEX_W_0F55_P_0,
2061   EVEX_W_0F55_P_2,
2062   EVEX_W_0F56_P_0,
2063   EVEX_W_0F56_P_2,
2064   EVEX_W_0F57_P_0,
2065   EVEX_W_0F57_P_2,
2066   EVEX_W_0F58_P_0,
2067   EVEX_W_0F58_P_1,
2068   EVEX_W_0F58_P_2,
2069   EVEX_W_0F58_P_3,
2070   EVEX_W_0F59_P_0,
2071   EVEX_W_0F59_P_1,
2072   EVEX_W_0F59_P_2,
2073   EVEX_W_0F59_P_3,
2074   EVEX_W_0F5A_P_0,
2075   EVEX_W_0F5A_P_1,
2076   EVEX_W_0F5A_P_2,
2077   EVEX_W_0F5A_P_3,
2078   EVEX_W_0F5B_P_0,
2079   EVEX_W_0F5B_P_1,
2080   EVEX_W_0F5B_P_2,
2081   EVEX_W_0F5C_P_0,
2082   EVEX_W_0F5C_P_1,
2083   EVEX_W_0F5C_P_2,
2084   EVEX_W_0F5C_P_3,
2085   EVEX_W_0F5D_P_0,
2086   EVEX_W_0F5D_P_1,
2087   EVEX_W_0F5D_P_2,
2088   EVEX_W_0F5D_P_3,
2089   EVEX_W_0F5E_P_0,
2090   EVEX_W_0F5E_P_1,
2091   EVEX_W_0F5E_P_2,
2092   EVEX_W_0F5E_P_3,
2093   EVEX_W_0F5F_P_0,
2094   EVEX_W_0F5F_P_1,
2095   EVEX_W_0F5F_P_2,
2096   EVEX_W_0F5F_P_3,
2097   EVEX_W_0F62_P_2,
2098   EVEX_W_0F66_P_2,
2099   EVEX_W_0F6A_P_2,
2100   EVEX_W_0F6B_P_2,
2101   EVEX_W_0F6C_P_2,
2102   EVEX_W_0F6D_P_2,
2103   EVEX_W_0F6F_P_1,
2104   EVEX_W_0F6F_P_2,
2105   EVEX_W_0F6F_P_3,
2106   EVEX_W_0F70_P_2,
2107   EVEX_W_0F72_R_2_P_2,
2108   EVEX_W_0F72_R_6_P_2,
2109   EVEX_W_0F73_R_2_P_2,
2110   EVEX_W_0F73_R_6_P_2,
2111   EVEX_W_0F76_P_2,
2112   EVEX_W_0F78_P_0,
2113   EVEX_W_0F78_P_2,
2114   EVEX_W_0F79_P_0,
2115   EVEX_W_0F79_P_2,
2116   EVEX_W_0F7A_P_1,
2117   EVEX_W_0F7A_P_2,
2118   EVEX_W_0F7A_P_3,
2119   EVEX_W_0F7B_P_1,
2120   EVEX_W_0F7B_P_2,
2121   EVEX_W_0F7B_P_3,
2122   EVEX_W_0F7E_P_1,
2123   EVEX_W_0F7F_P_1,
2124   EVEX_W_0F7F_P_2,
2125   EVEX_W_0F7F_P_3,
2126   EVEX_W_0FC2_P_0,
2127   EVEX_W_0FC2_P_1,
2128   EVEX_W_0FC2_P_2,
2129   EVEX_W_0FC2_P_3,
2130   EVEX_W_0FC6_P_0,
2131   EVEX_W_0FC6_P_2,
2132   EVEX_W_0FD2_P_2,
2133   EVEX_W_0FD3_P_2,
2134   EVEX_W_0FD4_P_2,
2135   EVEX_W_0FD6_P_2,
2136   EVEX_W_0FE6_P_1,
2137   EVEX_W_0FE6_P_2,
2138   EVEX_W_0FE6_P_3,
2139   EVEX_W_0FE7_P_2,
2140   EVEX_W_0FF2_P_2,
2141   EVEX_W_0FF3_P_2,
2142   EVEX_W_0FF4_P_2,
2143   EVEX_W_0FFA_P_2,
2144   EVEX_W_0FFB_P_2,
2145   EVEX_W_0FFE_P_2,
2146   EVEX_W_0F380C_P_2,
2147   EVEX_W_0F380D_P_2,
2148   EVEX_W_0F3810_P_1,
2149   EVEX_W_0F3810_P_2,
2150   EVEX_W_0F3811_P_1,
2151   EVEX_W_0F3811_P_2,
2152   EVEX_W_0F3812_P_1,
2153   EVEX_W_0F3812_P_2,
2154   EVEX_W_0F3813_P_1,
2155   EVEX_W_0F3813_P_2,
2156   EVEX_W_0F3814_P_1,
2157   EVEX_W_0F3815_P_1,
2158   EVEX_W_0F3818_P_2,
2159   EVEX_W_0F3819_P_2,
2160   EVEX_W_0F381A_P_2,
2161   EVEX_W_0F381B_P_2,
2162   EVEX_W_0F381E_P_2,
2163   EVEX_W_0F381F_P_2,
2164   EVEX_W_0F3820_P_1,
2165   EVEX_W_0F3821_P_1,
2166   EVEX_W_0F3822_P_1,
2167   EVEX_W_0F3823_P_1,
2168   EVEX_W_0F3824_P_1,
2169   EVEX_W_0F3825_P_1,
2170   EVEX_W_0F3825_P_2,
2171   EVEX_W_0F3826_P_1,
2172   EVEX_W_0F3826_P_2,
2173   EVEX_W_0F3828_P_1,
2174   EVEX_W_0F3828_P_2,
2175   EVEX_W_0F3829_P_1,
2176   EVEX_W_0F3829_P_2,
2177   EVEX_W_0F382A_P_1,
2178   EVEX_W_0F382A_P_2,
2179   EVEX_W_0F382B_P_2,
2180   EVEX_W_0F3830_P_1,
2181   EVEX_W_0F3831_P_1,
2182   EVEX_W_0F3832_P_1,
2183   EVEX_W_0F3833_P_1,
2184   EVEX_W_0F3834_P_1,
2185   EVEX_W_0F3835_P_1,
2186   EVEX_W_0F3835_P_2,
2187   EVEX_W_0F3837_P_2,
2188   EVEX_W_0F3838_P_1,
2189   EVEX_W_0F3839_P_1,
2190   EVEX_W_0F383A_P_1,
2191   EVEX_W_0F3840_P_2,
2192   EVEX_W_0F3854_P_2,
2193   EVEX_W_0F3855_P_2,
2194   EVEX_W_0F3858_P_2,
2195   EVEX_W_0F3859_P_2,
2196   EVEX_W_0F385A_P_2,
2197   EVEX_W_0F385B_P_2,
2198   EVEX_W_0F3862_P_2,
2199   EVEX_W_0F3863_P_2,
2200   EVEX_W_0F3866_P_2,
2201   EVEX_W_0F3870_P_2,
2202   EVEX_W_0F3871_P_2,
2203   EVEX_W_0F3872_P_2,
2204   EVEX_W_0F3873_P_2,
2205   EVEX_W_0F3875_P_2,
2206   EVEX_W_0F3878_P_2,
2207   EVEX_W_0F3879_P_2,
2208   EVEX_W_0F387A_P_2,
2209   EVEX_W_0F387B_P_2,
2210   EVEX_W_0F387D_P_2,
2211   EVEX_W_0F3883_P_2,
2212   EVEX_W_0F388D_P_2,
2213   EVEX_W_0F3891_P_2,
2214   EVEX_W_0F3893_P_2,
2215   EVEX_W_0F38A1_P_2,
2216   EVEX_W_0F38A3_P_2,
2217   EVEX_W_0F38C7_R_1_P_2,
2218   EVEX_W_0F38C7_R_2_P_2,
2219   EVEX_W_0F38C7_R_5_P_2,
2220   EVEX_W_0F38C7_R_6_P_2,
2221
2222   EVEX_W_0F3A00_P_2,
2223   EVEX_W_0F3A01_P_2,
2224   EVEX_W_0F3A04_P_2,
2225   EVEX_W_0F3A05_P_2,
2226   EVEX_W_0F3A08_P_2,
2227   EVEX_W_0F3A09_P_2,
2228   EVEX_W_0F3A0A_P_2,
2229   EVEX_W_0F3A0B_P_2,
2230   EVEX_W_0F3A18_P_2,
2231   EVEX_W_0F3A19_P_2,
2232   EVEX_W_0F3A1A_P_2,
2233   EVEX_W_0F3A1B_P_2,
2234   EVEX_W_0F3A1D_P_2,
2235   EVEX_W_0F3A21_P_2,
2236   EVEX_W_0F3A23_P_2,
2237   EVEX_W_0F3A38_P_2,
2238   EVEX_W_0F3A39_P_2,
2239   EVEX_W_0F3A3A_P_2,
2240   EVEX_W_0F3A3B_P_2,
2241   EVEX_W_0F3A3E_P_2,
2242   EVEX_W_0F3A3F_P_2,
2243   EVEX_W_0F3A42_P_2,
2244   EVEX_W_0F3A43_P_2,
2245   EVEX_W_0F3A50_P_2,
2246   EVEX_W_0F3A51_P_2,
2247   EVEX_W_0F3A56_P_2,
2248   EVEX_W_0F3A57_P_2,
2249   EVEX_W_0F3A66_P_2,
2250   EVEX_W_0F3A67_P_2,
2251   EVEX_W_0F3A70_P_2,
2252   EVEX_W_0F3A71_P_2,
2253   EVEX_W_0F3A72_P_2,
2254   EVEX_W_0F3A73_P_2,
2255   EVEX_W_0F3ACE_P_2,
2256   EVEX_W_0F3ACF_P_2
2257 };
2258
2259 typedef void (*op_rtn) (int bytemode, int sizeflag);
2260
2261 struct dis386 {
2262   const char *name;
2263   struct
2264     {
2265       op_rtn rtn;
2266       int bytemode;
2267     } op[MAX_OPERANDS];
2268   unsigned int prefix_requirement;
2269 };
2270
2271 /* Upper case letters in the instruction names here are macros.
2272    'A' => print 'b' if no register operands or suffix_always is true
2273    'B' => print 'b' if suffix_always is true
2274    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2275           size prefix
2276    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2277           suffix_always is true
2278    'E' => print 'e' if 32-bit form of jcxz
2279    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2280    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2281    'H' => print ",pt" or ",pn" branch hint
2282    'I' => honor following macro letter even in Intel mode (implemented only
2283           for some of the macro letters)
2284    'J' => print 'l'
2285    'K' => print 'd' or 'q' if rex prefix is present.
2286    'L' => print 'l' if suffix_always is true
2287    'M' => print 'r' if intel_mnemonic is false.
2288    'N' => print 'n' if instruction has no wait "prefix"
2289    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2290    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2291           or suffix_always is true.  print 'q' if rex prefix is present.
2292    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2293           is true
2294    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2295    'S' => print 'w', 'l' or 'q' if suffix_always is true
2296    'T' => print 'q' in 64bit mode if instruction has no operand size
2297           prefix and behave as 'P' otherwise
2298    'U' => print 'q' in 64bit mode if instruction has no operand size
2299           prefix and behave as 'Q' otherwise
2300    'V' => print 'q' in 64bit mode if instruction has no operand size
2301           prefix and behave as 'S' otherwise
2302    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2303    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2304    'Y' unused.
2305    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2306    '!' => change condition from true to false or from false to true.
2307    '%' => add 1 upper case letter to the macro.
2308    '^' => print 'w' or 'l' depending on operand size prefix or
2309           suffix_always is true (lcall/ljmp).
2310    '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2311           on operand size prefix.
2312    '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2313           has no operand size prefix for AMD64 ISA, behave as 'P'
2314           otherwise
2315
2316    2 upper case letter macros:
2317    "XY" => print 'x' or 'y' if suffix_always is true or no register
2318            operands and no broadcast.
2319    "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2320            register operands and no broadcast.
2321    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2322    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2323            or suffix_always is true
2324    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2325    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2326    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2327    "LW" => print 'd', 'q' depending on the VEX.W bit
2328    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2329            an operand size prefix, or suffix_always is true.  print
2330            'q' if rex prefix is present.
2331
2332    Many of the above letters print nothing in Intel mode.  See "putop"
2333    for the details.
2334
2335    Braces '{' and '}', and vertical bars '|', indicate alternative
2336    mnemonic strings for AT&T and Intel.  */
2337
2338 static const struct dis386 dis386[] = {
2339   /* 00 */
2340   { "addB",             { Ebh1, Gb }, 0 },
2341   { "addS",             { Evh1, Gv }, 0 },
2342   { "addB",             { Gb, EbS }, 0 },
2343   { "addS",             { Gv, EvS }, 0 },
2344   { "addB",             { AL, Ib }, 0 },
2345   { "addS",             { eAX, Iv }, 0 },
2346   { X86_64_TABLE (X86_64_06) },
2347   { X86_64_TABLE (X86_64_07) },
2348   /* 08 */
2349   { "orB",              { Ebh1, Gb }, 0 },
2350   { "orS",              { Evh1, Gv }, 0 },
2351   { "orB",              { Gb, EbS }, 0 },
2352   { "orS",              { Gv, EvS }, 0 },
2353   { "orB",              { AL, Ib }, 0 },
2354   { "orS",              { eAX, Iv }, 0 },
2355   { X86_64_TABLE (X86_64_0D) },
2356   { Bad_Opcode },       /* 0x0f extended opcode escape */
2357   /* 10 */
2358   { "adcB",             { Ebh1, Gb }, 0 },
2359   { "adcS",             { Evh1, Gv }, 0 },
2360   { "adcB",             { Gb, EbS }, 0 },
2361   { "adcS",             { Gv, EvS }, 0 },
2362   { "adcB",             { AL, Ib }, 0 },
2363   { "adcS",             { eAX, Iv }, 0 },
2364   { X86_64_TABLE (X86_64_16) },
2365   { X86_64_TABLE (X86_64_17) },
2366   /* 18 */
2367   { "sbbB",             { Ebh1, Gb }, 0 },
2368   { "sbbS",             { Evh1, Gv }, 0 },
2369   { "sbbB",             { Gb, EbS }, 0 },
2370   { "sbbS",             { Gv, EvS }, 0 },
2371   { "sbbB",             { AL, Ib }, 0 },
2372   { "sbbS",             { eAX, Iv }, 0 },
2373   { X86_64_TABLE (X86_64_1E) },
2374   { X86_64_TABLE (X86_64_1F) },
2375   /* 20 */
2376   { "andB",             { Ebh1, Gb }, 0 },
2377   { "andS",             { Evh1, Gv }, 0 },
2378   { "andB",             { Gb, EbS }, 0 },
2379   { "andS",             { Gv, EvS }, 0 },
2380   { "andB",             { AL, Ib }, 0 },
2381   { "andS",             { eAX, Iv }, 0 },
2382   { Bad_Opcode },       /* SEG ES prefix */
2383   { X86_64_TABLE (X86_64_27) },
2384   /* 28 */
2385   { "subB",             { Ebh1, Gb }, 0 },
2386   { "subS",             { Evh1, Gv }, 0 },
2387   { "subB",             { Gb, EbS }, 0 },
2388   { "subS",             { Gv, EvS }, 0 },
2389   { "subB",             { AL, Ib }, 0 },
2390   { "subS",             { eAX, Iv }, 0 },
2391   { Bad_Opcode },       /* SEG CS prefix */
2392   { X86_64_TABLE (X86_64_2F) },
2393   /* 30 */
2394   { "xorB",             { Ebh1, Gb }, 0 },
2395   { "xorS",             { Evh1, Gv }, 0 },
2396   { "xorB",             { Gb, EbS }, 0 },
2397   { "xorS",             { Gv, EvS }, 0 },
2398   { "xorB",             { AL, Ib }, 0 },
2399   { "xorS",             { eAX, Iv }, 0 },
2400   { Bad_Opcode },       /* SEG SS prefix */
2401   { X86_64_TABLE (X86_64_37) },
2402   /* 38 */
2403   { "cmpB",             { Eb, Gb }, 0 },
2404   { "cmpS",             { Ev, Gv }, 0 },
2405   { "cmpB",             { Gb, EbS }, 0 },
2406   { "cmpS",             { Gv, EvS }, 0 },
2407   { "cmpB",             { AL, Ib }, 0 },
2408   { "cmpS",             { eAX, Iv }, 0 },
2409   { Bad_Opcode },       /* SEG DS prefix */
2410   { X86_64_TABLE (X86_64_3F) },
2411   /* 40 */
2412   { "inc{S|}",          { RMeAX }, 0 },
2413   { "inc{S|}",          { RMeCX }, 0 },
2414   { "inc{S|}",          { RMeDX }, 0 },
2415   { "inc{S|}",          { RMeBX }, 0 },
2416   { "inc{S|}",          { RMeSP }, 0 },
2417   { "inc{S|}",          { RMeBP }, 0 },
2418   { "inc{S|}",          { RMeSI }, 0 },
2419   { "inc{S|}",          { RMeDI }, 0 },
2420   /* 48 */
2421   { "dec{S|}",          { RMeAX }, 0 },
2422   { "dec{S|}",          { RMeCX }, 0 },
2423   { "dec{S|}",          { RMeDX }, 0 },
2424   { "dec{S|}",          { RMeBX }, 0 },
2425   { "dec{S|}",          { RMeSP }, 0 },
2426   { "dec{S|}",          { RMeBP }, 0 },
2427   { "dec{S|}",          { RMeSI }, 0 },
2428   { "dec{S|}",          { RMeDI }, 0 },
2429   /* 50 */
2430   { "pushV",            { RMrAX }, 0 },
2431   { "pushV",            { RMrCX }, 0 },
2432   { "pushV",            { RMrDX }, 0 },
2433   { "pushV",            { RMrBX }, 0 },
2434   { "pushV",            { RMrSP }, 0 },
2435   { "pushV",            { RMrBP }, 0 },
2436   { "pushV",            { RMrSI }, 0 },
2437   { "pushV",            { RMrDI }, 0 },
2438   /* 58 */
2439   { "popV",             { RMrAX }, 0 },
2440   { "popV",             { RMrCX }, 0 },
2441   { "popV",             { RMrDX }, 0 },
2442   { "popV",             { RMrBX }, 0 },
2443   { "popV",             { RMrSP }, 0 },
2444   { "popV",             { RMrBP }, 0 },
2445   { "popV",             { RMrSI }, 0 },
2446   { "popV",             { RMrDI }, 0 },
2447   /* 60 */
2448   { X86_64_TABLE (X86_64_60) },
2449   { X86_64_TABLE (X86_64_61) },
2450   { X86_64_TABLE (X86_64_62) },
2451   { X86_64_TABLE (X86_64_63) },
2452   { Bad_Opcode },       /* seg fs */
2453   { Bad_Opcode },       /* seg gs */
2454   { Bad_Opcode },       /* op size prefix */
2455   { Bad_Opcode },       /* adr size prefix */
2456   /* 68 */
2457   { "pushT",            { sIv }, 0 },
2458   { "imulS",            { Gv, Ev, Iv }, 0 },
2459   { "pushT",            { sIbT }, 0 },
2460   { "imulS",            { Gv, Ev, sIb }, 0 },
2461   { "ins{b|}",          { Ybr, indirDX }, 0 },
2462   { X86_64_TABLE (X86_64_6D) },
2463   { "outs{b|}",         { indirDXr, Xb }, 0 },
2464   { X86_64_TABLE (X86_64_6F) },
2465   /* 70 */
2466   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2467   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2468   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2469   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2470   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2471   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2472   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2473   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2474   /* 78 */
2475   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2476   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2477   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2478   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2479   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2480   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2481   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2482   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2483   /* 80 */
2484   { REG_TABLE (REG_80) },
2485   { REG_TABLE (REG_81) },
2486   { X86_64_TABLE (X86_64_82) },
2487   { REG_TABLE (REG_83) },
2488   { "testB",            { Eb, Gb }, 0 },
2489   { "testS",            { Ev, Gv }, 0 },
2490   { "xchgB",            { Ebh2, Gb }, 0 },
2491   { "xchgS",            { Evh2, Gv }, 0 },
2492   /* 88 */
2493   { "movB",             { Ebh3, Gb }, 0 },
2494   { "movS",             { Evh3, Gv }, 0 },
2495   { "movB",             { Gb, EbS }, 0 },
2496   { "movS",             { Gv, EvS }, 0 },
2497   { "movD",             { Sv, Sw }, 0 },
2498   { MOD_TABLE (MOD_8D) },
2499   { "movD",             { Sw, Sv }, 0 },
2500   { REG_TABLE (REG_8F) },
2501   /* 90 */
2502   { PREFIX_TABLE (PREFIX_90) },
2503   { "xchgS",            { RMeCX, eAX }, 0 },
2504   { "xchgS",            { RMeDX, eAX }, 0 },
2505   { "xchgS",            { RMeBX, eAX }, 0 },
2506   { "xchgS",            { RMeSP, eAX }, 0 },
2507   { "xchgS",            { RMeBP, eAX }, 0 },
2508   { "xchgS",            { RMeSI, eAX }, 0 },
2509   { "xchgS",            { RMeDI, eAX }, 0 },
2510   /* 98 */
2511   { "cW{t|}R",          { XX }, 0 },
2512   { "cR{t|}O",          { XX }, 0 },
2513   { X86_64_TABLE (X86_64_9A) },
2514   { Bad_Opcode },       /* fwait */
2515   { "pushfT",           { XX }, 0 },
2516   { "popfT",            { XX }, 0 },
2517   { "sahf",             { XX }, 0 },
2518   { "lahf",             { XX }, 0 },
2519   /* a0 */
2520   { "mov%LB",           { AL, Ob }, 0 },
2521   { "mov%LS",           { eAX, Ov }, 0 },
2522   { "mov%LB",           { Ob, AL }, 0 },
2523   { "mov%LS",           { Ov, eAX }, 0 },
2524   { "movs{b|}",         { Ybr, Xb }, 0 },
2525   { "movs{R|}",         { Yvr, Xv }, 0 },
2526   { "cmps{b|}",         { Xb, Yb }, 0 },
2527   { "cmps{R|}",         { Xv, Yv }, 0 },
2528   /* a8 */
2529   { "testB",            { AL, Ib }, 0 },
2530   { "testS",            { eAX, Iv }, 0 },
2531   { "stosB",            { Ybr, AL }, 0 },
2532   { "stosS",            { Yvr, eAX }, 0 },
2533   { "lodsB",            { ALr, Xb }, 0 },
2534   { "lodsS",            { eAXr, Xv }, 0 },
2535   { "scasB",            { AL, Yb }, 0 },
2536   { "scasS",            { eAX, Yv }, 0 },
2537   /* b0 */
2538   { "movB",             { RMAL, Ib }, 0 },
2539   { "movB",             { RMCL, Ib }, 0 },
2540   { "movB",             { RMDL, Ib }, 0 },
2541   { "movB",             { RMBL, Ib }, 0 },
2542   { "movB",             { RMAH, Ib }, 0 },
2543   { "movB",             { RMCH, Ib }, 0 },
2544   { "movB",             { RMDH, Ib }, 0 },
2545   { "movB",             { RMBH, Ib }, 0 },
2546   /* b8 */
2547   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2548   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2549   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2550   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2551   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2552   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2553   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2554   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2555   /* c0 */
2556   { REG_TABLE (REG_C0) },
2557   { REG_TABLE (REG_C1) },
2558   { "retT",             { Iw, BND }, 0 },
2559   { "retT",             { BND }, 0 },
2560   { X86_64_TABLE (X86_64_C4) },
2561   { X86_64_TABLE (X86_64_C5) },
2562   { REG_TABLE (REG_C6) },
2563   { REG_TABLE (REG_C7) },
2564   /* c8 */
2565   { "enterT",           { Iw, Ib }, 0 },
2566   { "leaveT",           { XX }, 0 },
2567   { "Jret{|f}P",        { Iw }, 0 },
2568   { "Jret{|f}P",        { XX }, 0 },
2569   { "int3",             { XX }, 0 },
2570   { "int",              { Ib }, 0 },
2571   { X86_64_TABLE (X86_64_CE) },
2572   { "iret%LP",          { XX }, 0 },
2573   /* d0 */
2574   { REG_TABLE (REG_D0) },
2575   { REG_TABLE (REG_D1) },
2576   { REG_TABLE (REG_D2) },
2577   { REG_TABLE (REG_D3) },
2578   { X86_64_TABLE (X86_64_D4) },
2579   { X86_64_TABLE (X86_64_D5) },
2580   { Bad_Opcode },
2581   { "xlat",             { DSBX }, 0 },
2582   /* d8 */
2583   { FLOAT },
2584   { FLOAT },
2585   { FLOAT },
2586   { FLOAT },
2587   { FLOAT },
2588   { FLOAT },
2589   { FLOAT },
2590   { FLOAT },
2591   /* e0 */
2592   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2593   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2594   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2595   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2596   { "inB",              { AL, Ib }, 0 },
2597   { "inG",              { zAX, Ib }, 0 },
2598   { "outB",             { Ib, AL }, 0 },
2599   { "outG",             { Ib, zAX }, 0 },
2600   /* e8 */
2601   { X86_64_TABLE (X86_64_E8) },
2602   { X86_64_TABLE (X86_64_E9) },
2603   { X86_64_TABLE (X86_64_EA) },
2604   { "jmp",              { Jb, BND }, 0 },
2605   { "inB",              { AL, indirDX }, 0 },
2606   { "inG",              { zAX, indirDX }, 0 },
2607   { "outB",             { indirDX, AL }, 0 },
2608   { "outG",             { indirDX, zAX }, 0 },
2609   /* f0 */
2610   { Bad_Opcode },       /* lock prefix */
2611   { "icebp",            { XX }, 0 },
2612   { Bad_Opcode },       /* repne */
2613   { Bad_Opcode },       /* repz */
2614   { "hlt",              { XX }, 0 },
2615   { "cmc",              { XX }, 0 },
2616   { REG_TABLE (REG_F6) },
2617   { REG_TABLE (REG_F7) },
2618   /* f8 */
2619   { "clc",              { XX }, 0 },
2620   { "stc",              { XX }, 0 },
2621   { "cli",              { XX }, 0 },
2622   { "sti",              { XX }, 0 },
2623   { "cld",              { XX }, 0 },
2624   { "std",              { XX }, 0 },
2625   { REG_TABLE (REG_FE) },
2626   { REG_TABLE (REG_FF) },
2627 };
2628
2629 static const struct dis386 dis386_twobyte[] = {
2630   /* 00 */
2631   { REG_TABLE (REG_0F00 ) },
2632   { REG_TABLE (REG_0F01 ) },
2633   { "larS",             { Gv, Ew }, 0 },
2634   { "lslS",             { Gv, Ew }, 0 },
2635   { Bad_Opcode },
2636   { "syscall",          { XX }, 0 },
2637   { "clts",             { XX }, 0 },
2638   { "sysret%LP",                { XX }, 0 },
2639   /* 08 */
2640   { "invd",             { XX }, 0 },
2641   { PREFIX_TABLE (PREFIX_0F09) },
2642   { Bad_Opcode },
2643   { "ud2",              { XX }, 0 },
2644   { Bad_Opcode },
2645   { REG_TABLE (REG_0F0D) },
2646   { "femms",            { XX }, 0 },
2647   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2648   /* 10 */
2649   { PREFIX_TABLE (PREFIX_0F10) },
2650   { PREFIX_TABLE (PREFIX_0F11) },
2651   { PREFIX_TABLE (PREFIX_0F12) },
2652   { MOD_TABLE (MOD_0F13) },
2653   { "unpcklpX",         { XM, EXx }, PREFIX_OPCODE },
2654   { "unpckhpX",         { XM, EXx }, PREFIX_OPCODE },
2655   { PREFIX_TABLE (PREFIX_0F16) },
2656   { MOD_TABLE (MOD_0F17) },
2657   /* 18 */
2658   { REG_TABLE (REG_0F18) },
2659   { "nopQ",             { Ev }, 0 },
2660   { PREFIX_TABLE (PREFIX_0F1A) },
2661   { PREFIX_TABLE (PREFIX_0F1B) },
2662   { PREFIX_TABLE (PREFIX_0F1C) },
2663   { "nopQ",             { Ev }, 0 },
2664   { PREFIX_TABLE (PREFIX_0F1E) },
2665   { "nopQ",             { Ev }, 0 },
2666   /* 20 */
2667   { "movZ",             { Rm, Cm }, 0 },
2668   { "movZ",             { Rm, Dm }, 0 },
2669   { "movZ",             { Cm, Rm }, 0 },
2670   { "movZ",             { Dm, Rm }, 0 },
2671   { MOD_TABLE (MOD_0F24) },
2672   { Bad_Opcode },
2673   { MOD_TABLE (MOD_0F26) },
2674   { Bad_Opcode },
2675   /* 28 */
2676   { "movapX",           { XM, EXx }, PREFIX_OPCODE },
2677   { "movapX",           { EXxS, XM }, PREFIX_OPCODE },
2678   { PREFIX_TABLE (PREFIX_0F2A) },
2679   { PREFIX_TABLE (PREFIX_0F2B) },
2680   { PREFIX_TABLE (PREFIX_0F2C) },
2681   { PREFIX_TABLE (PREFIX_0F2D) },
2682   { PREFIX_TABLE (PREFIX_0F2E) },
2683   { PREFIX_TABLE (PREFIX_0F2F) },
2684   /* 30 */
2685   { "wrmsr",            { XX }, 0 },
2686   { "rdtsc",            { XX }, 0 },
2687   { "rdmsr",            { XX }, 0 },
2688   { "rdpmc",            { XX }, 0 },
2689   { "sysenter",         { XX }, 0 },
2690   { "sysexit",          { XX }, 0 },
2691   { Bad_Opcode },
2692   { "getsec",           { XX }, 0 },
2693   /* 38 */
2694   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2695   { Bad_Opcode },
2696   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2697   { Bad_Opcode },
2698   { Bad_Opcode },
2699   { Bad_Opcode },
2700   { Bad_Opcode },
2701   { Bad_Opcode },
2702   /* 40 */
2703   { "cmovoS",           { Gv, Ev }, 0 },
2704   { "cmovnoS",          { Gv, Ev }, 0 },
2705   { "cmovbS",           { Gv, Ev }, 0 },
2706   { "cmovaeS",          { Gv, Ev }, 0 },
2707   { "cmoveS",           { Gv, Ev }, 0 },
2708   { "cmovneS",          { Gv, Ev }, 0 },
2709   { "cmovbeS",          { Gv, Ev }, 0 },
2710   { "cmovaS",           { Gv, Ev }, 0 },
2711   /* 48 */
2712   { "cmovsS",           { Gv, Ev }, 0 },
2713   { "cmovnsS",          { Gv, Ev }, 0 },
2714   { "cmovpS",           { Gv, Ev }, 0 },
2715   { "cmovnpS",          { Gv, Ev }, 0 },
2716   { "cmovlS",           { Gv, Ev }, 0 },
2717   { "cmovgeS",          { Gv, Ev }, 0 },
2718   { "cmovleS",          { Gv, Ev }, 0 },
2719   { "cmovgS",           { Gv, Ev }, 0 },
2720   /* 50 */
2721   { MOD_TABLE (MOD_0F51) },
2722   { PREFIX_TABLE (PREFIX_0F51) },
2723   { PREFIX_TABLE (PREFIX_0F52) },
2724   { PREFIX_TABLE (PREFIX_0F53) },
2725   { "andpX",            { XM, EXx }, PREFIX_OPCODE },
2726   { "andnpX",           { XM, EXx }, PREFIX_OPCODE },
2727   { "orpX",             { XM, EXx }, PREFIX_OPCODE },
2728   { "xorpX",            { XM, EXx }, PREFIX_OPCODE },
2729   /* 58 */
2730   { PREFIX_TABLE (PREFIX_0F58) },
2731   { PREFIX_TABLE (PREFIX_0F59) },
2732   { PREFIX_TABLE (PREFIX_0F5A) },
2733   { PREFIX_TABLE (PREFIX_0F5B) },
2734   { PREFIX_TABLE (PREFIX_0F5C) },
2735   { PREFIX_TABLE (PREFIX_0F5D) },
2736   { PREFIX_TABLE (PREFIX_0F5E) },
2737   { PREFIX_TABLE (PREFIX_0F5F) },
2738   /* 60 */
2739   { PREFIX_TABLE (PREFIX_0F60) },
2740   { PREFIX_TABLE (PREFIX_0F61) },
2741   { PREFIX_TABLE (PREFIX_0F62) },
2742   { "packsswb",         { MX, EM }, PREFIX_OPCODE },
2743   { "pcmpgtb",          { MX, EM }, PREFIX_OPCODE },
2744   { "pcmpgtw",          { MX, EM }, PREFIX_OPCODE },
2745   { "pcmpgtd",          { MX, EM }, PREFIX_OPCODE },
2746   { "packuswb",         { MX, EM }, PREFIX_OPCODE },
2747   /* 68 */
2748   { "punpckhbw",        { MX, EM }, PREFIX_OPCODE },
2749   { "punpckhwd",        { MX, EM }, PREFIX_OPCODE },
2750   { "punpckhdq",        { MX, EM }, PREFIX_OPCODE },
2751   { "packssdw",         { MX, EM }, PREFIX_OPCODE },
2752   { PREFIX_TABLE (PREFIX_0F6C) },
2753   { PREFIX_TABLE (PREFIX_0F6D) },
2754   { "movK",             { MX, Edq }, PREFIX_OPCODE },
2755   { PREFIX_TABLE (PREFIX_0F6F) },
2756   /* 70 */
2757   { PREFIX_TABLE (PREFIX_0F70) },
2758   { REG_TABLE (REG_0F71) },
2759   { REG_TABLE (REG_0F72) },
2760   { REG_TABLE (REG_0F73) },
2761   { "pcmpeqb",          { MX, EM }, PREFIX_OPCODE },
2762   { "pcmpeqw",          { MX, EM }, PREFIX_OPCODE },
2763   { "pcmpeqd",          { MX, EM }, PREFIX_OPCODE },
2764   { "emms",             { XX }, PREFIX_OPCODE },
2765   /* 78 */
2766   { PREFIX_TABLE (PREFIX_0F78) },
2767   { PREFIX_TABLE (PREFIX_0F79) },
2768   { Bad_Opcode },
2769   { Bad_Opcode },
2770   { PREFIX_TABLE (PREFIX_0F7C) },
2771   { PREFIX_TABLE (PREFIX_0F7D) },
2772   { PREFIX_TABLE (PREFIX_0F7E) },
2773   { PREFIX_TABLE (PREFIX_0F7F) },
2774   /* 80 */
2775   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2776   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2777   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2778   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2779   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2780   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2781   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2782   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2783   /* 88 */
2784   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2785   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2786   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2787   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2788   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2789   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2790   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2791   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2792   /* 90 */
2793   { "seto",             { Eb }, 0 },
2794   { "setno",            { Eb }, 0 },
2795   { "setb",             { Eb }, 0 },
2796   { "setae",            { Eb }, 0 },
2797   { "sete",             { Eb }, 0 },
2798   { "setne",            { Eb }, 0 },
2799   { "setbe",            { Eb }, 0 },
2800   { "seta",             { Eb }, 0 },
2801   /* 98 */
2802   { "sets",             { Eb }, 0 },
2803   { "setns",            { Eb }, 0 },
2804   { "setp",             { Eb }, 0 },
2805   { "setnp",            { Eb }, 0 },
2806   { "setl",             { Eb }, 0 },
2807   { "setge",            { Eb }, 0 },
2808   { "setle",            { Eb }, 0 },
2809   { "setg",             { Eb }, 0 },
2810   /* a0 */
2811   { "pushT",            { fs }, 0 },
2812   { "popT",             { fs }, 0 },
2813   { "cpuid",            { XX }, 0 },
2814   { "btS",              { Ev, Gv }, 0 },
2815   { "shldS",            { Ev, Gv, Ib }, 0 },
2816   { "shldS",            { Ev, Gv, CL }, 0 },
2817   { REG_TABLE (REG_0FA6) },
2818   { REG_TABLE (REG_0FA7) },
2819   /* a8 */
2820   { "pushT",            { gs }, 0 },
2821   { "popT",             { gs }, 0 },
2822   { "rsm",              { XX }, 0 },
2823   { "btsS",             { Evh1, Gv }, 0 },
2824   { "shrdS",            { Ev, Gv, Ib }, 0 },
2825   { "shrdS",            { Ev, Gv, CL }, 0 },
2826   { REG_TABLE (REG_0FAE) },
2827   { "imulS",            { Gv, Ev }, 0 },
2828   /* b0 */
2829   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2830   { "cmpxchgS",         { Evh1, Gv }, 0 },
2831   { MOD_TABLE (MOD_0FB2) },
2832   { "btrS",             { Evh1, Gv }, 0 },
2833   { MOD_TABLE (MOD_0FB4) },
2834   { MOD_TABLE (MOD_0FB5) },
2835   { "movz{bR|x}",       { Gv, Eb }, 0 },
2836   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2837   /* b8 */
2838   { PREFIX_TABLE (PREFIX_0FB8) },
2839   { "ud1S",             { Gv, Ev }, 0 },
2840   { REG_TABLE (REG_0FBA) },
2841   { "btcS",             { Evh1, Gv }, 0 },
2842   { PREFIX_TABLE (PREFIX_0FBC) },
2843   { PREFIX_TABLE (PREFIX_0FBD) },
2844   { "movs{bR|x}",       { Gv, Eb }, 0 },
2845   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2846   /* c0 */
2847   { "xaddB",            { Ebh1, Gb }, 0 },
2848   { "xaddS",            { Evh1, Gv }, 0 },
2849   { PREFIX_TABLE (PREFIX_0FC2) },
2850   { MOD_TABLE (MOD_0FC3) },
2851   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_OPCODE },
2852   { "pextrw",           { Gdq, MS, Ib }, PREFIX_OPCODE },
2853   { "shufpX",           { XM, EXx, Ib }, PREFIX_OPCODE },
2854   { REG_TABLE (REG_0FC7) },
2855   /* c8 */
2856   { "bswap",            { RMeAX }, 0 },
2857   { "bswap",            { RMeCX }, 0 },
2858   { "bswap",            { RMeDX }, 0 },
2859   { "bswap",            { RMeBX }, 0 },
2860   { "bswap",            { RMeSP }, 0 },
2861   { "bswap",            { RMeBP }, 0 },
2862   { "bswap",            { RMeSI }, 0 },
2863   { "bswap",            { RMeDI }, 0 },
2864   /* d0 */
2865   { PREFIX_TABLE (PREFIX_0FD0) },
2866   { "psrlw",            { MX, EM }, PREFIX_OPCODE },
2867   { "psrld",            { MX, EM }, PREFIX_OPCODE },
2868   { "psrlq",            { MX, EM }, PREFIX_OPCODE },
2869   { "paddq",            { MX, EM }, PREFIX_OPCODE },
2870   { "pmullw",           { MX, EM }, PREFIX_OPCODE },
2871   { PREFIX_TABLE (PREFIX_0FD6) },
2872   { MOD_TABLE (MOD_0FD7) },
2873   /* d8 */
2874   { "psubusb",          { MX, EM }, PREFIX_OPCODE },
2875   { "psubusw",          { MX, EM }, PREFIX_OPCODE },
2876   { "pminub",           { MX, EM }, PREFIX_OPCODE },
2877   { "pand",             { MX, EM }, PREFIX_OPCODE },
2878   { "paddusb",          { MX, EM }, PREFIX_OPCODE },
2879   { "paddusw",          { MX, EM }, PREFIX_OPCODE },
2880   { "pmaxub",           { MX, EM }, PREFIX_OPCODE },
2881   { "pandn",            { MX, EM }, PREFIX_OPCODE },
2882   /* e0 */
2883   { "pavgb",            { MX, EM }, PREFIX_OPCODE },
2884   { "psraw",            { MX, EM }, PREFIX_OPCODE },
2885   { "psrad",            { MX, EM }, PREFIX_OPCODE },
2886   { "pavgw",            { MX, EM }, PREFIX_OPCODE },
2887   { "pmulhuw",          { MX, EM }, PREFIX_OPCODE },
2888   { "pmulhw",           { MX, EM }, PREFIX_OPCODE },
2889   { PREFIX_TABLE (PREFIX_0FE6) },
2890   { PREFIX_TABLE (PREFIX_0FE7) },
2891   /* e8 */
2892   { "psubsb",           { MX, EM }, PREFIX_OPCODE },
2893   { "psubsw",           { MX, EM }, PREFIX_OPCODE },
2894   { "pminsw",           { MX, EM }, PREFIX_OPCODE },
2895   { "por",              { MX, EM }, PREFIX_OPCODE },
2896   { "paddsb",           { MX, EM }, PREFIX_OPCODE },
2897   { "paddsw",           { MX, EM }, PREFIX_OPCODE },
2898   { "pmaxsw",           { MX, EM }, PREFIX_OPCODE },
2899   { "pxor",             { MX, EM }, PREFIX_OPCODE },
2900   /* f0 */
2901   { PREFIX_TABLE (PREFIX_0FF0) },
2902   { "psllw",            { MX, EM }, PREFIX_OPCODE },
2903   { "pslld",            { MX, EM }, PREFIX_OPCODE },
2904   { "psllq",            { MX, EM }, PREFIX_OPCODE },
2905   { "pmuludq",          { MX, EM }, PREFIX_OPCODE },
2906   { "pmaddwd",          { MX, EM }, PREFIX_OPCODE },
2907   { "psadbw",           { MX, EM }, PREFIX_OPCODE },
2908   { PREFIX_TABLE (PREFIX_0FF7) },
2909   /* f8 */
2910   { "psubb",            { MX, EM }, PREFIX_OPCODE },
2911   { "psubw",            { MX, EM }, PREFIX_OPCODE },
2912   { "psubd",            { MX, EM }, PREFIX_OPCODE },
2913   { "psubq",            { MX, EM }, PREFIX_OPCODE },
2914   { "paddb",            { MX, EM }, PREFIX_OPCODE },
2915   { "paddw",            { MX, EM }, PREFIX_OPCODE },
2916   { "paddd",            { MX, EM }, PREFIX_OPCODE },
2917   { "ud0S",             { Gv, Ev }, 0 },
2918 };
2919
2920 static const unsigned char onebyte_has_modrm[256] = {
2921   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2922   /*       -------------------------------        */
2923   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2924   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2925   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2926   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2927   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2928   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2929   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2930   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2931   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2932   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2933   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2934   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2935   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2936   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2937   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2938   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2939   /*       -------------------------------        */
2940   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2941 };
2942
2943 static const unsigned char twobyte_has_modrm[256] = {
2944   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2945   /*       -------------------------------        */
2946   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2947   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2948   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2949   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2950   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2951   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2952   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2953   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2954   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2955   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2956   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2957   /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2958   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2959   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2960   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2961   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2962   /*       -------------------------------        */
2963   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2964 };
2965
2966 static char obuf[100];
2967 static char *obufp;
2968 static char *mnemonicendp;
2969 static char scratchbuf[100];
2970 static unsigned char *start_codep;
2971 static unsigned char *insn_codep;
2972 static unsigned char *codep;
2973 static unsigned char *end_codep;
2974 static int last_lock_prefix;
2975 static int last_repz_prefix;
2976 static int last_repnz_prefix;
2977 static int last_data_prefix;
2978 static int last_addr_prefix;
2979 static int last_rex_prefix;
2980 static int last_seg_prefix;
2981 static int fwait_prefix;
2982 /* The active segment register prefix.  */
2983 static int active_seg_prefix;
2984 #define MAX_CODE_LENGTH 15
2985 /* We can up to 14 prefixes since the maximum instruction length is
2986    15bytes.  */
2987 static int all_prefixes[MAX_CODE_LENGTH - 1];
2988 static disassemble_info *the_info;
2989 static struct
2990   {
2991     int mod;
2992     int reg;
2993     int rm;
2994   }
2995 modrm;
2996 static unsigned char need_modrm;
2997 static struct
2998   {
2999     int scale;
3000     int index;
3001     int base;
3002   }
3003 sib;
3004 static struct
3005   {
3006     int register_specifier;
3007     int length;
3008     int prefix;
3009     int w;
3010     int evex;
3011     int r;
3012     int v;
3013     int mask_register_specifier;
3014     int zeroing;
3015     int ll;
3016     int b;
3017   }
3018 vex;
3019 static unsigned char need_vex;
3020 static unsigned char need_vex_reg;
3021 static unsigned char vex_w_done;
3022
3023 struct op
3024   {
3025     const char *name;
3026     unsigned int len;
3027   };
3028
3029 /* If we are accessing mod/rm/reg without need_modrm set, then the
3030    values are stale.  Hitting this abort likely indicates that you
3031    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3032 #define MODRM_CHECK  if (!need_modrm) abort ()
3033
3034 static const char **names64;
3035 static const char **names32;
3036 static const char **names16;
3037 static const char **names8;
3038 static const char **names8rex;
3039 static const char **names_seg;
3040 static const char *index64;
3041 static const char *index32;
3042 static const char **index16;
3043 static const char **names_bnd;
3044
3045 static const char *intel_names64[] = {
3046   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3047   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3048 };
3049 static const char *intel_names32[] = {
3050   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3051   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3052 };
3053 static const char *intel_names16[] = {
3054   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3055   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3056 };
3057 static const char *intel_names8[] = {
3058   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3059 };
3060 static const char *intel_names8rex[] = {
3061   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3062   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3063 };
3064 static const char *intel_names_seg[] = {
3065   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3066 };
3067 static const char *intel_index64 = "riz";
3068 static const char *intel_index32 = "eiz";
3069 static const char *intel_index16[] = {
3070   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3071 };
3072
3073 static const char *att_names64[] = {
3074   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3075   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3076 };
3077 static const char *att_names32[] = {
3078   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3079   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3080 };
3081 static const char *att_names16[] = {
3082   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3083   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3084 };
3085 static const char *att_names8[] = {
3086   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3087 };
3088 static const char *att_names8rex[] = {
3089   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3090   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3091 };
3092 static const char *att_names_seg[] = {
3093   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3094 };
3095 static const char *att_index64 = "%riz";
3096 static const char *att_index32 = "%eiz";
3097 static const char *att_index16[] = {
3098   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3099 };
3100
3101 static const char **names_mm;
3102 static const char *intel_names_mm[] = {
3103   "mm0", "mm1", "mm2", "mm3",
3104   "mm4", "mm5", "mm6", "mm7"
3105 };
3106 static const char *att_names_mm[] = {
3107   "%mm0", "%mm1", "%mm2", "%mm3",
3108   "%mm4", "%mm5", "%mm6", "%mm7"
3109 };
3110
3111 static const char *intel_names_bnd[] = {
3112   "bnd0", "bnd1", "bnd2", "bnd3"
3113 };
3114
3115 static const char *att_names_bnd[] = {
3116   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3117 };
3118
3119 static const char **names_xmm;
3120 static const char *intel_names_xmm[] = {
3121   "xmm0", "xmm1", "xmm2", "xmm3",
3122   "xmm4", "xmm5", "xmm6", "xmm7",
3123   "xmm8", "xmm9", "xmm10", "xmm11",
3124   "xmm12", "xmm13", "xmm14", "xmm15",
3125   "xmm16", "xmm17", "xmm18", "xmm19",
3126   "xmm20", "xmm21", "xmm22", "xmm23",
3127   "xmm24", "xmm25", "xmm26", "xmm27",
3128   "xmm28", "xmm29", "xmm30", "xmm31"
3129 };
3130 static const char *att_names_xmm[] = {
3131   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3132   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3133   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3134   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3135   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3136   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3137   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3138   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3139 };
3140
3141 static const char **names_ymm;
3142 static const char *intel_names_ymm[] = {
3143   "ymm0", "ymm1", "ymm2", "ymm3",
3144   "ymm4", "ymm5", "ymm6", "ymm7",
3145   "ymm8", "ymm9", "ymm10", "ymm11",
3146   "ymm12", "ymm13", "ymm14", "ymm15",
3147   "ymm16", "ymm17", "ymm18", "ymm19",
3148   "ymm20", "ymm21", "ymm22", "ymm23",
3149   "ymm24", "ymm25", "ymm26", "ymm27",
3150   "ymm28", "ymm29", "ymm30", "ymm31"
3151 };
3152 static const char *att_names_ymm[] = {
3153   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3154   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3155   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3156   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3157   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3158   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3159   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3160   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3161 };
3162
3163 static const char **names_zmm;
3164 static const char *intel_names_zmm[] = {
3165   "zmm0", "zmm1", "zmm2", "zmm3",
3166   "zmm4", "zmm5", "zmm6", "zmm7",
3167   "zmm8", "zmm9", "zmm10", "zmm11",
3168   "zmm12", "zmm13", "zmm14", "zmm15",
3169   "zmm16", "zmm17", "zmm18", "zmm19",
3170   "zmm20", "zmm21", "zmm22", "zmm23",
3171   "zmm24", "zmm25", "zmm26", "zmm27",
3172   "zmm28", "zmm29", "zmm30", "zmm31"
3173 };
3174 static const char *att_names_zmm[] = {
3175   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3176   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3177   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3178   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3179   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3180   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3181   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3182   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3183 };
3184
3185 static const char **names_mask;
3186 static const char *intel_names_mask[] = {
3187   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3188 };
3189 static const char *att_names_mask[] = {
3190   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3191 };
3192
3193 static const char *names_rounding[] =
3194 {
3195   "{rn-sae}",
3196   "{rd-sae}",
3197   "{ru-sae}",
3198   "{rz-sae}"
3199 };
3200
3201 static const struct dis386 reg_table[][8] = {
3202   /* REG_80 */
3203   {
3204     { "addA",   { Ebh1, Ib }, 0 },
3205     { "orA",    { Ebh1, Ib }, 0 },
3206     { "adcA",   { Ebh1, Ib }, 0 },
3207     { "sbbA",   { Ebh1, Ib }, 0 },
3208     { "andA",   { Ebh1, Ib }, 0 },
3209     { "subA",   { Ebh1, Ib }, 0 },
3210     { "xorA",   { Ebh1, Ib }, 0 },
3211     { "cmpA",   { Eb, Ib }, 0 },
3212   },
3213   /* REG_81 */
3214   {
3215     { "addQ",   { Evh1, Iv }, 0 },
3216     { "orQ",    { Evh1, Iv }, 0 },
3217     { "adcQ",   { Evh1, Iv }, 0 },
3218     { "sbbQ",   { Evh1, Iv }, 0 },
3219     { "andQ",   { Evh1, Iv }, 0 },
3220     { "subQ",   { Evh1, Iv }, 0 },
3221     { "xorQ",   { Evh1, Iv }, 0 },
3222     { "cmpQ",   { Ev, Iv }, 0 },
3223   },
3224   /* REG_83 */
3225   {
3226     { "addQ",   { Evh1, sIb }, 0 },
3227     { "orQ",    { Evh1, sIb }, 0 },
3228     { "adcQ",   { Evh1, sIb }, 0 },
3229     { "sbbQ",   { Evh1, sIb }, 0 },
3230     { "andQ",   { Evh1, sIb }, 0 },
3231     { "subQ",   { Evh1, sIb }, 0 },
3232     { "xorQ",   { Evh1, sIb }, 0 },
3233     { "cmpQ",   { Ev, sIb }, 0 },
3234   },
3235   /* REG_8F */
3236   {
3237     { "popU",   { stackEv }, 0 },
3238     { XOP_8F_TABLE (XOP_09) },
3239     { Bad_Opcode },
3240     { Bad_Opcode },
3241     { Bad_Opcode },
3242     { XOP_8F_TABLE (XOP_09) },
3243   },
3244   /* REG_C0 */
3245   {
3246     { "rolA",   { Eb, Ib }, 0 },
3247     { "rorA",   { Eb, Ib }, 0 },
3248     { "rclA",   { Eb, Ib }, 0 },
3249     { "rcrA",   { Eb, Ib }, 0 },
3250     { "shlA",   { Eb, Ib }, 0 },
3251     { "shrA",   { Eb, Ib }, 0 },
3252     { "shlA",   { Eb, Ib }, 0 },
3253     { "sarA",   { Eb, Ib }, 0 },
3254   },
3255   /* REG_C1 */
3256   {
3257     { "rolQ",   { Ev, Ib }, 0 },
3258     { "rorQ",   { Ev, Ib }, 0 },
3259     { "rclQ",   { Ev, Ib }, 0 },
3260     { "rcrQ",   { Ev, Ib }, 0 },
3261     { "shlQ",   { Ev, Ib }, 0 },
3262     { "shrQ",   { Ev, Ib }, 0 },
3263     { "shlQ",   { Ev, Ib }, 0 },
3264     { "sarQ",   { Ev, Ib }, 0 },
3265   },
3266   /* REG_C6 */
3267   {
3268     { "movA",   { Ebh3, Ib }, 0 },
3269     { Bad_Opcode },
3270     { Bad_Opcode },
3271     { Bad_Opcode },
3272     { Bad_Opcode },
3273     { Bad_Opcode },
3274     { Bad_Opcode },
3275     { MOD_TABLE (MOD_C6_REG_7) },
3276   },
3277   /* REG_C7 */
3278   {
3279     { "movQ",   { Evh3, Iv }, 0 },
3280     { Bad_Opcode },
3281     { Bad_Opcode },
3282     { Bad_Opcode },
3283     { Bad_Opcode },
3284     { Bad_Opcode },
3285     { Bad_Opcode },
3286     { MOD_TABLE (MOD_C7_REG_7) },
3287   },
3288   /* REG_D0 */
3289   {
3290     { "rolA",   { Eb, I1 }, 0 },
3291     { "rorA",   { Eb, I1 }, 0 },
3292     { "rclA",   { Eb, I1 }, 0 },
3293     { "rcrA",   { Eb, I1 }, 0 },
3294     { "shlA",   { Eb, I1 }, 0 },
3295     { "shrA",   { Eb, I1 }, 0 },
3296     { "shlA",   { Eb, I1 }, 0 },
3297     { "sarA",   { Eb, I1 }, 0 },
3298   },
3299   /* REG_D1 */
3300   {
3301     { "rolQ",   { Ev, I1 }, 0 },
3302     { "rorQ",   { Ev, I1 }, 0 },
3303     { "rclQ",   { Ev, I1 }, 0 },
3304     { "rcrQ",   { Ev, I1 }, 0 },
3305     { "shlQ",   { Ev, I1 }, 0 },
3306     { "shrQ",   { Ev, I1 }, 0 },
3307     { "shlQ",   { Ev, I1 }, 0 },
3308     { "sarQ",   { Ev, I1 }, 0 },
3309   },
3310   /* REG_D2 */
3311   {
3312     { "rolA",   { Eb, CL }, 0 },
3313     { "rorA",   { Eb, CL }, 0 },
3314     { "rclA",   { Eb, CL }, 0 },
3315     { "rcrA",   { Eb, CL }, 0 },
3316     { "shlA",   { Eb, CL }, 0 },
3317     { "shrA",   { Eb, CL }, 0 },
3318     { "shlA",   { Eb, CL }, 0 },
3319     { "sarA",   { Eb, CL }, 0 },
3320   },
3321   /* REG_D3 */
3322   {
3323     { "rolQ",   { Ev, CL }, 0 },
3324     { "rorQ",   { Ev, CL }, 0 },
3325     { "rclQ",   { Ev, CL }, 0 },
3326     { "rcrQ",   { Ev, CL }, 0 },
3327     { "shlQ",   { Ev, CL }, 0 },
3328     { "shrQ",   { Ev, CL }, 0 },
3329     { "shlQ",   { Ev, CL }, 0 },
3330     { "sarQ",   { Ev, CL }, 0 },
3331   },
3332   /* REG_F6 */
3333   {
3334     { "testA",  { Eb, Ib }, 0 },
3335     { "testA",  { Eb, Ib }, 0 },
3336     { "notA",   { Ebh1 }, 0 },
3337     { "negA",   { Ebh1 }, 0 },
3338     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3339     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3340     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3341     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3342   },
3343   /* REG_F7 */
3344   {
3345     { "testQ",  { Ev, Iv }, 0 },
3346     { "testQ",  { Ev, Iv }, 0 },
3347     { "notQ",   { Evh1 }, 0 },
3348     { "negQ",   { Evh1 }, 0 },
3349     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3350     { "imulQ",  { Ev }, 0 },
3351     { "divQ",   { Ev }, 0 },
3352     { "idivQ",  { Ev }, 0 },
3353   },
3354   /* REG_FE */
3355   {
3356     { "incA",   { Ebh1 }, 0 },
3357     { "decA",   { Ebh1 }, 0 },
3358   },
3359   /* REG_FF */
3360   {
3361     { "incQ",   { Evh1 }, 0 },
3362     { "decQ",   { Evh1 }, 0 },
3363     { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3364     { MOD_TABLE (MOD_FF_REG_3) },
3365     { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3366     { MOD_TABLE (MOD_FF_REG_5) },
3367     { "pushU",  { stackEv }, 0 },
3368     { Bad_Opcode },
3369   },
3370   /* REG_0F00 */
3371   {
3372     { "sldtD",  { Sv }, 0 },
3373     { "strD",   { Sv }, 0 },
3374     { "lldt",   { Ew }, 0 },
3375     { "ltr",    { Ew }, 0 },
3376     { "verr",   { Ew }, 0 },
3377     { "verw",   { Ew }, 0 },
3378     { Bad_Opcode },
3379     { Bad_Opcode },
3380   },
3381   /* REG_0F01 */
3382   {
3383     { MOD_TABLE (MOD_0F01_REG_0) },
3384     { MOD_TABLE (MOD_0F01_REG_1) },
3385     { MOD_TABLE (MOD_0F01_REG_2) },
3386     { MOD_TABLE (MOD_0F01_REG_3) },
3387     { "smswD",  { Sv }, 0 },
3388     { MOD_TABLE (MOD_0F01_REG_5) },
3389     { "lmsw",   { Ew }, 0 },
3390     { MOD_TABLE (MOD_0F01_REG_7) },
3391   },
3392   /* REG_0F0D */
3393   {
3394     { "prefetch",       { Mb }, 0 },
3395     { "prefetchw",      { Mb }, 0 },
3396     { "prefetchwt1",    { Mb }, 0 },
3397     { "prefetch",       { Mb }, 0 },
3398     { "prefetch",       { Mb }, 0 },
3399     { "prefetch",       { Mb }, 0 },
3400     { "prefetch",       { Mb }, 0 },
3401     { "prefetch",       { Mb }, 0 },
3402   },
3403   /* REG_0F18 */
3404   {
3405     { MOD_TABLE (MOD_0F18_REG_0) },
3406     { MOD_TABLE (MOD_0F18_REG_1) },
3407     { MOD_TABLE (MOD_0F18_REG_2) },
3408     { MOD_TABLE (MOD_0F18_REG_3) },
3409     { MOD_TABLE (MOD_0F18_REG_4) },
3410     { MOD_TABLE (MOD_0F18_REG_5) },
3411     { MOD_TABLE (MOD_0F18_REG_6) },
3412     { MOD_TABLE (MOD_0F18_REG_7) },
3413   },
3414   /* REG_0F1C_MOD_0 */
3415   {
3416     { "cldemote",       { Mb }, 0 },
3417     { "nopQ",           { Ev }, 0 },
3418     { "nopQ",           { Ev }, 0 },
3419     { "nopQ",           { Ev }, 0 },
3420     { "nopQ",           { Ev }, 0 },
3421     { "nopQ",           { Ev }, 0 },
3422     { "nopQ",           { Ev }, 0 },
3423     { "nopQ",           { Ev }, 0 },
3424   },
3425   /* REG_0F1E_MOD_3 */
3426   {
3427     { "nopQ",           { Ev }, 0 },
3428     { "rdsspK",         { Rdq }, PREFIX_OPCODE },
3429     { "nopQ",           { Ev }, 0 },
3430     { "nopQ",           { Ev }, 0 },
3431     { "nopQ",           { Ev }, 0 },
3432     { "nopQ",           { Ev }, 0 },
3433     { "nopQ",           { Ev }, 0 },
3434     { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3435   },
3436   /* REG_0F71 */
3437   {
3438     { Bad_Opcode },
3439     { Bad_Opcode },
3440     { MOD_TABLE (MOD_0F71_REG_2) },
3441     { Bad_Opcode },
3442     { MOD_TABLE (MOD_0F71_REG_4) },
3443     { Bad_Opcode },
3444     { MOD_TABLE (MOD_0F71_REG_6) },
3445   },
3446   /* REG_0F72 */
3447   {
3448     { Bad_Opcode },
3449     { Bad_Opcode },
3450     { MOD_TABLE (MOD_0F72_REG_2) },
3451     { Bad_Opcode },
3452     { MOD_TABLE (MOD_0F72_REG_4) },
3453     { Bad_Opcode },
3454     { MOD_TABLE (MOD_0F72_REG_6) },
3455   },
3456   /* REG_0F73 */
3457   {
3458     { Bad_Opcode },
3459     { Bad_Opcode },
3460     { MOD_TABLE (MOD_0F73_REG_2) },
3461     { MOD_TABLE (MOD_0F73_REG_3) },
3462     { Bad_Opcode },
3463     { Bad_Opcode },
3464     { MOD_TABLE (MOD_0F73_REG_6) },
3465     { MOD_TABLE (MOD_0F73_REG_7) },
3466   },
3467   /* REG_0FA6 */
3468   {
3469     { "montmul",        { { OP_0f07, 0 } }, 0 },
3470     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3471     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3472   },
3473   /* REG_0FA7 */
3474   {
3475     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3476     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3477     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3478     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3479     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3480     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3481   },
3482   /* REG_0FAE */
3483   {
3484     { MOD_TABLE (MOD_0FAE_REG_0) },
3485     { MOD_TABLE (MOD_0FAE_REG_1) },
3486     { MOD_TABLE (MOD_0FAE_REG_2) },
3487     { MOD_TABLE (MOD_0FAE_REG_3) },
3488     { MOD_TABLE (MOD_0FAE_REG_4) },
3489     { MOD_TABLE (MOD_0FAE_REG_5) },
3490     { MOD_TABLE (MOD_0FAE_REG_6) },
3491     { MOD_TABLE (MOD_0FAE_REG_7) },
3492   },
3493   /* REG_0FBA */
3494   {
3495     { Bad_Opcode },
3496     { Bad_Opcode },
3497     { Bad_Opcode },
3498     { Bad_Opcode },
3499     { "btQ",    { Ev, Ib }, 0 },
3500     { "btsQ",   { Evh1, Ib }, 0 },
3501     { "btrQ",   { Evh1, Ib }, 0 },
3502     { "btcQ",   { Evh1, Ib }, 0 },
3503   },
3504   /* REG_0FC7 */
3505   {
3506     { Bad_Opcode },
3507     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3508     { Bad_Opcode },
3509     { MOD_TABLE (MOD_0FC7_REG_3) },
3510     { MOD_TABLE (MOD_0FC7_REG_4) },
3511     { MOD_TABLE (MOD_0FC7_REG_5) },
3512     { MOD_TABLE (MOD_0FC7_REG_6) },
3513     { MOD_TABLE (MOD_0FC7_REG_7) },
3514   },
3515   /* REG_VEX_0F71 */
3516   {
3517     { Bad_Opcode },
3518     { Bad_Opcode },
3519     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3520     { Bad_Opcode },
3521     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3522     { Bad_Opcode },
3523     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3524   },
3525   /* REG_VEX_0F72 */
3526   {
3527     { Bad_Opcode },
3528     { Bad_Opcode },
3529     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3530     { Bad_Opcode },
3531     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3532     { Bad_Opcode },
3533     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3534   },
3535   /* REG_VEX_0F73 */
3536   {
3537     { Bad_Opcode },
3538     { Bad_Opcode },
3539     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3540     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3541     { Bad_Opcode },
3542     { Bad_Opcode },
3543     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3544     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3545   },
3546   /* REG_VEX_0FAE */
3547   {
3548     { Bad_Opcode },
3549     { Bad_Opcode },
3550     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3551     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3552   },
3553   /* REG_VEX_0F38F3 */
3554   {
3555     { Bad_Opcode },
3556     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3557     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3558     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3559   },
3560   /* REG_XOP_LWPCB */
3561   {
3562     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3563     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3564   },
3565   /* REG_XOP_LWP */
3566   {
3567     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3568     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3569   },
3570   /* REG_XOP_TBM_01 */
3571   {
3572     { Bad_Opcode },
3573     { "blcfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3574     { "blsfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3575     { "blcs",   { { OP_LWP_E, 0 }, Ev }, 0 },
3576     { "tzmsk",  { { OP_LWP_E, 0 }, Ev }, 0 },
3577     { "blcic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3578     { "blsic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3579     { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3580   },
3581   /* REG_XOP_TBM_02 */
3582   {
3583     { Bad_Opcode },
3584     { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3585     { Bad_Opcode },
3586     { Bad_Opcode },
3587     { Bad_Opcode },
3588     { Bad_Opcode },
3589     { "blci",   { { OP_LWP_E, 0 }, Ev }, 0 },
3590   },
3591 #define NEED_REG_TABLE
3592 #include "i386-dis-evex.h"
3593 #undef NEED_REG_TABLE
3594 };
3595
3596 static const struct dis386 prefix_table[][4] = {
3597   /* PREFIX_90 */
3598   {
3599     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3600     { "pause", { XX }, 0 },
3601     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3602     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3603   },
3604
3605   /* PREFIX_MOD_0_0F01_REG_5 */
3606   {
3607     { Bad_Opcode },
3608     { "rstorssp",       { Mq }, PREFIX_OPCODE },
3609   },
3610
3611   /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3612   {
3613     { Bad_Opcode },
3614     { "setssbsy",       { Skip_MODRM }, PREFIX_OPCODE },
3615   },
3616
3617   /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3618   {
3619     { Bad_Opcode },
3620     { "saveprevssp",    { Skip_MODRM }, PREFIX_OPCODE },
3621   },
3622
3623   /* PREFIX_0F09 */
3624   {
3625     { "wbinvd",   { XX }, 0 },
3626     { "wbnoinvd", { XX }, 0 },
3627   },
3628
3629   /* PREFIX_0F10 */
3630   {
3631     { "movups", { XM, EXx }, PREFIX_OPCODE },
3632     { "movss",  { XM, EXd }, PREFIX_OPCODE },
3633     { "movupd", { XM, EXx }, PREFIX_OPCODE },
3634     { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3635   },
3636
3637   /* PREFIX_0F11 */
3638   {
3639     { "movups", { EXxS, XM }, PREFIX_OPCODE },
3640     { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3641     { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3642     { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3643   },
3644
3645   /* PREFIX_0F12 */
3646   {
3647     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3648     { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3649     { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3650     { "movddup", { XM, EXq }, PREFIX_OPCODE },
3651   },
3652
3653   /* PREFIX_0F16 */
3654   {
3655     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3656     { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3657     { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3658   },
3659
3660   /* PREFIX_0F1A */
3661   {
3662     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3663     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3664     { "bndmov", { Gbnd, Ebnd }, 0 },
3665     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3666   },
3667
3668   /* PREFIX_0F1B */
3669   {
3670     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3671     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3672     { "bndmov", { EbndS, Gbnd }, 0 },
3673     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3674   },
3675
3676   /* PREFIX_0F1C */
3677   {
3678     { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3679     { "nopQ",   { Ev }, PREFIX_OPCODE },
3680     { "nopQ",   { Ev }, PREFIX_OPCODE },
3681     { "nopQ",   { Ev }, PREFIX_OPCODE },
3682   },
3683
3684   /* PREFIX_0F1E */
3685   {
3686     { "nopQ",   { Ev }, PREFIX_OPCODE },
3687     { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3688     { "nopQ",   { Ev }, PREFIX_OPCODE },
3689     { "nopQ",   { Ev }, PREFIX_OPCODE },
3690   },
3691
3692   /* PREFIX_0F2A */
3693   {
3694     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3695     { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3696     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3697     { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3698   },
3699
3700   /* PREFIX_0F2B */
3701   {
3702     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3703     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3704     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3705     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3706   },
3707
3708   /* PREFIX_0F2C */
3709   {
3710     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3711     { "cvttss2si", { Gv, EXd }, PREFIX_OPCODE },
3712     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3713     { "cvttsd2si", { Gv, EXq }, PREFIX_OPCODE },
3714   },
3715
3716   /* PREFIX_0F2D */
3717   {
3718     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3719     { "cvtss2si", { Gv, EXd }, PREFIX_OPCODE },
3720     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3721     { "cvtsd2si", { Gv, EXq }, PREFIX_OPCODE },
3722   },
3723
3724   /* PREFIX_0F2E */
3725   {
3726     { "ucomiss",{ XM, EXd }, 0 },
3727     { Bad_Opcode },
3728     { "ucomisd",{ XM, EXq }, 0 },
3729   },
3730
3731   /* PREFIX_0F2F */
3732   {
3733     { "comiss", { XM, EXd }, 0 },
3734     { Bad_Opcode },
3735     { "comisd", { XM, EXq }, 0 },
3736   },
3737
3738   /* PREFIX_0F51 */
3739   {
3740     { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3741     { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3742     { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3743     { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3744   },
3745
3746   /* PREFIX_0F52 */
3747   {
3748     { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3749     { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3750   },
3751
3752   /* PREFIX_0F53 */
3753   {
3754     { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3755     { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3756   },
3757
3758   /* PREFIX_0F58 */
3759   {
3760     { "addps", { XM, EXx }, PREFIX_OPCODE },
3761     { "addss", { XM, EXd }, PREFIX_OPCODE },
3762     { "addpd", { XM, EXx }, PREFIX_OPCODE },
3763     { "addsd", { XM, EXq }, PREFIX_OPCODE },
3764   },
3765
3766   /* PREFIX_0F59 */
3767   {
3768     { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3769     { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3770     { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3771     { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3772   },
3773
3774   /* PREFIX_0F5A */
3775   {
3776     { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3777     { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3778     { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3779     { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3780   },
3781
3782   /* PREFIX_0F5B */
3783   {
3784     { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3785     { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3786     { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3787   },
3788
3789   /* PREFIX_0F5C */
3790   {
3791     { "subps",  { XM, EXx }, PREFIX_OPCODE },
3792     { "subss",  { XM, EXd }, PREFIX_OPCODE },
3793     { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3794     { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3795   },
3796
3797   /* PREFIX_0F5D */
3798   {
3799     { "minps",  { XM, EXx }, PREFIX_OPCODE },
3800     { "minss",  { XM, EXd }, PREFIX_OPCODE },
3801     { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3802     { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3803   },
3804
3805   /* PREFIX_0F5E */
3806   {
3807     { "divps",  { XM, EXx }, PREFIX_OPCODE },
3808     { "divss",  { XM, EXd }, PREFIX_OPCODE },
3809     { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3810     { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3811   },
3812
3813   /* PREFIX_0F5F */
3814   {
3815     { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3816     { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3817     { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3818     { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3819   },
3820
3821   /* PREFIX_0F60 */
3822   {
3823     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3824     { Bad_Opcode },
3825     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3826   },
3827
3828   /* PREFIX_0F61 */
3829   {
3830     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3831     { Bad_Opcode },
3832     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3833   },
3834
3835   /* PREFIX_0F62 */
3836   {
3837     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3838     { Bad_Opcode },
3839     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3840   },
3841
3842   /* PREFIX_0F6C */
3843   {
3844     { Bad_Opcode },
3845     { Bad_Opcode },
3846     { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3847   },
3848
3849   /* PREFIX_0F6D */
3850   {
3851     { Bad_Opcode },
3852     { Bad_Opcode },
3853     { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3854   },
3855
3856   /* PREFIX_0F6F */
3857   {
3858     { "movq",   { MX, EM }, PREFIX_OPCODE },
3859     { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3860     { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3861   },
3862
3863   /* PREFIX_0F70 */
3864   {
3865     { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3866     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3867     { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3868     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3869   },
3870
3871   /* PREFIX_0F73_REG_3 */
3872   {
3873     { Bad_Opcode },
3874     { Bad_Opcode },
3875     { "psrldq", { XS, Ib }, 0 },
3876   },
3877
3878   /* PREFIX_0F73_REG_7 */
3879   {
3880     { Bad_Opcode },
3881     { Bad_Opcode },
3882     { "pslldq", { XS, Ib }, 0 },
3883   },
3884
3885   /* PREFIX_0F78 */
3886   {
3887     {"vmread",  { Em, Gm }, 0 },
3888     { Bad_Opcode },
3889     {"extrq",   { XS, Ib, Ib }, 0 },
3890     {"insertq", { XM, XS, Ib, Ib }, 0 },
3891   },
3892
3893   /* PREFIX_0F79 */
3894   {
3895     {"vmwrite", { Gm, Em }, 0 },
3896     { Bad_Opcode },
3897     {"extrq",   { XM, XS }, 0 },
3898     {"insertq", { XM, XS }, 0 },
3899   },
3900
3901   /* PREFIX_0F7C */
3902   {
3903     { Bad_Opcode },
3904     { Bad_Opcode },
3905     { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3906     { "haddps", { XM, EXx }, PREFIX_OPCODE },
3907   },
3908
3909   /* PREFIX_0F7D */
3910   {
3911     { Bad_Opcode },
3912     { Bad_Opcode },
3913     { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3914     { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3915   },
3916
3917   /* PREFIX_0F7E */
3918   {
3919     { "movK",   { Edq, MX }, PREFIX_OPCODE },
3920     { "movq",   { XM, EXq }, PREFIX_OPCODE },
3921     { "movK",   { Edq, XM }, PREFIX_OPCODE },
3922   },
3923
3924   /* PREFIX_0F7F */
3925   {
3926     { "movq",   { EMS, MX }, PREFIX_OPCODE },
3927     { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3928     { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3929   },
3930
3931   /* PREFIX_0FAE_REG_0 */
3932   {
3933     { Bad_Opcode },
3934     { "rdfsbase", { Ev }, 0 },
3935   },
3936
3937   /* PREFIX_0FAE_REG_1 */
3938   {
3939     { Bad_Opcode },
3940     { "rdgsbase", { Ev }, 0 },
3941   },
3942
3943   /* PREFIX_0FAE_REG_2 */
3944   {
3945     { Bad_Opcode },
3946     { "wrfsbase", { Ev }, 0 },
3947   },
3948
3949   /* PREFIX_0FAE_REG_3 */
3950   {
3951     { Bad_Opcode },
3952     { "wrgsbase", { Ev }, 0 },
3953   },
3954
3955   /* PREFIX_MOD_0_0FAE_REG_4 */
3956   {
3957     { "xsave",  { FXSAVE }, 0 },
3958     { "ptwrite%LQ", { Edq }, 0 },
3959   },
3960
3961   /* PREFIX_MOD_3_0FAE_REG_4 */
3962   {
3963     { Bad_Opcode },
3964     { "ptwrite%LQ", { Edq }, 0 },
3965   },
3966
3967   /* PREFIX_MOD_0_0FAE_REG_5 */
3968   {
3969     { "xrstor",         { FXSAVE }, PREFIX_OPCODE },
3970   },
3971
3972   /* PREFIX_MOD_3_0FAE_REG_5 */
3973   {
3974     { "lfence",         { Skip_MODRM }, 0 },
3975     { "incsspK",        { Rdq }, PREFIX_OPCODE },
3976   },
3977
3978   /* PREFIX_MOD_0_0FAE_REG_6 */
3979   {
3980     { "xsaveopt",       { FXSAVE }, PREFIX_OPCODE },
3981     { "clrssbsy",       { Mq }, PREFIX_OPCODE },
3982     { "clwb",   { Mb }, PREFIX_OPCODE },
3983   },
3984
3985   /* PREFIX_MOD_1_0FAE_REG_6 */
3986   {
3987     { RM_TABLE (RM_0FAE_REG_6) },
3988     { "umonitor",       { Eva }, PREFIX_OPCODE },
3989     { "tpause", { Edq }, PREFIX_OPCODE },
3990     { "umwait", { Edq }, PREFIX_OPCODE },
3991   },
3992
3993   /* PREFIX_0FAE_REG_7 */
3994   {
3995     { "clflush",        { Mb }, 0 },
3996     { Bad_Opcode },
3997     { "clflushopt",     { Mb }, 0 },
3998   },
3999
4000   /* PREFIX_0FB8 */
4001   {
4002     { Bad_Opcode },
4003     { "popcntS", { Gv, Ev }, 0 },
4004   },
4005
4006   /* PREFIX_0FBC */
4007   {
4008     { "bsfS",   { Gv, Ev }, 0 },
4009     { "tzcntS", { Gv, Ev }, 0 },
4010     { "bsfS",   { Gv, Ev }, 0 },
4011   },
4012
4013   /* PREFIX_0FBD */
4014   {
4015     { "bsrS",   { Gv, Ev }, 0 },
4016     { "lzcntS", { Gv, Ev }, 0 },
4017     { "bsrS",   { Gv, Ev }, 0 },
4018   },
4019
4020   /* PREFIX_0FC2 */
4021   {
4022     { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
4023     { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
4024     { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
4025     { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
4026   },
4027
4028   /* PREFIX_MOD_0_0FC3 */
4029   {
4030     { "movntiS", { Ev, Gv }, PREFIX_OPCODE },
4031   },
4032
4033   /* PREFIX_MOD_0_0FC7_REG_6 */
4034   {
4035     { "vmptrld",{ Mq }, 0 },
4036     { "vmxon",  { Mq }, 0 },
4037     { "vmclear",{ Mq }, 0 },
4038   },
4039
4040   /* PREFIX_MOD_3_0FC7_REG_6 */
4041   {
4042     { "rdrand", { Ev }, 0 },
4043     { Bad_Opcode },
4044     { "rdrand", { Ev }, 0 }
4045   },
4046
4047   /* PREFIX_MOD_3_0FC7_REG_7 */
4048   {
4049     { "rdseed", { Ev }, 0 },
4050     { "rdpid",  { Em }, 0 },
4051     { "rdseed", { Ev }, 0 },
4052   },
4053
4054   /* PREFIX_0FD0 */
4055   {
4056     { Bad_Opcode },
4057     { Bad_Opcode },
4058     { "addsubpd", { XM, EXx }, 0 },
4059     { "addsubps", { XM, EXx }, 0 },
4060   },
4061
4062   /* PREFIX_0FD6 */
4063   {
4064     { Bad_Opcode },
4065     { "movq2dq",{ XM, MS }, 0 },
4066     { "movq",   { EXqS, XM }, 0 },
4067     { "movdq2q",{ MX, XS }, 0 },
4068   },
4069
4070   /* PREFIX_0FE6 */
4071   {
4072     { Bad_Opcode },
4073     { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4074     { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4075     { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4076   },
4077
4078   /* PREFIX_0FE7 */
4079   {
4080     { "movntq", { Mq, MX }, PREFIX_OPCODE },
4081     { Bad_Opcode },
4082     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4083   },
4084
4085   /* PREFIX_0FF0 */
4086   {
4087     { Bad_Opcode },
4088     { Bad_Opcode },
4089     { Bad_Opcode },
4090     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4091   },
4092
4093   /* PREFIX_0FF7 */
4094   {
4095     { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4096     { Bad_Opcode },
4097     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4098   },
4099
4100   /* PREFIX_0F3810 */
4101   {
4102     { Bad_Opcode },
4103     { Bad_Opcode },
4104     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4105   },
4106
4107   /* PREFIX_0F3814 */
4108   {
4109     { Bad_Opcode },
4110     { Bad_Opcode },
4111     { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4112   },
4113
4114   /* PREFIX_0F3815 */
4115   {
4116     { Bad_Opcode },
4117     { Bad_Opcode },
4118     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4119   },
4120
4121   /* PREFIX_0F3817 */
4122   {
4123     { Bad_Opcode },
4124     { Bad_Opcode },
4125     { "ptest",  { XM, EXx }, PREFIX_OPCODE },
4126   },
4127
4128   /* PREFIX_0F3820 */
4129   {
4130     { Bad_Opcode },
4131     { Bad_Opcode },
4132     { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4133   },
4134
4135   /* PREFIX_0F3821 */
4136   {
4137     { Bad_Opcode },
4138     { Bad_Opcode },
4139     { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4140   },
4141
4142   /* PREFIX_0F3822 */
4143   {
4144     { Bad_Opcode },
4145     { Bad_Opcode },
4146     { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4147   },
4148
4149   /* PREFIX_0F3823 */
4150   {
4151     { Bad_Opcode },
4152     { Bad_Opcode },
4153     { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4154   },
4155
4156   /* PREFIX_0F3824 */
4157   {
4158     { Bad_Opcode },
4159     { Bad_Opcode },
4160     { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4161   },
4162
4163   /* PREFIX_0F3825 */
4164   {
4165     { Bad_Opcode },
4166     { Bad_Opcode },
4167     { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4168   },
4169
4170   /* PREFIX_0F3828 */
4171   {
4172     { Bad_Opcode },
4173     { Bad_Opcode },
4174     { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4175   },
4176
4177   /* PREFIX_0F3829 */
4178   {
4179     { Bad_Opcode },
4180     { Bad_Opcode },
4181     { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4182   },
4183
4184   /* PREFIX_0F382A */
4185   {
4186     { Bad_Opcode },
4187     { Bad_Opcode },
4188     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4189   },
4190
4191   /* PREFIX_0F382B */
4192   {
4193     { Bad_Opcode },
4194     { Bad_Opcode },
4195     { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4196   },
4197
4198   /* PREFIX_0F3830 */
4199   {
4200     { Bad_Opcode },
4201     { Bad_Opcode },
4202     { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4203   },
4204
4205   /* PREFIX_0F3831 */
4206   {
4207     { Bad_Opcode },
4208     { Bad_Opcode },
4209     { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4210   },
4211
4212   /* PREFIX_0F3832 */
4213   {
4214     { Bad_Opcode },
4215     { Bad_Opcode },
4216     { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4217   },
4218
4219   /* PREFIX_0F3833 */
4220   {
4221     { Bad_Opcode },
4222     { Bad_Opcode },
4223     { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4224   },
4225
4226   /* PREFIX_0F3834 */
4227   {
4228     { Bad_Opcode },
4229     { Bad_Opcode },
4230     { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4231   },
4232
4233   /* PREFIX_0F3835 */
4234   {
4235     { Bad_Opcode },
4236     { Bad_Opcode },
4237     { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4238   },
4239
4240   /* PREFIX_0F3837 */
4241   {
4242     { Bad_Opcode },
4243     { Bad_Opcode },
4244     { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4245   },
4246
4247   /* PREFIX_0F3838 */
4248   {
4249     { Bad_Opcode },
4250     { Bad_Opcode },
4251     { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4252   },
4253
4254   /* PREFIX_0F3839 */
4255   {
4256     { Bad_Opcode },
4257     { Bad_Opcode },
4258     { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4259   },
4260
4261   /* PREFIX_0F383A */
4262   {
4263     { Bad_Opcode },
4264     { Bad_Opcode },
4265     { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4266   },
4267
4268   /* PREFIX_0F383B */
4269   {
4270     { Bad_Opcode },
4271     { Bad_Opcode },
4272     { "pminud", { XM, EXx }, PREFIX_OPCODE },
4273   },
4274
4275   /* PREFIX_0F383C */
4276   {
4277     { Bad_Opcode },
4278     { Bad_Opcode },
4279     { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4280   },
4281
4282   /* PREFIX_0F383D */
4283   {
4284     { Bad_Opcode },
4285     { Bad_Opcode },
4286     { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4287   },
4288
4289   /* PREFIX_0F383E */
4290   {
4291     { Bad_Opcode },
4292     { Bad_Opcode },
4293     { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4294   },
4295
4296   /* PREFIX_0F383F */
4297   {
4298     { Bad_Opcode },
4299     { Bad_Opcode },
4300     { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4301   },
4302
4303   /* PREFIX_0F3840 */
4304   {
4305     { Bad_Opcode },
4306     { Bad_Opcode },
4307     { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4308   },
4309
4310   /* PREFIX_0F3841 */
4311   {
4312     { Bad_Opcode },
4313     { Bad_Opcode },
4314     { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4315   },
4316
4317   /* PREFIX_0F3880 */
4318   {
4319     { Bad_Opcode },
4320     { Bad_Opcode },
4321     { "invept", { Gm, Mo }, PREFIX_OPCODE },
4322   },
4323
4324   /* PREFIX_0F3881 */
4325   {
4326     { Bad_Opcode },
4327     { Bad_Opcode },
4328     { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4329   },
4330
4331   /* PREFIX_0F3882 */
4332   {
4333     { Bad_Opcode },
4334     { Bad_Opcode },
4335     { "invpcid", { Gm, M }, PREFIX_OPCODE },
4336   },
4337
4338   /* PREFIX_0F38C8 */
4339   {
4340     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4341   },
4342
4343   /* PREFIX_0F38C9 */
4344   {
4345     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4346   },
4347
4348   /* PREFIX_0F38CA */
4349   {
4350     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4351   },
4352
4353   /* PREFIX_0F38CB */
4354   {
4355     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4356   },
4357
4358   /* PREFIX_0F38CC */
4359   {
4360     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4361   },
4362
4363   /* PREFIX_0F38CD */
4364   {
4365     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4366   },
4367
4368   /* PREFIX_0F38CF */
4369   {
4370     { Bad_Opcode },
4371     { Bad_Opcode },
4372     { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4373   },
4374
4375   /* PREFIX_0F38DB */
4376   {
4377     { Bad_Opcode },
4378     { Bad_Opcode },
4379     { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4380   },
4381
4382   /* PREFIX_0F38DC */
4383   {
4384     { Bad_Opcode },
4385     { Bad_Opcode },
4386     { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4387   },
4388
4389   /* PREFIX_0F38DD */
4390   {
4391     { Bad_Opcode },
4392     { Bad_Opcode },
4393     { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4394   },
4395
4396   /* PREFIX_0F38DE */
4397   {
4398     { Bad_Opcode },
4399     { Bad_Opcode },
4400     { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4401   },
4402
4403   /* PREFIX_0F38DF */
4404   {
4405     { Bad_Opcode },
4406     { Bad_Opcode },
4407     { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4408   },
4409
4410   /* PREFIX_0F38F0 */
4411   {
4412     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4413     { Bad_Opcode },
4414     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4415     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4416   },
4417
4418   /* PREFIX_0F38F1 */
4419   {
4420     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4421     { Bad_Opcode },
4422     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4423     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4424   },
4425
4426   /* PREFIX_0F38F5 */
4427   {
4428     { Bad_Opcode },
4429     { Bad_Opcode },
4430     { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4431   },
4432
4433   /* PREFIX_0F38F6 */
4434   {
4435     { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4436     { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
4437     { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
4438     { Bad_Opcode },
4439   },
4440
4441   /* PREFIX_0F38F8 */
4442   {
4443     { Bad_Opcode },
4444     { Bad_Opcode },
4445     { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4446   },
4447
4448   /* PREFIX_0F38F9 */
4449   {
4450     { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4451   },
4452
4453   /* PREFIX_0F3A08 */
4454   {
4455     { Bad_Opcode },
4456     { Bad_Opcode },
4457     { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4458   },
4459
4460   /* PREFIX_0F3A09 */
4461   {
4462     { Bad_Opcode },
4463     { Bad_Opcode },
4464     { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4465   },
4466
4467   /* PREFIX_0F3A0A */
4468   {
4469     { Bad_Opcode },
4470     { Bad_Opcode },
4471     { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4472   },
4473
4474   /* PREFIX_0F3A0B */
4475   {
4476     { Bad_Opcode },
4477     { Bad_Opcode },
4478     { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4479   },
4480
4481   /* PREFIX_0F3A0C */
4482   {
4483     { Bad_Opcode },
4484     { Bad_Opcode },
4485     { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4486   },
4487
4488   /* PREFIX_0F3A0D */
4489   {
4490     { Bad_Opcode },
4491     { Bad_Opcode },
4492     { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4493   },
4494
4495   /* PREFIX_0F3A0E */
4496   {
4497     { Bad_Opcode },
4498     { Bad_Opcode },
4499     { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4500   },
4501
4502   /* PREFIX_0F3A14 */
4503   {
4504     { Bad_Opcode },
4505     { Bad_Opcode },
4506     { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4507   },
4508
4509   /* PREFIX_0F3A15 */
4510   {
4511     { Bad_Opcode },
4512     { Bad_Opcode },
4513     { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4514   },
4515
4516   /* PREFIX_0F3A16 */
4517   {
4518     { Bad_Opcode },
4519     { Bad_Opcode },
4520     { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4521   },
4522
4523   /* PREFIX_0F3A17 */
4524   {
4525     { Bad_Opcode },
4526     { Bad_Opcode },
4527     { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4528   },
4529
4530   /* PREFIX_0F3A20 */
4531   {
4532     { Bad_Opcode },
4533     { Bad_Opcode },
4534     { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4535   },
4536
4537   /* PREFIX_0F3A21 */
4538   {
4539     { Bad_Opcode },
4540     { Bad_Opcode },
4541     { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4542   },
4543
4544   /* PREFIX_0F3A22 */
4545   {
4546     { Bad_Opcode },
4547     { Bad_Opcode },
4548     { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4549   },
4550
4551   /* PREFIX_0F3A40 */
4552   {
4553     { Bad_Opcode },
4554     { Bad_Opcode },
4555     { "dpps",   { XM, EXx, Ib }, PREFIX_OPCODE },
4556   },
4557
4558   /* PREFIX_0F3A41 */
4559   {
4560     { Bad_Opcode },
4561     { Bad_Opcode },
4562     { "dppd",   { XM, EXx, Ib }, PREFIX_OPCODE },
4563   },
4564
4565   /* PREFIX_0F3A42 */
4566   {
4567     { Bad_Opcode },
4568     { Bad_Opcode },
4569     { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4570   },
4571
4572   /* PREFIX_0F3A44 */
4573   {
4574     { Bad_Opcode },
4575     { Bad_Opcode },
4576     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4577   },
4578
4579   /* PREFIX_0F3A60 */
4580   {
4581     { Bad_Opcode },
4582     { Bad_Opcode },
4583     { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4584   },
4585
4586   /* PREFIX_0F3A61 */
4587   {
4588     { Bad_Opcode },
4589     { Bad_Opcode },
4590     { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4591   },
4592
4593   /* PREFIX_0F3A62 */
4594   {
4595     { Bad_Opcode },
4596     { Bad_Opcode },
4597     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4598   },
4599
4600   /* PREFIX_0F3A63 */
4601   {
4602     { Bad_Opcode },
4603     { Bad_Opcode },
4604     { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4605   },
4606
4607   /* PREFIX_0F3ACC */
4608   {
4609     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4610   },
4611
4612   /* PREFIX_0F3ACE */
4613   {
4614     { Bad_Opcode },
4615     { Bad_Opcode },
4616     { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4617   },
4618
4619   /* PREFIX_0F3ACF */
4620   {
4621     { Bad_Opcode },
4622     { Bad_Opcode },
4623     { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4624   },
4625
4626   /* PREFIX_0F3ADF */
4627   {
4628     { Bad_Opcode },
4629     { Bad_Opcode },
4630     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4631   },
4632
4633   /* PREFIX_VEX_0F10 */
4634   {
4635     { "vmovups",        { XM, EXx }, 0 },
4636     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
4637     { "vmovupd",        { XM, EXx }, 0 },
4638     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
4639   },
4640
4641   /* PREFIX_VEX_0F11 */
4642   {
4643     { "vmovups",        { EXxS, XM }, 0 },
4644     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4645     { "vmovupd",        { EXxS, XM }, 0 },
4646     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4647   },
4648
4649   /* PREFIX_VEX_0F12 */
4650   {
4651     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4652     { "vmovsldup",      { XM, EXx }, 0 },
4653     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4654     { "vmovddup",       { XM, EXymmq }, 0 },
4655   },
4656
4657   /* PREFIX_VEX_0F16 */
4658   {
4659     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4660     { "vmovshdup",      { XM, EXx }, 0 },
4661     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4662   },
4663
4664   /* PREFIX_VEX_0F2A */
4665   {
4666     { Bad_Opcode },
4667     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4668     { Bad_Opcode },
4669     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4670   },
4671
4672   /* PREFIX_VEX_0F2C */
4673   {
4674     { Bad_Opcode },
4675     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4676     { Bad_Opcode },
4677     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4678   },
4679
4680   /* PREFIX_VEX_0F2D */
4681   {
4682     { Bad_Opcode },
4683     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4684     { Bad_Opcode },
4685     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4686   },
4687
4688   /* PREFIX_VEX_0F2E */
4689   {
4690     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
4691     { Bad_Opcode },
4692     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
4693   },
4694
4695   /* PREFIX_VEX_0F2F */
4696   {
4697     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
4698     { Bad_Opcode },
4699     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
4700   },
4701
4702   /* PREFIX_VEX_0F41 */
4703   {
4704     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4705     { Bad_Opcode },
4706     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4707   },
4708
4709   /* PREFIX_VEX_0F42 */
4710   {
4711     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4712     { Bad_Opcode },
4713     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4714   },
4715
4716   /* PREFIX_VEX_0F44 */
4717   {
4718     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4719     { Bad_Opcode },
4720     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4721   },
4722
4723   /* PREFIX_VEX_0F45 */
4724   {
4725     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4726     { Bad_Opcode },
4727     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4728   },
4729
4730   /* PREFIX_VEX_0F46 */
4731   {
4732     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4733     { Bad_Opcode },
4734     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4735   },
4736
4737   /* PREFIX_VEX_0F47 */
4738   {
4739     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4740     { Bad_Opcode },
4741     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4742   },
4743
4744   /* PREFIX_VEX_0F4A */
4745   {
4746     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4747     { Bad_Opcode },
4748     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4749   },
4750
4751   /* PREFIX_VEX_0F4B */
4752   {
4753     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4754     { Bad_Opcode },
4755     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4756   },
4757
4758   /* PREFIX_VEX_0F51 */
4759   {
4760     { "vsqrtps",        { XM, EXx }, 0 },
4761     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
4762     { "vsqrtpd",        { XM, EXx }, 0 },
4763     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
4764   },
4765
4766   /* PREFIX_VEX_0F52 */
4767   {
4768     { "vrsqrtps",       { XM, EXx }, 0 },
4769     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
4770   },
4771
4772   /* PREFIX_VEX_0F53 */
4773   {
4774     { "vrcpps",         { XM, EXx }, 0 },
4775     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4776   },
4777
4778   /* PREFIX_VEX_0F58 */
4779   {
4780     { "vaddps",         { XM, Vex, EXx }, 0 },
4781     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4782     { "vaddpd",         { XM, Vex, EXx }, 0 },
4783     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4784   },
4785
4786   /* PREFIX_VEX_0F59 */
4787   {
4788     { "vmulps",         { XM, Vex, EXx }, 0 },
4789     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4790     { "vmulpd",         { XM, Vex, EXx }, 0 },
4791     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4792   },
4793
4794   /* PREFIX_VEX_0F5A */
4795   {
4796     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
4797     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
4798     { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4799     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
4800   },
4801
4802   /* PREFIX_VEX_0F5B */
4803   {
4804     { "vcvtdq2ps",      { XM, EXx }, 0 },
4805     { "vcvttps2dq",     { XM, EXx }, 0 },
4806     { "vcvtps2dq",      { XM, EXx }, 0 },
4807   },
4808
4809   /* PREFIX_VEX_0F5C */
4810   {
4811     { "vsubps",         { XM, Vex, EXx }, 0 },
4812     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4813     { "vsubpd",         { XM, Vex, EXx }, 0 },
4814     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4815   },
4816
4817   /* PREFIX_VEX_0F5D */
4818   {
4819     { "vminps",         { XM, Vex, EXx }, 0 },
4820     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4821     { "vminpd",         { XM, Vex, EXx }, 0 },
4822     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4823   },
4824
4825   /* PREFIX_VEX_0F5E */
4826   {
4827     { "vdivps",         { XM, Vex, EXx }, 0 },
4828     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4829     { "vdivpd",         { XM, Vex, EXx }, 0 },
4830     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4831   },
4832
4833   /* PREFIX_VEX_0F5F */
4834   {
4835     { "vmaxps",         { XM, Vex, EXx }, 0 },
4836     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4837     { "vmaxpd",         { XM, Vex, EXx }, 0 },
4838     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4839   },
4840
4841   /* PREFIX_VEX_0F60 */
4842   {
4843     { Bad_Opcode },
4844     { Bad_Opcode },
4845     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
4846   },
4847
4848   /* PREFIX_VEX_0F61 */
4849   {
4850     { Bad_Opcode },
4851     { Bad_Opcode },
4852     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
4853   },
4854
4855   /* PREFIX_VEX_0F62 */
4856   {
4857     { Bad_Opcode },
4858     { Bad_Opcode },
4859     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
4860   },
4861
4862   /* PREFIX_VEX_0F63 */
4863   {
4864     { Bad_Opcode },
4865     { Bad_Opcode },
4866     { "vpacksswb",      { XM, Vex, EXx }, 0 },
4867   },
4868
4869   /* PREFIX_VEX_0F64 */
4870   {
4871     { Bad_Opcode },
4872     { Bad_Opcode },
4873     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
4874   },
4875
4876   /* PREFIX_VEX_0F65 */
4877   {
4878     { Bad_Opcode },
4879     { Bad_Opcode },
4880     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
4881   },
4882
4883   /* PREFIX_VEX_0F66 */
4884   {
4885     { Bad_Opcode },
4886     { Bad_Opcode },
4887     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
4888   },
4889
4890   /* PREFIX_VEX_0F67 */
4891   {
4892     { Bad_Opcode },
4893     { Bad_Opcode },
4894     { "vpackuswb",      { XM, Vex, EXx }, 0 },
4895   },
4896
4897   /* PREFIX_VEX_0F68 */
4898   {
4899     { Bad_Opcode },
4900     { Bad_Opcode },
4901     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
4902   },
4903
4904   /* PREFIX_VEX_0F69 */
4905   {
4906     { Bad_Opcode },
4907     { Bad_Opcode },
4908     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
4909   },
4910
4911   /* PREFIX_VEX_0F6A */
4912   {
4913     { Bad_Opcode },
4914     { Bad_Opcode },
4915     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
4916   },
4917
4918   /* PREFIX_VEX_0F6B */
4919   {
4920     { Bad_Opcode },
4921     { Bad_Opcode },
4922     { "vpackssdw",      { XM, Vex, EXx }, 0 },
4923   },
4924
4925   /* PREFIX_VEX_0F6C */
4926   {
4927     { Bad_Opcode },
4928     { Bad_Opcode },
4929     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
4930   },
4931
4932   /* PREFIX_VEX_0F6D */
4933   {
4934     { Bad_Opcode },
4935     { Bad_Opcode },
4936     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
4937   },
4938
4939   /* PREFIX_VEX_0F6E */
4940   {
4941     { Bad_Opcode },
4942     { Bad_Opcode },
4943     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4944   },
4945
4946   /* PREFIX_VEX_0F6F */
4947   {
4948     { Bad_Opcode },
4949     { "vmovdqu",        { XM, EXx }, 0 },
4950     { "vmovdqa",        { XM, EXx }, 0 },
4951   },
4952
4953   /* PREFIX_VEX_0F70 */
4954   {
4955     { Bad_Opcode },
4956     { "vpshufhw",       { XM, EXx, Ib }, 0 },
4957     { "vpshufd",        { XM, EXx, Ib }, 0 },
4958     { "vpshuflw",       { XM, EXx, Ib }, 0 },
4959   },
4960
4961   /* PREFIX_VEX_0F71_REG_2 */
4962   {
4963     { Bad_Opcode },
4964     { Bad_Opcode },
4965     { "vpsrlw",         { Vex, XS, Ib }, 0 },
4966   },
4967
4968   /* PREFIX_VEX_0F71_REG_4 */
4969   {
4970     { Bad_Opcode },
4971     { Bad_Opcode },
4972     { "vpsraw",         { Vex, XS, Ib }, 0 },
4973   },
4974
4975   /* PREFIX_VEX_0F71_REG_6 */
4976   {
4977     { Bad_Opcode },
4978     { Bad_Opcode },
4979     { "vpsllw",         { Vex, XS, Ib }, 0 },
4980   },
4981
4982   /* PREFIX_VEX_0F72_REG_2 */
4983   {
4984     { Bad_Opcode },
4985     { Bad_Opcode },
4986     { "vpsrld",         { Vex, XS, Ib }, 0 },
4987   },
4988
4989   /* PREFIX_VEX_0F72_REG_4 */
4990   {
4991     { Bad_Opcode },
4992     { Bad_Opcode },
4993     { "vpsrad",         { Vex, XS, Ib }, 0 },
4994   },
4995
4996   /* PREFIX_VEX_0F72_REG_6 */
4997   {
4998     { Bad_Opcode },
4999     { Bad_Opcode },
5000     { "vpslld",         { Vex, XS, Ib }, 0 },
5001   },
5002
5003   /* PREFIX_VEX_0F73_REG_2 */
5004   {
5005     { Bad_Opcode },
5006     { Bad_Opcode },
5007     { "vpsrlq",         { Vex, XS, Ib }, 0 },
5008   },
5009
5010   /* PREFIX_VEX_0F73_REG_3 */
5011   {
5012     { Bad_Opcode },
5013     { Bad_Opcode },
5014     { "vpsrldq",        { Vex, XS, Ib }, 0 },
5015   },
5016
5017   /* PREFIX_VEX_0F73_REG_6 */
5018   {
5019     { Bad_Opcode },
5020     { Bad_Opcode },
5021     { "vpsllq",         { Vex, XS, Ib }, 0 },
5022   },
5023
5024   /* PREFIX_VEX_0F73_REG_7 */
5025   {
5026     { Bad_Opcode },
5027     { Bad_Opcode },
5028     { "vpslldq",        { Vex, XS, Ib }, 0 },
5029   },
5030
5031   /* PREFIX_VEX_0F74 */
5032   {
5033     { Bad_Opcode },
5034     { Bad_Opcode },
5035     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
5036   },
5037
5038   /* PREFIX_VEX_0F75 */
5039   {
5040     { Bad_Opcode },
5041     { Bad_Opcode },
5042     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
5043   },
5044
5045   /* PREFIX_VEX_0F76 */
5046   {
5047     { Bad_Opcode },
5048     { Bad_Opcode },
5049     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
5050   },
5051
5052   /* PREFIX_VEX_0F77 */
5053   {
5054     { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5055   },
5056
5057   /* PREFIX_VEX_0F7C */
5058   {
5059     { Bad_Opcode },
5060     { Bad_Opcode },
5061     { "vhaddpd",        { XM, Vex, EXx }, 0 },
5062     { "vhaddps",        { XM, Vex, EXx }, 0 },
5063   },
5064
5065   /* PREFIX_VEX_0F7D */
5066   {
5067     { Bad_Opcode },
5068     { Bad_Opcode },
5069     { "vhsubpd",        { XM, Vex, EXx }, 0 },
5070     { "vhsubps",        { XM, Vex, EXx }, 0 },
5071   },
5072
5073   /* PREFIX_VEX_0F7E */
5074   {
5075     { Bad_Opcode },
5076     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5077     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5078   },
5079
5080   /* PREFIX_VEX_0F7F */
5081   {
5082     { Bad_Opcode },
5083     { "vmovdqu",        { EXxS, XM }, 0 },
5084     { "vmovdqa",        { EXxS, XM }, 0 },
5085   },
5086
5087   /* PREFIX_VEX_0F90 */
5088   {
5089     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5090     { Bad_Opcode },
5091     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5092   },
5093
5094   /* PREFIX_VEX_0F91 */
5095   {
5096     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5097     { Bad_Opcode },
5098     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5099   },
5100
5101   /* PREFIX_VEX_0F92 */
5102   {
5103     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5104     { Bad_Opcode },
5105     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5106     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5107   },
5108
5109   /* PREFIX_VEX_0F93 */
5110   {
5111     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5112     { Bad_Opcode },
5113     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5114     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5115   },
5116
5117   /* PREFIX_VEX_0F98 */
5118   {
5119     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5120     { Bad_Opcode },
5121     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5122   },
5123
5124   /* PREFIX_VEX_0F99 */
5125   {
5126     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5127     { Bad_Opcode },
5128     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5129   },
5130
5131   /* PREFIX_VEX_0FC2 */
5132   {
5133     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
5134     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5135     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
5136     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5137   },
5138
5139   /* PREFIX_VEX_0FC4 */
5140   {
5141     { Bad_Opcode },
5142     { Bad_Opcode },
5143     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5144   },
5145
5146   /* PREFIX_VEX_0FC5 */
5147   {
5148     { Bad_Opcode },
5149     { Bad_Opcode },
5150     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5151   },
5152
5153   /* PREFIX_VEX_0FD0 */
5154   {
5155     { Bad_Opcode },
5156     { Bad_Opcode },
5157     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
5158     { "vaddsubps",      { XM, Vex, EXx }, 0 },
5159   },
5160
5161   /* PREFIX_VEX_0FD1 */
5162   {
5163     { Bad_Opcode },
5164     { Bad_Opcode },
5165     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
5166   },
5167
5168   /* PREFIX_VEX_0FD2 */
5169   {
5170     { Bad_Opcode },
5171     { Bad_Opcode },
5172     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
5173   },
5174
5175   /* PREFIX_VEX_0FD3 */
5176   {
5177     { Bad_Opcode },
5178     { Bad_Opcode },
5179     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
5180   },
5181
5182   /* PREFIX_VEX_0FD4 */
5183   {
5184     { Bad_Opcode },
5185     { Bad_Opcode },
5186     { "vpaddq",         { XM, Vex, EXx }, 0 },
5187   },
5188
5189   /* PREFIX_VEX_0FD5 */
5190   {
5191     { Bad_Opcode },
5192     { Bad_Opcode },
5193     { "vpmullw",        { XM, Vex, EXx }, 0 },
5194   },
5195
5196   /* PREFIX_VEX_0FD6 */
5197   {
5198     { Bad_Opcode },
5199     { Bad_Opcode },
5200     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5201   },
5202
5203   /* PREFIX_VEX_0FD7 */
5204   {
5205     { Bad_Opcode },
5206     { Bad_Opcode },
5207     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5208   },
5209
5210   /* PREFIX_VEX_0FD8 */
5211   {
5212     { Bad_Opcode },
5213     { Bad_Opcode },
5214     { "vpsubusb",       { XM, Vex, EXx }, 0 },
5215   },
5216
5217   /* PREFIX_VEX_0FD9 */
5218   {
5219     { Bad_Opcode },
5220     { Bad_Opcode },
5221     { "vpsubusw",       { XM, Vex, EXx }, 0 },
5222   },
5223
5224   /* PREFIX_VEX_0FDA */
5225   {
5226     { Bad_Opcode },
5227     { Bad_Opcode },
5228     { "vpminub",        { XM, Vex, EXx }, 0 },
5229   },
5230
5231   /* PREFIX_VEX_0FDB */
5232   {
5233     { Bad_Opcode },
5234     { Bad_Opcode },
5235     { "vpand",          { XM, Vex, EXx }, 0 },
5236   },
5237
5238   /* PREFIX_VEX_0FDC */
5239   {
5240     { Bad_Opcode },
5241     { Bad_Opcode },
5242     { "vpaddusb",       { XM, Vex, EXx }, 0 },
5243   },
5244
5245   /* PREFIX_VEX_0FDD */
5246   {
5247     { Bad_Opcode },
5248     { Bad_Opcode },
5249     { "vpaddusw",       { XM, Vex, EXx }, 0 },
5250   },
5251
5252   /* PREFIX_VEX_0FDE */
5253   {
5254     { Bad_Opcode },
5255     { Bad_Opcode },
5256     { "vpmaxub",        { XM, Vex, EXx }, 0 },
5257   },
5258
5259   /* PREFIX_VEX_0FDF */
5260   {
5261     { Bad_Opcode },
5262     { Bad_Opcode },
5263     { "vpandn",         { XM, Vex, EXx }, 0 },
5264   },
5265
5266   /* PREFIX_VEX_0FE0 */
5267   {
5268     { Bad_Opcode },
5269     { Bad_Opcode },
5270     { "vpavgb",         { XM, Vex, EXx }, 0 },
5271   },
5272
5273   /* PREFIX_VEX_0FE1 */
5274   {
5275     { Bad_Opcode },
5276     { Bad_Opcode },
5277     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
5278   },
5279
5280   /* PREFIX_VEX_0FE2 */
5281   {
5282     { Bad_Opcode },
5283     { Bad_Opcode },
5284     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
5285   },
5286
5287   /* PREFIX_VEX_0FE3 */
5288   {
5289     { Bad_Opcode },
5290     { Bad_Opcode },
5291     { "vpavgw",         { XM, Vex, EXx }, 0 },
5292   },
5293
5294   /* PREFIX_VEX_0FE4 */
5295   {
5296     { Bad_Opcode },
5297     { Bad_Opcode },
5298     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
5299   },
5300
5301   /* PREFIX_VEX_0FE5 */
5302   {
5303     { Bad_Opcode },
5304     { Bad_Opcode },
5305     { "vpmulhw",        { XM, Vex, EXx }, 0 },
5306   },
5307
5308   /* PREFIX_VEX_0FE6 */
5309   {
5310     { Bad_Opcode },
5311     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
5312     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
5313     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
5314   },
5315
5316   /* PREFIX_VEX_0FE7 */
5317   {
5318     { Bad_Opcode },
5319     { Bad_Opcode },
5320     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5321   },
5322
5323   /* PREFIX_VEX_0FE8 */
5324   {
5325     { Bad_Opcode },
5326     { Bad_Opcode },
5327     { "vpsubsb",        { XM, Vex, EXx }, 0 },
5328   },
5329
5330   /* PREFIX_VEX_0FE9 */
5331   {
5332     { Bad_Opcode },
5333     { Bad_Opcode },
5334     { "vpsubsw",        { XM, Vex, EXx }, 0 },
5335   },
5336
5337   /* PREFIX_VEX_0FEA */
5338   {
5339     { Bad_Opcode },
5340     { Bad_Opcode },
5341     { "vpminsw",        { XM, Vex, EXx }, 0 },
5342   },
5343
5344   /* PREFIX_VEX_0FEB */
5345   {
5346     { Bad_Opcode },
5347     { Bad_Opcode },
5348     { "vpor",           { XM, Vex, EXx }, 0 },
5349   },
5350
5351   /* PREFIX_VEX_0FEC */
5352   {
5353     { Bad_Opcode },
5354     { Bad_Opcode },
5355     { "vpaddsb",        { XM, Vex, EXx }, 0 },
5356   },
5357
5358   /* PREFIX_VEX_0FED */
5359   {
5360     { Bad_Opcode },
5361     { Bad_Opcode },
5362     { "vpaddsw",        { XM, Vex, EXx }, 0 },
5363   },
5364
5365   /* PREFIX_VEX_0FEE */
5366   {
5367     { Bad_Opcode },
5368     { Bad_Opcode },
5369     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
5370   },
5371
5372   /* PREFIX_VEX_0FEF */
5373   {
5374     { Bad_Opcode },
5375     { Bad_Opcode },
5376     { "vpxor",          { XM, Vex, EXx }, 0 },
5377   },
5378
5379   /* PREFIX_VEX_0FF0 */
5380   {
5381     { Bad_Opcode },
5382     { Bad_Opcode },
5383     { Bad_Opcode },
5384     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5385   },
5386
5387   /* PREFIX_VEX_0FF1 */
5388   {
5389     { Bad_Opcode },
5390     { Bad_Opcode },
5391     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
5392   },
5393
5394   /* PREFIX_VEX_0FF2 */
5395   {
5396     { Bad_Opcode },
5397     { Bad_Opcode },
5398     { "vpslld",         { XM, Vex, EXxmm }, 0 },
5399   },
5400
5401   /* PREFIX_VEX_0FF3 */
5402   {
5403     { Bad_Opcode },
5404     { Bad_Opcode },
5405     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
5406   },
5407
5408   /* PREFIX_VEX_0FF4 */
5409   {
5410     { Bad_Opcode },
5411     { Bad_Opcode },
5412     { "vpmuludq",       { XM, Vex, EXx }, 0 },
5413   },
5414
5415   /* PREFIX_VEX_0FF5 */
5416   {
5417     { Bad_Opcode },
5418     { Bad_Opcode },
5419     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
5420   },
5421
5422   /* PREFIX_VEX_0FF6 */
5423   {
5424     { Bad_Opcode },
5425     { Bad_Opcode },
5426     { "vpsadbw",        { XM, Vex, EXx }, 0 },
5427   },
5428
5429   /* PREFIX_VEX_0FF7 */
5430   {
5431     { Bad_Opcode },
5432     { Bad_Opcode },
5433     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5434   },
5435
5436   /* PREFIX_VEX_0FF8 */
5437   {
5438     { Bad_Opcode },
5439     { Bad_Opcode },
5440     { "vpsubb",         { XM, Vex, EXx }, 0 },
5441   },
5442
5443   /* PREFIX_VEX_0FF9 */
5444   {
5445     { Bad_Opcode },
5446     { Bad_Opcode },
5447     { "vpsubw",         { XM, Vex, EXx }, 0 },
5448   },
5449
5450   /* PREFIX_VEX_0FFA */
5451   {
5452     { Bad_Opcode },
5453     { Bad_Opcode },
5454     { "vpsubd",         { XM, Vex, EXx }, 0 },
5455   },
5456
5457   /* PREFIX_VEX_0FFB */
5458   {
5459     { Bad_Opcode },
5460     { Bad_Opcode },
5461     { "vpsubq",         { XM, Vex, EXx }, 0 },
5462   },
5463
5464   /* PREFIX_VEX_0FFC */
5465   {
5466     { Bad_Opcode },
5467     { Bad_Opcode },
5468     { "vpaddb",         { XM, Vex, EXx }, 0 },
5469   },
5470
5471   /* PREFIX_VEX_0FFD */
5472   {
5473     { Bad_Opcode },
5474     { Bad_Opcode },
5475     { "vpaddw",         { XM, Vex, EXx }, 0 },
5476   },
5477
5478   /* PREFIX_VEX_0FFE */
5479   {
5480     { Bad_Opcode },
5481     { Bad_Opcode },
5482     { "vpaddd",         { XM, Vex, EXx }, 0 },
5483   },
5484
5485   /* PREFIX_VEX_0F3800 */
5486   {
5487     { Bad_Opcode },
5488     { Bad_Opcode },
5489     { "vpshufb",        { XM, Vex, EXx }, 0 },
5490   },
5491
5492   /* PREFIX_VEX_0F3801 */
5493   {
5494     { Bad_Opcode },
5495     { Bad_Opcode },
5496     { "vphaddw",        { XM, Vex, EXx }, 0 },
5497   },
5498
5499   /* PREFIX_VEX_0F3802 */
5500   {
5501     { Bad_Opcode },
5502     { Bad_Opcode },
5503     { "vphaddd",        { XM, Vex, EXx }, 0 },
5504   },
5505
5506   /* PREFIX_VEX_0F3803 */
5507   {
5508     { Bad_Opcode },
5509     { Bad_Opcode },
5510     { "vphaddsw",       { XM, Vex, EXx }, 0 },
5511   },
5512
5513   /* PREFIX_VEX_0F3804 */
5514   {
5515     { Bad_Opcode },
5516     { Bad_Opcode },
5517     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
5518   },
5519
5520   /* PREFIX_VEX_0F3805 */
5521   {
5522     { Bad_Opcode },
5523     { Bad_Opcode },
5524     { "vphsubw",        { XM, Vex, EXx }, 0 },
5525   },
5526
5527   /* PREFIX_VEX_0F3806 */
5528   {
5529     { Bad_Opcode },
5530     { Bad_Opcode },
5531     { "vphsubd",        { XM, Vex, EXx }, 0 },
5532   },
5533
5534   /* PREFIX_VEX_0F3807 */
5535   {
5536     { Bad_Opcode },
5537     { Bad_Opcode },
5538     { "vphsubsw",       { XM, Vex, EXx }, 0 },
5539   },
5540
5541   /* PREFIX_VEX_0F3808 */
5542   {
5543     { Bad_Opcode },
5544     { Bad_Opcode },
5545     { "vpsignb",        { XM, Vex, EXx }, 0 },
5546   },
5547
5548   /* PREFIX_VEX_0F3809 */
5549   {
5550     { Bad_Opcode },
5551     { Bad_Opcode },
5552     { "vpsignw",        { XM, Vex, EXx }, 0 },
5553   },
5554
5555   /* PREFIX_VEX_0F380A */
5556   {
5557     { Bad_Opcode },
5558     { Bad_Opcode },
5559     { "vpsignd",        { XM, Vex, EXx }, 0 },
5560   },
5561
5562   /* PREFIX_VEX_0F380B */
5563   {
5564     { Bad_Opcode },
5565     { Bad_Opcode },
5566     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
5567   },
5568
5569   /* PREFIX_VEX_0F380C */
5570   {
5571     { Bad_Opcode },
5572     { Bad_Opcode },
5573     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5574   },
5575
5576   /* PREFIX_VEX_0F380D */
5577   {
5578     { Bad_Opcode },
5579     { Bad_Opcode },
5580     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5581   },
5582
5583   /* PREFIX_VEX_0F380E */
5584   {
5585     { Bad_Opcode },
5586     { Bad_Opcode },
5587     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5588   },
5589
5590   /* PREFIX_VEX_0F380F */
5591   {
5592     { Bad_Opcode },
5593     { Bad_Opcode },
5594     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5595   },
5596
5597   /* PREFIX_VEX_0F3813 */
5598   {
5599     { Bad_Opcode },
5600     { Bad_Opcode },
5601     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5602   },
5603
5604   /* PREFIX_VEX_0F3816 */
5605   {
5606     { Bad_Opcode },
5607     { Bad_Opcode },
5608     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5609   },
5610
5611   /* PREFIX_VEX_0F3817 */
5612   {
5613     { Bad_Opcode },
5614     { Bad_Opcode },
5615     { "vptest",         { XM, EXx }, 0 },
5616   },
5617
5618   /* PREFIX_VEX_0F3818 */
5619   {
5620     { Bad_Opcode },
5621     { Bad_Opcode },
5622     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5623   },
5624
5625   /* PREFIX_VEX_0F3819 */
5626   {
5627     { Bad_Opcode },
5628     { Bad_Opcode },
5629     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5630   },
5631
5632   /* PREFIX_VEX_0F381A */
5633   {
5634     { Bad_Opcode },
5635     { Bad_Opcode },
5636     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5637   },
5638
5639   /* PREFIX_VEX_0F381C */
5640   {
5641     { Bad_Opcode },
5642     { Bad_Opcode },
5643     { "vpabsb",         { XM, EXx }, 0 },
5644   },
5645
5646   /* PREFIX_VEX_0F381D */
5647   {
5648     { Bad_Opcode },
5649     { Bad_Opcode },
5650     { "vpabsw",         { XM, EXx }, 0 },
5651   },
5652
5653   /* PREFIX_VEX_0F381E */
5654   {
5655     { Bad_Opcode },
5656     { Bad_Opcode },
5657     { "vpabsd",         { XM, EXx }, 0 },
5658   },
5659
5660   /* PREFIX_VEX_0F3820 */
5661   {
5662     { Bad_Opcode },
5663     { Bad_Opcode },
5664     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
5665   },
5666
5667   /* PREFIX_VEX_0F3821 */
5668   {
5669     { Bad_Opcode },
5670     { Bad_Opcode },
5671     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
5672   },
5673
5674   /* PREFIX_VEX_0F3822 */
5675   {
5676     { Bad_Opcode },
5677     { Bad_Opcode },
5678     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
5679   },
5680
5681   /* PREFIX_VEX_0F3823 */
5682   {
5683     { Bad_Opcode },
5684     { Bad_Opcode },
5685     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
5686   },
5687
5688   /* PREFIX_VEX_0F3824 */
5689   {
5690     { Bad_Opcode },
5691     { Bad_Opcode },
5692     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
5693   },
5694
5695   /* PREFIX_VEX_0F3825 */
5696   {
5697     { Bad_Opcode },
5698     { Bad_Opcode },
5699     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
5700   },
5701
5702   /* PREFIX_VEX_0F3828 */
5703   {
5704     { Bad_Opcode },
5705     { Bad_Opcode },
5706     { "vpmuldq",        { XM, Vex, EXx }, 0 },
5707   },
5708
5709   /* PREFIX_VEX_0F3829 */
5710   {
5711     { Bad_Opcode },
5712     { Bad_Opcode },
5713     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
5714   },
5715
5716   /* PREFIX_VEX_0F382A */
5717   {
5718     { Bad_Opcode },
5719     { Bad_Opcode },
5720     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5721   },
5722
5723   /* PREFIX_VEX_0F382B */
5724   {
5725     { Bad_Opcode },
5726     { Bad_Opcode },
5727     { "vpackusdw",      { XM, Vex, EXx }, 0 },
5728   },
5729
5730   /* PREFIX_VEX_0F382C */
5731   {
5732     { Bad_Opcode },
5733     { Bad_Opcode },
5734      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5735   },
5736
5737   /* PREFIX_VEX_0F382D */
5738   {
5739     { Bad_Opcode },
5740     { Bad_Opcode },
5741      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5742   },
5743
5744   /* PREFIX_VEX_0F382E */
5745   {
5746     { Bad_Opcode },
5747     { Bad_Opcode },
5748      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5749   },
5750
5751   /* PREFIX_VEX_0F382F */
5752   {
5753     { Bad_Opcode },
5754     { Bad_Opcode },
5755      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5756   },
5757
5758   /* PREFIX_VEX_0F3830 */
5759   {
5760     { Bad_Opcode },
5761     { Bad_Opcode },
5762     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
5763   },
5764
5765   /* PREFIX_VEX_0F3831 */
5766   {
5767     { Bad_Opcode },
5768     { Bad_Opcode },
5769     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
5770   },
5771
5772   /* PREFIX_VEX_0F3832 */
5773   {
5774     { Bad_Opcode },
5775     { Bad_Opcode },
5776     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
5777   },
5778
5779   /* PREFIX_VEX_0F3833 */
5780   {
5781     { Bad_Opcode },
5782     { Bad_Opcode },
5783     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
5784   },
5785
5786   /* PREFIX_VEX_0F3834 */
5787   {
5788     { Bad_Opcode },
5789     { Bad_Opcode },
5790     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
5791   },
5792
5793   /* PREFIX_VEX_0F3835 */
5794   {
5795     { Bad_Opcode },
5796     { Bad_Opcode },
5797     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
5798   },
5799
5800   /* PREFIX_VEX_0F3836 */
5801   {
5802     { Bad_Opcode },
5803     { Bad_Opcode },
5804     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5805   },
5806
5807   /* PREFIX_VEX_0F3837 */
5808   {
5809     { Bad_Opcode },
5810     { Bad_Opcode },
5811     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
5812   },
5813
5814   /* PREFIX_VEX_0F3838 */
5815   {
5816     { Bad_Opcode },
5817     { Bad_Opcode },
5818     { "vpminsb",        { XM, Vex, EXx }, 0 },
5819   },
5820
5821   /* PREFIX_VEX_0F3839 */
5822   {
5823     { Bad_Opcode },
5824     { Bad_Opcode },
5825     { "vpminsd",        { XM, Vex, EXx }, 0 },
5826   },
5827
5828   /* PREFIX_VEX_0F383A */
5829   {
5830     { Bad_Opcode },
5831     { Bad_Opcode },
5832     { "vpminuw",        { XM, Vex, EXx }, 0 },
5833   },
5834
5835   /* PREFIX_VEX_0F383B */
5836   {
5837     { Bad_Opcode },
5838     { Bad_Opcode },
5839     { "vpminud",        { XM, Vex, EXx }, 0 },
5840   },
5841
5842   /* PREFIX_VEX_0F383C */
5843   {
5844     { Bad_Opcode },
5845     { Bad_Opcode },
5846     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
5847   },
5848
5849   /* PREFIX_VEX_0F383D */
5850   {
5851     { Bad_Opcode },
5852     { Bad_Opcode },
5853     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
5854   },
5855
5856   /* PREFIX_VEX_0F383E */
5857   {
5858     { Bad_Opcode },
5859     { Bad_Opcode },
5860     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
5861   },
5862
5863   /* PREFIX_VEX_0F383F */
5864   {
5865     { Bad_Opcode },
5866     { Bad_Opcode },
5867     { "vpmaxud",        { XM, Vex, EXx }, 0 },
5868   },
5869
5870   /* PREFIX_VEX_0F3840 */
5871   {
5872     { Bad_Opcode },
5873     { Bad_Opcode },
5874     { "vpmulld",        { XM, Vex, EXx }, 0 },
5875   },
5876
5877   /* PREFIX_VEX_0F3841 */
5878   {
5879     { Bad_Opcode },
5880     { Bad_Opcode },
5881     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5882   },
5883
5884   /* PREFIX_VEX_0F3845 */
5885   {
5886     { Bad_Opcode },
5887     { Bad_Opcode },
5888     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5889   },
5890
5891   /* PREFIX_VEX_0F3846 */
5892   {
5893     { Bad_Opcode },
5894     { Bad_Opcode },
5895     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5896   },
5897
5898   /* PREFIX_VEX_0F3847 */
5899   {
5900     { Bad_Opcode },
5901     { Bad_Opcode },
5902     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5903   },
5904
5905   /* PREFIX_VEX_0F3858 */
5906   {
5907     { Bad_Opcode },
5908     { Bad_Opcode },
5909     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5910   },
5911
5912   /* PREFIX_VEX_0F3859 */
5913   {
5914     { Bad_Opcode },
5915     { Bad_Opcode },
5916     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5917   },
5918
5919   /* PREFIX_VEX_0F385A */
5920   {
5921     { Bad_Opcode },
5922     { Bad_Opcode },
5923     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5924   },
5925
5926   /* PREFIX_VEX_0F3878 */
5927   {
5928     { Bad_Opcode },
5929     { Bad_Opcode },
5930     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5931   },
5932
5933   /* PREFIX_VEX_0F3879 */
5934   {
5935     { Bad_Opcode },
5936     { Bad_Opcode },
5937     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5938   },
5939
5940   /* PREFIX_VEX_0F388C */
5941   {
5942     { Bad_Opcode },
5943     { Bad_Opcode },
5944     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5945   },
5946
5947   /* PREFIX_VEX_0F388E */
5948   {
5949     { Bad_Opcode },
5950     { Bad_Opcode },
5951     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5952   },
5953
5954   /* PREFIX_VEX_0F3890 */
5955   {
5956     { Bad_Opcode },
5957     { Bad_Opcode },
5958     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5959   },
5960
5961   /* PREFIX_VEX_0F3891 */
5962   {
5963     { Bad_Opcode },
5964     { Bad_Opcode },
5965     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5966   },
5967
5968   /* PREFIX_VEX_0F3892 */
5969   {
5970     { Bad_Opcode },
5971     { Bad_Opcode },
5972     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
5973   },
5974
5975   /* PREFIX_VEX_0F3893 */
5976   {
5977     { Bad_Opcode },
5978     { Bad_Opcode },
5979     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5980   },
5981
5982   /* PREFIX_VEX_0F3896 */
5983   {
5984     { Bad_Opcode },
5985     { Bad_Opcode },
5986     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
5987   },
5988
5989   /* PREFIX_VEX_0F3897 */
5990   {
5991     { Bad_Opcode },
5992     { Bad_Opcode },
5993     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
5994   },
5995
5996   /* PREFIX_VEX_0F3898 */
5997   {
5998     { Bad_Opcode },
5999     { Bad_Opcode },
6000     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6001   },
6002
6003   /* PREFIX_VEX_0F3899 */
6004   {
6005     { Bad_Opcode },
6006     { Bad_Opcode },
6007     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6008   },
6009
6010   /* PREFIX_VEX_0F389A */
6011   {
6012     { Bad_Opcode },
6013     { Bad_Opcode },
6014     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6015   },
6016
6017   /* PREFIX_VEX_0F389B */
6018   {
6019     { Bad_Opcode },
6020     { Bad_Opcode },
6021     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6022   },
6023
6024   /* PREFIX_VEX_0F389C */
6025   {
6026     { Bad_Opcode },
6027     { Bad_Opcode },
6028     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6029   },
6030
6031   /* PREFIX_VEX_0F389D */
6032   {
6033     { Bad_Opcode },
6034     { Bad_Opcode },
6035     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6036   },
6037
6038   /* PREFIX_VEX_0F389E */
6039   {
6040     { Bad_Opcode },
6041     { Bad_Opcode },
6042     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6043   },
6044
6045   /* PREFIX_VEX_0F389F */
6046   {
6047     { Bad_Opcode },
6048     { Bad_Opcode },
6049     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6050   },
6051
6052   /* PREFIX_VEX_0F38A6 */
6053   {
6054     { Bad_Opcode },
6055     { Bad_Opcode },
6056     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6057     { Bad_Opcode },
6058   },
6059
6060   /* PREFIX_VEX_0F38A7 */
6061   {
6062     { Bad_Opcode },
6063     { Bad_Opcode },
6064     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6065   },
6066
6067   /* PREFIX_VEX_0F38A8 */
6068   {
6069     { Bad_Opcode },
6070     { Bad_Opcode },
6071     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6072   },
6073
6074   /* PREFIX_VEX_0F38A9 */
6075   {
6076     { Bad_Opcode },
6077     { Bad_Opcode },
6078     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6079   },
6080
6081   /* PREFIX_VEX_0F38AA */
6082   {
6083     { Bad_Opcode },
6084     { Bad_Opcode },
6085     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6086   },
6087
6088   /* PREFIX_VEX_0F38AB */
6089   {
6090     { Bad_Opcode },
6091     { Bad_Opcode },
6092     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6093   },
6094
6095   /* PREFIX_VEX_0F38AC */
6096   {
6097     { Bad_Opcode },
6098     { Bad_Opcode },
6099     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6100   },
6101
6102   /* PREFIX_VEX_0F38AD */
6103   {
6104     { Bad_Opcode },
6105     { Bad_Opcode },
6106     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6107   },
6108
6109   /* PREFIX_VEX_0F38AE */
6110   {
6111     { Bad_Opcode },
6112     { Bad_Opcode },
6113     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6114   },
6115
6116   /* PREFIX_VEX_0F38AF */
6117   {
6118     { Bad_Opcode },
6119     { Bad_Opcode },
6120     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6121   },
6122
6123   /* PREFIX_VEX_0F38B6 */
6124   {
6125     { Bad_Opcode },
6126     { Bad_Opcode },
6127     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6128   },
6129
6130   /* PREFIX_VEX_0F38B7 */
6131   {
6132     { Bad_Opcode },
6133     { Bad_Opcode },
6134     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6135   },
6136
6137   /* PREFIX_VEX_0F38B8 */
6138   {
6139     { Bad_Opcode },
6140     { Bad_Opcode },
6141     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6142   },
6143
6144   /* PREFIX_VEX_0F38B9 */
6145   {
6146     { Bad_Opcode },
6147     { Bad_Opcode },
6148     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6149   },
6150
6151   /* PREFIX_VEX_0F38BA */
6152   {
6153     { Bad_Opcode },
6154     { Bad_Opcode },
6155     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6156   },
6157
6158   /* PREFIX_VEX_0F38BB */
6159   {
6160     { Bad_Opcode },
6161     { Bad_Opcode },
6162     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6163   },
6164
6165   /* PREFIX_VEX_0F38BC */
6166   {
6167     { Bad_Opcode },
6168     { Bad_Opcode },
6169     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6170   },
6171
6172   /* PREFIX_VEX_0F38BD */
6173   {
6174     { Bad_Opcode },
6175     { Bad_Opcode },
6176     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6177   },
6178
6179   /* PREFIX_VEX_0F38BE */
6180   {
6181     { Bad_Opcode },
6182     { Bad_Opcode },
6183     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6184   },
6185
6186   /* PREFIX_VEX_0F38BF */
6187   {
6188     { Bad_Opcode },
6189     { Bad_Opcode },
6190     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6191   },
6192
6193   /* PREFIX_VEX_0F38CF */
6194   {
6195     { Bad_Opcode },
6196     { Bad_Opcode },
6197     { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6198   },
6199
6200   /* PREFIX_VEX_0F38DB */
6201   {
6202     { Bad_Opcode },
6203     { Bad_Opcode },
6204     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6205   },
6206
6207   /* PREFIX_VEX_0F38DC */
6208   {
6209     { Bad_Opcode },
6210     { Bad_Opcode },
6211     { "vaesenc",        { XM, Vex, EXx }, 0 },
6212   },
6213
6214   /* PREFIX_VEX_0F38DD */
6215   {
6216     { Bad_Opcode },
6217     { Bad_Opcode },
6218     { "vaesenclast",    { XM, Vex, EXx }, 0 },
6219   },
6220
6221   /* PREFIX_VEX_0F38DE */
6222   {
6223     { Bad_Opcode },
6224     { Bad_Opcode },
6225     { "vaesdec",        { XM, Vex, EXx }, 0 },
6226   },
6227
6228   /* PREFIX_VEX_0F38DF */
6229   {
6230     { Bad_Opcode },
6231     { Bad_Opcode },
6232     { "vaesdeclast",    { XM, Vex, EXx }, 0 },
6233   },
6234
6235   /* PREFIX_VEX_0F38F2 */
6236   {
6237     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6238   },
6239
6240   /* PREFIX_VEX_0F38F3_REG_1 */
6241   {
6242     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6243   },
6244
6245   /* PREFIX_VEX_0F38F3_REG_2 */
6246   {
6247     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6248   },
6249
6250   /* PREFIX_VEX_0F38F3_REG_3 */
6251   {
6252     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6253   },
6254
6255   /* PREFIX_VEX_0F38F5 */
6256   {
6257     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6258     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6259     { Bad_Opcode },
6260     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6261   },
6262
6263   /* PREFIX_VEX_0F38F6 */
6264   {
6265     { Bad_Opcode },
6266     { Bad_Opcode },
6267     { Bad_Opcode },
6268     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6269   },
6270
6271   /* PREFIX_VEX_0F38F7 */
6272   {
6273     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6274     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6275     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6276     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6277   },
6278
6279   /* PREFIX_VEX_0F3A00 */
6280   {
6281     { Bad_Opcode },
6282     { Bad_Opcode },
6283     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6284   },
6285
6286   /* PREFIX_VEX_0F3A01 */
6287   {
6288     { Bad_Opcode },
6289     { Bad_Opcode },
6290     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6291   },
6292
6293   /* PREFIX_VEX_0F3A02 */
6294   {
6295     { Bad_Opcode },
6296     { Bad_Opcode },
6297     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6298   },
6299
6300   /* PREFIX_VEX_0F3A04 */
6301   {
6302     { Bad_Opcode },
6303     { Bad_Opcode },
6304     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6305   },
6306
6307   /* PREFIX_VEX_0F3A05 */
6308   {
6309     { Bad_Opcode },
6310     { Bad_Opcode },
6311     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6312   },
6313
6314   /* PREFIX_VEX_0F3A06 */
6315   {
6316     { Bad_Opcode },
6317     { Bad_Opcode },
6318     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6319   },
6320
6321   /* PREFIX_VEX_0F3A08 */
6322   {
6323     { Bad_Opcode },
6324     { Bad_Opcode },
6325     { "vroundps",       { XM, EXx, Ib }, 0 },
6326   },
6327
6328   /* PREFIX_VEX_0F3A09 */
6329   {
6330     { Bad_Opcode },
6331     { Bad_Opcode },
6332     { "vroundpd",       { XM, EXx, Ib }, 0 },
6333   },
6334
6335   /* PREFIX_VEX_0F3A0A */
6336   {
6337     { Bad_Opcode },
6338     { Bad_Opcode },
6339     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6340   },
6341
6342   /* PREFIX_VEX_0F3A0B */
6343   {
6344     { Bad_Opcode },
6345     { Bad_Opcode },
6346     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6347   },
6348
6349   /* PREFIX_VEX_0F3A0C */
6350   {
6351     { Bad_Opcode },
6352     { Bad_Opcode },
6353     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
6354   },
6355
6356   /* PREFIX_VEX_0F3A0D */
6357   {
6358     { Bad_Opcode },
6359     { Bad_Opcode },
6360     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
6361   },
6362
6363   /* PREFIX_VEX_0F3A0E */
6364   {
6365     { Bad_Opcode },
6366     { Bad_Opcode },
6367     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
6368   },
6369
6370   /* PREFIX_VEX_0F3A0F */
6371   {
6372     { Bad_Opcode },
6373     { Bad_Opcode },
6374     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
6375   },
6376
6377   /* PREFIX_VEX_0F3A14 */
6378   {
6379     { Bad_Opcode },
6380     { Bad_Opcode },
6381     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6382   },
6383
6384   /* PREFIX_VEX_0F3A15 */
6385   {
6386     { Bad_Opcode },
6387     { Bad_Opcode },
6388     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6389   },
6390
6391   /* PREFIX_VEX_0F3A16 */
6392   {
6393     { Bad_Opcode },
6394     { Bad_Opcode },
6395     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6396   },
6397
6398   /* PREFIX_VEX_0F3A17 */
6399   {
6400     { Bad_Opcode },
6401     { Bad_Opcode },
6402     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6403   },
6404
6405   /* PREFIX_VEX_0F3A18 */
6406   {
6407     { Bad_Opcode },
6408     { Bad_Opcode },
6409     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6410   },
6411
6412   /* PREFIX_VEX_0F3A19 */
6413   {
6414     { Bad_Opcode },
6415     { Bad_Opcode },
6416     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6417   },
6418
6419   /* PREFIX_VEX_0F3A1D */
6420   {
6421     { Bad_Opcode },
6422     { Bad_Opcode },
6423     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6424   },
6425
6426   /* PREFIX_VEX_0F3A20 */
6427   {
6428     { Bad_Opcode },
6429     { Bad_Opcode },
6430     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6431   },
6432
6433   /* PREFIX_VEX_0F3A21 */
6434   {
6435     { Bad_Opcode },
6436     { Bad_Opcode },
6437     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6438   },
6439
6440   /* PREFIX_VEX_0F3A22 */
6441   {
6442     { Bad_Opcode },
6443     { Bad_Opcode },
6444     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6445   },
6446
6447   /* PREFIX_VEX_0F3A30 */
6448   {
6449     { Bad_Opcode },
6450     { Bad_Opcode },
6451     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6452   },
6453
6454   /* PREFIX_VEX_0F3A31 */
6455   {
6456     { Bad_Opcode },
6457     { Bad_Opcode },
6458     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6459   },
6460
6461   /* PREFIX_VEX_0F3A32 */
6462   {
6463     { Bad_Opcode },
6464     { Bad_Opcode },
6465     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6466   },
6467
6468   /* PREFIX_VEX_0F3A33 */
6469   {
6470     { Bad_Opcode },
6471     { Bad_Opcode },
6472     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6473   },
6474
6475   /* PREFIX_VEX_0F3A38 */
6476   {
6477     { Bad_Opcode },
6478     { Bad_Opcode },
6479     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6480   },
6481
6482   /* PREFIX_VEX_0F3A39 */
6483   {
6484     { Bad_Opcode },
6485     { Bad_Opcode },
6486     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6487   },
6488
6489   /* PREFIX_VEX_0F3A40 */
6490   {
6491     { Bad_Opcode },
6492     { Bad_Opcode },
6493     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
6494   },
6495
6496   /* PREFIX_VEX_0F3A41 */
6497   {
6498     { Bad_Opcode },
6499     { Bad_Opcode },
6500     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6501   },
6502
6503   /* PREFIX_VEX_0F3A42 */
6504   {
6505     { Bad_Opcode },
6506     { Bad_Opcode },
6507     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
6508   },
6509
6510   /* PREFIX_VEX_0F3A44 */
6511   {
6512     { Bad_Opcode },
6513     { Bad_Opcode },
6514     { "vpclmulqdq",     { XM, Vex, EXx, PCLMUL }, 0 },
6515   },
6516
6517   /* PREFIX_VEX_0F3A46 */
6518   {
6519     { Bad_Opcode },
6520     { Bad_Opcode },
6521     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6522   },
6523
6524   /* PREFIX_VEX_0F3A48 */
6525   {
6526     { Bad_Opcode },
6527     { Bad_Opcode },
6528     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6529   },
6530
6531   /* PREFIX_VEX_0F3A49 */
6532   {
6533     { Bad_Opcode },
6534     { Bad_Opcode },
6535     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6536   },
6537
6538   /* PREFIX_VEX_0F3A4A */
6539   {
6540     { Bad_Opcode },
6541     { Bad_Opcode },
6542     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6543   },
6544
6545   /* PREFIX_VEX_0F3A4B */
6546   {
6547     { Bad_Opcode },
6548     { Bad_Opcode },
6549     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6550   },
6551
6552   /* PREFIX_VEX_0F3A4C */
6553   {
6554     { Bad_Opcode },
6555     { Bad_Opcode },
6556     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6557   },
6558
6559   /* PREFIX_VEX_0F3A5C */
6560   {
6561     { Bad_Opcode },
6562     { Bad_Opcode },
6563     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6564   },
6565
6566   /* PREFIX_VEX_0F3A5D */
6567   {
6568     { Bad_Opcode },
6569     { Bad_Opcode },
6570     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6571   },
6572
6573   /* PREFIX_VEX_0F3A5E */
6574   {
6575     { Bad_Opcode },
6576     { Bad_Opcode },
6577     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6578   },
6579
6580   /* PREFIX_VEX_0F3A5F */
6581   {
6582     { Bad_Opcode },
6583     { Bad_Opcode },
6584     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6585   },
6586
6587   /* PREFIX_VEX_0F3A60 */
6588   {
6589     { Bad_Opcode },
6590     { Bad_Opcode },
6591     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6592     { Bad_Opcode },
6593   },
6594
6595   /* PREFIX_VEX_0F3A61 */
6596   {
6597     { Bad_Opcode },
6598     { Bad_Opcode },
6599     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6600   },
6601
6602   /* PREFIX_VEX_0F3A62 */
6603   {
6604     { Bad_Opcode },
6605     { Bad_Opcode },
6606     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6607   },
6608
6609   /* PREFIX_VEX_0F3A63 */
6610   {
6611     { Bad_Opcode },
6612     { Bad_Opcode },
6613     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6614   },
6615
6616   /* PREFIX_VEX_0F3A68 */
6617   {
6618     { Bad_Opcode },
6619     { Bad_Opcode },
6620     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6621   },
6622
6623   /* PREFIX_VEX_0F3A69 */
6624   {
6625     { Bad_Opcode },
6626     { Bad_Opcode },
6627     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6628   },
6629
6630   /* PREFIX_VEX_0F3A6A */
6631   {
6632     { Bad_Opcode },
6633     { Bad_Opcode },
6634     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6635   },
6636
6637   /* PREFIX_VEX_0F3A6B */
6638   {
6639     { Bad_Opcode },
6640     { Bad_Opcode },
6641     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6642   },
6643
6644   /* PREFIX_VEX_0F3A6C */
6645   {
6646     { Bad_Opcode },
6647     { Bad_Opcode },
6648     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6649   },
6650
6651   /* PREFIX_VEX_0F3A6D */
6652   {
6653     { Bad_Opcode },
6654     { Bad_Opcode },
6655     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6656   },
6657
6658   /* PREFIX_VEX_0F3A6E */
6659   {
6660     { Bad_Opcode },
6661     { Bad_Opcode },
6662     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6663   },
6664
6665   /* PREFIX_VEX_0F3A6F */
6666   {
6667     { Bad_Opcode },
6668     { Bad_Opcode },
6669     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6670   },
6671
6672   /* PREFIX_VEX_0F3A78 */
6673   {
6674     { Bad_Opcode },
6675     { Bad_Opcode },
6676     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6677   },
6678
6679   /* PREFIX_VEX_0F3A79 */
6680   {
6681     { Bad_Opcode },
6682     { Bad_Opcode },
6683     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6684   },
6685
6686   /* PREFIX_VEX_0F3A7A */
6687   {
6688     { Bad_Opcode },
6689     { Bad_Opcode },
6690     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6691   },
6692
6693   /* PREFIX_VEX_0F3A7B */
6694   {
6695     { Bad_Opcode },
6696     { Bad_Opcode },
6697     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6698   },
6699
6700   /* PREFIX_VEX_0F3A7C */
6701   {
6702     { Bad_Opcode },
6703     { Bad_Opcode },
6704     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6705     { Bad_Opcode },
6706   },
6707
6708   /* PREFIX_VEX_0F3A7D */
6709   {
6710     { Bad_Opcode },
6711     { Bad_Opcode },
6712     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6713   },
6714
6715   /* PREFIX_VEX_0F3A7E */
6716   {
6717     { Bad_Opcode },
6718     { Bad_Opcode },
6719     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6720   },
6721
6722   /* PREFIX_VEX_0F3A7F */
6723   {
6724     { Bad_Opcode },
6725     { Bad_Opcode },
6726     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6727   },
6728
6729   /* PREFIX_VEX_0F3ACE */
6730   {
6731     { Bad_Opcode },
6732     { Bad_Opcode },
6733     { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6734   },
6735
6736   /* PREFIX_VEX_0F3ACF */
6737   {
6738     { Bad_Opcode },
6739     { Bad_Opcode },
6740     { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6741   },
6742
6743   /* PREFIX_VEX_0F3ADF */
6744   {
6745     { Bad_Opcode },
6746     { Bad_Opcode },
6747     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6748   },
6749
6750   /* PREFIX_VEX_0F3AF0 */
6751   {
6752     { Bad_Opcode },
6753     { Bad_Opcode },
6754     { Bad_Opcode },
6755     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6756   },
6757
6758 #define NEED_PREFIX_TABLE
6759 #include "i386-dis-evex.h"
6760 #undef NEED_PREFIX_TABLE
6761 };
6762
6763 static const struct dis386 x86_64_table[][2] = {
6764   /* X86_64_06 */
6765   {
6766     { "pushP", { es }, 0 },
6767   },
6768
6769   /* X86_64_07 */
6770   {
6771     { "popP", { es }, 0 },
6772   },
6773
6774   /* X86_64_0D */
6775   {
6776     { "pushP", { cs }, 0 },
6777   },
6778
6779   /* X86_64_16 */
6780   {
6781     { "pushP", { ss }, 0 },
6782   },
6783
6784   /* X86_64_17 */
6785   {
6786     { "popP", { ss }, 0 },
6787   },
6788
6789   /* X86_64_1E */
6790   {
6791     { "pushP", { ds }, 0 },
6792   },
6793
6794   /* X86_64_1F */
6795   {
6796     { "popP", { ds }, 0 },
6797   },
6798
6799   /* X86_64_27 */
6800   {
6801     { "daa", { XX }, 0 },
6802   },
6803
6804   /* X86_64_2F */
6805   {
6806     { "das", { XX }, 0 },
6807   },
6808
6809   /* X86_64_37 */
6810   {
6811     { "aaa", { XX }, 0 },
6812   },
6813
6814   /* X86_64_3F */
6815   {
6816     { "aas", { XX }, 0 },
6817   },
6818
6819   /* X86_64_60 */
6820   {
6821     { "pushaP", { XX }, 0 },
6822   },
6823
6824   /* X86_64_61 */
6825   {
6826     { "popaP", { XX }, 0 },
6827   },
6828
6829   /* X86_64_62 */
6830   {
6831     { MOD_TABLE (MOD_62_32BIT) },
6832     { EVEX_TABLE (EVEX_0F) },
6833   },
6834
6835   /* X86_64_63 */
6836   {
6837     { "arpl", { Ew, Gw }, 0 },
6838     { "movs{lq|xd}", { Gv, Ed }, 0 },
6839   },
6840
6841   /* X86_64_6D */
6842   {
6843     { "ins{R|}", { Yzr, indirDX }, 0 },
6844     { "ins{G|}", { Yzr, indirDX }, 0 },
6845   },
6846
6847   /* X86_64_6F */
6848   {
6849     { "outs{R|}", { indirDXr, Xz }, 0 },
6850     { "outs{G|}", { indirDXr, Xz }, 0 },
6851   },
6852
6853   /* X86_64_82 */
6854   {
6855     /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
6856     { REG_TABLE (REG_80) },
6857   },
6858
6859   /* X86_64_9A */
6860   {
6861     { "Jcall{T|}", { Ap }, 0 },
6862   },
6863
6864   /* X86_64_C4 */
6865   {
6866     { MOD_TABLE (MOD_C4_32BIT) },
6867     { VEX_C4_TABLE (VEX_0F) },
6868   },
6869
6870   /* X86_64_C5 */
6871   {
6872     { MOD_TABLE (MOD_C5_32BIT) },
6873     { VEX_C5_TABLE (VEX_0F) },
6874   },
6875
6876   /* X86_64_CE */
6877   {
6878     { "into", { XX }, 0 },
6879   },
6880
6881   /* X86_64_D4 */
6882   {
6883     { "aam", { Ib }, 0 },
6884   },
6885
6886   /* X86_64_D5 */
6887   {
6888     { "aad", { Ib }, 0 },
6889   },
6890
6891   /* X86_64_E8 */
6892   {
6893     { "callP",          { Jv, BND }, 0 },
6894     { "call@",          { Jv, BND }, 0 }
6895   },
6896
6897   /* X86_64_E9 */
6898   {
6899     { "jmpP",           { Jv, BND }, 0 },
6900     { "jmp@",           { Jv, BND }, 0 }
6901   },
6902
6903   /* X86_64_EA */
6904   {
6905     { "Jjmp{T|}", { Ap }, 0 },
6906   },
6907
6908   /* X86_64_0F01_REG_0 */
6909   {
6910     { "sgdt{Q|IQ}", { M }, 0 },
6911     { "sgdt", { M }, 0 },
6912   },
6913
6914   /* X86_64_0F01_REG_1 */
6915   {
6916     { "sidt{Q|IQ}", { M }, 0 },
6917     { "sidt", { M }, 0 },
6918   },
6919
6920   /* X86_64_0F01_REG_2 */
6921   {
6922     { "lgdt{Q|Q}", { M }, 0 },
6923     { "lgdt", { M }, 0 },
6924   },
6925
6926   /* X86_64_0F01_REG_3 */
6927   {
6928     { "lidt{Q|Q}", { M }, 0 },
6929     { "lidt", { M }, 0 },
6930   },
6931 };
6932
6933 static const struct dis386 three_byte_table[][256] = {
6934
6935   /* THREE_BYTE_0F38 */
6936   {
6937     /* 00 */
6938     { "pshufb",         { MX, EM }, PREFIX_OPCODE },
6939     { "phaddw",         { MX, EM }, PREFIX_OPCODE },
6940     { "phaddd",         { MX, EM }, PREFIX_OPCODE },
6941     { "phaddsw",        { MX, EM }, PREFIX_OPCODE },
6942     { "pmaddubsw",      { MX, EM }, PREFIX_OPCODE },
6943     { "phsubw",         { MX, EM }, PREFIX_OPCODE },
6944     { "phsubd",         { MX, EM }, PREFIX_OPCODE },
6945     { "phsubsw",        { MX, EM }, PREFIX_OPCODE },
6946     /* 08 */
6947     { "psignb",         { MX, EM }, PREFIX_OPCODE },
6948     { "psignw",         { MX, EM }, PREFIX_OPCODE },
6949     { "psignd",         { MX, EM }, PREFIX_OPCODE },
6950     { "pmulhrsw",       { MX, EM }, PREFIX_OPCODE },
6951     { Bad_Opcode },
6952     { Bad_Opcode },
6953     { Bad_Opcode },
6954     { Bad_Opcode },
6955     /* 10 */
6956     { PREFIX_TABLE (PREFIX_0F3810) },
6957     { Bad_Opcode },
6958     { Bad_Opcode },
6959     { Bad_Opcode },
6960     { PREFIX_TABLE (PREFIX_0F3814) },
6961     { PREFIX_TABLE (PREFIX_0F3815) },
6962     { Bad_Opcode },
6963     { PREFIX_TABLE (PREFIX_0F3817) },
6964     /* 18 */
6965     { Bad_Opcode },
6966     { Bad_Opcode },
6967     { Bad_Opcode },
6968     { Bad_Opcode },
6969     { "pabsb",          { MX, EM }, PREFIX_OPCODE },
6970     { "pabsw",          { MX, EM }, PREFIX_OPCODE },
6971     { "pabsd",          { MX, EM }, PREFIX_OPCODE },
6972     { Bad_Opcode },
6973     /* 20 */
6974     { PREFIX_TABLE (PREFIX_0F3820) },
6975     { PREFIX_TABLE (PREFIX_0F3821) },
6976     { PREFIX_TABLE (PREFIX_0F3822) },
6977     { PREFIX_TABLE (PREFIX_0F3823) },
6978     { PREFIX_TABLE (PREFIX_0F3824) },
6979     { PREFIX_TABLE (PREFIX_0F3825) },
6980     { Bad_Opcode },
6981     { Bad_Opcode },
6982     /* 28 */
6983     { PREFIX_TABLE (PREFIX_0F3828) },
6984     { PREFIX_TABLE (PREFIX_0F3829) },
6985     { PREFIX_TABLE (PREFIX_0F382A) },
6986     { PREFIX_TABLE (PREFIX_0F382B) },
6987     { Bad_Opcode },
6988     { Bad_Opcode },
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     /* 30 */
6992     { PREFIX_TABLE (PREFIX_0F3830) },
6993     { PREFIX_TABLE (PREFIX_0F3831) },
6994     { PREFIX_TABLE (PREFIX_0F3832) },
6995     { PREFIX_TABLE (PREFIX_0F3833) },
6996     { PREFIX_TABLE (PREFIX_0F3834) },
6997     { PREFIX_TABLE (PREFIX_0F3835) },
6998     { Bad_Opcode },
6999     { PREFIX_TABLE (PREFIX_0F3837) },
7000     /* 38 */
7001     { PREFIX_TABLE (PREFIX_0F3838) },
7002     { PREFIX_TABLE (PREFIX_0F3839) },
7003     { PREFIX_TABLE (PREFIX_0F383A) },
7004     { PREFIX_TABLE (PREFIX_0F383B) },
7005     { PREFIX_TABLE (PREFIX_0F383C) },
7006     { PREFIX_TABLE (PREFIX_0F383D) },
7007     { PREFIX_TABLE (PREFIX_0F383E) },
7008     { PREFIX_TABLE (PREFIX_0F383F) },
7009     /* 40 */
7010     { PREFIX_TABLE (PREFIX_0F3840) },
7011     { PREFIX_TABLE (PREFIX_0F3841) },
7012     { Bad_Opcode },
7013     { Bad_Opcode },
7014     { Bad_Opcode },
7015     { Bad_Opcode },
7016     { Bad_Opcode },
7017     { Bad_Opcode },
7018     /* 48 */
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     { Bad_Opcode },
7022     { Bad_Opcode },
7023     { Bad_Opcode },
7024     { Bad_Opcode },
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     /* 50 */
7028     { Bad_Opcode },
7029     { Bad_Opcode },
7030     { Bad_Opcode },
7031     { Bad_Opcode },
7032     { Bad_Opcode },
7033     { Bad_Opcode },
7034     { Bad_Opcode },
7035     { Bad_Opcode },
7036     /* 58 */
7037     { Bad_Opcode },
7038     { Bad_Opcode },
7039     { Bad_Opcode },
7040     { Bad_Opcode },
7041     { Bad_Opcode },
7042     { Bad_Opcode },
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     /* 60 */
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     { Bad_Opcode },
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     /* 68 */
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     { Bad_Opcode },
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     /* 70 */
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     { Bad_Opcode },
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     /* 78 */
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     { Bad_Opcode },
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     /* 80 */
7082     { PREFIX_TABLE (PREFIX_0F3880) },
7083     { PREFIX_TABLE (PREFIX_0F3881) },
7084     { PREFIX_TABLE (PREFIX_0F3882) },
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     /* 88 */
7091     { Bad_Opcode },
7092     { Bad_Opcode },
7093     { Bad_Opcode },
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     /* 90 */
7100     { Bad_Opcode },
7101     { Bad_Opcode },
7102     { Bad_Opcode },
7103     { Bad_Opcode },
7104     { Bad_Opcode },
7105     { Bad_Opcode },
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     /* 98 */
7109     { Bad_Opcode },
7110     { Bad_Opcode },
7111     { Bad_Opcode },
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     { Bad_Opcode },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     /* a0 */
7118     { Bad_Opcode },
7119     { Bad_Opcode },
7120     { Bad_Opcode },
7121     { Bad_Opcode },
7122     { Bad_Opcode },
7123     { Bad_Opcode },
7124     { Bad_Opcode },
7125     { Bad_Opcode },
7126     /* a8 */
7127     { Bad_Opcode },
7128     { Bad_Opcode },
7129     { Bad_Opcode },
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     /* b0 */
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     { Bad_Opcode },
7139     { Bad_Opcode },
7140     { Bad_Opcode },
7141     { Bad_Opcode },
7142     { Bad_Opcode },
7143     { Bad_Opcode },
7144     /* b8 */
7145     { Bad_Opcode },
7146     { Bad_Opcode },
7147     { Bad_Opcode },
7148     { Bad_Opcode },
7149     { Bad_Opcode },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     /* c0 */
7154     { Bad_Opcode },
7155     { Bad_Opcode },
7156     { Bad_Opcode },
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     /* c8 */
7163     { PREFIX_TABLE (PREFIX_0F38C8) },
7164     { PREFIX_TABLE (PREFIX_0F38C9) },
7165     { PREFIX_TABLE (PREFIX_0F38CA) },
7166     { PREFIX_TABLE (PREFIX_0F38CB) },
7167     { PREFIX_TABLE (PREFIX_0F38CC) },
7168     { PREFIX_TABLE (PREFIX_0F38CD) },
7169     { Bad_Opcode },
7170     { PREFIX_TABLE (PREFIX_0F38CF) },
7171     /* d0 */
7172     { Bad_Opcode },
7173     { Bad_Opcode },
7174     { Bad_Opcode },
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     { Bad_Opcode },
7178     { Bad_Opcode },
7179     { Bad_Opcode },
7180     /* d8 */
7181     { Bad_Opcode },
7182     { Bad_Opcode },
7183     { Bad_Opcode },
7184     { PREFIX_TABLE (PREFIX_0F38DB) },
7185     { PREFIX_TABLE (PREFIX_0F38DC) },
7186     { PREFIX_TABLE (PREFIX_0F38DD) },
7187     { PREFIX_TABLE (PREFIX_0F38DE) },
7188     { PREFIX_TABLE (PREFIX_0F38DF) },
7189     /* e0 */
7190     { Bad_Opcode },
7191     { Bad_Opcode },
7192     { Bad_Opcode },
7193     { Bad_Opcode },
7194     { Bad_Opcode },
7195     { Bad_Opcode },
7196     { Bad_Opcode },
7197     { Bad_Opcode },
7198     /* e8 */
7199     { Bad_Opcode },
7200     { Bad_Opcode },
7201     { Bad_Opcode },
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     { Bad_Opcode },
7207     /* f0 */
7208     { PREFIX_TABLE (PREFIX_0F38F0) },
7209     { PREFIX_TABLE (PREFIX_0F38F1) },
7210     { Bad_Opcode },
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     { PREFIX_TABLE (PREFIX_0F38F5) },
7214     { PREFIX_TABLE (PREFIX_0F38F6) },
7215     { Bad_Opcode },
7216     /* f8 */
7217     { PREFIX_TABLE (PREFIX_0F38F8) },
7218     { PREFIX_TABLE (PREFIX_0F38F9) },
7219     { Bad_Opcode },
7220     { Bad_Opcode },
7221     { Bad_Opcode },
7222     { Bad_Opcode },
7223     { Bad_Opcode },
7224     { Bad_Opcode },
7225   },
7226   /* THREE_BYTE_0F3A */
7227   {
7228     /* 00 */
7229     { Bad_Opcode },
7230     { Bad_Opcode },
7231     { Bad_Opcode },
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     { Bad_Opcode },
7235     { Bad_Opcode },
7236     { Bad_Opcode },
7237     /* 08 */
7238     { PREFIX_TABLE (PREFIX_0F3A08) },
7239     { PREFIX_TABLE (PREFIX_0F3A09) },
7240     { PREFIX_TABLE (PREFIX_0F3A0A) },
7241     { PREFIX_TABLE (PREFIX_0F3A0B) },
7242     { PREFIX_TABLE (PREFIX_0F3A0C) },
7243     { PREFIX_TABLE (PREFIX_0F3A0D) },
7244     { PREFIX_TABLE (PREFIX_0F3A0E) },
7245     { "palignr",        { MX, EM, Ib }, PREFIX_OPCODE },
7246     /* 10 */
7247     { Bad_Opcode },
7248     { Bad_Opcode },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     { PREFIX_TABLE (PREFIX_0F3A14) },
7252     { PREFIX_TABLE (PREFIX_0F3A15) },
7253     { PREFIX_TABLE (PREFIX_0F3A16) },
7254     { PREFIX_TABLE (PREFIX_0F3A17) },
7255     /* 18 */
7256     { Bad_Opcode },
7257     { Bad_Opcode },
7258     { Bad_Opcode },
7259     { Bad_Opcode },
7260     { Bad_Opcode },
7261     { Bad_Opcode },
7262     { Bad_Opcode },
7263     { Bad_Opcode },
7264     /* 20 */
7265     { PREFIX_TABLE (PREFIX_0F3A20) },
7266     { PREFIX_TABLE (PREFIX_0F3A21) },
7267     { PREFIX_TABLE (PREFIX_0F3A22) },
7268     { Bad_Opcode },
7269     { Bad_Opcode },
7270     { Bad_Opcode },
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     /* 28 */
7274     { Bad_Opcode },
7275     { Bad_Opcode },
7276     { Bad_Opcode },
7277     { Bad_Opcode },
7278     { Bad_Opcode },
7279     { Bad_Opcode },
7280     { Bad_Opcode },
7281     { Bad_Opcode },
7282     /* 30 */
7283     { Bad_Opcode },
7284     { Bad_Opcode },
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     { Bad_Opcode },
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     /* 38 */
7292     { Bad_Opcode },
7293     { Bad_Opcode },
7294     { Bad_Opcode },
7295     { Bad_Opcode },
7296     { Bad_Opcode },
7297     { Bad_Opcode },
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     /* 40 */
7301     { PREFIX_TABLE (PREFIX_0F3A40) },
7302     { PREFIX_TABLE (PREFIX_0F3A41) },
7303     { PREFIX_TABLE (PREFIX_0F3A42) },
7304     { Bad_Opcode },
7305     { PREFIX_TABLE (PREFIX_0F3A44) },
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     /* 48 */
7310     { Bad_Opcode },
7311     { Bad_Opcode },
7312     { Bad_Opcode },
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     /* 50 */
7319     { Bad_Opcode },
7320     { Bad_Opcode },
7321     { Bad_Opcode },
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     /* 58 */
7328     { Bad_Opcode },
7329     { Bad_Opcode },
7330     { Bad_Opcode },
7331     { Bad_Opcode },
7332     { Bad_Opcode },
7333     { Bad_Opcode },
7334     { Bad_Opcode },
7335     { Bad_Opcode },
7336     /* 60 */
7337     { PREFIX_TABLE (PREFIX_0F3A60) },
7338     { PREFIX_TABLE (PREFIX_0F3A61) },
7339     { PREFIX_TABLE (PREFIX_0F3A62) },
7340     { PREFIX_TABLE (PREFIX_0F3A63) },
7341     { Bad_Opcode },
7342     { Bad_Opcode },
7343     { Bad_Opcode },
7344     { Bad_Opcode },
7345     /* 68 */
7346     { Bad_Opcode },
7347     { Bad_Opcode },
7348     { Bad_Opcode },
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     /* 70 */
7355     { Bad_Opcode },
7356     { Bad_Opcode },
7357     { Bad_Opcode },
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     /* 78 */
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     { Bad_Opcode },
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     /* 80 */
7373     { Bad_Opcode },
7374     { Bad_Opcode },
7375     { Bad_Opcode },
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     { Bad_Opcode },
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     /* 88 */
7382     { Bad_Opcode },
7383     { Bad_Opcode },
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     /* 90 */
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     /* 98 */
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     { Bad_Opcode },
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     /* a0 */
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     { Bad_Opcode },
7412     { Bad_Opcode },
7413     { Bad_Opcode },
7414     { Bad_Opcode },
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     /* a8 */
7418     { Bad_Opcode },
7419     { Bad_Opcode },
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     /* b0 */
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434     { Bad_Opcode },
7435     /* b8 */
7436     { Bad_Opcode },
7437     { Bad_Opcode },
7438     { Bad_Opcode },
7439     { Bad_Opcode },
7440     { Bad_Opcode },
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     /* c0 */
7445     { Bad_Opcode },
7446     { Bad_Opcode },
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     /* c8 */
7454     { Bad_Opcode },
7455     { Bad_Opcode },
7456     { Bad_Opcode },
7457     { Bad_Opcode },
7458     { PREFIX_TABLE (PREFIX_0F3ACC) },
7459     { Bad_Opcode },
7460     { PREFIX_TABLE (PREFIX_0F3ACE) },
7461     { PREFIX_TABLE (PREFIX_0F3ACF) },
7462     /* d0 */
7463     { Bad_Opcode },
7464     { Bad_Opcode },
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471     /* d8 */
7472     { Bad_Opcode },
7473     { Bad_Opcode },
7474     { Bad_Opcode },
7475     { Bad_Opcode },
7476     { Bad_Opcode },
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { PREFIX_TABLE (PREFIX_0F3ADF) },
7480     /* e0 */
7481     { Bad_Opcode },
7482     { Bad_Opcode },
7483     { Bad_Opcode },
7484     { Bad_Opcode },
7485     { Bad_Opcode },
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { Bad_Opcode },
7489     /* e8 */
7490     { Bad_Opcode },
7491     { Bad_Opcode },
7492     { Bad_Opcode },
7493     { Bad_Opcode },
7494     { Bad_Opcode },
7495     { Bad_Opcode },
7496     { Bad_Opcode },
7497     { Bad_Opcode },
7498     /* f0 */
7499     { Bad_Opcode },
7500     { Bad_Opcode },
7501     { Bad_Opcode },
7502     { Bad_Opcode },
7503     { Bad_Opcode },
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     /* f8 */
7508     { Bad_Opcode },
7509     { Bad_Opcode },
7510     { Bad_Opcode },
7511     { Bad_Opcode },
7512     { Bad_Opcode },
7513     { Bad_Opcode },
7514     { Bad_Opcode },
7515     { Bad_Opcode },
7516   },
7517 };
7518
7519 static const struct dis386 xop_table[][256] = {
7520   /* XOP_08 */
7521   {
7522     /* 00 */
7523     { Bad_Opcode },
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     { Bad_Opcode },
7529     { Bad_Opcode },
7530     { Bad_Opcode },
7531     /* 08 */
7532     { Bad_Opcode },
7533     { Bad_Opcode },
7534     { Bad_Opcode },
7535     { Bad_Opcode },
7536     { Bad_Opcode },
7537     { Bad_Opcode },
7538     { Bad_Opcode },
7539     { Bad_Opcode },
7540     /* 10 */
7541     { Bad_Opcode },
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     { Bad_Opcode },
7545     { Bad_Opcode },
7546     { Bad_Opcode },
7547     { Bad_Opcode },
7548     { Bad_Opcode },
7549     /* 18 */
7550     { Bad_Opcode },
7551     { Bad_Opcode },
7552     { Bad_Opcode },
7553     { Bad_Opcode },
7554     { Bad_Opcode },
7555     { Bad_Opcode },
7556     { Bad_Opcode },
7557     { Bad_Opcode },
7558     /* 20 */
7559     { Bad_Opcode },
7560     { Bad_Opcode },
7561     { Bad_Opcode },
7562     { Bad_Opcode },
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     { Bad_Opcode },
7567     /* 28 */
7568     { Bad_Opcode },
7569     { Bad_Opcode },
7570     { Bad_Opcode },
7571     { Bad_Opcode },
7572     { Bad_Opcode },
7573     { Bad_Opcode },
7574     { Bad_Opcode },
7575     { Bad_Opcode },
7576     /* 30 */
7577     { Bad_Opcode },
7578     { Bad_Opcode },
7579     { Bad_Opcode },
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     { Bad_Opcode },
7585     /* 38 */
7586     { Bad_Opcode },
7587     { Bad_Opcode },
7588     { Bad_Opcode },
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     { Bad_Opcode },
7594     /* 40 */
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     { Bad_Opcode },
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     { Bad_Opcode },
7603     /* 48 */
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     { Bad_Opcode },
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     { Bad_Opcode },
7612     /* 50 */
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     { Bad_Opcode },
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     { Bad_Opcode },
7621     /* 58 */
7622     { Bad_Opcode },
7623     { Bad_Opcode },
7624     { Bad_Opcode },
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     { Bad_Opcode },
7630     /* 60 */
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     { Bad_Opcode },
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     { Bad_Opcode },
7639     /* 68 */
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     { Bad_Opcode },
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     { Bad_Opcode },
7648     /* 70 */
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     { Bad_Opcode },
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     { Bad_Opcode },
7657     /* 78 */
7658     { Bad_Opcode },
7659     { Bad_Opcode },
7660     { Bad_Opcode },
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     { Bad_Opcode },
7666     /* 80 */
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     { Bad_Opcode },
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7673     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7674     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7675     /* 88 */
7676     { Bad_Opcode },
7677     { Bad_Opcode },
7678     { Bad_Opcode },
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7683     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7684     /* 90 */
7685     { Bad_Opcode },
7686     { Bad_Opcode },
7687     { Bad_Opcode },
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7691     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7692     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7693     /* 98 */
7694     { Bad_Opcode },
7695     { Bad_Opcode },
7696     { Bad_Opcode },
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7701     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7702     /* a0 */
7703     { Bad_Opcode },
7704     { Bad_Opcode },
7705     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7706     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7710     { Bad_Opcode },
7711     /* a8 */
7712     { Bad_Opcode },
7713     { Bad_Opcode },
7714     { Bad_Opcode },
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     { Bad_Opcode },
7720     /* b0 */
7721     { Bad_Opcode },
7722     { Bad_Opcode },
7723     { Bad_Opcode },
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7728     { Bad_Opcode },
7729     /* b8 */
7730     { Bad_Opcode },
7731     { Bad_Opcode },
7732     { Bad_Opcode },
7733     { Bad_Opcode },
7734     { Bad_Opcode },
7735     { Bad_Opcode },
7736     { Bad_Opcode },
7737     { Bad_Opcode },
7738     /* c0 */
7739     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7740     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7741     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7742     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     { Bad_Opcode },
7746     { Bad_Opcode },
7747     /* c8 */
7748     { Bad_Opcode },
7749     { Bad_Opcode },
7750     { Bad_Opcode },
7751     { Bad_Opcode },
7752     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7753     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7754     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7755     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7756     /* d0 */
7757     { Bad_Opcode },
7758     { Bad_Opcode },
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764     { Bad_Opcode },
7765     /* d8 */
7766     { Bad_Opcode },
7767     { Bad_Opcode },
7768     { Bad_Opcode },
7769     { Bad_Opcode },
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     /* e0 */
7775     { Bad_Opcode },
7776     { Bad_Opcode },
7777     { Bad_Opcode },
7778     { Bad_Opcode },
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     /* e8 */
7784     { Bad_Opcode },
7785     { Bad_Opcode },
7786     { Bad_Opcode },
7787     { Bad_Opcode },
7788     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7789     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7790     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7791     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7792     /* f0 */
7793     { Bad_Opcode },
7794     { Bad_Opcode },
7795     { Bad_Opcode },
7796     { Bad_Opcode },
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     /* f8 */
7802     { Bad_Opcode },
7803     { Bad_Opcode },
7804     { Bad_Opcode },
7805     { Bad_Opcode },
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810   },
7811   /* XOP_09 */
7812   {
7813     /* 00 */
7814     { Bad_Opcode },
7815     { REG_TABLE (REG_XOP_TBM_01) },
7816     { REG_TABLE (REG_XOP_TBM_02) },
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     { Bad_Opcode },
7821     { Bad_Opcode },
7822     /* 08 */
7823     { Bad_Opcode },
7824     { Bad_Opcode },
7825     { Bad_Opcode },
7826     { Bad_Opcode },
7827     { Bad_Opcode },
7828     { Bad_Opcode },
7829     { Bad_Opcode },
7830     { Bad_Opcode },
7831     /* 10 */
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     { REG_TABLE (REG_XOP_LWPCB) },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     { Bad_Opcode },
7839     { Bad_Opcode },
7840     /* 18 */
7841     { Bad_Opcode },
7842     { Bad_Opcode },
7843     { Bad_Opcode },
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     { Bad_Opcode },
7848     { Bad_Opcode },
7849     /* 20 */
7850     { Bad_Opcode },
7851     { Bad_Opcode },
7852     { Bad_Opcode },
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     /* 28 */
7859     { Bad_Opcode },
7860     { Bad_Opcode },
7861     { Bad_Opcode },
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     { Bad_Opcode },
7865     { Bad_Opcode },
7866     { Bad_Opcode },
7867     /* 30 */
7868     { Bad_Opcode },
7869     { Bad_Opcode },
7870     { Bad_Opcode },
7871     { Bad_Opcode },
7872     { Bad_Opcode },
7873     { Bad_Opcode },
7874     { Bad_Opcode },
7875     { Bad_Opcode },
7876     /* 38 */
7877     { Bad_Opcode },
7878     { Bad_Opcode },
7879     { Bad_Opcode },
7880     { Bad_Opcode },
7881     { Bad_Opcode },
7882     { Bad_Opcode },
7883     { Bad_Opcode },
7884     { Bad_Opcode },
7885     /* 40 */
7886     { Bad_Opcode },
7887     { Bad_Opcode },
7888     { Bad_Opcode },
7889     { Bad_Opcode },
7890     { Bad_Opcode },
7891     { Bad_Opcode },
7892     { Bad_Opcode },
7893     { Bad_Opcode },
7894     /* 48 */
7895     { Bad_Opcode },
7896     { Bad_Opcode },
7897     { Bad_Opcode },
7898     { Bad_Opcode },
7899     { Bad_Opcode },
7900     { Bad_Opcode },
7901     { Bad_Opcode },
7902     { Bad_Opcode },
7903     /* 50 */
7904     { Bad_Opcode },
7905     { Bad_Opcode },
7906     { Bad_Opcode },
7907     { Bad_Opcode },
7908     { Bad_Opcode },
7909     { Bad_Opcode },
7910     { Bad_Opcode },
7911     { Bad_Opcode },
7912     /* 58 */
7913     { Bad_Opcode },
7914     { Bad_Opcode },
7915     { Bad_Opcode },
7916     { Bad_Opcode },
7917     { Bad_Opcode },
7918     { Bad_Opcode },
7919     { Bad_Opcode },
7920     { Bad_Opcode },
7921     /* 60 */
7922     { Bad_Opcode },
7923     { Bad_Opcode },
7924     { Bad_Opcode },
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     { Bad_Opcode },
7930     /* 68 */
7931     { Bad_Opcode },
7932     { Bad_Opcode },
7933     { Bad_Opcode },
7934     { Bad_Opcode },
7935     { Bad_Opcode },
7936     { Bad_Opcode },
7937     { Bad_Opcode },
7938     { Bad_Opcode },
7939     /* 70 */
7940     { Bad_Opcode },
7941     { Bad_Opcode },
7942     { Bad_Opcode },
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     { Bad_Opcode },
7948     /* 78 */
7949     { Bad_Opcode },
7950     { Bad_Opcode },
7951     { Bad_Opcode },
7952     { Bad_Opcode },
7953     { Bad_Opcode },
7954     { Bad_Opcode },
7955     { Bad_Opcode },
7956     { Bad_Opcode },
7957     /* 80 */
7958     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7959     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7960     { "vfrczss",        { XM, EXd }, 0 },
7961     { "vfrczsd",        { XM, EXq }, 0 },
7962     { Bad_Opcode },
7963     { Bad_Opcode },
7964     { Bad_Opcode },
7965     { Bad_Opcode },
7966     /* 88 */
7967     { Bad_Opcode },
7968     { Bad_Opcode },
7969     { Bad_Opcode },
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { Bad_Opcode },
7973     { Bad_Opcode },
7974     { Bad_Opcode },
7975     /* 90 */
7976     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7977     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7978     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7979     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7980     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7981     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7982     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7983     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7984     /* 98 */
7985     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7986     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7987     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7988     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
7989     { Bad_Opcode },
7990     { Bad_Opcode },
7991     { Bad_Opcode },
7992     { Bad_Opcode },
7993     /* a0 */
7994     { Bad_Opcode },
7995     { Bad_Opcode },
7996     { Bad_Opcode },
7997     { Bad_Opcode },
7998     { Bad_Opcode },
7999     { Bad_Opcode },
8000     { Bad_Opcode },
8001     { Bad_Opcode },
8002     /* a8 */
8003     { Bad_Opcode },
8004     { Bad_Opcode },
8005     { Bad_Opcode },
8006     { Bad_Opcode },
8007     { Bad_Opcode },
8008     { Bad_Opcode },
8009     { Bad_Opcode },
8010     { Bad_Opcode },
8011     /* b0 */
8012     { Bad_Opcode },
8013     { Bad_Opcode },
8014     { Bad_Opcode },
8015     { Bad_Opcode },
8016     { Bad_Opcode },
8017     { Bad_Opcode },
8018     { Bad_Opcode },
8019     { Bad_Opcode },
8020     /* b8 */
8021     { Bad_Opcode },
8022     { Bad_Opcode },
8023     { Bad_Opcode },
8024     { Bad_Opcode },
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     /* c0 */
8030     { Bad_Opcode },
8031     { "vphaddbw",       { XM, EXxmm }, 0 },
8032     { "vphaddbd",       { XM, EXxmm }, 0 },
8033     { "vphaddbq",       { XM, EXxmm }, 0 },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { "vphaddwd",       { XM, EXxmm }, 0 },
8037     { "vphaddwq",       { XM, EXxmm }, 0 },
8038     /* c8 */
8039     { Bad_Opcode },
8040     { Bad_Opcode },
8041     { Bad_Opcode },
8042     { "vphadddq",       { XM, EXxmm }, 0 },
8043     { Bad_Opcode },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     /* d0 */
8048     { Bad_Opcode },
8049     { "vphaddubw",      { XM, EXxmm }, 0 },
8050     { "vphaddubd",      { XM, EXxmm }, 0 },
8051     { "vphaddubq",      { XM, EXxmm }, 0 },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     { "vphadduwd",      { XM, EXxmm }, 0 },
8055     { "vphadduwq",      { XM, EXxmm }, 0 },
8056     /* d8 */
8057     { Bad_Opcode },
8058     { Bad_Opcode },
8059     { Bad_Opcode },
8060     { "vphaddudq",      { XM, EXxmm }, 0 },
8061     { Bad_Opcode },
8062     { Bad_Opcode },
8063     { Bad_Opcode },
8064     { Bad_Opcode },
8065     /* e0 */
8066     { Bad_Opcode },
8067     { "vphsubbw",       { XM, EXxmm }, 0 },
8068     { "vphsubwd",       { XM, EXxmm }, 0 },
8069     { "vphsubdq",       { XM, EXxmm }, 0 },
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     /* e8 */
8075     { Bad_Opcode },
8076     { Bad_Opcode },
8077     { Bad_Opcode },
8078     { Bad_Opcode },
8079     { Bad_Opcode },
8080     { Bad_Opcode },
8081     { Bad_Opcode },
8082     { Bad_Opcode },
8083     /* f0 */
8084     { Bad_Opcode },
8085     { Bad_Opcode },
8086     { Bad_Opcode },
8087     { Bad_Opcode },
8088     { Bad_Opcode },
8089     { Bad_Opcode },
8090     { Bad_Opcode },
8091     { Bad_Opcode },
8092     /* f8 */
8093     { Bad_Opcode },
8094     { Bad_Opcode },
8095     { Bad_Opcode },
8096     { Bad_Opcode },
8097     { Bad_Opcode },
8098     { Bad_Opcode },
8099     { Bad_Opcode },
8100     { Bad_Opcode },
8101   },
8102   /* XOP_0A */
8103   {
8104     /* 00 */
8105     { Bad_Opcode },
8106     { Bad_Opcode },
8107     { Bad_Opcode },
8108     { Bad_Opcode },
8109     { Bad_Opcode },
8110     { Bad_Opcode },
8111     { Bad_Opcode },
8112     { Bad_Opcode },
8113     /* 08 */
8114     { Bad_Opcode },
8115     { Bad_Opcode },
8116     { Bad_Opcode },
8117     { Bad_Opcode },
8118     { Bad_Opcode },
8119     { Bad_Opcode },
8120     { Bad_Opcode },
8121     { Bad_Opcode },
8122     /* 10 */
8123     { "bextr",  { Gv, Ev, Iq }, 0 },
8124     { Bad_Opcode },
8125     { REG_TABLE (REG_XOP_LWP) },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     { Bad_Opcode },
8130     { Bad_Opcode },
8131     /* 18 */
8132     { Bad_Opcode },
8133     { Bad_Opcode },
8134     { Bad_Opcode },
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     { Bad_Opcode },
8139     { Bad_Opcode },
8140     /* 20 */
8141     { Bad_Opcode },
8142     { Bad_Opcode },
8143     { Bad_Opcode },
8144     { Bad_Opcode },
8145     { Bad_Opcode },
8146     { Bad_Opcode },
8147     { Bad_Opcode },
8148     { Bad_Opcode },
8149     /* 28 */
8150     { Bad_Opcode },
8151     { Bad_Opcode },
8152     { Bad_Opcode },
8153     { Bad_Opcode },
8154     { Bad_Opcode },
8155     { Bad_Opcode },
8156     { Bad_Opcode },
8157     { Bad_Opcode },
8158     /* 30 */
8159     { Bad_Opcode },
8160     { Bad_Opcode },
8161     { Bad_Opcode },
8162     { Bad_Opcode },
8163     { Bad_Opcode },
8164     { Bad_Opcode },
8165     { Bad_Opcode },
8166     { Bad_Opcode },
8167     /* 38 */
8168     { Bad_Opcode },
8169     { Bad_Opcode },
8170     { Bad_Opcode },
8171     { Bad_Opcode },
8172     { Bad_Opcode },
8173     { Bad_Opcode },
8174     { Bad_Opcode },
8175     { Bad_Opcode },
8176     /* 40 */
8177     { Bad_Opcode },
8178     { Bad_Opcode },
8179     { Bad_Opcode },
8180     { Bad_Opcode },
8181     { Bad_Opcode },
8182     { Bad_Opcode },
8183     { Bad_Opcode },
8184     { Bad_Opcode },
8185     /* 48 */
8186     { Bad_Opcode },
8187     { Bad_Opcode },
8188     { Bad_Opcode },
8189     { Bad_Opcode },
8190     { Bad_Opcode },
8191     { Bad_Opcode },
8192     { Bad_Opcode },
8193     { Bad_Opcode },
8194     /* 50 */
8195     { Bad_Opcode },
8196     { Bad_Opcode },
8197     { Bad_Opcode },
8198     { Bad_Opcode },
8199     { Bad_Opcode },
8200     { Bad_Opcode },
8201     { Bad_Opcode },
8202     { Bad_Opcode },
8203     /* 58 */
8204     { Bad_Opcode },
8205     { Bad_Opcode },
8206     { Bad_Opcode },
8207     { Bad_Opcode },
8208     { Bad_Opcode },
8209     { Bad_Opcode },
8210     { Bad_Opcode },
8211     { Bad_Opcode },
8212     /* 60 */
8213     { Bad_Opcode },
8214     { Bad_Opcode },
8215     { Bad_Opcode },
8216     { Bad_Opcode },
8217     { Bad_Opcode },
8218     { Bad_Opcode },
8219     { Bad_Opcode },
8220     { Bad_Opcode },
8221     /* 68 */
8222     { Bad_Opcode },
8223     { Bad_Opcode },
8224     { Bad_Opcode },
8225     { Bad_Opcode },
8226     { Bad_Opcode },
8227     { Bad_Opcode },
8228     { Bad_Opcode },
8229     { Bad_Opcode },
8230     /* 70 */
8231     { Bad_Opcode },
8232     { Bad_Opcode },
8233     { Bad_Opcode },
8234     { Bad_Opcode },
8235     { Bad_Opcode },
8236     { Bad_Opcode },
8237     { Bad_Opcode },
8238     { Bad_Opcode },
8239     /* 78 */
8240     { Bad_Opcode },
8241     { Bad_Opcode },
8242     { Bad_Opcode },
8243     { Bad_Opcode },
8244     { Bad_Opcode },
8245     { Bad_Opcode },
8246     { Bad_Opcode },
8247     { Bad_Opcode },
8248     /* 80 */
8249     { Bad_Opcode },
8250     { Bad_Opcode },
8251     { Bad_Opcode },
8252     { Bad_Opcode },
8253     { Bad_Opcode },
8254     { Bad_Opcode },
8255     { Bad_Opcode },
8256     { Bad_Opcode },
8257     /* 88 */
8258     { Bad_Opcode },
8259     { Bad_Opcode },
8260     { Bad_Opcode },
8261     { Bad_Opcode },
8262     { Bad_Opcode },
8263     { Bad_Opcode },
8264     { Bad_Opcode },
8265     { Bad_Opcode },
8266     /* 90 */
8267     { Bad_Opcode },
8268     { Bad_Opcode },
8269     { Bad_Opcode },
8270     { Bad_Opcode },
8271     { Bad_Opcode },
8272     { Bad_Opcode },
8273     { Bad_Opcode },
8274     { Bad_Opcode },
8275     /* 98 */
8276     { Bad_Opcode },
8277     { Bad_Opcode },
8278     { Bad_Opcode },
8279     { Bad_Opcode },
8280     { Bad_Opcode },
8281     { Bad_Opcode },
8282     { Bad_Opcode },
8283     { Bad_Opcode },
8284     /* a0 */
8285     { Bad_Opcode },
8286     { Bad_Opcode },
8287     { Bad_Opcode },
8288     { Bad_Opcode },
8289     { Bad_Opcode },
8290     { Bad_Opcode },
8291     { Bad_Opcode },
8292     { Bad_Opcode },
8293     /* a8 */
8294     { Bad_Opcode },
8295     { Bad_Opcode },
8296     { Bad_Opcode },
8297     { Bad_Opcode },
8298     { Bad_Opcode },
8299     { Bad_Opcode },
8300     { Bad_Opcode },
8301     { Bad_Opcode },
8302     /* b0 */
8303     { Bad_Opcode },
8304     { Bad_Opcode },
8305     { Bad_Opcode },
8306     { Bad_Opcode },
8307     { Bad_Opcode },
8308     { Bad_Opcode },
8309     { Bad_Opcode },
8310     { Bad_Opcode },
8311     /* b8 */
8312     { Bad_Opcode },
8313     { Bad_Opcode },
8314     { Bad_Opcode },
8315     { Bad_Opcode },
8316     { Bad_Opcode },
8317     { Bad_Opcode },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     /* c0 */
8321     { Bad_Opcode },
8322     { Bad_Opcode },
8323     { Bad_Opcode },
8324     { Bad_Opcode },
8325     { Bad_Opcode },
8326     { Bad_Opcode },
8327     { Bad_Opcode },
8328     { Bad_Opcode },
8329     /* c8 */
8330     { Bad_Opcode },
8331     { Bad_Opcode },
8332     { Bad_Opcode },
8333     { Bad_Opcode },
8334     { Bad_Opcode },
8335     { Bad_Opcode },
8336     { Bad_Opcode },
8337     { Bad_Opcode },
8338     /* d0 */
8339     { Bad_Opcode },
8340     { Bad_Opcode },
8341     { Bad_Opcode },
8342     { Bad_Opcode },
8343     { Bad_Opcode },
8344     { Bad_Opcode },
8345     { Bad_Opcode },
8346     { Bad_Opcode },
8347     /* d8 */
8348     { Bad_Opcode },
8349     { Bad_Opcode },
8350     { Bad_Opcode },
8351     { Bad_Opcode },
8352     { Bad_Opcode },
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     /* e0 */
8357     { Bad_Opcode },
8358     { Bad_Opcode },
8359     { Bad_Opcode },
8360     { Bad_Opcode },
8361     { Bad_Opcode },
8362     { Bad_Opcode },
8363     { Bad_Opcode },
8364     { Bad_Opcode },
8365     /* e8 */
8366     { Bad_Opcode },
8367     { Bad_Opcode },
8368     { Bad_Opcode },
8369     { Bad_Opcode },
8370     { Bad_Opcode },
8371     { Bad_Opcode },
8372     { Bad_Opcode },
8373     { Bad_Opcode },
8374     /* f0 */
8375     { Bad_Opcode },
8376     { Bad_Opcode },
8377     { Bad_Opcode },
8378     { Bad_Opcode },
8379     { Bad_Opcode },
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     /* f8 */
8384     { Bad_Opcode },
8385     { Bad_Opcode },
8386     { Bad_Opcode },
8387     { Bad_Opcode },
8388     { Bad_Opcode },
8389     { Bad_Opcode },
8390     { Bad_Opcode },
8391     { Bad_Opcode },
8392   },
8393 };
8394
8395 static const struct dis386 vex_table[][256] = {
8396   /* VEX_0F */
8397   {
8398     /* 00 */
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     { Bad_Opcode },
8402     { Bad_Opcode },
8403     { Bad_Opcode },
8404     { Bad_Opcode },
8405     { Bad_Opcode },
8406     { Bad_Opcode },
8407     /* 08 */
8408     { Bad_Opcode },
8409     { Bad_Opcode },
8410     { Bad_Opcode },
8411     { Bad_Opcode },
8412     { Bad_Opcode },
8413     { Bad_Opcode },
8414     { Bad_Opcode },
8415     { Bad_Opcode },
8416     /* 10 */
8417     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8418     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8419     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8420     { MOD_TABLE (MOD_VEX_0F13) },
8421     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
8422     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
8423     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8424     { MOD_TABLE (MOD_VEX_0F17) },
8425     /* 18 */
8426     { Bad_Opcode },
8427     { Bad_Opcode },
8428     { Bad_Opcode },
8429     { Bad_Opcode },
8430     { Bad_Opcode },
8431     { Bad_Opcode },
8432     { Bad_Opcode },
8433     { Bad_Opcode },
8434     /* 20 */
8435     { Bad_Opcode },
8436     { Bad_Opcode },
8437     { Bad_Opcode },
8438     { Bad_Opcode },
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     { Bad_Opcode },
8442     { Bad_Opcode },
8443     /* 28 */
8444     { "vmovapX",        { XM, EXx }, 0 },
8445     { "vmovapX",        { EXxS, XM }, 0 },
8446     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8447     { MOD_TABLE (MOD_VEX_0F2B) },
8448     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8449     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8450     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8451     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8452     /* 30 */
8453     { Bad_Opcode },
8454     { Bad_Opcode },
8455     { Bad_Opcode },
8456     { Bad_Opcode },
8457     { Bad_Opcode },
8458     { Bad_Opcode },
8459     { Bad_Opcode },
8460     { Bad_Opcode },
8461     /* 38 */
8462     { Bad_Opcode },
8463     { Bad_Opcode },
8464     { Bad_Opcode },
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     { Bad_Opcode },
8470     /* 40 */
8471     { Bad_Opcode },
8472     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8473     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8474     { Bad_Opcode },
8475     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8476     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8477     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8478     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8479     /* 48 */
8480     { Bad_Opcode },
8481     { Bad_Opcode },
8482     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8483     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     { Bad_Opcode },
8487     { Bad_Opcode },
8488     /* 50 */
8489     { MOD_TABLE (MOD_VEX_0F50) },
8490     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8491     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8492     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8493     { "vandpX",         { XM, Vex, EXx }, 0 },
8494     { "vandnpX",        { XM, Vex, EXx }, 0 },
8495     { "vorpX",          { XM, Vex, EXx }, 0 },
8496     { "vxorpX",         { XM, Vex, EXx }, 0 },
8497     /* 58 */
8498     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8499     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8500     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8501     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8502     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8503     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8504     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8505     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8506     /* 60 */
8507     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8508     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8509     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8510     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8511     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8512     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8513     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8514     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8515     /* 68 */
8516     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8517     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8518     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8519     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8520     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8521     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8522     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8523     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8524     /* 70 */
8525     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8526     { REG_TABLE (REG_VEX_0F71) },
8527     { REG_TABLE (REG_VEX_0F72) },
8528     { REG_TABLE (REG_VEX_0F73) },
8529     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8530     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8531     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8532     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8533     /* 78 */
8534     { Bad_Opcode },
8535     { Bad_Opcode },
8536     { Bad_Opcode },
8537     { Bad_Opcode },
8538     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8539     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8540     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8541     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8542     /* 80 */
8543     { Bad_Opcode },
8544     { Bad_Opcode },
8545     { Bad_Opcode },
8546     { Bad_Opcode },
8547     { Bad_Opcode },
8548     { Bad_Opcode },
8549     { Bad_Opcode },
8550     { Bad_Opcode },
8551     /* 88 */
8552     { Bad_Opcode },
8553     { Bad_Opcode },
8554     { Bad_Opcode },
8555     { Bad_Opcode },
8556     { Bad_Opcode },
8557     { Bad_Opcode },
8558     { Bad_Opcode },
8559     { Bad_Opcode },
8560     /* 90 */
8561     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8562     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8563     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8564     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8565     { Bad_Opcode },
8566     { Bad_Opcode },
8567     { Bad_Opcode },
8568     { Bad_Opcode },
8569     /* 98 */
8570     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8571     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8572     { Bad_Opcode },
8573     { Bad_Opcode },
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     { Bad_Opcode },
8577     { Bad_Opcode },
8578     /* a0 */
8579     { Bad_Opcode },
8580     { Bad_Opcode },
8581     { Bad_Opcode },
8582     { Bad_Opcode },
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     { Bad_Opcode },
8586     { Bad_Opcode },
8587     /* a8 */
8588     { Bad_Opcode },
8589     { Bad_Opcode },
8590     { Bad_Opcode },
8591     { Bad_Opcode },
8592     { Bad_Opcode },
8593     { Bad_Opcode },
8594     { REG_TABLE (REG_VEX_0FAE) },
8595     { Bad_Opcode },
8596     /* b0 */
8597     { Bad_Opcode },
8598     { Bad_Opcode },
8599     { Bad_Opcode },
8600     { Bad_Opcode },
8601     { Bad_Opcode },
8602     { Bad_Opcode },
8603     { Bad_Opcode },
8604     { Bad_Opcode },
8605     /* b8 */
8606     { Bad_Opcode },
8607     { Bad_Opcode },
8608     { Bad_Opcode },
8609     { Bad_Opcode },
8610     { Bad_Opcode },
8611     { Bad_Opcode },
8612     { Bad_Opcode },
8613     { Bad_Opcode },
8614     /* c0 */
8615     { Bad_Opcode },
8616     { Bad_Opcode },
8617     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8618     { Bad_Opcode },
8619     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8620     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8621     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8622     { Bad_Opcode },
8623     /* c8 */
8624     { Bad_Opcode },
8625     { Bad_Opcode },
8626     { Bad_Opcode },
8627     { Bad_Opcode },
8628     { Bad_Opcode },
8629     { Bad_Opcode },
8630     { Bad_Opcode },
8631     { Bad_Opcode },
8632     /* d0 */
8633     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8634     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8635     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8636     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8637     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8638     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8639     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8640     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8641     /* d8 */
8642     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8643     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8644     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8645     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8646     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8647     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8648     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8649     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8650     /* e0 */
8651     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8652     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8653     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8654     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8655     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8656     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8657     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8658     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8659     /* e8 */
8660     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8661     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8662     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8663     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8664     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8665     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8666     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8667     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8668     /* f0 */
8669     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8670     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8671     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8672     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8673     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8674     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8675     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8676     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8677     /* f8 */
8678     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8679     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8680     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8681     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8682     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8683     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8684     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8685     { Bad_Opcode },
8686   },
8687   /* VEX_0F38 */
8688   {
8689     /* 00 */
8690     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8691     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8692     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8693     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8694     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8695     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8696     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8697     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8698     /* 08 */
8699     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8700     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8701     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8702     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8703     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8704     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8705     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8706     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8707     /* 10 */
8708     { Bad_Opcode },
8709     { Bad_Opcode },
8710     { Bad_Opcode },
8711     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8712     { Bad_Opcode },
8713     { Bad_Opcode },
8714     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8715     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8716     /* 18 */
8717     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8718     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8719     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8720     { Bad_Opcode },
8721     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8722     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8723     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8724     { Bad_Opcode },
8725     /* 20 */
8726     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8727     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8728     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8729     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8730     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8731     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8732     { Bad_Opcode },
8733     { Bad_Opcode },
8734     /* 28 */
8735     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8736     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8737     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8738     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8739     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8740     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8741     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8742     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8743     /* 30 */
8744     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8745     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8746     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8747     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8748     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8749     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8750     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8751     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8752     /* 38 */
8753     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8754     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8755     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8756     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8757     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8758     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8759     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8760     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8761     /* 40 */
8762     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8763     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8764     { Bad_Opcode },
8765     { Bad_Opcode },
8766     { Bad_Opcode },
8767     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8768     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8769     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8770     /* 48 */
8771     { Bad_Opcode },
8772     { Bad_Opcode },
8773     { Bad_Opcode },
8774     { Bad_Opcode },
8775     { Bad_Opcode },
8776     { Bad_Opcode },
8777     { Bad_Opcode },
8778     { Bad_Opcode },
8779     /* 50 */
8780     { Bad_Opcode },
8781     { Bad_Opcode },
8782     { Bad_Opcode },
8783     { Bad_Opcode },
8784     { Bad_Opcode },
8785     { Bad_Opcode },
8786     { Bad_Opcode },
8787     { Bad_Opcode },
8788     /* 58 */
8789     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8790     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8791     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8792     { Bad_Opcode },
8793     { Bad_Opcode },
8794     { Bad_Opcode },
8795     { Bad_Opcode },
8796     { Bad_Opcode },
8797     /* 60 */
8798     { Bad_Opcode },
8799     { Bad_Opcode },
8800     { Bad_Opcode },
8801     { Bad_Opcode },
8802     { Bad_Opcode },
8803     { Bad_Opcode },
8804     { Bad_Opcode },
8805     { Bad_Opcode },
8806     /* 68 */
8807     { Bad_Opcode },
8808     { Bad_Opcode },
8809     { Bad_Opcode },
8810     { Bad_Opcode },
8811     { Bad_Opcode },
8812     { Bad_Opcode },
8813     { Bad_Opcode },
8814     { Bad_Opcode },
8815     /* 70 */
8816     { Bad_Opcode },
8817     { Bad_Opcode },
8818     { Bad_Opcode },
8819     { Bad_Opcode },
8820     { Bad_Opcode },
8821     { Bad_Opcode },
8822     { Bad_Opcode },
8823     { Bad_Opcode },
8824     /* 78 */
8825     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8826     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8827     { Bad_Opcode },
8828     { Bad_Opcode },
8829     { Bad_Opcode },
8830     { Bad_Opcode },
8831     { Bad_Opcode },
8832     { Bad_Opcode },
8833     /* 80 */
8834     { Bad_Opcode },
8835     { Bad_Opcode },
8836     { Bad_Opcode },
8837     { Bad_Opcode },
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     { Bad_Opcode },
8841     { Bad_Opcode },
8842     /* 88 */
8843     { Bad_Opcode },
8844     { Bad_Opcode },
8845     { Bad_Opcode },
8846     { Bad_Opcode },
8847     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8848     { Bad_Opcode },
8849     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8850     { Bad_Opcode },
8851     /* 90 */
8852     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8853     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8854     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8855     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8856     { Bad_Opcode },
8857     { Bad_Opcode },
8858     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8859     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8860     /* 98 */
8861     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8862     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8863     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8864     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8865     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8866     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8867     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8868     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8869     /* a0 */
8870     { Bad_Opcode },
8871     { Bad_Opcode },
8872     { Bad_Opcode },
8873     { Bad_Opcode },
8874     { Bad_Opcode },
8875     { Bad_Opcode },
8876     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8877     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8878     /* a8 */
8879     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8880     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8881     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8882     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8883     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8884     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8885     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8886     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8887     /* b0 */
8888     { Bad_Opcode },
8889     { Bad_Opcode },
8890     { Bad_Opcode },
8891     { Bad_Opcode },
8892     { Bad_Opcode },
8893     { Bad_Opcode },
8894     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8895     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8896     /* b8 */
8897     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8898     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8899     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8900     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8901     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8902     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8903     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8904     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8905     /* c0 */
8906     { Bad_Opcode },
8907     { Bad_Opcode },
8908     { Bad_Opcode },
8909     { Bad_Opcode },
8910     { Bad_Opcode },
8911     { Bad_Opcode },
8912     { Bad_Opcode },
8913     { Bad_Opcode },
8914     /* c8 */
8915     { Bad_Opcode },
8916     { Bad_Opcode },
8917     { Bad_Opcode },
8918     { Bad_Opcode },
8919     { Bad_Opcode },
8920     { Bad_Opcode },
8921     { Bad_Opcode },
8922     { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8923     /* d0 */
8924     { Bad_Opcode },
8925     { Bad_Opcode },
8926     { Bad_Opcode },
8927     { Bad_Opcode },
8928     { Bad_Opcode },
8929     { Bad_Opcode },
8930     { Bad_Opcode },
8931     { Bad_Opcode },
8932     /* d8 */
8933     { Bad_Opcode },
8934     { Bad_Opcode },
8935     { Bad_Opcode },
8936     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8937     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8938     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8939     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8940     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8941     /* e0 */
8942     { Bad_Opcode },
8943     { Bad_Opcode },
8944     { Bad_Opcode },
8945     { Bad_Opcode },
8946     { Bad_Opcode },
8947     { Bad_Opcode },
8948     { Bad_Opcode },
8949     { Bad_Opcode },
8950     /* e8 */
8951     { Bad_Opcode },
8952     { Bad_Opcode },
8953     { Bad_Opcode },
8954     { Bad_Opcode },
8955     { Bad_Opcode },
8956     { Bad_Opcode },
8957     { Bad_Opcode },
8958     { Bad_Opcode },
8959     /* f0 */
8960     { Bad_Opcode },
8961     { Bad_Opcode },
8962     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8963     { REG_TABLE (REG_VEX_0F38F3) },
8964     { Bad_Opcode },
8965     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8966     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8967     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8968     /* f8 */
8969     { Bad_Opcode },
8970     { Bad_Opcode },
8971     { Bad_Opcode },
8972     { Bad_Opcode },
8973     { Bad_Opcode },
8974     { Bad_Opcode },
8975     { Bad_Opcode },
8976     { Bad_Opcode },
8977   },
8978   /* VEX_0F3A */
8979   {
8980     /* 00 */
8981     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
8982     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
8983     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
8984     { Bad_Opcode },
8985     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
8986     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
8987     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
8988     { Bad_Opcode },
8989     /* 08 */
8990     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
8991     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
8992     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
8993     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
8994     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
8995     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
8996     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
8997     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
8998     /* 10 */
8999     { Bad_Opcode },
9000     { Bad_Opcode },
9001     { Bad_Opcode },
9002     { Bad_Opcode },
9003     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9004     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9005     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9006     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9007     /* 18 */
9008     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9009     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9010     { Bad_Opcode },
9011     { Bad_Opcode },
9012     { Bad_Opcode },
9013     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9014     { Bad_Opcode },
9015     { Bad_Opcode },
9016     /* 20 */
9017     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9018     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9019     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9020     { Bad_Opcode },
9021     { Bad_Opcode },
9022     { Bad_Opcode },
9023     { Bad_Opcode },
9024     { Bad_Opcode },
9025     /* 28 */
9026     { Bad_Opcode },
9027     { Bad_Opcode },
9028     { Bad_Opcode },
9029     { Bad_Opcode },
9030     { Bad_Opcode },
9031     { Bad_Opcode },
9032     { Bad_Opcode },
9033     { Bad_Opcode },
9034     /* 30 */
9035     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9036     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9037     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9038     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9039     { Bad_Opcode },
9040     { Bad_Opcode },
9041     { Bad_Opcode },
9042     { Bad_Opcode },
9043     /* 38 */
9044     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9045     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9046     { Bad_Opcode },
9047     { Bad_Opcode },
9048     { Bad_Opcode },
9049     { Bad_Opcode },
9050     { Bad_Opcode },
9051     { Bad_Opcode },
9052     /* 40 */
9053     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9054     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9055     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9056     { Bad_Opcode },
9057     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9058     { Bad_Opcode },
9059     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9060     { Bad_Opcode },
9061     /* 48 */
9062     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9063     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9064     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9065     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9066     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9067     { Bad_Opcode },
9068     { Bad_Opcode },
9069     { Bad_Opcode },
9070     /* 50 */
9071     { Bad_Opcode },
9072     { Bad_Opcode },
9073     { Bad_Opcode },
9074     { Bad_Opcode },
9075     { Bad_Opcode },
9076     { Bad_Opcode },
9077     { Bad_Opcode },
9078     { Bad_Opcode },
9079     /* 58 */
9080     { Bad_Opcode },
9081     { Bad_Opcode },
9082     { Bad_Opcode },
9083     { Bad_Opcode },
9084     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9085     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9086     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9087     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9088     /* 60 */
9089     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9090     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9091     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9092     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9093     { Bad_Opcode },
9094     { Bad_Opcode },
9095     { Bad_Opcode },
9096     { Bad_Opcode },
9097     /* 68 */
9098     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9099     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9100     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9101     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9102     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9103     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9104     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9105     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9106     /* 70 */
9107     { Bad_Opcode },
9108     { Bad_Opcode },
9109     { Bad_Opcode },
9110     { Bad_Opcode },
9111     { Bad_Opcode },
9112     { Bad_Opcode },
9113     { Bad_Opcode },
9114     { Bad_Opcode },
9115     /* 78 */
9116     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9117     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9118     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9119     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9120     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9121     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9122     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9123     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9124     /* 80 */
9125     { Bad_Opcode },
9126     { Bad_Opcode },
9127     { Bad_Opcode },
9128     { Bad_Opcode },
9129     { Bad_Opcode },
9130     { Bad_Opcode },
9131     { Bad_Opcode },
9132     { Bad_Opcode },
9133     /* 88 */
9134     { Bad_Opcode },
9135     { Bad_Opcode },
9136     { Bad_Opcode },
9137     { Bad_Opcode },
9138     { Bad_Opcode },
9139     { Bad_Opcode },
9140     { Bad_Opcode },
9141     { Bad_Opcode },
9142     /* 90 */
9143     { Bad_Opcode },
9144     { Bad_Opcode },
9145     { Bad_Opcode },
9146     { Bad_Opcode },
9147     { Bad_Opcode },
9148     { Bad_Opcode },
9149     { Bad_Opcode },
9150     { Bad_Opcode },
9151     /* 98 */
9152     { Bad_Opcode },
9153     { Bad_Opcode },
9154     { Bad_Opcode },
9155     { Bad_Opcode },
9156     { Bad_Opcode },
9157     { Bad_Opcode },
9158     { Bad_Opcode },
9159     { Bad_Opcode },
9160     /* a0 */
9161     { Bad_Opcode },
9162     { Bad_Opcode },
9163     { Bad_Opcode },
9164     { Bad_Opcode },
9165     { Bad_Opcode },
9166     { Bad_Opcode },
9167     { Bad_Opcode },
9168     { Bad_Opcode },
9169     /* a8 */
9170     { Bad_Opcode },
9171     { Bad_Opcode },
9172     { Bad_Opcode },
9173     { Bad_Opcode },
9174     { Bad_Opcode },
9175     { Bad_Opcode },
9176     { Bad_Opcode },
9177     { Bad_Opcode },
9178     /* b0 */
9179     { Bad_Opcode },
9180     { Bad_Opcode },
9181     { Bad_Opcode },
9182     { Bad_Opcode },
9183     { Bad_Opcode },
9184     { Bad_Opcode },
9185     { Bad_Opcode },
9186     { Bad_Opcode },
9187     /* b8 */
9188     { Bad_Opcode },
9189     { Bad_Opcode },
9190     { Bad_Opcode },
9191     { Bad_Opcode },
9192     { Bad_Opcode },
9193     { Bad_Opcode },
9194     { Bad_Opcode },
9195     { Bad_Opcode },
9196     /* c0 */
9197     { Bad_Opcode },
9198     { Bad_Opcode },
9199     { Bad_Opcode },
9200     { Bad_Opcode },
9201     { Bad_Opcode },
9202     { Bad_Opcode },
9203     { Bad_Opcode },
9204     { Bad_Opcode },
9205     /* c8 */
9206     { Bad_Opcode },
9207     { Bad_Opcode },
9208     { Bad_Opcode },
9209     { Bad_Opcode },
9210     { Bad_Opcode },
9211     { Bad_Opcode },
9212     { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9213     { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9214     /* d0 */
9215     { Bad_Opcode },
9216     { Bad_Opcode },
9217     { Bad_Opcode },
9218     { Bad_Opcode },
9219     { Bad_Opcode },
9220     { Bad_Opcode },
9221     { Bad_Opcode },
9222     { Bad_Opcode },
9223     /* d8 */
9224     { Bad_Opcode },
9225     { Bad_Opcode },
9226     { Bad_Opcode },
9227     { Bad_Opcode },
9228     { Bad_Opcode },
9229     { Bad_Opcode },
9230     { Bad_Opcode },
9231     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9232     /* e0 */
9233     { Bad_Opcode },
9234     { Bad_Opcode },
9235     { Bad_Opcode },
9236     { Bad_Opcode },
9237     { Bad_Opcode },
9238     { Bad_Opcode },
9239     { Bad_Opcode },
9240     { Bad_Opcode },
9241     /* e8 */
9242     { Bad_Opcode },
9243     { Bad_Opcode },
9244     { Bad_Opcode },
9245     { Bad_Opcode },
9246     { Bad_Opcode },
9247     { Bad_Opcode },
9248     { Bad_Opcode },
9249     { Bad_Opcode },
9250     /* f0 */
9251     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9252     { Bad_Opcode },
9253     { Bad_Opcode },
9254     { Bad_Opcode },
9255     { Bad_Opcode },
9256     { Bad_Opcode },
9257     { Bad_Opcode },
9258     { Bad_Opcode },
9259     /* f8 */
9260     { Bad_Opcode },
9261     { Bad_Opcode },
9262     { Bad_Opcode },
9263     { Bad_Opcode },
9264     { Bad_Opcode },
9265     { Bad_Opcode },
9266     { Bad_Opcode },
9267     { Bad_Opcode },
9268   },
9269 };
9270
9271 #define NEED_OPCODE_TABLE
9272 #include "i386-dis-evex.h"
9273 #undef NEED_OPCODE_TABLE
9274 static const struct dis386 vex_len_table[][2] = {
9275   /* VEX_LEN_0F12_P_0_M_0 */
9276   {
9277     { "vmovlps",        { XM, Vex128, EXq }, 0 },
9278   },
9279
9280   /* VEX_LEN_0F12_P_0_M_1 */
9281   {
9282     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
9283   },
9284
9285   /* VEX_LEN_0F12_P_2 */
9286   {
9287     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
9288   },
9289
9290   /* VEX_LEN_0F13_M_0 */
9291   {
9292     { "vmovlpX",        { EXq, XM }, 0 },
9293   },
9294
9295   /* VEX_LEN_0F16_P_0_M_0 */
9296   {
9297     { "vmovhps",        { XM, Vex128, EXq }, 0 },
9298   },
9299
9300   /* VEX_LEN_0F16_P_0_M_1 */
9301   {
9302     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
9303   },
9304
9305   /* VEX_LEN_0F16_P_2 */
9306   {
9307     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
9308   },
9309
9310   /* VEX_LEN_0F17_M_0 */
9311   {
9312     { "vmovhpX",        { EXq, XM }, 0 },
9313   },
9314
9315   /* VEX_LEN_0F2A_P_1 */
9316   {
9317     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9318     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9319   },
9320
9321   /* VEX_LEN_0F2A_P_3 */
9322   {
9323     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9324     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9325   },
9326
9327   /* VEX_LEN_0F2C_P_1 */
9328   {
9329     { "vcvttss2si",     { Gv, EXdScalar }, 0 },
9330     { "vcvttss2si",     { Gv, EXdScalar }, 0 },
9331   },
9332
9333   /* VEX_LEN_0F2C_P_3 */
9334   {
9335     { "vcvttsd2si",     { Gv, EXqScalar }, 0 },
9336     { "vcvttsd2si",     { Gv, EXqScalar }, 0 },
9337   },
9338
9339   /* VEX_LEN_0F2D_P_1 */
9340   {
9341     { "vcvtss2si",      { Gv, EXdScalar }, 0 },
9342     { "vcvtss2si",      { Gv, EXdScalar }, 0 },
9343   },
9344
9345   /* VEX_LEN_0F2D_P_3 */
9346   {
9347     { "vcvtsd2si",      { Gv, EXqScalar }, 0 },
9348     { "vcvtsd2si",      { Gv, EXqScalar }, 0 },
9349   },
9350
9351   /* VEX_LEN_0F41_P_0 */
9352   {
9353     { Bad_Opcode },
9354     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9355   },
9356   /* VEX_LEN_0F41_P_2 */
9357   {
9358     { Bad_Opcode },
9359     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9360   },
9361   /* VEX_LEN_0F42_P_0 */
9362   {
9363     { Bad_Opcode },
9364     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9365   },
9366   /* VEX_LEN_0F42_P_2 */
9367   {
9368     { Bad_Opcode },
9369     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9370   },
9371   /* VEX_LEN_0F44_P_0 */
9372   {
9373     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9374   },
9375   /* VEX_LEN_0F44_P_2 */
9376   {
9377     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9378   },
9379   /* VEX_LEN_0F45_P_0 */
9380   {
9381     { Bad_Opcode },
9382     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9383   },
9384   /* VEX_LEN_0F45_P_2 */
9385   {
9386     { Bad_Opcode },
9387     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9388   },
9389   /* VEX_LEN_0F46_P_0 */
9390   {
9391     { Bad_Opcode },
9392     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9393   },
9394   /* VEX_LEN_0F46_P_2 */
9395   {
9396     { Bad_Opcode },
9397     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9398   },
9399   /* VEX_LEN_0F47_P_0 */
9400   {
9401     { Bad_Opcode },
9402     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9403   },
9404   /* VEX_LEN_0F47_P_2 */
9405   {
9406     { Bad_Opcode },
9407     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9408   },
9409   /* VEX_LEN_0F4A_P_0 */
9410   {
9411     { Bad_Opcode },
9412     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9413   },
9414   /* VEX_LEN_0F4A_P_2 */
9415   {
9416     { Bad_Opcode },
9417     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9418   },
9419   /* VEX_LEN_0F4B_P_0 */
9420   {
9421     { Bad_Opcode },
9422     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9423   },
9424   /* VEX_LEN_0F4B_P_2 */
9425   {
9426     { Bad_Opcode },
9427     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9428   },
9429
9430   /* VEX_LEN_0F6E_P_2 */
9431   {
9432     { "vmovK",          { XMScalar, Edq }, 0 },
9433   },
9434
9435   /* VEX_LEN_0F77_P_1 */
9436   {
9437     { "vzeroupper",     { XX }, 0 },
9438     { "vzeroall",       { XX }, 0 },
9439   },
9440
9441   /* VEX_LEN_0F7E_P_1 */
9442   {
9443     { "vmovq",          { XMScalar, EXqScalar }, 0 },
9444   },
9445
9446   /* VEX_LEN_0F7E_P_2 */
9447   {
9448     { "vmovK",          { Edq, XMScalar }, 0 },
9449   },
9450
9451   /* VEX_LEN_0F90_P_0 */
9452   {
9453     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9454   },
9455
9456   /* VEX_LEN_0F90_P_2 */
9457   {
9458     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9459   },
9460
9461   /* VEX_LEN_0F91_P_0 */
9462   {
9463     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9464   },
9465
9466   /* VEX_LEN_0F91_P_2 */
9467   {
9468     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9469   },
9470
9471   /* VEX_LEN_0F92_P_0 */
9472   {
9473     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9474   },
9475
9476   /* VEX_LEN_0F92_P_2 */
9477   {
9478     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9479   },
9480
9481   /* VEX_LEN_0F92_P_3 */
9482   {
9483     { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
9484   },
9485
9486   /* VEX_LEN_0F93_P_0 */
9487   {
9488     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9489   },
9490
9491   /* VEX_LEN_0F93_P_2 */
9492   {
9493     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9494   },
9495
9496   /* VEX_LEN_0F93_P_3 */
9497   {
9498     { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
9499   },
9500
9501   /* VEX_LEN_0F98_P_0 */
9502   {
9503     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9504   },
9505
9506   /* VEX_LEN_0F98_P_2 */
9507   {
9508     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9509   },
9510
9511   /* VEX_LEN_0F99_P_0 */
9512   {
9513     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9514   },
9515
9516   /* VEX_LEN_0F99_P_2 */
9517   {
9518     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9519   },
9520
9521   /* VEX_LEN_0FAE_R_2_M_0 */
9522   {
9523     { "vldmxcsr",       { Md }, 0 },
9524   },
9525
9526   /* VEX_LEN_0FAE_R_3_M_0 */
9527   {
9528     { "vstmxcsr",       { Md }, 0 },
9529   },
9530
9531   /* VEX_LEN_0FC4_P_2 */
9532   {
9533     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
9534   },
9535
9536   /* VEX_LEN_0FC5_P_2 */
9537   {
9538     { "vpextrw",        { Gdq, XS, Ib }, 0 },
9539   },
9540
9541   /* VEX_LEN_0FD6_P_2 */
9542   {
9543     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
9544   },
9545
9546   /* VEX_LEN_0FF7_P_2 */
9547   {
9548     { "vmaskmovdqu",    { XM, XS }, 0 },
9549   },
9550
9551   /* VEX_LEN_0F3816_P_2 */
9552   {
9553     { Bad_Opcode },
9554     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9555   },
9556
9557   /* VEX_LEN_0F3819_P_2 */
9558   {
9559     { Bad_Opcode },
9560     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9561   },
9562
9563   /* VEX_LEN_0F381A_P_2_M_0 */
9564   {
9565     { Bad_Opcode },
9566     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9567   },
9568
9569   /* VEX_LEN_0F3836_P_2 */
9570   {
9571     { Bad_Opcode },
9572     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9573   },
9574
9575   /* VEX_LEN_0F3841_P_2 */
9576   {
9577     { "vphminposuw",    { XM, EXx }, 0 },
9578   },
9579
9580   /* VEX_LEN_0F385A_P_2_M_0 */
9581   {
9582     { Bad_Opcode },
9583     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9584   },
9585
9586   /* VEX_LEN_0F38DB_P_2 */
9587   {
9588     { "vaesimc",        { XM, EXx }, 0 },
9589   },
9590
9591   /* VEX_LEN_0F38F2_P_0 */
9592   {
9593     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
9594   },
9595
9596   /* VEX_LEN_0F38F3_R_1_P_0 */
9597   {
9598     { "blsrS",          { VexGdq, Edq }, 0 },
9599   },
9600
9601   /* VEX_LEN_0F38F3_R_2_P_0 */
9602   {
9603     { "blsmskS",        { VexGdq, Edq }, 0 },
9604   },
9605
9606   /* VEX_LEN_0F38F3_R_3_P_0 */
9607   {
9608     { "blsiS",          { VexGdq, Edq }, 0 },
9609   },
9610
9611   /* VEX_LEN_0F38F5_P_0 */
9612   {
9613     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
9614   },
9615
9616   /* VEX_LEN_0F38F5_P_1 */
9617   {
9618     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
9619   },
9620
9621   /* VEX_LEN_0F38F5_P_3 */
9622   {
9623     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
9624   },
9625
9626   /* VEX_LEN_0F38F6_P_3 */
9627   {
9628     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
9629   },
9630
9631   /* VEX_LEN_0F38F7_P_0 */
9632   {
9633     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
9634   },
9635
9636   /* VEX_LEN_0F38F7_P_1 */
9637   {
9638     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
9639   },
9640
9641   /* VEX_LEN_0F38F7_P_2 */
9642   {
9643     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
9644   },
9645
9646   /* VEX_LEN_0F38F7_P_3 */
9647   {
9648     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
9649   },
9650
9651   /* VEX_LEN_0F3A00_P_2 */
9652   {
9653     { Bad_Opcode },
9654     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9655   },
9656
9657   /* VEX_LEN_0F3A01_P_2 */
9658   {
9659     { Bad_Opcode },
9660     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9661   },
9662
9663   /* VEX_LEN_0F3A06_P_2 */
9664   {
9665     { Bad_Opcode },
9666     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9667   },
9668
9669   /* VEX_LEN_0F3A14_P_2 */
9670   {
9671     { "vpextrb",        { Edqb, XM, Ib }, 0 },
9672   },
9673
9674   /* VEX_LEN_0F3A15_P_2 */
9675   {
9676     { "vpextrw",        { Edqw, XM, Ib }, 0 },
9677   },
9678
9679   /* VEX_LEN_0F3A16_P_2  */
9680   {
9681     { "vpextrK",        { Edq, XM, Ib }, 0 },
9682   },
9683
9684   /* VEX_LEN_0F3A17_P_2 */
9685   {
9686     { "vextractps",     { Edqd, XM, Ib }, 0 },
9687   },
9688
9689   /* VEX_LEN_0F3A18_P_2 */
9690   {
9691     { Bad_Opcode },
9692     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9693   },
9694
9695   /* VEX_LEN_0F3A19_P_2 */
9696   {
9697     { Bad_Opcode },
9698     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9699   },
9700
9701   /* VEX_LEN_0F3A20_P_2 */
9702   {
9703     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
9704   },
9705
9706   /* VEX_LEN_0F3A21_P_2 */
9707   {
9708     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
9709   },
9710
9711   /* VEX_LEN_0F3A22_P_2 */
9712   {
9713     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
9714   },
9715
9716   /* VEX_LEN_0F3A30_P_2 */
9717   {
9718     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9719   },
9720
9721   /* VEX_LEN_0F3A31_P_2 */
9722   {
9723     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9724   },
9725
9726   /* VEX_LEN_0F3A32_P_2 */
9727   {
9728     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9729   },
9730
9731   /* VEX_LEN_0F3A33_P_2 */
9732   {
9733     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9734   },
9735
9736   /* VEX_LEN_0F3A38_P_2 */
9737   {
9738     { Bad_Opcode },
9739     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9740   },
9741
9742   /* VEX_LEN_0F3A39_P_2 */
9743   {
9744     { Bad_Opcode },
9745     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9746   },
9747
9748   /* VEX_LEN_0F3A41_P_2 */
9749   {
9750     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
9751   },
9752
9753   /* VEX_LEN_0F3A46_P_2 */
9754   {
9755     { Bad_Opcode },
9756     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9757   },
9758
9759   /* VEX_LEN_0F3A60_P_2 */
9760   {
9761     { "vpcmpestrm",     { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9762   },
9763
9764   /* VEX_LEN_0F3A61_P_2 */
9765   {
9766     { "vpcmpestri",     { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9767   },
9768
9769   /* VEX_LEN_0F3A62_P_2 */
9770   {
9771     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
9772   },
9773
9774   /* VEX_LEN_0F3A63_P_2 */
9775   {
9776     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
9777   },
9778
9779   /* VEX_LEN_0F3A6A_P_2 */
9780   {
9781     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9782   },
9783
9784   /* VEX_LEN_0F3A6B_P_2 */
9785   {
9786     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9787   },
9788
9789   /* VEX_LEN_0F3A6E_P_2 */
9790   {
9791     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9792   },
9793
9794   /* VEX_LEN_0F3A6F_P_2 */
9795   {
9796     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9797   },
9798
9799   /* VEX_LEN_0F3A7A_P_2 */
9800   {
9801     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9802   },
9803
9804   /* VEX_LEN_0F3A7B_P_2 */
9805   {
9806     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9807   },
9808
9809   /* VEX_LEN_0F3A7E_P_2 */
9810   {
9811     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9812   },
9813
9814   /* VEX_LEN_0F3A7F_P_2 */
9815   {
9816     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9817   },
9818
9819   /* VEX_LEN_0F3ADF_P_2 */
9820   {
9821     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9822   },
9823
9824   /* VEX_LEN_0F3AF0_P_3 */
9825   {
9826     { "rorxS",          { Gdq, Edq, Ib }, 0 },
9827   },
9828
9829   /* VEX_LEN_0FXOP_08_CC */
9830   {
9831      { "vpcomb",        { XM, Vex128, EXx, VPCOM }, 0 },
9832   },
9833
9834   /* VEX_LEN_0FXOP_08_CD */
9835   {
9836      { "vpcomw",        { XM, Vex128, EXx, VPCOM }, 0 },
9837   },
9838
9839   /* VEX_LEN_0FXOP_08_CE */
9840   {
9841      { "vpcomd",        { XM, Vex128, EXx, VPCOM }, 0 },
9842   },
9843
9844   /* VEX_LEN_0FXOP_08_CF */
9845   {
9846      { "vpcomq",        { XM, Vex128, EXx, VPCOM }, 0 },
9847   },
9848
9849   /* VEX_LEN_0FXOP_08_EC */
9850   {
9851      { "vpcomub",       { XM, Vex128, EXx, VPCOM }, 0 },
9852   },
9853
9854   /* VEX_LEN_0FXOP_08_ED */
9855   {
9856      { "vpcomuw",       { XM, Vex128, EXx, VPCOM }, 0 },
9857   },
9858
9859   /* VEX_LEN_0FXOP_08_EE */
9860   {
9861      { "vpcomud",       { XM, Vex128, EXx, VPCOM }, 0 },
9862   },
9863
9864   /* VEX_LEN_0FXOP_08_EF */
9865   {
9866      { "vpcomuq",       { XM, Vex128, EXx, VPCOM }, 0 },
9867   },
9868
9869   /* VEX_LEN_0FXOP_09_80 */
9870   {
9871     { "vfrczps",        { XM, EXxmm }, 0 },
9872     { "vfrczps",        { XM, EXymmq }, 0 },
9873   },
9874
9875   /* VEX_LEN_0FXOP_09_81 */
9876   {
9877     { "vfrczpd",        { XM, EXxmm }, 0 },
9878     { "vfrczpd",        { XM, EXymmq }, 0 },
9879   },
9880 };
9881
9882 static const struct dis386 evex_len_table[][3] = {
9883 #define NEED_EVEX_LEN_TABLE
9884 #include "i386-dis-evex.h"
9885 #undef NEED_EVEX_LEN_TABLE
9886 };
9887
9888 static const struct dis386 vex_w_table[][2] = {
9889   {
9890     /* VEX_W_0F41_P_0_LEN_1 */
9891     { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9892     { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9893   },
9894   {
9895     /* VEX_W_0F41_P_2_LEN_1 */
9896     { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9897     { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9898   },
9899   {
9900     /* VEX_W_0F42_P_0_LEN_1 */
9901     { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9902     { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9903   },
9904   {
9905     /* VEX_W_0F42_P_2_LEN_1 */
9906     { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9907     { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9908   },
9909   {
9910     /* VEX_W_0F44_P_0_LEN_0 */
9911     { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9912     { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9913   },
9914   {
9915     /* VEX_W_0F44_P_2_LEN_0 */
9916     { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9917     { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9918   },
9919   {
9920     /* VEX_W_0F45_P_0_LEN_1 */
9921     { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9922     { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9923   },
9924   {
9925     /* VEX_W_0F45_P_2_LEN_1 */
9926     { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9927     { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9928   },
9929   {
9930     /* VEX_W_0F46_P_0_LEN_1 */
9931     { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9932     { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9933   },
9934   {
9935     /* VEX_W_0F46_P_2_LEN_1 */
9936     { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9937     { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9938   },
9939   {
9940     /* VEX_W_0F47_P_0_LEN_1 */
9941     { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9942     { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9943   },
9944   {
9945     /* VEX_W_0F47_P_2_LEN_1 */
9946     { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9947     { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9948   },
9949   {
9950     /* VEX_W_0F4A_P_0_LEN_1 */
9951     { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9952     { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9953   },
9954   {
9955     /* VEX_W_0F4A_P_2_LEN_1 */
9956     { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9957     { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9958   },
9959   {
9960     /* VEX_W_0F4B_P_0_LEN_1 */
9961     { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
9962     { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9963   },
9964   {
9965     /* VEX_W_0F4B_P_2_LEN_1 */
9966     { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9967   },
9968   {
9969     /* VEX_W_0F90_P_0_LEN_0 */
9970     { "kmovw",          { MaskG, MaskE }, 0 },
9971     { "kmovq",          { MaskG, MaskE }, 0 },
9972   },
9973   {
9974     /* VEX_W_0F90_P_2_LEN_0 */
9975     { "kmovb",          { MaskG, MaskBDE }, 0 },
9976     { "kmovd",          { MaskG, MaskBDE }, 0 },
9977   },
9978   {
9979     /* VEX_W_0F91_P_0_LEN_0 */
9980     { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
9981     { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
9982   },
9983   {
9984     /* VEX_W_0F91_P_2_LEN_0 */
9985     { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
9986     { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
9987   },
9988   {
9989     /* VEX_W_0F92_P_0_LEN_0 */
9990     { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
9991   },
9992   {
9993     /* VEX_W_0F92_P_2_LEN_0 */
9994     { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
9995   },
9996   {
9997     /* VEX_W_0F93_P_0_LEN_0 */
9998     { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
9999   },
10000   {
10001     /* VEX_W_0F93_P_2_LEN_0 */
10002     { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
10003   },
10004   {
10005     /* VEX_W_0F98_P_0_LEN_0 */
10006     { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10007     { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10008   },
10009   {
10010     /* VEX_W_0F98_P_2_LEN_0 */
10011     { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10012     { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10013   },
10014   {
10015     /* VEX_W_0F99_P_0_LEN_0 */
10016     { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10017     { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10018   },
10019   {
10020     /* VEX_W_0F99_P_2_LEN_0 */
10021     { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10022     { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10023   },
10024   {
10025     /* VEX_W_0F380C_P_2  */
10026     { "vpermilps",      { XM, Vex, EXx }, 0 },
10027   },
10028   {
10029     /* VEX_W_0F380D_P_2  */
10030     { "vpermilpd",      { XM, Vex, EXx }, 0 },
10031   },
10032   {
10033     /* VEX_W_0F380E_P_2  */
10034     { "vtestps",        { XM, EXx }, 0 },
10035   },
10036   {
10037     /* VEX_W_0F380F_P_2  */
10038     { "vtestpd",        { XM, EXx }, 0 },
10039   },
10040   {
10041     /* VEX_W_0F3816_P_2  */
10042     { "vpermps",        { XM, Vex, EXx }, 0 },
10043   },
10044   {
10045     /* VEX_W_0F3818_P_2 */
10046     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
10047   },
10048   {
10049     /* VEX_W_0F3819_P_2 */
10050     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
10051   },
10052   {
10053     /* VEX_W_0F381A_P_2_M_0 */
10054     { "vbroadcastf128", { XM, Mxmm }, 0 },
10055   },
10056   {
10057     /* VEX_W_0F382C_P_2_M_0 */
10058     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
10059   },
10060   {
10061     /* VEX_W_0F382D_P_2_M_0 */
10062     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
10063   },
10064   {
10065     /* VEX_W_0F382E_P_2_M_0 */
10066     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
10067   },
10068   {
10069     /* VEX_W_0F382F_P_2_M_0 */
10070     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
10071   },
10072   {
10073     /* VEX_W_0F3836_P_2  */
10074     { "vpermd",         { XM, Vex, EXx }, 0 },
10075   },
10076   {
10077     /* VEX_W_0F3846_P_2 */
10078     { "vpsravd",        { XM, Vex, EXx }, 0 },
10079   },
10080   {
10081     /* VEX_W_0F3858_P_2 */
10082     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10083   },
10084   {
10085     /* VEX_W_0F3859_P_2 */
10086     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
10087   },
10088   {
10089     /* VEX_W_0F385A_P_2_M_0 */
10090     { "vbroadcasti128", { XM, Mxmm }, 0 },
10091   },
10092   {
10093     /* VEX_W_0F3878_P_2 */
10094     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
10095   },
10096   {
10097     /* VEX_W_0F3879_P_2 */
10098     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
10099   },
10100   {
10101     /* VEX_W_0F38CF_P_2 */
10102     { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10103   },
10104   {
10105     /* VEX_W_0F3A00_P_2 */
10106     { Bad_Opcode },
10107     { "vpermq",         { XM, EXx, Ib }, 0 },
10108   },
10109   {
10110     /* VEX_W_0F3A01_P_2 */
10111     { Bad_Opcode },
10112     { "vpermpd",        { XM, EXx, Ib }, 0 },
10113   },
10114   {
10115     /* VEX_W_0F3A02_P_2 */
10116     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
10117   },
10118   {
10119     /* VEX_W_0F3A04_P_2 */
10120     { "vpermilps",      { XM, EXx, Ib }, 0 },
10121   },
10122   {
10123     /* VEX_W_0F3A05_P_2 */
10124     { "vpermilpd",      { XM, EXx, Ib }, 0 },
10125   },
10126   {
10127     /* VEX_W_0F3A06_P_2 */
10128     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
10129   },
10130   {
10131     /* VEX_W_0F3A18_P_2 */
10132     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
10133   },
10134   {
10135     /* VEX_W_0F3A19_P_2 */
10136     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
10137   },
10138   {
10139     /* VEX_W_0F3A30_P_2_LEN_0 */
10140     { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10141     { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10142   },
10143   {
10144     /* VEX_W_0F3A31_P_2_LEN_0 */
10145     { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10146     { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10147   },
10148   {
10149     /* VEX_W_0F3A32_P_2_LEN_0 */
10150     { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10151     { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10152   },
10153   {
10154     /* VEX_W_0F3A33_P_2_LEN_0 */
10155     { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10156     { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10157   },
10158   {
10159     /* VEX_W_0F3A38_P_2 */
10160     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
10161   },
10162   {
10163     /* VEX_W_0F3A39_P_2 */
10164     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
10165   },
10166   {
10167     /* VEX_W_0F3A46_P_2 */
10168     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
10169   },
10170   {
10171     /* VEX_W_0F3A48_P_2 */
10172     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10173     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10174   },
10175   {
10176     /* VEX_W_0F3A49_P_2 */
10177     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10178     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10179   },
10180   {
10181     /* VEX_W_0F3A4A_P_2 */
10182     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
10183   },
10184   {
10185     /* VEX_W_0F3A4B_P_2 */
10186     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
10187   },
10188   {
10189     /* VEX_W_0F3A4C_P_2 */
10190     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
10191   },
10192   {
10193     /* VEX_W_0F3ACE_P_2 */
10194     { Bad_Opcode },
10195     { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10196   },
10197   {
10198     /* VEX_W_0F3ACF_P_2 */
10199     { Bad_Opcode },
10200     { "vgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, 0 },
10201   },
10202 #define NEED_VEX_W_TABLE
10203 #include "i386-dis-evex.h"
10204 #undef NEED_VEX_W_TABLE
10205 };
10206
10207 static const struct dis386 mod_table[][2] = {
10208   {
10209     /* MOD_8D */
10210     { "leaS",           { Gv, M }, 0 },
10211   },
10212   {
10213     /* MOD_C6_REG_7 */
10214     { Bad_Opcode },
10215     { RM_TABLE (RM_C6_REG_7) },
10216   },
10217   {
10218     /* MOD_C7_REG_7 */
10219     { Bad_Opcode },
10220     { RM_TABLE (RM_C7_REG_7) },
10221   },
10222   {
10223     /* MOD_FF_REG_3 */
10224     { "Jcall^", { indirEp }, 0 },
10225   },
10226   {
10227     /* MOD_FF_REG_5 */
10228     { "Jjmp^", { indirEp }, 0 },
10229   },
10230   {
10231     /* MOD_0F01_REG_0 */
10232     { X86_64_TABLE (X86_64_0F01_REG_0) },
10233     { RM_TABLE (RM_0F01_REG_0) },
10234   },
10235   {
10236     /* MOD_0F01_REG_1 */
10237     { X86_64_TABLE (X86_64_0F01_REG_1) },
10238     { RM_TABLE (RM_0F01_REG_1) },
10239   },
10240   {
10241     /* MOD_0F01_REG_2 */
10242     { X86_64_TABLE (X86_64_0F01_REG_2) },
10243     { RM_TABLE (RM_0F01_REG_2) },
10244   },
10245   {
10246     /* MOD_0F01_REG_3 */
10247     { X86_64_TABLE (X86_64_0F01_REG_3) },
10248     { RM_TABLE (RM_0F01_REG_3) },
10249   },
10250   {
10251     /* MOD_0F01_REG_5 */
10252     { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10253     { RM_TABLE (RM_0F01_REG_5) },
10254   },
10255   {
10256     /* MOD_0F01_REG_7 */
10257     { "invlpg",         { Mb }, 0 },
10258     { RM_TABLE (RM_0F01_REG_7) },
10259   },
10260   {
10261     /* MOD_0F12_PREFIX_0 */
10262     { "movlps",         { XM, EXq }, PREFIX_OPCODE },
10263     { "movhlps",        { XM, EXq }, PREFIX_OPCODE },
10264   },
10265   {
10266     /* MOD_0F13 */
10267     { "movlpX",         { EXq, XM }, PREFIX_OPCODE },
10268   },
10269   {
10270     /* MOD_0F16_PREFIX_0 */
10271     { "movhps",         { XM, EXq }, 0 },
10272     { "movlhps",        { XM, EXq }, 0 },
10273   },
10274   {
10275     /* MOD_0F17 */
10276     { "movhpX",         { EXq, XM }, PREFIX_OPCODE },
10277   },
10278   {
10279     /* MOD_0F18_REG_0 */
10280     { "prefetchnta",    { Mb }, 0 },
10281   },
10282   {
10283     /* MOD_0F18_REG_1 */
10284     { "prefetcht0",     { Mb }, 0 },
10285   },
10286   {
10287     /* MOD_0F18_REG_2 */
10288     { "prefetcht1",     { Mb }, 0 },
10289   },
10290   {
10291     /* MOD_0F18_REG_3 */
10292     { "prefetcht2",     { Mb }, 0 },
10293   },
10294   {
10295     /* MOD_0F18_REG_4 */
10296     { "nop/reserved",   { Mb }, 0 },
10297   },
10298   {
10299     /* MOD_0F18_REG_5 */
10300     { "nop/reserved",   { Mb }, 0 },
10301   },
10302   {
10303     /* MOD_0F18_REG_6 */
10304     { "nop/reserved",   { Mb }, 0 },
10305   },
10306   {
10307     /* MOD_0F18_REG_7 */
10308     { "nop/reserved",   { Mb }, 0 },
10309   },
10310   {
10311     /* MOD_0F1A_PREFIX_0 */
10312     { "bndldx",         { Gbnd, Mv_bnd }, 0 },
10313     { "nopQ",           { Ev }, 0 },
10314   },
10315   {
10316     /* MOD_0F1B_PREFIX_0 */
10317     { "bndstx",         { Mv_bnd, Gbnd }, 0 },
10318     { "nopQ",           { Ev }, 0 },
10319   },
10320   {
10321     /* MOD_0F1B_PREFIX_1 */
10322     { "bndmk",          { Gbnd, Mv_bnd }, 0 },
10323     { "nopQ",           { Ev }, 0 },
10324   },
10325   {
10326     /* MOD_0F1C_PREFIX_0 */
10327     { REG_TABLE (REG_0F1C_MOD_0) },
10328     { "nopQ",           { Ev }, 0 },
10329   },
10330   {
10331     /* MOD_0F1E_PREFIX_1 */
10332     { "nopQ",           { Ev }, 0 },
10333     { REG_TABLE (REG_0F1E_MOD_3) },
10334   },
10335   {
10336     /* MOD_0F24 */
10337     { Bad_Opcode },
10338     { "movL",           { Rd, Td }, 0 },
10339   },
10340   {
10341     /* MOD_0F26 */
10342     { Bad_Opcode },
10343     { "movL",           { Td, Rd }, 0 },
10344   },
10345   {
10346     /* MOD_0F2B_PREFIX_0 */
10347     {"movntps",         { Mx, XM }, PREFIX_OPCODE },
10348   },
10349   {
10350     /* MOD_0F2B_PREFIX_1 */
10351     {"movntss",         { Md, XM }, PREFIX_OPCODE },
10352   },
10353   {
10354     /* MOD_0F2B_PREFIX_2 */
10355     {"movntpd",         { Mx, XM }, PREFIX_OPCODE },
10356   },
10357   {
10358     /* MOD_0F2B_PREFIX_3 */
10359     {"movntsd",         { Mq, XM }, PREFIX_OPCODE },
10360   },
10361   {
10362     /* MOD_0F51 */
10363     { Bad_Opcode },
10364     { "movmskpX",       { Gdq, XS }, PREFIX_OPCODE },
10365   },
10366   {
10367     /* MOD_0F71_REG_2 */
10368     { Bad_Opcode },
10369     { "psrlw",          { MS, Ib }, 0 },
10370   },
10371   {
10372     /* MOD_0F71_REG_4 */
10373     { Bad_Opcode },
10374     { "psraw",          { MS, Ib }, 0 },
10375   },
10376   {
10377     /* MOD_0F71_REG_6 */
10378     { Bad_Opcode },
10379     { "psllw",          { MS, Ib }, 0 },
10380   },
10381   {
10382     /* MOD_0F72_REG_2 */
10383     { Bad_Opcode },
10384     { "psrld",          { MS, Ib }, 0 },
10385   },
10386   {
10387     /* MOD_0F72_REG_4 */
10388     { Bad_Opcode },
10389     { "psrad",          { MS, Ib }, 0 },
10390   },
10391   {
10392     /* MOD_0F72_REG_6 */
10393     { Bad_Opcode },
10394     { "pslld",          { MS, Ib }, 0 },
10395   },
10396   {
10397     /* MOD_0F73_REG_2 */
10398     { Bad_Opcode },
10399     { "psrlq",          { MS, Ib }, 0 },
10400   },
10401   {
10402     /* MOD_0F73_REG_3 */
10403     { Bad_Opcode },
10404     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10405   },
10406   {
10407     /* MOD_0F73_REG_6 */
10408     { Bad_Opcode },
10409     { "psllq",          { MS, Ib }, 0 },
10410   },
10411   {
10412     /* MOD_0F73_REG_7 */
10413     { Bad_Opcode },
10414     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10415   },
10416   {
10417     /* MOD_0FAE_REG_0 */
10418     { "fxsave",         { FXSAVE }, 0 },
10419     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10420   },
10421   {
10422     /* MOD_0FAE_REG_1 */
10423     { "fxrstor",        { FXSAVE }, 0 },
10424     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10425   },
10426   {
10427     /* MOD_0FAE_REG_2 */
10428     { "ldmxcsr",        { Md }, 0 },
10429     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10430   },
10431   {
10432     /* MOD_0FAE_REG_3 */
10433     { "stmxcsr",        { Md }, 0 },
10434     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10435   },
10436   {
10437     /* MOD_0FAE_REG_4 */
10438     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10439     { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10440   },
10441   {
10442     /* MOD_0FAE_REG_5 */
10443     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10444     { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10445   },
10446   {
10447     /* MOD_0FAE_REG_6 */
10448     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10449     { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10450   },
10451   {
10452     /* MOD_0FAE_REG_7 */
10453     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10454     { RM_TABLE (RM_0FAE_REG_7) },
10455   },
10456   {
10457     /* MOD_0FB2 */
10458     { "lssS",           { Gv, Mp }, 0 },
10459   },
10460   {
10461     /* MOD_0FB4 */
10462     { "lfsS",           { Gv, Mp }, 0 },
10463   },
10464   {
10465     /* MOD_0FB5 */
10466     { "lgsS",           { Gv, Mp }, 0 },
10467   },
10468   {
10469     /* MOD_0FC3 */
10470     { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10471   },
10472   {
10473     /* MOD_0FC7_REG_3 */
10474     { "xrstors",        { FXSAVE }, 0 },
10475   },
10476   {
10477     /* MOD_0FC7_REG_4 */
10478     { "xsavec",         { FXSAVE }, 0 },
10479   },
10480   {
10481     /* MOD_0FC7_REG_5 */
10482     { "xsaves",         { FXSAVE }, 0 },
10483   },
10484   {
10485     /* MOD_0FC7_REG_6 */
10486     { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10487     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10488   },
10489   {
10490     /* MOD_0FC7_REG_7 */
10491     { "vmptrst",        { Mq }, 0 },
10492     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10493   },
10494   {
10495     /* MOD_0FD7 */
10496     { Bad_Opcode },
10497     { "pmovmskb",       { Gdq, MS }, 0 },
10498   },
10499   {
10500     /* MOD_0FE7_PREFIX_2 */
10501     { "movntdq",        { Mx, XM }, 0 },
10502   },
10503   {
10504     /* MOD_0FF0_PREFIX_3 */
10505     { "lddqu",          { XM, M }, 0 },
10506   },
10507   {
10508     /* MOD_0F382A_PREFIX_2 */
10509     { "movntdqa",       { XM, Mx }, 0 },
10510   },
10511   {
10512     /* MOD_0F38F5_PREFIX_2 */
10513     { "wrussK",         { M, Gdq }, PREFIX_OPCODE },
10514   },
10515   {
10516     /* MOD_0F38F6_PREFIX_0 */
10517     { "wrssK",          { M, Gdq }, PREFIX_OPCODE },
10518   },
10519   {
10520     /* MOD_0F38F8_PREFIX_2 */
10521     { "movdir64b",      { Gva, M }, PREFIX_OPCODE },
10522   },
10523   {
10524     /* MOD_0F38F9_PREFIX_0 */
10525     { "movdiri",        { Em, Gv }, PREFIX_OPCODE },
10526   },
10527   {
10528     /* MOD_62_32BIT */
10529     { "bound{S|}",      { Gv, Ma }, 0 },
10530     { EVEX_TABLE (EVEX_0F) },
10531   },
10532   {
10533     /* MOD_C4_32BIT */
10534     { "lesS",           { Gv, Mp }, 0 },
10535     { VEX_C4_TABLE (VEX_0F) },
10536   },
10537   {
10538     /* MOD_C5_32BIT */
10539     { "ldsS",           { Gv, Mp }, 0 },
10540     { VEX_C5_TABLE (VEX_0F) },
10541   },
10542   {
10543     /* MOD_VEX_0F12_PREFIX_0 */
10544     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10545     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10546   },
10547   {
10548     /* MOD_VEX_0F13 */
10549     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10550   },
10551   {
10552     /* MOD_VEX_0F16_PREFIX_0 */
10553     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10554     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10555   },
10556   {
10557     /* MOD_VEX_0F17 */
10558     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10559   },
10560   {
10561     /* MOD_VEX_0F2B */
10562     { "vmovntpX",       { Mx, XM }, 0 },
10563   },
10564   {
10565     /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10566     { Bad_Opcode },
10567     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10568   },
10569   {
10570     /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10571     { Bad_Opcode },
10572     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10573   },
10574   {
10575     /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10576     { Bad_Opcode },
10577     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10578   },
10579   {
10580     /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10581     { Bad_Opcode },
10582     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10583   },
10584   {
10585     /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10586     { Bad_Opcode },
10587     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10588   },
10589   {
10590     /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10591     { Bad_Opcode },
10592     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10593   },
10594   {
10595     /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10596     { Bad_Opcode },
10597     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10598   },
10599   {
10600     /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10601     { Bad_Opcode },
10602     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10603   },
10604   {
10605     /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10606     { Bad_Opcode },
10607     { "knotw",          { MaskG, MaskR }, 0 },
10608   },
10609   {
10610     /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10611     { Bad_Opcode },
10612     { "knotq",          { MaskG, MaskR }, 0 },
10613   },
10614   {
10615     /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10616     { Bad_Opcode },
10617     { "knotb",          { MaskG, MaskR }, 0 },
10618   },
10619   {
10620     /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10621     { Bad_Opcode },
10622     { "knotd",          { MaskG, MaskR }, 0 },
10623   },
10624   {
10625     /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10626     { Bad_Opcode },
10627     { "korw",       { MaskG, MaskVex, MaskR }, 0 },
10628   },
10629   {
10630     /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10631     { Bad_Opcode },
10632     { "korq",       { MaskG, MaskVex, MaskR }, 0 },
10633   },
10634   {
10635     /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10636     { Bad_Opcode },
10637     { "korb",       { MaskG, MaskVex, MaskR }, 0 },
10638   },
10639   {
10640     /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10641     { Bad_Opcode },
10642     { "kord",       { MaskG, MaskVex, MaskR }, 0 },
10643   },
10644  {
10645     /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10646     { Bad_Opcode },
10647     { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
10648   },
10649   {
10650     /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10651     { Bad_Opcode },
10652     { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
10653   },
10654   {
10655     /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10656     { Bad_Opcode },
10657     { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
10658   },
10659   {
10660     /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10661     { Bad_Opcode },
10662     { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
10663   },
10664   {
10665     /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10666     { Bad_Opcode },
10667     { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
10668   },
10669   {
10670     /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10671     { Bad_Opcode },
10672     { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
10673   },
10674   {
10675     /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10676     { Bad_Opcode },
10677     { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
10678   },
10679   {
10680     /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10681     { Bad_Opcode },
10682     { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
10683   },
10684   {
10685     /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10686     { Bad_Opcode },
10687     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10688   },
10689   {
10690     /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10691     { Bad_Opcode },
10692     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10693   },
10694   {
10695     /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10696     { Bad_Opcode },
10697     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10698   },
10699   {
10700     /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10701     { Bad_Opcode },
10702     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10703   },
10704   {
10705     /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10706     { Bad_Opcode },
10707     { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
10708   },
10709   {
10710     /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10711     { Bad_Opcode },
10712     { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
10713   },
10714   {
10715     /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10716     { Bad_Opcode },
10717     { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
10718   },
10719   {
10720     /* MOD_VEX_0F50 */
10721     { Bad_Opcode },
10722     { "vmovmskpX",      { Gdq, XS }, 0 },
10723   },
10724   {
10725     /* MOD_VEX_0F71_REG_2 */
10726     { Bad_Opcode },
10727     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10728   },
10729   {
10730     /* MOD_VEX_0F71_REG_4 */
10731     { Bad_Opcode },
10732     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10733   },
10734   {
10735     /* MOD_VEX_0F71_REG_6 */
10736     { Bad_Opcode },
10737     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10738   },
10739   {
10740     /* MOD_VEX_0F72_REG_2 */
10741     { Bad_Opcode },
10742     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10743   },
10744   {
10745     /* MOD_VEX_0F72_REG_4 */
10746     { Bad_Opcode },
10747     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10748   },
10749   {
10750     /* MOD_VEX_0F72_REG_6 */
10751     { Bad_Opcode },
10752     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10753   },
10754   {
10755     /* MOD_VEX_0F73_REG_2 */
10756     { Bad_Opcode },
10757     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10758   },
10759   {
10760     /* MOD_VEX_0F73_REG_3 */
10761     { Bad_Opcode },
10762     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10763   },
10764   {
10765     /* MOD_VEX_0F73_REG_6 */
10766     { Bad_Opcode },
10767     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10768   },
10769   {
10770     /* MOD_VEX_0F73_REG_7 */
10771     { Bad_Opcode },
10772     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10773   },
10774   {
10775     /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10776     { "kmovw",          { Ew, MaskG }, 0 },
10777     { Bad_Opcode },
10778   },
10779   {
10780     /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10781     { "kmovq",          { Eq, MaskG }, 0 },
10782     { Bad_Opcode },
10783   },
10784   {
10785     /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10786     { "kmovb",          { Eb, MaskG }, 0 },
10787     { Bad_Opcode },
10788   },
10789   {
10790     /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10791     { "kmovd",          { Ed, MaskG }, 0 },
10792     { Bad_Opcode },
10793   },
10794   {
10795     /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10796     { Bad_Opcode },
10797     { "kmovw",          { MaskG, Rdq }, 0 },
10798   },
10799   {
10800     /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10801     { Bad_Opcode },
10802     { "kmovb",          { MaskG, Rdq }, 0 },
10803   },
10804   {
10805     /* MOD_VEX_0F92_P_3_LEN_0 */
10806     { Bad_Opcode },
10807     { "kmovK",          { MaskG, Rdq }, 0 },
10808   },
10809   {
10810     /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10811     { Bad_Opcode },
10812     { "kmovw",          { Gdq, MaskR }, 0 },
10813   },
10814   {
10815     /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10816     { Bad_Opcode },
10817     { "kmovb",          { Gdq, MaskR }, 0 },
10818   },
10819   {
10820     /* MOD_VEX_0F93_P_3_LEN_0 */
10821     { Bad_Opcode },
10822     { "kmovK",          { Gdq, MaskR }, 0 },
10823   },
10824   {
10825     /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10826     { Bad_Opcode },
10827     { "kortestw", { MaskG, MaskR }, 0 },
10828   },
10829   {
10830     /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10831     { Bad_Opcode },
10832     { "kortestq", { MaskG, MaskR }, 0 },
10833   },
10834   {
10835     /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10836     { Bad_Opcode },
10837     { "kortestb", { MaskG, MaskR }, 0 },
10838   },
10839   {
10840     /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10841     { Bad_Opcode },
10842     { "kortestd", { MaskG, MaskR }, 0 },
10843   },
10844   {
10845     /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10846     { Bad_Opcode },
10847     { "ktestw", { MaskG, MaskR }, 0 },
10848   },
10849   {
10850     /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10851     { Bad_Opcode },
10852     { "ktestq", { MaskG, MaskR }, 0 },
10853   },
10854   {
10855     /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10856     { Bad_Opcode },
10857     { "ktestb", { MaskG, MaskR }, 0 },
10858   },
10859   {
10860     /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10861     { Bad_Opcode },
10862     { "ktestd", { MaskG, MaskR }, 0 },
10863   },
10864   {
10865     /* MOD_VEX_0FAE_REG_2 */
10866     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10867   },
10868   {
10869     /* MOD_VEX_0FAE_REG_3 */
10870     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10871   },
10872   {
10873     /* MOD_VEX_0FD7_PREFIX_2 */
10874     { Bad_Opcode },
10875     { "vpmovmskb",      { Gdq, XS }, 0 },
10876   },
10877   {
10878     /* MOD_VEX_0FE7_PREFIX_2 */
10879     { "vmovntdq",       { Mx, XM }, 0 },
10880   },
10881   {
10882     /* MOD_VEX_0FF0_PREFIX_3 */
10883     { "vlddqu",         { XM, M }, 0 },
10884   },
10885   {
10886     /* MOD_VEX_0F381A_PREFIX_2 */
10887     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10888   },
10889   {
10890     /* MOD_VEX_0F382A_PREFIX_2 */
10891     { "vmovntdqa",      { XM, Mx }, 0 },
10892   },
10893   {
10894     /* MOD_VEX_0F382C_PREFIX_2 */
10895     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10896   },
10897   {
10898     /* MOD_VEX_0F382D_PREFIX_2 */
10899     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10900   },
10901   {
10902     /* MOD_VEX_0F382E_PREFIX_2 */
10903     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10904   },
10905   {
10906     /* MOD_VEX_0F382F_PREFIX_2 */
10907     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10908   },
10909   {
10910     /* MOD_VEX_0F385A_PREFIX_2 */
10911     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10912   },
10913   {
10914     /* MOD_VEX_0F388C_PREFIX_2 */
10915     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
10916   },
10917   {
10918     /* MOD_VEX_0F388E_PREFIX_2 */
10919     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
10920   },
10921   {
10922     /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10923     { Bad_Opcode },
10924     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
10925   },
10926   {
10927     /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10928     { Bad_Opcode },
10929     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
10930   },
10931   {
10932     /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10933     { Bad_Opcode },
10934     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
10935   },
10936   {
10937     /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10938     { Bad_Opcode },
10939     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
10940   },
10941   {
10942     /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10943     { Bad_Opcode },
10944     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
10945   },
10946   {
10947     /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10948     { Bad_Opcode },
10949     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
10950   },
10951   {
10952     /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10953     { Bad_Opcode },
10954     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
10955   },
10956   {
10957     /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
10958     { Bad_Opcode },
10959     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
10960   },
10961 #define NEED_MOD_TABLE
10962 #include "i386-dis-evex.h"
10963 #undef NEED_MOD_TABLE
10964 };
10965
10966 static const struct dis386 rm_table[][8] = {
10967   {
10968     /* RM_C6_REG_7 */
10969     { "xabort",         { Skip_MODRM, Ib }, 0 },
10970   },
10971   {
10972     /* RM_C7_REG_7 */
10973     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
10974   },
10975   {
10976     /* RM_0F01_REG_0 */
10977     { "enclv",          { Skip_MODRM }, 0 },
10978     { "vmcall",         { Skip_MODRM }, 0 },
10979     { "vmlaunch",       { Skip_MODRM }, 0 },
10980     { "vmresume",       { Skip_MODRM }, 0 },
10981     { "vmxoff",         { Skip_MODRM }, 0 },
10982     { "pconfig",        { Skip_MODRM }, 0 },
10983   },
10984   {
10985     /* RM_0F01_REG_1 */
10986     { "monitor",        { { OP_Monitor, 0 } }, 0 },
10987     { "mwait",          { { OP_Mwait, 0 } }, 0 },
10988     { "clac",           { Skip_MODRM }, 0 },
10989     { "stac",           { Skip_MODRM }, 0 },
10990     { Bad_Opcode },
10991     { Bad_Opcode },
10992     { Bad_Opcode },
10993     { "encls",          { Skip_MODRM }, 0 },
10994   },
10995   {
10996     /* RM_0F01_REG_2 */
10997     { "xgetbv",         { Skip_MODRM }, 0 },
10998     { "xsetbv",         { Skip_MODRM }, 0 },
10999     { Bad_Opcode },
11000     { Bad_Opcode },
11001     { "vmfunc",         { Skip_MODRM }, 0 },
11002     { "xend",           { Skip_MODRM }, 0 },
11003     { "xtest",          { Skip_MODRM }, 0 },
11004     { "enclu",          { Skip_MODRM }, 0 },
11005   },
11006   {
11007     /* RM_0F01_REG_3 */
11008     { "vmrun",          { Skip_MODRM }, 0 },
11009     { "vmmcall",        { Skip_MODRM }, 0 },
11010     { "vmload",         { Skip_MODRM }, 0 },
11011     { "vmsave",         { Skip_MODRM }, 0 },
11012     { "stgi",           { Skip_MODRM }, 0 },
11013     { "clgi",           { Skip_MODRM }, 0 },
11014     { "skinit",         { Skip_MODRM }, 0 },
11015     { "invlpga",        { Skip_MODRM }, 0 },
11016   },
11017   {
11018     /* RM_0F01_REG_5 */
11019     { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11020     { Bad_Opcode },
11021     { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11022     { Bad_Opcode },
11023     { Bad_Opcode },
11024     { Bad_Opcode },
11025     { "rdpkru",         { Skip_MODRM }, 0 },
11026     { "wrpkru",         { Skip_MODRM }, 0 },
11027   },
11028   {
11029     /* RM_0F01_REG_7 */
11030     { "swapgs",         { Skip_MODRM }, 0  },
11031     { "rdtscp",         { Skip_MODRM }, 0  },
11032     { "monitorx",       { { OP_Monitor, 0 } }, 0  },
11033     { "mwaitx",         { { OP_Mwaitx,  0 } }, 0  },
11034     { "clzero",         { Skip_MODRM }, 0  },
11035   },
11036   {
11037     /* RM_0F1E_MOD_3_REG_7 */
11038     { "nopQ",           { Ev }, 0 },
11039     { "nopQ",           { Ev }, 0 },
11040     { "endbr64",        { Skip_MODRM },  PREFIX_OPCODE },
11041     { "endbr32",        { Skip_MODRM },  PREFIX_OPCODE },
11042     { "nopQ",           { Ev }, 0 },
11043     { "nopQ",           { Ev }, 0 },
11044     { "nopQ",           { Ev }, 0 },
11045     { "nopQ",           { Ev }, 0 },
11046   },
11047   {
11048     /* RM_0FAE_REG_6 */
11049     { "mfence",         { Skip_MODRM }, 0 },
11050   },
11051   {
11052     /* RM_0FAE_REG_7 */
11053     { "sfence",         { Skip_MODRM }, 0 },
11054
11055   },
11056 };
11057
11058 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11059
11060 /* We use the high bit to indicate different name for the same
11061    prefix.  */
11062 #define REP_PREFIX      (0xf3 | 0x100)
11063 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11064 #define XRELEASE_PREFIX (0xf3 | 0x400)
11065 #define BND_PREFIX      (0xf2 | 0x400)
11066 #define NOTRACK_PREFIX  (0x3e | 0x100)
11067
11068 static int
11069 ckprefix (void)
11070 {
11071   int newrex, i, length;
11072   rex = 0;
11073   rex_ignored = 0;
11074   prefixes = 0;
11075   used_prefixes = 0;
11076   rex_used = 0;
11077   last_lock_prefix = -1;
11078   last_repz_prefix = -1;
11079   last_repnz_prefix = -1;
11080   last_data_prefix = -1;
11081   last_addr_prefix = -1;
11082   last_rex_prefix = -1;
11083   last_seg_prefix = -1;
11084   fwait_prefix = -1;
11085   active_seg_prefix = 0;
11086   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11087     all_prefixes[i] = 0;
11088   i = 0;
11089   length = 0;
11090   /* The maximum instruction length is 15bytes.  */
11091   while (length < MAX_CODE_LENGTH - 1)
11092     {
11093       FETCH_DATA (the_info, codep + 1);
11094       newrex = 0;
11095       switch (*codep)
11096         {
11097         /* REX prefixes family.  */
11098         case 0x40:
11099         case 0x41:
11100         case 0x42:
11101         case 0x43:
11102         case 0x44:
11103         case 0x45:
11104         case 0x46:
11105         case 0x47:
11106         case 0x48:
11107         case 0x49:
11108         case 0x4a:
11109         case 0x4b:
11110         case 0x4c:
11111         case 0x4d:
11112         case 0x4e:
11113         case 0x4f:
11114           if (address_mode == mode_64bit)
11115             newrex = *codep;
11116           else
11117             return 1;
11118           last_rex_prefix = i;
11119           break;
11120         case 0xf3:
11121           prefixes |= PREFIX_REPZ;
11122           last_repz_prefix = i;
11123           break;
11124         case 0xf2:
11125           prefixes |= PREFIX_REPNZ;
11126           last_repnz_prefix = i;
11127           break;
11128         case 0xf0:
11129           prefixes |= PREFIX_LOCK;
11130           last_lock_prefix = i;
11131           break;
11132         case 0x2e:
11133           prefixes |= PREFIX_CS;
11134           last_seg_prefix = i;
11135           active_seg_prefix = PREFIX_CS;
11136           break;
11137         case 0x36:
11138           prefixes |= PREFIX_SS;
11139           last_seg_prefix = i;
11140           active_seg_prefix = PREFIX_SS;
11141           break;
11142         case 0x3e:
11143           prefixes |= PREFIX_DS;
11144           last_seg_prefix = i;
11145           active_seg_prefix = PREFIX_DS;
11146           break;
11147         case 0x26:
11148           prefixes |= PREFIX_ES;
11149           last_seg_prefix = i;
11150           active_seg_prefix = PREFIX_ES;
11151           break;
11152         case 0x64:
11153           prefixes |= PREFIX_FS;
11154           last_seg_prefix = i;
11155           active_seg_prefix = PREFIX_FS;
11156           break;
11157         case 0x65:
11158           prefixes |= PREFIX_GS;
11159           last_seg_prefix = i;
11160           active_seg_prefix = PREFIX_GS;
11161           break;
11162         case 0x66:
11163           prefixes |= PREFIX_DATA;
11164           last_data_prefix = i;
11165           break;
11166         case 0x67:
11167           prefixes |= PREFIX_ADDR;
11168           last_addr_prefix = i;
11169           break;
11170         case FWAIT_OPCODE:
11171           /* fwait is really an instruction.  If there are prefixes
11172              before the fwait, they belong to the fwait, *not* to the
11173              following instruction.  */
11174           fwait_prefix = i;
11175           if (prefixes || rex)
11176             {
11177               prefixes |= PREFIX_FWAIT;
11178               codep++;
11179               /* This ensures that the previous REX prefixes are noticed
11180                  as unused prefixes, as in the return case below.  */
11181               rex_used = rex;
11182               return 1;
11183             }
11184           prefixes = PREFIX_FWAIT;
11185           break;
11186         default:
11187           return 1;
11188         }
11189       /* Rex is ignored when followed by another prefix.  */
11190       if (rex)
11191         {
11192           rex_used = rex;
11193           return 1;
11194         }
11195       if (*codep != FWAIT_OPCODE)
11196         all_prefixes[i++] = *codep;
11197       rex = newrex;
11198       codep++;
11199       length++;
11200     }
11201   return 0;
11202 }
11203
11204 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11205    prefix byte.  */
11206
11207 static const char *
11208 prefix_name (int pref, int sizeflag)
11209 {
11210   static const char *rexes [16] =
11211     {
11212       "rex",            /* 0x40 */
11213       "rex.B",          /* 0x41 */
11214       "rex.X",          /* 0x42 */
11215       "rex.XB",         /* 0x43 */
11216       "rex.R",          /* 0x44 */
11217       "rex.RB",         /* 0x45 */
11218       "rex.RX",         /* 0x46 */
11219       "rex.RXB",        /* 0x47 */
11220       "rex.W",          /* 0x48 */
11221       "rex.WB",         /* 0x49 */
11222       "rex.WX",         /* 0x4a */
11223       "rex.WXB",        /* 0x4b */
11224       "rex.WR",         /* 0x4c */
11225       "rex.WRB",        /* 0x4d */
11226       "rex.WRX",        /* 0x4e */
11227       "rex.WRXB",       /* 0x4f */
11228     };
11229
11230   switch (pref)
11231     {
11232     /* REX prefixes family.  */
11233     case 0x40:
11234     case 0x41:
11235     case 0x42:
11236     case 0x43:
11237     case 0x44:
11238     case 0x45:
11239     case 0x46:
11240     case 0x47:
11241     case 0x48:
11242     case 0x49:
11243     case 0x4a:
11244     case 0x4b:
11245     case 0x4c:
11246     case 0x4d:
11247     case 0x4e:
11248     case 0x4f:
11249       return rexes [pref - 0x40];
11250     case 0xf3:
11251       return "repz";
11252     case 0xf2:
11253       return "repnz";
11254     case 0xf0:
11255       return "lock";
11256     case 0x2e:
11257       return "cs";
11258     case 0x36:
11259       return "ss";
11260     case 0x3e:
11261       return "ds";
11262     case 0x26:
11263       return "es";
11264     case 0x64:
11265       return "fs";
11266     case 0x65:
11267       return "gs";
11268     case 0x66:
11269       return (sizeflag & DFLAG) ? "data16" : "data32";
11270     case 0x67:
11271       if (address_mode == mode_64bit)
11272         return (sizeflag & AFLAG) ? "addr32" : "addr64";
11273       else
11274         return (sizeflag & AFLAG) ? "addr16" : "addr32";
11275     case FWAIT_OPCODE:
11276       return "fwait";
11277     case REP_PREFIX:
11278       return "rep";
11279     case XACQUIRE_PREFIX:
11280       return "xacquire";
11281     case XRELEASE_PREFIX:
11282       return "xrelease";
11283     case BND_PREFIX:
11284       return "bnd";
11285     case NOTRACK_PREFIX:
11286       return "notrack";
11287     default:
11288       return NULL;
11289     }
11290 }
11291
11292 static char op_out[MAX_OPERANDS][100];
11293 static int op_ad, op_index[MAX_OPERANDS];
11294 static int two_source_ops;
11295 static bfd_vma op_address[MAX_OPERANDS];
11296 static bfd_vma op_riprel[MAX_OPERANDS];
11297 static bfd_vma start_pc;
11298
11299 /*
11300  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11301  *   (see topic "Redundant prefixes" in the "Differences from 8086"
11302  *   section of the "Virtual 8086 Mode" chapter.)
11303  * 'pc' should be the address of this instruction, it will
11304  *   be used to print the target address if this is a relative jump or call
11305  * The function returns the length of this instruction in bytes.
11306  */
11307
11308 static char intel_syntax;
11309 static char intel_mnemonic = !SYSV386_COMPAT;
11310 static char open_char;
11311 static char close_char;
11312 static char separator_char;
11313 static char scale_char;
11314
11315 enum x86_64_isa
11316 {
11317   amd64 = 0,
11318   intel64
11319 };
11320
11321 static enum x86_64_isa isa64;
11322
11323 /* Here for backwards compatibility.  When gdb stops using
11324    print_insn_i386_att and print_insn_i386_intel these functions can
11325    disappear, and print_insn_i386 be merged into print_insn.  */
11326 int
11327 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11328 {
11329   intel_syntax = 0;
11330
11331   return print_insn (pc, info);
11332 }
11333
11334 int
11335 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11336 {
11337   intel_syntax = 1;
11338
11339   return print_insn (pc, info);
11340 }
11341
11342 int
11343 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11344 {
11345   intel_syntax = -1;
11346
11347   return print_insn (pc, info);
11348 }
11349
11350 void
11351 print_i386_disassembler_options (FILE *stream)
11352 {
11353   fprintf (stream, _("\n\
11354 The following i386/x86-64 specific disassembler options are supported for use\n\
11355 with the -M switch (multiple options should be separated by commas):\n"));
11356
11357   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
11358   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
11359   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
11360   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
11361   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
11362   fprintf (stream, _("  att-mnemonic\n"
11363                      "              Display instruction in AT&T mnemonic\n"));
11364   fprintf (stream, _("  intel-mnemonic\n"
11365                      "              Display instruction in Intel mnemonic\n"));
11366   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
11367   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
11368   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
11369   fprintf (stream, _("  data32      Assume 32bit data size\n"));
11370   fprintf (stream, _("  data16      Assume 16bit data size\n"));
11371   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
11372   fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
11373   fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
11374 }
11375
11376 /* Bad opcode.  */
11377 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11378
11379 /* Get a pointer to struct dis386 with a valid name.  */
11380
11381 static const struct dis386 *
11382 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11383 {
11384   int vindex, vex_table_index;
11385
11386   if (dp->name != NULL)
11387     return dp;
11388
11389   switch (dp->op[0].bytemode)
11390     {
11391     case USE_REG_TABLE:
11392       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11393       break;
11394
11395     case USE_MOD_TABLE:
11396       vindex = modrm.mod == 0x3 ? 1 : 0;
11397       dp = &mod_table[dp->op[1].bytemode][vindex];
11398       break;
11399
11400     case USE_RM_TABLE:
11401       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11402       break;
11403
11404     case USE_PREFIX_TABLE:
11405       if (need_vex)
11406         {
11407           /* The prefix in VEX is implicit.  */
11408           switch (vex.prefix)
11409             {
11410             case 0:
11411               vindex = 0;
11412               break;
11413             case REPE_PREFIX_OPCODE:
11414               vindex = 1;
11415               break;
11416             case DATA_PREFIX_OPCODE:
11417               vindex = 2;
11418               break;
11419             case REPNE_PREFIX_OPCODE:
11420               vindex = 3;
11421               break;
11422             default:
11423               abort ();
11424               break;
11425             }
11426         }
11427       else
11428         {
11429           int last_prefix = -1;
11430           int prefix = 0;
11431           vindex = 0;
11432           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11433              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11434              last one wins.  */
11435           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11436             {
11437               if (last_repz_prefix > last_repnz_prefix)
11438                 {
11439                   vindex = 1;
11440                   prefix = PREFIX_REPZ;
11441                   last_prefix = last_repz_prefix;
11442                 }
11443               else
11444                 {
11445                   vindex = 3;
11446                   prefix = PREFIX_REPNZ;
11447                   last_prefix = last_repnz_prefix;
11448                 }
11449
11450               /* Check if prefix should be ignored.  */
11451               if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11452                      & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11453                    & prefix) != 0)
11454                 vindex = 0;
11455             }
11456
11457           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11458             {
11459               vindex = 2;
11460               prefix = PREFIX_DATA;
11461               last_prefix = last_data_prefix;
11462             }
11463
11464           if (vindex != 0)
11465             {
11466               used_prefixes |= prefix;
11467               all_prefixes[last_prefix] = 0;
11468             }
11469         }
11470       dp = &prefix_table[dp->op[1].bytemode][vindex];
11471       break;
11472
11473     case USE_X86_64_TABLE:
11474       vindex = address_mode == mode_64bit ? 1 : 0;
11475       dp = &x86_64_table[dp->op[1].bytemode][vindex];
11476       break;
11477
11478     case USE_3BYTE_TABLE:
11479       FETCH_DATA (info, codep + 2);
11480       vindex = *codep++;
11481       dp = &three_byte_table[dp->op[1].bytemode][vindex];
11482       end_codep = codep;
11483       modrm.mod = (*codep >> 6) & 3;
11484       modrm.reg = (*codep >> 3) & 7;
11485       modrm.rm = *codep & 7;
11486       break;
11487
11488     case USE_VEX_LEN_TABLE:
11489       if (!need_vex)
11490         abort ();
11491
11492       switch (vex.length)
11493         {
11494         case 128:
11495           vindex = 0;
11496           break;
11497         case 256:
11498           vindex = 1;
11499           break;
11500         default:
11501           abort ();
11502           break;
11503         }
11504
11505       dp = &vex_len_table[dp->op[1].bytemode][vindex];
11506       break;
11507
11508     case USE_EVEX_LEN_TABLE:
11509       if (!vex.evex)
11510         abort ();
11511
11512       switch (vex.length)
11513         {
11514         case 128:
11515           vindex = 0;
11516           break;
11517         case 256:
11518           vindex = 1;
11519           break;
11520         case 512:
11521           vindex = 2;
11522           break;
11523         default:
11524           abort ();
11525           break;
11526         }
11527
11528       dp = &evex_len_table[dp->op[1].bytemode][vindex];
11529       break;
11530
11531     case USE_XOP_8F_TABLE:
11532       FETCH_DATA (info, codep + 3);
11533       /* All bits in the REX prefix are ignored.  */
11534       rex_ignored = rex;
11535       rex = ~(*codep >> 5) & 0x7;
11536
11537       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
11538       switch ((*codep & 0x1f))
11539         {
11540         default:
11541           dp = &bad_opcode;
11542           return dp;
11543         case 0x8:
11544           vex_table_index = XOP_08;
11545           break;
11546         case 0x9:
11547           vex_table_index = XOP_09;
11548           break;
11549         case 0xa:
11550           vex_table_index = XOP_0A;
11551           break;
11552         }
11553       codep++;
11554       vex.w = *codep & 0x80;
11555       if (vex.w && address_mode == mode_64bit)
11556         rex |= REX_W;
11557
11558       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11559       if (address_mode != mode_64bit)
11560         {
11561           /* In 16/32-bit mode REX_B is silently ignored.  */
11562           rex &= ~REX_B;
11563         }
11564
11565       vex.length = (*codep & 0x4) ? 256 : 128;
11566       switch ((*codep & 0x3))
11567         {
11568         case 0:
11569           break;
11570         case 1:
11571           vex.prefix = DATA_PREFIX_OPCODE;
11572           break;
11573         case 2:
11574           vex.prefix = REPE_PREFIX_OPCODE;
11575           break;
11576         case 3:
11577           vex.prefix = REPNE_PREFIX_OPCODE;
11578           break;
11579         }
11580       need_vex = 1;
11581       need_vex_reg = 1;
11582       codep++;
11583       vindex = *codep++;
11584       dp = &xop_table[vex_table_index][vindex];
11585
11586       end_codep = codep;
11587       FETCH_DATA (info, codep + 1);
11588       modrm.mod = (*codep >> 6) & 3;
11589       modrm.reg = (*codep >> 3) & 7;
11590       modrm.rm = *codep & 7;
11591       break;
11592
11593     case USE_VEX_C4_TABLE:
11594       /* VEX prefix.  */
11595       FETCH_DATA (info, codep + 3);
11596       /* All bits in the REX prefix are ignored.  */
11597       rex_ignored = rex;
11598       rex = ~(*codep >> 5) & 0x7;
11599       switch ((*codep & 0x1f))
11600         {
11601         default:
11602           dp = &bad_opcode;
11603           return dp;
11604         case 0x1:
11605           vex_table_index = VEX_0F;
11606           break;
11607         case 0x2:
11608           vex_table_index = VEX_0F38;
11609           break;
11610         case 0x3:
11611           vex_table_index = VEX_0F3A;
11612           break;
11613         }
11614       codep++;
11615       vex.w = *codep & 0x80;
11616       if (address_mode == mode_64bit)
11617         {
11618           if (vex.w)
11619             rex |= REX_W;
11620         }
11621       else
11622         {
11623           /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11624              is ignored, other REX bits are 0 and the highest bit in
11625              VEX.vvvv is also ignored (but we mustn't clear it here).  */
11626           rex = 0;
11627         }
11628       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11629       vex.length = (*codep & 0x4) ? 256 : 128;
11630       switch ((*codep & 0x3))
11631         {
11632         case 0:
11633           break;
11634         case 1:
11635           vex.prefix = DATA_PREFIX_OPCODE;
11636           break;
11637         case 2:
11638           vex.prefix = REPE_PREFIX_OPCODE;
11639           break;
11640         case 3:
11641           vex.prefix = REPNE_PREFIX_OPCODE;
11642           break;
11643         }
11644       need_vex = 1;
11645       need_vex_reg = 1;
11646       codep++;
11647       vindex = *codep++;
11648       dp = &vex_table[vex_table_index][vindex];
11649       end_codep = codep;
11650       /* There is no MODRM byte for VEX0F 77.  */
11651       if (vex_table_index != VEX_0F || vindex != 0x77)
11652         {
11653           FETCH_DATA (info, codep + 1);
11654           modrm.mod = (*codep >> 6) & 3;
11655           modrm.reg = (*codep >> 3) & 7;
11656           modrm.rm = *codep & 7;
11657         }
11658       break;
11659
11660     case USE_VEX_C5_TABLE:
11661       /* VEX prefix.  */
11662       FETCH_DATA (info, codep + 2);
11663       /* All bits in the REX prefix are ignored.  */
11664       rex_ignored = rex;
11665       rex = (*codep & 0x80) ? 0 : REX_R;
11666
11667       /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11668          VEX.vvvv is 1.  */
11669       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11670       vex.length = (*codep & 0x4) ? 256 : 128;
11671       switch ((*codep & 0x3))
11672         {
11673         case 0:
11674           break;
11675         case 1:
11676           vex.prefix = DATA_PREFIX_OPCODE;
11677           break;
11678         case 2:
11679           vex.prefix = REPE_PREFIX_OPCODE;
11680           break;
11681         case 3:
11682           vex.prefix = REPNE_PREFIX_OPCODE;
11683           break;
11684         }
11685       need_vex = 1;
11686       need_vex_reg = 1;
11687       codep++;
11688       vindex = *codep++;
11689       dp = &vex_table[dp->op[1].bytemode][vindex];
11690       end_codep = codep;
11691       /* There is no MODRM byte for VEX 77.  */
11692       if (vindex != 0x77)
11693         {
11694           FETCH_DATA (info, codep + 1);
11695           modrm.mod = (*codep >> 6) & 3;
11696           modrm.reg = (*codep >> 3) & 7;
11697           modrm.rm = *codep & 7;
11698         }
11699       break;
11700
11701     case USE_VEX_W_TABLE:
11702       if (!need_vex)
11703         abort ();
11704
11705       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11706       break;
11707
11708     case USE_EVEX_TABLE:
11709       two_source_ops = 0;
11710       /* EVEX prefix.  */
11711       vex.evex = 1;
11712       FETCH_DATA (info, codep + 4);
11713       /* All bits in the REX prefix are ignored.  */
11714       rex_ignored = rex;
11715       /* The first byte after 0x62.  */
11716       rex = ~(*codep >> 5) & 0x7;
11717       vex.r = *codep & 0x10;
11718       switch ((*codep & 0xf))
11719         {
11720         default:
11721           return &bad_opcode;
11722         case 0x1:
11723           vex_table_index = EVEX_0F;
11724           break;
11725         case 0x2:
11726           vex_table_index = EVEX_0F38;
11727           break;
11728         case 0x3:
11729           vex_table_index = EVEX_0F3A;
11730           break;
11731         }
11732
11733       /* The second byte after 0x62.  */
11734       codep++;
11735       vex.w = *codep & 0x80;
11736       if (vex.w && address_mode == mode_64bit)
11737         rex |= REX_W;
11738
11739       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11740
11741       /* The U bit.  */
11742       if (!(*codep & 0x4))
11743         return &bad_opcode;
11744
11745       switch ((*codep & 0x3))
11746         {
11747         case 0:
11748           break;
11749         case 1:
11750           vex.prefix = DATA_PREFIX_OPCODE;
11751           break;
11752         case 2:
11753           vex.prefix = REPE_PREFIX_OPCODE;
11754           break;
11755         case 3:
11756           vex.prefix = REPNE_PREFIX_OPCODE;
11757           break;
11758         }
11759
11760       /* The third byte after 0x62.  */
11761       codep++;
11762
11763       /* Remember the static rounding bits.  */
11764       vex.ll = (*codep >> 5) & 3;
11765       vex.b = (*codep & 0x10) != 0;
11766
11767       vex.v = *codep & 0x8;
11768       vex.mask_register_specifier = *codep & 0x7;
11769       vex.zeroing = *codep & 0x80;
11770
11771       if (address_mode != mode_64bit)
11772         {
11773           /* In 16/32-bit mode silently ignore following bits.  */
11774           rex &= ~REX_B;
11775           vex.r = 1;
11776           vex.v = 1;
11777         }
11778
11779       need_vex = 1;
11780       need_vex_reg = 1;
11781       codep++;
11782       vindex = *codep++;
11783       dp = &evex_table[vex_table_index][vindex];
11784       end_codep = codep;
11785       FETCH_DATA (info, codep + 1);
11786       modrm.mod = (*codep >> 6) & 3;
11787       modrm.reg = (*codep >> 3) & 7;
11788       modrm.rm = *codep & 7;
11789
11790       /* Set vector length.  */
11791       if (modrm.mod == 3 && vex.b)
11792         vex.length = 512;
11793       else
11794         {
11795           switch (vex.ll)
11796             {
11797             case 0x0:
11798               vex.length = 128;
11799               break;
11800             case 0x1:
11801               vex.length = 256;
11802               break;
11803             case 0x2:
11804               vex.length = 512;
11805               break;
11806             default:
11807               return &bad_opcode;
11808             }
11809         }
11810       break;
11811
11812     case 0:
11813       dp = &bad_opcode;
11814       break;
11815
11816     default:
11817       abort ();
11818     }
11819
11820   if (dp->name != NULL)
11821     return dp;
11822   else
11823     return get_valid_dis386 (dp, info);
11824 }
11825
11826 static void
11827 get_sib (disassemble_info *info, int sizeflag)
11828 {
11829   /* If modrm.mod == 3, operand must be register.  */
11830   if (need_modrm
11831       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11832       && modrm.mod != 3
11833       && modrm.rm == 4)
11834     {
11835       FETCH_DATA (info, codep + 2);
11836       sib.index = (codep [1] >> 3) & 7;
11837       sib.scale = (codep [1] >> 6) & 3;
11838       sib.base = codep [1] & 7;
11839     }
11840 }
11841
11842 static int
11843 print_insn (bfd_vma pc, disassemble_info *info)
11844 {
11845   const struct dis386 *dp;
11846   int i;
11847   char *op_txt[MAX_OPERANDS];
11848   int needcomma;
11849   int sizeflag, orig_sizeflag;
11850   const char *p;
11851   struct dis_private priv;
11852   int prefix_length;
11853
11854   priv.orig_sizeflag = AFLAG | DFLAG;
11855   if ((info->mach & bfd_mach_i386_i386) != 0)
11856     address_mode = mode_32bit;
11857   else if (info->mach == bfd_mach_i386_i8086)
11858     {
11859       address_mode = mode_16bit;
11860       priv.orig_sizeflag = 0;
11861     }
11862   else
11863     address_mode = mode_64bit;
11864
11865   if (intel_syntax == (char) -1)
11866     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11867
11868   for (p = info->disassembler_options; p != NULL; )
11869     {
11870       if (CONST_STRNEQ (p, "amd64"))
11871         isa64 = amd64;
11872       else if (CONST_STRNEQ (p, "intel64"))
11873         isa64 = intel64;
11874       else if (CONST_STRNEQ (p, "x86-64"))
11875         {
11876           address_mode = mode_64bit;
11877           priv.orig_sizeflag = AFLAG | DFLAG;
11878         }
11879       else if (CONST_STRNEQ (p, "i386"))
11880         {
11881           address_mode = mode_32bit;
11882           priv.orig_sizeflag = AFLAG | DFLAG;
11883         }
11884       else if (CONST_STRNEQ (p, "i8086"))
11885         {
11886           address_mode = mode_16bit;
11887           priv.orig_sizeflag = 0;
11888         }
11889       else if (CONST_STRNEQ (p, "intel"))
11890         {
11891           intel_syntax = 1;
11892           if (CONST_STRNEQ (p + 5, "-mnemonic"))
11893             intel_mnemonic = 1;
11894         }
11895       else if (CONST_STRNEQ (p, "att"))
11896         {
11897           intel_syntax = 0;
11898           if (CONST_STRNEQ (p + 3, "-mnemonic"))
11899             intel_mnemonic = 0;
11900         }
11901       else if (CONST_STRNEQ (p, "addr"))
11902         {
11903           if (address_mode == mode_64bit)
11904             {
11905               if (p[4] == '3' && p[5] == '2')
11906                 priv.orig_sizeflag &= ~AFLAG;
11907               else if (p[4] == '6' && p[5] == '4')
11908                 priv.orig_sizeflag |= AFLAG;
11909             }
11910           else
11911             {
11912               if (p[4] == '1' && p[5] == '6')
11913                 priv.orig_sizeflag &= ~AFLAG;
11914               else if (p[4] == '3' && p[5] == '2')
11915                 priv.orig_sizeflag |= AFLAG;
11916             }
11917         }
11918       else if (CONST_STRNEQ (p, "data"))
11919         {
11920           if (p[4] == '1' && p[5] == '6')
11921             priv.orig_sizeflag &= ~DFLAG;
11922           else if (p[4] == '3' && p[5] == '2')
11923             priv.orig_sizeflag |= DFLAG;
11924         }
11925       else if (CONST_STRNEQ (p, "suffix"))
11926         priv.orig_sizeflag |= SUFFIX_ALWAYS;
11927
11928       p = strchr (p, ',');
11929       if (p != NULL)
11930         p++;
11931     }
11932
11933   if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11934     {
11935       (*info->fprintf_func) (info->stream,
11936                              _("64-bit address is disabled"));
11937       return -1;
11938     }
11939
11940   if (intel_syntax)
11941     {
11942       names64 = intel_names64;
11943       names32 = intel_names32;
11944       names16 = intel_names16;
11945       names8 = intel_names8;
11946       names8rex = intel_names8rex;
11947       names_seg = intel_names_seg;
11948       names_mm = intel_names_mm;
11949       names_bnd = intel_names_bnd;
11950       names_xmm = intel_names_xmm;
11951       names_ymm = intel_names_ymm;
11952       names_zmm = intel_names_zmm;
11953       index64 = intel_index64;
11954       index32 = intel_index32;
11955       names_mask = intel_names_mask;
11956       index16 = intel_index16;
11957       open_char = '[';
11958       close_char = ']';
11959       separator_char = '+';
11960       scale_char = '*';
11961     }
11962   else
11963     {
11964       names64 = att_names64;
11965       names32 = att_names32;
11966       names16 = att_names16;
11967       names8 = att_names8;
11968       names8rex = att_names8rex;
11969       names_seg = att_names_seg;
11970       names_mm = att_names_mm;
11971       names_bnd = att_names_bnd;
11972       names_xmm = att_names_xmm;
11973       names_ymm = att_names_ymm;
11974       names_zmm = att_names_zmm;
11975       index64 = att_index64;
11976       index32 = att_index32;
11977       names_mask = att_names_mask;
11978       index16 = att_index16;
11979       open_char = '(';
11980       close_char =  ')';
11981       separator_char = ',';
11982       scale_char = ',';
11983     }
11984
11985   /* The output looks better if we put 7 bytes on a line, since that
11986      puts most long word instructions on a single line.  Use 8 bytes
11987      for Intel L1OM.  */
11988   if ((info->mach & bfd_mach_l1om) != 0)
11989     info->bytes_per_line = 8;
11990   else
11991     info->bytes_per_line = 7;
11992
11993   info->private_data = &priv;
11994   priv.max_fetched = priv.the_buffer;
11995   priv.insn_start = pc;
11996
11997   obuf[0] = 0;
11998   for (i = 0; i < MAX_OPERANDS; ++i)
11999     {
12000       op_out[i][0] = 0;
12001       op_index[i] = -1;
12002     }
12003
12004   the_info = info;
12005   start_pc = pc;
12006   start_codep = priv.the_buffer;
12007   codep = priv.the_buffer;
12008
12009   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12010     {
12011       const char *name;
12012
12013       /* Getting here means we tried for data but didn't get it.  That
12014          means we have an incomplete instruction of some sort.  Just
12015          print the first byte as a prefix or a .byte pseudo-op.  */
12016       if (codep > priv.the_buffer)
12017         {
12018           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12019           if (name != NULL)
12020             (*info->fprintf_func) (info->stream, "%s", name);
12021           else
12022             {
12023               /* Just print the first byte as a .byte instruction.  */
12024               (*info->fprintf_func) (info->stream, ".byte 0x%x",
12025                                      (unsigned int) priv.the_buffer[0]);
12026             }
12027
12028           return 1;
12029         }
12030
12031       return -1;
12032     }
12033
12034   obufp = obuf;
12035   sizeflag = priv.orig_sizeflag;
12036
12037   if (!ckprefix () || rex_used)
12038     {
12039       /* Too many prefixes or unused REX prefixes.  */
12040       for (i = 0;
12041            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12042            i++)
12043         (*info->fprintf_func) (info->stream, "%s%s",
12044                                i == 0 ? "" : " ",
12045                                prefix_name (all_prefixes[i], sizeflag));
12046       return i;
12047     }
12048
12049   insn_codep = codep;
12050
12051   FETCH_DATA (info, codep + 1);
12052   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12053
12054   if (((prefixes & PREFIX_FWAIT)
12055        && ((*codep < 0xd8) || (*codep > 0xdf))))
12056     {
12057       /* Handle prefixes before fwait.  */
12058       for (i = 0; i < fwait_prefix && all_prefixes[i];
12059            i++)
12060         (*info->fprintf_func) (info->stream, "%s ",
12061                                prefix_name (all_prefixes[i], sizeflag));
12062       (*info->fprintf_func) (info->stream, "fwait");
12063       return i + 1;
12064     }
12065
12066   if (*codep == 0x0f)
12067     {
12068       unsigned char threebyte;
12069
12070       codep++;
12071       FETCH_DATA (info, codep + 1);
12072       threebyte = *codep;
12073       dp = &dis386_twobyte[threebyte];
12074       need_modrm = twobyte_has_modrm[*codep];
12075       codep++;
12076     }
12077   else
12078     {
12079       dp = &dis386[*codep];
12080       need_modrm = onebyte_has_modrm[*codep];
12081       codep++;
12082     }
12083
12084   /* Save sizeflag for printing the extra prefixes later before updating
12085      it for mnemonic and operand processing.  The prefix names depend
12086      only on the address mode.  */
12087   orig_sizeflag = sizeflag;
12088   if (prefixes & PREFIX_ADDR)
12089     sizeflag ^= AFLAG;
12090   if ((prefixes & PREFIX_DATA))
12091     sizeflag ^= DFLAG;
12092
12093   end_codep = codep;
12094   if (need_modrm)
12095     {
12096       FETCH_DATA (info, codep + 1);
12097       modrm.mod = (*codep >> 6) & 3;
12098       modrm.reg = (*codep >> 3) & 7;
12099       modrm.rm = *codep & 7;
12100     }
12101
12102   need_vex = 0;
12103   need_vex_reg = 0;
12104   vex_w_done = 0;
12105   memset (&vex, 0, sizeof (vex));
12106
12107   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12108     {
12109       get_sib (info, sizeflag);
12110       dofloat (sizeflag);
12111     }
12112   else
12113     {
12114       dp = get_valid_dis386 (dp, info);
12115       if (dp != NULL && putop (dp->name, sizeflag) == 0)
12116         {
12117           get_sib (info, sizeflag);
12118           for (i = 0; i < MAX_OPERANDS; ++i)
12119             {
12120               obufp = op_out[i];
12121               op_ad = MAX_OPERANDS - 1 - i;
12122               if (dp->op[i].rtn)
12123                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12124               /* For EVEX instruction after the last operand masking
12125                  should be printed.  */
12126               if (i == 0 && vex.evex)
12127                 {
12128                   /* Don't print {%k0}.  */
12129                   if (vex.mask_register_specifier)
12130                     {
12131                       oappend ("{");
12132                       oappend (names_mask[vex.mask_register_specifier]);
12133                       oappend ("}");
12134                     }
12135                   if (vex.zeroing)
12136                     oappend ("{z}");
12137                 }
12138             }
12139         }
12140     }
12141
12142   /* Check if the REX prefix is used.  */
12143   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12144     all_prefixes[last_rex_prefix] = 0;
12145
12146   /* Check if the SEG prefix is used.  */
12147   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12148                    | PREFIX_FS | PREFIX_GS)) != 0
12149       && (used_prefixes & active_seg_prefix) != 0)
12150     all_prefixes[last_seg_prefix] = 0;
12151
12152   /* Check if the ADDR prefix is used.  */
12153   if ((prefixes & PREFIX_ADDR) != 0
12154       && (used_prefixes & PREFIX_ADDR) != 0)
12155     all_prefixes[last_addr_prefix] = 0;
12156
12157   /* Check if the DATA prefix is used.  */
12158   if ((prefixes & PREFIX_DATA) != 0
12159       && (used_prefixes & PREFIX_DATA) != 0)
12160     all_prefixes[last_data_prefix] = 0;
12161
12162   /* Print the extra prefixes.  */
12163   prefix_length = 0;
12164   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12165     if (all_prefixes[i])
12166       {
12167         const char *name;
12168         name = prefix_name (all_prefixes[i], orig_sizeflag);
12169         if (name == NULL)
12170           abort ();
12171         prefix_length += strlen (name) + 1;
12172         (*info->fprintf_func) (info->stream, "%s ", name);
12173       }
12174
12175   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12176      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
12177      used by putop and MMX/SSE operand and may be overriden by the
12178      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12179      separately.  */
12180   if (dp->prefix_requirement == PREFIX_OPCODE
12181       && dp != &bad_opcode
12182       && (((prefixes
12183             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12184            && (used_prefixes
12185                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12186           || ((((prefixes
12187                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12188                 == PREFIX_DATA)
12189                && (used_prefixes & PREFIX_DATA) == 0))))
12190     {
12191       (*info->fprintf_func) (info->stream, "(bad)");
12192       return end_codep - priv.the_buffer;
12193     }
12194
12195   /* Check maximum code length.  */
12196   if ((codep - start_codep) > MAX_CODE_LENGTH)
12197     {
12198       (*info->fprintf_func) (info->stream, "(bad)");
12199       return MAX_CODE_LENGTH;
12200     }
12201
12202   obufp = mnemonicendp;
12203   for (i = strlen (obuf) + prefix_length; i < 6; i++)
12204     oappend (" ");
12205   oappend (" ");
12206   (*info->fprintf_func) (info->stream, "%s", obuf);
12207
12208   /* The enter and bound instructions are printed with operands in the same
12209      order as the intel book; everything else is printed in reverse order.  */
12210   if (intel_syntax || two_source_ops)
12211     {
12212       bfd_vma riprel;
12213
12214       for (i = 0; i < MAX_OPERANDS; ++i)
12215         op_txt[i] = op_out[i];
12216
12217       if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12218           && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12219         {
12220           op_txt[2] = op_out[3];
12221           op_txt[3] = op_out[2];
12222         }
12223
12224       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12225         {
12226           op_ad = op_index[i];
12227           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12228           op_index[MAX_OPERANDS - 1 - i] = op_ad;
12229           riprel = op_riprel[i];
12230           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12231           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12232         }
12233     }
12234   else
12235     {
12236       for (i = 0; i < MAX_OPERANDS; ++i)
12237         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12238     }
12239
12240   needcomma = 0;
12241   for (i = 0; i < MAX_OPERANDS; ++i)
12242     if (*op_txt[i])
12243       {
12244         if (needcomma)
12245           (*info->fprintf_func) (info->stream, ",");
12246         if (op_index[i] != -1 && !op_riprel[i])
12247           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12248         else
12249           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12250         needcomma = 1;
12251       }
12252
12253   for (i = 0; i < MAX_OPERANDS; i++)
12254     if (op_index[i] != -1 && op_riprel[i])
12255       {
12256         (*info->fprintf_func) (info->stream, "        # ");
12257         (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12258                                                 + op_address[op_index[i]]), info);
12259         break;
12260       }
12261   return codep - priv.the_buffer;
12262 }
12263
12264 static const char *float_mem[] = {
12265   /* d8 */
12266   "fadd{s|}",
12267   "fmul{s|}",
12268   "fcom{s|}",
12269   "fcomp{s|}",
12270   "fsub{s|}",
12271   "fsubr{s|}",
12272   "fdiv{s|}",
12273   "fdivr{s|}",
12274   /* d9 */
12275   "fld{s|}",
12276   "(bad)",
12277   "fst{s|}",
12278   "fstp{s|}",
12279   "fldenvIC",
12280   "fldcw",
12281   "fNstenvIC",
12282   "fNstcw",
12283   /* da */
12284   "fiadd{l|}",
12285   "fimul{l|}",
12286   "ficom{l|}",
12287   "ficomp{l|}",
12288   "fisub{l|}",
12289   "fisubr{l|}",
12290   "fidiv{l|}",
12291   "fidivr{l|}",
12292   /* db */
12293   "fild{l|}",
12294   "fisttp{l|}",
12295   "fist{l|}",
12296   "fistp{l|}",
12297   "(bad)",
12298   "fld{t||t|}",
12299   "(bad)",
12300   "fstp{t||t|}",
12301   /* dc */
12302   "fadd{l|}",
12303   "fmul{l|}",
12304   "fcom{l|}",
12305   "fcomp{l|}",
12306   "fsub{l|}",
12307   "fsubr{l|}",
12308   "fdiv{l|}",
12309   "fdivr{l|}",
12310   /* dd */
12311   "fld{l|}",
12312   "fisttp{ll|}",
12313   "fst{l||}",
12314   "fstp{l|}",
12315   "frstorIC",
12316   "(bad)",
12317   "fNsaveIC",
12318   "fNstsw",
12319   /* de */
12320   "fiadd{s|}",
12321   "fimul{s|}",
12322   "ficom{s|}",
12323   "ficomp{s|}",
12324   "fisub{s|}",
12325   "fisubr{s|}",
12326   "fidiv{s|}",
12327   "fidivr{s|}",
12328   /* df */
12329   "fild{s|}",
12330   "fisttp{s|}",
12331   "fist{s|}",
12332   "fistp{s|}",
12333   "fbld",
12334   "fild{ll|}",
12335   "fbstp",
12336   "fistp{ll|}",
12337 };
12338
12339 static const unsigned char float_mem_mode[] = {
12340   /* d8 */
12341   d_mode,
12342   d_mode,
12343   d_mode,
12344   d_mode,
12345   d_mode,
12346   d_mode,
12347   d_mode,
12348   d_mode,
12349   /* d9 */
12350   d_mode,
12351   0,
12352   d_mode,
12353   d_mode,
12354   0,
12355   w_mode,
12356   0,
12357   w_mode,
12358   /* da */
12359   d_mode,
12360   d_mode,
12361   d_mode,
12362   d_mode,
12363   d_mode,
12364   d_mode,
12365   d_mode,
12366   d_mode,
12367   /* db */
12368   d_mode,
12369   d_mode,
12370   d_mode,
12371   d_mode,
12372   0,
12373   t_mode,
12374   0,
12375   t_mode,
12376   /* dc */
12377   q_mode,
12378   q_mode,
12379   q_mode,
12380   q_mode,
12381   q_mode,
12382   q_mode,
12383   q_mode,
12384   q_mode,
12385   /* dd */
12386   q_mode,
12387   q_mode,
12388   q_mode,
12389   q_mode,
12390   0,
12391   0,
12392   0,
12393   w_mode,
12394   /* de */
12395   w_mode,
12396   w_mode,
12397   w_mode,
12398   w_mode,
12399   w_mode,
12400   w_mode,
12401   w_mode,
12402   w_mode,
12403   /* df */
12404   w_mode,
12405   w_mode,
12406   w_mode,
12407   w_mode,
12408   t_mode,
12409   q_mode,
12410   t_mode,
12411   q_mode
12412 };
12413
12414 #define ST { OP_ST, 0 }
12415 #define STi { OP_STi, 0 }
12416
12417 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12418 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12419 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12420 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12421 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12422 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12423 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12424 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12425 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12426
12427 static const struct dis386 float_reg[][8] = {
12428   /* d8 */
12429   {
12430     { "fadd",   { ST, STi }, 0 },
12431     { "fmul",   { ST, STi }, 0 },
12432     { "fcom",   { STi }, 0 },
12433     { "fcomp",  { STi }, 0 },
12434     { "fsub",   { ST, STi }, 0 },
12435     { "fsubr",  { ST, STi }, 0 },
12436     { "fdiv",   { ST, STi }, 0 },
12437     { "fdivr",  { ST, STi }, 0 },
12438   },
12439   /* d9 */
12440   {
12441     { "fld",    { STi }, 0 },
12442     { "fxch",   { STi }, 0 },
12443     { FGRPd9_2 },
12444     { Bad_Opcode },
12445     { FGRPd9_4 },
12446     { FGRPd9_5 },
12447     { FGRPd9_6 },
12448     { FGRPd9_7 },
12449   },
12450   /* da */
12451   {
12452     { "fcmovb", { ST, STi }, 0 },
12453     { "fcmove", { ST, STi }, 0 },
12454     { "fcmovbe",{ ST, STi }, 0 },
12455     { "fcmovu", { ST, STi }, 0 },
12456     { Bad_Opcode },
12457     { FGRPda_5 },
12458     { Bad_Opcode },
12459     { Bad_Opcode },
12460   },
12461   /* db */
12462   {
12463     { "fcmovnb",{ ST, STi }, 0 },
12464     { "fcmovne",{ ST, STi }, 0 },
12465     { "fcmovnbe",{ ST, STi }, 0 },
12466     { "fcmovnu",{ ST, STi }, 0 },
12467     { FGRPdb_4 },
12468     { "fucomi", { ST, STi }, 0 },
12469     { "fcomi",  { ST, STi }, 0 },
12470     { Bad_Opcode },
12471   },
12472   /* dc */
12473   {
12474     { "fadd",   { STi, ST }, 0 },
12475     { "fmul",   { STi, ST }, 0 },
12476     { Bad_Opcode },
12477     { Bad_Opcode },
12478     { "fsub{!M|r}",     { STi, ST }, 0 },
12479     { "fsub{M|}",       { STi, ST }, 0 },
12480     { "fdiv{!M|r}",     { STi, ST }, 0 },
12481     { "fdiv{M|}",       { STi, ST }, 0 },
12482   },
12483   /* dd */
12484   {
12485     { "ffree",  { STi }, 0 },
12486     { Bad_Opcode },
12487     { "fst",    { STi }, 0 },
12488     { "fstp",   { STi }, 0 },
12489     { "fucom",  { STi }, 0 },
12490     { "fucomp", { STi }, 0 },
12491     { Bad_Opcode },
12492     { Bad_Opcode },
12493   },
12494   /* de */
12495   {
12496     { "faddp",  { STi, ST }, 0 },
12497     { "fmulp",  { STi, ST }, 0 },
12498     { Bad_Opcode },
12499     { FGRPde_3 },
12500     { "fsub{!M|r}p",    { STi, ST }, 0 },
12501     { "fsub{M|}p",      { STi, ST }, 0 },
12502     { "fdiv{!M|r}p",    { STi, ST }, 0 },
12503     { "fdiv{M|}p",      { STi, ST }, 0 },
12504   },
12505   /* df */
12506   {
12507     { "ffreep", { STi }, 0 },
12508     { Bad_Opcode },
12509     { Bad_Opcode },
12510     { Bad_Opcode },
12511     { FGRPdf_4 },
12512     { "fucomip", { ST, STi }, 0 },
12513     { "fcomip", { ST, STi }, 0 },
12514     { Bad_Opcode },
12515   },
12516 };
12517
12518 static char *fgrps[][8] = {
12519   /* Bad opcode 0 */
12520   {
12521     "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12522   },
12523
12524   /* d9_2  1 */
12525   {
12526     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12527   },
12528
12529   /* d9_4  2 */
12530   {
12531     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12532   },
12533
12534   /* d9_5  3 */
12535   {
12536     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12537   },
12538
12539   /* d9_6  4 */
12540   {
12541     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12542   },
12543
12544   /* d9_7  5 */
12545   {
12546     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12547   },
12548
12549   /* da_5  6 */
12550   {
12551     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12552   },
12553
12554   /* db_4  7 */
12555   {
12556     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12557     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12558   },
12559
12560   /* de_3  8 */
12561   {
12562     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12563   },
12564
12565   /* df_4  9 */
12566   {
12567     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12568   },
12569 };
12570
12571 static void
12572 swap_operand (void)
12573 {
12574   mnemonicendp[0] = '.';
12575   mnemonicendp[1] = 's';
12576   mnemonicendp += 2;
12577 }
12578
12579 static void
12580 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12581                int sizeflag ATTRIBUTE_UNUSED)
12582 {
12583   /* Skip mod/rm byte.  */
12584   MODRM_CHECK;
12585   codep++;
12586 }
12587
12588 static void
12589 dofloat (int sizeflag)
12590 {
12591   const struct dis386 *dp;
12592   unsigned char floatop;
12593
12594   floatop = codep[-1];
12595
12596   if (modrm.mod != 3)
12597     {
12598       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12599
12600       putop (float_mem[fp_indx], sizeflag);
12601       obufp = op_out[0];
12602       op_ad = 2;
12603       OP_E (float_mem_mode[fp_indx], sizeflag);
12604       return;
12605     }
12606   /* Skip mod/rm byte.  */
12607   MODRM_CHECK;
12608   codep++;
12609
12610   dp = &float_reg[floatop - 0xd8][modrm.reg];
12611   if (dp->name == NULL)
12612     {
12613       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12614
12615       /* Instruction fnstsw is only one with strange arg.  */
12616       if (floatop == 0xdf && codep[-1] == 0xe0)
12617         strcpy (op_out[0], names16[0]);
12618     }
12619   else
12620     {
12621       putop (dp->name, sizeflag);
12622
12623       obufp = op_out[0];
12624       op_ad = 2;
12625       if (dp->op[0].rtn)
12626         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12627
12628       obufp = op_out[1];
12629       op_ad = 1;
12630       if (dp->op[1].rtn)
12631         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12632     }
12633 }
12634
12635 /* Like oappend (below), but S is a string starting with '%'.
12636    In Intel syntax, the '%' is elided.  */
12637 static void
12638 oappend_maybe_intel (const char *s)
12639 {
12640   oappend (s + intel_syntax);
12641 }
12642
12643 static void
12644 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12645 {
12646   oappend_maybe_intel ("%st");
12647 }
12648
12649 static void
12650 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12651 {
12652   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12653   oappend_maybe_intel (scratchbuf);
12654 }
12655
12656 /* Capital letters in template are macros.  */
12657 static int
12658 putop (const char *in_template, int sizeflag)
12659 {
12660   const char *p;
12661   int alt = 0;
12662   int cond = 1;
12663   unsigned int l = 0, len = 1;
12664   char last[4];
12665
12666 #define SAVE_LAST(c)                    \
12667   if (l < len && l < sizeof (last))     \
12668     last[l++] = c;                      \
12669   else                                  \
12670     abort ();
12671
12672   for (p = in_template; *p; p++)
12673     {
12674       switch (*p)
12675         {
12676         default:
12677           *obufp++ = *p;
12678           break;
12679         case '%':
12680           len++;
12681           break;
12682         case '!':
12683           cond = 0;
12684           break;
12685         case '{':
12686           if (intel_syntax)
12687             {
12688               while (*++p != '|')
12689                 if (*p == '}' || *p == '\0')
12690                   abort ();
12691             }
12692           /* Fall through.  */
12693         case 'I':
12694           alt = 1;
12695           continue;
12696         case '|':
12697           while (*++p != '}')
12698             {
12699               if (*p == '\0')
12700                 abort ();
12701             }
12702           break;
12703         case '}':
12704           break;
12705         case 'A':
12706           if (intel_syntax)
12707             break;
12708           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12709             *obufp++ = 'b';
12710           break;
12711         case 'B':
12712           if (l == 0 && len == 1)
12713             {
12714 case_B:
12715               if (intel_syntax)
12716                 break;
12717               if (sizeflag & SUFFIX_ALWAYS)
12718                 *obufp++ = 'b';
12719             }
12720           else
12721             {
12722               if (l != 1
12723                   || len != 2
12724                   || last[0] != 'L')
12725                 {
12726                   SAVE_LAST (*p);
12727                   break;
12728                 }
12729
12730               if (address_mode == mode_64bit
12731                   && !(prefixes & PREFIX_ADDR))
12732                 {
12733                   *obufp++ = 'a';
12734                   *obufp++ = 'b';
12735                   *obufp++ = 's';
12736                 }
12737
12738               goto case_B;
12739             }
12740           break;
12741         case 'C':
12742           if (intel_syntax && !alt)
12743             break;
12744           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12745             {
12746               if (sizeflag & DFLAG)
12747                 *obufp++ = intel_syntax ? 'd' : 'l';
12748               else
12749                 *obufp++ = intel_syntax ? 'w' : 's';
12750               used_prefixes |= (prefixes & PREFIX_DATA);
12751             }
12752           break;
12753         case 'D':
12754           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12755             break;
12756           USED_REX (REX_W);
12757           if (modrm.mod == 3)
12758             {
12759               if (rex & REX_W)
12760                 *obufp++ = 'q';
12761               else
12762                 {
12763                   if (sizeflag & DFLAG)
12764                     *obufp++ = intel_syntax ? 'd' : 'l';
12765                   else
12766                     *obufp++ = 'w';
12767                   used_prefixes |= (prefixes & PREFIX_DATA);
12768                 }
12769             }
12770           else
12771             *obufp++ = 'w';
12772           break;
12773         case 'E':               /* For jcxz/jecxz */
12774           if (address_mode == mode_64bit)
12775             {
12776               if (sizeflag & AFLAG)
12777                 *obufp++ = 'r';
12778               else
12779                 *obufp++ = 'e';
12780             }
12781           else
12782             if (sizeflag & AFLAG)
12783               *obufp++ = 'e';
12784           used_prefixes |= (prefixes & PREFIX_ADDR);
12785           break;
12786         case 'F':
12787           if (intel_syntax)
12788             break;
12789           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12790             {
12791               if (sizeflag & AFLAG)
12792                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12793               else
12794                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12795               used_prefixes |= (prefixes & PREFIX_ADDR);
12796             }
12797           break;
12798         case 'G':
12799           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12800             break;
12801           if ((rex & REX_W) || (sizeflag & DFLAG))
12802             *obufp++ = 'l';
12803           else
12804             *obufp++ = 'w';
12805           if (!(rex & REX_W))
12806             used_prefixes |= (prefixes & PREFIX_DATA);
12807           break;
12808         case 'H':
12809           if (intel_syntax)
12810             break;
12811           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12812               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12813             {
12814               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12815               *obufp++ = ',';
12816               *obufp++ = 'p';
12817               if (prefixes & PREFIX_DS)
12818                 *obufp++ = 't';
12819               else
12820                 *obufp++ = 'n';
12821             }
12822           break;
12823         case 'J':
12824           if (intel_syntax)
12825             break;
12826           *obufp++ = 'l';
12827           break;
12828         case 'K':
12829           USED_REX (REX_W);
12830           if (rex & REX_W)
12831             *obufp++ = 'q';
12832           else
12833             *obufp++ = 'd';
12834           break;
12835         case 'Z':
12836           if (l != 0 || len != 1)
12837             {
12838               if (l != 1 || len != 2 || last[0] != 'X')
12839                 {
12840                   SAVE_LAST (*p);
12841                   break;
12842                 }
12843               if (!need_vex || !vex.evex)
12844                 abort ();
12845               if (intel_syntax
12846                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12847                 break;
12848               switch (vex.length)
12849                 {
12850                 case 128:
12851                   *obufp++ = 'x';
12852                   break;
12853                 case 256:
12854                   *obufp++ = 'y';
12855                   break;
12856                 case 512:
12857                   *obufp++ = 'z';
12858                   break;
12859                 default:
12860                   abort ();
12861                 }
12862               break;
12863             }
12864           if (intel_syntax)
12865             break;
12866           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12867             {
12868               *obufp++ = 'q';
12869               break;
12870             }
12871           /* Fall through.  */
12872           goto case_L;
12873         case 'L':
12874           if (l != 0 || len != 1)
12875             {
12876               SAVE_LAST (*p);
12877               break;
12878             }
12879 case_L:
12880           if (intel_syntax)
12881             break;
12882           if (sizeflag & SUFFIX_ALWAYS)
12883             *obufp++ = 'l';
12884           break;
12885         case 'M':
12886           if (intel_mnemonic != cond)
12887             *obufp++ = 'r';
12888           break;
12889         case 'N':
12890           if ((prefixes & PREFIX_FWAIT) == 0)
12891             *obufp++ = 'n';
12892           else
12893             used_prefixes |= PREFIX_FWAIT;
12894           break;
12895         case 'O':
12896           USED_REX (REX_W);
12897           if (rex & REX_W)
12898             *obufp++ = 'o';
12899           else if (intel_syntax && (sizeflag & DFLAG))
12900             *obufp++ = 'q';
12901           else
12902             *obufp++ = 'd';
12903           if (!(rex & REX_W))
12904             used_prefixes |= (prefixes & PREFIX_DATA);
12905           break;
12906         case '&':
12907           if (!intel_syntax
12908               && address_mode == mode_64bit
12909               && isa64 == intel64)
12910             {
12911               *obufp++ = 'q';
12912               break;
12913             }
12914           /* Fall through.  */
12915         case 'T':
12916           if (!intel_syntax
12917               && address_mode == mode_64bit
12918               && ((sizeflag & DFLAG) || (rex & REX_W)))
12919             {
12920               *obufp++ = 'q';
12921               break;
12922             }
12923           /* Fall through.  */
12924           goto case_P;
12925         case 'P':
12926           if (l == 0 && len == 1)
12927             {
12928 case_P:
12929               if (intel_syntax)
12930                 {
12931                   if ((rex & REX_W) == 0
12932                       && (prefixes & PREFIX_DATA))
12933                     {
12934                       if ((sizeflag & DFLAG) == 0)
12935                         *obufp++ = 'w';
12936                       used_prefixes |= (prefixes & PREFIX_DATA);
12937                     }
12938                   break;
12939                 }
12940               if ((prefixes & PREFIX_DATA)
12941                   || (rex & REX_W)
12942                   || (sizeflag & SUFFIX_ALWAYS))
12943                 {
12944                   USED_REX (REX_W);
12945                   if (rex & REX_W)
12946                     *obufp++ = 'q';
12947                   else
12948                     {
12949                       if (sizeflag & DFLAG)
12950                         *obufp++ = 'l';
12951                       else
12952                         *obufp++ = 'w';
12953                       used_prefixes |= (prefixes & PREFIX_DATA);
12954                     }
12955                 }
12956             }
12957           else
12958             {
12959               if (l != 1 || len != 2 || last[0] != 'L')
12960                 {
12961                   SAVE_LAST (*p);
12962                   break;
12963                 }
12964
12965               if ((prefixes & PREFIX_DATA)
12966                   || (rex & REX_W)
12967                   || (sizeflag & SUFFIX_ALWAYS))
12968                 {
12969                   USED_REX (REX_W);
12970                   if (rex & REX_W)
12971                     *obufp++ = 'q';
12972                   else
12973                     {
12974                       if (sizeflag & DFLAG)
12975                         *obufp++ = intel_syntax ? 'd' : 'l';
12976                       else
12977                         *obufp++ = 'w';
12978                       used_prefixes |= (prefixes & PREFIX_DATA);
12979                     }
12980                 }
12981             }
12982           break;
12983         case 'U':
12984           if (intel_syntax)
12985             break;
12986           if (address_mode == mode_64bit
12987               && ((sizeflag & DFLAG) || (rex & REX_W)))
12988             {
12989               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12990                 *obufp++ = 'q';
12991               break;
12992             }
12993           /* Fall through.  */
12994           goto case_Q;
12995         case 'Q':
12996           if (l == 0 && len == 1)
12997             {
12998 case_Q:
12999               if (intel_syntax && !alt)
13000                 break;
13001               USED_REX (REX_W);
13002               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13003                 {
13004                   if (rex & REX_W)
13005                     *obufp++ = 'q';
13006                   else
13007                     {
13008                       if (sizeflag & DFLAG)
13009                         *obufp++ = intel_syntax ? 'd' : 'l';
13010                       else
13011                         *obufp++ = 'w';
13012                       used_prefixes |= (prefixes & PREFIX_DATA);
13013                     }
13014                 }
13015             }
13016           else
13017             {
13018               if (l != 1 || len != 2 || last[0] != 'L')
13019                 {
13020                   SAVE_LAST (*p);
13021                   break;
13022                 }
13023               if (intel_syntax
13024                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13025                 break;
13026               if ((rex & REX_W))
13027                 {
13028                   USED_REX (REX_W);
13029                   *obufp++ = 'q';
13030                 }
13031               else
13032                 *obufp++ = 'l';
13033             }
13034           break;
13035         case 'R':
13036           USED_REX (REX_W);
13037           if (rex & REX_W)
13038             *obufp++ = 'q';
13039           else if (sizeflag & DFLAG)
13040             {
13041               if (intel_syntax)
13042                   *obufp++ = 'd';
13043               else
13044                   *obufp++ = 'l';
13045             }
13046           else
13047             *obufp++ = 'w';
13048           if (intel_syntax && !p[1]
13049               && ((rex & REX_W) || (sizeflag & DFLAG)))
13050             *obufp++ = 'e';
13051           if (!(rex & REX_W))
13052             used_prefixes |= (prefixes & PREFIX_DATA);
13053           break;
13054         case 'V':
13055           if (l == 0 && len == 1)
13056             {
13057               if (intel_syntax)
13058                 break;
13059               if (address_mode == mode_64bit
13060                   && ((sizeflag & DFLAG) || (rex & REX_W)))
13061                 {
13062                   if (sizeflag & SUFFIX_ALWAYS)
13063                     *obufp++ = 'q';
13064                   break;
13065                 }
13066             }
13067           else
13068             {
13069               if (l != 1
13070                   || len != 2
13071                   || last[0] != 'L')
13072                 {
13073                   SAVE_LAST (*p);
13074                   break;
13075                 }
13076
13077               if (rex & REX_W)
13078                 {
13079                   *obufp++ = 'a';
13080                   *obufp++ = 'b';
13081                   *obufp++ = 's';
13082                 }
13083             }
13084           /* Fall through.  */
13085           goto case_S;
13086         case 'S':
13087           if (l == 0 && len == 1)
13088             {
13089 case_S:
13090               if (intel_syntax)
13091                 break;
13092               if (sizeflag & SUFFIX_ALWAYS)
13093                 {
13094                   if (rex & REX_W)
13095                     *obufp++ = 'q';
13096                   else
13097                     {
13098                       if (sizeflag & DFLAG)
13099                         *obufp++ = 'l';
13100                       else
13101                         *obufp++ = 'w';
13102                       used_prefixes |= (prefixes & PREFIX_DATA);
13103                     }
13104                 }
13105             }
13106           else
13107             {
13108               if (l != 1
13109                   || len != 2
13110                   || last[0] != 'L')
13111                 {
13112                   SAVE_LAST (*p);
13113                   break;
13114                 }
13115
13116               if (address_mode == mode_64bit
13117                   && !(prefixes & PREFIX_ADDR))
13118                 {
13119                   *obufp++ = 'a';
13120                   *obufp++ = 'b';
13121                   *obufp++ = 's';
13122                 }
13123
13124               goto case_S;
13125             }
13126           break;
13127         case 'X':
13128           if (l != 0 || len != 1)
13129             {
13130               SAVE_LAST (*p);
13131               break;
13132             }
13133           if (need_vex && vex.prefix)
13134             {
13135               if (vex.prefix == DATA_PREFIX_OPCODE)
13136                 *obufp++ = 'd';
13137               else
13138                 *obufp++ = 's';
13139             }
13140           else
13141             {
13142               if (prefixes & PREFIX_DATA)
13143                 *obufp++ = 'd';
13144               else
13145                 *obufp++ = 's';
13146               used_prefixes |= (prefixes & PREFIX_DATA);
13147             }
13148           break;
13149         case 'Y':
13150           if (l == 0 && len == 1)
13151             abort ();
13152           else
13153             {
13154               if (l != 1 || len != 2 || last[0] != 'X')
13155                 {
13156                   SAVE_LAST (*p);
13157                   break;
13158                 }
13159               if (!need_vex)
13160                 abort ();
13161               if (intel_syntax
13162                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13163                 break;
13164               switch (vex.length)
13165                 {
13166                 case 128:
13167                   *obufp++ = 'x';
13168                   break;
13169                 case 256:
13170                   *obufp++ = 'y';
13171                   break;
13172                 case 512:
13173                   if (!vex.evex)
13174                 default:
13175                     abort ();
13176                 }
13177             }
13178           break;
13179         case 'W':
13180           if (l == 0 && len == 1)
13181             {
13182               /* operand size flag for cwtl, cbtw */
13183               USED_REX (REX_W);
13184               if (rex & REX_W)
13185                 {
13186                   if (intel_syntax)
13187                     *obufp++ = 'd';
13188                   else
13189                     *obufp++ = 'l';
13190                 }
13191               else if (sizeflag & DFLAG)
13192                 *obufp++ = 'w';
13193               else
13194                 *obufp++ = 'b';
13195               if (!(rex & REX_W))
13196                 used_prefixes |= (prefixes & PREFIX_DATA);
13197             }
13198           else
13199             {
13200               if (l != 1
13201                   || len != 2
13202                   || (last[0] != 'X'
13203                       && last[0] != 'L'))
13204                 {
13205                   SAVE_LAST (*p);
13206                   break;
13207                 }
13208               if (!need_vex)
13209                 abort ();
13210               if (last[0] == 'X')
13211                 *obufp++ = vex.w ? 'd': 's';
13212               else
13213                 *obufp++ = vex.w ? 'q': 'd';
13214             }
13215           break;
13216         case '^':
13217           if (intel_syntax)
13218             break;
13219           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13220             {
13221               if (sizeflag & DFLAG)
13222                 *obufp++ = 'l';
13223               else
13224                 *obufp++ = 'w';
13225               used_prefixes |= (prefixes & PREFIX_DATA);
13226             }
13227           break;
13228         case '@':
13229           if (intel_syntax)
13230             break;
13231           if (address_mode == mode_64bit
13232               && (isa64 == intel64
13233                   || ((sizeflag & DFLAG) || (rex & REX_W))))
13234               *obufp++ = 'q';
13235           else if ((prefixes & PREFIX_DATA))
13236             {
13237               if (!(sizeflag & DFLAG))
13238                 *obufp++ = 'w';
13239               used_prefixes |= (prefixes & PREFIX_DATA);
13240             }
13241           break;
13242         }
13243       alt = 0;
13244     }
13245   *obufp = 0;
13246   mnemonicendp = obufp;
13247   return 0;
13248 }
13249
13250 static void
13251 oappend (const char *s)
13252 {
13253   obufp = stpcpy (obufp, s);
13254 }
13255
13256 static void
13257 append_seg (void)
13258 {
13259   /* Only print the active segment register.  */
13260   if (!active_seg_prefix)
13261     return;
13262
13263   used_prefixes |= active_seg_prefix;
13264   switch (active_seg_prefix)
13265     {
13266     case PREFIX_CS:
13267       oappend_maybe_intel ("%cs:");
13268       break;
13269     case PREFIX_DS:
13270       oappend_maybe_intel ("%ds:");
13271       break;
13272     case PREFIX_SS:
13273       oappend_maybe_intel ("%ss:");
13274       break;
13275     case PREFIX_ES:
13276       oappend_maybe_intel ("%es:");
13277       break;
13278     case PREFIX_FS:
13279       oappend_maybe_intel ("%fs:");
13280       break;
13281     case PREFIX_GS:
13282       oappend_maybe_intel ("%gs:");
13283       break;
13284     default:
13285       break;
13286     }
13287 }
13288
13289 static void
13290 OP_indirE (int bytemode, int sizeflag)
13291 {
13292   if (!intel_syntax)
13293     oappend ("*");
13294   OP_E (bytemode, sizeflag);
13295 }
13296
13297 static void
13298 print_operand_value (char *buf, int hex, bfd_vma disp)
13299 {
13300   if (address_mode == mode_64bit)
13301     {
13302       if (hex)
13303         {
13304           char tmp[30];
13305           int i;
13306           buf[0] = '0';
13307           buf[1] = 'x';
13308           sprintf_vma (tmp, disp);
13309           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13310           strcpy (buf + 2, tmp + i);
13311         }
13312       else
13313         {
13314           bfd_signed_vma v = disp;
13315           char tmp[30];
13316           int i;
13317           if (v < 0)
13318             {
13319               *(buf++) = '-';
13320               v = -disp;
13321               /* Check for possible overflow on 0x8000000000000000.  */
13322               if (v < 0)
13323                 {
13324                   strcpy (buf, "9223372036854775808");
13325                   return;
13326                 }
13327             }
13328           if (!v)
13329             {
13330               strcpy (buf, "0");
13331               return;
13332             }
13333
13334           i = 0;
13335           tmp[29] = 0;
13336           while (v)
13337             {
13338               tmp[28 - i] = (v % 10) + '0';
13339               v /= 10;
13340               i++;
13341             }
13342           strcpy (buf, tmp + 29 - i);
13343         }
13344     }
13345   else
13346     {
13347       if (hex)
13348         sprintf (buf, "0x%x", (unsigned int) disp);
13349       else
13350         sprintf (buf, "%d", (int) disp);
13351     }
13352 }
13353
13354 /* Put DISP in BUF as signed hex number.  */
13355
13356 static void
13357 print_displacement (char *buf, bfd_vma disp)
13358 {
13359   bfd_signed_vma val = disp;
13360   char tmp[30];
13361   int i, j = 0;
13362
13363   if (val < 0)
13364     {
13365       buf[j++] = '-';
13366       val = -disp;
13367
13368       /* Check for possible overflow.  */
13369       if (val < 0)
13370         {
13371           switch (address_mode)
13372             {
13373             case mode_64bit:
13374               strcpy (buf + j, "0x8000000000000000");
13375               break;
13376             case mode_32bit:
13377               strcpy (buf + j, "0x80000000");
13378               break;
13379             case mode_16bit:
13380               strcpy (buf + j, "0x8000");
13381               break;
13382             }
13383           return;
13384         }
13385     }
13386
13387   buf[j++] = '0';
13388   buf[j++] = 'x';
13389
13390   sprintf_vma (tmp, (bfd_vma) val);
13391   for (i = 0; tmp[i] == '0'; i++)
13392     continue;
13393   if (tmp[i] == '\0')
13394     i--;
13395   strcpy (buf + j, tmp + i);
13396 }
13397
13398 static void
13399 intel_operand_size (int bytemode, int sizeflag)
13400 {
13401   if (vex.evex
13402       && vex.b
13403       && (bytemode == x_mode
13404           || bytemode == evex_half_bcst_xmmq_mode))
13405     {
13406       if (vex.w)
13407         oappend ("QWORD PTR ");
13408       else
13409         oappend ("DWORD PTR ");
13410       return;
13411     }
13412   switch (bytemode)
13413     {
13414     case b_mode:
13415     case b_swap_mode:
13416     case dqb_mode:
13417     case db_mode:
13418       oappend ("BYTE PTR ");
13419       break;
13420     case w_mode:
13421     case dw_mode:
13422     case dqw_mode:
13423       oappend ("WORD PTR ");
13424       break;
13425     case indir_v_mode:
13426       if (address_mode == mode_64bit && isa64 == intel64)
13427         {
13428           oappend ("QWORD PTR ");
13429           break;
13430         }
13431       /* Fall through.  */
13432     case stack_v_mode:
13433       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13434         {
13435           oappend ("QWORD PTR ");
13436           break;
13437         }
13438       /* Fall through.  */
13439     case v_mode:
13440     case v_swap_mode:
13441     case dq_mode:
13442       USED_REX (REX_W);
13443       if (rex & REX_W)
13444         oappend ("QWORD PTR ");
13445       else
13446         {
13447           if ((sizeflag & DFLAG) || bytemode == dq_mode)
13448             oappend ("DWORD PTR ");
13449           else
13450             oappend ("WORD PTR ");
13451           used_prefixes |= (prefixes & PREFIX_DATA);
13452         }
13453       break;
13454     case z_mode:
13455       if ((rex & REX_W) || (sizeflag & DFLAG))
13456         *obufp++ = 'D';
13457       oappend ("WORD PTR ");
13458       if (!(rex & REX_W))
13459         used_prefixes |= (prefixes & PREFIX_DATA);
13460       break;
13461     case a_mode:
13462       if (sizeflag & DFLAG)
13463         oappend ("QWORD PTR ");
13464       else
13465         oappend ("DWORD PTR ");
13466       used_prefixes |= (prefixes & PREFIX_DATA);
13467       break;
13468     case d_mode:
13469     case d_scalar_mode:
13470     case d_scalar_swap_mode:
13471     case d_swap_mode:
13472     case dqd_mode:
13473       oappend ("DWORD PTR ");
13474       break;
13475     case q_mode:
13476     case q_scalar_mode:
13477     case q_scalar_swap_mode:
13478     case q_swap_mode:
13479       oappend ("QWORD PTR ");
13480       break;
13481     case dqa_mode:
13482     case m_mode:
13483       if (address_mode == mode_64bit)
13484         oappend ("QWORD PTR ");
13485       else
13486         oappend ("DWORD PTR ");
13487       break;
13488     case f_mode:
13489       if (sizeflag & DFLAG)
13490         oappend ("FWORD PTR ");
13491       else
13492         oappend ("DWORD PTR ");
13493       used_prefixes |= (prefixes & PREFIX_DATA);
13494       break;
13495     case t_mode:
13496       oappend ("TBYTE PTR ");
13497       break;
13498     case x_mode:
13499     case x_swap_mode:
13500     case evex_x_gscat_mode:
13501     case evex_x_nobcst_mode:
13502     case b_scalar_mode:
13503     case w_scalar_mode:
13504       if (need_vex)
13505         {
13506           switch (vex.length)
13507             {
13508             case 128:
13509               oappend ("XMMWORD PTR ");
13510               break;
13511             case 256:
13512               oappend ("YMMWORD PTR ");
13513               break;
13514             case 512:
13515               oappend ("ZMMWORD PTR ");
13516               break;
13517             default:
13518               abort ();
13519             }
13520         }
13521       else
13522         oappend ("XMMWORD PTR ");
13523       break;
13524     case xmm_mode:
13525       oappend ("XMMWORD PTR ");
13526       break;
13527     case ymm_mode:
13528       oappend ("YMMWORD PTR ");
13529       break;
13530     case xmmq_mode:
13531     case evex_half_bcst_xmmq_mode:
13532       if (!need_vex)
13533         abort ();
13534
13535       switch (vex.length)
13536         {
13537         case 128:
13538           oappend ("QWORD PTR ");
13539           break;
13540         case 256:
13541           oappend ("XMMWORD PTR ");
13542           break;
13543         case 512:
13544           oappend ("YMMWORD PTR ");
13545           break;
13546         default:
13547           abort ();
13548         }
13549       break;
13550     case xmm_mb_mode:
13551       if (!need_vex)
13552         abort ();
13553
13554       switch (vex.length)
13555         {
13556         case 128:
13557         case 256:
13558         case 512:
13559           oappend ("BYTE PTR ");
13560           break;
13561         default:
13562           abort ();
13563         }
13564       break;
13565     case xmm_mw_mode:
13566       if (!need_vex)
13567         abort ();
13568
13569       switch (vex.length)
13570         {
13571         case 128:
13572         case 256:
13573         case 512:
13574           oappend ("WORD PTR ");
13575           break;
13576         default:
13577           abort ();
13578         }
13579       break;
13580     case xmm_md_mode:
13581       if (!need_vex)
13582         abort ();
13583
13584       switch (vex.length)
13585         {
13586         case 128:
13587         case 256:
13588         case 512:
13589           oappend ("DWORD PTR ");
13590           break;
13591         default:
13592           abort ();
13593         }
13594       break;
13595     case xmm_mq_mode:
13596       if (!need_vex)
13597         abort ();
13598
13599       switch (vex.length)
13600         {
13601         case 128:
13602         case 256:
13603         case 512:
13604           oappend ("QWORD PTR ");
13605           break;
13606         default:
13607           abort ();
13608         }
13609       break;
13610     case xmmdw_mode:
13611       if (!need_vex)
13612         abort ();
13613
13614       switch (vex.length)
13615         {
13616         case 128:
13617           oappend ("WORD PTR ");
13618           break;
13619         case 256:
13620           oappend ("DWORD PTR ");
13621           break;
13622         case 512:
13623           oappend ("QWORD PTR ");
13624           break;
13625         default:
13626           abort ();
13627         }
13628       break;
13629     case xmmqd_mode:
13630       if (!need_vex)
13631         abort ();
13632
13633       switch (vex.length)
13634         {
13635         case 128:
13636           oappend ("DWORD PTR ");
13637           break;
13638         case 256:
13639           oappend ("QWORD PTR ");
13640           break;
13641         case 512:
13642           oappend ("XMMWORD PTR ");
13643           break;
13644         default:
13645           abort ();
13646         }
13647       break;
13648     case ymmq_mode:
13649       if (!need_vex)
13650         abort ();
13651
13652       switch (vex.length)
13653         {
13654         case 128:
13655           oappend ("QWORD PTR ");
13656           break;
13657         case 256:
13658           oappend ("YMMWORD PTR ");
13659           break;
13660         case 512:
13661           oappend ("ZMMWORD PTR ");
13662           break;
13663         default:
13664           abort ();
13665         }
13666       break;
13667     case ymmxmm_mode:
13668       if (!need_vex)
13669         abort ();
13670
13671       switch (vex.length)
13672         {
13673         case 128:
13674         case 256:
13675           oappend ("XMMWORD PTR ");
13676           break;
13677         default:
13678           abort ();
13679         }
13680       break;
13681     case o_mode:
13682       oappend ("OWORD PTR ");
13683       break;
13684     case xmm_mdq_mode:
13685     case vex_w_dq_mode:
13686     case vex_scalar_w_dq_mode:
13687       if (!need_vex)
13688         abort ();
13689
13690       if (vex.w)
13691         oappend ("QWORD PTR ");
13692       else
13693         oappend ("DWORD PTR ");
13694       break;
13695     case vex_vsib_d_w_dq_mode:
13696     case vex_vsib_q_w_dq_mode:
13697       if (!need_vex)
13698         abort ();
13699
13700       if (!vex.evex)
13701         {
13702           if (vex.w)
13703             oappend ("QWORD PTR ");
13704           else
13705             oappend ("DWORD PTR ");
13706         }
13707       else
13708         {
13709           switch (vex.length)
13710             {
13711             case 128:
13712               oappend ("XMMWORD PTR ");
13713               break;
13714             case 256:
13715               oappend ("YMMWORD PTR ");
13716               break;
13717             case 512:
13718               oappend ("ZMMWORD PTR ");
13719               break;
13720             default:
13721               abort ();
13722             }
13723         }
13724       break;
13725     case vex_vsib_q_w_d_mode:
13726     case vex_vsib_d_w_d_mode:
13727       if (!need_vex || !vex.evex)
13728         abort ();
13729
13730       switch (vex.length)
13731         {
13732         case 128:
13733           oappend ("QWORD PTR ");
13734           break;
13735         case 256:
13736           oappend ("XMMWORD PTR ");
13737           break;
13738         case 512:
13739           oappend ("YMMWORD PTR ");
13740           break;
13741         default:
13742           abort ();
13743         }
13744
13745       break;
13746     case mask_bd_mode:
13747       if (!need_vex || vex.length != 128)
13748         abort ();
13749       if (vex.w)
13750         oappend ("DWORD PTR ");
13751       else
13752         oappend ("BYTE PTR ");
13753       break;
13754     case mask_mode:
13755       if (!need_vex)
13756         abort ();
13757       if (vex.w)
13758         oappend ("QWORD PTR ");
13759       else
13760         oappend ("WORD PTR ");
13761       break;
13762     case v_bnd_mode:
13763     case v_bndmk_mode:
13764     default:
13765       break;
13766     }
13767 }
13768
13769 static void
13770 OP_E_register (int bytemode, int sizeflag)
13771 {
13772   int reg = modrm.rm;
13773   const char **names;
13774
13775   USED_REX (REX_B);
13776   if ((rex & REX_B))
13777     reg += 8;
13778
13779   if ((sizeflag & SUFFIX_ALWAYS)
13780       && (bytemode == b_swap_mode
13781           || bytemode == bnd_swap_mode
13782           || bytemode == v_swap_mode))
13783     swap_operand ();
13784
13785   switch (bytemode)
13786     {
13787     case b_mode:
13788     case b_swap_mode:
13789       USED_REX (0);
13790       if (rex)
13791         names = names8rex;
13792       else
13793         names = names8;
13794       break;
13795     case w_mode:
13796       names = names16;
13797       break;
13798     case d_mode:
13799     case dw_mode:
13800     case db_mode:
13801       names = names32;
13802       break;
13803     case q_mode:
13804       names = names64;
13805       break;
13806     case m_mode:
13807     case v_bnd_mode:
13808       names = address_mode == mode_64bit ? names64 : names32;
13809       break;
13810     case bnd_mode:
13811     case bnd_swap_mode:
13812       if (reg > 0x3)
13813         {
13814           oappend ("(bad)");
13815           return;
13816         }
13817       names = names_bnd;
13818       break;
13819     case indir_v_mode:
13820       if (address_mode == mode_64bit && isa64 == intel64)
13821         {
13822           names = names64;
13823           break;
13824         }
13825       /* Fall through.  */
13826     case stack_v_mode:
13827       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13828         {
13829           names = names64;
13830           break;
13831         }
13832       bytemode = v_mode;
13833       /* Fall through.  */
13834     case v_mode:
13835     case v_swap_mode:
13836     case dq_mode:
13837     case dqb_mode:
13838     case dqd_mode:
13839     case dqw_mode:
13840     case dqa_mode:
13841       USED_REX (REX_W);
13842       if (rex & REX_W)
13843         names = names64;
13844       else
13845         {
13846           if ((sizeflag & DFLAG)
13847               || (bytemode != v_mode
13848                   && bytemode != v_swap_mode))
13849             names = names32;
13850           else
13851             names = names16;
13852           used_prefixes |= (prefixes & PREFIX_DATA);
13853         }
13854       break;
13855     case va_mode:
13856       names = (address_mode == mode_64bit
13857                ? names64 : names32);
13858       if (!(prefixes & PREFIX_ADDR))
13859         names = (address_mode == mode_16bit
13860                      ? names16 : names);
13861       else
13862         {
13863           /* Remove "addr16/addr32".  */
13864           all_prefixes[last_addr_prefix] = 0;
13865           names = (address_mode != mode_32bit
13866                        ? names32 : names16);
13867           used_prefixes |= PREFIX_ADDR;
13868         }
13869       break;
13870     case mask_bd_mode:
13871     case mask_mode:
13872       if (reg > 0x7)
13873         {
13874           oappend ("(bad)");
13875           return;
13876         }
13877       names = names_mask;
13878       break;
13879     case 0:
13880       return;
13881     default:
13882       oappend (INTERNAL_DISASSEMBLER_ERROR);
13883       return;
13884     }
13885   oappend (names[reg]);
13886 }
13887
13888 static void
13889 OP_E_memory (int bytemode, int sizeflag)
13890 {
13891   bfd_vma disp = 0;
13892   int add = (rex & REX_B) ? 8 : 0;
13893   int riprel = 0;
13894   int shift;
13895
13896   if (vex.evex)
13897     {
13898       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
13899       if (vex.b
13900           && bytemode != x_mode
13901           && bytemode != xmmq_mode
13902           && bytemode != evex_half_bcst_xmmq_mode)
13903         {
13904           BadOp ();
13905           return;
13906         }
13907       switch (bytemode)
13908         {
13909         case dqw_mode:
13910         case dw_mode:
13911           shift = 1;
13912           break;
13913         case dqb_mode:
13914         case db_mode:
13915           shift = 0;
13916           break;
13917         case dq_mode:
13918           if (address_mode != mode_64bit)
13919             {
13920               shift = 2;
13921               break;
13922             }
13923             /* fall through */
13924         case vex_vsib_d_w_dq_mode:
13925         case vex_vsib_d_w_d_mode:
13926         case vex_vsib_q_w_dq_mode:
13927         case vex_vsib_q_w_d_mode:
13928         case evex_x_gscat_mode:
13929         case xmm_mdq_mode:
13930           shift = vex.w ? 3 : 2;
13931           break;
13932         case x_mode:
13933         case evex_half_bcst_xmmq_mode:
13934         case xmmq_mode:
13935           if (vex.b)
13936             {
13937               shift = vex.w ? 3 : 2;
13938               break;
13939             }
13940           /* Fall through.  */
13941         case xmmqd_mode:
13942         case xmmdw_mode:
13943         case ymmq_mode:
13944         case evex_x_nobcst_mode:
13945         case x_swap_mode:
13946           switch (vex.length)
13947             {
13948             case 128:
13949               shift = 4;
13950               break;
13951             case 256:
13952               shift = 5;
13953               break;
13954             case 512:
13955               shift = 6;
13956               break;
13957             default:
13958               abort ();
13959             }
13960           break;
13961         case ymm_mode:
13962           shift = 5;
13963           break;
13964         case xmm_mode:
13965           shift = 4;
13966           break;
13967         case xmm_mq_mode:
13968         case q_mode:
13969         case q_scalar_mode:
13970         case q_swap_mode:
13971         case q_scalar_swap_mode:
13972           shift = 3;
13973           break;
13974         case dqd_mode:
13975         case xmm_md_mode:
13976         case d_mode:
13977         case d_scalar_mode:
13978         case d_swap_mode:
13979         case d_scalar_swap_mode:
13980           shift = 2;
13981           break;
13982         case w_scalar_mode:
13983         case xmm_mw_mode:
13984           shift = 1;
13985           break;
13986         case b_scalar_mode:
13987         case xmm_mb_mode:
13988           shift = 0;
13989           break;
13990         case dqa_mode:
13991           shift = address_mode == mode_64bit ? 3 : 2;
13992           break;
13993         default:
13994           abort ();
13995         }
13996       /* Make necessary corrections to shift for modes that need it.
13997          For these modes we currently have shift 4, 5 or 6 depending on
13998          vex.length (it corresponds to xmmword, ymmword or zmmword
13999          operand).  We might want to make it 3, 4 or 5 (e.g. for
14000          xmmq_mode).  In case of broadcast enabled the corrections
14001          aren't needed, as element size is always 32 or 64 bits.  */
14002       if (!vex.b
14003           && (bytemode == xmmq_mode
14004               || bytemode == evex_half_bcst_xmmq_mode))
14005         shift -= 1;
14006       else if (bytemode == xmmqd_mode)
14007         shift -= 2;
14008       else if (bytemode == xmmdw_mode)
14009         shift -= 3;
14010       else if (bytemode == ymmq_mode && vex.length == 128)
14011         shift -= 1;
14012     }
14013   else
14014     shift = 0;
14015
14016   USED_REX (REX_B);
14017   if (intel_syntax)
14018     intel_operand_size (bytemode, sizeflag);
14019   append_seg ();
14020
14021   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14022     {
14023       /* 32/64 bit address mode */
14024       int havedisp;
14025       int havesib;
14026       int havebase;
14027       int haveindex;
14028       int needindex;
14029       int needaddr32;
14030       int base, rbase;
14031       int vindex = 0;
14032       int scale = 0;
14033       int addr32flag = !((sizeflag & AFLAG)
14034                          || bytemode == v_bnd_mode
14035                          || bytemode == v_bndmk_mode
14036                          || bytemode == bnd_mode
14037                          || bytemode == bnd_swap_mode);
14038       const char **indexes64 = names64;
14039       const char **indexes32 = names32;
14040
14041       havesib = 0;
14042       havebase = 1;
14043       haveindex = 0;
14044       base = modrm.rm;
14045
14046       if (base == 4)
14047         {
14048           havesib = 1;
14049           vindex = sib.index;
14050           USED_REX (REX_X);
14051           if (rex & REX_X)
14052             vindex += 8;
14053           switch (bytemode)
14054             {
14055             case vex_vsib_d_w_dq_mode:
14056             case vex_vsib_d_w_d_mode:
14057             case vex_vsib_q_w_dq_mode:
14058             case vex_vsib_q_w_d_mode:
14059               if (!need_vex)
14060                 abort ();
14061               if (vex.evex)
14062                 {
14063                   if (!vex.v)
14064                     vindex += 16;
14065                 }
14066
14067               haveindex = 1;
14068               switch (vex.length)
14069                 {
14070                 case 128:
14071                   indexes64 = indexes32 = names_xmm;
14072                   break;
14073                 case 256:
14074                   if (!vex.w
14075                       || bytemode == vex_vsib_q_w_dq_mode
14076                       || bytemode == vex_vsib_q_w_d_mode)
14077                     indexes64 = indexes32 = names_ymm;
14078                   else
14079                     indexes64 = indexes32 = names_xmm;
14080                   break;
14081                 case 512:
14082                   if (!vex.w
14083                       || bytemode == vex_vsib_q_w_dq_mode
14084                       || bytemode == vex_vsib_q_w_d_mode)
14085                     indexes64 = indexes32 = names_zmm;
14086                   else
14087                     indexes64 = indexes32 = names_ymm;
14088                   break;
14089                 default:
14090                   abort ();
14091                 }
14092               break;
14093             default:
14094               haveindex = vindex != 4;
14095               break;
14096             }
14097           scale = sib.scale;
14098           base = sib.base;
14099           codep++;
14100         }
14101       rbase = base + add;
14102
14103       switch (modrm.mod)
14104         {
14105         case 0:
14106           if (base == 5)
14107             {
14108               havebase = 0;
14109               if (address_mode == mode_64bit && !havesib)
14110                 riprel = 1;
14111               disp = get32s ();
14112               if (riprel && bytemode == v_bndmk_mode)
14113                 {
14114                   oappend ("(bad)");
14115                   return;
14116                 }
14117             }
14118           break;
14119         case 1:
14120           FETCH_DATA (the_info, codep + 1);
14121           disp = *codep++;
14122           if ((disp & 0x80) != 0)
14123             disp -= 0x100;
14124           if (vex.evex && shift > 0)
14125             disp <<= shift;
14126           break;
14127         case 2:
14128           disp = get32s ();
14129           break;
14130         }
14131
14132       needindex = 0;
14133       needaddr32 = 0;
14134       if (havesib
14135           && !havebase
14136           && !haveindex
14137           && address_mode != mode_16bit)
14138         {
14139           if (address_mode == mode_64bit)
14140             {
14141               /* Display eiz instead of addr32.  */
14142               needindex = addr32flag;
14143               needaddr32 = 1;
14144             }
14145           else
14146             {
14147               /* In 32-bit mode, we need index register to tell [offset]
14148                  from [eiz*1 + offset].  */
14149               needindex = 1;
14150             }
14151         }
14152
14153       havedisp = (havebase
14154                   || needindex
14155                   || (havesib && (haveindex || scale != 0)));
14156
14157       if (!intel_syntax)
14158         if (modrm.mod != 0 || base == 5)
14159           {
14160             if (havedisp || riprel)
14161               print_displacement (scratchbuf, disp);
14162             else
14163               print_operand_value (scratchbuf, 1, disp);
14164             oappend (scratchbuf);
14165             if (riprel)
14166               {
14167                 set_op (disp, 1);
14168                 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14169               }
14170           }
14171
14172       if ((havebase || haveindex || needaddr32 || riprel)
14173           && (bytemode != v_bnd_mode)
14174           && (bytemode != v_bndmk_mode)
14175           && (bytemode != bnd_mode)
14176           && (bytemode != bnd_swap_mode))
14177         used_prefixes |= PREFIX_ADDR;
14178
14179       if (havedisp || (intel_syntax && riprel))
14180         {
14181           *obufp++ = open_char;
14182           if (intel_syntax && riprel)
14183             {
14184               set_op (disp, 1);
14185               oappend (!addr32flag ? "rip" : "eip");
14186             }
14187           *obufp = '\0';
14188           if (havebase)
14189             oappend (address_mode == mode_64bit && !addr32flag
14190                      ? names64[rbase] : names32[rbase]);
14191           if (havesib)
14192             {
14193               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
14194                  print index to tell base + index from base.  */
14195               if (scale != 0
14196                   || needindex
14197                   || haveindex
14198                   || (havebase && base != ESP_REG_NUM))
14199                 {
14200                   if (!intel_syntax || havebase)
14201                     {
14202                       *obufp++ = separator_char;
14203                       *obufp = '\0';
14204                     }
14205                   if (haveindex)
14206                     oappend (address_mode == mode_64bit && !addr32flag
14207                              ? indexes64[vindex] : indexes32[vindex]);
14208                   else
14209                     oappend (address_mode == mode_64bit && !addr32flag
14210                              ? index64 : index32);
14211
14212                   *obufp++ = scale_char;
14213                   *obufp = '\0';
14214                   sprintf (scratchbuf, "%d", 1 << scale);
14215                   oappend (scratchbuf);
14216                 }
14217             }
14218           if (intel_syntax
14219               && (disp || modrm.mod != 0 || base == 5))
14220             {
14221               if (!havedisp || (bfd_signed_vma) disp >= 0)
14222                 {
14223                   *obufp++ = '+';
14224                   *obufp = '\0';
14225                 }
14226               else if (modrm.mod != 1 && disp != -disp)
14227                 {
14228                   *obufp++ = '-';
14229                   *obufp = '\0';
14230                   disp = - (bfd_signed_vma) disp;
14231                 }
14232
14233               if (havedisp)
14234                 print_displacement (scratchbuf, disp);
14235               else
14236                 print_operand_value (scratchbuf, 1, disp);
14237               oappend (scratchbuf);
14238             }
14239
14240           *obufp++ = close_char;
14241           *obufp = '\0';
14242         }
14243       else if (intel_syntax)
14244         {
14245           if (modrm.mod != 0 || base == 5)
14246             {
14247               if (!active_seg_prefix)
14248                 {
14249                   oappend (names_seg[ds_reg - es_reg]);
14250                   oappend (":");
14251                 }
14252               print_operand_value (scratchbuf, 1, disp);
14253               oappend (scratchbuf);
14254             }
14255         }
14256     }
14257   else
14258     {
14259       /* 16 bit address mode */
14260       used_prefixes |= prefixes & PREFIX_ADDR;
14261       switch (modrm.mod)
14262         {
14263         case 0:
14264           if (modrm.rm == 6)
14265             {
14266               disp = get16 ();
14267               if ((disp & 0x8000) != 0)
14268                 disp -= 0x10000;
14269             }
14270           break;
14271         case 1:
14272           FETCH_DATA (the_info, codep + 1);
14273           disp = *codep++;
14274           if ((disp & 0x80) != 0)
14275             disp -= 0x100;
14276           if (vex.evex && shift > 0)
14277             disp <<= shift;
14278           break;
14279         case 2:
14280           disp = get16 ();
14281           if ((disp & 0x8000) != 0)
14282             disp -= 0x10000;
14283           break;
14284         }
14285
14286       if (!intel_syntax)
14287         if (modrm.mod != 0 || modrm.rm == 6)
14288           {
14289             print_displacement (scratchbuf, disp);
14290             oappend (scratchbuf);
14291           }
14292
14293       if (modrm.mod != 0 || modrm.rm != 6)
14294         {
14295           *obufp++ = open_char;
14296           *obufp = '\0';
14297           oappend (index16[modrm.rm]);
14298           if (intel_syntax
14299               && (disp || modrm.mod != 0 || modrm.rm == 6))
14300             {
14301               if ((bfd_signed_vma) disp >= 0)
14302                 {
14303                   *obufp++ = '+';
14304                   *obufp = '\0';
14305                 }
14306               else if (modrm.mod != 1)
14307                 {
14308                   *obufp++ = '-';
14309                   *obufp = '\0';
14310                   disp = - (bfd_signed_vma) disp;
14311                 }
14312
14313               print_displacement (scratchbuf, disp);
14314               oappend (scratchbuf);
14315             }
14316
14317           *obufp++ = close_char;
14318           *obufp = '\0';
14319         }
14320       else if (intel_syntax)
14321         {
14322           if (!active_seg_prefix)
14323             {
14324               oappend (names_seg[ds_reg - es_reg]);
14325               oappend (":");
14326             }
14327           print_operand_value (scratchbuf, 1, disp & 0xffff);
14328           oappend (scratchbuf);
14329         }
14330     }
14331   if (vex.evex && vex.b
14332       && (bytemode == x_mode
14333           || bytemode == xmmq_mode
14334           || bytemode == evex_half_bcst_xmmq_mode))
14335     {
14336       if (vex.w
14337           || bytemode == xmmq_mode
14338           || bytemode == evex_half_bcst_xmmq_mode)
14339         {
14340           switch (vex.length)
14341             {
14342             case 128:
14343               oappend ("{1to2}");
14344               break;
14345             case 256:
14346               oappend ("{1to4}");
14347               break;
14348             case 512:
14349               oappend ("{1to8}");
14350               break;
14351             default:
14352               abort ();
14353             }
14354         }
14355       else
14356         {
14357           switch (vex.length)
14358             {
14359             case 128:
14360               oappend ("{1to4}");
14361               break;
14362             case 256:
14363               oappend ("{1to8}");
14364               break;
14365             case 512:
14366               oappend ("{1to16}");
14367               break;
14368             default:
14369               abort ();
14370             }
14371         }
14372     }
14373 }
14374
14375 static void
14376 OP_E (int bytemode, int sizeflag)
14377 {
14378   /* Skip mod/rm byte.  */
14379   MODRM_CHECK;
14380   codep++;
14381
14382   if (modrm.mod == 3)
14383     OP_E_register (bytemode, sizeflag);
14384   else
14385     OP_E_memory (bytemode, sizeflag);
14386 }
14387
14388 static void
14389 OP_G (int bytemode, int sizeflag)
14390 {
14391   int add = 0;
14392   const char **names;
14393   USED_REX (REX_R);
14394   if (rex & REX_R)
14395     add += 8;
14396   switch (bytemode)
14397     {
14398     case b_mode:
14399       USED_REX (0);
14400       if (rex)
14401         oappend (names8rex[modrm.reg + add]);
14402       else
14403         oappend (names8[modrm.reg + add]);
14404       break;
14405     case w_mode:
14406       oappend (names16[modrm.reg + add]);
14407       break;
14408     case d_mode:
14409     case db_mode:
14410     case dw_mode:
14411       oappend (names32[modrm.reg + add]);
14412       break;
14413     case q_mode:
14414       oappend (names64[modrm.reg + add]);
14415       break;
14416     case bnd_mode:
14417       if (modrm.reg > 0x3)
14418         {
14419           oappend ("(bad)");
14420           return;
14421         }
14422       oappend (names_bnd[modrm.reg]);
14423       break;
14424     case v_mode:
14425     case dq_mode:
14426     case dqb_mode:
14427     case dqd_mode:
14428     case dqw_mode:
14429       USED_REX (REX_W);
14430       if (rex & REX_W)
14431         oappend (names64[modrm.reg + add]);
14432       else
14433         {
14434           if ((sizeflag & DFLAG) || bytemode != v_mode)
14435             oappend (names32[modrm.reg + add]);
14436           else
14437             oappend (names16[modrm.reg + add]);
14438           used_prefixes |= (prefixes & PREFIX_DATA);
14439         }
14440       break;
14441     case va_mode:
14442       names = (address_mode == mode_64bit
14443                ? names64 : names32);
14444       if (!(prefixes & PREFIX_ADDR))
14445         {
14446           if (address_mode == mode_16bit)
14447             names = names16;
14448         }
14449       else
14450         {
14451           /* Remove "addr16/addr32".  */
14452           all_prefixes[last_addr_prefix] = 0;
14453           names = (address_mode != mode_32bit
14454                        ? names32 : names16);
14455           used_prefixes |= PREFIX_ADDR;
14456         }
14457       oappend (names[modrm.reg + add]);
14458       break;
14459     case m_mode:
14460       if (address_mode == mode_64bit)
14461         oappend (names64[modrm.reg + add]);
14462       else
14463         oappend (names32[modrm.reg + add]);
14464       break;
14465     case mask_bd_mode:
14466     case mask_mode:
14467       if ((modrm.reg + add) > 0x7)
14468         {
14469           oappend ("(bad)");
14470           return;
14471         }
14472       oappend (names_mask[modrm.reg + add]);
14473       break;
14474     default:
14475       oappend (INTERNAL_DISASSEMBLER_ERROR);
14476       break;
14477     }
14478 }
14479
14480 static bfd_vma
14481 get64 (void)
14482 {
14483   bfd_vma x;
14484 #ifdef BFD64
14485   unsigned int a;
14486   unsigned int b;
14487
14488   FETCH_DATA (the_info, codep + 8);
14489   a = *codep++ & 0xff;
14490   a |= (*codep++ & 0xff) << 8;
14491   a |= (*codep++ & 0xff) << 16;
14492   a |= (*codep++ & 0xffu) << 24;
14493   b = *codep++ & 0xff;
14494   b |= (*codep++ & 0xff) << 8;
14495   b |= (*codep++ & 0xff) << 16;
14496   b |= (*codep++ & 0xffu) << 24;
14497   x = a + ((bfd_vma) b << 32);
14498 #else
14499   abort ();
14500   x = 0;
14501 #endif
14502   return x;
14503 }
14504
14505 static bfd_signed_vma
14506 get32 (void)
14507 {
14508   bfd_signed_vma x = 0;
14509
14510   FETCH_DATA (the_info, codep + 4);
14511   x = *codep++ & (bfd_signed_vma) 0xff;
14512   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14513   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14514   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14515   return x;
14516 }
14517
14518 static bfd_signed_vma
14519 get32s (void)
14520 {
14521   bfd_signed_vma x = 0;
14522
14523   FETCH_DATA (the_info, codep + 4);
14524   x = *codep++ & (bfd_signed_vma) 0xff;
14525   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14526   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14527   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14528
14529   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14530
14531   return x;
14532 }
14533
14534 static int
14535 get16 (void)
14536 {
14537   int x = 0;
14538
14539   FETCH_DATA (the_info, codep + 2);
14540   x = *codep++ & 0xff;
14541   x |= (*codep++ & 0xff) << 8;
14542   return x;
14543 }
14544
14545 static void
14546 set_op (bfd_vma op, int riprel)
14547 {
14548   op_index[op_ad] = op_ad;
14549   if (address_mode == mode_64bit)
14550     {
14551       op_address[op_ad] = op;
14552       op_riprel[op_ad] = riprel;
14553     }
14554   else
14555     {
14556       /* Mask to get a 32-bit address.  */
14557       op_address[op_ad] = op & 0xffffffff;
14558       op_riprel[op_ad] = riprel & 0xffffffff;
14559     }
14560 }
14561
14562 static void
14563 OP_REG (int code, int sizeflag)
14564 {
14565   const char *s;
14566   int add;
14567
14568   switch (code)
14569     {
14570     case es_reg: case ss_reg: case cs_reg:
14571     case ds_reg: case fs_reg: case gs_reg:
14572       oappend (names_seg[code - es_reg]);
14573       return;
14574     }
14575
14576   USED_REX (REX_B);
14577   if (rex & REX_B)
14578     add = 8;
14579   else
14580     add = 0;
14581
14582   switch (code)
14583     {
14584     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14585     case sp_reg: case bp_reg: case si_reg: case di_reg:
14586       s = names16[code - ax_reg + add];
14587       break;
14588     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14589     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14590       USED_REX (0);
14591       if (rex)
14592         s = names8rex[code - al_reg + add];
14593       else
14594         s = names8[code - al_reg];
14595       break;
14596     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14597     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14598       if (address_mode == mode_64bit
14599           && ((sizeflag & DFLAG) || (rex & REX_W)))
14600         {
14601           s = names64[code - rAX_reg + add];
14602           break;
14603         }
14604       code += eAX_reg - rAX_reg;
14605       /* Fall through.  */
14606     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14607     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14608       USED_REX (REX_W);
14609       if (rex & REX_W)
14610         s = names64[code - eAX_reg + add];
14611       else
14612         {
14613           if (sizeflag & DFLAG)
14614             s = names32[code - eAX_reg + add];
14615           else
14616             s = names16[code - eAX_reg + add];
14617           used_prefixes |= (prefixes & PREFIX_DATA);
14618         }
14619       break;
14620     default:
14621       s = INTERNAL_DISASSEMBLER_ERROR;
14622       break;
14623     }
14624   oappend (s);
14625 }
14626
14627 static void
14628 OP_IMREG (int code, int sizeflag)
14629 {
14630   const char *s;
14631
14632   switch (code)
14633     {
14634     case indir_dx_reg:
14635       if (intel_syntax)
14636         s = "dx";
14637       else
14638         s = "(%dx)";
14639       break;
14640     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14641     case sp_reg: case bp_reg: case si_reg: case di_reg:
14642       s = names16[code - ax_reg];
14643       break;
14644     case es_reg: case ss_reg: case cs_reg:
14645     case ds_reg: case fs_reg: case gs_reg:
14646       s = names_seg[code - es_reg];
14647       break;
14648     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14649     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14650       USED_REX (0);
14651       if (rex)
14652         s = names8rex[code - al_reg];
14653       else
14654         s = names8[code - al_reg];
14655       break;
14656     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14657     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14658       USED_REX (REX_W);
14659       if (rex & REX_W)
14660         s = names64[code - eAX_reg];
14661       else
14662         {
14663           if (sizeflag & DFLAG)
14664             s = names32[code - eAX_reg];
14665           else
14666             s = names16[code - eAX_reg];
14667           used_prefixes |= (prefixes & PREFIX_DATA);
14668         }
14669       break;
14670     case z_mode_ax_reg:
14671       if ((rex & REX_W) || (sizeflag & DFLAG))
14672         s = *names32;
14673       else
14674         s = *names16;
14675       if (!(rex & REX_W))
14676         used_prefixes |= (prefixes & PREFIX_DATA);
14677       break;
14678     default:
14679       s = INTERNAL_DISASSEMBLER_ERROR;
14680       break;
14681     }
14682   oappend (s);
14683 }
14684
14685 static void
14686 OP_I (int bytemode, int sizeflag)
14687 {
14688   bfd_signed_vma op;
14689   bfd_signed_vma mask = -1;
14690
14691   switch (bytemode)
14692     {
14693     case b_mode:
14694       FETCH_DATA (the_info, codep + 1);
14695       op = *codep++;
14696       mask = 0xff;
14697       break;
14698     case q_mode:
14699       if (address_mode == mode_64bit)
14700         {
14701           op = get32s ();
14702           break;
14703         }
14704       /* Fall through.  */
14705     case v_mode:
14706       USED_REX (REX_W);
14707       if (rex & REX_W)
14708         op = get32s ();
14709       else
14710         {
14711           if (sizeflag & DFLAG)
14712             {
14713               op = get32 ();
14714               mask = 0xffffffff;
14715             }
14716           else
14717             {
14718               op = get16 ();
14719               mask = 0xfffff;
14720             }
14721           used_prefixes |= (prefixes & PREFIX_DATA);
14722         }
14723       break;
14724     case w_mode:
14725       mask = 0xfffff;
14726       op = get16 ();
14727       break;
14728     case const_1_mode:
14729       if (intel_syntax)
14730         oappend ("1");
14731       return;
14732     default:
14733       oappend (INTERNAL_DISASSEMBLER_ERROR);
14734       return;
14735     }
14736
14737   op &= mask;
14738   scratchbuf[0] = '$';
14739   print_operand_value (scratchbuf + 1, 1, op);
14740   oappend_maybe_intel (scratchbuf);
14741   scratchbuf[0] = '\0';
14742 }
14743
14744 static void
14745 OP_I64 (int bytemode, int sizeflag)
14746 {
14747   bfd_signed_vma op;
14748   bfd_signed_vma mask = -1;
14749
14750   if (address_mode != mode_64bit)
14751     {
14752       OP_I (bytemode, sizeflag);
14753       return;
14754     }
14755
14756   switch (bytemode)
14757     {
14758     case b_mode:
14759       FETCH_DATA (the_info, codep + 1);
14760       op = *codep++;
14761       mask = 0xff;
14762       break;
14763     case v_mode:
14764       USED_REX (REX_W);
14765       if (rex & REX_W)
14766         op = get64 ();
14767       else
14768         {
14769           if (sizeflag & DFLAG)
14770             {
14771               op = get32 ();
14772               mask = 0xffffffff;
14773             }
14774           else
14775             {
14776               op = get16 ();
14777               mask = 0xfffff;
14778             }
14779           used_prefixes |= (prefixes & PREFIX_DATA);
14780         }
14781       break;
14782     case w_mode:
14783       mask = 0xfffff;
14784       op = get16 ();
14785       break;
14786     default:
14787       oappend (INTERNAL_DISASSEMBLER_ERROR);
14788       return;
14789     }
14790
14791   op &= mask;
14792   scratchbuf[0] = '$';
14793   print_operand_value (scratchbuf + 1, 1, op);
14794   oappend_maybe_intel (scratchbuf);
14795   scratchbuf[0] = '\0';
14796 }
14797
14798 static void
14799 OP_sI (int bytemode, int sizeflag)
14800 {
14801   bfd_signed_vma op;
14802
14803   switch (bytemode)
14804     {
14805     case b_mode:
14806     case b_T_mode:
14807       FETCH_DATA (the_info, codep + 1);
14808       op = *codep++;
14809       if ((op & 0x80) != 0)
14810         op -= 0x100;
14811       if (bytemode == b_T_mode)
14812         {
14813           if (address_mode != mode_64bit
14814               || !((sizeflag & DFLAG) || (rex & REX_W)))
14815             {
14816               /* The operand-size prefix is overridden by a REX prefix.  */
14817               if ((sizeflag & DFLAG) || (rex & REX_W))
14818                 op &= 0xffffffff;
14819               else
14820                 op &= 0xffff;
14821           }
14822         }
14823       else
14824         {
14825           if (!(rex & REX_W))
14826             {
14827               if (sizeflag & DFLAG)
14828                 op &= 0xffffffff;
14829               else
14830                 op &= 0xffff;
14831             }
14832         }
14833       break;
14834     case v_mode:
14835       /* The operand-size prefix is overridden by a REX prefix.  */
14836       if ((sizeflag & DFLAG) || (rex & REX_W))
14837         op = get32s ();
14838       else
14839         op = get16 ();
14840       break;
14841     default:
14842       oappend (INTERNAL_DISASSEMBLER_ERROR);
14843       return;
14844     }
14845
14846   scratchbuf[0] = '$';
14847   print_operand_value (scratchbuf + 1, 1, op);
14848   oappend_maybe_intel (scratchbuf);
14849 }
14850
14851 static void
14852 OP_J (int bytemode, int sizeflag)
14853 {
14854   bfd_vma disp;
14855   bfd_vma mask = -1;
14856   bfd_vma segment = 0;
14857
14858   switch (bytemode)
14859     {
14860     case b_mode:
14861       FETCH_DATA (the_info, codep + 1);
14862       disp = *codep++;
14863       if ((disp & 0x80) != 0)
14864         disp -= 0x100;
14865       break;
14866     case v_mode:
14867       if (isa64 == amd64)
14868         USED_REX (REX_W);
14869       if ((sizeflag & DFLAG)
14870           || (address_mode == mode_64bit
14871               && (isa64 != amd64 || (rex & REX_W))))
14872         disp = get32s ();
14873       else
14874         {
14875           disp = get16 ();
14876           if ((disp & 0x8000) != 0)
14877             disp -= 0x10000;
14878           /* In 16bit mode, address is wrapped around at 64k within
14879              the same segment.  Otherwise, a data16 prefix on a jump
14880              instruction means that the pc is masked to 16 bits after
14881              the displacement is added!  */
14882           mask = 0xffff;
14883           if ((prefixes & PREFIX_DATA) == 0)
14884             segment = ((start_pc + (codep - start_codep))
14885                        & ~((bfd_vma) 0xffff));
14886         }
14887       if (address_mode != mode_64bit
14888           || (isa64 == amd64 && !(rex & REX_W)))
14889         used_prefixes |= (prefixes & PREFIX_DATA);
14890       break;
14891     default:
14892       oappend (INTERNAL_DISASSEMBLER_ERROR);
14893       return;
14894     }
14895   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14896   set_op (disp, 0);
14897   print_operand_value (scratchbuf, 1, disp);
14898   oappend (scratchbuf);
14899 }
14900
14901 static void
14902 OP_SEG (int bytemode, int sizeflag)
14903 {
14904   if (bytemode == w_mode)
14905     oappend (names_seg[modrm.reg]);
14906   else
14907     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14908 }
14909
14910 static void
14911 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14912 {
14913   int seg, offset;
14914
14915   if (sizeflag & DFLAG)
14916     {
14917       offset = get32 ();
14918       seg = get16 ();
14919     }
14920   else
14921     {
14922       offset = get16 ();
14923       seg = get16 ();
14924     }
14925   used_prefixes |= (prefixes & PREFIX_DATA);
14926   if (intel_syntax)
14927     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14928   else
14929     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14930   oappend (scratchbuf);
14931 }
14932
14933 static void
14934 OP_OFF (int bytemode, int sizeflag)
14935 {
14936   bfd_vma off;
14937
14938   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14939     intel_operand_size (bytemode, sizeflag);
14940   append_seg ();
14941
14942   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14943     off = get32 ();
14944   else
14945     off = get16 ();
14946
14947   if (intel_syntax)
14948     {
14949       if (!active_seg_prefix)
14950         {
14951           oappend (names_seg[ds_reg - es_reg]);
14952           oappend (":");
14953         }
14954     }
14955   print_operand_value (scratchbuf, 1, off);
14956   oappend (scratchbuf);
14957 }
14958
14959 static void
14960 OP_OFF64 (int bytemode, int sizeflag)
14961 {
14962   bfd_vma off;
14963
14964   if (address_mode != mode_64bit
14965       || (prefixes & PREFIX_ADDR))
14966     {
14967       OP_OFF (bytemode, sizeflag);
14968       return;
14969     }
14970
14971   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14972     intel_operand_size (bytemode, sizeflag);
14973   append_seg ();
14974
14975   off = get64 ();
14976
14977   if (intel_syntax)
14978     {
14979       if (!active_seg_prefix)
14980         {
14981           oappend (names_seg[ds_reg - es_reg]);
14982           oappend (":");
14983         }
14984     }
14985   print_operand_value (scratchbuf, 1, off);
14986   oappend (scratchbuf);
14987 }
14988
14989 static void
14990 ptr_reg (int code, int sizeflag)
14991 {
14992   const char *s;
14993
14994   *obufp++ = open_char;
14995   used_prefixes |= (prefixes & PREFIX_ADDR);
14996   if (address_mode == mode_64bit)
14997     {
14998       if (!(sizeflag & AFLAG))
14999         s = names32[code - eAX_reg];
15000       else
15001         s = names64[code - eAX_reg];
15002     }
15003   else if (sizeflag & AFLAG)
15004     s = names32[code - eAX_reg];
15005   else
15006     s = names16[code - eAX_reg];
15007   oappend (s);
15008   *obufp++ = close_char;
15009   *obufp = 0;
15010 }
15011
15012 static void
15013 OP_ESreg (int code, int sizeflag)
15014 {
15015   if (intel_syntax)
15016     {
15017       switch (codep[-1])
15018         {
15019         case 0x6d:      /* insw/insl */
15020           intel_operand_size (z_mode, sizeflag);
15021           break;
15022         case 0xa5:      /* movsw/movsl/movsq */
15023         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15024         case 0xab:      /* stosw/stosl */
15025         case 0xaf:      /* scasw/scasl */
15026           intel_operand_size (v_mode, sizeflag);
15027           break;
15028         default:
15029           intel_operand_size (b_mode, sizeflag);
15030         }
15031     }
15032   oappend_maybe_intel ("%es:");
15033   ptr_reg (code, sizeflag);
15034 }
15035
15036 static void
15037 OP_DSreg (int code, int sizeflag)
15038 {
15039   if (intel_syntax)
15040     {
15041       switch (codep[-1])
15042         {
15043         case 0x6f:      /* outsw/outsl */
15044           intel_operand_size (z_mode, sizeflag);
15045           break;
15046         case 0xa5:      /* movsw/movsl/movsq */
15047         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15048         case 0xad:      /* lodsw/lodsl/lodsq */
15049           intel_operand_size (v_mode, sizeflag);
15050           break;
15051         default:
15052           intel_operand_size (b_mode, sizeflag);
15053         }
15054     }
15055   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15056      default segment register DS is printed.  */
15057   if (!active_seg_prefix)
15058     active_seg_prefix = PREFIX_DS;
15059   append_seg ();
15060   ptr_reg (code, sizeflag);
15061 }
15062
15063 static void
15064 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15065 {
15066   int add;
15067   if (rex & REX_R)
15068     {
15069       USED_REX (REX_R);
15070       add = 8;
15071     }
15072   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15073     {
15074       all_prefixes[last_lock_prefix] = 0;
15075       used_prefixes |= PREFIX_LOCK;
15076       add = 8;
15077     }
15078   else
15079     add = 0;
15080   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15081   oappend_maybe_intel (scratchbuf);
15082 }
15083
15084 static void
15085 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15086 {
15087   int add;
15088   USED_REX (REX_R);
15089   if (rex & REX_R)
15090     add = 8;
15091   else
15092     add = 0;
15093   if (intel_syntax)
15094     sprintf (scratchbuf, "db%d", modrm.reg + add);
15095   else
15096     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15097   oappend (scratchbuf);
15098 }
15099
15100 static void
15101 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15102 {
15103   sprintf (scratchbuf, "%%tr%d", modrm.reg);
15104   oappend_maybe_intel (scratchbuf);
15105 }
15106
15107 static void
15108 OP_R (int bytemode, int sizeflag)
15109 {
15110   /* Skip mod/rm byte.  */
15111   MODRM_CHECK;
15112   codep++;
15113   OP_E_register (bytemode, sizeflag);
15114 }
15115
15116 static void
15117 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15118 {
15119   int reg = modrm.reg;
15120   const char **names;
15121
15122   used_prefixes |= (prefixes & PREFIX_DATA);
15123   if (prefixes & PREFIX_DATA)
15124     {
15125       names = names_xmm;
15126       USED_REX (REX_R);
15127       if (rex & REX_R)
15128         reg += 8;
15129     }
15130   else
15131     names = names_mm;
15132   oappend (names[reg]);
15133 }
15134
15135 static void
15136 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15137 {
15138   int reg = modrm.reg;
15139   const char **names;
15140
15141   USED_REX (REX_R);
15142   if (rex & REX_R)
15143     reg += 8;
15144   if (vex.evex)
15145     {
15146       if (!vex.r)
15147         reg += 16;
15148     }
15149
15150   if (need_vex
15151       && bytemode != xmm_mode
15152       && bytemode != xmmq_mode
15153       && bytemode != evex_half_bcst_xmmq_mode
15154       && bytemode != ymm_mode
15155       && bytemode != scalar_mode)
15156     {
15157       switch (vex.length)
15158         {
15159         case 128:
15160           names = names_xmm;
15161           break;
15162         case 256:
15163           if (vex.w
15164               || (bytemode != vex_vsib_q_w_dq_mode
15165                   && bytemode != vex_vsib_q_w_d_mode))
15166             names = names_ymm;
15167           else
15168             names = names_xmm;
15169           break;
15170         case 512:
15171           names = names_zmm;
15172           break;
15173         default:
15174           abort ();
15175         }
15176     }
15177   else if (bytemode == xmmq_mode
15178            || bytemode == evex_half_bcst_xmmq_mode)
15179     {
15180       switch (vex.length)
15181         {
15182         case 128:
15183         case 256:
15184           names = names_xmm;
15185           break;
15186         case 512:
15187           names = names_ymm;
15188           break;
15189         default:
15190           abort ();
15191         }
15192     }
15193   else if (bytemode == ymm_mode)
15194     names = names_ymm;
15195   else
15196     names = names_xmm;
15197   oappend (names[reg]);
15198 }
15199
15200 static void
15201 OP_EM (int bytemode, int sizeflag)
15202 {
15203   int reg;
15204   const char **names;
15205
15206   if (modrm.mod != 3)
15207     {
15208       if (intel_syntax
15209           && (bytemode == v_mode || bytemode == v_swap_mode))
15210         {
15211           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15212           used_prefixes |= (prefixes & PREFIX_DATA);
15213         }
15214       OP_E (bytemode, sizeflag);
15215       return;
15216     }
15217
15218   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15219     swap_operand ();
15220
15221   /* Skip mod/rm byte.  */
15222   MODRM_CHECK;
15223   codep++;
15224   used_prefixes |= (prefixes & PREFIX_DATA);
15225   reg = modrm.rm;
15226   if (prefixes & PREFIX_DATA)
15227     {
15228       names = names_xmm;
15229       USED_REX (REX_B);
15230       if (rex & REX_B)
15231         reg += 8;
15232     }
15233   else
15234     names = names_mm;
15235   oappend (names[reg]);
15236 }
15237
15238 /* cvt* are the only instructions in sse2 which have
15239    both SSE and MMX operands and also have 0x66 prefix
15240    in their opcode. 0x66 was originally used to differentiate
15241    between SSE and MMX instruction(operands). So we have to handle the
15242    cvt* separately using OP_EMC and OP_MXC */
15243 static void
15244 OP_EMC (int bytemode, int sizeflag)
15245 {
15246   if (modrm.mod != 3)
15247     {
15248       if (intel_syntax && bytemode == v_mode)
15249         {
15250           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15251           used_prefixes |= (prefixes & PREFIX_DATA);
15252         }
15253       OP_E (bytemode, sizeflag);
15254       return;
15255     }
15256
15257   /* Skip mod/rm byte.  */
15258   MODRM_CHECK;
15259   codep++;
15260   used_prefixes |= (prefixes & PREFIX_DATA);
15261   oappend (names_mm[modrm.rm]);
15262 }
15263
15264 static void
15265 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15266 {
15267   used_prefixes |= (prefixes & PREFIX_DATA);
15268   oappend (names_mm[modrm.reg]);
15269 }
15270
15271 static void
15272 OP_EX (int bytemode, int sizeflag)
15273 {
15274   int reg;
15275   const char **names;
15276
15277   /* Skip mod/rm byte.  */
15278   MODRM_CHECK;
15279   codep++;
15280
15281   if (modrm.mod != 3)
15282     {
15283       OP_E_memory (bytemode, sizeflag);
15284       return;
15285     }
15286
15287   reg = modrm.rm;
15288   USED_REX (REX_B);
15289   if (rex & REX_B)
15290     reg += 8;
15291   if (vex.evex)
15292     {
15293       USED_REX (REX_X);
15294       if ((rex & REX_X))
15295         reg += 16;
15296     }
15297
15298   if ((sizeflag & SUFFIX_ALWAYS)
15299       && (bytemode == x_swap_mode
15300           || bytemode == d_swap_mode
15301           || bytemode == d_scalar_swap_mode
15302           || bytemode == q_swap_mode
15303           || bytemode == q_scalar_swap_mode))
15304     swap_operand ();
15305
15306   if (need_vex
15307       && bytemode != xmm_mode
15308       && bytemode != xmmdw_mode
15309       && bytemode != xmmqd_mode
15310       && bytemode != xmm_mb_mode
15311       && bytemode != xmm_mw_mode
15312       && bytemode != xmm_md_mode
15313       && bytemode != xmm_mq_mode
15314       && bytemode != xmm_mdq_mode
15315       && bytemode != xmmq_mode
15316       && bytemode != evex_half_bcst_xmmq_mode
15317       && bytemode != ymm_mode
15318       && bytemode != d_scalar_mode
15319       && bytemode != d_scalar_swap_mode
15320       && bytemode != q_scalar_mode
15321       && bytemode != q_scalar_swap_mode
15322       && bytemode != vex_scalar_w_dq_mode)
15323     {
15324       switch (vex.length)
15325         {
15326         case 128:
15327           names = names_xmm;
15328           break;
15329         case 256:
15330           names = names_ymm;
15331           break;
15332         case 512:
15333           names = names_zmm;
15334           break;
15335         default:
15336           abort ();
15337         }
15338     }
15339   else if (bytemode == xmmq_mode
15340            || bytemode == evex_half_bcst_xmmq_mode)
15341     {
15342       switch (vex.length)
15343         {
15344         case 128:
15345         case 256:
15346           names = names_xmm;
15347           break;
15348         case 512:
15349           names = names_ymm;
15350           break;
15351         default:
15352           abort ();
15353         }
15354     }
15355   else if (bytemode == ymm_mode)
15356     names = names_ymm;
15357   else
15358     names = names_xmm;
15359   oappend (names[reg]);
15360 }
15361
15362 static void
15363 OP_MS (int bytemode, int sizeflag)
15364 {
15365   if (modrm.mod == 3)
15366     OP_EM (bytemode, sizeflag);
15367   else
15368     BadOp ();
15369 }
15370
15371 static void
15372 OP_XS (int bytemode, int sizeflag)
15373 {
15374   if (modrm.mod == 3)
15375     OP_EX (bytemode, sizeflag);
15376   else
15377     BadOp ();
15378 }
15379
15380 static void
15381 OP_M (int bytemode, int sizeflag)
15382 {
15383   if (modrm.mod == 3)
15384     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15385     BadOp ();
15386   else
15387     OP_E (bytemode, sizeflag);
15388 }
15389
15390 static void
15391 OP_0f07 (int bytemode, int sizeflag)
15392 {
15393   if (modrm.mod != 3 || modrm.rm != 0)
15394     BadOp ();
15395   else
15396     OP_E (bytemode, sizeflag);
15397 }
15398
15399 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15400    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
15401
15402 static void
15403 NOP_Fixup1 (int bytemode, int sizeflag)
15404 {
15405   if ((prefixes & PREFIX_DATA) != 0
15406       || (rex != 0
15407           && rex != 0x48
15408           && address_mode == mode_64bit))
15409     OP_REG (bytemode, sizeflag);
15410   else
15411     strcpy (obuf, "nop");
15412 }
15413
15414 static void
15415 NOP_Fixup2 (int bytemode, int sizeflag)
15416 {
15417   if ((prefixes & PREFIX_DATA) != 0
15418       || (rex != 0
15419           && rex != 0x48
15420           && address_mode == mode_64bit))
15421     OP_IMREG (bytemode, sizeflag);
15422 }
15423
15424 static const char *const Suffix3DNow[] = {
15425 /* 00 */        NULL,           NULL,           NULL,           NULL,
15426 /* 04 */        NULL,           NULL,           NULL,           NULL,
15427 /* 08 */        NULL,           NULL,           NULL,           NULL,
15428 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
15429 /* 10 */        NULL,           NULL,           NULL,           NULL,
15430 /* 14 */        NULL,           NULL,           NULL,           NULL,
15431 /* 18 */        NULL,           NULL,           NULL,           NULL,
15432 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
15433 /* 20 */        NULL,           NULL,           NULL,           NULL,
15434 /* 24 */        NULL,           NULL,           NULL,           NULL,
15435 /* 28 */        NULL,           NULL,           NULL,           NULL,
15436 /* 2C */        NULL,           NULL,           NULL,           NULL,
15437 /* 30 */        NULL,           NULL,           NULL,           NULL,
15438 /* 34 */        NULL,           NULL,           NULL,           NULL,
15439 /* 38 */        NULL,           NULL,           NULL,           NULL,
15440 /* 3C */        NULL,           NULL,           NULL,           NULL,
15441 /* 40 */        NULL,           NULL,           NULL,           NULL,
15442 /* 44 */        NULL,           NULL,           NULL,           NULL,
15443 /* 48 */        NULL,           NULL,           NULL,           NULL,
15444 /* 4C */        NULL,           NULL,           NULL,           NULL,
15445 /* 50 */        NULL,           NULL,           NULL,           NULL,
15446 /* 54 */        NULL,           NULL,           NULL,           NULL,
15447 /* 58 */        NULL,           NULL,           NULL,           NULL,
15448 /* 5C */        NULL,           NULL,           NULL,           NULL,
15449 /* 60 */        NULL,           NULL,           NULL,           NULL,
15450 /* 64 */        NULL,           NULL,           NULL,           NULL,
15451 /* 68 */        NULL,           NULL,           NULL,           NULL,
15452 /* 6C */        NULL,           NULL,           NULL,           NULL,
15453 /* 70 */        NULL,           NULL,           NULL,           NULL,
15454 /* 74 */        NULL,           NULL,           NULL,           NULL,
15455 /* 78 */        NULL,           NULL,           NULL,           NULL,
15456 /* 7C */        NULL,           NULL,           NULL,           NULL,
15457 /* 80 */        NULL,           NULL,           NULL,           NULL,
15458 /* 84 */        NULL,           NULL,           NULL,           NULL,
15459 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
15460 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
15461 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
15462 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
15463 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
15464 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
15465 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
15466 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
15467 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
15468 /* AC */        NULL,           NULL,           "pfacc",        NULL,
15469 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
15470 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
15471 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
15472 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
15473 /* C0 */        NULL,           NULL,           NULL,           NULL,
15474 /* C4 */        NULL,           NULL,           NULL,           NULL,
15475 /* C8 */        NULL,           NULL,           NULL,           NULL,
15476 /* CC */        NULL,           NULL,           NULL,           NULL,
15477 /* D0 */        NULL,           NULL,           NULL,           NULL,
15478 /* D4 */        NULL,           NULL,           NULL,           NULL,
15479 /* D8 */        NULL,           NULL,           NULL,           NULL,
15480 /* DC */        NULL,           NULL,           NULL,           NULL,
15481 /* E0 */        NULL,           NULL,           NULL,           NULL,
15482 /* E4 */        NULL,           NULL,           NULL,           NULL,
15483 /* E8 */        NULL,           NULL,           NULL,           NULL,
15484 /* EC */        NULL,           NULL,           NULL,           NULL,
15485 /* F0 */        NULL,           NULL,           NULL,           NULL,
15486 /* F4 */        NULL,           NULL,           NULL,           NULL,
15487 /* F8 */        NULL,           NULL,           NULL,           NULL,
15488 /* FC */        NULL,           NULL,           NULL,           NULL,
15489 };
15490
15491 static void
15492 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15493 {
15494   const char *mnemonic;
15495
15496   FETCH_DATA (the_info, codep + 1);
15497   /* AMD 3DNow! instructions are specified by an opcode suffix in the
15498      place where an 8-bit immediate would normally go.  ie. the last
15499      byte of the instruction.  */
15500   obufp = mnemonicendp;
15501   mnemonic = Suffix3DNow[*codep++ & 0xff];
15502   if (mnemonic)
15503     oappend (mnemonic);
15504   else
15505     {
15506       /* Since a variable sized modrm/sib chunk is between the start
15507          of the opcode (0x0f0f) and the opcode suffix, we need to do
15508          all the modrm processing first, and don't know until now that
15509          we have a bad opcode.  This necessitates some cleaning up.  */
15510       op_out[0][0] = '\0';
15511       op_out[1][0] = '\0';
15512       BadOp ();
15513     }
15514   mnemonicendp = obufp;
15515 }
15516
15517 static struct op simd_cmp_op[] =
15518 {
15519   { STRING_COMMA_LEN ("eq") },
15520   { STRING_COMMA_LEN ("lt") },
15521   { STRING_COMMA_LEN ("le") },
15522   { STRING_COMMA_LEN ("unord") },
15523   { STRING_COMMA_LEN ("neq") },
15524   { STRING_COMMA_LEN ("nlt") },
15525   { STRING_COMMA_LEN ("nle") },
15526   { STRING_COMMA_LEN ("ord") }
15527 };
15528
15529 static void
15530 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15531 {
15532   unsigned int cmp_type;
15533
15534   FETCH_DATA (the_info, codep + 1);
15535   cmp_type = *codep++ & 0xff;
15536   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15537     {
15538       char suffix [3];
15539       char *p = mnemonicendp - 2;
15540       suffix[0] = p[0];
15541       suffix[1] = p[1];
15542       suffix[2] = '\0';
15543       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15544       mnemonicendp += simd_cmp_op[cmp_type].len;
15545     }
15546   else
15547     {
15548       /* We have a reserved extension byte.  Output it directly.  */
15549       scratchbuf[0] = '$';
15550       print_operand_value (scratchbuf + 1, 1, cmp_type);
15551       oappend_maybe_intel (scratchbuf);
15552       scratchbuf[0] = '\0';
15553     }
15554 }
15555
15556 static void
15557 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15558           int sizeflag ATTRIBUTE_UNUSED)
15559 {
15560   /* mwaitx %eax,%ecx,%ebx */
15561   if (!intel_syntax)
15562     {
15563       const char **names = (address_mode == mode_64bit
15564                             ? names64 : names32);
15565       strcpy (op_out[0], names[0]);
15566       strcpy (op_out[1], names[1]);
15567       strcpy (op_out[2], names[3]);
15568       two_source_ops = 1;
15569     }
15570   /* Skip mod/rm byte.  */
15571   MODRM_CHECK;
15572   codep++;
15573 }
15574
15575 static void
15576 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15577           int sizeflag ATTRIBUTE_UNUSED)
15578 {
15579   /* mwait %eax,%ecx  */
15580   if (!intel_syntax)
15581     {
15582       const char **names = (address_mode == mode_64bit
15583                             ? names64 : names32);
15584       strcpy (op_out[0], names[0]);
15585       strcpy (op_out[1], names[1]);
15586       two_source_ops = 1;
15587     }
15588   /* Skip mod/rm byte.  */
15589   MODRM_CHECK;
15590   codep++;
15591 }
15592
15593 static void
15594 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15595             int sizeflag ATTRIBUTE_UNUSED)
15596 {
15597   /* monitor %eax,%ecx,%edx"  */
15598   if (!intel_syntax)
15599     {
15600       const char **op1_names;
15601       const char **names = (address_mode == mode_64bit
15602                             ? names64 : names32);
15603
15604       if (!(prefixes & PREFIX_ADDR))
15605         op1_names = (address_mode == mode_16bit
15606                      ? names16 : names);
15607       else
15608         {
15609           /* Remove "addr16/addr32".  */
15610           all_prefixes[last_addr_prefix] = 0;
15611           op1_names = (address_mode != mode_32bit
15612                        ? names32 : names16);
15613           used_prefixes |= PREFIX_ADDR;
15614         }
15615       strcpy (op_out[0], op1_names[0]);
15616       strcpy (op_out[1], names[1]);
15617       strcpy (op_out[2], names[2]);
15618       two_source_ops = 1;
15619     }
15620   /* Skip mod/rm byte.  */
15621   MODRM_CHECK;
15622   codep++;
15623 }
15624
15625 static void
15626 BadOp (void)
15627 {
15628   /* Throw away prefixes and 1st. opcode byte.  */
15629   codep = insn_codep + 1;
15630   oappend ("(bad)");
15631 }
15632
15633 static void
15634 REP_Fixup (int bytemode, int sizeflag)
15635 {
15636   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15637      lods and stos.  */
15638   if (prefixes & PREFIX_REPZ)
15639     all_prefixes[last_repz_prefix] = REP_PREFIX;
15640
15641   switch (bytemode)
15642     {
15643     case al_reg:
15644     case eAX_reg:
15645     case indir_dx_reg:
15646       OP_IMREG (bytemode, sizeflag);
15647       break;
15648     case eDI_reg:
15649       OP_ESreg (bytemode, sizeflag);
15650       break;
15651     case eSI_reg:
15652       OP_DSreg (bytemode, sizeflag);
15653       break;
15654     default:
15655       abort ();
15656       break;
15657     }
15658 }
15659
15660 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15661    "bnd".  */
15662
15663 static void
15664 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15665 {
15666   if (prefixes & PREFIX_REPNZ)
15667     all_prefixes[last_repnz_prefix] = BND_PREFIX;
15668 }
15669
15670 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15671    "notrack".  */
15672
15673 static void
15674 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15675                int sizeflag ATTRIBUTE_UNUSED)
15676 {
15677   if (active_seg_prefix == PREFIX_DS
15678       && (address_mode != mode_64bit || last_data_prefix < 0))
15679     {
15680       /* NOTRACK prefix is only valid on indirect branch instructions.
15681          NB: DATA prefix is unsupported for Intel64.  */
15682       active_seg_prefix = 0;
15683       all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15684     }
15685 }
15686
15687 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15688    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15689  */
15690
15691 static void
15692 HLE_Fixup1 (int bytemode, int sizeflag)
15693 {
15694   if (modrm.mod != 3
15695       && (prefixes & PREFIX_LOCK) != 0)
15696     {
15697       if (prefixes & PREFIX_REPZ)
15698         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15699       if (prefixes & PREFIX_REPNZ)
15700         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15701     }
15702
15703   OP_E (bytemode, sizeflag);
15704 }
15705
15706 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15707    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
15708  */
15709
15710 static void
15711 HLE_Fixup2 (int bytemode, int sizeflag)
15712 {
15713   if (modrm.mod != 3)
15714     {
15715       if (prefixes & PREFIX_REPZ)
15716         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15717       if (prefixes & PREFIX_REPNZ)
15718         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15719     }
15720
15721   OP_E (bytemode, sizeflag);
15722 }
15723
15724 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
15725    "xrelease" for memory operand.  No check for LOCK prefix.   */
15726
15727 static void
15728 HLE_Fixup3 (int bytemode, int sizeflag)
15729 {
15730   if (modrm.mod != 3
15731       && last_repz_prefix > last_repnz_prefix
15732       && (prefixes & PREFIX_REPZ) != 0)
15733     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15734
15735   OP_E (bytemode, sizeflag);
15736 }
15737
15738 static void
15739 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15740 {
15741   USED_REX (REX_W);
15742   if (rex & REX_W)
15743     {
15744       /* Change cmpxchg8b to cmpxchg16b.  */
15745       char *p = mnemonicendp - 2;
15746       mnemonicendp = stpcpy (p, "16b");
15747       bytemode = o_mode;
15748     }
15749   else if ((prefixes & PREFIX_LOCK) != 0)
15750     {
15751       if (prefixes & PREFIX_REPZ)
15752         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15753       if (prefixes & PREFIX_REPNZ)
15754         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15755     }
15756
15757   OP_M (bytemode, sizeflag);
15758 }
15759
15760 static void
15761 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15762 {
15763   const char **names;
15764
15765   if (need_vex)
15766     {
15767       switch (vex.length)
15768         {
15769         case 128:
15770           names = names_xmm;
15771           break;
15772         case 256:
15773           names = names_ymm;
15774           break;
15775         default:
15776           abort ();
15777         }
15778     }
15779   else
15780     names = names_xmm;
15781   oappend (names[reg]);
15782 }
15783
15784 static void
15785 CRC32_Fixup (int bytemode, int sizeflag)
15786 {
15787   /* Add proper suffix to "crc32".  */
15788   char *p = mnemonicendp;
15789
15790   switch (bytemode)
15791     {
15792     case b_mode:
15793       if (intel_syntax)
15794         goto skip;
15795
15796       *p++ = 'b';
15797       break;
15798     case v_mode:
15799       if (intel_syntax)
15800         goto skip;
15801
15802       USED_REX (REX_W);
15803       if (rex & REX_W)
15804         *p++ = 'q';
15805       else
15806         {
15807           if (sizeflag & DFLAG)
15808             *p++ = 'l';
15809           else
15810             *p++ = 'w';
15811           used_prefixes |= (prefixes & PREFIX_DATA);
15812         }
15813       break;
15814     default:
15815       oappend (INTERNAL_DISASSEMBLER_ERROR);
15816       break;
15817     }
15818   mnemonicendp = p;
15819   *p = '\0';
15820
15821 skip:
15822   if (modrm.mod == 3)
15823     {
15824       int add;
15825
15826       /* Skip mod/rm byte.  */
15827       MODRM_CHECK;
15828       codep++;
15829
15830       USED_REX (REX_B);
15831       add = (rex & REX_B) ? 8 : 0;
15832       if (bytemode == b_mode)
15833         {
15834           USED_REX (0);
15835           if (rex)
15836             oappend (names8rex[modrm.rm + add]);
15837           else
15838             oappend (names8[modrm.rm + add]);
15839         }
15840       else
15841         {
15842           USED_REX (REX_W);
15843           if (rex & REX_W)
15844             oappend (names64[modrm.rm + add]);
15845           else if ((prefixes & PREFIX_DATA))
15846             oappend (names16[modrm.rm + add]);
15847           else
15848             oappend (names32[modrm.rm + add]);
15849         }
15850     }
15851   else
15852     OP_E (bytemode, sizeflag);
15853 }
15854
15855 static void
15856 FXSAVE_Fixup (int bytemode, int sizeflag)
15857 {
15858   /* Add proper suffix to "fxsave" and "fxrstor".  */
15859   USED_REX (REX_W);
15860   if (rex & REX_W)
15861     {
15862       char *p = mnemonicendp;
15863       *p++ = '6';
15864       *p++ = '4';
15865       *p = '\0';
15866       mnemonicendp = p;
15867     }
15868   OP_M (bytemode, sizeflag);
15869 }
15870
15871 static void
15872 PCMPESTR_Fixup (int bytemode, int sizeflag)
15873 {
15874   /* Add proper suffix to "{,v}pcmpestr{i,m}".  */
15875   if (!intel_syntax)
15876     {
15877       char *p = mnemonicendp;
15878
15879       USED_REX (REX_W);
15880       if (rex & REX_W)
15881         *p++ = 'q';
15882       else if (sizeflag & SUFFIX_ALWAYS)
15883         *p++ = 'l';
15884
15885       *p = '\0';
15886       mnemonicendp = p;
15887     }
15888
15889   OP_EX (bytemode, sizeflag);
15890 }
15891
15892 /* Display the destination register operand for instructions with
15893    VEX. */
15894
15895 static void
15896 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15897 {
15898   int reg;
15899   const char **names;
15900
15901   if (!need_vex)
15902     abort ();
15903
15904   if (!need_vex_reg)
15905     return;
15906
15907   reg = vex.register_specifier;
15908   if (address_mode != mode_64bit)
15909     reg &= 7;
15910   else if (vex.evex && !vex.v)
15911     reg += 16;
15912
15913   if (bytemode == vex_scalar_mode)
15914     {
15915       oappend (names_xmm[reg]);
15916       return;
15917     }
15918
15919   switch (vex.length)
15920     {
15921     case 128:
15922       switch (bytemode)
15923         {
15924         case vex_mode:
15925         case vex128_mode:
15926         case vex_vsib_q_w_dq_mode:
15927         case vex_vsib_q_w_d_mode:
15928           names = names_xmm;
15929           break;
15930         case dq_mode:
15931           if (rex & REX_W)
15932             names = names64;
15933           else
15934             names = names32;
15935           break;
15936         case mask_bd_mode:
15937         case mask_mode:
15938           if (reg > 0x7)
15939             {
15940               oappend ("(bad)");
15941               return;
15942             }
15943           names = names_mask;
15944           break;
15945         default:
15946           abort ();
15947           return;
15948         }
15949       break;
15950     case 256:
15951       switch (bytemode)
15952         {
15953         case vex_mode:
15954         case vex256_mode:
15955           names = names_ymm;
15956           break;
15957         case vex_vsib_q_w_dq_mode:
15958         case vex_vsib_q_w_d_mode:
15959           names = vex.w ? names_ymm : names_xmm;
15960           break;
15961         case mask_bd_mode:
15962         case mask_mode:
15963           if (reg > 0x7)
15964             {
15965               oappend ("(bad)");
15966               return;
15967             }
15968           names = names_mask;
15969           break;
15970         default:
15971           /* See PR binutils/20893 for a reproducer.  */
15972           oappend ("(bad)");
15973           return;
15974         }
15975       break;
15976     case 512:
15977       names = names_zmm;
15978       break;
15979     default:
15980       abort ();
15981       break;
15982     }
15983   oappend (names[reg]);
15984 }
15985
15986 /* Get the VEX immediate byte without moving codep.  */
15987
15988 static unsigned char
15989 get_vex_imm8 (int sizeflag, int opnum)
15990 {
15991   int bytes_before_imm = 0;
15992
15993   if (modrm.mod != 3)
15994     {
15995       /* There are SIB/displacement bytes.  */
15996       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15997         {
15998           /* 32/64 bit address mode */
15999           int base = modrm.rm;
16000
16001           /* Check SIB byte.  */
16002           if (base == 4)
16003             {
16004               FETCH_DATA (the_info, codep + 1);
16005               base = *codep & 7;
16006               /* When decoding the third source, don't increase
16007                  bytes_before_imm as this has already been incremented
16008                  by one in OP_E_memory while decoding the second
16009                  source operand.  */
16010               if (opnum == 0)
16011                 bytes_before_imm++;
16012             }
16013
16014           /* Don't increase bytes_before_imm when decoding the third source,
16015              it has already been incremented by OP_E_memory while decoding
16016              the second source operand.  */
16017           if (opnum == 0)
16018             {
16019               switch (modrm.mod)
16020                 {
16021                   case 0:
16022                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16023                        SIB == 5, there is a 4 byte displacement.  */
16024                     if (base != 5)
16025                       /* No displacement. */
16026                       break;
16027                     /* Fall through.  */
16028                   case 2:
16029                     /* 4 byte displacement.  */
16030                     bytes_before_imm += 4;
16031                     break;
16032                   case 1:
16033                     /* 1 byte displacement.  */
16034                     bytes_before_imm++;
16035                     break;
16036                 }
16037             }
16038         }
16039       else
16040         {
16041           /* 16 bit address mode */
16042           /* Don't increase bytes_before_imm when decoding the third source,
16043              it has already been incremented by OP_E_memory while decoding
16044              the second source operand.  */
16045           if (opnum == 0)
16046             {
16047               switch (modrm.mod)
16048                 {
16049                 case 0:
16050                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16051                   if (modrm.rm != 6)
16052                     /* No displacement. */
16053                     break;
16054                   /* Fall through.  */
16055                 case 2:
16056                   /* 2 byte displacement.  */
16057                   bytes_before_imm += 2;
16058                   break;
16059                 case 1:
16060                   /* 1 byte displacement: when decoding the third source,
16061                      don't increase bytes_before_imm as this has already
16062                      been incremented by one in OP_E_memory while decoding
16063                      the second source operand.  */
16064                   if (opnum == 0)
16065                     bytes_before_imm++;
16066
16067                   break;
16068                 }
16069             }
16070         }
16071     }
16072
16073   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16074   return codep [bytes_before_imm];
16075 }
16076
16077 static void
16078 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16079 {
16080   const char **names;
16081
16082   if (reg == -1 && modrm.mod != 3)
16083     {
16084       OP_E_memory (bytemode, sizeflag);
16085       return;
16086     }
16087   else
16088     {
16089       if (reg == -1)
16090         {
16091           reg = modrm.rm;
16092           USED_REX (REX_B);
16093           if (rex & REX_B)
16094             reg += 8;
16095         }
16096       if (address_mode != mode_64bit)
16097         reg &= 7;
16098     }
16099
16100   switch (vex.length)
16101     {
16102     case 128:
16103       names = names_xmm;
16104       break;
16105     case 256:
16106       names = names_ymm;
16107       break;
16108     default:
16109       abort ();
16110     }
16111   oappend (names[reg]);
16112 }
16113
16114 static void
16115 OP_EX_VexImmW (int bytemode, int sizeflag)
16116 {
16117   int reg = -1;
16118   static unsigned char vex_imm8;
16119
16120   if (vex_w_done == 0)
16121     {
16122       vex_w_done = 1;
16123
16124       /* Skip mod/rm byte.  */
16125       MODRM_CHECK;
16126       codep++;
16127
16128       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16129
16130       if (vex.w)
16131           reg = vex_imm8 >> 4;
16132
16133       OP_EX_VexReg (bytemode, sizeflag, reg);
16134     }
16135   else if (vex_w_done == 1)
16136     {
16137       vex_w_done = 2;
16138
16139       if (!vex.w)
16140           reg = vex_imm8 >> 4;
16141
16142       OP_EX_VexReg (bytemode, sizeflag, reg);
16143     }
16144   else
16145     {
16146       /* Output the imm8 directly.  */
16147       scratchbuf[0] = '$';
16148       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16149       oappend_maybe_intel (scratchbuf);
16150       scratchbuf[0] = '\0';
16151       codep++;
16152     }
16153 }
16154
16155 static void
16156 OP_Vex_2src (int bytemode, int sizeflag)
16157 {
16158   if (modrm.mod == 3)
16159     {
16160       int reg = modrm.rm;
16161       USED_REX (REX_B);
16162       if (rex & REX_B)
16163         reg += 8;
16164       oappend (names_xmm[reg]);
16165     }
16166   else
16167     {
16168       if (intel_syntax
16169           && (bytemode == v_mode || bytemode == v_swap_mode))
16170         {
16171           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16172           used_prefixes |= (prefixes & PREFIX_DATA);
16173         }
16174       OP_E (bytemode, sizeflag);
16175     }
16176 }
16177
16178 static void
16179 OP_Vex_2src_1 (int bytemode, int sizeflag)
16180 {
16181   if (modrm.mod == 3)
16182     {
16183       /* Skip mod/rm byte.   */
16184       MODRM_CHECK;
16185       codep++;
16186     }
16187
16188   if (vex.w)
16189     {
16190       unsigned int reg = vex.register_specifier;
16191
16192       if (address_mode != mode_64bit)
16193         reg &= 7;
16194       oappend (names_xmm[reg]);
16195     }
16196   else
16197     OP_Vex_2src (bytemode, sizeflag);
16198 }
16199
16200 static void
16201 OP_Vex_2src_2 (int bytemode, int sizeflag)
16202 {
16203   if (vex.w)
16204     OP_Vex_2src (bytemode, sizeflag);
16205   else
16206     {
16207       unsigned int reg = vex.register_specifier;
16208
16209       if (address_mode != mode_64bit)
16210         reg &= 7;
16211       oappend (names_xmm[reg]);
16212     }
16213 }
16214
16215 static void
16216 OP_EX_VexW (int bytemode, int sizeflag)
16217 {
16218   int reg = -1;
16219
16220   if (!vex_w_done)
16221     {
16222       /* Skip mod/rm byte.  */
16223       MODRM_CHECK;
16224       codep++;
16225
16226       if (vex.w)
16227         reg = get_vex_imm8 (sizeflag, 0) >> 4;
16228     }
16229   else
16230     {
16231       if (!vex.w)
16232         reg = get_vex_imm8 (sizeflag, 1) >> 4;
16233     }
16234
16235   OP_EX_VexReg (bytemode, sizeflag, reg);
16236
16237   if (vex_w_done)
16238     codep++;
16239   vex_w_done = 1;
16240 }
16241
16242 static void
16243 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16244 {
16245   int reg;
16246   const char **names;
16247
16248   FETCH_DATA (the_info, codep + 1);
16249   reg = *codep++;
16250
16251   if (bytemode != x_mode)
16252     abort ();
16253
16254   reg >>= 4;
16255   if (address_mode != mode_64bit)
16256     reg &= 7;
16257
16258   switch (vex.length)
16259     {
16260     case 128:
16261       names = names_xmm;
16262       break;
16263     case 256:
16264       names = names_ymm;
16265       break;
16266     default:
16267       abort ();
16268     }
16269   oappend (names[reg]);
16270 }
16271
16272 static void
16273 OP_XMM_VexW (int bytemode, int sizeflag)
16274 {
16275   /* Turn off the REX.W bit since it is used for swapping operands
16276      now.  */
16277   rex &= ~REX_W;
16278   OP_XMM (bytemode, sizeflag);
16279 }
16280
16281 static void
16282 OP_EX_Vex (int bytemode, int sizeflag)
16283 {
16284   if (modrm.mod != 3)
16285     {
16286       if (vex.register_specifier != 0)
16287         BadOp ();
16288       need_vex_reg = 0;
16289     }
16290   OP_EX (bytemode, sizeflag);
16291 }
16292
16293 static void
16294 OP_XMM_Vex (int bytemode, int sizeflag)
16295 {
16296   if (modrm.mod != 3)
16297     {
16298       if (vex.register_specifier != 0)
16299         BadOp ();
16300       need_vex_reg = 0;
16301     }
16302   OP_XMM (bytemode, sizeflag);
16303 }
16304
16305 static struct op vex_cmp_op[] =
16306 {
16307   { STRING_COMMA_LEN ("eq") },
16308   { STRING_COMMA_LEN ("lt") },
16309   { STRING_COMMA_LEN ("le") },
16310   { STRING_COMMA_LEN ("unord") },
16311   { STRING_COMMA_LEN ("neq") },
16312   { STRING_COMMA_LEN ("nlt") },
16313   { STRING_COMMA_LEN ("nle") },
16314   { STRING_COMMA_LEN ("ord") },
16315   { STRING_COMMA_LEN ("eq_uq") },
16316   { STRING_COMMA_LEN ("nge") },
16317   { STRING_COMMA_LEN ("ngt") },
16318   { STRING_COMMA_LEN ("false") },
16319   { STRING_COMMA_LEN ("neq_oq") },
16320   { STRING_COMMA_LEN ("ge") },
16321   { STRING_COMMA_LEN ("gt") },
16322   { STRING_COMMA_LEN ("true") },
16323   { STRING_COMMA_LEN ("eq_os") },
16324   { STRING_COMMA_LEN ("lt_oq") },
16325   { STRING_COMMA_LEN ("le_oq") },
16326   { STRING_COMMA_LEN ("unord_s") },
16327   { STRING_COMMA_LEN ("neq_us") },
16328   { STRING_COMMA_LEN ("nlt_uq") },
16329   { STRING_COMMA_LEN ("nle_uq") },
16330   { STRING_COMMA_LEN ("ord_s") },
16331   { STRING_COMMA_LEN ("eq_us") },
16332   { STRING_COMMA_LEN ("nge_uq") },
16333   { STRING_COMMA_LEN ("ngt_uq") },
16334   { STRING_COMMA_LEN ("false_os") },
16335   { STRING_COMMA_LEN ("neq_os") },
16336   { STRING_COMMA_LEN ("ge_oq") },
16337   { STRING_COMMA_LEN ("gt_oq") },
16338   { STRING_COMMA_LEN ("true_us") },
16339 };
16340
16341 static void
16342 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16343 {
16344   unsigned int cmp_type;
16345
16346   FETCH_DATA (the_info, codep + 1);
16347   cmp_type = *codep++ & 0xff;
16348   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16349     {
16350       char suffix [3];
16351       char *p = mnemonicendp - 2;
16352       suffix[0] = p[0];
16353       suffix[1] = p[1];
16354       suffix[2] = '\0';
16355       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16356       mnemonicendp += vex_cmp_op[cmp_type].len;
16357     }
16358   else
16359     {
16360       /* We have a reserved extension byte.  Output it directly.  */
16361       scratchbuf[0] = '$';
16362       print_operand_value (scratchbuf + 1, 1, cmp_type);
16363       oappend_maybe_intel (scratchbuf);
16364       scratchbuf[0] = '\0';
16365     }
16366 }
16367
16368 static void
16369 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16370              int sizeflag ATTRIBUTE_UNUSED)
16371 {
16372   unsigned int cmp_type;
16373
16374   if (!vex.evex)
16375     abort ();
16376
16377   FETCH_DATA (the_info, codep + 1);
16378   cmp_type = *codep++ & 0xff;
16379   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16380      If it's the case, print suffix, otherwise - print the immediate.  */
16381   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16382       && cmp_type != 3
16383       && cmp_type != 7)
16384     {
16385       char suffix [3];
16386       char *p = mnemonicendp - 2;
16387
16388       /* vpcmp* can have both one- and two-lettered suffix.  */
16389       if (p[0] == 'p')
16390         {
16391           p++;
16392           suffix[0] = p[0];
16393           suffix[1] = '\0';
16394         }
16395       else
16396         {
16397           suffix[0] = p[0];
16398           suffix[1] = p[1];
16399           suffix[2] = '\0';
16400         }
16401
16402       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16403       mnemonicendp += simd_cmp_op[cmp_type].len;
16404     }
16405   else
16406     {
16407       /* We have a reserved extension byte.  Output it directly.  */
16408       scratchbuf[0] = '$';
16409       print_operand_value (scratchbuf + 1, 1, cmp_type);
16410       oappend_maybe_intel (scratchbuf);
16411       scratchbuf[0] = '\0';
16412     }
16413 }
16414
16415 static const struct op xop_cmp_op[] =
16416 {
16417   { STRING_COMMA_LEN ("lt") },
16418   { STRING_COMMA_LEN ("le") },
16419   { STRING_COMMA_LEN ("gt") },
16420   { STRING_COMMA_LEN ("ge") },
16421   { STRING_COMMA_LEN ("eq") },
16422   { STRING_COMMA_LEN ("neq") },
16423   { STRING_COMMA_LEN ("false") },
16424   { STRING_COMMA_LEN ("true") }
16425 };
16426
16427 static void
16428 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16429              int sizeflag ATTRIBUTE_UNUSED)
16430 {
16431   unsigned int cmp_type;
16432
16433   FETCH_DATA (the_info, codep + 1);
16434   cmp_type = *codep++ & 0xff;
16435   if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16436     {
16437       char suffix[3];
16438       char *p = mnemonicendp - 2;
16439
16440       /* vpcom* can have both one- and two-lettered suffix.  */
16441       if (p[0] == 'm')
16442         {
16443           p++;
16444           suffix[0] = p[0];
16445           suffix[1] = '\0';
16446         }
16447       else
16448         {
16449           suffix[0] = p[0];
16450           suffix[1] = p[1];
16451           suffix[2] = '\0';
16452         }
16453
16454       sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16455       mnemonicendp += xop_cmp_op[cmp_type].len;
16456     }
16457   else
16458     {
16459       /* We have a reserved extension byte.  Output it directly.  */
16460       scratchbuf[0] = '$';
16461       print_operand_value (scratchbuf + 1, 1, cmp_type);
16462       oappend_maybe_intel (scratchbuf);
16463       scratchbuf[0] = '\0';
16464     }
16465 }
16466
16467 static const struct op pclmul_op[] =
16468 {
16469   { STRING_COMMA_LEN ("lql") },
16470   { STRING_COMMA_LEN ("hql") },
16471   { STRING_COMMA_LEN ("lqh") },
16472   { STRING_COMMA_LEN ("hqh") }
16473 };
16474
16475 static void
16476 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16477               int sizeflag ATTRIBUTE_UNUSED)
16478 {
16479   unsigned int pclmul_type;
16480
16481   FETCH_DATA (the_info, codep + 1);
16482   pclmul_type = *codep++ & 0xff;
16483   switch (pclmul_type)
16484     {
16485     case 0x10:
16486       pclmul_type = 2;
16487       break;
16488     case 0x11:
16489       pclmul_type = 3;
16490       break;
16491     default:
16492       break;
16493     }
16494   if (pclmul_type < ARRAY_SIZE (pclmul_op))
16495     {
16496       char suffix [4];
16497       char *p = mnemonicendp - 3;
16498       suffix[0] = p[0];
16499       suffix[1] = p[1];
16500       suffix[2] = p[2];
16501       suffix[3] = '\0';
16502       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16503       mnemonicendp += pclmul_op[pclmul_type].len;
16504     }
16505   else
16506     {
16507       /* We have a reserved extension byte.  Output it directly.  */
16508       scratchbuf[0] = '$';
16509       print_operand_value (scratchbuf + 1, 1, pclmul_type);
16510       oappend_maybe_intel (scratchbuf);
16511       scratchbuf[0] = '\0';
16512     }
16513 }
16514
16515 static void
16516 MOVBE_Fixup (int bytemode, int sizeflag)
16517 {
16518   /* Add proper suffix to "movbe".  */
16519   char *p = mnemonicendp;
16520
16521   switch (bytemode)
16522     {
16523     case v_mode:
16524       if (intel_syntax)
16525         goto skip;
16526
16527       USED_REX (REX_W);
16528       if (sizeflag & SUFFIX_ALWAYS)
16529         {
16530           if (rex & REX_W)
16531             *p++ = 'q';
16532           else
16533             {
16534               if (sizeflag & DFLAG)
16535                 *p++ = 'l';
16536               else
16537                 *p++ = 'w';
16538               used_prefixes |= (prefixes & PREFIX_DATA);
16539             }
16540         }
16541       break;
16542     default:
16543       oappend (INTERNAL_DISASSEMBLER_ERROR);
16544       break;
16545     }
16546   mnemonicendp = p;
16547   *p = '\0';
16548
16549 skip:
16550   OP_M (bytemode, sizeflag);
16551 }
16552
16553 static void
16554 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16555 {
16556   int reg;
16557   const char **names;
16558
16559   /* Skip mod/rm byte.  */
16560   MODRM_CHECK;
16561   codep++;
16562
16563   if (rex & REX_W)
16564     names = names64;
16565   else
16566     names = names32;
16567
16568   reg = modrm.rm;
16569   USED_REX (REX_B);
16570   if (rex & REX_B)
16571     reg += 8;
16572
16573   oappend (names[reg]);
16574 }
16575
16576 static void
16577 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16578 {
16579   const char **names;
16580   unsigned int reg = vex.register_specifier;
16581
16582   if (rex & REX_W)
16583     names = names64;
16584   else
16585     names = names32;
16586
16587   if (address_mode != mode_64bit)
16588     reg &= 7;
16589   oappend (names[reg]);
16590 }
16591
16592 static void
16593 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16594 {
16595   if (!vex.evex
16596       || (bytemode != mask_mode && bytemode != mask_bd_mode))
16597     abort ();
16598
16599   USED_REX (REX_R);
16600   if ((rex & REX_R) != 0 || !vex.r)
16601     {
16602       BadOp ();
16603       return;
16604     }
16605
16606   oappend (names_mask [modrm.reg]);
16607 }
16608
16609 static void
16610 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16611 {
16612   if (!vex.evex
16613       || (bytemode != evex_rounding_mode
16614           && bytemode != evex_rounding_64_mode
16615           && bytemode != evex_sae_mode))
16616     abort ();
16617   if (modrm.mod == 3 && vex.b)
16618     switch (bytemode)
16619       {
16620       case evex_rounding_64_mode:
16621         if (address_mode != mode_64bit)
16622           {
16623             oappend ("(bad)");
16624             break;
16625           }
16626         /* Fall through.  */
16627       case evex_rounding_mode:
16628         oappend (names_rounding[vex.ll]);
16629         break;
16630       case evex_sae_mode:
16631         oappend ("{sae}");
16632         break;
16633       default:
16634         break;
16635       }
16636 }