d892eabe43e48bd4a93f2460f03119f24de94ac6
[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 Eq { OP_E, q_mode }
263 #define indirEv { OP_indirE, indir_v_mode }
264 #define indirEp { OP_indirE, f_mode }
265 #define stackEv { OP_E, stack_v_mode }
266 #define Em { OP_E, m_mode }
267 #define Ew { OP_E, w_mode }
268 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
269 #define Ma { OP_M, a_mode }
270 #define Mb { OP_M, b_mode }
271 #define Md { OP_M, d_mode }
272 #define Mo { OP_M, o_mode }
273 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
274 #define Mq { OP_M, q_mode }
275 #define Mv_bnd { OP_M, v_bndmk_mode }
276 #define Mx { OP_M, x_mode }
277 #define Mxmm { OP_M, xmm_mode }
278 #define Gb { OP_G, b_mode }
279 #define Gbnd { OP_G, bnd_mode }
280 #define Gv { OP_G, v_mode }
281 #define Gd { OP_G, d_mode }
282 #define Gdq { OP_G, dq_mode }
283 #define Gm { OP_G, m_mode }
284 #define Gva { OP_G, va_mode }
285 #define Gw { OP_G, w_mode }
286 #define Rd { OP_R, d_mode }
287 #define Rdq { OP_R, dq_mode }
288 #define Rm { OP_R, m_mode }
289 #define Ib { OP_I, b_mode }
290 #define sIb { OP_sI, b_mode }   /* sign extened byte */
291 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
292 #define Iv { OP_I, v_mode }
293 #define sIv { OP_sI, v_mode }
294 #define Iv64 { OP_I64, v_mode }
295 #define Id { OP_I, d_mode }
296 #define Iw { OP_I, w_mode }
297 #define I1 { OP_I, const_1_mode }
298 #define Jb { OP_J, b_mode }
299 #define Jv { OP_J, v_mode }
300 #define Cm { OP_C, m_mode }
301 #define Dm { OP_D, m_mode }
302 #define Td { OP_T, d_mode }
303 #define Skip_MODRM { OP_Skip_MODRM, 0 }
304
305 #define RMeAX { OP_REG, eAX_reg }
306 #define RMeBX { OP_REG, eBX_reg }
307 #define RMeCX { OP_REG, eCX_reg }
308 #define RMeDX { OP_REG, eDX_reg }
309 #define RMeSP { OP_REG, eSP_reg }
310 #define RMeBP { OP_REG, eBP_reg }
311 #define RMeSI { OP_REG, eSI_reg }
312 #define RMeDI { OP_REG, eDI_reg }
313 #define RMrAX { OP_REG, rAX_reg }
314 #define RMrBX { OP_REG, rBX_reg }
315 #define RMrCX { OP_REG, rCX_reg }
316 #define RMrDX { OP_REG, rDX_reg }
317 #define RMrSP { OP_REG, rSP_reg }
318 #define RMrBP { OP_REG, rBP_reg }
319 #define RMrSI { OP_REG, rSI_reg }
320 #define RMrDI { OP_REG, rDI_reg }
321 #define RMAL { OP_REG, al_reg }
322 #define RMCL { OP_REG, cl_reg }
323 #define RMDL { OP_REG, dl_reg }
324 #define RMBL { OP_REG, bl_reg }
325 #define RMAH { OP_REG, ah_reg }
326 #define RMCH { OP_REG, ch_reg }
327 #define RMDH { OP_REG, dh_reg }
328 #define RMBH { OP_REG, bh_reg }
329 #define RMAX { OP_REG, ax_reg }
330 #define RMDX { OP_REG, dx_reg }
331
332 #define eAX { OP_IMREG, eAX_reg }
333 #define eBX { OP_IMREG, eBX_reg }
334 #define eCX { OP_IMREG, eCX_reg }
335 #define eDX { OP_IMREG, eDX_reg }
336 #define eSP { OP_IMREG, eSP_reg }
337 #define eBP { OP_IMREG, eBP_reg }
338 #define eSI { OP_IMREG, eSI_reg }
339 #define eDI { OP_IMREG, eDI_reg }
340 #define AL { OP_IMREG, al_reg }
341 #define CL { OP_IMREG, cl_reg }
342 #define DL { OP_IMREG, dl_reg }
343 #define BL { OP_IMREG, bl_reg }
344 #define AH { OP_IMREG, ah_reg }
345 #define CH { OP_IMREG, ch_reg }
346 #define DH { OP_IMREG, dh_reg }
347 #define BH { OP_IMREG, bh_reg }
348 #define AX { OP_IMREG, ax_reg }
349 #define DX { OP_IMREG, dx_reg }
350 #define zAX { OP_IMREG, z_mode_ax_reg }
351 #define indirDX { OP_IMREG, indir_dx_reg }
352
353 #define Sw { OP_SEG, w_mode }
354 #define Sv { OP_SEG, v_mode }
355 #define Ap { OP_DIR, 0 }
356 #define Ob { OP_OFF64, b_mode }
357 #define Ov { OP_OFF64, v_mode }
358 #define Xb { OP_DSreg, eSI_reg }
359 #define Xv { OP_DSreg, eSI_reg }
360 #define Xz { OP_DSreg, eSI_reg }
361 #define Yb { OP_ESreg, eDI_reg }
362 #define Yv { OP_ESreg, eDI_reg }
363 #define DSBX { OP_DSreg, eBX_reg }
364
365 #define es { OP_REG, es_reg }
366 #define ss { OP_REG, ss_reg }
367 #define cs { OP_REG, cs_reg }
368 #define ds { OP_REG, ds_reg }
369 #define fs { OP_REG, fs_reg }
370 #define gs { OP_REG, gs_reg }
371
372 #define MX { OP_MMX, 0 }
373 #define XM { OP_XMM, 0 }
374 #define XMScalar { OP_XMM, scalar_mode }
375 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
376 #define XMM { OP_XMM, xmm_mode }
377 #define XMxmmq { OP_XMM, xmmq_mode }
378 #define EM { OP_EM, v_mode }
379 #define EMS { OP_EM, v_swap_mode }
380 #define EMd { OP_EM, d_mode }
381 #define EMx { OP_EM, x_mode }
382 #define EXbScalar { OP_EX, b_scalar_mode }
383 #define EXw { OP_EX, w_mode }
384 #define EXwScalar { OP_EX, w_scalar_mode }
385 #define EXd { OP_EX, d_mode }
386 #define EXdScalar { OP_EX, d_scalar_mode }
387 #define EXdS { OP_EX, d_swap_mode }
388 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
389 #define EXq { OP_EX, q_mode }
390 #define EXqScalar { OP_EX, q_scalar_mode }
391 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
392 #define EXqS { OP_EX, q_swap_mode }
393 #define EXx { OP_EX, x_mode }
394 #define EXxS { OP_EX, x_swap_mode }
395 #define EXxmm { OP_EX, xmm_mode }
396 #define EXymm { OP_EX, ymm_mode }
397 #define EXxmmq { OP_EX, xmmq_mode }
398 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
399 #define EXxmm_mb { OP_EX, xmm_mb_mode }
400 #define EXxmm_mw { OP_EX, xmm_mw_mode }
401 #define EXxmm_md { OP_EX, xmm_md_mode }
402 #define EXxmm_mq { OP_EX, xmm_mq_mode }
403 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
404 #define EXxmmdw { OP_EX, xmmdw_mode }
405 #define EXxmmqd { OP_EX, xmmqd_mode }
406 #define EXymmq { OP_EX, ymmq_mode }
407 #define EXVexWdq { OP_EX, vex_w_dq_mode }
408 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
409 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
410 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
411 #define MS { OP_MS, v_mode }
412 #define XS { OP_XS, v_mode }
413 #define EMCq { OP_EMC, q_mode }
414 #define MXC { OP_MXC, 0 }
415 #define OPSUF { OP_3DNowSuffix, 0 }
416 #define CMP { CMP_Fixup, 0 }
417 #define XMM0 { XMM_Fixup, 0 }
418 #define FXSAVE { FXSAVE_Fixup, 0 }
419 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
420 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
421
422 #define Vex { OP_VEX, vex_mode }
423 #define VexScalar { OP_VEX, vex_scalar_mode }
424 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
425 #define Vex128 { OP_VEX, vex128_mode }
426 #define Vex256 { OP_VEX, vex256_mode }
427 #define VexGdq { OP_VEX, dq_mode }
428 #define EXdVex { OP_EX_Vex, d_mode }
429 #define EXdVexS { OP_EX_Vex, d_swap_mode }
430 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
431 #define EXqVex { OP_EX_Vex, q_mode }
432 #define EXqVexS { OP_EX_Vex, q_swap_mode }
433 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
434 #define EXVexW { OP_EX_VexW, x_mode }
435 #define EXdVexW { OP_EX_VexW, d_mode }
436 #define EXqVexW { OP_EX_VexW, q_mode }
437 #define EXVexImmW { OP_EX_VexImmW, x_mode }
438 #define XMVex { OP_XMM_Vex, 0 }
439 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
440 #define XMVexW { OP_XMM_VexW, 0 }
441 #define XMVexI4 { OP_REG_VexI4, x_mode }
442 #define PCLMUL { PCLMUL_Fixup, 0 }
443 #define VCMP { VCMP_Fixup, 0 }
444 #define VPCMP { VPCMP_Fixup, 0 }
445 #define VPCOM { VPCOM_Fixup, 0 }
446
447 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
448 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
449 #define EXxEVexS { OP_Rounding, evex_sae_mode }
450
451 #define XMask { OP_Mask, mask_mode }
452 #define MaskG { OP_G, mask_mode }
453 #define MaskE { OP_E, mask_mode }
454 #define MaskBDE { OP_E, mask_bd_mode }
455 #define MaskR { OP_R, mask_mode }
456 #define MaskVex { OP_VEX, mask_mode }
457
458 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
459 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
460 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
461 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
462
463 /* Used handle "rep" prefix for string instructions.  */
464 #define Xbr { REP_Fixup, eSI_reg }
465 #define Xvr { REP_Fixup, eSI_reg }
466 #define Ybr { REP_Fixup, eDI_reg }
467 #define Yvr { REP_Fixup, eDI_reg }
468 #define Yzr { REP_Fixup, eDI_reg }
469 #define indirDXr { REP_Fixup, indir_dx_reg }
470 #define ALr { REP_Fixup, al_reg }
471 #define eAXr { REP_Fixup, eAX_reg }
472
473 /* Used handle HLE prefix for lockable instructions.  */
474 #define Ebh1 { HLE_Fixup1, b_mode }
475 #define Evh1 { HLE_Fixup1, v_mode }
476 #define Ebh2 { HLE_Fixup2, b_mode }
477 #define Evh2 { HLE_Fixup2, v_mode }
478 #define Ebh3 { HLE_Fixup3, b_mode }
479 #define Evh3 { HLE_Fixup3, v_mode }
480
481 #define BND { BND_Fixup, 0 }
482 #define NOTRACK { NOTRACK_Fixup, 0 }
483
484 #define cond_jump_flag { NULL, cond_jump_mode }
485 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
486
487 /* bits in sizeflag */
488 #define SUFFIX_ALWAYS 4
489 #define AFLAG 2
490 #define DFLAG 1
491
492 enum
493 {
494   /* byte operand */
495   b_mode = 1,
496   /* byte operand with operand swapped */
497   b_swap_mode,
498   /* byte operand, sign extend like 'T' suffix */
499   b_T_mode,
500   /* operand size depends on prefixes */
501   v_mode,
502   /* operand size depends on prefixes with operand swapped */
503   v_swap_mode,
504   /* operand size depends on address prefix */
505   va_mode,
506   /* word operand */
507   w_mode,
508   /* double word operand  */
509   d_mode,
510   /* double word operand with operand swapped */
511   d_swap_mode,
512   /* quad word operand */
513   q_mode,
514   /* quad word operand with operand swapped */
515   q_swap_mode,
516   /* ten-byte operand */
517   t_mode,
518   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
519      broadcast enabled.  */
520   x_mode,
521   /* Similar to x_mode, but with different EVEX mem shifts.  */
522   evex_x_gscat_mode,
523   /* Similar to x_mode, but with disabled broadcast.  */
524   evex_x_nobcst_mode,
525   /* Similar to x_mode, but with operands swapped and disabled broadcast
526      in EVEX.  */
527   x_swap_mode,
528   /* 16-byte XMM operand */
529   xmm_mode,
530   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
531      memory operand (depending on vector length).  Broadcast isn't
532      allowed.  */
533   xmmq_mode,
534   /* Same as xmmq_mode, but broadcast is allowed.  */
535   evex_half_bcst_xmmq_mode,
536   /* XMM register or byte memory operand */
537   xmm_mb_mode,
538   /* XMM register or word memory operand */
539   xmm_mw_mode,
540   /* XMM register or double word memory operand */
541   xmm_md_mode,
542   /* XMM register or quad word memory operand */
543   xmm_mq_mode,
544   /* XMM register or double/quad word memory operand, depending on
545      VEX.W.  */
546   xmm_mdq_mode,
547   /* 16-byte XMM, word, double word or quad word operand.  */
548   xmmdw_mode,
549   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
550   xmmqd_mode,
551   /* 32-byte YMM operand */
552   ymm_mode,
553   /* quad word, ymmword or zmmword memory operand.  */
554   ymmq_mode,
555   /* 32-byte YMM or 16-byte word operand */
556   ymmxmm_mode,
557   /* d_mode in 32bit, q_mode in 64bit mode.  */
558   m_mode,
559   /* pair of v_mode operands */
560   a_mode,
561   cond_jump_mode,
562   loop_jcxz_mode,
563   v_bnd_mode,
564   /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
565   v_bndmk_mode,
566   /* operand size depends on REX prefixes.  */
567   dq_mode,
568   /* registers like dq_mode, memory like w_mode.  */
569   dqw_mode,
570   /* bounds operand */
571   bnd_mode,
572   /* bounds operand with operand swapped */
573   bnd_swap_mode,
574   /* 4- or 6-byte pointer operand */
575   f_mode,
576   const_1_mode,
577   /* v_mode for indirect branch opcodes.  */
578   indir_v_mode,
579   /* v_mode for stack-related opcodes.  */
580   stack_v_mode,
581   /* non-quad operand size depends on prefixes */
582   z_mode,
583   /* 16-byte operand */
584   o_mode,
585   /* registers like dq_mode, memory like b_mode.  */
586   dqb_mode,
587   /* registers like d_mode, memory like b_mode.  */
588   db_mode,
589   /* registers like d_mode, memory like w_mode.  */
590   dw_mode,
591   /* registers like dq_mode, memory like d_mode.  */
592   dqd_mode,
593   /* normal vex mode */
594   vex_mode,
595   /* 128bit vex mode */
596   vex128_mode,
597   /* 256bit vex mode */
598   vex256_mode,
599   /* operand size depends on the VEX.W bit.  */
600   vex_w_dq_mode,
601
602   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
603   vex_vsib_d_w_dq_mode,
604   /* Similar to vex_vsib_d_w_dq_mode, with smaller memory.  */
605   vex_vsib_d_w_d_mode,
606   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
607   vex_vsib_q_w_dq_mode,
608   /* Similar to vex_vsib_q_w_dq_mode, with smaller memory.  */
609   vex_vsib_q_w_d_mode,
610
611   /* scalar, ignore vector length.  */
612   scalar_mode,
613   /* like b_mode, ignore vector length.  */
614   b_scalar_mode,
615   /* like w_mode, ignore vector length.  */
616   w_scalar_mode,
617   /* like d_mode, ignore vector length.  */
618   d_scalar_mode,
619   /* like d_swap_mode, ignore vector length.  */
620   d_scalar_swap_mode,
621   /* like q_mode, ignore vector length.  */
622   q_scalar_mode,
623   /* like q_swap_mode, ignore vector length.  */
624   q_scalar_swap_mode,
625   /* like vex_mode, ignore vector length.  */
626   vex_scalar_mode,
627   /* like vex_w_dq_mode, ignore vector length.  */
628   vex_scalar_w_dq_mode,
629
630   /* Static rounding.  */
631   evex_rounding_mode,
632   /* Static rounding, 64-bit mode only.  */
633   evex_rounding_64_mode,
634   /* Supress all exceptions.  */
635   evex_sae_mode,
636
637   /* Mask register operand.  */
638   mask_mode,
639   /* Mask register operand.  */
640   mask_bd_mode,
641
642   es_reg,
643   cs_reg,
644   ss_reg,
645   ds_reg,
646   fs_reg,
647   gs_reg,
648
649   eAX_reg,
650   eCX_reg,
651   eDX_reg,
652   eBX_reg,
653   eSP_reg,
654   eBP_reg,
655   eSI_reg,
656   eDI_reg,
657
658   al_reg,
659   cl_reg,
660   dl_reg,
661   bl_reg,
662   ah_reg,
663   ch_reg,
664   dh_reg,
665   bh_reg,
666
667   ax_reg,
668   cx_reg,
669   dx_reg,
670   bx_reg,
671   sp_reg,
672   bp_reg,
673   si_reg,
674   di_reg,
675
676   rAX_reg,
677   rCX_reg,
678   rDX_reg,
679   rBX_reg,
680   rSP_reg,
681   rBP_reg,
682   rSI_reg,
683   rDI_reg,
684
685   z_mode_ax_reg,
686   indir_dx_reg
687 };
688
689 enum
690 {
691   FLOATCODE = 1,
692   USE_REG_TABLE,
693   USE_MOD_TABLE,
694   USE_RM_TABLE,
695   USE_PREFIX_TABLE,
696   USE_X86_64_TABLE,
697   USE_3BYTE_TABLE,
698   USE_XOP_8F_TABLE,
699   USE_VEX_C4_TABLE,
700   USE_VEX_C5_TABLE,
701   USE_VEX_LEN_TABLE,
702   USE_VEX_W_TABLE,
703   USE_EVEX_TABLE,
704   USE_EVEX_LEN_TABLE
705 };
706
707 #define FLOAT                   NULL, { { NULL, FLOATCODE } }, 0
708
709 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
710 #define DIS386_PREFIX(T, I, P)          NULL, { { NULL, (T)}, { NULL,  (I) } }, P
711 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
712 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
713 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
714 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
715 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
716 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
717 #define THREE_BYTE_TABLE_PREFIX(I, P)   DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
718 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
719 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
720 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
721 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
722 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
723 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
724 #define EVEX_LEN_TABLE(I)       DIS386 (USE_EVEX_LEN_TABLE, (I))
725
726 enum
727 {
728   REG_80 = 0,
729   REG_81,
730   REG_83,
731   REG_8F,
732   REG_C0,
733   REG_C1,
734   REG_C6,
735   REG_C7,
736   REG_D0,
737   REG_D1,
738   REG_D2,
739   REG_D3,
740   REG_F6,
741   REG_F7,
742   REG_FE,
743   REG_FF,
744   REG_0F00,
745   REG_0F01,
746   REG_0F0D,
747   REG_0F18,
748   REG_0F1C_MOD_0,
749   REG_0F1E_MOD_3,
750   REG_0F71,
751   REG_0F72,
752   REG_0F73,
753   REG_0FA6,
754   REG_0FA7,
755   REG_0FAE,
756   REG_0FBA,
757   REG_0FC7,
758   REG_VEX_0F71,
759   REG_VEX_0F72,
760   REG_VEX_0F73,
761   REG_VEX_0FAE,
762   REG_VEX_0F38F3,
763   REG_XOP_LWPCB,
764   REG_XOP_LWP,
765   REG_XOP_TBM_01,
766   REG_XOP_TBM_02,
767
768   REG_EVEX_0F71,
769   REG_EVEX_0F72,
770   REG_EVEX_0F73,
771   REG_EVEX_0F38C6,
772   REG_EVEX_0F38C7
773 };
774
775 enum
776 {
777   MOD_8D = 0,
778   MOD_C6_REG_7,
779   MOD_C7_REG_7,
780   MOD_FF_REG_3,
781   MOD_FF_REG_5,
782   MOD_0F01_REG_0,
783   MOD_0F01_REG_1,
784   MOD_0F01_REG_2,
785   MOD_0F01_REG_3,
786   MOD_0F01_REG_5,
787   MOD_0F01_REG_7,
788   MOD_0F12_PREFIX_0,
789   MOD_0F13,
790   MOD_0F16_PREFIX_0,
791   MOD_0F17,
792   MOD_0F18_REG_0,
793   MOD_0F18_REG_1,
794   MOD_0F18_REG_2,
795   MOD_0F18_REG_3,
796   MOD_0F18_REG_4,
797   MOD_0F18_REG_5,
798   MOD_0F18_REG_6,
799   MOD_0F18_REG_7,
800   MOD_0F1A_PREFIX_0,
801   MOD_0F1B_PREFIX_0,
802   MOD_0F1B_PREFIX_1,
803   MOD_0F1C_PREFIX_0,
804   MOD_0F1E_PREFIX_1,
805   MOD_0F24,
806   MOD_0F26,
807   MOD_0F2B_PREFIX_0,
808   MOD_0F2B_PREFIX_1,
809   MOD_0F2B_PREFIX_2,
810   MOD_0F2B_PREFIX_3,
811   MOD_0F51,
812   MOD_0F71_REG_2,
813   MOD_0F71_REG_4,
814   MOD_0F71_REG_6,
815   MOD_0F72_REG_2,
816   MOD_0F72_REG_4,
817   MOD_0F72_REG_6,
818   MOD_0F73_REG_2,
819   MOD_0F73_REG_3,
820   MOD_0F73_REG_6,
821   MOD_0F73_REG_7,
822   MOD_0FAE_REG_0,
823   MOD_0FAE_REG_1,
824   MOD_0FAE_REG_2,
825   MOD_0FAE_REG_3,
826   MOD_0FAE_REG_4,
827   MOD_0FAE_REG_5,
828   MOD_0FAE_REG_6,
829   MOD_0FAE_REG_7,
830   MOD_0FB2,
831   MOD_0FB4,
832   MOD_0FB5,
833   MOD_0FC3,
834   MOD_0FC7_REG_3,
835   MOD_0FC7_REG_4,
836   MOD_0FC7_REG_5,
837   MOD_0FC7_REG_6,
838   MOD_0FC7_REG_7,
839   MOD_0FD7,
840   MOD_0FE7_PREFIX_2,
841   MOD_0FF0_PREFIX_3,
842   MOD_0F382A_PREFIX_2,
843   MOD_0F38F5_PREFIX_2,
844   MOD_0F38F6_PREFIX_0,
845   MOD_0F38F8_PREFIX_1,
846   MOD_0F38F8_PREFIX_2,
847   MOD_0F38F8_PREFIX_3,
848   MOD_0F38F9_PREFIX_0,
849   MOD_62_32BIT,
850   MOD_C4_32BIT,
851   MOD_C5_32BIT,
852   MOD_VEX_0F12_PREFIX_0,
853   MOD_VEX_0F13,
854   MOD_VEX_0F16_PREFIX_0,
855   MOD_VEX_0F17,
856   MOD_VEX_0F2B,
857   MOD_VEX_W_0_0F41_P_0_LEN_1,
858   MOD_VEX_W_1_0F41_P_0_LEN_1,
859   MOD_VEX_W_0_0F41_P_2_LEN_1,
860   MOD_VEX_W_1_0F41_P_2_LEN_1,
861   MOD_VEX_W_0_0F42_P_0_LEN_1,
862   MOD_VEX_W_1_0F42_P_0_LEN_1,
863   MOD_VEX_W_0_0F42_P_2_LEN_1,
864   MOD_VEX_W_1_0F42_P_2_LEN_1,
865   MOD_VEX_W_0_0F44_P_0_LEN_1,
866   MOD_VEX_W_1_0F44_P_0_LEN_1,
867   MOD_VEX_W_0_0F44_P_2_LEN_1,
868   MOD_VEX_W_1_0F44_P_2_LEN_1,
869   MOD_VEX_W_0_0F45_P_0_LEN_1,
870   MOD_VEX_W_1_0F45_P_0_LEN_1,
871   MOD_VEX_W_0_0F45_P_2_LEN_1,
872   MOD_VEX_W_1_0F45_P_2_LEN_1,
873   MOD_VEX_W_0_0F46_P_0_LEN_1,
874   MOD_VEX_W_1_0F46_P_0_LEN_1,
875   MOD_VEX_W_0_0F46_P_2_LEN_1,
876   MOD_VEX_W_1_0F46_P_2_LEN_1,
877   MOD_VEX_W_0_0F47_P_0_LEN_1,
878   MOD_VEX_W_1_0F47_P_0_LEN_1,
879   MOD_VEX_W_0_0F47_P_2_LEN_1,
880   MOD_VEX_W_1_0F47_P_2_LEN_1,
881   MOD_VEX_W_0_0F4A_P_0_LEN_1,
882   MOD_VEX_W_1_0F4A_P_0_LEN_1,
883   MOD_VEX_W_0_0F4A_P_2_LEN_1,
884   MOD_VEX_W_1_0F4A_P_2_LEN_1,
885   MOD_VEX_W_0_0F4B_P_0_LEN_1,
886   MOD_VEX_W_1_0F4B_P_0_LEN_1,
887   MOD_VEX_W_0_0F4B_P_2_LEN_1,
888   MOD_VEX_0F50,
889   MOD_VEX_0F71_REG_2,
890   MOD_VEX_0F71_REG_4,
891   MOD_VEX_0F71_REG_6,
892   MOD_VEX_0F72_REG_2,
893   MOD_VEX_0F72_REG_4,
894   MOD_VEX_0F72_REG_6,
895   MOD_VEX_0F73_REG_2,
896   MOD_VEX_0F73_REG_3,
897   MOD_VEX_0F73_REG_6,
898   MOD_VEX_0F73_REG_7,
899   MOD_VEX_W_0_0F91_P_0_LEN_0,
900   MOD_VEX_W_1_0F91_P_0_LEN_0,
901   MOD_VEX_W_0_0F91_P_2_LEN_0,
902   MOD_VEX_W_1_0F91_P_2_LEN_0,
903   MOD_VEX_W_0_0F92_P_0_LEN_0,
904   MOD_VEX_W_0_0F92_P_2_LEN_0,
905   MOD_VEX_0F92_P_3_LEN_0,
906   MOD_VEX_W_0_0F93_P_0_LEN_0,
907   MOD_VEX_W_0_0F93_P_2_LEN_0,
908   MOD_VEX_0F93_P_3_LEN_0,
909   MOD_VEX_W_0_0F98_P_0_LEN_0,
910   MOD_VEX_W_1_0F98_P_0_LEN_0,
911   MOD_VEX_W_0_0F98_P_2_LEN_0,
912   MOD_VEX_W_1_0F98_P_2_LEN_0,
913   MOD_VEX_W_0_0F99_P_0_LEN_0,
914   MOD_VEX_W_1_0F99_P_0_LEN_0,
915   MOD_VEX_W_0_0F99_P_2_LEN_0,
916   MOD_VEX_W_1_0F99_P_2_LEN_0,
917   MOD_VEX_0FAE_REG_2,
918   MOD_VEX_0FAE_REG_3,
919   MOD_VEX_0FD7_PREFIX_2,
920   MOD_VEX_0FE7_PREFIX_2,
921   MOD_VEX_0FF0_PREFIX_3,
922   MOD_VEX_0F381A_PREFIX_2,
923   MOD_VEX_0F382A_PREFIX_2,
924   MOD_VEX_0F382C_PREFIX_2,
925   MOD_VEX_0F382D_PREFIX_2,
926   MOD_VEX_0F382E_PREFIX_2,
927   MOD_VEX_0F382F_PREFIX_2,
928   MOD_VEX_0F385A_PREFIX_2,
929   MOD_VEX_0F388C_PREFIX_2,
930   MOD_VEX_0F388E_PREFIX_2,
931   MOD_VEX_W_0_0F3A30_P_2_LEN_0,
932   MOD_VEX_W_1_0F3A30_P_2_LEN_0,
933   MOD_VEX_W_0_0F3A31_P_2_LEN_0,
934   MOD_VEX_W_1_0F3A31_P_2_LEN_0,
935   MOD_VEX_W_0_0F3A32_P_2_LEN_0,
936   MOD_VEX_W_1_0F3A32_P_2_LEN_0,
937   MOD_VEX_W_0_0F3A33_P_2_LEN_0,
938   MOD_VEX_W_1_0F3A33_P_2_LEN_0,
939
940   MOD_EVEX_0F10_PREFIX_1,
941   MOD_EVEX_0F10_PREFIX_3,
942   MOD_EVEX_0F11_PREFIX_1,
943   MOD_EVEX_0F11_PREFIX_3,
944   MOD_EVEX_0F12_PREFIX_0,
945   MOD_EVEX_0F16_PREFIX_0,
946   MOD_EVEX_0F38C6_REG_1,
947   MOD_EVEX_0F38C6_REG_2,
948   MOD_EVEX_0F38C6_REG_5,
949   MOD_EVEX_0F38C6_REG_6,
950   MOD_EVEX_0F38C7_REG_1,
951   MOD_EVEX_0F38C7_REG_2,
952   MOD_EVEX_0F38C7_REG_5,
953   MOD_EVEX_0F38C7_REG_6
954 };
955
956 enum
957 {
958   RM_C6_REG_7 = 0,
959   RM_C7_REG_7,
960   RM_0F01_REG_0,
961   RM_0F01_REG_1,
962   RM_0F01_REG_2,
963   RM_0F01_REG_3,
964   RM_0F01_REG_5,
965   RM_0F01_REG_7,
966   RM_0F1E_MOD_3_REG_7,
967   RM_0FAE_REG_6,
968   RM_0FAE_REG_7
969 };
970
971 enum
972 {
973   PREFIX_90 = 0,
974   PREFIX_MOD_0_0F01_REG_5,
975   PREFIX_MOD_3_0F01_REG_5_RM_0,
976   PREFIX_MOD_3_0F01_REG_5_RM_2,
977   PREFIX_0F09,
978   PREFIX_0F10,
979   PREFIX_0F11,
980   PREFIX_0F12,
981   PREFIX_0F16,
982   PREFIX_0F1A,
983   PREFIX_0F1B,
984   PREFIX_0F1C,
985   PREFIX_0F1E,
986   PREFIX_0F2A,
987   PREFIX_0F2B,
988   PREFIX_0F2C,
989   PREFIX_0F2D,
990   PREFIX_0F2E,
991   PREFIX_0F2F,
992   PREFIX_0F51,
993   PREFIX_0F52,
994   PREFIX_0F53,
995   PREFIX_0F58,
996   PREFIX_0F59,
997   PREFIX_0F5A,
998   PREFIX_0F5B,
999   PREFIX_0F5C,
1000   PREFIX_0F5D,
1001   PREFIX_0F5E,
1002   PREFIX_0F5F,
1003   PREFIX_0F60,
1004   PREFIX_0F61,
1005   PREFIX_0F62,
1006   PREFIX_0F6C,
1007   PREFIX_0F6D,
1008   PREFIX_0F6F,
1009   PREFIX_0F70,
1010   PREFIX_0F73_REG_3,
1011   PREFIX_0F73_REG_7,
1012   PREFIX_0F78,
1013   PREFIX_0F79,
1014   PREFIX_0F7C,
1015   PREFIX_0F7D,
1016   PREFIX_0F7E,
1017   PREFIX_0F7F,
1018   PREFIX_0FAE_REG_0,
1019   PREFIX_0FAE_REG_1,
1020   PREFIX_0FAE_REG_2,
1021   PREFIX_0FAE_REG_3,
1022   PREFIX_MOD_0_0FAE_REG_4,
1023   PREFIX_MOD_3_0FAE_REG_4,
1024   PREFIX_MOD_0_0FAE_REG_5,
1025   PREFIX_MOD_3_0FAE_REG_5,
1026   PREFIX_MOD_0_0FAE_REG_6,
1027   PREFIX_MOD_1_0FAE_REG_6,
1028   PREFIX_0FAE_REG_7,
1029   PREFIX_0FB8,
1030   PREFIX_0FBC,
1031   PREFIX_0FBD,
1032   PREFIX_0FC2,
1033   PREFIX_MOD_0_0FC3,
1034   PREFIX_MOD_0_0FC7_REG_6,
1035   PREFIX_MOD_3_0FC7_REG_6,
1036   PREFIX_MOD_3_0FC7_REG_7,
1037   PREFIX_0FD0,
1038   PREFIX_0FD6,
1039   PREFIX_0FE6,
1040   PREFIX_0FE7,
1041   PREFIX_0FF0,
1042   PREFIX_0FF7,
1043   PREFIX_0F3810,
1044   PREFIX_0F3814,
1045   PREFIX_0F3815,
1046   PREFIX_0F3817,
1047   PREFIX_0F3820,
1048   PREFIX_0F3821,
1049   PREFIX_0F3822,
1050   PREFIX_0F3823,
1051   PREFIX_0F3824,
1052   PREFIX_0F3825,
1053   PREFIX_0F3828,
1054   PREFIX_0F3829,
1055   PREFIX_0F382A,
1056   PREFIX_0F382B,
1057   PREFIX_0F3830,
1058   PREFIX_0F3831,
1059   PREFIX_0F3832,
1060   PREFIX_0F3833,
1061   PREFIX_0F3834,
1062   PREFIX_0F3835,
1063   PREFIX_0F3837,
1064   PREFIX_0F3838,
1065   PREFIX_0F3839,
1066   PREFIX_0F383A,
1067   PREFIX_0F383B,
1068   PREFIX_0F383C,
1069   PREFIX_0F383D,
1070   PREFIX_0F383E,
1071   PREFIX_0F383F,
1072   PREFIX_0F3840,
1073   PREFIX_0F3841,
1074   PREFIX_0F3880,
1075   PREFIX_0F3881,
1076   PREFIX_0F3882,
1077   PREFIX_0F38C8,
1078   PREFIX_0F38C9,
1079   PREFIX_0F38CA,
1080   PREFIX_0F38CB,
1081   PREFIX_0F38CC,
1082   PREFIX_0F38CD,
1083   PREFIX_0F38CF,
1084   PREFIX_0F38DB,
1085   PREFIX_0F38DC,
1086   PREFIX_0F38DD,
1087   PREFIX_0F38DE,
1088   PREFIX_0F38DF,
1089   PREFIX_0F38F0,
1090   PREFIX_0F38F1,
1091   PREFIX_0F38F5,
1092   PREFIX_0F38F6,
1093   PREFIX_0F38F8,
1094   PREFIX_0F38F9,
1095   PREFIX_0F3A08,
1096   PREFIX_0F3A09,
1097   PREFIX_0F3A0A,
1098   PREFIX_0F3A0B,
1099   PREFIX_0F3A0C,
1100   PREFIX_0F3A0D,
1101   PREFIX_0F3A0E,
1102   PREFIX_0F3A14,
1103   PREFIX_0F3A15,
1104   PREFIX_0F3A16,
1105   PREFIX_0F3A17,
1106   PREFIX_0F3A20,
1107   PREFIX_0F3A21,
1108   PREFIX_0F3A22,
1109   PREFIX_0F3A40,
1110   PREFIX_0F3A41,
1111   PREFIX_0F3A42,
1112   PREFIX_0F3A44,
1113   PREFIX_0F3A60,
1114   PREFIX_0F3A61,
1115   PREFIX_0F3A62,
1116   PREFIX_0F3A63,
1117   PREFIX_0F3ACC,
1118   PREFIX_0F3ACE,
1119   PREFIX_0F3ACF,
1120   PREFIX_0F3ADF,
1121   PREFIX_VEX_0F10,
1122   PREFIX_VEX_0F11,
1123   PREFIX_VEX_0F12,
1124   PREFIX_VEX_0F16,
1125   PREFIX_VEX_0F2A,
1126   PREFIX_VEX_0F2C,
1127   PREFIX_VEX_0F2D,
1128   PREFIX_VEX_0F2E,
1129   PREFIX_VEX_0F2F,
1130   PREFIX_VEX_0F41,
1131   PREFIX_VEX_0F42,
1132   PREFIX_VEX_0F44,
1133   PREFIX_VEX_0F45,
1134   PREFIX_VEX_0F46,
1135   PREFIX_VEX_0F47,
1136   PREFIX_VEX_0F4A,
1137   PREFIX_VEX_0F4B,
1138   PREFIX_VEX_0F51,
1139   PREFIX_VEX_0F52,
1140   PREFIX_VEX_0F53,
1141   PREFIX_VEX_0F58,
1142   PREFIX_VEX_0F59,
1143   PREFIX_VEX_0F5A,
1144   PREFIX_VEX_0F5B,
1145   PREFIX_VEX_0F5C,
1146   PREFIX_VEX_0F5D,
1147   PREFIX_VEX_0F5E,
1148   PREFIX_VEX_0F5F,
1149   PREFIX_VEX_0F60,
1150   PREFIX_VEX_0F61,
1151   PREFIX_VEX_0F62,
1152   PREFIX_VEX_0F63,
1153   PREFIX_VEX_0F64,
1154   PREFIX_VEX_0F65,
1155   PREFIX_VEX_0F66,
1156   PREFIX_VEX_0F67,
1157   PREFIX_VEX_0F68,
1158   PREFIX_VEX_0F69,
1159   PREFIX_VEX_0F6A,
1160   PREFIX_VEX_0F6B,
1161   PREFIX_VEX_0F6C,
1162   PREFIX_VEX_0F6D,
1163   PREFIX_VEX_0F6E,
1164   PREFIX_VEX_0F6F,
1165   PREFIX_VEX_0F70,
1166   PREFIX_VEX_0F71_REG_2,
1167   PREFIX_VEX_0F71_REG_4,
1168   PREFIX_VEX_0F71_REG_6,
1169   PREFIX_VEX_0F72_REG_2,
1170   PREFIX_VEX_0F72_REG_4,
1171   PREFIX_VEX_0F72_REG_6,
1172   PREFIX_VEX_0F73_REG_2,
1173   PREFIX_VEX_0F73_REG_3,
1174   PREFIX_VEX_0F73_REG_6,
1175   PREFIX_VEX_0F73_REG_7,
1176   PREFIX_VEX_0F74,
1177   PREFIX_VEX_0F75,
1178   PREFIX_VEX_0F76,
1179   PREFIX_VEX_0F77,
1180   PREFIX_VEX_0F7C,
1181   PREFIX_VEX_0F7D,
1182   PREFIX_VEX_0F7E,
1183   PREFIX_VEX_0F7F,
1184   PREFIX_VEX_0F90,
1185   PREFIX_VEX_0F91,
1186   PREFIX_VEX_0F92,
1187   PREFIX_VEX_0F93,
1188   PREFIX_VEX_0F98,
1189   PREFIX_VEX_0F99,
1190   PREFIX_VEX_0FC2,
1191   PREFIX_VEX_0FC4,
1192   PREFIX_VEX_0FC5,
1193   PREFIX_VEX_0FD0,
1194   PREFIX_VEX_0FD1,
1195   PREFIX_VEX_0FD2,
1196   PREFIX_VEX_0FD3,
1197   PREFIX_VEX_0FD4,
1198   PREFIX_VEX_0FD5,
1199   PREFIX_VEX_0FD6,
1200   PREFIX_VEX_0FD7,
1201   PREFIX_VEX_0FD8,
1202   PREFIX_VEX_0FD9,
1203   PREFIX_VEX_0FDA,
1204   PREFIX_VEX_0FDB,
1205   PREFIX_VEX_0FDC,
1206   PREFIX_VEX_0FDD,
1207   PREFIX_VEX_0FDE,
1208   PREFIX_VEX_0FDF,
1209   PREFIX_VEX_0FE0,
1210   PREFIX_VEX_0FE1,
1211   PREFIX_VEX_0FE2,
1212   PREFIX_VEX_0FE3,
1213   PREFIX_VEX_0FE4,
1214   PREFIX_VEX_0FE5,
1215   PREFIX_VEX_0FE6,
1216   PREFIX_VEX_0FE7,
1217   PREFIX_VEX_0FE8,
1218   PREFIX_VEX_0FE9,
1219   PREFIX_VEX_0FEA,
1220   PREFIX_VEX_0FEB,
1221   PREFIX_VEX_0FEC,
1222   PREFIX_VEX_0FED,
1223   PREFIX_VEX_0FEE,
1224   PREFIX_VEX_0FEF,
1225   PREFIX_VEX_0FF0,
1226   PREFIX_VEX_0FF1,
1227   PREFIX_VEX_0FF2,
1228   PREFIX_VEX_0FF3,
1229   PREFIX_VEX_0FF4,
1230   PREFIX_VEX_0FF5,
1231   PREFIX_VEX_0FF6,
1232   PREFIX_VEX_0FF7,
1233   PREFIX_VEX_0FF8,
1234   PREFIX_VEX_0FF9,
1235   PREFIX_VEX_0FFA,
1236   PREFIX_VEX_0FFB,
1237   PREFIX_VEX_0FFC,
1238   PREFIX_VEX_0FFD,
1239   PREFIX_VEX_0FFE,
1240   PREFIX_VEX_0F3800,
1241   PREFIX_VEX_0F3801,
1242   PREFIX_VEX_0F3802,
1243   PREFIX_VEX_0F3803,
1244   PREFIX_VEX_0F3804,
1245   PREFIX_VEX_0F3805,
1246   PREFIX_VEX_0F3806,
1247   PREFIX_VEX_0F3807,
1248   PREFIX_VEX_0F3808,
1249   PREFIX_VEX_0F3809,
1250   PREFIX_VEX_0F380A,
1251   PREFIX_VEX_0F380B,
1252   PREFIX_VEX_0F380C,
1253   PREFIX_VEX_0F380D,
1254   PREFIX_VEX_0F380E,
1255   PREFIX_VEX_0F380F,
1256   PREFIX_VEX_0F3813,
1257   PREFIX_VEX_0F3816,
1258   PREFIX_VEX_0F3817,
1259   PREFIX_VEX_0F3818,
1260   PREFIX_VEX_0F3819,
1261   PREFIX_VEX_0F381A,
1262   PREFIX_VEX_0F381C,
1263   PREFIX_VEX_0F381D,
1264   PREFIX_VEX_0F381E,
1265   PREFIX_VEX_0F3820,
1266   PREFIX_VEX_0F3821,
1267   PREFIX_VEX_0F3822,
1268   PREFIX_VEX_0F3823,
1269   PREFIX_VEX_0F3824,
1270   PREFIX_VEX_0F3825,
1271   PREFIX_VEX_0F3828,
1272   PREFIX_VEX_0F3829,
1273   PREFIX_VEX_0F382A,
1274   PREFIX_VEX_0F382B,
1275   PREFIX_VEX_0F382C,
1276   PREFIX_VEX_0F382D,
1277   PREFIX_VEX_0F382E,
1278   PREFIX_VEX_0F382F,
1279   PREFIX_VEX_0F3830,
1280   PREFIX_VEX_0F3831,
1281   PREFIX_VEX_0F3832,
1282   PREFIX_VEX_0F3833,
1283   PREFIX_VEX_0F3834,
1284   PREFIX_VEX_0F3835,
1285   PREFIX_VEX_0F3836,
1286   PREFIX_VEX_0F3837,
1287   PREFIX_VEX_0F3838,
1288   PREFIX_VEX_0F3839,
1289   PREFIX_VEX_0F383A,
1290   PREFIX_VEX_0F383B,
1291   PREFIX_VEX_0F383C,
1292   PREFIX_VEX_0F383D,
1293   PREFIX_VEX_0F383E,
1294   PREFIX_VEX_0F383F,
1295   PREFIX_VEX_0F3840,
1296   PREFIX_VEX_0F3841,
1297   PREFIX_VEX_0F3845,
1298   PREFIX_VEX_0F3846,
1299   PREFIX_VEX_0F3847,
1300   PREFIX_VEX_0F3858,
1301   PREFIX_VEX_0F3859,
1302   PREFIX_VEX_0F385A,
1303   PREFIX_VEX_0F3878,
1304   PREFIX_VEX_0F3879,
1305   PREFIX_VEX_0F388C,
1306   PREFIX_VEX_0F388E,
1307   PREFIX_VEX_0F3890,
1308   PREFIX_VEX_0F3891,
1309   PREFIX_VEX_0F3892,
1310   PREFIX_VEX_0F3893,
1311   PREFIX_VEX_0F3896,
1312   PREFIX_VEX_0F3897,
1313   PREFIX_VEX_0F3898,
1314   PREFIX_VEX_0F3899,
1315   PREFIX_VEX_0F389A,
1316   PREFIX_VEX_0F389B,
1317   PREFIX_VEX_0F389C,
1318   PREFIX_VEX_0F389D,
1319   PREFIX_VEX_0F389E,
1320   PREFIX_VEX_0F389F,
1321   PREFIX_VEX_0F38A6,
1322   PREFIX_VEX_0F38A7,
1323   PREFIX_VEX_0F38A8,
1324   PREFIX_VEX_0F38A9,
1325   PREFIX_VEX_0F38AA,
1326   PREFIX_VEX_0F38AB,
1327   PREFIX_VEX_0F38AC,
1328   PREFIX_VEX_0F38AD,
1329   PREFIX_VEX_0F38AE,
1330   PREFIX_VEX_0F38AF,
1331   PREFIX_VEX_0F38B6,
1332   PREFIX_VEX_0F38B7,
1333   PREFIX_VEX_0F38B8,
1334   PREFIX_VEX_0F38B9,
1335   PREFIX_VEX_0F38BA,
1336   PREFIX_VEX_0F38BB,
1337   PREFIX_VEX_0F38BC,
1338   PREFIX_VEX_0F38BD,
1339   PREFIX_VEX_0F38BE,
1340   PREFIX_VEX_0F38BF,
1341   PREFIX_VEX_0F38CF,
1342   PREFIX_VEX_0F38DB,
1343   PREFIX_VEX_0F38DC,
1344   PREFIX_VEX_0F38DD,
1345   PREFIX_VEX_0F38DE,
1346   PREFIX_VEX_0F38DF,
1347   PREFIX_VEX_0F38F2,
1348   PREFIX_VEX_0F38F3_REG_1,
1349   PREFIX_VEX_0F38F3_REG_2,
1350   PREFIX_VEX_0F38F3_REG_3,
1351   PREFIX_VEX_0F38F5,
1352   PREFIX_VEX_0F38F6,
1353   PREFIX_VEX_0F38F7,
1354   PREFIX_VEX_0F3A00,
1355   PREFIX_VEX_0F3A01,
1356   PREFIX_VEX_0F3A02,
1357   PREFIX_VEX_0F3A04,
1358   PREFIX_VEX_0F3A05,
1359   PREFIX_VEX_0F3A06,
1360   PREFIX_VEX_0F3A08,
1361   PREFIX_VEX_0F3A09,
1362   PREFIX_VEX_0F3A0A,
1363   PREFIX_VEX_0F3A0B,
1364   PREFIX_VEX_0F3A0C,
1365   PREFIX_VEX_0F3A0D,
1366   PREFIX_VEX_0F3A0E,
1367   PREFIX_VEX_0F3A0F,
1368   PREFIX_VEX_0F3A14,
1369   PREFIX_VEX_0F3A15,
1370   PREFIX_VEX_0F3A16,
1371   PREFIX_VEX_0F3A17,
1372   PREFIX_VEX_0F3A18,
1373   PREFIX_VEX_0F3A19,
1374   PREFIX_VEX_0F3A1D,
1375   PREFIX_VEX_0F3A20,
1376   PREFIX_VEX_0F3A21,
1377   PREFIX_VEX_0F3A22,
1378   PREFIX_VEX_0F3A30,
1379   PREFIX_VEX_0F3A31,
1380   PREFIX_VEX_0F3A32,
1381   PREFIX_VEX_0F3A33,
1382   PREFIX_VEX_0F3A38,
1383   PREFIX_VEX_0F3A39,
1384   PREFIX_VEX_0F3A40,
1385   PREFIX_VEX_0F3A41,
1386   PREFIX_VEX_0F3A42,
1387   PREFIX_VEX_0F3A44,
1388   PREFIX_VEX_0F3A46,
1389   PREFIX_VEX_0F3A48,
1390   PREFIX_VEX_0F3A49,
1391   PREFIX_VEX_0F3A4A,
1392   PREFIX_VEX_0F3A4B,
1393   PREFIX_VEX_0F3A4C,
1394   PREFIX_VEX_0F3A5C,
1395   PREFIX_VEX_0F3A5D,
1396   PREFIX_VEX_0F3A5E,
1397   PREFIX_VEX_0F3A5F,
1398   PREFIX_VEX_0F3A60,
1399   PREFIX_VEX_0F3A61,
1400   PREFIX_VEX_0F3A62,
1401   PREFIX_VEX_0F3A63,
1402   PREFIX_VEX_0F3A68,
1403   PREFIX_VEX_0F3A69,
1404   PREFIX_VEX_0F3A6A,
1405   PREFIX_VEX_0F3A6B,
1406   PREFIX_VEX_0F3A6C,
1407   PREFIX_VEX_0F3A6D,
1408   PREFIX_VEX_0F3A6E,
1409   PREFIX_VEX_0F3A6F,
1410   PREFIX_VEX_0F3A78,
1411   PREFIX_VEX_0F3A79,
1412   PREFIX_VEX_0F3A7A,
1413   PREFIX_VEX_0F3A7B,
1414   PREFIX_VEX_0F3A7C,
1415   PREFIX_VEX_0F3A7D,
1416   PREFIX_VEX_0F3A7E,
1417   PREFIX_VEX_0F3A7F,
1418   PREFIX_VEX_0F3ACE,
1419   PREFIX_VEX_0F3ACF,
1420   PREFIX_VEX_0F3ADF,
1421   PREFIX_VEX_0F3AF0,
1422
1423   PREFIX_EVEX_0F10,
1424   PREFIX_EVEX_0F11,
1425   PREFIX_EVEX_0F12,
1426   PREFIX_EVEX_0F13,
1427   PREFIX_EVEX_0F14,
1428   PREFIX_EVEX_0F15,
1429   PREFIX_EVEX_0F16,
1430   PREFIX_EVEX_0F17,
1431   PREFIX_EVEX_0F28,
1432   PREFIX_EVEX_0F29,
1433   PREFIX_EVEX_0F2A,
1434   PREFIX_EVEX_0F2B,
1435   PREFIX_EVEX_0F2C,
1436   PREFIX_EVEX_0F2D,
1437   PREFIX_EVEX_0F2E,
1438   PREFIX_EVEX_0F2F,
1439   PREFIX_EVEX_0F51,
1440   PREFIX_EVEX_0F54,
1441   PREFIX_EVEX_0F55,
1442   PREFIX_EVEX_0F56,
1443   PREFIX_EVEX_0F57,
1444   PREFIX_EVEX_0F58,
1445   PREFIX_EVEX_0F59,
1446   PREFIX_EVEX_0F5A,
1447   PREFIX_EVEX_0F5B,
1448   PREFIX_EVEX_0F5C,
1449   PREFIX_EVEX_0F5D,
1450   PREFIX_EVEX_0F5E,
1451   PREFIX_EVEX_0F5F,
1452   PREFIX_EVEX_0F60,
1453   PREFIX_EVEX_0F61,
1454   PREFIX_EVEX_0F62,
1455   PREFIX_EVEX_0F63,
1456   PREFIX_EVEX_0F64,
1457   PREFIX_EVEX_0F65,
1458   PREFIX_EVEX_0F66,
1459   PREFIX_EVEX_0F67,
1460   PREFIX_EVEX_0F68,
1461   PREFIX_EVEX_0F69,
1462   PREFIX_EVEX_0F6A,
1463   PREFIX_EVEX_0F6B,
1464   PREFIX_EVEX_0F6C,
1465   PREFIX_EVEX_0F6D,
1466   PREFIX_EVEX_0F6E,
1467   PREFIX_EVEX_0F6F,
1468   PREFIX_EVEX_0F70,
1469   PREFIX_EVEX_0F71_REG_2,
1470   PREFIX_EVEX_0F71_REG_4,
1471   PREFIX_EVEX_0F71_REG_6,
1472   PREFIX_EVEX_0F72_REG_0,
1473   PREFIX_EVEX_0F72_REG_1,
1474   PREFIX_EVEX_0F72_REG_2,
1475   PREFIX_EVEX_0F72_REG_4,
1476   PREFIX_EVEX_0F72_REG_6,
1477   PREFIX_EVEX_0F73_REG_2,
1478   PREFIX_EVEX_0F73_REG_3,
1479   PREFIX_EVEX_0F73_REG_6,
1480   PREFIX_EVEX_0F73_REG_7,
1481   PREFIX_EVEX_0F74,
1482   PREFIX_EVEX_0F75,
1483   PREFIX_EVEX_0F76,
1484   PREFIX_EVEX_0F78,
1485   PREFIX_EVEX_0F79,
1486   PREFIX_EVEX_0F7A,
1487   PREFIX_EVEX_0F7B,
1488   PREFIX_EVEX_0F7E,
1489   PREFIX_EVEX_0F7F,
1490   PREFIX_EVEX_0FC2,
1491   PREFIX_EVEX_0FC4,
1492   PREFIX_EVEX_0FC5,
1493   PREFIX_EVEX_0FC6,
1494   PREFIX_EVEX_0FD1,
1495   PREFIX_EVEX_0FD2,
1496   PREFIX_EVEX_0FD3,
1497   PREFIX_EVEX_0FD4,
1498   PREFIX_EVEX_0FD5,
1499   PREFIX_EVEX_0FD6,
1500   PREFIX_EVEX_0FD8,
1501   PREFIX_EVEX_0FD9,
1502   PREFIX_EVEX_0FDA,
1503   PREFIX_EVEX_0FDB,
1504   PREFIX_EVEX_0FDC,
1505   PREFIX_EVEX_0FDD,
1506   PREFIX_EVEX_0FDE,
1507   PREFIX_EVEX_0FDF,
1508   PREFIX_EVEX_0FE0,
1509   PREFIX_EVEX_0FE1,
1510   PREFIX_EVEX_0FE2,
1511   PREFIX_EVEX_0FE3,
1512   PREFIX_EVEX_0FE4,
1513   PREFIX_EVEX_0FE5,
1514   PREFIX_EVEX_0FE6,
1515   PREFIX_EVEX_0FE7,
1516   PREFIX_EVEX_0FE8,
1517   PREFIX_EVEX_0FE9,
1518   PREFIX_EVEX_0FEA,
1519   PREFIX_EVEX_0FEB,
1520   PREFIX_EVEX_0FEC,
1521   PREFIX_EVEX_0FED,
1522   PREFIX_EVEX_0FEE,
1523   PREFIX_EVEX_0FEF,
1524   PREFIX_EVEX_0FF1,
1525   PREFIX_EVEX_0FF2,
1526   PREFIX_EVEX_0FF3,
1527   PREFIX_EVEX_0FF4,
1528   PREFIX_EVEX_0FF5,
1529   PREFIX_EVEX_0FF6,
1530   PREFIX_EVEX_0FF8,
1531   PREFIX_EVEX_0FF9,
1532   PREFIX_EVEX_0FFA,
1533   PREFIX_EVEX_0FFB,
1534   PREFIX_EVEX_0FFC,
1535   PREFIX_EVEX_0FFD,
1536   PREFIX_EVEX_0FFE,
1537   PREFIX_EVEX_0F3800,
1538   PREFIX_EVEX_0F3804,
1539   PREFIX_EVEX_0F380B,
1540   PREFIX_EVEX_0F380C,
1541   PREFIX_EVEX_0F380D,
1542   PREFIX_EVEX_0F3810,
1543   PREFIX_EVEX_0F3811,
1544   PREFIX_EVEX_0F3812,
1545   PREFIX_EVEX_0F3813,
1546   PREFIX_EVEX_0F3814,
1547   PREFIX_EVEX_0F3815,
1548   PREFIX_EVEX_0F3816,
1549   PREFIX_EVEX_0F3818,
1550   PREFIX_EVEX_0F3819,
1551   PREFIX_EVEX_0F381A,
1552   PREFIX_EVEX_0F381B,
1553   PREFIX_EVEX_0F381C,
1554   PREFIX_EVEX_0F381D,
1555   PREFIX_EVEX_0F381E,
1556   PREFIX_EVEX_0F381F,
1557   PREFIX_EVEX_0F3820,
1558   PREFIX_EVEX_0F3821,
1559   PREFIX_EVEX_0F3822,
1560   PREFIX_EVEX_0F3823,
1561   PREFIX_EVEX_0F3824,
1562   PREFIX_EVEX_0F3825,
1563   PREFIX_EVEX_0F3826,
1564   PREFIX_EVEX_0F3827,
1565   PREFIX_EVEX_0F3828,
1566   PREFIX_EVEX_0F3829,
1567   PREFIX_EVEX_0F382A,
1568   PREFIX_EVEX_0F382B,
1569   PREFIX_EVEX_0F382C,
1570   PREFIX_EVEX_0F382D,
1571   PREFIX_EVEX_0F3830,
1572   PREFIX_EVEX_0F3831,
1573   PREFIX_EVEX_0F3832,
1574   PREFIX_EVEX_0F3833,
1575   PREFIX_EVEX_0F3834,
1576   PREFIX_EVEX_0F3835,
1577   PREFIX_EVEX_0F3836,
1578   PREFIX_EVEX_0F3837,
1579   PREFIX_EVEX_0F3838,
1580   PREFIX_EVEX_0F3839,
1581   PREFIX_EVEX_0F383A,
1582   PREFIX_EVEX_0F383B,
1583   PREFIX_EVEX_0F383C,
1584   PREFIX_EVEX_0F383D,
1585   PREFIX_EVEX_0F383E,
1586   PREFIX_EVEX_0F383F,
1587   PREFIX_EVEX_0F3840,
1588   PREFIX_EVEX_0F3842,
1589   PREFIX_EVEX_0F3843,
1590   PREFIX_EVEX_0F3844,
1591   PREFIX_EVEX_0F3845,
1592   PREFIX_EVEX_0F3846,
1593   PREFIX_EVEX_0F3847,
1594   PREFIX_EVEX_0F384C,
1595   PREFIX_EVEX_0F384D,
1596   PREFIX_EVEX_0F384E,
1597   PREFIX_EVEX_0F384F,
1598   PREFIX_EVEX_0F3850,
1599   PREFIX_EVEX_0F3851,
1600   PREFIX_EVEX_0F3852,
1601   PREFIX_EVEX_0F3853,
1602   PREFIX_EVEX_0F3854,
1603   PREFIX_EVEX_0F3855,
1604   PREFIX_EVEX_0F3858,
1605   PREFIX_EVEX_0F3859,
1606   PREFIX_EVEX_0F385A,
1607   PREFIX_EVEX_0F385B,
1608   PREFIX_EVEX_0F3862,
1609   PREFIX_EVEX_0F3863,
1610   PREFIX_EVEX_0F3864,
1611   PREFIX_EVEX_0F3865,
1612   PREFIX_EVEX_0F3866,
1613   PREFIX_EVEX_0F3868,
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   EVEX_LEN_0F3819_P_2_W_0,
1939   EVEX_LEN_0F3819_P_2_W_1,
1940   EVEX_LEN_0F381A_P_2_W_0,
1941   EVEX_LEN_0F381A_P_2_W_1,
1942   EVEX_LEN_0F381B_P_2_W_0,
1943   EVEX_LEN_0F381B_P_2_W_1,
1944   EVEX_LEN_0F385A_P_2_W_0,
1945   EVEX_LEN_0F385A_P_2_W_1,
1946   EVEX_LEN_0F385B_P_2_W_0,
1947   EVEX_LEN_0F385B_P_2_W_1,
1948   EVEX_LEN_0F3A18_P_2_W_0,
1949   EVEX_LEN_0F3A18_P_2_W_1,
1950   EVEX_LEN_0F3A19_P_2_W_0,
1951   EVEX_LEN_0F3A19_P_2_W_1,
1952   EVEX_LEN_0F3A1A_P_2_W_0,
1953   EVEX_LEN_0F3A1A_P_2_W_1,
1954   EVEX_LEN_0F3A1B_P_2_W_0,
1955   EVEX_LEN_0F3A1B_P_2_W_1,
1956   EVEX_LEN_0F3A23_P_2_W_0,
1957   EVEX_LEN_0F3A23_P_2_W_1,
1958   EVEX_LEN_0F3A38_P_2_W_0,
1959   EVEX_LEN_0F3A38_P_2_W_1,
1960   EVEX_LEN_0F3A39_P_2_W_0,
1961   EVEX_LEN_0F3A39_P_2_W_1,
1962   EVEX_LEN_0F3A3A_P_2_W_0,
1963   EVEX_LEN_0F3A3A_P_2_W_1,
1964   EVEX_LEN_0F3A3B_P_2_W_0,
1965   EVEX_LEN_0F3A3B_P_2_W_1,
1966   EVEX_LEN_0F3A43_P_2_W_0,
1967   EVEX_LEN_0F3A43_P_2_W_1
1968 };
1969
1970 enum
1971 {
1972   VEX_W_0F41_P_0_LEN_1 = 0,
1973   VEX_W_0F41_P_2_LEN_1,
1974   VEX_W_0F42_P_0_LEN_1,
1975   VEX_W_0F42_P_2_LEN_1,
1976   VEX_W_0F44_P_0_LEN_0,
1977   VEX_W_0F44_P_2_LEN_0,
1978   VEX_W_0F45_P_0_LEN_1,
1979   VEX_W_0F45_P_2_LEN_1,
1980   VEX_W_0F46_P_0_LEN_1,
1981   VEX_W_0F46_P_2_LEN_1,
1982   VEX_W_0F47_P_0_LEN_1,
1983   VEX_W_0F47_P_2_LEN_1,
1984   VEX_W_0F4A_P_0_LEN_1,
1985   VEX_W_0F4A_P_2_LEN_1,
1986   VEX_W_0F4B_P_0_LEN_1,
1987   VEX_W_0F4B_P_2_LEN_1,
1988   VEX_W_0F90_P_0_LEN_0,
1989   VEX_W_0F90_P_2_LEN_0,
1990   VEX_W_0F91_P_0_LEN_0,
1991   VEX_W_0F91_P_2_LEN_0,
1992   VEX_W_0F92_P_0_LEN_0,
1993   VEX_W_0F92_P_2_LEN_0,
1994   VEX_W_0F93_P_0_LEN_0,
1995   VEX_W_0F93_P_2_LEN_0,
1996   VEX_W_0F98_P_0_LEN_0,
1997   VEX_W_0F98_P_2_LEN_0,
1998   VEX_W_0F99_P_0_LEN_0,
1999   VEX_W_0F99_P_2_LEN_0,
2000   VEX_W_0F380C_P_2,
2001   VEX_W_0F380D_P_2,
2002   VEX_W_0F380E_P_2,
2003   VEX_W_0F380F_P_2,
2004   VEX_W_0F3816_P_2,
2005   VEX_W_0F3818_P_2,
2006   VEX_W_0F3819_P_2,
2007   VEX_W_0F381A_P_2_M_0,
2008   VEX_W_0F382C_P_2_M_0,
2009   VEX_W_0F382D_P_2_M_0,
2010   VEX_W_0F382E_P_2_M_0,
2011   VEX_W_0F382F_P_2_M_0,
2012   VEX_W_0F3836_P_2,
2013   VEX_W_0F3846_P_2,
2014   VEX_W_0F3858_P_2,
2015   VEX_W_0F3859_P_2,
2016   VEX_W_0F385A_P_2_M_0,
2017   VEX_W_0F3878_P_2,
2018   VEX_W_0F3879_P_2,
2019   VEX_W_0F38CF_P_2,
2020   VEX_W_0F3A00_P_2,
2021   VEX_W_0F3A01_P_2,
2022   VEX_W_0F3A02_P_2,
2023   VEX_W_0F3A04_P_2,
2024   VEX_W_0F3A05_P_2,
2025   VEX_W_0F3A06_P_2,
2026   VEX_W_0F3A18_P_2,
2027   VEX_W_0F3A19_P_2,
2028   VEX_W_0F3A30_P_2_LEN_0,
2029   VEX_W_0F3A31_P_2_LEN_0,
2030   VEX_W_0F3A32_P_2_LEN_0,
2031   VEX_W_0F3A33_P_2_LEN_0,
2032   VEX_W_0F3A38_P_2,
2033   VEX_W_0F3A39_P_2,
2034   VEX_W_0F3A46_P_2,
2035   VEX_W_0F3A48_P_2,
2036   VEX_W_0F3A49_P_2,
2037   VEX_W_0F3A4A_P_2,
2038   VEX_W_0F3A4B_P_2,
2039   VEX_W_0F3A4C_P_2,
2040   VEX_W_0F3ACE_P_2,
2041   VEX_W_0F3ACF_P_2,
2042
2043   EVEX_W_0F10_P_0,
2044   EVEX_W_0F10_P_1_M_0,
2045   EVEX_W_0F10_P_1_M_1,
2046   EVEX_W_0F10_P_2,
2047   EVEX_W_0F10_P_3_M_0,
2048   EVEX_W_0F10_P_3_M_1,
2049   EVEX_W_0F11_P_0,
2050   EVEX_W_0F11_P_1_M_0,
2051   EVEX_W_0F11_P_1_M_1,
2052   EVEX_W_0F11_P_2,
2053   EVEX_W_0F11_P_3_M_0,
2054   EVEX_W_0F11_P_3_M_1,
2055   EVEX_W_0F12_P_0_M_0,
2056   EVEX_W_0F12_P_0_M_1,
2057   EVEX_W_0F12_P_1,
2058   EVEX_W_0F12_P_2,
2059   EVEX_W_0F12_P_3,
2060   EVEX_W_0F13_P_0,
2061   EVEX_W_0F13_P_2,
2062   EVEX_W_0F14_P_0,
2063   EVEX_W_0F14_P_2,
2064   EVEX_W_0F15_P_0,
2065   EVEX_W_0F15_P_2,
2066   EVEX_W_0F16_P_0_M_0,
2067   EVEX_W_0F16_P_0_M_1,
2068   EVEX_W_0F16_P_1,
2069   EVEX_W_0F16_P_2,
2070   EVEX_W_0F17_P_0,
2071   EVEX_W_0F17_P_2,
2072   EVEX_W_0F28_P_0,
2073   EVEX_W_0F28_P_2,
2074   EVEX_W_0F29_P_0,
2075   EVEX_W_0F29_P_2,
2076   EVEX_W_0F2A_P_3,
2077   EVEX_W_0F2B_P_0,
2078   EVEX_W_0F2B_P_2,
2079   EVEX_W_0F2E_P_0,
2080   EVEX_W_0F2E_P_2,
2081   EVEX_W_0F2F_P_0,
2082   EVEX_W_0F2F_P_2,
2083   EVEX_W_0F51_P_0,
2084   EVEX_W_0F51_P_1,
2085   EVEX_W_0F51_P_2,
2086   EVEX_W_0F51_P_3,
2087   EVEX_W_0F54_P_0,
2088   EVEX_W_0F54_P_2,
2089   EVEX_W_0F55_P_0,
2090   EVEX_W_0F55_P_2,
2091   EVEX_W_0F56_P_0,
2092   EVEX_W_0F56_P_2,
2093   EVEX_W_0F57_P_0,
2094   EVEX_W_0F57_P_2,
2095   EVEX_W_0F58_P_0,
2096   EVEX_W_0F58_P_1,
2097   EVEX_W_0F58_P_2,
2098   EVEX_W_0F58_P_3,
2099   EVEX_W_0F59_P_0,
2100   EVEX_W_0F59_P_1,
2101   EVEX_W_0F59_P_2,
2102   EVEX_W_0F59_P_3,
2103   EVEX_W_0F5A_P_0,
2104   EVEX_W_0F5A_P_1,
2105   EVEX_W_0F5A_P_2,
2106   EVEX_W_0F5A_P_3,
2107   EVEX_W_0F5B_P_0,
2108   EVEX_W_0F5B_P_1,
2109   EVEX_W_0F5B_P_2,
2110   EVEX_W_0F5C_P_0,
2111   EVEX_W_0F5C_P_1,
2112   EVEX_W_0F5C_P_2,
2113   EVEX_W_0F5C_P_3,
2114   EVEX_W_0F5D_P_0,
2115   EVEX_W_0F5D_P_1,
2116   EVEX_W_0F5D_P_2,
2117   EVEX_W_0F5D_P_3,
2118   EVEX_W_0F5E_P_0,
2119   EVEX_W_0F5E_P_1,
2120   EVEX_W_0F5E_P_2,
2121   EVEX_W_0F5E_P_3,
2122   EVEX_W_0F5F_P_0,
2123   EVEX_W_0F5F_P_1,
2124   EVEX_W_0F5F_P_2,
2125   EVEX_W_0F5F_P_3,
2126   EVEX_W_0F62_P_2,
2127   EVEX_W_0F66_P_2,
2128   EVEX_W_0F6A_P_2,
2129   EVEX_W_0F6B_P_2,
2130   EVEX_W_0F6C_P_2,
2131   EVEX_W_0F6D_P_2,
2132   EVEX_W_0F6F_P_1,
2133   EVEX_W_0F6F_P_2,
2134   EVEX_W_0F6F_P_3,
2135   EVEX_W_0F70_P_2,
2136   EVEX_W_0F72_R_2_P_2,
2137   EVEX_W_0F72_R_6_P_2,
2138   EVEX_W_0F73_R_2_P_2,
2139   EVEX_W_0F73_R_6_P_2,
2140   EVEX_W_0F76_P_2,
2141   EVEX_W_0F78_P_0,
2142   EVEX_W_0F78_P_2,
2143   EVEX_W_0F79_P_0,
2144   EVEX_W_0F79_P_2,
2145   EVEX_W_0F7A_P_1,
2146   EVEX_W_0F7A_P_2,
2147   EVEX_W_0F7A_P_3,
2148   EVEX_W_0F7B_P_2,
2149   EVEX_W_0F7B_P_3,
2150   EVEX_W_0F7E_P_1,
2151   EVEX_W_0F7F_P_1,
2152   EVEX_W_0F7F_P_2,
2153   EVEX_W_0F7F_P_3,
2154   EVEX_W_0FC2_P_0,
2155   EVEX_W_0FC2_P_1,
2156   EVEX_W_0FC2_P_2,
2157   EVEX_W_0FC2_P_3,
2158   EVEX_W_0FC6_P_0,
2159   EVEX_W_0FC6_P_2,
2160   EVEX_W_0FD2_P_2,
2161   EVEX_W_0FD3_P_2,
2162   EVEX_W_0FD4_P_2,
2163   EVEX_W_0FD6_P_2,
2164   EVEX_W_0FE6_P_1,
2165   EVEX_W_0FE6_P_2,
2166   EVEX_W_0FE6_P_3,
2167   EVEX_W_0FE7_P_2,
2168   EVEX_W_0FF2_P_2,
2169   EVEX_W_0FF3_P_2,
2170   EVEX_W_0FF4_P_2,
2171   EVEX_W_0FFA_P_2,
2172   EVEX_W_0FFB_P_2,
2173   EVEX_W_0FFE_P_2,
2174   EVEX_W_0F380C_P_2,
2175   EVEX_W_0F380D_P_2,
2176   EVEX_W_0F3810_P_1,
2177   EVEX_W_0F3810_P_2,
2178   EVEX_W_0F3811_P_1,
2179   EVEX_W_0F3811_P_2,
2180   EVEX_W_0F3812_P_1,
2181   EVEX_W_0F3812_P_2,
2182   EVEX_W_0F3813_P_1,
2183   EVEX_W_0F3813_P_2,
2184   EVEX_W_0F3814_P_1,
2185   EVEX_W_0F3815_P_1,
2186   EVEX_W_0F3818_P_2,
2187   EVEX_W_0F3819_P_2,
2188   EVEX_W_0F381A_P_2,
2189   EVEX_W_0F381B_P_2,
2190   EVEX_W_0F381E_P_2,
2191   EVEX_W_0F381F_P_2,
2192   EVEX_W_0F3820_P_1,
2193   EVEX_W_0F3821_P_1,
2194   EVEX_W_0F3822_P_1,
2195   EVEX_W_0F3823_P_1,
2196   EVEX_W_0F3824_P_1,
2197   EVEX_W_0F3825_P_1,
2198   EVEX_W_0F3825_P_2,
2199   EVEX_W_0F3826_P_1,
2200   EVEX_W_0F3826_P_2,
2201   EVEX_W_0F3828_P_1,
2202   EVEX_W_0F3828_P_2,
2203   EVEX_W_0F3829_P_1,
2204   EVEX_W_0F3829_P_2,
2205   EVEX_W_0F382A_P_1,
2206   EVEX_W_0F382A_P_2,
2207   EVEX_W_0F382B_P_2,
2208   EVEX_W_0F3830_P_1,
2209   EVEX_W_0F3831_P_1,
2210   EVEX_W_0F3832_P_1,
2211   EVEX_W_0F3833_P_1,
2212   EVEX_W_0F3834_P_1,
2213   EVEX_W_0F3835_P_1,
2214   EVEX_W_0F3835_P_2,
2215   EVEX_W_0F3837_P_2,
2216   EVEX_W_0F3838_P_1,
2217   EVEX_W_0F3839_P_1,
2218   EVEX_W_0F383A_P_1,
2219   EVEX_W_0F3840_P_2,
2220   EVEX_W_0F3852_P_1,
2221   EVEX_W_0F3854_P_2,
2222   EVEX_W_0F3855_P_2,
2223   EVEX_W_0F3858_P_2,
2224   EVEX_W_0F3859_P_2,
2225   EVEX_W_0F385A_P_2,
2226   EVEX_W_0F385B_P_2,
2227   EVEX_W_0F3862_P_2,
2228   EVEX_W_0F3863_P_2,
2229   EVEX_W_0F3866_P_2,
2230   EVEX_W_0F3868_P_3,
2231   EVEX_W_0F3870_P_2,
2232   EVEX_W_0F3871_P_2,
2233   EVEX_W_0F3872_P_1,
2234   EVEX_W_0F3872_P_2,
2235   EVEX_W_0F3872_P_3,
2236   EVEX_W_0F3873_P_2,
2237   EVEX_W_0F3875_P_2,
2238   EVEX_W_0F3878_P_2,
2239   EVEX_W_0F3879_P_2,
2240   EVEX_W_0F387A_P_2,
2241   EVEX_W_0F387B_P_2,
2242   EVEX_W_0F387D_P_2,
2243   EVEX_W_0F3883_P_2,
2244   EVEX_W_0F388D_P_2,
2245   EVEX_W_0F3891_P_2,
2246   EVEX_W_0F3893_P_2,
2247   EVEX_W_0F38A1_P_2,
2248   EVEX_W_0F38A3_P_2,
2249   EVEX_W_0F38C7_R_1_P_2,
2250   EVEX_W_0F38C7_R_2_P_2,
2251   EVEX_W_0F38C7_R_5_P_2,
2252   EVEX_W_0F38C7_R_6_P_2,
2253
2254   EVEX_W_0F3A00_P_2,
2255   EVEX_W_0F3A01_P_2,
2256   EVEX_W_0F3A04_P_2,
2257   EVEX_W_0F3A05_P_2,
2258   EVEX_W_0F3A08_P_2,
2259   EVEX_W_0F3A09_P_2,
2260   EVEX_W_0F3A0A_P_2,
2261   EVEX_W_0F3A0B_P_2,
2262   EVEX_W_0F3A18_P_2,
2263   EVEX_W_0F3A19_P_2,
2264   EVEX_W_0F3A1A_P_2,
2265   EVEX_W_0F3A1B_P_2,
2266   EVEX_W_0F3A1D_P_2,
2267   EVEX_W_0F3A21_P_2,
2268   EVEX_W_0F3A23_P_2,
2269   EVEX_W_0F3A38_P_2,
2270   EVEX_W_0F3A39_P_2,
2271   EVEX_W_0F3A3A_P_2,
2272   EVEX_W_0F3A3B_P_2,
2273   EVEX_W_0F3A3E_P_2,
2274   EVEX_W_0F3A3F_P_2,
2275   EVEX_W_0F3A42_P_2,
2276   EVEX_W_0F3A43_P_2,
2277   EVEX_W_0F3A50_P_2,
2278   EVEX_W_0F3A51_P_2,
2279   EVEX_W_0F3A56_P_2,
2280   EVEX_W_0F3A57_P_2,
2281   EVEX_W_0F3A66_P_2,
2282   EVEX_W_0F3A67_P_2,
2283   EVEX_W_0F3A70_P_2,
2284   EVEX_W_0F3A71_P_2,
2285   EVEX_W_0F3A72_P_2,
2286   EVEX_W_0F3A73_P_2,
2287   EVEX_W_0F3ACE_P_2,
2288   EVEX_W_0F3ACF_P_2
2289 };
2290
2291 typedef void (*op_rtn) (int bytemode, int sizeflag);
2292
2293 struct dis386 {
2294   const char *name;
2295   struct
2296     {
2297       op_rtn rtn;
2298       int bytemode;
2299     } op[MAX_OPERANDS];
2300   unsigned int prefix_requirement;
2301 };
2302
2303 /* Upper case letters in the instruction names here are macros.
2304    'A' => print 'b' if no register operands or suffix_always is true
2305    'B' => print 'b' if suffix_always is true
2306    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2307           size prefix
2308    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2309           suffix_always is true
2310    'E' => print 'e' if 32-bit form of jcxz
2311    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2312    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2313    'H' => print ",pt" or ",pn" branch hint
2314    'I' => honor following macro letter even in Intel mode (implemented only
2315           for some of the macro letters)
2316    'J' => print 'l'
2317    'K' => print 'd' or 'q' if rex prefix is present.
2318    'L' => print 'l' if suffix_always is true
2319    'M' => print 'r' if intel_mnemonic is false.
2320    'N' => print 'n' if instruction has no wait "prefix"
2321    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2322    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2323           or suffix_always is true.  print 'q' if rex prefix is present.
2324    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2325           is true
2326    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2327    'S' => print 'w', 'l' or 'q' if suffix_always is true
2328    'T' => print 'q' in 64bit mode if instruction has no operand size
2329           prefix and behave as 'P' otherwise
2330    'U' => print 'q' in 64bit mode if instruction has no operand size
2331           prefix and behave as 'Q' otherwise
2332    'V' => print 'q' in 64bit mode if instruction has no operand size
2333           prefix and behave as 'S' otherwise
2334    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2335    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2336    'Y' unused.
2337    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2338    '!' => change condition from true to false or from false to true.
2339    '%' => add 1 upper case letter to the macro.
2340    '^' => print 'w' or 'l' depending on operand size prefix or
2341           suffix_always is true (lcall/ljmp).
2342    '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2343           on operand size prefix.
2344    '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2345           has no operand size prefix for AMD64 ISA, behave as 'P'
2346           otherwise
2347
2348    2 upper case letter macros:
2349    "XY" => print 'x' or 'y' if suffix_always is true or no register
2350            operands and no broadcast.
2351    "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2352            register operands and no broadcast.
2353    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2354    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2355            or suffix_always is true
2356    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2357    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2358    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2359    "LW" => print 'd', 'q' depending on the VEX.W bit
2360    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2361            an operand size prefix, or suffix_always is true.  print
2362            'q' if rex prefix is present.
2363
2364    Many of the above letters print nothing in Intel mode.  See "putop"
2365    for the details.
2366
2367    Braces '{' and '}', and vertical bars '|', indicate alternative
2368    mnemonic strings for AT&T and Intel.  */
2369
2370 static const struct dis386 dis386[] = {
2371   /* 00 */
2372   { "addB",             { Ebh1, Gb }, 0 },
2373   { "addS",             { Evh1, Gv }, 0 },
2374   { "addB",             { Gb, EbS }, 0 },
2375   { "addS",             { Gv, EvS }, 0 },
2376   { "addB",             { AL, Ib }, 0 },
2377   { "addS",             { eAX, Iv }, 0 },
2378   { X86_64_TABLE (X86_64_06) },
2379   { X86_64_TABLE (X86_64_07) },
2380   /* 08 */
2381   { "orB",              { Ebh1, Gb }, 0 },
2382   { "orS",              { Evh1, Gv }, 0 },
2383   { "orB",              { Gb, EbS }, 0 },
2384   { "orS",              { Gv, EvS }, 0 },
2385   { "orB",              { AL, Ib }, 0 },
2386   { "orS",              { eAX, Iv }, 0 },
2387   { X86_64_TABLE (X86_64_0D) },
2388   { Bad_Opcode },       /* 0x0f extended opcode escape */
2389   /* 10 */
2390   { "adcB",             { Ebh1, Gb }, 0 },
2391   { "adcS",             { Evh1, Gv }, 0 },
2392   { "adcB",             { Gb, EbS }, 0 },
2393   { "adcS",             { Gv, EvS }, 0 },
2394   { "adcB",             { AL, Ib }, 0 },
2395   { "adcS",             { eAX, Iv }, 0 },
2396   { X86_64_TABLE (X86_64_16) },
2397   { X86_64_TABLE (X86_64_17) },
2398   /* 18 */
2399   { "sbbB",             { Ebh1, Gb }, 0 },
2400   { "sbbS",             { Evh1, Gv }, 0 },
2401   { "sbbB",             { Gb, EbS }, 0 },
2402   { "sbbS",             { Gv, EvS }, 0 },
2403   { "sbbB",             { AL, Ib }, 0 },
2404   { "sbbS",             { eAX, Iv }, 0 },
2405   { X86_64_TABLE (X86_64_1E) },
2406   { X86_64_TABLE (X86_64_1F) },
2407   /* 20 */
2408   { "andB",             { Ebh1, Gb }, 0 },
2409   { "andS",             { Evh1, Gv }, 0 },
2410   { "andB",             { Gb, EbS }, 0 },
2411   { "andS",             { Gv, EvS }, 0 },
2412   { "andB",             { AL, Ib }, 0 },
2413   { "andS",             { eAX, Iv }, 0 },
2414   { Bad_Opcode },       /* SEG ES prefix */
2415   { X86_64_TABLE (X86_64_27) },
2416   /* 28 */
2417   { "subB",             { Ebh1, Gb }, 0 },
2418   { "subS",             { Evh1, Gv }, 0 },
2419   { "subB",             { Gb, EbS }, 0 },
2420   { "subS",             { Gv, EvS }, 0 },
2421   { "subB",             { AL, Ib }, 0 },
2422   { "subS",             { eAX, Iv }, 0 },
2423   { Bad_Opcode },       /* SEG CS prefix */
2424   { X86_64_TABLE (X86_64_2F) },
2425   /* 30 */
2426   { "xorB",             { Ebh1, Gb }, 0 },
2427   { "xorS",             { Evh1, Gv }, 0 },
2428   { "xorB",             { Gb, EbS }, 0 },
2429   { "xorS",             { Gv, EvS }, 0 },
2430   { "xorB",             { AL, Ib }, 0 },
2431   { "xorS",             { eAX, Iv }, 0 },
2432   { Bad_Opcode },       /* SEG SS prefix */
2433   { X86_64_TABLE (X86_64_37) },
2434   /* 38 */
2435   { "cmpB",             { Eb, Gb }, 0 },
2436   { "cmpS",             { Ev, Gv }, 0 },
2437   { "cmpB",             { Gb, EbS }, 0 },
2438   { "cmpS",             { Gv, EvS }, 0 },
2439   { "cmpB",             { AL, Ib }, 0 },
2440   { "cmpS",             { eAX, Iv }, 0 },
2441   { Bad_Opcode },       /* SEG DS prefix */
2442   { X86_64_TABLE (X86_64_3F) },
2443   /* 40 */
2444   { "inc{S|}",          { RMeAX }, 0 },
2445   { "inc{S|}",          { RMeCX }, 0 },
2446   { "inc{S|}",          { RMeDX }, 0 },
2447   { "inc{S|}",          { RMeBX }, 0 },
2448   { "inc{S|}",          { RMeSP }, 0 },
2449   { "inc{S|}",          { RMeBP }, 0 },
2450   { "inc{S|}",          { RMeSI }, 0 },
2451   { "inc{S|}",          { RMeDI }, 0 },
2452   /* 48 */
2453   { "dec{S|}",          { RMeAX }, 0 },
2454   { "dec{S|}",          { RMeCX }, 0 },
2455   { "dec{S|}",          { RMeDX }, 0 },
2456   { "dec{S|}",          { RMeBX }, 0 },
2457   { "dec{S|}",          { RMeSP }, 0 },
2458   { "dec{S|}",          { RMeBP }, 0 },
2459   { "dec{S|}",          { RMeSI }, 0 },
2460   { "dec{S|}",          { RMeDI }, 0 },
2461   /* 50 */
2462   { "pushV",            { RMrAX }, 0 },
2463   { "pushV",            { RMrCX }, 0 },
2464   { "pushV",            { RMrDX }, 0 },
2465   { "pushV",            { RMrBX }, 0 },
2466   { "pushV",            { RMrSP }, 0 },
2467   { "pushV",            { RMrBP }, 0 },
2468   { "pushV",            { RMrSI }, 0 },
2469   { "pushV",            { RMrDI }, 0 },
2470   /* 58 */
2471   { "popV",             { RMrAX }, 0 },
2472   { "popV",             { RMrCX }, 0 },
2473   { "popV",             { RMrDX }, 0 },
2474   { "popV",             { RMrBX }, 0 },
2475   { "popV",             { RMrSP }, 0 },
2476   { "popV",             { RMrBP }, 0 },
2477   { "popV",             { RMrSI }, 0 },
2478   { "popV",             { RMrDI }, 0 },
2479   /* 60 */
2480   { X86_64_TABLE (X86_64_60) },
2481   { X86_64_TABLE (X86_64_61) },
2482   { X86_64_TABLE (X86_64_62) },
2483   { X86_64_TABLE (X86_64_63) },
2484   { Bad_Opcode },       /* seg fs */
2485   { Bad_Opcode },       /* seg gs */
2486   { Bad_Opcode },       /* op size prefix */
2487   { Bad_Opcode },       /* adr size prefix */
2488   /* 68 */
2489   { "pushT",            { sIv }, 0 },
2490   { "imulS",            { Gv, Ev, Iv }, 0 },
2491   { "pushT",            { sIbT }, 0 },
2492   { "imulS",            { Gv, Ev, sIb }, 0 },
2493   { "ins{b|}",          { Ybr, indirDX }, 0 },
2494   { X86_64_TABLE (X86_64_6D) },
2495   { "outs{b|}",         { indirDXr, Xb }, 0 },
2496   { X86_64_TABLE (X86_64_6F) },
2497   /* 70 */
2498   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2499   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2500   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2501   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2502   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2503   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2504   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2505   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2506   /* 78 */
2507   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2508   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2509   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2510   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2511   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2512   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2513   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2514   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2515   /* 80 */
2516   { REG_TABLE (REG_80) },
2517   { REG_TABLE (REG_81) },
2518   { X86_64_TABLE (X86_64_82) },
2519   { REG_TABLE (REG_83) },
2520   { "testB",            { Eb, Gb }, 0 },
2521   { "testS",            { Ev, Gv }, 0 },
2522   { "xchgB",            { Ebh2, Gb }, 0 },
2523   { "xchgS",            { Evh2, Gv }, 0 },
2524   /* 88 */
2525   { "movB",             { Ebh3, Gb }, 0 },
2526   { "movS",             { Evh3, Gv }, 0 },
2527   { "movB",             { Gb, EbS }, 0 },
2528   { "movS",             { Gv, EvS }, 0 },
2529   { "movD",             { Sv, Sw }, 0 },
2530   { MOD_TABLE (MOD_8D) },
2531   { "movD",             { Sw, Sv }, 0 },
2532   { REG_TABLE (REG_8F) },
2533   /* 90 */
2534   { PREFIX_TABLE (PREFIX_90) },
2535   { "xchgS",            { RMeCX, eAX }, 0 },
2536   { "xchgS",            { RMeDX, eAX }, 0 },
2537   { "xchgS",            { RMeBX, eAX }, 0 },
2538   { "xchgS",            { RMeSP, eAX }, 0 },
2539   { "xchgS",            { RMeBP, eAX }, 0 },
2540   { "xchgS",            { RMeSI, eAX }, 0 },
2541   { "xchgS",            { RMeDI, eAX }, 0 },
2542   /* 98 */
2543   { "cW{t|}R",          { XX }, 0 },
2544   { "cR{t|}O",          { XX }, 0 },
2545   { X86_64_TABLE (X86_64_9A) },
2546   { Bad_Opcode },       /* fwait */
2547   { "pushfT",           { XX }, 0 },
2548   { "popfT",            { XX }, 0 },
2549   { "sahf",             { XX }, 0 },
2550   { "lahf",             { XX }, 0 },
2551   /* a0 */
2552   { "mov%LB",           { AL, Ob }, 0 },
2553   { "mov%LS",           { eAX, Ov }, 0 },
2554   { "mov%LB",           { Ob, AL }, 0 },
2555   { "mov%LS",           { Ov, eAX }, 0 },
2556   { "movs{b|}",         { Ybr, Xb }, 0 },
2557   { "movs{R|}",         { Yvr, Xv }, 0 },
2558   { "cmps{b|}",         { Xb, Yb }, 0 },
2559   { "cmps{R|}",         { Xv, Yv }, 0 },
2560   /* a8 */
2561   { "testB",            { AL, Ib }, 0 },
2562   { "testS",            { eAX, Iv }, 0 },
2563   { "stosB",            { Ybr, AL }, 0 },
2564   { "stosS",            { Yvr, eAX }, 0 },
2565   { "lodsB",            { ALr, Xb }, 0 },
2566   { "lodsS",            { eAXr, Xv }, 0 },
2567   { "scasB",            { AL, Yb }, 0 },
2568   { "scasS",            { eAX, Yv }, 0 },
2569   /* b0 */
2570   { "movB",             { RMAL, Ib }, 0 },
2571   { "movB",             { RMCL, Ib }, 0 },
2572   { "movB",             { RMDL, Ib }, 0 },
2573   { "movB",             { RMBL, Ib }, 0 },
2574   { "movB",             { RMAH, Ib }, 0 },
2575   { "movB",             { RMCH, Ib }, 0 },
2576   { "movB",             { RMDH, Ib }, 0 },
2577   { "movB",             { RMBH, Ib }, 0 },
2578   /* b8 */
2579   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2580   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2581   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2582   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2583   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2584   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2585   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2586   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2587   /* c0 */
2588   { REG_TABLE (REG_C0) },
2589   { REG_TABLE (REG_C1) },
2590   { "retT",             { Iw, BND }, 0 },
2591   { "retT",             { BND }, 0 },
2592   { X86_64_TABLE (X86_64_C4) },
2593   { X86_64_TABLE (X86_64_C5) },
2594   { REG_TABLE (REG_C6) },
2595   { REG_TABLE (REG_C7) },
2596   /* c8 */
2597   { "enterT",           { Iw, Ib }, 0 },
2598   { "leaveT",           { XX }, 0 },
2599   { "Jret{|f}P",        { Iw }, 0 },
2600   { "Jret{|f}P",        { XX }, 0 },
2601   { "int3",             { XX }, 0 },
2602   { "int",              { Ib }, 0 },
2603   { X86_64_TABLE (X86_64_CE) },
2604   { "iret%LP",          { XX }, 0 },
2605   /* d0 */
2606   { REG_TABLE (REG_D0) },
2607   { REG_TABLE (REG_D1) },
2608   { REG_TABLE (REG_D2) },
2609   { REG_TABLE (REG_D3) },
2610   { X86_64_TABLE (X86_64_D4) },
2611   { X86_64_TABLE (X86_64_D5) },
2612   { Bad_Opcode },
2613   { "xlat",             { DSBX }, 0 },
2614   /* d8 */
2615   { FLOAT },
2616   { FLOAT },
2617   { FLOAT },
2618   { FLOAT },
2619   { FLOAT },
2620   { FLOAT },
2621   { FLOAT },
2622   { FLOAT },
2623   /* e0 */
2624   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2625   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2626   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2627   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2628   { "inB",              { AL, Ib }, 0 },
2629   { "inG",              { zAX, Ib }, 0 },
2630   { "outB",             { Ib, AL }, 0 },
2631   { "outG",             { Ib, zAX }, 0 },
2632   /* e8 */
2633   { X86_64_TABLE (X86_64_E8) },
2634   { X86_64_TABLE (X86_64_E9) },
2635   { X86_64_TABLE (X86_64_EA) },
2636   { "jmp",              { Jb, BND }, 0 },
2637   { "inB",              { AL, indirDX }, 0 },
2638   { "inG",              { zAX, indirDX }, 0 },
2639   { "outB",             { indirDX, AL }, 0 },
2640   { "outG",             { indirDX, zAX }, 0 },
2641   /* f0 */
2642   { Bad_Opcode },       /* lock prefix */
2643   { "icebp",            { XX }, 0 },
2644   { Bad_Opcode },       /* repne */
2645   { Bad_Opcode },       /* repz */
2646   { "hlt",              { XX }, 0 },
2647   { "cmc",              { XX }, 0 },
2648   { REG_TABLE (REG_F6) },
2649   { REG_TABLE (REG_F7) },
2650   /* f8 */
2651   { "clc",              { XX }, 0 },
2652   { "stc",              { XX }, 0 },
2653   { "cli",              { XX }, 0 },
2654   { "sti",              { XX }, 0 },
2655   { "cld",              { XX }, 0 },
2656   { "std",              { XX }, 0 },
2657   { REG_TABLE (REG_FE) },
2658   { REG_TABLE (REG_FF) },
2659 };
2660
2661 static const struct dis386 dis386_twobyte[] = {
2662   /* 00 */
2663   { REG_TABLE (REG_0F00 ) },
2664   { REG_TABLE (REG_0F01 ) },
2665   { "larS",             { Gv, Ew }, 0 },
2666   { "lslS",             { Gv, Ew }, 0 },
2667   { Bad_Opcode },
2668   { "syscall",          { XX }, 0 },
2669   { "clts",             { XX }, 0 },
2670   { "sysret%LP",                { XX }, 0 },
2671   /* 08 */
2672   { "invd",             { XX }, 0 },
2673   { PREFIX_TABLE (PREFIX_0F09) },
2674   { Bad_Opcode },
2675   { "ud2",              { XX }, 0 },
2676   { Bad_Opcode },
2677   { REG_TABLE (REG_0F0D) },
2678   { "femms",            { XX }, 0 },
2679   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2680   /* 10 */
2681   { PREFIX_TABLE (PREFIX_0F10) },
2682   { PREFIX_TABLE (PREFIX_0F11) },
2683   { PREFIX_TABLE (PREFIX_0F12) },
2684   { MOD_TABLE (MOD_0F13) },
2685   { "unpcklpX",         { XM, EXx }, PREFIX_OPCODE },
2686   { "unpckhpX",         { XM, EXx }, PREFIX_OPCODE },
2687   { PREFIX_TABLE (PREFIX_0F16) },
2688   { MOD_TABLE (MOD_0F17) },
2689   /* 18 */
2690   { REG_TABLE (REG_0F18) },
2691   { "nopQ",             { Ev }, 0 },
2692   { PREFIX_TABLE (PREFIX_0F1A) },
2693   { PREFIX_TABLE (PREFIX_0F1B) },
2694   { PREFIX_TABLE (PREFIX_0F1C) },
2695   { "nopQ",             { Ev }, 0 },
2696   { PREFIX_TABLE (PREFIX_0F1E) },
2697   { "nopQ",             { Ev }, 0 },
2698   /* 20 */
2699   { "movZ",             { Rm, Cm }, 0 },
2700   { "movZ",             { Rm, Dm }, 0 },
2701   { "movZ",             { Cm, Rm }, 0 },
2702   { "movZ",             { Dm, Rm }, 0 },
2703   { MOD_TABLE (MOD_0F24) },
2704   { Bad_Opcode },
2705   { MOD_TABLE (MOD_0F26) },
2706   { Bad_Opcode },
2707   /* 28 */
2708   { "movapX",           { XM, EXx }, PREFIX_OPCODE },
2709   { "movapX",           { EXxS, XM }, PREFIX_OPCODE },
2710   { PREFIX_TABLE (PREFIX_0F2A) },
2711   { PREFIX_TABLE (PREFIX_0F2B) },
2712   { PREFIX_TABLE (PREFIX_0F2C) },
2713   { PREFIX_TABLE (PREFIX_0F2D) },
2714   { PREFIX_TABLE (PREFIX_0F2E) },
2715   { PREFIX_TABLE (PREFIX_0F2F) },
2716   /* 30 */
2717   { "wrmsr",            { XX }, 0 },
2718   { "rdtsc",            { XX }, 0 },
2719   { "rdmsr",            { XX }, 0 },
2720   { "rdpmc",            { XX }, 0 },
2721   { "sysenter",         { XX }, 0 },
2722   { "sysexit",          { XX }, 0 },
2723   { Bad_Opcode },
2724   { "getsec",           { XX }, 0 },
2725   /* 38 */
2726   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2727   { Bad_Opcode },
2728   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2729   { Bad_Opcode },
2730   { Bad_Opcode },
2731   { Bad_Opcode },
2732   { Bad_Opcode },
2733   { Bad_Opcode },
2734   /* 40 */
2735   { "cmovoS",           { Gv, Ev }, 0 },
2736   { "cmovnoS",          { Gv, Ev }, 0 },
2737   { "cmovbS",           { Gv, Ev }, 0 },
2738   { "cmovaeS",          { Gv, Ev }, 0 },
2739   { "cmoveS",           { Gv, Ev }, 0 },
2740   { "cmovneS",          { Gv, Ev }, 0 },
2741   { "cmovbeS",          { Gv, Ev }, 0 },
2742   { "cmovaS",           { Gv, Ev }, 0 },
2743   /* 48 */
2744   { "cmovsS",           { Gv, Ev }, 0 },
2745   { "cmovnsS",          { Gv, Ev }, 0 },
2746   { "cmovpS",           { Gv, Ev }, 0 },
2747   { "cmovnpS",          { Gv, Ev }, 0 },
2748   { "cmovlS",           { Gv, Ev }, 0 },
2749   { "cmovgeS",          { Gv, Ev }, 0 },
2750   { "cmovleS",          { Gv, Ev }, 0 },
2751   { "cmovgS",           { Gv, Ev }, 0 },
2752   /* 50 */
2753   { MOD_TABLE (MOD_0F51) },
2754   { PREFIX_TABLE (PREFIX_0F51) },
2755   { PREFIX_TABLE (PREFIX_0F52) },
2756   { PREFIX_TABLE (PREFIX_0F53) },
2757   { "andpX",            { XM, EXx }, PREFIX_OPCODE },
2758   { "andnpX",           { XM, EXx }, PREFIX_OPCODE },
2759   { "orpX",             { XM, EXx }, PREFIX_OPCODE },
2760   { "xorpX",            { XM, EXx }, PREFIX_OPCODE },
2761   /* 58 */
2762   { PREFIX_TABLE (PREFIX_0F58) },
2763   { PREFIX_TABLE (PREFIX_0F59) },
2764   { PREFIX_TABLE (PREFIX_0F5A) },
2765   { PREFIX_TABLE (PREFIX_0F5B) },
2766   { PREFIX_TABLE (PREFIX_0F5C) },
2767   { PREFIX_TABLE (PREFIX_0F5D) },
2768   { PREFIX_TABLE (PREFIX_0F5E) },
2769   { PREFIX_TABLE (PREFIX_0F5F) },
2770   /* 60 */
2771   { PREFIX_TABLE (PREFIX_0F60) },
2772   { PREFIX_TABLE (PREFIX_0F61) },
2773   { PREFIX_TABLE (PREFIX_0F62) },
2774   { "packsswb",         { MX, EM }, PREFIX_OPCODE },
2775   { "pcmpgtb",          { MX, EM }, PREFIX_OPCODE },
2776   { "pcmpgtw",          { MX, EM }, PREFIX_OPCODE },
2777   { "pcmpgtd",          { MX, EM }, PREFIX_OPCODE },
2778   { "packuswb",         { MX, EM }, PREFIX_OPCODE },
2779   /* 68 */
2780   { "punpckhbw",        { MX, EM }, PREFIX_OPCODE },
2781   { "punpckhwd",        { MX, EM }, PREFIX_OPCODE },
2782   { "punpckhdq",        { MX, EM }, PREFIX_OPCODE },
2783   { "packssdw",         { MX, EM }, PREFIX_OPCODE },
2784   { PREFIX_TABLE (PREFIX_0F6C) },
2785   { PREFIX_TABLE (PREFIX_0F6D) },
2786   { "movK",             { MX, Edq }, PREFIX_OPCODE },
2787   { PREFIX_TABLE (PREFIX_0F6F) },
2788   /* 70 */
2789   { PREFIX_TABLE (PREFIX_0F70) },
2790   { REG_TABLE (REG_0F71) },
2791   { REG_TABLE (REG_0F72) },
2792   { REG_TABLE (REG_0F73) },
2793   { "pcmpeqb",          { MX, EM }, PREFIX_OPCODE },
2794   { "pcmpeqw",          { MX, EM }, PREFIX_OPCODE },
2795   { "pcmpeqd",          { MX, EM }, PREFIX_OPCODE },
2796   { "emms",             { XX }, PREFIX_OPCODE },
2797   /* 78 */
2798   { PREFIX_TABLE (PREFIX_0F78) },
2799   { PREFIX_TABLE (PREFIX_0F79) },
2800   { Bad_Opcode },
2801   { Bad_Opcode },
2802   { PREFIX_TABLE (PREFIX_0F7C) },
2803   { PREFIX_TABLE (PREFIX_0F7D) },
2804   { PREFIX_TABLE (PREFIX_0F7E) },
2805   { PREFIX_TABLE (PREFIX_0F7F) },
2806   /* 80 */
2807   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2808   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2809   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2810   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2811   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2812   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2813   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2814   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2815   /* 88 */
2816   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2817   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2818   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2819   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2820   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2821   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2822   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2823   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2824   /* 90 */
2825   { "seto",             { Eb }, 0 },
2826   { "setno",            { Eb }, 0 },
2827   { "setb",             { Eb }, 0 },
2828   { "setae",            { Eb }, 0 },
2829   { "sete",             { Eb }, 0 },
2830   { "setne",            { Eb }, 0 },
2831   { "setbe",            { Eb }, 0 },
2832   { "seta",             { Eb }, 0 },
2833   /* 98 */
2834   { "sets",             { Eb }, 0 },
2835   { "setns",            { Eb }, 0 },
2836   { "setp",             { Eb }, 0 },
2837   { "setnp",            { Eb }, 0 },
2838   { "setl",             { Eb }, 0 },
2839   { "setge",            { Eb }, 0 },
2840   { "setle",            { Eb }, 0 },
2841   { "setg",             { Eb }, 0 },
2842   /* a0 */
2843   { "pushT",            { fs }, 0 },
2844   { "popT",             { fs }, 0 },
2845   { "cpuid",            { XX }, 0 },
2846   { "btS",              { Ev, Gv }, 0 },
2847   { "shldS",            { Ev, Gv, Ib }, 0 },
2848   { "shldS",            { Ev, Gv, CL }, 0 },
2849   { REG_TABLE (REG_0FA6) },
2850   { REG_TABLE (REG_0FA7) },
2851   /* a8 */
2852   { "pushT",            { gs }, 0 },
2853   { "popT",             { gs }, 0 },
2854   { "rsm",              { XX }, 0 },
2855   { "btsS",             { Evh1, Gv }, 0 },
2856   { "shrdS",            { Ev, Gv, Ib }, 0 },
2857   { "shrdS",            { Ev, Gv, CL }, 0 },
2858   { REG_TABLE (REG_0FAE) },
2859   { "imulS",            { Gv, Ev }, 0 },
2860   /* b0 */
2861   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2862   { "cmpxchgS",         { Evh1, Gv }, 0 },
2863   { MOD_TABLE (MOD_0FB2) },
2864   { "btrS",             { Evh1, Gv }, 0 },
2865   { MOD_TABLE (MOD_0FB4) },
2866   { MOD_TABLE (MOD_0FB5) },
2867   { "movz{bR|x}",       { Gv, Eb }, 0 },
2868   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2869   /* b8 */
2870   { PREFIX_TABLE (PREFIX_0FB8) },
2871   { "ud1S",             { Gv, Ev }, 0 },
2872   { REG_TABLE (REG_0FBA) },
2873   { "btcS",             { Evh1, Gv }, 0 },
2874   { PREFIX_TABLE (PREFIX_0FBC) },
2875   { PREFIX_TABLE (PREFIX_0FBD) },
2876   { "movs{bR|x}",       { Gv, Eb }, 0 },
2877   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2878   /* c0 */
2879   { "xaddB",            { Ebh1, Gb }, 0 },
2880   { "xaddS",            { Evh1, Gv }, 0 },
2881   { PREFIX_TABLE (PREFIX_0FC2) },
2882   { MOD_TABLE (MOD_0FC3) },
2883   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_OPCODE },
2884   { "pextrw",           { Gdq, MS, Ib }, PREFIX_OPCODE },
2885   { "shufpX",           { XM, EXx, Ib }, PREFIX_OPCODE },
2886   { REG_TABLE (REG_0FC7) },
2887   /* c8 */
2888   { "bswap",            { RMeAX }, 0 },
2889   { "bswap",            { RMeCX }, 0 },
2890   { "bswap",            { RMeDX }, 0 },
2891   { "bswap",            { RMeBX }, 0 },
2892   { "bswap",            { RMeSP }, 0 },
2893   { "bswap",            { RMeBP }, 0 },
2894   { "bswap",            { RMeSI }, 0 },
2895   { "bswap",            { RMeDI }, 0 },
2896   /* d0 */
2897   { PREFIX_TABLE (PREFIX_0FD0) },
2898   { "psrlw",            { MX, EM }, PREFIX_OPCODE },
2899   { "psrld",            { MX, EM }, PREFIX_OPCODE },
2900   { "psrlq",            { MX, EM }, PREFIX_OPCODE },
2901   { "paddq",            { MX, EM }, PREFIX_OPCODE },
2902   { "pmullw",           { MX, EM }, PREFIX_OPCODE },
2903   { PREFIX_TABLE (PREFIX_0FD6) },
2904   { MOD_TABLE (MOD_0FD7) },
2905   /* d8 */
2906   { "psubusb",          { MX, EM }, PREFIX_OPCODE },
2907   { "psubusw",          { MX, EM }, PREFIX_OPCODE },
2908   { "pminub",           { MX, EM }, PREFIX_OPCODE },
2909   { "pand",             { MX, EM }, PREFIX_OPCODE },
2910   { "paddusb",          { MX, EM }, PREFIX_OPCODE },
2911   { "paddusw",          { MX, EM }, PREFIX_OPCODE },
2912   { "pmaxub",           { MX, EM }, PREFIX_OPCODE },
2913   { "pandn",            { MX, EM }, PREFIX_OPCODE },
2914   /* e0 */
2915   { "pavgb",            { MX, EM }, PREFIX_OPCODE },
2916   { "psraw",            { MX, EM }, PREFIX_OPCODE },
2917   { "psrad",            { MX, EM }, PREFIX_OPCODE },
2918   { "pavgw",            { MX, EM }, PREFIX_OPCODE },
2919   { "pmulhuw",          { MX, EM }, PREFIX_OPCODE },
2920   { "pmulhw",           { MX, EM }, PREFIX_OPCODE },
2921   { PREFIX_TABLE (PREFIX_0FE6) },
2922   { PREFIX_TABLE (PREFIX_0FE7) },
2923   /* e8 */
2924   { "psubsb",           { MX, EM }, PREFIX_OPCODE },
2925   { "psubsw",           { MX, EM }, PREFIX_OPCODE },
2926   { "pminsw",           { MX, EM }, PREFIX_OPCODE },
2927   { "por",              { MX, EM }, PREFIX_OPCODE },
2928   { "paddsb",           { MX, EM }, PREFIX_OPCODE },
2929   { "paddsw",           { MX, EM }, PREFIX_OPCODE },
2930   { "pmaxsw",           { MX, EM }, PREFIX_OPCODE },
2931   { "pxor",             { MX, EM }, PREFIX_OPCODE },
2932   /* f0 */
2933   { PREFIX_TABLE (PREFIX_0FF0) },
2934   { "psllw",            { MX, EM }, PREFIX_OPCODE },
2935   { "pslld",            { MX, EM }, PREFIX_OPCODE },
2936   { "psllq",            { MX, EM }, PREFIX_OPCODE },
2937   { "pmuludq",          { MX, EM }, PREFIX_OPCODE },
2938   { "pmaddwd",          { MX, EM }, PREFIX_OPCODE },
2939   { "psadbw",           { MX, EM }, PREFIX_OPCODE },
2940   { PREFIX_TABLE (PREFIX_0FF7) },
2941   /* f8 */
2942   { "psubb",            { MX, EM }, PREFIX_OPCODE },
2943   { "psubw",            { MX, EM }, PREFIX_OPCODE },
2944   { "psubd",            { MX, EM }, PREFIX_OPCODE },
2945   { "psubq",            { MX, EM }, PREFIX_OPCODE },
2946   { "paddb",            { MX, EM }, PREFIX_OPCODE },
2947   { "paddw",            { MX, EM }, PREFIX_OPCODE },
2948   { "paddd",            { MX, EM }, PREFIX_OPCODE },
2949   { "ud0S",             { Gv, Ev }, 0 },
2950 };
2951
2952 static const unsigned char onebyte_has_modrm[256] = {
2953   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2954   /*       -------------------------------        */
2955   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2956   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2957   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2958   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2959   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2960   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2961   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2962   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2963   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2964   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2965   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2966   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2967   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2968   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2969   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2970   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2971   /*       -------------------------------        */
2972   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2973 };
2974
2975 static const unsigned char twobyte_has_modrm[256] = {
2976   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2977   /*       -------------------------------        */
2978   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2979   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2980   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2981   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2982   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2983   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2984   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2985   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2986   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2987   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2988   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2989   /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2990   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2991   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2992   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2993   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2994   /*       -------------------------------        */
2995   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2996 };
2997
2998 static char obuf[100];
2999 static char *obufp;
3000 static char *mnemonicendp;
3001 static char scratchbuf[100];
3002 static unsigned char *start_codep;
3003 static unsigned char *insn_codep;
3004 static unsigned char *codep;
3005 static unsigned char *end_codep;
3006 static int last_lock_prefix;
3007 static int last_repz_prefix;
3008 static int last_repnz_prefix;
3009 static int last_data_prefix;
3010 static int last_addr_prefix;
3011 static int last_rex_prefix;
3012 static int last_seg_prefix;
3013 static int fwait_prefix;
3014 /* The active segment register prefix.  */
3015 static int active_seg_prefix;
3016 #define MAX_CODE_LENGTH 15
3017 /* We can up to 14 prefixes since the maximum instruction length is
3018    15bytes.  */
3019 static int all_prefixes[MAX_CODE_LENGTH - 1];
3020 static disassemble_info *the_info;
3021 static struct
3022   {
3023     int mod;
3024     int reg;
3025     int rm;
3026   }
3027 modrm;
3028 static unsigned char need_modrm;
3029 static struct
3030   {
3031     int scale;
3032     int index;
3033     int base;
3034   }
3035 sib;
3036 static struct
3037   {
3038     int register_specifier;
3039     int length;
3040     int prefix;
3041     int w;
3042     int evex;
3043     int r;
3044     int v;
3045     int mask_register_specifier;
3046     int zeroing;
3047     int ll;
3048     int b;
3049   }
3050 vex;
3051 static unsigned char need_vex;
3052 static unsigned char need_vex_reg;
3053 static unsigned char vex_w_done;
3054
3055 struct op
3056   {
3057     const char *name;
3058     unsigned int len;
3059   };
3060
3061 /* If we are accessing mod/rm/reg without need_modrm set, then the
3062    values are stale.  Hitting this abort likely indicates that you
3063    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3064 #define MODRM_CHECK  if (!need_modrm) abort ()
3065
3066 static const char **names64;
3067 static const char **names32;
3068 static const char **names16;
3069 static const char **names8;
3070 static const char **names8rex;
3071 static const char **names_seg;
3072 static const char *index64;
3073 static const char *index32;
3074 static const char **index16;
3075 static const char **names_bnd;
3076
3077 static const char *intel_names64[] = {
3078   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3079   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3080 };
3081 static const char *intel_names32[] = {
3082   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3083   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3084 };
3085 static const char *intel_names16[] = {
3086   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3087   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3088 };
3089 static const char *intel_names8[] = {
3090   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3091 };
3092 static const char *intel_names8rex[] = {
3093   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3094   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3095 };
3096 static const char *intel_names_seg[] = {
3097   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3098 };
3099 static const char *intel_index64 = "riz";
3100 static const char *intel_index32 = "eiz";
3101 static const char *intel_index16[] = {
3102   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3103 };
3104
3105 static const char *att_names64[] = {
3106   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3107   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3108 };
3109 static const char *att_names32[] = {
3110   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3111   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3112 };
3113 static const char *att_names16[] = {
3114   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3115   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3116 };
3117 static const char *att_names8[] = {
3118   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3119 };
3120 static const char *att_names8rex[] = {
3121   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3122   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3123 };
3124 static const char *att_names_seg[] = {
3125   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3126 };
3127 static const char *att_index64 = "%riz";
3128 static const char *att_index32 = "%eiz";
3129 static const char *att_index16[] = {
3130   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3131 };
3132
3133 static const char **names_mm;
3134 static const char *intel_names_mm[] = {
3135   "mm0", "mm1", "mm2", "mm3",
3136   "mm4", "mm5", "mm6", "mm7"
3137 };
3138 static const char *att_names_mm[] = {
3139   "%mm0", "%mm1", "%mm2", "%mm3",
3140   "%mm4", "%mm5", "%mm6", "%mm7"
3141 };
3142
3143 static const char *intel_names_bnd[] = {
3144   "bnd0", "bnd1", "bnd2", "bnd3"
3145 };
3146
3147 static const char *att_names_bnd[] = {
3148   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3149 };
3150
3151 static const char **names_xmm;
3152 static const char *intel_names_xmm[] = {
3153   "xmm0", "xmm1", "xmm2", "xmm3",
3154   "xmm4", "xmm5", "xmm6", "xmm7",
3155   "xmm8", "xmm9", "xmm10", "xmm11",
3156   "xmm12", "xmm13", "xmm14", "xmm15",
3157   "xmm16", "xmm17", "xmm18", "xmm19",
3158   "xmm20", "xmm21", "xmm22", "xmm23",
3159   "xmm24", "xmm25", "xmm26", "xmm27",
3160   "xmm28", "xmm29", "xmm30", "xmm31"
3161 };
3162 static const char *att_names_xmm[] = {
3163   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3164   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3165   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3166   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3167   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3168   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3169   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3170   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3171 };
3172
3173 static const char **names_ymm;
3174 static const char *intel_names_ymm[] = {
3175   "ymm0", "ymm1", "ymm2", "ymm3",
3176   "ymm4", "ymm5", "ymm6", "ymm7",
3177   "ymm8", "ymm9", "ymm10", "ymm11",
3178   "ymm12", "ymm13", "ymm14", "ymm15",
3179   "ymm16", "ymm17", "ymm18", "ymm19",
3180   "ymm20", "ymm21", "ymm22", "ymm23",
3181   "ymm24", "ymm25", "ymm26", "ymm27",
3182   "ymm28", "ymm29", "ymm30", "ymm31"
3183 };
3184 static const char *att_names_ymm[] = {
3185   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3186   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3187   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3188   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3189   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3190   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3191   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3192   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3193 };
3194
3195 static const char **names_zmm;
3196 static const char *intel_names_zmm[] = {
3197   "zmm0", "zmm1", "zmm2", "zmm3",
3198   "zmm4", "zmm5", "zmm6", "zmm7",
3199   "zmm8", "zmm9", "zmm10", "zmm11",
3200   "zmm12", "zmm13", "zmm14", "zmm15",
3201   "zmm16", "zmm17", "zmm18", "zmm19",
3202   "zmm20", "zmm21", "zmm22", "zmm23",
3203   "zmm24", "zmm25", "zmm26", "zmm27",
3204   "zmm28", "zmm29", "zmm30", "zmm31"
3205 };
3206 static const char *att_names_zmm[] = {
3207   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3208   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3209   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3210   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3211   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3212   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3213   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3214   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3215 };
3216
3217 static const char **names_mask;
3218 static const char *intel_names_mask[] = {
3219   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3220 };
3221 static const char *att_names_mask[] = {
3222   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3223 };
3224
3225 static const char *names_rounding[] =
3226 {
3227   "{rn-sae}",
3228   "{rd-sae}",
3229   "{ru-sae}",
3230   "{rz-sae}"
3231 };
3232
3233 static const struct dis386 reg_table[][8] = {
3234   /* REG_80 */
3235   {
3236     { "addA",   { Ebh1, Ib }, 0 },
3237     { "orA",    { Ebh1, Ib }, 0 },
3238     { "adcA",   { Ebh1, Ib }, 0 },
3239     { "sbbA",   { Ebh1, Ib }, 0 },
3240     { "andA",   { Ebh1, Ib }, 0 },
3241     { "subA",   { Ebh1, Ib }, 0 },
3242     { "xorA",   { Ebh1, Ib }, 0 },
3243     { "cmpA",   { Eb, Ib }, 0 },
3244   },
3245   /* REG_81 */
3246   {
3247     { "addQ",   { Evh1, Iv }, 0 },
3248     { "orQ",    { Evh1, Iv }, 0 },
3249     { "adcQ",   { Evh1, Iv }, 0 },
3250     { "sbbQ",   { Evh1, Iv }, 0 },
3251     { "andQ",   { Evh1, Iv }, 0 },
3252     { "subQ",   { Evh1, Iv }, 0 },
3253     { "xorQ",   { Evh1, Iv }, 0 },
3254     { "cmpQ",   { Ev, Iv }, 0 },
3255   },
3256   /* REG_83 */
3257   {
3258     { "addQ",   { Evh1, sIb }, 0 },
3259     { "orQ",    { Evh1, sIb }, 0 },
3260     { "adcQ",   { Evh1, sIb }, 0 },
3261     { "sbbQ",   { Evh1, sIb }, 0 },
3262     { "andQ",   { Evh1, sIb }, 0 },
3263     { "subQ",   { Evh1, sIb }, 0 },
3264     { "xorQ",   { Evh1, sIb }, 0 },
3265     { "cmpQ",   { Ev, sIb }, 0 },
3266   },
3267   /* REG_8F */
3268   {
3269     { "popU",   { stackEv }, 0 },
3270     { XOP_8F_TABLE (XOP_09) },
3271     { Bad_Opcode },
3272     { Bad_Opcode },
3273     { Bad_Opcode },
3274     { XOP_8F_TABLE (XOP_09) },
3275   },
3276   /* REG_C0 */
3277   {
3278     { "rolA",   { Eb, Ib }, 0 },
3279     { "rorA",   { Eb, Ib }, 0 },
3280     { "rclA",   { Eb, Ib }, 0 },
3281     { "rcrA",   { Eb, Ib }, 0 },
3282     { "shlA",   { Eb, Ib }, 0 },
3283     { "shrA",   { Eb, Ib }, 0 },
3284     { "shlA",   { Eb, Ib }, 0 },
3285     { "sarA",   { Eb, Ib }, 0 },
3286   },
3287   /* REG_C1 */
3288   {
3289     { "rolQ",   { Ev, Ib }, 0 },
3290     { "rorQ",   { Ev, Ib }, 0 },
3291     { "rclQ",   { Ev, Ib }, 0 },
3292     { "rcrQ",   { Ev, Ib }, 0 },
3293     { "shlQ",   { Ev, Ib }, 0 },
3294     { "shrQ",   { Ev, Ib }, 0 },
3295     { "shlQ",   { Ev, Ib }, 0 },
3296     { "sarQ",   { Ev, Ib }, 0 },
3297   },
3298   /* REG_C6 */
3299   {
3300     { "movA",   { Ebh3, Ib }, 0 },
3301     { Bad_Opcode },
3302     { Bad_Opcode },
3303     { Bad_Opcode },
3304     { Bad_Opcode },
3305     { Bad_Opcode },
3306     { Bad_Opcode },
3307     { MOD_TABLE (MOD_C6_REG_7) },
3308   },
3309   /* REG_C7 */
3310   {
3311     { "movQ",   { Evh3, Iv }, 0 },
3312     { Bad_Opcode },
3313     { Bad_Opcode },
3314     { Bad_Opcode },
3315     { Bad_Opcode },
3316     { Bad_Opcode },
3317     { Bad_Opcode },
3318     { MOD_TABLE (MOD_C7_REG_7) },
3319   },
3320   /* REG_D0 */
3321   {
3322     { "rolA",   { Eb, I1 }, 0 },
3323     { "rorA",   { Eb, I1 }, 0 },
3324     { "rclA",   { Eb, I1 }, 0 },
3325     { "rcrA",   { Eb, I1 }, 0 },
3326     { "shlA",   { Eb, I1 }, 0 },
3327     { "shrA",   { Eb, I1 }, 0 },
3328     { "shlA",   { Eb, I1 }, 0 },
3329     { "sarA",   { Eb, I1 }, 0 },
3330   },
3331   /* REG_D1 */
3332   {
3333     { "rolQ",   { Ev, I1 }, 0 },
3334     { "rorQ",   { Ev, I1 }, 0 },
3335     { "rclQ",   { Ev, I1 }, 0 },
3336     { "rcrQ",   { Ev, I1 }, 0 },
3337     { "shlQ",   { Ev, I1 }, 0 },
3338     { "shrQ",   { Ev, I1 }, 0 },
3339     { "shlQ",   { Ev, I1 }, 0 },
3340     { "sarQ",   { Ev, I1 }, 0 },
3341   },
3342   /* REG_D2 */
3343   {
3344     { "rolA",   { Eb, CL }, 0 },
3345     { "rorA",   { Eb, CL }, 0 },
3346     { "rclA",   { Eb, CL }, 0 },
3347     { "rcrA",   { Eb, CL }, 0 },
3348     { "shlA",   { Eb, CL }, 0 },
3349     { "shrA",   { Eb, CL }, 0 },
3350     { "shlA",   { Eb, CL }, 0 },
3351     { "sarA",   { Eb, CL }, 0 },
3352   },
3353   /* REG_D3 */
3354   {
3355     { "rolQ",   { Ev, CL }, 0 },
3356     { "rorQ",   { Ev, CL }, 0 },
3357     { "rclQ",   { Ev, CL }, 0 },
3358     { "rcrQ",   { Ev, CL }, 0 },
3359     { "shlQ",   { Ev, CL }, 0 },
3360     { "shrQ",   { Ev, CL }, 0 },
3361     { "shlQ",   { Ev, CL }, 0 },
3362     { "sarQ",   { Ev, CL }, 0 },
3363   },
3364   /* REG_F6 */
3365   {
3366     { "testA",  { Eb, Ib }, 0 },
3367     { "testA",  { Eb, Ib }, 0 },
3368     { "notA",   { Ebh1 }, 0 },
3369     { "negA",   { Ebh1 }, 0 },
3370     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3371     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3372     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3373     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3374   },
3375   /* REG_F7 */
3376   {
3377     { "testQ",  { Ev, Iv }, 0 },
3378     { "testQ",  { Ev, Iv }, 0 },
3379     { "notQ",   { Evh1 }, 0 },
3380     { "negQ",   { Evh1 }, 0 },
3381     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3382     { "imulQ",  { Ev }, 0 },
3383     { "divQ",   { Ev }, 0 },
3384     { "idivQ",  { Ev }, 0 },
3385   },
3386   /* REG_FE */
3387   {
3388     { "incA",   { Ebh1 }, 0 },
3389     { "decA",   { Ebh1 }, 0 },
3390   },
3391   /* REG_FF */
3392   {
3393     { "incQ",   { Evh1 }, 0 },
3394     { "decQ",   { Evh1 }, 0 },
3395     { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3396     { MOD_TABLE (MOD_FF_REG_3) },
3397     { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3398     { MOD_TABLE (MOD_FF_REG_5) },
3399     { "pushU",  { stackEv }, 0 },
3400     { Bad_Opcode },
3401   },
3402   /* REG_0F00 */
3403   {
3404     { "sldtD",  { Sv }, 0 },
3405     { "strD",   { Sv }, 0 },
3406     { "lldt",   { Ew }, 0 },
3407     { "ltr",    { Ew }, 0 },
3408     { "verr",   { Ew }, 0 },
3409     { "verw",   { Ew }, 0 },
3410     { Bad_Opcode },
3411     { Bad_Opcode },
3412   },
3413   /* REG_0F01 */
3414   {
3415     { MOD_TABLE (MOD_0F01_REG_0) },
3416     { MOD_TABLE (MOD_0F01_REG_1) },
3417     { MOD_TABLE (MOD_0F01_REG_2) },
3418     { MOD_TABLE (MOD_0F01_REG_3) },
3419     { "smswD",  { Sv }, 0 },
3420     { MOD_TABLE (MOD_0F01_REG_5) },
3421     { "lmsw",   { Ew }, 0 },
3422     { MOD_TABLE (MOD_0F01_REG_7) },
3423   },
3424   /* REG_0F0D */
3425   {
3426     { "prefetch",       { Mb }, 0 },
3427     { "prefetchw",      { Mb }, 0 },
3428     { "prefetchwt1",    { Mb }, 0 },
3429     { "prefetch",       { Mb }, 0 },
3430     { "prefetch",       { Mb }, 0 },
3431     { "prefetch",       { Mb }, 0 },
3432     { "prefetch",       { Mb }, 0 },
3433     { "prefetch",       { Mb }, 0 },
3434   },
3435   /* REG_0F18 */
3436   {
3437     { MOD_TABLE (MOD_0F18_REG_0) },
3438     { MOD_TABLE (MOD_0F18_REG_1) },
3439     { MOD_TABLE (MOD_0F18_REG_2) },
3440     { MOD_TABLE (MOD_0F18_REG_3) },
3441     { MOD_TABLE (MOD_0F18_REG_4) },
3442     { MOD_TABLE (MOD_0F18_REG_5) },
3443     { MOD_TABLE (MOD_0F18_REG_6) },
3444     { MOD_TABLE (MOD_0F18_REG_7) },
3445   },
3446   /* REG_0F1C_MOD_0 */
3447   {
3448     { "cldemote",       { Mb }, 0 },
3449     { "nopQ",           { Ev }, 0 },
3450     { "nopQ",           { Ev }, 0 },
3451     { "nopQ",           { Ev }, 0 },
3452     { "nopQ",           { Ev }, 0 },
3453     { "nopQ",           { Ev }, 0 },
3454     { "nopQ",           { Ev }, 0 },
3455     { "nopQ",           { Ev }, 0 },
3456   },
3457   /* REG_0F1E_MOD_3 */
3458   {
3459     { "nopQ",           { Ev }, 0 },
3460     { "rdsspK",         { Rdq }, PREFIX_OPCODE },
3461     { "nopQ",           { Ev }, 0 },
3462     { "nopQ",           { Ev }, 0 },
3463     { "nopQ",           { Ev }, 0 },
3464     { "nopQ",           { Ev }, 0 },
3465     { "nopQ",           { Ev }, 0 },
3466     { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3467   },
3468   /* REG_0F71 */
3469   {
3470     { Bad_Opcode },
3471     { Bad_Opcode },
3472     { MOD_TABLE (MOD_0F71_REG_2) },
3473     { Bad_Opcode },
3474     { MOD_TABLE (MOD_0F71_REG_4) },
3475     { Bad_Opcode },
3476     { MOD_TABLE (MOD_0F71_REG_6) },
3477   },
3478   /* REG_0F72 */
3479   {
3480     { Bad_Opcode },
3481     { Bad_Opcode },
3482     { MOD_TABLE (MOD_0F72_REG_2) },
3483     { Bad_Opcode },
3484     { MOD_TABLE (MOD_0F72_REG_4) },
3485     { Bad_Opcode },
3486     { MOD_TABLE (MOD_0F72_REG_6) },
3487   },
3488   /* REG_0F73 */
3489   {
3490     { Bad_Opcode },
3491     { Bad_Opcode },
3492     { MOD_TABLE (MOD_0F73_REG_2) },
3493     { MOD_TABLE (MOD_0F73_REG_3) },
3494     { Bad_Opcode },
3495     { Bad_Opcode },
3496     { MOD_TABLE (MOD_0F73_REG_6) },
3497     { MOD_TABLE (MOD_0F73_REG_7) },
3498   },
3499   /* REG_0FA6 */
3500   {
3501     { "montmul",        { { OP_0f07, 0 } }, 0 },
3502     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3503     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3504   },
3505   /* REG_0FA7 */
3506   {
3507     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3508     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3509     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3510     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3511     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3512     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3513   },
3514   /* REG_0FAE */
3515   {
3516     { MOD_TABLE (MOD_0FAE_REG_0) },
3517     { MOD_TABLE (MOD_0FAE_REG_1) },
3518     { MOD_TABLE (MOD_0FAE_REG_2) },
3519     { MOD_TABLE (MOD_0FAE_REG_3) },
3520     { MOD_TABLE (MOD_0FAE_REG_4) },
3521     { MOD_TABLE (MOD_0FAE_REG_5) },
3522     { MOD_TABLE (MOD_0FAE_REG_6) },
3523     { MOD_TABLE (MOD_0FAE_REG_7) },
3524   },
3525   /* REG_0FBA */
3526   {
3527     { Bad_Opcode },
3528     { Bad_Opcode },
3529     { Bad_Opcode },
3530     { Bad_Opcode },
3531     { "btQ",    { Ev, Ib }, 0 },
3532     { "btsQ",   { Evh1, Ib }, 0 },
3533     { "btrQ",   { Evh1, Ib }, 0 },
3534     { "btcQ",   { Evh1, Ib }, 0 },
3535   },
3536   /* REG_0FC7 */
3537   {
3538     { Bad_Opcode },
3539     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3540     { Bad_Opcode },
3541     { MOD_TABLE (MOD_0FC7_REG_3) },
3542     { MOD_TABLE (MOD_0FC7_REG_4) },
3543     { MOD_TABLE (MOD_0FC7_REG_5) },
3544     { MOD_TABLE (MOD_0FC7_REG_6) },
3545     { MOD_TABLE (MOD_0FC7_REG_7) },
3546   },
3547   /* REG_VEX_0F71 */
3548   {
3549     { Bad_Opcode },
3550     { Bad_Opcode },
3551     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3552     { Bad_Opcode },
3553     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3554     { Bad_Opcode },
3555     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3556   },
3557   /* REG_VEX_0F72 */
3558   {
3559     { Bad_Opcode },
3560     { Bad_Opcode },
3561     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3562     { Bad_Opcode },
3563     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3564     { Bad_Opcode },
3565     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3566   },
3567   /* REG_VEX_0F73 */
3568   {
3569     { Bad_Opcode },
3570     { Bad_Opcode },
3571     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3572     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3573     { Bad_Opcode },
3574     { Bad_Opcode },
3575     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3576     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3577   },
3578   /* REG_VEX_0FAE */
3579   {
3580     { Bad_Opcode },
3581     { Bad_Opcode },
3582     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3583     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3584   },
3585   /* REG_VEX_0F38F3 */
3586   {
3587     { Bad_Opcode },
3588     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3589     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3590     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3591   },
3592   /* REG_XOP_LWPCB */
3593   {
3594     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3595     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3596   },
3597   /* REG_XOP_LWP */
3598   {
3599     { "lwpins", { { OP_LWP_E, 0 }, Ed, Id }, 0 },
3600     { "lwpval", { { OP_LWP_E, 0 }, Ed, Id }, 0 },
3601   },
3602   /* REG_XOP_TBM_01 */
3603   {
3604     { Bad_Opcode },
3605     { "blcfill",        { { OP_LWP_E, 0 }, Edq }, 0 },
3606     { "blsfill",        { { OP_LWP_E, 0 }, Edq }, 0 },
3607     { "blcs",   { { OP_LWP_E, 0 }, Edq }, 0 },
3608     { "tzmsk",  { { OP_LWP_E, 0 }, Edq }, 0 },
3609     { "blcic",  { { OP_LWP_E, 0 }, Edq }, 0 },
3610     { "blsic",  { { OP_LWP_E, 0 }, Edq }, 0 },
3611     { "t1mskc", { { OP_LWP_E, 0 }, Edq }, 0 },
3612   },
3613   /* REG_XOP_TBM_02 */
3614   {
3615     { Bad_Opcode },
3616     { "blcmsk", { { OP_LWP_E, 0 }, Edq }, 0 },
3617     { Bad_Opcode },
3618     { Bad_Opcode },
3619     { Bad_Opcode },
3620     { Bad_Opcode },
3621     { "blci",   { { OP_LWP_E, 0 }, Edq }, 0 },
3622   },
3623
3624 #include "i386-dis-evex-reg.h"
3625 };
3626
3627 static const struct dis386 prefix_table[][4] = {
3628   /* PREFIX_90 */
3629   {
3630     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3631     { "pause", { XX }, 0 },
3632     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3633     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3634   },
3635
3636   /* PREFIX_MOD_0_0F01_REG_5 */
3637   {
3638     { Bad_Opcode },
3639     { "rstorssp",       { Mq }, PREFIX_OPCODE },
3640   },
3641
3642   /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3643   {
3644     { Bad_Opcode },
3645     { "setssbsy",       { Skip_MODRM }, PREFIX_OPCODE },
3646   },
3647
3648   /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3649   {
3650     { Bad_Opcode },
3651     { "saveprevssp",    { Skip_MODRM }, PREFIX_OPCODE },
3652   },
3653
3654   /* PREFIX_0F09 */
3655   {
3656     { "wbinvd",   { XX }, 0 },
3657     { "wbnoinvd", { XX }, 0 },
3658   },
3659
3660   /* PREFIX_0F10 */
3661   {
3662     { "movups", { XM, EXx }, PREFIX_OPCODE },
3663     { "movss",  { XM, EXd }, PREFIX_OPCODE },
3664     { "movupd", { XM, EXx }, PREFIX_OPCODE },
3665     { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3666   },
3667
3668   /* PREFIX_0F11 */
3669   {
3670     { "movups", { EXxS, XM }, PREFIX_OPCODE },
3671     { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3672     { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3673     { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3674   },
3675
3676   /* PREFIX_0F12 */
3677   {
3678     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3679     { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3680     { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3681     { "movddup", { XM, EXq }, PREFIX_OPCODE },
3682   },
3683
3684   /* PREFIX_0F16 */
3685   {
3686     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3687     { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3688     { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3689   },
3690
3691   /* PREFIX_0F1A */
3692   {
3693     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3694     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3695     { "bndmov", { Gbnd, Ebnd }, 0 },
3696     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3697   },
3698
3699   /* PREFIX_0F1B */
3700   {
3701     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3702     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3703     { "bndmov", { EbndS, Gbnd }, 0 },
3704     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3705   },
3706
3707   /* PREFIX_0F1C */
3708   {
3709     { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3710     { "nopQ",   { Ev }, PREFIX_OPCODE },
3711     { "nopQ",   { Ev }, PREFIX_OPCODE },
3712     { "nopQ",   { Ev }, PREFIX_OPCODE },
3713   },
3714
3715   /* PREFIX_0F1E */
3716   {
3717     { "nopQ",   { Ev }, PREFIX_OPCODE },
3718     { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3719     { "nopQ",   { Ev }, PREFIX_OPCODE },
3720     { "nopQ",   { Ev }, PREFIX_OPCODE },
3721   },
3722
3723   /* PREFIX_0F2A */
3724   {
3725     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3726     { "cvtsi2ss%LQ", { XM, Edq }, PREFIX_OPCODE },
3727     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3728     { "cvtsi2sd%LQ", { XM, Edq }, 0 },
3729   },
3730
3731   /* PREFIX_0F2B */
3732   {
3733     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3734     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3735     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3736     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3737   },
3738
3739   /* PREFIX_0F2C */
3740   {
3741     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3742     { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3743     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3744     { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3745   },
3746
3747   /* PREFIX_0F2D */
3748   {
3749     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3750     { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3751     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3752     { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3753   },
3754
3755   /* PREFIX_0F2E */
3756   {
3757     { "ucomiss",{ XM, EXd }, 0 },
3758     { Bad_Opcode },
3759     { "ucomisd",{ XM, EXq }, 0 },
3760   },
3761
3762   /* PREFIX_0F2F */
3763   {
3764     { "comiss", { XM, EXd }, 0 },
3765     { Bad_Opcode },
3766     { "comisd", { XM, EXq }, 0 },
3767   },
3768
3769   /* PREFIX_0F51 */
3770   {
3771     { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3772     { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3773     { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3774     { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3775   },
3776
3777   /* PREFIX_0F52 */
3778   {
3779     { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3780     { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3781   },
3782
3783   /* PREFIX_0F53 */
3784   {
3785     { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3786     { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3787   },
3788
3789   /* PREFIX_0F58 */
3790   {
3791     { "addps", { XM, EXx }, PREFIX_OPCODE },
3792     { "addss", { XM, EXd }, PREFIX_OPCODE },
3793     { "addpd", { XM, EXx }, PREFIX_OPCODE },
3794     { "addsd", { XM, EXq }, PREFIX_OPCODE },
3795   },
3796
3797   /* PREFIX_0F59 */
3798   {
3799     { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3800     { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3801     { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3802     { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3803   },
3804
3805   /* PREFIX_0F5A */
3806   {
3807     { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3808     { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3809     { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3810     { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3811   },
3812
3813   /* PREFIX_0F5B */
3814   {
3815     { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3816     { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3817     { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3818   },
3819
3820   /* PREFIX_0F5C */
3821   {
3822     { "subps",  { XM, EXx }, PREFIX_OPCODE },
3823     { "subss",  { XM, EXd }, PREFIX_OPCODE },
3824     { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3825     { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3826   },
3827
3828   /* PREFIX_0F5D */
3829   {
3830     { "minps",  { XM, EXx }, PREFIX_OPCODE },
3831     { "minss",  { XM, EXd }, PREFIX_OPCODE },
3832     { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3833     { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3834   },
3835
3836   /* PREFIX_0F5E */
3837   {
3838     { "divps",  { XM, EXx }, PREFIX_OPCODE },
3839     { "divss",  { XM, EXd }, PREFIX_OPCODE },
3840     { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3841     { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3842   },
3843
3844   /* PREFIX_0F5F */
3845   {
3846     { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3847     { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3848     { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3849     { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3850   },
3851
3852   /* PREFIX_0F60 */
3853   {
3854     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3855     { Bad_Opcode },
3856     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3857   },
3858
3859   /* PREFIX_0F61 */
3860   {
3861     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3862     { Bad_Opcode },
3863     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3864   },
3865
3866   /* PREFIX_0F62 */
3867   {
3868     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3869     { Bad_Opcode },
3870     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3871   },
3872
3873   /* PREFIX_0F6C */
3874   {
3875     { Bad_Opcode },
3876     { Bad_Opcode },
3877     { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3878   },
3879
3880   /* PREFIX_0F6D */
3881   {
3882     { Bad_Opcode },
3883     { Bad_Opcode },
3884     { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3885   },
3886
3887   /* PREFIX_0F6F */
3888   {
3889     { "movq",   { MX, EM }, PREFIX_OPCODE },
3890     { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3891     { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3892   },
3893
3894   /* PREFIX_0F70 */
3895   {
3896     { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3897     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3898     { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3899     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3900   },
3901
3902   /* PREFIX_0F73_REG_3 */
3903   {
3904     { Bad_Opcode },
3905     { Bad_Opcode },
3906     { "psrldq", { XS, Ib }, 0 },
3907   },
3908
3909   /* PREFIX_0F73_REG_7 */
3910   {
3911     { Bad_Opcode },
3912     { Bad_Opcode },
3913     { "pslldq", { XS, Ib }, 0 },
3914   },
3915
3916   /* PREFIX_0F78 */
3917   {
3918     {"vmread",  { Em, Gm }, 0 },
3919     { Bad_Opcode },
3920     {"extrq",   { XS, Ib, Ib }, 0 },
3921     {"insertq", { XM, XS, Ib, Ib }, 0 },
3922   },
3923
3924   /* PREFIX_0F79 */
3925   {
3926     {"vmwrite", { Gm, Em }, 0 },
3927     { Bad_Opcode },
3928     {"extrq",   { XM, XS }, 0 },
3929     {"insertq", { XM, XS }, 0 },
3930   },
3931
3932   /* PREFIX_0F7C */
3933   {
3934     { Bad_Opcode },
3935     { Bad_Opcode },
3936     { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3937     { "haddps", { XM, EXx }, PREFIX_OPCODE },
3938   },
3939
3940   /* PREFIX_0F7D */
3941   {
3942     { Bad_Opcode },
3943     { Bad_Opcode },
3944     { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3945     { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3946   },
3947
3948   /* PREFIX_0F7E */
3949   {
3950     { "movK",   { Edq, MX }, PREFIX_OPCODE },
3951     { "movq",   { XM, EXq }, PREFIX_OPCODE },
3952     { "movK",   { Edq, XM }, PREFIX_OPCODE },
3953   },
3954
3955   /* PREFIX_0F7F */
3956   {
3957     { "movq",   { EMS, MX }, PREFIX_OPCODE },
3958     { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3959     { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3960   },
3961
3962   /* PREFIX_0FAE_REG_0 */
3963   {
3964     { Bad_Opcode },
3965     { "rdfsbase", { Ev }, 0 },
3966   },
3967
3968   /* PREFIX_0FAE_REG_1 */
3969   {
3970     { Bad_Opcode },
3971     { "rdgsbase", { Ev }, 0 },
3972   },
3973
3974   /* PREFIX_0FAE_REG_2 */
3975   {
3976     { Bad_Opcode },
3977     { "wrfsbase", { Ev }, 0 },
3978   },
3979
3980   /* PREFIX_0FAE_REG_3 */
3981   {
3982     { Bad_Opcode },
3983     { "wrgsbase", { Ev }, 0 },
3984   },
3985
3986   /* PREFIX_MOD_0_0FAE_REG_4 */
3987   {
3988     { "xsave",  { FXSAVE }, 0 },
3989     { "ptwrite%LQ", { Edq }, 0 },
3990   },
3991
3992   /* PREFIX_MOD_3_0FAE_REG_4 */
3993   {
3994     { Bad_Opcode },
3995     { "ptwrite%LQ", { Edq }, 0 },
3996   },
3997
3998   /* PREFIX_MOD_0_0FAE_REG_5 */
3999   {
4000     { "xrstor",         { FXSAVE }, PREFIX_OPCODE },
4001   },
4002
4003   /* PREFIX_MOD_3_0FAE_REG_5 */
4004   {
4005     { "lfence",         { Skip_MODRM }, 0 },
4006     { "incsspK",        { Rdq }, PREFIX_OPCODE },
4007   },
4008
4009   /* PREFIX_MOD_0_0FAE_REG_6 */
4010   {
4011     { "xsaveopt",       { FXSAVE }, PREFIX_OPCODE },
4012     { "clrssbsy",       { Mq }, PREFIX_OPCODE },
4013     { "clwb",   { Mb }, PREFIX_OPCODE },
4014   },
4015
4016   /* PREFIX_MOD_1_0FAE_REG_6 */
4017   {
4018     { RM_TABLE (RM_0FAE_REG_6) },
4019     { "umonitor",       { Eva }, PREFIX_OPCODE },
4020     { "tpause", { Edq }, PREFIX_OPCODE },
4021     { "umwait", { Edq }, PREFIX_OPCODE },
4022   },
4023
4024   /* PREFIX_0FAE_REG_7 */
4025   {
4026     { "clflush",        { Mb }, 0 },
4027     { Bad_Opcode },
4028     { "clflushopt",     { Mb }, 0 },
4029   },
4030
4031   /* PREFIX_0FB8 */
4032   {
4033     { Bad_Opcode },
4034     { "popcntS", { Gv, Ev }, 0 },
4035   },
4036
4037   /* PREFIX_0FBC */
4038   {
4039     { "bsfS",   { Gv, Ev }, 0 },
4040     { "tzcntS", { Gv, Ev }, 0 },
4041     { "bsfS",   { Gv, Ev }, 0 },
4042   },
4043
4044   /* PREFIX_0FBD */
4045   {
4046     { "bsrS",   { Gv, Ev }, 0 },
4047     { "lzcntS", { Gv, Ev }, 0 },
4048     { "bsrS",   { Gv, Ev }, 0 },
4049   },
4050
4051   /* PREFIX_0FC2 */
4052   {
4053     { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
4054     { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
4055     { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
4056     { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
4057   },
4058
4059   /* PREFIX_MOD_0_0FC3 */
4060   {
4061     { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
4062   },
4063
4064   /* PREFIX_MOD_0_0FC7_REG_6 */
4065   {
4066     { "vmptrld",{ Mq }, 0 },
4067     { "vmxon",  { Mq }, 0 },
4068     { "vmclear",{ Mq }, 0 },
4069   },
4070
4071   /* PREFIX_MOD_3_0FC7_REG_6 */
4072   {
4073     { "rdrand", { Ev }, 0 },
4074     { Bad_Opcode },
4075     { "rdrand", { Ev }, 0 }
4076   },
4077
4078   /* PREFIX_MOD_3_0FC7_REG_7 */
4079   {
4080     { "rdseed", { Ev }, 0 },
4081     { "rdpid",  { Em }, 0 },
4082     { "rdseed", { Ev }, 0 },
4083   },
4084
4085   /* PREFIX_0FD0 */
4086   {
4087     { Bad_Opcode },
4088     { Bad_Opcode },
4089     { "addsubpd", { XM, EXx }, 0 },
4090     { "addsubps", { XM, EXx }, 0 },
4091   },
4092
4093   /* PREFIX_0FD6 */
4094   {
4095     { Bad_Opcode },
4096     { "movq2dq",{ XM, MS }, 0 },
4097     { "movq",   { EXqS, XM }, 0 },
4098     { "movdq2q",{ MX, XS }, 0 },
4099   },
4100
4101   /* PREFIX_0FE6 */
4102   {
4103     { Bad_Opcode },
4104     { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4105     { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4106     { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4107   },
4108
4109   /* PREFIX_0FE7 */
4110   {
4111     { "movntq", { Mq, MX }, PREFIX_OPCODE },
4112     { Bad_Opcode },
4113     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4114   },
4115
4116   /* PREFIX_0FF0 */
4117   {
4118     { Bad_Opcode },
4119     { Bad_Opcode },
4120     { Bad_Opcode },
4121     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4122   },
4123
4124   /* PREFIX_0FF7 */
4125   {
4126     { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4127     { Bad_Opcode },
4128     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4129   },
4130
4131   /* PREFIX_0F3810 */
4132   {
4133     { Bad_Opcode },
4134     { Bad_Opcode },
4135     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4136   },
4137
4138   /* PREFIX_0F3814 */
4139   {
4140     { Bad_Opcode },
4141     { Bad_Opcode },
4142     { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4143   },
4144
4145   /* PREFIX_0F3815 */
4146   {
4147     { Bad_Opcode },
4148     { Bad_Opcode },
4149     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4150   },
4151
4152   /* PREFIX_0F3817 */
4153   {
4154     { Bad_Opcode },
4155     { Bad_Opcode },
4156     { "ptest",  { XM, EXx }, PREFIX_OPCODE },
4157   },
4158
4159   /* PREFIX_0F3820 */
4160   {
4161     { Bad_Opcode },
4162     { Bad_Opcode },
4163     { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4164   },
4165
4166   /* PREFIX_0F3821 */
4167   {
4168     { Bad_Opcode },
4169     { Bad_Opcode },
4170     { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4171   },
4172
4173   /* PREFIX_0F3822 */
4174   {
4175     { Bad_Opcode },
4176     { Bad_Opcode },
4177     { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4178   },
4179
4180   /* PREFIX_0F3823 */
4181   {
4182     { Bad_Opcode },
4183     { Bad_Opcode },
4184     { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4185   },
4186
4187   /* PREFIX_0F3824 */
4188   {
4189     { Bad_Opcode },
4190     { Bad_Opcode },
4191     { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4192   },
4193
4194   /* PREFIX_0F3825 */
4195   {
4196     { Bad_Opcode },
4197     { Bad_Opcode },
4198     { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4199   },
4200
4201   /* PREFIX_0F3828 */
4202   {
4203     { Bad_Opcode },
4204     { Bad_Opcode },
4205     { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4206   },
4207
4208   /* PREFIX_0F3829 */
4209   {
4210     { Bad_Opcode },
4211     { Bad_Opcode },
4212     { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4213   },
4214
4215   /* PREFIX_0F382A */
4216   {
4217     { Bad_Opcode },
4218     { Bad_Opcode },
4219     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4220   },
4221
4222   /* PREFIX_0F382B */
4223   {
4224     { Bad_Opcode },
4225     { Bad_Opcode },
4226     { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4227   },
4228
4229   /* PREFIX_0F3830 */
4230   {
4231     { Bad_Opcode },
4232     { Bad_Opcode },
4233     { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4234   },
4235
4236   /* PREFIX_0F3831 */
4237   {
4238     { Bad_Opcode },
4239     { Bad_Opcode },
4240     { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4241   },
4242
4243   /* PREFIX_0F3832 */
4244   {
4245     { Bad_Opcode },
4246     { Bad_Opcode },
4247     { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4248   },
4249
4250   /* PREFIX_0F3833 */
4251   {
4252     { Bad_Opcode },
4253     { Bad_Opcode },
4254     { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4255   },
4256
4257   /* PREFIX_0F3834 */
4258   {
4259     { Bad_Opcode },
4260     { Bad_Opcode },
4261     { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4262   },
4263
4264   /* PREFIX_0F3835 */
4265   {
4266     { Bad_Opcode },
4267     { Bad_Opcode },
4268     { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4269   },
4270
4271   /* PREFIX_0F3837 */
4272   {
4273     { Bad_Opcode },
4274     { Bad_Opcode },
4275     { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4276   },
4277
4278   /* PREFIX_0F3838 */
4279   {
4280     { Bad_Opcode },
4281     { Bad_Opcode },
4282     { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4283   },
4284
4285   /* PREFIX_0F3839 */
4286   {
4287     { Bad_Opcode },
4288     { Bad_Opcode },
4289     { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4290   },
4291
4292   /* PREFIX_0F383A */
4293   {
4294     { Bad_Opcode },
4295     { Bad_Opcode },
4296     { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4297   },
4298
4299   /* PREFIX_0F383B */
4300   {
4301     { Bad_Opcode },
4302     { Bad_Opcode },
4303     { "pminud", { XM, EXx }, PREFIX_OPCODE },
4304   },
4305
4306   /* PREFIX_0F383C */
4307   {
4308     { Bad_Opcode },
4309     { Bad_Opcode },
4310     { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4311   },
4312
4313   /* PREFIX_0F383D */
4314   {
4315     { Bad_Opcode },
4316     { Bad_Opcode },
4317     { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4318   },
4319
4320   /* PREFIX_0F383E */
4321   {
4322     { Bad_Opcode },
4323     { Bad_Opcode },
4324     { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4325   },
4326
4327   /* PREFIX_0F383F */
4328   {
4329     { Bad_Opcode },
4330     { Bad_Opcode },
4331     { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4332   },
4333
4334   /* PREFIX_0F3840 */
4335   {
4336     { Bad_Opcode },
4337     { Bad_Opcode },
4338     { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4339   },
4340
4341   /* PREFIX_0F3841 */
4342   {
4343     { Bad_Opcode },
4344     { Bad_Opcode },
4345     { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4346   },
4347
4348   /* PREFIX_0F3880 */
4349   {
4350     { Bad_Opcode },
4351     { Bad_Opcode },
4352     { "invept", { Gm, Mo }, PREFIX_OPCODE },
4353   },
4354
4355   /* PREFIX_0F3881 */
4356   {
4357     { Bad_Opcode },
4358     { Bad_Opcode },
4359     { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4360   },
4361
4362   /* PREFIX_0F3882 */
4363   {
4364     { Bad_Opcode },
4365     { Bad_Opcode },
4366     { "invpcid", { Gm, M }, PREFIX_OPCODE },
4367   },
4368
4369   /* PREFIX_0F38C8 */
4370   {
4371     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4372   },
4373
4374   /* PREFIX_0F38C9 */
4375   {
4376     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4377   },
4378
4379   /* PREFIX_0F38CA */
4380   {
4381     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4382   },
4383
4384   /* PREFIX_0F38CB */
4385   {
4386     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4387   },
4388
4389   /* PREFIX_0F38CC */
4390   {
4391     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4392   },
4393
4394   /* PREFIX_0F38CD */
4395   {
4396     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4397   },
4398
4399   /* PREFIX_0F38CF */
4400   {
4401     { Bad_Opcode },
4402     { Bad_Opcode },
4403     { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4404   },
4405
4406   /* PREFIX_0F38DB */
4407   {
4408     { Bad_Opcode },
4409     { Bad_Opcode },
4410     { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4411   },
4412
4413   /* PREFIX_0F38DC */
4414   {
4415     { Bad_Opcode },
4416     { Bad_Opcode },
4417     { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4418   },
4419
4420   /* PREFIX_0F38DD */
4421   {
4422     { Bad_Opcode },
4423     { Bad_Opcode },
4424     { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4425   },
4426
4427   /* PREFIX_0F38DE */
4428   {
4429     { Bad_Opcode },
4430     { Bad_Opcode },
4431     { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4432   },
4433
4434   /* PREFIX_0F38DF */
4435   {
4436     { Bad_Opcode },
4437     { Bad_Opcode },
4438     { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4439   },
4440
4441   /* PREFIX_0F38F0 */
4442   {
4443     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4444     { Bad_Opcode },
4445     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4446     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4447   },
4448
4449   /* PREFIX_0F38F1 */
4450   {
4451     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4452     { Bad_Opcode },
4453     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4454     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4455   },
4456
4457   /* PREFIX_0F38F5 */
4458   {
4459     { Bad_Opcode },
4460     { Bad_Opcode },
4461     { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4462   },
4463
4464   /* PREFIX_0F38F6 */
4465   {
4466     { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4467     { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
4468     { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
4469     { Bad_Opcode },
4470   },
4471
4472   /* PREFIX_0F38F8 */
4473   {
4474     { Bad_Opcode },
4475     { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
4476     { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4477     { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
4478   },
4479
4480   /* PREFIX_0F38F9 */
4481   {
4482     { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4483   },
4484
4485   /* PREFIX_0F3A08 */
4486   {
4487     { Bad_Opcode },
4488     { Bad_Opcode },
4489     { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4490   },
4491
4492   /* PREFIX_0F3A09 */
4493   {
4494     { Bad_Opcode },
4495     { Bad_Opcode },
4496     { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4497   },
4498
4499   /* PREFIX_0F3A0A */
4500   {
4501     { Bad_Opcode },
4502     { Bad_Opcode },
4503     { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4504   },
4505
4506   /* PREFIX_0F3A0B */
4507   {
4508     { Bad_Opcode },
4509     { Bad_Opcode },
4510     { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4511   },
4512
4513   /* PREFIX_0F3A0C */
4514   {
4515     { Bad_Opcode },
4516     { Bad_Opcode },
4517     { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4518   },
4519
4520   /* PREFIX_0F3A0D */
4521   {
4522     { Bad_Opcode },
4523     { Bad_Opcode },
4524     { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4525   },
4526
4527   /* PREFIX_0F3A0E */
4528   {
4529     { Bad_Opcode },
4530     { Bad_Opcode },
4531     { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4532   },
4533
4534   /* PREFIX_0F3A14 */
4535   {
4536     { Bad_Opcode },
4537     { Bad_Opcode },
4538     { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4539   },
4540
4541   /* PREFIX_0F3A15 */
4542   {
4543     { Bad_Opcode },
4544     { Bad_Opcode },
4545     { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4546   },
4547
4548   /* PREFIX_0F3A16 */
4549   {
4550     { Bad_Opcode },
4551     { Bad_Opcode },
4552     { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4553   },
4554
4555   /* PREFIX_0F3A17 */
4556   {
4557     { Bad_Opcode },
4558     { Bad_Opcode },
4559     { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4560   },
4561
4562   /* PREFIX_0F3A20 */
4563   {
4564     { Bad_Opcode },
4565     { Bad_Opcode },
4566     { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4567   },
4568
4569   /* PREFIX_0F3A21 */
4570   {
4571     { Bad_Opcode },
4572     { Bad_Opcode },
4573     { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4574   },
4575
4576   /* PREFIX_0F3A22 */
4577   {
4578     { Bad_Opcode },
4579     { Bad_Opcode },
4580     { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4581   },
4582
4583   /* PREFIX_0F3A40 */
4584   {
4585     { Bad_Opcode },
4586     { Bad_Opcode },
4587     { "dpps",   { XM, EXx, Ib }, PREFIX_OPCODE },
4588   },
4589
4590   /* PREFIX_0F3A41 */
4591   {
4592     { Bad_Opcode },
4593     { Bad_Opcode },
4594     { "dppd",   { XM, EXx, Ib }, PREFIX_OPCODE },
4595   },
4596
4597   /* PREFIX_0F3A42 */
4598   {
4599     { Bad_Opcode },
4600     { Bad_Opcode },
4601     { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4602   },
4603
4604   /* PREFIX_0F3A44 */
4605   {
4606     { Bad_Opcode },
4607     { Bad_Opcode },
4608     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4609   },
4610
4611   /* PREFIX_0F3A60 */
4612   {
4613     { Bad_Opcode },
4614     { Bad_Opcode },
4615     { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4616   },
4617
4618   /* PREFIX_0F3A61 */
4619   {
4620     { Bad_Opcode },
4621     { Bad_Opcode },
4622     { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4623   },
4624
4625   /* PREFIX_0F3A62 */
4626   {
4627     { Bad_Opcode },
4628     { Bad_Opcode },
4629     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4630   },
4631
4632   /* PREFIX_0F3A63 */
4633   {
4634     { Bad_Opcode },
4635     { Bad_Opcode },
4636     { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4637   },
4638
4639   /* PREFIX_0F3ACC */
4640   {
4641     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4642   },
4643
4644   /* PREFIX_0F3ACE */
4645   {
4646     { Bad_Opcode },
4647     { Bad_Opcode },
4648     { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4649   },
4650
4651   /* PREFIX_0F3ACF */
4652   {
4653     { Bad_Opcode },
4654     { Bad_Opcode },
4655     { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4656   },
4657
4658   /* PREFIX_0F3ADF */
4659   {
4660     { Bad_Opcode },
4661     { Bad_Opcode },
4662     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4663   },
4664
4665   /* PREFIX_VEX_0F10 */
4666   {
4667     { "vmovups",        { XM, EXx }, 0 },
4668     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
4669     { "vmovupd",        { XM, EXx }, 0 },
4670     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
4671   },
4672
4673   /* PREFIX_VEX_0F11 */
4674   {
4675     { "vmovups",        { EXxS, XM }, 0 },
4676     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4677     { "vmovupd",        { EXxS, XM }, 0 },
4678     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4679   },
4680
4681   /* PREFIX_VEX_0F12 */
4682   {
4683     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4684     { "vmovsldup",      { XM, EXx }, 0 },
4685     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4686     { "vmovddup",       { XM, EXymmq }, 0 },
4687   },
4688
4689   /* PREFIX_VEX_0F16 */
4690   {
4691     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4692     { "vmovshdup",      { XM, EXx }, 0 },
4693     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4694   },
4695
4696   /* PREFIX_VEX_0F2A */
4697   {
4698     { Bad_Opcode },
4699     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4700     { Bad_Opcode },
4701     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4702   },
4703
4704   /* PREFIX_VEX_0F2C */
4705   {
4706     { Bad_Opcode },
4707     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4708     { Bad_Opcode },
4709     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4710   },
4711
4712   /* PREFIX_VEX_0F2D */
4713   {
4714     { Bad_Opcode },
4715     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4716     { Bad_Opcode },
4717     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4718   },
4719
4720   /* PREFIX_VEX_0F2E */
4721   {
4722     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
4723     { Bad_Opcode },
4724     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
4725   },
4726
4727   /* PREFIX_VEX_0F2F */
4728   {
4729     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
4730     { Bad_Opcode },
4731     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
4732   },
4733
4734   /* PREFIX_VEX_0F41 */
4735   {
4736     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4737     { Bad_Opcode },
4738     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4739   },
4740
4741   /* PREFIX_VEX_0F42 */
4742   {
4743     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4744     { Bad_Opcode },
4745     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4746   },
4747
4748   /* PREFIX_VEX_0F44 */
4749   {
4750     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4751     { Bad_Opcode },
4752     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4753   },
4754
4755   /* PREFIX_VEX_0F45 */
4756   {
4757     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4758     { Bad_Opcode },
4759     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4760   },
4761
4762   /* PREFIX_VEX_0F46 */
4763   {
4764     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4765     { Bad_Opcode },
4766     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4767   },
4768
4769   /* PREFIX_VEX_0F47 */
4770   {
4771     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4772     { Bad_Opcode },
4773     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4774   },
4775
4776   /* PREFIX_VEX_0F4A */
4777   {
4778     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4779     { Bad_Opcode },
4780     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4781   },
4782
4783   /* PREFIX_VEX_0F4B */
4784   {
4785     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4786     { Bad_Opcode },
4787     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4788   },
4789
4790   /* PREFIX_VEX_0F51 */
4791   {
4792     { "vsqrtps",        { XM, EXx }, 0 },
4793     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
4794     { "vsqrtpd",        { XM, EXx }, 0 },
4795     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
4796   },
4797
4798   /* PREFIX_VEX_0F52 */
4799   {
4800     { "vrsqrtps",       { XM, EXx }, 0 },
4801     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
4802   },
4803
4804   /* PREFIX_VEX_0F53 */
4805   {
4806     { "vrcpps",         { XM, EXx }, 0 },
4807     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4808   },
4809
4810   /* PREFIX_VEX_0F58 */
4811   {
4812     { "vaddps",         { XM, Vex, EXx }, 0 },
4813     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4814     { "vaddpd",         { XM, Vex, EXx }, 0 },
4815     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4816   },
4817
4818   /* PREFIX_VEX_0F59 */
4819   {
4820     { "vmulps",         { XM, Vex, EXx }, 0 },
4821     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4822     { "vmulpd",         { XM, Vex, EXx }, 0 },
4823     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4824   },
4825
4826   /* PREFIX_VEX_0F5A */
4827   {
4828     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
4829     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
4830     { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4831     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
4832   },
4833
4834   /* PREFIX_VEX_0F5B */
4835   {
4836     { "vcvtdq2ps",      { XM, EXx }, 0 },
4837     { "vcvttps2dq",     { XM, EXx }, 0 },
4838     { "vcvtps2dq",      { XM, EXx }, 0 },
4839   },
4840
4841   /* PREFIX_VEX_0F5C */
4842   {
4843     { "vsubps",         { XM, Vex, EXx }, 0 },
4844     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4845     { "vsubpd",         { XM, Vex, EXx }, 0 },
4846     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4847   },
4848
4849   /* PREFIX_VEX_0F5D */
4850   {
4851     { "vminps",         { XM, Vex, EXx }, 0 },
4852     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4853     { "vminpd",         { XM, Vex, EXx }, 0 },
4854     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4855   },
4856
4857   /* PREFIX_VEX_0F5E */
4858   {
4859     { "vdivps",         { XM, Vex, EXx }, 0 },
4860     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4861     { "vdivpd",         { XM, Vex, EXx }, 0 },
4862     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4863   },
4864
4865   /* PREFIX_VEX_0F5F */
4866   {
4867     { "vmaxps",         { XM, Vex, EXx }, 0 },
4868     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4869     { "vmaxpd",         { XM, Vex, EXx }, 0 },
4870     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4871   },
4872
4873   /* PREFIX_VEX_0F60 */
4874   {
4875     { Bad_Opcode },
4876     { Bad_Opcode },
4877     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
4878   },
4879
4880   /* PREFIX_VEX_0F61 */
4881   {
4882     { Bad_Opcode },
4883     { Bad_Opcode },
4884     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
4885   },
4886
4887   /* PREFIX_VEX_0F62 */
4888   {
4889     { Bad_Opcode },
4890     { Bad_Opcode },
4891     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
4892   },
4893
4894   /* PREFIX_VEX_0F63 */
4895   {
4896     { Bad_Opcode },
4897     { Bad_Opcode },
4898     { "vpacksswb",      { XM, Vex, EXx }, 0 },
4899   },
4900
4901   /* PREFIX_VEX_0F64 */
4902   {
4903     { Bad_Opcode },
4904     { Bad_Opcode },
4905     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
4906   },
4907
4908   /* PREFIX_VEX_0F65 */
4909   {
4910     { Bad_Opcode },
4911     { Bad_Opcode },
4912     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
4913   },
4914
4915   /* PREFIX_VEX_0F66 */
4916   {
4917     { Bad_Opcode },
4918     { Bad_Opcode },
4919     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
4920   },
4921
4922   /* PREFIX_VEX_0F67 */
4923   {
4924     { Bad_Opcode },
4925     { Bad_Opcode },
4926     { "vpackuswb",      { XM, Vex, EXx }, 0 },
4927   },
4928
4929   /* PREFIX_VEX_0F68 */
4930   {
4931     { Bad_Opcode },
4932     { Bad_Opcode },
4933     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
4934   },
4935
4936   /* PREFIX_VEX_0F69 */
4937   {
4938     { Bad_Opcode },
4939     { Bad_Opcode },
4940     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
4941   },
4942
4943   /* PREFIX_VEX_0F6A */
4944   {
4945     { Bad_Opcode },
4946     { Bad_Opcode },
4947     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
4948   },
4949
4950   /* PREFIX_VEX_0F6B */
4951   {
4952     { Bad_Opcode },
4953     { Bad_Opcode },
4954     { "vpackssdw",      { XM, Vex, EXx }, 0 },
4955   },
4956
4957   /* PREFIX_VEX_0F6C */
4958   {
4959     { Bad_Opcode },
4960     { Bad_Opcode },
4961     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
4962   },
4963
4964   /* PREFIX_VEX_0F6D */
4965   {
4966     { Bad_Opcode },
4967     { Bad_Opcode },
4968     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
4969   },
4970
4971   /* PREFIX_VEX_0F6E */
4972   {
4973     { Bad_Opcode },
4974     { Bad_Opcode },
4975     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4976   },
4977
4978   /* PREFIX_VEX_0F6F */
4979   {
4980     { Bad_Opcode },
4981     { "vmovdqu",        { XM, EXx }, 0 },
4982     { "vmovdqa",        { XM, EXx }, 0 },
4983   },
4984
4985   /* PREFIX_VEX_0F70 */
4986   {
4987     { Bad_Opcode },
4988     { "vpshufhw",       { XM, EXx, Ib }, 0 },
4989     { "vpshufd",        { XM, EXx, Ib }, 0 },
4990     { "vpshuflw",       { XM, EXx, Ib }, 0 },
4991   },
4992
4993   /* PREFIX_VEX_0F71_REG_2 */
4994   {
4995     { Bad_Opcode },
4996     { Bad_Opcode },
4997     { "vpsrlw",         { Vex, XS, Ib }, 0 },
4998   },
4999
5000   /* PREFIX_VEX_0F71_REG_4 */
5001   {
5002     { Bad_Opcode },
5003     { Bad_Opcode },
5004     { "vpsraw",         { Vex, XS, Ib }, 0 },
5005   },
5006
5007   /* PREFIX_VEX_0F71_REG_6 */
5008   {
5009     { Bad_Opcode },
5010     { Bad_Opcode },
5011     { "vpsllw",         { Vex, XS, Ib }, 0 },
5012   },
5013
5014   /* PREFIX_VEX_0F72_REG_2 */
5015   {
5016     { Bad_Opcode },
5017     { Bad_Opcode },
5018     { "vpsrld",         { Vex, XS, Ib }, 0 },
5019   },
5020
5021   /* PREFIX_VEX_0F72_REG_4 */
5022   {
5023     { Bad_Opcode },
5024     { Bad_Opcode },
5025     { "vpsrad",         { Vex, XS, Ib }, 0 },
5026   },
5027
5028   /* PREFIX_VEX_0F72_REG_6 */
5029   {
5030     { Bad_Opcode },
5031     { Bad_Opcode },
5032     { "vpslld",         { Vex, XS, Ib }, 0 },
5033   },
5034
5035   /* PREFIX_VEX_0F73_REG_2 */
5036   {
5037     { Bad_Opcode },
5038     { Bad_Opcode },
5039     { "vpsrlq",         { Vex, XS, Ib }, 0 },
5040   },
5041
5042   /* PREFIX_VEX_0F73_REG_3 */
5043   {
5044     { Bad_Opcode },
5045     { Bad_Opcode },
5046     { "vpsrldq",        { Vex, XS, Ib }, 0 },
5047   },
5048
5049   /* PREFIX_VEX_0F73_REG_6 */
5050   {
5051     { Bad_Opcode },
5052     { Bad_Opcode },
5053     { "vpsllq",         { Vex, XS, Ib }, 0 },
5054   },
5055
5056   /* PREFIX_VEX_0F73_REG_7 */
5057   {
5058     { Bad_Opcode },
5059     { Bad_Opcode },
5060     { "vpslldq",        { Vex, XS, Ib }, 0 },
5061   },
5062
5063   /* PREFIX_VEX_0F74 */
5064   {
5065     { Bad_Opcode },
5066     { Bad_Opcode },
5067     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
5068   },
5069
5070   /* PREFIX_VEX_0F75 */
5071   {
5072     { Bad_Opcode },
5073     { Bad_Opcode },
5074     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
5075   },
5076
5077   /* PREFIX_VEX_0F76 */
5078   {
5079     { Bad_Opcode },
5080     { Bad_Opcode },
5081     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
5082   },
5083
5084   /* PREFIX_VEX_0F77 */
5085   {
5086     { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5087   },
5088
5089   /* PREFIX_VEX_0F7C */
5090   {
5091     { Bad_Opcode },
5092     { Bad_Opcode },
5093     { "vhaddpd",        { XM, Vex, EXx }, 0 },
5094     { "vhaddps",        { XM, Vex, EXx }, 0 },
5095   },
5096
5097   /* PREFIX_VEX_0F7D */
5098   {
5099     { Bad_Opcode },
5100     { Bad_Opcode },
5101     { "vhsubpd",        { XM, Vex, EXx }, 0 },
5102     { "vhsubps",        { XM, Vex, EXx }, 0 },
5103   },
5104
5105   /* PREFIX_VEX_0F7E */
5106   {
5107     { Bad_Opcode },
5108     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5109     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5110   },
5111
5112   /* PREFIX_VEX_0F7F */
5113   {
5114     { Bad_Opcode },
5115     { "vmovdqu",        { EXxS, XM }, 0 },
5116     { "vmovdqa",        { EXxS, XM }, 0 },
5117   },
5118
5119   /* PREFIX_VEX_0F90 */
5120   {
5121     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5122     { Bad_Opcode },
5123     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5124   },
5125
5126   /* PREFIX_VEX_0F91 */
5127   {
5128     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5129     { Bad_Opcode },
5130     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5131   },
5132
5133   /* PREFIX_VEX_0F92 */
5134   {
5135     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5136     { Bad_Opcode },
5137     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5138     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5139   },
5140
5141   /* PREFIX_VEX_0F93 */
5142   {
5143     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5144     { Bad_Opcode },
5145     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5146     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5147   },
5148
5149   /* PREFIX_VEX_0F98 */
5150   {
5151     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5152     { Bad_Opcode },
5153     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5154   },
5155
5156   /* PREFIX_VEX_0F99 */
5157   {
5158     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5159     { Bad_Opcode },
5160     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5161   },
5162
5163   /* PREFIX_VEX_0FC2 */
5164   {
5165     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
5166     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5167     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
5168     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5169   },
5170
5171   /* PREFIX_VEX_0FC4 */
5172   {
5173     { Bad_Opcode },
5174     { Bad_Opcode },
5175     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5176   },
5177
5178   /* PREFIX_VEX_0FC5 */
5179   {
5180     { Bad_Opcode },
5181     { Bad_Opcode },
5182     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5183   },
5184
5185   /* PREFIX_VEX_0FD0 */
5186   {
5187     { Bad_Opcode },
5188     { Bad_Opcode },
5189     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
5190     { "vaddsubps",      { XM, Vex, EXx }, 0 },
5191   },
5192
5193   /* PREFIX_VEX_0FD1 */
5194   {
5195     { Bad_Opcode },
5196     { Bad_Opcode },
5197     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
5198   },
5199
5200   /* PREFIX_VEX_0FD2 */
5201   {
5202     { Bad_Opcode },
5203     { Bad_Opcode },
5204     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
5205   },
5206
5207   /* PREFIX_VEX_0FD3 */
5208   {
5209     { Bad_Opcode },
5210     { Bad_Opcode },
5211     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
5212   },
5213
5214   /* PREFIX_VEX_0FD4 */
5215   {
5216     { Bad_Opcode },
5217     { Bad_Opcode },
5218     { "vpaddq",         { XM, Vex, EXx }, 0 },
5219   },
5220
5221   /* PREFIX_VEX_0FD5 */
5222   {
5223     { Bad_Opcode },
5224     { Bad_Opcode },
5225     { "vpmullw",        { XM, Vex, EXx }, 0 },
5226   },
5227
5228   /* PREFIX_VEX_0FD6 */
5229   {
5230     { Bad_Opcode },
5231     { Bad_Opcode },
5232     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5233   },
5234
5235   /* PREFIX_VEX_0FD7 */
5236   {
5237     { Bad_Opcode },
5238     { Bad_Opcode },
5239     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5240   },
5241
5242   /* PREFIX_VEX_0FD8 */
5243   {
5244     { Bad_Opcode },
5245     { Bad_Opcode },
5246     { "vpsubusb",       { XM, Vex, EXx }, 0 },
5247   },
5248
5249   /* PREFIX_VEX_0FD9 */
5250   {
5251     { Bad_Opcode },
5252     { Bad_Opcode },
5253     { "vpsubusw",       { XM, Vex, EXx }, 0 },
5254   },
5255
5256   /* PREFIX_VEX_0FDA */
5257   {
5258     { Bad_Opcode },
5259     { Bad_Opcode },
5260     { "vpminub",        { XM, Vex, EXx }, 0 },
5261   },
5262
5263   /* PREFIX_VEX_0FDB */
5264   {
5265     { Bad_Opcode },
5266     { Bad_Opcode },
5267     { "vpand",          { XM, Vex, EXx }, 0 },
5268   },
5269
5270   /* PREFIX_VEX_0FDC */
5271   {
5272     { Bad_Opcode },
5273     { Bad_Opcode },
5274     { "vpaddusb",       { XM, Vex, EXx }, 0 },
5275   },
5276
5277   /* PREFIX_VEX_0FDD */
5278   {
5279     { Bad_Opcode },
5280     { Bad_Opcode },
5281     { "vpaddusw",       { XM, Vex, EXx }, 0 },
5282   },
5283
5284   /* PREFIX_VEX_0FDE */
5285   {
5286     { Bad_Opcode },
5287     { Bad_Opcode },
5288     { "vpmaxub",        { XM, Vex, EXx }, 0 },
5289   },
5290
5291   /* PREFIX_VEX_0FDF */
5292   {
5293     { Bad_Opcode },
5294     { Bad_Opcode },
5295     { "vpandn",         { XM, Vex, EXx }, 0 },
5296   },
5297
5298   /* PREFIX_VEX_0FE0 */
5299   {
5300     { Bad_Opcode },
5301     { Bad_Opcode },
5302     { "vpavgb",         { XM, Vex, EXx }, 0 },
5303   },
5304
5305   /* PREFIX_VEX_0FE1 */
5306   {
5307     { Bad_Opcode },
5308     { Bad_Opcode },
5309     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
5310   },
5311
5312   /* PREFIX_VEX_0FE2 */
5313   {
5314     { Bad_Opcode },
5315     { Bad_Opcode },
5316     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
5317   },
5318
5319   /* PREFIX_VEX_0FE3 */
5320   {
5321     { Bad_Opcode },
5322     { Bad_Opcode },
5323     { "vpavgw",         { XM, Vex, EXx }, 0 },
5324   },
5325
5326   /* PREFIX_VEX_0FE4 */
5327   {
5328     { Bad_Opcode },
5329     { Bad_Opcode },
5330     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
5331   },
5332
5333   /* PREFIX_VEX_0FE5 */
5334   {
5335     { Bad_Opcode },
5336     { Bad_Opcode },
5337     { "vpmulhw",        { XM, Vex, EXx }, 0 },
5338   },
5339
5340   /* PREFIX_VEX_0FE6 */
5341   {
5342     { Bad_Opcode },
5343     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
5344     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
5345     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
5346   },
5347
5348   /* PREFIX_VEX_0FE7 */
5349   {
5350     { Bad_Opcode },
5351     { Bad_Opcode },
5352     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5353   },
5354
5355   /* PREFIX_VEX_0FE8 */
5356   {
5357     { Bad_Opcode },
5358     { Bad_Opcode },
5359     { "vpsubsb",        { XM, Vex, EXx }, 0 },
5360   },
5361
5362   /* PREFIX_VEX_0FE9 */
5363   {
5364     { Bad_Opcode },
5365     { Bad_Opcode },
5366     { "vpsubsw",        { XM, Vex, EXx }, 0 },
5367   },
5368
5369   /* PREFIX_VEX_0FEA */
5370   {
5371     { Bad_Opcode },
5372     { Bad_Opcode },
5373     { "vpminsw",        { XM, Vex, EXx }, 0 },
5374   },
5375
5376   /* PREFIX_VEX_0FEB */
5377   {
5378     { Bad_Opcode },
5379     { Bad_Opcode },
5380     { "vpor",           { XM, Vex, EXx }, 0 },
5381   },
5382
5383   /* PREFIX_VEX_0FEC */
5384   {
5385     { Bad_Opcode },
5386     { Bad_Opcode },
5387     { "vpaddsb",        { XM, Vex, EXx }, 0 },
5388   },
5389
5390   /* PREFIX_VEX_0FED */
5391   {
5392     { Bad_Opcode },
5393     { Bad_Opcode },
5394     { "vpaddsw",        { XM, Vex, EXx }, 0 },
5395   },
5396
5397   /* PREFIX_VEX_0FEE */
5398   {
5399     { Bad_Opcode },
5400     { Bad_Opcode },
5401     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
5402   },
5403
5404   /* PREFIX_VEX_0FEF */
5405   {
5406     { Bad_Opcode },
5407     { Bad_Opcode },
5408     { "vpxor",          { XM, Vex, EXx }, 0 },
5409   },
5410
5411   /* PREFIX_VEX_0FF0 */
5412   {
5413     { Bad_Opcode },
5414     { Bad_Opcode },
5415     { Bad_Opcode },
5416     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5417   },
5418
5419   /* PREFIX_VEX_0FF1 */
5420   {
5421     { Bad_Opcode },
5422     { Bad_Opcode },
5423     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
5424   },
5425
5426   /* PREFIX_VEX_0FF2 */
5427   {
5428     { Bad_Opcode },
5429     { Bad_Opcode },
5430     { "vpslld",         { XM, Vex, EXxmm }, 0 },
5431   },
5432
5433   /* PREFIX_VEX_0FF3 */
5434   {
5435     { Bad_Opcode },
5436     { Bad_Opcode },
5437     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
5438   },
5439
5440   /* PREFIX_VEX_0FF4 */
5441   {
5442     { Bad_Opcode },
5443     { Bad_Opcode },
5444     { "vpmuludq",       { XM, Vex, EXx }, 0 },
5445   },
5446
5447   /* PREFIX_VEX_0FF5 */
5448   {
5449     { Bad_Opcode },
5450     { Bad_Opcode },
5451     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
5452   },
5453
5454   /* PREFIX_VEX_0FF6 */
5455   {
5456     { Bad_Opcode },
5457     { Bad_Opcode },
5458     { "vpsadbw",        { XM, Vex, EXx }, 0 },
5459   },
5460
5461   /* PREFIX_VEX_0FF7 */
5462   {
5463     { Bad_Opcode },
5464     { Bad_Opcode },
5465     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5466   },
5467
5468   /* PREFIX_VEX_0FF8 */
5469   {
5470     { Bad_Opcode },
5471     { Bad_Opcode },
5472     { "vpsubb",         { XM, Vex, EXx }, 0 },
5473   },
5474
5475   /* PREFIX_VEX_0FF9 */
5476   {
5477     { Bad_Opcode },
5478     { Bad_Opcode },
5479     { "vpsubw",         { XM, Vex, EXx }, 0 },
5480   },
5481
5482   /* PREFIX_VEX_0FFA */
5483   {
5484     { Bad_Opcode },
5485     { Bad_Opcode },
5486     { "vpsubd",         { XM, Vex, EXx }, 0 },
5487   },
5488
5489   /* PREFIX_VEX_0FFB */
5490   {
5491     { Bad_Opcode },
5492     { Bad_Opcode },
5493     { "vpsubq",         { XM, Vex, EXx }, 0 },
5494   },
5495
5496   /* PREFIX_VEX_0FFC */
5497   {
5498     { Bad_Opcode },
5499     { Bad_Opcode },
5500     { "vpaddb",         { XM, Vex, EXx }, 0 },
5501   },
5502
5503   /* PREFIX_VEX_0FFD */
5504   {
5505     { Bad_Opcode },
5506     { Bad_Opcode },
5507     { "vpaddw",         { XM, Vex, EXx }, 0 },
5508   },
5509
5510   /* PREFIX_VEX_0FFE */
5511   {
5512     { Bad_Opcode },
5513     { Bad_Opcode },
5514     { "vpaddd",         { XM, Vex, EXx }, 0 },
5515   },
5516
5517   /* PREFIX_VEX_0F3800 */
5518   {
5519     { Bad_Opcode },
5520     { Bad_Opcode },
5521     { "vpshufb",        { XM, Vex, EXx }, 0 },
5522   },
5523
5524   /* PREFIX_VEX_0F3801 */
5525   {
5526     { Bad_Opcode },
5527     { Bad_Opcode },
5528     { "vphaddw",        { XM, Vex, EXx }, 0 },
5529   },
5530
5531   /* PREFIX_VEX_0F3802 */
5532   {
5533     { Bad_Opcode },
5534     { Bad_Opcode },
5535     { "vphaddd",        { XM, Vex, EXx }, 0 },
5536   },
5537
5538   /* PREFIX_VEX_0F3803 */
5539   {
5540     { Bad_Opcode },
5541     { Bad_Opcode },
5542     { "vphaddsw",       { XM, Vex, EXx }, 0 },
5543   },
5544
5545   /* PREFIX_VEX_0F3804 */
5546   {
5547     { Bad_Opcode },
5548     { Bad_Opcode },
5549     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
5550   },
5551
5552   /* PREFIX_VEX_0F3805 */
5553   {
5554     { Bad_Opcode },
5555     { Bad_Opcode },
5556     { "vphsubw",        { XM, Vex, EXx }, 0 },
5557   },
5558
5559   /* PREFIX_VEX_0F3806 */
5560   {
5561     { Bad_Opcode },
5562     { Bad_Opcode },
5563     { "vphsubd",        { XM, Vex, EXx }, 0 },
5564   },
5565
5566   /* PREFIX_VEX_0F3807 */
5567   {
5568     { Bad_Opcode },
5569     { Bad_Opcode },
5570     { "vphsubsw",       { XM, Vex, EXx }, 0 },
5571   },
5572
5573   /* PREFIX_VEX_0F3808 */
5574   {
5575     { Bad_Opcode },
5576     { Bad_Opcode },
5577     { "vpsignb",        { XM, Vex, EXx }, 0 },
5578   },
5579
5580   /* PREFIX_VEX_0F3809 */
5581   {
5582     { Bad_Opcode },
5583     { Bad_Opcode },
5584     { "vpsignw",        { XM, Vex, EXx }, 0 },
5585   },
5586
5587   /* PREFIX_VEX_0F380A */
5588   {
5589     { Bad_Opcode },
5590     { Bad_Opcode },
5591     { "vpsignd",        { XM, Vex, EXx }, 0 },
5592   },
5593
5594   /* PREFIX_VEX_0F380B */
5595   {
5596     { Bad_Opcode },
5597     { Bad_Opcode },
5598     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
5599   },
5600
5601   /* PREFIX_VEX_0F380C */
5602   {
5603     { Bad_Opcode },
5604     { Bad_Opcode },
5605     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5606   },
5607
5608   /* PREFIX_VEX_0F380D */
5609   {
5610     { Bad_Opcode },
5611     { Bad_Opcode },
5612     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5613   },
5614
5615   /* PREFIX_VEX_0F380E */
5616   {
5617     { Bad_Opcode },
5618     { Bad_Opcode },
5619     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5620   },
5621
5622   /* PREFIX_VEX_0F380F */
5623   {
5624     { Bad_Opcode },
5625     { Bad_Opcode },
5626     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5627   },
5628
5629   /* PREFIX_VEX_0F3813 */
5630   {
5631     { Bad_Opcode },
5632     { Bad_Opcode },
5633     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5634   },
5635
5636   /* PREFIX_VEX_0F3816 */
5637   {
5638     { Bad_Opcode },
5639     { Bad_Opcode },
5640     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5641   },
5642
5643   /* PREFIX_VEX_0F3817 */
5644   {
5645     { Bad_Opcode },
5646     { Bad_Opcode },
5647     { "vptest",         { XM, EXx }, 0 },
5648   },
5649
5650   /* PREFIX_VEX_0F3818 */
5651   {
5652     { Bad_Opcode },
5653     { Bad_Opcode },
5654     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5655   },
5656
5657   /* PREFIX_VEX_0F3819 */
5658   {
5659     { Bad_Opcode },
5660     { Bad_Opcode },
5661     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5662   },
5663
5664   /* PREFIX_VEX_0F381A */
5665   {
5666     { Bad_Opcode },
5667     { Bad_Opcode },
5668     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5669   },
5670
5671   /* PREFIX_VEX_0F381C */
5672   {
5673     { Bad_Opcode },
5674     { Bad_Opcode },
5675     { "vpabsb",         { XM, EXx }, 0 },
5676   },
5677
5678   /* PREFIX_VEX_0F381D */
5679   {
5680     { Bad_Opcode },
5681     { Bad_Opcode },
5682     { "vpabsw",         { XM, EXx }, 0 },
5683   },
5684
5685   /* PREFIX_VEX_0F381E */
5686   {
5687     { Bad_Opcode },
5688     { Bad_Opcode },
5689     { "vpabsd",         { XM, EXx }, 0 },
5690   },
5691
5692   /* PREFIX_VEX_0F3820 */
5693   {
5694     { Bad_Opcode },
5695     { Bad_Opcode },
5696     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
5697   },
5698
5699   /* PREFIX_VEX_0F3821 */
5700   {
5701     { Bad_Opcode },
5702     { Bad_Opcode },
5703     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
5704   },
5705
5706   /* PREFIX_VEX_0F3822 */
5707   {
5708     { Bad_Opcode },
5709     { Bad_Opcode },
5710     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
5711   },
5712
5713   /* PREFIX_VEX_0F3823 */
5714   {
5715     { Bad_Opcode },
5716     { Bad_Opcode },
5717     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
5718   },
5719
5720   /* PREFIX_VEX_0F3824 */
5721   {
5722     { Bad_Opcode },
5723     { Bad_Opcode },
5724     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
5725   },
5726
5727   /* PREFIX_VEX_0F3825 */
5728   {
5729     { Bad_Opcode },
5730     { Bad_Opcode },
5731     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
5732   },
5733
5734   /* PREFIX_VEX_0F3828 */
5735   {
5736     { Bad_Opcode },
5737     { Bad_Opcode },
5738     { "vpmuldq",        { XM, Vex, EXx }, 0 },
5739   },
5740
5741   /* PREFIX_VEX_0F3829 */
5742   {
5743     { Bad_Opcode },
5744     { Bad_Opcode },
5745     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
5746   },
5747
5748   /* PREFIX_VEX_0F382A */
5749   {
5750     { Bad_Opcode },
5751     { Bad_Opcode },
5752     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5753   },
5754
5755   /* PREFIX_VEX_0F382B */
5756   {
5757     { Bad_Opcode },
5758     { Bad_Opcode },
5759     { "vpackusdw",      { XM, Vex, EXx }, 0 },
5760   },
5761
5762   /* PREFIX_VEX_0F382C */
5763   {
5764     { Bad_Opcode },
5765     { Bad_Opcode },
5766      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5767   },
5768
5769   /* PREFIX_VEX_0F382D */
5770   {
5771     { Bad_Opcode },
5772     { Bad_Opcode },
5773      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5774   },
5775
5776   /* PREFIX_VEX_0F382E */
5777   {
5778     { Bad_Opcode },
5779     { Bad_Opcode },
5780      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5781   },
5782
5783   /* PREFIX_VEX_0F382F */
5784   {
5785     { Bad_Opcode },
5786     { Bad_Opcode },
5787      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5788   },
5789
5790   /* PREFIX_VEX_0F3830 */
5791   {
5792     { Bad_Opcode },
5793     { Bad_Opcode },
5794     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
5795   },
5796
5797   /* PREFIX_VEX_0F3831 */
5798   {
5799     { Bad_Opcode },
5800     { Bad_Opcode },
5801     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
5802   },
5803
5804   /* PREFIX_VEX_0F3832 */
5805   {
5806     { Bad_Opcode },
5807     { Bad_Opcode },
5808     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
5809   },
5810
5811   /* PREFIX_VEX_0F3833 */
5812   {
5813     { Bad_Opcode },
5814     { Bad_Opcode },
5815     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
5816   },
5817
5818   /* PREFIX_VEX_0F3834 */
5819   {
5820     { Bad_Opcode },
5821     { Bad_Opcode },
5822     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
5823   },
5824
5825   /* PREFIX_VEX_0F3835 */
5826   {
5827     { Bad_Opcode },
5828     { Bad_Opcode },
5829     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
5830   },
5831
5832   /* PREFIX_VEX_0F3836 */
5833   {
5834     { Bad_Opcode },
5835     { Bad_Opcode },
5836     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5837   },
5838
5839   /* PREFIX_VEX_0F3837 */
5840   {
5841     { Bad_Opcode },
5842     { Bad_Opcode },
5843     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
5844   },
5845
5846   /* PREFIX_VEX_0F3838 */
5847   {
5848     { Bad_Opcode },
5849     { Bad_Opcode },
5850     { "vpminsb",        { XM, Vex, EXx }, 0 },
5851   },
5852
5853   /* PREFIX_VEX_0F3839 */
5854   {
5855     { Bad_Opcode },
5856     { Bad_Opcode },
5857     { "vpminsd",        { XM, Vex, EXx }, 0 },
5858   },
5859
5860   /* PREFIX_VEX_0F383A */
5861   {
5862     { Bad_Opcode },
5863     { Bad_Opcode },
5864     { "vpminuw",        { XM, Vex, EXx }, 0 },
5865   },
5866
5867   /* PREFIX_VEX_0F383B */
5868   {
5869     { Bad_Opcode },
5870     { Bad_Opcode },
5871     { "vpminud",        { XM, Vex, EXx }, 0 },
5872   },
5873
5874   /* PREFIX_VEX_0F383C */
5875   {
5876     { Bad_Opcode },
5877     { Bad_Opcode },
5878     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
5879   },
5880
5881   /* PREFIX_VEX_0F383D */
5882   {
5883     { Bad_Opcode },
5884     { Bad_Opcode },
5885     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
5886   },
5887
5888   /* PREFIX_VEX_0F383E */
5889   {
5890     { Bad_Opcode },
5891     { Bad_Opcode },
5892     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
5893   },
5894
5895   /* PREFIX_VEX_0F383F */
5896   {
5897     { Bad_Opcode },
5898     { Bad_Opcode },
5899     { "vpmaxud",        { XM, Vex, EXx }, 0 },
5900   },
5901
5902   /* PREFIX_VEX_0F3840 */
5903   {
5904     { Bad_Opcode },
5905     { Bad_Opcode },
5906     { "vpmulld",        { XM, Vex, EXx }, 0 },
5907   },
5908
5909   /* PREFIX_VEX_0F3841 */
5910   {
5911     { Bad_Opcode },
5912     { Bad_Opcode },
5913     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5914   },
5915
5916   /* PREFIX_VEX_0F3845 */
5917   {
5918     { Bad_Opcode },
5919     { Bad_Opcode },
5920     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5921   },
5922
5923   /* PREFIX_VEX_0F3846 */
5924   {
5925     { Bad_Opcode },
5926     { Bad_Opcode },
5927     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5928   },
5929
5930   /* PREFIX_VEX_0F3847 */
5931   {
5932     { Bad_Opcode },
5933     { Bad_Opcode },
5934     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5935   },
5936
5937   /* PREFIX_VEX_0F3858 */
5938   {
5939     { Bad_Opcode },
5940     { Bad_Opcode },
5941     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5942   },
5943
5944   /* PREFIX_VEX_0F3859 */
5945   {
5946     { Bad_Opcode },
5947     { Bad_Opcode },
5948     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5949   },
5950
5951   /* PREFIX_VEX_0F385A */
5952   {
5953     { Bad_Opcode },
5954     { Bad_Opcode },
5955     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5956   },
5957
5958   /* PREFIX_VEX_0F3878 */
5959   {
5960     { Bad_Opcode },
5961     { Bad_Opcode },
5962     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5963   },
5964
5965   /* PREFIX_VEX_0F3879 */
5966   {
5967     { Bad_Opcode },
5968     { Bad_Opcode },
5969     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5970   },
5971
5972   /* PREFIX_VEX_0F388C */
5973   {
5974     { Bad_Opcode },
5975     { Bad_Opcode },
5976     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5977   },
5978
5979   /* PREFIX_VEX_0F388E */
5980   {
5981     { Bad_Opcode },
5982     { Bad_Opcode },
5983     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5984   },
5985
5986   /* PREFIX_VEX_0F3890 */
5987   {
5988     { Bad_Opcode },
5989     { Bad_Opcode },
5990     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5991   },
5992
5993   /* PREFIX_VEX_0F3891 */
5994   {
5995     { Bad_Opcode },
5996     { Bad_Opcode },
5997     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
5998   },
5999
6000   /* PREFIX_VEX_0F3892 */
6001   {
6002     { Bad_Opcode },
6003     { Bad_Opcode },
6004     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
6005   },
6006
6007   /* PREFIX_VEX_0F3893 */
6008   {
6009     { Bad_Opcode },
6010     { Bad_Opcode },
6011     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
6012   },
6013
6014   /* PREFIX_VEX_0F3896 */
6015   {
6016     { Bad_Opcode },
6017     { Bad_Opcode },
6018     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
6019   },
6020
6021   /* PREFIX_VEX_0F3897 */
6022   {
6023     { Bad_Opcode },
6024     { Bad_Opcode },
6025     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
6026   },
6027
6028   /* PREFIX_VEX_0F3898 */
6029   {
6030     { Bad_Opcode },
6031     { Bad_Opcode },
6032     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6033   },
6034
6035   /* PREFIX_VEX_0F3899 */
6036   {
6037     { Bad_Opcode },
6038     { Bad_Opcode },
6039     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6040   },
6041
6042   /* PREFIX_VEX_0F389A */
6043   {
6044     { Bad_Opcode },
6045     { Bad_Opcode },
6046     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6047   },
6048
6049   /* PREFIX_VEX_0F389B */
6050   {
6051     { Bad_Opcode },
6052     { Bad_Opcode },
6053     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6054   },
6055
6056   /* PREFIX_VEX_0F389C */
6057   {
6058     { Bad_Opcode },
6059     { Bad_Opcode },
6060     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6061   },
6062
6063   /* PREFIX_VEX_0F389D */
6064   {
6065     { Bad_Opcode },
6066     { Bad_Opcode },
6067     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6068   },
6069
6070   /* PREFIX_VEX_0F389E */
6071   {
6072     { Bad_Opcode },
6073     { Bad_Opcode },
6074     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6075   },
6076
6077   /* PREFIX_VEX_0F389F */
6078   {
6079     { Bad_Opcode },
6080     { Bad_Opcode },
6081     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6082   },
6083
6084   /* PREFIX_VEX_0F38A6 */
6085   {
6086     { Bad_Opcode },
6087     { Bad_Opcode },
6088     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6089     { Bad_Opcode },
6090   },
6091
6092   /* PREFIX_VEX_0F38A7 */
6093   {
6094     { Bad_Opcode },
6095     { Bad_Opcode },
6096     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6097   },
6098
6099   /* PREFIX_VEX_0F38A8 */
6100   {
6101     { Bad_Opcode },
6102     { Bad_Opcode },
6103     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6104   },
6105
6106   /* PREFIX_VEX_0F38A9 */
6107   {
6108     { Bad_Opcode },
6109     { Bad_Opcode },
6110     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6111   },
6112
6113   /* PREFIX_VEX_0F38AA */
6114   {
6115     { Bad_Opcode },
6116     { Bad_Opcode },
6117     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6118   },
6119
6120   /* PREFIX_VEX_0F38AB */
6121   {
6122     { Bad_Opcode },
6123     { Bad_Opcode },
6124     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6125   },
6126
6127   /* PREFIX_VEX_0F38AC */
6128   {
6129     { Bad_Opcode },
6130     { Bad_Opcode },
6131     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6132   },
6133
6134   /* PREFIX_VEX_0F38AD */
6135   {
6136     { Bad_Opcode },
6137     { Bad_Opcode },
6138     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6139   },
6140
6141   /* PREFIX_VEX_0F38AE */
6142   {
6143     { Bad_Opcode },
6144     { Bad_Opcode },
6145     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6146   },
6147
6148   /* PREFIX_VEX_0F38AF */
6149   {
6150     { Bad_Opcode },
6151     { Bad_Opcode },
6152     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6153   },
6154
6155   /* PREFIX_VEX_0F38B6 */
6156   {
6157     { Bad_Opcode },
6158     { Bad_Opcode },
6159     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6160   },
6161
6162   /* PREFIX_VEX_0F38B7 */
6163   {
6164     { Bad_Opcode },
6165     { Bad_Opcode },
6166     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6167   },
6168
6169   /* PREFIX_VEX_0F38B8 */
6170   {
6171     { Bad_Opcode },
6172     { Bad_Opcode },
6173     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6174   },
6175
6176   /* PREFIX_VEX_0F38B9 */
6177   {
6178     { Bad_Opcode },
6179     { Bad_Opcode },
6180     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6181   },
6182
6183   /* PREFIX_VEX_0F38BA */
6184   {
6185     { Bad_Opcode },
6186     { Bad_Opcode },
6187     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6188   },
6189
6190   /* PREFIX_VEX_0F38BB */
6191   {
6192     { Bad_Opcode },
6193     { Bad_Opcode },
6194     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6195   },
6196
6197   /* PREFIX_VEX_0F38BC */
6198   {
6199     { Bad_Opcode },
6200     { Bad_Opcode },
6201     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6202   },
6203
6204   /* PREFIX_VEX_0F38BD */
6205   {
6206     { Bad_Opcode },
6207     { Bad_Opcode },
6208     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6209   },
6210
6211   /* PREFIX_VEX_0F38BE */
6212   {
6213     { Bad_Opcode },
6214     { Bad_Opcode },
6215     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6216   },
6217
6218   /* PREFIX_VEX_0F38BF */
6219   {
6220     { Bad_Opcode },
6221     { Bad_Opcode },
6222     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6223   },
6224
6225   /* PREFIX_VEX_0F38CF */
6226   {
6227     { Bad_Opcode },
6228     { Bad_Opcode },
6229     { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6230   },
6231
6232   /* PREFIX_VEX_0F38DB */
6233   {
6234     { Bad_Opcode },
6235     { Bad_Opcode },
6236     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6237   },
6238
6239   /* PREFIX_VEX_0F38DC */
6240   {
6241     { Bad_Opcode },
6242     { Bad_Opcode },
6243     { "vaesenc",        { XM, Vex, EXx }, 0 },
6244   },
6245
6246   /* PREFIX_VEX_0F38DD */
6247   {
6248     { Bad_Opcode },
6249     { Bad_Opcode },
6250     { "vaesenclast",    { XM, Vex, EXx }, 0 },
6251   },
6252
6253   /* PREFIX_VEX_0F38DE */
6254   {
6255     { Bad_Opcode },
6256     { Bad_Opcode },
6257     { "vaesdec",        { XM, Vex, EXx }, 0 },
6258   },
6259
6260   /* PREFIX_VEX_0F38DF */
6261   {
6262     { Bad_Opcode },
6263     { Bad_Opcode },
6264     { "vaesdeclast",    { XM, Vex, EXx }, 0 },
6265   },
6266
6267   /* PREFIX_VEX_0F38F2 */
6268   {
6269     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6270   },
6271
6272   /* PREFIX_VEX_0F38F3_REG_1 */
6273   {
6274     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6275   },
6276
6277   /* PREFIX_VEX_0F38F3_REG_2 */
6278   {
6279     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6280   },
6281
6282   /* PREFIX_VEX_0F38F3_REG_3 */
6283   {
6284     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6285   },
6286
6287   /* PREFIX_VEX_0F38F5 */
6288   {
6289     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6290     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6291     { Bad_Opcode },
6292     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6293   },
6294
6295   /* PREFIX_VEX_0F38F6 */
6296   {
6297     { Bad_Opcode },
6298     { Bad_Opcode },
6299     { Bad_Opcode },
6300     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6301   },
6302
6303   /* PREFIX_VEX_0F38F7 */
6304   {
6305     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6306     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6307     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6308     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6309   },
6310
6311   /* PREFIX_VEX_0F3A00 */
6312   {
6313     { Bad_Opcode },
6314     { Bad_Opcode },
6315     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6316   },
6317
6318   /* PREFIX_VEX_0F3A01 */
6319   {
6320     { Bad_Opcode },
6321     { Bad_Opcode },
6322     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6323   },
6324
6325   /* PREFIX_VEX_0F3A02 */
6326   {
6327     { Bad_Opcode },
6328     { Bad_Opcode },
6329     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6330   },
6331
6332   /* PREFIX_VEX_0F3A04 */
6333   {
6334     { Bad_Opcode },
6335     { Bad_Opcode },
6336     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6337   },
6338
6339   /* PREFIX_VEX_0F3A05 */
6340   {
6341     { Bad_Opcode },
6342     { Bad_Opcode },
6343     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6344   },
6345
6346   /* PREFIX_VEX_0F3A06 */
6347   {
6348     { Bad_Opcode },
6349     { Bad_Opcode },
6350     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6351   },
6352
6353   /* PREFIX_VEX_0F3A08 */
6354   {
6355     { Bad_Opcode },
6356     { Bad_Opcode },
6357     { "vroundps",       { XM, EXx, Ib }, 0 },
6358   },
6359
6360   /* PREFIX_VEX_0F3A09 */
6361   {
6362     { Bad_Opcode },
6363     { Bad_Opcode },
6364     { "vroundpd",       { XM, EXx, Ib }, 0 },
6365   },
6366
6367   /* PREFIX_VEX_0F3A0A */
6368   {
6369     { Bad_Opcode },
6370     { Bad_Opcode },
6371     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6372   },
6373
6374   /* PREFIX_VEX_0F3A0B */
6375   {
6376     { Bad_Opcode },
6377     { Bad_Opcode },
6378     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6379   },
6380
6381   /* PREFIX_VEX_0F3A0C */
6382   {
6383     { Bad_Opcode },
6384     { Bad_Opcode },
6385     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
6386   },
6387
6388   /* PREFIX_VEX_0F3A0D */
6389   {
6390     { Bad_Opcode },
6391     { Bad_Opcode },
6392     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
6393   },
6394
6395   /* PREFIX_VEX_0F3A0E */
6396   {
6397     { Bad_Opcode },
6398     { Bad_Opcode },
6399     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
6400   },
6401
6402   /* PREFIX_VEX_0F3A0F */
6403   {
6404     { Bad_Opcode },
6405     { Bad_Opcode },
6406     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
6407   },
6408
6409   /* PREFIX_VEX_0F3A14 */
6410   {
6411     { Bad_Opcode },
6412     { Bad_Opcode },
6413     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6414   },
6415
6416   /* PREFIX_VEX_0F3A15 */
6417   {
6418     { Bad_Opcode },
6419     { Bad_Opcode },
6420     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6421   },
6422
6423   /* PREFIX_VEX_0F3A16 */
6424   {
6425     { Bad_Opcode },
6426     { Bad_Opcode },
6427     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6428   },
6429
6430   /* PREFIX_VEX_0F3A17 */
6431   {
6432     { Bad_Opcode },
6433     { Bad_Opcode },
6434     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6435   },
6436
6437   /* PREFIX_VEX_0F3A18 */
6438   {
6439     { Bad_Opcode },
6440     { Bad_Opcode },
6441     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6442   },
6443
6444   /* PREFIX_VEX_0F3A19 */
6445   {
6446     { Bad_Opcode },
6447     { Bad_Opcode },
6448     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6449   },
6450
6451   /* PREFIX_VEX_0F3A1D */
6452   {
6453     { Bad_Opcode },
6454     { Bad_Opcode },
6455     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6456   },
6457
6458   /* PREFIX_VEX_0F3A20 */
6459   {
6460     { Bad_Opcode },
6461     { Bad_Opcode },
6462     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6463   },
6464
6465   /* PREFIX_VEX_0F3A21 */
6466   {
6467     { Bad_Opcode },
6468     { Bad_Opcode },
6469     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6470   },
6471
6472   /* PREFIX_VEX_0F3A22 */
6473   {
6474     { Bad_Opcode },
6475     { Bad_Opcode },
6476     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6477   },
6478
6479   /* PREFIX_VEX_0F3A30 */
6480   {
6481     { Bad_Opcode },
6482     { Bad_Opcode },
6483     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6484   },
6485
6486   /* PREFIX_VEX_0F3A31 */
6487   {
6488     { Bad_Opcode },
6489     { Bad_Opcode },
6490     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6491   },
6492
6493   /* PREFIX_VEX_0F3A32 */
6494   {
6495     { Bad_Opcode },
6496     { Bad_Opcode },
6497     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6498   },
6499
6500   /* PREFIX_VEX_0F3A33 */
6501   {
6502     { Bad_Opcode },
6503     { Bad_Opcode },
6504     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6505   },
6506
6507   /* PREFIX_VEX_0F3A38 */
6508   {
6509     { Bad_Opcode },
6510     { Bad_Opcode },
6511     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6512   },
6513
6514   /* PREFIX_VEX_0F3A39 */
6515   {
6516     { Bad_Opcode },
6517     { Bad_Opcode },
6518     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6519   },
6520
6521   /* PREFIX_VEX_0F3A40 */
6522   {
6523     { Bad_Opcode },
6524     { Bad_Opcode },
6525     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
6526   },
6527
6528   /* PREFIX_VEX_0F3A41 */
6529   {
6530     { Bad_Opcode },
6531     { Bad_Opcode },
6532     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6533   },
6534
6535   /* PREFIX_VEX_0F3A42 */
6536   {
6537     { Bad_Opcode },
6538     { Bad_Opcode },
6539     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
6540   },
6541
6542   /* PREFIX_VEX_0F3A44 */
6543   {
6544     { Bad_Opcode },
6545     { Bad_Opcode },
6546     { "vpclmulqdq",     { XM, Vex, EXx, PCLMUL }, 0 },
6547   },
6548
6549   /* PREFIX_VEX_0F3A46 */
6550   {
6551     { Bad_Opcode },
6552     { Bad_Opcode },
6553     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6554   },
6555
6556   /* PREFIX_VEX_0F3A48 */
6557   {
6558     { Bad_Opcode },
6559     { Bad_Opcode },
6560     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6561   },
6562
6563   /* PREFIX_VEX_0F3A49 */
6564   {
6565     { Bad_Opcode },
6566     { Bad_Opcode },
6567     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6568   },
6569
6570   /* PREFIX_VEX_0F3A4A */
6571   {
6572     { Bad_Opcode },
6573     { Bad_Opcode },
6574     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6575   },
6576
6577   /* PREFIX_VEX_0F3A4B */
6578   {
6579     { Bad_Opcode },
6580     { Bad_Opcode },
6581     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6582   },
6583
6584   /* PREFIX_VEX_0F3A4C */
6585   {
6586     { Bad_Opcode },
6587     { Bad_Opcode },
6588     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6589   },
6590
6591   /* PREFIX_VEX_0F3A5C */
6592   {
6593     { Bad_Opcode },
6594     { Bad_Opcode },
6595     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6596   },
6597
6598   /* PREFIX_VEX_0F3A5D */
6599   {
6600     { Bad_Opcode },
6601     { Bad_Opcode },
6602     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6603   },
6604
6605   /* PREFIX_VEX_0F3A5E */
6606   {
6607     { Bad_Opcode },
6608     { Bad_Opcode },
6609     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6610   },
6611
6612   /* PREFIX_VEX_0F3A5F */
6613   {
6614     { Bad_Opcode },
6615     { Bad_Opcode },
6616     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6617   },
6618
6619   /* PREFIX_VEX_0F3A60 */
6620   {
6621     { Bad_Opcode },
6622     { Bad_Opcode },
6623     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6624     { Bad_Opcode },
6625   },
6626
6627   /* PREFIX_VEX_0F3A61 */
6628   {
6629     { Bad_Opcode },
6630     { Bad_Opcode },
6631     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6632   },
6633
6634   /* PREFIX_VEX_0F3A62 */
6635   {
6636     { Bad_Opcode },
6637     { Bad_Opcode },
6638     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6639   },
6640
6641   /* PREFIX_VEX_0F3A63 */
6642   {
6643     { Bad_Opcode },
6644     { Bad_Opcode },
6645     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6646   },
6647
6648   /* PREFIX_VEX_0F3A68 */
6649   {
6650     { Bad_Opcode },
6651     { Bad_Opcode },
6652     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6653   },
6654
6655   /* PREFIX_VEX_0F3A69 */
6656   {
6657     { Bad_Opcode },
6658     { Bad_Opcode },
6659     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6660   },
6661
6662   /* PREFIX_VEX_0F3A6A */
6663   {
6664     { Bad_Opcode },
6665     { Bad_Opcode },
6666     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6667   },
6668
6669   /* PREFIX_VEX_0F3A6B */
6670   {
6671     { Bad_Opcode },
6672     { Bad_Opcode },
6673     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6674   },
6675
6676   /* PREFIX_VEX_0F3A6C */
6677   {
6678     { Bad_Opcode },
6679     { Bad_Opcode },
6680     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6681   },
6682
6683   /* PREFIX_VEX_0F3A6D */
6684   {
6685     { Bad_Opcode },
6686     { Bad_Opcode },
6687     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6688   },
6689
6690   /* PREFIX_VEX_0F3A6E */
6691   {
6692     { Bad_Opcode },
6693     { Bad_Opcode },
6694     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6695   },
6696
6697   /* PREFIX_VEX_0F3A6F */
6698   {
6699     { Bad_Opcode },
6700     { Bad_Opcode },
6701     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6702   },
6703
6704   /* PREFIX_VEX_0F3A78 */
6705   {
6706     { Bad_Opcode },
6707     { Bad_Opcode },
6708     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6709   },
6710
6711   /* PREFIX_VEX_0F3A79 */
6712   {
6713     { Bad_Opcode },
6714     { Bad_Opcode },
6715     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6716   },
6717
6718   /* PREFIX_VEX_0F3A7A */
6719   {
6720     { Bad_Opcode },
6721     { Bad_Opcode },
6722     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6723   },
6724
6725   /* PREFIX_VEX_0F3A7B */
6726   {
6727     { Bad_Opcode },
6728     { Bad_Opcode },
6729     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6730   },
6731
6732   /* PREFIX_VEX_0F3A7C */
6733   {
6734     { Bad_Opcode },
6735     { Bad_Opcode },
6736     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6737     { Bad_Opcode },
6738   },
6739
6740   /* PREFIX_VEX_0F3A7D */
6741   {
6742     { Bad_Opcode },
6743     { Bad_Opcode },
6744     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6745   },
6746
6747   /* PREFIX_VEX_0F3A7E */
6748   {
6749     { Bad_Opcode },
6750     { Bad_Opcode },
6751     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6752   },
6753
6754   /* PREFIX_VEX_0F3A7F */
6755   {
6756     { Bad_Opcode },
6757     { Bad_Opcode },
6758     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6759   },
6760
6761   /* PREFIX_VEX_0F3ACE */
6762   {
6763     { Bad_Opcode },
6764     { Bad_Opcode },
6765     { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6766   },
6767
6768   /* PREFIX_VEX_0F3ACF */
6769   {
6770     { Bad_Opcode },
6771     { Bad_Opcode },
6772     { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6773   },
6774
6775   /* PREFIX_VEX_0F3ADF */
6776   {
6777     { Bad_Opcode },
6778     { Bad_Opcode },
6779     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6780   },
6781
6782   /* PREFIX_VEX_0F3AF0 */
6783   {
6784     { Bad_Opcode },
6785     { Bad_Opcode },
6786     { Bad_Opcode },
6787     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6788   },
6789
6790 #include "i386-dis-evex-prefix.h"
6791 };
6792
6793 static const struct dis386 x86_64_table[][2] = {
6794   /* X86_64_06 */
6795   {
6796     { "pushP", { es }, 0 },
6797   },
6798
6799   /* X86_64_07 */
6800   {
6801     { "popP", { es }, 0 },
6802   },
6803
6804   /* X86_64_0D */
6805   {
6806     { "pushP", { cs }, 0 },
6807   },
6808
6809   /* X86_64_16 */
6810   {
6811     { "pushP", { ss }, 0 },
6812   },
6813
6814   /* X86_64_17 */
6815   {
6816     { "popP", { ss }, 0 },
6817   },
6818
6819   /* X86_64_1E */
6820   {
6821     { "pushP", { ds }, 0 },
6822   },
6823
6824   /* X86_64_1F */
6825   {
6826     { "popP", { ds }, 0 },
6827   },
6828
6829   /* X86_64_27 */
6830   {
6831     { "daa", { XX }, 0 },
6832   },
6833
6834   /* X86_64_2F */
6835   {
6836     { "das", { XX }, 0 },
6837   },
6838
6839   /* X86_64_37 */
6840   {
6841     { "aaa", { XX }, 0 },
6842   },
6843
6844   /* X86_64_3F */
6845   {
6846     { "aas", { XX }, 0 },
6847   },
6848
6849   /* X86_64_60 */
6850   {
6851     { "pushaP", { XX }, 0 },
6852   },
6853
6854   /* X86_64_61 */
6855   {
6856     { "popaP", { XX }, 0 },
6857   },
6858
6859   /* X86_64_62 */
6860   {
6861     { MOD_TABLE (MOD_62_32BIT) },
6862     { EVEX_TABLE (EVEX_0F) },
6863   },
6864
6865   /* X86_64_63 */
6866   {
6867     { "arpl", { Ew, Gw }, 0 },
6868     { "movs{lq|xd}", { Gv, Ed }, 0 },
6869   },
6870
6871   /* X86_64_6D */
6872   {
6873     { "ins{R|}", { Yzr, indirDX }, 0 },
6874     { "ins{G|}", { Yzr, indirDX }, 0 },
6875   },
6876
6877   /* X86_64_6F */
6878   {
6879     { "outs{R|}", { indirDXr, Xz }, 0 },
6880     { "outs{G|}", { indirDXr, Xz }, 0 },
6881   },
6882
6883   /* X86_64_82 */
6884   {
6885     /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
6886     { REG_TABLE (REG_80) },
6887   },
6888
6889   /* X86_64_9A */
6890   {
6891     { "Jcall{T|}", { Ap }, 0 },
6892   },
6893
6894   /* X86_64_C4 */
6895   {
6896     { MOD_TABLE (MOD_C4_32BIT) },
6897     { VEX_C4_TABLE (VEX_0F) },
6898   },
6899
6900   /* X86_64_C5 */
6901   {
6902     { MOD_TABLE (MOD_C5_32BIT) },
6903     { VEX_C5_TABLE (VEX_0F) },
6904   },
6905
6906   /* X86_64_CE */
6907   {
6908     { "into", { XX }, 0 },
6909   },
6910
6911   /* X86_64_D4 */
6912   {
6913     { "aam", { Ib }, 0 },
6914   },
6915
6916   /* X86_64_D5 */
6917   {
6918     { "aad", { Ib }, 0 },
6919   },
6920
6921   /* X86_64_E8 */
6922   {
6923     { "callP",          { Jv, BND }, 0 },
6924     { "call@",          { Jv, BND }, 0 }
6925   },
6926
6927   /* X86_64_E9 */
6928   {
6929     { "jmpP",           { Jv, BND }, 0 },
6930     { "jmp@",           { Jv, BND }, 0 }
6931   },
6932
6933   /* X86_64_EA */
6934   {
6935     { "Jjmp{T|}", { Ap }, 0 },
6936   },
6937
6938   /* X86_64_0F01_REG_0 */
6939   {
6940     { "sgdt{Q|IQ}", { M }, 0 },
6941     { "sgdt", { M }, 0 },
6942   },
6943
6944   /* X86_64_0F01_REG_1 */
6945   {
6946     { "sidt{Q|IQ}", { M }, 0 },
6947     { "sidt", { M }, 0 },
6948   },
6949
6950   /* X86_64_0F01_REG_2 */
6951   {
6952     { "lgdt{Q|Q}", { M }, 0 },
6953     { "lgdt", { M }, 0 },
6954   },
6955
6956   /* X86_64_0F01_REG_3 */
6957   {
6958     { "lidt{Q|Q}", { M }, 0 },
6959     { "lidt", { M }, 0 },
6960   },
6961 };
6962
6963 static const struct dis386 three_byte_table[][256] = {
6964
6965   /* THREE_BYTE_0F38 */
6966   {
6967     /* 00 */
6968     { "pshufb",         { MX, EM }, PREFIX_OPCODE },
6969     { "phaddw",         { MX, EM }, PREFIX_OPCODE },
6970     { "phaddd",         { MX, EM }, PREFIX_OPCODE },
6971     { "phaddsw",        { MX, EM }, PREFIX_OPCODE },
6972     { "pmaddubsw",      { MX, EM }, PREFIX_OPCODE },
6973     { "phsubw",         { MX, EM }, PREFIX_OPCODE },
6974     { "phsubd",         { MX, EM }, PREFIX_OPCODE },
6975     { "phsubsw",        { MX, EM }, PREFIX_OPCODE },
6976     /* 08 */
6977     { "psignb",         { MX, EM }, PREFIX_OPCODE },
6978     { "psignw",         { MX, EM }, PREFIX_OPCODE },
6979     { "psignd",         { MX, EM }, PREFIX_OPCODE },
6980     { "pmulhrsw",       { MX, EM }, PREFIX_OPCODE },
6981     { Bad_Opcode },
6982     { Bad_Opcode },
6983     { Bad_Opcode },
6984     { Bad_Opcode },
6985     /* 10 */
6986     { PREFIX_TABLE (PREFIX_0F3810) },
6987     { Bad_Opcode },
6988     { Bad_Opcode },
6989     { Bad_Opcode },
6990     { PREFIX_TABLE (PREFIX_0F3814) },
6991     { PREFIX_TABLE (PREFIX_0F3815) },
6992     { Bad_Opcode },
6993     { PREFIX_TABLE (PREFIX_0F3817) },
6994     /* 18 */
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     { Bad_Opcode },
6998     { Bad_Opcode },
6999     { "pabsb",          { MX, EM }, PREFIX_OPCODE },
7000     { "pabsw",          { MX, EM }, PREFIX_OPCODE },
7001     { "pabsd",          { MX, EM }, PREFIX_OPCODE },
7002     { Bad_Opcode },
7003     /* 20 */
7004     { PREFIX_TABLE (PREFIX_0F3820) },
7005     { PREFIX_TABLE (PREFIX_0F3821) },
7006     { PREFIX_TABLE (PREFIX_0F3822) },
7007     { PREFIX_TABLE (PREFIX_0F3823) },
7008     { PREFIX_TABLE (PREFIX_0F3824) },
7009     { PREFIX_TABLE (PREFIX_0F3825) },
7010     { Bad_Opcode },
7011     { Bad_Opcode },
7012     /* 28 */
7013     { PREFIX_TABLE (PREFIX_0F3828) },
7014     { PREFIX_TABLE (PREFIX_0F3829) },
7015     { PREFIX_TABLE (PREFIX_0F382A) },
7016     { PREFIX_TABLE (PREFIX_0F382B) },
7017     { Bad_Opcode },
7018     { Bad_Opcode },
7019     { Bad_Opcode },
7020     { Bad_Opcode },
7021     /* 30 */
7022     { PREFIX_TABLE (PREFIX_0F3830) },
7023     { PREFIX_TABLE (PREFIX_0F3831) },
7024     { PREFIX_TABLE (PREFIX_0F3832) },
7025     { PREFIX_TABLE (PREFIX_0F3833) },
7026     { PREFIX_TABLE (PREFIX_0F3834) },
7027     { PREFIX_TABLE (PREFIX_0F3835) },
7028     { Bad_Opcode },
7029     { PREFIX_TABLE (PREFIX_0F3837) },
7030     /* 38 */
7031     { PREFIX_TABLE (PREFIX_0F3838) },
7032     { PREFIX_TABLE (PREFIX_0F3839) },
7033     { PREFIX_TABLE (PREFIX_0F383A) },
7034     { PREFIX_TABLE (PREFIX_0F383B) },
7035     { PREFIX_TABLE (PREFIX_0F383C) },
7036     { PREFIX_TABLE (PREFIX_0F383D) },
7037     { PREFIX_TABLE (PREFIX_0F383E) },
7038     { PREFIX_TABLE (PREFIX_0F383F) },
7039     /* 40 */
7040     { PREFIX_TABLE (PREFIX_0F3840) },
7041     { PREFIX_TABLE (PREFIX_0F3841) },
7042     { Bad_Opcode },
7043     { Bad_Opcode },
7044     { Bad_Opcode },
7045     { Bad_Opcode },
7046     { Bad_Opcode },
7047     { Bad_Opcode },
7048     /* 48 */
7049     { Bad_Opcode },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     { Bad_Opcode },
7056     { Bad_Opcode },
7057     /* 50 */
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     { Bad_Opcode },
7065     { Bad_Opcode },
7066     /* 58 */
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     { Bad_Opcode },
7074     { Bad_Opcode },
7075     /* 60 */
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     { Bad_Opcode },
7082     { Bad_Opcode },
7083     { Bad_Opcode },
7084     /* 68 */
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     { Bad_Opcode },
7091     { Bad_Opcode },
7092     { Bad_Opcode },
7093     /* 70 */
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     { Bad_Opcode },
7101     { Bad_Opcode },
7102     /* 78 */
7103     { Bad_Opcode },
7104     { Bad_Opcode },
7105     { Bad_Opcode },
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     { Bad_Opcode },
7109     { Bad_Opcode },
7110     { Bad_Opcode },
7111     /* 80 */
7112     { PREFIX_TABLE (PREFIX_0F3880) },
7113     { PREFIX_TABLE (PREFIX_0F3881) },
7114     { PREFIX_TABLE (PREFIX_0F3882) },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     { Bad_Opcode },
7119     { Bad_Opcode },
7120     /* 88 */
7121     { Bad_Opcode },
7122     { Bad_Opcode },
7123     { Bad_Opcode },
7124     { Bad_Opcode },
7125     { Bad_Opcode },
7126     { Bad_Opcode },
7127     { Bad_Opcode },
7128     { Bad_Opcode },
7129     /* 90 */
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     { Bad_Opcode },
7137     { Bad_Opcode },
7138     /* 98 */
7139     { Bad_Opcode },
7140     { Bad_Opcode },
7141     { Bad_Opcode },
7142     { Bad_Opcode },
7143     { Bad_Opcode },
7144     { Bad_Opcode },
7145     { Bad_Opcode },
7146     { Bad_Opcode },
7147     /* a0 */
7148     { Bad_Opcode },
7149     { Bad_Opcode },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     { Bad_Opcode },
7154     { Bad_Opcode },
7155     { Bad_Opcode },
7156     /* a8 */
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     { Bad_Opcode },
7163     { Bad_Opcode },
7164     { Bad_Opcode },
7165     /* b0 */
7166     { Bad_Opcode },
7167     { Bad_Opcode },
7168     { Bad_Opcode },
7169     { Bad_Opcode },
7170     { Bad_Opcode },
7171     { Bad_Opcode },
7172     { Bad_Opcode },
7173     { Bad_Opcode },
7174     /* b8 */
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     { Bad_Opcode },
7178     { Bad_Opcode },
7179     { Bad_Opcode },
7180     { Bad_Opcode },
7181     { Bad_Opcode },
7182     { Bad_Opcode },
7183     /* c0 */
7184     { Bad_Opcode },
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     { Bad_Opcode },
7190     { Bad_Opcode },
7191     { Bad_Opcode },
7192     /* c8 */
7193     { PREFIX_TABLE (PREFIX_0F38C8) },
7194     { PREFIX_TABLE (PREFIX_0F38C9) },
7195     { PREFIX_TABLE (PREFIX_0F38CA) },
7196     { PREFIX_TABLE (PREFIX_0F38CB) },
7197     { PREFIX_TABLE (PREFIX_0F38CC) },
7198     { PREFIX_TABLE (PREFIX_0F38CD) },
7199     { Bad_Opcode },
7200     { PREFIX_TABLE (PREFIX_0F38CF) },
7201     /* d0 */
7202     { Bad_Opcode },
7203     { Bad_Opcode },
7204     { Bad_Opcode },
7205     { Bad_Opcode },
7206     { Bad_Opcode },
7207     { Bad_Opcode },
7208     { Bad_Opcode },
7209     { Bad_Opcode },
7210     /* d8 */
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     { Bad_Opcode },
7214     { PREFIX_TABLE (PREFIX_0F38DB) },
7215     { PREFIX_TABLE (PREFIX_0F38DC) },
7216     { PREFIX_TABLE (PREFIX_0F38DD) },
7217     { PREFIX_TABLE (PREFIX_0F38DE) },
7218     { PREFIX_TABLE (PREFIX_0F38DF) },
7219     /* e0 */
7220     { Bad_Opcode },
7221     { Bad_Opcode },
7222     { Bad_Opcode },
7223     { Bad_Opcode },
7224     { Bad_Opcode },
7225     { Bad_Opcode },
7226     { Bad_Opcode },
7227     { Bad_Opcode },
7228     /* e8 */
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     /* f0 */
7238     { PREFIX_TABLE (PREFIX_0F38F0) },
7239     { PREFIX_TABLE (PREFIX_0F38F1) },
7240     { Bad_Opcode },
7241     { Bad_Opcode },
7242     { Bad_Opcode },
7243     { PREFIX_TABLE (PREFIX_0F38F5) },
7244     { PREFIX_TABLE (PREFIX_0F38F6) },
7245     { Bad_Opcode },
7246     /* f8 */
7247     { PREFIX_TABLE (PREFIX_0F38F8) },
7248     { PREFIX_TABLE (PREFIX_0F38F9) },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     { Bad_Opcode },
7252     { Bad_Opcode },
7253     { Bad_Opcode },
7254     { Bad_Opcode },
7255   },
7256   /* THREE_BYTE_0F3A */
7257   {
7258     /* 00 */
7259     { Bad_Opcode },
7260     { Bad_Opcode },
7261     { Bad_Opcode },
7262     { Bad_Opcode },
7263     { Bad_Opcode },
7264     { Bad_Opcode },
7265     { Bad_Opcode },
7266     { Bad_Opcode },
7267     /* 08 */
7268     { PREFIX_TABLE (PREFIX_0F3A08) },
7269     { PREFIX_TABLE (PREFIX_0F3A09) },
7270     { PREFIX_TABLE (PREFIX_0F3A0A) },
7271     { PREFIX_TABLE (PREFIX_0F3A0B) },
7272     { PREFIX_TABLE (PREFIX_0F3A0C) },
7273     { PREFIX_TABLE (PREFIX_0F3A0D) },
7274     { PREFIX_TABLE (PREFIX_0F3A0E) },
7275     { "palignr",        { MX, EM, Ib }, PREFIX_OPCODE },
7276     /* 10 */
7277     { Bad_Opcode },
7278     { Bad_Opcode },
7279     { Bad_Opcode },
7280     { Bad_Opcode },
7281     { PREFIX_TABLE (PREFIX_0F3A14) },
7282     { PREFIX_TABLE (PREFIX_0F3A15) },
7283     { PREFIX_TABLE (PREFIX_0F3A16) },
7284     { PREFIX_TABLE (PREFIX_0F3A17) },
7285     /* 18 */
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     { Bad_Opcode },
7289     { Bad_Opcode },
7290     { Bad_Opcode },
7291     { Bad_Opcode },
7292     { Bad_Opcode },
7293     { Bad_Opcode },
7294     /* 20 */
7295     { PREFIX_TABLE (PREFIX_0F3A20) },
7296     { PREFIX_TABLE (PREFIX_0F3A21) },
7297     { PREFIX_TABLE (PREFIX_0F3A22) },
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     { Bad_Opcode },
7301     { Bad_Opcode },
7302     { Bad_Opcode },
7303     /* 28 */
7304     { Bad_Opcode },
7305     { Bad_Opcode },
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     { Bad_Opcode },
7310     { Bad_Opcode },
7311     { Bad_Opcode },
7312     /* 30 */
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     { Bad_Opcode },
7319     { Bad_Opcode },
7320     { Bad_Opcode },
7321     /* 38 */
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     { Bad_Opcode },
7328     { Bad_Opcode },
7329     { Bad_Opcode },
7330     /* 40 */
7331     { PREFIX_TABLE (PREFIX_0F3A40) },
7332     { PREFIX_TABLE (PREFIX_0F3A41) },
7333     { PREFIX_TABLE (PREFIX_0F3A42) },
7334     { Bad_Opcode },
7335     { PREFIX_TABLE (PREFIX_0F3A44) },
7336     { Bad_Opcode },
7337     { Bad_Opcode },
7338     { Bad_Opcode },
7339     /* 48 */
7340     { Bad_Opcode },
7341     { Bad_Opcode },
7342     { Bad_Opcode },
7343     { Bad_Opcode },
7344     { Bad_Opcode },
7345     { Bad_Opcode },
7346     { Bad_Opcode },
7347     { Bad_Opcode },
7348     /* 50 */
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     { Bad_Opcode },
7355     { Bad_Opcode },
7356     { Bad_Opcode },
7357     /* 58 */
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     { Bad_Opcode },
7364     { Bad_Opcode },
7365     { Bad_Opcode },
7366     /* 60 */
7367     { PREFIX_TABLE (PREFIX_0F3A60) },
7368     { PREFIX_TABLE (PREFIX_0F3A61) },
7369     { PREFIX_TABLE (PREFIX_0F3A62) },
7370     { PREFIX_TABLE (PREFIX_0F3A63) },
7371     { Bad_Opcode },
7372     { Bad_Opcode },
7373     { Bad_Opcode },
7374     { Bad_Opcode },
7375     /* 68 */
7376     { Bad_Opcode },
7377     { Bad_Opcode },
7378     { Bad_Opcode },
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     { Bad_Opcode },
7382     { Bad_Opcode },
7383     { Bad_Opcode },
7384     /* 70 */
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     { Bad_Opcode },
7391     { Bad_Opcode },
7392     { Bad_Opcode },
7393     /* 78 */
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     { Bad_Opcode },
7400     { Bad_Opcode },
7401     { Bad_Opcode },
7402     /* 80 */
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     { Bad_Opcode },
7409     { Bad_Opcode },
7410     { Bad_Opcode },
7411     /* 88 */
7412     { Bad_Opcode },
7413     { Bad_Opcode },
7414     { Bad_Opcode },
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     { Bad_Opcode },
7418     { Bad_Opcode },
7419     { Bad_Opcode },
7420     /* 90 */
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     { Bad_Opcode },
7427     { Bad_Opcode },
7428     { Bad_Opcode },
7429     /* 98 */
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434     { Bad_Opcode },
7435     { Bad_Opcode },
7436     { Bad_Opcode },
7437     { Bad_Opcode },
7438     /* a0 */
7439     { Bad_Opcode },
7440     { Bad_Opcode },
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     { Bad_Opcode },
7445     { Bad_Opcode },
7446     { Bad_Opcode },
7447     /* a8 */
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     { Bad_Opcode },
7454     { Bad_Opcode },
7455     { Bad_Opcode },
7456     /* b0 */
7457     { Bad_Opcode },
7458     { Bad_Opcode },
7459     { Bad_Opcode },
7460     { Bad_Opcode },
7461     { Bad_Opcode },
7462     { Bad_Opcode },
7463     { Bad_Opcode },
7464     { Bad_Opcode },
7465     /* b8 */
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471     { Bad_Opcode },
7472     { Bad_Opcode },
7473     { Bad_Opcode },
7474     /* c0 */
7475     { Bad_Opcode },
7476     { Bad_Opcode },
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { Bad_Opcode },
7480     { Bad_Opcode },
7481     { Bad_Opcode },
7482     { Bad_Opcode },
7483     /* c8 */
7484     { Bad_Opcode },
7485     { Bad_Opcode },
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { PREFIX_TABLE (PREFIX_0F3ACC) },
7489     { Bad_Opcode },
7490     { PREFIX_TABLE (PREFIX_0F3ACE) },
7491     { PREFIX_TABLE (PREFIX_0F3ACF) },
7492     /* d0 */
7493     { Bad_Opcode },
7494     { Bad_Opcode },
7495     { Bad_Opcode },
7496     { Bad_Opcode },
7497     { Bad_Opcode },
7498     { Bad_Opcode },
7499     { Bad_Opcode },
7500     { Bad_Opcode },
7501     /* d8 */
7502     { Bad_Opcode },
7503     { Bad_Opcode },
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     { Bad_Opcode },
7508     { Bad_Opcode },
7509     { PREFIX_TABLE (PREFIX_0F3ADF) },
7510     /* e0 */
7511     { Bad_Opcode },
7512     { Bad_Opcode },
7513     { Bad_Opcode },
7514     { Bad_Opcode },
7515     { Bad_Opcode },
7516     { Bad_Opcode },
7517     { Bad_Opcode },
7518     { Bad_Opcode },
7519     /* e8 */
7520     { Bad_Opcode },
7521     { Bad_Opcode },
7522     { Bad_Opcode },
7523     { Bad_Opcode },
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     { Bad_Opcode },
7527     { Bad_Opcode },
7528     /* f0 */
7529     { Bad_Opcode },
7530     { Bad_Opcode },
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { Bad_Opcode },
7534     { Bad_Opcode },
7535     { Bad_Opcode },
7536     { Bad_Opcode },
7537     /* f8 */
7538     { Bad_Opcode },
7539     { Bad_Opcode },
7540     { Bad_Opcode },
7541     { Bad_Opcode },
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     { Bad_Opcode },
7545     { Bad_Opcode },
7546   },
7547 };
7548
7549 static const struct dis386 xop_table[][256] = {
7550   /* XOP_08 */
7551   {
7552     /* 00 */
7553     { Bad_Opcode },
7554     { Bad_Opcode },
7555     { Bad_Opcode },
7556     { Bad_Opcode },
7557     { Bad_Opcode },
7558     { Bad_Opcode },
7559     { Bad_Opcode },
7560     { Bad_Opcode },
7561     /* 08 */
7562     { Bad_Opcode },
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     { Bad_Opcode },
7567     { Bad_Opcode },
7568     { Bad_Opcode },
7569     { Bad_Opcode },
7570     /* 10 */
7571     { Bad_Opcode },
7572     { Bad_Opcode },
7573     { Bad_Opcode },
7574     { Bad_Opcode },
7575     { Bad_Opcode },
7576     { Bad_Opcode },
7577     { Bad_Opcode },
7578     { Bad_Opcode },
7579     /* 18 */
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     { Bad_Opcode },
7585     { Bad_Opcode },
7586     { Bad_Opcode },
7587     { Bad_Opcode },
7588     /* 20 */
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     { Bad_Opcode },
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     { Bad_Opcode },
7597     /* 28 */
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     { Bad_Opcode },
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     { Bad_Opcode },
7606     /* 30 */
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     { Bad_Opcode },
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     { Bad_Opcode },
7615     /* 38 */
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     { Bad_Opcode },
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     { Bad_Opcode },
7624     /* 40 */
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     { Bad_Opcode },
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     { Bad_Opcode },
7633     /* 48 */
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     { Bad_Opcode },
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     { Bad_Opcode },
7642     /* 50 */
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     { Bad_Opcode },
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     { Bad_Opcode },
7651     /* 58 */
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     { Bad_Opcode },
7657     { Bad_Opcode },
7658     { Bad_Opcode },
7659     { Bad_Opcode },
7660     /* 60 */
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     { Bad_Opcode },
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     { Bad_Opcode },
7669     /* 68 */
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     { Bad_Opcode },
7674     { Bad_Opcode },
7675     { Bad_Opcode },
7676     { Bad_Opcode },
7677     { Bad_Opcode },
7678     /* 70 */
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { Bad_Opcode },
7683     { Bad_Opcode },
7684     { Bad_Opcode },
7685     { Bad_Opcode },
7686     { Bad_Opcode },
7687     /* 78 */
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     { Bad_Opcode },
7693     { Bad_Opcode },
7694     { Bad_Opcode },
7695     { Bad_Opcode },
7696     /* 80 */
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { Bad_Opcode },
7701     { Bad_Opcode },
7702     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7703     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7704     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7705     /* 88 */
7706     { Bad_Opcode },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { Bad_Opcode },
7710     { Bad_Opcode },
7711     { Bad_Opcode },
7712     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7713     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7714     /* 90 */
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     { Bad_Opcode },
7720     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7721     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7722     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7723     /* 98 */
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { Bad_Opcode },
7728     { Bad_Opcode },
7729     { Bad_Opcode },
7730     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7731     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7732     /* a0 */
7733     { Bad_Opcode },
7734     { Bad_Opcode },
7735     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7736     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7737     { Bad_Opcode },
7738     { Bad_Opcode },
7739     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7740     { Bad_Opcode },
7741     /* a8 */
7742     { Bad_Opcode },
7743     { Bad_Opcode },
7744     { Bad_Opcode },
7745     { Bad_Opcode },
7746     { Bad_Opcode },
7747     { Bad_Opcode },
7748     { Bad_Opcode },
7749     { Bad_Opcode },
7750     /* b0 */
7751     { Bad_Opcode },
7752     { Bad_Opcode },
7753     { Bad_Opcode },
7754     { Bad_Opcode },
7755     { Bad_Opcode },
7756     { Bad_Opcode },
7757     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7758     { Bad_Opcode },
7759     /* b8 */
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764     { Bad_Opcode },
7765     { Bad_Opcode },
7766     { Bad_Opcode },
7767     { Bad_Opcode },
7768     /* c0 */
7769     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7770     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7771     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7772     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     { Bad_Opcode },
7776     { Bad_Opcode },
7777     /* c8 */
7778     { Bad_Opcode },
7779     { Bad_Opcode },
7780     { Bad_Opcode },
7781     { Bad_Opcode },
7782     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7783     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7784     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7785     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7786     /* d0 */
7787     { Bad_Opcode },
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     { Bad_Opcode },
7791     { Bad_Opcode },
7792     { Bad_Opcode },
7793     { Bad_Opcode },
7794     { Bad_Opcode },
7795     /* d8 */
7796     { Bad_Opcode },
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     { Bad_Opcode },
7803     { Bad_Opcode },
7804     /* e0 */
7805     { Bad_Opcode },
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810     { Bad_Opcode },
7811     { Bad_Opcode },
7812     { Bad_Opcode },
7813     /* e8 */
7814     { Bad_Opcode },
7815     { Bad_Opcode },
7816     { Bad_Opcode },
7817     { Bad_Opcode },
7818     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7819     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7820     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7821     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7822     /* f0 */
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     /* f8 */
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     { Bad_Opcode },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     { Bad_Opcode },
7839     { Bad_Opcode },
7840   },
7841   /* XOP_09 */
7842   {
7843     /* 00 */
7844     { Bad_Opcode },
7845     { REG_TABLE (REG_XOP_TBM_01) },
7846     { REG_TABLE (REG_XOP_TBM_02) },
7847     { Bad_Opcode },
7848     { Bad_Opcode },
7849     { Bad_Opcode },
7850     { Bad_Opcode },
7851     { Bad_Opcode },
7852     /* 08 */
7853     { Bad_Opcode },
7854     { Bad_Opcode },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     { Bad_Opcode },
7861     /* 10 */
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     { REG_TABLE (REG_XOP_LWPCB) },
7865     { Bad_Opcode },
7866     { Bad_Opcode },
7867     { Bad_Opcode },
7868     { Bad_Opcode },
7869     { Bad_Opcode },
7870     /* 18 */
7871     { Bad_Opcode },
7872     { Bad_Opcode },
7873     { Bad_Opcode },
7874     { Bad_Opcode },
7875     { Bad_Opcode },
7876     { Bad_Opcode },
7877     { Bad_Opcode },
7878     { Bad_Opcode },
7879     /* 20 */
7880     { Bad_Opcode },
7881     { Bad_Opcode },
7882     { Bad_Opcode },
7883     { Bad_Opcode },
7884     { Bad_Opcode },
7885     { Bad_Opcode },
7886     { Bad_Opcode },
7887     { Bad_Opcode },
7888     /* 28 */
7889     { Bad_Opcode },
7890     { Bad_Opcode },
7891     { Bad_Opcode },
7892     { Bad_Opcode },
7893     { Bad_Opcode },
7894     { Bad_Opcode },
7895     { Bad_Opcode },
7896     { Bad_Opcode },
7897     /* 30 */
7898     { Bad_Opcode },
7899     { Bad_Opcode },
7900     { Bad_Opcode },
7901     { Bad_Opcode },
7902     { Bad_Opcode },
7903     { Bad_Opcode },
7904     { Bad_Opcode },
7905     { Bad_Opcode },
7906     /* 38 */
7907     { Bad_Opcode },
7908     { Bad_Opcode },
7909     { Bad_Opcode },
7910     { Bad_Opcode },
7911     { Bad_Opcode },
7912     { Bad_Opcode },
7913     { Bad_Opcode },
7914     { Bad_Opcode },
7915     /* 40 */
7916     { Bad_Opcode },
7917     { Bad_Opcode },
7918     { Bad_Opcode },
7919     { Bad_Opcode },
7920     { Bad_Opcode },
7921     { Bad_Opcode },
7922     { Bad_Opcode },
7923     { Bad_Opcode },
7924     /* 48 */
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     { Bad_Opcode },
7930     { Bad_Opcode },
7931     { Bad_Opcode },
7932     { Bad_Opcode },
7933     /* 50 */
7934     { Bad_Opcode },
7935     { Bad_Opcode },
7936     { Bad_Opcode },
7937     { Bad_Opcode },
7938     { Bad_Opcode },
7939     { Bad_Opcode },
7940     { Bad_Opcode },
7941     { Bad_Opcode },
7942     /* 58 */
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     { Bad_Opcode },
7948     { Bad_Opcode },
7949     { Bad_Opcode },
7950     { Bad_Opcode },
7951     /* 60 */
7952     { Bad_Opcode },
7953     { Bad_Opcode },
7954     { Bad_Opcode },
7955     { Bad_Opcode },
7956     { Bad_Opcode },
7957     { Bad_Opcode },
7958     { Bad_Opcode },
7959     { Bad_Opcode },
7960     /* 68 */
7961     { Bad_Opcode },
7962     { Bad_Opcode },
7963     { Bad_Opcode },
7964     { Bad_Opcode },
7965     { Bad_Opcode },
7966     { Bad_Opcode },
7967     { Bad_Opcode },
7968     { Bad_Opcode },
7969     /* 70 */
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { Bad_Opcode },
7973     { Bad_Opcode },
7974     { Bad_Opcode },
7975     { Bad_Opcode },
7976     { Bad_Opcode },
7977     { Bad_Opcode },
7978     /* 78 */
7979     { Bad_Opcode },
7980     { Bad_Opcode },
7981     { Bad_Opcode },
7982     { Bad_Opcode },
7983     { Bad_Opcode },
7984     { Bad_Opcode },
7985     { Bad_Opcode },
7986     { Bad_Opcode },
7987     /* 80 */
7988     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7989     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7990     { "vfrczss",        { XM, EXd }, 0 },
7991     { "vfrczsd",        { XM, EXq }, 0 },
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     { Bad_Opcode },
7996     /* 88 */
7997     { Bad_Opcode },
7998     { Bad_Opcode },
7999     { Bad_Opcode },
8000     { Bad_Opcode },
8001     { Bad_Opcode },
8002     { Bad_Opcode },
8003     { Bad_Opcode },
8004     { Bad_Opcode },
8005     /* 90 */
8006     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8007     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8008     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8009     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8010     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8011     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8012     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8013     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8014     /* 98 */
8015     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8016     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8017     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8018     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8019     { Bad_Opcode },
8020     { Bad_Opcode },
8021     { Bad_Opcode },
8022     { Bad_Opcode },
8023     /* a0 */
8024     { Bad_Opcode },
8025     { Bad_Opcode },
8026     { Bad_Opcode },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     { Bad_Opcode },
8031     { Bad_Opcode },
8032     /* a8 */
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { Bad_Opcode },
8037     { Bad_Opcode },
8038     { Bad_Opcode },
8039     { Bad_Opcode },
8040     { Bad_Opcode },
8041     /* b0 */
8042     { Bad_Opcode },
8043     { Bad_Opcode },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     { Bad_Opcode },
8048     { Bad_Opcode },
8049     { Bad_Opcode },
8050     /* b8 */
8051     { Bad_Opcode },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     { Bad_Opcode },
8055     { Bad_Opcode },
8056     { Bad_Opcode },
8057     { Bad_Opcode },
8058     { Bad_Opcode },
8059     /* c0 */
8060     { Bad_Opcode },
8061     { "vphaddbw",       { XM, EXxmm }, 0 },
8062     { "vphaddbd",       { XM, EXxmm }, 0 },
8063     { "vphaddbq",       { XM, EXxmm }, 0 },
8064     { Bad_Opcode },
8065     { Bad_Opcode },
8066     { "vphaddwd",       { XM, EXxmm }, 0 },
8067     { "vphaddwq",       { XM, EXxmm }, 0 },
8068     /* c8 */
8069     { Bad_Opcode },
8070     { Bad_Opcode },
8071     { Bad_Opcode },
8072     { "vphadddq",       { XM, EXxmm }, 0 },
8073     { Bad_Opcode },
8074     { Bad_Opcode },
8075     { Bad_Opcode },
8076     { Bad_Opcode },
8077     /* d0 */
8078     { Bad_Opcode },
8079     { "vphaddubw",      { XM, EXxmm }, 0 },
8080     { "vphaddubd",      { XM, EXxmm }, 0 },
8081     { "vphaddubq",      { XM, EXxmm }, 0 },
8082     { Bad_Opcode },
8083     { Bad_Opcode },
8084     { "vphadduwd",      { XM, EXxmm }, 0 },
8085     { "vphadduwq",      { XM, EXxmm }, 0 },
8086     /* d8 */
8087     { Bad_Opcode },
8088     { Bad_Opcode },
8089     { Bad_Opcode },
8090     { "vphaddudq",      { XM, EXxmm }, 0 },
8091     { Bad_Opcode },
8092     { Bad_Opcode },
8093     { Bad_Opcode },
8094     { Bad_Opcode },
8095     /* e0 */
8096     { Bad_Opcode },
8097     { "vphsubbw",       { XM, EXxmm }, 0 },
8098     { "vphsubwd",       { XM, EXxmm }, 0 },
8099     { "vphsubdq",       { XM, EXxmm }, 0 },
8100     { Bad_Opcode },
8101     { Bad_Opcode },
8102     { Bad_Opcode },
8103     { Bad_Opcode },
8104     /* e8 */
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     /* f0 */
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     /* f8 */
8123     { Bad_Opcode },
8124     { Bad_Opcode },
8125     { Bad_Opcode },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     { Bad_Opcode },
8130     { Bad_Opcode },
8131   },
8132   /* XOP_0A */
8133   {
8134     /* 00 */
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     { Bad_Opcode },
8139     { Bad_Opcode },
8140     { Bad_Opcode },
8141     { Bad_Opcode },
8142     { Bad_Opcode },
8143     /* 08 */
8144     { Bad_Opcode },
8145     { Bad_Opcode },
8146     { Bad_Opcode },
8147     { Bad_Opcode },
8148     { Bad_Opcode },
8149     { Bad_Opcode },
8150     { Bad_Opcode },
8151     { Bad_Opcode },
8152     /* 10 */
8153     { "bextrS", { Gdq, Edq, Id }, 0 },
8154     { Bad_Opcode },
8155     { REG_TABLE (REG_XOP_LWP) },
8156     { Bad_Opcode },
8157     { Bad_Opcode },
8158     { Bad_Opcode },
8159     { Bad_Opcode },
8160     { Bad_Opcode },
8161     /* 18 */
8162     { Bad_Opcode },
8163     { Bad_Opcode },
8164     { Bad_Opcode },
8165     { Bad_Opcode },
8166     { Bad_Opcode },
8167     { Bad_Opcode },
8168     { Bad_Opcode },
8169     { Bad_Opcode },
8170     /* 20 */
8171     { Bad_Opcode },
8172     { Bad_Opcode },
8173     { Bad_Opcode },
8174     { Bad_Opcode },
8175     { Bad_Opcode },
8176     { Bad_Opcode },
8177     { Bad_Opcode },
8178     { Bad_Opcode },
8179     /* 28 */
8180     { Bad_Opcode },
8181     { Bad_Opcode },
8182     { Bad_Opcode },
8183     { Bad_Opcode },
8184     { Bad_Opcode },
8185     { Bad_Opcode },
8186     { Bad_Opcode },
8187     { Bad_Opcode },
8188     /* 30 */
8189     { Bad_Opcode },
8190     { Bad_Opcode },
8191     { Bad_Opcode },
8192     { Bad_Opcode },
8193     { Bad_Opcode },
8194     { Bad_Opcode },
8195     { Bad_Opcode },
8196     { Bad_Opcode },
8197     /* 38 */
8198     { Bad_Opcode },
8199     { Bad_Opcode },
8200     { Bad_Opcode },
8201     { Bad_Opcode },
8202     { Bad_Opcode },
8203     { Bad_Opcode },
8204     { Bad_Opcode },
8205     { Bad_Opcode },
8206     /* 40 */
8207     { Bad_Opcode },
8208     { Bad_Opcode },
8209     { Bad_Opcode },
8210     { Bad_Opcode },
8211     { Bad_Opcode },
8212     { Bad_Opcode },
8213     { Bad_Opcode },
8214     { Bad_Opcode },
8215     /* 48 */
8216     { Bad_Opcode },
8217     { Bad_Opcode },
8218     { Bad_Opcode },
8219     { Bad_Opcode },
8220     { Bad_Opcode },
8221     { Bad_Opcode },
8222     { Bad_Opcode },
8223     { Bad_Opcode },
8224     /* 50 */
8225     { Bad_Opcode },
8226     { Bad_Opcode },
8227     { Bad_Opcode },
8228     { Bad_Opcode },
8229     { Bad_Opcode },
8230     { Bad_Opcode },
8231     { Bad_Opcode },
8232     { Bad_Opcode },
8233     /* 58 */
8234     { Bad_Opcode },
8235     { Bad_Opcode },
8236     { Bad_Opcode },
8237     { Bad_Opcode },
8238     { Bad_Opcode },
8239     { Bad_Opcode },
8240     { Bad_Opcode },
8241     { Bad_Opcode },
8242     /* 60 */
8243     { Bad_Opcode },
8244     { Bad_Opcode },
8245     { Bad_Opcode },
8246     { Bad_Opcode },
8247     { Bad_Opcode },
8248     { Bad_Opcode },
8249     { Bad_Opcode },
8250     { Bad_Opcode },
8251     /* 68 */
8252     { Bad_Opcode },
8253     { Bad_Opcode },
8254     { Bad_Opcode },
8255     { Bad_Opcode },
8256     { Bad_Opcode },
8257     { Bad_Opcode },
8258     { Bad_Opcode },
8259     { Bad_Opcode },
8260     /* 70 */
8261     { Bad_Opcode },
8262     { Bad_Opcode },
8263     { Bad_Opcode },
8264     { Bad_Opcode },
8265     { Bad_Opcode },
8266     { Bad_Opcode },
8267     { Bad_Opcode },
8268     { Bad_Opcode },
8269     /* 78 */
8270     { Bad_Opcode },
8271     { Bad_Opcode },
8272     { Bad_Opcode },
8273     { Bad_Opcode },
8274     { Bad_Opcode },
8275     { Bad_Opcode },
8276     { Bad_Opcode },
8277     { Bad_Opcode },
8278     /* 80 */
8279     { Bad_Opcode },
8280     { Bad_Opcode },
8281     { Bad_Opcode },
8282     { Bad_Opcode },
8283     { Bad_Opcode },
8284     { Bad_Opcode },
8285     { Bad_Opcode },
8286     { Bad_Opcode },
8287     /* 88 */
8288     { Bad_Opcode },
8289     { Bad_Opcode },
8290     { Bad_Opcode },
8291     { Bad_Opcode },
8292     { Bad_Opcode },
8293     { Bad_Opcode },
8294     { Bad_Opcode },
8295     { Bad_Opcode },
8296     /* 90 */
8297     { Bad_Opcode },
8298     { Bad_Opcode },
8299     { Bad_Opcode },
8300     { Bad_Opcode },
8301     { Bad_Opcode },
8302     { Bad_Opcode },
8303     { Bad_Opcode },
8304     { Bad_Opcode },
8305     /* 98 */
8306     { Bad_Opcode },
8307     { Bad_Opcode },
8308     { Bad_Opcode },
8309     { Bad_Opcode },
8310     { Bad_Opcode },
8311     { Bad_Opcode },
8312     { Bad_Opcode },
8313     { Bad_Opcode },
8314     /* a0 */
8315     { Bad_Opcode },
8316     { Bad_Opcode },
8317     { Bad_Opcode },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     { Bad_Opcode },
8321     { Bad_Opcode },
8322     { Bad_Opcode },
8323     /* a8 */
8324     { Bad_Opcode },
8325     { Bad_Opcode },
8326     { Bad_Opcode },
8327     { Bad_Opcode },
8328     { Bad_Opcode },
8329     { Bad_Opcode },
8330     { Bad_Opcode },
8331     { Bad_Opcode },
8332     /* b0 */
8333     { Bad_Opcode },
8334     { Bad_Opcode },
8335     { Bad_Opcode },
8336     { Bad_Opcode },
8337     { Bad_Opcode },
8338     { Bad_Opcode },
8339     { Bad_Opcode },
8340     { Bad_Opcode },
8341     /* b8 */
8342     { Bad_Opcode },
8343     { Bad_Opcode },
8344     { Bad_Opcode },
8345     { Bad_Opcode },
8346     { Bad_Opcode },
8347     { Bad_Opcode },
8348     { Bad_Opcode },
8349     { Bad_Opcode },
8350     /* c0 */
8351     { Bad_Opcode },
8352     { Bad_Opcode },
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     { Bad_Opcode },
8357     { Bad_Opcode },
8358     { Bad_Opcode },
8359     /* c8 */
8360     { Bad_Opcode },
8361     { Bad_Opcode },
8362     { Bad_Opcode },
8363     { Bad_Opcode },
8364     { Bad_Opcode },
8365     { Bad_Opcode },
8366     { Bad_Opcode },
8367     { Bad_Opcode },
8368     /* d0 */
8369     { Bad_Opcode },
8370     { Bad_Opcode },
8371     { Bad_Opcode },
8372     { Bad_Opcode },
8373     { Bad_Opcode },
8374     { Bad_Opcode },
8375     { Bad_Opcode },
8376     { Bad_Opcode },
8377     /* d8 */
8378     { Bad_Opcode },
8379     { Bad_Opcode },
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     { Bad_Opcode },
8384     { Bad_Opcode },
8385     { Bad_Opcode },
8386     /* e0 */
8387     { Bad_Opcode },
8388     { Bad_Opcode },
8389     { Bad_Opcode },
8390     { Bad_Opcode },
8391     { Bad_Opcode },
8392     { Bad_Opcode },
8393     { Bad_Opcode },
8394     { Bad_Opcode },
8395     /* e8 */
8396     { Bad_Opcode },
8397     { Bad_Opcode },
8398     { Bad_Opcode },
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     { Bad_Opcode },
8402     { Bad_Opcode },
8403     { Bad_Opcode },
8404     /* f0 */
8405     { Bad_Opcode },
8406     { Bad_Opcode },
8407     { Bad_Opcode },
8408     { Bad_Opcode },
8409     { Bad_Opcode },
8410     { Bad_Opcode },
8411     { Bad_Opcode },
8412     { Bad_Opcode },
8413     /* f8 */
8414     { Bad_Opcode },
8415     { Bad_Opcode },
8416     { Bad_Opcode },
8417     { Bad_Opcode },
8418     { Bad_Opcode },
8419     { Bad_Opcode },
8420     { Bad_Opcode },
8421     { Bad_Opcode },
8422   },
8423 };
8424
8425 static const struct dis386 vex_table[][256] = {
8426   /* VEX_0F */
8427   {
8428     /* 00 */
8429     { Bad_Opcode },
8430     { Bad_Opcode },
8431     { Bad_Opcode },
8432     { Bad_Opcode },
8433     { Bad_Opcode },
8434     { Bad_Opcode },
8435     { Bad_Opcode },
8436     { Bad_Opcode },
8437     /* 08 */
8438     { Bad_Opcode },
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     { Bad_Opcode },
8442     { Bad_Opcode },
8443     { Bad_Opcode },
8444     { Bad_Opcode },
8445     { Bad_Opcode },
8446     /* 10 */
8447     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8448     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8449     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8450     { MOD_TABLE (MOD_VEX_0F13) },
8451     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
8452     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
8453     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8454     { MOD_TABLE (MOD_VEX_0F17) },
8455     /* 18 */
8456     { Bad_Opcode },
8457     { Bad_Opcode },
8458     { Bad_Opcode },
8459     { Bad_Opcode },
8460     { Bad_Opcode },
8461     { Bad_Opcode },
8462     { Bad_Opcode },
8463     { Bad_Opcode },
8464     /* 20 */
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     { Bad_Opcode },
8470     { Bad_Opcode },
8471     { Bad_Opcode },
8472     { Bad_Opcode },
8473     /* 28 */
8474     { "vmovapX",        { XM, EXx }, 0 },
8475     { "vmovapX",        { EXxS, XM }, 0 },
8476     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8477     { MOD_TABLE (MOD_VEX_0F2B) },
8478     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8479     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8480     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8481     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8482     /* 30 */
8483     { Bad_Opcode },
8484     { Bad_Opcode },
8485     { Bad_Opcode },
8486     { Bad_Opcode },
8487     { Bad_Opcode },
8488     { Bad_Opcode },
8489     { Bad_Opcode },
8490     { Bad_Opcode },
8491     /* 38 */
8492     { Bad_Opcode },
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     { Bad_Opcode },
8496     { Bad_Opcode },
8497     { Bad_Opcode },
8498     { Bad_Opcode },
8499     { Bad_Opcode },
8500     /* 40 */
8501     { Bad_Opcode },
8502     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8503     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8504     { Bad_Opcode },
8505     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8506     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8507     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8508     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8509     /* 48 */
8510     { Bad_Opcode },
8511     { Bad_Opcode },
8512     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8513     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8514     { Bad_Opcode },
8515     { Bad_Opcode },
8516     { Bad_Opcode },
8517     { Bad_Opcode },
8518     /* 50 */
8519     { MOD_TABLE (MOD_VEX_0F50) },
8520     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8521     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8522     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8523     { "vandpX",         { XM, Vex, EXx }, 0 },
8524     { "vandnpX",        { XM, Vex, EXx }, 0 },
8525     { "vorpX",          { XM, Vex, EXx }, 0 },
8526     { "vxorpX",         { XM, Vex, EXx }, 0 },
8527     /* 58 */
8528     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8529     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8530     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8531     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8532     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8533     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8534     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8535     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8536     /* 60 */
8537     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8538     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8539     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8540     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8541     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8542     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8543     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8544     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8545     /* 68 */
8546     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8547     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8548     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8549     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8550     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8551     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8552     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8553     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8554     /* 70 */
8555     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8556     { REG_TABLE (REG_VEX_0F71) },
8557     { REG_TABLE (REG_VEX_0F72) },
8558     { REG_TABLE (REG_VEX_0F73) },
8559     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8560     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8561     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8562     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8563     /* 78 */
8564     { Bad_Opcode },
8565     { Bad_Opcode },
8566     { Bad_Opcode },
8567     { Bad_Opcode },
8568     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8569     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8570     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8571     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8572     /* 80 */
8573     { Bad_Opcode },
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     { Bad_Opcode },
8577     { Bad_Opcode },
8578     { Bad_Opcode },
8579     { Bad_Opcode },
8580     { Bad_Opcode },
8581     /* 88 */
8582     { Bad_Opcode },
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     { Bad_Opcode },
8586     { Bad_Opcode },
8587     { Bad_Opcode },
8588     { Bad_Opcode },
8589     { Bad_Opcode },
8590     /* 90 */
8591     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8592     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8593     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8594     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8595     { Bad_Opcode },
8596     { Bad_Opcode },
8597     { Bad_Opcode },
8598     { Bad_Opcode },
8599     /* 98 */
8600     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8601     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8602     { Bad_Opcode },
8603     { Bad_Opcode },
8604     { Bad_Opcode },
8605     { Bad_Opcode },
8606     { Bad_Opcode },
8607     { Bad_Opcode },
8608     /* a0 */
8609     { Bad_Opcode },
8610     { Bad_Opcode },
8611     { Bad_Opcode },
8612     { Bad_Opcode },
8613     { Bad_Opcode },
8614     { Bad_Opcode },
8615     { Bad_Opcode },
8616     { Bad_Opcode },
8617     /* a8 */
8618     { Bad_Opcode },
8619     { Bad_Opcode },
8620     { Bad_Opcode },
8621     { Bad_Opcode },
8622     { Bad_Opcode },
8623     { Bad_Opcode },
8624     { REG_TABLE (REG_VEX_0FAE) },
8625     { Bad_Opcode },
8626     /* b0 */
8627     { Bad_Opcode },
8628     { Bad_Opcode },
8629     { Bad_Opcode },
8630     { Bad_Opcode },
8631     { Bad_Opcode },
8632     { Bad_Opcode },
8633     { Bad_Opcode },
8634     { Bad_Opcode },
8635     /* b8 */
8636     { Bad_Opcode },
8637     { Bad_Opcode },
8638     { Bad_Opcode },
8639     { Bad_Opcode },
8640     { Bad_Opcode },
8641     { Bad_Opcode },
8642     { Bad_Opcode },
8643     { Bad_Opcode },
8644     /* c0 */
8645     { Bad_Opcode },
8646     { Bad_Opcode },
8647     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8648     { Bad_Opcode },
8649     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8650     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8651     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8652     { Bad_Opcode },
8653     /* c8 */
8654     { Bad_Opcode },
8655     { Bad_Opcode },
8656     { Bad_Opcode },
8657     { Bad_Opcode },
8658     { Bad_Opcode },
8659     { Bad_Opcode },
8660     { Bad_Opcode },
8661     { Bad_Opcode },
8662     /* d0 */
8663     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8664     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8665     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8666     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8667     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8668     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8669     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8670     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8671     /* d8 */
8672     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8673     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8674     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8675     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8676     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8677     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8678     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8679     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8680     /* e0 */
8681     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8682     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8683     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8684     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8685     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8686     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8687     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8688     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8689     /* e8 */
8690     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8691     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8692     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8693     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8694     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8695     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8696     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8697     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8698     /* f0 */
8699     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8700     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8701     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8702     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8703     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8704     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8705     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8706     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8707     /* f8 */
8708     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8709     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8710     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8711     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8712     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8713     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8714     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8715     { Bad_Opcode },
8716   },
8717   /* VEX_0F38 */
8718   {
8719     /* 00 */
8720     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8721     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8722     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8723     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8724     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8725     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8726     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8727     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8728     /* 08 */
8729     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8730     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8731     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8732     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8733     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8734     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8735     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8736     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8737     /* 10 */
8738     { Bad_Opcode },
8739     { Bad_Opcode },
8740     { Bad_Opcode },
8741     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8742     { Bad_Opcode },
8743     { Bad_Opcode },
8744     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8745     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8746     /* 18 */
8747     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8748     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8749     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8750     { Bad_Opcode },
8751     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8752     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8753     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8754     { Bad_Opcode },
8755     /* 20 */
8756     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8757     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8758     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8759     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8760     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8761     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8762     { Bad_Opcode },
8763     { Bad_Opcode },
8764     /* 28 */
8765     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8766     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8767     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8768     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8769     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8770     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8771     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8772     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8773     /* 30 */
8774     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8775     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8776     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8777     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8778     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8779     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8780     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8781     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8782     /* 38 */
8783     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8784     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8785     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8786     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8787     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8788     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8789     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8790     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8791     /* 40 */
8792     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8793     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8794     { Bad_Opcode },
8795     { Bad_Opcode },
8796     { Bad_Opcode },
8797     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8798     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8799     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8800     /* 48 */
8801     { Bad_Opcode },
8802     { Bad_Opcode },
8803     { Bad_Opcode },
8804     { Bad_Opcode },
8805     { Bad_Opcode },
8806     { Bad_Opcode },
8807     { Bad_Opcode },
8808     { Bad_Opcode },
8809     /* 50 */
8810     { Bad_Opcode },
8811     { Bad_Opcode },
8812     { Bad_Opcode },
8813     { Bad_Opcode },
8814     { Bad_Opcode },
8815     { Bad_Opcode },
8816     { Bad_Opcode },
8817     { Bad_Opcode },
8818     /* 58 */
8819     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8820     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8821     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8822     { Bad_Opcode },
8823     { Bad_Opcode },
8824     { Bad_Opcode },
8825     { Bad_Opcode },
8826     { Bad_Opcode },
8827     /* 60 */
8828     { Bad_Opcode },
8829     { Bad_Opcode },
8830     { Bad_Opcode },
8831     { Bad_Opcode },
8832     { Bad_Opcode },
8833     { Bad_Opcode },
8834     { Bad_Opcode },
8835     { Bad_Opcode },
8836     /* 68 */
8837     { Bad_Opcode },
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     { Bad_Opcode },
8841     { Bad_Opcode },
8842     { Bad_Opcode },
8843     { Bad_Opcode },
8844     { Bad_Opcode },
8845     /* 70 */
8846     { Bad_Opcode },
8847     { Bad_Opcode },
8848     { Bad_Opcode },
8849     { Bad_Opcode },
8850     { Bad_Opcode },
8851     { Bad_Opcode },
8852     { Bad_Opcode },
8853     { Bad_Opcode },
8854     /* 78 */
8855     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8856     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8857     { Bad_Opcode },
8858     { Bad_Opcode },
8859     { Bad_Opcode },
8860     { Bad_Opcode },
8861     { Bad_Opcode },
8862     { Bad_Opcode },
8863     /* 80 */
8864     { Bad_Opcode },
8865     { Bad_Opcode },
8866     { Bad_Opcode },
8867     { Bad_Opcode },
8868     { Bad_Opcode },
8869     { Bad_Opcode },
8870     { Bad_Opcode },
8871     { Bad_Opcode },
8872     /* 88 */
8873     { Bad_Opcode },
8874     { Bad_Opcode },
8875     { Bad_Opcode },
8876     { Bad_Opcode },
8877     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8878     { Bad_Opcode },
8879     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8880     { Bad_Opcode },
8881     /* 90 */
8882     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8883     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8884     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8885     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8886     { Bad_Opcode },
8887     { Bad_Opcode },
8888     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8889     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8890     /* 98 */
8891     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8892     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8893     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8894     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8895     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8896     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8897     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8898     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8899     /* a0 */
8900     { Bad_Opcode },
8901     { Bad_Opcode },
8902     { Bad_Opcode },
8903     { Bad_Opcode },
8904     { Bad_Opcode },
8905     { Bad_Opcode },
8906     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8907     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8908     /* a8 */
8909     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8910     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8911     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8912     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8913     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8914     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8915     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8916     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8917     /* b0 */
8918     { Bad_Opcode },
8919     { Bad_Opcode },
8920     { Bad_Opcode },
8921     { Bad_Opcode },
8922     { Bad_Opcode },
8923     { Bad_Opcode },
8924     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8925     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8926     /* b8 */
8927     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8928     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8929     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8930     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8931     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8932     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8933     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8934     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8935     /* c0 */
8936     { Bad_Opcode },
8937     { Bad_Opcode },
8938     { Bad_Opcode },
8939     { Bad_Opcode },
8940     { Bad_Opcode },
8941     { Bad_Opcode },
8942     { Bad_Opcode },
8943     { Bad_Opcode },
8944     /* c8 */
8945     { Bad_Opcode },
8946     { Bad_Opcode },
8947     { Bad_Opcode },
8948     { Bad_Opcode },
8949     { Bad_Opcode },
8950     { Bad_Opcode },
8951     { Bad_Opcode },
8952     { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8953     /* d0 */
8954     { Bad_Opcode },
8955     { Bad_Opcode },
8956     { Bad_Opcode },
8957     { Bad_Opcode },
8958     { Bad_Opcode },
8959     { Bad_Opcode },
8960     { Bad_Opcode },
8961     { Bad_Opcode },
8962     /* d8 */
8963     { Bad_Opcode },
8964     { Bad_Opcode },
8965     { Bad_Opcode },
8966     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8967     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8968     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8969     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8970     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8971     /* e0 */
8972     { Bad_Opcode },
8973     { Bad_Opcode },
8974     { Bad_Opcode },
8975     { Bad_Opcode },
8976     { Bad_Opcode },
8977     { Bad_Opcode },
8978     { Bad_Opcode },
8979     { Bad_Opcode },
8980     /* e8 */
8981     { Bad_Opcode },
8982     { Bad_Opcode },
8983     { Bad_Opcode },
8984     { Bad_Opcode },
8985     { Bad_Opcode },
8986     { Bad_Opcode },
8987     { Bad_Opcode },
8988     { Bad_Opcode },
8989     /* f0 */
8990     { Bad_Opcode },
8991     { Bad_Opcode },
8992     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
8993     { REG_TABLE (REG_VEX_0F38F3) },
8994     { Bad_Opcode },
8995     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
8996     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
8997     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
8998     /* f8 */
8999     { Bad_Opcode },
9000     { Bad_Opcode },
9001     { Bad_Opcode },
9002     { Bad_Opcode },
9003     { Bad_Opcode },
9004     { Bad_Opcode },
9005     { Bad_Opcode },
9006     { Bad_Opcode },
9007   },
9008   /* VEX_0F3A */
9009   {
9010     /* 00 */
9011     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9012     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9013     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9014     { Bad_Opcode },
9015     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9016     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9017     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9018     { Bad_Opcode },
9019     /* 08 */
9020     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9021     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9022     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9023     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9024     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9025     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9026     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9027     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9028     /* 10 */
9029     { Bad_Opcode },
9030     { Bad_Opcode },
9031     { Bad_Opcode },
9032     { Bad_Opcode },
9033     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9034     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9035     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9036     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9037     /* 18 */
9038     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9039     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9040     { Bad_Opcode },
9041     { Bad_Opcode },
9042     { Bad_Opcode },
9043     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9044     { Bad_Opcode },
9045     { Bad_Opcode },
9046     /* 20 */
9047     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9048     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9049     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9050     { Bad_Opcode },
9051     { Bad_Opcode },
9052     { Bad_Opcode },
9053     { Bad_Opcode },
9054     { Bad_Opcode },
9055     /* 28 */
9056     { Bad_Opcode },
9057     { Bad_Opcode },
9058     { Bad_Opcode },
9059     { Bad_Opcode },
9060     { Bad_Opcode },
9061     { Bad_Opcode },
9062     { Bad_Opcode },
9063     { Bad_Opcode },
9064     /* 30 */
9065     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9066     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9067     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9068     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9069     { Bad_Opcode },
9070     { Bad_Opcode },
9071     { Bad_Opcode },
9072     { Bad_Opcode },
9073     /* 38 */
9074     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9075     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9076     { Bad_Opcode },
9077     { Bad_Opcode },
9078     { Bad_Opcode },
9079     { Bad_Opcode },
9080     { Bad_Opcode },
9081     { Bad_Opcode },
9082     /* 40 */
9083     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9084     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9085     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9086     { Bad_Opcode },
9087     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9088     { Bad_Opcode },
9089     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9090     { Bad_Opcode },
9091     /* 48 */
9092     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9093     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9094     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9095     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9096     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9097     { Bad_Opcode },
9098     { Bad_Opcode },
9099     { Bad_Opcode },
9100     /* 50 */
9101     { Bad_Opcode },
9102     { Bad_Opcode },
9103     { Bad_Opcode },
9104     { Bad_Opcode },
9105     { Bad_Opcode },
9106     { Bad_Opcode },
9107     { Bad_Opcode },
9108     { Bad_Opcode },
9109     /* 58 */
9110     { Bad_Opcode },
9111     { Bad_Opcode },
9112     { Bad_Opcode },
9113     { Bad_Opcode },
9114     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9115     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9116     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9117     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9118     /* 60 */
9119     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9120     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9121     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9122     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9123     { Bad_Opcode },
9124     { Bad_Opcode },
9125     { Bad_Opcode },
9126     { Bad_Opcode },
9127     /* 68 */
9128     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9129     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9130     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9131     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9132     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9133     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9134     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9135     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9136     /* 70 */
9137     { Bad_Opcode },
9138     { Bad_Opcode },
9139     { Bad_Opcode },
9140     { Bad_Opcode },
9141     { Bad_Opcode },
9142     { Bad_Opcode },
9143     { Bad_Opcode },
9144     { Bad_Opcode },
9145     /* 78 */
9146     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9147     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9148     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9149     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9150     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9151     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9152     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9153     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9154     /* 80 */
9155     { Bad_Opcode },
9156     { Bad_Opcode },
9157     { Bad_Opcode },
9158     { Bad_Opcode },
9159     { Bad_Opcode },
9160     { Bad_Opcode },
9161     { Bad_Opcode },
9162     { Bad_Opcode },
9163     /* 88 */
9164     { Bad_Opcode },
9165     { Bad_Opcode },
9166     { Bad_Opcode },
9167     { Bad_Opcode },
9168     { Bad_Opcode },
9169     { Bad_Opcode },
9170     { Bad_Opcode },
9171     { Bad_Opcode },
9172     /* 90 */
9173     { Bad_Opcode },
9174     { Bad_Opcode },
9175     { Bad_Opcode },
9176     { Bad_Opcode },
9177     { Bad_Opcode },
9178     { Bad_Opcode },
9179     { Bad_Opcode },
9180     { Bad_Opcode },
9181     /* 98 */
9182     { Bad_Opcode },
9183     { Bad_Opcode },
9184     { Bad_Opcode },
9185     { Bad_Opcode },
9186     { Bad_Opcode },
9187     { Bad_Opcode },
9188     { Bad_Opcode },
9189     { Bad_Opcode },
9190     /* a0 */
9191     { Bad_Opcode },
9192     { Bad_Opcode },
9193     { Bad_Opcode },
9194     { Bad_Opcode },
9195     { Bad_Opcode },
9196     { Bad_Opcode },
9197     { Bad_Opcode },
9198     { Bad_Opcode },
9199     /* a8 */
9200     { Bad_Opcode },
9201     { Bad_Opcode },
9202     { Bad_Opcode },
9203     { Bad_Opcode },
9204     { Bad_Opcode },
9205     { Bad_Opcode },
9206     { Bad_Opcode },
9207     { Bad_Opcode },
9208     /* b0 */
9209     { Bad_Opcode },
9210     { Bad_Opcode },
9211     { Bad_Opcode },
9212     { Bad_Opcode },
9213     { Bad_Opcode },
9214     { Bad_Opcode },
9215     { Bad_Opcode },
9216     { Bad_Opcode },
9217     /* b8 */
9218     { Bad_Opcode },
9219     { Bad_Opcode },
9220     { Bad_Opcode },
9221     { Bad_Opcode },
9222     { Bad_Opcode },
9223     { Bad_Opcode },
9224     { Bad_Opcode },
9225     { Bad_Opcode },
9226     /* c0 */
9227     { Bad_Opcode },
9228     { Bad_Opcode },
9229     { Bad_Opcode },
9230     { Bad_Opcode },
9231     { Bad_Opcode },
9232     { Bad_Opcode },
9233     { Bad_Opcode },
9234     { Bad_Opcode },
9235     /* c8 */
9236     { Bad_Opcode },
9237     { Bad_Opcode },
9238     { Bad_Opcode },
9239     { Bad_Opcode },
9240     { Bad_Opcode },
9241     { Bad_Opcode },
9242     { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9243     { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9244     /* d0 */
9245     { Bad_Opcode },
9246     { Bad_Opcode },
9247     { Bad_Opcode },
9248     { Bad_Opcode },
9249     { Bad_Opcode },
9250     { Bad_Opcode },
9251     { Bad_Opcode },
9252     { Bad_Opcode },
9253     /* d8 */
9254     { Bad_Opcode },
9255     { Bad_Opcode },
9256     { Bad_Opcode },
9257     { Bad_Opcode },
9258     { Bad_Opcode },
9259     { Bad_Opcode },
9260     { Bad_Opcode },
9261     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9262     /* e0 */
9263     { Bad_Opcode },
9264     { Bad_Opcode },
9265     { Bad_Opcode },
9266     { Bad_Opcode },
9267     { Bad_Opcode },
9268     { Bad_Opcode },
9269     { Bad_Opcode },
9270     { Bad_Opcode },
9271     /* e8 */
9272     { Bad_Opcode },
9273     { Bad_Opcode },
9274     { Bad_Opcode },
9275     { Bad_Opcode },
9276     { Bad_Opcode },
9277     { Bad_Opcode },
9278     { Bad_Opcode },
9279     { Bad_Opcode },
9280     /* f0 */
9281     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9282     { Bad_Opcode },
9283     { Bad_Opcode },
9284     { Bad_Opcode },
9285     { Bad_Opcode },
9286     { Bad_Opcode },
9287     { Bad_Opcode },
9288     { Bad_Opcode },
9289     /* f8 */
9290     { Bad_Opcode },
9291     { Bad_Opcode },
9292     { Bad_Opcode },
9293     { Bad_Opcode },
9294     { Bad_Opcode },
9295     { Bad_Opcode },
9296     { Bad_Opcode },
9297     { Bad_Opcode },
9298   },
9299 };
9300
9301 #include "i386-dis-evex.h"
9302
9303 static const struct dis386 vex_len_table[][2] = {
9304   /* VEX_LEN_0F12_P_0_M_0 */
9305   {
9306     { "vmovlps",        { XM, Vex128, EXq }, 0 },
9307   },
9308
9309   /* VEX_LEN_0F12_P_0_M_1 */
9310   {
9311     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
9312   },
9313
9314   /* VEX_LEN_0F12_P_2 */
9315   {
9316     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
9317   },
9318
9319   /* VEX_LEN_0F13_M_0 */
9320   {
9321     { "vmovlpX",        { EXq, XM }, 0 },
9322   },
9323
9324   /* VEX_LEN_0F16_P_0_M_0 */
9325   {
9326     { "vmovhps",        { XM, Vex128, EXq }, 0 },
9327   },
9328
9329   /* VEX_LEN_0F16_P_0_M_1 */
9330   {
9331     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
9332   },
9333
9334   /* VEX_LEN_0F16_P_2 */
9335   {
9336     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
9337   },
9338
9339   /* VEX_LEN_0F17_M_0 */
9340   {
9341     { "vmovhpX",        { EXq, XM }, 0 },
9342   },
9343
9344   /* VEX_LEN_0F2A_P_1 */
9345   {
9346     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Edq }, 0 },
9347     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Edq }, 0 },
9348   },
9349
9350   /* VEX_LEN_0F2A_P_3 */
9351   {
9352     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Edq }, 0 },
9353     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Edq }, 0 },
9354   },
9355
9356   /* VEX_LEN_0F2C_P_1 */
9357   {
9358     { "vcvttss2si",     { Gdq, EXdScalar }, 0 },
9359     { "vcvttss2si",     { Gdq, EXdScalar }, 0 },
9360   },
9361
9362   /* VEX_LEN_0F2C_P_3 */
9363   {
9364     { "vcvttsd2si",     { Gdq, EXqScalar }, 0 },
9365     { "vcvttsd2si",     { Gdq, EXqScalar }, 0 },
9366   },
9367
9368   /* VEX_LEN_0F2D_P_1 */
9369   {
9370     { "vcvtss2si",      { Gdq, EXdScalar }, 0 },
9371     { "vcvtss2si",      { Gdq, EXdScalar }, 0 },
9372   },
9373
9374   /* VEX_LEN_0F2D_P_3 */
9375   {
9376     { "vcvtsd2si",      { Gdq, EXqScalar }, 0 },
9377     { "vcvtsd2si",      { Gdq, EXqScalar }, 0 },
9378   },
9379
9380   /* VEX_LEN_0F41_P_0 */
9381   {
9382     { Bad_Opcode },
9383     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9384   },
9385   /* VEX_LEN_0F41_P_2 */
9386   {
9387     { Bad_Opcode },
9388     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9389   },
9390   /* VEX_LEN_0F42_P_0 */
9391   {
9392     { Bad_Opcode },
9393     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9394   },
9395   /* VEX_LEN_0F42_P_2 */
9396   {
9397     { Bad_Opcode },
9398     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9399   },
9400   /* VEX_LEN_0F44_P_0 */
9401   {
9402     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9403   },
9404   /* VEX_LEN_0F44_P_2 */
9405   {
9406     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9407   },
9408   /* VEX_LEN_0F45_P_0 */
9409   {
9410     { Bad_Opcode },
9411     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9412   },
9413   /* VEX_LEN_0F45_P_2 */
9414   {
9415     { Bad_Opcode },
9416     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9417   },
9418   /* VEX_LEN_0F46_P_0 */
9419   {
9420     { Bad_Opcode },
9421     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9422   },
9423   /* VEX_LEN_0F46_P_2 */
9424   {
9425     { Bad_Opcode },
9426     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9427   },
9428   /* VEX_LEN_0F47_P_0 */
9429   {
9430     { Bad_Opcode },
9431     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9432   },
9433   /* VEX_LEN_0F47_P_2 */
9434   {
9435     { Bad_Opcode },
9436     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9437   },
9438   /* VEX_LEN_0F4A_P_0 */
9439   {
9440     { Bad_Opcode },
9441     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9442   },
9443   /* VEX_LEN_0F4A_P_2 */
9444   {
9445     { Bad_Opcode },
9446     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9447   },
9448   /* VEX_LEN_0F4B_P_0 */
9449   {
9450     { Bad_Opcode },
9451     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9452   },
9453   /* VEX_LEN_0F4B_P_2 */
9454   {
9455     { Bad_Opcode },
9456     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9457   },
9458
9459   /* VEX_LEN_0F6E_P_2 */
9460   {
9461     { "vmovK",          { XMScalar, Edq }, 0 },
9462   },
9463
9464   /* VEX_LEN_0F77_P_1 */
9465   {
9466     { "vzeroupper",     { XX }, 0 },
9467     { "vzeroall",       { XX }, 0 },
9468   },
9469
9470   /* VEX_LEN_0F7E_P_1 */
9471   {
9472     { "vmovq",          { XMScalar, EXqScalar }, 0 },
9473   },
9474
9475   /* VEX_LEN_0F7E_P_2 */
9476   {
9477     { "vmovK",          { Edq, XMScalar }, 0 },
9478   },
9479
9480   /* VEX_LEN_0F90_P_0 */
9481   {
9482     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9483   },
9484
9485   /* VEX_LEN_0F90_P_2 */
9486   {
9487     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9488   },
9489
9490   /* VEX_LEN_0F91_P_0 */
9491   {
9492     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9493   },
9494
9495   /* VEX_LEN_0F91_P_2 */
9496   {
9497     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9498   },
9499
9500   /* VEX_LEN_0F92_P_0 */
9501   {
9502     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9503   },
9504
9505   /* VEX_LEN_0F92_P_2 */
9506   {
9507     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9508   },
9509
9510   /* VEX_LEN_0F92_P_3 */
9511   {
9512     { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
9513   },
9514
9515   /* VEX_LEN_0F93_P_0 */
9516   {
9517     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9518   },
9519
9520   /* VEX_LEN_0F93_P_2 */
9521   {
9522     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9523   },
9524
9525   /* VEX_LEN_0F93_P_3 */
9526   {
9527     { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
9528   },
9529
9530   /* VEX_LEN_0F98_P_0 */
9531   {
9532     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9533   },
9534
9535   /* VEX_LEN_0F98_P_2 */
9536   {
9537     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9538   },
9539
9540   /* VEX_LEN_0F99_P_0 */
9541   {
9542     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9543   },
9544
9545   /* VEX_LEN_0F99_P_2 */
9546   {
9547     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9548   },
9549
9550   /* VEX_LEN_0FAE_R_2_M_0 */
9551   {
9552     { "vldmxcsr",       { Md }, 0 },
9553   },
9554
9555   /* VEX_LEN_0FAE_R_3_M_0 */
9556   {
9557     { "vstmxcsr",       { Md }, 0 },
9558   },
9559
9560   /* VEX_LEN_0FC4_P_2 */
9561   {
9562     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
9563   },
9564
9565   /* VEX_LEN_0FC5_P_2 */
9566   {
9567     { "vpextrw",        { Gdq, XS, Ib }, 0 },
9568   },
9569
9570   /* VEX_LEN_0FD6_P_2 */
9571   {
9572     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
9573   },
9574
9575   /* VEX_LEN_0FF7_P_2 */
9576   {
9577     { "vmaskmovdqu",    { XM, XS }, 0 },
9578   },
9579
9580   /* VEX_LEN_0F3816_P_2 */
9581   {
9582     { Bad_Opcode },
9583     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9584   },
9585
9586   /* VEX_LEN_0F3819_P_2 */
9587   {
9588     { Bad_Opcode },
9589     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9590   },
9591
9592   /* VEX_LEN_0F381A_P_2_M_0 */
9593   {
9594     { Bad_Opcode },
9595     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9596   },
9597
9598   /* VEX_LEN_0F3836_P_2 */
9599   {
9600     { Bad_Opcode },
9601     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9602   },
9603
9604   /* VEX_LEN_0F3841_P_2 */
9605   {
9606     { "vphminposuw",    { XM, EXx }, 0 },
9607   },
9608
9609   /* VEX_LEN_0F385A_P_2_M_0 */
9610   {
9611     { Bad_Opcode },
9612     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9613   },
9614
9615   /* VEX_LEN_0F38DB_P_2 */
9616   {
9617     { "vaesimc",        { XM, EXx }, 0 },
9618   },
9619
9620   /* VEX_LEN_0F38F2_P_0 */
9621   {
9622     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
9623   },
9624
9625   /* VEX_LEN_0F38F3_R_1_P_0 */
9626   {
9627     { "blsrS",          { VexGdq, Edq }, 0 },
9628   },
9629
9630   /* VEX_LEN_0F38F3_R_2_P_0 */
9631   {
9632     { "blsmskS",        { VexGdq, Edq }, 0 },
9633   },
9634
9635   /* VEX_LEN_0F38F3_R_3_P_0 */
9636   {
9637     { "blsiS",          { VexGdq, Edq }, 0 },
9638   },
9639
9640   /* VEX_LEN_0F38F5_P_0 */
9641   {
9642     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
9643   },
9644
9645   /* VEX_LEN_0F38F5_P_1 */
9646   {
9647     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
9648   },
9649
9650   /* VEX_LEN_0F38F5_P_3 */
9651   {
9652     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
9653   },
9654
9655   /* VEX_LEN_0F38F6_P_3 */
9656   {
9657     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
9658   },
9659
9660   /* VEX_LEN_0F38F7_P_0 */
9661   {
9662     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
9663   },
9664
9665   /* VEX_LEN_0F38F7_P_1 */
9666   {
9667     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
9668   },
9669
9670   /* VEX_LEN_0F38F7_P_2 */
9671   {
9672     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
9673   },
9674
9675   /* VEX_LEN_0F38F7_P_3 */
9676   {
9677     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
9678   },
9679
9680   /* VEX_LEN_0F3A00_P_2 */
9681   {
9682     { Bad_Opcode },
9683     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9684   },
9685
9686   /* VEX_LEN_0F3A01_P_2 */
9687   {
9688     { Bad_Opcode },
9689     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9690   },
9691
9692   /* VEX_LEN_0F3A06_P_2 */
9693   {
9694     { Bad_Opcode },
9695     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9696   },
9697
9698   /* VEX_LEN_0F3A14_P_2 */
9699   {
9700     { "vpextrb",        { Edqb, XM, Ib }, 0 },
9701   },
9702
9703   /* VEX_LEN_0F3A15_P_2 */
9704   {
9705     { "vpextrw",        { Edqw, XM, Ib }, 0 },
9706   },
9707
9708   /* VEX_LEN_0F3A16_P_2  */
9709   {
9710     { "vpextrK",        { Edq, XM, Ib }, 0 },
9711   },
9712
9713   /* VEX_LEN_0F3A17_P_2 */
9714   {
9715     { "vextractps",     { Edqd, XM, Ib }, 0 },
9716   },
9717
9718   /* VEX_LEN_0F3A18_P_2 */
9719   {
9720     { Bad_Opcode },
9721     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9722   },
9723
9724   /* VEX_LEN_0F3A19_P_2 */
9725   {
9726     { Bad_Opcode },
9727     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9728   },
9729
9730   /* VEX_LEN_0F3A20_P_2 */
9731   {
9732     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
9733   },
9734
9735   /* VEX_LEN_0F3A21_P_2 */
9736   {
9737     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
9738   },
9739
9740   /* VEX_LEN_0F3A22_P_2 */
9741   {
9742     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
9743   },
9744
9745   /* VEX_LEN_0F3A30_P_2 */
9746   {
9747     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9748   },
9749
9750   /* VEX_LEN_0F3A31_P_2 */
9751   {
9752     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9753   },
9754
9755   /* VEX_LEN_0F3A32_P_2 */
9756   {
9757     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9758   },
9759
9760   /* VEX_LEN_0F3A33_P_2 */
9761   {
9762     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9763   },
9764
9765   /* VEX_LEN_0F3A38_P_2 */
9766   {
9767     { Bad_Opcode },
9768     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9769   },
9770
9771   /* VEX_LEN_0F3A39_P_2 */
9772   {
9773     { Bad_Opcode },
9774     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9775   },
9776
9777   /* VEX_LEN_0F3A41_P_2 */
9778   {
9779     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
9780   },
9781
9782   /* VEX_LEN_0F3A46_P_2 */
9783   {
9784     { Bad_Opcode },
9785     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9786   },
9787
9788   /* VEX_LEN_0F3A60_P_2 */
9789   {
9790     { "vpcmpestrm",     { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9791   },
9792
9793   /* VEX_LEN_0F3A61_P_2 */
9794   {
9795     { "vpcmpestri",     { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9796   },
9797
9798   /* VEX_LEN_0F3A62_P_2 */
9799   {
9800     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
9801   },
9802
9803   /* VEX_LEN_0F3A63_P_2 */
9804   {
9805     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
9806   },
9807
9808   /* VEX_LEN_0F3A6A_P_2 */
9809   {
9810     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9811   },
9812
9813   /* VEX_LEN_0F3A6B_P_2 */
9814   {
9815     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9816   },
9817
9818   /* VEX_LEN_0F3A6E_P_2 */
9819   {
9820     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9821   },
9822
9823   /* VEX_LEN_0F3A6F_P_2 */
9824   {
9825     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9826   },
9827
9828   /* VEX_LEN_0F3A7A_P_2 */
9829   {
9830     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9831   },
9832
9833   /* VEX_LEN_0F3A7B_P_2 */
9834   {
9835     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9836   },
9837
9838   /* VEX_LEN_0F3A7E_P_2 */
9839   {
9840     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9841   },
9842
9843   /* VEX_LEN_0F3A7F_P_2 */
9844   {
9845     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9846   },
9847
9848   /* VEX_LEN_0F3ADF_P_2 */
9849   {
9850     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9851   },
9852
9853   /* VEX_LEN_0F3AF0_P_3 */
9854   {
9855     { "rorxS",          { Gdq, Edq, Ib }, 0 },
9856   },
9857
9858   /* VEX_LEN_0FXOP_08_CC */
9859   {
9860      { "vpcomb",        { XM, Vex128, EXx, VPCOM }, 0 },
9861   },
9862
9863   /* VEX_LEN_0FXOP_08_CD */
9864   {
9865      { "vpcomw",        { XM, Vex128, EXx, VPCOM }, 0 },
9866   },
9867
9868   /* VEX_LEN_0FXOP_08_CE */
9869   {
9870      { "vpcomd",        { XM, Vex128, EXx, VPCOM }, 0 },
9871   },
9872
9873   /* VEX_LEN_0FXOP_08_CF */
9874   {
9875      { "vpcomq",        { XM, Vex128, EXx, VPCOM }, 0 },
9876   },
9877
9878   /* VEX_LEN_0FXOP_08_EC */
9879   {
9880      { "vpcomub",       { XM, Vex128, EXx, VPCOM }, 0 },
9881   },
9882
9883   /* VEX_LEN_0FXOP_08_ED */
9884   {
9885      { "vpcomuw",       { XM, Vex128, EXx, VPCOM }, 0 },
9886   },
9887
9888   /* VEX_LEN_0FXOP_08_EE */
9889   {
9890      { "vpcomud",       { XM, Vex128, EXx, VPCOM }, 0 },
9891   },
9892
9893   /* VEX_LEN_0FXOP_08_EF */
9894   {
9895      { "vpcomuq",       { XM, Vex128, EXx, VPCOM }, 0 },
9896   },
9897
9898   /* VEX_LEN_0FXOP_09_80 */
9899   {
9900     { "vfrczps",        { XM, EXxmm }, 0 },
9901     { "vfrczps",        { XM, EXymmq }, 0 },
9902   },
9903
9904   /* VEX_LEN_0FXOP_09_81 */
9905   {
9906     { "vfrczpd",        { XM, EXxmm }, 0 },
9907     { "vfrczpd",        { XM, EXymmq }, 0 },
9908   },
9909 };
9910
9911 #include "i386-dis-evex-len.h"
9912
9913 static const struct dis386 vex_w_table[][2] = {
9914   {
9915     /* VEX_W_0F41_P_0_LEN_1 */
9916     { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9917     { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9918   },
9919   {
9920     /* VEX_W_0F41_P_2_LEN_1 */
9921     { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9922     { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9923   },
9924   {
9925     /* VEX_W_0F42_P_0_LEN_1 */
9926     { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9927     { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9928   },
9929   {
9930     /* VEX_W_0F42_P_2_LEN_1 */
9931     { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9932     { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9933   },
9934   {
9935     /* VEX_W_0F44_P_0_LEN_0 */
9936     { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9937     { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9938   },
9939   {
9940     /* VEX_W_0F44_P_2_LEN_0 */
9941     { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9942     { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9943   },
9944   {
9945     /* VEX_W_0F45_P_0_LEN_1 */
9946     { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9947     { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9948   },
9949   {
9950     /* VEX_W_0F45_P_2_LEN_1 */
9951     { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9952     { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9953   },
9954   {
9955     /* VEX_W_0F46_P_0_LEN_1 */
9956     { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9957     { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9958   },
9959   {
9960     /* VEX_W_0F46_P_2_LEN_1 */
9961     { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9962     { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9963   },
9964   {
9965     /* VEX_W_0F47_P_0_LEN_1 */
9966     { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9967     { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9968   },
9969   {
9970     /* VEX_W_0F47_P_2_LEN_1 */
9971     { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9972     { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9973   },
9974   {
9975     /* VEX_W_0F4A_P_0_LEN_1 */
9976     { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9977     { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9978   },
9979   {
9980     /* VEX_W_0F4A_P_2_LEN_1 */
9981     { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9982     { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9983   },
9984   {
9985     /* VEX_W_0F4B_P_0_LEN_1 */
9986     { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
9987     { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
9988   },
9989   {
9990     /* VEX_W_0F4B_P_2_LEN_1 */
9991     { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
9992   },
9993   {
9994     /* VEX_W_0F90_P_0_LEN_0 */
9995     { "kmovw",          { MaskG, MaskE }, 0 },
9996     { "kmovq",          { MaskG, MaskE }, 0 },
9997   },
9998   {
9999     /* VEX_W_0F90_P_2_LEN_0 */
10000     { "kmovb",          { MaskG, MaskBDE }, 0 },
10001     { "kmovd",          { MaskG, MaskBDE }, 0 },
10002   },
10003   {
10004     /* VEX_W_0F91_P_0_LEN_0 */
10005     { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
10006     { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
10007   },
10008   {
10009     /* VEX_W_0F91_P_2_LEN_0 */
10010     { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
10011     { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
10012   },
10013   {
10014     /* VEX_W_0F92_P_0_LEN_0 */
10015     { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
10016   },
10017   {
10018     /* VEX_W_0F92_P_2_LEN_0 */
10019     { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
10020   },
10021   {
10022     /* VEX_W_0F93_P_0_LEN_0 */
10023     { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
10024   },
10025   {
10026     /* VEX_W_0F93_P_2_LEN_0 */
10027     { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
10028   },
10029   {
10030     /* VEX_W_0F98_P_0_LEN_0 */
10031     { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10032     { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10033   },
10034   {
10035     /* VEX_W_0F98_P_2_LEN_0 */
10036     { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10037     { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10038   },
10039   {
10040     /* VEX_W_0F99_P_0_LEN_0 */
10041     { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10042     { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10043   },
10044   {
10045     /* VEX_W_0F99_P_2_LEN_0 */
10046     { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10047     { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10048   },
10049   {
10050     /* VEX_W_0F380C_P_2  */
10051     { "vpermilps",      { XM, Vex, EXx }, 0 },
10052   },
10053   {
10054     /* VEX_W_0F380D_P_2  */
10055     { "vpermilpd",      { XM, Vex, EXx }, 0 },
10056   },
10057   {
10058     /* VEX_W_0F380E_P_2  */
10059     { "vtestps",        { XM, EXx }, 0 },
10060   },
10061   {
10062     /* VEX_W_0F380F_P_2  */
10063     { "vtestpd",        { XM, EXx }, 0 },
10064   },
10065   {
10066     /* VEX_W_0F3816_P_2  */
10067     { "vpermps",        { XM, Vex, EXx }, 0 },
10068   },
10069   {
10070     /* VEX_W_0F3818_P_2 */
10071     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
10072   },
10073   {
10074     /* VEX_W_0F3819_P_2 */
10075     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
10076   },
10077   {
10078     /* VEX_W_0F381A_P_2_M_0 */
10079     { "vbroadcastf128", { XM, Mxmm }, 0 },
10080   },
10081   {
10082     /* VEX_W_0F382C_P_2_M_0 */
10083     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
10084   },
10085   {
10086     /* VEX_W_0F382D_P_2_M_0 */
10087     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
10088   },
10089   {
10090     /* VEX_W_0F382E_P_2_M_0 */
10091     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
10092   },
10093   {
10094     /* VEX_W_0F382F_P_2_M_0 */
10095     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
10096   },
10097   {
10098     /* VEX_W_0F3836_P_2  */
10099     { "vpermd",         { XM, Vex, EXx }, 0 },
10100   },
10101   {
10102     /* VEX_W_0F3846_P_2 */
10103     { "vpsravd",        { XM, Vex, EXx }, 0 },
10104   },
10105   {
10106     /* VEX_W_0F3858_P_2 */
10107     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10108   },
10109   {
10110     /* VEX_W_0F3859_P_2 */
10111     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
10112   },
10113   {
10114     /* VEX_W_0F385A_P_2_M_0 */
10115     { "vbroadcasti128", { XM, Mxmm }, 0 },
10116   },
10117   {
10118     /* VEX_W_0F3878_P_2 */
10119     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
10120   },
10121   {
10122     /* VEX_W_0F3879_P_2 */
10123     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
10124   },
10125   {
10126     /* VEX_W_0F38CF_P_2 */
10127     { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10128   },
10129   {
10130     /* VEX_W_0F3A00_P_2 */
10131     { Bad_Opcode },
10132     { "vpermq",         { XM, EXx, Ib }, 0 },
10133   },
10134   {
10135     /* VEX_W_0F3A01_P_2 */
10136     { Bad_Opcode },
10137     { "vpermpd",        { XM, EXx, Ib }, 0 },
10138   },
10139   {
10140     /* VEX_W_0F3A02_P_2 */
10141     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
10142   },
10143   {
10144     /* VEX_W_0F3A04_P_2 */
10145     { "vpermilps",      { XM, EXx, Ib }, 0 },
10146   },
10147   {
10148     /* VEX_W_0F3A05_P_2 */
10149     { "vpermilpd",      { XM, EXx, Ib }, 0 },
10150   },
10151   {
10152     /* VEX_W_0F3A06_P_2 */
10153     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
10154   },
10155   {
10156     /* VEX_W_0F3A18_P_2 */
10157     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
10158   },
10159   {
10160     /* VEX_W_0F3A19_P_2 */
10161     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
10162   },
10163   {
10164     /* VEX_W_0F3A30_P_2_LEN_0 */
10165     { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10166     { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10167   },
10168   {
10169     /* VEX_W_0F3A31_P_2_LEN_0 */
10170     { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10171     { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10172   },
10173   {
10174     /* VEX_W_0F3A32_P_2_LEN_0 */
10175     { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10176     { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10177   },
10178   {
10179     /* VEX_W_0F3A33_P_2_LEN_0 */
10180     { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10181     { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10182   },
10183   {
10184     /* VEX_W_0F3A38_P_2 */
10185     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
10186   },
10187   {
10188     /* VEX_W_0F3A39_P_2 */
10189     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
10190   },
10191   {
10192     /* VEX_W_0F3A46_P_2 */
10193     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
10194   },
10195   {
10196     /* VEX_W_0F3A48_P_2 */
10197     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10198     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10199   },
10200   {
10201     /* VEX_W_0F3A49_P_2 */
10202     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10203     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10204   },
10205   {
10206     /* VEX_W_0F3A4A_P_2 */
10207     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
10208   },
10209   {
10210     /* VEX_W_0F3A4B_P_2 */
10211     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
10212   },
10213   {
10214     /* VEX_W_0F3A4C_P_2 */
10215     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
10216   },
10217   {
10218     /* VEX_W_0F3ACE_P_2 */
10219     { Bad_Opcode },
10220     { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10221   },
10222   {
10223     /* VEX_W_0F3ACF_P_2 */
10224     { Bad_Opcode },
10225     { "vgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, 0 },
10226   },
10227
10228 #include "i386-dis-evex-w.h"
10229 };
10230
10231 static const struct dis386 mod_table[][2] = {
10232   {
10233     /* MOD_8D */
10234     { "leaS",           { Gv, M }, 0 },
10235   },
10236   {
10237     /* MOD_C6_REG_7 */
10238     { Bad_Opcode },
10239     { RM_TABLE (RM_C6_REG_7) },
10240   },
10241   {
10242     /* MOD_C7_REG_7 */
10243     { Bad_Opcode },
10244     { RM_TABLE (RM_C7_REG_7) },
10245   },
10246   {
10247     /* MOD_FF_REG_3 */
10248     { "Jcall^", { indirEp }, 0 },
10249   },
10250   {
10251     /* MOD_FF_REG_5 */
10252     { "Jjmp^", { indirEp }, 0 },
10253   },
10254   {
10255     /* MOD_0F01_REG_0 */
10256     { X86_64_TABLE (X86_64_0F01_REG_0) },
10257     { RM_TABLE (RM_0F01_REG_0) },
10258   },
10259   {
10260     /* MOD_0F01_REG_1 */
10261     { X86_64_TABLE (X86_64_0F01_REG_1) },
10262     { RM_TABLE (RM_0F01_REG_1) },
10263   },
10264   {
10265     /* MOD_0F01_REG_2 */
10266     { X86_64_TABLE (X86_64_0F01_REG_2) },
10267     { RM_TABLE (RM_0F01_REG_2) },
10268   },
10269   {
10270     /* MOD_0F01_REG_3 */
10271     { X86_64_TABLE (X86_64_0F01_REG_3) },
10272     { RM_TABLE (RM_0F01_REG_3) },
10273   },
10274   {
10275     /* MOD_0F01_REG_5 */
10276     { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10277     { RM_TABLE (RM_0F01_REG_5) },
10278   },
10279   {
10280     /* MOD_0F01_REG_7 */
10281     { "invlpg",         { Mb }, 0 },
10282     { RM_TABLE (RM_0F01_REG_7) },
10283   },
10284   {
10285     /* MOD_0F12_PREFIX_0 */
10286     { "movlps",         { XM, EXq }, PREFIX_OPCODE },
10287     { "movhlps",        { XM, EXq }, PREFIX_OPCODE },
10288   },
10289   {
10290     /* MOD_0F13 */
10291     { "movlpX",         { EXq, XM }, PREFIX_OPCODE },
10292   },
10293   {
10294     /* MOD_0F16_PREFIX_0 */
10295     { "movhps",         { XM, EXq }, 0 },
10296     { "movlhps",        { XM, EXq }, 0 },
10297   },
10298   {
10299     /* MOD_0F17 */
10300     { "movhpX",         { EXq, XM }, PREFIX_OPCODE },
10301   },
10302   {
10303     /* MOD_0F18_REG_0 */
10304     { "prefetchnta",    { Mb }, 0 },
10305   },
10306   {
10307     /* MOD_0F18_REG_1 */
10308     { "prefetcht0",     { Mb }, 0 },
10309   },
10310   {
10311     /* MOD_0F18_REG_2 */
10312     { "prefetcht1",     { Mb }, 0 },
10313   },
10314   {
10315     /* MOD_0F18_REG_3 */
10316     { "prefetcht2",     { Mb }, 0 },
10317   },
10318   {
10319     /* MOD_0F18_REG_4 */
10320     { "nop/reserved",   { Mb }, 0 },
10321   },
10322   {
10323     /* MOD_0F18_REG_5 */
10324     { "nop/reserved",   { Mb }, 0 },
10325   },
10326   {
10327     /* MOD_0F18_REG_6 */
10328     { "nop/reserved",   { Mb }, 0 },
10329   },
10330   {
10331     /* MOD_0F18_REG_7 */
10332     { "nop/reserved",   { Mb }, 0 },
10333   },
10334   {
10335     /* MOD_0F1A_PREFIX_0 */
10336     { "bndldx",         { Gbnd, Mv_bnd }, 0 },
10337     { "nopQ",           { Ev }, 0 },
10338   },
10339   {
10340     /* MOD_0F1B_PREFIX_0 */
10341     { "bndstx",         { Mv_bnd, Gbnd }, 0 },
10342     { "nopQ",           { Ev }, 0 },
10343   },
10344   {
10345     /* MOD_0F1B_PREFIX_1 */
10346     { "bndmk",          { Gbnd, Mv_bnd }, 0 },
10347     { "nopQ",           { Ev }, 0 },
10348   },
10349   {
10350     /* MOD_0F1C_PREFIX_0 */
10351     { REG_TABLE (REG_0F1C_MOD_0) },
10352     { "nopQ",           { Ev }, 0 },
10353   },
10354   {
10355     /* MOD_0F1E_PREFIX_1 */
10356     { "nopQ",           { Ev }, 0 },
10357     { REG_TABLE (REG_0F1E_MOD_3) },
10358   },
10359   {
10360     /* MOD_0F24 */
10361     { Bad_Opcode },
10362     { "movL",           { Rd, Td }, 0 },
10363   },
10364   {
10365     /* MOD_0F26 */
10366     { Bad_Opcode },
10367     { "movL",           { Td, Rd }, 0 },
10368   },
10369   {
10370     /* MOD_0F2B_PREFIX_0 */
10371     {"movntps",         { Mx, XM }, PREFIX_OPCODE },
10372   },
10373   {
10374     /* MOD_0F2B_PREFIX_1 */
10375     {"movntss",         { Md, XM }, PREFIX_OPCODE },
10376   },
10377   {
10378     /* MOD_0F2B_PREFIX_2 */
10379     {"movntpd",         { Mx, XM }, PREFIX_OPCODE },
10380   },
10381   {
10382     /* MOD_0F2B_PREFIX_3 */
10383     {"movntsd",         { Mq, XM }, PREFIX_OPCODE },
10384   },
10385   {
10386     /* MOD_0F51 */
10387     { Bad_Opcode },
10388     { "movmskpX",       { Gdq, XS }, PREFIX_OPCODE },
10389   },
10390   {
10391     /* MOD_0F71_REG_2 */
10392     { Bad_Opcode },
10393     { "psrlw",          { MS, Ib }, 0 },
10394   },
10395   {
10396     /* MOD_0F71_REG_4 */
10397     { Bad_Opcode },
10398     { "psraw",          { MS, Ib }, 0 },
10399   },
10400   {
10401     /* MOD_0F71_REG_6 */
10402     { Bad_Opcode },
10403     { "psllw",          { MS, Ib }, 0 },
10404   },
10405   {
10406     /* MOD_0F72_REG_2 */
10407     { Bad_Opcode },
10408     { "psrld",          { MS, Ib }, 0 },
10409   },
10410   {
10411     /* MOD_0F72_REG_4 */
10412     { Bad_Opcode },
10413     { "psrad",          { MS, Ib }, 0 },
10414   },
10415   {
10416     /* MOD_0F72_REG_6 */
10417     { Bad_Opcode },
10418     { "pslld",          { MS, Ib }, 0 },
10419   },
10420   {
10421     /* MOD_0F73_REG_2 */
10422     { Bad_Opcode },
10423     { "psrlq",          { MS, Ib }, 0 },
10424   },
10425   {
10426     /* MOD_0F73_REG_3 */
10427     { Bad_Opcode },
10428     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10429   },
10430   {
10431     /* MOD_0F73_REG_6 */
10432     { Bad_Opcode },
10433     { "psllq",          { MS, Ib }, 0 },
10434   },
10435   {
10436     /* MOD_0F73_REG_7 */
10437     { Bad_Opcode },
10438     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10439   },
10440   {
10441     /* MOD_0FAE_REG_0 */
10442     { "fxsave",         { FXSAVE }, 0 },
10443     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10444   },
10445   {
10446     /* MOD_0FAE_REG_1 */
10447     { "fxrstor",        { FXSAVE }, 0 },
10448     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10449   },
10450   {
10451     /* MOD_0FAE_REG_2 */
10452     { "ldmxcsr",        { Md }, 0 },
10453     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10454   },
10455   {
10456     /* MOD_0FAE_REG_3 */
10457     { "stmxcsr",        { Md }, 0 },
10458     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10459   },
10460   {
10461     /* MOD_0FAE_REG_4 */
10462     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10463     { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10464   },
10465   {
10466     /* MOD_0FAE_REG_5 */
10467     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10468     { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10469   },
10470   {
10471     /* MOD_0FAE_REG_6 */
10472     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10473     { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10474   },
10475   {
10476     /* MOD_0FAE_REG_7 */
10477     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10478     { RM_TABLE (RM_0FAE_REG_7) },
10479   },
10480   {
10481     /* MOD_0FB2 */
10482     { "lssS",           { Gv, Mp }, 0 },
10483   },
10484   {
10485     /* MOD_0FB4 */
10486     { "lfsS",           { Gv, Mp }, 0 },
10487   },
10488   {
10489     /* MOD_0FB5 */
10490     { "lgsS",           { Gv, Mp }, 0 },
10491   },
10492   {
10493     /* MOD_0FC3 */
10494     { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10495   },
10496   {
10497     /* MOD_0FC7_REG_3 */
10498     { "xrstors",        { FXSAVE }, 0 },
10499   },
10500   {
10501     /* MOD_0FC7_REG_4 */
10502     { "xsavec",         { FXSAVE }, 0 },
10503   },
10504   {
10505     /* MOD_0FC7_REG_5 */
10506     { "xsaves",         { FXSAVE }, 0 },
10507   },
10508   {
10509     /* MOD_0FC7_REG_6 */
10510     { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10511     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10512   },
10513   {
10514     /* MOD_0FC7_REG_7 */
10515     { "vmptrst",        { Mq }, 0 },
10516     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10517   },
10518   {
10519     /* MOD_0FD7 */
10520     { Bad_Opcode },
10521     { "pmovmskb",       { Gdq, MS }, 0 },
10522   },
10523   {
10524     /* MOD_0FE7_PREFIX_2 */
10525     { "movntdq",        { Mx, XM }, 0 },
10526   },
10527   {
10528     /* MOD_0FF0_PREFIX_3 */
10529     { "lddqu",          { XM, M }, 0 },
10530   },
10531   {
10532     /* MOD_0F382A_PREFIX_2 */
10533     { "movntdqa",       { XM, Mx }, 0 },
10534   },
10535   {
10536     /* MOD_0F38F5_PREFIX_2 */
10537     { "wrussK",         { M, Gdq }, PREFIX_OPCODE },
10538   },
10539   {
10540     /* MOD_0F38F6_PREFIX_0 */
10541     { "wrssK",          { M, Gdq }, PREFIX_OPCODE },
10542   },
10543   {
10544     /* MOD_0F38F8_PREFIX_1 */
10545     { "enqcmds",        { Gva, M }, PREFIX_OPCODE },
10546   },
10547   {
10548     /* MOD_0F38F8_PREFIX_2 */
10549     { "movdir64b",      { Gva, M }, PREFIX_OPCODE },
10550   },
10551   {
10552     /* MOD_0F38F8_PREFIX_3 */
10553     { "enqcmd",         { Gva, M }, PREFIX_OPCODE },
10554   },
10555   {
10556     /* MOD_0F38F9_PREFIX_0 */
10557     { "movdiri",        { Em, Gv }, PREFIX_OPCODE },
10558   },
10559   {
10560     /* MOD_62_32BIT */
10561     { "bound{S|}",      { Gv, Ma }, 0 },
10562     { EVEX_TABLE (EVEX_0F) },
10563   },
10564   {
10565     /* MOD_C4_32BIT */
10566     { "lesS",           { Gv, Mp }, 0 },
10567     { VEX_C4_TABLE (VEX_0F) },
10568   },
10569   {
10570     /* MOD_C5_32BIT */
10571     { "ldsS",           { Gv, Mp }, 0 },
10572     { VEX_C5_TABLE (VEX_0F) },
10573   },
10574   {
10575     /* MOD_VEX_0F12_PREFIX_0 */
10576     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10577     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10578   },
10579   {
10580     /* MOD_VEX_0F13 */
10581     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10582   },
10583   {
10584     /* MOD_VEX_0F16_PREFIX_0 */
10585     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10586     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10587   },
10588   {
10589     /* MOD_VEX_0F17 */
10590     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10591   },
10592   {
10593     /* MOD_VEX_0F2B */
10594     { "vmovntpX",       { Mx, XM }, 0 },
10595   },
10596   {
10597     /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10598     { Bad_Opcode },
10599     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10600   },
10601   {
10602     /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10603     { Bad_Opcode },
10604     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10605   },
10606   {
10607     /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10608     { Bad_Opcode },
10609     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10610   },
10611   {
10612     /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10613     { Bad_Opcode },
10614     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10615   },
10616   {
10617     /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10618     { Bad_Opcode },
10619     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10620   },
10621   {
10622     /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10623     { Bad_Opcode },
10624     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10625   },
10626   {
10627     /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10628     { Bad_Opcode },
10629     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10630   },
10631   {
10632     /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10633     { Bad_Opcode },
10634     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10635   },
10636   {
10637     /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10638     { Bad_Opcode },
10639     { "knotw",          { MaskG, MaskR }, 0 },
10640   },
10641   {
10642     /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10643     { Bad_Opcode },
10644     { "knotq",          { MaskG, MaskR }, 0 },
10645   },
10646   {
10647     /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10648     { Bad_Opcode },
10649     { "knotb",          { MaskG, MaskR }, 0 },
10650   },
10651   {
10652     /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10653     { Bad_Opcode },
10654     { "knotd",          { MaskG, MaskR }, 0 },
10655   },
10656   {
10657     /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10658     { Bad_Opcode },
10659     { "korw",       { MaskG, MaskVex, MaskR }, 0 },
10660   },
10661   {
10662     /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10663     { Bad_Opcode },
10664     { "korq",       { MaskG, MaskVex, MaskR }, 0 },
10665   },
10666   {
10667     /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10668     { Bad_Opcode },
10669     { "korb",       { MaskG, MaskVex, MaskR }, 0 },
10670   },
10671   {
10672     /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10673     { Bad_Opcode },
10674     { "kord",       { MaskG, MaskVex, MaskR }, 0 },
10675   },
10676  {
10677     /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10678     { Bad_Opcode },
10679     { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
10680   },
10681   {
10682     /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10683     { Bad_Opcode },
10684     { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
10685   },
10686   {
10687     /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10688     { Bad_Opcode },
10689     { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
10690   },
10691   {
10692     /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10693     { Bad_Opcode },
10694     { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
10695   },
10696   {
10697     /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10698     { Bad_Opcode },
10699     { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
10700   },
10701   {
10702     /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10703     { Bad_Opcode },
10704     { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
10705   },
10706   {
10707     /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10708     { Bad_Opcode },
10709     { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
10710   },
10711   {
10712     /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10713     { Bad_Opcode },
10714     { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
10715   },
10716   {
10717     /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10718     { Bad_Opcode },
10719     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10720   },
10721   {
10722     /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10723     { Bad_Opcode },
10724     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10725   },
10726   {
10727     /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10728     { Bad_Opcode },
10729     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10730   },
10731   {
10732     /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10733     { Bad_Opcode },
10734     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10735   },
10736   {
10737     /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10738     { Bad_Opcode },
10739     { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
10740   },
10741   {
10742     /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10743     { Bad_Opcode },
10744     { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
10745   },
10746   {
10747     /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10748     { Bad_Opcode },
10749     { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
10750   },
10751   {
10752     /* MOD_VEX_0F50 */
10753     { Bad_Opcode },
10754     { "vmovmskpX",      { Gdq, XS }, 0 },
10755   },
10756   {
10757     /* MOD_VEX_0F71_REG_2 */
10758     { Bad_Opcode },
10759     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10760   },
10761   {
10762     /* MOD_VEX_0F71_REG_4 */
10763     { Bad_Opcode },
10764     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10765   },
10766   {
10767     /* MOD_VEX_0F71_REG_6 */
10768     { Bad_Opcode },
10769     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10770   },
10771   {
10772     /* MOD_VEX_0F72_REG_2 */
10773     { Bad_Opcode },
10774     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10775   },
10776   {
10777     /* MOD_VEX_0F72_REG_4 */
10778     { Bad_Opcode },
10779     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10780   },
10781   {
10782     /* MOD_VEX_0F72_REG_6 */
10783     { Bad_Opcode },
10784     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10785   },
10786   {
10787     /* MOD_VEX_0F73_REG_2 */
10788     { Bad_Opcode },
10789     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10790   },
10791   {
10792     /* MOD_VEX_0F73_REG_3 */
10793     { Bad_Opcode },
10794     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10795   },
10796   {
10797     /* MOD_VEX_0F73_REG_6 */
10798     { Bad_Opcode },
10799     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10800   },
10801   {
10802     /* MOD_VEX_0F73_REG_7 */
10803     { Bad_Opcode },
10804     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10805   },
10806   {
10807     /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10808     { "kmovw",          { Ew, MaskG }, 0 },
10809     { Bad_Opcode },
10810   },
10811   {
10812     /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10813     { "kmovq",          { Eq, MaskG }, 0 },
10814     { Bad_Opcode },
10815   },
10816   {
10817     /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10818     { "kmovb",          { Eb, MaskG }, 0 },
10819     { Bad_Opcode },
10820   },
10821   {
10822     /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10823     { "kmovd",          { Ed, MaskG }, 0 },
10824     { Bad_Opcode },
10825   },
10826   {
10827     /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10828     { Bad_Opcode },
10829     { "kmovw",          { MaskG, Rdq }, 0 },
10830   },
10831   {
10832     /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10833     { Bad_Opcode },
10834     { "kmovb",          { MaskG, Rdq }, 0 },
10835   },
10836   {
10837     /* MOD_VEX_0F92_P_3_LEN_0 */
10838     { Bad_Opcode },
10839     { "kmovK",          { MaskG, Rdq }, 0 },
10840   },
10841   {
10842     /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10843     { Bad_Opcode },
10844     { "kmovw",          { Gdq, MaskR }, 0 },
10845   },
10846   {
10847     /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10848     { Bad_Opcode },
10849     { "kmovb",          { Gdq, MaskR }, 0 },
10850   },
10851   {
10852     /* MOD_VEX_0F93_P_3_LEN_0 */
10853     { Bad_Opcode },
10854     { "kmovK",          { Gdq, MaskR }, 0 },
10855   },
10856   {
10857     /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10858     { Bad_Opcode },
10859     { "kortestw", { MaskG, MaskR }, 0 },
10860   },
10861   {
10862     /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10863     { Bad_Opcode },
10864     { "kortestq", { MaskG, MaskR }, 0 },
10865   },
10866   {
10867     /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10868     { Bad_Opcode },
10869     { "kortestb", { MaskG, MaskR }, 0 },
10870   },
10871   {
10872     /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10873     { Bad_Opcode },
10874     { "kortestd", { MaskG, MaskR }, 0 },
10875   },
10876   {
10877     /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10878     { Bad_Opcode },
10879     { "ktestw", { MaskG, MaskR }, 0 },
10880   },
10881   {
10882     /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10883     { Bad_Opcode },
10884     { "ktestq", { MaskG, MaskR }, 0 },
10885   },
10886   {
10887     /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10888     { Bad_Opcode },
10889     { "ktestb", { MaskG, MaskR }, 0 },
10890   },
10891   {
10892     /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10893     { Bad_Opcode },
10894     { "ktestd", { MaskG, MaskR }, 0 },
10895   },
10896   {
10897     /* MOD_VEX_0FAE_REG_2 */
10898     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10899   },
10900   {
10901     /* MOD_VEX_0FAE_REG_3 */
10902     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10903   },
10904   {
10905     /* MOD_VEX_0FD7_PREFIX_2 */
10906     { Bad_Opcode },
10907     { "vpmovmskb",      { Gdq, XS }, 0 },
10908   },
10909   {
10910     /* MOD_VEX_0FE7_PREFIX_2 */
10911     { "vmovntdq",       { Mx, XM }, 0 },
10912   },
10913   {
10914     /* MOD_VEX_0FF0_PREFIX_3 */
10915     { "vlddqu",         { XM, M }, 0 },
10916   },
10917   {
10918     /* MOD_VEX_0F381A_PREFIX_2 */
10919     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10920   },
10921   {
10922     /* MOD_VEX_0F382A_PREFIX_2 */
10923     { "vmovntdqa",      { XM, Mx }, 0 },
10924   },
10925   {
10926     /* MOD_VEX_0F382C_PREFIX_2 */
10927     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10928   },
10929   {
10930     /* MOD_VEX_0F382D_PREFIX_2 */
10931     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10932   },
10933   {
10934     /* MOD_VEX_0F382E_PREFIX_2 */
10935     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10936   },
10937   {
10938     /* MOD_VEX_0F382F_PREFIX_2 */
10939     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10940   },
10941   {
10942     /* MOD_VEX_0F385A_PREFIX_2 */
10943     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10944   },
10945   {
10946     /* MOD_VEX_0F388C_PREFIX_2 */
10947     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
10948   },
10949   {
10950     /* MOD_VEX_0F388E_PREFIX_2 */
10951     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
10952   },
10953   {
10954     /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10955     { Bad_Opcode },
10956     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
10957   },
10958   {
10959     /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10960     { Bad_Opcode },
10961     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
10962   },
10963   {
10964     /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10965     { Bad_Opcode },
10966     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
10967   },
10968   {
10969     /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10970     { Bad_Opcode },
10971     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
10972   },
10973   {
10974     /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10975     { Bad_Opcode },
10976     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
10977   },
10978   {
10979     /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10980     { Bad_Opcode },
10981     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
10982   },
10983   {
10984     /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10985     { Bad_Opcode },
10986     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
10987   },
10988   {
10989     /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
10990     { Bad_Opcode },
10991     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
10992   },
10993
10994 #include "i386-dis-evex-mod.h"
10995 };
10996
10997 static const struct dis386 rm_table[][8] = {
10998   {
10999     /* RM_C6_REG_7 */
11000     { "xabort",         { Skip_MODRM, Ib }, 0 },
11001   },
11002   {
11003     /* RM_C7_REG_7 */
11004     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
11005   },
11006   {
11007     /* RM_0F01_REG_0 */
11008     { "enclv",          { Skip_MODRM }, 0 },
11009     { "vmcall",         { Skip_MODRM }, 0 },
11010     { "vmlaunch",       { Skip_MODRM }, 0 },
11011     { "vmresume",       { Skip_MODRM }, 0 },
11012     { "vmxoff",         { Skip_MODRM }, 0 },
11013     { "pconfig",        { Skip_MODRM }, 0 },
11014   },
11015   {
11016     /* RM_0F01_REG_1 */
11017     { "monitor",        { { OP_Monitor, 0 } }, 0 },
11018     { "mwait",          { { OP_Mwait, 0 } }, 0 },
11019     { "clac",           { Skip_MODRM }, 0 },
11020     { "stac",           { Skip_MODRM }, 0 },
11021     { Bad_Opcode },
11022     { Bad_Opcode },
11023     { Bad_Opcode },
11024     { "encls",          { Skip_MODRM }, 0 },
11025   },
11026   {
11027     /* RM_0F01_REG_2 */
11028     { "xgetbv",         { Skip_MODRM }, 0 },
11029     { "xsetbv",         { Skip_MODRM }, 0 },
11030     { Bad_Opcode },
11031     { Bad_Opcode },
11032     { "vmfunc",         { Skip_MODRM }, 0 },
11033     { "xend",           { Skip_MODRM }, 0 },
11034     { "xtest",          { Skip_MODRM }, 0 },
11035     { "enclu",          { Skip_MODRM }, 0 },
11036   },
11037   {
11038     /* RM_0F01_REG_3 */
11039     { "vmrun",          { Skip_MODRM }, 0 },
11040     { "vmmcall",        { Skip_MODRM }, 0 },
11041     { "vmload",         { Skip_MODRM }, 0 },
11042     { "vmsave",         { Skip_MODRM }, 0 },
11043     { "stgi",           { Skip_MODRM }, 0 },
11044     { "clgi",           { Skip_MODRM }, 0 },
11045     { "skinit",         { Skip_MODRM }, 0 },
11046     { "invlpga",        { Skip_MODRM }, 0 },
11047   },
11048   {
11049     /* RM_0F01_REG_5 */
11050     { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11051     { Bad_Opcode },
11052     { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11053     { Bad_Opcode },
11054     { Bad_Opcode },
11055     { Bad_Opcode },
11056     { "rdpkru",         { Skip_MODRM }, 0 },
11057     { "wrpkru",         { Skip_MODRM }, 0 },
11058   },
11059   {
11060     /* RM_0F01_REG_7 */
11061     { "swapgs",         { Skip_MODRM }, 0  },
11062     { "rdtscp",         { Skip_MODRM }, 0  },
11063     { "monitorx",       { { OP_Monitor, 0 } }, 0  },
11064     { "mwaitx",         { { OP_Mwaitx,  0 } }, 0  },
11065     { "clzero",         { Skip_MODRM }, 0  },
11066   },
11067   {
11068     /* RM_0F1E_MOD_3_REG_7 */
11069     { "nopQ",           { Ev }, 0 },
11070     { "nopQ",           { Ev }, 0 },
11071     { "endbr64",        { Skip_MODRM },  PREFIX_OPCODE },
11072     { "endbr32",        { Skip_MODRM },  PREFIX_OPCODE },
11073     { "nopQ",           { Ev }, 0 },
11074     { "nopQ",           { Ev }, 0 },
11075     { "nopQ",           { Ev }, 0 },
11076     { "nopQ",           { Ev }, 0 },
11077   },
11078   {
11079     /* RM_0FAE_REG_6 */
11080     { "mfence",         { Skip_MODRM }, 0 },
11081   },
11082   {
11083     /* RM_0FAE_REG_7 */
11084     { "sfence",         { Skip_MODRM }, 0 },
11085
11086   },
11087 };
11088
11089 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11090
11091 /* We use the high bit to indicate different name for the same
11092    prefix.  */
11093 #define REP_PREFIX      (0xf3 | 0x100)
11094 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11095 #define XRELEASE_PREFIX (0xf3 | 0x400)
11096 #define BND_PREFIX      (0xf2 | 0x400)
11097 #define NOTRACK_PREFIX  (0x3e | 0x100)
11098
11099 static int
11100 ckprefix (void)
11101 {
11102   int newrex, i, length;
11103   rex = 0;
11104   rex_ignored = 0;
11105   prefixes = 0;
11106   used_prefixes = 0;
11107   rex_used = 0;
11108   last_lock_prefix = -1;
11109   last_repz_prefix = -1;
11110   last_repnz_prefix = -1;
11111   last_data_prefix = -1;
11112   last_addr_prefix = -1;
11113   last_rex_prefix = -1;
11114   last_seg_prefix = -1;
11115   fwait_prefix = -1;
11116   active_seg_prefix = 0;
11117   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11118     all_prefixes[i] = 0;
11119   i = 0;
11120   length = 0;
11121   /* The maximum instruction length is 15bytes.  */
11122   while (length < MAX_CODE_LENGTH - 1)
11123     {
11124       FETCH_DATA (the_info, codep + 1);
11125       newrex = 0;
11126       switch (*codep)
11127         {
11128         /* REX prefixes family.  */
11129         case 0x40:
11130         case 0x41:
11131         case 0x42:
11132         case 0x43:
11133         case 0x44:
11134         case 0x45:
11135         case 0x46:
11136         case 0x47:
11137         case 0x48:
11138         case 0x49:
11139         case 0x4a:
11140         case 0x4b:
11141         case 0x4c:
11142         case 0x4d:
11143         case 0x4e:
11144         case 0x4f:
11145           if (address_mode == mode_64bit)
11146             newrex = *codep;
11147           else
11148             return 1;
11149           last_rex_prefix = i;
11150           break;
11151         case 0xf3:
11152           prefixes |= PREFIX_REPZ;
11153           last_repz_prefix = i;
11154           break;
11155         case 0xf2:
11156           prefixes |= PREFIX_REPNZ;
11157           last_repnz_prefix = i;
11158           break;
11159         case 0xf0:
11160           prefixes |= PREFIX_LOCK;
11161           last_lock_prefix = i;
11162           break;
11163         case 0x2e:
11164           prefixes |= PREFIX_CS;
11165           last_seg_prefix = i;
11166           active_seg_prefix = PREFIX_CS;
11167           break;
11168         case 0x36:
11169           prefixes |= PREFIX_SS;
11170           last_seg_prefix = i;
11171           active_seg_prefix = PREFIX_SS;
11172           break;
11173         case 0x3e:
11174           prefixes |= PREFIX_DS;
11175           last_seg_prefix = i;
11176           active_seg_prefix = PREFIX_DS;
11177           break;
11178         case 0x26:
11179           prefixes |= PREFIX_ES;
11180           last_seg_prefix = i;
11181           active_seg_prefix = PREFIX_ES;
11182           break;
11183         case 0x64:
11184           prefixes |= PREFIX_FS;
11185           last_seg_prefix = i;
11186           active_seg_prefix = PREFIX_FS;
11187           break;
11188         case 0x65:
11189           prefixes |= PREFIX_GS;
11190           last_seg_prefix = i;
11191           active_seg_prefix = PREFIX_GS;
11192           break;
11193         case 0x66:
11194           prefixes |= PREFIX_DATA;
11195           last_data_prefix = i;
11196           break;
11197         case 0x67:
11198           prefixes |= PREFIX_ADDR;
11199           last_addr_prefix = i;
11200           break;
11201         case FWAIT_OPCODE:
11202           /* fwait is really an instruction.  If there are prefixes
11203              before the fwait, they belong to the fwait, *not* to the
11204              following instruction.  */
11205           fwait_prefix = i;
11206           if (prefixes || rex)
11207             {
11208               prefixes |= PREFIX_FWAIT;
11209               codep++;
11210               /* This ensures that the previous REX prefixes are noticed
11211                  as unused prefixes, as in the return case below.  */
11212               rex_used = rex;
11213               return 1;
11214             }
11215           prefixes = PREFIX_FWAIT;
11216           break;
11217         default:
11218           return 1;
11219         }
11220       /* Rex is ignored when followed by another prefix.  */
11221       if (rex)
11222         {
11223           rex_used = rex;
11224           return 1;
11225         }
11226       if (*codep != FWAIT_OPCODE)
11227         all_prefixes[i++] = *codep;
11228       rex = newrex;
11229       codep++;
11230       length++;
11231     }
11232   return 0;
11233 }
11234
11235 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11236    prefix byte.  */
11237
11238 static const char *
11239 prefix_name (int pref, int sizeflag)
11240 {
11241   static const char *rexes [16] =
11242     {
11243       "rex",            /* 0x40 */
11244       "rex.B",          /* 0x41 */
11245       "rex.X",          /* 0x42 */
11246       "rex.XB",         /* 0x43 */
11247       "rex.R",          /* 0x44 */
11248       "rex.RB",         /* 0x45 */
11249       "rex.RX",         /* 0x46 */
11250       "rex.RXB",        /* 0x47 */
11251       "rex.W",          /* 0x48 */
11252       "rex.WB",         /* 0x49 */
11253       "rex.WX",         /* 0x4a */
11254       "rex.WXB",        /* 0x4b */
11255       "rex.WR",         /* 0x4c */
11256       "rex.WRB",        /* 0x4d */
11257       "rex.WRX",        /* 0x4e */
11258       "rex.WRXB",       /* 0x4f */
11259     };
11260
11261   switch (pref)
11262     {
11263     /* REX prefixes family.  */
11264     case 0x40:
11265     case 0x41:
11266     case 0x42:
11267     case 0x43:
11268     case 0x44:
11269     case 0x45:
11270     case 0x46:
11271     case 0x47:
11272     case 0x48:
11273     case 0x49:
11274     case 0x4a:
11275     case 0x4b:
11276     case 0x4c:
11277     case 0x4d:
11278     case 0x4e:
11279     case 0x4f:
11280       return rexes [pref - 0x40];
11281     case 0xf3:
11282       return "repz";
11283     case 0xf2:
11284       return "repnz";
11285     case 0xf0:
11286       return "lock";
11287     case 0x2e:
11288       return "cs";
11289     case 0x36:
11290       return "ss";
11291     case 0x3e:
11292       return "ds";
11293     case 0x26:
11294       return "es";
11295     case 0x64:
11296       return "fs";
11297     case 0x65:
11298       return "gs";
11299     case 0x66:
11300       return (sizeflag & DFLAG) ? "data16" : "data32";
11301     case 0x67:
11302       if (address_mode == mode_64bit)
11303         return (sizeflag & AFLAG) ? "addr32" : "addr64";
11304       else
11305         return (sizeflag & AFLAG) ? "addr16" : "addr32";
11306     case FWAIT_OPCODE:
11307       return "fwait";
11308     case REP_PREFIX:
11309       return "rep";
11310     case XACQUIRE_PREFIX:
11311       return "xacquire";
11312     case XRELEASE_PREFIX:
11313       return "xrelease";
11314     case BND_PREFIX:
11315       return "bnd";
11316     case NOTRACK_PREFIX:
11317       return "notrack";
11318     default:
11319       return NULL;
11320     }
11321 }
11322
11323 static char op_out[MAX_OPERANDS][100];
11324 static int op_ad, op_index[MAX_OPERANDS];
11325 static int two_source_ops;
11326 static bfd_vma op_address[MAX_OPERANDS];
11327 static bfd_vma op_riprel[MAX_OPERANDS];
11328 static bfd_vma start_pc;
11329
11330 /*
11331  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11332  *   (see topic "Redundant prefixes" in the "Differences from 8086"
11333  *   section of the "Virtual 8086 Mode" chapter.)
11334  * 'pc' should be the address of this instruction, it will
11335  *   be used to print the target address if this is a relative jump or call
11336  * The function returns the length of this instruction in bytes.
11337  */
11338
11339 static char intel_syntax;
11340 static char intel_mnemonic = !SYSV386_COMPAT;
11341 static char open_char;
11342 static char close_char;
11343 static char separator_char;
11344 static char scale_char;
11345
11346 enum x86_64_isa
11347 {
11348   amd64 = 0,
11349   intel64
11350 };
11351
11352 static enum x86_64_isa isa64;
11353
11354 /* Here for backwards compatibility.  When gdb stops using
11355    print_insn_i386_att and print_insn_i386_intel these functions can
11356    disappear, and print_insn_i386 be merged into print_insn.  */
11357 int
11358 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11359 {
11360   intel_syntax = 0;
11361
11362   return print_insn (pc, info);
11363 }
11364
11365 int
11366 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11367 {
11368   intel_syntax = 1;
11369
11370   return print_insn (pc, info);
11371 }
11372
11373 int
11374 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11375 {
11376   intel_syntax = -1;
11377
11378   return print_insn (pc, info);
11379 }
11380
11381 void
11382 print_i386_disassembler_options (FILE *stream)
11383 {
11384   fprintf (stream, _("\n\
11385 The following i386/x86-64 specific disassembler options are supported for use\n\
11386 with the -M switch (multiple options should be separated by commas):\n"));
11387
11388   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
11389   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
11390   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
11391   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
11392   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
11393   fprintf (stream, _("  att-mnemonic\n"
11394                      "              Display instruction in AT&T mnemonic\n"));
11395   fprintf (stream, _("  intel-mnemonic\n"
11396                      "              Display instruction in Intel mnemonic\n"));
11397   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
11398   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
11399   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
11400   fprintf (stream, _("  data32      Assume 32bit data size\n"));
11401   fprintf (stream, _("  data16      Assume 16bit data size\n"));
11402   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
11403   fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
11404   fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
11405 }
11406
11407 /* Bad opcode.  */
11408 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11409
11410 /* Get a pointer to struct dis386 with a valid name.  */
11411
11412 static const struct dis386 *
11413 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11414 {
11415   int vindex, vex_table_index;
11416
11417   if (dp->name != NULL)
11418     return dp;
11419
11420   switch (dp->op[0].bytemode)
11421     {
11422     case USE_REG_TABLE:
11423       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11424       break;
11425
11426     case USE_MOD_TABLE:
11427       vindex = modrm.mod == 0x3 ? 1 : 0;
11428       dp = &mod_table[dp->op[1].bytemode][vindex];
11429       break;
11430
11431     case USE_RM_TABLE:
11432       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11433       break;
11434
11435     case USE_PREFIX_TABLE:
11436       if (need_vex)
11437         {
11438           /* The prefix in VEX is implicit.  */
11439           switch (vex.prefix)
11440             {
11441             case 0:
11442               vindex = 0;
11443               break;
11444             case REPE_PREFIX_OPCODE:
11445               vindex = 1;
11446               break;
11447             case DATA_PREFIX_OPCODE:
11448               vindex = 2;
11449               break;
11450             case REPNE_PREFIX_OPCODE:
11451               vindex = 3;
11452               break;
11453             default:
11454               abort ();
11455               break;
11456             }
11457         }
11458       else
11459         {
11460           int last_prefix = -1;
11461           int prefix = 0;
11462           vindex = 0;
11463           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11464              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11465              last one wins.  */
11466           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11467             {
11468               if (last_repz_prefix > last_repnz_prefix)
11469                 {
11470                   vindex = 1;
11471                   prefix = PREFIX_REPZ;
11472                   last_prefix = last_repz_prefix;
11473                 }
11474               else
11475                 {
11476                   vindex = 3;
11477                   prefix = PREFIX_REPNZ;
11478                   last_prefix = last_repnz_prefix;
11479                 }
11480
11481               /* Check if prefix should be ignored.  */
11482               if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11483                      & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11484                    & prefix) != 0)
11485                 vindex = 0;
11486             }
11487
11488           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11489             {
11490               vindex = 2;
11491               prefix = PREFIX_DATA;
11492               last_prefix = last_data_prefix;
11493             }
11494
11495           if (vindex != 0)
11496             {
11497               used_prefixes |= prefix;
11498               all_prefixes[last_prefix] = 0;
11499             }
11500         }
11501       dp = &prefix_table[dp->op[1].bytemode][vindex];
11502       break;
11503
11504     case USE_X86_64_TABLE:
11505       vindex = address_mode == mode_64bit ? 1 : 0;
11506       dp = &x86_64_table[dp->op[1].bytemode][vindex];
11507       break;
11508
11509     case USE_3BYTE_TABLE:
11510       FETCH_DATA (info, codep + 2);
11511       vindex = *codep++;
11512       dp = &three_byte_table[dp->op[1].bytemode][vindex];
11513       end_codep = codep;
11514       modrm.mod = (*codep >> 6) & 3;
11515       modrm.reg = (*codep >> 3) & 7;
11516       modrm.rm = *codep & 7;
11517       break;
11518
11519     case USE_VEX_LEN_TABLE:
11520       if (!need_vex)
11521         abort ();
11522
11523       switch (vex.length)
11524         {
11525         case 128:
11526           vindex = 0;
11527           break;
11528         case 256:
11529           vindex = 1;
11530           break;
11531         default:
11532           abort ();
11533           break;
11534         }
11535
11536       dp = &vex_len_table[dp->op[1].bytemode][vindex];
11537       break;
11538
11539     case USE_EVEX_LEN_TABLE:
11540       if (!vex.evex)
11541         abort ();
11542
11543       switch (vex.length)
11544         {
11545         case 128:
11546           vindex = 0;
11547           break;
11548         case 256:
11549           vindex = 1;
11550           break;
11551         case 512:
11552           vindex = 2;
11553           break;
11554         default:
11555           abort ();
11556           break;
11557         }
11558
11559       dp = &evex_len_table[dp->op[1].bytemode][vindex];
11560       break;
11561
11562     case USE_XOP_8F_TABLE:
11563       FETCH_DATA (info, codep + 3);
11564       /* All bits in the REX prefix are ignored.  */
11565       rex_ignored = rex;
11566       rex = ~(*codep >> 5) & 0x7;
11567
11568       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
11569       switch ((*codep & 0x1f))
11570         {
11571         default:
11572           dp = &bad_opcode;
11573           return dp;
11574         case 0x8:
11575           vex_table_index = XOP_08;
11576           break;
11577         case 0x9:
11578           vex_table_index = XOP_09;
11579           break;
11580         case 0xa:
11581           vex_table_index = XOP_0A;
11582           break;
11583         }
11584       codep++;
11585       vex.w = *codep & 0x80;
11586       if (vex.w && address_mode == mode_64bit)
11587         rex |= REX_W;
11588
11589       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11590       if (address_mode != mode_64bit)
11591         {
11592           /* In 16/32-bit mode REX_B is silently ignored.  */
11593           rex &= ~REX_B;
11594         }
11595
11596       vex.length = (*codep & 0x4) ? 256 : 128;
11597       switch ((*codep & 0x3))
11598         {
11599         case 0:
11600           break;
11601         case 1:
11602           vex.prefix = DATA_PREFIX_OPCODE;
11603           break;
11604         case 2:
11605           vex.prefix = REPE_PREFIX_OPCODE;
11606           break;
11607         case 3:
11608           vex.prefix = REPNE_PREFIX_OPCODE;
11609           break;
11610         }
11611       need_vex = 1;
11612       need_vex_reg = 1;
11613       codep++;
11614       vindex = *codep++;
11615       dp = &xop_table[vex_table_index][vindex];
11616
11617       end_codep = codep;
11618       FETCH_DATA (info, codep + 1);
11619       modrm.mod = (*codep >> 6) & 3;
11620       modrm.reg = (*codep >> 3) & 7;
11621       modrm.rm = *codep & 7;
11622       break;
11623
11624     case USE_VEX_C4_TABLE:
11625       /* VEX prefix.  */
11626       FETCH_DATA (info, codep + 3);
11627       /* All bits in the REX prefix are ignored.  */
11628       rex_ignored = rex;
11629       rex = ~(*codep >> 5) & 0x7;
11630       switch ((*codep & 0x1f))
11631         {
11632         default:
11633           dp = &bad_opcode;
11634           return dp;
11635         case 0x1:
11636           vex_table_index = VEX_0F;
11637           break;
11638         case 0x2:
11639           vex_table_index = VEX_0F38;
11640           break;
11641         case 0x3:
11642           vex_table_index = VEX_0F3A;
11643           break;
11644         }
11645       codep++;
11646       vex.w = *codep & 0x80;
11647       if (address_mode == mode_64bit)
11648         {
11649           if (vex.w)
11650             rex |= REX_W;
11651         }
11652       else
11653         {
11654           /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11655              is ignored, other REX bits are 0 and the highest bit in
11656              VEX.vvvv is also ignored (but we mustn't clear it here).  */
11657           rex = 0;
11658         }
11659       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11660       vex.length = (*codep & 0x4) ? 256 : 128;
11661       switch ((*codep & 0x3))
11662         {
11663         case 0:
11664           break;
11665         case 1:
11666           vex.prefix = DATA_PREFIX_OPCODE;
11667           break;
11668         case 2:
11669           vex.prefix = REPE_PREFIX_OPCODE;
11670           break;
11671         case 3:
11672           vex.prefix = REPNE_PREFIX_OPCODE;
11673           break;
11674         }
11675       need_vex = 1;
11676       need_vex_reg = 1;
11677       codep++;
11678       vindex = *codep++;
11679       dp = &vex_table[vex_table_index][vindex];
11680       end_codep = codep;
11681       /* There is no MODRM byte for VEX0F 77.  */
11682       if (vex_table_index != VEX_0F || vindex != 0x77)
11683         {
11684           FETCH_DATA (info, codep + 1);
11685           modrm.mod = (*codep >> 6) & 3;
11686           modrm.reg = (*codep >> 3) & 7;
11687           modrm.rm = *codep & 7;
11688         }
11689       break;
11690
11691     case USE_VEX_C5_TABLE:
11692       /* VEX prefix.  */
11693       FETCH_DATA (info, codep + 2);
11694       /* All bits in the REX prefix are ignored.  */
11695       rex_ignored = rex;
11696       rex = (*codep & 0x80) ? 0 : REX_R;
11697
11698       /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11699          VEX.vvvv is 1.  */
11700       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11701       vex.length = (*codep & 0x4) ? 256 : 128;
11702       switch ((*codep & 0x3))
11703         {
11704         case 0:
11705           break;
11706         case 1:
11707           vex.prefix = DATA_PREFIX_OPCODE;
11708           break;
11709         case 2:
11710           vex.prefix = REPE_PREFIX_OPCODE;
11711           break;
11712         case 3:
11713           vex.prefix = REPNE_PREFIX_OPCODE;
11714           break;
11715         }
11716       need_vex = 1;
11717       need_vex_reg = 1;
11718       codep++;
11719       vindex = *codep++;
11720       dp = &vex_table[dp->op[1].bytemode][vindex];
11721       end_codep = codep;
11722       /* There is no MODRM byte for VEX 77.  */
11723       if (vindex != 0x77)
11724         {
11725           FETCH_DATA (info, codep + 1);
11726           modrm.mod = (*codep >> 6) & 3;
11727           modrm.reg = (*codep >> 3) & 7;
11728           modrm.rm = *codep & 7;
11729         }
11730       break;
11731
11732     case USE_VEX_W_TABLE:
11733       if (!need_vex)
11734         abort ();
11735
11736       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11737       break;
11738
11739     case USE_EVEX_TABLE:
11740       two_source_ops = 0;
11741       /* EVEX prefix.  */
11742       vex.evex = 1;
11743       FETCH_DATA (info, codep + 4);
11744       /* All bits in the REX prefix are ignored.  */
11745       rex_ignored = rex;
11746       /* The first byte after 0x62.  */
11747       rex = ~(*codep >> 5) & 0x7;
11748       vex.r = *codep & 0x10;
11749       switch ((*codep & 0xf))
11750         {
11751         default:
11752           return &bad_opcode;
11753         case 0x1:
11754           vex_table_index = EVEX_0F;
11755           break;
11756         case 0x2:
11757           vex_table_index = EVEX_0F38;
11758           break;
11759         case 0x3:
11760           vex_table_index = EVEX_0F3A;
11761           break;
11762         }
11763
11764       /* The second byte after 0x62.  */
11765       codep++;
11766       vex.w = *codep & 0x80;
11767       if (vex.w && address_mode == mode_64bit)
11768         rex |= REX_W;
11769
11770       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11771
11772       /* The U bit.  */
11773       if (!(*codep & 0x4))
11774         return &bad_opcode;
11775
11776       switch ((*codep & 0x3))
11777         {
11778         case 0:
11779           break;
11780         case 1:
11781           vex.prefix = DATA_PREFIX_OPCODE;
11782           break;
11783         case 2:
11784           vex.prefix = REPE_PREFIX_OPCODE;
11785           break;
11786         case 3:
11787           vex.prefix = REPNE_PREFIX_OPCODE;
11788           break;
11789         }
11790
11791       /* The third byte after 0x62.  */
11792       codep++;
11793
11794       /* Remember the static rounding bits.  */
11795       vex.ll = (*codep >> 5) & 3;
11796       vex.b = (*codep & 0x10) != 0;
11797
11798       vex.v = *codep & 0x8;
11799       vex.mask_register_specifier = *codep & 0x7;
11800       vex.zeroing = *codep & 0x80;
11801
11802       if (address_mode != mode_64bit)
11803         {
11804           /* In 16/32-bit mode silently ignore following bits.  */
11805           rex &= ~REX_B;
11806           vex.r = 1;
11807           vex.v = 1;
11808         }
11809
11810       need_vex = 1;
11811       need_vex_reg = 1;
11812       codep++;
11813       vindex = *codep++;
11814       dp = &evex_table[vex_table_index][vindex];
11815       end_codep = codep;
11816       FETCH_DATA (info, codep + 1);
11817       modrm.mod = (*codep >> 6) & 3;
11818       modrm.reg = (*codep >> 3) & 7;
11819       modrm.rm = *codep & 7;
11820
11821       /* Set vector length.  */
11822       if (modrm.mod == 3 && vex.b)
11823         vex.length = 512;
11824       else
11825         {
11826           switch (vex.ll)
11827             {
11828             case 0x0:
11829               vex.length = 128;
11830               break;
11831             case 0x1:
11832               vex.length = 256;
11833               break;
11834             case 0x2:
11835               vex.length = 512;
11836               break;
11837             default:
11838               return &bad_opcode;
11839             }
11840         }
11841       break;
11842
11843     case 0:
11844       dp = &bad_opcode;
11845       break;
11846
11847     default:
11848       abort ();
11849     }
11850
11851   if (dp->name != NULL)
11852     return dp;
11853   else
11854     return get_valid_dis386 (dp, info);
11855 }
11856
11857 static void
11858 get_sib (disassemble_info *info, int sizeflag)
11859 {
11860   /* If modrm.mod == 3, operand must be register.  */
11861   if (need_modrm
11862       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11863       && modrm.mod != 3
11864       && modrm.rm == 4)
11865     {
11866       FETCH_DATA (info, codep + 2);
11867       sib.index = (codep [1] >> 3) & 7;
11868       sib.scale = (codep [1] >> 6) & 3;
11869       sib.base = codep [1] & 7;
11870     }
11871 }
11872
11873 static int
11874 print_insn (bfd_vma pc, disassemble_info *info)
11875 {
11876   const struct dis386 *dp;
11877   int i;
11878   char *op_txt[MAX_OPERANDS];
11879   int needcomma;
11880   int sizeflag, orig_sizeflag;
11881   const char *p;
11882   struct dis_private priv;
11883   int prefix_length;
11884
11885   priv.orig_sizeflag = AFLAG | DFLAG;
11886   if ((info->mach & bfd_mach_i386_i386) != 0)
11887     address_mode = mode_32bit;
11888   else if (info->mach == bfd_mach_i386_i8086)
11889     {
11890       address_mode = mode_16bit;
11891       priv.orig_sizeflag = 0;
11892     }
11893   else
11894     address_mode = mode_64bit;
11895
11896   if (intel_syntax == (char) -1)
11897     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11898
11899   for (p = info->disassembler_options; p != NULL; )
11900     {
11901       if (CONST_STRNEQ (p, "amd64"))
11902         isa64 = amd64;
11903       else if (CONST_STRNEQ (p, "intel64"))
11904         isa64 = intel64;
11905       else if (CONST_STRNEQ (p, "x86-64"))
11906         {
11907           address_mode = mode_64bit;
11908           priv.orig_sizeflag = AFLAG | DFLAG;
11909         }
11910       else if (CONST_STRNEQ (p, "i386"))
11911         {
11912           address_mode = mode_32bit;
11913           priv.orig_sizeflag = AFLAG | DFLAG;
11914         }
11915       else if (CONST_STRNEQ (p, "i8086"))
11916         {
11917           address_mode = mode_16bit;
11918           priv.orig_sizeflag = 0;
11919         }
11920       else if (CONST_STRNEQ (p, "intel"))
11921         {
11922           intel_syntax = 1;
11923           if (CONST_STRNEQ (p + 5, "-mnemonic"))
11924             intel_mnemonic = 1;
11925         }
11926       else if (CONST_STRNEQ (p, "att"))
11927         {
11928           intel_syntax = 0;
11929           if (CONST_STRNEQ (p + 3, "-mnemonic"))
11930             intel_mnemonic = 0;
11931         }
11932       else if (CONST_STRNEQ (p, "addr"))
11933         {
11934           if (address_mode == mode_64bit)
11935             {
11936               if (p[4] == '3' && p[5] == '2')
11937                 priv.orig_sizeflag &= ~AFLAG;
11938               else if (p[4] == '6' && p[5] == '4')
11939                 priv.orig_sizeflag |= AFLAG;
11940             }
11941           else
11942             {
11943               if (p[4] == '1' && p[5] == '6')
11944                 priv.orig_sizeflag &= ~AFLAG;
11945               else if (p[4] == '3' && p[5] == '2')
11946                 priv.orig_sizeflag |= AFLAG;
11947             }
11948         }
11949       else if (CONST_STRNEQ (p, "data"))
11950         {
11951           if (p[4] == '1' && p[5] == '6')
11952             priv.orig_sizeflag &= ~DFLAG;
11953           else if (p[4] == '3' && p[5] == '2')
11954             priv.orig_sizeflag |= DFLAG;
11955         }
11956       else if (CONST_STRNEQ (p, "suffix"))
11957         priv.orig_sizeflag |= SUFFIX_ALWAYS;
11958
11959       p = strchr (p, ',');
11960       if (p != NULL)
11961         p++;
11962     }
11963
11964   if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11965     {
11966       (*info->fprintf_func) (info->stream,
11967                              _("64-bit address is disabled"));
11968       return -1;
11969     }
11970
11971   if (intel_syntax)
11972     {
11973       names64 = intel_names64;
11974       names32 = intel_names32;
11975       names16 = intel_names16;
11976       names8 = intel_names8;
11977       names8rex = intel_names8rex;
11978       names_seg = intel_names_seg;
11979       names_mm = intel_names_mm;
11980       names_bnd = intel_names_bnd;
11981       names_xmm = intel_names_xmm;
11982       names_ymm = intel_names_ymm;
11983       names_zmm = intel_names_zmm;
11984       index64 = intel_index64;
11985       index32 = intel_index32;
11986       names_mask = intel_names_mask;
11987       index16 = intel_index16;
11988       open_char = '[';
11989       close_char = ']';
11990       separator_char = '+';
11991       scale_char = '*';
11992     }
11993   else
11994     {
11995       names64 = att_names64;
11996       names32 = att_names32;
11997       names16 = att_names16;
11998       names8 = att_names8;
11999       names8rex = att_names8rex;
12000       names_seg = att_names_seg;
12001       names_mm = att_names_mm;
12002       names_bnd = att_names_bnd;
12003       names_xmm = att_names_xmm;
12004       names_ymm = att_names_ymm;
12005       names_zmm = att_names_zmm;
12006       index64 = att_index64;
12007       index32 = att_index32;
12008       names_mask = att_names_mask;
12009       index16 = att_index16;
12010       open_char = '(';
12011       close_char =  ')';
12012       separator_char = ',';
12013       scale_char = ',';
12014     }
12015
12016   /* The output looks better if we put 7 bytes on a line, since that
12017      puts most long word instructions on a single line.  Use 8 bytes
12018      for Intel L1OM.  */
12019   if ((info->mach & bfd_mach_l1om) != 0)
12020     info->bytes_per_line = 8;
12021   else
12022     info->bytes_per_line = 7;
12023
12024   info->private_data = &priv;
12025   priv.max_fetched = priv.the_buffer;
12026   priv.insn_start = pc;
12027
12028   obuf[0] = 0;
12029   for (i = 0; i < MAX_OPERANDS; ++i)
12030     {
12031       op_out[i][0] = 0;
12032       op_index[i] = -1;
12033     }
12034
12035   the_info = info;
12036   start_pc = pc;
12037   start_codep = priv.the_buffer;
12038   codep = priv.the_buffer;
12039
12040   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12041     {
12042       const char *name;
12043
12044       /* Getting here means we tried for data but didn't get it.  That
12045          means we have an incomplete instruction of some sort.  Just
12046          print the first byte as a prefix or a .byte pseudo-op.  */
12047       if (codep > priv.the_buffer)
12048         {
12049           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12050           if (name != NULL)
12051             (*info->fprintf_func) (info->stream, "%s", name);
12052           else
12053             {
12054               /* Just print the first byte as a .byte instruction.  */
12055               (*info->fprintf_func) (info->stream, ".byte 0x%x",
12056                                      (unsigned int) priv.the_buffer[0]);
12057             }
12058
12059           return 1;
12060         }
12061
12062       return -1;
12063     }
12064
12065   obufp = obuf;
12066   sizeflag = priv.orig_sizeflag;
12067
12068   if (!ckprefix () || rex_used)
12069     {
12070       /* Too many prefixes or unused REX prefixes.  */
12071       for (i = 0;
12072            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12073            i++)
12074         (*info->fprintf_func) (info->stream, "%s%s",
12075                                i == 0 ? "" : " ",
12076                                prefix_name (all_prefixes[i], sizeflag));
12077       return i;
12078     }
12079
12080   insn_codep = codep;
12081
12082   FETCH_DATA (info, codep + 1);
12083   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12084
12085   if (((prefixes & PREFIX_FWAIT)
12086        && ((*codep < 0xd8) || (*codep > 0xdf))))
12087     {
12088       /* Handle prefixes before fwait.  */
12089       for (i = 0; i < fwait_prefix && all_prefixes[i];
12090            i++)
12091         (*info->fprintf_func) (info->stream, "%s ",
12092                                prefix_name (all_prefixes[i], sizeflag));
12093       (*info->fprintf_func) (info->stream, "fwait");
12094       return i + 1;
12095     }
12096
12097   if (*codep == 0x0f)
12098     {
12099       unsigned char threebyte;
12100
12101       codep++;
12102       FETCH_DATA (info, codep + 1);
12103       threebyte = *codep;
12104       dp = &dis386_twobyte[threebyte];
12105       need_modrm = twobyte_has_modrm[*codep];
12106       codep++;
12107     }
12108   else
12109     {
12110       dp = &dis386[*codep];
12111       need_modrm = onebyte_has_modrm[*codep];
12112       codep++;
12113     }
12114
12115   /* Save sizeflag for printing the extra prefixes later before updating
12116      it for mnemonic and operand processing.  The prefix names depend
12117      only on the address mode.  */
12118   orig_sizeflag = sizeflag;
12119   if (prefixes & PREFIX_ADDR)
12120     sizeflag ^= AFLAG;
12121   if ((prefixes & PREFIX_DATA))
12122     sizeflag ^= DFLAG;
12123
12124   end_codep = codep;
12125   if (need_modrm)
12126     {
12127       FETCH_DATA (info, codep + 1);
12128       modrm.mod = (*codep >> 6) & 3;
12129       modrm.reg = (*codep >> 3) & 7;
12130       modrm.rm = *codep & 7;
12131     }
12132
12133   need_vex = 0;
12134   need_vex_reg = 0;
12135   vex_w_done = 0;
12136   memset (&vex, 0, sizeof (vex));
12137
12138   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12139     {
12140       get_sib (info, sizeflag);
12141       dofloat (sizeflag);
12142     }
12143   else
12144     {
12145       dp = get_valid_dis386 (dp, info);
12146       if (dp != NULL && putop (dp->name, sizeflag) == 0)
12147         {
12148           get_sib (info, sizeflag);
12149           for (i = 0; i < MAX_OPERANDS; ++i)
12150             {
12151               obufp = op_out[i];
12152               op_ad = MAX_OPERANDS - 1 - i;
12153               if (dp->op[i].rtn)
12154                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12155               /* For EVEX instruction after the last operand masking
12156                  should be printed.  */
12157               if (i == 0 && vex.evex)
12158                 {
12159                   /* Don't print {%k0}.  */
12160                   if (vex.mask_register_specifier)
12161                     {
12162                       oappend ("{");
12163                       oappend (names_mask[vex.mask_register_specifier]);
12164                       oappend ("}");
12165                     }
12166                   if (vex.zeroing)
12167                     oappend ("{z}");
12168                 }
12169             }
12170         }
12171     }
12172
12173   /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
12174      are all 0s in inverted form.  */
12175   if (need_vex && vex.register_specifier != 0)
12176     {
12177       (*info->fprintf_func) (info->stream, "(bad)");
12178       return end_codep - priv.the_buffer;
12179     }
12180
12181   /* Check if the REX prefix is used.  */
12182   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12183     all_prefixes[last_rex_prefix] = 0;
12184
12185   /* Check if the SEG prefix is used.  */
12186   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12187                    | PREFIX_FS | PREFIX_GS)) != 0
12188       && (used_prefixes & active_seg_prefix) != 0)
12189     all_prefixes[last_seg_prefix] = 0;
12190
12191   /* Check if the ADDR prefix is used.  */
12192   if ((prefixes & PREFIX_ADDR) != 0
12193       && (used_prefixes & PREFIX_ADDR) != 0)
12194     all_prefixes[last_addr_prefix] = 0;
12195
12196   /* Check if the DATA prefix is used.  */
12197   if ((prefixes & PREFIX_DATA) != 0
12198       && (used_prefixes & PREFIX_DATA) != 0)
12199     all_prefixes[last_data_prefix] = 0;
12200
12201   /* Print the extra prefixes.  */
12202   prefix_length = 0;
12203   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12204     if (all_prefixes[i])
12205       {
12206         const char *name;
12207         name = prefix_name (all_prefixes[i], orig_sizeflag);
12208         if (name == NULL)
12209           abort ();
12210         prefix_length += strlen (name) + 1;
12211         (*info->fprintf_func) (info->stream, "%s ", name);
12212       }
12213
12214   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12215      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
12216      used by putop and MMX/SSE operand and may be overriden by the
12217      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12218      separately.  */
12219   if (dp->prefix_requirement == PREFIX_OPCODE
12220       && dp != &bad_opcode
12221       && (((prefixes
12222             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12223            && (used_prefixes
12224                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12225           || ((((prefixes
12226                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12227                 == PREFIX_DATA)
12228                && (used_prefixes & PREFIX_DATA) == 0))))
12229     {
12230       (*info->fprintf_func) (info->stream, "(bad)");
12231       return end_codep - priv.the_buffer;
12232     }
12233
12234   /* Check maximum code length.  */
12235   if ((codep - start_codep) > MAX_CODE_LENGTH)
12236     {
12237       (*info->fprintf_func) (info->stream, "(bad)");
12238       return MAX_CODE_LENGTH;
12239     }
12240
12241   obufp = mnemonicendp;
12242   for (i = strlen (obuf) + prefix_length; i < 6; i++)
12243     oappend (" ");
12244   oappend (" ");
12245   (*info->fprintf_func) (info->stream, "%s", obuf);
12246
12247   /* The enter and bound instructions are printed with operands in the same
12248      order as the intel book; everything else is printed in reverse order.  */
12249   if (intel_syntax || two_source_ops)
12250     {
12251       bfd_vma riprel;
12252
12253       for (i = 0; i < MAX_OPERANDS; ++i)
12254         op_txt[i] = op_out[i];
12255
12256       if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12257           && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12258         {
12259           op_txt[2] = op_out[3];
12260           op_txt[3] = op_out[2];
12261         }
12262
12263       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12264         {
12265           op_ad = op_index[i];
12266           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12267           op_index[MAX_OPERANDS - 1 - i] = op_ad;
12268           riprel = op_riprel[i];
12269           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12270           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12271         }
12272     }
12273   else
12274     {
12275       for (i = 0; i < MAX_OPERANDS; ++i)
12276         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12277     }
12278
12279   needcomma = 0;
12280   for (i = 0; i < MAX_OPERANDS; ++i)
12281     if (*op_txt[i])
12282       {
12283         if (needcomma)
12284           (*info->fprintf_func) (info->stream, ",");
12285         if (op_index[i] != -1 && !op_riprel[i])
12286           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12287         else
12288           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12289         needcomma = 1;
12290       }
12291
12292   for (i = 0; i < MAX_OPERANDS; i++)
12293     if (op_index[i] != -1 && op_riprel[i])
12294       {
12295         (*info->fprintf_func) (info->stream, "        # ");
12296         (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12297                                                 + op_address[op_index[i]]), info);
12298         break;
12299       }
12300   return codep - priv.the_buffer;
12301 }
12302
12303 static const char *float_mem[] = {
12304   /* d8 */
12305   "fadd{s|}",
12306   "fmul{s|}",
12307   "fcom{s|}",
12308   "fcomp{s|}",
12309   "fsub{s|}",
12310   "fsubr{s|}",
12311   "fdiv{s|}",
12312   "fdivr{s|}",
12313   /* d9 */
12314   "fld{s|}",
12315   "(bad)",
12316   "fst{s|}",
12317   "fstp{s|}",
12318   "fldenvIC",
12319   "fldcw",
12320   "fNstenvIC",
12321   "fNstcw",
12322   /* da */
12323   "fiadd{l|}",
12324   "fimul{l|}",
12325   "ficom{l|}",
12326   "ficomp{l|}",
12327   "fisub{l|}",
12328   "fisubr{l|}",
12329   "fidiv{l|}",
12330   "fidivr{l|}",
12331   /* db */
12332   "fild{l|}",
12333   "fisttp{l|}",
12334   "fist{l|}",
12335   "fistp{l|}",
12336   "(bad)",
12337   "fld{t||t|}",
12338   "(bad)",
12339   "fstp{t||t|}",
12340   /* dc */
12341   "fadd{l|}",
12342   "fmul{l|}",
12343   "fcom{l|}",
12344   "fcomp{l|}",
12345   "fsub{l|}",
12346   "fsubr{l|}",
12347   "fdiv{l|}",
12348   "fdivr{l|}",
12349   /* dd */
12350   "fld{l|}",
12351   "fisttp{ll|}",
12352   "fst{l||}",
12353   "fstp{l|}",
12354   "frstorIC",
12355   "(bad)",
12356   "fNsaveIC",
12357   "fNstsw",
12358   /* de */
12359   "fiadd{s|}",
12360   "fimul{s|}",
12361   "ficom{s|}",
12362   "ficomp{s|}",
12363   "fisub{s|}",
12364   "fisubr{s|}",
12365   "fidiv{s|}",
12366   "fidivr{s|}",
12367   /* df */
12368   "fild{s|}",
12369   "fisttp{s|}",
12370   "fist{s|}",
12371   "fistp{s|}",
12372   "fbld",
12373   "fild{ll|}",
12374   "fbstp",
12375   "fistp{ll|}",
12376 };
12377
12378 static const unsigned char float_mem_mode[] = {
12379   /* d8 */
12380   d_mode,
12381   d_mode,
12382   d_mode,
12383   d_mode,
12384   d_mode,
12385   d_mode,
12386   d_mode,
12387   d_mode,
12388   /* d9 */
12389   d_mode,
12390   0,
12391   d_mode,
12392   d_mode,
12393   0,
12394   w_mode,
12395   0,
12396   w_mode,
12397   /* da */
12398   d_mode,
12399   d_mode,
12400   d_mode,
12401   d_mode,
12402   d_mode,
12403   d_mode,
12404   d_mode,
12405   d_mode,
12406   /* db */
12407   d_mode,
12408   d_mode,
12409   d_mode,
12410   d_mode,
12411   0,
12412   t_mode,
12413   0,
12414   t_mode,
12415   /* dc */
12416   q_mode,
12417   q_mode,
12418   q_mode,
12419   q_mode,
12420   q_mode,
12421   q_mode,
12422   q_mode,
12423   q_mode,
12424   /* dd */
12425   q_mode,
12426   q_mode,
12427   q_mode,
12428   q_mode,
12429   0,
12430   0,
12431   0,
12432   w_mode,
12433   /* de */
12434   w_mode,
12435   w_mode,
12436   w_mode,
12437   w_mode,
12438   w_mode,
12439   w_mode,
12440   w_mode,
12441   w_mode,
12442   /* df */
12443   w_mode,
12444   w_mode,
12445   w_mode,
12446   w_mode,
12447   t_mode,
12448   q_mode,
12449   t_mode,
12450   q_mode
12451 };
12452
12453 #define ST { OP_ST, 0 }
12454 #define STi { OP_STi, 0 }
12455
12456 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12457 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12458 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12459 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12460 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12461 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12462 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12463 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12464 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12465
12466 static const struct dis386 float_reg[][8] = {
12467   /* d8 */
12468   {
12469     { "fadd",   { ST, STi }, 0 },
12470     { "fmul",   { ST, STi }, 0 },
12471     { "fcom",   { STi }, 0 },
12472     { "fcomp",  { STi }, 0 },
12473     { "fsub",   { ST, STi }, 0 },
12474     { "fsubr",  { ST, STi }, 0 },
12475     { "fdiv",   { ST, STi }, 0 },
12476     { "fdivr",  { ST, STi }, 0 },
12477   },
12478   /* d9 */
12479   {
12480     { "fld",    { STi }, 0 },
12481     { "fxch",   { STi }, 0 },
12482     { FGRPd9_2 },
12483     { Bad_Opcode },
12484     { FGRPd9_4 },
12485     { FGRPd9_5 },
12486     { FGRPd9_6 },
12487     { FGRPd9_7 },
12488   },
12489   /* da */
12490   {
12491     { "fcmovb", { ST, STi }, 0 },
12492     { "fcmove", { ST, STi }, 0 },
12493     { "fcmovbe",{ ST, STi }, 0 },
12494     { "fcmovu", { ST, STi }, 0 },
12495     { Bad_Opcode },
12496     { FGRPda_5 },
12497     { Bad_Opcode },
12498     { Bad_Opcode },
12499   },
12500   /* db */
12501   {
12502     { "fcmovnb",{ ST, STi }, 0 },
12503     { "fcmovne",{ ST, STi }, 0 },
12504     { "fcmovnbe",{ ST, STi }, 0 },
12505     { "fcmovnu",{ ST, STi }, 0 },
12506     { FGRPdb_4 },
12507     { "fucomi", { ST, STi }, 0 },
12508     { "fcomi",  { ST, STi }, 0 },
12509     { Bad_Opcode },
12510   },
12511   /* dc */
12512   {
12513     { "fadd",   { STi, ST }, 0 },
12514     { "fmul",   { STi, ST }, 0 },
12515     { Bad_Opcode },
12516     { Bad_Opcode },
12517     { "fsub{!M|r}",     { STi, ST }, 0 },
12518     { "fsub{M|}",       { STi, ST }, 0 },
12519     { "fdiv{!M|r}",     { STi, ST }, 0 },
12520     { "fdiv{M|}",       { STi, ST }, 0 },
12521   },
12522   /* dd */
12523   {
12524     { "ffree",  { STi }, 0 },
12525     { Bad_Opcode },
12526     { "fst",    { STi }, 0 },
12527     { "fstp",   { STi }, 0 },
12528     { "fucom",  { STi }, 0 },
12529     { "fucomp", { STi }, 0 },
12530     { Bad_Opcode },
12531     { Bad_Opcode },
12532   },
12533   /* de */
12534   {
12535     { "faddp",  { STi, ST }, 0 },
12536     { "fmulp",  { STi, ST }, 0 },
12537     { Bad_Opcode },
12538     { FGRPde_3 },
12539     { "fsub{!M|r}p",    { STi, ST }, 0 },
12540     { "fsub{M|}p",      { STi, ST }, 0 },
12541     { "fdiv{!M|r}p",    { STi, ST }, 0 },
12542     { "fdiv{M|}p",      { STi, ST }, 0 },
12543   },
12544   /* df */
12545   {
12546     { "ffreep", { STi }, 0 },
12547     { Bad_Opcode },
12548     { Bad_Opcode },
12549     { Bad_Opcode },
12550     { FGRPdf_4 },
12551     { "fucomip", { ST, STi }, 0 },
12552     { "fcomip", { ST, STi }, 0 },
12553     { Bad_Opcode },
12554   },
12555 };
12556
12557 static char *fgrps[][8] = {
12558   /* Bad opcode 0 */
12559   {
12560     "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12561   },
12562
12563   /* d9_2  1 */
12564   {
12565     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12566   },
12567
12568   /* d9_4  2 */
12569   {
12570     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12571   },
12572
12573   /* d9_5  3 */
12574   {
12575     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12576   },
12577
12578   /* d9_6  4 */
12579   {
12580     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12581   },
12582
12583   /* d9_7  5 */
12584   {
12585     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12586   },
12587
12588   /* da_5  6 */
12589   {
12590     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12591   },
12592
12593   /* db_4  7 */
12594   {
12595     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12596     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12597   },
12598
12599   /* de_3  8 */
12600   {
12601     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12602   },
12603
12604   /* df_4  9 */
12605   {
12606     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12607   },
12608 };
12609
12610 static void
12611 swap_operand (void)
12612 {
12613   mnemonicendp[0] = '.';
12614   mnemonicendp[1] = 's';
12615   mnemonicendp += 2;
12616 }
12617
12618 static void
12619 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12620                int sizeflag ATTRIBUTE_UNUSED)
12621 {
12622   /* Skip mod/rm byte.  */
12623   MODRM_CHECK;
12624   codep++;
12625 }
12626
12627 static void
12628 dofloat (int sizeflag)
12629 {
12630   const struct dis386 *dp;
12631   unsigned char floatop;
12632
12633   floatop = codep[-1];
12634
12635   if (modrm.mod != 3)
12636     {
12637       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12638
12639       putop (float_mem[fp_indx], sizeflag);
12640       obufp = op_out[0];
12641       op_ad = 2;
12642       OP_E (float_mem_mode[fp_indx], sizeflag);
12643       return;
12644     }
12645   /* Skip mod/rm byte.  */
12646   MODRM_CHECK;
12647   codep++;
12648
12649   dp = &float_reg[floatop - 0xd8][modrm.reg];
12650   if (dp->name == NULL)
12651     {
12652       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12653
12654       /* Instruction fnstsw is only one with strange arg.  */
12655       if (floatop == 0xdf && codep[-1] == 0xe0)
12656         strcpy (op_out[0], names16[0]);
12657     }
12658   else
12659     {
12660       putop (dp->name, sizeflag);
12661
12662       obufp = op_out[0];
12663       op_ad = 2;
12664       if (dp->op[0].rtn)
12665         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12666
12667       obufp = op_out[1];
12668       op_ad = 1;
12669       if (dp->op[1].rtn)
12670         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12671     }
12672 }
12673
12674 /* Like oappend (below), but S is a string starting with '%'.
12675    In Intel syntax, the '%' is elided.  */
12676 static void
12677 oappend_maybe_intel (const char *s)
12678 {
12679   oappend (s + intel_syntax);
12680 }
12681
12682 static void
12683 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12684 {
12685   oappend_maybe_intel ("%st");
12686 }
12687
12688 static void
12689 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12690 {
12691   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12692   oappend_maybe_intel (scratchbuf);
12693 }
12694
12695 /* Capital letters in template are macros.  */
12696 static int
12697 putop (const char *in_template, int sizeflag)
12698 {
12699   const char *p;
12700   int alt = 0;
12701   int cond = 1;
12702   unsigned int l = 0, len = 1;
12703   char last[4];
12704
12705 #define SAVE_LAST(c)                    \
12706   if (l < len && l < sizeof (last))     \
12707     last[l++] = c;                      \
12708   else                                  \
12709     abort ();
12710
12711   for (p = in_template; *p; p++)
12712     {
12713       switch (*p)
12714         {
12715         default:
12716           *obufp++ = *p;
12717           break;
12718         case '%':
12719           len++;
12720           break;
12721         case '!':
12722           cond = 0;
12723           break;
12724         case '{':
12725           if (intel_syntax)
12726             {
12727               while (*++p != '|')
12728                 if (*p == '}' || *p == '\0')
12729                   abort ();
12730             }
12731           /* Fall through.  */
12732         case 'I':
12733           alt = 1;
12734           continue;
12735         case '|':
12736           while (*++p != '}')
12737             {
12738               if (*p == '\0')
12739                 abort ();
12740             }
12741           break;
12742         case '}':
12743           break;
12744         case 'A':
12745           if (intel_syntax)
12746             break;
12747           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12748             *obufp++ = 'b';
12749           break;
12750         case 'B':
12751           if (l == 0 && len == 1)
12752             {
12753 case_B:
12754               if (intel_syntax)
12755                 break;
12756               if (sizeflag & SUFFIX_ALWAYS)
12757                 *obufp++ = 'b';
12758             }
12759           else
12760             {
12761               if (l != 1
12762                   || len != 2
12763                   || last[0] != 'L')
12764                 {
12765                   SAVE_LAST (*p);
12766                   break;
12767                 }
12768
12769               if (address_mode == mode_64bit
12770                   && !(prefixes & PREFIX_ADDR))
12771                 {
12772                   *obufp++ = 'a';
12773                   *obufp++ = 'b';
12774                   *obufp++ = 's';
12775                 }
12776
12777               goto case_B;
12778             }
12779           break;
12780         case 'C':
12781           if (intel_syntax && !alt)
12782             break;
12783           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12784             {
12785               if (sizeflag & DFLAG)
12786                 *obufp++ = intel_syntax ? 'd' : 'l';
12787               else
12788                 *obufp++ = intel_syntax ? 'w' : 's';
12789               used_prefixes |= (prefixes & PREFIX_DATA);
12790             }
12791           break;
12792         case 'D':
12793           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12794             break;
12795           USED_REX (REX_W);
12796           if (modrm.mod == 3)
12797             {
12798               if (rex & REX_W)
12799                 *obufp++ = 'q';
12800               else
12801                 {
12802                   if (sizeflag & DFLAG)
12803                     *obufp++ = intel_syntax ? 'd' : 'l';
12804                   else
12805                     *obufp++ = 'w';
12806                   used_prefixes |= (prefixes & PREFIX_DATA);
12807                 }
12808             }
12809           else
12810             *obufp++ = 'w';
12811           break;
12812         case 'E':               /* For jcxz/jecxz */
12813           if (address_mode == mode_64bit)
12814             {
12815               if (sizeflag & AFLAG)
12816                 *obufp++ = 'r';
12817               else
12818                 *obufp++ = 'e';
12819             }
12820           else
12821             if (sizeflag & AFLAG)
12822               *obufp++ = 'e';
12823           used_prefixes |= (prefixes & PREFIX_ADDR);
12824           break;
12825         case 'F':
12826           if (intel_syntax)
12827             break;
12828           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12829             {
12830               if (sizeflag & AFLAG)
12831                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12832               else
12833                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12834               used_prefixes |= (prefixes & PREFIX_ADDR);
12835             }
12836           break;
12837         case 'G':
12838           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12839             break;
12840           if ((rex & REX_W) || (sizeflag & DFLAG))
12841             *obufp++ = 'l';
12842           else
12843             *obufp++ = 'w';
12844           if (!(rex & REX_W))
12845             used_prefixes |= (prefixes & PREFIX_DATA);
12846           break;
12847         case 'H':
12848           if (intel_syntax)
12849             break;
12850           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12851               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12852             {
12853               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12854               *obufp++ = ',';
12855               *obufp++ = 'p';
12856               if (prefixes & PREFIX_DS)
12857                 *obufp++ = 't';
12858               else
12859                 *obufp++ = 'n';
12860             }
12861           break;
12862         case 'J':
12863           if (intel_syntax)
12864             break;
12865           *obufp++ = 'l';
12866           break;
12867         case 'K':
12868           USED_REX (REX_W);
12869           if (rex & REX_W)
12870             *obufp++ = 'q';
12871           else
12872             *obufp++ = 'd';
12873           break;
12874         case 'Z':
12875           if (l != 0 || len != 1)
12876             {
12877               if (l != 1 || len != 2 || last[0] != 'X')
12878                 {
12879                   SAVE_LAST (*p);
12880                   break;
12881                 }
12882               if (!need_vex || !vex.evex)
12883                 abort ();
12884               if (intel_syntax
12885                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12886                 break;
12887               switch (vex.length)
12888                 {
12889                 case 128:
12890                   *obufp++ = 'x';
12891                   break;
12892                 case 256:
12893                   *obufp++ = 'y';
12894                   break;
12895                 case 512:
12896                   *obufp++ = 'z';
12897                   break;
12898                 default:
12899                   abort ();
12900                 }
12901               break;
12902             }
12903           if (intel_syntax)
12904             break;
12905           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12906             {
12907               *obufp++ = 'q';
12908               break;
12909             }
12910           /* Fall through.  */
12911           goto case_L;
12912         case 'L':
12913           if (l != 0 || len != 1)
12914             {
12915               SAVE_LAST (*p);
12916               break;
12917             }
12918 case_L:
12919           if (intel_syntax)
12920             break;
12921           if (sizeflag & SUFFIX_ALWAYS)
12922             *obufp++ = 'l';
12923           break;
12924         case 'M':
12925           if (intel_mnemonic != cond)
12926             *obufp++ = 'r';
12927           break;
12928         case 'N':
12929           if ((prefixes & PREFIX_FWAIT) == 0)
12930             *obufp++ = 'n';
12931           else
12932             used_prefixes |= PREFIX_FWAIT;
12933           break;
12934         case 'O':
12935           USED_REX (REX_W);
12936           if (rex & REX_W)
12937             *obufp++ = 'o';
12938           else if (intel_syntax && (sizeflag & DFLAG))
12939             *obufp++ = 'q';
12940           else
12941             *obufp++ = 'd';
12942           if (!(rex & REX_W))
12943             used_prefixes |= (prefixes & PREFIX_DATA);
12944           break;
12945         case '&':
12946           if (!intel_syntax
12947               && address_mode == mode_64bit
12948               && isa64 == intel64)
12949             {
12950               *obufp++ = 'q';
12951               break;
12952             }
12953           /* Fall through.  */
12954         case 'T':
12955           if (!intel_syntax
12956               && address_mode == mode_64bit
12957               && ((sizeflag & DFLAG) || (rex & REX_W)))
12958             {
12959               *obufp++ = 'q';
12960               break;
12961             }
12962           /* Fall through.  */
12963           goto case_P;
12964         case 'P':
12965           if (l == 0 && len == 1)
12966             {
12967 case_P:
12968               if (intel_syntax)
12969                 {
12970                   if ((rex & REX_W) == 0
12971                       && (prefixes & PREFIX_DATA))
12972                     {
12973                       if ((sizeflag & DFLAG) == 0)
12974                         *obufp++ = 'w';
12975                       used_prefixes |= (prefixes & PREFIX_DATA);
12976                     }
12977                   break;
12978                 }
12979               if ((prefixes & PREFIX_DATA)
12980                   || (rex & REX_W)
12981                   || (sizeflag & SUFFIX_ALWAYS))
12982                 {
12983                   USED_REX (REX_W);
12984                   if (rex & REX_W)
12985                     *obufp++ = 'q';
12986                   else
12987                     {
12988                       if (sizeflag & DFLAG)
12989                         *obufp++ = 'l';
12990                       else
12991                         *obufp++ = 'w';
12992                       used_prefixes |= (prefixes & PREFIX_DATA);
12993                     }
12994                 }
12995             }
12996           else
12997             {
12998               if (l != 1 || len != 2 || last[0] != 'L')
12999                 {
13000                   SAVE_LAST (*p);
13001                   break;
13002                 }
13003
13004               if ((prefixes & PREFIX_DATA)
13005                   || (rex & REX_W)
13006                   || (sizeflag & SUFFIX_ALWAYS))
13007                 {
13008                   USED_REX (REX_W);
13009                   if (rex & REX_W)
13010                     *obufp++ = 'q';
13011                   else
13012                     {
13013                       if (sizeflag & DFLAG)
13014                         *obufp++ = intel_syntax ? 'd' : 'l';
13015                       else
13016                         *obufp++ = 'w';
13017                       used_prefixes |= (prefixes & PREFIX_DATA);
13018                     }
13019                 }
13020             }
13021           break;
13022         case 'U':
13023           if (intel_syntax)
13024             break;
13025           if (address_mode == mode_64bit
13026               && ((sizeflag & DFLAG) || (rex & REX_W)))
13027             {
13028               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13029                 *obufp++ = 'q';
13030               break;
13031             }
13032           /* Fall through.  */
13033           goto case_Q;
13034         case 'Q':
13035           if (l == 0 && len == 1)
13036             {
13037 case_Q:
13038               if (intel_syntax && !alt)
13039                 break;
13040               USED_REX (REX_W);
13041               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13042                 {
13043                   if (rex & REX_W)
13044                     *obufp++ = 'q';
13045                   else
13046                     {
13047                       if (sizeflag & DFLAG)
13048                         *obufp++ = intel_syntax ? 'd' : 'l';
13049                       else
13050                         *obufp++ = 'w';
13051                       used_prefixes |= (prefixes & PREFIX_DATA);
13052                     }
13053                 }
13054             }
13055           else
13056             {
13057               if (l != 1 || len != 2 || last[0] != 'L')
13058                 {
13059                   SAVE_LAST (*p);
13060                   break;
13061                 }
13062               if (intel_syntax
13063                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13064                 break;
13065               if ((rex & REX_W))
13066                 {
13067                   USED_REX (REX_W);
13068                   *obufp++ = 'q';
13069                 }
13070               else
13071                 *obufp++ = 'l';
13072             }
13073           break;
13074         case 'R':
13075           USED_REX (REX_W);
13076           if (rex & REX_W)
13077             *obufp++ = 'q';
13078           else if (sizeflag & DFLAG)
13079             {
13080               if (intel_syntax)
13081                   *obufp++ = 'd';
13082               else
13083                   *obufp++ = 'l';
13084             }
13085           else
13086             *obufp++ = 'w';
13087           if (intel_syntax && !p[1]
13088               && ((rex & REX_W) || (sizeflag & DFLAG)))
13089             *obufp++ = 'e';
13090           if (!(rex & REX_W))
13091             used_prefixes |= (prefixes & PREFIX_DATA);
13092           break;
13093         case 'V':
13094           if (l == 0 && len == 1)
13095             {
13096               if (intel_syntax)
13097                 break;
13098               if (address_mode == mode_64bit
13099                   && ((sizeflag & DFLAG) || (rex & REX_W)))
13100                 {
13101                   if (sizeflag & SUFFIX_ALWAYS)
13102                     *obufp++ = 'q';
13103                   break;
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 (rex & REX_W)
13117                 {
13118                   *obufp++ = 'a';
13119                   *obufp++ = 'b';
13120                   *obufp++ = 's';
13121                 }
13122             }
13123           /* Fall through.  */
13124           goto case_S;
13125         case 'S':
13126           if (l == 0 && len == 1)
13127             {
13128 case_S:
13129               if (intel_syntax)
13130                 break;
13131               if (sizeflag & SUFFIX_ALWAYS)
13132                 {
13133                   if (rex & REX_W)
13134                     *obufp++ = 'q';
13135                   else
13136                     {
13137                       if (sizeflag & DFLAG)
13138                         *obufp++ = 'l';
13139                       else
13140                         *obufp++ = 'w';
13141                       used_prefixes |= (prefixes & PREFIX_DATA);
13142                     }
13143                 }
13144             }
13145           else
13146             {
13147               if (l != 1
13148                   || len != 2
13149                   || last[0] != 'L')
13150                 {
13151                   SAVE_LAST (*p);
13152                   break;
13153                 }
13154
13155               if (address_mode == mode_64bit
13156                   && !(prefixes & PREFIX_ADDR))
13157                 {
13158                   *obufp++ = 'a';
13159                   *obufp++ = 'b';
13160                   *obufp++ = 's';
13161                 }
13162
13163               goto case_S;
13164             }
13165           break;
13166         case 'X':
13167           if (l != 0 || len != 1)
13168             {
13169               SAVE_LAST (*p);
13170               break;
13171             }
13172           if (need_vex && vex.prefix)
13173             {
13174               if (vex.prefix == DATA_PREFIX_OPCODE)
13175                 *obufp++ = 'd';
13176               else
13177                 *obufp++ = 's';
13178             }
13179           else
13180             {
13181               if (prefixes & PREFIX_DATA)
13182                 *obufp++ = 'd';
13183               else
13184                 *obufp++ = 's';
13185               used_prefixes |= (prefixes & PREFIX_DATA);
13186             }
13187           break;
13188         case 'Y':
13189           if (l == 0 && len == 1)
13190             abort ();
13191           else
13192             {
13193               if (l != 1 || len != 2 || last[0] != 'X')
13194                 {
13195                   SAVE_LAST (*p);
13196                   break;
13197                 }
13198               if (!need_vex)
13199                 abort ();
13200               if (intel_syntax
13201                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13202                 break;
13203               switch (vex.length)
13204                 {
13205                 case 128:
13206                   *obufp++ = 'x';
13207                   break;
13208                 case 256:
13209                   *obufp++ = 'y';
13210                   break;
13211                 case 512:
13212                   if (!vex.evex)
13213                 default:
13214                     abort ();
13215                 }
13216             }
13217           break;
13218         case 'W':
13219           if (l == 0 && len == 1)
13220             {
13221               /* operand size flag for cwtl, cbtw */
13222               USED_REX (REX_W);
13223               if (rex & REX_W)
13224                 {
13225                   if (intel_syntax)
13226                     *obufp++ = 'd';
13227                   else
13228                     *obufp++ = 'l';
13229                 }
13230               else if (sizeflag & DFLAG)
13231                 *obufp++ = 'w';
13232               else
13233                 *obufp++ = 'b';
13234               if (!(rex & REX_W))
13235                 used_prefixes |= (prefixes & PREFIX_DATA);
13236             }
13237           else
13238             {
13239               if (l != 1
13240                   || len != 2
13241                   || (last[0] != 'X'
13242                       && last[0] != 'L'))
13243                 {
13244                   SAVE_LAST (*p);
13245                   break;
13246                 }
13247               if (!need_vex)
13248                 abort ();
13249               if (last[0] == 'X')
13250                 *obufp++ = vex.w ? 'd': 's';
13251               else
13252                 *obufp++ = vex.w ? 'q': 'd';
13253             }
13254           break;
13255         case '^':
13256           if (intel_syntax)
13257             break;
13258           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13259             {
13260               if (sizeflag & DFLAG)
13261                 *obufp++ = 'l';
13262               else
13263                 *obufp++ = 'w';
13264               used_prefixes |= (prefixes & PREFIX_DATA);
13265             }
13266           break;
13267         case '@':
13268           if (intel_syntax)
13269             break;
13270           if (address_mode == mode_64bit
13271               && (isa64 == intel64
13272                   || ((sizeflag & DFLAG) || (rex & REX_W))))
13273               *obufp++ = 'q';
13274           else if ((prefixes & PREFIX_DATA))
13275             {
13276               if (!(sizeflag & DFLAG))
13277                 *obufp++ = 'w';
13278               used_prefixes |= (prefixes & PREFIX_DATA);
13279             }
13280           break;
13281         }
13282       alt = 0;
13283     }
13284   *obufp = 0;
13285   mnemonicendp = obufp;
13286   return 0;
13287 }
13288
13289 static void
13290 oappend (const char *s)
13291 {
13292   obufp = stpcpy (obufp, s);
13293 }
13294
13295 static void
13296 append_seg (void)
13297 {
13298   /* Only print the active segment register.  */
13299   if (!active_seg_prefix)
13300     return;
13301
13302   used_prefixes |= active_seg_prefix;
13303   switch (active_seg_prefix)
13304     {
13305     case PREFIX_CS:
13306       oappend_maybe_intel ("%cs:");
13307       break;
13308     case PREFIX_DS:
13309       oappend_maybe_intel ("%ds:");
13310       break;
13311     case PREFIX_SS:
13312       oappend_maybe_intel ("%ss:");
13313       break;
13314     case PREFIX_ES:
13315       oappend_maybe_intel ("%es:");
13316       break;
13317     case PREFIX_FS:
13318       oappend_maybe_intel ("%fs:");
13319       break;
13320     case PREFIX_GS:
13321       oappend_maybe_intel ("%gs:");
13322       break;
13323     default:
13324       break;
13325     }
13326 }
13327
13328 static void
13329 OP_indirE (int bytemode, int sizeflag)
13330 {
13331   if (!intel_syntax)
13332     oappend ("*");
13333   OP_E (bytemode, sizeflag);
13334 }
13335
13336 static void
13337 print_operand_value (char *buf, int hex, bfd_vma disp)
13338 {
13339   if (address_mode == mode_64bit)
13340     {
13341       if (hex)
13342         {
13343           char tmp[30];
13344           int i;
13345           buf[0] = '0';
13346           buf[1] = 'x';
13347           sprintf_vma (tmp, disp);
13348           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13349           strcpy (buf + 2, tmp + i);
13350         }
13351       else
13352         {
13353           bfd_signed_vma v = disp;
13354           char tmp[30];
13355           int i;
13356           if (v < 0)
13357             {
13358               *(buf++) = '-';
13359               v = -disp;
13360               /* Check for possible overflow on 0x8000000000000000.  */
13361               if (v < 0)
13362                 {
13363                   strcpy (buf, "9223372036854775808");
13364                   return;
13365                 }
13366             }
13367           if (!v)
13368             {
13369               strcpy (buf, "0");
13370               return;
13371             }
13372
13373           i = 0;
13374           tmp[29] = 0;
13375           while (v)
13376             {
13377               tmp[28 - i] = (v % 10) + '0';
13378               v /= 10;
13379               i++;
13380             }
13381           strcpy (buf, tmp + 29 - i);
13382         }
13383     }
13384   else
13385     {
13386       if (hex)
13387         sprintf (buf, "0x%x", (unsigned int) disp);
13388       else
13389         sprintf (buf, "%d", (int) disp);
13390     }
13391 }
13392
13393 /* Put DISP in BUF as signed hex number.  */
13394
13395 static void
13396 print_displacement (char *buf, bfd_vma disp)
13397 {
13398   bfd_signed_vma val = disp;
13399   char tmp[30];
13400   int i, j = 0;
13401
13402   if (val < 0)
13403     {
13404       buf[j++] = '-';
13405       val = -disp;
13406
13407       /* Check for possible overflow.  */
13408       if (val < 0)
13409         {
13410           switch (address_mode)
13411             {
13412             case mode_64bit:
13413               strcpy (buf + j, "0x8000000000000000");
13414               break;
13415             case mode_32bit:
13416               strcpy (buf + j, "0x80000000");
13417               break;
13418             case mode_16bit:
13419               strcpy (buf + j, "0x8000");
13420               break;
13421             }
13422           return;
13423         }
13424     }
13425
13426   buf[j++] = '0';
13427   buf[j++] = 'x';
13428
13429   sprintf_vma (tmp, (bfd_vma) val);
13430   for (i = 0; tmp[i] == '0'; i++)
13431     continue;
13432   if (tmp[i] == '\0')
13433     i--;
13434   strcpy (buf + j, tmp + i);
13435 }
13436
13437 static void
13438 intel_operand_size (int bytemode, int sizeflag)
13439 {
13440   if (vex.evex
13441       && vex.b
13442       && (bytemode == x_mode
13443           || bytemode == evex_half_bcst_xmmq_mode))
13444     {
13445       if (vex.w)
13446         oappend ("QWORD PTR ");
13447       else
13448         oappend ("DWORD PTR ");
13449       return;
13450     }
13451   switch (bytemode)
13452     {
13453     case b_mode:
13454     case b_swap_mode:
13455     case dqb_mode:
13456     case db_mode:
13457       oappend ("BYTE PTR ");
13458       break;
13459     case w_mode:
13460     case dw_mode:
13461     case dqw_mode:
13462       oappend ("WORD PTR ");
13463       break;
13464     case indir_v_mode:
13465       if (address_mode == mode_64bit && isa64 == intel64)
13466         {
13467           oappend ("QWORD PTR ");
13468           break;
13469         }
13470       /* Fall through.  */
13471     case stack_v_mode:
13472       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13473         {
13474           oappend ("QWORD PTR ");
13475           break;
13476         }
13477       /* Fall through.  */
13478     case v_mode:
13479     case v_swap_mode:
13480     case dq_mode:
13481       USED_REX (REX_W);
13482       if (rex & REX_W)
13483         oappend ("QWORD PTR ");
13484       else
13485         {
13486           if ((sizeflag & DFLAG) || bytemode == dq_mode)
13487             oappend ("DWORD PTR ");
13488           else
13489             oappend ("WORD PTR ");
13490           used_prefixes |= (prefixes & PREFIX_DATA);
13491         }
13492       break;
13493     case z_mode:
13494       if ((rex & REX_W) || (sizeflag & DFLAG))
13495         *obufp++ = 'D';
13496       oappend ("WORD PTR ");
13497       if (!(rex & REX_W))
13498         used_prefixes |= (prefixes & PREFIX_DATA);
13499       break;
13500     case a_mode:
13501       if (sizeflag & DFLAG)
13502         oappend ("QWORD PTR ");
13503       else
13504         oappend ("DWORD PTR ");
13505       used_prefixes |= (prefixes & PREFIX_DATA);
13506       break;
13507     case d_mode:
13508     case d_scalar_mode:
13509     case d_scalar_swap_mode:
13510     case d_swap_mode:
13511     case dqd_mode:
13512       oappend ("DWORD PTR ");
13513       break;
13514     case q_mode:
13515     case q_scalar_mode:
13516     case q_scalar_swap_mode:
13517     case q_swap_mode:
13518       oappend ("QWORD PTR ");
13519       break;
13520     case m_mode:
13521       if (address_mode == mode_64bit)
13522         oappend ("QWORD PTR ");
13523       else
13524         oappend ("DWORD PTR ");
13525       break;
13526     case f_mode:
13527       if (sizeflag & DFLAG)
13528         oappend ("FWORD PTR ");
13529       else
13530         oappend ("DWORD PTR ");
13531       used_prefixes |= (prefixes & PREFIX_DATA);
13532       break;
13533     case t_mode:
13534       oappend ("TBYTE PTR ");
13535       break;
13536     case x_mode:
13537     case x_swap_mode:
13538     case evex_x_gscat_mode:
13539     case evex_x_nobcst_mode:
13540     case b_scalar_mode:
13541     case w_scalar_mode:
13542       if (need_vex)
13543         {
13544           switch (vex.length)
13545             {
13546             case 128:
13547               oappend ("XMMWORD PTR ");
13548               break;
13549             case 256:
13550               oappend ("YMMWORD PTR ");
13551               break;
13552             case 512:
13553               oappend ("ZMMWORD PTR ");
13554               break;
13555             default:
13556               abort ();
13557             }
13558         }
13559       else
13560         oappend ("XMMWORD PTR ");
13561       break;
13562     case xmm_mode:
13563       oappend ("XMMWORD PTR ");
13564       break;
13565     case ymm_mode:
13566       oappend ("YMMWORD PTR ");
13567       break;
13568     case xmmq_mode:
13569     case evex_half_bcst_xmmq_mode:
13570       if (!need_vex)
13571         abort ();
13572
13573       switch (vex.length)
13574         {
13575         case 128:
13576           oappend ("QWORD PTR ");
13577           break;
13578         case 256:
13579           oappend ("XMMWORD PTR ");
13580           break;
13581         case 512:
13582           oappend ("YMMWORD PTR ");
13583           break;
13584         default:
13585           abort ();
13586         }
13587       break;
13588     case xmm_mb_mode:
13589       if (!need_vex)
13590         abort ();
13591
13592       switch (vex.length)
13593         {
13594         case 128:
13595         case 256:
13596         case 512:
13597           oappend ("BYTE PTR ");
13598           break;
13599         default:
13600           abort ();
13601         }
13602       break;
13603     case xmm_mw_mode:
13604       if (!need_vex)
13605         abort ();
13606
13607       switch (vex.length)
13608         {
13609         case 128:
13610         case 256:
13611         case 512:
13612           oappend ("WORD PTR ");
13613           break;
13614         default:
13615           abort ();
13616         }
13617       break;
13618     case xmm_md_mode:
13619       if (!need_vex)
13620         abort ();
13621
13622       switch (vex.length)
13623         {
13624         case 128:
13625         case 256:
13626         case 512:
13627           oappend ("DWORD PTR ");
13628           break;
13629         default:
13630           abort ();
13631         }
13632       break;
13633     case xmm_mq_mode:
13634       if (!need_vex)
13635         abort ();
13636
13637       switch (vex.length)
13638         {
13639         case 128:
13640         case 256:
13641         case 512:
13642           oappend ("QWORD PTR ");
13643           break;
13644         default:
13645           abort ();
13646         }
13647       break;
13648     case xmmdw_mode:
13649       if (!need_vex)
13650         abort ();
13651
13652       switch (vex.length)
13653         {
13654         case 128:
13655           oappend ("WORD PTR ");
13656           break;
13657         case 256:
13658           oappend ("DWORD PTR ");
13659           break;
13660         case 512:
13661           oappend ("QWORD PTR ");
13662           break;
13663         default:
13664           abort ();
13665         }
13666       break;
13667     case xmmqd_mode:
13668       if (!need_vex)
13669         abort ();
13670
13671       switch (vex.length)
13672         {
13673         case 128:
13674           oappend ("DWORD PTR ");
13675           break;
13676         case 256:
13677           oappend ("QWORD PTR ");
13678           break;
13679         case 512:
13680           oappend ("XMMWORD PTR ");
13681           break;
13682         default:
13683           abort ();
13684         }
13685       break;
13686     case ymmq_mode:
13687       if (!need_vex)
13688         abort ();
13689
13690       switch (vex.length)
13691         {
13692         case 128:
13693           oappend ("QWORD PTR ");
13694           break;
13695         case 256:
13696           oappend ("YMMWORD PTR ");
13697           break;
13698         case 512:
13699           oappend ("ZMMWORD PTR ");
13700           break;
13701         default:
13702           abort ();
13703         }
13704       break;
13705     case ymmxmm_mode:
13706       if (!need_vex)
13707         abort ();
13708
13709       switch (vex.length)
13710         {
13711         case 128:
13712         case 256:
13713           oappend ("XMMWORD PTR ");
13714           break;
13715         default:
13716           abort ();
13717         }
13718       break;
13719     case o_mode:
13720       oappend ("OWORD PTR ");
13721       break;
13722     case xmm_mdq_mode:
13723     case vex_w_dq_mode:
13724     case vex_scalar_w_dq_mode:
13725       if (!need_vex)
13726         abort ();
13727
13728       if (vex.w)
13729         oappend ("QWORD PTR ");
13730       else
13731         oappend ("DWORD PTR ");
13732       break;
13733     case vex_vsib_d_w_dq_mode:
13734     case vex_vsib_q_w_dq_mode:
13735       if (!need_vex)
13736         abort ();
13737
13738       if (!vex.evex)
13739         {
13740           if (vex.w)
13741             oappend ("QWORD PTR ");
13742           else
13743             oappend ("DWORD PTR ");
13744         }
13745       else
13746         {
13747           switch (vex.length)
13748             {
13749             case 128:
13750               oappend ("XMMWORD PTR ");
13751               break;
13752             case 256:
13753               oappend ("YMMWORD PTR ");
13754               break;
13755             case 512:
13756               oappend ("ZMMWORD PTR ");
13757               break;
13758             default:
13759               abort ();
13760             }
13761         }
13762       break;
13763     case vex_vsib_q_w_d_mode:
13764     case vex_vsib_d_w_d_mode:
13765       if (!need_vex || !vex.evex)
13766         abort ();
13767
13768       switch (vex.length)
13769         {
13770         case 128:
13771           oappend ("QWORD PTR ");
13772           break;
13773         case 256:
13774           oappend ("XMMWORD PTR ");
13775           break;
13776         case 512:
13777           oappend ("YMMWORD PTR ");
13778           break;
13779         default:
13780           abort ();
13781         }
13782
13783       break;
13784     case mask_bd_mode:
13785       if (!need_vex || vex.length != 128)
13786         abort ();
13787       if (vex.w)
13788         oappend ("DWORD PTR ");
13789       else
13790         oappend ("BYTE PTR ");
13791       break;
13792     case mask_mode:
13793       if (!need_vex)
13794         abort ();
13795       if (vex.w)
13796         oappend ("QWORD PTR ");
13797       else
13798         oappend ("WORD PTR ");
13799       break;
13800     case v_bnd_mode:
13801     case v_bndmk_mode:
13802     default:
13803       break;
13804     }
13805 }
13806
13807 static void
13808 OP_E_register (int bytemode, int sizeflag)
13809 {
13810   int reg = modrm.rm;
13811   const char **names;
13812
13813   USED_REX (REX_B);
13814   if ((rex & REX_B))
13815     reg += 8;
13816
13817   if ((sizeflag & SUFFIX_ALWAYS)
13818       && (bytemode == b_swap_mode
13819           || bytemode == bnd_swap_mode
13820           || bytemode == v_swap_mode))
13821     swap_operand ();
13822
13823   switch (bytemode)
13824     {
13825     case b_mode:
13826     case b_swap_mode:
13827       USED_REX (0);
13828       if (rex)
13829         names = names8rex;
13830       else
13831         names = names8;
13832       break;
13833     case w_mode:
13834       names = names16;
13835       break;
13836     case d_mode:
13837     case dw_mode:
13838     case db_mode:
13839       names = names32;
13840       break;
13841     case q_mode:
13842       names = names64;
13843       break;
13844     case m_mode:
13845     case v_bnd_mode:
13846       names = address_mode == mode_64bit ? names64 : names32;
13847       break;
13848     case bnd_mode:
13849     case bnd_swap_mode:
13850       if (reg > 0x3)
13851         {
13852           oappend ("(bad)");
13853           return;
13854         }
13855       names = names_bnd;
13856       break;
13857     case indir_v_mode:
13858       if (address_mode == mode_64bit && isa64 == intel64)
13859         {
13860           names = names64;
13861           break;
13862         }
13863       /* Fall through.  */
13864     case stack_v_mode:
13865       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13866         {
13867           names = names64;
13868           break;
13869         }
13870       bytemode = v_mode;
13871       /* Fall through.  */
13872     case v_mode:
13873     case v_swap_mode:
13874     case dq_mode:
13875     case dqb_mode:
13876     case dqd_mode:
13877     case dqw_mode:
13878       USED_REX (REX_W);
13879       if (rex & REX_W)
13880         names = names64;
13881       else
13882         {
13883           if ((sizeflag & DFLAG)
13884               || (bytemode != v_mode
13885                   && bytemode != v_swap_mode))
13886             names = names32;
13887           else
13888             names = names16;
13889           used_prefixes |= (prefixes & PREFIX_DATA);
13890         }
13891       break;
13892     case va_mode:
13893       names = (address_mode == mode_64bit
13894                ? names64 : names32);
13895       if (!(prefixes & PREFIX_ADDR))
13896         names = (address_mode == mode_16bit
13897                      ? names16 : names);
13898       else
13899         {
13900           /* Remove "addr16/addr32".  */
13901           all_prefixes[last_addr_prefix] = 0;
13902           names = (address_mode != mode_32bit
13903                        ? names32 : names16);
13904           used_prefixes |= PREFIX_ADDR;
13905         }
13906       break;
13907     case mask_bd_mode:
13908     case mask_mode:
13909       if (reg > 0x7)
13910         {
13911           oappend ("(bad)");
13912           return;
13913         }
13914       names = names_mask;
13915       break;
13916     case 0:
13917       return;
13918     default:
13919       oappend (INTERNAL_DISASSEMBLER_ERROR);
13920       return;
13921     }
13922   oappend (names[reg]);
13923 }
13924
13925 static void
13926 OP_E_memory (int bytemode, int sizeflag)
13927 {
13928   bfd_vma disp = 0;
13929   int add = (rex & REX_B) ? 8 : 0;
13930   int riprel = 0;
13931   int shift;
13932
13933   if (vex.evex)
13934     {
13935       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
13936       if (vex.b
13937           && bytemode != x_mode
13938           && bytemode != xmmq_mode
13939           && bytemode != evex_half_bcst_xmmq_mode)
13940         {
13941           BadOp ();
13942           return;
13943         }
13944       switch (bytemode)
13945         {
13946         case dqw_mode:
13947         case dw_mode:
13948           shift = 1;
13949           break;
13950         case dqb_mode:
13951         case db_mode:
13952           shift = 0;
13953           break;
13954         case dq_mode:
13955           if (address_mode != mode_64bit)
13956             {
13957               shift = 2;
13958               break;
13959             }
13960             /* fall through */
13961         case vex_vsib_d_w_dq_mode:
13962         case vex_vsib_d_w_d_mode:
13963         case vex_vsib_q_w_dq_mode:
13964         case vex_vsib_q_w_d_mode:
13965         case evex_x_gscat_mode:
13966         case xmm_mdq_mode:
13967           shift = vex.w ? 3 : 2;
13968           break;
13969         case x_mode:
13970         case evex_half_bcst_xmmq_mode:
13971         case xmmq_mode:
13972           if (vex.b)
13973             {
13974               shift = vex.w ? 3 : 2;
13975               break;
13976             }
13977           /* Fall through.  */
13978         case xmmqd_mode:
13979         case xmmdw_mode:
13980         case ymmq_mode:
13981         case evex_x_nobcst_mode:
13982         case x_swap_mode:
13983           switch (vex.length)
13984             {
13985             case 128:
13986               shift = 4;
13987               break;
13988             case 256:
13989               shift = 5;
13990               break;
13991             case 512:
13992               shift = 6;
13993               break;
13994             default:
13995               abort ();
13996             }
13997           break;
13998         case ymm_mode:
13999           shift = 5;
14000           break;
14001         case xmm_mode:
14002           shift = 4;
14003           break;
14004         case xmm_mq_mode:
14005         case q_mode:
14006         case q_scalar_mode:
14007         case q_swap_mode:
14008         case q_scalar_swap_mode:
14009           shift = 3;
14010           break;
14011         case dqd_mode:
14012         case xmm_md_mode:
14013         case d_mode:
14014         case d_scalar_mode:
14015         case d_swap_mode:
14016         case d_scalar_swap_mode:
14017           shift = 2;
14018           break;
14019         case w_scalar_mode:
14020         case xmm_mw_mode:
14021           shift = 1;
14022           break;
14023         case b_scalar_mode:
14024         case xmm_mb_mode:
14025           shift = 0;
14026           break;
14027         default:
14028           abort ();
14029         }
14030       /* Make necessary corrections to shift for modes that need it.
14031          For these modes we currently have shift 4, 5 or 6 depending on
14032          vex.length (it corresponds to xmmword, ymmword or zmmword
14033          operand).  We might want to make it 3, 4 or 5 (e.g. for
14034          xmmq_mode).  In case of broadcast enabled the corrections
14035          aren't needed, as element size is always 32 or 64 bits.  */
14036       if (!vex.b
14037           && (bytemode == xmmq_mode
14038               || bytemode == evex_half_bcst_xmmq_mode))
14039         shift -= 1;
14040       else if (bytemode == xmmqd_mode)
14041         shift -= 2;
14042       else if (bytemode == xmmdw_mode)
14043         shift -= 3;
14044       else if (bytemode == ymmq_mode && vex.length == 128)
14045         shift -= 1;
14046     }
14047   else
14048     shift = 0;
14049
14050   USED_REX (REX_B);
14051   if (intel_syntax)
14052     intel_operand_size (bytemode, sizeflag);
14053   append_seg ();
14054
14055   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14056     {
14057       /* 32/64 bit address mode */
14058       int havedisp;
14059       int havesib;
14060       int havebase;
14061       int haveindex;
14062       int needindex;
14063       int needaddr32;
14064       int base, rbase;
14065       int vindex = 0;
14066       int scale = 0;
14067       int addr32flag = !((sizeflag & AFLAG)
14068                          || bytemode == v_bnd_mode
14069                          || bytemode == v_bndmk_mode
14070                          || bytemode == bnd_mode
14071                          || bytemode == bnd_swap_mode);
14072       const char **indexes64 = names64;
14073       const char **indexes32 = names32;
14074
14075       havesib = 0;
14076       havebase = 1;
14077       haveindex = 0;
14078       base = modrm.rm;
14079
14080       if (base == 4)
14081         {
14082           havesib = 1;
14083           vindex = sib.index;
14084           USED_REX (REX_X);
14085           if (rex & REX_X)
14086             vindex += 8;
14087           switch (bytemode)
14088             {
14089             case vex_vsib_d_w_dq_mode:
14090             case vex_vsib_d_w_d_mode:
14091             case vex_vsib_q_w_dq_mode:
14092             case vex_vsib_q_w_d_mode:
14093               if (!need_vex)
14094                 abort ();
14095               if (vex.evex)
14096                 {
14097                   if (!vex.v)
14098                     vindex += 16;
14099                 }
14100
14101               haveindex = 1;
14102               switch (vex.length)
14103                 {
14104                 case 128:
14105                   indexes64 = indexes32 = names_xmm;
14106                   break;
14107                 case 256:
14108                   if (!vex.w
14109                       || bytemode == vex_vsib_q_w_dq_mode
14110                       || bytemode == vex_vsib_q_w_d_mode)
14111                     indexes64 = indexes32 = names_ymm;
14112                   else
14113                     indexes64 = indexes32 = names_xmm;
14114                   break;
14115                 case 512:
14116                   if (!vex.w
14117                       || bytemode == vex_vsib_q_w_dq_mode
14118                       || bytemode == vex_vsib_q_w_d_mode)
14119                     indexes64 = indexes32 = names_zmm;
14120                   else
14121                     indexes64 = indexes32 = names_ymm;
14122                   break;
14123                 default:
14124                   abort ();
14125                 }
14126               break;
14127             default:
14128               haveindex = vindex != 4;
14129               break;
14130             }
14131           scale = sib.scale;
14132           base = sib.base;
14133           codep++;
14134         }
14135       rbase = base + add;
14136
14137       switch (modrm.mod)
14138         {
14139         case 0:
14140           if (base == 5)
14141             {
14142               havebase = 0;
14143               if (address_mode == mode_64bit && !havesib)
14144                 riprel = 1;
14145               disp = get32s ();
14146               if (riprel && bytemode == v_bndmk_mode)
14147                 {
14148                   oappend ("(bad)");
14149                   return;
14150                 }
14151             }
14152           break;
14153         case 1:
14154           FETCH_DATA (the_info, codep + 1);
14155           disp = *codep++;
14156           if ((disp & 0x80) != 0)
14157             disp -= 0x100;
14158           if (vex.evex && shift > 0)
14159             disp <<= shift;
14160           break;
14161         case 2:
14162           disp = get32s ();
14163           break;
14164         }
14165
14166       needindex = 0;
14167       needaddr32 = 0;
14168       if (havesib
14169           && !havebase
14170           && !haveindex
14171           && address_mode != mode_16bit)
14172         {
14173           if (address_mode == mode_64bit)
14174             {
14175               /* Display eiz instead of addr32.  */
14176               needindex = addr32flag;
14177               needaddr32 = 1;
14178             }
14179           else
14180             {
14181               /* In 32-bit mode, we need index register to tell [offset]
14182                  from [eiz*1 + offset].  */
14183               needindex = 1;
14184             }
14185         }
14186
14187       havedisp = (havebase
14188                   || needindex
14189                   || (havesib && (haveindex || scale != 0)));
14190
14191       if (!intel_syntax)
14192         if (modrm.mod != 0 || base == 5)
14193           {
14194             if (havedisp || riprel)
14195               print_displacement (scratchbuf, disp);
14196             else
14197               print_operand_value (scratchbuf, 1, disp);
14198             oappend (scratchbuf);
14199             if (riprel)
14200               {
14201                 set_op (disp, 1);
14202                 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14203               }
14204           }
14205
14206       if ((havebase || haveindex || needindex || needaddr32 || riprel)
14207           && (bytemode != v_bnd_mode)
14208           && (bytemode != v_bndmk_mode)
14209           && (bytemode != bnd_mode)
14210           && (bytemode != bnd_swap_mode))
14211         used_prefixes |= PREFIX_ADDR;
14212
14213       if (havedisp || (intel_syntax && riprel))
14214         {
14215           *obufp++ = open_char;
14216           if (intel_syntax && riprel)
14217             {
14218               set_op (disp, 1);
14219               oappend (!addr32flag ? "rip" : "eip");
14220             }
14221           *obufp = '\0';
14222           if (havebase)
14223             oappend (address_mode == mode_64bit && !addr32flag
14224                      ? names64[rbase] : names32[rbase]);
14225           if (havesib)
14226             {
14227               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
14228                  print index to tell base + index from base.  */
14229               if (scale != 0
14230                   || needindex
14231                   || haveindex
14232                   || (havebase && base != ESP_REG_NUM))
14233                 {
14234                   if (!intel_syntax || havebase)
14235                     {
14236                       *obufp++ = separator_char;
14237                       *obufp = '\0';
14238                     }
14239                   if (haveindex)
14240                     oappend (address_mode == mode_64bit && !addr32flag
14241                              ? indexes64[vindex] : indexes32[vindex]);
14242                   else
14243                     oappend (address_mode == mode_64bit && !addr32flag
14244                              ? index64 : index32);
14245
14246                   *obufp++ = scale_char;
14247                   *obufp = '\0';
14248                   sprintf (scratchbuf, "%d", 1 << scale);
14249                   oappend (scratchbuf);
14250                 }
14251             }
14252           if (intel_syntax
14253               && (disp || modrm.mod != 0 || base == 5))
14254             {
14255               if (!havedisp || (bfd_signed_vma) disp >= 0)
14256                 {
14257                   *obufp++ = '+';
14258                   *obufp = '\0';
14259                 }
14260               else if (modrm.mod != 1 && disp != -disp)
14261                 {
14262                   *obufp++ = '-';
14263                   *obufp = '\0';
14264                   disp = - (bfd_signed_vma) disp;
14265                 }
14266
14267               if (havedisp)
14268                 print_displacement (scratchbuf, disp);
14269               else
14270                 print_operand_value (scratchbuf, 1, disp);
14271               oappend (scratchbuf);
14272             }
14273
14274           *obufp++ = close_char;
14275           *obufp = '\0';
14276         }
14277       else if (intel_syntax)
14278         {
14279           if (modrm.mod != 0 || base == 5)
14280             {
14281               if (!active_seg_prefix)
14282                 {
14283                   oappend (names_seg[ds_reg - es_reg]);
14284                   oappend (":");
14285                 }
14286               print_operand_value (scratchbuf, 1, disp);
14287               oappend (scratchbuf);
14288             }
14289         }
14290     }
14291   else
14292     {
14293       /* 16 bit address mode */
14294       used_prefixes |= prefixes & PREFIX_ADDR;
14295       switch (modrm.mod)
14296         {
14297         case 0:
14298           if (modrm.rm == 6)
14299             {
14300               disp = get16 ();
14301               if ((disp & 0x8000) != 0)
14302                 disp -= 0x10000;
14303             }
14304           break;
14305         case 1:
14306           FETCH_DATA (the_info, codep + 1);
14307           disp = *codep++;
14308           if ((disp & 0x80) != 0)
14309             disp -= 0x100;
14310           if (vex.evex && shift > 0)
14311             disp <<= shift;
14312           break;
14313         case 2:
14314           disp = get16 ();
14315           if ((disp & 0x8000) != 0)
14316             disp -= 0x10000;
14317           break;
14318         }
14319
14320       if (!intel_syntax)
14321         if (modrm.mod != 0 || modrm.rm == 6)
14322           {
14323             print_displacement (scratchbuf, disp);
14324             oappend (scratchbuf);
14325           }
14326
14327       if (modrm.mod != 0 || modrm.rm != 6)
14328         {
14329           *obufp++ = open_char;
14330           *obufp = '\0';
14331           oappend (index16[modrm.rm]);
14332           if (intel_syntax
14333               && (disp || modrm.mod != 0 || modrm.rm == 6))
14334             {
14335               if ((bfd_signed_vma) disp >= 0)
14336                 {
14337                   *obufp++ = '+';
14338                   *obufp = '\0';
14339                 }
14340               else if (modrm.mod != 1)
14341                 {
14342                   *obufp++ = '-';
14343                   *obufp = '\0';
14344                   disp = - (bfd_signed_vma) disp;
14345                 }
14346
14347               print_displacement (scratchbuf, disp);
14348               oappend (scratchbuf);
14349             }
14350
14351           *obufp++ = close_char;
14352           *obufp = '\0';
14353         }
14354       else if (intel_syntax)
14355         {
14356           if (!active_seg_prefix)
14357             {
14358               oappend (names_seg[ds_reg - es_reg]);
14359               oappend (":");
14360             }
14361           print_operand_value (scratchbuf, 1, disp & 0xffff);
14362           oappend (scratchbuf);
14363         }
14364     }
14365   if (vex.evex && vex.b
14366       && (bytemode == x_mode
14367           || bytemode == xmmq_mode
14368           || bytemode == evex_half_bcst_xmmq_mode))
14369     {
14370       if (vex.w
14371           || bytemode == xmmq_mode
14372           || bytemode == evex_half_bcst_xmmq_mode)
14373         {
14374           switch (vex.length)
14375             {
14376             case 128:
14377               oappend ("{1to2}");
14378               break;
14379             case 256:
14380               oappend ("{1to4}");
14381               break;
14382             case 512:
14383               oappend ("{1to8}");
14384               break;
14385             default:
14386               abort ();
14387             }
14388         }
14389       else
14390         {
14391           switch (vex.length)
14392             {
14393             case 128:
14394               oappend ("{1to4}");
14395               break;
14396             case 256:
14397               oappend ("{1to8}");
14398               break;
14399             case 512:
14400               oappend ("{1to16}");
14401               break;
14402             default:
14403               abort ();
14404             }
14405         }
14406     }
14407 }
14408
14409 static void
14410 OP_E (int bytemode, int sizeflag)
14411 {
14412   /* Skip mod/rm byte.  */
14413   MODRM_CHECK;
14414   codep++;
14415
14416   if (modrm.mod == 3)
14417     OP_E_register (bytemode, sizeflag);
14418   else
14419     OP_E_memory (bytemode, sizeflag);
14420 }
14421
14422 static void
14423 OP_G (int bytemode, int sizeflag)
14424 {
14425   int add = 0;
14426   const char **names;
14427   USED_REX (REX_R);
14428   if (rex & REX_R)
14429     add += 8;
14430   switch (bytemode)
14431     {
14432     case b_mode:
14433       USED_REX (0);
14434       if (rex)
14435         oappend (names8rex[modrm.reg + add]);
14436       else
14437         oappend (names8[modrm.reg + add]);
14438       break;
14439     case w_mode:
14440       oappend (names16[modrm.reg + add]);
14441       break;
14442     case d_mode:
14443     case db_mode:
14444     case dw_mode:
14445       oappend (names32[modrm.reg + add]);
14446       break;
14447     case q_mode:
14448       oappend (names64[modrm.reg + add]);
14449       break;
14450     case bnd_mode:
14451       if (modrm.reg > 0x3)
14452         {
14453           oappend ("(bad)");
14454           return;
14455         }
14456       oappend (names_bnd[modrm.reg]);
14457       break;
14458     case v_mode:
14459     case dq_mode:
14460     case dqb_mode:
14461     case dqd_mode:
14462     case dqw_mode:
14463       USED_REX (REX_W);
14464       if (rex & REX_W)
14465         oappend (names64[modrm.reg + add]);
14466       else
14467         {
14468           if ((sizeflag & DFLAG) || bytemode != v_mode)
14469             oappend (names32[modrm.reg + add]);
14470           else
14471             oappend (names16[modrm.reg + add]);
14472           used_prefixes |= (prefixes & PREFIX_DATA);
14473         }
14474       break;
14475     case va_mode:
14476       names = (address_mode == mode_64bit
14477                ? names64 : names32);
14478       if (!(prefixes & PREFIX_ADDR))
14479         {
14480           if (address_mode == mode_16bit)
14481             names = names16;
14482         }
14483       else
14484         {
14485           /* Remove "addr16/addr32".  */
14486           all_prefixes[last_addr_prefix] = 0;
14487           names = (address_mode != mode_32bit
14488                        ? names32 : names16);
14489           used_prefixes |= PREFIX_ADDR;
14490         }
14491       oappend (names[modrm.reg + add]);
14492       break;
14493     case m_mode:
14494       if (address_mode == mode_64bit)
14495         oappend (names64[modrm.reg + add]);
14496       else
14497         oappend (names32[modrm.reg + add]);
14498       break;
14499     case mask_bd_mode:
14500     case mask_mode:
14501       if ((modrm.reg + add) > 0x7)
14502         {
14503           oappend ("(bad)");
14504           return;
14505         }
14506       oappend (names_mask[modrm.reg + add]);
14507       break;
14508     default:
14509       oappend (INTERNAL_DISASSEMBLER_ERROR);
14510       break;
14511     }
14512 }
14513
14514 static bfd_vma
14515 get64 (void)
14516 {
14517   bfd_vma x;
14518 #ifdef BFD64
14519   unsigned int a;
14520   unsigned int b;
14521
14522   FETCH_DATA (the_info, codep + 8);
14523   a = *codep++ & 0xff;
14524   a |= (*codep++ & 0xff) << 8;
14525   a |= (*codep++ & 0xff) << 16;
14526   a |= (*codep++ & 0xffu) << 24;
14527   b = *codep++ & 0xff;
14528   b |= (*codep++ & 0xff) << 8;
14529   b |= (*codep++ & 0xff) << 16;
14530   b |= (*codep++ & 0xffu) << 24;
14531   x = a + ((bfd_vma) b << 32);
14532 #else
14533   abort ();
14534   x = 0;
14535 #endif
14536   return x;
14537 }
14538
14539 static bfd_signed_vma
14540 get32 (void)
14541 {
14542   bfd_signed_vma x = 0;
14543
14544   FETCH_DATA (the_info, codep + 4);
14545   x = *codep++ & (bfd_signed_vma) 0xff;
14546   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14547   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14548   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14549   return x;
14550 }
14551
14552 static bfd_signed_vma
14553 get32s (void)
14554 {
14555   bfd_signed_vma x = 0;
14556
14557   FETCH_DATA (the_info, codep + 4);
14558   x = *codep++ & (bfd_signed_vma) 0xff;
14559   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14560   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14561   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14562
14563   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14564
14565   return x;
14566 }
14567
14568 static int
14569 get16 (void)
14570 {
14571   int x = 0;
14572
14573   FETCH_DATA (the_info, codep + 2);
14574   x = *codep++ & 0xff;
14575   x |= (*codep++ & 0xff) << 8;
14576   return x;
14577 }
14578
14579 static void
14580 set_op (bfd_vma op, int riprel)
14581 {
14582   op_index[op_ad] = op_ad;
14583   if (address_mode == mode_64bit)
14584     {
14585       op_address[op_ad] = op;
14586       op_riprel[op_ad] = riprel;
14587     }
14588   else
14589     {
14590       /* Mask to get a 32-bit address.  */
14591       op_address[op_ad] = op & 0xffffffff;
14592       op_riprel[op_ad] = riprel & 0xffffffff;
14593     }
14594 }
14595
14596 static void
14597 OP_REG (int code, int sizeflag)
14598 {
14599   const char *s;
14600   int add;
14601
14602   switch (code)
14603     {
14604     case es_reg: case ss_reg: case cs_reg:
14605     case ds_reg: case fs_reg: case gs_reg:
14606       oappend (names_seg[code - es_reg]);
14607       return;
14608     }
14609
14610   USED_REX (REX_B);
14611   if (rex & REX_B)
14612     add = 8;
14613   else
14614     add = 0;
14615
14616   switch (code)
14617     {
14618     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14619     case sp_reg: case bp_reg: case si_reg: case di_reg:
14620       s = names16[code - ax_reg + add];
14621       break;
14622     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14623     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14624       USED_REX (0);
14625       if (rex)
14626         s = names8rex[code - al_reg + add];
14627       else
14628         s = names8[code - al_reg];
14629       break;
14630     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14631     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14632       if (address_mode == mode_64bit
14633           && ((sizeflag & DFLAG) || (rex & REX_W)))
14634         {
14635           s = names64[code - rAX_reg + add];
14636           break;
14637         }
14638       code += eAX_reg - rAX_reg;
14639       /* Fall through.  */
14640     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14641     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14642       USED_REX (REX_W);
14643       if (rex & REX_W)
14644         s = names64[code - eAX_reg + add];
14645       else
14646         {
14647           if (sizeflag & DFLAG)
14648             s = names32[code - eAX_reg + add];
14649           else
14650             s = names16[code - eAX_reg + add];
14651           used_prefixes |= (prefixes & PREFIX_DATA);
14652         }
14653       break;
14654     default:
14655       s = INTERNAL_DISASSEMBLER_ERROR;
14656       break;
14657     }
14658   oappend (s);
14659 }
14660
14661 static void
14662 OP_IMREG (int code, int sizeflag)
14663 {
14664   const char *s;
14665
14666   switch (code)
14667     {
14668     case indir_dx_reg:
14669       if (intel_syntax)
14670         s = "dx";
14671       else
14672         s = "(%dx)";
14673       break;
14674     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14675     case sp_reg: case bp_reg: case si_reg: case di_reg:
14676       s = names16[code - ax_reg];
14677       break;
14678     case es_reg: case ss_reg: case cs_reg:
14679     case ds_reg: case fs_reg: case gs_reg:
14680       s = names_seg[code - es_reg];
14681       break;
14682     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14683     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14684       USED_REX (0);
14685       if (rex)
14686         s = names8rex[code - al_reg];
14687       else
14688         s = names8[code - al_reg];
14689       break;
14690     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14691     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14692       USED_REX (REX_W);
14693       if (rex & REX_W)
14694         s = names64[code - eAX_reg];
14695       else
14696         {
14697           if (sizeflag & DFLAG)
14698             s = names32[code - eAX_reg];
14699           else
14700             s = names16[code - eAX_reg];
14701           used_prefixes |= (prefixes & PREFIX_DATA);
14702         }
14703       break;
14704     case z_mode_ax_reg:
14705       if ((rex & REX_W) || (sizeflag & DFLAG))
14706         s = *names32;
14707       else
14708         s = *names16;
14709       if (!(rex & REX_W))
14710         used_prefixes |= (prefixes & PREFIX_DATA);
14711       break;
14712     default:
14713       s = INTERNAL_DISASSEMBLER_ERROR;
14714       break;
14715     }
14716   oappend (s);
14717 }
14718
14719 static void
14720 OP_I (int bytemode, int sizeflag)
14721 {
14722   bfd_signed_vma op;
14723   bfd_signed_vma mask = -1;
14724
14725   switch (bytemode)
14726     {
14727     case b_mode:
14728       FETCH_DATA (the_info, codep + 1);
14729       op = *codep++;
14730       mask = 0xff;
14731       break;
14732     case v_mode:
14733       USED_REX (REX_W);
14734       if (rex & REX_W)
14735         op = get32s ();
14736       else
14737         {
14738           if (sizeflag & DFLAG)
14739             {
14740               op = get32 ();
14741               mask = 0xffffffff;
14742             }
14743           else
14744             {
14745               op = get16 ();
14746               mask = 0xfffff;
14747             }
14748           used_prefixes |= (prefixes & PREFIX_DATA);
14749         }
14750       break;
14751     case d_mode:
14752       mask = 0xffffffff;
14753       op = get32 ();
14754       break;
14755     case w_mode:
14756       mask = 0xfffff;
14757       op = get16 ();
14758       break;
14759     case const_1_mode:
14760       if (intel_syntax)
14761         oappend ("1");
14762       return;
14763     default:
14764       oappend (INTERNAL_DISASSEMBLER_ERROR);
14765       return;
14766     }
14767
14768   op &= mask;
14769   scratchbuf[0] = '$';
14770   print_operand_value (scratchbuf + 1, 1, op);
14771   oappend_maybe_intel (scratchbuf);
14772   scratchbuf[0] = '\0';
14773 }
14774
14775 static void
14776 OP_I64 (int bytemode, int sizeflag)
14777 {
14778   if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
14779     {
14780       OP_I (bytemode, sizeflag);
14781       return;
14782     }
14783
14784   USED_REX (REX_W);
14785
14786   scratchbuf[0] = '$';
14787   print_operand_value (scratchbuf + 1, 1, get64 ());
14788   oappend_maybe_intel (scratchbuf);
14789   scratchbuf[0] = '\0';
14790 }
14791
14792 static void
14793 OP_sI (int bytemode, int sizeflag)
14794 {
14795   bfd_signed_vma op;
14796
14797   switch (bytemode)
14798     {
14799     case b_mode:
14800     case b_T_mode:
14801       FETCH_DATA (the_info, codep + 1);
14802       op = *codep++;
14803       if ((op & 0x80) != 0)
14804         op -= 0x100;
14805       if (bytemode == b_T_mode)
14806         {
14807           if (address_mode != mode_64bit
14808               || !((sizeflag & DFLAG) || (rex & REX_W)))
14809             {
14810               /* The operand-size prefix is overridden by a REX prefix.  */
14811               if ((sizeflag & DFLAG) || (rex & REX_W))
14812                 op &= 0xffffffff;
14813               else
14814                 op &= 0xffff;
14815           }
14816         }
14817       else
14818         {
14819           if (!(rex & REX_W))
14820             {
14821               if (sizeflag & DFLAG)
14822                 op &= 0xffffffff;
14823               else
14824                 op &= 0xffff;
14825             }
14826         }
14827       break;
14828     case v_mode:
14829       /* The operand-size prefix is overridden by a REX prefix.  */
14830       if ((sizeflag & DFLAG) || (rex & REX_W))
14831         op = get32s ();
14832       else
14833         op = get16 ();
14834       break;
14835     default:
14836       oappend (INTERNAL_DISASSEMBLER_ERROR);
14837       return;
14838     }
14839
14840   scratchbuf[0] = '$';
14841   print_operand_value (scratchbuf + 1, 1, op);
14842   oappend_maybe_intel (scratchbuf);
14843 }
14844
14845 static void
14846 OP_J (int bytemode, int sizeflag)
14847 {
14848   bfd_vma disp;
14849   bfd_vma mask = -1;
14850   bfd_vma segment = 0;
14851
14852   switch (bytemode)
14853     {
14854     case b_mode:
14855       FETCH_DATA (the_info, codep + 1);
14856       disp = *codep++;
14857       if ((disp & 0x80) != 0)
14858         disp -= 0x100;
14859       break;
14860     case v_mode:
14861       if (isa64 == amd64)
14862         USED_REX (REX_W);
14863       if ((sizeflag & DFLAG)
14864           || (address_mode == mode_64bit
14865               && (isa64 != amd64 || (rex & REX_W))))
14866         disp = get32s ();
14867       else
14868         {
14869           disp = get16 ();
14870           if ((disp & 0x8000) != 0)
14871             disp -= 0x10000;
14872           /* In 16bit mode, address is wrapped around at 64k within
14873              the same segment.  Otherwise, a data16 prefix on a jump
14874              instruction means that the pc is masked to 16 bits after
14875              the displacement is added!  */
14876           mask = 0xffff;
14877           if ((prefixes & PREFIX_DATA) == 0)
14878             segment = ((start_pc + (codep - start_codep))
14879                        & ~((bfd_vma) 0xffff));
14880         }
14881       if (address_mode != mode_64bit
14882           || (isa64 == amd64 && !(rex & REX_W)))
14883         used_prefixes |= (prefixes & PREFIX_DATA);
14884       break;
14885     default:
14886       oappend (INTERNAL_DISASSEMBLER_ERROR);
14887       return;
14888     }
14889   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14890   set_op (disp, 0);
14891   print_operand_value (scratchbuf, 1, disp);
14892   oappend (scratchbuf);
14893 }
14894
14895 static void
14896 OP_SEG (int bytemode, int sizeflag)
14897 {
14898   if (bytemode == w_mode)
14899     oappend (names_seg[modrm.reg]);
14900   else
14901     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14902 }
14903
14904 static void
14905 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14906 {
14907   int seg, offset;
14908
14909   if (sizeflag & DFLAG)
14910     {
14911       offset = get32 ();
14912       seg = get16 ();
14913     }
14914   else
14915     {
14916       offset = get16 ();
14917       seg = get16 ();
14918     }
14919   used_prefixes |= (prefixes & PREFIX_DATA);
14920   if (intel_syntax)
14921     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14922   else
14923     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14924   oappend (scratchbuf);
14925 }
14926
14927 static void
14928 OP_OFF (int bytemode, int sizeflag)
14929 {
14930   bfd_vma off;
14931
14932   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14933     intel_operand_size (bytemode, sizeflag);
14934   append_seg ();
14935
14936   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14937     off = get32 ();
14938   else
14939     off = get16 ();
14940
14941   if (intel_syntax)
14942     {
14943       if (!active_seg_prefix)
14944         {
14945           oappend (names_seg[ds_reg - es_reg]);
14946           oappend (":");
14947         }
14948     }
14949   print_operand_value (scratchbuf, 1, off);
14950   oappend (scratchbuf);
14951 }
14952
14953 static void
14954 OP_OFF64 (int bytemode, int sizeflag)
14955 {
14956   bfd_vma off;
14957
14958   if (address_mode != mode_64bit
14959       || (prefixes & PREFIX_ADDR))
14960     {
14961       OP_OFF (bytemode, sizeflag);
14962       return;
14963     }
14964
14965   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14966     intel_operand_size (bytemode, sizeflag);
14967   append_seg ();
14968
14969   off = get64 ();
14970
14971   if (intel_syntax)
14972     {
14973       if (!active_seg_prefix)
14974         {
14975           oappend (names_seg[ds_reg - es_reg]);
14976           oappend (":");
14977         }
14978     }
14979   print_operand_value (scratchbuf, 1, off);
14980   oappend (scratchbuf);
14981 }
14982
14983 static void
14984 ptr_reg (int code, int sizeflag)
14985 {
14986   const char *s;
14987
14988   *obufp++ = open_char;
14989   used_prefixes |= (prefixes & PREFIX_ADDR);
14990   if (address_mode == mode_64bit)
14991     {
14992       if (!(sizeflag & AFLAG))
14993         s = names32[code - eAX_reg];
14994       else
14995         s = names64[code - eAX_reg];
14996     }
14997   else if (sizeflag & AFLAG)
14998     s = names32[code - eAX_reg];
14999   else
15000     s = names16[code - eAX_reg];
15001   oappend (s);
15002   *obufp++ = close_char;
15003   *obufp = 0;
15004 }
15005
15006 static void
15007 OP_ESreg (int code, int sizeflag)
15008 {
15009   if (intel_syntax)
15010     {
15011       switch (codep[-1])
15012         {
15013         case 0x6d:      /* insw/insl */
15014           intel_operand_size (z_mode, sizeflag);
15015           break;
15016         case 0xa5:      /* movsw/movsl/movsq */
15017         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15018         case 0xab:      /* stosw/stosl */
15019         case 0xaf:      /* scasw/scasl */
15020           intel_operand_size (v_mode, sizeflag);
15021           break;
15022         default:
15023           intel_operand_size (b_mode, sizeflag);
15024         }
15025     }
15026   oappend_maybe_intel ("%es:");
15027   ptr_reg (code, sizeflag);
15028 }
15029
15030 static void
15031 OP_DSreg (int code, int sizeflag)
15032 {
15033   if (intel_syntax)
15034     {
15035       switch (codep[-1])
15036         {
15037         case 0x6f:      /* outsw/outsl */
15038           intel_operand_size (z_mode, sizeflag);
15039           break;
15040         case 0xa5:      /* movsw/movsl/movsq */
15041         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15042         case 0xad:      /* lodsw/lodsl/lodsq */
15043           intel_operand_size (v_mode, sizeflag);
15044           break;
15045         default:
15046           intel_operand_size (b_mode, sizeflag);
15047         }
15048     }
15049   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15050      default segment register DS is printed.  */
15051   if (!active_seg_prefix)
15052     active_seg_prefix = PREFIX_DS;
15053   append_seg ();
15054   ptr_reg (code, sizeflag);
15055 }
15056
15057 static void
15058 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15059 {
15060   int add;
15061   if (rex & REX_R)
15062     {
15063       USED_REX (REX_R);
15064       add = 8;
15065     }
15066   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15067     {
15068       all_prefixes[last_lock_prefix] = 0;
15069       used_prefixes |= PREFIX_LOCK;
15070       add = 8;
15071     }
15072   else
15073     add = 0;
15074   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15075   oappend_maybe_intel (scratchbuf);
15076 }
15077
15078 static void
15079 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15080 {
15081   int add;
15082   USED_REX (REX_R);
15083   if (rex & REX_R)
15084     add = 8;
15085   else
15086     add = 0;
15087   if (intel_syntax)
15088     sprintf (scratchbuf, "db%d", modrm.reg + add);
15089   else
15090     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15091   oappend (scratchbuf);
15092 }
15093
15094 static void
15095 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15096 {
15097   sprintf (scratchbuf, "%%tr%d", modrm.reg);
15098   oappend_maybe_intel (scratchbuf);
15099 }
15100
15101 static void
15102 OP_R (int bytemode, int sizeflag)
15103 {
15104   /* Skip mod/rm byte.  */
15105   MODRM_CHECK;
15106   codep++;
15107   OP_E_register (bytemode, sizeflag);
15108 }
15109
15110 static void
15111 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15112 {
15113   int reg = modrm.reg;
15114   const char **names;
15115
15116   used_prefixes |= (prefixes & PREFIX_DATA);
15117   if (prefixes & PREFIX_DATA)
15118     {
15119       names = names_xmm;
15120       USED_REX (REX_R);
15121       if (rex & REX_R)
15122         reg += 8;
15123     }
15124   else
15125     names = names_mm;
15126   oappend (names[reg]);
15127 }
15128
15129 static void
15130 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15131 {
15132   int reg = modrm.reg;
15133   const char **names;
15134
15135   USED_REX (REX_R);
15136   if (rex & REX_R)
15137     reg += 8;
15138   if (vex.evex)
15139     {
15140       if (!vex.r)
15141         reg += 16;
15142     }
15143
15144   if (need_vex
15145       && bytemode != xmm_mode
15146       && bytemode != xmmq_mode
15147       && bytemode != evex_half_bcst_xmmq_mode
15148       && bytemode != ymm_mode
15149       && bytemode != scalar_mode)
15150     {
15151       switch (vex.length)
15152         {
15153         case 128:
15154           names = names_xmm;
15155           break;
15156         case 256:
15157           if (vex.w
15158               || (bytemode != vex_vsib_q_w_dq_mode
15159                   && bytemode != vex_vsib_q_w_d_mode))
15160             names = names_ymm;
15161           else
15162             names = names_xmm;
15163           break;
15164         case 512:
15165           names = names_zmm;
15166           break;
15167         default:
15168           abort ();
15169         }
15170     }
15171   else if (bytemode == xmmq_mode
15172            || bytemode == evex_half_bcst_xmmq_mode)
15173     {
15174       switch (vex.length)
15175         {
15176         case 128:
15177         case 256:
15178           names = names_xmm;
15179           break;
15180         case 512:
15181           names = names_ymm;
15182           break;
15183         default:
15184           abort ();
15185         }
15186     }
15187   else if (bytemode == ymm_mode)
15188     names = names_ymm;
15189   else
15190     names = names_xmm;
15191   oappend (names[reg]);
15192 }
15193
15194 static void
15195 OP_EM (int bytemode, int sizeflag)
15196 {
15197   int reg;
15198   const char **names;
15199
15200   if (modrm.mod != 3)
15201     {
15202       if (intel_syntax
15203           && (bytemode == v_mode || bytemode == v_swap_mode))
15204         {
15205           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15206           used_prefixes |= (prefixes & PREFIX_DATA);
15207         }
15208       OP_E (bytemode, sizeflag);
15209       return;
15210     }
15211
15212   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15213     swap_operand ();
15214
15215   /* Skip mod/rm byte.  */
15216   MODRM_CHECK;
15217   codep++;
15218   used_prefixes |= (prefixes & PREFIX_DATA);
15219   reg = modrm.rm;
15220   if (prefixes & PREFIX_DATA)
15221     {
15222       names = names_xmm;
15223       USED_REX (REX_B);
15224       if (rex & REX_B)
15225         reg += 8;
15226     }
15227   else
15228     names = names_mm;
15229   oappend (names[reg]);
15230 }
15231
15232 /* cvt* are the only instructions in sse2 which have
15233    both SSE and MMX operands and also have 0x66 prefix
15234    in their opcode. 0x66 was originally used to differentiate
15235    between SSE and MMX instruction(operands). So we have to handle the
15236    cvt* separately using OP_EMC and OP_MXC */
15237 static void
15238 OP_EMC (int bytemode, int sizeflag)
15239 {
15240   if (modrm.mod != 3)
15241     {
15242       if (intel_syntax && bytemode == v_mode)
15243         {
15244           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15245           used_prefixes |= (prefixes & PREFIX_DATA);
15246         }
15247       OP_E (bytemode, sizeflag);
15248       return;
15249     }
15250
15251   /* Skip mod/rm byte.  */
15252   MODRM_CHECK;
15253   codep++;
15254   used_prefixes |= (prefixes & PREFIX_DATA);
15255   oappend (names_mm[modrm.rm]);
15256 }
15257
15258 static void
15259 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15260 {
15261   used_prefixes |= (prefixes & PREFIX_DATA);
15262   oappend (names_mm[modrm.reg]);
15263 }
15264
15265 static void
15266 OP_EX (int bytemode, int sizeflag)
15267 {
15268   int reg;
15269   const char **names;
15270
15271   /* Skip mod/rm byte.  */
15272   MODRM_CHECK;
15273   codep++;
15274
15275   if (modrm.mod != 3)
15276     {
15277       OP_E_memory (bytemode, sizeflag);
15278       return;
15279     }
15280
15281   reg = modrm.rm;
15282   USED_REX (REX_B);
15283   if (rex & REX_B)
15284     reg += 8;
15285   if (vex.evex)
15286     {
15287       USED_REX (REX_X);
15288       if ((rex & REX_X))
15289         reg += 16;
15290     }
15291
15292   if ((sizeflag & SUFFIX_ALWAYS)
15293       && (bytemode == x_swap_mode
15294           || bytemode == d_swap_mode
15295           || bytemode == d_scalar_swap_mode
15296           || bytemode == q_swap_mode
15297           || bytemode == q_scalar_swap_mode))
15298     swap_operand ();
15299
15300   if (need_vex
15301       && bytemode != xmm_mode
15302       && bytemode != xmmdw_mode
15303       && bytemode != xmmqd_mode
15304       && bytemode != xmm_mb_mode
15305       && bytemode != xmm_mw_mode
15306       && bytemode != xmm_md_mode
15307       && bytemode != xmm_mq_mode
15308       && bytemode != xmm_mdq_mode
15309       && bytemode != xmmq_mode
15310       && bytemode != evex_half_bcst_xmmq_mode
15311       && bytemode != ymm_mode
15312       && bytemode != d_scalar_mode
15313       && bytemode != d_scalar_swap_mode
15314       && bytemode != q_scalar_mode
15315       && bytemode != q_scalar_swap_mode
15316       && bytemode != vex_scalar_w_dq_mode)
15317     {
15318       switch (vex.length)
15319         {
15320         case 128:
15321           names = names_xmm;
15322           break;
15323         case 256:
15324           names = names_ymm;
15325           break;
15326         case 512:
15327           names = names_zmm;
15328           break;
15329         default:
15330           abort ();
15331         }
15332     }
15333   else if (bytemode == xmmq_mode
15334            || bytemode == evex_half_bcst_xmmq_mode)
15335     {
15336       switch (vex.length)
15337         {
15338         case 128:
15339         case 256:
15340           names = names_xmm;
15341           break;
15342         case 512:
15343           names = names_ymm;
15344           break;
15345         default:
15346           abort ();
15347         }
15348     }
15349   else if (bytemode == ymm_mode)
15350     names = names_ymm;
15351   else
15352     names = names_xmm;
15353   oappend (names[reg]);
15354 }
15355
15356 static void
15357 OP_MS (int bytemode, int sizeflag)
15358 {
15359   if (modrm.mod == 3)
15360     OP_EM (bytemode, sizeflag);
15361   else
15362     BadOp ();
15363 }
15364
15365 static void
15366 OP_XS (int bytemode, int sizeflag)
15367 {
15368   if (modrm.mod == 3)
15369     OP_EX (bytemode, sizeflag);
15370   else
15371     BadOp ();
15372 }
15373
15374 static void
15375 OP_M (int bytemode, int sizeflag)
15376 {
15377   if (modrm.mod == 3)
15378     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15379     BadOp ();
15380   else
15381     OP_E (bytemode, sizeflag);
15382 }
15383
15384 static void
15385 OP_0f07 (int bytemode, int sizeflag)
15386 {
15387   if (modrm.mod != 3 || modrm.rm != 0)
15388     BadOp ();
15389   else
15390     OP_E (bytemode, sizeflag);
15391 }
15392
15393 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15394    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
15395
15396 static void
15397 NOP_Fixup1 (int bytemode, int sizeflag)
15398 {
15399   if ((prefixes & PREFIX_DATA) != 0
15400       || (rex != 0
15401           && rex != 0x48
15402           && address_mode == mode_64bit))
15403     OP_REG (bytemode, sizeflag);
15404   else
15405     strcpy (obuf, "nop");
15406 }
15407
15408 static void
15409 NOP_Fixup2 (int bytemode, int sizeflag)
15410 {
15411   if ((prefixes & PREFIX_DATA) != 0
15412       || (rex != 0
15413           && rex != 0x48
15414           && address_mode == mode_64bit))
15415     OP_IMREG (bytemode, sizeflag);
15416 }
15417
15418 static const char *const Suffix3DNow[] = {
15419 /* 00 */        NULL,           NULL,           NULL,           NULL,
15420 /* 04 */        NULL,           NULL,           NULL,           NULL,
15421 /* 08 */        NULL,           NULL,           NULL,           NULL,
15422 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
15423 /* 10 */        NULL,           NULL,           NULL,           NULL,
15424 /* 14 */        NULL,           NULL,           NULL,           NULL,
15425 /* 18 */        NULL,           NULL,           NULL,           NULL,
15426 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
15427 /* 20 */        NULL,           NULL,           NULL,           NULL,
15428 /* 24 */        NULL,           NULL,           NULL,           NULL,
15429 /* 28 */        NULL,           NULL,           NULL,           NULL,
15430 /* 2C */        NULL,           NULL,           NULL,           NULL,
15431 /* 30 */        NULL,           NULL,           NULL,           NULL,
15432 /* 34 */        NULL,           NULL,           NULL,           NULL,
15433 /* 38 */        NULL,           NULL,           NULL,           NULL,
15434 /* 3C */        NULL,           NULL,           NULL,           NULL,
15435 /* 40 */        NULL,           NULL,           NULL,           NULL,
15436 /* 44 */        NULL,           NULL,           NULL,           NULL,
15437 /* 48 */        NULL,           NULL,           NULL,           NULL,
15438 /* 4C */        NULL,           NULL,           NULL,           NULL,
15439 /* 50 */        NULL,           NULL,           NULL,           NULL,
15440 /* 54 */        NULL,           NULL,           NULL,           NULL,
15441 /* 58 */        NULL,           NULL,           NULL,           NULL,
15442 /* 5C */        NULL,           NULL,           NULL,           NULL,
15443 /* 60 */        NULL,           NULL,           NULL,           NULL,
15444 /* 64 */        NULL,           NULL,           NULL,           NULL,
15445 /* 68 */        NULL,           NULL,           NULL,           NULL,
15446 /* 6C */        NULL,           NULL,           NULL,           NULL,
15447 /* 70 */        NULL,           NULL,           NULL,           NULL,
15448 /* 74 */        NULL,           NULL,           NULL,           NULL,
15449 /* 78 */        NULL,           NULL,           NULL,           NULL,
15450 /* 7C */        NULL,           NULL,           NULL,           NULL,
15451 /* 80 */        NULL,           NULL,           NULL,           NULL,
15452 /* 84 */        NULL,           NULL,           NULL,           NULL,
15453 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
15454 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
15455 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
15456 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
15457 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
15458 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
15459 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
15460 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
15461 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
15462 /* AC */        NULL,           NULL,           "pfacc",        NULL,
15463 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
15464 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
15465 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
15466 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
15467 /* C0 */        NULL,           NULL,           NULL,           NULL,
15468 /* C4 */        NULL,           NULL,           NULL,           NULL,
15469 /* C8 */        NULL,           NULL,           NULL,           NULL,
15470 /* CC */        NULL,           NULL,           NULL,           NULL,
15471 /* D0 */        NULL,           NULL,           NULL,           NULL,
15472 /* D4 */        NULL,           NULL,           NULL,           NULL,
15473 /* D8 */        NULL,           NULL,           NULL,           NULL,
15474 /* DC */        NULL,           NULL,           NULL,           NULL,
15475 /* E0 */        NULL,           NULL,           NULL,           NULL,
15476 /* E4 */        NULL,           NULL,           NULL,           NULL,
15477 /* E8 */        NULL,           NULL,           NULL,           NULL,
15478 /* EC */        NULL,           NULL,           NULL,           NULL,
15479 /* F0 */        NULL,           NULL,           NULL,           NULL,
15480 /* F4 */        NULL,           NULL,           NULL,           NULL,
15481 /* F8 */        NULL,           NULL,           NULL,           NULL,
15482 /* FC */        NULL,           NULL,           NULL,           NULL,
15483 };
15484
15485 static void
15486 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15487 {
15488   const char *mnemonic;
15489
15490   FETCH_DATA (the_info, codep + 1);
15491   /* AMD 3DNow! instructions are specified by an opcode suffix in the
15492      place where an 8-bit immediate would normally go.  ie. the last
15493      byte of the instruction.  */
15494   obufp = mnemonicendp;
15495   mnemonic = Suffix3DNow[*codep++ & 0xff];
15496   if (mnemonic)
15497     oappend (mnemonic);
15498   else
15499     {
15500       /* Since a variable sized modrm/sib chunk is between the start
15501          of the opcode (0x0f0f) and the opcode suffix, we need to do
15502          all the modrm processing first, and don't know until now that
15503          we have a bad opcode.  This necessitates some cleaning up.  */
15504       op_out[0][0] = '\0';
15505       op_out[1][0] = '\0';
15506       BadOp ();
15507     }
15508   mnemonicendp = obufp;
15509 }
15510
15511 static struct op simd_cmp_op[] =
15512 {
15513   { STRING_COMMA_LEN ("eq") },
15514   { STRING_COMMA_LEN ("lt") },
15515   { STRING_COMMA_LEN ("le") },
15516   { STRING_COMMA_LEN ("unord") },
15517   { STRING_COMMA_LEN ("neq") },
15518   { STRING_COMMA_LEN ("nlt") },
15519   { STRING_COMMA_LEN ("nle") },
15520   { STRING_COMMA_LEN ("ord") }
15521 };
15522
15523 static void
15524 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15525 {
15526   unsigned int cmp_type;
15527
15528   FETCH_DATA (the_info, codep + 1);
15529   cmp_type = *codep++ & 0xff;
15530   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15531     {
15532       char suffix [3];
15533       char *p = mnemonicendp - 2;
15534       suffix[0] = p[0];
15535       suffix[1] = p[1];
15536       suffix[2] = '\0';
15537       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15538       mnemonicendp += simd_cmp_op[cmp_type].len;
15539     }
15540   else
15541     {
15542       /* We have a reserved extension byte.  Output it directly.  */
15543       scratchbuf[0] = '$';
15544       print_operand_value (scratchbuf + 1, 1, cmp_type);
15545       oappend_maybe_intel (scratchbuf);
15546       scratchbuf[0] = '\0';
15547     }
15548 }
15549
15550 static void
15551 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15552           int sizeflag ATTRIBUTE_UNUSED)
15553 {
15554   /* mwaitx %eax,%ecx,%ebx */
15555   if (!intel_syntax)
15556     {
15557       const char **names = (address_mode == mode_64bit
15558                             ? names64 : names32);
15559       strcpy (op_out[0], names[0]);
15560       strcpy (op_out[1], names[1]);
15561       strcpy (op_out[2], names[3]);
15562       two_source_ops = 1;
15563     }
15564   /* Skip mod/rm byte.  */
15565   MODRM_CHECK;
15566   codep++;
15567 }
15568
15569 static void
15570 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15571           int sizeflag ATTRIBUTE_UNUSED)
15572 {
15573   /* mwait %eax,%ecx  */
15574   if (!intel_syntax)
15575     {
15576       const char **names = (address_mode == mode_64bit
15577                             ? names64 : names32);
15578       strcpy (op_out[0], names[0]);
15579       strcpy (op_out[1], names[1]);
15580       two_source_ops = 1;
15581     }
15582   /* Skip mod/rm byte.  */
15583   MODRM_CHECK;
15584   codep++;
15585 }
15586
15587 static void
15588 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15589             int sizeflag ATTRIBUTE_UNUSED)
15590 {
15591   /* monitor %eax,%ecx,%edx"  */
15592   if (!intel_syntax)
15593     {
15594       const char **op1_names;
15595       const char **names = (address_mode == mode_64bit
15596                             ? names64 : names32);
15597
15598       if (!(prefixes & PREFIX_ADDR))
15599         op1_names = (address_mode == mode_16bit
15600                      ? names16 : names);
15601       else
15602         {
15603           /* Remove "addr16/addr32".  */
15604           all_prefixes[last_addr_prefix] = 0;
15605           op1_names = (address_mode != mode_32bit
15606                        ? names32 : names16);
15607           used_prefixes |= PREFIX_ADDR;
15608         }
15609       strcpy (op_out[0], op1_names[0]);
15610       strcpy (op_out[1], names[1]);
15611       strcpy (op_out[2], names[2]);
15612       two_source_ops = 1;
15613     }
15614   /* Skip mod/rm byte.  */
15615   MODRM_CHECK;
15616   codep++;
15617 }
15618
15619 static void
15620 BadOp (void)
15621 {
15622   /* Throw away prefixes and 1st. opcode byte.  */
15623   codep = insn_codep + 1;
15624   oappend ("(bad)");
15625 }
15626
15627 static void
15628 REP_Fixup (int bytemode, int sizeflag)
15629 {
15630   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15631      lods and stos.  */
15632   if (prefixes & PREFIX_REPZ)
15633     all_prefixes[last_repz_prefix] = REP_PREFIX;
15634
15635   switch (bytemode)
15636     {
15637     case al_reg:
15638     case eAX_reg:
15639     case indir_dx_reg:
15640       OP_IMREG (bytemode, sizeflag);
15641       break;
15642     case eDI_reg:
15643       OP_ESreg (bytemode, sizeflag);
15644       break;
15645     case eSI_reg:
15646       OP_DSreg (bytemode, sizeflag);
15647       break;
15648     default:
15649       abort ();
15650       break;
15651     }
15652 }
15653
15654 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15655    "bnd".  */
15656
15657 static void
15658 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15659 {
15660   if (prefixes & PREFIX_REPNZ)
15661     all_prefixes[last_repnz_prefix] = BND_PREFIX;
15662 }
15663
15664 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15665    "notrack".  */
15666
15667 static void
15668 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15669                int sizeflag ATTRIBUTE_UNUSED)
15670 {
15671   if (active_seg_prefix == PREFIX_DS
15672       && (address_mode != mode_64bit || last_data_prefix < 0))
15673     {
15674       /* NOTRACK prefix is only valid on indirect branch instructions.
15675          NB: DATA prefix is unsupported for Intel64.  */
15676       active_seg_prefix = 0;
15677       all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15678     }
15679 }
15680
15681 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15682    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15683  */
15684
15685 static void
15686 HLE_Fixup1 (int bytemode, int sizeflag)
15687 {
15688   if (modrm.mod != 3
15689       && (prefixes & PREFIX_LOCK) != 0)
15690     {
15691       if (prefixes & PREFIX_REPZ)
15692         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15693       if (prefixes & PREFIX_REPNZ)
15694         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15695     }
15696
15697   OP_E (bytemode, sizeflag);
15698 }
15699
15700 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15701    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
15702  */
15703
15704 static void
15705 HLE_Fixup2 (int bytemode, int sizeflag)
15706 {
15707   if (modrm.mod != 3)
15708     {
15709       if (prefixes & PREFIX_REPZ)
15710         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15711       if (prefixes & PREFIX_REPNZ)
15712         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15713     }
15714
15715   OP_E (bytemode, sizeflag);
15716 }
15717
15718 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
15719    "xrelease" for memory operand.  No check for LOCK prefix.   */
15720
15721 static void
15722 HLE_Fixup3 (int bytemode, int sizeflag)
15723 {
15724   if (modrm.mod != 3
15725       && last_repz_prefix > last_repnz_prefix
15726       && (prefixes & PREFIX_REPZ) != 0)
15727     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15728
15729   OP_E (bytemode, sizeflag);
15730 }
15731
15732 static void
15733 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15734 {
15735   USED_REX (REX_W);
15736   if (rex & REX_W)
15737     {
15738       /* Change cmpxchg8b to cmpxchg16b.  */
15739       char *p = mnemonicendp - 2;
15740       mnemonicendp = stpcpy (p, "16b");
15741       bytemode = o_mode;
15742     }
15743   else if ((prefixes & PREFIX_LOCK) != 0)
15744     {
15745       if (prefixes & PREFIX_REPZ)
15746         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15747       if (prefixes & PREFIX_REPNZ)
15748         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15749     }
15750
15751   OP_M (bytemode, sizeflag);
15752 }
15753
15754 static void
15755 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15756 {
15757   const char **names;
15758
15759   if (need_vex)
15760     {
15761       switch (vex.length)
15762         {
15763         case 128:
15764           names = names_xmm;
15765           break;
15766         case 256:
15767           names = names_ymm;
15768           break;
15769         default:
15770           abort ();
15771         }
15772     }
15773   else
15774     names = names_xmm;
15775   oappend (names[reg]);
15776 }
15777
15778 static void
15779 CRC32_Fixup (int bytemode, int sizeflag)
15780 {
15781   /* Add proper suffix to "crc32".  */
15782   char *p = mnemonicendp;
15783
15784   switch (bytemode)
15785     {
15786     case b_mode:
15787       if (intel_syntax)
15788         goto skip;
15789
15790       *p++ = 'b';
15791       break;
15792     case v_mode:
15793       if (intel_syntax)
15794         goto skip;
15795
15796       USED_REX (REX_W);
15797       if (rex & REX_W)
15798         *p++ = 'q';
15799       else
15800         {
15801           if (sizeflag & DFLAG)
15802             *p++ = 'l';
15803           else
15804             *p++ = 'w';
15805           used_prefixes |= (prefixes & PREFIX_DATA);
15806         }
15807       break;
15808     default:
15809       oappend (INTERNAL_DISASSEMBLER_ERROR);
15810       break;
15811     }
15812   mnemonicendp = p;
15813   *p = '\0';
15814
15815 skip:
15816   if (modrm.mod == 3)
15817     {
15818       int add;
15819
15820       /* Skip mod/rm byte.  */
15821       MODRM_CHECK;
15822       codep++;
15823
15824       USED_REX (REX_B);
15825       add = (rex & REX_B) ? 8 : 0;
15826       if (bytemode == b_mode)
15827         {
15828           USED_REX (0);
15829           if (rex)
15830             oappend (names8rex[modrm.rm + add]);
15831           else
15832             oappend (names8[modrm.rm + add]);
15833         }
15834       else
15835         {
15836           USED_REX (REX_W);
15837           if (rex & REX_W)
15838             oappend (names64[modrm.rm + add]);
15839           else if ((prefixes & PREFIX_DATA))
15840             oappend (names16[modrm.rm + add]);
15841           else
15842             oappend (names32[modrm.rm + add]);
15843         }
15844     }
15845   else
15846     OP_E (bytemode, sizeflag);
15847 }
15848
15849 static void
15850 FXSAVE_Fixup (int bytemode, int sizeflag)
15851 {
15852   /* Add proper suffix to "fxsave" and "fxrstor".  */
15853   USED_REX (REX_W);
15854   if (rex & REX_W)
15855     {
15856       char *p = mnemonicendp;
15857       *p++ = '6';
15858       *p++ = '4';
15859       *p = '\0';
15860       mnemonicendp = p;
15861     }
15862   OP_M (bytemode, sizeflag);
15863 }
15864
15865 static void
15866 PCMPESTR_Fixup (int bytemode, int sizeflag)
15867 {
15868   /* Add proper suffix to "{,v}pcmpestr{i,m}".  */
15869   if (!intel_syntax)
15870     {
15871       char *p = mnemonicendp;
15872
15873       USED_REX (REX_W);
15874       if (rex & REX_W)
15875         *p++ = 'q';
15876       else if (sizeflag & SUFFIX_ALWAYS)
15877         *p++ = 'l';
15878
15879       *p = '\0';
15880       mnemonicendp = p;
15881     }
15882
15883   OP_EX (bytemode, sizeflag);
15884 }
15885
15886 /* Display the destination register operand for instructions with
15887    VEX. */
15888
15889 static void
15890 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15891 {
15892   int reg;
15893   const char **names;
15894
15895   if (!need_vex)
15896     abort ();
15897
15898   if (!need_vex_reg)
15899     return;
15900
15901   reg = vex.register_specifier;
15902   vex.register_specifier = 0;
15903   if (address_mode != mode_64bit)
15904     reg &= 7;
15905   else if (vex.evex && !vex.v)
15906     reg += 16;
15907
15908   if (bytemode == vex_scalar_mode)
15909     {
15910       oappend (names_xmm[reg]);
15911       return;
15912     }
15913
15914   switch (vex.length)
15915     {
15916     case 128:
15917       switch (bytemode)
15918         {
15919         case vex_mode:
15920         case vex128_mode:
15921         case vex_vsib_q_w_dq_mode:
15922         case vex_vsib_q_w_d_mode:
15923           names = names_xmm;
15924           break;
15925         case dq_mode:
15926           if (rex & REX_W)
15927             names = names64;
15928           else
15929             names = names32;
15930           break;
15931         case mask_bd_mode:
15932         case mask_mode:
15933           if (reg > 0x7)
15934             {
15935               oappend ("(bad)");
15936               return;
15937             }
15938           names = names_mask;
15939           break;
15940         default:
15941           abort ();
15942           return;
15943         }
15944       break;
15945     case 256:
15946       switch (bytemode)
15947         {
15948         case vex_mode:
15949         case vex256_mode:
15950           names = names_ymm;
15951           break;
15952         case vex_vsib_q_w_dq_mode:
15953         case vex_vsib_q_w_d_mode:
15954           names = vex.w ? names_ymm : names_xmm;
15955           break;
15956         case mask_bd_mode:
15957         case mask_mode:
15958           if (reg > 0x7)
15959             {
15960               oappend ("(bad)");
15961               return;
15962             }
15963           names = names_mask;
15964           break;
15965         default:
15966           /* See PR binutils/20893 for a reproducer.  */
15967           oappend ("(bad)");
15968           return;
15969         }
15970       break;
15971     case 512:
15972       names = names_zmm;
15973       break;
15974     default:
15975       abort ();
15976       break;
15977     }
15978   oappend (names[reg]);
15979 }
15980
15981 /* Get the VEX immediate byte without moving codep.  */
15982
15983 static unsigned char
15984 get_vex_imm8 (int sizeflag, int opnum)
15985 {
15986   int bytes_before_imm = 0;
15987
15988   if (modrm.mod != 3)
15989     {
15990       /* There are SIB/displacement bytes.  */
15991       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
15992         {
15993           /* 32/64 bit address mode */
15994           int base = modrm.rm;
15995
15996           /* Check SIB byte.  */
15997           if (base == 4)
15998             {
15999               FETCH_DATA (the_info, codep + 1);
16000               base = *codep & 7;
16001               /* When decoding the third source, don't increase
16002                  bytes_before_imm as this has already been incremented
16003                  by one in OP_E_memory while decoding the second
16004                  source operand.  */
16005               if (opnum == 0)
16006                 bytes_before_imm++;
16007             }
16008
16009           /* Don't increase bytes_before_imm when decoding the third source,
16010              it has already been incremented by OP_E_memory while decoding
16011              the second source operand.  */
16012           if (opnum == 0)
16013             {
16014               switch (modrm.mod)
16015                 {
16016                   case 0:
16017                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16018                        SIB == 5, there is a 4 byte displacement.  */
16019                     if (base != 5)
16020                       /* No displacement. */
16021                       break;
16022                     /* Fall through.  */
16023                   case 2:
16024                     /* 4 byte displacement.  */
16025                     bytes_before_imm += 4;
16026                     break;
16027                   case 1:
16028                     /* 1 byte displacement.  */
16029                     bytes_before_imm++;
16030                     break;
16031                 }
16032             }
16033         }
16034       else
16035         {
16036           /* 16 bit address mode */
16037           /* Don't increase bytes_before_imm when decoding the third source,
16038              it has already been incremented by OP_E_memory while decoding
16039              the second source operand.  */
16040           if (opnum == 0)
16041             {
16042               switch (modrm.mod)
16043                 {
16044                 case 0:
16045                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16046                   if (modrm.rm != 6)
16047                     /* No displacement. */
16048                     break;
16049                   /* Fall through.  */
16050                 case 2:
16051                   /* 2 byte displacement.  */
16052                   bytes_before_imm += 2;
16053                   break;
16054                 case 1:
16055                   /* 1 byte displacement: when decoding the third source,
16056                      don't increase bytes_before_imm as this has already
16057                      been incremented by one in OP_E_memory while decoding
16058                      the second source operand.  */
16059                   if (opnum == 0)
16060                     bytes_before_imm++;
16061
16062                   break;
16063                 }
16064             }
16065         }
16066     }
16067
16068   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16069   return codep [bytes_before_imm];
16070 }
16071
16072 static void
16073 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16074 {
16075   const char **names;
16076
16077   if (reg == -1 && modrm.mod != 3)
16078     {
16079       OP_E_memory (bytemode, sizeflag);
16080       return;
16081     }
16082   else
16083     {
16084       if (reg == -1)
16085         {
16086           reg = modrm.rm;
16087           USED_REX (REX_B);
16088           if (rex & REX_B)
16089             reg += 8;
16090         }
16091       if (address_mode != mode_64bit)
16092         reg &= 7;
16093     }
16094
16095   switch (vex.length)
16096     {
16097     case 128:
16098       names = names_xmm;
16099       break;
16100     case 256:
16101       names = names_ymm;
16102       break;
16103     default:
16104       abort ();
16105     }
16106   oappend (names[reg]);
16107 }
16108
16109 static void
16110 OP_EX_VexImmW (int bytemode, int sizeflag)
16111 {
16112   int reg = -1;
16113   static unsigned char vex_imm8;
16114
16115   if (vex_w_done == 0)
16116     {
16117       vex_w_done = 1;
16118
16119       /* Skip mod/rm byte.  */
16120       MODRM_CHECK;
16121       codep++;
16122
16123       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16124
16125       if (vex.w)
16126           reg = vex_imm8 >> 4;
16127
16128       OP_EX_VexReg (bytemode, sizeflag, reg);
16129     }
16130   else if (vex_w_done == 1)
16131     {
16132       vex_w_done = 2;
16133
16134       if (!vex.w)
16135           reg = vex_imm8 >> 4;
16136
16137       OP_EX_VexReg (bytemode, sizeflag, reg);
16138     }
16139   else
16140     {
16141       /* Output the imm8 directly.  */
16142       scratchbuf[0] = '$';
16143       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16144       oappend_maybe_intel (scratchbuf);
16145       scratchbuf[0] = '\0';
16146       codep++;
16147     }
16148 }
16149
16150 static void
16151 OP_Vex_2src (int bytemode, int sizeflag)
16152 {
16153   if (modrm.mod == 3)
16154     {
16155       int reg = modrm.rm;
16156       USED_REX (REX_B);
16157       if (rex & REX_B)
16158         reg += 8;
16159       oappend (names_xmm[reg]);
16160     }
16161   else
16162     {
16163       if (intel_syntax
16164           && (bytemode == v_mode || bytemode == v_swap_mode))
16165         {
16166           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16167           used_prefixes |= (prefixes & PREFIX_DATA);
16168         }
16169       OP_E (bytemode, sizeflag);
16170     }
16171 }
16172
16173 static void
16174 OP_Vex_2src_1 (int bytemode, int sizeflag)
16175 {
16176   if (modrm.mod == 3)
16177     {
16178       /* Skip mod/rm byte.   */
16179       MODRM_CHECK;
16180       codep++;
16181     }
16182
16183   if (vex.w)
16184     {
16185       unsigned int reg = vex.register_specifier;
16186       vex.register_specifier = 0;
16187
16188       if (address_mode != mode_64bit)
16189         reg &= 7;
16190       oappend (names_xmm[reg]);
16191     }
16192   else
16193     OP_Vex_2src (bytemode, sizeflag);
16194 }
16195
16196 static void
16197 OP_Vex_2src_2 (int bytemode, int sizeflag)
16198 {
16199   if (vex.w)
16200     OP_Vex_2src (bytemode, sizeflag);
16201   else
16202     {
16203       unsigned int reg = vex.register_specifier;
16204       vex.register_specifier = 0;
16205
16206       if (address_mode != mode_64bit)
16207         reg &= 7;
16208       oappend (names_xmm[reg]);
16209     }
16210 }
16211
16212 static void
16213 OP_EX_VexW (int bytemode, int sizeflag)
16214 {
16215   int reg = -1;
16216
16217   if (!vex_w_done)
16218     {
16219       /* Skip mod/rm byte.  */
16220       MODRM_CHECK;
16221       codep++;
16222
16223       if (vex.w)
16224         reg = get_vex_imm8 (sizeflag, 0) >> 4;
16225     }
16226   else
16227     {
16228       if (!vex.w)
16229         reg = get_vex_imm8 (sizeflag, 1) >> 4;
16230     }
16231
16232   OP_EX_VexReg (bytemode, sizeflag, reg);
16233
16234   if (vex_w_done)
16235     codep++;
16236   vex_w_done = 1;
16237 }
16238
16239 static void
16240 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16241 {
16242   int reg;
16243   const char **names;
16244
16245   FETCH_DATA (the_info, codep + 1);
16246   reg = *codep++;
16247
16248   if (bytemode != x_mode)
16249     abort ();
16250
16251   reg >>= 4;
16252   if (address_mode != mode_64bit)
16253     reg &= 7;
16254
16255   switch (vex.length)
16256     {
16257     case 128:
16258       names = names_xmm;
16259       break;
16260     case 256:
16261       names = names_ymm;
16262       break;
16263     default:
16264       abort ();
16265     }
16266   oappend (names[reg]);
16267 }
16268
16269 static void
16270 OP_XMM_VexW (int bytemode, int sizeflag)
16271 {
16272   /* Turn off the REX.W bit since it is used for swapping operands
16273      now.  */
16274   rex &= ~REX_W;
16275   OP_XMM (bytemode, sizeflag);
16276 }
16277
16278 static void
16279 OP_EX_Vex (int bytemode, int sizeflag)
16280 {
16281   if (modrm.mod != 3)
16282     need_vex_reg = 0;
16283   OP_EX (bytemode, sizeflag);
16284 }
16285
16286 static void
16287 OP_XMM_Vex (int bytemode, int sizeflag)
16288 {
16289   if (modrm.mod != 3)
16290     need_vex_reg = 0;
16291   OP_XMM (bytemode, sizeflag);
16292 }
16293
16294 static struct op vex_cmp_op[] =
16295 {
16296   { STRING_COMMA_LEN ("eq") },
16297   { STRING_COMMA_LEN ("lt") },
16298   { STRING_COMMA_LEN ("le") },
16299   { STRING_COMMA_LEN ("unord") },
16300   { STRING_COMMA_LEN ("neq") },
16301   { STRING_COMMA_LEN ("nlt") },
16302   { STRING_COMMA_LEN ("nle") },
16303   { STRING_COMMA_LEN ("ord") },
16304   { STRING_COMMA_LEN ("eq_uq") },
16305   { STRING_COMMA_LEN ("nge") },
16306   { STRING_COMMA_LEN ("ngt") },
16307   { STRING_COMMA_LEN ("false") },
16308   { STRING_COMMA_LEN ("neq_oq") },
16309   { STRING_COMMA_LEN ("ge") },
16310   { STRING_COMMA_LEN ("gt") },
16311   { STRING_COMMA_LEN ("true") },
16312   { STRING_COMMA_LEN ("eq_os") },
16313   { STRING_COMMA_LEN ("lt_oq") },
16314   { STRING_COMMA_LEN ("le_oq") },
16315   { STRING_COMMA_LEN ("unord_s") },
16316   { STRING_COMMA_LEN ("neq_us") },
16317   { STRING_COMMA_LEN ("nlt_uq") },
16318   { STRING_COMMA_LEN ("nle_uq") },
16319   { STRING_COMMA_LEN ("ord_s") },
16320   { STRING_COMMA_LEN ("eq_us") },
16321   { STRING_COMMA_LEN ("nge_uq") },
16322   { STRING_COMMA_LEN ("ngt_uq") },
16323   { STRING_COMMA_LEN ("false_os") },
16324   { STRING_COMMA_LEN ("neq_os") },
16325   { STRING_COMMA_LEN ("ge_oq") },
16326   { STRING_COMMA_LEN ("gt_oq") },
16327   { STRING_COMMA_LEN ("true_us") },
16328 };
16329
16330 static void
16331 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16332 {
16333   unsigned int cmp_type;
16334
16335   FETCH_DATA (the_info, codep + 1);
16336   cmp_type = *codep++ & 0xff;
16337   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16338     {
16339       char suffix [3];
16340       char *p = mnemonicendp - 2;
16341       suffix[0] = p[0];
16342       suffix[1] = p[1];
16343       suffix[2] = '\0';
16344       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16345       mnemonicendp += vex_cmp_op[cmp_type].len;
16346     }
16347   else
16348     {
16349       /* We have a reserved extension byte.  Output it directly.  */
16350       scratchbuf[0] = '$';
16351       print_operand_value (scratchbuf + 1, 1, cmp_type);
16352       oappend_maybe_intel (scratchbuf);
16353       scratchbuf[0] = '\0';
16354     }
16355 }
16356
16357 static void
16358 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16359              int sizeflag ATTRIBUTE_UNUSED)
16360 {
16361   unsigned int cmp_type;
16362
16363   if (!vex.evex)
16364     abort ();
16365
16366   FETCH_DATA (the_info, codep + 1);
16367   cmp_type = *codep++ & 0xff;
16368   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16369      If it's the case, print suffix, otherwise - print the immediate.  */
16370   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16371       && cmp_type != 3
16372       && cmp_type != 7)
16373     {
16374       char suffix [3];
16375       char *p = mnemonicendp - 2;
16376
16377       /* vpcmp* can have both one- and two-lettered suffix.  */
16378       if (p[0] == 'p')
16379         {
16380           p++;
16381           suffix[0] = p[0];
16382           suffix[1] = '\0';
16383         }
16384       else
16385         {
16386           suffix[0] = p[0];
16387           suffix[1] = p[1];
16388           suffix[2] = '\0';
16389         }
16390
16391       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16392       mnemonicendp += simd_cmp_op[cmp_type].len;
16393     }
16394   else
16395     {
16396       /* We have a reserved extension byte.  Output it directly.  */
16397       scratchbuf[0] = '$';
16398       print_operand_value (scratchbuf + 1, 1, cmp_type);
16399       oappend_maybe_intel (scratchbuf);
16400       scratchbuf[0] = '\0';
16401     }
16402 }
16403
16404 static const struct op xop_cmp_op[] =
16405 {
16406   { STRING_COMMA_LEN ("lt") },
16407   { STRING_COMMA_LEN ("le") },
16408   { STRING_COMMA_LEN ("gt") },
16409   { STRING_COMMA_LEN ("ge") },
16410   { STRING_COMMA_LEN ("eq") },
16411   { STRING_COMMA_LEN ("neq") },
16412   { STRING_COMMA_LEN ("false") },
16413   { STRING_COMMA_LEN ("true") }
16414 };
16415
16416 static void
16417 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16418              int sizeflag ATTRIBUTE_UNUSED)
16419 {
16420   unsigned int cmp_type;
16421
16422   FETCH_DATA (the_info, codep + 1);
16423   cmp_type = *codep++ & 0xff;
16424   if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16425     {
16426       char suffix[3];
16427       char *p = mnemonicendp - 2;
16428
16429       /* vpcom* can have both one- and two-lettered suffix.  */
16430       if (p[0] == 'm')
16431         {
16432           p++;
16433           suffix[0] = p[0];
16434           suffix[1] = '\0';
16435         }
16436       else
16437         {
16438           suffix[0] = p[0];
16439           suffix[1] = p[1];
16440           suffix[2] = '\0';
16441         }
16442
16443       sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16444       mnemonicendp += xop_cmp_op[cmp_type].len;
16445     }
16446   else
16447     {
16448       /* We have a reserved extension byte.  Output it directly.  */
16449       scratchbuf[0] = '$';
16450       print_operand_value (scratchbuf + 1, 1, cmp_type);
16451       oappend_maybe_intel (scratchbuf);
16452       scratchbuf[0] = '\0';
16453     }
16454 }
16455
16456 static const struct op pclmul_op[] =
16457 {
16458   { STRING_COMMA_LEN ("lql") },
16459   { STRING_COMMA_LEN ("hql") },
16460   { STRING_COMMA_LEN ("lqh") },
16461   { STRING_COMMA_LEN ("hqh") }
16462 };
16463
16464 static void
16465 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16466               int sizeflag ATTRIBUTE_UNUSED)
16467 {
16468   unsigned int pclmul_type;
16469
16470   FETCH_DATA (the_info, codep + 1);
16471   pclmul_type = *codep++ & 0xff;
16472   switch (pclmul_type)
16473     {
16474     case 0x10:
16475       pclmul_type = 2;
16476       break;
16477     case 0x11:
16478       pclmul_type = 3;
16479       break;
16480     default:
16481       break;
16482     }
16483   if (pclmul_type < ARRAY_SIZE (pclmul_op))
16484     {
16485       char suffix [4];
16486       char *p = mnemonicendp - 3;
16487       suffix[0] = p[0];
16488       suffix[1] = p[1];
16489       suffix[2] = p[2];
16490       suffix[3] = '\0';
16491       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16492       mnemonicendp += pclmul_op[pclmul_type].len;
16493     }
16494   else
16495     {
16496       /* We have a reserved extension byte.  Output it directly.  */
16497       scratchbuf[0] = '$';
16498       print_operand_value (scratchbuf + 1, 1, pclmul_type);
16499       oappend_maybe_intel (scratchbuf);
16500       scratchbuf[0] = '\0';
16501     }
16502 }
16503
16504 static void
16505 MOVBE_Fixup (int bytemode, int sizeflag)
16506 {
16507   /* Add proper suffix to "movbe".  */
16508   char *p = mnemonicendp;
16509
16510   switch (bytemode)
16511     {
16512     case v_mode:
16513       if (intel_syntax)
16514         goto skip;
16515
16516       USED_REX (REX_W);
16517       if (sizeflag & SUFFIX_ALWAYS)
16518         {
16519           if (rex & REX_W)
16520             *p++ = 'q';
16521           else
16522             {
16523               if (sizeflag & DFLAG)
16524                 *p++ = 'l';
16525               else
16526                 *p++ = 'w';
16527               used_prefixes |= (prefixes & PREFIX_DATA);
16528             }
16529         }
16530       break;
16531     default:
16532       oappend (INTERNAL_DISASSEMBLER_ERROR);
16533       break;
16534     }
16535   mnemonicendp = p;
16536   *p = '\0';
16537
16538 skip:
16539   OP_M (bytemode, sizeflag);
16540 }
16541
16542 static void
16543 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16544 {
16545   int reg;
16546   const char **names;
16547
16548   /* Skip mod/rm byte.  */
16549   MODRM_CHECK;
16550   codep++;
16551
16552   if (rex & REX_W)
16553     names = names64;
16554   else
16555     names = names32;
16556
16557   reg = modrm.rm;
16558   USED_REX (REX_B);
16559   if (rex & REX_B)
16560     reg += 8;
16561
16562   oappend (names[reg]);
16563 }
16564
16565 static void
16566 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16567 {
16568   const char **names;
16569   unsigned int reg = vex.register_specifier;
16570   vex.register_specifier = 0;
16571
16572   if (rex & REX_W)
16573     names = names64;
16574   else
16575     names = names32;
16576
16577   if (address_mode != mode_64bit)
16578     reg &= 7;
16579   oappend (names[reg]);
16580 }
16581
16582 static void
16583 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16584 {
16585   if (!vex.evex
16586       || (bytemode != mask_mode && bytemode != mask_bd_mode))
16587     abort ();
16588
16589   USED_REX (REX_R);
16590   if ((rex & REX_R) != 0 || !vex.r)
16591     {
16592       BadOp ();
16593       return;
16594     }
16595
16596   oappend (names_mask [modrm.reg]);
16597 }
16598
16599 static void
16600 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16601 {
16602   if (!vex.evex
16603       || (bytemode != evex_rounding_mode
16604           && bytemode != evex_rounding_64_mode
16605           && bytemode != evex_sae_mode))
16606     abort ();
16607   if (modrm.mod == 3 && vex.b)
16608     switch (bytemode)
16609       {
16610       case evex_rounding_64_mode:
16611         if (address_mode != mode_64bit)
16612           {
16613             oappend ("(bad)");
16614             break;
16615           }
16616         /* Fall through.  */
16617       case evex_rounding_mode:
16618         oappend (names_rounding[vex.ll]);
16619         break;
16620       case evex_sae_mode:
16621         oappend ("{sae}");
16622         break;
16623       default:
16624         break;
16625       }
16626 }