i386: Check vector length for EVEX broadcast instructions
[external/binutils.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright (C) 1988-2019 Free Software Foundation, Inc.
3
4    This file is part of the GNU opcodes library.
5
6    This library is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10
11    It is distributed in the hope that it will be useful, but WITHOUT
12    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14    License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20
21
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23    July 1988
24     modified by John Hassey (hassey@dg-rtp.dg.com)
25     x86-64 support added by Jan Hubicka (jh@suse.cz)
26     VIA PadLock support by Michal Ludvig (mludvig@suse.cz).  */
27
28 /* The main tables describing the instructions is essentially a copy
29    of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30    Programmers Manual.  Usually, there is a capital letter, followed
31    by a small letter.  The capital letter tell the addressing mode,
32    and the small letter tells about the operand size.  Refer to
33    the Intel manual for details.  */
34
35 #include "sysdep.h"
36 #include "disassemble.h"
37 #include "opintl.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40
41 #include <setjmp.h>
42
43 static int print_insn (bfd_vma, disassemble_info *);
44 static void dofloat (int);
45 static void OP_ST (int, int);
46 static void OP_STi (int, int);
47 static int putop (const char *, int);
48 static void oappend (const char *);
49 static void append_seg (void);
50 static void OP_indirE (int, int);
51 static void print_operand_value (char *, int, bfd_vma);
52 static void OP_E_register (int, int);
53 static void OP_E_memory (int, int);
54 static void print_displacement (char *, bfd_vma);
55 static void OP_E (int, int);
56 static void OP_G (int, int);
57 static bfd_vma get64 (void);
58 static bfd_signed_vma get32 (void);
59 static bfd_signed_vma get32s (void);
60 static int get16 (void);
61 static void set_op (bfd_vma, int);
62 static void OP_Skip_MODRM (int, int);
63 static void OP_REG (int, int);
64 static void OP_IMREG (int, int);
65 static void OP_I (int, int);
66 static void OP_I64 (int, int);
67 static void OP_sI (int, int);
68 static void OP_J (int, int);
69 static void OP_SEG (int, int);
70 static void OP_DIR (int, int);
71 static void OP_OFF (int, int);
72 static void OP_OFF64 (int, int);
73 static void ptr_reg (int, int);
74 static void OP_ESreg (int, int);
75 static void OP_DSreg (int, int);
76 static void OP_C (int, int);
77 static void OP_D (int, int);
78 static void OP_T (int, int);
79 static void OP_R (int, int);
80 static void OP_MMX (int, int);
81 static void OP_XMM (int, int);
82 static void OP_EM (int, int);
83 static void OP_EX (int, int);
84 static void OP_EMC (int,int);
85 static void OP_MXC (int,int);
86 static void OP_MS (int, int);
87 static void OP_XS (int, int);
88 static void OP_M (int, int);
89 static void OP_VEX (int, int);
90 static void OP_EX_Vex (int, int);
91 static void OP_EX_VexW (int, int);
92 static void OP_EX_VexImmW (int, int);
93 static void OP_XMM_Vex (int, int);
94 static void OP_XMM_VexW (int, int);
95 static void OP_Rounding (int, int);
96 static void OP_REG_VexI4 (int, int);
97 static void PCLMUL_Fixup (int, int);
98 static void VCMP_Fixup (int, int);
99 static void VPCMP_Fixup (int, int);
100 static void VPCOM_Fixup (int, int);
101 static void OP_0f07 (int, int);
102 static void OP_Monitor (int, int);
103 static void OP_Mwait (int, int);
104 static void OP_Mwaitx (int, int);
105 static void NOP_Fixup1 (int, int);
106 static void NOP_Fixup2 (int, int);
107 static void OP_3DNowSuffix (int, int);
108 static void CMP_Fixup (int, int);
109 static void BadOp (void);
110 static void REP_Fixup (int, int);
111 static void BND_Fixup (int, int);
112 static void NOTRACK_Fixup (int, int);
113 static void HLE_Fixup1 (int, int);
114 static void HLE_Fixup2 (int, int);
115 static void HLE_Fixup3 (int, int);
116 static void CMPXCHG8B_Fixup (int, int);
117 static void XMM_Fixup (int, int);
118 static void CRC32_Fixup (int, int);
119 static void FXSAVE_Fixup (int, int);
120 static void PCMPESTR_Fixup (int, int);
121 static void OP_LWPCB_E (int, int);
122 static void OP_LWP_E (int, int);
123 static void OP_Vex_2src_1 (int, int);
124 static void OP_Vex_2src_2 (int, int);
125
126 static void MOVBE_Fixup (int, int);
127
128 static void OP_Mask (int, int);
129
130 struct dis_private {
131   /* Points to first byte not fetched.  */
132   bfd_byte *max_fetched;
133   bfd_byte the_buffer[MAX_MNEM_SIZE];
134   bfd_vma insn_start;
135   int orig_sizeflag;
136   OPCODES_SIGJMP_BUF bailout;
137 };
138
139 enum address_mode
140 {
141   mode_16bit,
142   mode_32bit,
143   mode_64bit
144 };
145
146 enum address_mode address_mode;
147
148 /* Flags for the prefixes for the current instruction.  See below.  */
149 static int prefixes;
150
151 /* REX prefix the current instruction.  See below.  */
152 static int rex;
153 /* Bits of REX we've already used.  */
154 static int rex_used;
155 /* REX bits in original REX prefix ignored.  */
156 static int rex_ignored;
157 /* Mark parts used in the REX prefix.  When we are testing for
158    empty prefix (for 8bit register REX extension), just mask it
159    out.  Otherwise test for REX bit is excuse for existence of REX
160    only in case value is nonzero.  */
161 #define USED_REX(value)                                 \
162   {                                                     \
163     if (value)                                          \
164       {                                                 \
165         if ((rex & value))                              \
166           rex_used |= (value) | REX_OPCODE;             \
167       }                                                 \
168     else                                                \
169       rex_used |= REX_OPCODE;                           \
170   }
171
172 /* Flags for prefixes which we somehow handled when printing the
173    current instruction.  */
174 static int used_prefixes;
175
176 /* Flags stored in PREFIXES.  */
177 #define PREFIX_REPZ 1
178 #define PREFIX_REPNZ 2
179 #define PREFIX_LOCK 4
180 #define PREFIX_CS 8
181 #define PREFIX_SS 0x10
182 #define PREFIX_DS 0x20
183 #define PREFIX_ES 0x40
184 #define PREFIX_FS 0x80
185 #define PREFIX_GS 0x100
186 #define PREFIX_DATA 0x200
187 #define PREFIX_ADDR 0x400
188 #define PREFIX_FWAIT 0x800
189
190 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
191    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
192    on error.  */
193 #define FETCH_DATA(info, addr) \
194   ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
195    ? 1 : fetch_data ((info), (addr)))
196
197 static int
198 fetch_data (struct disassemble_info *info, bfd_byte *addr)
199 {
200   int status;
201   struct dis_private *priv = (struct dis_private *) info->private_data;
202   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
203
204   if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
205     status = (*info->read_memory_func) (start,
206                                         priv->max_fetched,
207                                         addr - priv->max_fetched,
208                                         info);
209   else
210     status = -1;
211   if (status != 0)
212     {
213       /* If we did manage to read at least one byte, then
214          print_insn_i386 will do something sensible.  Otherwise, print
215          an error.  We do that here because this is where we know
216          STATUS.  */
217       if (priv->max_fetched == priv->the_buffer)
218         (*info->memory_error_func) (status, start, info);
219       OPCODES_SIGLONGJMP (priv->bailout, 1);
220     }
221   else
222     priv->max_fetched = addr;
223   return 1;
224 }
225
226 /* Possible values for prefix requirement.  */
227 #define PREFIX_IGNORED_SHIFT    16
228 #define PREFIX_IGNORED_REPZ     (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
229 #define PREFIX_IGNORED_REPNZ    (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
230 #define PREFIX_IGNORED_DATA     (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
231 #define PREFIX_IGNORED_ADDR     (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
232 #define PREFIX_IGNORED_LOCK     (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
233
234 /* Opcode prefixes.  */
235 #define PREFIX_OPCODE           (PREFIX_REPZ \
236                                  | PREFIX_REPNZ \
237                                  | PREFIX_DATA)
238
239 /* Prefixes ignored.  */
240 #define PREFIX_IGNORED          (PREFIX_IGNORED_REPZ \
241                                  | PREFIX_IGNORED_REPNZ \
242                                  | PREFIX_IGNORED_DATA)
243
244 #define XX { NULL, 0 }
245 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
246
247 #define Eb { OP_E, b_mode }
248 #define Ebnd { OP_E, bnd_mode }
249 #define EbS { OP_E, b_swap_mode }
250 #define EbndS { OP_E, bnd_swap_mode }
251 #define Ev { OP_E, v_mode }
252 #define Eva { OP_E, va_mode }
253 #define Ev_bnd { OP_E, v_bnd_mode }
254 #define EvS { OP_E, v_swap_mode }
255 #define Ed { OP_E, d_mode }
256 #define Edq { OP_E, dq_mode }
257 #define Edqw { OP_E, dqw_mode }
258 #define Edqb { OP_E, dqb_mode }
259 #define Edb { OP_E, db_mode }
260 #define Edw { OP_E, dw_mode }
261 #define Edqd { OP_E, dqd_mode }
262 #define Edqa { OP_E, dqa_mode }
263 #define Eq { OP_E, q_mode }
264 #define indirEv { OP_indirE, indir_v_mode }
265 #define indirEp { OP_indirE, f_mode }
266 #define stackEv { OP_E, stack_v_mode }
267 #define Em { OP_E, m_mode }
268 #define Ew { OP_E, w_mode }
269 #define M { OP_M, 0 }           /* lea, lgdt, etc. */
270 #define Ma { OP_M, a_mode }
271 #define Mb { OP_M, b_mode }
272 #define Md { OP_M, d_mode }
273 #define Mo { OP_M, o_mode }
274 #define Mp { OP_M, f_mode }             /* 32 or 48 bit memory operand for LDS, LES etc */
275 #define Mq { OP_M, q_mode }
276 #define Mv_bnd { OP_M, v_bndmk_mode }
277 #define Mx { OP_M, x_mode }
278 #define Mxmm { OP_M, xmm_mode }
279 #define Gb { OP_G, b_mode }
280 #define Gbnd { OP_G, bnd_mode }
281 #define Gv { OP_G, v_mode }
282 #define Gd { OP_G, d_mode }
283 #define Gdq { OP_G, dq_mode }
284 #define Gm { OP_G, m_mode }
285 #define Gva { OP_G, va_mode }
286 #define Gw { OP_G, w_mode }
287 #define Rd { OP_R, d_mode }
288 #define Rdq { OP_R, dq_mode }
289 #define Rm { OP_R, m_mode }
290 #define Ib { OP_I, b_mode }
291 #define sIb { OP_sI, b_mode }   /* sign extened byte */
292 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
293 #define Iv { OP_I, v_mode }
294 #define sIv { OP_sI, v_mode }
295 #define Iq { OP_I, q_mode }
296 #define Iv64 { OP_I64, v_mode }
297 #define Iw { OP_I, w_mode }
298 #define I1 { OP_I, const_1_mode }
299 #define Jb { OP_J, b_mode }
300 #define Jv { OP_J, v_mode }
301 #define Cm { OP_C, m_mode }
302 #define Dm { OP_D, m_mode }
303 #define Td { OP_T, d_mode }
304 #define Skip_MODRM { OP_Skip_MODRM, 0 }
305
306 #define RMeAX { OP_REG, eAX_reg }
307 #define RMeBX { OP_REG, eBX_reg }
308 #define RMeCX { OP_REG, eCX_reg }
309 #define RMeDX { OP_REG, eDX_reg }
310 #define RMeSP { OP_REG, eSP_reg }
311 #define RMeBP { OP_REG, eBP_reg }
312 #define RMeSI { OP_REG, eSI_reg }
313 #define RMeDI { OP_REG, eDI_reg }
314 #define RMrAX { OP_REG, rAX_reg }
315 #define RMrBX { OP_REG, rBX_reg }
316 #define RMrCX { OP_REG, rCX_reg }
317 #define RMrDX { OP_REG, rDX_reg }
318 #define RMrSP { OP_REG, rSP_reg }
319 #define RMrBP { OP_REG, rBP_reg }
320 #define RMrSI { OP_REG, rSI_reg }
321 #define RMrDI { OP_REG, rDI_reg }
322 #define RMAL { OP_REG, al_reg }
323 #define RMCL { OP_REG, cl_reg }
324 #define RMDL { OP_REG, dl_reg }
325 #define RMBL { OP_REG, bl_reg }
326 #define RMAH { OP_REG, ah_reg }
327 #define RMCH { OP_REG, ch_reg }
328 #define RMDH { OP_REG, dh_reg }
329 #define RMBH { OP_REG, bh_reg }
330 #define RMAX { OP_REG, ax_reg }
331 #define RMDX { OP_REG, dx_reg }
332
333 #define eAX { OP_IMREG, eAX_reg }
334 #define eBX { OP_IMREG, eBX_reg }
335 #define eCX { OP_IMREG, eCX_reg }
336 #define eDX { OP_IMREG, eDX_reg }
337 #define eSP { OP_IMREG, eSP_reg }
338 #define eBP { OP_IMREG, eBP_reg }
339 #define eSI { OP_IMREG, eSI_reg }
340 #define eDI { OP_IMREG, eDI_reg }
341 #define AL { OP_IMREG, al_reg }
342 #define CL { OP_IMREG, cl_reg }
343 #define DL { OP_IMREG, dl_reg }
344 #define BL { OP_IMREG, bl_reg }
345 #define AH { OP_IMREG, ah_reg }
346 #define CH { OP_IMREG, ch_reg }
347 #define DH { OP_IMREG, dh_reg }
348 #define BH { OP_IMREG, bh_reg }
349 #define AX { OP_IMREG, ax_reg }
350 #define DX { OP_IMREG, dx_reg }
351 #define zAX { OP_IMREG, z_mode_ax_reg }
352 #define indirDX { OP_IMREG, indir_dx_reg }
353
354 #define Sw { OP_SEG, w_mode }
355 #define Sv { OP_SEG, v_mode }
356 #define Ap { OP_DIR, 0 }
357 #define Ob { OP_OFF64, b_mode }
358 #define Ov { OP_OFF64, v_mode }
359 #define Xb { OP_DSreg, eSI_reg }
360 #define Xv { OP_DSreg, eSI_reg }
361 #define Xz { OP_DSreg, eSI_reg }
362 #define Yb { OP_ESreg, eDI_reg }
363 #define Yv { OP_ESreg, eDI_reg }
364 #define DSBX { OP_DSreg, eBX_reg }
365
366 #define es { OP_REG, es_reg }
367 #define ss { OP_REG, ss_reg }
368 #define cs { OP_REG, cs_reg }
369 #define ds { OP_REG, ds_reg }
370 #define fs { OP_REG, fs_reg }
371 #define gs { OP_REG, gs_reg }
372
373 #define MX { OP_MMX, 0 }
374 #define XM { OP_XMM, 0 }
375 #define XMScalar { OP_XMM, scalar_mode }
376 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
377 #define XMM { OP_XMM, xmm_mode }
378 #define XMxmmq { OP_XMM, xmmq_mode }
379 #define EM { OP_EM, v_mode }
380 #define EMS { OP_EM, v_swap_mode }
381 #define EMd { OP_EM, d_mode }
382 #define EMx { OP_EM, x_mode }
383 #define EXbScalar { OP_EX, b_scalar_mode }
384 #define EXw { OP_EX, w_mode }
385 #define EXwScalar { OP_EX, w_scalar_mode }
386 #define EXd { OP_EX, d_mode }
387 #define EXdScalar { OP_EX, d_scalar_mode }
388 #define EXdS { OP_EX, d_swap_mode }
389 #define EXdScalarS { OP_EX, d_scalar_swap_mode }
390 #define EXq { OP_EX, q_mode }
391 #define EXqScalar { OP_EX, q_scalar_mode }
392 #define EXqScalarS { OP_EX, q_scalar_swap_mode }
393 #define EXqS { OP_EX, q_swap_mode }
394 #define EXx { OP_EX, x_mode }
395 #define EXxS { OP_EX, x_swap_mode }
396 #define EXxmm { OP_EX, xmm_mode }
397 #define EXymm { OP_EX, ymm_mode }
398 #define EXxmmq { OP_EX, xmmq_mode }
399 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
400 #define EXxmm_mb { OP_EX, xmm_mb_mode }
401 #define EXxmm_mw { OP_EX, xmm_mw_mode }
402 #define EXxmm_md { OP_EX, xmm_md_mode }
403 #define EXxmm_mq { OP_EX, xmm_mq_mode }
404 #define EXxmm_mdq { OP_EX, xmm_mdq_mode }
405 #define EXxmmdw { OP_EX, xmmdw_mode }
406 #define EXxmmqd { OP_EX, xmmqd_mode }
407 #define EXymmq { OP_EX, ymmq_mode }
408 #define EXVexWdq { OP_EX, vex_w_dq_mode }
409 #define EXVexWdqScalar { OP_EX, vex_scalar_w_dq_mode }
410 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
411 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
412 #define MS { OP_MS, v_mode }
413 #define XS { OP_XS, v_mode }
414 #define EMCq { OP_EMC, q_mode }
415 #define MXC { OP_MXC, 0 }
416 #define OPSUF { OP_3DNowSuffix, 0 }
417 #define CMP { CMP_Fixup, 0 }
418 #define XMM0 { XMM_Fixup, 0 }
419 #define FXSAVE { FXSAVE_Fixup, 0 }
420 #define Vex_2src_1 { OP_Vex_2src_1, 0 }
421 #define Vex_2src_2 { OP_Vex_2src_2, 0 }
422
423 #define Vex { OP_VEX, vex_mode }
424 #define VexScalar { OP_VEX, vex_scalar_mode }
425 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
426 #define Vex128 { OP_VEX, vex128_mode }
427 #define Vex256 { OP_VEX, vex256_mode }
428 #define VexGdq { OP_VEX, dq_mode }
429 #define EXdVex { OP_EX_Vex, d_mode }
430 #define EXdVexS { OP_EX_Vex, d_swap_mode }
431 #define EXdVexScalarS { OP_EX_Vex, d_scalar_swap_mode }
432 #define EXqVex { OP_EX_Vex, q_mode }
433 #define EXqVexS { OP_EX_Vex, q_swap_mode }
434 #define EXqVexScalarS { OP_EX_Vex, q_scalar_swap_mode }
435 #define EXVexW { OP_EX_VexW, x_mode }
436 #define EXdVexW { OP_EX_VexW, d_mode }
437 #define EXqVexW { OP_EX_VexW, q_mode }
438 #define EXVexImmW { OP_EX_VexImmW, x_mode }
439 #define XMVex { OP_XMM_Vex, 0 }
440 #define XMVexScalar { OP_XMM_Vex, scalar_mode }
441 #define XMVexW { OP_XMM_VexW, 0 }
442 #define XMVexI4 { OP_REG_VexI4, x_mode }
443 #define PCLMUL { PCLMUL_Fixup, 0 }
444 #define VCMP { VCMP_Fixup, 0 }
445 #define VPCMP { VPCMP_Fixup, 0 }
446 #define VPCOM { VPCOM_Fixup, 0 }
447
448 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
449 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
450 #define EXxEVexS { OP_Rounding, evex_sae_mode }
451
452 #define XMask { OP_Mask, mask_mode }
453 #define MaskG { OP_G, mask_mode }
454 #define MaskE { OP_E, mask_mode }
455 #define MaskBDE { OP_E, mask_bd_mode }
456 #define MaskR { OP_R, mask_mode }
457 #define MaskVex { OP_VEX, mask_mode }
458
459 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
460 #define MVexVSIBDQWpX { OP_M, vex_vsib_d_w_d_mode }
461 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
462 #define MVexVSIBQDWpX { OP_M, vex_vsib_q_w_d_mode }
463
464 /* Used handle "rep" prefix for string instructions.  */
465 #define Xbr { REP_Fixup, eSI_reg }
466 #define Xvr { REP_Fixup, eSI_reg }
467 #define Ybr { REP_Fixup, eDI_reg }
468 #define Yvr { REP_Fixup, eDI_reg }
469 #define Yzr { REP_Fixup, eDI_reg }
470 #define indirDXr { REP_Fixup, indir_dx_reg }
471 #define ALr { REP_Fixup, al_reg }
472 #define eAXr { REP_Fixup, eAX_reg }
473
474 /* Used handle HLE prefix for lockable instructions.  */
475 #define Ebh1 { HLE_Fixup1, b_mode }
476 #define Evh1 { HLE_Fixup1, v_mode }
477 #define Ebh2 { HLE_Fixup2, b_mode }
478 #define Evh2 { HLE_Fixup2, v_mode }
479 #define Ebh3 { HLE_Fixup3, b_mode }
480 #define Evh3 { HLE_Fixup3, v_mode }
481
482 #define BND { BND_Fixup, 0 }
483 #define NOTRACK { NOTRACK_Fixup, 0 }
484
485 #define cond_jump_flag { NULL, cond_jump_mode }
486 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
487
488 /* bits in sizeflag */
489 #define SUFFIX_ALWAYS 4
490 #define AFLAG 2
491 #define DFLAG 1
492
493 enum
494 {
495   /* byte operand */
496   b_mode = 1,
497   /* byte operand with operand swapped */
498   b_swap_mode,
499   /* byte operand, sign extend like 'T' suffix */
500   b_T_mode,
501   /* operand size depends on prefixes */
502   v_mode,
503   /* operand size depends on prefixes with operand swapped */
504   v_swap_mode,
505   /* operand size depends on address prefix */
506   va_mode,
507   /* word operand */
508   w_mode,
509   /* double word operand  */
510   d_mode,
511   /* double word operand with operand swapped */
512   d_swap_mode,
513   /* quad word operand */
514   q_mode,
515   /* quad word operand with operand swapped */
516   q_swap_mode,
517   /* ten-byte operand */
518   t_mode,
519   /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand.  In EVEX with
520      broadcast enabled.  */
521   x_mode,
522   /* Similar to x_mode, but with different EVEX mem shifts.  */
523   evex_x_gscat_mode,
524   /* Similar to x_mode, but with disabled broadcast.  */
525   evex_x_nobcst_mode,
526   /* Similar to x_mode, but with operands swapped and disabled broadcast
527      in EVEX.  */
528   x_swap_mode,
529   /* 16-byte XMM operand */
530   xmm_mode,
531   /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
532      memory operand (depending on vector length).  Broadcast isn't
533      allowed.  */
534   xmmq_mode,
535   /* Same as xmmq_mode, but broadcast is allowed.  */
536   evex_half_bcst_xmmq_mode,
537   /* XMM register or byte memory operand */
538   xmm_mb_mode,
539   /* XMM register or word memory operand */
540   xmm_mw_mode,
541   /* XMM register or double word memory operand */
542   xmm_md_mode,
543   /* XMM register or quad word memory operand */
544   xmm_mq_mode,
545   /* XMM register or double/quad word memory operand, depending on
546      VEX.W.  */
547   xmm_mdq_mode,
548   /* 16-byte XMM, word, double word or quad word operand.  */
549   xmmdw_mode,
550   /* 16-byte XMM, double word, quad word operand or xmm word operand.  */
551   xmmqd_mode,
552   /* 32-byte YMM operand */
553   ymm_mode,
554   /* quad word, ymmword or zmmword memory operand.  */
555   ymmq_mode,
556   /* 32-byte YMM or 16-byte word operand */
557   ymmxmm_mode,
558   /* d_mode in 32bit, q_mode in 64bit mode.  */
559   m_mode,
560   /* pair of v_mode operands */
561   a_mode,
562   cond_jump_mode,
563   loop_jcxz_mode,
564   v_bnd_mode,
565   /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode.  */
566   v_bndmk_mode,
567   /* operand size depends on REX prefixes.  */
568   dq_mode,
569   /* registers like dq_mode, memory like w_mode.  */
570   dqw_mode,
571   /* bounds operand */
572   bnd_mode,
573   /* bounds operand with operand swapped */
574   bnd_swap_mode,
575   /* 4- or 6-byte pointer operand */
576   f_mode,
577   const_1_mode,
578   /* v_mode for indirect branch opcodes.  */
579   indir_v_mode,
580   /* v_mode for stack-related opcodes.  */
581   stack_v_mode,
582   /* non-quad operand size depends on prefixes */
583   z_mode,
584   /* 16-byte operand */
585   o_mode,
586   /* registers like dq_mode, memory like b_mode.  */
587   dqb_mode,
588   /* registers like d_mode, memory like b_mode.  */
589   db_mode,
590   /* registers like d_mode, memory like w_mode.  */
591   dw_mode,
592   /* registers like dq_mode, memory like d_mode.  */
593   dqd_mode,
594   /* operand size depends on the W bit as well as address mode.  */
595   dqa_mode,
596   /* normal vex mode */
597   vex_mode,
598   /* 128bit vex mode */
599   vex128_mode,
600   /* 256bit vex mode */
601   vex256_mode,
602   /* operand size depends on the VEX.W bit.  */
603   vex_w_dq_mode,
604
605   /* Similar to vex_w_dq_mode, with VSIB dword indices.  */
606   vex_vsib_d_w_dq_mode,
607   /* Similar to vex_vsib_d_w_dq_mode, with smaller memory.  */
608   vex_vsib_d_w_d_mode,
609   /* Similar to vex_w_dq_mode, with VSIB qword indices.  */
610   vex_vsib_q_w_dq_mode,
611   /* Similar to vex_vsib_q_w_dq_mode, with smaller memory.  */
612   vex_vsib_q_w_d_mode,
613
614   /* scalar, ignore vector length.  */
615   scalar_mode,
616   /* like b_mode, ignore vector length.  */
617   b_scalar_mode,
618   /* like w_mode, ignore vector length.  */
619   w_scalar_mode,
620   /* like d_mode, ignore vector length.  */
621   d_scalar_mode,
622   /* like d_swap_mode, ignore vector length.  */
623   d_scalar_swap_mode,
624   /* like q_mode, ignore vector length.  */
625   q_scalar_mode,
626   /* like q_swap_mode, ignore vector length.  */
627   q_scalar_swap_mode,
628   /* like vex_mode, ignore vector length.  */
629   vex_scalar_mode,
630   /* like vex_w_dq_mode, ignore vector length.  */
631   vex_scalar_w_dq_mode,
632
633   /* Static rounding.  */
634   evex_rounding_mode,
635   /* Static rounding, 64-bit mode only.  */
636   evex_rounding_64_mode,
637   /* Supress all exceptions.  */
638   evex_sae_mode,
639
640   /* Mask register operand.  */
641   mask_mode,
642   /* Mask register operand.  */
643   mask_bd_mode,
644
645   es_reg,
646   cs_reg,
647   ss_reg,
648   ds_reg,
649   fs_reg,
650   gs_reg,
651
652   eAX_reg,
653   eCX_reg,
654   eDX_reg,
655   eBX_reg,
656   eSP_reg,
657   eBP_reg,
658   eSI_reg,
659   eDI_reg,
660
661   al_reg,
662   cl_reg,
663   dl_reg,
664   bl_reg,
665   ah_reg,
666   ch_reg,
667   dh_reg,
668   bh_reg,
669
670   ax_reg,
671   cx_reg,
672   dx_reg,
673   bx_reg,
674   sp_reg,
675   bp_reg,
676   si_reg,
677   di_reg,
678
679   rAX_reg,
680   rCX_reg,
681   rDX_reg,
682   rBX_reg,
683   rSP_reg,
684   rBP_reg,
685   rSI_reg,
686   rDI_reg,
687
688   z_mode_ax_reg,
689   indir_dx_reg
690 };
691
692 enum
693 {
694   FLOATCODE = 1,
695   USE_REG_TABLE,
696   USE_MOD_TABLE,
697   USE_RM_TABLE,
698   USE_PREFIX_TABLE,
699   USE_X86_64_TABLE,
700   USE_3BYTE_TABLE,
701   USE_XOP_8F_TABLE,
702   USE_VEX_C4_TABLE,
703   USE_VEX_C5_TABLE,
704   USE_VEX_LEN_TABLE,
705   USE_VEX_W_TABLE,
706   USE_EVEX_TABLE,
707   USE_EVEX_LEN_TABLE
708 };
709
710 #define FLOAT                   NULL, { { NULL, FLOATCODE } }, 0
711
712 #define DIS386(T, I)            NULL, { { NULL, (T)}, { NULL,  (I) } }, 0
713 #define DIS386_PREFIX(T, I, P)          NULL, { { NULL, (T)}, { NULL,  (I) } }, P
714 #define REG_TABLE(I)            DIS386 (USE_REG_TABLE, (I))
715 #define MOD_TABLE(I)            DIS386 (USE_MOD_TABLE, (I))
716 #define RM_TABLE(I)             DIS386 (USE_RM_TABLE, (I))
717 #define PREFIX_TABLE(I)         DIS386 (USE_PREFIX_TABLE, (I))
718 #define X86_64_TABLE(I)         DIS386 (USE_X86_64_TABLE, (I))
719 #define THREE_BYTE_TABLE(I)     DIS386 (USE_3BYTE_TABLE, (I))
720 #define THREE_BYTE_TABLE_PREFIX(I, P)   DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
721 #define XOP_8F_TABLE(I)         DIS386 (USE_XOP_8F_TABLE, (I))
722 #define VEX_C4_TABLE(I)         DIS386 (USE_VEX_C4_TABLE, (I))
723 #define VEX_C5_TABLE(I)         DIS386 (USE_VEX_C5_TABLE, (I))
724 #define VEX_LEN_TABLE(I)        DIS386 (USE_VEX_LEN_TABLE, (I))
725 #define VEX_W_TABLE(I)          DIS386 (USE_VEX_W_TABLE, (I))
726 #define EVEX_TABLE(I)           DIS386 (USE_EVEX_TABLE, (I))
727 #define EVEX_LEN_TABLE(I)       DIS386 (USE_EVEX_LEN_TABLE, (I))
728
729 enum
730 {
731   REG_80 = 0,
732   REG_81,
733   REG_83,
734   REG_8F,
735   REG_C0,
736   REG_C1,
737   REG_C6,
738   REG_C7,
739   REG_D0,
740   REG_D1,
741   REG_D2,
742   REG_D3,
743   REG_F6,
744   REG_F7,
745   REG_FE,
746   REG_FF,
747   REG_0F00,
748   REG_0F01,
749   REG_0F0D,
750   REG_0F18,
751   REG_0F1C_MOD_0,
752   REG_0F1E_MOD_3,
753   REG_0F71,
754   REG_0F72,
755   REG_0F73,
756   REG_0FA6,
757   REG_0FA7,
758   REG_0FAE,
759   REG_0FBA,
760   REG_0FC7,
761   REG_VEX_0F71,
762   REG_VEX_0F72,
763   REG_VEX_0F73,
764   REG_VEX_0FAE,
765   REG_VEX_0F38F3,
766   REG_XOP_LWPCB,
767   REG_XOP_LWP,
768   REG_XOP_TBM_01,
769   REG_XOP_TBM_02,
770
771   REG_EVEX_0F71,
772   REG_EVEX_0F72,
773   REG_EVEX_0F73,
774   REG_EVEX_0F38C6,
775   REG_EVEX_0F38C7
776 };
777
778 enum
779 {
780   MOD_8D = 0,
781   MOD_C6_REG_7,
782   MOD_C7_REG_7,
783   MOD_FF_REG_3,
784   MOD_FF_REG_5,
785   MOD_0F01_REG_0,
786   MOD_0F01_REG_1,
787   MOD_0F01_REG_2,
788   MOD_0F01_REG_3,
789   MOD_0F01_REG_5,
790   MOD_0F01_REG_7,
791   MOD_0F12_PREFIX_0,
792   MOD_0F13,
793   MOD_0F16_PREFIX_0,
794   MOD_0F17,
795   MOD_0F18_REG_0,
796   MOD_0F18_REG_1,
797   MOD_0F18_REG_2,
798   MOD_0F18_REG_3,
799   MOD_0F18_REG_4,
800   MOD_0F18_REG_5,
801   MOD_0F18_REG_6,
802   MOD_0F18_REG_7,
803   MOD_0F1A_PREFIX_0,
804   MOD_0F1B_PREFIX_0,
805   MOD_0F1B_PREFIX_1,
806   MOD_0F1C_PREFIX_0,
807   MOD_0F1E_PREFIX_1,
808   MOD_0F24,
809   MOD_0F26,
810   MOD_0F2B_PREFIX_0,
811   MOD_0F2B_PREFIX_1,
812   MOD_0F2B_PREFIX_2,
813   MOD_0F2B_PREFIX_3,
814   MOD_0F51,
815   MOD_0F71_REG_2,
816   MOD_0F71_REG_4,
817   MOD_0F71_REG_6,
818   MOD_0F72_REG_2,
819   MOD_0F72_REG_4,
820   MOD_0F72_REG_6,
821   MOD_0F73_REG_2,
822   MOD_0F73_REG_3,
823   MOD_0F73_REG_6,
824   MOD_0F73_REG_7,
825   MOD_0FAE_REG_0,
826   MOD_0FAE_REG_1,
827   MOD_0FAE_REG_2,
828   MOD_0FAE_REG_3,
829   MOD_0FAE_REG_4,
830   MOD_0FAE_REG_5,
831   MOD_0FAE_REG_6,
832   MOD_0FAE_REG_7,
833   MOD_0FB2,
834   MOD_0FB4,
835   MOD_0FB5,
836   MOD_0FC3,
837   MOD_0FC7_REG_3,
838   MOD_0FC7_REG_4,
839   MOD_0FC7_REG_5,
840   MOD_0FC7_REG_6,
841   MOD_0FC7_REG_7,
842   MOD_0FD7,
843   MOD_0FE7_PREFIX_2,
844   MOD_0FF0_PREFIX_3,
845   MOD_0F382A_PREFIX_2,
846   MOD_0F38F5_PREFIX_2,
847   MOD_0F38F6_PREFIX_0,
848   MOD_0F38F8_PREFIX_1,
849   MOD_0F38F8_PREFIX_2,
850   MOD_0F38F8_PREFIX_3,
851   MOD_0F38F9_PREFIX_0,
852   MOD_62_32BIT,
853   MOD_C4_32BIT,
854   MOD_C5_32BIT,
855   MOD_VEX_0F12_PREFIX_0,
856   MOD_VEX_0F13,
857   MOD_VEX_0F16_PREFIX_0,
858   MOD_VEX_0F17,
859   MOD_VEX_0F2B,
860   MOD_VEX_W_0_0F41_P_0_LEN_1,
861   MOD_VEX_W_1_0F41_P_0_LEN_1,
862   MOD_VEX_W_0_0F41_P_2_LEN_1,
863   MOD_VEX_W_1_0F41_P_2_LEN_1,
864   MOD_VEX_W_0_0F42_P_0_LEN_1,
865   MOD_VEX_W_1_0F42_P_0_LEN_1,
866   MOD_VEX_W_0_0F42_P_2_LEN_1,
867   MOD_VEX_W_1_0F42_P_2_LEN_1,
868   MOD_VEX_W_0_0F44_P_0_LEN_1,
869   MOD_VEX_W_1_0F44_P_0_LEN_1,
870   MOD_VEX_W_0_0F44_P_2_LEN_1,
871   MOD_VEX_W_1_0F44_P_2_LEN_1,
872   MOD_VEX_W_0_0F45_P_0_LEN_1,
873   MOD_VEX_W_1_0F45_P_0_LEN_1,
874   MOD_VEX_W_0_0F45_P_2_LEN_1,
875   MOD_VEX_W_1_0F45_P_2_LEN_1,
876   MOD_VEX_W_0_0F46_P_0_LEN_1,
877   MOD_VEX_W_1_0F46_P_0_LEN_1,
878   MOD_VEX_W_0_0F46_P_2_LEN_1,
879   MOD_VEX_W_1_0F46_P_2_LEN_1,
880   MOD_VEX_W_0_0F47_P_0_LEN_1,
881   MOD_VEX_W_1_0F47_P_0_LEN_1,
882   MOD_VEX_W_0_0F47_P_2_LEN_1,
883   MOD_VEX_W_1_0F47_P_2_LEN_1,
884   MOD_VEX_W_0_0F4A_P_0_LEN_1,
885   MOD_VEX_W_1_0F4A_P_0_LEN_1,
886   MOD_VEX_W_0_0F4A_P_2_LEN_1,
887   MOD_VEX_W_1_0F4A_P_2_LEN_1,
888   MOD_VEX_W_0_0F4B_P_0_LEN_1,
889   MOD_VEX_W_1_0F4B_P_0_LEN_1,
890   MOD_VEX_W_0_0F4B_P_2_LEN_1,
891   MOD_VEX_0F50,
892   MOD_VEX_0F71_REG_2,
893   MOD_VEX_0F71_REG_4,
894   MOD_VEX_0F71_REG_6,
895   MOD_VEX_0F72_REG_2,
896   MOD_VEX_0F72_REG_4,
897   MOD_VEX_0F72_REG_6,
898   MOD_VEX_0F73_REG_2,
899   MOD_VEX_0F73_REG_3,
900   MOD_VEX_0F73_REG_6,
901   MOD_VEX_0F73_REG_7,
902   MOD_VEX_W_0_0F91_P_0_LEN_0,
903   MOD_VEX_W_1_0F91_P_0_LEN_0,
904   MOD_VEX_W_0_0F91_P_2_LEN_0,
905   MOD_VEX_W_1_0F91_P_2_LEN_0,
906   MOD_VEX_W_0_0F92_P_0_LEN_0,
907   MOD_VEX_W_0_0F92_P_2_LEN_0,
908   MOD_VEX_0F92_P_3_LEN_0,
909   MOD_VEX_W_0_0F93_P_0_LEN_0,
910   MOD_VEX_W_0_0F93_P_2_LEN_0,
911   MOD_VEX_0F93_P_3_LEN_0,
912   MOD_VEX_W_0_0F98_P_0_LEN_0,
913   MOD_VEX_W_1_0F98_P_0_LEN_0,
914   MOD_VEX_W_0_0F98_P_2_LEN_0,
915   MOD_VEX_W_1_0F98_P_2_LEN_0,
916   MOD_VEX_W_0_0F99_P_0_LEN_0,
917   MOD_VEX_W_1_0F99_P_0_LEN_0,
918   MOD_VEX_W_0_0F99_P_2_LEN_0,
919   MOD_VEX_W_1_0F99_P_2_LEN_0,
920   MOD_VEX_0FAE_REG_2,
921   MOD_VEX_0FAE_REG_3,
922   MOD_VEX_0FD7_PREFIX_2,
923   MOD_VEX_0FE7_PREFIX_2,
924   MOD_VEX_0FF0_PREFIX_3,
925   MOD_VEX_0F381A_PREFIX_2,
926   MOD_VEX_0F382A_PREFIX_2,
927   MOD_VEX_0F382C_PREFIX_2,
928   MOD_VEX_0F382D_PREFIX_2,
929   MOD_VEX_0F382E_PREFIX_2,
930   MOD_VEX_0F382F_PREFIX_2,
931   MOD_VEX_0F385A_PREFIX_2,
932   MOD_VEX_0F388C_PREFIX_2,
933   MOD_VEX_0F388E_PREFIX_2,
934   MOD_VEX_W_0_0F3A30_P_2_LEN_0,
935   MOD_VEX_W_1_0F3A30_P_2_LEN_0,
936   MOD_VEX_W_0_0F3A31_P_2_LEN_0,
937   MOD_VEX_W_1_0F3A31_P_2_LEN_0,
938   MOD_VEX_W_0_0F3A32_P_2_LEN_0,
939   MOD_VEX_W_1_0F3A32_P_2_LEN_0,
940   MOD_VEX_W_0_0F3A33_P_2_LEN_0,
941   MOD_VEX_W_1_0F3A33_P_2_LEN_0,
942
943   MOD_EVEX_0F10_PREFIX_1,
944   MOD_EVEX_0F10_PREFIX_3,
945   MOD_EVEX_0F11_PREFIX_1,
946   MOD_EVEX_0F11_PREFIX_3,
947   MOD_EVEX_0F12_PREFIX_0,
948   MOD_EVEX_0F16_PREFIX_0,
949   MOD_EVEX_0F38C6_REG_1,
950   MOD_EVEX_0F38C6_REG_2,
951   MOD_EVEX_0F38C6_REG_5,
952   MOD_EVEX_0F38C6_REG_6,
953   MOD_EVEX_0F38C7_REG_1,
954   MOD_EVEX_0F38C7_REG_2,
955   MOD_EVEX_0F38C7_REG_5,
956   MOD_EVEX_0F38C7_REG_6
957 };
958
959 enum
960 {
961   RM_C6_REG_7 = 0,
962   RM_C7_REG_7,
963   RM_0F01_REG_0,
964   RM_0F01_REG_1,
965   RM_0F01_REG_2,
966   RM_0F01_REG_3,
967   RM_0F01_REG_5,
968   RM_0F01_REG_7,
969   RM_0F1E_MOD_3_REG_7,
970   RM_0FAE_REG_6,
971   RM_0FAE_REG_7
972 };
973
974 enum
975 {
976   PREFIX_90 = 0,
977   PREFIX_MOD_0_0F01_REG_5,
978   PREFIX_MOD_3_0F01_REG_5_RM_0,
979   PREFIX_MOD_3_0F01_REG_5_RM_2,
980   PREFIX_0F09,
981   PREFIX_0F10,
982   PREFIX_0F11,
983   PREFIX_0F12,
984   PREFIX_0F16,
985   PREFIX_0F1A,
986   PREFIX_0F1B,
987   PREFIX_0F1C,
988   PREFIX_0F1E,
989   PREFIX_0F2A,
990   PREFIX_0F2B,
991   PREFIX_0F2C,
992   PREFIX_0F2D,
993   PREFIX_0F2E,
994   PREFIX_0F2F,
995   PREFIX_0F51,
996   PREFIX_0F52,
997   PREFIX_0F53,
998   PREFIX_0F58,
999   PREFIX_0F59,
1000   PREFIX_0F5A,
1001   PREFIX_0F5B,
1002   PREFIX_0F5C,
1003   PREFIX_0F5D,
1004   PREFIX_0F5E,
1005   PREFIX_0F5F,
1006   PREFIX_0F60,
1007   PREFIX_0F61,
1008   PREFIX_0F62,
1009   PREFIX_0F6C,
1010   PREFIX_0F6D,
1011   PREFIX_0F6F,
1012   PREFIX_0F70,
1013   PREFIX_0F73_REG_3,
1014   PREFIX_0F73_REG_7,
1015   PREFIX_0F78,
1016   PREFIX_0F79,
1017   PREFIX_0F7C,
1018   PREFIX_0F7D,
1019   PREFIX_0F7E,
1020   PREFIX_0F7F,
1021   PREFIX_0FAE_REG_0,
1022   PREFIX_0FAE_REG_1,
1023   PREFIX_0FAE_REG_2,
1024   PREFIX_0FAE_REG_3,
1025   PREFIX_MOD_0_0FAE_REG_4,
1026   PREFIX_MOD_3_0FAE_REG_4,
1027   PREFIX_MOD_0_0FAE_REG_5,
1028   PREFIX_MOD_3_0FAE_REG_5,
1029   PREFIX_MOD_0_0FAE_REG_6,
1030   PREFIX_MOD_1_0FAE_REG_6,
1031   PREFIX_0FAE_REG_7,
1032   PREFIX_0FB8,
1033   PREFIX_0FBC,
1034   PREFIX_0FBD,
1035   PREFIX_0FC2,
1036   PREFIX_MOD_0_0FC3,
1037   PREFIX_MOD_0_0FC7_REG_6,
1038   PREFIX_MOD_3_0FC7_REG_6,
1039   PREFIX_MOD_3_0FC7_REG_7,
1040   PREFIX_0FD0,
1041   PREFIX_0FD6,
1042   PREFIX_0FE6,
1043   PREFIX_0FE7,
1044   PREFIX_0FF0,
1045   PREFIX_0FF7,
1046   PREFIX_0F3810,
1047   PREFIX_0F3814,
1048   PREFIX_0F3815,
1049   PREFIX_0F3817,
1050   PREFIX_0F3820,
1051   PREFIX_0F3821,
1052   PREFIX_0F3822,
1053   PREFIX_0F3823,
1054   PREFIX_0F3824,
1055   PREFIX_0F3825,
1056   PREFIX_0F3828,
1057   PREFIX_0F3829,
1058   PREFIX_0F382A,
1059   PREFIX_0F382B,
1060   PREFIX_0F3830,
1061   PREFIX_0F3831,
1062   PREFIX_0F3832,
1063   PREFIX_0F3833,
1064   PREFIX_0F3834,
1065   PREFIX_0F3835,
1066   PREFIX_0F3837,
1067   PREFIX_0F3838,
1068   PREFIX_0F3839,
1069   PREFIX_0F383A,
1070   PREFIX_0F383B,
1071   PREFIX_0F383C,
1072   PREFIX_0F383D,
1073   PREFIX_0F383E,
1074   PREFIX_0F383F,
1075   PREFIX_0F3840,
1076   PREFIX_0F3841,
1077   PREFIX_0F3880,
1078   PREFIX_0F3881,
1079   PREFIX_0F3882,
1080   PREFIX_0F38C8,
1081   PREFIX_0F38C9,
1082   PREFIX_0F38CA,
1083   PREFIX_0F38CB,
1084   PREFIX_0F38CC,
1085   PREFIX_0F38CD,
1086   PREFIX_0F38CF,
1087   PREFIX_0F38DB,
1088   PREFIX_0F38DC,
1089   PREFIX_0F38DD,
1090   PREFIX_0F38DE,
1091   PREFIX_0F38DF,
1092   PREFIX_0F38F0,
1093   PREFIX_0F38F1,
1094   PREFIX_0F38F5,
1095   PREFIX_0F38F6,
1096   PREFIX_0F38F8,
1097   PREFIX_0F38F9,
1098   PREFIX_0F3A08,
1099   PREFIX_0F3A09,
1100   PREFIX_0F3A0A,
1101   PREFIX_0F3A0B,
1102   PREFIX_0F3A0C,
1103   PREFIX_0F3A0D,
1104   PREFIX_0F3A0E,
1105   PREFIX_0F3A14,
1106   PREFIX_0F3A15,
1107   PREFIX_0F3A16,
1108   PREFIX_0F3A17,
1109   PREFIX_0F3A20,
1110   PREFIX_0F3A21,
1111   PREFIX_0F3A22,
1112   PREFIX_0F3A40,
1113   PREFIX_0F3A41,
1114   PREFIX_0F3A42,
1115   PREFIX_0F3A44,
1116   PREFIX_0F3A60,
1117   PREFIX_0F3A61,
1118   PREFIX_0F3A62,
1119   PREFIX_0F3A63,
1120   PREFIX_0F3ACC,
1121   PREFIX_0F3ACE,
1122   PREFIX_0F3ACF,
1123   PREFIX_0F3ADF,
1124   PREFIX_VEX_0F10,
1125   PREFIX_VEX_0F11,
1126   PREFIX_VEX_0F12,
1127   PREFIX_VEX_0F16,
1128   PREFIX_VEX_0F2A,
1129   PREFIX_VEX_0F2C,
1130   PREFIX_VEX_0F2D,
1131   PREFIX_VEX_0F2E,
1132   PREFIX_VEX_0F2F,
1133   PREFIX_VEX_0F41,
1134   PREFIX_VEX_0F42,
1135   PREFIX_VEX_0F44,
1136   PREFIX_VEX_0F45,
1137   PREFIX_VEX_0F46,
1138   PREFIX_VEX_0F47,
1139   PREFIX_VEX_0F4A,
1140   PREFIX_VEX_0F4B,
1141   PREFIX_VEX_0F51,
1142   PREFIX_VEX_0F52,
1143   PREFIX_VEX_0F53,
1144   PREFIX_VEX_0F58,
1145   PREFIX_VEX_0F59,
1146   PREFIX_VEX_0F5A,
1147   PREFIX_VEX_0F5B,
1148   PREFIX_VEX_0F5C,
1149   PREFIX_VEX_0F5D,
1150   PREFIX_VEX_0F5E,
1151   PREFIX_VEX_0F5F,
1152   PREFIX_VEX_0F60,
1153   PREFIX_VEX_0F61,
1154   PREFIX_VEX_0F62,
1155   PREFIX_VEX_0F63,
1156   PREFIX_VEX_0F64,
1157   PREFIX_VEX_0F65,
1158   PREFIX_VEX_0F66,
1159   PREFIX_VEX_0F67,
1160   PREFIX_VEX_0F68,
1161   PREFIX_VEX_0F69,
1162   PREFIX_VEX_0F6A,
1163   PREFIX_VEX_0F6B,
1164   PREFIX_VEX_0F6C,
1165   PREFIX_VEX_0F6D,
1166   PREFIX_VEX_0F6E,
1167   PREFIX_VEX_0F6F,
1168   PREFIX_VEX_0F70,
1169   PREFIX_VEX_0F71_REG_2,
1170   PREFIX_VEX_0F71_REG_4,
1171   PREFIX_VEX_0F71_REG_6,
1172   PREFIX_VEX_0F72_REG_2,
1173   PREFIX_VEX_0F72_REG_4,
1174   PREFIX_VEX_0F72_REG_6,
1175   PREFIX_VEX_0F73_REG_2,
1176   PREFIX_VEX_0F73_REG_3,
1177   PREFIX_VEX_0F73_REG_6,
1178   PREFIX_VEX_0F73_REG_7,
1179   PREFIX_VEX_0F74,
1180   PREFIX_VEX_0F75,
1181   PREFIX_VEX_0F76,
1182   PREFIX_VEX_0F77,
1183   PREFIX_VEX_0F7C,
1184   PREFIX_VEX_0F7D,
1185   PREFIX_VEX_0F7E,
1186   PREFIX_VEX_0F7F,
1187   PREFIX_VEX_0F90,
1188   PREFIX_VEX_0F91,
1189   PREFIX_VEX_0F92,
1190   PREFIX_VEX_0F93,
1191   PREFIX_VEX_0F98,
1192   PREFIX_VEX_0F99,
1193   PREFIX_VEX_0FC2,
1194   PREFIX_VEX_0FC4,
1195   PREFIX_VEX_0FC5,
1196   PREFIX_VEX_0FD0,
1197   PREFIX_VEX_0FD1,
1198   PREFIX_VEX_0FD2,
1199   PREFIX_VEX_0FD3,
1200   PREFIX_VEX_0FD4,
1201   PREFIX_VEX_0FD5,
1202   PREFIX_VEX_0FD6,
1203   PREFIX_VEX_0FD7,
1204   PREFIX_VEX_0FD8,
1205   PREFIX_VEX_0FD9,
1206   PREFIX_VEX_0FDA,
1207   PREFIX_VEX_0FDB,
1208   PREFIX_VEX_0FDC,
1209   PREFIX_VEX_0FDD,
1210   PREFIX_VEX_0FDE,
1211   PREFIX_VEX_0FDF,
1212   PREFIX_VEX_0FE0,
1213   PREFIX_VEX_0FE1,
1214   PREFIX_VEX_0FE2,
1215   PREFIX_VEX_0FE3,
1216   PREFIX_VEX_0FE4,
1217   PREFIX_VEX_0FE5,
1218   PREFIX_VEX_0FE6,
1219   PREFIX_VEX_0FE7,
1220   PREFIX_VEX_0FE8,
1221   PREFIX_VEX_0FE9,
1222   PREFIX_VEX_0FEA,
1223   PREFIX_VEX_0FEB,
1224   PREFIX_VEX_0FEC,
1225   PREFIX_VEX_0FED,
1226   PREFIX_VEX_0FEE,
1227   PREFIX_VEX_0FEF,
1228   PREFIX_VEX_0FF0,
1229   PREFIX_VEX_0FF1,
1230   PREFIX_VEX_0FF2,
1231   PREFIX_VEX_0FF3,
1232   PREFIX_VEX_0FF4,
1233   PREFIX_VEX_0FF5,
1234   PREFIX_VEX_0FF6,
1235   PREFIX_VEX_0FF7,
1236   PREFIX_VEX_0FF8,
1237   PREFIX_VEX_0FF9,
1238   PREFIX_VEX_0FFA,
1239   PREFIX_VEX_0FFB,
1240   PREFIX_VEX_0FFC,
1241   PREFIX_VEX_0FFD,
1242   PREFIX_VEX_0FFE,
1243   PREFIX_VEX_0F3800,
1244   PREFIX_VEX_0F3801,
1245   PREFIX_VEX_0F3802,
1246   PREFIX_VEX_0F3803,
1247   PREFIX_VEX_0F3804,
1248   PREFIX_VEX_0F3805,
1249   PREFIX_VEX_0F3806,
1250   PREFIX_VEX_0F3807,
1251   PREFIX_VEX_0F3808,
1252   PREFIX_VEX_0F3809,
1253   PREFIX_VEX_0F380A,
1254   PREFIX_VEX_0F380B,
1255   PREFIX_VEX_0F380C,
1256   PREFIX_VEX_0F380D,
1257   PREFIX_VEX_0F380E,
1258   PREFIX_VEX_0F380F,
1259   PREFIX_VEX_0F3813,
1260   PREFIX_VEX_0F3816,
1261   PREFIX_VEX_0F3817,
1262   PREFIX_VEX_0F3818,
1263   PREFIX_VEX_0F3819,
1264   PREFIX_VEX_0F381A,
1265   PREFIX_VEX_0F381C,
1266   PREFIX_VEX_0F381D,
1267   PREFIX_VEX_0F381E,
1268   PREFIX_VEX_0F3820,
1269   PREFIX_VEX_0F3821,
1270   PREFIX_VEX_0F3822,
1271   PREFIX_VEX_0F3823,
1272   PREFIX_VEX_0F3824,
1273   PREFIX_VEX_0F3825,
1274   PREFIX_VEX_0F3828,
1275   PREFIX_VEX_0F3829,
1276   PREFIX_VEX_0F382A,
1277   PREFIX_VEX_0F382B,
1278   PREFIX_VEX_0F382C,
1279   PREFIX_VEX_0F382D,
1280   PREFIX_VEX_0F382E,
1281   PREFIX_VEX_0F382F,
1282   PREFIX_VEX_0F3830,
1283   PREFIX_VEX_0F3831,
1284   PREFIX_VEX_0F3832,
1285   PREFIX_VEX_0F3833,
1286   PREFIX_VEX_0F3834,
1287   PREFIX_VEX_0F3835,
1288   PREFIX_VEX_0F3836,
1289   PREFIX_VEX_0F3837,
1290   PREFIX_VEX_0F3838,
1291   PREFIX_VEX_0F3839,
1292   PREFIX_VEX_0F383A,
1293   PREFIX_VEX_0F383B,
1294   PREFIX_VEX_0F383C,
1295   PREFIX_VEX_0F383D,
1296   PREFIX_VEX_0F383E,
1297   PREFIX_VEX_0F383F,
1298   PREFIX_VEX_0F3840,
1299   PREFIX_VEX_0F3841,
1300   PREFIX_VEX_0F3845,
1301   PREFIX_VEX_0F3846,
1302   PREFIX_VEX_0F3847,
1303   PREFIX_VEX_0F3858,
1304   PREFIX_VEX_0F3859,
1305   PREFIX_VEX_0F385A,
1306   PREFIX_VEX_0F3878,
1307   PREFIX_VEX_0F3879,
1308   PREFIX_VEX_0F388C,
1309   PREFIX_VEX_0F388E,
1310   PREFIX_VEX_0F3890,
1311   PREFIX_VEX_0F3891,
1312   PREFIX_VEX_0F3892,
1313   PREFIX_VEX_0F3893,
1314   PREFIX_VEX_0F3896,
1315   PREFIX_VEX_0F3897,
1316   PREFIX_VEX_0F3898,
1317   PREFIX_VEX_0F3899,
1318   PREFIX_VEX_0F389A,
1319   PREFIX_VEX_0F389B,
1320   PREFIX_VEX_0F389C,
1321   PREFIX_VEX_0F389D,
1322   PREFIX_VEX_0F389E,
1323   PREFIX_VEX_0F389F,
1324   PREFIX_VEX_0F38A6,
1325   PREFIX_VEX_0F38A7,
1326   PREFIX_VEX_0F38A8,
1327   PREFIX_VEX_0F38A9,
1328   PREFIX_VEX_0F38AA,
1329   PREFIX_VEX_0F38AB,
1330   PREFIX_VEX_0F38AC,
1331   PREFIX_VEX_0F38AD,
1332   PREFIX_VEX_0F38AE,
1333   PREFIX_VEX_0F38AF,
1334   PREFIX_VEX_0F38B6,
1335   PREFIX_VEX_0F38B7,
1336   PREFIX_VEX_0F38B8,
1337   PREFIX_VEX_0F38B9,
1338   PREFIX_VEX_0F38BA,
1339   PREFIX_VEX_0F38BB,
1340   PREFIX_VEX_0F38BC,
1341   PREFIX_VEX_0F38BD,
1342   PREFIX_VEX_0F38BE,
1343   PREFIX_VEX_0F38BF,
1344   PREFIX_VEX_0F38CF,
1345   PREFIX_VEX_0F38DB,
1346   PREFIX_VEX_0F38DC,
1347   PREFIX_VEX_0F38DD,
1348   PREFIX_VEX_0F38DE,
1349   PREFIX_VEX_0F38DF,
1350   PREFIX_VEX_0F38F2,
1351   PREFIX_VEX_0F38F3_REG_1,
1352   PREFIX_VEX_0F38F3_REG_2,
1353   PREFIX_VEX_0F38F3_REG_3,
1354   PREFIX_VEX_0F38F5,
1355   PREFIX_VEX_0F38F6,
1356   PREFIX_VEX_0F38F7,
1357   PREFIX_VEX_0F3A00,
1358   PREFIX_VEX_0F3A01,
1359   PREFIX_VEX_0F3A02,
1360   PREFIX_VEX_0F3A04,
1361   PREFIX_VEX_0F3A05,
1362   PREFIX_VEX_0F3A06,
1363   PREFIX_VEX_0F3A08,
1364   PREFIX_VEX_0F3A09,
1365   PREFIX_VEX_0F3A0A,
1366   PREFIX_VEX_0F3A0B,
1367   PREFIX_VEX_0F3A0C,
1368   PREFIX_VEX_0F3A0D,
1369   PREFIX_VEX_0F3A0E,
1370   PREFIX_VEX_0F3A0F,
1371   PREFIX_VEX_0F3A14,
1372   PREFIX_VEX_0F3A15,
1373   PREFIX_VEX_0F3A16,
1374   PREFIX_VEX_0F3A17,
1375   PREFIX_VEX_0F3A18,
1376   PREFIX_VEX_0F3A19,
1377   PREFIX_VEX_0F3A1D,
1378   PREFIX_VEX_0F3A20,
1379   PREFIX_VEX_0F3A21,
1380   PREFIX_VEX_0F3A22,
1381   PREFIX_VEX_0F3A30,
1382   PREFIX_VEX_0F3A31,
1383   PREFIX_VEX_0F3A32,
1384   PREFIX_VEX_0F3A33,
1385   PREFIX_VEX_0F3A38,
1386   PREFIX_VEX_0F3A39,
1387   PREFIX_VEX_0F3A40,
1388   PREFIX_VEX_0F3A41,
1389   PREFIX_VEX_0F3A42,
1390   PREFIX_VEX_0F3A44,
1391   PREFIX_VEX_0F3A46,
1392   PREFIX_VEX_0F3A48,
1393   PREFIX_VEX_0F3A49,
1394   PREFIX_VEX_0F3A4A,
1395   PREFIX_VEX_0F3A4B,
1396   PREFIX_VEX_0F3A4C,
1397   PREFIX_VEX_0F3A5C,
1398   PREFIX_VEX_0F3A5D,
1399   PREFIX_VEX_0F3A5E,
1400   PREFIX_VEX_0F3A5F,
1401   PREFIX_VEX_0F3A60,
1402   PREFIX_VEX_0F3A61,
1403   PREFIX_VEX_0F3A62,
1404   PREFIX_VEX_0F3A63,
1405   PREFIX_VEX_0F3A68,
1406   PREFIX_VEX_0F3A69,
1407   PREFIX_VEX_0F3A6A,
1408   PREFIX_VEX_0F3A6B,
1409   PREFIX_VEX_0F3A6C,
1410   PREFIX_VEX_0F3A6D,
1411   PREFIX_VEX_0F3A6E,
1412   PREFIX_VEX_0F3A6F,
1413   PREFIX_VEX_0F3A78,
1414   PREFIX_VEX_0F3A79,
1415   PREFIX_VEX_0F3A7A,
1416   PREFIX_VEX_0F3A7B,
1417   PREFIX_VEX_0F3A7C,
1418   PREFIX_VEX_0F3A7D,
1419   PREFIX_VEX_0F3A7E,
1420   PREFIX_VEX_0F3A7F,
1421   PREFIX_VEX_0F3ACE,
1422   PREFIX_VEX_0F3ACF,
1423   PREFIX_VEX_0F3ADF,
1424   PREFIX_VEX_0F3AF0,
1425
1426   PREFIX_EVEX_0F10,
1427   PREFIX_EVEX_0F11,
1428   PREFIX_EVEX_0F12,
1429   PREFIX_EVEX_0F13,
1430   PREFIX_EVEX_0F14,
1431   PREFIX_EVEX_0F15,
1432   PREFIX_EVEX_0F16,
1433   PREFIX_EVEX_0F17,
1434   PREFIX_EVEX_0F28,
1435   PREFIX_EVEX_0F29,
1436   PREFIX_EVEX_0F2A,
1437   PREFIX_EVEX_0F2B,
1438   PREFIX_EVEX_0F2C,
1439   PREFIX_EVEX_0F2D,
1440   PREFIX_EVEX_0F2E,
1441   PREFIX_EVEX_0F2F,
1442   PREFIX_EVEX_0F51,
1443   PREFIX_EVEX_0F54,
1444   PREFIX_EVEX_0F55,
1445   PREFIX_EVEX_0F56,
1446   PREFIX_EVEX_0F57,
1447   PREFIX_EVEX_0F58,
1448   PREFIX_EVEX_0F59,
1449   PREFIX_EVEX_0F5A,
1450   PREFIX_EVEX_0F5B,
1451   PREFIX_EVEX_0F5C,
1452   PREFIX_EVEX_0F5D,
1453   PREFIX_EVEX_0F5E,
1454   PREFIX_EVEX_0F5F,
1455   PREFIX_EVEX_0F60,
1456   PREFIX_EVEX_0F61,
1457   PREFIX_EVEX_0F62,
1458   PREFIX_EVEX_0F63,
1459   PREFIX_EVEX_0F64,
1460   PREFIX_EVEX_0F65,
1461   PREFIX_EVEX_0F66,
1462   PREFIX_EVEX_0F67,
1463   PREFIX_EVEX_0F68,
1464   PREFIX_EVEX_0F69,
1465   PREFIX_EVEX_0F6A,
1466   PREFIX_EVEX_0F6B,
1467   PREFIX_EVEX_0F6C,
1468   PREFIX_EVEX_0F6D,
1469   PREFIX_EVEX_0F6E,
1470   PREFIX_EVEX_0F6F,
1471   PREFIX_EVEX_0F70,
1472   PREFIX_EVEX_0F71_REG_2,
1473   PREFIX_EVEX_0F71_REG_4,
1474   PREFIX_EVEX_0F71_REG_6,
1475   PREFIX_EVEX_0F72_REG_0,
1476   PREFIX_EVEX_0F72_REG_1,
1477   PREFIX_EVEX_0F72_REG_2,
1478   PREFIX_EVEX_0F72_REG_4,
1479   PREFIX_EVEX_0F72_REG_6,
1480   PREFIX_EVEX_0F73_REG_2,
1481   PREFIX_EVEX_0F73_REG_3,
1482   PREFIX_EVEX_0F73_REG_6,
1483   PREFIX_EVEX_0F73_REG_7,
1484   PREFIX_EVEX_0F74,
1485   PREFIX_EVEX_0F75,
1486   PREFIX_EVEX_0F76,
1487   PREFIX_EVEX_0F78,
1488   PREFIX_EVEX_0F79,
1489   PREFIX_EVEX_0F7A,
1490   PREFIX_EVEX_0F7B,
1491   PREFIX_EVEX_0F7E,
1492   PREFIX_EVEX_0F7F,
1493   PREFIX_EVEX_0FC2,
1494   PREFIX_EVEX_0FC4,
1495   PREFIX_EVEX_0FC5,
1496   PREFIX_EVEX_0FC6,
1497   PREFIX_EVEX_0FD1,
1498   PREFIX_EVEX_0FD2,
1499   PREFIX_EVEX_0FD3,
1500   PREFIX_EVEX_0FD4,
1501   PREFIX_EVEX_0FD5,
1502   PREFIX_EVEX_0FD6,
1503   PREFIX_EVEX_0FD8,
1504   PREFIX_EVEX_0FD9,
1505   PREFIX_EVEX_0FDA,
1506   PREFIX_EVEX_0FDB,
1507   PREFIX_EVEX_0FDC,
1508   PREFIX_EVEX_0FDD,
1509   PREFIX_EVEX_0FDE,
1510   PREFIX_EVEX_0FDF,
1511   PREFIX_EVEX_0FE0,
1512   PREFIX_EVEX_0FE1,
1513   PREFIX_EVEX_0FE2,
1514   PREFIX_EVEX_0FE3,
1515   PREFIX_EVEX_0FE4,
1516   PREFIX_EVEX_0FE5,
1517   PREFIX_EVEX_0FE6,
1518   PREFIX_EVEX_0FE7,
1519   PREFIX_EVEX_0FE8,
1520   PREFIX_EVEX_0FE9,
1521   PREFIX_EVEX_0FEA,
1522   PREFIX_EVEX_0FEB,
1523   PREFIX_EVEX_0FEC,
1524   PREFIX_EVEX_0FED,
1525   PREFIX_EVEX_0FEE,
1526   PREFIX_EVEX_0FEF,
1527   PREFIX_EVEX_0FF1,
1528   PREFIX_EVEX_0FF2,
1529   PREFIX_EVEX_0FF3,
1530   PREFIX_EVEX_0FF4,
1531   PREFIX_EVEX_0FF5,
1532   PREFIX_EVEX_0FF6,
1533   PREFIX_EVEX_0FF8,
1534   PREFIX_EVEX_0FF9,
1535   PREFIX_EVEX_0FFA,
1536   PREFIX_EVEX_0FFB,
1537   PREFIX_EVEX_0FFC,
1538   PREFIX_EVEX_0FFD,
1539   PREFIX_EVEX_0FFE,
1540   PREFIX_EVEX_0F3800,
1541   PREFIX_EVEX_0F3804,
1542   PREFIX_EVEX_0F380B,
1543   PREFIX_EVEX_0F380C,
1544   PREFIX_EVEX_0F380D,
1545   PREFIX_EVEX_0F3810,
1546   PREFIX_EVEX_0F3811,
1547   PREFIX_EVEX_0F3812,
1548   PREFIX_EVEX_0F3813,
1549   PREFIX_EVEX_0F3814,
1550   PREFIX_EVEX_0F3815,
1551   PREFIX_EVEX_0F3816,
1552   PREFIX_EVEX_0F3818,
1553   PREFIX_EVEX_0F3819,
1554   PREFIX_EVEX_0F381A,
1555   PREFIX_EVEX_0F381B,
1556   PREFIX_EVEX_0F381C,
1557   PREFIX_EVEX_0F381D,
1558   PREFIX_EVEX_0F381E,
1559   PREFIX_EVEX_0F381F,
1560   PREFIX_EVEX_0F3820,
1561   PREFIX_EVEX_0F3821,
1562   PREFIX_EVEX_0F3822,
1563   PREFIX_EVEX_0F3823,
1564   PREFIX_EVEX_0F3824,
1565   PREFIX_EVEX_0F3825,
1566   PREFIX_EVEX_0F3826,
1567   PREFIX_EVEX_0F3827,
1568   PREFIX_EVEX_0F3828,
1569   PREFIX_EVEX_0F3829,
1570   PREFIX_EVEX_0F382A,
1571   PREFIX_EVEX_0F382B,
1572   PREFIX_EVEX_0F382C,
1573   PREFIX_EVEX_0F382D,
1574   PREFIX_EVEX_0F3830,
1575   PREFIX_EVEX_0F3831,
1576   PREFIX_EVEX_0F3832,
1577   PREFIX_EVEX_0F3833,
1578   PREFIX_EVEX_0F3834,
1579   PREFIX_EVEX_0F3835,
1580   PREFIX_EVEX_0F3836,
1581   PREFIX_EVEX_0F3837,
1582   PREFIX_EVEX_0F3838,
1583   PREFIX_EVEX_0F3839,
1584   PREFIX_EVEX_0F383A,
1585   PREFIX_EVEX_0F383B,
1586   PREFIX_EVEX_0F383C,
1587   PREFIX_EVEX_0F383D,
1588   PREFIX_EVEX_0F383E,
1589   PREFIX_EVEX_0F383F,
1590   PREFIX_EVEX_0F3840,
1591   PREFIX_EVEX_0F3842,
1592   PREFIX_EVEX_0F3843,
1593   PREFIX_EVEX_0F3844,
1594   PREFIX_EVEX_0F3845,
1595   PREFIX_EVEX_0F3846,
1596   PREFIX_EVEX_0F3847,
1597   PREFIX_EVEX_0F384C,
1598   PREFIX_EVEX_0F384D,
1599   PREFIX_EVEX_0F384E,
1600   PREFIX_EVEX_0F384F,
1601   PREFIX_EVEX_0F3850,
1602   PREFIX_EVEX_0F3851,
1603   PREFIX_EVEX_0F3852,
1604   PREFIX_EVEX_0F3853,
1605   PREFIX_EVEX_0F3854,
1606   PREFIX_EVEX_0F3855,
1607   PREFIX_EVEX_0F3858,
1608   PREFIX_EVEX_0F3859,
1609   PREFIX_EVEX_0F385A,
1610   PREFIX_EVEX_0F385B,
1611   PREFIX_EVEX_0F3862,
1612   PREFIX_EVEX_0F3863,
1613   PREFIX_EVEX_0F3864,
1614   PREFIX_EVEX_0F3865,
1615   PREFIX_EVEX_0F3866,
1616   PREFIX_EVEX_0F3868,
1617   PREFIX_EVEX_0F3870,
1618   PREFIX_EVEX_0F3871,
1619   PREFIX_EVEX_0F3872,
1620   PREFIX_EVEX_0F3873,
1621   PREFIX_EVEX_0F3875,
1622   PREFIX_EVEX_0F3876,
1623   PREFIX_EVEX_0F3877,
1624   PREFIX_EVEX_0F3878,
1625   PREFIX_EVEX_0F3879,
1626   PREFIX_EVEX_0F387A,
1627   PREFIX_EVEX_0F387B,
1628   PREFIX_EVEX_0F387C,
1629   PREFIX_EVEX_0F387D,
1630   PREFIX_EVEX_0F387E,
1631   PREFIX_EVEX_0F387F,
1632   PREFIX_EVEX_0F3883,
1633   PREFIX_EVEX_0F3888,
1634   PREFIX_EVEX_0F3889,
1635   PREFIX_EVEX_0F388A,
1636   PREFIX_EVEX_0F388B,
1637   PREFIX_EVEX_0F388D,
1638   PREFIX_EVEX_0F388F,
1639   PREFIX_EVEX_0F3890,
1640   PREFIX_EVEX_0F3891,
1641   PREFIX_EVEX_0F3892,
1642   PREFIX_EVEX_0F3893,
1643   PREFIX_EVEX_0F3896,
1644   PREFIX_EVEX_0F3897,
1645   PREFIX_EVEX_0F3898,
1646   PREFIX_EVEX_0F3899,
1647   PREFIX_EVEX_0F389A,
1648   PREFIX_EVEX_0F389B,
1649   PREFIX_EVEX_0F389C,
1650   PREFIX_EVEX_0F389D,
1651   PREFIX_EVEX_0F389E,
1652   PREFIX_EVEX_0F389F,
1653   PREFIX_EVEX_0F38A0,
1654   PREFIX_EVEX_0F38A1,
1655   PREFIX_EVEX_0F38A2,
1656   PREFIX_EVEX_0F38A3,
1657   PREFIX_EVEX_0F38A6,
1658   PREFIX_EVEX_0F38A7,
1659   PREFIX_EVEX_0F38A8,
1660   PREFIX_EVEX_0F38A9,
1661   PREFIX_EVEX_0F38AA,
1662   PREFIX_EVEX_0F38AB,
1663   PREFIX_EVEX_0F38AC,
1664   PREFIX_EVEX_0F38AD,
1665   PREFIX_EVEX_0F38AE,
1666   PREFIX_EVEX_0F38AF,
1667   PREFIX_EVEX_0F38B4,
1668   PREFIX_EVEX_0F38B5,
1669   PREFIX_EVEX_0F38B6,
1670   PREFIX_EVEX_0F38B7,
1671   PREFIX_EVEX_0F38B8,
1672   PREFIX_EVEX_0F38B9,
1673   PREFIX_EVEX_0F38BA,
1674   PREFIX_EVEX_0F38BB,
1675   PREFIX_EVEX_0F38BC,
1676   PREFIX_EVEX_0F38BD,
1677   PREFIX_EVEX_0F38BE,
1678   PREFIX_EVEX_0F38BF,
1679   PREFIX_EVEX_0F38C4,
1680   PREFIX_EVEX_0F38C6_REG_1,
1681   PREFIX_EVEX_0F38C6_REG_2,
1682   PREFIX_EVEX_0F38C6_REG_5,
1683   PREFIX_EVEX_0F38C6_REG_6,
1684   PREFIX_EVEX_0F38C7_REG_1,
1685   PREFIX_EVEX_0F38C7_REG_2,
1686   PREFIX_EVEX_0F38C7_REG_5,
1687   PREFIX_EVEX_0F38C7_REG_6,
1688   PREFIX_EVEX_0F38C8,
1689   PREFIX_EVEX_0F38CA,
1690   PREFIX_EVEX_0F38CB,
1691   PREFIX_EVEX_0F38CC,
1692   PREFIX_EVEX_0F38CD,
1693   PREFIX_EVEX_0F38CF,
1694   PREFIX_EVEX_0F38DC,
1695   PREFIX_EVEX_0F38DD,
1696   PREFIX_EVEX_0F38DE,
1697   PREFIX_EVEX_0F38DF,
1698
1699   PREFIX_EVEX_0F3A00,
1700   PREFIX_EVEX_0F3A01,
1701   PREFIX_EVEX_0F3A03,
1702   PREFIX_EVEX_0F3A04,
1703   PREFIX_EVEX_0F3A05,
1704   PREFIX_EVEX_0F3A08,
1705   PREFIX_EVEX_0F3A09,
1706   PREFIX_EVEX_0F3A0A,
1707   PREFIX_EVEX_0F3A0B,
1708   PREFIX_EVEX_0F3A0F,
1709   PREFIX_EVEX_0F3A14,
1710   PREFIX_EVEX_0F3A15,
1711   PREFIX_EVEX_0F3A16,
1712   PREFIX_EVEX_0F3A17,
1713   PREFIX_EVEX_0F3A18,
1714   PREFIX_EVEX_0F3A19,
1715   PREFIX_EVEX_0F3A1A,
1716   PREFIX_EVEX_0F3A1B,
1717   PREFIX_EVEX_0F3A1D,
1718   PREFIX_EVEX_0F3A1E,
1719   PREFIX_EVEX_0F3A1F,
1720   PREFIX_EVEX_0F3A20,
1721   PREFIX_EVEX_0F3A21,
1722   PREFIX_EVEX_0F3A22,
1723   PREFIX_EVEX_0F3A23,
1724   PREFIX_EVEX_0F3A25,
1725   PREFIX_EVEX_0F3A26,
1726   PREFIX_EVEX_0F3A27,
1727   PREFIX_EVEX_0F3A38,
1728   PREFIX_EVEX_0F3A39,
1729   PREFIX_EVEX_0F3A3A,
1730   PREFIX_EVEX_0F3A3B,
1731   PREFIX_EVEX_0F3A3E,
1732   PREFIX_EVEX_0F3A3F,
1733   PREFIX_EVEX_0F3A42,
1734   PREFIX_EVEX_0F3A43,
1735   PREFIX_EVEX_0F3A44,
1736   PREFIX_EVEX_0F3A50,
1737   PREFIX_EVEX_0F3A51,
1738   PREFIX_EVEX_0F3A54,
1739   PREFIX_EVEX_0F3A55,
1740   PREFIX_EVEX_0F3A56,
1741   PREFIX_EVEX_0F3A57,
1742   PREFIX_EVEX_0F3A66,
1743   PREFIX_EVEX_0F3A67,
1744   PREFIX_EVEX_0F3A70,
1745   PREFIX_EVEX_0F3A71,
1746   PREFIX_EVEX_0F3A72,
1747   PREFIX_EVEX_0F3A73,
1748   PREFIX_EVEX_0F3ACE,
1749   PREFIX_EVEX_0F3ACF
1750 };
1751
1752 enum
1753 {
1754   X86_64_06 = 0,
1755   X86_64_07,
1756   X86_64_0D,
1757   X86_64_16,
1758   X86_64_17,
1759   X86_64_1E,
1760   X86_64_1F,
1761   X86_64_27,
1762   X86_64_2F,
1763   X86_64_37,
1764   X86_64_3F,
1765   X86_64_60,
1766   X86_64_61,
1767   X86_64_62,
1768   X86_64_63,
1769   X86_64_6D,
1770   X86_64_6F,
1771   X86_64_82,
1772   X86_64_9A,
1773   X86_64_C4,
1774   X86_64_C5,
1775   X86_64_CE,
1776   X86_64_D4,
1777   X86_64_D5,
1778   X86_64_E8,
1779   X86_64_E9,
1780   X86_64_EA,
1781   X86_64_0F01_REG_0,
1782   X86_64_0F01_REG_1,
1783   X86_64_0F01_REG_2,
1784   X86_64_0F01_REG_3
1785 };
1786
1787 enum
1788 {
1789   THREE_BYTE_0F38 = 0,
1790   THREE_BYTE_0F3A
1791 };
1792
1793 enum
1794 {
1795   XOP_08 = 0,
1796   XOP_09,
1797   XOP_0A
1798 };
1799
1800 enum
1801 {
1802   VEX_0F = 0,
1803   VEX_0F38,
1804   VEX_0F3A
1805 };
1806
1807 enum
1808 {
1809   EVEX_0F = 0,
1810   EVEX_0F38,
1811   EVEX_0F3A
1812 };
1813
1814 enum
1815 {
1816   VEX_LEN_0F12_P_0_M_0 = 0,
1817   VEX_LEN_0F12_P_0_M_1,
1818   VEX_LEN_0F12_P_2,
1819   VEX_LEN_0F13_M_0,
1820   VEX_LEN_0F16_P_0_M_0,
1821   VEX_LEN_0F16_P_0_M_1,
1822   VEX_LEN_0F16_P_2,
1823   VEX_LEN_0F17_M_0,
1824   VEX_LEN_0F2A_P_1,
1825   VEX_LEN_0F2A_P_3,
1826   VEX_LEN_0F2C_P_1,
1827   VEX_LEN_0F2C_P_3,
1828   VEX_LEN_0F2D_P_1,
1829   VEX_LEN_0F2D_P_3,
1830   VEX_LEN_0F41_P_0,
1831   VEX_LEN_0F41_P_2,
1832   VEX_LEN_0F42_P_0,
1833   VEX_LEN_0F42_P_2,
1834   VEX_LEN_0F44_P_0,
1835   VEX_LEN_0F44_P_2,
1836   VEX_LEN_0F45_P_0,
1837   VEX_LEN_0F45_P_2,
1838   VEX_LEN_0F46_P_0,
1839   VEX_LEN_0F46_P_2,
1840   VEX_LEN_0F47_P_0,
1841   VEX_LEN_0F47_P_2,
1842   VEX_LEN_0F4A_P_0,
1843   VEX_LEN_0F4A_P_2,
1844   VEX_LEN_0F4B_P_0,
1845   VEX_LEN_0F4B_P_2,
1846   VEX_LEN_0F6E_P_2,
1847   VEX_LEN_0F77_P_0,
1848   VEX_LEN_0F7E_P_1,
1849   VEX_LEN_0F7E_P_2,
1850   VEX_LEN_0F90_P_0,
1851   VEX_LEN_0F90_P_2,
1852   VEX_LEN_0F91_P_0,
1853   VEX_LEN_0F91_P_2,
1854   VEX_LEN_0F92_P_0,
1855   VEX_LEN_0F92_P_2,
1856   VEX_LEN_0F92_P_3,
1857   VEX_LEN_0F93_P_0,
1858   VEX_LEN_0F93_P_2,
1859   VEX_LEN_0F93_P_3,
1860   VEX_LEN_0F98_P_0,
1861   VEX_LEN_0F98_P_2,
1862   VEX_LEN_0F99_P_0,
1863   VEX_LEN_0F99_P_2,
1864   VEX_LEN_0FAE_R_2_M_0,
1865   VEX_LEN_0FAE_R_3_M_0,
1866   VEX_LEN_0FC4_P_2,
1867   VEX_LEN_0FC5_P_2,
1868   VEX_LEN_0FD6_P_2,
1869   VEX_LEN_0FF7_P_2,
1870   VEX_LEN_0F3816_P_2,
1871   VEX_LEN_0F3819_P_2,
1872   VEX_LEN_0F381A_P_2_M_0,
1873   VEX_LEN_0F3836_P_2,
1874   VEX_LEN_0F3841_P_2,
1875   VEX_LEN_0F385A_P_2_M_0,
1876   VEX_LEN_0F38DB_P_2,
1877   VEX_LEN_0F38F2_P_0,
1878   VEX_LEN_0F38F3_R_1_P_0,
1879   VEX_LEN_0F38F3_R_2_P_0,
1880   VEX_LEN_0F38F3_R_3_P_0,
1881   VEX_LEN_0F38F5_P_0,
1882   VEX_LEN_0F38F5_P_1,
1883   VEX_LEN_0F38F5_P_3,
1884   VEX_LEN_0F38F6_P_3,
1885   VEX_LEN_0F38F7_P_0,
1886   VEX_LEN_0F38F7_P_1,
1887   VEX_LEN_0F38F7_P_2,
1888   VEX_LEN_0F38F7_P_3,
1889   VEX_LEN_0F3A00_P_2,
1890   VEX_LEN_0F3A01_P_2,
1891   VEX_LEN_0F3A06_P_2,
1892   VEX_LEN_0F3A14_P_2,
1893   VEX_LEN_0F3A15_P_2,
1894   VEX_LEN_0F3A16_P_2,
1895   VEX_LEN_0F3A17_P_2,
1896   VEX_LEN_0F3A18_P_2,
1897   VEX_LEN_0F3A19_P_2,
1898   VEX_LEN_0F3A20_P_2,
1899   VEX_LEN_0F3A21_P_2,
1900   VEX_LEN_0F3A22_P_2,
1901   VEX_LEN_0F3A30_P_2,
1902   VEX_LEN_0F3A31_P_2,
1903   VEX_LEN_0F3A32_P_2,
1904   VEX_LEN_0F3A33_P_2,
1905   VEX_LEN_0F3A38_P_2,
1906   VEX_LEN_0F3A39_P_2,
1907   VEX_LEN_0F3A41_P_2,
1908   VEX_LEN_0F3A46_P_2,
1909   VEX_LEN_0F3A60_P_2,
1910   VEX_LEN_0F3A61_P_2,
1911   VEX_LEN_0F3A62_P_2,
1912   VEX_LEN_0F3A63_P_2,
1913   VEX_LEN_0F3A6A_P_2,
1914   VEX_LEN_0F3A6B_P_2,
1915   VEX_LEN_0F3A6E_P_2,
1916   VEX_LEN_0F3A6F_P_2,
1917   VEX_LEN_0F3A7A_P_2,
1918   VEX_LEN_0F3A7B_P_2,
1919   VEX_LEN_0F3A7E_P_2,
1920   VEX_LEN_0F3A7F_P_2,
1921   VEX_LEN_0F3ADF_P_2,
1922   VEX_LEN_0F3AF0_P_3,
1923   VEX_LEN_0FXOP_08_CC,
1924   VEX_LEN_0FXOP_08_CD,
1925   VEX_LEN_0FXOP_08_CE,
1926   VEX_LEN_0FXOP_08_CF,
1927   VEX_LEN_0FXOP_08_EC,
1928   VEX_LEN_0FXOP_08_ED,
1929   VEX_LEN_0FXOP_08_EE,
1930   VEX_LEN_0FXOP_08_EF,
1931   VEX_LEN_0FXOP_09_80,
1932   VEX_LEN_0FXOP_09_81
1933 };
1934
1935 enum
1936 {
1937   EVEX_LEN_0F6E_P_2 = 0,
1938   EVEX_LEN_0F7E_P_1,
1939   EVEX_LEN_0F7E_P_2,
1940   EVEX_LEN_0FD6_P_2,
1941   EVEX_LEN_0F3819_P_2_W_0,
1942   EVEX_LEN_0F3819_P_2_W_1,
1943   EVEX_LEN_0F381A_P_2_W_0,
1944   EVEX_LEN_0F381A_P_2_W_1,
1945   EVEX_LEN_0F381B_P_2_W_0,
1946   EVEX_LEN_0F381B_P_2_W_1,
1947   EVEX_LEN_0F385A_P_2_W_0,
1948   EVEX_LEN_0F385A_P_2_W_1,
1949   EVEX_LEN_0F385B_P_2_W_0,
1950   EVEX_LEN_0F385B_P_2_W_1,
1951   EVEX_LEN_0F3A18_P_2_W_0,
1952   EVEX_LEN_0F3A18_P_2_W_1,
1953   EVEX_LEN_0F3A19_P_2_W_0,
1954   EVEX_LEN_0F3A19_P_2_W_1,
1955   EVEX_LEN_0F3A1A_P_2_W_0,
1956   EVEX_LEN_0F3A1A_P_2_W_1,
1957   EVEX_LEN_0F3A1B_P_2_W_0,
1958   EVEX_LEN_0F3A1B_P_2_W_1,
1959   EVEX_LEN_0F3A23_P_2_W_0,
1960   EVEX_LEN_0F3A23_P_2_W_1,
1961   EVEX_LEN_0F3A38_P_2_W_0,
1962   EVEX_LEN_0F3A38_P_2_W_1,
1963   EVEX_LEN_0F3A39_P_2_W_0,
1964   EVEX_LEN_0F3A39_P_2_W_1,
1965   EVEX_LEN_0F3A3A_P_2_W_0,
1966   EVEX_LEN_0F3A3A_P_2_W_1,
1967   EVEX_LEN_0F3A3B_P_2_W_0,
1968   EVEX_LEN_0F3A3B_P_2_W_1,
1969   EVEX_LEN_0F3A43_P_2_W_0,
1970   EVEX_LEN_0F3A43_P_2_W_1
1971 };
1972
1973 enum
1974 {
1975   VEX_W_0F41_P_0_LEN_1 = 0,
1976   VEX_W_0F41_P_2_LEN_1,
1977   VEX_W_0F42_P_0_LEN_1,
1978   VEX_W_0F42_P_2_LEN_1,
1979   VEX_W_0F44_P_0_LEN_0,
1980   VEX_W_0F44_P_2_LEN_0,
1981   VEX_W_0F45_P_0_LEN_1,
1982   VEX_W_0F45_P_2_LEN_1,
1983   VEX_W_0F46_P_0_LEN_1,
1984   VEX_W_0F46_P_2_LEN_1,
1985   VEX_W_0F47_P_0_LEN_1,
1986   VEX_W_0F47_P_2_LEN_1,
1987   VEX_W_0F4A_P_0_LEN_1,
1988   VEX_W_0F4A_P_2_LEN_1,
1989   VEX_W_0F4B_P_0_LEN_1,
1990   VEX_W_0F4B_P_2_LEN_1,
1991   VEX_W_0F90_P_0_LEN_0,
1992   VEX_W_0F90_P_2_LEN_0,
1993   VEX_W_0F91_P_0_LEN_0,
1994   VEX_W_0F91_P_2_LEN_0,
1995   VEX_W_0F92_P_0_LEN_0,
1996   VEX_W_0F92_P_2_LEN_0,
1997   VEX_W_0F93_P_0_LEN_0,
1998   VEX_W_0F93_P_2_LEN_0,
1999   VEX_W_0F98_P_0_LEN_0,
2000   VEX_W_0F98_P_2_LEN_0,
2001   VEX_W_0F99_P_0_LEN_0,
2002   VEX_W_0F99_P_2_LEN_0,
2003   VEX_W_0F380C_P_2,
2004   VEX_W_0F380D_P_2,
2005   VEX_W_0F380E_P_2,
2006   VEX_W_0F380F_P_2,
2007   VEX_W_0F3816_P_2,
2008   VEX_W_0F3818_P_2,
2009   VEX_W_0F3819_P_2,
2010   VEX_W_0F381A_P_2_M_0,
2011   VEX_W_0F382C_P_2_M_0,
2012   VEX_W_0F382D_P_2_M_0,
2013   VEX_W_0F382E_P_2_M_0,
2014   VEX_W_0F382F_P_2_M_0,
2015   VEX_W_0F3836_P_2,
2016   VEX_W_0F3846_P_2,
2017   VEX_W_0F3858_P_2,
2018   VEX_W_0F3859_P_2,
2019   VEX_W_0F385A_P_2_M_0,
2020   VEX_W_0F3878_P_2,
2021   VEX_W_0F3879_P_2,
2022   VEX_W_0F38CF_P_2,
2023   VEX_W_0F3A00_P_2,
2024   VEX_W_0F3A01_P_2,
2025   VEX_W_0F3A02_P_2,
2026   VEX_W_0F3A04_P_2,
2027   VEX_W_0F3A05_P_2,
2028   VEX_W_0F3A06_P_2,
2029   VEX_W_0F3A18_P_2,
2030   VEX_W_0F3A19_P_2,
2031   VEX_W_0F3A30_P_2_LEN_0,
2032   VEX_W_0F3A31_P_2_LEN_0,
2033   VEX_W_0F3A32_P_2_LEN_0,
2034   VEX_W_0F3A33_P_2_LEN_0,
2035   VEX_W_0F3A38_P_2,
2036   VEX_W_0F3A39_P_2,
2037   VEX_W_0F3A46_P_2,
2038   VEX_W_0F3A48_P_2,
2039   VEX_W_0F3A49_P_2,
2040   VEX_W_0F3A4A_P_2,
2041   VEX_W_0F3A4B_P_2,
2042   VEX_W_0F3A4C_P_2,
2043   VEX_W_0F3ACE_P_2,
2044   VEX_W_0F3ACF_P_2,
2045
2046   EVEX_W_0F10_P_0,
2047   EVEX_W_0F10_P_1_M_0,
2048   EVEX_W_0F10_P_1_M_1,
2049   EVEX_W_0F10_P_2,
2050   EVEX_W_0F10_P_3_M_0,
2051   EVEX_W_0F10_P_3_M_1,
2052   EVEX_W_0F11_P_0,
2053   EVEX_W_0F11_P_1_M_0,
2054   EVEX_W_0F11_P_1_M_1,
2055   EVEX_W_0F11_P_2,
2056   EVEX_W_0F11_P_3_M_0,
2057   EVEX_W_0F11_P_3_M_1,
2058   EVEX_W_0F12_P_0_M_0,
2059   EVEX_W_0F12_P_0_M_1,
2060   EVEX_W_0F12_P_1,
2061   EVEX_W_0F12_P_2,
2062   EVEX_W_0F12_P_3,
2063   EVEX_W_0F13_P_0,
2064   EVEX_W_0F13_P_2,
2065   EVEX_W_0F14_P_0,
2066   EVEX_W_0F14_P_2,
2067   EVEX_W_0F15_P_0,
2068   EVEX_W_0F15_P_2,
2069   EVEX_W_0F16_P_0_M_0,
2070   EVEX_W_0F16_P_0_M_1,
2071   EVEX_W_0F16_P_1,
2072   EVEX_W_0F16_P_2,
2073   EVEX_W_0F17_P_0,
2074   EVEX_W_0F17_P_2,
2075   EVEX_W_0F28_P_0,
2076   EVEX_W_0F28_P_2,
2077   EVEX_W_0F29_P_0,
2078   EVEX_W_0F29_P_2,
2079   EVEX_W_0F2A_P_1,
2080   EVEX_W_0F2A_P_3,
2081   EVEX_W_0F2B_P_0,
2082   EVEX_W_0F2B_P_2,
2083   EVEX_W_0F2E_P_0,
2084   EVEX_W_0F2E_P_2,
2085   EVEX_W_0F2F_P_0,
2086   EVEX_W_0F2F_P_2,
2087   EVEX_W_0F51_P_0,
2088   EVEX_W_0F51_P_1,
2089   EVEX_W_0F51_P_2,
2090   EVEX_W_0F51_P_3,
2091   EVEX_W_0F54_P_0,
2092   EVEX_W_0F54_P_2,
2093   EVEX_W_0F55_P_0,
2094   EVEX_W_0F55_P_2,
2095   EVEX_W_0F56_P_0,
2096   EVEX_W_0F56_P_2,
2097   EVEX_W_0F57_P_0,
2098   EVEX_W_0F57_P_2,
2099   EVEX_W_0F58_P_0,
2100   EVEX_W_0F58_P_1,
2101   EVEX_W_0F58_P_2,
2102   EVEX_W_0F58_P_3,
2103   EVEX_W_0F59_P_0,
2104   EVEX_W_0F59_P_1,
2105   EVEX_W_0F59_P_2,
2106   EVEX_W_0F59_P_3,
2107   EVEX_W_0F5A_P_0,
2108   EVEX_W_0F5A_P_1,
2109   EVEX_W_0F5A_P_2,
2110   EVEX_W_0F5A_P_3,
2111   EVEX_W_0F5B_P_0,
2112   EVEX_W_0F5B_P_1,
2113   EVEX_W_0F5B_P_2,
2114   EVEX_W_0F5C_P_0,
2115   EVEX_W_0F5C_P_1,
2116   EVEX_W_0F5C_P_2,
2117   EVEX_W_0F5C_P_3,
2118   EVEX_W_0F5D_P_0,
2119   EVEX_W_0F5D_P_1,
2120   EVEX_W_0F5D_P_2,
2121   EVEX_W_0F5D_P_3,
2122   EVEX_W_0F5E_P_0,
2123   EVEX_W_0F5E_P_1,
2124   EVEX_W_0F5E_P_2,
2125   EVEX_W_0F5E_P_3,
2126   EVEX_W_0F5F_P_0,
2127   EVEX_W_0F5F_P_1,
2128   EVEX_W_0F5F_P_2,
2129   EVEX_W_0F5F_P_3,
2130   EVEX_W_0F62_P_2,
2131   EVEX_W_0F66_P_2,
2132   EVEX_W_0F6A_P_2,
2133   EVEX_W_0F6B_P_2,
2134   EVEX_W_0F6C_P_2,
2135   EVEX_W_0F6D_P_2,
2136   EVEX_W_0F6F_P_1,
2137   EVEX_W_0F6F_P_2,
2138   EVEX_W_0F6F_P_3,
2139   EVEX_W_0F70_P_2,
2140   EVEX_W_0F72_R_2_P_2,
2141   EVEX_W_0F72_R_6_P_2,
2142   EVEX_W_0F73_R_2_P_2,
2143   EVEX_W_0F73_R_6_P_2,
2144   EVEX_W_0F76_P_2,
2145   EVEX_W_0F78_P_0,
2146   EVEX_W_0F78_P_2,
2147   EVEX_W_0F79_P_0,
2148   EVEX_W_0F79_P_2,
2149   EVEX_W_0F7A_P_1,
2150   EVEX_W_0F7A_P_2,
2151   EVEX_W_0F7A_P_3,
2152   EVEX_W_0F7B_P_1,
2153   EVEX_W_0F7B_P_2,
2154   EVEX_W_0F7B_P_3,
2155   EVEX_W_0F7E_P_1,
2156   EVEX_W_0F7F_P_1,
2157   EVEX_W_0F7F_P_2,
2158   EVEX_W_0F7F_P_3,
2159   EVEX_W_0FC2_P_0,
2160   EVEX_W_0FC2_P_1,
2161   EVEX_W_0FC2_P_2,
2162   EVEX_W_0FC2_P_3,
2163   EVEX_W_0FC6_P_0,
2164   EVEX_W_0FC6_P_2,
2165   EVEX_W_0FD2_P_2,
2166   EVEX_W_0FD3_P_2,
2167   EVEX_W_0FD4_P_2,
2168   EVEX_W_0FD6_P_2,
2169   EVEX_W_0FE6_P_1,
2170   EVEX_W_0FE6_P_2,
2171   EVEX_W_0FE6_P_3,
2172   EVEX_W_0FE7_P_2,
2173   EVEX_W_0FF2_P_2,
2174   EVEX_W_0FF3_P_2,
2175   EVEX_W_0FF4_P_2,
2176   EVEX_W_0FFA_P_2,
2177   EVEX_W_0FFB_P_2,
2178   EVEX_W_0FFE_P_2,
2179   EVEX_W_0F380C_P_2,
2180   EVEX_W_0F380D_P_2,
2181   EVEX_W_0F3810_P_1,
2182   EVEX_W_0F3810_P_2,
2183   EVEX_W_0F3811_P_1,
2184   EVEX_W_0F3811_P_2,
2185   EVEX_W_0F3812_P_1,
2186   EVEX_W_0F3812_P_2,
2187   EVEX_W_0F3813_P_1,
2188   EVEX_W_0F3813_P_2,
2189   EVEX_W_0F3814_P_1,
2190   EVEX_W_0F3815_P_1,
2191   EVEX_W_0F3818_P_2,
2192   EVEX_W_0F3819_P_2,
2193   EVEX_W_0F381A_P_2,
2194   EVEX_W_0F381B_P_2,
2195   EVEX_W_0F381E_P_2,
2196   EVEX_W_0F381F_P_2,
2197   EVEX_W_0F3820_P_1,
2198   EVEX_W_0F3821_P_1,
2199   EVEX_W_0F3822_P_1,
2200   EVEX_W_0F3823_P_1,
2201   EVEX_W_0F3824_P_1,
2202   EVEX_W_0F3825_P_1,
2203   EVEX_W_0F3825_P_2,
2204   EVEX_W_0F3826_P_1,
2205   EVEX_W_0F3826_P_2,
2206   EVEX_W_0F3828_P_1,
2207   EVEX_W_0F3828_P_2,
2208   EVEX_W_0F3829_P_1,
2209   EVEX_W_0F3829_P_2,
2210   EVEX_W_0F382A_P_1,
2211   EVEX_W_0F382A_P_2,
2212   EVEX_W_0F382B_P_2,
2213   EVEX_W_0F3830_P_1,
2214   EVEX_W_0F3831_P_1,
2215   EVEX_W_0F3832_P_1,
2216   EVEX_W_0F3833_P_1,
2217   EVEX_W_0F3834_P_1,
2218   EVEX_W_0F3835_P_1,
2219   EVEX_W_0F3835_P_2,
2220   EVEX_W_0F3837_P_2,
2221   EVEX_W_0F3838_P_1,
2222   EVEX_W_0F3839_P_1,
2223   EVEX_W_0F383A_P_1,
2224   EVEX_W_0F3840_P_2,
2225   EVEX_W_0F3852_P_1,
2226   EVEX_W_0F3854_P_2,
2227   EVEX_W_0F3855_P_2,
2228   EVEX_W_0F3858_P_2,
2229   EVEX_W_0F3859_P_2,
2230   EVEX_W_0F385A_P_2,
2231   EVEX_W_0F385B_P_2,
2232   EVEX_W_0F3862_P_2,
2233   EVEX_W_0F3863_P_2,
2234   EVEX_W_0F3866_P_2,
2235   EVEX_W_0F3868_P_3,
2236   EVEX_W_0F3870_P_2,
2237   EVEX_W_0F3871_P_2,
2238   EVEX_W_0F3872_P_1,
2239   EVEX_W_0F3872_P_2,
2240   EVEX_W_0F3872_P_3,
2241   EVEX_W_0F3873_P_2,
2242   EVEX_W_0F3875_P_2,
2243   EVEX_W_0F3878_P_2,
2244   EVEX_W_0F3879_P_2,
2245   EVEX_W_0F387A_P_2,
2246   EVEX_W_0F387B_P_2,
2247   EVEX_W_0F387D_P_2,
2248   EVEX_W_0F3883_P_2,
2249   EVEX_W_0F388D_P_2,
2250   EVEX_W_0F3891_P_2,
2251   EVEX_W_0F3893_P_2,
2252   EVEX_W_0F38A1_P_2,
2253   EVEX_W_0F38A3_P_2,
2254   EVEX_W_0F38C7_R_1_P_2,
2255   EVEX_W_0F38C7_R_2_P_2,
2256   EVEX_W_0F38C7_R_5_P_2,
2257   EVEX_W_0F38C7_R_6_P_2,
2258
2259   EVEX_W_0F3A00_P_2,
2260   EVEX_W_0F3A01_P_2,
2261   EVEX_W_0F3A04_P_2,
2262   EVEX_W_0F3A05_P_2,
2263   EVEX_W_0F3A08_P_2,
2264   EVEX_W_0F3A09_P_2,
2265   EVEX_W_0F3A0A_P_2,
2266   EVEX_W_0F3A0B_P_2,
2267   EVEX_W_0F3A18_P_2,
2268   EVEX_W_0F3A19_P_2,
2269   EVEX_W_0F3A1A_P_2,
2270   EVEX_W_0F3A1B_P_2,
2271   EVEX_W_0F3A1D_P_2,
2272   EVEX_W_0F3A21_P_2,
2273   EVEX_W_0F3A23_P_2,
2274   EVEX_W_0F3A38_P_2,
2275   EVEX_W_0F3A39_P_2,
2276   EVEX_W_0F3A3A_P_2,
2277   EVEX_W_0F3A3B_P_2,
2278   EVEX_W_0F3A3E_P_2,
2279   EVEX_W_0F3A3F_P_2,
2280   EVEX_W_0F3A42_P_2,
2281   EVEX_W_0F3A43_P_2,
2282   EVEX_W_0F3A50_P_2,
2283   EVEX_W_0F3A51_P_2,
2284   EVEX_W_0F3A56_P_2,
2285   EVEX_W_0F3A57_P_2,
2286   EVEX_W_0F3A66_P_2,
2287   EVEX_W_0F3A67_P_2,
2288   EVEX_W_0F3A70_P_2,
2289   EVEX_W_0F3A71_P_2,
2290   EVEX_W_0F3A72_P_2,
2291   EVEX_W_0F3A73_P_2,
2292   EVEX_W_0F3ACE_P_2,
2293   EVEX_W_0F3ACF_P_2
2294 };
2295
2296 typedef void (*op_rtn) (int bytemode, int sizeflag);
2297
2298 struct dis386 {
2299   const char *name;
2300   struct
2301     {
2302       op_rtn rtn;
2303       int bytemode;
2304     } op[MAX_OPERANDS];
2305   unsigned int prefix_requirement;
2306 };
2307
2308 /* Upper case letters in the instruction names here are macros.
2309    'A' => print 'b' if no register operands or suffix_always is true
2310    'B' => print 'b' if suffix_always is true
2311    'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
2312           size prefix
2313    'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
2314           suffix_always is true
2315    'E' => print 'e' if 32-bit form of jcxz
2316    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
2317    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
2318    'H' => print ",pt" or ",pn" branch hint
2319    'I' => honor following macro letter even in Intel mode (implemented only
2320           for some of the macro letters)
2321    'J' => print 'l'
2322    'K' => print 'd' or 'q' if rex prefix is present.
2323    'L' => print 'l' if suffix_always is true
2324    'M' => print 'r' if intel_mnemonic is false.
2325    'N' => print 'n' if instruction has no wait "prefix"
2326    'O' => print 'd' or 'o' (or 'q' in Intel mode)
2327    'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
2328           or suffix_always is true.  print 'q' if rex prefix is present.
2329    'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
2330           is true
2331    'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
2332    'S' => print 'w', 'l' or 'q' if suffix_always is true
2333    'T' => print 'q' in 64bit mode if instruction has no operand size
2334           prefix and behave as 'P' otherwise
2335    'U' => print 'q' in 64bit mode if instruction has no operand size
2336           prefix and behave as 'Q' otherwise
2337    'V' => print 'q' in 64bit mode if instruction has no operand size
2338           prefix and behave as 'S' otherwise
2339    'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
2340    'X' => print 's', 'd' depending on data16 prefix (for XMM)
2341    'Y' unused.
2342    'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
2343    '!' => change condition from true to false or from false to true.
2344    '%' => add 1 upper case letter to the macro.
2345    '^' => print 'w' or 'l' depending on operand size prefix or
2346           suffix_always is true (lcall/ljmp).
2347    '@' => print 'q' for Intel64 ISA, 'w' or 'q' for AMD64 ISA depending
2348           on operand size prefix.
2349    '&' => print 'q' in 64bit mode for Intel64 ISA or if instruction
2350           has no operand size prefix for AMD64 ISA, behave as 'P'
2351           otherwise
2352
2353    2 upper case letter macros:
2354    "XY" => print 'x' or 'y' if suffix_always is true or no register
2355            operands and no broadcast.
2356    "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
2357            register operands and no broadcast.
2358    "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
2359    "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand
2360            or suffix_always is true
2361    "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
2362    "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
2363    "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
2364    "LW" => print 'd', 'q' depending on the VEX.W bit
2365    "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
2366            an operand size prefix, or suffix_always is true.  print
2367            'q' if rex prefix is present.
2368
2369    Many of the above letters print nothing in Intel mode.  See "putop"
2370    for the details.
2371
2372    Braces '{' and '}', and vertical bars '|', indicate alternative
2373    mnemonic strings for AT&T and Intel.  */
2374
2375 static const struct dis386 dis386[] = {
2376   /* 00 */
2377   { "addB",             { Ebh1, Gb }, 0 },
2378   { "addS",             { Evh1, Gv }, 0 },
2379   { "addB",             { Gb, EbS }, 0 },
2380   { "addS",             { Gv, EvS }, 0 },
2381   { "addB",             { AL, Ib }, 0 },
2382   { "addS",             { eAX, Iv }, 0 },
2383   { X86_64_TABLE (X86_64_06) },
2384   { X86_64_TABLE (X86_64_07) },
2385   /* 08 */
2386   { "orB",              { Ebh1, Gb }, 0 },
2387   { "orS",              { Evh1, Gv }, 0 },
2388   { "orB",              { Gb, EbS }, 0 },
2389   { "orS",              { Gv, EvS }, 0 },
2390   { "orB",              { AL, Ib }, 0 },
2391   { "orS",              { eAX, Iv }, 0 },
2392   { X86_64_TABLE (X86_64_0D) },
2393   { Bad_Opcode },       /* 0x0f extended opcode escape */
2394   /* 10 */
2395   { "adcB",             { Ebh1, Gb }, 0 },
2396   { "adcS",             { Evh1, Gv }, 0 },
2397   { "adcB",             { Gb, EbS }, 0 },
2398   { "adcS",             { Gv, EvS }, 0 },
2399   { "adcB",             { AL, Ib }, 0 },
2400   { "adcS",             { eAX, Iv }, 0 },
2401   { X86_64_TABLE (X86_64_16) },
2402   { X86_64_TABLE (X86_64_17) },
2403   /* 18 */
2404   { "sbbB",             { Ebh1, Gb }, 0 },
2405   { "sbbS",             { Evh1, Gv }, 0 },
2406   { "sbbB",             { Gb, EbS }, 0 },
2407   { "sbbS",             { Gv, EvS }, 0 },
2408   { "sbbB",             { AL, Ib }, 0 },
2409   { "sbbS",             { eAX, Iv }, 0 },
2410   { X86_64_TABLE (X86_64_1E) },
2411   { X86_64_TABLE (X86_64_1F) },
2412   /* 20 */
2413   { "andB",             { Ebh1, Gb }, 0 },
2414   { "andS",             { Evh1, Gv }, 0 },
2415   { "andB",             { Gb, EbS }, 0 },
2416   { "andS",             { Gv, EvS }, 0 },
2417   { "andB",             { AL, Ib }, 0 },
2418   { "andS",             { eAX, Iv }, 0 },
2419   { Bad_Opcode },       /* SEG ES prefix */
2420   { X86_64_TABLE (X86_64_27) },
2421   /* 28 */
2422   { "subB",             { Ebh1, Gb }, 0 },
2423   { "subS",             { Evh1, Gv }, 0 },
2424   { "subB",             { Gb, EbS }, 0 },
2425   { "subS",             { Gv, EvS }, 0 },
2426   { "subB",             { AL, Ib }, 0 },
2427   { "subS",             { eAX, Iv }, 0 },
2428   { Bad_Opcode },       /* SEG CS prefix */
2429   { X86_64_TABLE (X86_64_2F) },
2430   /* 30 */
2431   { "xorB",             { Ebh1, Gb }, 0 },
2432   { "xorS",             { Evh1, Gv }, 0 },
2433   { "xorB",             { Gb, EbS }, 0 },
2434   { "xorS",             { Gv, EvS }, 0 },
2435   { "xorB",             { AL, Ib }, 0 },
2436   { "xorS",             { eAX, Iv }, 0 },
2437   { Bad_Opcode },       /* SEG SS prefix */
2438   { X86_64_TABLE (X86_64_37) },
2439   /* 38 */
2440   { "cmpB",             { Eb, Gb }, 0 },
2441   { "cmpS",             { Ev, Gv }, 0 },
2442   { "cmpB",             { Gb, EbS }, 0 },
2443   { "cmpS",             { Gv, EvS }, 0 },
2444   { "cmpB",             { AL, Ib }, 0 },
2445   { "cmpS",             { eAX, Iv }, 0 },
2446   { Bad_Opcode },       /* SEG DS prefix */
2447   { X86_64_TABLE (X86_64_3F) },
2448   /* 40 */
2449   { "inc{S|}",          { RMeAX }, 0 },
2450   { "inc{S|}",          { RMeCX }, 0 },
2451   { "inc{S|}",          { RMeDX }, 0 },
2452   { "inc{S|}",          { RMeBX }, 0 },
2453   { "inc{S|}",          { RMeSP }, 0 },
2454   { "inc{S|}",          { RMeBP }, 0 },
2455   { "inc{S|}",          { RMeSI }, 0 },
2456   { "inc{S|}",          { RMeDI }, 0 },
2457   /* 48 */
2458   { "dec{S|}",          { RMeAX }, 0 },
2459   { "dec{S|}",          { RMeCX }, 0 },
2460   { "dec{S|}",          { RMeDX }, 0 },
2461   { "dec{S|}",          { RMeBX }, 0 },
2462   { "dec{S|}",          { RMeSP }, 0 },
2463   { "dec{S|}",          { RMeBP }, 0 },
2464   { "dec{S|}",          { RMeSI }, 0 },
2465   { "dec{S|}",          { RMeDI }, 0 },
2466   /* 50 */
2467   { "pushV",            { RMrAX }, 0 },
2468   { "pushV",            { RMrCX }, 0 },
2469   { "pushV",            { RMrDX }, 0 },
2470   { "pushV",            { RMrBX }, 0 },
2471   { "pushV",            { RMrSP }, 0 },
2472   { "pushV",            { RMrBP }, 0 },
2473   { "pushV",            { RMrSI }, 0 },
2474   { "pushV",            { RMrDI }, 0 },
2475   /* 58 */
2476   { "popV",             { RMrAX }, 0 },
2477   { "popV",             { RMrCX }, 0 },
2478   { "popV",             { RMrDX }, 0 },
2479   { "popV",             { RMrBX }, 0 },
2480   { "popV",             { RMrSP }, 0 },
2481   { "popV",             { RMrBP }, 0 },
2482   { "popV",             { RMrSI }, 0 },
2483   { "popV",             { RMrDI }, 0 },
2484   /* 60 */
2485   { X86_64_TABLE (X86_64_60) },
2486   { X86_64_TABLE (X86_64_61) },
2487   { X86_64_TABLE (X86_64_62) },
2488   { X86_64_TABLE (X86_64_63) },
2489   { Bad_Opcode },       /* seg fs */
2490   { Bad_Opcode },       /* seg gs */
2491   { Bad_Opcode },       /* op size prefix */
2492   { Bad_Opcode },       /* adr size prefix */
2493   /* 68 */
2494   { "pushT",            { sIv }, 0 },
2495   { "imulS",            { Gv, Ev, Iv }, 0 },
2496   { "pushT",            { sIbT }, 0 },
2497   { "imulS",            { Gv, Ev, sIb }, 0 },
2498   { "ins{b|}",          { Ybr, indirDX }, 0 },
2499   { X86_64_TABLE (X86_64_6D) },
2500   { "outs{b|}",         { indirDXr, Xb }, 0 },
2501   { X86_64_TABLE (X86_64_6F) },
2502   /* 70 */
2503   { "joH",              { Jb, BND, cond_jump_flag }, 0 },
2504   { "jnoH",             { Jb, BND, cond_jump_flag }, 0 },
2505   { "jbH",              { Jb, BND, cond_jump_flag }, 0 },
2506   { "jaeH",             { Jb, BND, cond_jump_flag }, 0 },
2507   { "jeH",              { Jb, BND, cond_jump_flag }, 0 },
2508   { "jneH",             { Jb, BND, cond_jump_flag }, 0 },
2509   { "jbeH",             { Jb, BND, cond_jump_flag }, 0 },
2510   { "jaH",              { Jb, BND, cond_jump_flag }, 0 },
2511   /* 78 */
2512   { "jsH",              { Jb, BND, cond_jump_flag }, 0 },
2513   { "jnsH",             { Jb, BND, cond_jump_flag }, 0 },
2514   { "jpH",              { Jb, BND, cond_jump_flag }, 0 },
2515   { "jnpH",             { Jb, BND, cond_jump_flag }, 0 },
2516   { "jlH",              { Jb, BND, cond_jump_flag }, 0 },
2517   { "jgeH",             { Jb, BND, cond_jump_flag }, 0 },
2518   { "jleH",             { Jb, BND, cond_jump_flag }, 0 },
2519   { "jgH",              { Jb, BND, cond_jump_flag }, 0 },
2520   /* 80 */
2521   { REG_TABLE (REG_80) },
2522   { REG_TABLE (REG_81) },
2523   { X86_64_TABLE (X86_64_82) },
2524   { REG_TABLE (REG_83) },
2525   { "testB",            { Eb, Gb }, 0 },
2526   { "testS",            { Ev, Gv }, 0 },
2527   { "xchgB",            { Ebh2, Gb }, 0 },
2528   { "xchgS",            { Evh2, Gv }, 0 },
2529   /* 88 */
2530   { "movB",             { Ebh3, Gb }, 0 },
2531   { "movS",             { Evh3, Gv }, 0 },
2532   { "movB",             { Gb, EbS }, 0 },
2533   { "movS",             { Gv, EvS }, 0 },
2534   { "movD",             { Sv, Sw }, 0 },
2535   { MOD_TABLE (MOD_8D) },
2536   { "movD",             { Sw, Sv }, 0 },
2537   { REG_TABLE (REG_8F) },
2538   /* 90 */
2539   { PREFIX_TABLE (PREFIX_90) },
2540   { "xchgS",            { RMeCX, eAX }, 0 },
2541   { "xchgS",            { RMeDX, eAX }, 0 },
2542   { "xchgS",            { RMeBX, eAX }, 0 },
2543   { "xchgS",            { RMeSP, eAX }, 0 },
2544   { "xchgS",            { RMeBP, eAX }, 0 },
2545   { "xchgS",            { RMeSI, eAX }, 0 },
2546   { "xchgS",            { RMeDI, eAX }, 0 },
2547   /* 98 */
2548   { "cW{t|}R",          { XX }, 0 },
2549   { "cR{t|}O",          { XX }, 0 },
2550   { X86_64_TABLE (X86_64_9A) },
2551   { Bad_Opcode },       /* fwait */
2552   { "pushfT",           { XX }, 0 },
2553   { "popfT",            { XX }, 0 },
2554   { "sahf",             { XX }, 0 },
2555   { "lahf",             { XX }, 0 },
2556   /* a0 */
2557   { "mov%LB",           { AL, Ob }, 0 },
2558   { "mov%LS",           { eAX, Ov }, 0 },
2559   { "mov%LB",           { Ob, AL }, 0 },
2560   { "mov%LS",           { Ov, eAX }, 0 },
2561   { "movs{b|}",         { Ybr, Xb }, 0 },
2562   { "movs{R|}",         { Yvr, Xv }, 0 },
2563   { "cmps{b|}",         { Xb, Yb }, 0 },
2564   { "cmps{R|}",         { Xv, Yv }, 0 },
2565   /* a8 */
2566   { "testB",            { AL, Ib }, 0 },
2567   { "testS",            { eAX, Iv }, 0 },
2568   { "stosB",            { Ybr, AL }, 0 },
2569   { "stosS",            { Yvr, eAX }, 0 },
2570   { "lodsB",            { ALr, Xb }, 0 },
2571   { "lodsS",            { eAXr, Xv }, 0 },
2572   { "scasB",            { AL, Yb }, 0 },
2573   { "scasS",            { eAX, Yv }, 0 },
2574   /* b0 */
2575   { "movB",             { RMAL, Ib }, 0 },
2576   { "movB",             { RMCL, Ib }, 0 },
2577   { "movB",             { RMDL, Ib }, 0 },
2578   { "movB",             { RMBL, Ib }, 0 },
2579   { "movB",             { RMAH, Ib }, 0 },
2580   { "movB",             { RMCH, Ib }, 0 },
2581   { "movB",             { RMDH, Ib }, 0 },
2582   { "movB",             { RMBH, Ib }, 0 },
2583   /* b8 */
2584   { "mov%LV",           { RMeAX, Iv64 }, 0 },
2585   { "mov%LV",           { RMeCX, Iv64 }, 0 },
2586   { "mov%LV",           { RMeDX, Iv64 }, 0 },
2587   { "mov%LV",           { RMeBX, Iv64 }, 0 },
2588   { "mov%LV",           { RMeSP, Iv64 }, 0 },
2589   { "mov%LV",           { RMeBP, Iv64 }, 0 },
2590   { "mov%LV",           { RMeSI, Iv64 }, 0 },
2591   { "mov%LV",           { RMeDI, Iv64 }, 0 },
2592   /* c0 */
2593   { REG_TABLE (REG_C0) },
2594   { REG_TABLE (REG_C1) },
2595   { "retT",             { Iw, BND }, 0 },
2596   { "retT",             { BND }, 0 },
2597   { X86_64_TABLE (X86_64_C4) },
2598   { X86_64_TABLE (X86_64_C5) },
2599   { REG_TABLE (REG_C6) },
2600   { REG_TABLE (REG_C7) },
2601   /* c8 */
2602   { "enterT",           { Iw, Ib }, 0 },
2603   { "leaveT",           { XX }, 0 },
2604   { "Jret{|f}P",        { Iw }, 0 },
2605   { "Jret{|f}P",        { XX }, 0 },
2606   { "int3",             { XX }, 0 },
2607   { "int",              { Ib }, 0 },
2608   { X86_64_TABLE (X86_64_CE) },
2609   { "iret%LP",          { XX }, 0 },
2610   /* d0 */
2611   { REG_TABLE (REG_D0) },
2612   { REG_TABLE (REG_D1) },
2613   { REG_TABLE (REG_D2) },
2614   { REG_TABLE (REG_D3) },
2615   { X86_64_TABLE (X86_64_D4) },
2616   { X86_64_TABLE (X86_64_D5) },
2617   { Bad_Opcode },
2618   { "xlat",             { DSBX }, 0 },
2619   /* d8 */
2620   { FLOAT },
2621   { FLOAT },
2622   { FLOAT },
2623   { FLOAT },
2624   { FLOAT },
2625   { FLOAT },
2626   { FLOAT },
2627   { FLOAT },
2628   /* e0 */
2629   { "loopneFH",         { Jb, XX, loop_jcxz_flag }, 0 },
2630   { "loopeFH",          { Jb, XX, loop_jcxz_flag }, 0 },
2631   { "loopFH",           { Jb, XX, loop_jcxz_flag }, 0 },
2632   { "jEcxzH",           { Jb, XX, loop_jcxz_flag }, 0 },
2633   { "inB",              { AL, Ib }, 0 },
2634   { "inG",              { zAX, Ib }, 0 },
2635   { "outB",             { Ib, AL }, 0 },
2636   { "outG",             { Ib, zAX }, 0 },
2637   /* e8 */
2638   { X86_64_TABLE (X86_64_E8) },
2639   { X86_64_TABLE (X86_64_E9) },
2640   { X86_64_TABLE (X86_64_EA) },
2641   { "jmp",              { Jb, BND }, 0 },
2642   { "inB",              { AL, indirDX }, 0 },
2643   { "inG",              { zAX, indirDX }, 0 },
2644   { "outB",             { indirDX, AL }, 0 },
2645   { "outG",             { indirDX, zAX }, 0 },
2646   /* f0 */
2647   { Bad_Opcode },       /* lock prefix */
2648   { "icebp",            { XX }, 0 },
2649   { Bad_Opcode },       /* repne */
2650   { Bad_Opcode },       /* repz */
2651   { "hlt",              { XX }, 0 },
2652   { "cmc",              { XX }, 0 },
2653   { REG_TABLE (REG_F6) },
2654   { REG_TABLE (REG_F7) },
2655   /* f8 */
2656   { "clc",              { XX }, 0 },
2657   { "stc",              { XX }, 0 },
2658   { "cli",              { XX }, 0 },
2659   { "sti",              { XX }, 0 },
2660   { "cld",              { XX }, 0 },
2661   { "std",              { XX }, 0 },
2662   { REG_TABLE (REG_FE) },
2663   { REG_TABLE (REG_FF) },
2664 };
2665
2666 static const struct dis386 dis386_twobyte[] = {
2667   /* 00 */
2668   { REG_TABLE (REG_0F00 ) },
2669   { REG_TABLE (REG_0F01 ) },
2670   { "larS",             { Gv, Ew }, 0 },
2671   { "lslS",             { Gv, Ew }, 0 },
2672   { Bad_Opcode },
2673   { "syscall",          { XX }, 0 },
2674   { "clts",             { XX }, 0 },
2675   { "sysret%LP",                { XX }, 0 },
2676   /* 08 */
2677   { "invd",             { XX }, 0 },
2678   { PREFIX_TABLE (PREFIX_0F09) },
2679   { Bad_Opcode },
2680   { "ud2",              { XX }, 0 },
2681   { Bad_Opcode },
2682   { REG_TABLE (REG_0F0D) },
2683   { "femms",            { XX }, 0 },
2684   { "",                 { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix.  */
2685   /* 10 */
2686   { PREFIX_TABLE (PREFIX_0F10) },
2687   { PREFIX_TABLE (PREFIX_0F11) },
2688   { PREFIX_TABLE (PREFIX_0F12) },
2689   { MOD_TABLE (MOD_0F13) },
2690   { "unpcklpX",         { XM, EXx }, PREFIX_OPCODE },
2691   { "unpckhpX",         { XM, EXx }, PREFIX_OPCODE },
2692   { PREFIX_TABLE (PREFIX_0F16) },
2693   { MOD_TABLE (MOD_0F17) },
2694   /* 18 */
2695   { REG_TABLE (REG_0F18) },
2696   { "nopQ",             { Ev }, 0 },
2697   { PREFIX_TABLE (PREFIX_0F1A) },
2698   { PREFIX_TABLE (PREFIX_0F1B) },
2699   { PREFIX_TABLE (PREFIX_0F1C) },
2700   { "nopQ",             { Ev }, 0 },
2701   { PREFIX_TABLE (PREFIX_0F1E) },
2702   { "nopQ",             { Ev }, 0 },
2703   /* 20 */
2704   { "movZ",             { Rm, Cm }, 0 },
2705   { "movZ",             { Rm, Dm }, 0 },
2706   { "movZ",             { Cm, Rm }, 0 },
2707   { "movZ",             { Dm, Rm }, 0 },
2708   { MOD_TABLE (MOD_0F24) },
2709   { Bad_Opcode },
2710   { MOD_TABLE (MOD_0F26) },
2711   { Bad_Opcode },
2712   /* 28 */
2713   { "movapX",           { XM, EXx }, PREFIX_OPCODE },
2714   { "movapX",           { EXxS, XM }, PREFIX_OPCODE },
2715   { PREFIX_TABLE (PREFIX_0F2A) },
2716   { PREFIX_TABLE (PREFIX_0F2B) },
2717   { PREFIX_TABLE (PREFIX_0F2C) },
2718   { PREFIX_TABLE (PREFIX_0F2D) },
2719   { PREFIX_TABLE (PREFIX_0F2E) },
2720   { PREFIX_TABLE (PREFIX_0F2F) },
2721   /* 30 */
2722   { "wrmsr",            { XX }, 0 },
2723   { "rdtsc",            { XX }, 0 },
2724   { "rdmsr",            { XX }, 0 },
2725   { "rdpmc",            { XX }, 0 },
2726   { "sysenter",         { XX }, 0 },
2727   { "sysexit",          { XX }, 0 },
2728   { Bad_Opcode },
2729   { "getsec",           { XX }, 0 },
2730   /* 38 */
2731   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2732   { Bad_Opcode },
2733   { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2734   { Bad_Opcode },
2735   { Bad_Opcode },
2736   { Bad_Opcode },
2737   { Bad_Opcode },
2738   { Bad_Opcode },
2739   /* 40 */
2740   { "cmovoS",           { Gv, Ev }, 0 },
2741   { "cmovnoS",          { Gv, Ev }, 0 },
2742   { "cmovbS",           { Gv, Ev }, 0 },
2743   { "cmovaeS",          { Gv, Ev }, 0 },
2744   { "cmoveS",           { Gv, Ev }, 0 },
2745   { "cmovneS",          { Gv, Ev }, 0 },
2746   { "cmovbeS",          { Gv, Ev }, 0 },
2747   { "cmovaS",           { Gv, Ev }, 0 },
2748   /* 48 */
2749   { "cmovsS",           { Gv, Ev }, 0 },
2750   { "cmovnsS",          { Gv, Ev }, 0 },
2751   { "cmovpS",           { Gv, Ev }, 0 },
2752   { "cmovnpS",          { Gv, Ev }, 0 },
2753   { "cmovlS",           { Gv, Ev }, 0 },
2754   { "cmovgeS",          { Gv, Ev }, 0 },
2755   { "cmovleS",          { Gv, Ev }, 0 },
2756   { "cmovgS",           { Gv, Ev }, 0 },
2757   /* 50 */
2758   { MOD_TABLE (MOD_0F51) },
2759   { PREFIX_TABLE (PREFIX_0F51) },
2760   { PREFIX_TABLE (PREFIX_0F52) },
2761   { PREFIX_TABLE (PREFIX_0F53) },
2762   { "andpX",            { XM, EXx }, PREFIX_OPCODE },
2763   { "andnpX",           { XM, EXx }, PREFIX_OPCODE },
2764   { "orpX",             { XM, EXx }, PREFIX_OPCODE },
2765   { "xorpX",            { XM, EXx }, PREFIX_OPCODE },
2766   /* 58 */
2767   { PREFIX_TABLE (PREFIX_0F58) },
2768   { PREFIX_TABLE (PREFIX_0F59) },
2769   { PREFIX_TABLE (PREFIX_0F5A) },
2770   { PREFIX_TABLE (PREFIX_0F5B) },
2771   { PREFIX_TABLE (PREFIX_0F5C) },
2772   { PREFIX_TABLE (PREFIX_0F5D) },
2773   { PREFIX_TABLE (PREFIX_0F5E) },
2774   { PREFIX_TABLE (PREFIX_0F5F) },
2775   /* 60 */
2776   { PREFIX_TABLE (PREFIX_0F60) },
2777   { PREFIX_TABLE (PREFIX_0F61) },
2778   { PREFIX_TABLE (PREFIX_0F62) },
2779   { "packsswb",         { MX, EM }, PREFIX_OPCODE },
2780   { "pcmpgtb",          { MX, EM }, PREFIX_OPCODE },
2781   { "pcmpgtw",          { MX, EM }, PREFIX_OPCODE },
2782   { "pcmpgtd",          { MX, EM }, PREFIX_OPCODE },
2783   { "packuswb",         { MX, EM }, PREFIX_OPCODE },
2784   /* 68 */
2785   { "punpckhbw",        { MX, EM }, PREFIX_OPCODE },
2786   { "punpckhwd",        { MX, EM }, PREFIX_OPCODE },
2787   { "punpckhdq",        { MX, EM }, PREFIX_OPCODE },
2788   { "packssdw",         { MX, EM }, PREFIX_OPCODE },
2789   { PREFIX_TABLE (PREFIX_0F6C) },
2790   { PREFIX_TABLE (PREFIX_0F6D) },
2791   { "movK",             { MX, Edq }, PREFIX_OPCODE },
2792   { PREFIX_TABLE (PREFIX_0F6F) },
2793   /* 70 */
2794   { PREFIX_TABLE (PREFIX_0F70) },
2795   { REG_TABLE (REG_0F71) },
2796   { REG_TABLE (REG_0F72) },
2797   { REG_TABLE (REG_0F73) },
2798   { "pcmpeqb",          { MX, EM }, PREFIX_OPCODE },
2799   { "pcmpeqw",          { MX, EM }, PREFIX_OPCODE },
2800   { "pcmpeqd",          { MX, EM }, PREFIX_OPCODE },
2801   { "emms",             { XX }, PREFIX_OPCODE },
2802   /* 78 */
2803   { PREFIX_TABLE (PREFIX_0F78) },
2804   { PREFIX_TABLE (PREFIX_0F79) },
2805   { Bad_Opcode },
2806   { Bad_Opcode },
2807   { PREFIX_TABLE (PREFIX_0F7C) },
2808   { PREFIX_TABLE (PREFIX_0F7D) },
2809   { PREFIX_TABLE (PREFIX_0F7E) },
2810   { PREFIX_TABLE (PREFIX_0F7F) },
2811   /* 80 */
2812   { "joH",              { Jv, BND, cond_jump_flag }, 0 },
2813   { "jnoH",             { Jv, BND, cond_jump_flag }, 0 },
2814   { "jbH",              { Jv, BND, cond_jump_flag }, 0 },
2815   { "jaeH",             { Jv, BND, cond_jump_flag }, 0 },
2816   { "jeH",              { Jv, BND, cond_jump_flag }, 0 },
2817   { "jneH",             { Jv, BND, cond_jump_flag }, 0 },
2818   { "jbeH",             { Jv, BND, cond_jump_flag }, 0 },
2819   { "jaH",              { Jv, BND, cond_jump_flag }, 0 },
2820   /* 88 */
2821   { "jsH",              { Jv, BND, cond_jump_flag }, 0 },
2822   { "jnsH",             { Jv, BND, cond_jump_flag }, 0 },
2823   { "jpH",              { Jv, BND, cond_jump_flag }, 0 },
2824   { "jnpH",             { Jv, BND, cond_jump_flag }, 0 },
2825   { "jlH",              { Jv, BND, cond_jump_flag }, 0 },
2826   { "jgeH",             { Jv, BND, cond_jump_flag }, 0 },
2827   { "jleH",             { Jv, BND, cond_jump_flag }, 0 },
2828   { "jgH",              { Jv, BND, cond_jump_flag }, 0 },
2829   /* 90 */
2830   { "seto",             { Eb }, 0 },
2831   { "setno",            { Eb }, 0 },
2832   { "setb",             { Eb }, 0 },
2833   { "setae",            { Eb }, 0 },
2834   { "sete",             { Eb }, 0 },
2835   { "setne",            { Eb }, 0 },
2836   { "setbe",            { Eb }, 0 },
2837   { "seta",             { Eb }, 0 },
2838   /* 98 */
2839   { "sets",             { Eb }, 0 },
2840   { "setns",            { Eb }, 0 },
2841   { "setp",             { Eb }, 0 },
2842   { "setnp",            { Eb }, 0 },
2843   { "setl",             { Eb }, 0 },
2844   { "setge",            { Eb }, 0 },
2845   { "setle",            { Eb }, 0 },
2846   { "setg",             { Eb }, 0 },
2847   /* a0 */
2848   { "pushT",            { fs }, 0 },
2849   { "popT",             { fs }, 0 },
2850   { "cpuid",            { XX }, 0 },
2851   { "btS",              { Ev, Gv }, 0 },
2852   { "shldS",            { Ev, Gv, Ib }, 0 },
2853   { "shldS",            { Ev, Gv, CL }, 0 },
2854   { REG_TABLE (REG_0FA6) },
2855   { REG_TABLE (REG_0FA7) },
2856   /* a8 */
2857   { "pushT",            { gs }, 0 },
2858   { "popT",             { gs }, 0 },
2859   { "rsm",              { XX }, 0 },
2860   { "btsS",             { Evh1, Gv }, 0 },
2861   { "shrdS",            { Ev, Gv, Ib }, 0 },
2862   { "shrdS",            { Ev, Gv, CL }, 0 },
2863   { REG_TABLE (REG_0FAE) },
2864   { "imulS",            { Gv, Ev }, 0 },
2865   /* b0 */
2866   { "cmpxchgB",         { Ebh1, Gb }, 0 },
2867   { "cmpxchgS",         { Evh1, Gv }, 0 },
2868   { MOD_TABLE (MOD_0FB2) },
2869   { "btrS",             { Evh1, Gv }, 0 },
2870   { MOD_TABLE (MOD_0FB4) },
2871   { MOD_TABLE (MOD_0FB5) },
2872   { "movz{bR|x}",       { Gv, Eb }, 0 },
2873   { "movz{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2874   /* b8 */
2875   { PREFIX_TABLE (PREFIX_0FB8) },
2876   { "ud1S",             { Gv, Ev }, 0 },
2877   { REG_TABLE (REG_0FBA) },
2878   { "btcS",             { Evh1, Gv }, 0 },
2879   { PREFIX_TABLE (PREFIX_0FBC) },
2880   { PREFIX_TABLE (PREFIX_0FBD) },
2881   { "movs{bR|x}",       { Gv, Eb }, 0 },
2882   { "movs{wR|x}",       { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2883   /* c0 */
2884   { "xaddB",            { Ebh1, Gb }, 0 },
2885   { "xaddS",            { Evh1, Gv }, 0 },
2886   { PREFIX_TABLE (PREFIX_0FC2) },
2887   { MOD_TABLE (MOD_0FC3) },
2888   { "pinsrw",           { MX, Edqw, Ib }, PREFIX_OPCODE },
2889   { "pextrw",           { Gdq, MS, Ib }, PREFIX_OPCODE },
2890   { "shufpX",           { XM, EXx, Ib }, PREFIX_OPCODE },
2891   { REG_TABLE (REG_0FC7) },
2892   /* c8 */
2893   { "bswap",            { RMeAX }, 0 },
2894   { "bswap",            { RMeCX }, 0 },
2895   { "bswap",            { RMeDX }, 0 },
2896   { "bswap",            { RMeBX }, 0 },
2897   { "bswap",            { RMeSP }, 0 },
2898   { "bswap",            { RMeBP }, 0 },
2899   { "bswap",            { RMeSI }, 0 },
2900   { "bswap",            { RMeDI }, 0 },
2901   /* d0 */
2902   { PREFIX_TABLE (PREFIX_0FD0) },
2903   { "psrlw",            { MX, EM }, PREFIX_OPCODE },
2904   { "psrld",            { MX, EM }, PREFIX_OPCODE },
2905   { "psrlq",            { MX, EM }, PREFIX_OPCODE },
2906   { "paddq",            { MX, EM }, PREFIX_OPCODE },
2907   { "pmullw",           { MX, EM }, PREFIX_OPCODE },
2908   { PREFIX_TABLE (PREFIX_0FD6) },
2909   { MOD_TABLE (MOD_0FD7) },
2910   /* d8 */
2911   { "psubusb",          { MX, EM }, PREFIX_OPCODE },
2912   { "psubusw",          { MX, EM }, PREFIX_OPCODE },
2913   { "pminub",           { MX, EM }, PREFIX_OPCODE },
2914   { "pand",             { MX, EM }, PREFIX_OPCODE },
2915   { "paddusb",          { MX, EM }, PREFIX_OPCODE },
2916   { "paddusw",          { MX, EM }, PREFIX_OPCODE },
2917   { "pmaxub",           { MX, EM }, PREFIX_OPCODE },
2918   { "pandn",            { MX, EM }, PREFIX_OPCODE },
2919   /* e0 */
2920   { "pavgb",            { MX, EM }, PREFIX_OPCODE },
2921   { "psraw",            { MX, EM }, PREFIX_OPCODE },
2922   { "psrad",            { MX, EM }, PREFIX_OPCODE },
2923   { "pavgw",            { MX, EM }, PREFIX_OPCODE },
2924   { "pmulhuw",          { MX, EM }, PREFIX_OPCODE },
2925   { "pmulhw",           { MX, EM }, PREFIX_OPCODE },
2926   { PREFIX_TABLE (PREFIX_0FE6) },
2927   { PREFIX_TABLE (PREFIX_0FE7) },
2928   /* e8 */
2929   { "psubsb",           { MX, EM }, PREFIX_OPCODE },
2930   { "psubsw",           { MX, EM }, PREFIX_OPCODE },
2931   { "pminsw",           { MX, EM }, PREFIX_OPCODE },
2932   { "por",              { MX, EM }, PREFIX_OPCODE },
2933   { "paddsb",           { MX, EM }, PREFIX_OPCODE },
2934   { "paddsw",           { MX, EM }, PREFIX_OPCODE },
2935   { "pmaxsw",           { MX, EM }, PREFIX_OPCODE },
2936   { "pxor",             { MX, EM }, PREFIX_OPCODE },
2937   /* f0 */
2938   { PREFIX_TABLE (PREFIX_0FF0) },
2939   { "psllw",            { MX, EM }, PREFIX_OPCODE },
2940   { "pslld",            { MX, EM }, PREFIX_OPCODE },
2941   { "psllq",            { MX, EM }, PREFIX_OPCODE },
2942   { "pmuludq",          { MX, EM }, PREFIX_OPCODE },
2943   { "pmaddwd",          { MX, EM }, PREFIX_OPCODE },
2944   { "psadbw",           { MX, EM }, PREFIX_OPCODE },
2945   { PREFIX_TABLE (PREFIX_0FF7) },
2946   /* f8 */
2947   { "psubb",            { MX, EM }, PREFIX_OPCODE },
2948   { "psubw",            { MX, EM }, PREFIX_OPCODE },
2949   { "psubd",            { MX, EM }, PREFIX_OPCODE },
2950   { "psubq",            { MX, EM }, PREFIX_OPCODE },
2951   { "paddb",            { MX, EM }, PREFIX_OPCODE },
2952   { "paddw",            { MX, EM }, PREFIX_OPCODE },
2953   { "paddd",            { MX, EM }, PREFIX_OPCODE },
2954   { "ud0S",             { Gv, Ev }, 0 },
2955 };
2956
2957 static const unsigned char onebyte_has_modrm[256] = {
2958   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2959   /*       -------------------------------        */
2960   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2961   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2962   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2963   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2964   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2965   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2966   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2967   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2968   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2969   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2970   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2971   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2972   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2973   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2974   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2975   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
2976   /*       -------------------------------        */
2977   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2978 };
2979
2980 static const unsigned char twobyte_has_modrm[256] = {
2981   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
2982   /*       -------------------------------        */
2983   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2984   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2985   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2986   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2987   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2988   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2989   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2990   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2991   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2992   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2993   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2994   /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2995   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2996   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2997   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2998   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1  /* ff */
2999   /*       -------------------------------        */
3000   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
3001 };
3002
3003 static char obuf[100];
3004 static char *obufp;
3005 static char *mnemonicendp;
3006 static char scratchbuf[100];
3007 static unsigned char *start_codep;
3008 static unsigned char *insn_codep;
3009 static unsigned char *codep;
3010 static unsigned char *end_codep;
3011 static int last_lock_prefix;
3012 static int last_repz_prefix;
3013 static int last_repnz_prefix;
3014 static int last_data_prefix;
3015 static int last_addr_prefix;
3016 static int last_rex_prefix;
3017 static int last_seg_prefix;
3018 static int fwait_prefix;
3019 /* The active segment register prefix.  */
3020 static int active_seg_prefix;
3021 #define MAX_CODE_LENGTH 15
3022 /* We can up to 14 prefixes since the maximum instruction length is
3023    15bytes.  */
3024 static int all_prefixes[MAX_CODE_LENGTH - 1];
3025 static disassemble_info *the_info;
3026 static struct
3027   {
3028     int mod;
3029     int reg;
3030     int rm;
3031   }
3032 modrm;
3033 static unsigned char need_modrm;
3034 static struct
3035   {
3036     int scale;
3037     int index;
3038     int base;
3039   }
3040 sib;
3041 static struct
3042   {
3043     int register_specifier;
3044     int length;
3045     int prefix;
3046     int w;
3047     int evex;
3048     int r;
3049     int v;
3050     int mask_register_specifier;
3051     int zeroing;
3052     int ll;
3053     int b;
3054   }
3055 vex;
3056 static unsigned char need_vex;
3057 static unsigned char need_vex_reg;
3058 static unsigned char vex_w_done;
3059
3060 struct op
3061   {
3062     const char *name;
3063     unsigned int len;
3064   };
3065
3066 /* If we are accessing mod/rm/reg without need_modrm set, then the
3067    values are stale.  Hitting this abort likely indicates that you
3068    need to update onebyte_has_modrm or twobyte_has_modrm.  */
3069 #define MODRM_CHECK  if (!need_modrm) abort ()
3070
3071 static const char **names64;
3072 static const char **names32;
3073 static const char **names16;
3074 static const char **names8;
3075 static const char **names8rex;
3076 static const char **names_seg;
3077 static const char *index64;
3078 static const char *index32;
3079 static const char **index16;
3080 static const char **names_bnd;
3081
3082 static const char *intel_names64[] = {
3083   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
3084   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3085 };
3086 static const char *intel_names32[] = {
3087   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
3088   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
3089 };
3090 static const char *intel_names16[] = {
3091   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
3092   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
3093 };
3094 static const char *intel_names8[] = {
3095   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
3096 };
3097 static const char *intel_names8rex[] = {
3098   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
3099   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
3100 };
3101 static const char *intel_names_seg[] = {
3102   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
3103 };
3104 static const char *intel_index64 = "riz";
3105 static const char *intel_index32 = "eiz";
3106 static const char *intel_index16[] = {
3107   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
3108 };
3109
3110 static const char *att_names64[] = {
3111   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
3112   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
3113 };
3114 static const char *att_names32[] = {
3115   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
3116   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
3117 };
3118 static const char *att_names16[] = {
3119   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
3120   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
3121 };
3122 static const char *att_names8[] = {
3123   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
3124 };
3125 static const char *att_names8rex[] = {
3126   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
3127   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
3128 };
3129 static const char *att_names_seg[] = {
3130   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
3131 };
3132 static const char *att_index64 = "%riz";
3133 static const char *att_index32 = "%eiz";
3134 static const char *att_index16[] = {
3135   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
3136 };
3137
3138 static const char **names_mm;
3139 static const char *intel_names_mm[] = {
3140   "mm0", "mm1", "mm2", "mm3",
3141   "mm4", "mm5", "mm6", "mm7"
3142 };
3143 static const char *att_names_mm[] = {
3144   "%mm0", "%mm1", "%mm2", "%mm3",
3145   "%mm4", "%mm5", "%mm6", "%mm7"
3146 };
3147
3148 static const char *intel_names_bnd[] = {
3149   "bnd0", "bnd1", "bnd2", "bnd3"
3150 };
3151
3152 static const char *att_names_bnd[] = {
3153   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
3154 };
3155
3156 static const char **names_xmm;
3157 static const char *intel_names_xmm[] = {
3158   "xmm0", "xmm1", "xmm2", "xmm3",
3159   "xmm4", "xmm5", "xmm6", "xmm7",
3160   "xmm8", "xmm9", "xmm10", "xmm11",
3161   "xmm12", "xmm13", "xmm14", "xmm15",
3162   "xmm16", "xmm17", "xmm18", "xmm19",
3163   "xmm20", "xmm21", "xmm22", "xmm23",
3164   "xmm24", "xmm25", "xmm26", "xmm27",
3165   "xmm28", "xmm29", "xmm30", "xmm31"
3166 };
3167 static const char *att_names_xmm[] = {
3168   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
3169   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
3170   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
3171   "%xmm12", "%xmm13", "%xmm14", "%xmm15",
3172   "%xmm16", "%xmm17", "%xmm18", "%xmm19",
3173   "%xmm20", "%xmm21", "%xmm22", "%xmm23",
3174   "%xmm24", "%xmm25", "%xmm26", "%xmm27",
3175   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
3176 };
3177
3178 static const char **names_ymm;
3179 static const char *intel_names_ymm[] = {
3180   "ymm0", "ymm1", "ymm2", "ymm3",
3181   "ymm4", "ymm5", "ymm6", "ymm7",
3182   "ymm8", "ymm9", "ymm10", "ymm11",
3183   "ymm12", "ymm13", "ymm14", "ymm15",
3184   "ymm16", "ymm17", "ymm18", "ymm19",
3185   "ymm20", "ymm21", "ymm22", "ymm23",
3186   "ymm24", "ymm25", "ymm26", "ymm27",
3187   "ymm28", "ymm29", "ymm30", "ymm31"
3188 };
3189 static const char *att_names_ymm[] = {
3190   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
3191   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
3192   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
3193   "%ymm12", "%ymm13", "%ymm14", "%ymm15",
3194   "%ymm16", "%ymm17", "%ymm18", "%ymm19",
3195   "%ymm20", "%ymm21", "%ymm22", "%ymm23",
3196   "%ymm24", "%ymm25", "%ymm26", "%ymm27",
3197   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
3198 };
3199
3200 static const char **names_zmm;
3201 static const char *intel_names_zmm[] = {
3202   "zmm0", "zmm1", "zmm2", "zmm3",
3203   "zmm4", "zmm5", "zmm6", "zmm7",
3204   "zmm8", "zmm9", "zmm10", "zmm11",
3205   "zmm12", "zmm13", "zmm14", "zmm15",
3206   "zmm16", "zmm17", "zmm18", "zmm19",
3207   "zmm20", "zmm21", "zmm22", "zmm23",
3208   "zmm24", "zmm25", "zmm26", "zmm27",
3209   "zmm28", "zmm29", "zmm30", "zmm31"
3210 };
3211 static const char *att_names_zmm[] = {
3212   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
3213   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
3214   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
3215   "%zmm12", "%zmm13", "%zmm14", "%zmm15",
3216   "%zmm16", "%zmm17", "%zmm18", "%zmm19",
3217   "%zmm20", "%zmm21", "%zmm22", "%zmm23",
3218   "%zmm24", "%zmm25", "%zmm26", "%zmm27",
3219   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
3220 };
3221
3222 static const char **names_mask;
3223 static const char *intel_names_mask[] = {
3224   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
3225 };
3226 static const char *att_names_mask[] = {
3227   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
3228 };
3229
3230 static const char *names_rounding[] =
3231 {
3232   "{rn-sae}",
3233   "{rd-sae}",
3234   "{ru-sae}",
3235   "{rz-sae}"
3236 };
3237
3238 static const struct dis386 reg_table[][8] = {
3239   /* REG_80 */
3240   {
3241     { "addA",   { Ebh1, Ib }, 0 },
3242     { "orA",    { Ebh1, Ib }, 0 },
3243     { "adcA",   { Ebh1, Ib }, 0 },
3244     { "sbbA",   { Ebh1, Ib }, 0 },
3245     { "andA",   { Ebh1, Ib }, 0 },
3246     { "subA",   { Ebh1, Ib }, 0 },
3247     { "xorA",   { Ebh1, Ib }, 0 },
3248     { "cmpA",   { Eb, Ib }, 0 },
3249   },
3250   /* REG_81 */
3251   {
3252     { "addQ",   { Evh1, Iv }, 0 },
3253     { "orQ",    { Evh1, Iv }, 0 },
3254     { "adcQ",   { Evh1, Iv }, 0 },
3255     { "sbbQ",   { Evh1, Iv }, 0 },
3256     { "andQ",   { Evh1, Iv }, 0 },
3257     { "subQ",   { Evh1, Iv }, 0 },
3258     { "xorQ",   { Evh1, Iv }, 0 },
3259     { "cmpQ",   { Ev, Iv }, 0 },
3260   },
3261   /* REG_83 */
3262   {
3263     { "addQ",   { Evh1, sIb }, 0 },
3264     { "orQ",    { Evh1, sIb }, 0 },
3265     { "adcQ",   { Evh1, sIb }, 0 },
3266     { "sbbQ",   { Evh1, sIb }, 0 },
3267     { "andQ",   { Evh1, sIb }, 0 },
3268     { "subQ",   { Evh1, sIb }, 0 },
3269     { "xorQ",   { Evh1, sIb }, 0 },
3270     { "cmpQ",   { Ev, sIb }, 0 },
3271   },
3272   /* REG_8F */
3273   {
3274     { "popU",   { stackEv }, 0 },
3275     { XOP_8F_TABLE (XOP_09) },
3276     { Bad_Opcode },
3277     { Bad_Opcode },
3278     { Bad_Opcode },
3279     { XOP_8F_TABLE (XOP_09) },
3280   },
3281   /* REG_C0 */
3282   {
3283     { "rolA",   { Eb, Ib }, 0 },
3284     { "rorA",   { Eb, Ib }, 0 },
3285     { "rclA",   { Eb, Ib }, 0 },
3286     { "rcrA",   { Eb, Ib }, 0 },
3287     { "shlA",   { Eb, Ib }, 0 },
3288     { "shrA",   { Eb, Ib }, 0 },
3289     { "shlA",   { Eb, Ib }, 0 },
3290     { "sarA",   { Eb, Ib }, 0 },
3291   },
3292   /* REG_C1 */
3293   {
3294     { "rolQ",   { Ev, Ib }, 0 },
3295     { "rorQ",   { Ev, Ib }, 0 },
3296     { "rclQ",   { Ev, Ib }, 0 },
3297     { "rcrQ",   { Ev, Ib }, 0 },
3298     { "shlQ",   { Ev, Ib }, 0 },
3299     { "shrQ",   { Ev, Ib }, 0 },
3300     { "shlQ",   { Ev, Ib }, 0 },
3301     { "sarQ",   { Ev, Ib }, 0 },
3302   },
3303   /* REG_C6 */
3304   {
3305     { "movA",   { Ebh3, Ib }, 0 },
3306     { Bad_Opcode },
3307     { Bad_Opcode },
3308     { Bad_Opcode },
3309     { Bad_Opcode },
3310     { Bad_Opcode },
3311     { Bad_Opcode },
3312     { MOD_TABLE (MOD_C6_REG_7) },
3313   },
3314   /* REG_C7 */
3315   {
3316     { "movQ",   { Evh3, Iv }, 0 },
3317     { Bad_Opcode },
3318     { Bad_Opcode },
3319     { Bad_Opcode },
3320     { Bad_Opcode },
3321     { Bad_Opcode },
3322     { Bad_Opcode },
3323     { MOD_TABLE (MOD_C7_REG_7) },
3324   },
3325   /* REG_D0 */
3326   {
3327     { "rolA",   { Eb, I1 }, 0 },
3328     { "rorA",   { Eb, I1 }, 0 },
3329     { "rclA",   { Eb, I1 }, 0 },
3330     { "rcrA",   { Eb, I1 }, 0 },
3331     { "shlA",   { Eb, I1 }, 0 },
3332     { "shrA",   { Eb, I1 }, 0 },
3333     { "shlA",   { Eb, I1 }, 0 },
3334     { "sarA",   { Eb, I1 }, 0 },
3335   },
3336   /* REG_D1 */
3337   {
3338     { "rolQ",   { Ev, I1 }, 0 },
3339     { "rorQ",   { Ev, I1 }, 0 },
3340     { "rclQ",   { Ev, I1 }, 0 },
3341     { "rcrQ",   { Ev, I1 }, 0 },
3342     { "shlQ",   { Ev, I1 }, 0 },
3343     { "shrQ",   { Ev, I1 }, 0 },
3344     { "shlQ",   { Ev, I1 }, 0 },
3345     { "sarQ",   { Ev, I1 }, 0 },
3346   },
3347   /* REG_D2 */
3348   {
3349     { "rolA",   { Eb, CL }, 0 },
3350     { "rorA",   { Eb, CL }, 0 },
3351     { "rclA",   { Eb, CL }, 0 },
3352     { "rcrA",   { Eb, CL }, 0 },
3353     { "shlA",   { Eb, CL }, 0 },
3354     { "shrA",   { Eb, CL }, 0 },
3355     { "shlA",   { Eb, CL }, 0 },
3356     { "sarA",   { Eb, CL }, 0 },
3357   },
3358   /* REG_D3 */
3359   {
3360     { "rolQ",   { Ev, CL }, 0 },
3361     { "rorQ",   { Ev, CL }, 0 },
3362     { "rclQ",   { Ev, CL }, 0 },
3363     { "rcrQ",   { Ev, CL }, 0 },
3364     { "shlQ",   { Ev, CL }, 0 },
3365     { "shrQ",   { Ev, CL }, 0 },
3366     { "shlQ",   { Ev, CL }, 0 },
3367     { "sarQ",   { Ev, CL }, 0 },
3368   },
3369   /* REG_F6 */
3370   {
3371     { "testA",  { Eb, Ib }, 0 },
3372     { "testA",  { Eb, Ib }, 0 },
3373     { "notA",   { Ebh1 }, 0 },
3374     { "negA",   { Ebh1 }, 0 },
3375     { "mulA",   { Eb }, 0 },    /* Don't print the implicit %al register,  */
3376     { "imulA",  { Eb }, 0 },    /* to distinguish these opcodes from other */
3377     { "divA",   { Eb }, 0 },    /* mul/imul opcodes.  Do the same for div  */
3378     { "idivA",  { Eb }, 0 },    /* and idiv for consistency.               */
3379   },
3380   /* REG_F7 */
3381   {
3382     { "testQ",  { Ev, Iv }, 0 },
3383     { "testQ",  { Ev, Iv }, 0 },
3384     { "notQ",   { Evh1 }, 0 },
3385     { "negQ",   { Evh1 }, 0 },
3386     { "mulQ",   { Ev }, 0 },    /* Don't print the implicit register.  */
3387     { "imulQ",  { Ev }, 0 },
3388     { "divQ",   { Ev }, 0 },
3389     { "idivQ",  { Ev }, 0 },
3390   },
3391   /* REG_FE */
3392   {
3393     { "incA",   { Ebh1 }, 0 },
3394     { "decA",   { Ebh1 }, 0 },
3395   },
3396   /* REG_FF */
3397   {
3398     { "incQ",   { Evh1 }, 0 },
3399     { "decQ",   { Evh1 }, 0 },
3400     { "call{&|}", { NOTRACK, indirEv, BND }, 0 },
3401     { MOD_TABLE (MOD_FF_REG_3) },
3402     { "jmp{&|}", { NOTRACK, indirEv, BND }, 0 },
3403     { MOD_TABLE (MOD_FF_REG_5) },
3404     { "pushU",  { stackEv }, 0 },
3405     { Bad_Opcode },
3406   },
3407   /* REG_0F00 */
3408   {
3409     { "sldtD",  { Sv }, 0 },
3410     { "strD",   { Sv }, 0 },
3411     { "lldt",   { Ew }, 0 },
3412     { "ltr",    { Ew }, 0 },
3413     { "verr",   { Ew }, 0 },
3414     { "verw",   { Ew }, 0 },
3415     { Bad_Opcode },
3416     { Bad_Opcode },
3417   },
3418   /* REG_0F01 */
3419   {
3420     { MOD_TABLE (MOD_0F01_REG_0) },
3421     { MOD_TABLE (MOD_0F01_REG_1) },
3422     { MOD_TABLE (MOD_0F01_REG_2) },
3423     { MOD_TABLE (MOD_0F01_REG_3) },
3424     { "smswD",  { Sv }, 0 },
3425     { MOD_TABLE (MOD_0F01_REG_5) },
3426     { "lmsw",   { Ew }, 0 },
3427     { MOD_TABLE (MOD_0F01_REG_7) },
3428   },
3429   /* REG_0F0D */
3430   {
3431     { "prefetch",       { Mb }, 0 },
3432     { "prefetchw",      { Mb }, 0 },
3433     { "prefetchwt1",    { Mb }, 0 },
3434     { "prefetch",       { Mb }, 0 },
3435     { "prefetch",       { Mb }, 0 },
3436     { "prefetch",       { Mb }, 0 },
3437     { "prefetch",       { Mb }, 0 },
3438     { "prefetch",       { Mb }, 0 },
3439   },
3440   /* REG_0F18 */
3441   {
3442     { MOD_TABLE (MOD_0F18_REG_0) },
3443     { MOD_TABLE (MOD_0F18_REG_1) },
3444     { MOD_TABLE (MOD_0F18_REG_2) },
3445     { MOD_TABLE (MOD_0F18_REG_3) },
3446     { MOD_TABLE (MOD_0F18_REG_4) },
3447     { MOD_TABLE (MOD_0F18_REG_5) },
3448     { MOD_TABLE (MOD_0F18_REG_6) },
3449     { MOD_TABLE (MOD_0F18_REG_7) },
3450   },
3451   /* REG_0F1C_MOD_0 */
3452   {
3453     { "cldemote",       { Mb }, 0 },
3454     { "nopQ",           { Ev }, 0 },
3455     { "nopQ",           { Ev }, 0 },
3456     { "nopQ",           { Ev }, 0 },
3457     { "nopQ",           { Ev }, 0 },
3458     { "nopQ",           { Ev }, 0 },
3459     { "nopQ",           { Ev }, 0 },
3460     { "nopQ",           { Ev }, 0 },
3461   },
3462   /* REG_0F1E_MOD_3 */
3463   {
3464     { "nopQ",           { Ev }, 0 },
3465     { "rdsspK",         { Rdq }, PREFIX_OPCODE },
3466     { "nopQ",           { Ev }, 0 },
3467     { "nopQ",           { Ev }, 0 },
3468     { "nopQ",           { Ev }, 0 },
3469     { "nopQ",           { Ev }, 0 },
3470     { "nopQ",           { Ev }, 0 },
3471     { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
3472   },
3473   /* REG_0F71 */
3474   {
3475     { Bad_Opcode },
3476     { Bad_Opcode },
3477     { MOD_TABLE (MOD_0F71_REG_2) },
3478     { Bad_Opcode },
3479     { MOD_TABLE (MOD_0F71_REG_4) },
3480     { Bad_Opcode },
3481     { MOD_TABLE (MOD_0F71_REG_6) },
3482   },
3483   /* REG_0F72 */
3484   {
3485     { Bad_Opcode },
3486     { Bad_Opcode },
3487     { MOD_TABLE (MOD_0F72_REG_2) },
3488     { Bad_Opcode },
3489     { MOD_TABLE (MOD_0F72_REG_4) },
3490     { Bad_Opcode },
3491     { MOD_TABLE (MOD_0F72_REG_6) },
3492   },
3493   /* REG_0F73 */
3494   {
3495     { Bad_Opcode },
3496     { Bad_Opcode },
3497     { MOD_TABLE (MOD_0F73_REG_2) },
3498     { MOD_TABLE (MOD_0F73_REG_3) },
3499     { Bad_Opcode },
3500     { Bad_Opcode },
3501     { MOD_TABLE (MOD_0F73_REG_6) },
3502     { MOD_TABLE (MOD_0F73_REG_7) },
3503   },
3504   /* REG_0FA6 */
3505   {
3506     { "montmul",        { { OP_0f07, 0 } }, 0 },
3507     { "xsha1",          { { OP_0f07, 0 } }, 0 },
3508     { "xsha256",        { { OP_0f07, 0 } }, 0 },
3509   },
3510   /* REG_0FA7 */
3511   {
3512     { "xstore-rng",     { { OP_0f07, 0 } }, 0 },
3513     { "xcrypt-ecb",     { { OP_0f07, 0 } }, 0 },
3514     { "xcrypt-cbc",     { { OP_0f07, 0 } }, 0 },
3515     { "xcrypt-ctr",     { { OP_0f07, 0 } }, 0 },
3516     { "xcrypt-cfb",     { { OP_0f07, 0 } }, 0 },
3517     { "xcrypt-ofb",     { { OP_0f07, 0 } }, 0 },
3518   },
3519   /* REG_0FAE */
3520   {
3521     { MOD_TABLE (MOD_0FAE_REG_0) },
3522     { MOD_TABLE (MOD_0FAE_REG_1) },
3523     { MOD_TABLE (MOD_0FAE_REG_2) },
3524     { MOD_TABLE (MOD_0FAE_REG_3) },
3525     { MOD_TABLE (MOD_0FAE_REG_4) },
3526     { MOD_TABLE (MOD_0FAE_REG_5) },
3527     { MOD_TABLE (MOD_0FAE_REG_6) },
3528     { MOD_TABLE (MOD_0FAE_REG_7) },
3529   },
3530   /* REG_0FBA */
3531   {
3532     { Bad_Opcode },
3533     { Bad_Opcode },
3534     { Bad_Opcode },
3535     { Bad_Opcode },
3536     { "btQ",    { Ev, Ib }, 0 },
3537     { "btsQ",   { Evh1, Ib }, 0 },
3538     { "btrQ",   { Evh1, Ib }, 0 },
3539     { "btcQ",   { Evh1, Ib }, 0 },
3540   },
3541   /* REG_0FC7 */
3542   {
3543     { Bad_Opcode },
3544     { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
3545     { Bad_Opcode },
3546     { MOD_TABLE (MOD_0FC7_REG_3) },
3547     { MOD_TABLE (MOD_0FC7_REG_4) },
3548     { MOD_TABLE (MOD_0FC7_REG_5) },
3549     { MOD_TABLE (MOD_0FC7_REG_6) },
3550     { MOD_TABLE (MOD_0FC7_REG_7) },
3551   },
3552   /* REG_VEX_0F71 */
3553   {
3554     { Bad_Opcode },
3555     { Bad_Opcode },
3556     { MOD_TABLE (MOD_VEX_0F71_REG_2) },
3557     { Bad_Opcode },
3558     { MOD_TABLE (MOD_VEX_0F71_REG_4) },
3559     { Bad_Opcode },
3560     { MOD_TABLE (MOD_VEX_0F71_REG_6) },
3561   },
3562   /* REG_VEX_0F72 */
3563   {
3564     { Bad_Opcode },
3565     { Bad_Opcode },
3566     { MOD_TABLE (MOD_VEX_0F72_REG_2) },
3567     { Bad_Opcode },
3568     { MOD_TABLE (MOD_VEX_0F72_REG_4) },
3569     { Bad_Opcode },
3570     { MOD_TABLE (MOD_VEX_0F72_REG_6) },
3571   },
3572   /* REG_VEX_0F73 */
3573   {
3574     { Bad_Opcode },
3575     { Bad_Opcode },
3576     { MOD_TABLE (MOD_VEX_0F73_REG_2) },
3577     { MOD_TABLE (MOD_VEX_0F73_REG_3) },
3578     { Bad_Opcode },
3579     { Bad_Opcode },
3580     { MOD_TABLE (MOD_VEX_0F73_REG_6) },
3581     { MOD_TABLE (MOD_VEX_0F73_REG_7) },
3582   },
3583   /* REG_VEX_0FAE */
3584   {
3585     { Bad_Opcode },
3586     { Bad_Opcode },
3587     { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
3588     { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
3589   },
3590   /* REG_VEX_0F38F3 */
3591   {
3592     { Bad_Opcode },
3593     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_1) },
3594     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_2) },
3595     { PREFIX_TABLE (PREFIX_VEX_0F38F3_REG_3) },
3596   },
3597   /* REG_XOP_LWPCB */
3598   {
3599     { "llwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3600     { "slwpcb", { { OP_LWPCB_E, 0 } }, 0 },
3601   },
3602   /* REG_XOP_LWP */
3603   {
3604     { "lwpins", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3605     { "lwpval", { { OP_LWP_E, 0 }, Ed, Iq }, 0 },
3606   },
3607   /* REG_XOP_TBM_01 */
3608   {
3609     { Bad_Opcode },
3610     { "blcfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3611     { "blsfill",        { { OP_LWP_E, 0 }, Ev }, 0 },
3612     { "blcs",   { { OP_LWP_E, 0 }, Ev }, 0 },
3613     { "tzmsk",  { { OP_LWP_E, 0 }, Ev }, 0 },
3614     { "blcic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3615     { "blsic",  { { OP_LWP_E, 0 }, Ev }, 0 },
3616     { "t1mskc", { { OP_LWP_E, 0 }, Ev }, 0 },
3617   },
3618   /* REG_XOP_TBM_02 */
3619   {
3620     { Bad_Opcode },
3621     { "blcmsk", { { OP_LWP_E, 0 }, Ev }, 0 },
3622     { Bad_Opcode },
3623     { Bad_Opcode },
3624     { Bad_Opcode },
3625     { Bad_Opcode },
3626     { "blci",   { { OP_LWP_E, 0 }, Ev }, 0 },
3627   },
3628 #define NEED_REG_TABLE
3629 #include "i386-dis-evex.h"
3630 #undef NEED_REG_TABLE
3631 };
3632
3633 static const struct dis386 prefix_table[][4] = {
3634   /* PREFIX_90 */
3635   {
3636     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3637     { "pause", { XX }, 0 },
3638     { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
3639     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3640   },
3641
3642   /* PREFIX_MOD_0_0F01_REG_5 */
3643   {
3644     { Bad_Opcode },
3645     { "rstorssp",       { Mq }, PREFIX_OPCODE },
3646   },
3647
3648   /* PREFIX_MOD_3_0F01_REG_5_RM_0 */
3649   {
3650     { Bad_Opcode },
3651     { "setssbsy",       { Skip_MODRM }, PREFIX_OPCODE },
3652   },
3653
3654   /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
3655   {
3656     { Bad_Opcode },
3657     { "saveprevssp",    { Skip_MODRM }, PREFIX_OPCODE },
3658   },
3659
3660   /* PREFIX_0F09 */
3661   {
3662     { "wbinvd",   { XX }, 0 },
3663     { "wbnoinvd", { XX }, 0 },
3664   },
3665
3666   /* PREFIX_0F10 */
3667   {
3668     { "movups", { XM, EXx }, PREFIX_OPCODE },
3669     { "movss",  { XM, EXd }, PREFIX_OPCODE },
3670     { "movupd", { XM, EXx }, PREFIX_OPCODE },
3671     { "movsd",  { XM, EXq }, PREFIX_OPCODE },
3672   },
3673
3674   /* PREFIX_0F11 */
3675   {
3676     { "movups", { EXxS, XM }, PREFIX_OPCODE },
3677     { "movss",  { EXdS, XM }, PREFIX_OPCODE },
3678     { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3679     { "movsd",  { EXqS, XM }, PREFIX_OPCODE },
3680   },
3681
3682   /* PREFIX_0F12 */
3683   {
3684     { MOD_TABLE (MOD_0F12_PREFIX_0) },
3685     { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3686     { "movlpd", { XM, EXq }, PREFIX_OPCODE },
3687     { "movddup", { XM, EXq }, PREFIX_OPCODE },
3688   },
3689
3690   /* PREFIX_0F16 */
3691   {
3692     { MOD_TABLE (MOD_0F16_PREFIX_0) },
3693     { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3694     { "movhpd", { XM, EXq }, PREFIX_OPCODE },
3695   },
3696
3697   /* PREFIX_0F1A */
3698   {
3699     { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3700     { "bndcl",  { Gbnd, Ev_bnd }, 0 },
3701     { "bndmov", { Gbnd, Ebnd }, 0 },
3702     { "bndcu",  { Gbnd, Ev_bnd }, 0 },
3703   },
3704
3705   /* PREFIX_0F1B */
3706   {
3707     { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3708     { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3709     { "bndmov", { EbndS, Gbnd }, 0 },
3710     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
3711   },
3712
3713   /* PREFIX_0F1C */
3714   {
3715     { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3716     { "nopQ",   { Ev }, PREFIX_OPCODE },
3717     { "nopQ",   { Ev }, PREFIX_OPCODE },
3718     { "nopQ",   { Ev }, PREFIX_OPCODE },
3719   },
3720
3721   /* PREFIX_0F1E */
3722   {
3723     { "nopQ",   { Ev }, PREFIX_OPCODE },
3724     { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3725     { "nopQ",   { Ev }, PREFIX_OPCODE },
3726     { "nopQ",   { Ev }, PREFIX_OPCODE },
3727   },
3728
3729   /* PREFIX_0F2A */
3730   {
3731     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3732     { "cvtsi2ss%LQ", { XM, Ev }, PREFIX_OPCODE },
3733     { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3734     { "cvtsi2sd%LQ", { XM, Ev }, 0 },
3735   },
3736
3737   /* PREFIX_0F2B */
3738   {
3739     { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3740     { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3741     { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3742     { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3743   },
3744
3745   /* PREFIX_0F2C */
3746   {
3747     { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3748     { "cvttss2si", { Gv, EXd }, PREFIX_OPCODE },
3749     { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3750     { "cvttsd2si", { Gv, EXq }, PREFIX_OPCODE },
3751   },
3752
3753   /* PREFIX_0F2D */
3754   {
3755     { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3756     { "cvtss2si", { Gv, EXd }, PREFIX_OPCODE },
3757     { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3758     { "cvtsd2si", { Gv, EXq }, PREFIX_OPCODE },
3759   },
3760
3761   /* PREFIX_0F2E */
3762   {
3763     { "ucomiss",{ XM, EXd }, 0 },
3764     { Bad_Opcode },
3765     { "ucomisd",{ XM, EXq }, 0 },
3766   },
3767
3768   /* PREFIX_0F2F */
3769   {
3770     { "comiss", { XM, EXd }, 0 },
3771     { Bad_Opcode },
3772     { "comisd", { XM, EXq }, 0 },
3773   },
3774
3775   /* PREFIX_0F51 */
3776   {
3777     { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3778     { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3779     { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3780     { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3781   },
3782
3783   /* PREFIX_0F52 */
3784   {
3785     { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3786     { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3787   },
3788
3789   /* PREFIX_0F53 */
3790   {
3791     { "rcpps",  { XM, EXx }, PREFIX_OPCODE },
3792     { "rcpss",  { XM, EXd }, PREFIX_OPCODE },
3793   },
3794
3795   /* PREFIX_0F58 */
3796   {
3797     { "addps", { XM, EXx }, PREFIX_OPCODE },
3798     { "addss", { XM, EXd }, PREFIX_OPCODE },
3799     { "addpd", { XM, EXx }, PREFIX_OPCODE },
3800     { "addsd", { XM, EXq }, PREFIX_OPCODE },
3801   },
3802
3803   /* PREFIX_0F59 */
3804   {
3805     { "mulps",  { XM, EXx }, PREFIX_OPCODE },
3806     { "mulss",  { XM, EXd }, PREFIX_OPCODE },
3807     { "mulpd",  { XM, EXx }, PREFIX_OPCODE },
3808     { "mulsd",  { XM, EXq }, PREFIX_OPCODE },
3809   },
3810
3811   /* PREFIX_0F5A */
3812   {
3813     { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3814     { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3815     { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3816     { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3817   },
3818
3819   /* PREFIX_0F5B */
3820   {
3821     { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3822     { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3823     { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3824   },
3825
3826   /* PREFIX_0F5C */
3827   {
3828     { "subps",  { XM, EXx }, PREFIX_OPCODE },
3829     { "subss",  { XM, EXd }, PREFIX_OPCODE },
3830     { "subpd",  { XM, EXx }, PREFIX_OPCODE },
3831     { "subsd",  { XM, EXq }, PREFIX_OPCODE },
3832   },
3833
3834   /* PREFIX_0F5D */
3835   {
3836     { "minps",  { XM, EXx }, PREFIX_OPCODE },
3837     { "minss",  { XM, EXd }, PREFIX_OPCODE },
3838     { "minpd",  { XM, EXx }, PREFIX_OPCODE },
3839     { "minsd",  { XM, EXq }, PREFIX_OPCODE },
3840   },
3841
3842   /* PREFIX_0F5E */
3843   {
3844     { "divps",  { XM, EXx }, PREFIX_OPCODE },
3845     { "divss",  { XM, EXd }, PREFIX_OPCODE },
3846     { "divpd",  { XM, EXx }, PREFIX_OPCODE },
3847     { "divsd",  { XM, EXq }, PREFIX_OPCODE },
3848   },
3849
3850   /* PREFIX_0F5F */
3851   {
3852     { "maxps",  { XM, EXx }, PREFIX_OPCODE },
3853     { "maxss",  { XM, EXd }, PREFIX_OPCODE },
3854     { "maxpd",  { XM, EXx }, PREFIX_OPCODE },
3855     { "maxsd",  { XM, EXq }, PREFIX_OPCODE },
3856   },
3857
3858   /* PREFIX_0F60 */
3859   {
3860     { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3861     { Bad_Opcode },
3862     { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3863   },
3864
3865   /* PREFIX_0F61 */
3866   {
3867     { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3868     { Bad_Opcode },
3869     { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3870   },
3871
3872   /* PREFIX_0F62 */
3873   {
3874     { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3875     { Bad_Opcode },
3876     { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3877   },
3878
3879   /* PREFIX_0F6C */
3880   {
3881     { Bad_Opcode },
3882     { Bad_Opcode },
3883     { "punpcklqdq", { XM, EXx }, PREFIX_OPCODE },
3884   },
3885
3886   /* PREFIX_0F6D */
3887   {
3888     { Bad_Opcode },
3889     { Bad_Opcode },
3890     { "punpckhqdq", { XM, EXx }, PREFIX_OPCODE },
3891   },
3892
3893   /* PREFIX_0F6F */
3894   {
3895     { "movq",   { MX, EM }, PREFIX_OPCODE },
3896     { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3897     { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3898   },
3899
3900   /* PREFIX_0F70 */
3901   {
3902     { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3903     { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3904     { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3905     { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3906   },
3907
3908   /* PREFIX_0F73_REG_3 */
3909   {
3910     { Bad_Opcode },
3911     { Bad_Opcode },
3912     { "psrldq", { XS, Ib }, 0 },
3913   },
3914
3915   /* PREFIX_0F73_REG_7 */
3916   {
3917     { Bad_Opcode },
3918     { Bad_Opcode },
3919     { "pslldq", { XS, Ib }, 0 },
3920   },
3921
3922   /* PREFIX_0F78 */
3923   {
3924     {"vmread",  { Em, Gm }, 0 },
3925     { Bad_Opcode },
3926     {"extrq",   { XS, Ib, Ib }, 0 },
3927     {"insertq", { XM, XS, Ib, Ib }, 0 },
3928   },
3929
3930   /* PREFIX_0F79 */
3931   {
3932     {"vmwrite", { Gm, Em }, 0 },
3933     { Bad_Opcode },
3934     {"extrq",   { XM, XS }, 0 },
3935     {"insertq", { XM, XS }, 0 },
3936   },
3937
3938   /* PREFIX_0F7C */
3939   {
3940     { Bad_Opcode },
3941     { Bad_Opcode },
3942     { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3943     { "haddps", { XM, EXx }, PREFIX_OPCODE },
3944   },
3945
3946   /* PREFIX_0F7D */
3947   {
3948     { Bad_Opcode },
3949     { Bad_Opcode },
3950     { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3951     { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3952   },
3953
3954   /* PREFIX_0F7E */
3955   {
3956     { "movK",   { Edq, MX }, PREFIX_OPCODE },
3957     { "movq",   { XM, EXq }, PREFIX_OPCODE },
3958     { "movK",   { Edq, XM }, PREFIX_OPCODE },
3959   },
3960
3961   /* PREFIX_0F7F */
3962   {
3963     { "movq",   { EMS, MX }, PREFIX_OPCODE },
3964     { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3965     { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3966   },
3967
3968   /* PREFIX_0FAE_REG_0 */
3969   {
3970     { Bad_Opcode },
3971     { "rdfsbase", { Ev }, 0 },
3972   },
3973
3974   /* PREFIX_0FAE_REG_1 */
3975   {
3976     { Bad_Opcode },
3977     { "rdgsbase", { Ev }, 0 },
3978   },
3979
3980   /* PREFIX_0FAE_REG_2 */
3981   {
3982     { Bad_Opcode },
3983     { "wrfsbase", { Ev }, 0 },
3984   },
3985
3986   /* PREFIX_0FAE_REG_3 */
3987   {
3988     { Bad_Opcode },
3989     { "wrgsbase", { Ev }, 0 },
3990   },
3991
3992   /* PREFIX_MOD_0_0FAE_REG_4 */
3993   {
3994     { "xsave",  { FXSAVE }, 0 },
3995     { "ptwrite%LQ", { Edq }, 0 },
3996   },
3997
3998   /* PREFIX_MOD_3_0FAE_REG_4 */
3999   {
4000     { Bad_Opcode },
4001     { "ptwrite%LQ", { Edq }, 0 },
4002   },
4003
4004   /* PREFIX_MOD_0_0FAE_REG_5 */
4005   {
4006     { "xrstor",         { FXSAVE }, PREFIX_OPCODE },
4007   },
4008
4009   /* PREFIX_MOD_3_0FAE_REG_5 */
4010   {
4011     { "lfence",         { Skip_MODRM }, 0 },
4012     { "incsspK",        { Rdq }, PREFIX_OPCODE },
4013   },
4014
4015   /* PREFIX_MOD_0_0FAE_REG_6 */
4016   {
4017     { "xsaveopt",       { FXSAVE }, PREFIX_OPCODE },
4018     { "clrssbsy",       { Mq }, PREFIX_OPCODE },
4019     { "clwb",   { Mb }, PREFIX_OPCODE },
4020   },
4021
4022   /* PREFIX_MOD_1_0FAE_REG_6 */
4023   {
4024     { RM_TABLE (RM_0FAE_REG_6) },
4025     { "umonitor",       { Eva }, PREFIX_OPCODE },
4026     { "tpause", { Edq }, PREFIX_OPCODE },
4027     { "umwait", { Edq }, PREFIX_OPCODE },
4028   },
4029
4030   /* PREFIX_0FAE_REG_7 */
4031   {
4032     { "clflush",        { Mb }, 0 },
4033     { Bad_Opcode },
4034     { "clflushopt",     { Mb }, 0 },
4035   },
4036
4037   /* PREFIX_0FB8 */
4038   {
4039     { Bad_Opcode },
4040     { "popcntS", { Gv, Ev }, 0 },
4041   },
4042
4043   /* PREFIX_0FBC */
4044   {
4045     { "bsfS",   { Gv, Ev }, 0 },
4046     { "tzcntS", { Gv, Ev }, 0 },
4047     { "bsfS",   { Gv, Ev }, 0 },
4048   },
4049
4050   /* PREFIX_0FBD */
4051   {
4052     { "bsrS",   { Gv, Ev }, 0 },
4053     { "lzcntS", { Gv, Ev }, 0 },
4054     { "bsrS",   { Gv, Ev }, 0 },
4055   },
4056
4057   /* PREFIX_0FC2 */
4058   {
4059     { "cmpps",  { XM, EXx, CMP }, PREFIX_OPCODE },
4060     { "cmpss",  { XM, EXd, CMP }, PREFIX_OPCODE },
4061     { "cmppd",  { XM, EXx, CMP }, PREFIX_OPCODE },
4062     { "cmpsd",  { XM, EXq, CMP }, PREFIX_OPCODE },
4063   },
4064
4065   /* PREFIX_MOD_0_0FC3 */
4066   {
4067     { "movntiS", { Ev, Gv }, PREFIX_OPCODE },
4068   },
4069
4070   /* PREFIX_MOD_0_0FC7_REG_6 */
4071   {
4072     { "vmptrld",{ Mq }, 0 },
4073     { "vmxon",  { Mq }, 0 },
4074     { "vmclear",{ Mq }, 0 },
4075   },
4076
4077   /* PREFIX_MOD_3_0FC7_REG_6 */
4078   {
4079     { "rdrand", { Ev }, 0 },
4080     { Bad_Opcode },
4081     { "rdrand", { Ev }, 0 }
4082   },
4083
4084   /* PREFIX_MOD_3_0FC7_REG_7 */
4085   {
4086     { "rdseed", { Ev }, 0 },
4087     { "rdpid",  { Em }, 0 },
4088     { "rdseed", { Ev }, 0 },
4089   },
4090
4091   /* PREFIX_0FD0 */
4092   {
4093     { Bad_Opcode },
4094     { Bad_Opcode },
4095     { "addsubpd", { XM, EXx }, 0 },
4096     { "addsubps", { XM, EXx }, 0 },
4097   },
4098
4099   /* PREFIX_0FD6 */
4100   {
4101     { Bad_Opcode },
4102     { "movq2dq",{ XM, MS }, 0 },
4103     { "movq",   { EXqS, XM }, 0 },
4104     { "movdq2q",{ MX, XS }, 0 },
4105   },
4106
4107   /* PREFIX_0FE6 */
4108   {
4109     { Bad_Opcode },
4110     { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
4111     { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
4112     { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
4113   },
4114
4115   /* PREFIX_0FE7 */
4116   {
4117     { "movntq", { Mq, MX }, PREFIX_OPCODE },
4118     { Bad_Opcode },
4119     { MOD_TABLE (MOD_0FE7_PREFIX_2) },
4120   },
4121
4122   /* PREFIX_0FF0 */
4123   {
4124     { Bad_Opcode },
4125     { Bad_Opcode },
4126     { Bad_Opcode },
4127     { MOD_TABLE (MOD_0FF0_PREFIX_3) },
4128   },
4129
4130   /* PREFIX_0FF7 */
4131   {
4132     { "maskmovq", { MX, MS }, PREFIX_OPCODE },
4133     { Bad_Opcode },
4134     { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
4135   },
4136
4137   /* PREFIX_0F3810 */
4138   {
4139     { Bad_Opcode },
4140     { Bad_Opcode },
4141     { "pblendvb", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4142   },
4143
4144   /* PREFIX_0F3814 */
4145   {
4146     { Bad_Opcode },
4147     { Bad_Opcode },
4148     { "blendvps", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4149   },
4150
4151   /* PREFIX_0F3815 */
4152   {
4153     { Bad_Opcode },
4154     { Bad_Opcode },
4155     { "blendvpd", { XM, EXx, XMM0 }, PREFIX_OPCODE },
4156   },
4157
4158   /* PREFIX_0F3817 */
4159   {
4160     { Bad_Opcode },
4161     { Bad_Opcode },
4162     { "ptest",  { XM, EXx }, PREFIX_OPCODE },
4163   },
4164
4165   /* PREFIX_0F3820 */
4166   {
4167     { Bad_Opcode },
4168     { Bad_Opcode },
4169     { "pmovsxbw", { XM, EXq }, PREFIX_OPCODE },
4170   },
4171
4172   /* PREFIX_0F3821 */
4173   {
4174     { Bad_Opcode },
4175     { Bad_Opcode },
4176     { "pmovsxbd", { XM, EXd }, PREFIX_OPCODE },
4177   },
4178
4179   /* PREFIX_0F3822 */
4180   {
4181     { Bad_Opcode },
4182     { Bad_Opcode },
4183     { "pmovsxbq", { XM, EXw }, PREFIX_OPCODE },
4184   },
4185
4186   /* PREFIX_0F3823 */
4187   {
4188     { Bad_Opcode },
4189     { Bad_Opcode },
4190     { "pmovsxwd", { XM, EXq }, PREFIX_OPCODE },
4191   },
4192
4193   /* PREFIX_0F3824 */
4194   {
4195     { Bad_Opcode },
4196     { Bad_Opcode },
4197     { "pmovsxwq", { XM, EXd }, PREFIX_OPCODE },
4198   },
4199
4200   /* PREFIX_0F3825 */
4201   {
4202     { Bad_Opcode },
4203     { Bad_Opcode },
4204     { "pmovsxdq", { XM, EXq }, PREFIX_OPCODE },
4205   },
4206
4207   /* PREFIX_0F3828 */
4208   {
4209     { Bad_Opcode },
4210     { Bad_Opcode },
4211     { "pmuldq", { XM, EXx }, PREFIX_OPCODE },
4212   },
4213
4214   /* PREFIX_0F3829 */
4215   {
4216     { Bad_Opcode },
4217     { Bad_Opcode },
4218     { "pcmpeqq", { XM, EXx }, PREFIX_OPCODE },
4219   },
4220
4221   /* PREFIX_0F382A */
4222   {
4223     { Bad_Opcode },
4224     { Bad_Opcode },
4225     { MOD_TABLE (MOD_0F382A_PREFIX_2) },
4226   },
4227
4228   /* PREFIX_0F382B */
4229   {
4230     { Bad_Opcode },
4231     { Bad_Opcode },
4232     { "packusdw", { XM, EXx }, PREFIX_OPCODE },
4233   },
4234
4235   /* PREFIX_0F3830 */
4236   {
4237     { Bad_Opcode },
4238     { Bad_Opcode },
4239     { "pmovzxbw", { XM, EXq }, PREFIX_OPCODE },
4240   },
4241
4242   /* PREFIX_0F3831 */
4243   {
4244     { Bad_Opcode },
4245     { Bad_Opcode },
4246     { "pmovzxbd", { XM, EXd }, PREFIX_OPCODE },
4247   },
4248
4249   /* PREFIX_0F3832 */
4250   {
4251     { Bad_Opcode },
4252     { Bad_Opcode },
4253     { "pmovzxbq", { XM, EXw }, PREFIX_OPCODE },
4254   },
4255
4256   /* PREFIX_0F3833 */
4257   {
4258     { Bad_Opcode },
4259     { Bad_Opcode },
4260     { "pmovzxwd", { XM, EXq }, PREFIX_OPCODE },
4261   },
4262
4263   /* PREFIX_0F3834 */
4264   {
4265     { Bad_Opcode },
4266     { Bad_Opcode },
4267     { "pmovzxwq", { XM, EXd }, PREFIX_OPCODE },
4268   },
4269
4270   /* PREFIX_0F3835 */
4271   {
4272     { Bad_Opcode },
4273     { Bad_Opcode },
4274     { "pmovzxdq", { XM, EXq }, PREFIX_OPCODE },
4275   },
4276
4277   /* PREFIX_0F3837 */
4278   {
4279     { Bad_Opcode },
4280     { Bad_Opcode },
4281     { "pcmpgtq", { XM, EXx }, PREFIX_OPCODE },
4282   },
4283
4284   /* PREFIX_0F3838 */
4285   {
4286     { Bad_Opcode },
4287     { Bad_Opcode },
4288     { "pminsb", { XM, EXx }, PREFIX_OPCODE },
4289   },
4290
4291   /* PREFIX_0F3839 */
4292   {
4293     { Bad_Opcode },
4294     { Bad_Opcode },
4295     { "pminsd", { XM, EXx }, PREFIX_OPCODE },
4296   },
4297
4298   /* PREFIX_0F383A */
4299   {
4300     { Bad_Opcode },
4301     { Bad_Opcode },
4302     { "pminuw", { XM, EXx }, PREFIX_OPCODE },
4303   },
4304
4305   /* PREFIX_0F383B */
4306   {
4307     { Bad_Opcode },
4308     { Bad_Opcode },
4309     { "pminud", { XM, EXx }, PREFIX_OPCODE },
4310   },
4311
4312   /* PREFIX_0F383C */
4313   {
4314     { Bad_Opcode },
4315     { Bad_Opcode },
4316     { "pmaxsb", { XM, EXx }, PREFIX_OPCODE },
4317   },
4318
4319   /* PREFIX_0F383D */
4320   {
4321     { Bad_Opcode },
4322     { Bad_Opcode },
4323     { "pmaxsd", { XM, EXx }, PREFIX_OPCODE },
4324   },
4325
4326   /* PREFIX_0F383E */
4327   {
4328     { Bad_Opcode },
4329     { Bad_Opcode },
4330     { "pmaxuw", { XM, EXx }, PREFIX_OPCODE },
4331   },
4332
4333   /* PREFIX_0F383F */
4334   {
4335     { Bad_Opcode },
4336     { Bad_Opcode },
4337     { "pmaxud", { XM, EXx }, PREFIX_OPCODE },
4338   },
4339
4340   /* PREFIX_0F3840 */
4341   {
4342     { Bad_Opcode },
4343     { Bad_Opcode },
4344     { "pmulld", { XM, EXx }, PREFIX_OPCODE },
4345   },
4346
4347   /* PREFIX_0F3841 */
4348   {
4349     { Bad_Opcode },
4350     { Bad_Opcode },
4351     { "phminposuw", { XM, EXx }, PREFIX_OPCODE },
4352   },
4353
4354   /* PREFIX_0F3880 */
4355   {
4356     { Bad_Opcode },
4357     { Bad_Opcode },
4358     { "invept", { Gm, Mo }, PREFIX_OPCODE },
4359   },
4360
4361   /* PREFIX_0F3881 */
4362   {
4363     { Bad_Opcode },
4364     { Bad_Opcode },
4365     { "invvpid", { Gm, Mo }, PREFIX_OPCODE },
4366   },
4367
4368   /* PREFIX_0F3882 */
4369   {
4370     { Bad_Opcode },
4371     { Bad_Opcode },
4372     { "invpcid", { Gm, M }, PREFIX_OPCODE },
4373   },
4374
4375   /* PREFIX_0F38C8 */
4376   {
4377     { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4378   },
4379
4380   /* PREFIX_0F38C9 */
4381   {
4382     { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4383   },
4384
4385   /* PREFIX_0F38CA */
4386   {
4387     { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4388   },
4389
4390   /* PREFIX_0F38CB */
4391   {
4392     { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4393   },
4394
4395   /* PREFIX_0F38CC */
4396   {
4397     { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4398   },
4399
4400   /* PREFIX_0F38CD */
4401   {
4402     { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4403   },
4404
4405   /* PREFIX_0F38CF */
4406   {
4407     { Bad_Opcode },
4408     { Bad_Opcode },
4409     { "gf2p8mulb", { XM, EXxmm }, PREFIX_OPCODE },
4410   },
4411
4412   /* PREFIX_0F38DB */
4413   {
4414     { Bad_Opcode },
4415     { Bad_Opcode },
4416     { "aesimc", { XM, EXx }, PREFIX_OPCODE },
4417   },
4418
4419   /* PREFIX_0F38DC */
4420   {
4421     { Bad_Opcode },
4422     { Bad_Opcode },
4423     { "aesenc", { XM, EXx }, PREFIX_OPCODE },
4424   },
4425
4426   /* PREFIX_0F38DD */
4427   {
4428     { Bad_Opcode },
4429     { Bad_Opcode },
4430     { "aesenclast", { XM, EXx }, PREFIX_OPCODE },
4431   },
4432
4433   /* PREFIX_0F38DE */
4434   {
4435     { Bad_Opcode },
4436     { Bad_Opcode },
4437     { "aesdec", { XM, EXx }, PREFIX_OPCODE },
4438   },
4439
4440   /* PREFIX_0F38DF */
4441   {
4442     { Bad_Opcode },
4443     { Bad_Opcode },
4444     { "aesdeclast", { XM, EXx }, PREFIX_OPCODE },
4445   },
4446
4447   /* PREFIX_0F38F0 */
4448   {
4449     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4450     { Bad_Opcode },
4451     { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE },
4452     { "crc32",  { Gdq, { CRC32_Fixup, b_mode } }, PREFIX_OPCODE },
4453   },
4454
4455   /* PREFIX_0F38F1 */
4456   {
4457     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4458     { Bad_Opcode },
4459     { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE },
4460     { "crc32",  { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
4461   },
4462
4463   /* PREFIX_0F38F5 */
4464   {
4465     { Bad_Opcode },
4466     { Bad_Opcode },
4467     { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
4468   },
4469
4470   /* PREFIX_0F38F6 */
4471   {
4472     { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
4473     { "adoxS",  { Gdq, Edq}, PREFIX_OPCODE },
4474     { "adcxS",  { Gdq, Edq}, PREFIX_OPCODE },
4475     { Bad_Opcode },
4476   },
4477
4478   /* PREFIX_0F38F8 */
4479   {
4480     { Bad_Opcode },
4481     { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
4482     { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
4483     { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
4484   },
4485
4486   /* PREFIX_0F38F9 */
4487   {
4488     { MOD_TABLE (MOD_0F38F9_PREFIX_0) },
4489   },
4490
4491   /* PREFIX_0F3A08 */
4492   {
4493     { Bad_Opcode },
4494     { Bad_Opcode },
4495     { "roundps", { XM, EXx, Ib }, PREFIX_OPCODE },
4496   },
4497
4498   /* PREFIX_0F3A09 */
4499   {
4500     { Bad_Opcode },
4501     { Bad_Opcode },
4502     { "roundpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4503   },
4504
4505   /* PREFIX_0F3A0A */
4506   {
4507     { Bad_Opcode },
4508     { Bad_Opcode },
4509     { "roundss", { XM, EXd, Ib }, PREFIX_OPCODE },
4510   },
4511
4512   /* PREFIX_0F3A0B */
4513   {
4514     { Bad_Opcode },
4515     { Bad_Opcode },
4516     { "roundsd", { XM, EXq, Ib }, PREFIX_OPCODE },
4517   },
4518
4519   /* PREFIX_0F3A0C */
4520   {
4521     { Bad_Opcode },
4522     { Bad_Opcode },
4523     { "blendps", { XM, EXx, Ib }, PREFIX_OPCODE },
4524   },
4525
4526   /* PREFIX_0F3A0D */
4527   {
4528     { Bad_Opcode },
4529     { Bad_Opcode },
4530     { "blendpd", { XM, EXx, Ib }, PREFIX_OPCODE },
4531   },
4532
4533   /* PREFIX_0F3A0E */
4534   {
4535     { Bad_Opcode },
4536     { Bad_Opcode },
4537     { "pblendw", { XM, EXx, Ib }, PREFIX_OPCODE },
4538   },
4539
4540   /* PREFIX_0F3A14 */
4541   {
4542     { Bad_Opcode },
4543     { Bad_Opcode },
4544     { "pextrb", { Edqb, XM, Ib }, PREFIX_OPCODE },
4545   },
4546
4547   /* PREFIX_0F3A15 */
4548   {
4549     { Bad_Opcode },
4550     { Bad_Opcode },
4551     { "pextrw", { Edqw, XM, Ib }, PREFIX_OPCODE },
4552   },
4553
4554   /* PREFIX_0F3A16 */
4555   {
4556     { Bad_Opcode },
4557     { Bad_Opcode },
4558     { "pextrK", { Edq, XM, Ib }, PREFIX_OPCODE },
4559   },
4560
4561   /* PREFIX_0F3A17 */
4562   {
4563     { Bad_Opcode },
4564     { Bad_Opcode },
4565     { "extractps", { Edqd, XM, Ib }, PREFIX_OPCODE },
4566   },
4567
4568   /* PREFIX_0F3A20 */
4569   {
4570     { Bad_Opcode },
4571     { Bad_Opcode },
4572     { "pinsrb", { XM, Edqb, Ib }, PREFIX_OPCODE },
4573   },
4574
4575   /* PREFIX_0F3A21 */
4576   {
4577     { Bad_Opcode },
4578     { Bad_Opcode },
4579     { "insertps", { XM, EXd, Ib }, PREFIX_OPCODE },
4580   },
4581
4582   /* PREFIX_0F3A22 */
4583   {
4584     { Bad_Opcode },
4585     { Bad_Opcode },
4586     { "pinsrK", { XM, Edq, Ib }, PREFIX_OPCODE },
4587   },
4588
4589   /* PREFIX_0F3A40 */
4590   {
4591     { Bad_Opcode },
4592     { Bad_Opcode },
4593     { "dpps",   { XM, EXx, Ib }, PREFIX_OPCODE },
4594   },
4595
4596   /* PREFIX_0F3A41 */
4597   {
4598     { Bad_Opcode },
4599     { Bad_Opcode },
4600     { "dppd",   { XM, EXx, Ib }, PREFIX_OPCODE },
4601   },
4602
4603   /* PREFIX_0F3A42 */
4604   {
4605     { Bad_Opcode },
4606     { Bad_Opcode },
4607     { "mpsadbw", { XM, EXx, Ib }, PREFIX_OPCODE },
4608   },
4609
4610   /* PREFIX_0F3A44 */
4611   {
4612     { Bad_Opcode },
4613     { Bad_Opcode },
4614     { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_OPCODE },
4615   },
4616
4617   /* PREFIX_0F3A60 */
4618   {
4619     { Bad_Opcode },
4620     { Bad_Opcode },
4621     { "pcmpestrm", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4622   },
4623
4624   /* PREFIX_0F3A61 */
4625   {
4626     { Bad_Opcode },
4627     { Bad_Opcode },
4628     { "pcmpestri", { XM, { PCMPESTR_Fixup, x_mode }, Ib }, PREFIX_OPCODE },
4629   },
4630
4631   /* PREFIX_0F3A62 */
4632   {
4633     { Bad_Opcode },
4634     { Bad_Opcode },
4635     { "pcmpistrm", { XM, EXx, Ib }, PREFIX_OPCODE },
4636   },
4637
4638   /* PREFIX_0F3A63 */
4639   {
4640     { Bad_Opcode },
4641     { Bad_Opcode },
4642     { "pcmpistri", { XM, EXx, Ib }, PREFIX_OPCODE },
4643   },
4644
4645   /* PREFIX_0F3ACC */
4646   {
4647     { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4648   },
4649
4650   /* PREFIX_0F3ACE */
4651   {
4652     { Bad_Opcode },
4653     { Bad_Opcode },
4654     { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4655   },
4656
4657   /* PREFIX_0F3ACF */
4658   {
4659     { Bad_Opcode },
4660     { Bad_Opcode },
4661     { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_OPCODE },
4662   },
4663
4664   /* PREFIX_0F3ADF */
4665   {
4666     { Bad_Opcode },
4667     { Bad_Opcode },
4668     { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_OPCODE },
4669   },
4670
4671   /* PREFIX_VEX_0F10 */
4672   {
4673     { "vmovups",        { XM, EXx }, 0 },
4674     { "vmovss",         { XMVexScalar, VexScalar, EXdScalar }, 0 },
4675     { "vmovupd",        { XM, EXx }, 0 },
4676     { "vmovsd",         { XMVexScalar, VexScalar, EXqScalar }, 0 },
4677   },
4678
4679   /* PREFIX_VEX_0F11 */
4680   {
4681     { "vmovups",        { EXxS, XM }, 0 },
4682     { "vmovss",         { EXdVexScalarS, VexScalar, XMScalar }, 0 },
4683     { "vmovupd",        { EXxS, XM }, 0 },
4684     { "vmovsd",         { EXqVexScalarS, VexScalar, XMScalar }, 0 },
4685   },
4686
4687   /* PREFIX_VEX_0F12 */
4688   {
4689     { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
4690     { "vmovsldup",      { XM, EXx }, 0 },
4691     { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
4692     { "vmovddup",       { XM, EXymmq }, 0 },
4693   },
4694
4695   /* PREFIX_VEX_0F16 */
4696   {
4697     { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
4698     { "vmovshdup",      { XM, EXx }, 0 },
4699     { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
4700   },
4701
4702   /* PREFIX_VEX_0F2A */
4703   {
4704     { Bad_Opcode },
4705     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_1) },
4706     { Bad_Opcode },
4707     { VEX_LEN_TABLE (VEX_LEN_0F2A_P_3) },
4708   },
4709
4710   /* PREFIX_VEX_0F2C */
4711   {
4712     { Bad_Opcode },
4713     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_1) },
4714     { Bad_Opcode },
4715     { VEX_LEN_TABLE (VEX_LEN_0F2C_P_3) },
4716   },
4717
4718   /* PREFIX_VEX_0F2D */
4719   {
4720     { Bad_Opcode },
4721     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_1) },
4722     { Bad_Opcode },
4723     { VEX_LEN_TABLE (VEX_LEN_0F2D_P_3) },
4724   },
4725
4726   /* PREFIX_VEX_0F2E */
4727   {
4728     { "vucomiss",       { XMScalar, EXdScalar }, 0 },
4729     { Bad_Opcode },
4730     { "vucomisd",       { XMScalar, EXqScalar }, 0 },
4731   },
4732
4733   /* PREFIX_VEX_0F2F */
4734   {
4735     { "vcomiss",        { XMScalar, EXdScalar }, 0 },
4736     { Bad_Opcode },
4737     { "vcomisd",        { XMScalar, EXqScalar }, 0 },
4738   },
4739
4740   /* PREFIX_VEX_0F41 */
4741   {
4742     { VEX_LEN_TABLE (VEX_LEN_0F41_P_0) },
4743     { Bad_Opcode },
4744     { VEX_LEN_TABLE (VEX_LEN_0F41_P_2) },
4745   },
4746
4747   /* PREFIX_VEX_0F42 */
4748   {
4749     { VEX_LEN_TABLE (VEX_LEN_0F42_P_0) },
4750     { Bad_Opcode },
4751     { VEX_LEN_TABLE (VEX_LEN_0F42_P_2) },
4752   },
4753
4754   /* PREFIX_VEX_0F44 */
4755   {
4756     { VEX_LEN_TABLE (VEX_LEN_0F44_P_0) },
4757     { Bad_Opcode },
4758     { VEX_LEN_TABLE (VEX_LEN_0F44_P_2) },
4759   },
4760
4761   /* PREFIX_VEX_0F45 */
4762   {
4763     { VEX_LEN_TABLE (VEX_LEN_0F45_P_0) },
4764     { Bad_Opcode },
4765     { VEX_LEN_TABLE (VEX_LEN_0F45_P_2) },
4766   },
4767
4768   /* PREFIX_VEX_0F46 */
4769   {
4770     { VEX_LEN_TABLE (VEX_LEN_0F46_P_0) },
4771     { Bad_Opcode },
4772     { VEX_LEN_TABLE (VEX_LEN_0F46_P_2) },
4773   },
4774
4775   /* PREFIX_VEX_0F47 */
4776   {
4777     { VEX_LEN_TABLE (VEX_LEN_0F47_P_0) },
4778     { Bad_Opcode },
4779     { VEX_LEN_TABLE (VEX_LEN_0F47_P_2) },
4780   },
4781
4782   /* PREFIX_VEX_0F4A */
4783   {
4784     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_0) },
4785     { Bad_Opcode },
4786     { VEX_LEN_TABLE (VEX_LEN_0F4A_P_2) },
4787   },
4788
4789   /* PREFIX_VEX_0F4B */
4790   {
4791     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_0) },
4792     { Bad_Opcode },
4793     { VEX_LEN_TABLE (VEX_LEN_0F4B_P_2) },
4794   },
4795
4796   /* PREFIX_VEX_0F51 */
4797   {
4798     { "vsqrtps",        { XM, EXx }, 0 },
4799     { "vsqrtss",        { XMScalar, VexScalar, EXdScalar }, 0 },
4800     { "vsqrtpd",        { XM, EXx }, 0 },
4801     { "vsqrtsd",        { XMScalar, VexScalar, EXqScalar }, 0 },
4802   },
4803
4804   /* PREFIX_VEX_0F52 */
4805   {
4806     { "vrsqrtps",       { XM, EXx }, 0 },
4807     { "vrsqrtss",       { XMScalar, VexScalar, EXdScalar }, 0 },
4808   },
4809
4810   /* PREFIX_VEX_0F53 */
4811   {
4812     { "vrcpps",         { XM, EXx }, 0 },
4813     { "vrcpss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4814   },
4815
4816   /* PREFIX_VEX_0F58 */
4817   {
4818     { "vaddps",         { XM, Vex, EXx }, 0 },
4819     { "vaddss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4820     { "vaddpd",         { XM, Vex, EXx }, 0 },
4821     { "vaddsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4822   },
4823
4824   /* PREFIX_VEX_0F59 */
4825   {
4826     { "vmulps",         { XM, Vex, EXx }, 0 },
4827     { "vmulss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4828     { "vmulpd",         { XM, Vex, EXx }, 0 },
4829     { "vmulsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4830   },
4831
4832   /* PREFIX_VEX_0F5A */
4833   {
4834     { "vcvtps2pd",      { XM, EXxmmq }, 0 },
4835     { "vcvtss2sd",      { XMScalar, VexScalar, EXdScalar }, 0 },
4836     { "vcvtpd2ps%XY",{ XMM, EXx }, 0 },
4837     { "vcvtsd2ss",      { XMScalar, VexScalar, EXqScalar }, 0 },
4838   },
4839
4840   /* PREFIX_VEX_0F5B */
4841   {
4842     { "vcvtdq2ps",      { XM, EXx }, 0 },
4843     { "vcvttps2dq",     { XM, EXx }, 0 },
4844     { "vcvtps2dq",      { XM, EXx }, 0 },
4845   },
4846
4847   /* PREFIX_VEX_0F5C */
4848   {
4849     { "vsubps",         { XM, Vex, EXx }, 0 },
4850     { "vsubss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4851     { "vsubpd",         { XM, Vex, EXx }, 0 },
4852     { "vsubsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4853   },
4854
4855   /* PREFIX_VEX_0F5D */
4856   {
4857     { "vminps",         { XM, Vex, EXx }, 0 },
4858     { "vminss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4859     { "vminpd",         { XM, Vex, EXx }, 0 },
4860     { "vminsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4861   },
4862
4863   /* PREFIX_VEX_0F5E */
4864   {
4865     { "vdivps",         { XM, Vex, EXx }, 0 },
4866     { "vdivss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4867     { "vdivpd",         { XM, Vex, EXx }, 0 },
4868     { "vdivsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4869   },
4870
4871   /* PREFIX_VEX_0F5F */
4872   {
4873     { "vmaxps",         { XM, Vex, EXx }, 0 },
4874     { "vmaxss",         { XMScalar, VexScalar, EXdScalar }, 0 },
4875     { "vmaxpd",         { XM, Vex, EXx }, 0 },
4876     { "vmaxsd",         { XMScalar, VexScalar, EXqScalar }, 0 },
4877   },
4878
4879   /* PREFIX_VEX_0F60 */
4880   {
4881     { Bad_Opcode },
4882     { Bad_Opcode },
4883     { "vpunpcklbw",     { XM, Vex, EXx }, 0 },
4884   },
4885
4886   /* PREFIX_VEX_0F61 */
4887   {
4888     { Bad_Opcode },
4889     { Bad_Opcode },
4890     { "vpunpcklwd",     { XM, Vex, EXx }, 0 },
4891   },
4892
4893   /* PREFIX_VEX_0F62 */
4894   {
4895     { Bad_Opcode },
4896     { Bad_Opcode },
4897     { "vpunpckldq",     { XM, Vex, EXx }, 0 },
4898   },
4899
4900   /* PREFIX_VEX_0F63 */
4901   {
4902     { Bad_Opcode },
4903     { Bad_Opcode },
4904     { "vpacksswb",      { XM, Vex, EXx }, 0 },
4905   },
4906
4907   /* PREFIX_VEX_0F64 */
4908   {
4909     { Bad_Opcode },
4910     { Bad_Opcode },
4911     { "vpcmpgtb",       { XM, Vex, EXx }, 0 },
4912   },
4913
4914   /* PREFIX_VEX_0F65 */
4915   {
4916     { Bad_Opcode },
4917     { Bad_Opcode },
4918     { "vpcmpgtw",       { XM, Vex, EXx }, 0 },
4919   },
4920
4921   /* PREFIX_VEX_0F66 */
4922   {
4923     { Bad_Opcode },
4924     { Bad_Opcode },
4925     { "vpcmpgtd",       { XM, Vex, EXx }, 0 },
4926   },
4927
4928   /* PREFIX_VEX_0F67 */
4929   {
4930     { Bad_Opcode },
4931     { Bad_Opcode },
4932     { "vpackuswb",      { XM, Vex, EXx }, 0 },
4933   },
4934
4935   /* PREFIX_VEX_0F68 */
4936   {
4937     { Bad_Opcode },
4938     { Bad_Opcode },
4939     { "vpunpckhbw",     { XM, Vex, EXx }, 0 },
4940   },
4941
4942   /* PREFIX_VEX_0F69 */
4943   {
4944     { Bad_Opcode },
4945     { Bad_Opcode },
4946     { "vpunpckhwd",     { XM, Vex, EXx }, 0 },
4947   },
4948
4949   /* PREFIX_VEX_0F6A */
4950   {
4951     { Bad_Opcode },
4952     { Bad_Opcode },
4953     { "vpunpckhdq",     { XM, Vex, EXx }, 0 },
4954   },
4955
4956   /* PREFIX_VEX_0F6B */
4957   {
4958     { Bad_Opcode },
4959     { Bad_Opcode },
4960     { "vpackssdw",      { XM, Vex, EXx }, 0 },
4961   },
4962
4963   /* PREFIX_VEX_0F6C */
4964   {
4965     { Bad_Opcode },
4966     { Bad_Opcode },
4967     { "vpunpcklqdq",    { XM, Vex, EXx }, 0 },
4968   },
4969
4970   /* PREFIX_VEX_0F6D */
4971   {
4972     { Bad_Opcode },
4973     { Bad_Opcode },
4974     { "vpunpckhqdq",    { XM, Vex, EXx }, 0 },
4975   },
4976
4977   /* PREFIX_VEX_0F6E */
4978   {
4979     { Bad_Opcode },
4980     { Bad_Opcode },
4981     { VEX_LEN_TABLE (VEX_LEN_0F6E_P_2) },
4982   },
4983
4984   /* PREFIX_VEX_0F6F */
4985   {
4986     { Bad_Opcode },
4987     { "vmovdqu",        { XM, EXx }, 0 },
4988     { "vmovdqa",        { XM, EXx }, 0 },
4989   },
4990
4991   /* PREFIX_VEX_0F70 */
4992   {
4993     { Bad_Opcode },
4994     { "vpshufhw",       { XM, EXx, Ib }, 0 },
4995     { "vpshufd",        { XM, EXx, Ib }, 0 },
4996     { "vpshuflw",       { XM, EXx, Ib }, 0 },
4997   },
4998
4999   /* PREFIX_VEX_0F71_REG_2 */
5000   {
5001     { Bad_Opcode },
5002     { Bad_Opcode },
5003     { "vpsrlw",         { Vex, XS, Ib }, 0 },
5004   },
5005
5006   /* PREFIX_VEX_0F71_REG_4 */
5007   {
5008     { Bad_Opcode },
5009     { Bad_Opcode },
5010     { "vpsraw",         { Vex, XS, Ib }, 0 },
5011   },
5012
5013   /* PREFIX_VEX_0F71_REG_6 */
5014   {
5015     { Bad_Opcode },
5016     { Bad_Opcode },
5017     { "vpsllw",         { Vex, XS, Ib }, 0 },
5018   },
5019
5020   /* PREFIX_VEX_0F72_REG_2 */
5021   {
5022     { Bad_Opcode },
5023     { Bad_Opcode },
5024     { "vpsrld",         { Vex, XS, Ib }, 0 },
5025   },
5026
5027   /* PREFIX_VEX_0F72_REG_4 */
5028   {
5029     { Bad_Opcode },
5030     { Bad_Opcode },
5031     { "vpsrad",         { Vex, XS, Ib }, 0 },
5032   },
5033
5034   /* PREFIX_VEX_0F72_REG_6 */
5035   {
5036     { Bad_Opcode },
5037     { Bad_Opcode },
5038     { "vpslld",         { Vex, XS, Ib }, 0 },
5039   },
5040
5041   /* PREFIX_VEX_0F73_REG_2 */
5042   {
5043     { Bad_Opcode },
5044     { Bad_Opcode },
5045     { "vpsrlq",         { Vex, XS, Ib }, 0 },
5046   },
5047
5048   /* PREFIX_VEX_0F73_REG_3 */
5049   {
5050     { Bad_Opcode },
5051     { Bad_Opcode },
5052     { "vpsrldq",        { Vex, XS, Ib }, 0 },
5053   },
5054
5055   /* PREFIX_VEX_0F73_REG_6 */
5056   {
5057     { Bad_Opcode },
5058     { Bad_Opcode },
5059     { "vpsllq",         { Vex, XS, Ib }, 0 },
5060   },
5061
5062   /* PREFIX_VEX_0F73_REG_7 */
5063   {
5064     { Bad_Opcode },
5065     { Bad_Opcode },
5066     { "vpslldq",        { Vex, XS, Ib }, 0 },
5067   },
5068
5069   /* PREFIX_VEX_0F74 */
5070   {
5071     { Bad_Opcode },
5072     { Bad_Opcode },
5073     { "vpcmpeqb",       { XM, Vex, EXx }, 0 },
5074   },
5075
5076   /* PREFIX_VEX_0F75 */
5077   {
5078     { Bad_Opcode },
5079     { Bad_Opcode },
5080     { "vpcmpeqw",       { XM, Vex, EXx }, 0 },
5081   },
5082
5083   /* PREFIX_VEX_0F76 */
5084   {
5085     { Bad_Opcode },
5086     { Bad_Opcode },
5087     { "vpcmpeqd",       { XM, Vex, EXx }, 0 },
5088   },
5089
5090   /* PREFIX_VEX_0F77 */
5091   {
5092     { VEX_LEN_TABLE (VEX_LEN_0F77_P_0) },
5093   },
5094
5095   /* PREFIX_VEX_0F7C */
5096   {
5097     { Bad_Opcode },
5098     { Bad_Opcode },
5099     { "vhaddpd",        { XM, Vex, EXx }, 0 },
5100     { "vhaddps",        { XM, Vex, EXx }, 0 },
5101   },
5102
5103   /* PREFIX_VEX_0F7D */
5104   {
5105     { Bad_Opcode },
5106     { Bad_Opcode },
5107     { "vhsubpd",        { XM, Vex, EXx }, 0 },
5108     { "vhsubps",        { XM, Vex, EXx }, 0 },
5109   },
5110
5111   /* PREFIX_VEX_0F7E */
5112   {
5113     { Bad_Opcode },
5114     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
5115     { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
5116   },
5117
5118   /* PREFIX_VEX_0F7F */
5119   {
5120     { Bad_Opcode },
5121     { "vmovdqu",        { EXxS, XM }, 0 },
5122     { "vmovdqa",        { EXxS, XM }, 0 },
5123   },
5124
5125   /* PREFIX_VEX_0F90 */
5126   {
5127     { VEX_LEN_TABLE (VEX_LEN_0F90_P_0) },
5128     { Bad_Opcode },
5129     { VEX_LEN_TABLE (VEX_LEN_0F90_P_2) },
5130   },
5131
5132   /* PREFIX_VEX_0F91 */
5133   {
5134     { VEX_LEN_TABLE (VEX_LEN_0F91_P_0) },
5135     { Bad_Opcode },
5136     { VEX_LEN_TABLE (VEX_LEN_0F91_P_2) },
5137   },
5138
5139   /* PREFIX_VEX_0F92 */
5140   {
5141     { VEX_LEN_TABLE (VEX_LEN_0F92_P_0) },
5142     { Bad_Opcode },
5143     { VEX_LEN_TABLE (VEX_LEN_0F92_P_2) },
5144     { VEX_LEN_TABLE (VEX_LEN_0F92_P_3) },
5145   },
5146
5147   /* PREFIX_VEX_0F93 */
5148   {
5149     { VEX_LEN_TABLE (VEX_LEN_0F93_P_0) },
5150     { Bad_Opcode },
5151     { VEX_LEN_TABLE (VEX_LEN_0F93_P_2) },
5152     { VEX_LEN_TABLE (VEX_LEN_0F93_P_3) },
5153   },
5154
5155   /* PREFIX_VEX_0F98 */
5156   {
5157     { VEX_LEN_TABLE (VEX_LEN_0F98_P_0) },
5158     { Bad_Opcode },
5159     { VEX_LEN_TABLE (VEX_LEN_0F98_P_2) },
5160   },
5161
5162   /* PREFIX_VEX_0F99 */
5163   {
5164     { VEX_LEN_TABLE (VEX_LEN_0F99_P_0) },
5165     { Bad_Opcode },
5166     { VEX_LEN_TABLE (VEX_LEN_0F99_P_2) },
5167   },
5168
5169   /* PREFIX_VEX_0FC2 */
5170   {
5171     { "vcmpps",         { XM, Vex, EXx, VCMP }, 0 },
5172     { "vcmpss",         { XMScalar, VexScalar, EXdScalar, VCMP }, 0 },
5173     { "vcmppd",         { XM, Vex, EXx, VCMP }, 0 },
5174     { "vcmpsd",         { XMScalar, VexScalar, EXqScalar, VCMP }, 0 },
5175   },
5176
5177   /* PREFIX_VEX_0FC4 */
5178   {
5179     { Bad_Opcode },
5180     { Bad_Opcode },
5181     { VEX_LEN_TABLE (VEX_LEN_0FC4_P_2) },
5182   },
5183
5184   /* PREFIX_VEX_0FC5 */
5185   {
5186     { Bad_Opcode },
5187     { Bad_Opcode },
5188     { VEX_LEN_TABLE (VEX_LEN_0FC5_P_2) },
5189   },
5190
5191   /* PREFIX_VEX_0FD0 */
5192   {
5193     { Bad_Opcode },
5194     { Bad_Opcode },
5195     { "vaddsubpd",      { XM, Vex, EXx }, 0 },
5196     { "vaddsubps",      { XM, Vex, EXx }, 0 },
5197   },
5198
5199   /* PREFIX_VEX_0FD1 */
5200   {
5201     { Bad_Opcode },
5202     { Bad_Opcode },
5203     { "vpsrlw",         { XM, Vex, EXxmm }, 0 },
5204   },
5205
5206   /* PREFIX_VEX_0FD2 */
5207   {
5208     { Bad_Opcode },
5209     { Bad_Opcode },
5210     { "vpsrld",         { XM, Vex, EXxmm }, 0 },
5211   },
5212
5213   /* PREFIX_VEX_0FD3 */
5214   {
5215     { Bad_Opcode },
5216     { Bad_Opcode },
5217     { "vpsrlq",         { XM, Vex, EXxmm }, 0 },
5218   },
5219
5220   /* PREFIX_VEX_0FD4 */
5221   {
5222     { Bad_Opcode },
5223     { Bad_Opcode },
5224     { "vpaddq",         { XM, Vex, EXx }, 0 },
5225   },
5226
5227   /* PREFIX_VEX_0FD5 */
5228   {
5229     { Bad_Opcode },
5230     { Bad_Opcode },
5231     { "vpmullw",        { XM, Vex, EXx }, 0 },
5232   },
5233
5234   /* PREFIX_VEX_0FD6 */
5235   {
5236     { Bad_Opcode },
5237     { Bad_Opcode },
5238     { VEX_LEN_TABLE (VEX_LEN_0FD6_P_2) },
5239   },
5240
5241   /* PREFIX_VEX_0FD7 */
5242   {
5243     { Bad_Opcode },
5244     { Bad_Opcode },
5245     { MOD_TABLE (MOD_VEX_0FD7_PREFIX_2) },
5246   },
5247
5248   /* PREFIX_VEX_0FD8 */
5249   {
5250     { Bad_Opcode },
5251     { Bad_Opcode },
5252     { "vpsubusb",       { XM, Vex, EXx }, 0 },
5253   },
5254
5255   /* PREFIX_VEX_0FD9 */
5256   {
5257     { Bad_Opcode },
5258     { Bad_Opcode },
5259     { "vpsubusw",       { XM, Vex, EXx }, 0 },
5260   },
5261
5262   /* PREFIX_VEX_0FDA */
5263   {
5264     { Bad_Opcode },
5265     { Bad_Opcode },
5266     { "vpminub",        { XM, Vex, EXx }, 0 },
5267   },
5268
5269   /* PREFIX_VEX_0FDB */
5270   {
5271     { Bad_Opcode },
5272     { Bad_Opcode },
5273     { "vpand",          { XM, Vex, EXx }, 0 },
5274   },
5275
5276   /* PREFIX_VEX_0FDC */
5277   {
5278     { Bad_Opcode },
5279     { Bad_Opcode },
5280     { "vpaddusb",       { XM, Vex, EXx }, 0 },
5281   },
5282
5283   /* PREFIX_VEX_0FDD */
5284   {
5285     { Bad_Opcode },
5286     { Bad_Opcode },
5287     { "vpaddusw",       { XM, Vex, EXx }, 0 },
5288   },
5289
5290   /* PREFIX_VEX_0FDE */
5291   {
5292     { Bad_Opcode },
5293     { Bad_Opcode },
5294     { "vpmaxub",        { XM, Vex, EXx }, 0 },
5295   },
5296
5297   /* PREFIX_VEX_0FDF */
5298   {
5299     { Bad_Opcode },
5300     { Bad_Opcode },
5301     { "vpandn",         { XM, Vex, EXx }, 0 },
5302   },
5303
5304   /* PREFIX_VEX_0FE0 */
5305   {
5306     { Bad_Opcode },
5307     { Bad_Opcode },
5308     { "vpavgb",         { XM, Vex, EXx }, 0 },
5309   },
5310
5311   /* PREFIX_VEX_0FE1 */
5312   {
5313     { Bad_Opcode },
5314     { Bad_Opcode },
5315     { "vpsraw",         { XM, Vex, EXxmm }, 0 },
5316   },
5317
5318   /* PREFIX_VEX_0FE2 */
5319   {
5320     { Bad_Opcode },
5321     { Bad_Opcode },
5322     { "vpsrad",         { XM, Vex, EXxmm }, 0 },
5323   },
5324
5325   /* PREFIX_VEX_0FE3 */
5326   {
5327     { Bad_Opcode },
5328     { Bad_Opcode },
5329     { "vpavgw",         { XM, Vex, EXx }, 0 },
5330   },
5331
5332   /* PREFIX_VEX_0FE4 */
5333   {
5334     { Bad_Opcode },
5335     { Bad_Opcode },
5336     { "vpmulhuw",       { XM, Vex, EXx }, 0 },
5337   },
5338
5339   /* PREFIX_VEX_0FE5 */
5340   {
5341     { Bad_Opcode },
5342     { Bad_Opcode },
5343     { "vpmulhw",        { XM, Vex, EXx }, 0 },
5344   },
5345
5346   /* PREFIX_VEX_0FE6 */
5347   {
5348     { Bad_Opcode },
5349     { "vcvtdq2pd",      { XM, EXxmmq }, 0 },
5350     { "vcvttpd2dq%XY",  { XMM, EXx }, 0 },
5351     { "vcvtpd2dq%XY",   { XMM, EXx }, 0 },
5352   },
5353
5354   /* PREFIX_VEX_0FE7 */
5355   {
5356     { Bad_Opcode },
5357     { Bad_Opcode },
5358     { MOD_TABLE (MOD_VEX_0FE7_PREFIX_2) },
5359   },
5360
5361   /* PREFIX_VEX_0FE8 */
5362   {
5363     { Bad_Opcode },
5364     { Bad_Opcode },
5365     { "vpsubsb",        { XM, Vex, EXx }, 0 },
5366   },
5367
5368   /* PREFIX_VEX_0FE9 */
5369   {
5370     { Bad_Opcode },
5371     { Bad_Opcode },
5372     { "vpsubsw",        { XM, Vex, EXx }, 0 },
5373   },
5374
5375   /* PREFIX_VEX_0FEA */
5376   {
5377     { Bad_Opcode },
5378     { Bad_Opcode },
5379     { "vpminsw",        { XM, Vex, EXx }, 0 },
5380   },
5381
5382   /* PREFIX_VEX_0FEB */
5383   {
5384     { Bad_Opcode },
5385     { Bad_Opcode },
5386     { "vpor",           { XM, Vex, EXx }, 0 },
5387   },
5388
5389   /* PREFIX_VEX_0FEC */
5390   {
5391     { Bad_Opcode },
5392     { Bad_Opcode },
5393     { "vpaddsb",        { XM, Vex, EXx }, 0 },
5394   },
5395
5396   /* PREFIX_VEX_0FED */
5397   {
5398     { Bad_Opcode },
5399     { Bad_Opcode },
5400     { "vpaddsw",        { XM, Vex, EXx }, 0 },
5401   },
5402
5403   /* PREFIX_VEX_0FEE */
5404   {
5405     { Bad_Opcode },
5406     { Bad_Opcode },
5407     { "vpmaxsw",        { XM, Vex, EXx }, 0 },
5408   },
5409
5410   /* PREFIX_VEX_0FEF */
5411   {
5412     { Bad_Opcode },
5413     { Bad_Opcode },
5414     { "vpxor",          { XM, Vex, EXx }, 0 },
5415   },
5416
5417   /* PREFIX_VEX_0FF0 */
5418   {
5419     { Bad_Opcode },
5420     { Bad_Opcode },
5421     { Bad_Opcode },
5422     { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
5423   },
5424
5425   /* PREFIX_VEX_0FF1 */
5426   {
5427     { Bad_Opcode },
5428     { Bad_Opcode },
5429     { "vpsllw",         { XM, Vex, EXxmm }, 0 },
5430   },
5431
5432   /* PREFIX_VEX_0FF2 */
5433   {
5434     { Bad_Opcode },
5435     { Bad_Opcode },
5436     { "vpslld",         { XM, Vex, EXxmm }, 0 },
5437   },
5438
5439   /* PREFIX_VEX_0FF3 */
5440   {
5441     { Bad_Opcode },
5442     { Bad_Opcode },
5443     { "vpsllq",         { XM, Vex, EXxmm }, 0 },
5444   },
5445
5446   /* PREFIX_VEX_0FF4 */
5447   {
5448     { Bad_Opcode },
5449     { Bad_Opcode },
5450     { "vpmuludq",       { XM, Vex, EXx }, 0 },
5451   },
5452
5453   /* PREFIX_VEX_0FF5 */
5454   {
5455     { Bad_Opcode },
5456     { Bad_Opcode },
5457     { "vpmaddwd",       { XM, Vex, EXx }, 0 },
5458   },
5459
5460   /* PREFIX_VEX_0FF6 */
5461   {
5462     { Bad_Opcode },
5463     { Bad_Opcode },
5464     { "vpsadbw",        { XM, Vex, EXx }, 0 },
5465   },
5466
5467   /* PREFIX_VEX_0FF7 */
5468   {
5469     { Bad_Opcode },
5470     { Bad_Opcode },
5471     { VEX_LEN_TABLE (VEX_LEN_0FF7_P_2) },
5472   },
5473
5474   /* PREFIX_VEX_0FF8 */
5475   {
5476     { Bad_Opcode },
5477     { Bad_Opcode },
5478     { "vpsubb",         { XM, Vex, EXx }, 0 },
5479   },
5480
5481   /* PREFIX_VEX_0FF9 */
5482   {
5483     { Bad_Opcode },
5484     { Bad_Opcode },
5485     { "vpsubw",         { XM, Vex, EXx }, 0 },
5486   },
5487
5488   /* PREFIX_VEX_0FFA */
5489   {
5490     { Bad_Opcode },
5491     { Bad_Opcode },
5492     { "vpsubd",         { XM, Vex, EXx }, 0 },
5493   },
5494
5495   /* PREFIX_VEX_0FFB */
5496   {
5497     { Bad_Opcode },
5498     { Bad_Opcode },
5499     { "vpsubq",         { XM, Vex, EXx }, 0 },
5500   },
5501
5502   /* PREFIX_VEX_0FFC */
5503   {
5504     { Bad_Opcode },
5505     { Bad_Opcode },
5506     { "vpaddb",         { XM, Vex, EXx }, 0 },
5507   },
5508
5509   /* PREFIX_VEX_0FFD */
5510   {
5511     { Bad_Opcode },
5512     { Bad_Opcode },
5513     { "vpaddw",         { XM, Vex, EXx }, 0 },
5514   },
5515
5516   /* PREFIX_VEX_0FFE */
5517   {
5518     { Bad_Opcode },
5519     { Bad_Opcode },
5520     { "vpaddd",         { XM, Vex, EXx }, 0 },
5521   },
5522
5523   /* PREFIX_VEX_0F3800 */
5524   {
5525     { Bad_Opcode },
5526     { Bad_Opcode },
5527     { "vpshufb",        { XM, Vex, EXx }, 0 },
5528   },
5529
5530   /* PREFIX_VEX_0F3801 */
5531   {
5532     { Bad_Opcode },
5533     { Bad_Opcode },
5534     { "vphaddw",        { XM, Vex, EXx }, 0 },
5535   },
5536
5537   /* PREFIX_VEX_0F3802 */
5538   {
5539     { Bad_Opcode },
5540     { Bad_Opcode },
5541     { "vphaddd",        { XM, Vex, EXx }, 0 },
5542   },
5543
5544   /* PREFIX_VEX_0F3803 */
5545   {
5546     { Bad_Opcode },
5547     { Bad_Opcode },
5548     { "vphaddsw",       { XM, Vex, EXx }, 0 },
5549   },
5550
5551   /* PREFIX_VEX_0F3804 */
5552   {
5553     { Bad_Opcode },
5554     { Bad_Opcode },
5555     { "vpmaddubsw",     { XM, Vex, EXx }, 0 },
5556   },
5557
5558   /* PREFIX_VEX_0F3805 */
5559   {
5560     { Bad_Opcode },
5561     { Bad_Opcode },
5562     { "vphsubw",        { XM, Vex, EXx }, 0 },
5563   },
5564
5565   /* PREFIX_VEX_0F3806 */
5566   {
5567     { Bad_Opcode },
5568     { Bad_Opcode },
5569     { "vphsubd",        { XM, Vex, EXx }, 0 },
5570   },
5571
5572   /* PREFIX_VEX_0F3807 */
5573   {
5574     { Bad_Opcode },
5575     { Bad_Opcode },
5576     { "vphsubsw",       { XM, Vex, EXx }, 0 },
5577   },
5578
5579   /* PREFIX_VEX_0F3808 */
5580   {
5581     { Bad_Opcode },
5582     { Bad_Opcode },
5583     { "vpsignb",        { XM, Vex, EXx }, 0 },
5584   },
5585
5586   /* PREFIX_VEX_0F3809 */
5587   {
5588     { Bad_Opcode },
5589     { Bad_Opcode },
5590     { "vpsignw",        { XM, Vex, EXx }, 0 },
5591   },
5592
5593   /* PREFIX_VEX_0F380A */
5594   {
5595     { Bad_Opcode },
5596     { Bad_Opcode },
5597     { "vpsignd",        { XM, Vex, EXx }, 0 },
5598   },
5599
5600   /* PREFIX_VEX_0F380B */
5601   {
5602     { Bad_Opcode },
5603     { Bad_Opcode },
5604     { "vpmulhrsw",      { XM, Vex, EXx }, 0 },
5605   },
5606
5607   /* PREFIX_VEX_0F380C */
5608   {
5609     { Bad_Opcode },
5610     { Bad_Opcode },
5611     { VEX_W_TABLE (VEX_W_0F380C_P_2) },
5612   },
5613
5614   /* PREFIX_VEX_0F380D */
5615   {
5616     { Bad_Opcode },
5617     { Bad_Opcode },
5618     { VEX_W_TABLE (VEX_W_0F380D_P_2) },
5619   },
5620
5621   /* PREFIX_VEX_0F380E */
5622   {
5623     { Bad_Opcode },
5624     { Bad_Opcode },
5625     { VEX_W_TABLE (VEX_W_0F380E_P_2) },
5626   },
5627
5628   /* PREFIX_VEX_0F380F */
5629   {
5630     { Bad_Opcode },
5631     { Bad_Opcode },
5632     { VEX_W_TABLE (VEX_W_0F380F_P_2) },
5633   },
5634
5635   /* PREFIX_VEX_0F3813 */
5636   {
5637     { Bad_Opcode },
5638     { Bad_Opcode },
5639     { "vcvtph2ps", { XM, EXxmmq }, 0 },
5640   },
5641
5642   /* PREFIX_VEX_0F3816 */
5643   {
5644     { Bad_Opcode },
5645     { Bad_Opcode },
5646     { VEX_LEN_TABLE (VEX_LEN_0F3816_P_2) },
5647   },
5648
5649   /* PREFIX_VEX_0F3817 */
5650   {
5651     { Bad_Opcode },
5652     { Bad_Opcode },
5653     { "vptest",         { XM, EXx }, 0 },
5654   },
5655
5656   /* PREFIX_VEX_0F3818 */
5657   {
5658     { Bad_Opcode },
5659     { Bad_Opcode },
5660     { VEX_W_TABLE (VEX_W_0F3818_P_2) },
5661   },
5662
5663   /* PREFIX_VEX_0F3819 */
5664   {
5665     { Bad_Opcode },
5666     { Bad_Opcode },
5667     { VEX_LEN_TABLE (VEX_LEN_0F3819_P_2) },
5668   },
5669
5670   /* PREFIX_VEX_0F381A */
5671   {
5672     { Bad_Opcode },
5673     { Bad_Opcode },
5674     { MOD_TABLE (MOD_VEX_0F381A_PREFIX_2) },
5675   },
5676
5677   /* PREFIX_VEX_0F381C */
5678   {
5679     { Bad_Opcode },
5680     { Bad_Opcode },
5681     { "vpabsb",         { XM, EXx }, 0 },
5682   },
5683
5684   /* PREFIX_VEX_0F381D */
5685   {
5686     { Bad_Opcode },
5687     { Bad_Opcode },
5688     { "vpabsw",         { XM, EXx }, 0 },
5689   },
5690
5691   /* PREFIX_VEX_0F381E */
5692   {
5693     { Bad_Opcode },
5694     { Bad_Opcode },
5695     { "vpabsd",         { XM, EXx }, 0 },
5696   },
5697
5698   /* PREFIX_VEX_0F3820 */
5699   {
5700     { Bad_Opcode },
5701     { Bad_Opcode },
5702     { "vpmovsxbw",      { XM, EXxmmq }, 0 },
5703   },
5704
5705   /* PREFIX_VEX_0F3821 */
5706   {
5707     { Bad_Opcode },
5708     { Bad_Opcode },
5709     { "vpmovsxbd",      { XM, EXxmmqd }, 0 },
5710   },
5711
5712   /* PREFIX_VEX_0F3822 */
5713   {
5714     { Bad_Opcode },
5715     { Bad_Opcode },
5716     { "vpmovsxbq",      { XM, EXxmmdw }, 0 },
5717   },
5718
5719   /* PREFIX_VEX_0F3823 */
5720   {
5721     { Bad_Opcode },
5722     { Bad_Opcode },
5723     { "vpmovsxwd",      { XM, EXxmmq }, 0 },
5724   },
5725
5726   /* PREFIX_VEX_0F3824 */
5727   {
5728     { Bad_Opcode },
5729     { Bad_Opcode },
5730     { "vpmovsxwq",      { XM, EXxmmqd }, 0 },
5731   },
5732
5733   /* PREFIX_VEX_0F3825 */
5734   {
5735     { Bad_Opcode },
5736     { Bad_Opcode },
5737     { "vpmovsxdq",      { XM, EXxmmq }, 0 },
5738   },
5739
5740   /* PREFIX_VEX_0F3828 */
5741   {
5742     { Bad_Opcode },
5743     { Bad_Opcode },
5744     { "vpmuldq",        { XM, Vex, EXx }, 0 },
5745   },
5746
5747   /* PREFIX_VEX_0F3829 */
5748   {
5749     { Bad_Opcode },
5750     { Bad_Opcode },
5751     { "vpcmpeqq",       { XM, Vex, EXx }, 0 },
5752   },
5753
5754   /* PREFIX_VEX_0F382A */
5755   {
5756     { Bad_Opcode },
5757     { Bad_Opcode },
5758     { MOD_TABLE (MOD_VEX_0F382A_PREFIX_2) },
5759   },
5760
5761   /* PREFIX_VEX_0F382B */
5762   {
5763     { Bad_Opcode },
5764     { Bad_Opcode },
5765     { "vpackusdw",      { XM, Vex, EXx }, 0 },
5766   },
5767
5768   /* PREFIX_VEX_0F382C */
5769   {
5770     { Bad_Opcode },
5771     { Bad_Opcode },
5772      { MOD_TABLE (MOD_VEX_0F382C_PREFIX_2) },
5773   },
5774
5775   /* PREFIX_VEX_0F382D */
5776   {
5777     { Bad_Opcode },
5778     { Bad_Opcode },
5779      { MOD_TABLE (MOD_VEX_0F382D_PREFIX_2) },
5780   },
5781
5782   /* PREFIX_VEX_0F382E */
5783   {
5784     { Bad_Opcode },
5785     { Bad_Opcode },
5786      { MOD_TABLE (MOD_VEX_0F382E_PREFIX_2) },
5787   },
5788
5789   /* PREFIX_VEX_0F382F */
5790   {
5791     { Bad_Opcode },
5792     { Bad_Opcode },
5793      { MOD_TABLE (MOD_VEX_0F382F_PREFIX_2) },
5794   },
5795
5796   /* PREFIX_VEX_0F3830 */
5797   {
5798     { Bad_Opcode },
5799     { Bad_Opcode },
5800     { "vpmovzxbw",      { XM, EXxmmq }, 0 },
5801   },
5802
5803   /* PREFIX_VEX_0F3831 */
5804   {
5805     { Bad_Opcode },
5806     { Bad_Opcode },
5807     { "vpmovzxbd",      { XM, EXxmmqd }, 0 },
5808   },
5809
5810   /* PREFIX_VEX_0F3832 */
5811   {
5812     { Bad_Opcode },
5813     { Bad_Opcode },
5814     { "vpmovzxbq",      { XM, EXxmmdw }, 0 },
5815   },
5816
5817   /* PREFIX_VEX_0F3833 */
5818   {
5819     { Bad_Opcode },
5820     { Bad_Opcode },
5821     { "vpmovzxwd",      { XM, EXxmmq }, 0 },
5822   },
5823
5824   /* PREFIX_VEX_0F3834 */
5825   {
5826     { Bad_Opcode },
5827     { Bad_Opcode },
5828     { "vpmovzxwq",      { XM, EXxmmqd }, 0 },
5829   },
5830
5831   /* PREFIX_VEX_0F3835 */
5832   {
5833     { Bad_Opcode },
5834     { Bad_Opcode },
5835     { "vpmovzxdq",      { XM, EXxmmq }, 0 },
5836   },
5837
5838   /* PREFIX_VEX_0F3836 */
5839   {
5840     { Bad_Opcode },
5841     { Bad_Opcode },
5842     { VEX_LEN_TABLE (VEX_LEN_0F3836_P_2) },
5843   },
5844
5845   /* PREFIX_VEX_0F3837 */
5846   {
5847     { Bad_Opcode },
5848     { Bad_Opcode },
5849     { "vpcmpgtq",       { XM, Vex, EXx }, 0 },
5850   },
5851
5852   /* PREFIX_VEX_0F3838 */
5853   {
5854     { Bad_Opcode },
5855     { Bad_Opcode },
5856     { "vpminsb",        { XM, Vex, EXx }, 0 },
5857   },
5858
5859   /* PREFIX_VEX_0F3839 */
5860   {
5861     { Bad_Opcode },
5862     { Bad_Opcode },
5863     { "vpminsd",        { XM, Vex, EXx }, 0 },
5864   },
5865
5866   /* PREFIX_VEX_0F383A */
5867   {
5868     { Bad_Opcode },
5869     { Bad_Opcode },
5870     { "vpminuw",        { XM, Vex, EXx }, 0 },
5871   },
5872
5873   /* PREFIX_VEX_0F383B */
5874   {
5875     { Bad_Opcode },
5876     { Bad_Opcode },
5877     { "vpminud",        { XM, Vex, EXx }, 0 },
5878   },
5879
5880   /* PREFIX_VEX_0F383C */
5881   {
5882     { Bad_Opcode },
5883     { Bad_Opcode },
5884     { "vpmaxsb",        { XM, Vex, EXx }, 0 },
5885   },
5886
5887   /* PREFIX_VEX_0F383D */
5888   {
5889     { Bad_Opcode },
5890     { Bad_Opcode },
5891     { "vpmaxsd",        { XM, Vex, EXx }, 0 },
5892   },
5893
5894   /* PREFIX_VEX_0F383E */
5895   {
5896     { Bad_Opcode },
5897     { Bad_Opcode },
5898     { "vpmaxuw",        { XM, Vex, EXx }, 0 },
5899   },
5900
5901   /* PREFIX_VEX_0F383F */
5902   {
5903     { Bad_Opcode },
5904     { Bad_Opcode },
5905     { "vpmaxud",        { XM, Vex, EXx }, 0 },
5906   },
5907
5908   /* PREFIX_VEX_0F3840 */
5909   {
5910     { Bad_Opcode },
5911     { Bad_Opcode },
5912     { "vpmulld",        { XM, Vex, EXx }, 0 },
5913   },
5914
5915   /* PREFIX_VEX_0F3841 */
5916   {
5917     { Bad_Opcode },
5918     { Bad_Opcode },
5919     { VEX_LEN_TABLE (VEX_LEN_0F3841_P_2) },
5920   },
5921
5922   /* PREFIX_VEX_0F3845 */
5923   {
5924     { Bad_Opcode },
5925     { Bad_Opcode },
5926     { "vpsrlv%LW", { XM, Vex, EXx }, 0 },
5927   },
5928
5929   /* PREFIX_VEX_0F3846 */
5930   {
5931     { Bad_Opcode },
5932     { Bad_Opcode },
5933     { VEX_W_TABLE (VEX_W_0F3846_P_2) },
5934   },
5935
5936   /* PREFIX_VEX_0F3847 */
5937   {
5938     { Bad_Opcode },
5939     { Bad_Opcode },
5940     { "vpsllv%LW", { XM, Vex, EXx }, 0 },
5941   },
5942
5943   /* PREFIX_VEX_0F3858 */
5944   {
5945     { Bad_Opcode },
5946     { Bad_Opcode },
5947     { VEX_W_TABLE (VEX_W_0F3858_P_2) },
5948   },
5949
5950   /* PREFIX_VEX_0F3859 */
5951   {
5952     { Bad_Opcode },
5953     { Bad_Opcode },
5954     { VEX_W_TABLE (VEX_W_0F3859_P_2) },
5955   },
5956
5957   /* PREFIX_VEX_0F385A */
5958   {
5959     { Bad_Opcode },
5960     { Bad_Opcode },
5961     { MOD_TABLE (MOD_VEX_0F385A_PREFIX_2) },
5962   },
5963
5964   /* PREFIX_VEX_0F3878 */
5965   {
5966     { Bad_Opcode },
5967     { Bad_Opcode },
5968     { VEX_W_TABLE (VEX_W_0F3878_P_2) },
5969   },
5970
5971   /* PREFIX_VEX_0F3879 */
5972   {
5973     { Bad_Opcode },
5974     { Bad_Opcode },
5975     { VEX_W_TABLE (VEX_W_0F3879_P_2) },
5976   },
5977
5978   /* PREFIX_VEX_0F388C */
5979   {
5980     { Bad_Opcode },
5981     { Bad_Opcode },
5982     { MOD_TABLE (MOD_VEX_0F388C_PREFIX_2) },
5983   },
5984
5985   /* PREFIX_VEX_0F388E */
5986   {
5987     { Bad_Opcode },
5988     { Bad_Opcode },
5989     { MOD_TABLE (MOD_VEX_0F388E_PREFIX_2) },
5990   },
5991
5992   /* PREFIX_VEX_0F3890 */
5993   {
5994     { Bad_Opcode },
5995     { Bad_Opcode },
5996     { "vpgatherd%LW", { XM, MVexVSIBDWpX, Vex }, 0 },
5997   },
5998
5999   /* PREFIX_VEX_0F3891 */
6000   {
6001     { Bad_Opcode },
6002     { Bad_Opcode },
6003     { "vpgatherq%LW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
6004   },
6005
6006   /* PREFIX_VEX_0F3892 */
6007   {
6008     { Bad_Opcode },
6009     { Bad_Opcode },
6010     { "vgatherdp%XW", { XM, MVexVSIBDWpX, Vex }, 0 },
6011   },
6012
6013   /* PREFIX_VEX_0F3893 */
6014   {
6015     { Bad_Opcode },
6016     { Bad_Opcode },
6017     { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, 0 },
6018   },
6019
6020   /* PREFIX_VEX_0F3896 */
6021   {
6022     { Bad_Opcode },
6023     { Bad_Opcode },
6024     { "vfmaddsub132p%XW", { XM, Vex, EXx }, 0 },
6025   },
6026
6027   /* PREFIX_VEX_0F3897 */
6028   {
6029     { Bad_Opcode },
6030     { Bad_Opcode },
6031     { "vfmsubadd132p%XW", { XM, Vex, EXx }, 0 },
6032   },
6033
6034   /* PREFIX_VEX_0F3898 */
6035   {
6036     { Bad_Opcode },
6037     { Bad_Opcode },
6038     { "vfmadd132p%XW", { XM, Vex, EXx }, 0 },
6039   },
6040
6041   /* PREFIX_VEX_0F3899 */
6042   {
6043     { Bad_Opcode },
6044     { Bad_Opcode },
6045     { "vfmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6046   },
6047
6048   /* PREFIX_VEX_0F389A */
6049   {
6050     { Bad_Opcode },
6051     { Bad_Opcode },
6052     { "vfmsub132p%XW", { XM, Vex, EXx }, 0 },
6053   },
6054
6055   /* PREFIX_VEX_0F389B */
6056   {
6057     { Bad_Opcode },
6058     { Bad_Opcode },
6059     { "vfmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6060   },
6061
6062   /* PREFIX_VEX_0F389C */
6063   {
6064     { Bad_Opcode },
6065     { Bad_Opcode },
6066     { "vfnmadd132p%XW", { XM, Vex, EXx }, 0 },
6067   },
6068
6069   /* PREFIX_VEX_0F389D */
6070   {
6071     { Bad_Opcode },
6072     { Bad_Opcode },
6073     { "vfnmadd132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6074   },
6075
6076   /* PREFIX_VEX_0F389E */
6077   {
6078     { Bad_Opcode },
6079     { Bad_Opcode },
6080     { "vfnmsub132p%XW", { XM, Vex, EXx }, 0 },
6081   },
6082
6083   /* PREFIX_VEX_0F389F */
6084   {
6085     { Bad_Opcode },
6086     { Bad_Opcode },
6087     { "vfnmsub132s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6088   },
6089
6090   /* PREFIX_VEX_0F38A6 */
6091   {
6092     { Bad_Opcode },
6093     { Bad_Opcode },
6094     { "vfmaddsub213p%XW", { XM, Vex, EXx }, 0 },
6095     { Bad_Opcode },
6096   },
6097
6098   /* PREFIX_VEX_0F38A7 */
6099   {
6100     { Bad_Opcode },
6101     { Bad_Opcode },
6102     { "vfmsubadd213p%XW", { XM, Vex, EXx }, 0 },
6103   },
6104
6105   /* PREFIX_VEX_0F38A8 */
6106   {
6107     { Bad_Opcode },
6108     { Bad_Opcode },
6109     { "vfmadd213p%XW", { XM, Vex, EXx }, 0 },
6110   },
6111
6112   /* PREFIX_VEX_0F38A9 */
6113   {
6114     { Bad_Opcode },
6115     { Bad_Opcode },
6116     { "vfmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6117   },
6118
6119   /* PREFIX_VEX_0F38AA */
6120   {
6121     { Bad_Opcode },
6122     { Bad_Opcode },
6123     { "vfmsub213p%XW", { XM, Vex, EXx }, 0 },
6124   },
6125
6126   /* PREFIX_VEX_0F38AB */
6127   {
6128     { Bad_Opcode },
6129     { Bad_Opcode },
6130     { "vfmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6131   },
6132
6133   /* PREFIX_VEX_0F38AC */
6134   {
6135     { Bad_Opcode },
6136     { Bad_Opcode },
6137     { "vfnmadd213p%XW", { XM, Vex, EXx }, 0 },
6138   },
6139
6140   /* PREFIX_VEX_0F38AD */
6141   {
6142     { Bad_Opcode },
6143     { Bad_Opcode },
6144     { "vfnmadd213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6145   },
6146
6147   /* PREFIX_VEX_0F38AE */
6148   {
6149     { Bad_Opcode },
6150     { Bad_Opcode },
6151     { "vfnmsub213p%XW", { XM, Vex, EXx }, 0 },
6152   },
6153
6154   /* PREFIX_VEX_0F38AF */
6155   {
6156     { Bad_Opcode },
6157     { Bad_Opcode },
6158     { "vfnmsub213s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6159   },
6160
6161   /* PREFIX_VEX_0F38B6 */
6162   {
6163     { Bad_Opcode },
6164     { Bad_Opcode },
6165     { "vfmaddsub231p%XW", { XM, Vex, EXx }, 0 },
6166   },
6167
6168   /* PREFIX_VEX_0F38B7 */
6169   {
6170     { Bad_Opcode },
6171     { Bad_Opcode },
6172     { "vfmsubadd231p%XW", { XM, Vex, EXx }, 0 },
6173   },
6174
6175   /* PREFIX_VEX_0F38B8 */
6176   {
6177     { Bad_Opcode },
6178     { Bad_Opcode },
6179     { "vfmadd231p%XW", { XM, Vex, EXx }, 0 },
6180   },
6181
6182   /* PREFIX_VEX_0F38B9 */
6183   {
6184     { Bad_Opcode },
6185     { Bad_Opcode },
6186     { "vfmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6187   },
6188
6189   /* PREFIX_VEX_0F38BA */
6190   {
6191     { Bad_Opcode },
6192     { Bad_Opcode },
6193     { "vfmsub231p%XW", { XM, Vex, EXx }, 0 },
6194   },
6195
6196   /* PREFIX_VEX_0F38BB */
6197   {
6198     { Bad_Opcode },
6199     { Bad_Opcode },
6200     { "vfmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6201   },
6202
6203   /* PREFIX_VEX_0F38BC */
6204   {
6205     { Bad_Opcode },
6206     { Bad_Opcode },
6207     { "vfnmadd231p%XW", { XM, Vex, EXx }, 0 },
6208   },
6209
6210   /* PREFIX_VEX_0F38BD */
6211   {
6212     { Bad_Opcode },
6213     { Bad_Opcode },
6214     { "vfnmadd231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6215   },
6216
6217   /* PREFIX_VEX_0F38BE */
6218   {
6219     { Bad_Opcode },
6220     { Bad_Opcode },
6221     { "vfnmsub231p%XW", { XM, Vex, EXx }, 0 },
6222   },
6223
6224   /* PREFIX_VEX_0F38BF */
6225   {
6226     { Bad_Opcode },
6227     { Bad_Opcode },
6228     { "vfnmsub231s%XW", { XMScalar, VexScalar, EXVexWdqScalar }, 0 },
6229   },
6230
6231   /* PREFIX_VEX_0F38CF */
6232   {
6233     { Bad_Opcode },
6234     { Bad_Opcode },
6235     { VEX_W_TABLE (VEX_W_0F38CF_P_2) },
6236   },
6237
6238   /* PREFIX_VEX_0F38DB */
6239   {
6240     { Bad_Opcode },
6241     { Bad_Opcode },
6242     { VEX_LEN_TABLE (VEX_LEN_0F38DB_P_2) },
6243   },
6244
6245   /* PREFIX_VEX_0F38DC */
6246   {
6247     { Bad_Opcode },
6248     { Bad_Opcode },
6249     { "vaesenc",        { XM, Vex, EXx }, 0 },
6250   },
6251
6252   /* PREFIX_VEX_0F38DD */
6253   {
6254     { Bad_Opcode },
6255     { Bad_Opcode },
6256     { "vaesenclast",    { XM, Vex, EXx }, 0 },
6257   },
6258
6259   /* PREFIX_VEX_0F38DE */
6260   {
6261     { Bad_Opcode },
6262     { Bad_Opcode },
6263     { "vaesdec",        { XM, Vex, EXx }, 0 },
6264   },
6265
6266   /* PREFIX_VEX_0F38DF */
6267   {
6268     { Bad_Opcode },
6269     { Bad_Opcode },
6270     { "vaesdeclast",    { XM, Vex, EXx }, 0 },
6271   },
6272
6273   /* PREFIX_VEX_0F38F2 */
6274   {
6275     { VEX_LEN_TABLE (VEX_LEN_0F38F2_P_0) },
6276   },
6277
6278   /* PREFIX_VEX_0F38F3_REG_1 */
6279   {
6280     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_1_P_0) },
6281   },
6282
6283   /* PREFIX_VEX_0F38F3_REG_2 */
6284   {
6285     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_2_P_0) },
6286   },
6287
6288   /* PREFIX_VEX_0F38F3_REG_3 */
6289   {
6290     { VEX_LEN_TABLE (VEX_LEN_0F38F3_R_3_P_0) },
6291   },
6292
6293   /* PREFIX_VEX_0F38F5 */
6294   {
6295     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_0) },
6296     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_1) },
6297     { Bad_Opcode },
6298     { VEX_LEN_TABLE (VEX_LEN_0F38F5_P_3) },
6299   },
6300
6301   /* PREFIX_VEX_0F38F6 */
6302   {
6303     { Bad_Opcode },
6304     { Bad_Opcode },
6305     { Bad_Opcode },
6306     { VEX_LEN_TABLE (VEX_LEN_0F38F6_P_3) },
6307   },
6308
6309   /* PREFIX_VEX_0F38F7 */
6310   {
6311     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_0) },
6312     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_1) },
6313     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_2) },
6314     { VEX_LEN_TABLE (VEX_LEN_0F38F7_P_3) },
6315   },
6316
6317   /* PREFIX_VEX_0F3A00 */
6318   {
6319     { Bad_Opcode },
6320     { Bad_Opcode },
6321     { VEX_LEN_TABLE (VEX_LEN_0F3A00_P_2) },
6322   },
6323
6324   /* PREFIX_VEX_0F3A01 */
6325   {
6326     { Bad_Opcode },
6327     { Bad_Opcode },
6328     { VEX_LEN_TABLE (VEX_LEN_0F3A01_P_2) },
6329   },
6330
6331   /* PREFIX_VEX_0F3A02 */
6332   {
6333     { Bad_Opcode },
6334     { Bad_Opcode },
6335     { VEX_W_TABLE (VEX_W_0F3A02_P_2) },
6336   },
6337
6338   /* PREFIX_VEX_0F3A04 */
6339   {
6340     { Bad_Opcode },
6341     { Bad_Opcode },
6342     { VEX_W_TABLE (VEX_W_0F3A04_P_2) },
6343   },
6344
6345   /* PREFIX_VEX_0F3A05 */
6346   {
6347     { Bad_Opcode },
6348     { Bad_Opcode },
6349     { VEX_W_TABLE (VEX_W_0F3A05_P_2) },
6350   },
6351
6352   /* PREFIX_VEX_0F3A06 */
6353   {
6354     { Bad_Opcode },
6355     { Bad_Opcode },
6356     { VEX_LEN_TABLE (VEX_LEN_0F3A06_P_2) },
6357   },
6358
6359   /* PREFIX_VEX_0F3A08 */
6360   {
6361     { Bad_Opcode },
6362     { Bad_Opcode },
6363     { "vroundps",       { XM, EXx, Ib }, 0 },
6364   },
6365
6366   /* PREFIX_VEX_0F3A09 */
6367   {
6368     { Bad_Opcode },
6369     { Bad_Opcode },
6370     { "vroundpd",       { XM, EXx, Ib }, 0 },
6371   },
6372
6373   /* PREFIX_VEX_0F3A0A */
6374   {
6375     { Bad_Opcode },
6376     { Bad_Opcode },
6377     { "vroundss",       { XMScalar, VexScalar, EXdScalar, Ib }, 0 },
6378   },
6379
6380   /* PREFIX_VEX_0F3A0B */
6381   {
6382     { Bad_Opcode },
6383     { Bad_Opcode },
6384     { "vroundsd",       { XMScalar, VexScalar, EXqScalar, Ib }, 0 },
6385   },
6386
6387   /* PREFIX_VEX_0F3A0C */
6388   {
6389     { Bad_Opcode },
6390     { Bad_Opcode },
6391     { "vblendps",       { XM, Vex, EXx, Ib }, 0 },
6392   },
6393
6394   /* PREFIX_VEX_0F3A0D */
6395   {
6396     { Bad_Opcode },
6397     { Bad_Opcode },
6398     { "vblendpd",       { XM, Vex, EXx, Ib }, 0 },
6399   },
6400
6401   /* PREFIX_VEX_0F3A0E */
6402   {
6403     { Bad_Opcode },
6404     { Bad_Opcode },
6405     { "vpblendw",       { XM, Vex, EXx, Ib }, 0 },
6406   },
6407
6408   /* PREFIX_VEX_0F3A0F */
6409   {
6410     { Bad_Opcode },
6411     { Bad_Opcode },
6412     { "vpalignr",       { XM, Vex, EXx, Ib }, 0 },
6413   },
6414
6415   /* PREFIX_VEX_0F3A14 */
6416   {
6417     { Bad_Opcode },
6418     { Bad_Opcode },
6419     { VEX_LEN_TABLE (VEX_LEN_0F3A14_P_2) },
6420   },
6421
6422   /* PREFIX_VEX_0F3A15 */
6423   {
6424     { Bad_Opcode },
6425     { Bad_Opcode },
6426     { VEX_LEN_TABLE (VEX_LEN_0F3A15_P_2) },
6427   },
6428
6429   /* PREFIX_VEX_0F3A16 */
6430   {
6431     { Bad_Opcode },
6432     { Bad_Opcode },
6433     { VEX_LEN_TABLE (VEX_LEN_0F3A16_P_2) },
6434   },
6435
6436   /* PREFIX_VEX_0F3A17 */
6437   {
6438     { Bad_Opcode },
6439     { Bad_Opcode },
6440     { VEX_LEN_TABLE (VEX_LEN_0F3A17_P_2) },
6441   },
6442
6443   /* PREFIX_VEX_0F3A18 */
6444   {
6445     { Bad_Opcode },
6446     { Bad_Opcode },
6447     { VEX_LEN_TABLE (VEX_LEN_0F3A18_P_2) },
6448   },
6449
6450   /* PREFIX_VEX_0F3A19 */
6451   {
6452     { Bad_Opcode },
6453     { Bad_Opcode },
6454     { VEX_LEN_TABLE (VEX_LEN_0F3A19_P_2) },
6455   },
6456
6457   /* PREFIX_VEX_0F3A1D */
6458   {
6459     { Bad_Opcode },
6460     { Bad_Opcode },
6461     { "vcvtps2ph", { EXxmmq, XM, Ib }, 0 },
6462   },
6463
6464   /* PREFIX_VEX_0F3A20 */
6465   {
6466     { Bad_Opcode },
6467     { Bad_Opcode },
6468     { VEX_LEN_TABLE (VEX_LEN_0F3A20_P_2) },
6469   },
6470
6471   /* PREFIX_VEX_0F3A21 */
6472   {
6473     { Bad_Opcode },
6474     { Bad_Opcode },
6475     { VEX_LEN_TABLE (VEX_LEN_0F3A21_P_2) },
6476   },
6477
6478   /* PREFIX_VEX_0F3A22 */
6479   {
6480     { Bad_Opcode },
6481     { Bad_Opcode },
6482     { VEX_LEN_TABLE (VEX_LEN_0F3A22_P_2) },
6483   },
6484
6485   /* PREFIX_VEX_0F3A30 */
6486   {
6487     { Bad_Opcode },
6488     { Bad_Opcode },
6489     { VEX_LEN_TABLE (VEX_LEN_0F3A30_P_2) },
6490   },
6491
6492   /* PREFIX_VEX_0F3A31 */
6493   {
6494     { Bad_Opcode },
6495     { Bad_Opcode },
6496     { VEX_LEN_TABLE (VEX_LEN_0F3A31_P_2) },
6497   },
6498
6499   /* PREFIX_VEX_0F3A32 */
6500   {
6501     { Bad_Opcode },
6502     { Bad_Opcode },
6503     { VEX_LEN_TABLE (VEX_LEN_0F3A32_P_2) },
6504   },
6505
6506   /* PREFIX_VEX_0F3A33 */
6507   {
6508     { Bad_Opcode },
6509     { Bad_Opcode },
6510     { VEX_LEN_TABLE (VEX_LEN_0F3A33_P_2) },
6511   },
6512
6513   /* PREFIX_VEX_0F3A38 */
6514   {
6515     { Bad_Opcode },
6516     { Bad_Opcode },
6517     { VEX_LEN_TABLE (VEX_LEN_0F3A38_P_2) },
6518   },
6519
6520   /* PREFIX_VEX_0F3A39 */
6521   {
6522     { Bad_Opcode },
6523     { Bad_Opcode },
6524     { VEX_LEN_TABLE (VEX_LEN_0F3A39_P_2) },
6525   },
6526
6527   /* PREFIX_VEX_0F3A40 */
6528   {
6529     { Bad_Opcode },
6530     { Bad_Opcode },
6531     { "vdpps",          { XM, Vex, EXx, Ib }, 0 },
6532   },
6533
6534   /* PREFIX_VEX_0F3A41 */
6535   {
6536     { Bad_Opcode },
6537     { Bad_Opcode },
6538     { VEX_LEN_TABLE (VEX_LEN_0F3A41_P_2) },
6539   },
6540
6541   /* PREFIX_VEX_0F3A42 */
6542   {
6543     { Bad_Opcode },
6544     { Bad_Opcode },
6545     { "vmpsadbw",       { XM, Vex, EXx, Ib }, 0 },
6546   },
6547
6548   /* PREFIX_VEX_0F3A44 */
6549   {
6550     { Bad_Opcode },
6551     { Bad_Opcode },
6552     { "vpclmulqdq",     { XM, Vex, EXx, PCLMUL }, 0 },
6553   },
6554
6555   /* PREFIX_VEX_0F3A46 */
6556   {
6557     { Bad_Opcode },
6558     { Bad_Opcode },
6559     { VEX_LEN_TABLE (VEX_LEN_0F3A46_P_2) },
6560   },
6561
6562   /* PREFIX_VEX_0F3A48 */
6563   {
6564     { Bad_Opcode },
6565     { Bad_Opcode },
6566     { VEX_W_TABLE (VEX_W_0F3A48_P_2) },
6567   },
6568
6569   /* PREFIX_VEX_0F3A49 */
6570   {
6571     { Bad_Opcode },
6572     { Bad_Opcode },
6573     { VEX_W_TABLE (VEX_W_0F3A49_P_2) },
6574   },
6575
6576   /* PREFIX_VEX_0F3A4A */
6577   {
6578     { Bad_Opcode },
6579     { Bad_Opcode },
6580     { VEX_W_TABLE (VEX_W_0F3A4A_P_2) },
6581   },
6582
6583   /* PREFIX_VEX_0F3A4B */
6584   {
6585     { Bad_Opcode },
6586     { Bad_Opcode },
6587     { VEX_W_TABLE (VEX_W_0F3A4B_P_2) },
6588   },
6589
6590   /* PREFIX_VEX_0F3A4C */
6591   {
6592     { Bad_Opcode },
6593     { Bad_Opcode },
6594     { VEX_W_TABLE (VEX_W_0F3A4C_P_2) },
6595   },
6596
6597   /* PREFIX_VEX_0F3A5C */
6598   {
6599     { Bad_Opcode },
6600     { Bad_Opcode },
6601     { "vfmaddsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6602   },
6603
6604   /* PREFIX_VEX_0F3A5D */
6605   {
6606     { Bad_Opcode },
6607     { Bad_Opcode },
6608     { "vfmaddsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6609   },
6610
6611   /* PREFIX_VEX_0F3A5E */
6612   {
6613     { Bad_Opcode },
6614     { Bad_Opcode },
6615     { "vfmsubaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6616   },
6617
6618   /* PREFIX_VEX_0F3A5F */
6619   {
6620     { Bad_Opcode },
6621     { Bad_Opcode },
6622     { "vfmsubaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6623   },
6624
6625   /* PREFIX_VEX_0F3A60 */
6626   {
6627     { Bad_Opcode },
6628     { Bad_Opcode },
6629     { VEX_LEN_TABLE (VEX_LEN_0F3A60_P_2) },
6630     { Bad_Opcode },
6631   },
6632
6633   /* PREFIX_VEX_0F3A61 */
6634   {
6635     { Bad_Opcode },
6636     { Bad_Opcode },
6637     { VEX_LEN_TABLE (VEX_LEN_0F3A61_P_2) },
6638   },
6639
6640   /* PREFIX_VEX_0F3A62 */
6641   {
6642     { Bad_Opcode },
6643     { Bad_Opcode },
6644     { VEX_LEN_TABLE (VEX_LEN_0F3A62_P_2) },
6645   },
6646
6647   /* PREFIX_VEX_0F3A63 */
6648   {
6649     { Bad_Opcode },
6650     { Bad_Opcode },
6651     { VEX_LEN_TABLE (VEX_LEN_0F3A63_P_2) },
6652   },
6653
6654   /* PREFIX_VEX_0F3A68 */
6655   {
6656     { Bad_Opcode },
6657     { Bad_Opcode },
6658     { "vfmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6659   },
6660
6661   /* PREFIX_VEX_0F3A69 */
6662   {
6663     { Bad_Opcode },
6664     { Bad_Opcode },
6665     { "vfmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6666   },
6667
6668   /* PREFIX_VEX_0F3A6A */
6669   {
6670     { Bad_Opcode },
6671     { Bad_Opcode },
6672     { VEX_LEN_TABLE (VEX_LEN_0F3A6A_P_2) },
6673   },
6674
6675   /* PREFIX_VEX_0F3A6B */
6676   {
6677     { Bad_Opcode },
6678     { Bad_Opcode },
6679     { VEX_LEN_TABLE (VEX_LEN_0F3A6B_P_2) },
6680   },
6681
6682   /* PREFIX_VEX_0F3A6C */
6683   {
6684     { Bad_Opcode },
6685     { Bad_Opcode },
6686     { "vfmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6687   },
6688
6689   /* PREFIX_VEX_0F3A6D */
6690   {
6691     { Bad_Opcode },
6692     { Bad_Opcode },
6693     { "vfmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6694   },
6695
6696   /* PREFIX_VEX_0F3A6E */
6697   {
6698     { Bad_Opcode },
6699     { Bad_Opcode },
6700     { VEX_LEN_TABLE (VEX_LEN_0F3A6E_P_2) },
6701   },
6702
6703   /* PREFIX_VEX_0F3A6F */
6704   {
6705     { Bad_Opcode },
6706     { Bad_Opcode },
6707     { VEX_LEN_TABLE (VEX_LEN_0F3A6F_P_2) },
6708   },
6709
6710   /* PREFIX_VEX_0F3A78 */
6711   {
6712     { Bad_Opcode },
6713     { Bad_Opcode },
6714     { "vfnmaddps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6715   },
6716
6717   /* PREFIX_VEX_0F3A79 */
6718   {
6719     { Bad_Opcode },
6720     { Bad_Opcode },
6721     { "vfnmaddpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6722   },
6723
6724   /* PREFIX_VEX_0F3A7A */
6725   {
6726     { Bad_Opcode },
6727     { Bad_Opcode },
6728     { VEX_LEN_TABLE (VEX_LEN_0F3A7A_P_2) },
6729   },
6730
6731   /* PREFIX_VEX_0F3A7B */
6732   {
6733     { Bad_Opcode },
6734     { Bad_Opcode },
6735     { VEX_LEN_TABLE (VEX_LEN_0F3A7B_P_2) },
6736   },
6737
6738   /* PREFIX_VEX_0F3A7C */
6739   {
6740     { Bad_Opcode },
6741     { Bad_Opcode },
6742     { "vfnmsubps", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6743     { Bad_Opcode },
6744   },
6745
6746   /* PREFIX_VEX_0F3A7D */
6747   {
6748     { Bad_Opcode },
6749     { Bad_Opcode },
6750     { "vfnmsubpd", { XMVexW, Vex, EXVexW, EXVexW }, 0 },
6751   },
6752
6753   /* PREFIX_VEX_0F3A7E */
6754   {
6755     { Bad_Opcode },
6756     { Bad_Opcode },
6757     { VEX_LEN_TABLE (VEX_LEN_0F3A7E_P_2) },
6758   },
6759
6760   /* PREFIX_VEX_0F3A7F */
6761   {
6762     { Bad_Opcode },
6763     { Bad_Opcode },
6764     { VEX_LEN_TABLE (VEX_LEN_0F3A7F_P_2) },
6765   },
6766
6767   /* PREFIX_VEX_0F3ACE */
6768   {
6769     { Bad_Opcode },
6770     { Bad_Opcode },
6771     { VEX_W_TABLE (VEX_W_0F3ACE_P_2) },
6772   },
6773
6774   /* PREFIX_VEX_0F3ACF */
6775   {
6776     { Bad_Opcode },
6777     { Bad_Opcode },
6778     { VEX_W_TABLE (VEX_W_0F3ACF_P_2) },
6779   },
6780
6781   /* PREFIX_VEX_0F3ADF */
6782   {
6783     { Bad_Opcode },
6784     { Bad_Opcode },
6785     { VEX_LEN_TABLE (VEX_LEN_0F3ADF_P_2) },
6786   },
6787
6788   /* PREFIX_VEX_0F3AF0 */
6789   {
6790     { Bad_Opcode },
6791     { Bad_Opcode },
6792     { Bad_Opcode },
6793     { VEX_LEN_TABLE (VEX_LEN_0F3AF0_P_3) },
6794   },
6795
6796 #define NEED_PREFIX_TABLE
6797 #include "i386-dis-evex.h"
6798 #undef NEED_PREFIX_TABLE
6799 };
6800
6801 static const struct dis386 x86_64_table[][2] = {
6802   /* X86_64_06 */
6803   {
6804     { "pushP", { es }, 0 },
6805   },
6806
6807   /* X86_64_07 */
6808   {
6809     { "popP", { es }, 0 },
6810   },
6811
6812   /* X86_64_0D */
6813   {
6814     { "pushP", { cs }, 0 },
6815   },
6816
6817   /* X86_64_16 */
6818   {
6819     { "pushP", { ss }, 0 },
6820   },
6821
6822   /* X86_64_17 */
6823   {
6824     { "popP", { ss }, 0 },
6825   },
6826
6827   /* X86_64_1E */
6828   {
6829     { "pushP", { ds }, 0 },
6830   },
6831
6832   /* X86_64_1F */
6833   {
6834     { "popP", { ds }, 0 },
6835   },
6836
6837   /* X86_64_27 */
6838   {
6839     { "daa", { XX }, 0 },
6840   },
6841
6842   /* X86_64_2F */
6843   {
6844     { "das", { XX }, 0 },
6845   },
6846
6847   /* X86_64_37 */
6848   {
6849     { "aaa", { XX }, 0 },
6850   },
6851
6852   /* X86_64_3F */
6853   {
6854     { "aas", { XX }, 0 },
6855   },
6856
6857   /* X86_64_60 */
6858   {
6859     { "pushaP", { XX }, 0 },
6860   },
6861
6862   /* X86_64_61 */
6863   {
6864     { "popaP", { XX }, 0 },
6865   },
6866
6867   /* X86_64_62 */
6868   {
6869     { MOD_TABLE (MOD_62_32BIT) },
6870     { EVEX_TABLE (EVEX_0F) },
6871   },
6872
6873   /* X86_64_63 */
6874   {
6875     { "arpl", { Ew, Gw }, 0 },
6876     { "movs{lq|xd}", { Gv, Ed }, 0 },
6877   },
6878
6879   /* X86_64_6D */
6880   {
6881     { "ins{R|}", { Yzr, indirDX }, 0 },
6882     { "ins{G|}", { Yzr, indirDX }, 0 },
6883   },
6884
6885   /* X86_64_6F */
6886   {
6887     { "outs{R|}", { indirDXr, Xz }, 0 },
6888     { "outs{G|}", { indirDXr, Xz }, 0 },
6889   },
6890
6891   /* X86_64_82 */
6892   {
6893     /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode.  */
6894     { REG_TABLE (REG_80) },
6895   },
6896
6897   /* X86_64_9A */
6898   {
6899     { "Jcall{T|}", { Ap }, 0 },
6900   },
6901
6902   /* X86_64_C4 */
6903   {
6904     { MOD_TABLE (MOD_C4_32BIT) },
6905     { VEX_C4_TABLE (VEX_0F) },
6906   },
6907
6908   /* X86_64_C5 */
6909   {
6910     { MOD_TABLE (MOD_C5_32BIT) },
6911     { VEX_C5_TABLE (VEX_0F) },
6912   },
6913
6914   /* X86_64_CE */
6915   {
6916     { "into", { XX }, 0 },
6917   },
6918
6919   /* X86_64_D4 */
6920   {
6921     { "aam", { Ib }, 0 },
6922   },
6923
6924   /* X86_64_D5 */
6925   {
6926     { "aad", { Ib }, 0 },
6927   },
6928
6929   /* X86_64_E8 */
6930   {
6931     { "callP",          { Jv, BND }, 0 },
6932     { "call@",          { Jv, BND }, 0 }
6933   },
6934
6935   /* X86_64_E9 */
6936   {
6937     { "jmpP",           { Jv, BND }, 0 },
6938     { "jmp@",           { Jv, BND }, 0 }
6939   },
6940
6941   /* X86_64_EA */
6942   {
6943     { "Jjmp{T|}", { Ap }, 0 },
6944   },
6945
6946   /* X86_64_0F01_REG_0 */
6947   {
6948     { "sgdt{Q|IQ}", { M }, 0 },
6949     { "sgdt", { M }, 0 },
6950   },
6951
6952   /* X86_64_0F01_REG_1 */
6953   {
6954     { "sidt{Q|IQ}", { M }, 0 },
6955     { "sidt", { M }, 0 },
6956   },
6957
6958   /* X86_64_0F01_REG_2 */
6959   {
6960     { "lgdt{Q|Q}", { M }, 0 },
6961     { "lgdt", { M }, 0 },
6962   },
6963
6964   /* X86_64_0F01_REG_3 */
6965   {
6966     { "lidt{Q|Q}", { M }, 0 },
6967     { "lidt", { M }, 0 },
6968   },
6969 };
6970
6971 static const struct dis386 three_byte_table[][256] = {
6972
6973   /* THREE_BYTE_0F38 */
6974   {
6975     /* 00 */
6976     { "pshufb",         { MX, EM }, PREFIX_OPCODE },
6977     { "phaddw",         { MX, EM }, PREFIX_OPCODE },
6978     { "phaddd",         { MX, EM }, PREFIX_OPCODE },
6979     { "phaddsw",        { MX, EM }, PREFIX_OPCODE },
6980     { "pmaddubsw",      { MX, EM }, PREFIX_OPCODE },
6981     { "phsubw",         { MX, EM }, PREFIX_OPCODE },
6982     { "phsubd",         { MX, EM }, PREFIX_OPCODE },
6983     { "phsubsw",        { MX, EM }, PREFIX_OPCODE },
6984     /* 08 */
6985     { "psignb",         { MX, EM }, PREFIX_OPCODE },
6986     { "psignw",         { MX, EM }, PREFIX_OPCODE },
6987     { "psignd",         { MX, EM }, PREFIX_OPCODE },
6988     { "pmulhrsw",       { MX, EM }, PREFIX_OPCODE },
6989     { Bad_Opcode },
6990     { Bad_Opcode },
6991     { Bad_Opcode },
6992     { Bad_Opcode },
6993     /* 10 */
6994     { PREFIX_TABLE (PREFIX_0F3810) },
6995     { Bad_Opcode },
6996     { Bad_Opcode },
6997     { Bad_Opcode },
6998     { PREFIX_TABLE (PREFIX_0F3814) },
6999     { PREFIX_TABLE (PREFIX_0F3815) },
7000     { Bad_Opcode },
7001     { PREFIX_TABLE (PREFIX_0F3817) },
7002     /* 18 */
7003     { Bad_Opcode },
7004     { Bad_Opcode },
7005     { Bad_Opcode },
7006     { Bad_Opcode },
7007     { "pabsb",          { MX, EM }, PREFIX_OPCODE },
7008     { "pabsw",          { MX, EM }, PREFIX_OPCODE },
7009     { "pabsd",          { MX, EM }, PREFIX_OPCODE },
7010     { Bad_Opcode },
7011     /* 20 */
7012     { PREFIX_TABLE (PREFIX_0F3820) },
7013     { PREFIX_TABLE (PREFIX_0F3821) },
7014     { PREFIX_TABLE (PREFIX_0F3822) },
7015     { PREFIX_TABLE (PREFIX_0F3823) },
7016     { PREFIX_TABLE (PREFIX_0F3824) },
7017     { PREFIX_TABLE (PREFIX_0F3825) },
7018     { Bad_Opcode },
7019     { Bad_Opcode },
7020     /* 28 */
7021     { PREFIX_TABLE (PREFIX_0F3828) },
7022     { PREFIX_TABLE (PREFIX_0F3829) },
7023     { PREFIX_TABLE (PREFIX_0F382A) },
7024     { PREFIX_TABLE (PREFIX_0F382B) },
7025     { Bad_Opcode },
7026     { Bad_Opcode },
7027     { Bad_Opcode },
7028     { Bad_Opcode },
7029     /* 30 */
7030     { PREFIX_TABLE (PREFIX_0F3830) },
7031     { PREFIX_TABLE (PREFIX_0F3831) },
7032     { PREFIX_TABLE (PREFIX_0F3832) },
7033     { PREFIX_TABLE (PREFIX_0F3833) },
7034     { PREFIX_TABLE (PREFIX_0F3834) },
7035     { PREFIX_TABLE (PREFIX_0F3835) },
7036     { Bad_Opcode },
7037     { PREFIX_TABLE (PREFIX_0F3837) },
7038     /* 38 */
7039     { PREFIX_TABLE (PREFIX_0F3838) },
7040     { PREFIX_TABLE (PREFIX_0F3839) },
7041     { PREFIX_TABLE (PREFIX_0F383A) },
7042     { PREFIX_TABLE (PREFIX_0F383B) },
7043     { PREFIX_TABLE (PREFIX_0F383C) },
7044     { PREFIX_TABLE (PREFIX_0F383D) },
7045     { PREFIX_TABLE (PREFIX_0F383E) },
7046     { PREFIX_TABLE (PREFIX_0F383F) },
7047     /* 40 */
7048     { PREFIX_TABLE (PREFIX_0F3840) },
7049     { PREFIX_TABLE (PREFIX_0F3841) },
7050     { Bad_Opcode },
7051     { Bad_Opcode },
7052     { Bad_Opcode },
7053     { Bad_Opcode },
7054     { Bad_Opcode },
7055     { Bad_Opcode },
7056     /* 48 */
7057     { Bad_Opcode },
7058     { Bad_Opcode },
7059     { Bad_Opcode },
7060     { Bad_Opcode },
7061     { Bad_Opcode },
7062     { Bad_Opcode },
7063     { Bad_Opcode },
7064     { Bad_Opcode },
7065     /* 50 */
7066     { Bad_Opcode },
7067     { Bad_Opcode },
7068     { Bad_Opcode },
7069     { Bad_Opcode },
7070     { Bad_Opcode },
7071     { Bad_Opcode },
7072     { Bad_Opcode },
7073     { Bad_Opcode },
7074     /* 58 */
7075     { Bad_Opcode },
7076     { Bad_Opcode },
7077     { Bad_Opcode },
7078     { Bad_Opcode },
7079     { Bad_Opcode },
7080     { Bad_Opcode },
7081     { Bad_Opcode },
7082     { Bad_Opcode },
7083     /* 60 */
7084     { Bad_Opcode },
7085     { Bad_Opcode },
7086     { Bad_Opcode },
7087     { Bad_Opcode },
7088     { Bad_Opcode },
7089     { Bad_Opcode },
7090     { Bad_Opcode },
7091     { Bad_Opcode },
7092     /* 68 */
7093     { Bad_Opcode },
7094     { Bad_Opcode },
7095     { Bad_Opcode },
7096     { Bad_Opcode },
7097     { Bad_Opcode },
7098     { Bad_Opcode },
7099     { Bad_Opcode },
7100     { Bad_Opcode },
7101     /* 70 */
7102     { Bad_Opcode },
7103     { Bad_Opcode },
7104     { Bad_Opcode },
7105     { Bad_Opcode },
7106     { Bad_Opcode },
7107     { Bad_Opcode },
7108     { Bad_Opcode },
7109     { Bad_Opcode },
7110     /* 78 */
7111     { Bad_Opcode },
7112     { Bad_Opcode },
7113     { Bad_Opcode },
7114     { Bad_Opcode },
7115     { Bad_Opcode },
7116     { Bad_Opcode },
7117     { Bad_Opcode },
7118     { Bad_Opcode },
7119     /* 80 */
7120     { PREFIX_TABLE (PREFIX_0F3880) },
7121     { PREFIX_TABLE (PREFIX_0F3881) },
7122     { PREFIX_TABLE (PREFIX_0F3882) },
7123     { Bad_Opcode },
7124     { Bad_Opcode },
7125     { Bad_Opcode },
7126     { Bad_Opcode },
7127     { Bad_Opcode },
7128     /* 88 */
7129     { Bad_Opcode },
7130     { Bad_Opcode },
7131     { Bad_Opcode },
7132     { Bad_Opcode },
7133     { Bad_Opcode },
7134     { Bad_Opcode },
7135     { Bad_Opcode },
7136     { Bad_Opcode },
7137     /* 90 */
7138     { Bad_Opcode },
7139     { Bad_Opcode },
7140     { Bad_Opcode },
7141     { Bad_Opcode },
7142     { Bad_Opcode },
7143     { Bad_Opcode },
7144     { Bad_Opcode },
7145     { Bad_Opcode },
7146     /* 98 */
7147     { Bad_Opcode },
7148     { Bad_Opcode },
7149     { Bad_Opcode },
7150     { Bad_Opcode },
7151     { Bad_Opcode },
7152     { Bad_Opcode },
7153     { Bad_Opcode },
7154     { Bad_Opcode },
7155     /* a0 */
7156     { Bad_Opcode },
7157     { Bad_Opcode },
7158     { Bad_Opcode },
7159     { Bad_Opcode },
7160     { Bad_Opcode },
7161     { Bad_Opcode },
7162     { Bad_Opcode },
7163     { Bad_Opcode },
7164     /* a8 */
7165     { Bad_Opcode },
7166     { Bad_Opcode },
7167     { Bad_Opcode },
7168     { Bad_Opcode },
7169     { Bad_Opcode },
7170     { Bad_Opcode },
7171     { Bad_Opcode },
7172     { Bad_Opcode },
7173     /* b0 */
7174     { Bad_Opcode },
7175     { Bad_Opcode },
7176     { Bad_Opcode },
7177     { Bad_Opcode },
7178     { Bad_Opcode },
7179     { Bad_Opcode },
7180     { Bad_Opcode },
7181     { Bad_Opcode },
7182     /* b8 */
7183     { Bad_Opcode },
7184     { Bad_Opcode },
7185     { Bad_Opcode },
7186     { Bad_Opcode },
7187     { Bad_Opcode },
7188     { Bad_Opcode },
7189     { Bad_Opcode },
7190     { Bad_Opcode },
7191     /* c0 */
7192     { Bad_Opcode },
7193     { Bad_Opcode },
7194     { Bad_Opcode },
7195     { Bad_Opcode },
7196     { Bad_Opcode },
7197     { Bad_Opcode },
7198     { Bad_Opcode },
7199     { Bad_Opcode },
7200     /* c8 */
7201     { PREFIX_TABLE (PREFIX_0F38C8) },
7202     { PREFIX_TABLE (PREFIX_0F38C9) },
7203     { PREFIX_TABLE (PREFIX_0F38CA) },
7204     { PREFIX_TABLE (PREFIX_0F38CB) },
7205     { PREFIX_TABLE (PREFIX_0F38CC) },
7206     { PREFIX_TABLE (PREFIX_0F38CD) },
7207     { Bad_Opcode },
7208     { PREFIX_TABLE (PREFIX_0F38CF) },
7209     /* d0 */
7210     { Bad_Opcode },
7211     { Bad_Opcode },
7212     { Bad_Opcode },
7213     { Bad_Opcode },
7214     { Bad_Opcode },
7215     { Bad_Opcode },
7216     { Bad_Opcode },
7217     { Bad_Opcode },
7218     /* d8 */
7219     { Bad_Opcode },
7220     { Bad_Opcode },
7221     { Bad_Opcode },
7222     { PREFIX_TABLE (PREFIX_0F38DB) },
7223     { PREFIX_TABLE (PREFIX_0F38DC) },
7224     { PREFIX_TABLE (PREFIX_0F38DD) },
7225     { PREFIX_TABLE (PREFIX_0F38DE) },
7226     { PREFIX_TABLE (PREFIX_0F38DF) },
7227     /* e0 */
7228     { Bad_Opcode },
7229     { Bad_Opcode },
7230     { Bad_Opcode },
7231     { Bad_Opcode },
7232     { Bad_Opcode },
7233     { Bad_Opcode },
7234     { Bad_Opcode },
7235     { Bad_Opcode },
7236     /* e8 */
7237     { Bad_Opcode },
7238     { Bad_Opcode },
7239     { Bad_Opcode },
7240     { Bad_Opcode },
7241     { Bad_Opcode },
7242     { Bad_Opcode },
7243     { Bad_Opcode },
7244     { Bad_Opcode },
7245     /* f0 */
7246     { PREFIX_TABLE (PREFIX_0F38F0) },
7247     { PREFIX_TABLE (PREFIX_0F38F1) },
7248     { Bad_Opcode },
7249     { Bad_Opcode },
7250     { Bad_Opcode },
7251     { PREFIX_TABLE (PREFIX_0F38F5) },
7252     { PREFIX_TABLE (PREFIX_0F38F6) },
7253     { Bad_Opcode },
7254     /* f8 */
7255     { PREFIX_TABLE (PREFIX_0F38F8) },
7256     { PREFIX_TABLE (PREFIX_0F38F9) },
7257     { Bad_Opcode },
7258     { Bad_Opcode },
7259     { Bad_Opcode },
7260     { Bad_Opcode },
7261     { Bad_Opcode },
7262     { Bad_Opcode },
7263   },
7264   /* THREE_BYTE_0F3A */
7265   {
7266     /* 00 */
7267     { Bad_Opcode },
7268     { Bad_Opcode },
7269     { Bad_Opcode },
7270     { Bad_Opcode },
7271     { Bad_Opcode },
7272     { Bad_Opcode },
7273     { Bad_Opcode },
7274     { Bad_Opcode },
7275     /* 08 */
7276     { PREFIX_TABLE (PREFIX_0F3A08) },
7277     { PREFIX_TABLE (PREFIX_0F3A09) },
7278     { PREFIX_TABLE (PREFIX_0F3A0A) },
7279     { PREFIX_TABLE (PREFIX_0F3A0B) },
7280     { PREFIX_TABLE (PREFIX_0F3A0C) },
7281     { PREFIX_TABLE (PREFIX_0F3A0D) },
7282     { PREFIX_TABLE (PREFIX_0F3A0E) },
7283     { "palignr",        { MX, EM, Ib }, PREFIX_OPCODE },
7284     /* 10 */
7285     { Bad_Opcode },
7286     { Bad_Opcode },
7287     { Bad_Opcode },
7288     { Bad_Opcode },
7289     { PREFIX_TABLE (PREFIX_0F3A14) },
7290     { PREFIX_TABLE (PREFIX_0F3A15) },
7291     { PREFIX_TABLE (PREFIX_0F3A16) },
7292     { PREFIX_TABLE (PREFIX_0F3A17) },
7293     /* 18 */
7294     { Bad_Opcode },
7295     { Bad_Opcode },
7296     { Bad_Opcode },
7297     { Bad_Opcode },
7298     { Bad_Opcode },
7299     { Bad_Opcode },
7300     { Bad_Opcode },
7301     { Bad_Opcode },
7302     /* 20 */
7303     { PREFIX_TABLE (PREFIX_0F3A20) },
7304     { PREFIX_TABLE (PREFIX_0F3A21) },
7305     { PREFIX_TABLE (PREFIX_0F3A22) },
7306     { Bad_Opcode },
7307     { Bad_Opcode },
7308     { Bad_Opcode },
7309     { Bad_Opcode },
7310     { Bad_Opcode },
7311     /* 28 */
7312     { Bad_Opcode },
7313     { Bad_Opcode },
7314     { Bad_Opcode },
7315     { Bad_Opcode },
7316     { Bad_Opcode },
7317     { Bad_Opcode },
7318     { Bad_Opcode },
7319     { Bad_Opcode },
7320     /* 30 */
7321     { Bad_Opcode },
7322     { Bad_Opcode },
7323     { Bad_Opcode },
7324     { Bad_Opcode },
7325     { Bad_Opcode },
7326     { Bad_Opcode },
7327     { Bad_Opcode },
7328     { Bad_Opcode },
7329     /* 38 */
7330     { Bad_Opcode },
7331     { Bad_Opcode },
7332     { Bad_Opcode },
7333     { Bad_Opcode },
7334     { Bad_Opcode },
7335     { Bad_Opcode },
7336     { Bad_Opcode },
7337     { Bad_Opcode },
7338     /* 40 */
7339     { PREFIX_TABLE (PREFIX_0F3A40) },
7340     { PREFIX_TABLE (PREFIX_0F3A41) },
7341     { PREFIX_TABLE (PREFIX_0F3A42) },
7342     { Bad_Opcode },
7343     { PREFIX_TABLE (PREFIX_0F3A44) },
7344     { Bad_Opcode },
7345     { Bad_Opcode },
7346     { Bad_Opcode },
7347     /* 48 */
7348     { Bad_Opcode },
7349     { Bad_Opcode },
7350     { Bad_Opcode },
7351     { Bad_Opcode },
7352     { Bad_Opcode },
7353     { Bad_Opcode },
7354     { Bad_Opcode },
7355     { Bad_Opcode },
7356     /* 50 */
7357     { Bad_Opcode },
7358     { Bad_Opcode },
7359     { Bad_Opcode },
7360     { Bad_Opcode },
7361     { Bad_Opcode },
7362     { Bad_Opcode },
7363     { Bad_Opcode },
7364     { Bad_Opcode },
7365     /* 58 */
7366     { Bad_Opcode },
7367     { Bad_Opcode },
7368     { Bad_Opcode },
7369     { Bad_Opcode },
7370     { Bad_Opcode },
7371     { Bad_Opcode },
7372     { Bad_Opcode },
7373     { Bad_Opcode },
7374     /* 60 */
7375     { PREFIX_TABLE (PREFIX_0F3A60) },
7376     { PREFIX_TABLE (PREFIX_0F3A61) },
7377     { PREFIX_TABLE (PREFIX_0F3A62) },
7378     { PREFIX_TABLE (PREFIX_0F3A63) },
7379     { Bad_Opcode },
7380     { Bad_Opcode },
7381     { Bad_Opcode },
7382     { Bad_Opcode },
7383     /* 68 */
7384     { Bad_Opcode },
7385     { Bad_Opcode },
7386     { Bad_Opcode },
7387     { Bad_Opcode },
7388     { Bad_Opcode },
7389     { Bad_Opcode },
7390     { Bad_Opcode },
7391     { Bad_Opcode },
7392     /* 70 */
7393     { Bad_Opcode },
7394     { Bad_Opcode },
7395     { Bad_Opcode },
7396     { Bad_Opcode },
7397     { Bad_Opcode },
7398     { Bad_Opcode },
7399     { Bad_Opcode },
7400     { Bad_Opcode },
7401     /* 78 */
7402     { Bad_Opcode },
7403     { Bad_Opcode },
7404     { Bad_Opcode },
7405     { Bad_Opcode },
7406     { Bad_Opcode },
7407     { Bad_Opcode },
7408     { Bad_Opcode },
7409     { Bad_Opcode },
7410     /* 80 */
7411     { Bad_Opcode },
7412     { Bad_Opcode },
7413     { Bad_Opcode },
7414     { Bad_Opcode },
7415     { Bad_Opcode },
7416     { Bad_Opcode },
7417     { Bad_Opcode },
7418     { Bad_Opcode },
7419     /* 88 */
7420     { Bad_Opcode },
7421     { Bad_Opcode },
7422     { Bad_Opcode },
7423     { Bad_Opcode },
7424     { Bad_Opcode },
7425     { Bad_Opcode },
7426     { Bad_Opcode },
7427     { Bad_Opcode },
7428     /* 90 */
7429     { Bad_Opcode },
7430     { Bad_Opcode },
7431     { Bad_Opcode },
7432     { Bad_Opcode },
7433     { Bad_Opcode },
7434     { Bad_Opcode },
7435     { Bad_Opcode },
7436     { Bad_Opcode },
7437     /* 98 */
7438     { Bad_Opcode },
7439     { Bad_Opcode },
7440     { Bad_Opcode },
7441     { Bad_Opcode },
7442     { Bad_Opcode },
7443     { Bad_Opcode },
7444     { Bad_Opcode },
7445     { Bad_Opcode },
7446     /* a0 */
7447     { Bad_Opcode },
7448     { Bad_Opcode },
7449     { Bad_Opcode },
7450     { Bad_Opcode },
7451     { Bad_Opcode },
7452     { Bad_Opcode },
7453     { Bad_Opcode },
7454     { Bad_Opcode },
7455     /* a8 */
7456     { Bad_Opcode },
7457     { Bad_Opcode },
7458     { Bad_Opcode },
7459     { Bad_Opcode },
7460     { Bad_Opcode },
7461     { Bad_Opcode },
7462     { Bad_Opcode },
7463     { Bad_Opcode },
7464     /* b0 */
7465     { Bad_Opcode },
7466     { Bad_Opcode },
7467     { Bad_Opcode },
7468     { Bad_Opcode },
7469     { Bad_Opcode },
7470     { Bad_Opcode },
7471     { Bad_Opcode },
7472     { Bad_Opcode },
7473     /* b8 */
7474     { Bad_Opcode },
7475     { Bad_Opcode },
7476     { Bad_Opcode },
7477     { Bad_Opcode },
7478     { Bad_Opcode },
7479     { Bad_Opcode },
7480     { Bad_Opcode },
7481     { Bad_Opcode },
7482     /* c0 */
7483     { Bad_Opcode },
7484     { Bad_Opcode },
7485     { Bad_Opcode },
7486     { Bad_Opcode },
7487     { Bad_Opcode },
7488     { Bad_Opcode },
7489     { Bad_Opcode },
7490     { Bad_Opcode },
7491     /* c8 */
7492     { Bad_Opcode },
7493     { Bad_Opcode },
7494     { Bad_Opcode },
7495     { Bad_Opcode },
7496     { PREFIX_TABLE (PREFIX_0F3ACC) },
7497     { Bad_Opcode },
7498     { PREFIX_TABLE (PREFIX_0F3ACE) },
7499     { PREFIX_TABLE (PREFIX_0F3ACF) },
7500     /* d0 */
7501     { Bad_Opcode },
7502     { Bad_Opcode },
7503     { Bad_Opcode },
7504     { Bad_Opcode },
7505     { Bad_Opcode },
7506     { Bad_Opcode },
7507     { Bad_Opcode },
7508     { Bad_Opcode },
7509     /* d8 */
7510     { Bad_Opcode },
7511     { Bad_Opcode },
7512     { Bad_Opcode },
7513     { Bad_Opcode },
7514     { Bad_Opcode },
7515     { Bad_Opcode },
7516     { Bad_Opcode },
7517     { PREFIX_TABLE (PREFIX_0F3ADF) },
7518     /* e0 */
7519     { Bad_Opcode },
7520     { Bad_Opcode },
7521     { Bad_Opcode },
7522     { Bad_Opcode },
7523     { Bad_Opcode },
7524     { Bad_Opcode },
7525     { Bad_Opcode },
7526     { Bad_Opcode },
7527     /* e8 */
7528     { Bad_Opcode },
7529     { Bad_Opcode },
7530     { Bad_Opcode },
7531     { Bad_Opcode },
7532     { Bad_Opcode },
7533     { Bad_Opcode },
7534     { Bad_Opcode },
7535     { Bad_Opcode },
7536     /* f0 */
7537     { Bad_Opcode },
7538     { Bad_Opcode },
7539     { Bad_Opcode },
7540     { Bad_Opcode },
7541     { Bad_Opcode },
7542     { Bad_Opcode },
7543     { Bad_Opcode },
7544     { Bad_Opcode },
7545     /* f8 */
7546     { Bad_Opcode },
7547     { Bad_Opcode },
7548     { Bad_Opcode },
7549     { Bad_Opcode },
7550     { Bad_Opcode },
7551     { Bad_Opcode },
7552     { Bad_Opcode },
7553     { Bad_Opcode },
7554   },
7555 };
7556
7557 static const struct dis386 xop_table[][256] = {
7558   /* XOP_08 */
7559   {
7560     /* 00 */
7561     { Bad_Opcode },
7562     { Bad_Opcode },
7563     { Bad_Opcode },
7564     { Bad_Opcode },
7565     { Bad_Opcode },
7566     { Bad_Opcode },
7567     { Bad_Opcode },
7568     { Bad_Opcode },
7569     /* 08 */
7570     { Bad_Opcode },
7571     { Bad_Opcode },
7572     { Bad_Opcode },
7573     { Bad_Opcode },
7574     { Bad_Opcode },
7575     { Bad_Opcode },
7576     { Bad_Opcode },
7577     { Bad_Opcode },
7578     /* 10 */
7579     { Bad_Opcode },
7580     { Bad_Opcode },
7581     { Bad_Opcode },
7582     { Bad_Opcode },
7583     { Bad_Opcode },
7584     { Bad_Opcode },
7585     { Bad_Opcode },
7586     { Bad_Opcode },
7587     /* 18 */
7588     { Bad_Opcode },
7589     { Bad_Opcode },
7590     { Bad_Opcode },
7591     { Bad_Opcode },
7592     { Bad_Opcode },
7593     { Bad_Opcode },
7594     { Bad_Opcode },
7595     { Bad_Opcode },
7596     /* 20 */
7597     { Bad_Opcode },
7598     { Bad_Opcode },
7599     { Bad_Opcode },
7600     { Bad_Opcode },
7601     { Bad_Opcode },
7602     { Bad_Opcode },
7603     { Bad_Opcode },
7604     { Bad_Opcode },
7605     /* 28 */
7606     { Bad_Opcode },
7607     { Bad_Opcode },
7608     { Bad_Opcode },
7609     { Bad_Opcode },
7610     { Bad_Opcode },
7611     { Bad_Opcode },
7612     { Bad_Opcode },
7613     { Bad_Opcode },
7614     /* 30 */
7615     { Bad_Opcode },
7616     { Bad_Opcode },
7617     { Bad_Opcode },
7618     { Bad_Opcode },
7619     { Bad_Opcode },
7620     { Bad_Opcode },
7621     { Bad_Opcode },
7622     { Bad_Opcode },
7623     /* 38 */
7624     { Bad_Opcode },
7625     { Bad_Opcode },
7626     { Bad_Opcode },
7627     { Bad_Opcode },
7628     { Bad_Opcode },
7629     { Bad_Opcode },
7630     { Bad_Opcode },
7631     { Bad_Opcode },
7632     /* 40 */
7633     { Bad_Opcode },
7634     { Bad_Opcode },
7635     { Bad_Opcode },
7636     { Bad_Opcode },
7637     { Bad_Opcode },
7638     { Bad_Opcode },
7639     { Bad_Opcode },
7640     { Bad_Opcode },
7641     /* 48 */
7642     { Bad_Opcode },
7643     { Bad_Opcode },
7644     { Bad_Opcode },
7645     { Bad_Opcode },
7646     { Bad_Opcode },
7647     { Bad_Opcode },
7648     { Bad_Opcode },
7649     { Bad_Opcode },
7650     /* 50 */
7651     { Bad_Opcode },
7652     { Bad_Opcode },
7653     { Bad_Opcode },
7654     { Bad_Opcode },
7655     { Bad_Opcode },
7656     { Bad_Opcode },
7657     { Bad_Opcode },
7658     { Bad_Opcode },
7659     /* 58 */
7660     { Bad_Opcode },
7661     { Bad_Opcode },
7662     { Bad_Opcode },
7663     { Bad_Opcode },
7664     { Bad_Opcode },
7665     { Bad_Opcode },
7666     { Bad_Opcode },
7667     { Bad_Opcode },
7668     /* 60 */
7669     { Bad_Opcode },
7670     { Bad_Opcode },
7671     { Bad_Opcode },
7672     { Bad_Opcode },
7673     { Bad_Opcode },
7674     { Bad_Opcode },
7675     { Bad_Opcode },
7676     { Bad_Opcode },
7677     /* 68 */
7678     { Bad_Opcode },
7679     { Bad_Opcode },
7680     { Bad_Opcode },
7681     { Bad_Opcode },
7682     { Bad_Opcode },
7683     { Bad_Opcode },
7684     { Bad_Opcode },
7685     { Bad_Opcode },
7686     /* 70 */
7687     { Bad_Opcode },
7688     { Bad_Opcode },
7689     { Bad_Opcode },
7690     { Bad_Opcode },
7691     { Bad_Opcode },
7692     { Bad_Opcode },
7693     { Bad_Opcode },
7694     { Bad_Opcode },
7695     /* 78 */
7696     { Bad_Opcode },
7697     { Bad_Opcode },
7698     { Bad_Opcode },
7699     { Bad_Opcode },
7700     { Bad_Opcode },
7701     { Bad_Opcode },
7702     { Bad_Opcode },
7703     { Bad_Opcode },
7704     /* 80 */
7705     { Bad_Opcode },
7706     { Bad_Opcode },
7707     { Bad_Opcode },
7708     { Bad_Opcode },
7709     { Bad_Opcode },
7710     { "vpmacssww",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7711     { "vpmacsswd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7712     { "vpmacssdql",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7713     /* 88 */
7714     { Bad_Opcode },
7715     { Bad_Opcode },
7716     { Bad_Opcode },
7717     { Bad_Opcode },
7718     { Bad_Opcode },
7719     { Bad_Opcode },
7720     { "vpmacssdd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7721     { "vpmacssdqh",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7722     /* 90 */
7723     { Bad_Opcode },
7724     { Bad_Opcode },
7725     { Bad_Opcode },
7726     { Bad_Opcode },
7727     { Bad_Opcode },
7728     { "vpmacsww",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7729     { "vpmacswd",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7730     { "vpmacsdql",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7731     /* 98 */
7732     { Bad_Opcode },
7733     { Bad_Opcode },
7734     { Bad_Opcode },
7735     { Bad_Opcode },
7736     { Bad_Opcode },
7737     { Bad_Opcode },
7738     { "vpmacsdd",       { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7739     { "vpmacsdqh",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7740     /* a0 */
7741     { Bad_Opcode },
7742     { Bad_Opcode },
7743     { "vpcmov",         { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7744     { "vpperm",         { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7745     { Bad_Opcode },
7746     { Bad_Opcode },
7747     { "vpmadcsswd",     { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7748     { Bad_Opcode },
7749     /* a8 */
7750     { Bad_Opcode },
7751     { Bad_Opcode },
7752     { Bad_Opcode },
7753     { Bad_Opcode },
7754     { Bad_Opcode },
7755     { Bad_Opcode },
7756     { Bad_Opcode },
7757     { Bad_Opcode },
7758     /* b0 */
7759     { Bad_Opcode },
7760     { Bad_Opcode },
7761     { Bad_Opcode },
7762     { Bad_Opcode },
7763     { Bad_Opcode },
7764     { Bad_Opcode },
7765     { "vpmadcswd",      { XMVexW, Vex, EXVexW, EXVexW }, 0 },
7766     { Bad_Opcode },
7767     /* b8 */
7768     { Bad_Opcode },
7769     { Bad_Opcode },
7770     { Bad_Opcode },
7771     { Bad_Opcode },
7772     { Bad_Opcode },
7773     { Bad_Opcode },
7774     { Bad_Opcode },
7775     { Bad_Opcode },
7776     /* c0 */
7777     { "vprotb",         { XM, Vex_2src_1, Ib }, 0 },
7778     { "vprotw",         { XM, Vex_2src_1, Ib }, 0 },
7779     { "vprotd",         { XM, Vex_2src_1, Ib }, 0 },
7780     { "vprotq",         { XM, Vex_2src_1, Ib }, 0 },
7781     { Bad_Opcode },
7782     { Bad_Opcode },
7783     { Bad_Opcode },
7784     { Bad_Opcode },
7785     /* c8 */
7786     { Bad_Opcode },
7787     { Bad_Opcode },
7788     { Bad_Opcode },
7789     { Bad_Opcode },
7790     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
7791     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
7792     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
7793     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
7794     /* d0 */
7795     { Bad_Opcode },
7796     { Bad_Opcode },
7797     { Bad_Opcode },
7798     { Bad_Opcode },
7799     { Bad_Opcode },
7800     { Bad_Opcode },
7801     { Bad_Opcode },
7802     { Bad_Opcode },
7803     /* d8 */
7804     { Bad_Opcode },
7805     { Bad_Opcode },
7806     { Bad_Opcode },
7807     { Bad_Opcode },
7808     { Bad_Opcode },
7809     { Bad_Opcode },
7810     { Bad_Opcode },
7811     { Bad_Opcode },
7812     /* e0 */
7813     { Bad_Opcode },
7814     { Bad_Opcode },
7815     { Bad_Opcode },
7816     { Bad_Opcode },
7817     { Bad_Opcode },
7818     { Bad_Opcode },
7819     { Bad_Opcode },
7820     { Bad_Opcode },
7821     /* e8 */
7822     { Bad_Opcode },
7823     { Bad_Opcode },
7824     { Bad_Opcode },
7825     { Bad_Opcode },
7826     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
7827     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
7828     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
7829     { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
7830     /* f0 */
7831     { Bad_Opcode },
7832     { Bad_Opcode },
7833     { Bad_Opcode },
7834     { Bad_Opcode },
7835     { Bad_Opcode },
7836     { Bad_Opcode },
7837     { Bad_Opcode },
7838     { Bad_Opcode },
7839     /* f8 */
7840     { Bad_Opcode },
7841     { Bad_Opcode },
7842     { Bad_Opcode },
7843     { Bad_Opcode },
7844     { Bad_Opcode },
7845     { Bad_Opcode },
7846     { Bad_Opcode },
7847     { Bad_Opcode },
7848   },
7849   /* XOP_09 */
7850   {
7851     /* 00 */
7852     { Bad_Opcode },
7853     { REG_TABLE (REG_XOP_TBM_01) },
7854     { REG_TABLE (REG_XOP_TBM_02) },
7855     { Bad_Opcode },
7856     { Bad_Opcode },
7857     { Bad_Opcode },
7858     { Bad_Opcode },
7859     { Bad_Opcode },
7860     /* 08 */
7861     { Bad_Opcode },
7862     { Bad_Opcode },
7863     { Bad_Opcode },
7864     { Bad_Opcode },
7865     { Bad_Opcode },
7866     { Bad_Opcode },
7867     { Bad_Opcode },
7868     { Bad_Opcode },
7869     /* 10 */
7870     { Bad_Opcode },
7871     { Bad_Opcode },
7872     { REG_TABLE (REG_XOP_LWPCB) },
7873     { Bad_Opcode },
7874     { Bad_Opcode },
7875     { Bad_Opcode },
7876     { Bad_Opcode },
7877     { Bad_Opcode },
7878     /* 18 */
7879     { Bad_Opcode },
7880     { Bad_Opcode },
7881     { Bad_Opcode },
7882     { Bad_Opcode },
7883     { Bad_Opcode },
7884     { Bad_Opcode },
7885     { Bad_Opcode },
7886     { Bad_Opcode },
7887     /* 20 */
7888     { Bad_Opcode },
7889     { Bad_Opcode },
7890     { Bad_Opcode },
7891     { Bad_Opcode },
7892     { Bad_Opcode },
7893     { Bad_Opcode },
7894     { Bad_Opcode },
7895     { Bad_Opcode },
7896     /* 28 */
7897     { Bad_Opcode },
7898     { Bad_Opcode },
7899     { Bad_Opcode },
7900     { Bad_Opcode },
7901     { Bad_Opcode },
7902     { Bad_Opcode },
7903     { Bad_Opcode },
7904     { Bad_Opcode },
7905     /* 30 */
7906     { Bad_Opcode },
7907     { Bad_Opcode },
7908     { Bad_Opcode },
7909     { Bad_Opcode },
7910     { Bad_Opcode },
7911     { Bad_Opcode },
7912     { Bad_Opcode },
7913     { Bad_Opcode },
7914     /* 38 */
7915     { Bad_Opcode },
7916     { Bad_Opcode },
7917     { Bad_Opcode },
7918     { Bad_Opcode },
7919     { Bad_Opcode },
7920     { Bad_Opcode },
7921     { Bad_Opcode },
7922     { Bad_Opcode },
7923     /* 40 */
7924     { Bad_Opcode },
7925     { Bad_Opcode },
7926     { Bad_Opcode },
7927     { Bad_Opcode },
7928     { Bad_Opcode },
7929     { Bad_Opcode },
7930     { Bad_Opcode },
7931     { Bad_Opcode },
7932     /* 48 */
7933     { Bad_Opcode },
7934     { Bad_Opcode },
7935     { Bad_Opcode },
7936     { Bad_Opcode },
7937     { Bad_Opcode },
7938     { Bad_Opcode },
7939     { Bad_Opcode },
7940     { Bad_Opcode },
7941     /* 50 */
7942     { Bad_Opcode },
7943     { Bad_Opcode },
7944     { Bad_Opcode },
7945     { Bad_Opcode },
7946     { Bad_Opcode },
7947     { Bad_Opcode },
7948     { Bad_Opcode },
7949     { Bad_Opcode },
7950     /* 58 */
7951     { Bad_Opcode },
7952     { Bad_Opcode },
7953     { Bad_Opcode },
7954     { Bad_Opcode },
7955     { Bad_Opcode },
7956     { Bad_Opcode },
7957     { Bad_Opcode },
7958     { Bad_Opcode },
7959     /* 60 */
7960     { Bad_Opcode },
7961     { Bad_Opcode },
7962     { Bad_Opcode },
7963     { Bad_Opcode },
7964     { Bad_Opcode },
7965     { Bad_Opcode },
7966     { Bad_Opcode },
7967     { Bad_Opcode },
7968     /* 68 */
7969     { Bad_Opcode },
7970     { Bad_Opcode },
7971     { Bad_Opcode },
7972     { Bad_Opcode },
7973     { Bad_Opcode },
7974     { Bad_Opcode },
7975     { Bad_Opcode },
7976     { Bad_Opcode },
7977     /* 70 */
7978     { Bad_Opcode },
7979     { Bad_Opcode },
7980     { Bad_Opcode },
7981     { Bad_Opcode },
7982     { Bad_Opcode },
7983     { Bad_Opcode },
7984     { Bad_Opcode },
7985     { Bad_Opcode },
7986     /* 78 */
7987     { Bad_Opcode },
7988     { Bad_Opcode },
7989     { Bad_Opcode },
7990     { Bad_Opcode },
7991     { Bad_Opcode },
7992     { Bad_Opcode },
7993     { Bad_Opcode },
7994     { Bad_Opcode },
7995     /* 80 */
7996     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_80) },
7997     { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_81) },
7998     { "vfrczss",        { XM, EXd }, 0 },
7999     { "vfrczsd",        { XM, EXq }, 0 },
8000     { Bad_Opcode },
8001     { Bad_Opcode },
8002     { Bad_Opcode },
8003     { Bad_Opcode },
8004     /* 88 */
8005     { Bad_Opcode },
8006     { Bad_Opcode },
8007     { Bad_Opcode },
8008     { Bad_Opcode },
8009     { Bad_Opcode },
8010     { Bad_Opcode },
8011     { Bad_Opcode },
8012     { Bad_Opcode },
8013     /* 90 */
8014     { "vprotb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8015     { "vprotw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8016     { "vprotd",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8017     { "vprotq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8018     { "vpshlb",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8019     { "vpshlw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8020     { "vpshld",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8021     { "vpshlq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8022     /* 98 */
8023     { "vpshab",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8024     { "vpshaw",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8025     { "vpshad",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8026     { "vpshaq",         { XM, Vex_2src_1, Vex_2src_2 }, 0 },
8027     { Bad_Opcode },
8028     { Bad_Opcode },
8029     { Bad_Opcode },
8030     { Bad_Opcode },
8031     /* a0 */
8032     { Bad_Opcode },
8033     { Bad_Opcode },
8034     { Bad_Opcode },
8035     { Bad_Opcode },
8036     { Bad_Opcode },
8037     { Bad_Opcode },
8038     { Bad_Opcode },
8039     { Bad_Opcode },
8040     /* a8 */
8041     { Bad_Opcode },
8042     { Bad_Opcode },
8043     { Bad_Opcode },
8044     { Bad_Opcode },
8045     { Bad_Opcode },
8046     { Bad_Opcode },
8047     { Bad_Opcode },
8048     { Bad_Opcode },
8049     /* b0 */
8050     { Bad_Opcode },
8051     { Bad_Opcode },
8052     { Bad_Opcode },
8053     { Bad_Opcode },
8054     { Bad_Opcode },
8055     { Bad_Opcode },
8056     { Bad_Opcode },
8057     { Bad_Opcode },
8058     /* b8 */
8059     { Bad_Opcode },
8060     { Bad_Opcode },
8061     { Bad_Opcode },
8062     { Bad_Opcode },
8063     { Bad_Opcode },
8064     { Bad_Opcode },
8065     { Bad_Opcode },
8066     { Bad_Opcode },
8067     /* c0 */
8068     { Bad_Opcode },
8069     { "vphaddbw",       { XM, EXxmm }, 0 },
8070     { "vphaddbd",       { XM, EXxmm }, 0 },
8071     { "vphaddbq",       { XM, EXxmm }, 0 },
8072     { Bad_Opcode },
8073     { Bad_Opcode },
8074     { "vphaddwd",       { XM, EXxmm }, 0 },
8075     { "vphaddwq",       { XM, EXxmm }, 0 },
8076     /* c8 */
8077     { Bad_Opcode },
8078     { Bad_Opcode },
8079     { Bad_Opcode },
8080     { "vphadddq",       { XM, EXxmm }, 0 },
8081     { Bad_Opcode },
8082     { Bad_Opcode },
8083     { Bad_Opcode },
8084     { Bad_Opcode },
8085     /* d0 */
8086     { Bad_Opcode },
8087     { "vphaddubw",      { XM, EXxmm }, 0 },
8088     { "vphaddubd",      { XM, EXxmm }, 0 },
8089     { "vphaddubq",      { XM, EXxmm }, 0 },
8090     { Bad_Opcode },
8091     { Bad_Opcode },
8092     { "vphadduwd",      { XM, EXxmm }, 0 },
8093     { "vphadduwq",      { XM, EXxmm }, 0 },
8094     /* d8 */
8095     { Bad_Opcode },
8096     { Bad_Opcode },
8097     { Bad_Opcode },
8098     { "vphaddudq",      { XM, EXxmm }, 0 },
8099     { Bad_Opcode },
8100     { Bad_Opcode },
8101     { Bad_Opcode },
8102     { Bad_Opcode },
8103     /* e0 */
8104     { Bad_Opcode },
8105     { "vphsubbw",       { XM, EXxmm }, 0 },
8106     { "vphsubwd",       { XM, EXxmm }, 0 },
8107     { "vphsubdq",       { XM, EXxmm }, 0 },
8108     { Bad_Opcode },
8109     { Bad_Opcode },
8110     { Bad_Opcode },
8111     { Bad_Opcode },
8112     /* e8 */
8113     { Bad_Opcode },
8114     { Bad_Opcode },
8115     { Bad_Opcode },
8116     { Bad_Opcode },
8117     { Bad_Opcode },
8118     { Bad_Opcode },
8119     { Bad_Opcode },
8120     { Bad_Opcode },
8121     /* f0 */
8122     { Bad_Opcode },
8123     { Bad_Opcode },
8124     { Bad_Opcode },
8125     { Bad_Opcode },
8126     { Bad_Opcode },
8127     { Bad_Opcode },
8128     { Bad_Opcode },
8129     { Bad_Opcode },
8130     /* f8 */
8131     { Bad_Opcode },
8132     { Bad_Opcode },
8133     { Bad_Opcode },
8134     { Bad_Opcode },
8135     { Bad_Opcode },
8136     { Bad_Opcode },
8137     { Bad_Opcode },
8138     { Bad_Opcode },
8139   },
8140   /* XOP_0A */
8141   {
8142     /* 00 */
8143     { Bad_Opcode },
8144     { Bad_Opcode },
8145     { Bad_Opcode },
8146     { Bad_Opcode },
8147     { Bad_Opcode },
8148     { Bad_Opcode },
8149     { Bad_Opcode },
8150     { Bad_Opcode },
8151     /* 08 */
8152     { Bad_Opcode },
8153     { Bad_Opcode },
8154     { Bad_Opcode },
8155     { Bad_Opcode },
8156     { Bad_Opcode },
8157     { Bad_Opcode },
8158     { Bad_Opcode },
8159     { Bad_Opcode },
8160     /* 10 */
8161     { "bextr",  { Gv, Ev, Iq }, 0 },
8162     { Bad_Opcode },
8163     { REG_TABLE (REG_XOP_LWP) },
8164     { Bad_Opcode },
8165     { Bad_Opcode },
8166     { Bad_Opcode },
8167     { Bad_Opcode },
8168     { Bad_Opcode },
8169     /* 18 */
8170     { Bad_Opcode },
8171     { Bad_Opcode },
8172     { Bad_Opcode },
8173     { Bad_Opcode },
8174     { Bad_Opcode },
8175     { Bad_Opcode },
8176     { Bad_Opcode },
8177     { Bad_Opcode },
8178     /* 20 */
8179     { Bad_Opcode },
8180     { Bad_Opcode },
8181     { Bad_Opcode },
8182     { Bad_Opcode },
8183     { Bad_Opcode },
8184     { Bad_Opcode },
8185     { Bad_Opcode },
8186     { Bad_Opcode },
8187     /* 28 */
8188     { Bad_Opcode },
8189     { Bad_Opcode },
8190     { Bad_Opcode },
8191     { Bad_Opcode },
8192     { Bad_Opcode },
8193     { Bad_Opcode },
8194     { Bad_Opcode },
8195     { Bad_Opcode },
8196     /* 30 */
8197     { Bad_Opcode },
8198     { Bad_Opcode },
8199     { Bad_Opcode },
8200     { Bad_Opcode },
8201     { Bad_Opcode },
8202     { Bad_Opcode },
8203     { Bad_Opcode },
8204     { Bad_Opcode },
8205     /* 38 */
8206     { Bad_Opcode },
8207     { Bad_Opcode },
8208     { Bad_Opcode },
8209     { Bad_Opcode },
8210     { Bad_Opcode },
8211     { Bad_Opcode },
8212     { Bad_Opcode },
8213     { Bad_Opcode },
8214     /* 40 */
8215     { Bad_Opcode },
8216     { Bad_Opcode },
8217     { Bad_Opcode },
8218     { Bad_Opcode },
8219     { Bad_Opcode },
8220     { Bad_Opcode },
8221     { Bad_Opcode },
8222     { Bad_Opcode },
8223     /* 48 */
8224     { Bad_Opcode },
8225     { Bad_Opcode },
8226     { Bad_Opcode },
8227     { Bad_Opcode },
8228     { Bad_Opcode },
8229     { Bad_Opcode },
8230     { Bad_Opcode },
8231     { Bad_Opcode },
8232     /* 50 */
8233     { Bad_Opcode },
8234     { Bad_Opcode },
8235     { Bad_Opcode },
8236     { Bad_Opcode },
8237     { Bad_Opcode },
8238     { Bad_Opcode },
8239     { Bad_Opcode },
8240     { Bad_Opcode },
8241     /* 58 */
8242     { Bad_Opcode },
8243     { Bad_Opcode },
8244     { Bad_Opcode },
8245     { Bad_Opcode },
8246     { Bad_Opcode },
8247     { Bad_Opcode },
8248     { Bad_Opcode },
8249     { Bad_Opcode },
8250     /* 60 */
8251     { Bad_Opcode },
8252     { Bad_Opcode },
8253     { Bad_Opcode },
8254     { Bad_Opcode },
8255     { Bad_Opcode },
8256     { Bad_Opcode },
8257     { Bad_Opcode },
8258     { Bad_Opcode },
8259     /* 68 */
8260     { Bad_Opcode },
8261     { Bad_Opcode },
8262     { Bad_Opcode },
8263     { Bad_Opcode },
8264     { Bad_Opcode },
8265     { Bad_Opcode },
8266     { Bad_Opcode },
8267     { Bad_Opcode },
8268     /* 70 */
8269     { Bad_Opcode },
8270     { Bad_Opcode },
8271     { Bad_Opcode },
8272     { Bad_Opcode },
8273     { Bad_Opcode },
8274     { Bad_Opcode },
8275     { Bad_Opcode },
8276     { Bad_Opcode },
8277     /* 78 */
8278     { Bad_Opcode },
8279     { Bad_Opcode },
8280     { Bad_Opcode },
8281     { Bad_Opcode },
8282     { Bad_Opcode },
8283     { Bad_Opcode },
8284     { Bad_Opcode },
8285     { Bad_Opcode },
8286     /* 80 */
8287     { Bad_Opcode },
8288     { Bad_Opcode },
8289     { Bad_Opcode },
8290     { Bad_Opcode },
8291     { Bad_Opcode },
8292     { Bad_Opcode },
8293     { Bad_Opcode },
8294     { Bad_Opcode },
8295     /* 88 */
8296     { Bad_Opcode },
8297     { Bad_Opcode },
8298     { Bad_Opcode },
8299     { Bad_Opcode },
8300     { Bad_Opcode },
8301     { Bad_Opcode },
8302     { Bad_Opcode },
8303     { Bad_Opcode },
8304     /* 90 */
8305     { Bad_Opcode },
8306     { Bad_Opcode },
8307     { Bad_Opcode },
8308     { Bad_Opcode },
8309     { Bad_Opcode },
8310     { Bad_Opcode },
8311     { Bad_Opcode },
8312     { Bad_Opcode },
8313     /* 98 */
8314     { Bad_Opcode },
8315     { Bad_Opcode },
8316     { Bad_Opcode },
8317     { Bad_Opcode },
8318     { Bad_Opcode },
8319     { Bad_Opcode },
8320     { Bad_Opcode },
8321     { Bad_Opcode },
8322     /* a0 */
8323     { Bad_Opcode },
8324     { Bad_Opcode },
8325     { Bad_Opcode },
8326     { Bad_Opcode },
8327     { Bad_Opcode },
8328     { Bad_Opcode },
8329     { Bad_Opcode },
8330     { Bad_Opcode },
8331     /* a8 */
8332     { Bad_Opcode },
8333     { Bad_Opcode },
8334     { Bad_Opcode },
8335     { Bad_Opcode },
8336     { Bad_Opcode },
8337     { Bad_Opcode },
8338     { Bad_Opcode },
8339     { Bad_Opcode },
8340     /* b0 */
8341     { Bad_Opcode },
8342     { Bad_Opcode },
8343     { Bad_Opcode },
8344     { Bad_Opcode },
8345     { Bad_Opcode },
8346     { Bad_Opcode },
8347     { Bad_Opcode },
8348     { Bad_Opcode },
8349     /* b8 */
8350     { Bad_Opcode },
8351     { Bad_Opcode },
8352     { Bad_Opcode },
8353     { Bad_Opcode },
8354     { Bad_Opcode },
8355     { Bad_Opcode },
8356     { Bad_Opcode },
8357     { Bad_Opcode },
8358     /* c0 */
8359     { Bad_Opcode },
8360     { Bad_Opcode },
8361     { Bad_Opcode },
8362     { Bad_Opcode },
8363     { Bad_Opcode },
8364     { Bad_Opcode },
8365     { Bad_Opcode },
8366     { Bad_Opcode },
8367     /* c8 */
8368     { Bad_Opcode },
8369     { Bad_Opcode },
8370     { Bad_Opcode },
8371     { Bad_Opcode },
8372     { Bad_Opcode },
8373     { Bad_Opcode },
8374     { Bad_Opcode },
8375     { Bad_Opcode },
8376     /* d0 */
8377     { Bad_Opcode },
8378     { Bad_Opcode },
8379     { Bad_Opcode },
8380     { Bad_Opcode },
8381     { Bad_Opcode },
8382     { Bad_Opcode },
8383     { Bad_Opcode },
8384     { Bad_Opcode },
8385     /* d8 */
8386     { Bad_Opcode },
8387     { Bad_Opcode },
8388     { Bad_Opcode },
8389     { Bad_Opcode },
8390     { Bad_Opcode },
8391     { Bad_Opcode },
8392     { Bad_Opcode },
8393     { Bad_Opcode },
8394     /* e0 */
8395     { Bad_Opcode },
8396     { Bad_Opcode },
8397     { Bad_Opcode },
8398     { Bad_Opcode },
8399     { Bad_Opcode },
8400     { Bad_Opcode },
8401     { Bad_Opcode },
8402     { Bad_Opcode },
8403     /* e8 */
8404     { Bad_Opcode },
8405     { Bad_Opcode },
8406     { Bad_Opcode },
8407     { Bad_Opcode },
8408     { Bad_Opcode },
8409     { Bad_Opcode },
8410     { Bad_Opcode },
8411     { Bad_Opcode },
8412     /* f0 */
8413     { Bad_Opcode },
8414     { Bad_Opcode },
8415     { Bad_Opcode },
8416     { Bad_Opcode },
8417     { Bad_Opcode },
8418     { Bad_Opcode },
8419     { Bad_Opcode },
8420     { Bad_Opcode },
8421     /* f8 */
8422     { Bad_Opcode },
8423     { Bad_Opcode },
8424     { Bad_Opcode },
8425     { Bad_Opcode },
8426     { Bad_Opcode },
8427     { Bad_Opcode },
8428     { Bad_Opcode },
8429     { Bad_Opcode },
8430   },
8431 };
8432
8433 static const struct dis386 vex_table[][256] = {
8434   /* VEX_0F */
8435   {
8436     /* 00 */
8437     { Bad_Opcode },
8438     { Bad_Opcode },
8439     { Bad_Opcode },
8440     { Bad_Opcode },
8441     { Bad_Opcode },
8442     { Bad_Opcode },
8443     { Bad_Opcode },
8444     { Bad_Opcode },
8445     /* 08 */
8446     { Bad_Opcode },
8447     { Bad_Opcode },
8448     { Bad_Opcode },
8449     { Bad_Opcode },
8450     { Bad_Opcode },
8451     { Bad_Opcode },
8452     { Bad_Opcode },
8453     { Bad_Opcode },
8454     /* 10 */
8455     { PREFIX_TABLE (PREFIX_VEX_0F10) },
8456     { PREFIX_TABLE (PREFIX_VEX_0F11) },
8457     { PREFIX_TABLE (PREFIX_VEX_0F12) },
8458     { MOD_TABLE (MOD_VEX_0F13) },
8459     { "vunpcklpX",      { XM, Vex, EXx }, 0 },
8460     { "vunpckhpX",      { XM, Vex, EXx }, 0 },
8461     { PREFIX_TABLE (PREFIX_VEX_0F16) },
8462     { MOD_TABLE (MOD_VEX_0F17) },
8463     /* 18 */
8464     { Bad_Opcode },
8465     { Bad_Opcode },
8466     { Bad_Opcode },
8467     { Bad_Opcode },
8468     { Bad_Opcode },
8469     { Bad_Opcode },
8470     { Bad_Opcode },
8471     { Bad_Opcode },
8472     /* 20 */
8473     { Bad_Opcode },
8474     { Bad_Opcode },
8475     { Bad_Opcode },
8476     { Bad_Opcode },
8477     { Bad_Opcode },
8478     { Bad_Opcode },
8479     { Bad_Opcode },
8480     { Bad_Opcode },
8481     /* 28 */
8482     { "vmovapX",        { XM, EXx }, 0 },
8483     { "vmovapX",        { EXxS, XM }, 0 },
8484     { PREFIX_TABLE (PREFIX_VEX_0F2A) },
8485     { MOD_TABLE (MOD_VEX_0F2B) },
8486     { PREFIX_TABLE (PREFIX_VEX_0F2C) },
8487     { PREFIX_TABLE (PREFIX_VEX_0F2D) },
8488     { PREFIX_TABLE (PREFIX_VEX_0F2E) },
8489     { PREFIX_TABLE (PREFIX_VEX_0F2F) },
8490     /* 30 */
8491     { Bad_Opcode },
8492     { Bad_Opcode },
8493     { Bad_Opcode },
8494     { Bad_Opcode },
8495     { Bad_Opcode },
8496     { Bad_Opcode },
8497     { Bad_Opcode },
8498     { Bad_Opcode },
8499     /* 38 */
8500     { Bad_Opcode },
8501     { Bad_Opcode },
8502     { Bad_Opcode },
8503     { Bad_Opcode },
8504     { Bad_Opcode },
8505     { Bad_Opcode },
8506     { Bad_Opcode },
8507     { Bad_Opcode },
8508     /* 40 */
8509     { Bad_Opcode },
8510     { PREFIX_TABLE (PREFIX_VEX_0F41) },
8511     { PREFIX_TABLE (PREFIX_VEX_0F42) },
8512     { Bad_Opcode },
8513     { PREFIX_TABLE (PREFIX_VEX_0F44) },
8514     { PREFIX_TABLE (PREFIX_VEX_0F45) },
8515     { PREFIX_TABLE (PREFIX_VEX_0F46) },
8516     { PREFIX_TABLE (PREFIX_VEX_0F47) },
8517     /* 48 */
8518     { Bad_Opcode },
8519     { Bad_Opcode },
8520     { PREFIX_TABLE (PREFIX_VEX_0F4A) },
8521     { PREFIX_TABLE (PREFIX_VEX_0F4B) },
8522     { Bad_Opcode },
8523     { Bad_Opcode },
8524     { Bad_Opcode },
8525     { Bad_Opcode },
8526     /* 50 */
8527     { MOD_TABLE (MOD_VEX_0F50) },
8528     { PREFIX_TABLE (PREFIX_VEX_0F51) },
8529     { PREFIX_TABLE (PREFIX_VEX_0F52) },
8530     { PREFIX_TABLE (PREFIX_VEX_0F53) },
8531     { "vandpX",         { XM, Vex, EXx }, 0 },
8532     { "vandnpX",        { XM, Vex, EXx }, 0 },
8533     { "vorpX",          { XM, Vex, EXx }, 0 },
8534     { "vxorpX",         { XM, Vex, EXx }, 0 },
8535     /* 58 */
8536     { PREFIX_TABLE (PREFIX_VEX_0F58) },
8537     { PREFIX_TABLE (PREFIX_VEX_0F59) },
8538     { PREFIX_TABLE (PREFIX_VEX_0F5A) },
8539     { PREFIX_TABLE (PREFIX_VEX_0F5B) },
8540     { PREFIX_TABLE (PREFIX_VEX_0F5C) },
8541     { PREFIX_TABLE (PREFIX_VEX_0F5D) },
8542     { PREFIX_TABLE (PREFIX_VEX_0F5E) },
8543     { PREFIX_TABLE (PREFIX_VEX_0F5F) },
8544     /* 60 */
8545     { PREFIX_TABLE (PREFIX_VEX_0F60) },
8546     { PREFIX_TABLE (PREFIX_VEX_0F61) },
8547     { PREFIX_TABLE (PREFIX_VEX_0F62) },
8548     { PREFIX_TABLE (PREFIX_VEX_0F63) },
8549     { PREFIX_TABLE (PREFIX_VEX_0F64) },
8550     { PREFIX_TABLE (PREFIX_VEX_0F65) },
8551     { PREFIX_TABLE (PREFIX_VEX_0F66) },
8552     { PREFIX_TABLE (PREFIX_VEX_0F67) },
8553     /* 68 */
8554     { PREFIX_TABLE (PREFIX_VEX_0F68) },
8555     { PREFIX_TABLE (PREFIX_VEX_0F69) },
8556     { PREFIX_TABLE (PREFIX_VEX_0F6A) },
8557     { PREFIX_TABLE (PREFIX_VEX_0F6B) },
8558     { PREFIX_TABLE (PREFIX_VEX_0F6C) },
8559     { PREFIX_TABLE (PREFIX_VEX_0F6D) },
8560     { PREFIX_TABLE (PREFIX_VEX_0F6E) },
8561     { PREFIX_TABLE (PREFIX_VEX_0F6F) },
8562     /* 70 */
8563     { PREFIX_TABLE (PREFIX_VEX_0F70) },
8564     { REG_TABLE (REG_VEX_0F71) },
8565     { REG_TABLE (REG_VEX_0F72) },
8566     { REG_TABLE (REG_VEX_0F73) },
8567     { PREFIX_TABLE (PREFIX_VEX_0F74) },
8568     { PREFIX_TABLE (PREFIX_VEX_0F75) },
8569     { PREFIX_TABLE (PREFIX_VEX_0F76) },
8570     { PREFIX_TABLE (PREFIX_VEX_0F77) },
8571     /* 78 */
8572     { Bad_Opcode },
8573     { Bad_Opcode },
8574     { Bad_Opcode },
8575     { Bad_Opcode },
8576     { PREFIX_TABLE (PREFIX_VEX_0F7C) },
8577     { PREFIX_TABLE (PREFIX_VEX_0F7D) },
8578     { PREFIX_TABLE (PREFIX_VEX_0F7E) },
8579     { PREFIX_TABLE (PREFIX_VEX_0F7F) },
8580     /* 80 */
8581     { Bad_Opcode },
8582     { Bad_Opcode },
8583     { Bad_Opcode },
8584     { Bad_Opcode },
8585     { Bad_Opcode },
8586     { Bad_Opcode },
8587     { Bad_Opcode },
8588     { Bad_Opcode },
8589     /* 88 */
8590     { Bad_Opcode },
8591     { Bad_Opcode },
8592     { Bad_Opcode },
8593     { Bad_Opcode },
8594     { Bad_Opcode },
8595     { Bad_Opcode },
8596     { Bad_Opcode },
8597     { Bad_Opcode },
8598     /* 90 */
8599     { PREFIX_TABLE (PREFIX_VEX_0F90) },
8600     { PREFIX_TABLE (PREFIX_VEX_0F91) },
8601     { PREFIX_TABLE (PREFIX_VEX_0F92) },
8602     { PREFIX_TABLE (PREFIX_VEX_0F93) },
8603     { Bad_Opcode },
8604     { Bad_Opcode },
8605     { Bad_Opcode },
8606     { Bad_Opcode },
8607     /* 98 */
8608     { PREFIX_TABLE (PREFIX_VEX_0F98) },
8609     { PREFIX_TABLE (PREFIX_VEX_0F99) },
8610     { Bad_Opcode },
8611     { Bad_Opcode },
8612     { Bad_Opcode },
8613     { Bad_Opcode },
8614     { Bad_Opcode },
8615     { Bad_Opcode },
8616     /* a0 */
8617     { Bad_Opcode },
8618     { Bad_Opcode },
8619     { Bad_Opcode },
8620     { Bad_Opcode },
8621     { Bad_Opcode },
8622     { Bad_Opcode },
8623     { Bad_Opcode },
8624     { Bad_Opcode },
8625     /* a8 */
8626     { Bad_Opcode },
8627     { Bad_Opcode },
8628     { Bad_Opcode },
8629     { Bad_Opcode },
8630     { Bad_Opcode },
8631     { Bad_Opcode },
8632     { REG_TABLE (REG_VEX_0FAE) },
8633     { Bad_Opcode },
8634     /* b0 */
8635     { Bad_Opcode },
8636     { Bad_Opcode },
8637     { Bad_Opcode },
8638     { Bad_Opcode },
8639     { Bad_Opcode },
8640     { Bad_Opcode },
8641     { Bad_Opcode },
8642     { Bad_Opcode },
8643     /* b8 */
8644     { Bad_Opcode },
8645     { Bad_Opcode },
8646     { Bad_Opcode },
8647     { Bad_Opcode },
8648     { Bad_Opcode },
8649     { Bad_Opcode },
8650     { Bad_Opcode },
8651     { Bad_Opcode },
8652     /* c0 */
8653     { Bad_Opcode },
8654     { Bad_Opcode },
8655     { PREFIX_TABLE (PREFIX_VEX_0FC2) },
8656     { Bad_Opcode },
8657     { PREFIX_TABLE (PREFIX_VEX_0FC4) },
8658     { PREFIX_TABLE (PREFIX_VEX_0FC5) },
8659     { "vshufpX",        { XM, Vex, EXx, Ib }, 0 },
8660     { Bad_Opcode },
8661     /* c8 */
8662     { Bad_Opcode },
8663     { Bad_Opcode },
8664     { Bad_Opcode },
8665     { Bad_Opcode },
8666     { Bad_Opcode },
8667     { Bad_Opcode },
8668     { Bad_Opcode },
8669     { Bad_Opcode },
8670     /* d0 */
8671     { PREFIX_TABLE (PREFIX_VEX_0FD0) },
8672     { PREFIX_TABLE (PREFIX_VEX_0FD1) },
8673     { PREFIX_TABLE (PREFIX_VEX_0FD2) },
8674     { PREFIX_TABLE (PREFIX_VEX_0FD3) },
8675     { PREFIX_TABLE (PREFIX_VEX_0FD4) },
8676     { PREFIX_TABLE (PREFIX_VEX_0FD5) },
8677     { PREFIX_TABLE (PREFIX_VEX_0FD6) },
8678     { PREFIX_TABLE (PREFIX_VEX_0FD7) },
8679     /* d8 */
8680     { PREFIX_TABLE (PREFIX_VEX_0FD8) },
8681     { PREFIX_TABLE (PREFIX_VEX_0FD9) },
8682     { PREFIX_TABLE (PREFIX_VEX_0FDA) },
8683     { PREFIX_TABLE (PREFIX_VEX_0FDB) },
8684     { PREFIX_TABLE (PREFIX_VEX_0FDC) },
8685     { PREFIX_TABLE (PREFIX_VEX_0FDD) },
8686     { PREFIX_TABLE (PREFIX_VEX_0FDE) },
8687     { PREFIX_TABLE (PREFIX_VEX_0FDF) },
8688     /* e0 */
8689     { PREFIX_TABLE (PREFIX_VEX_0FE0) },
8690     { PREFIX_TABLE (PREFIX_VEX_0FE1) },
8691     { PREFIX_TABLE (PREFIX_VEX_0FE2) },
8692     { PREFIX_TABLE (PREFIX_VEX_0FE3) },
8693     { PREFIX_TABLE (PREFIX_VEX_0FE4) },
8694     { PREFIX_TABLE (PREFIX_VEX_0FE5) },
8695     { PREFIX_TABLE (PREFIX_VEX_0FE6) },
8696     { PREFIX_TABLE (PREFIX_VEX_0FE7) },
8697     /* e8 */
8698     { PREFIX_TABLE (PREFIX_VEX_0FE8) },
8699     { PREFIX_TABLE (PREFIX_VEX_0FE9) },
8700     { PREFIX_TABLE (PREFIX_VEX_0FEA) },
8701     { PREFIX_TABLE (PREFIX_VEX_0FEB) },
8702     { PREFIX_TABLE (PREFIX_VEX_0FEC) },
8703     { PREFIX_TABLE (PREFIX_VEX_0FED) },
8704     { PREFIX_TABLE (PREFIX_VEX_0FEE) },
8705     { PREFIX_TABLE (PREFIX_VEX_0FEF) },
8706     /* f0 */
8707     { PREFIX_TABLE (PREFIX_VEX_0FF0) },
8708     { PREFIX_TABLE (PREFIX_VEX_0FF1) },
8709     { PREFIX_TABLE (PREFIX_VEX_0FF2) },
8710     { PREFIX_TABLE (PREFIX_VEX_0FF3) },
8711     { PREFIX_TABLE (PREFIX_VEX_0FF4) },
8712     { PREFIX_TABLE (PREFIX_VEX_0FF5) },
8713     { PREFIX_TABLE (PREFIX_VEX_0FF6) },
8714     { PREFIX_TABLE (PREFIX_VEX_0FF7) },
8715     /* f8 */
8716     { PREFIX_TABLE (PREFIX_VEX_0FF8) },
8717     { PREFIX_TABLE (PREFIX_VEX_0FF9) },
8718     { PREFIX_TABLE (PREFIX_VEX_0FFA) },
8719     { PREFIX_TABLE (PREFIX_VEX_0FFB) },
8720     { PREFIX_TABLE (PREFIX_VEX_0FFC) },
8721     { PREFIX_TABLE (PREFIX_VEX_0FFD) },
8722     { PREFIX_TABLE (PREFIX_VEX_0FFE) },
8723     { Bad_Opcode },
8724   },
8725   /* VEX_0F38 */
8726   {
8727     /* 00 */
8728     { PREFIX_TABLE (PREFIX_VEX_0F3800) },
8729     { PREFIX_TABLE (PREFIX_VEX_0F3801) },
8730     { PREFIX_TABLE (PREFIX_VEX_0F3802) },
8731     { PREFIX_TABLE (PREFIX_VEX_0F3803) },
8732     { PREFIX_TABLE (PREFIX_VEX_0F3804) },
8733     { PREFIX_TABLE (PREFIX_VEX_0F3805) },
8734     { PREFIX_TABLE (PREFIX_VEX_0F3806) },
8735     { PREFIX_TABLE (PREFIX_VEX_0F3807) },
8736     /* 08 */
8737     { PREFIX_TABLE (PREFIX_VEX_0F3808) },
8738     { PREFIX_TABLE (PREFIX_VEX_0F3809) },
8739     { PREFIX_TABLE (PREFIX_VEX_0F380A) },
8740     { PREFIX_TABLE (PREFIX_VEX_0F380B) },
8741     { PREFIX_TABLE (PREFIX_VEX_0F380C) },
8742     { PREFIX_TABLE (PREFIX_VEX_0F380D) },
8743     { PREFIX_TABLE (PREFIX_VEX_0F380E) },
8744     { PREFIX_TABLE (PREFIX_VEX_0F380F) },
8745     /* 10 */
8746     { Bad_Opcode },
8747     { Bad_Opcode },
8748     { Bad_Opcode },
8749     { PREFIX_TABLE (PREFIX_VEX_0F3813) },
8750     { Bad_Opcode },
8751     { Bad_Opcode },
8752     { PREFIX_TABLE (PREFIX_VEX_0F3816) },
8753     { PREFIX_TABLE (PREFIX_VEX_0F3817) },
8754     /* 18 */
8755     { PREFIX_TABLE (PREFIX_VEX_0F3818) },
8756     { PREFIX_TABLE (PREFIX_VEX_0F3819) },
8757     { PREFIX_TABLE (PREFIX_VEX_0F381A) },
8758     { Bad_Opcode },
8759     { PREFIX_TABLE (PREFIX_VEX_0F381C) },
8760     { PREFIX_TABLE (PREFIX_VEX_0F381D) },
8761     { PREFIX_TABLE (PREFIX_VEX_0F381E) },
8762     { Bad_Opcode },
8763     /* 20 */
8764     { PREFIX_TABLE (PREFIX_VEX_0F3820) },
8765     { PREFIX_TABLE (PREFIX_VEX_0F3821) },
8766     { PREFIX_TABLE (PREFIX_VEX_0F3822) },
8767     { PREFIX_TABLE (PREFIX_VEX_0F3823) },
8768     { PREFIX_TABLE (PREFIX_VEX_0F3824) },
8769     { PREFIX_TABLE (PREFIX_VEX_0F3825) },
8770     { Bad_Opcode },
8771     { Bad_Opcode },
8772     /* 28 */
8773     { PREFIX_TABLE (PREFIX_VEX_0F3828) },
8774     { PREFIX_TABLE (PREFIX_VEX_0F3829) },
8775     { PREFIX_TABLE (PREFIX_VEX_0F382A) },
8776     { PREFIX_TABLE (PREFIX_VEX_0F382B) },
8777     { PREFIX_TABLE (PREFIX_VEX_0F382C) },
8778     { PREFIX_TABLE (PREFIX_VEX_0F382D) },
8779     { PREFIX_TABLE (PREFIX_VEX_0F382E) },
8780     { PREFIX_TABLE (PREFIX_VEX_0F382F) },
8781     /* 30 */
8782     { PREFIX_TABLE (PREFIX_VEX_0F3830) },
8783     { PREFIX_TABLE (PREFIX_VEX_0F3831) },
8784     { PREFIX_TABLE (PREFIX_VEX_0F3832) },
8785     { PREFIX_TABLE (PREFIX_VEX_0F3833) },
8786     { PREFIX_TABLE (PREFIX_VEX_0F3834) },
8787     { PREFIX_TABLE (PREFIX_VEX_0F3835) },
8788     { PREFIX_TABLE (PREFIX_VEX_0F3836) },
8789     { PREFIX_TABLE (PREFIX_VEX_0F3837) },
8790     /* 38 */
8791     { PREFIX_TABLE (PREFIX_VEX_0F3838) },
8792     { PREFIX_TABLE (PREFIX_VEX_0F3839) },
8793     { PREFIX_TABLE (PREFIX_VEX_0F383A) },
8794     { PREFIX_TABLE (PREFIX_VEX_0F383B) },
8795     { PREFIX_TABLE (PREFIX_VEX_0F383C) },
8796     { PREFIX_TABLE (PREFIX_VEX_0F383D) },
8797     { PREFIX_TABLE (PREFIX_VEX_0F383E) },
8798     { PREFIX_TABLE (PREFIX_VEX_0F383F) },
8799     /* 40 */
8800     { PREFIX_TABLE (PREFIX_VEX_0F3840) },
8801     { PREFIX_TABLE (PREFIX_VEX_0F3841) },
8802     { Bad_Opcode },
8803     { Bad_Opcode },
8804     { Bad_Opcode },
8805     { PREFIX_TABLE (PREFIX_VEX_0F3845) },
8806     { PREFIX_TABLE (PREFIX_VEX_0F3846) },
8807     { PREFIX_TABLE (PREFIX_VEX_0F3847) },
8808     /* 48 */
8809     { Bad_Opcode },
8810     { Bad_Opcode },
8811     { Bad_Opcode },
8812     { Bad_Opcode },
8813     { Bad_Opcode },
8814     { Bad_Opcode },
8815     { Bad_Opcode },
8816     { Bad_Opcode },
8817     /* 50 */
8818     { Bad_Opcode },
8819     { Bad_Opcode },
8820     { Bad_Opcode },
8821     { Bad_Opcode },
8822     { Bad_Opcode },
8823     { Bad_Opcode },
8824     { Bad_Opcode },
8825     { Bad_Opcode },
8826     /* 58 */
8827     { PREFIX_TABLE (PREFIX_VEX_0F3858) },
8828     { PREFIX_TABLE (PREFIX_VEX_0F3859) },
8829     { PREFIX_TABLE (PREFIX_VEX_0F385A) },
8830     { Bad_Opcode },
8831     { Bad_Opcode },
8832     { Bad_Opcode },
8833     { Bad_Opcode },
8834     { Bad_Opcode },
8835     /* 60 */
8836     { Bad_Opcode },
8837     { Bad_Opcode },
8838     { Bad_Opcode },
8839     { Bad_Opcode },
8840     { Bad_Opcode },
8841     { Bad_Opcode },
8842     { Bad_Opcode },
8843     { Bad_Opcode },
8844     /* 68 */
8845     { Bad_Opcode },
8846     { Bad_Opcode },
8847     { Bad_Opcode },
8848     { Bad_Opcode },
8849     { Bad_Opcode },
8850     { Bad_Opcode },
8851     { Bad_Opcode },
8852     { Bad_Opcode },
8853     /* 70 */
8854     { Bad_Opcode },
8855     { Bad_Opcode },
8856     { Bad_Opcode },
8857     { Bad_Opcode },
8858     { Bad_Opcode },
8859     { Bad_Opcode },
8860     { Bad_Opcode },
8861     { Bad_Opcode },
8862     /* 78 */
8863     { PREFIX_TABLE (PREFIX_VEX_0F3878) },
8864     { PREFIX_TABLE (PREFIX_VEX_0F3879) },
8865     { Bad_Opcode },
8866     { Bad_Opcode },
8867     { Bad_Opcode },
8868     { Bad_Opcode },
8869     { Bad_Opcode },
8870     { Bad_Opcode },
8871     /* 80 */
8872     { Bad_Opcode },
8873     { Bad_Opcode },
8874     { Bad_Opcode },
8875     { Bad_Opcode },
8876     { Bad_Opcode },
8877     { Bad_Opcode },
8878     { Bad_Opcode },
8879     { Bad_Opcode },
8880     /* 88 */
8881     { Bad_Opcode },
8882     { Bad_Opcode },
8883     { Bad_Opcode },
8884     { Bad_Opcode },
8885     { PREFIX_TABLE (PREFIX_VEX_0F388C) },
8886     { Bad_Opcode },
8887     { PREFIX_TABLE (PREFIX_VEX_0F388E) },
8888     { Bad_Opcode },
8889     /* 90 */
8890     { PREFIX_TABLE (PREFIX_VEX_0F3890) },
8891     { PREFIX_TABLE (PREFIX_VEX_0F3891) },
8892     { PREFIX_TABLE (PREFIX_VEX_0F3892) },
8893     { PREFIX_TABLE (PREFIX_VEX_0F3893) },
8894     { Bad_Opcode },
8895     { Bad_Opcode },
8896     { PREFIX_TABLE (PREFIX_VEX_0F3896) },
8897     { PREFIX_TABLE (PREFIX_VEX_0F3897) },
8898     /* 98 */
8899     { PREFIX_TABLE (PREFIX_VEX_0F3898) },
8900     { PREFIX_TABLE (PREFIX_VEX_0F3899) },
8901     { PREFIX_TABLE (PREFIX_VEX_0F389A) },
8902     { PREFIX_TABLE (PREFIX_VEX_0F389B) },
8903     { PREFIX_TABLE (PREFIX_VEX_0F389C) },
8904     { PREFIX_TABLE (PREFIX_VEX_0F389D) },
8905     { PREFIX_TABLE (PREFIX_VEX_0F389E) },
8906     { PREFIX_TABLE (PREFIX_VEX_0F389F) },
8907     /* a0 */
8908     { Bad_Opcode },
8909     { Bad_Opcode },
8910     { Bad_Opcode },
8911     { Bad_Opcode },
8912     { Bad_Opcode },
8913     { Bad_Opcode },
8914     { PREFIX_TABLE (PREFIX_VEX_0F38A6) },
8915     { PREFIX_TABLE (PREFIX_VEX_0F38A7) },
8916     /* a8 */
8917     { PREFIX_TABLE (PREFIX_VEX_0F38A8) },
8918     { PREFIX_TABLE (PREFIX_VEX_0F38A9) },
8919     { PREFIX_TABLE (PREFIX_VEX_0F38AA) },
8920     { PREFIX_TABLE (PREFIX_VEX_0F38AB) },
8921     { PREFIX_TABLE (PREFIX_VEX_0F38AC) },
8922     { PREFIX_TABLE (PREFIX_VEX_0F38AD) },
8923     { PREFIX_TABLE (PREFIX_VEX_0F38AE) },
8924     { PREFIX_TABLE (PREFIX_VEX_0F38AF) },
8925     /* b0 */
8926     { Bad_Opcode },
8927     { Bad_Opcode },
8928     { Bad_Opcode },
8929     { Bad_Opcode },
8930     { Bad_Opcode },
8931     { Bad_Opcode },
8932     { PREFIX_TABLE (PREFIX_VEX_0F38B6) },
8933     { PREFIX_TABLE (PREFIX_VEX_0F38B7) },
8934     /* b8 */
8935     { PREFIX_TABLE (PREFIX_VEX_0F38B8) },
8936     { PREFIX_TABLE (PREFIX_VEX_0F38B9) },
8937     { PREFIX_TABLE (PREFIX_VEX_0F38BA) },
8938     { PREFIX_TABLE (PREFIX_VEX_0F38BB) },
8939     { PREFIX_TABLE (PREFIX_VEX_0F38BC) },
8940     { PREFIX_TABLE (PREFIX_VEX_0F38BD) },
8941     { PREFIX_TABLE (PREFIX_VEX_0F38BE) },
8942     { PREFIX_TABLE (PREFIX_VEX_0F38BF) },
8943     /* c0 */
8944     { Bad_Opcode },
8945     { Bad_Opcode },
8946     { Bad_Opcode },
8947     { Bad_Opcode },
8948     { Bad_Opcode },
8949     { Bad_Opcode },
8950     { Bad_Opcode },
8951     { Bad_Opcode },
8952     /* c8 */
8953     { Bad_Opcode },
8954     { Bad_Opcode },
8955     { Bad_Opcode },
8956     { Bad_Opcode },
8957     { Bad_Opcode },
8958     { Bad_Opcode },
8959     { Bad_Opcode },
8960     { PREFIX_TABLE (PREFIX_VEX_0F38CF) },
8961     /* d0 */
8962     { Bad_Opcode },
8963     { Bad_Opcode },
8964     { Bad_Opcode },
8965     { Bad_Opcode },
8966     { Bad_Opcode },
8967     { Bad_Opcode },
8968     { Bad_Opcode },
8969     { Bad_Opcode },
8970     /* d8 */
8971     { Bad_Opcode },
8972     { Bad_Opcode },
8973     { Bad_Opcode },
8974     { PREFIX_TABLE (PREFIX_VEX_0F38DB) },
8975     { PREFIX_TABLE (PREFIX_VEX_0F38DC) },
8976     { PREFIX_TABLE (PREFIX_VEX_0F38DD) },
8977     { PREFIX_TABLE (PREFIX_VEX_0F38DE) },
8978     { PREFIX_TABLE (PREFIX_VEX_0F38DF) },
8979     /* e0 */
8980     { Bad_Opcode },
8981     { Bad_Opcode },
8982     { Bad_Opcode },
8983     { Bad_Opcode },
8984     { Bad_Opcode },
8985     { Bad_Opcode },
8986     { Bad_Opcode },
8987     { Bad_Opcode },
8988     /* e8 */
8989     { Bad_Opcode },
8990     { Bad_Opcode },
8991     { Bad_Opcode },
8992     { Bad_Opcode },
8993     { Bad_Opcode },
8994     { Bad_Opcode },
8995     { Bad_Opcode },
8996     { Bad_Opcode },
8997     /* f0 */
8998     { Bad_Opcode },
8999     { Bad_Opcode },
9000     { PREFIX_TABLE (PREFIX_VEX_0F38F2) },
9001     { REG_TABLE (REG_VEX_0F38F3) },
9002     { Bad_Opcode },
9003     { PREFIX_TABLE (PREFIX_VEX_0F38F5) },
9004     { PREFIX_TABLE (PREFIX_VEX_0F38F6) },
9005     { PREFIX_TABLE (PREFIX_VEX_0F38F7) },
9006     /* f8 */
9007     { Bad_Opcode },
9008     { Bad_Opcode },
9009     { Bad_Opcode },
9010     { Bad_Opcode },
9011     { Bad_Opcode },
9012     { Bad_Opcode },
9013     { Bad_Opcode },
9014     { Bad_Opcode },
9015   },
9016   /* VEX_0F3A */
9017   {
9018     /* 00 */
9019     { PREFIX_TABLE (PREFIX_VEX_0F3A00) },
9020     { PREFIX_TABLE (PREFIX_VEX_0F3A01) },
9021     { PREFIX_TABLE (PREFIX_VEX_0F3A02) },
9022     { Bad_Opcode },
9023     { PREFIX_TABLE (PREFIX_VEX_0F3A04) },
9024     { PREFIX_TABLE (PREFIX_VEX_0F3A05) },
9025     { PREFIX_TABLE (PREFIX_VEX_0F3A06) },
9026     { Bad_Opcode },
9027     /* 08 */
9028     { PREFIX_TABLE (PREFIX_VEX_0F3A08) },
9029     { PREFIX_TABLE (PREFIX_VEX_0F3A09) },
9030     { PREFIX_TABLE (PREFIX_VEX_0F3A0A) },
9031     { PREFIX_TABLE (PREFIX_VEX_0F3A0B) },
9032     { PREFIX_TABLE (PREFIX_VEX_0F3A0C) },
9033     { PREFIX_TABLE (PREFIX_VEX_0F3A0D) },
9034     { PREFIX_TABLE (PREFIX_VEX_0F3A0E) },
9035     { PREFIX_TABLE (PREFIX_VEX_0F3A0F) },
9036     /* 10 */
9037     { Bad_Opcode },
9038     { Bad_Opcode },
9039     { Bad_Opcode },
9040     { Bad_Opcode },
9041     { PREFIX_TABLE (PREFIX_VEX_0F3A14) },
9042     { PREFIX_TABLE (PREFIX_VEX_0F3A15) },
9043     { PREFIX_TABLE (PREFIX_VEX_0F3A16) },
9044     { PREFIX_TABLE (PREFIX_VEX_0F3A17) },
9045     /* 18 */
9046     { PREFIX_TABLE (PREFIX_VEX_0F3A18) },
9047     { PREFIX_TABLE (PREFIX_VEX_0F3A19) },
9048     { Bad_Opcode },
9049     { Bad_Opcode },
9050     { Bad_Opcode },
9051     { PREFIX_TABLE (PREFIX_VEX_0F3A1D) },
9052     { Bad_Opcode },
9053     { Bad_Opcode },
9054     /* 20 */
9055     { PREFIX_TABLE (PREFIX_VEX_0F3A20) },
9056     { PREFIX_TABLE (PREFIX_VEX_0F3A21) },
9057     { PREFIX_TABLE (PREFIX_VEX_0F3A22) },
9058     { Bad_Opcode },
9059     { Bad_Opcode },
9060     { Bad_Opcode },
9061     { Bad_Opcode },
9062     { Bad_Opcode },
9063     /* 28 */
9064     { Bad_Opcode },
9065     { Bad_Opcode },
9066     { Bad_Opcode },
9067     { Bad_Opcode },
9068     { Bad_Opcode },
9069     { Bad_Opcode },
9070     { Bad_Opcode },
9071     { Bad_Opcode },
9072     /* 30 */
9073     { PREFIX_TABLE (PREFIX_VEX_0F3A30) },
9074     { PREFIX_TABLE (PREFIX_VEX_0F3A31) },
9075     { PREFIX_TABLE (PREFIX_VEX_0F3A32) },
9076     { PREFIX_TABLE (PREFIX_VEX_0F3A33) },
9077     { Bad_Opcode },
9078     { Bad_Opcode },
9079     { Bad_Opcode },
9080     { Bad_Opcode },
9081     /* 38 */
9082     { PREFIX_TABLE (PREFIX_VEX_0F3A38) },
9083     { PREFIX_TABLE (PREFIX_VEX_0F3A39) },
9084     { Bad_Opcode },
9085     { Bad_Opcode },
9086     { Bad_Opcode },
9087     { Bad_Opcode },
9088     { Bad_Opcode },
9089     { Bad_Opcode },
9090     /* 40 */
9091     { PREFIX_TABLE (PREFIX_VEX_0F3A40) },
9092     { PREFIX_TABLE (PREFIX_VEX_0F3A41) },
9093     { PREFIX_TABLE (PREFIX_VEX_0F3A42) },
9094     { Bad_Opcode },
9095     { PREFIX_TABLE (PREFIX_VEX_0F3A44) },
9096     { Bad_Opcode },
9097     { PREFIX_TABLE (PREFIX_VEX_0F3A46) },
9098     { Bad_Opcode },
9099     /* 48 */
9100     { PREFIX_TABLE (PREFIX_VEX_0F3A48) },
9101     { PREFIX_TABLE (PREFIX_VEX_0F3A49) },
9102     { PREFIX_TABLE (PREFIX_VEX_0F3A4A) },
9103     { PREFIX_TABLE (PREFIX_VEX_0F3A4B) },
9104     { PREFIX_TABLE (PREFIX_VEX_0F3A4C) },
9105     { Bad_Opcode },
9106     { Bad_Opcode },
9107     { Bad_Opcode },
9108     /* 50 */
9109     { Bad_Opcode },
9110     { Bad_Opcode },
9111     { Bad_Opcode },
9112     { Bad_Opcode },
9113     { Bad_Opcode },
9114     { Bad_Opcode },
9115     { Bad_Opcode },
9116     { Bad_Opcode },
9117     /* 58 */
9118     { Bad_Opcode },
9119     { Bad_Opcode },
9120     { Bad_Opcode },
9121     { Bad_Opcode },
9122     { PREFIX_TABLE (PREFIX_VEX_0F3A5C) },
9123     { PREFIX_TABLE (PREFIX_VEX_0F3A5D) },
9124     { PREFIX_TABLE (PREFIX_VEX_0F3A5E) },
9125     { PREFIX_TABLE (PREFIX_VEX_0F3A5F) },
9126     /* 60 */
9127     { PREFIX_TABLE (PREFIX_VEX_0F3A60) },
9128     { PREFIX_TABLE (PREFIX_VEX_0F3A61) },
9129     { PREFIX_TABLE (PREFIX_VEX_0F3A62) },
9130     { PREFIX_TABLE (PREFIX_VEX_0F3A63) },
9131     { Bad_Opcode },
9132     { Bad_Opcode },
9133     { Bad_Opcode },
9134     { Bad_Opcode },
9135     /* 68 */
9136     { PREFIX_TABLE (PREFIX_VEX_0F3A68) },
9137     { PREFIX_TABLE (PREFIX_VEX_0F3A69) },
9138     { PREFIX_TABLE (PREFIX_VEX_0F3A6A) },
9139     { PREFIX_TABLE (PREFIX_VEX_0F3A6B) },
9140     { PREFIX_TABLE (PREFIX_VEX_0F3A6C) },
9141     { PREFIX_TABLE (PREFIX_VEX_0F3A6D) },
9142     { PREFIX_TABLE (PREFIX_VEX_0F3A6E) },
9143     { PREFIX_TABLE (PREFIX_VEX_0F3A6F) },
9144     /* 70 */
9145     { Bad_Opcode },
9146     { Bad_Opcode },
9147     { Bad_Opcode },
9148     { Bad_Opcode },
9149     { Bad_Opcode },
9150     { Bad_Opcode },
9151     { Bad_Opcode },
9152     { Bad_Opcode },
9153     /* 78 */
9154     { PREFIX_TABLE (PREFIX_VEX_0F3A78) },
9155     { PREFIX_TABLE (PREFIX_VEX_0F3A79) },
9156     { PREFIX_TABLE (PREFIX_VEX_0F3A7A) },
9157     { PREFIX_TABLE (PREFIX_VEX_0F3A7B) },
9158     { PREFIX_TABLE (PREFIX_VEX_0F3A7C) },
9159     { PREFIX_TABLE (PREFIX_VEX_0F3A7D) },
9160     { PREFIX_TABLE (PREFIX_VEX_0F3A7E) },
9161     { PREFIX_TABLE (PREFIX_VEX_0F3A7F) },
9162     /* 80 */
9163     { Bad_Opcode },
9164     { Bad_Opcode },
9165     { Bad_Opcode },
9166     { Bad_Opcode },
9167     { Bad_Opcode },
9168     { Bad_Opcode },
9169     { Bad_Opcode },
9170     { Bad_Opcode },
9171     /* 88 */
9172     { Bad_Opcode },
9173     { Bad_Opcode },
9174     { Bad_Opcode },
9175     { Bad_Opcode },
9176     { Bad_Opcode },
9177     { Bad_Opcode },
9178     { Bad_Opcode },
9179     { Bad_Opcode },
9180     /* 90 */
9181     { Bad_Opcode },
9182     { Bad_Opcode },
9183     { Bad_Opcode },
9184     { Bad_Opcode },
9185     { Bad_Opcode },
9186     { Bad_Opcode },
9187     { Bad_Opcode },
9188     { Bad_Opcode },
9189     /* 98 */
9190     { Bad_Opcode },
9191     { Bad_Opcode },
9192     { Bad_Opcode },
9193     { Bad_Opcode },
9194     { Bad_Opcode },
9195     { Bad_Opcode },
9196     { Bad_Opcode },
9197     { Bad_Opcode },
9198     /* a0 */
9199     { Bad_Opcode },
9200     { Bad_Opcode },
9201     { Bad_Opcode },
9202     { Bad_Opcode },
9203     { Bad_Opcode },
9204     { Bad_Opcode },
9205     { Bad_Opcode },
9206     { Bad_Opcode },
9207     /* a8 */
9208     { Bad_Opcode },
9209     { Bad_Opcode },
9210     { Bad_Opcode },
9211     { Bad_Opcode },
9212     { Bad_Opcode },
9213     { Bad_Opcode },
9214     { Bad_Opcode },
9215     { Bad_Opcode },
9216     /* b0 */
9217     { Bad_Opcode },
9218     { Bad_Opcode },
9219     { Bad_Opcode },
9220     { Bad_Opcode },
9221     { Bad_Opcode },
9222     { Bad_Opcode },
9223     { Bad_Opcode },
9224     { Bad_Opcode },
9225     /* b8 */
9226     { Bad_Opcode },
9227     { Bad_Opcode },
9228     { Bad_Opcode },
9229     { Bad_Opcode },
9230     { Bad_Opcode },
9231     { Bad_Opcode },
9232     { Bad_Opcode },
9233     { Bad_Opcode },
9234     /* c0 */
9235     { Bad_Opcode },
9236     { Bad_Opcode },
9237     { Bad_Opcode },
9238     { Bad_Opcode },
9239     { Bad_Opcode },
9240     { Bad_Opcode },
9241     { Bad_Opcode },
9242     { Bad_Opcode },
9243     /* c8 */
9244     { Bad_Opcode },
9245     { Bad_Opcode },
9246     { Bad_Opcode },
9247     { Bad_Opcode },
9248     { Bad_Opcode },
9249     { Bad_Opcode },
9250     { PREFIX_TABLE(PREFIX_VEX_0F3ACE) },
9251     { PREFIX_TABLE(PREFIX_VEX_0F3ACF) },
9252     /* d0 */
9253     { Bad_Opcode },
9254     { Bad_Opcode },
9255     { Bad_Opcode },
9256     { Bad_Opcode },
9257     { Bad_Opcode },
9258     { Bad_Opcode },
9259     { Bad_Opcode },
9260     { Bad_Opcode },
9261     /* d8 */
9262     { Bad_Opcode },
9263     { Bad_Opcode },
9264     { Bad_Opcode },
9265     { Bad_Opcode },
9266     { Bad_Opcode },
9267     { Bad_Opcode },
9268     { Bad_Opcode },
9269     { PREFIX_TABLE (PREFIX_VEX_0F3ADF) },
9270     /* e0 */
9271     { Bad_Opcode },
9272     { Bad_Opcode },
9273     { Bad_Opcode },
9274     { Bad_Opcode },
9275     { Bad_Opcode },
9276     { Bad_Opcode },
9277     { Bad_Opcode },
9278     { Bad_Opcode },
9279     /* e8 */
9280     { Bad_Opcode },
9281     { Bad_Opcode },
9282     { Bad_Opcode },
9283     { Bad_Opcode },
9284     { Bad_Opcode },
9285     { Bad_Opcode },
9286     { Bad_Opcode },
9287     { Bad_Opcode },
9288     /* f0 */
9289     { PREFIX_TABLE (PREFIX_VEX_0F3AF0) },
9290     { Bad_Opcode },
9291     { Bad_Opcode },
9292     { Bad_Opcode },
9293     { Bad_Opcode },
9294     { Bad_Opcode },
9295     { Bad_Opcode },
9296     { Bad_Opcode },
9297     /* f8 */
9298     { Bad_Opcode },
9299     { Bad_Opcode },
9300     { Bad_Opcode },
9301     { Bad_Opcode },
9302     { Bad_Opcode },
9303     { Bad_Opcode },
9304     { Bad_Opcode },
9305     { Bad_Opcode },
9306   },
9307 };
9308
9309 #define NEED_OPCODE_TABLE
9310 #include "i386-dis-evex.h"
9311 #undef NEED_OPCODE_TABLE
9312 static const struct dis386 vex_len_table[][2] = {
9313   /* VEX_LEN_0F12_P_0_M_0 */
9314   {
9315     { "vmovlps",        { XM, Vex128, EXq }, 0 },
9316   },
9317
9318   /* VEX_LEN_0F12_P_0_M_1 */
9319   {
9320     { "vmovhlps",       { XM, Vex128, EXq }, 0 },
9321   },
9322
9323   /* VEX_LEN_0F12_P_2 */
9324   {
9325     { "vmovlpd",        { XM, Vex128, EXq }, 0 },
9326   },
9327
9328   /* VEX_LEN_0F13_M_0 */
9329   {
9330     { "vmovlpX",        { EXq, XM }, 0 },
9331   },
9332
9333   /* VEX_LEN_0F16_P_0_M_0 */
9334   {
9335     { "vmovhps",        { XM, Vex128, EXq }, 0 },
9336   },
9337
9338   /* VEX_LEN_0F16_P_0_M_1 */
9339   {
9340     { "vmovlhps",       { XM, Vex128, EXq }, 0 },
9341   },
9342
9343   /* VEX_LEN_0F16_P_2 */
9344   {
9345     { "vmovhpd",        { XM, Vex128, EXq }, 0 },
9346   },
9347
9348   /* VEX_LEN_0F17_M_0 */
9349   {
9350     { "vmovhpX",        { EXq, XM }, 0 },
9351   },
9352
9353   /* VEX_LEN_0F2A_P_1 */
9354   {
9355     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9356     { "vcvtsi2ss%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9357   },
9358
9359   /* VEX_LEN_0F2A_P_3 */
9360   {
9361     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9362     { "vcvtsi2sd%LQ",   { XMScalar, VexScalar, Ev }, 0 },
9363   },
9364
9365   /* VEX_LEN_0F2C_P_1 */
9366   {
9367     { "vcvttss2si",     { Gv, EXdScalar }, 0 },
9368     { "vcvttss2si",     { Gv, EXdScalar }, 0 },
9369   },
9370
9371   /* VEX_LEN_0F2C_P_3 */
9372   {
9373     { "vcvttsd2si",     { Gv, EXqScalar }, 0 },
9374     { "vcvttsd2si",     { Gv, EXqScalar }, 0 },
9375   },
9376
9377   /* VEX_LEN_0F2D_P_1 */
9378   {
9379     { "vcvtss2si",      { Gv, EXdScalar }, 0 },
9380     { "vcvtss2si",      { Gv, EXdScalar }, 0 },
9381   },
9382
9383   /* VEX_LEN_0F2D_P_3 */
9384   {
9385     { "vcvtsd2si",      { Gv, EXqScalar }, 0 },
9386     { "vcvtsd2si",      { Gv, EXqScalar }, 0 },
9387   },
9388
9389   /* VEX_LEN_0F41_P_0 */
9390   {
9391     { Bad_Opcode },
9392     { VEX_W_TABLE (VEX_W_0F41_P_0_LEN_1) },
9393   },
9394   /* VEX_LEN_0F41_P_2 */
9395   {
9396     { Bad_Opcode },
9397     { VEX_W_TABLE (VEX_W_0F41_P_2_LEN_1) },
9398   },
9399   /* VEX_LEN_0F42_P_0 */
9400   {
9401     { Bad_Opcode },
9402     { VEX_W_TABLE (VEX_W_0F42_P_0_LEN_1) },
9403   },
9404   /* VEX_LEN_0F42_P_2 */
9405   {
9406     { Bad_Opcode },
9407     { VEX_W_TABLE (VEX_W_0F42_P_2_LEN_1) },
9408   },
9409   /* VEX_LEN_0F44_P_0 */
9410   {
9411     { VEX_W_TABLE (VEX_W_0F44_P_0_LEN_0) },
9412   },
9413   /* VEX_LEN_0F44_P_2 */
9414   {
9415     { VEX_W_TABLE (VEX_W_0F44_P_2_LEN_0) },
9416   },
9417   /* VEX_LEN_0F45_P_0 */
9418   {
9419     { Bad_Opcode },
9420     { VEX_W_TABLE (VEX_W_0F45_P_0_LEN_1) },
9421   },
9422   /* VEX_LEN_0F45_P_2 */
9423   {
9424     { Bad_Opcode },
9425     { VEX_W_TABLE (VEX_W_0F45_P_2_LEN_1) },
9426   },
9427   /* VEX_LEN_0F46_P_0 */
9428   {
9429     { Bad_Opcode },
9430     { VEX_W_TABLE (VEX_W_0F46_P_0_LEN_1) },
9431   },
9432   /* VEX_LEN_0F46_P_2 */
9433   {
9434     { Bad_Opcode },
9435     { VEX_W_TABLE (VEX_W_0F46_P_2_LEN_1) },
9436   },
9437   /* VEX_LEN_0F47_P_0 */
9438   {
9439     { Bad_Opcode },
9440     { VEX_W_TABLE (VEX_W_0F47_P_0_LEN_1) },
9441   },
9442   /* VEX_LEN_0F47_P_2 */
9443   {
9444     { Bad_Opcode },
9445     { VEX_W_TABLE (VEX_W_0F47_P_2_LEN_1) },
9446   },
9447   /* VEX_LEN_0F4A_P_0 */
9448   {
9449     { Bad_Opcode },
9450     { VEX_W_TABLE (VEX_W_0F4A_P_0_LEN_1) },
9451   },
9452   /* VEX_LEN_0F4A_P_2 */
9453   {
9454     { Bad_Opcode },
9455     { VEX_W_TABLE (VEX_W_0F4A_P_2_LEN_1) },
9456   },
9457   /* VEX_LEN_0F4B_P_0 */
9458   {
9459     { Bad_Opcode },
9460     { VEX_W_TABLE (VEX_W_0F4B_P_0_LEN_1) },
9461   },
9462   /* VEX_LEN_0F4B_P_2 */
9463   {
9464     { Bad_Opcode },
9465     { VEX_W_TABLE (VEX_W_0F4B_P_2_LEN_1) },
9466   },
9467
9468   /* VEX_LEN_0F6E_P_2 */
9469   {
9470     { "vmovK",          { XMScalar, Edq }, 0 },
9471   },
9472
9473   /* VEX_LEN_0F77_P_1 */
9474   {
9475     { "vzeroupper",     { XX }, 0 },
9476     { "vzeroall",       { XX }, 0 },
9477   },
9478
9479   /* VEX_LEN_0F7E_P_1 */
9480   {
9481     { "vmovq",          { XMScalar, EXqScalar }, 0 },
9482   },
9483
9484   /* VEX_LEN_0F7E_P_2 */
9485   {
9486     { "vmovK",          { Edq, XMScalar }, 0 },
9487   },
9488
9489   /* VEX_LEN_0F90_P_0 */
9490   {
9491     { VEX_W_TABLE (VEX_W_0F90_P_0_LEN_0) },
9492   },
9493
9494   /* VEX_LEN_0F90_P_2 */
9495   {
9496     { VEX_W_TABLE (VEX_W_0F90_P_2_LEN_0) },
9497   },
9498
9499   /* VEX_LEN_0F91_P_0 */
9500   {
9501     { VEX_W_TABLE (VEX_W_0F91_P_0_LEN_0) },
9502   },
9503
9504   /* VEX_LEN_0F91_P_2 */
9505   {
9506     { VEX_W_TABLE (VEX_W_0F91_P_2_LEN_0) },
9507   },
9508
9509   /* VEX_LEN_0F92_P_0 */
9510   {
9511     { VEX_W_TABLE (VEX_W_0F92_P_0_LEN_0) },
9512   },
9513
9514   /* VEX_LEN_0F92_P_2 */
9515   {
9516     { VEX_W_TABLE (VEX_W_0F92_P_2_LEN_0) },
9517   },
9518
9519   /* VEX_LEN_0F92_P_3 */
9520   {
9521     { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
9522   },
9523
9524   /* VEX_LEN_0F93_P_0 */
9525   {
9526     { VEX_W_TABLE (VEX_W_0F93_P_0_LEN_0) },
9527   },
9528
9529   /* VEX_LEN_0F93_P_2 */
9530   {
9531     { VEX_W_TABLE (VEX_W_0F93_P_2_LEN_0) },
9532   },
9533
9534   /* VEX_LEN_0F93_P_3 */
9535   {
9536     { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
9537   },
9538
9539   /* VEX_LEN_0F98_P_0 */
9540   {
9541     { VEX_W_TABLE (VEX_W_0F98_P_0_LEN_0) },
9542   },
9543
9544   /* VEX_LEN_0F98_P_2 */
9545   {
9546     { VEX_W_TABLE (VEX_W_0F98_P_2_LEN_0) },
9547   },
9548
9549   /* VEX_LEN_0F99_P_0 */
9550   {
9551     { VEX_W_TABLE (VEX_W_0F99_P_0_LEN_0) },
9552   },
9553
9554   /* VEX_LEN_0F99_P_2 */
9555   {
9556     { VEX_W_TABLE (VEX_W_0F99_P_2_LEN_0) },
9557   },
9558
9559   /* VEX_LEN_0FAE_R_2_M_0 */
9560   {
9561     { "vldmxcsr",       { Md }, 0 },
9562   },
9563
9564   /* VEX_LEN_0FAE_R_3_M_0 */
9565   {
9566     { "vstmxcsr",       { Md }, 0 },
9567   },
9568
9569   /* VEX_LEN_0FC4_P_2 */
9570   {
9571     { "vpinsrw",        { XM, Vex128, Edqw, Ib }, 0 },
9572   },
9573
9574   /* VEX_LEN_0FC5_P_2 */
9575   {
9576     { "vpextrw",        { Gdq, XS, Ib }, 0 },
9577   },
9578
9579   /* VEX_LEN_0FD6_P_2 */
9580   {
9581     { "vmovq",          { EXqScalarS, XMScalar }, 0 },
9582   },
9583
9584   /* VEX_LEN_0FF7_P_2 */
9585   {
9586     { "vmaskmovdqu",    { XM, XS }, 0 },
9587   },
9588
9589   /* VEX_LEN_0F3816_P_2 */
9590   {
9591     { Bad_Opcode },
9592     { VEX_W_TABLE (VEX_W_0F3816_P_2) },
9593   },
9594
9595   /* VEX_LEN_0F3819_P_2 */
9596   {
9597     { Bad_Opcode },
9598     { VEX_W_TABLE (VEX_W_0F3819_P_2) },
9599   },
9600
9601   /* VEX_LEN_0F381A_P_2_M_0 */
9602   {
9603     { Bad_Opcode },
9604     { VEX_W_TABLE (VEX_W_0F381A_P_2_M_0) },
9605   },
9606
9607   /* VEX_LEN_0F3836_P_2 */
9608   {
9609     { Bad_Opcode },
9610     { VEX_W_TABLE (VEX_W_0F3836_P_2) },
9611   },
9612
9613   /* VEX_LEN_0F3841_P_2 */
9614   {
9615     { "vphminposuw",    { XM, EXx }, 0 },
9616   },
9617
9618   /* VEX_LEN_0F385A_P_2_M_0 */
9619   {
9620     { Bad_Opcode },
9621     { VEX_W_TABLE (VEX_W_0F385A_P_2_M_0) },
9622   },
9623
9624   /* VEX_LEN_0F38DB_P_2 */
9625   {
9626     { "vaesimc",        { XM, EXx }, 0 },
9627   },
9628
9629   /* VEX_LEN_0F38F2_P_0 */
9630   {
9631     { "andnS",          { Gdq, VexGdq, Edq }, 0 },
9632   },
9633
9634   /* VEX_LEN_0F38F3_R_1_P_0 */
9635   {
9636     { "blsrS",          { VexGdq, Edq }, 0 },
9637   },
9638
9639   /* VEX_LEN_0F38F3_R_2_P_0 */
9640   {
9641     { "blsmskS",        { VexGdq, Edq }, 0 },
9642   },
9643
9644   /* VEX_LEN_0F38F3_R_3_P_0 */
9645   {
9646     { "blsiS",          { VexGdq, Edq }, 0 },
9647   },
9648
9649   /* VEX_LEN_0F38F5_P_0 */
9650   {
9651     { "bzhiS",          { Gdq, Edq, VexGdq }, 0 },
9652   },
9653
9654   /* VEX_LEN_0F38F5_P_1 */
9655   {
9656     { "pextS",          { Gdq, VexGdq, Edq }, 0 },
9657   },
9658
9659   /* VEX_LEN_0F38F5_P_3 */
9660   {
9661     { "pdepS",          { Gdq, VexGdq, Edq }, 0 },
9662   },
9663
9664   /* VEX_LEN_0F38F6_P_3 */
9665   {
9666     { "mulxS",          { Gdq, VexGdq, Edq }, 0 },
9667   },
9668
9669   /* VEX_LEN_0F38F7_P_0 */
9670   {
9671     { "bextrS",         { Gdq, Edq, VexGdq }, 0 },
9672   },
9673
9674   /* VEX_LEN_0F38F7_P_1 */
9675   {
9676     { "sarxS",          { Gdq, Edq, VexGdq }, 0 },
9677   },
9678
9679   /* VEX_LEN_0F38F7_P_2 */
9680   {
9681     { "shlxS",          { Gdq, Edq, VexGdq }, 0 },
9682   },
9683
9684   /* VEX_LEN_0F38F7_P_3 */
9685   {
9686     { "shrxS",          { Gdq, Edq, VexGdq }, 0 },
9687   },
9688
9689   /* VEX_LEN_0F3A00_P_2 */
9690   {
9691     { Bad_Opcode },
9692     { VEX_W_TABLE (VEX_W_0F3A00_P_2) },
9693   },
9694
9695   /* VEX_LEN_0F3A01_P_2 */
9696   {
9697     { Bad_Opcode },
9698     { VEX_W_TABLE (VEX_W_0F3A01_P_2) },
9699   },
9700
9701   /* VEX_LEN_0F3A06_P_2 */
9702   {
9703     { Bad_Opcode },
9704     { VEX_W_TABLE (VEX_W_0F3A06_P_2) },
9705   },
9706
9707   /* VEX_LEN_0F3A14_P_2 */
9708   {
9709     { "vpextrb",        { Edqb, XM, Ib }, 0 },
9710   },
9711
9712   /* VEX_LEN_0F3A15_P_2 */
9713   {
9714     { "vpextrw",        { Edqw, XM, Ib }, 0 },
9715   },
9716
9717   /* VEX_LEN_0F3A16_P_2  */
9718   {
9719     { "vpextrK",        { Edq, XM, Ib }, 0 },
9720   },
9721
9722   /* VEX_LEN_0F3A17_P_2 */
9723   {
9724     { "vextractps",     { Edqd, XM, Ib }, 0 },
9725   },
9726
9727   /* VEX_LEN_0F3A18_P_2 */
9728   {
9729     { Bad_Opcode },
9730     { VEX_W_TABLE (VEX_W_0F3A18_P_2) },
9731   },
9732
9733   /* VEX_LEN_0F3A19_P_2 */
9734   {
9735     { Bad_Opcode },
9736     { VEX_W_TABLE (VEX_W_0F3A19_P_2) },
9737   },
9738
9739   /* VEX_LEN_0F3A20_P_2 */
9740   {
9741     { "vpinsrb",        { XM, Vex128, Edqb, Ib }, 0 },
9742   },
9743
9744   /* VEX_LEN_0F3A21_P_2 */
9745   {
9746     { "vinsertps",      { XM, Vex128, EXd, Ib }, 0 },
9747   },
9748
9749   /* VEX_LEN_0F3A22_P_2 */
9750   {
9751     { "vpinsrK",        { XM, Vex128, Edq, Ib }, 0 },
9752   },
9753
9754   /* VEX_LEN_0F3A30_P_2 */
9755   {
9756     { VEX_W_TABLE (VEX_W_0F3A30_P_2_LEN_0) },
9757   },
9758
9759   /* VEX_LEN_0F3A31_P_2 */
9760   {
9761     { VEX_W_TABLE (VEX_W_0F3A31_P_2_LEN_0) },
9762   },
9763
9764   /* VEX_LEN_0F3A32_P_2 */
9765   {
9766     { VEX_W_TABLE (VEX_W_0F3A32_P_2_LEN_0) },
9767   },
9768
9769   /* VEX_LEN_0F3A33_P_2 */
9770   {
9771     { VEX_W_TABLE (VEX_W_0F3A33_P_2_LEN_0) },
9772   },
9773
9774   /* VEX_LEN_0F3A38_P_2 */
9775   {
9776     { Bad_Opcode },
9777     { VEX_W_TABLE (VEX_W_0F3A38_P_2) },
9778   },
9779
9780   /* VEX_LEN_0F3A39_P_2 */
9781   {
9782     { Bad_Opcode },
9783     { VEX_W_TABLE (VEX_W_0F3A39_P_2) },
9784   },
9785
9786   /* VEX_LEN_0F3A41_P_2 */
9787   {
9788     { "vdppd",          { XM, Vex128, EXx, Ib }, 0 },
9789   },
9790
9791   /* VEX_LEN_0F3A46_P_2 */
9792   {
9793     { Bad_Opcode },
9794     { VEX_W_TABLE (VEX_W_0F3A46_P_2) },
9795   },
9796
9797   /* VEX_LEN_0F3A60_P_2 */
9798   {
9799     { "vpcmpestrm",     { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9800   },
9801
9802   /* VEX_LEN_0F3A61_P_2 */
9803   {
9804     { "vpcmpestri",     { XM, { PCMPESTR_Fixup, x_mode }, Ib }, 0 },
9805   },
9806
9807   /* VEX_LEN_0F3A62_P_2 */
9808   {
9809     { "vpcmpistrm",     { XM, EXx, Ib }, 0 },
9810   },
9811
9812   /* VEX_LEN_0F3A63_P_2 */
9813   {
9814     { "vpcmpistri",     { XM, EXx, Ib }, 0 },
9815   },
9816
9817   /* VEX_LEN_0F3A6A_P_2 */
9818   {
9819     { "vfmaddss",       { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9820   },
9821
9822   /* VEX_LEN_0F3A6B_P_2 */
9823   {
9824     { "vfmaddsd",       { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9825   },
9826
9827   /* VEX_LEN_0F3A6E_P_2 */
9828   {
9829     { "vfmsubss",       { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9830   },
9831
9832   /* VEX_LEN_0F3A6F_P_2 */
9833   {
9834     { "vfmsubsd",       { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9835   },
9836
9837   /* VEX_LEN_0F3A7A_P_2 */
9838   {
9839     { "vfnmaddss",      { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9840   },
9841
9842   /* VEX_LEN_0F3A7B_P_2 */
9843   {
9844     { "vfnmaddsd",      { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9845   },
9846
9847   /* VEX_LEN_0F3A7E_P_2 */
9848   {
9849     { "vfnmsubss",      { XMVexW, Vex128, EXdVexW, EXdVexW }, 0 },
9850   },
9851
9852   /* VEX_LEN_0F3A7F_P_2 */
9853   {
9854     { "vfnmsubsd",      { XMVexW, Vex128, EXqVexW, EXqVexW }, 0 },
9855   },
9856
9857   /* VEX_LEN_0F3ADF_P_2 */
9858   {
9859     { "vaeskeygenassist", { XM, EXx, Ib }, 0 },
9860   },
9861
9862   /* VEX_LEN_0F3AF0_P_3 */
9863   {
9864     { "rorxS",          { Gdq, Edq, Ib }, 0 },
9865   },
9866
9867   /* VEX_LEN_0FXOP_08_CC */
9868   {
9869      { "vpcomb",        { XM, Vex128, EXx, VPCOM }, 0 },
9870   },
9871
9872   /* VEX_LEN_0FXOP_08_CD */
9873   {
9874      { "vpcomw",        { XM, Vex128, EXx, VPCOM }, 0 },
9875   },
9876
9877   /* VEX_LEN_0FXOP_08_CE */
9878   {
9879      { "vpcomd",        { XM, Vex128, EXx, VPCOM }, 0 },
9880   },
9881
9882   /* VEX_LEN_0FXOP_08_CF */
9883   {
9884      { "vpcomq",        { XM, Vex128, EXx, VPCOM }, 0 },
9885   },
9886
9887   /* VEX_LEN_0FXOP_08_EC */
9888   {
9889      { "vpcomub",       { XM, Vex128, EXx, VPCOM }, 0 },
9890   },
9891
9892   /* VEX_LEN_0FXOP_08_ED */
9893   {
9894      { "vpcomuw",       { XM, Vex128, EXx, VPCOM }, 0 },
9895   },
9896
9897   /* VEX_LEN_0FXOP_08_EE */
9898   {
9899      { "vpcomud",       { XM, Vex128, EXx, VPCOM }, 0 },
9900   },
9901
9902   /* VEX_LEN_0FXOP_08_EF */
9903   {
9904      { "vpcomuq",       { XM, Vex128, EXx, VPCOM }, 0 },
9905   },
9906
9907   /* VEX_LEN_0FXOP_09_80 */
9908   {
9909     { "vfrczps",        { XM, EXxmm }, 0 },
9910     { "vfrczps",        { XM, EXymmq }, 0 },
9911   },
9912
9913   /* VEX_LEN_0FXOP_09_81 */
9914   {
9915     { "vfrczpd",        { XM, EXxmm }, 0 },
9916     { "vfrczpd",        { XM, EXymmq }, 0 },
9917   },
9918 };
9919
9920 static const struct dis386 evex_len_table[][3] = {
9921 #define NEED_EVEX_LEN_TABLE
9922 #include "i386-dis-evex.h"
9923 #undef NEED_EVEX_LEN_TABLE
9924 };
9925
9926 static const struct dis386 vex_w_table[][2] = {
9927   {
9928     /* VEX_W_0F41_P_0_LEN_1 */
9929     { MOD_TABLE (MOD_VEX_W_0_0F41_P_0_LEN_1) },
9930     { MOD_TABLE (MOD_VEX_W_1_0F41_P_0_LEN_1) },
9931   },
9932   {
9933     /* VEX_W_0F41_P_2_LEN_1 */
9934     { MOD_TABLE (MOD_VEX_W_0_0F41_P_2_LEN_1) },
9935     { MOD_TABLE (MOD_VEX_W_1_0F41_P_2_LEN_1) }
9936   },
9937   {
9938     /* VEX_W_0F42_P_0_LEN_1 */
9939     { MOD_TABLE (MOD_VEX_W_0_0F42_P_0_LEN_1) },
9940     { MOD_TABLE (MOD_VEX_W_1_0F42_P_0_LEN_1) },
9941   },
9942   {
9943     /* VEX_W_0F42_P_2_LEN_1 */
9944     { MOD_TABLE (MOD_VEX_W_0_0F42_P_2_LEN_1) },
9945     { MOD_TABLE (MOD_VEX_W_1_0F42_P_2_LEN_1) },
9946   },
9947   {
9948     /* VEX_W_0F44_P_0_LEN_0 */
9949     { MOD_TABLE (MOD_VEX_W_0_0F44_P_0_LEN_1) },
9950     { MOD_TABLE (MOD_VEX_W_1_0F44_P_0_LEN_1) },
9951   },
9952   {
9953     /* VEX_W_0F44_P_2_LEN_0 */
9954     { MOD_TABLE (MOD_VEX_W_0_0F44_P_2_LEN_1) },
9955     { MOD_TABLE (MOD_VEX_W_1_0F44_P_2_LEN_1) },
9956   },
9957   {
9958     /* VEX_W_0F45_P_0_LEN_1 */
9959     { MOD_TABLE (MOD_VEX_W_0_0F45_P_0_LEN_1) },
9960     { MOD_TABLE (MOD_VEX_W_1_0F45_P_0_LEN_1) },
9961   },
9962   {
9963     /* VEX_W_0F45_P_2_LEN_1 */
9964     { MOD_TABLE (MOD_VEX_W_0_0F45_P_2_LEN_1) },
9965     { MOD_TABLE (MOD_VEX_W_1_0F45_P_2_LEN_1) },
9966   },
9967   {
9968     /* VEX_W_0F46_P_0_LEN_1 */
9969     { MOD_TABLE (MOD_VEX_W_0_0F46_P_0_LEN_1) },
9970     { MOD_TABLE (MOD_VEX_W_1_0F46_P_0_LEN_1) },
9971   },
9972   {
9973     /* VEX_W_0F46_P_2_LEN_1 */
9974     { MOD_TABLE (MOD_VEX_W_0_0F46_P_2_LEN_1) },
9975     { MOD_TABLE (MOD_VEX_W_1_0F46_P_2_LEN_1) },
9976   },
9977   {
9978     /* VEX_W_0F47_P_0_LEN_1 */
9979     { MOD_TABLE (MOD_VEX_W_0_0F47_P_0_LEN_1) },
9980     { MOD_TABLE (MOD_VEX_W_1_0F47_P_0_LEN_1) },
9981   },
9982   {
9983     /* VEX_W_0F47_P_2_LEN_1 */
9984     { MOD_TABLE (MOD_VEX_W_0_0F47_P_2_LEN_1) },
9985     { MOD_TABLE (MOD_VEX_W_1_0F47_P_2_LEN_1) },
9986   },
9987   {
9988     /* VEX_W_0F4A_P_0_LEN_1 */
9989     { MOD_TABLE (MOD_VEX_W_0_0F4A_P_0_LEN_1) },
9990     { MOD_TABLE (MOD_VEX_W_1_0F4A_P_0_LEN_1) },
9991   },
9992   {
9993     /* VEX_W_0F4A_P_2_LEN_1 */
9994     { MOD_TABLE (MOD_VEX_W_0_0F4A_P_2_LEN_1) },
9995     { MOD_TABLE (MOD_VEX_W_1_0F4A_P_2_LEN_1) },
9996   },
9997   {
9998     /* VEX_W_0F4B_P_0_LEN_1 */
9999     { MOD_TABLE (MOD_VEX_W_0_0F4B_P_0_LEN_1) },
10000     { MOD_TABLE (MOD_VEX_W_1_0F4B_P_0_LEN_1) },
10001   },
10002   {
10003     /* VEX_W_0F4B_P_2_LEN_1 */
10004     { MOD_TABLE (MOD_VEX_W_0_0F4B_P_2_LEN_1) },
10005   },
10006   {
10007     /* VEX_W_0F90_P_0_LEN_0 */
10008     { "kmovw",          { MaskG, MaskE }, 0 },
10009     { "kmovq",          { MaskG, MaskE }, 0 },
10010   },
10011   {
10012     /* VEX_W_0F90_P_2_LEN_0 */
10013     { "kmovb",          { MaskG, MaskBDE }, 0 },
10014     { "kmovd",          { MaskG, MaskBDE }, 0 },
10015   },
10016   {
10017     /* VEX_W_0F91_P_0_LEN_0 */
10018     { MOD_TABLE (MOD_VEX_W_0_0F91_P_0_LEN_0) },
10019     { MOD_TABLE (MOD_VEX_W_1_0F91_P_0_LEN_0) },
10020   },
10021   {
10022     /* VEX_W_0F91_P_2_LEN_0 */
10023     { MOD_TABLE (MOD_VEX_W_0_0F91_P_2_LEN_0) },
10024     { MOD_TABLE (MOD_VEX_W_1_0F91_P_2_LEN_0) },
10025   },
10026   {
10027     /* VEX_W_0F92_P_0_LEN_0 */
10028     { MOD_TABLE (MOD_VEX_W_0_0F92_P_0_LEN_0) },
10029   },
10030   {
10031     /* VEX_W_0F92_P_2_LEN_0 */
10032     { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
10033   },
10034   {
10035     /* VEX_W_0F93_P_0_LEN_0 */
10036     { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
10037   },
10038   {
10039     /* VEX_W_0F93_P_2_LEN_0 */
10040     { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
10041   },
10042   {
10043     /* VEX_W_0F98_P_0_LEN_0 */
10044     { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
10045     { MOD_TABLE (MOD_VEX_W_1_0F98_P_0_LEN_0) },
10046   },
10047   {
10048     /* VEX_W_0F98_P_2_LEN_0 */
10049     { MOD_TABLE (MOD_VEX_W_0_0F98_P_2_LEN_0) },
10050     { MOD_TABLE (MOD_VEX_W_1_0F98_P_2_LEN_0) },
10051   },
10052   {
10053     /* VEX_W_0F99_P_0_LEN_0 */
10054     { MOD_TABLE (MOD_VEX_W_0_0F99_P_0_LEN_0) },
10055     { MOD_TABLE (MOD_VEX_W_1_0F99_P_0_LEN_0) },
10056   },
10057   {
10058     /* VEX_W_0F99_P_2_LEN_0 */
10059     { MOD_TABLE (MOD_VEX_W_0_0F99_P_2_LEN_0) },
10060     { MOD_TABLE (MOD_VEX_W_1_0F99_P_2_LEN_0) },
10061   },
10062   {
10063     /* VEX_W_0F380C_P_2  */
10064     { "vpermilps",      { XM, Vex, EXx }, 0 },
10065   },
10066   {
10067     /* VEX_W_0F380D_P_2  */
10068     { "vpermilpd",      { XM, Vex, EXx }, 0 },
10069   },
10070   {
10071     /* VEX_W_0F380E_P_2  */
10072     { "vtestps",        { XM, EXx }, 0 },
10073   },
10074   {
10075     /* VEX_W_0F380F_P_2  */
10076     { "vtestpd",        { XM, EXx }, 0 },
10077   },
10078   {
10079     /* VEX_W_0F3816_P_2  */
10080     { "vpermps",        { XM, Vex, EXx }, 0 },
10081   },
10082   {
10083     /* VEX_W_0F3818_P_2 */
10084     { "vbroadcastss",   { XM, EXxmm_md }, 0 },
10085   },
10086   {
10087     /* VEX_W_0F3819_P_2 */
10088     { "vbroadcastsd",   { XM, EXxmm_mq }, 0 },
10089   },
10090   {
10091     /* VEX_W_0F381A_P_2_M_0 */
10092     { "vbroadcastf128", { XM, Mxmm }, 0 },
10093   },
10094   {
10095     /* VEX_W_0F382C_P_2_M_0 */
10096     { "vmaskmovps",     { XM, Vex, Mx }, 0 },
10097   },
10098   {
10099     /* VEX_W_0F382D_P_2_M_0 */
10100     { "vmaskmovpd",     { XM, Vex, Mx }, 0 },
10101   },
10102   {
10103     /* VEX_W_0F382E_P_2_M_0 */
10104     { "vmaskmovps",     { Mx, Vex, XM }, 0 },
10105   },
10106   {
10107     /* VEX_W_0F382F_P_2_M_0 */
10108     { "vmaskmovpd",     { Mx, Vex, XM }, 0 },
10109   },
10110   {
10111     /* VEX_W_0F3836_P_2  */
10112     { "vpermd",         { XM, Vex, EXx }, 0 },
10113   },
10114   {
10115     /* VEX_W_0F3846_P_2 */
10116     { "vpsravd",        { XM, Vex, EXx }, 0 },
10117   },
10118   {
10119     /* VEX_W_0F3858_P_2 */
10120     { "vpbroadcastd", { XM, EXxmm_md }, 0 },
10121   },
10122   {
10123     /* VEX_W_0F3859_P_2 */
10124     { "vpbroadcastq",   { XM, EXxmm_mq }, 0 },
10125   },
10126   {
10127     /* VEX_W_0F385A_P_2_M_0 */
10128     { "vbroadcasti128", { XM, Mxmm }, 0 },
10129   },
10130   {
10131     /* VEX_W_0F3878_P_2 */
10132     { "vpbroadcastb",   { XM, EXxmm_mb }, 0 },
10133   },
10134   {
10135     /* VEX_W_0F3879_P_2 */
10136     { "vpbroadcastw",   { XM, EXxmm_mw }, 0 },
10137   },
10138   {
10139     /* VEX_W_0F38CF_P_2 */
10140     { "vgf2p8mulb", { XM, Vex, EXx }, 0 },
10141   },
10142   {
10143     /* VEX_W_0F3A00_P_2 */
10144     { Bad_Opcode },
10145     { "vpermq",         { XM, EXx, Ib }, 0 },
10146   },
10147   {
10148     /* VEX_W_0F3A01_P_2 */
10149     { Bad_Opcode },
10150     { "vpermpd",        { XM, EXx, Ib }, 0 },
10151   },
10152   {
10153     /* VEX_W_0F3A02_P_2 */
10154     { "vpblendd",       { XM, Vex, EXx, Ib }, 0 },
10155   },
10156   {
10157     /* VEX_W_0F3A04_P_2 */
10158     { "vpermilps",      { XM, EXx, Ib }, 0 },
10159   },
10160   {
10161     /* VEX_W_0F3A05_P_2 */
10162     { "vpermilpd",      { XM, EXx, Ib }, 0 },
10163   },
10164   {
10165     /* VEX_W_0F3A06_P_2 */
10166     { "vperm2f128",     { XM, Vex256, EXx, Ib }, 0 },
10167   },
10168   {
10169     /* VEX_W_0F3A18_P_2 */
10170     { "vinsertf128",    { XM, Vex256, EXxmm, Ib }, 0 },
10171   },
10172   {
10173     /* VEX_W_0F3A19_P_2 */
10174     { "vextractf128",   { EXxmm, XM, Ib }, 0 },
10175   },
10176   {
10177     /* VEX_W_0F3A30_P_2_LEN_0 */
10178     { MOD_TABLE (MOD_VEX_W_0_0F3A30_P_2_LEN_0) },
10179     { MOD_TABLE (MOD_VEX_W_1_0F3A30_P_2_LEN_0) },
10180   },
10181   {
10182     /* VEX_W_0F3A31_P_2_LEN_0 */
10183     { MOD_TABLE (MOD_VEX_W_0_0F3A31_P_2_LEN_0) },
10184     { MOD_TABLE (MOD_VEX_W_1_0F3A31_P_2_LEN_0) },
10185   },
10186   {
10187     /* VEX_W_0F3A32_P_2_LEN_0 */
10188     { MOD_TABLE (MOD_VEX_W_0_0F3A32_P_2_LEN_0) },
10189     { MOD_TABLE (MOD_VEX_W_1_0F3A32_P_2_LEN_0) },
10190   },
10191   {
10192     /* VEX_W_0F3A33_P_2_LEN_0 */
10193     { MOD_TABLE (MOD_VEX_W_0_0F3A33_P_2_LEN_0) },
10194     { MOD_TABLE (MOD_VEX_W_1_0F3A33_P_2_LEN_0) },
10195   },
10196   {
10197     /* VEX_W_0F3A38_P_2 */
10198     { "vinserti128",    { XM, Vex256, EXxmm, Ib }, 0 },
10199   },
10200   {
10201     /* VEX_W_0F3A39_P_2 */
10202     { "vextracti128",   { EXxmm, XM, Ib }, 0 },
10203   },
10204   {
10205     /* VEX_W_0F3A46_P_2 */
10206     { "vperm2i128",     { XM, Vex256, EXx, Ib }, 0 },
10207   },
10208   {
10209     /* VEX_W_0F3A48_P_2 */
10210     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10211     { "vpermil2ps",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10212   },
10213   {
10214     /* VEX_W_0F3A49_P_2 */
10215     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10216     { "vpermil2pd",     { XMVexW, Vex, EXVexImmW, EXVexImmW, EXVexImmW }, 0 },
10217   },
10218   {
10219     /* VEX_W_0F3A4A_P_2 */
10220     { "vblendvps",      { XM, Vex, EXx, XMVexI4 }, 0 },
10221   },
10222   {
10223     /* VEX_W_0F3A4B_P_2 */
10224     { "vblendvpd",      { XM, Vex, EXx, XMVexI4 }, 0 },
10225   },
10226   {
10227     /* VEX_W_0F3A4C_P_2 */
10228     { "vpblendvb",      { XM, Vex, EXx, XMVexI4 }, 0 },
10229   },
10230   {
10231     /* VEX_W_0F3ACE_P_2 */
10232     { Bad_Opcode },
10233     { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, 0 },
10234   },
10235   {
10236     /* VEX_W_0F3ACF_P_2 */
10237     { Bad_Opcode },
10238     { "vgf2p8affineinvqb",  { XM, Vex, EXx, Ib }, 0 },
10239   },
10240 #define NEED_VEX_W_TABLE
10241 #include "i386-dis-evex.h"
10242 #undef NEED_VEX_W_TABLE
10243 };
10244
10245 static const struct dis386 mod_table[][2] = {
10246   {
10247     /* MOD_8D */
10248     { "leaS",           { Gv, M }, 0 },
10249   },
10250   {
10251     /* MOD_C6_REG_7 */
10252     { Bad_Opcode },
10253     { RM_TABLE (RM_C6_REG_7) },
10254   },
10255   {
10256     /* MOD_C7_REG_7 */
10257     { Bad_Opcode },
10258     { RM_TABLE (RM_C7_REG_7) },
10259   },
10260   {
10261     /* MOD_FF_REG_3 */
10262     { "Jcall^", { indirEp }, 0 },
10263   },
10264   {
10265     /* MOD_FF_REG_5 */
10266     { "Jjmp^", { indirEp }, 0 },
10267   },
10268   {
10269     /* MOD_0F01_REG_0 */
10270     { X86_64_TABLE (X86_64_0F01_REG_0) },
10271     { RM_TABLE (RM_0F01_REG_0) },
10272   },
10273   {
10274     /* MOD_0F01_REG_1 */
10275     { X86_64_TABLE (X86_64_0F01_REG_1) },
10276     { RM_TABLE (RM_0F01_REG_1) },
10277   },
10278   {
10279     /* MOD_0F01_REG_2 */
10280     { X86_64_TABLE (X86_64_0F01_REG_2) },
10281     { RM_TABLE (RM_0F01_REG_2) },
10282   },
10283   {
10284     /* MOD_0F01_REG_3 */
10285     { X86_64_TABLE (X86_64_0F01_REG_3) },
10286     { RM_TABLE (RM_0F01_REG_3) },
10287   },
10288   {
10289     /* MOD_0F01_REG_5 */
10290     { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
10291     { RM_TABLE (RM_0F01_REG_5) },
10292   },
10293   {
10294     /* MOD_0F01_REG_7 */
10295     { "invlpg",         { Mb }, 0 },
10296     { RM_TABLE (RM_0F01_REG_7) },
10297   },
10298   {
10299     /* MOD_0F12_PREFIX_0 */
10300     { "movlps",         { XM, EXq }, PREFIX_OPCODE },
10301     { "movhlps",        { XM, EXq }, PREFIX_OPCODE },
10302   },
10303   {
10304     /* MOD_0F13 */
10305     { "movlpX",         { EXq, XM }, PREFIX_OPCODE },
10306   },
10307   {
10308     /* MOD_0F16_PREFIX_0 */
10309     { "movhps",         { XM, EXq }, 0 },
10310     { "movlhps",        { XM, EXq }, 0 },
10311   },
10312   {
10313     /* MOD_0F17 */
10314     { "movhpX",         { EXq, XM }, PREFIX_OPCODE },
10315   },
10316   {
10317     /* MOD_0F18_REG_0 */
10318     { "prefetchnta",    { Mb }, 0 },
10319   },
10320   {
10321     /* MOD_0F18_REG_1 */
10322     { "prefetcht0",     { Mb }, 0 },
10323   },
10324   {
10325     /* MOD_0F18_REG_2 */
10326     { "prefetcht1",     { Mb }, 0 },
10327   },
10328   {
10329     /* MOD_0F18_REG_3 */
10330     { "prefetcht2",     { Mb }, 0 },
10331   },
10332   {
10333     /* MOD_0F18_REG_4 */
10334     { "nop/reserved",   { Mb }, 0 },
10335   },
10336   {
10337     /* MOD_0F18_REG_5 */
10338     { "nop/reserved",   { Mb }, 0 },
10339   },
10340   {
10341     /* MOD_0F18_REG_6 */
10342     { "nop/reserved",   { Mb }, 0 },
10343   },
10344   {
10345     /* MOD_0F18_REG_7 */
10346     { "nop/reserved",   { Mb }, 0 },
10347   },
10348   {
10349     /* MOD_0F1A_PREFIX_0 */
10350     { "bndldx",         { Gbnd, Mv_bnd }, 0 },
10351     { "nopQ",           { Ev }, 0 },
10352   },
10353   {
10354     /* MOD_0F1B_PREFIX_0 */
10355     { "bndstx",         { Mv_bnd, Gbnd }, 0 },
10356     { "nopQ",           { Ev }, 0 },
10357   },
10358   {
10359     /* MOD_0F1B_PREFIX_1 */
10360     { "bndmk",          { Gbnd, Mv_bnd }, 0 },
10361     { "nopQ",           { Ev }, 0 },
10362   },
10363   {
10364     /* MOD_0F1C_PREFIX_0 */
10365     { REG_TABLE (REG_0F1C_MOD_0) },
10366     { "nopQ",           { Ev }, 0 },
10367   },
10368   {
10369     /* MOD_0F1E_PREFIX_1 */
10370     { "nopQ",           { Ev }, 0 },
10371     { REG_TABLE (REG_0F1E_MOD_3) },
10372   },
10373   {
10374     /* MOD_0F24 */
10375     { Bad_Opcode },
10376     { "movL",           { Rd, Td }, 0 },
10377   },
10378   {
10379     /* MOD_0F26 */
10380     { Bad_Opcode },
10381     { "movL",           { Td, Rd }, 0 },
10382   },
10383   {
10384     /* MOD_0F2B_PREFIX_0 */
10385     {"movntps",         { Mx, XM }, PREFIX_OPCODE },
10386   },
10387   {
10388     /* MOD_0F2B_PREFIX_1 */
10389     {"movntss",         { Md, XM }, PREFIX_OPCODE },
10390   },
10391   {
10392     /* MOD_0F2B_PREFIX_2 */
10393     {"movntpd",         { Mx, XM }, PREFIX_OPCODE },
10394   },
10395   {
10396     /* MOD_0F2B_PREFIX_3 */
10397     {"movntsd",         { Mq, XM }, PREFIX_OPCODE },
10398   },
10399   {
10400     /* MOD_0F51 */
10401     { Bad_Opcode },
10402     { "movmskpX",       { Gdq, XS }, PREFIX_OPCODE },
10403   },
10404   {
10405     /* MOD_0F71_REG_2 */
10406     { Bad_Opcode },
10407     { "psrlw",          { MS, Ib }, 0 },
10408   },
10409   {
10410     /* MOD_0F71_REG_4 */
10411     { Bad_Opcode },
10412     { "psraw",          { MS, Ib }, 0 },
10413   },
10414   {
10415     /* MOD_0F71_REG_6 */
10416     { Bad_Opcode },
10417     { "psllw",          { MS, Ib }, 0 },
10418   },
10419   {
10420     /* MOD_0F72_REG_2 */
10421     { Bad_Opcode },
10422     { "psrld",          { MS, Ib }, 0 },
10423   },
10424   {
10425     /* MOD_0F72_REG_4 */
10426     { Bad_Opcode },
10427     { "psrad",          { MS, Ib }, 0 },
10428   },
10429   {
10430     /* MOD_0F72_REG_6 */
10431     { Bad_Opcode },
10432     { "pslld",          { MS, Ib }, 0 },
10433   },
10434   {
10435     /* MOD_0F73_REG_2 */
10436     { Bad_Opcode },
10437     { "psrlq",          { MS, Ib }, 0 },
10438   },
10439   {
10440     /* MOD_0F73_REG_3 */
10441     { Bad_Opcode },
10442     { PREFIX_TABLE (PREFIX_0F73_REG_3) },
10443   },
10444   {
10445     /* MOD_0F73_REG_6 */
10446     { Bad_Opcode },
10447     { "psllq",          { MS, Ib }, 0 },
10448   },
10449   {
10450     /* MOD_0F73_REG_7 */
10451     { Bad_Opcode },
10452     { PREFIX_TABLE (PREFIX_0F73_REG_7) },
10453   },
10454   {
10455     /* MOD_0FAE_REG_0 */
10456     { "fxsave",         { FXSAVE }, 0 },
10457     { PREFIX_TABLE (PREFIX_0FAE_REG_0) },
10458   },
10459   {
10460     /* MOD_0FAE_REG_1 */
10461     { "fxrstor",        { FXSAVE }, 0 },
10462     { PREFIX_TABLE (PREFIX_0FAE_REG_1) },
10463   },
10464   {
10465     /* MOD_0FAE_REG_2 */
10466     { "ldmxcsr",        { Md }, 0 },
10467     { PREFIX_TABLE (PREFIX_0FAE_REG_2) },
10468   },
10469   {
10470     /* MOD_0FAE_REG_3 */
10471     { "stmxcsr",        { Md }, 0 },
10472     { PREFIX_TABLE (PREFIX_0FAE_REG_3) },
10473   },
10474   {
10475     /* MOD_0FAE_REG_4 */
10476     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_4) },
10477     { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_4) },
10478   },
10479   {
10480     /* MOD_0FAE_REG_5 */
10481     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
10482     { PREFIX_TABLE (PREFIX_MOD_3_0FAE_REG_5) },
10483   },
10484   {
10485     /* MOD_0FAE_REG_6 */
10486     { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_6) },
10487     { PREFIX_TABLE (PREFIX_MOD_1_0FAE_REG_6) },
10488   },
10489   {
10490     /* MOD_0FAE_REG_7 */
10491     { PREFIX_TABLE (PREFIX_0FAE_REG_7) },
10492     { RM_TABLE (RM_0FAE_REG_7) },
10493   },
10494   {
10495     /* MOD_0FB2 */
10496     { "lssS",           { Gv, Mp }, 0 },
10497   },
10498   {
10499     /* MOD_0FB4 */
10500     { "lfsS",           { Gv, Mp }, 0 },
10501   },
10502   {
10503     /* MOD_0FB5 */
10504     { "lgsS",           { Gv, Mp }, 0 },
10505   },
10506   {
10507     /* MOD_0FC3 */
10508     { PREFIX_TABLE (PREFIX_MOD_0_0FC3) },
10509   },
10510   {
10511     /* MOD_0FC7_REG_3 */
10512     { "xrstors",        { FXSAVE }, 0 },
10513   },
10514   {
10515     /* MOD_0FC7_REG_4 */
10516     { "xsavec",         { FXSAVE }, 0 },
10517   },
10518   {
10519     /* MOD_0FC7_REG_5 */
10520     { "xsaves",         { FXSAVE }, 0 },
10521   },
10522   {
10523     /* MOD_0FC7_REG_6 */
10524     { PREFIX_TABLE (PREFIX_MOD_0_0FC7_REG_6) },
10525     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_6) }
10526   },
10527   {
10528     /* MOD_0FC7_REG_7 */
10529     { "vmptrst",        { Mq }, 0 },
10530     { PREFIX_TABLE (PREFIX_MOD_3_0FC7_REG_7) }
10531   },
10532   {
10533     /* MOD_0FD7 */
10534     { Bad_Opcode },
10535     { "pmovmskb",       { Gdq, MS }, 0 },
10536   },
10537   {
10538     /* MOD_0FE7_PREFIX_2 */
10539     { "movntdq",        { Mx, XM }, 0 },
10540   },
10541   {
10542     /* MOD_0FF0_PREFIX_3 */
10543     { "lddqu",          { XM, M }, 0 },
10544   },
10545   {
10546     /* MOD_0F382A_PREFIX_2 */
10547     { "movntdqa",       { XM, Mx }, 0 },
10548   },
10549   {
10550     /* MOD_0F38F5_PREFIX_2 */
10551     { "wrussK",         { M, Gdq }, PREFIX_OPCODE },
10552   },
10553   {
10554     /* MOD_0F38F6_PREFIX_0 */
10555     { "wrssK",          { M, Gdq }, PREFIX_OPCODE },
10556   },
10557   {
10558     /* MOD_0F38F8_PREFIX_1 */
10559     { "enqcmds",        { Gva, M }, PREFIX_OPCODE },
10560   },
10561   {
10562     /* MOD_0F38F8_PREFIX_2 */
10563     { "movdir64b",      { Gva, M }, PREFIX_OPCODE },
10564   },
10565   {
10566     /* MOD_0F38F8_PREFIX_3 */
10567     { "enqcmd",         { Gva, M }, PREFIX_OPCODE },
10568   },
10569   {
10570     /* MOD_0F38F9_PREFIX_0 */
10571     { "movdiri",        { Em, Gv }, PREFIX_OPCODE },
10572   },
10573   {
10574     /* MOD_62_32BIT */
10575     { "bound{S|}",      { Gv, Ma }, 0 },
10576     { EVEX_TABLE (EVEX_0F) },
10577   },
10578   {
10579     /* MOD_C4_32BIT */
10580     { "lesS",           { Gv, Mp }, 0 },
10581     { VEX_C4_TABLE (VEX_0F) },
10582   },
10583   {
10584     /* MOD_C5_32BIT */
10585     { "ldsS",           { Gv, Mp }, 0 },
10586     { VEX_C5_TABLE (VEX_0F) },
10587   },
10588   {
10589     /* MOD_VEX_0F12_PREFIX_0 */
10590     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
10591     { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
10592   },
10593   {
10594     /* MOD_VEX_0F13 */
10595     { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
10596   },
10597   {
10598     /* MOD_VEX_0F16_PREFIX_0 */
10599     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
10600     { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
10601   },
10602   {
10603     /* MOD_VEX_0F17 */
10604     { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
10605   },
10606   {
10607     /* MOD_VEX_0F2B */
10608     { "vmovntpX",       { Mx, XM }, 0 },
10609   },
10610   {
10611     /* MOD_VEX_W_0_0F41_P_0_LEN_1 */
10612     { Bad_Opcode },
10613     { "kandw",          { MaskG, MaskVex, MaskR }, 0 },
10614   },
10615   {
10616     /* MOD_VEX_W_1_0F41_P_0_LEN_1 */
10617     { Bad_Opcode },
10618     { "kandq",          { MaskG, MaskVex, MaskR }, 0 },
10619   },
10620   {
10621     /* MOD_VEX_W_0_0F41_P_2_LEN_1 */
10622     { Bad_Opcode },
10623     { "kandb",          { MaskG, MaskVex, MaskR }, 0 },
10624   },
10625   {
10626     /* MOD_VEX_W_1_0F41_P_2_LEN_1 */
10627     { Bad_Opcode },
10628     { "kandd",          { MaskG, MaskVex, MaskR }, 0 },
10629   },
10630   {
10631     /* MOD_VEX_W_0_0F42_P_0_LEN_1 */
10632     { Bad_Opcode },
10633     { "kandnw",         { MaskG, MaskVex, MaskR }, 0 },
10634   },
10635   {
10636     /* MOD_VEX_W_1_0F42_P_0_LEN_1 */
10637     { Bad_Opcode },
10638     { "kandnq",         { MaskG, MaskVex, MaskR }, 0 },
10639   },
10640   {
10641     /* MOD_VEX_W_0_0F42_P_2_LEN_1 */
10642     { Bad_Opcode },
10643     { "kandnb",         { MaskG, MaskVex, MaskR }, 0 },
10644   },
10645   {
10646     /* MOD_VEX_W_1_0F42_P_2_LEN_1 */
10647     { Bad_Opcode },
10648     { "kandnd",         { MaskG, MaskVex, MaskR }, 0 },
10649   },
10650   {
10651     /* MOD_VEX_W_0_0F44_P_0_LEN_0 */
10652     { Bad_Opcode },
10653     { "knotw",          { MaskG, MaskR }, 0 },
10654   },
10655   {
10656     /* MOD_VEX_W_1_0F44_P_0_LEN_0 */
10657     { Bad_Opcode },
10658     { "knotq",          { MaskG, MaskR }, 0 },
10659   },
10660   {
10661     /* MOD_VEX_W_0_0F44_P_2_LEN_0 */
10662     { Bad_Opcode },
10663     { "knotb",          { MaskG, MaskR }, 0 },
10664   },
10665   {
10666     /* MOD_VEX_W_1_0F44_P_2_LEN_0 */
10667     { Bad_Opcode },
10668     { "knotd",          { MaskG, MaskR }, 0 },
10669   },
10670   {
10671     /* MOD_VEX_W_0_0F45_P_0_LEN_1 */
10672     { Bad_Opcode },
10673     { "korw",       { MaskG, MaskVex, MaskR }, 0 },
10674   },
10675   {
10676     /* MOD_VEX_W_1_0F45_P_0_LEN_1 */
10677     { Bad_Opcode },
10678     { "korq",       { MaskG, MaskVex, MaskR }, 0 },
10679   },
10680   {
10681     /* MOD_VEX_W_0_0F45_P_2_LEN_1 */
10682     { Bad_Opcode },
10683     { "korb",       { MaskG, MaskVex, MaskR }, 0 },
10684   },
10685   {
10686     /* MOD_VEX_W_1_0F45_P_2_LEN_1 */
10687     { Bad_Opcode },
10688     { "kord",       { MaskG, MaskVex, MaskR }, 0 },
10689   },
10690  {
10691     /* MOD_VEX_W_0_0F46_P_0_LEN_1 */
10692     { Bad_Opcode },
10693     { "kxnorw",     { MaskG, MaskVex, MaskR }, 0 },
10694   },
10695   {
10696     /* MOD_VEX_W_1_0F46_P_0_LEN_1 */
10697     { Bad_Opcode },
10698     { "kxnorq",     { MaskG, MaskVex, MaskR }, 0 },
10699   },
10700   {
10701     /* MOD_VEX_W_0_0F46_P_2_LEN_1 */
10702     { Bad_Opcode },
10703     { "kxnorb",     { MaskG, MaskVex, MaskR }, 0 },
10704   },
10705   {
10706     /* MOD_VEX_W_1_0F46_P_2_LEN_1 */
10707     { Bad_Opcode },
10708     { "kxnord",     { MaskG, MaskVex, MaskR }, 0 },
10709   },
10710   {
10711     /* MOD_VEX_W_0_0F47_P_0_LEN_1 */
10712     { Bad_Opcode },
10713     { "kxorw",      { MaskG, MaskVex, MaskR }, 0 },
10714   },
10715   {
10716     /* MOD_VEX_W_1_0F47_P_0_LEN_1 */
10717     { Bad_Opcode },
10718     { "kxorq",      { MaskG, MaskVex, MaskR }, 0 },
10719   },
10720   {
10721     /* MOD_VEX_W_0_0F47_P_2_LEN_1 */
10722     { Bad_Opcode },
10723     { "kxorb",      { MaskG, MaskVex, MaskR }, 0 },
10724   },
10725   {
10726     /* MOD_VEX_W_1_0F47_P_2_LEN_1 */
10727     { Bad_Opcode },
10728     { "kxord",      { MaskG, MaskVex, MaskR }, 0 },
10729   },
10730   {
10731     /* MOD_VEX_W_0_0F4A_P_0_LEN_1 */
10732     { Bad_Opcode },
10733     { "kaddw",          { MaskG, MaskVex, MaskR }, 0 },
10734   },
10735   {
10736     /* MOD_VEX_W_1_0F4A_P_0_LEN_1 */
10737     { Bad_Opcode },
10738     { "kaddq",          { MaskG, MaskVex, MaskR }, 0 },
10739   },
10740   {
10741     /* MOD_VEX_W_0_0F4A_P_2_LEN_1 */
10742     { Bad_Opcode },
10743     { "kaddb",          { MaskG, MaskVex, MaskR }, 0 },
10744   },
10745   {
10746     /* MOD_VEX_W_1_0F4A_P_2_LEN_1 */
10747     { Bad_Opcode },
10748     { "kaddd",          { MaskG, MaskVex, MaskR }, 0 },
10749   },
10750   {
10751     /* MOD_VEX_W_0_0F4B_P_0_LEN_1 */
10752     { Bad_Opcode },
10753     { "kunpckwd",   { MaskG, MaskVex, MaskR }, 0 },
10754   },
10755   {
10756     /* MOD_VEX_W_1_0F4B_P_0_LEN_1 */
10757     { Bad_Opcode },
10758     { "kunpckdq",   { MaskG, MaskVex, MaskR }, 0 },
10759   },
10760   {
10761     /* MOD_VEX_W_0_0F4B_P_2_LEN_1 */
10762     { Bad_Opcode },
10763     { "kunpckbw",   { MaskG, MaskVex, MaskR }, 0 },
10764   },
10765   {
10766     /* MOD_VEX_0F50 */
10767     { Bad_Opcode },
10768     { "vmovmskpX",      { Gdq, XS }, 0 },
10769   },
10770   {
10771     /* MOD_VEX_0F71_REG_2 */
10772     { Bad_Opcode },
10773     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_2) },
10774   },
10775   {
10776     /* MOD_VEX_0F71_REG_4 */
10777     { Bad_Opcode },
10778     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_4) },
10779   },
10780   {
10781     /* MOD_VEX_0F71_REG_6 */
10782     { Bad_Opcode },
10783     { PREFIX_TABLE (PREFIX_VEX_0F71_REG_6) },
10784   },
10785   {
10786     /* MOD_VEX_0F72_REG_2 */
10787     { Bad_Opcode },
10788     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_2) },
10789   },
10790   {
10791     /* MOD_VEX_0F72_REG_4 */
10792     { Bad_Opcode },
10793     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_4) },
10794   },
10795   {
10796     /* MOD_VEX_0F72_REG_6 */
10797     { Bad_Opcode },
10798     { PREFIX_TABLE (PREFIX_VEX_0F72_REG_6) },
10799   },
10800   {
10801     /* MOD_VEX_0F73_REG_2 */
10802     { Bad_Opcode },
10803     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_2) },
10804   },
10805   {
10806     /* MOD_VEX_0F73_REG_3 */
10807     { Bad_Opcode },
10808     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_3) },
10809   },
10810   {
10811     /* MOD_VEX_0F73_REG_6 */
10812     { Bad_Opcode },
10813     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_6) },
10814   },
10815   {
10816     /* MOD_VEX_0F73_REG_7 */
10817     { Bad_Opcode },
10818     { PREFIX_TABLE (PREFIX_VEX_0F73_REG_7) },
10819   },
10820   {
10821     /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10822     { "kmovw",          { Ew, MaskG }, 0 },
10823     { Bad_Opcode },
10824   },
10825   {
10826     /* MOD_VEX_W_0_0F91_P_0_LEN_0 */
10827     { "kmovq",          { Eq, MaskG }, 0 },
10828     { Bad_Opcode },
10829   },
10830   {
10831     /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10832     { "kmovb",          { Eb, MaskG }, 0 },
10833     { Bad_Opcode },
10834   },
10835   {
10836     /* MOD_VEX_W_0_0F91_P_2_LEN_0 */
10837     { "kmovd",          { Ed, MaskG }, 0 },
10838     { Bad_Opcode },
10839   },
10840   {
10841     /* MOD_VEX_W_0_0F92_P_0_LEN_0 */
10842     { Bad_Opcode },
10843     { "kmovw",          { MaskG, Rdq }, 0 },
10844   },
10845   {
10846     /* MOD_VEX_W_0_0F92_P_2_LEN_0 */
10847     { Bad_Opcode },
10848     { "kmovb",          { MaskG, Rdq }, 0 },
10849   },
10850   {
10851     /* MOD_VEX_0F92_P_3_LEN_0 */
10852     { Bad_Opcode },
10853     { "kmovK",          { MaskG, Rdq }, 0 },
10854   },
10855   {
10856     /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
10857     { Bad_Opcode },
10858     { "kmovw",          { Gdq, MaskR }, 0 },
10859   },
10860   {
10861     /* MOD_VEX_W_0_0F93_P_2_LEN_0 */
10862     { Bad_Opcode },
10863     { "kmovb",          { Gdq, MaskR }, 0 },
10864   },
10865   {
10866     /* MOD_VEX_0F93_P_3_LEN_0 */
10867     { Bad_Opcode },
10868     { "kmovK",          { Gdq, MaskR }, 0 },
10869   },
10870   {
10871     /* MOD_VEX_W_0_0F98_P_0_LEN_0 */
10872     { Bad_Opcode },
10873     { "kortestw", { MaskG, MaskR }, 0 },
10874   },
10875   {
10876     /* MOD_VEX_W_1_0F98_P_0_LEN_0 */
10877     { Bad_Opcode },
10878     { "kortestq", { MaskG, MaskR }, 0 },
10879   },
10880   {
10881     /* MOD_VEX_W_0_0F98_P_2_LEN_0 */
10882     { Bad_Opcode },
10883     { "kortestb", { MaskG, MaskR }, 0 },
10884   },
10885   {
10886     /* MOD_VEX_W_1_0F98_P_2_LEN_0 */
10887     { Bad_Opcode },
10888     { "kortestd", { MaskG, MaskR }, 0 },
10889   },
10890   {
10891     /* MOD_VEX_W_0_0F99_P_0_LEN_0 */
10892     { Bad_Opcode },
10893     { "ktestw", { MaskG, MaskR }, 0 },
10894   },
10895   {
10896     /* MOD_VEX_W_1_0F99_P_0_LEN_0 */
10897     { Bad_Opcode },
10898     { "ktestq", { MaskG, MaskR }, 0 },
10899   },
10900   {
10901     /* MOD_VEX_W_0_0F99_P_2_LEN_0 */
10902     { Bad_Opcode },
10903     { "ktestb", { MaskG, MaskR }, 0 },
10904   },
10905   {
10906     /* MOD_VEX_W_1_0F99_P_2_LEN_0 */
10907     { Bad_Opcode },
10908     { "ktestd", { MaskG, MaskR }, 0 },
10909   },
10910   {
10911     /* MOD_VEX_0FAE_REG_2 */
10912     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
10913   },
10914   {
10915     /* MOD_VEX_0FAE_REG_3 */
10916     { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
10917   },
10918   {
10919     /* MOD_VEX_0FD7_PREFIX_2 */
10920     { Bad_Opcode },
10921     { "vpmovmskb",      { Gdq, XS }, 0 },
10922   },
10923   {
10924     /* MOD_VEX_0FE7_PREFIX_2 */
10925     { "vmovntdq",       { Mx, XM }, 0 },
10926   },
10927   {
10928     /* MOD_VEX_0FF0_PREFIX_3 */
10929     { "vlddqu",         { XM, M }, 0 },
10930   },
10931   {
10932     /* MOD_VEX_0F381A_PREFIX_2 */
10933     { VEX_LEN_TABLE (VEX_LEN_0F381A_P_2_M_0) },
10934   },
10935   {
10936     /* MOD_VEX_0F382A_PREFIX_2 */
10937     { "vmovntdqa",      { XM, Mx }, 0 },
10938   },
10939   {
10940     /* MOD_VEX_0F382C_PREFIX_2 */
10941     { VEX_W_TABLE (VEX_W_0F382C_P_2_M_0) },
10942   },
10943   {
10944     /* MOD_VEX_0F382D_PREFIX_2 */
10945     { VEX_W_TABLE (VEX_W_0F382D_P_2_M_0) },
10946   },
10947   {
10948     /* MOD_VEX_0F382E_PREFIX_2 */
10949     { VEX_W_TABLE (VEX_W_0F382E_P_2_M_0) },
10950   },
10951   {
10952     /* MOD_VEX_0F382F_PREFIX_2 */
10953     { VEX_W_TABLE (VEX_W_0F382F_P_2_M_0) },
10954   },
10955   {
10956     /* MOD_VEX_0F385A_PREFIX_2 */
10957     { VEX_LEN_TABLE (VEX_LEN_0F385A_P_2_M_0) },
10958   },
10959   {
10960     /* MOD_VEX_0F388C_PREFIX_2 */
10961     { "vpmaskmov%LW",   { XM, Vex, Mx }, 0 },
10962   },
10963   {
10964     /* MOD_VEX_0F388E_PREFIX_2 */
10965     { "vpmaskmov%LW",   { Mx, Vex, XM }, 0 },
10966   },
10967   {
10968     /* MOD_VEX_W_0_0F3A30_P_2_LEN_0 */
10969     { Bad_Opcode },
10970     { "kshiftrb",       { MaskG, MaskR, Ib }, 0 },
10971   },
10972   {
10973     /* MOD_VEX_W_1_0F3A30_P_2_LEN_0 */
10974     { Bad_Opcode },
10975     { "kshiftrw",       { MaskG, MaskR, Ib }, 0 },
10976   },
10977   {
10978     /* MOD_VEX_W_0_0F3A31_P_2_LEN_0 */
10979     { Bad_Opcode },
10980     { "kshiftrd",       { MaskG, MaskR, Ib }, 0 },
10981   },
10982   {
10983     /* MOD_VEX_W_1_0F3A31_P_2_LEN_0 */
10984     { Bad_Opcode },
10985     { "kshiftrq",       { MaskG, MaskR, Ib }, 0 },
10986   },
10987   {
10988     /* MOD_VEX_W_0_0F3A32_P_2_LEN_0 */
10989     { Bad_Opcode },
10990     { "kshiftlb",       { MaskG, MaskR, Ib }, 0 },
10991   },
10992   {
10993     /* MOD_VEX_W_1_0F3A32_P_2_LEN_0 */
10994     { Bad_Opcode },
10995     { "kshiftlw",       { MaskG, MaskR, Ib }, 0 },
10996   },
10997   {
10998     /* MOD_VEX_W_0_0F3A33_P_2_LEN_0 */
10999     { Bad_Opcode },
11000     { "kshiftld",       { MaskG, MaskR, Ib }, 0 },
11001   },
11002   {
11003     /* MOD_VEX_W_1_0F3A33_P_2_LEN_0 */
11004     { Bad_Opcode },
11005     { "kshiftlq",       { MaskG, MaskR, Ib }, 0 },
11006   },
11007 #define NEED_MOD_TABLE
11008 #include "i386-dis-evex.h"
11009 #undef NEED_MOD_TABLE
11010 };
11011
11012 static const struct dis386 rm_table[][8] = {
11013   {
11014     /* RM_C6_REG_7 */
11015     { "xabort",         { Skip_MODRM, Ib }, 0 },
11016   },
11017   {
11018     /* RM_C7_REG_7 */
11019     { "xbeginT",        { Skip_MODRM, Jv }, 0 },
11020   },
11021   {
11022     /* RM_0F01_REG_0 */
11023     { "enclv",          { Skip_MODRM }, 0 },
11024     { "vmcall",         { Skip_MODRM }, 0 },
11025     { "vmlaunch",       { Skip_MODRM }, 0 },
11026     { "vmresume",       { Skip_MODRM }, 0 },
11027     { "vmxoff",         { Skip_MODRM }, 0 },
11028     { "pconfig",        { Skip_MODRM }, 0 },
11029   },
11030   {
11031     /* RM_0F01_REG_1 */
11032     { "monitor",        { { OP_Monitor, 0 } }, 0 },
11033     { "mwait",          { { OP_Mwait, 0 } }, 0 },
11034     { "clac",           { Skip_MODRM }, 0 },
11035     { "stac",           { Skip_MODRM }, 0 },
11036     { Bad_Opcode },
11037     { Bad_Opcode },
11038     { Bad_Opcode },
11039     { "encls",          { Skip_MODRM }, 0 },
11040   },
11041   {
11042     /* RM_0F01_REG_2 */
11043     { "xgetbv",         { Skip_MODRM }, 0 },
11044     { "xsetbv",         { Skip_MODRM }, 0 },
11045     { Bad_Opcode },
11046     { Bad_Opcode },
11047     { "vmfunc",         { Skip_MODRM }, 0 },
11048     { "xend",           { Skip_MODRM }, 0 },
11049     { "xtest",          { Skip_MODRM }, 0 },
11050     { "enclu",          { Skip_MODRM }, 0 },
11051   },
11052   {
11053     /* RM_0F01_REG_3 */
11054     { "vmrun",          { Skip_MODRM }, 0 },
11055     { "vmmcall",        { Skip_MODRM }, 0 },
11056     { "vmload",         { Skip_MODRM }, 0 },
11057     { "vmsave",         { Skip_MODRM }, 0 },
11058     { "stgi",           { Skip_MODRM }, 0 },
11059     { "clgi",           { Skip_MODRM }, 0 },
11060     { "skinit",         { Skip_MODRM }, 0 },
11061     { "invlpga",        { Skip_MODRM }, 0 },
11062   },
11063   {
11064     /* RM_0F01_REG_5 */
11065     { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_0) },
11066     { Bad_Opcode },
11067     { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
11068     { Bad_Opcode },
11069     { Bad_Opcode },
11070     { Bad_Opcode },
11071     { "rdpkru",         { Skip_MODRM }, 0 },
11072     { "wrpkru",         { Skip_MODRM }, 0 },
11073   },
11074   {
11075     /* RM_0F01_REG_7 */
11076     { "swapgs",         { Skip_MODRM }, 0  },
11077     { "rdtscp",         { Skip_MODRM }, 0  },
11078     { "monitorx",       { { OP_Monitor, 0 } }, 0  },
11079     { "mwaitx",         { { OP_Mwaitx,  0 } }, 0  },
11080     { "clzero",         { Skip_MODRM }, 0  },
11081   },
11082   {
11083     /* RM_0F1E_MOD_3_REG_7 */
11084     { "nopQ",           { Ev }, 0 },
11085     { "nopQ",           { Ev }, 0 },
11086     { "endbr64",        { Skip_MODRM },  PREFIX_OPCODE },
11087     { "endbr32",        { Skip_MODRM },  PREFIX_OPCODE },
11088     { "nopQ",           { Ev }, 0 },
11089     { "nopQ",           { Ev }, 0 },
11090     { "nopQ",           { Ev }, 0 },
11091     { "nopQ",           { Ev }, 0 },
11092   },
11093   {
11094     /* RM_0FAE_REG_6 */
11095     { "mfence",         { Skip_MODRM }, 0 },
11096   },
11097   {
11098     /* RM_0FAE_REG_7 */
11099     { "sfence",         { Skip_MODRM }, 0 },
11100
11101   },
11102 };
11103
11104 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
11105
11106 /* We use the high bit to indicate different name for the same
11107    prefix.  */
11108 #define REP_PREFIX      (0xf3 | 0x100)
11109 #define XACQUIRE_PREFIX (0xf2 | 0x200)
11110 #define XRELEASE_PREFIX (0xf3 | 0x400)
11111 #define BND_PREFIX      (0xf2 | 0x400)
11112 #define NOTRACK_PREFIX  (0x3e | 0x100)
11113
11114 static int
11115 ckprefix (void)
11116 {
11117   int newrex, i, length;
11118   rex = 0;
11119   rex_ignored = 0;
11120   prefixes = 0;
11121   used_prefixes = 0;
11122   rex_used = 0;
11123   last_lock_prefix = -1;
11124   last_repz_prefix = -1;
11125   last_repnz_prefix = -1;
11126   last_data_prefix = -1;
11127   last_addr_prefix = -1;
11128   last_rex_prefix = -1;
11129   last_seg_prefix = -1;
11130   fwait_prefix = -1;
11131   active_seg_prefix = 0;
11132   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
11133     all_prefixes[i] = 0;
11134   i = 0;
11135   length = 0;
11136   /* The maximum instruction length is 15bytes.  */
11137   while (length < MAX_CODE_LENGTH - 1)
11138     {
11139       FETCH_DATA (the_info, codep + 1);
11140       newrex = 0;
11141       switch (*codep)
11142         {
11143         /* REX prefixes family.  */
11144         case 0x40:
11145         case 0x41:
11146         case 0x42:
11147         case 0x43:
11148         case 0x44:
11149         case 0x45:
11150         case 0x46:
11151         case 0x47:
11152         case 0x48:
11153         case 0x49:
11154         case 0x4a:
11155         case 0x4b:
11156         case 0x4c:
11157         case 0x4d:
11158         case 0x4e:
11159         case 0x4f:
11160           if (address_mode == mode_64bit)
11161             newrex = *codep;
11162           else
11163             return 1;
11164           last_rex_prefix = i;
11165           break;
11166         case 0xf3:
11167           prefixes |= PREFIX_REPZ;
11168           last_repz_prefix = i;
11169           break;
11170         case 0xf2:
11171           prefixes |= PREFIX_REPNZ;
11172           last_repnz_prefix = i;
11173           break;
11174         case 0xf0:
11175           prefixes |= PREFIX_LOCK;
11176           last_lock_prefix = i;
11177           break;
11178         case 0x2e:
11179           prefixes |= PREFIX_CS;
11180           last_seg_prefix = i;
11181           active_seg_prefix = PREFIX_CS;
11182           break;
11183         case 0x36:
11184           prefixes |= PREFIX_SS;
11185           last_seg_prefix = i;
11186           active_seg_prefix = PREFIX_SS;
11187           break;
11188         case 0x3e:
11189           prefixes |= PREFIX_DS;
11190           last_seg_prefix = i;
11191           active_seg_prefix = PREFIX_DS;
11192           break;
11193         case 0x26:
11194           prefixes |= PREFIX_ES;
11195           last_seg_prefix = i;
11196           active_seg_prefix = PREFIX_ES;
11197           break;
11198         case 0x64:
11199           prefixes |= PREFIX_FS;
11200           last_seg_prefix = i;
11201           active_seg_prefix = PREFIX_FS;
11202           break;
11203         case 0x65:
11204           prefixes |= PREFIX_GS;
11205           last_seg_prefix = i;
11206           active_seg_prefix = PREFIX_GS;
11207           break;
11208         case 0x66:
11209           prefixes |= PREFIX_DATA;
11210           last_data_prefix = i;
11211           break;
11212         case 0x67:
11213           prefixes |= PREFIX_ADDR;
11214           last_addr_prefix = i;
11215           break;
11216         case FWAIT_OPCODE:
11217           /* fwait is really an instruction.  If there are prefixes
11218              before the fwait, they belong to the fwait, *not* to the
11219              following instruction.  */
11220           fwait_prefix = i;
11221           if (prefixes || rex)
11222             {
11223               prefixes |= PREFIX_FWAIT;
11224               codep++;
11225               /* This ensures that the previous REX prefixes are noticed
11226                  as unused prefixes, as in the return case below.  */
11227               rex_used = rex;
11228               return 1;
11229             }
11230           prefixes = PREFIX_FWAIT;
11231           break;
11232         default:
11233           return 1;
11234         }
11235       /* Rex is ignored when followed by another prefix.  */
11236       if (rex)
11237         {
11238           rex_used = rex;
11239           return 1;
11240         }
11241       if (*codep != FWAIT_OPCODE)
11242         all_prefixes[i++] = *codep;
11243       rex = newrex;
11244       codep++;
11245       length++;
11246     }
11247   return 0;
11248 }
11249
11250 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
11251    prefix byte.  */
11252
11253 static const char *
11254 prefix_name (int pref, int sizeflag)
11255 {
11256   static const char *rexes [16] =
11257     {
11258       "rex",            /* 0x40 */
11259       "rex.B",          /* 0x41 */
11260       "rex.X",          /* 0x42 */
11261       "rex.XB",         /* 0x43 */
11262       "rex.R",          /* 0x44 */
11263       "rex.RB",         /* 0x45 */
11264       "rex.RX",         /* 0x46 */
11265       "rex.RXB",        /* 0x47 */
11266       "rex.W",          /* 0x48 */
11267       "rex.WB",         /* 0x49 */
11268       "rex.WX",         /* 0x4a */
11269       "rex.WXB",        /* 0x4b */
11270       "rex.WR",         /* 0x4c */
11271       "rex.WRB",        /* 0x4d */
11272       "rex.WRX",        /* 0x4e */
11273       "rex.WRXB",       /* 0x4f */
11274     };
11275
11276   switch (pref)
11277     {
11278     /* REX prefixes family.  */
11279     case 0x40:
11280     case 0x41:
11281     case 0x42:
11282     case 0x43:
11283     case 0x44:
11284     case 0x45:
11285     case 0x46:
11286     case 0x47:
11287     case 0x48:
11288     case 0x49:
11289     case 0x4a:
11290     case 0x4b:
11291     case 0x4c:
11292     case 0x4d:
11293     case 0x4e:
11294     case 0x4f:
11295       return rexes [pref - 0x40];
11296     case 0xf3:
11297       return "repz";
11298     case 0xf2:
11299       return "repnz";
11300     case 0xf0:
11301       return "lock";
11302     case 0x2e:
11303       return "cs";
11304     case 0x36:
11305       return "ss";
11306     case 0x3e:
11307       return "ds";
11308     case 0x26:
11309       return "es";
11310     case 0x64:
11311       return "fs";
11312     case 0x65:
11313       return "gs";
11314     case 0x66:
11315       return (sizeflag & DFLAG) ? "data16" : "data32";
11316     case 0x67:
11317       if (address_mode == mode_64bit)
11318         return (sizeflag & AFLAG) ? "addr32" : "addr64";
11319       else
11320         return (sizeflag & AFLAG) ? "addr16" : "addr32";
11321     case FWAIT_OPCODE:
11322       return "fwait";
11323     case REP_PREFIX:
11324       return "rep";
11325     case XACQUIRE_PREFIX:
11326       return "xacquire";
11327     case XRELEASE_PREFIX:
11328       return "xrelease";
11329     case BND_PREFIX:
11330       return "bnd";
11331     case NOTRACK_PREFIX:
11332       return "notrack";
11333     default:
11334       return NULL;
11335     }
11336 }
11337
11338 static char op_out[MAX_OPERANDS][100];
11339 static int op_ad, op_index[MAX_OPERANDS];
11340 static int two_source_ops;
11341 static bfd_vma op_address[MAX_OPERANDS];
11342 static bfd_vma op_riprel[MAX_OPERANDS];
11343 static bfd_vma start_pc;
11344
11345 /*
11346  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
11347  *   (see topic "Redundant prefixes" in the "Differences from 8086"
11348  *   section of the "Virtual 8086 Mode" chapter.)
11349  * 'pc' should be the address of this instruction, it will
11350  *   be used to print the target address if this is a relative jump or call
11351  * The function returns the length of this instruction in bytes.
11352  */
11353
11354 static char intel_syntax;
11355 static char intel_mnemonic = !SYSV386_COMPAT;
11356 static char open_char;
11357 static char close_char;
11358 static char separator_char;
11359 static char scale_char;
11360
11361 enum x86_64_isa
11362 {
11363   amd64 = 0,
11364   intel64
11365 };
11366
11367 static enum x86_64_isa isa64;
11368
11369 /* Here for backwards compatibility.  When gdb stops using
11370    print_insn_i386_att and print_insn_i386_intel these functions can
11371    disappear, and print_insn_i386 be merged into print_insn.  */
11372 int
11373 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
11374 {
11375   intel_syntax = 0;
11376
11377   return print_insn (pc, info);
11378 }
11379
11380 int
11381 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
11382 {
11383   intel_syntax = 1;
11384
11385   return print_insn (pc, info);
11386 }
11387
11388 int
11389 print_insn_i386 (bfd_vma pc, disassemble_info *info)
11390 {
11391   intel_syntax = -1;
11392
11393   return print_insn (pc, info);
11394 }
11395
11396 void
11397 print_i386_disassembler_options (FILE *stream)
11398 {
11399   fprintf (stream, _("\n\
11400 The following i386/x86-64 specific disassembler options are supported for use\n\
11401 with the -M switch (multiple options should be separated by commas):\n"));
11402
11403   fprintf (stream, _("  x86-64      Disassemble in 64bit mode\n"));
11404   fprintf (stream, _("  i386        Disassemble in 32bit mode\n"));
11405   fprintf (stream, _("  i8086       Disassemble in 16bit mode\n"));
11406   fprintf (stream, _("  att         Display instruction in AT&T syntax\n"));
11407   fprintf (stream, _("  intel       Display instruction in Intel syntax\n"));
11408   fprintf (stream, _("  att-mnemonic\n"
11409                      "              Display instruction in AT&T mnemonic\n"));
11410   fprintf (stream, _("  intel-mnemonic\n"
11411                      "              Display instruction in Intel mnemonic\n"));
11412   fprintf (stream, _("  addr64      Assume 64bit address size\n"));
11413   fprintf (stream, _("  addr32      Assume 32bit address size\n"));
11414   fprintf (stream, _("  addr16      Assume 16bit address size\n"));
11415   fprintf (stream, _("  data32      Assume 32bit data size\n"));
11416   fprintf (stream, _("  data16      Assume 16bit data size\n"));
11417   fprintf (stream, _("  suffix      Always display instruction suffix in AT&T syntax\n"));
11418   fprintf (stream, _("  amd64       Display instruction in AMD64 ISA\n"));
11419   fprintf (stream, _("  intel64     Display instruction in Intel64 ISA\n"));
11420 }
11421
11422 /* Bad opcode.  */
11423 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
11424
11425 /* Get a pointer to struct dis386 with a valid name.  */
11426
11427 static const struct dis386 *
11428 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
11429 {
11430   int vindex, vex_table_index;
11431
11432   if (dp->name != NULL)
11433     return dp;
11434
11435   switch (dp->op[0].bytemode)
11436     {
11437     case USE_REG_TABLE:
11438       dp = &reg_table[dp->op[1].bytemode][modrm.reg];
11439       break;
11440
11441     case USE_MOD_TABLE:
11442       vindex = modrm.mod == 0x3 ? 1 : 0;
11443       dp = &mod_table[dp->op[1].bytemode][vindex];
11444       break;
11445
11446     case USE_RM_TABLE:
11447       dp = &rm_table[dp->op[1].bytemode][modrm.rm];
11448       break;
11449
11450     case USE_PREFIX_TABLE:
11451       if (need_vex)
11452         {
11453           /* The prefix in VEX is implicit.  */
11454           switch (vex.prefix)
11455             {
11456             case 0:
11457               vindex = 0;
11458               break;
11459             case REPE_PREFIX_OPCODE:
11460               vindex = 1;
11461               break;
11462             case DATA_PREFIX_OPCODE:
11463               vindex = 2;
11464               break;
11465             case REPNE_PREFIX_OPCODE:
11466               vindex = 3;
11467               break;
11468             default:
11469               abort ();
11470               break;
11471             }
11472         }
11473       else
11474         {
11475           int last_prefix = -1;
11476           int prefix = 0;
11477           vindex = 0;
11478           /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
11479              When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
11480              last one wins.  */
11481           if ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
11482             {
11483               if (last_repz_prefix > last_repnz_prefix)
11484                 {
11485                   vindex = 1;
11486                   prefix = PREFIX_REPZ;
11487                   last_prefix = last_repz_prefix;
11488                 }
11489               else
11490                 {
11491                   vindex = 3;
11492                   prefix = PREFIX_REPNZ;
11493                   last_prefix = last_repnz_prefix;
11494                 }
11495
11496               /* Check if prefix should be ignored.  */
11497               if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
11498                      & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
11499                    & prefix) != 0)
11500                 vindex = 0;
11501             }
11502
11503           if (vindex == 0 && (prefixes & PREFIX_DATA) != 0)
11504             {
11505               vindex = 2;
11506               prefix = PREFIX_DATA;
11507               last_prefix = last_data_prefix;
11508             }
11509
11510           if (vindex != 0)
11511             {
11512               used_prefixes |= prefix;
11513               all_prefixes[last_prefix] = 0;
11514             }
11515         }
11516       dp = &prefix_table[dp->op[1].bytemode][vindex];
11517       break;
11518
11519     case USE_X86_64_TABLE:
11520       vindex = address_mode == mode_64bit ? 1 : 0;
11521       dp = &x86_64_table[dp->op[1].bytemode][vindex];
11522       break;
11523
11524     case USE_3BYTE_TABLE:
11525       FETCH_DATA (info, codep + 2);
11526       vindex = *codep++;
11527       dp = &three_byte_table[dp->op[1].bytemode][vindex];
11528       end_codep = codep;
11529       modrm.mod = (*codep >> 6) & 3;
11530       modrm.reg = (*codep >> 3) & 7;
11531       modrm.rm = *codep & 7;
11532       break;
11533
11534     case USE_VEX_LEN_TABLE:
11535       if (!need_vex)
11536         abort ();
11537
11538       switch (vex.length)
11539         {
11540         case 128:
11541           vindex = 0;
11542           break;
11543         case 256:
11544           vindex = 1;
11545           break;
11546         default:
11547           abort ();
11548           break;
11549         }
11550
11551       dp = &vex_len_table[dp->op[1].bytemode][vindex];
11552       break;
11553
11554     case USE_EVEX_LEN_TABLE:
11555       if (!vex.evex)
11556         abort ();
11557
11558       switch (vex.length)
11559         {
11560         case 128:
11561           vindex = 0;
11562           break;
11563         case 256:
11564           vindex = 1;
11565           break;
11566         case 512:
11567           vindex = 2;
11568           break;
11569         default:
11570           abort ();
11571           break;
11572         }
11573
11574       dp = &evex_len_table[dp->op[1].bytemode][vindex];
11575       break;
11576
11577     case USE_XOP_8F_TABLE:
11578       FETCH_DATA (info, codep + 3);
11579       /* All bits in the REX prefix are ignored.  */
11580       rex_ignored = rex;
11581       rex = ~(*codep >> 5) & 0x7;
11582
11583       /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm".  */
11584       switch ((*codep & 0x1f))
11585         {
11586         default:
11587           dp = &bad_opcode;
11588           return dp;
11589         case 0x8:
11590           vex_table_index = XOP_08;
11591           break;
11592         case 0x9:
11593           vex_table_index = XOP_09;
11594           break;
11595         case 0xa:
11596           vex_table_index = XOP_0A;
11597           break;
11598         }
11599       codep++;
11600       vex.w = *codep & 0x80;
11601       if (vex.w && address_mode == mode_64bit)
11602         rex |= REX_W;
11603
11604       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11605       if (address_mode != mode_64bit)
11606         {
11607           /* In 16/32-bit mode REX_B is silently ignored.  */
11608           rex &= ~REX_B;
11609         }
11610
11611       vex.length = (*codep & 0x4) ? 256 : 128;
11612       switch ((*codep & 0x3))
11613         {
11614         case 0:
11615           break;
11616         case 1:
11617           vex.prefix = DATA_PREFIX_OPCODE;
11618           break;
11619         case 2:
11620           vex.prefix = REPE_PREFIX_OPCODE;
11621           break;
11622         case 3:
11623           vex.prefix = REPNE_PREFIX_OPCODE;
11624           break;
11625         }
11626       need_vex = 1;
11627       need_vex_reg = 1;
11628       codep++;
11629       vindex = *codep++;
11630       dp = &xop_table[vex_table_index][vindex];
11631
11632       end_codep = codep;
11633       FETCH_DATA (info, codep + 1);
11634       modrm.mod = (*codep >> 6) & 3;
11635       modrm.reg = (*codep >> 3) & 7;
11636       modrm.rm = *codep & 7;
11637       break;
11638
11639     case USE_VEX_C4_TABLE:
11640       /* VEX prefix.  */
11641       FETCH_DATA (info, codep + 3);
11642       /* All bits in the REX prefix are ignored.  */
11643       rex_ignored = rex;
11644       rex = ~(*codep >> 5) & 0x7;
11645       switch ((*codep & 0x1f))
11646         {
11647         default:
11648           dp = &bad_opcode;
11649           return dp;
11650         case 0x1:
11651           vex_table_index = VEX_0F;
11652           break;
11653         case 0x2:
11654           vex_table_index = VEX_0F38;
11655           break;
11656         case 0x3:
11657           vex_table_index = VEX_0F3A;
11658           break;
11659         }
11660       codep++;
11661       vex.w = *codep & 0x80;
11662       if (address_mode == mode_64bit)
11663         {
11664           if (vex.w)
11665             rex |= REX_W;
11666         }
11667       else
11668         {
11669           /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
11670              is ignored, other REX bits are 0 and the highest bit in
11671              VEX.vvvv is also ignored (but we mustn't clear it here).  */
11672           rex = 0;
11673         }
11674       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11675       vex.length = (*codep & 0x4) ? 256 : 128;
11676       switch ((*codep & 0x3))
11677         {
11678         case 0:
11679           break;
11680         case 1:
11681           vex.prefix = DATA_PREFIX_OPCODE;
11682           break;
11683         case 2:
11684           vex.prefix = REPE_PREFIX_OPCODE;
11685           break;
11686         case 3:
11687           vex.prefix = REPNE_PREFIX_OPCODE;
11688           break;
11689         }
11690       need_vex = 1;
11691       need_vex_reg = 1;
11692       codep++;
11693       vindex = *codep++;
11694       dp = &vex_table[vex_table_index][vindex];
11695       end_codep = codep;
11696       /* There is no MODRM byte for VEX0F 77.  */
11697       if (vex_table_index != VEX_0F || vindex != 0x77)
11698         {
11699           FETCH_DATA (info, codep + 1);
11700           modrm.mod = (*codep >> 6) & 3;
11701           modrm.reg = (*codep >> 3) & 7;
11702           modrm.rm = *codep & 7;
11703         }
11704       break;
11705
11706     case USE_VEX_C5_TABLE:
11707       /* VEX prefix.  */
11708       FETCH_DATA (info, codep + 2);
11709       /* All bits in the REX prefix are ignored.  */
11710       rex_ignored = rex;
11711       rex = (*codep & 0x80) ? 0 : REX_R;
11712
11713       /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
11714          VEX.vvvv is 1.  */
11715       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11716       vex.length = (*codep & 0x4) ? 256 : 128;
11717       switch ((*codep & 0x3))
11718         {
11719         case 0:
11720           break;
11721         case 1:
11722           vex.prefix = DATA_PREFIX_OPCODE;
11723           break;
11724         case 2:
11725           vex.prefix = REPE_PREFIX_OPCODE;
11726           break;
11727         case 3:
11728           vex.prefix = REPNE_PREFIX_OPCODE;
11729           break;
11730         }
11731       need_vex = 1;
11732       need_vex_reg = 1;
11733       codep++;
11734       vindex = *codep++;
11735       dp = &vex_table[dp->op[1].bytemode][vindex];
11736       end_codep = codep;
11737       /* There is no MODRM byte for VEX 77.  */
11738       if (vindex != 0x77)
11739         {
11740           FETCH_DATA (info, codep + 1);
11741           modrm.mod = (*codep >> 6) & 3;
11742           modrm.reg = (*codep >> 3) & 7;
11743           modrm.rm = *codep & 7;
11744         }
11745       break;
11746
11747     case USE_VEX_W_TABLE:
11748       if (!need_vex)
11749         abort ();
11750
11751       dp = &vex_w_table[dp->op[1].bytemode][vex.w ? 1 : 0];
11752       break;
11753
11754     case USE_EVEX_TABLE:
11755       two_source_ops = 0;
11756       /* EVEX prefix.  */
11757       vex.evex = 1;
11758       FETCH_DATA (info, codep + 4);
11759       /* All bits in the REX prefix are ignored.  */
11760       rex_ignored = rex;
11761       /* The first byte after 0x62.  */
11762       rex = ~(*codep >> 5) & 0x7;
11763       vex.r = *codep & 0x10;
11764       switch ((*codep & 0xf))
11765         {
11766         default:
11767           return &bad_opcode;
11768         case 0x1:
11769           vex_table_index = EVEX_0F;
11770           break;
11771         case 0x2:
11772           vex_table_index = EVEX_0F38;
11773           break;
11774         case 0x3:
11775           vex_table_index = EVEX_0F3A;
11776           break;
11777         }
11778
11779       /* The second byte after 0x62.  */
11780       codep++;
11781       vex.w = *codep & 0x80;
11782       if (vex.w && address_mode == mode_64bit)
11783         rex |= REX_W;
11784
11785       vex.register_specifier = (~(*codep >> 3)) & 0xf;
11786
11787       /* The U bit.  */
11788       if (!(*codep & 0x4))
11789         return &bad_opcode;
11790
11791       switch ((*codep & 0x3))
11792         {
11793         case 0:
11794           break;
11795         case 1:
11796           vex.prefix = DATA_PREFIX_OPCODE;
11797           break;
11798         case 2:
11799           vex.prefix = REPE_PREFIX_OPCODE;
11800           break;
11801         case 3:
11802           vex.prefix = REPNE_PREFIX_OPCODE;
11803           break;
11804         }
11805
11806       /* The third byte after 0x62.  */
11807       codep++;
11808
11809       /* Remember the static rounding bits.  */
11810       vex.ll = (*codep >> 5) & 3;
11811       vex.b = (*codep & 0x10) != 0;
11812
11813       vex.v = *codep & 0x8;
11814       vex.mask_register_specifier = *codep & 0x7;
11815       vex.zeroing = *codep & 0x80;
11816
11817       if (address_mode != mode_64bit)
11818         {
11819           /* In 16/32-bit mode silently ignore following bits.  */
11820           rex &= ~REX_B;
11821           vex.r = 1;
11822           vex.v = 1;
11823         }
11824
11825       need_vex = 1;
11826       need_vex_reg = 1;
11827       codep++;
11828       vindex = *codep++;
11829       dp = &evex_table[vex_table_index][vindex];
11830       end_codep = codep;
11831       FETCH_DATA (info, codep + 1);
11832       modrm.mod = (*codep >> 6) & 3;
11833       modrm.reg = (*codep >> 3) & 7;
11834       modrm.rm = *codep & 7;
11835
11836       /* Set vector length.  */
11837       if (modrm.mod == 3 && vex.b)
11838         vex.length = 512;
11839       else
11840         {
11841           switch (vex.ll)
11842             {
11843             case 0x0:
11844               vex.length = 128;
11845               break;
11846             case 0x1:
11847               vex.length = 256;
11848               break;
11849             case 0x2:
11850               vex.length = 512;
11851               break;
11852             default:
11853               return &bad_opcode;
11854             }
11855         }
11856       break;
11857
11858     case 0:
11859       dp = &bad_opcode;
11860       break;
11861
11862     default:
11863       abort ();
11864     }
11865
11866   if (dp->name != NULL)
11867     return dp;
11868   else
11869     return get_valid_dis386 (dp, info);
11870 }
11871
11872 static void
11873 get_sib (disassemble_info *info, int sizeflag)
11874 {
11875   /* If modrm.mod == 3, operand must be register.  */
11876   if (need_modrm
11877       && ((sizeflag & AFLAG) || address_mode == mode_64bit)
11878       && modrm.mod != 3
11879       && modrm.rm == 4)
11880     {
11881       FETCH_DATA (info, codep + 2);
11882       sib.index = (codep [1] >> 3) & 7;
11883       sib.scale = (codep [1] >> 6) & 3;
11884       sib.base = codep [1] & 7;
11885     }
11886 }
11887
11888 static int
11889 print_insn (bfd_vma pc, disassemble_info *info)
11890 {
11891   const struct dis386 *dp;
11892   int i;
11893   char *op_txt[MAX_OPERANDS];
11894   int needcomma;
11895   int sizeflag, orig_sizeflag;
11896   const char *p;
11897   struct dis_private priv;
11898   int prefix_length;
11899
11900   priv.orig_sizeflag = AFLAG | DFLAG;
11901   if ((info->mach & bfd_mach_i386_i386) != 0)
11902     address_mode = mode_32bit;
11903   else if (info->mach == bfd_mach_i386_i8086)
11904     {
11905       address_mode = mode_16bit;
11906       priv.orig_sizeflag = 0;
11907     }
11908   else
11909     address_mode = mode_64bit;
11910
11911   if (intel_syntax == (char) -1)
11912     intel_syntax = (info->mach & bfd_mach_i386_intel_syntax) != 0;
11913
11914   for (p = info->disassembler_options; p != NULL; )
11915     {
11916       if (CONST_STRNEQ (p, "amd64"))
11917         isa64 = amd64;
11918       else if (CONST_STRNEQ (p, "intel64"))
11919         isa64 = intel64;
11920       else if (CONST_STRNEQ (p, "x86-64"))
11921         {
11922           address_mode = mode_64bit;
11923           priv.orig_sizeflag = AFLAG | DFLAG;
11924         }
11925       else if (CONST_STRNEQ (p, "i386"))
11926         {
11927           address_mode = mode_32bit;
11928           priv.orig_sizeflag = AFLAG | DFLAG;
11929         }
11930       else if (CONST_STRNEQ (p, "i8086"))
11931         {
11932           address_mode = mode_16bit;
11933           priv.orig_sizeflag = 0;
11934         }
11935       else if (CONST_STRNEQ (p, "intel"))
11936         {
11937           intel_syntax = 1;
11938           if (CONST_STRNEQ (p + 5, "-mnemonic"))
11939             intel_mnemonic = 1;
11940         }
11941       else if (CONST_STRNEQ (p, "att"))
11942         {
11943           intel_syntax = 0;
11944           if (CONST_STRNEQ (p + 3, "-mnemonic"))
11945             intel_mnemonic = 0;
11946         }
11947       else if (CONST_STRNEQ (p, "addr"))
11948         {
11949           if (address_mode == mode_64bit)
11950             {
11951               if (p[4] == '3' && p[5] == '2')
11952                 priv.orig_sizeflag &= ~AFLAG;
11953               else if (p[4] == '6' && p[5] == '4')
11954                 priv.orig_sizeflag |= AFLAG;
11955             }
11956           else
11957             {
11958               if (p[4] == '1' && p[5] == '6')
11959                 priv.orig_sizeflag &= ~AFLAG;
11960               else if (p[4] == '3' && p[5] == '2')
11961                 priv.orig_sizeflag |= AFLAG;
11962             }
11963         }
11964       else if (CONST_STRNEQ (p, "data"))
11965         {
11966           if (p[4] == '1' && p[5] == '6')
11967             priv.orig_sizeflag &= ~DFLAG;
11968           else if (p[4] == '3' && p[5] == '2')
11969             priv.orig_sizeflag |= DFLAG;
11970         }
11971       else if (CONST_STRNEQ (p, "suffix"))
11972         priv.orig_sizeflag |= SUFFIX_ALWAYS;
11973
11974       p = strchr (p, ',');
11975       if (p != NULL)
11976         p++;
11977     }
11978
11979   if (address_mode == mode_64bit && sizeof (bfd_vma) < 8)
11980     {
11981       (*info->fprintf_func) (info->stream,
11982                              _("64-bit address is disabled"));
11983       return -1;
11984     }
11985
11986   if (intel_syntax)
11987     {
11988       names64 = intel_names64;
11989       names32 = intel_names32;
11990       names16 = intel_names16;
11991       names8 = intel_names8;
11992       names8rex = intel_names8rex;
11993       names_seg = intel_names_seg;
11994       names_mm = intel_names_mm;
11995       names_bnd = intel_names_bnd;
11996       names_xmm = intel_names_xmm;
11997       names_ymm = intel_names_ymm;
11998       names_zmm = intel_names_zmm;
11999       index64 = intel_index64;
12000       index32 = intel_index32;
12001       names_mask = intel_names_mask;
12002       index16 = intel_index16;
12003       open_char = '[';
12004       close_char = ']';
12005       separator_char = '+';
12006       scale_char = '*';
12007     }
12008   else
12009     {
12010       names64 = att_names64;
12011       names32 = att_names32;
12012       names16 = att_names16;
12013       names8 = att_names8;
12014       names8rex = att_names8rex;
12015       names_seg = att_names_seg;
12016       names_mm = att_names_mm;
12017       names_bnd = att_names_bnd;
12018       names_xmm = att_names_xmm;
12019       names_ymm = att_names_ymm;
12020       names_zmm = att_names_zmm;
12021       index64 = att_index64;
12022       index32 = att_index32;
12023       names_mask = att_names_mask;
12024       index16 = att_index16;
12025       open_char = '(';
12026       close_char =  ')';
12027       separator_char = ',';
12028       scale_char = ',';
12029     }
12030
12031   /* The output looks better if we put 7 bytes on a line, since that
12032      puts most long word instructions on a single line.  Use 8 bytes
12033      for Intel L1OM.  */
12034   if ((info->mach & bfd_mach_l1om) != 0)
12035     info->bytes_per_line = 8;
12036   else
12037     info->bytes_per_line = 7;
12038
12039   info->private_data = &priv;
12040   priv.max_fetched = priv.the_buffer;
12041   priv.insn_start = pc;
12042
12043   obuf[0] = 0;
12044   for (i = 0; i < MAX_OPERANDS; ++i)
12045     {
12046       op_out[i][0] = 0;
12047       op_index[i] = -1;
12048     }
12049
12050   the_info = info;
12051   start_pc = pc;
12052   start_codep = priv.the_buffer;
12053   codep = priv.the_buffer;
12054
12055   if (OPCODES_SIGSETJMP (priv.bailout) != 0)
12056     {
12057       const char *name;
12058
12059       /* Getting here means we tried for data but didn't get it.  That
12060          means we have an incomplete instruction of some sort.  Just
12061          print the first byte as a prefix or a .byte pseudo-op.  */
12062       if (codep > priv.the_buffer)
12063         {
12064           name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
12065           if (name != NULL)
12066             (*info->fprintf_func) (info->stream, "%s", name);
12067           else
12068             {
12069               /* Just print the first byte as a .byte instruction.  */
12070               (*info->fprintf_func) (info->stream, ".byte 0x%x",
12071                                      (unsigned int) priv.the_buffer[0]);
12072             }
12073
12074           return 1;
12075         }
12076
12077       return -1;
12078     }
12079
12080   obufp = obuf;
12081   sizeflag = priv.orig_sizeflag;
12082
12083   if (!ckprefix () || rex_used)
12084     {
12085       /* Too many prefixes or unused REX prefixes.  */
12086       for (i = 0;
12087            i < (int) ARRAY_SIZE (all_prefixes) && all_prefixes[i];
12088            i++)
12089         (*info->fprintf_func) (info->stream, "%s%s",
12090                                i == 0 ? "" : " ",
12091                                prefix_name (all_prefixes[i], sizeflag));
12092       return i;
12093     }
12094
12095   insn_codep = codep;
12096
12097   FETCH_DATA (info, codep + 1);
12098   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
12099
12100   if (((prefixes & PREFIX_FWAIT)
12101        && ((*codep < 0xd8) || (*codep > 0xdf))))
12102     {
12103       /* Handle prefixes before fwait.  */
12104       for (i = 0; i < fwait_prefix && all_prefixes[i];
12105            i++)
12106         (*info->fprintf_func) (info->stream, "%s ",
12107                                prefix_name (all_prefixes[i], sizeflag));
12108       (*info->fprintf_func) (info->stream, "fwait");
12109       return i + 1;
12110     }
12111
12112   if (*codep == 0x0f)
12113     {
12114       unsigned char threebyte;
12115
12116       codep++;
12117       FETCH_DATA (info, codep + 1);
12118       threebyte = *codep;
12119       dp = &dis386_twobyte[threebyte];
12120       need_modrm = twobyte_has_modrm[*codep];
12121       codep++;
12122     }
12123   else
12124     {
12125       dp = &dis386[*codep];
12126       need_modrm = onebyte_has_modrm[*codep];
12127       codep++;
12128     }
12129
12130   /* Save sizeflag for printing the extra prefixes later before updating
12131      it for mnemonic and operand processing.  The prefix names depend
12132      only on the address mode.  */
12133   orig_sizeflag = sizeflag;
12134   if (prefixes & PREFIX_ADDR)
12135     sizeflag ^= AFLAG;
12136   if ((prefixes & PREFIX_DATA))
12137     sizeflag ^= DFLAG;
12138
12139   end_codep = codep;
12140   if (need_modrm)
12141     {
12142       FETCH_DATA (info, codep + 1);
12143       modrm.mod = (*codep >> 6) & 3;
12144       modrm.reg = (*codep >> 3) & 7;
12145       modrm.rm = *codep & 7;
12146     }
12147
12148   need_vex = 0;
12149   need_vex_reg = 0;
12150   vex_w_done = 0;
12151   memset (&vex, 0, sizeof (vex));
12152
12153   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
12154     {
12155       get_sib (info, sizeflag);
12156       dofloat (sizeflag);
12157     }
12158   else
12159     {
12160       dp = get_valid_dis386 (dp, info);
12161       if (dp != NULL && putop (dp->name, sizeflag) == 0)
12162         {
12163           get_sib (info, sizeflag);
12164           for (i = 0; i < MAX_OPERANDS; ++i)
12165             {
12166               obufp = op_out[i];
12167               op_ad = MAX_OPERANDS - 1 - i;
12168               if (dp->op[i].rtn)
12169                 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
12170               /* For EVEX instruction after the last operand masking
12171                  should be printed.  */
12172               if (i == 0 && vex.evex)
12173                 {
12174                   /* Don't print {%k0}.  */
12175                   if (vex.mask_register_specifier)
12176                     {
12177                       oappend ("{");
12178                       oappend (names_mask[vex.mask_register_specifier]);
12179                       oappend ("}");
12180                     }
12181                   if (vex.zeroing)
12182                     oappend ("{z}");
12183                 }
12184             }
12185         }
12186     }
12187
12188   /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
12189      are all 0s in inverted form.  */
12190   if (need_vex && vex.register_specifier != 0)
12191     {
12192       (*info->fprintf_func) (info->stream, "(bad)");
12193       return end_codep - priv.the_buffer;
12194     }
12195
12196   /* Check if the REX prefix is used.  */
12197   if (rex_ignored == 0 && (rex ^ rex_used) == 0 && last_rex_prefix >= 0)
12198     all_prefixes[last_rex_prefix] = 0;
12199
12200   /* Check if the SEG prefix is used.  */
12201   if ((prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
12202                    | PREFIX_FS | PREFIX_GS)) != 0
12203       && (used_prefixes & active_seg_prefix) != 0)
12204     all_prefixes[last_seg_prefix] = 0;
12205
12206   /* Check if the ADDR prefix is used.  */
12207   if ((prefixes & PREFIX_ADDR) != 0
12208       && (used_prefixes & PREFIX_ADDR) != 0)
12209     all_prefixes[last_addr_prefix] = 0;
12210
12211   /* Check if the DATA prefix is used.  */
12212   if ((prefixes & PREFIX_DATA) != 0
12213       && (used_prefixes & PREFIX_DATA) != 0)
12214     all_prefixes[last_data_prefix] = 0;
12215
12216   /* Print the extra prefixes.  */
12217   prefix_length = 0;
12218   for (i = 0; i < (int) ARRAY_SIZE (all_prefixes); i++)
12219     if (all_prefixes[i])
12220       {
12221         const char *name;
12222         name = prefix_name (all_prefixes[i], orig_sizeflag);
12223         if (name == NULL)
12224           abort ();
12225         prefix_length += strlen (name) + 1;
12226         (*info->fprintf_func) (info->stream, "%s ", name);
12227       }
12228
12229   /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
12230      unused, opcode is invalid.  Since the PREFIX_DATA prefix may be
12231      used by putop and MMX/SSE operand and may be overriden by the
12232      PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
12233      separately.  */
12234   if (dp->prefix_requirement == PREFIX_OPCODE
12235       && dp != &bad_opcode
12236       && (((prefixes
12237             & (PREFIX_REPZ | PREFIX_REPNZ)) != 0
12238            && (used_prefixes
12239                & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
12240           || ((((prefixes
12241                  & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
12242                 == PREFIX_DATA)
12243                && (used_prefixes & PREFIX_DATA) == 0))))
12244     {
12245       (*info->fprintf_func) (info->stream, "(bad)");
12246       return end_codep - priv.the_buffer;
12247     }
12248
12249   /* Check maximum code length.  */
12250   if ((codep - start_codep) > MAX_CODE_LENGTH)
12251     {
12252       (*info->fprintf_func) (info->stream, "(bad)");
12253       return MAX_CODE_LENGTH;
12254     }
12255
12256   obufp = mnemonicendp;
12257   for (i = strlen (obuf) + prefix_length; i < 6; i++)
12258     oappend (" ");
12259   oappend (" ");
12260   (*info->fprintf_func) (info->stream, "%s", obuf);
12261
12262   /* The enter and bound instructions are printed with operands in the same
12263      order as the intel book; everything else is printed in reverse order.  */
12264   if (intel_syntax || two_source_ops)
12265     {
12266       bfd_vma riprel;
12267
12268       for (i = 0; i < MAX_OPERANDS; ++i)
12269         op_txt[i] = op_out[i];
12270
12271       if (intel_syntax && dp && dp->op[2].rtn == OP_Rounding
12272           && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
12273         {
12274           op_txt[2] = op_out[3];
12275           op_txt[3] = op_out[2];
12276         }
12277
12278       for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
12279         {
12280           op_ad = op_index[i];
12281           op_index[i] = op_index[MAX_OPERANDS - 1 - i];
12282           op_index[MAX_OPERANDS - 1 - i] = op_ad;
12283           riprel = op_riprel[i];
12284           op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
12285           op_riprel[MAX_OPERANDS - 1 - i] = riprel;
12286         }
12287     }
12288   else
12289     {
12290       for (i = 0; i < MAX_OPERANDS; ++i)
12291         op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
12292     }
12293
12294   needcomma = 0;
12295   for (i = 0; i < MAX_OPERANDS; ++i)
12296     if (*op_txt[i])
12297       {
12298         if (needcomma)
12299           (*info->fprintf_func) (info->stream, ",");
12300         if (op_index[i] != -1 && !op_riprel[i])
12301           (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
12302         else
12303           (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
12304         needcomma = 1;
12305       }
12306
12307   for (i = 0; i < MAX_OPERANDS; i++)
12308     if (op_index[i] != -1 && op_riprel[i])
12309       {
12310         (*info->fprintf_func) (info->stream, "        # ");
12311         (*info->print_address_func) ((bfd_vma) (start_pc + (codep - start_codep)
12312                                                 + op_address[op_index[i]]), info);
12313         break;
12314       }
12315   return codep - priv.the_buffer;
12316 }
12317
12318 static const char *float_mem[] = {
12319   /* d8 */
12320   "fadd{s|}",
12321   "fmul{s|}",
12322   "fcom{s|}",
12323   "fcomp{s|}",
12324   "fsub{s|}",
12325   "fsubr{s|}",
12326   "fdiv{s|}",
12327   "fdivr{s|}",
12328   /* d9 */
12329   "fld{s|}",
12330   "(bad)",
12331   "fst{s|}",
12332   "fstp{s|}",
12333   "fldenvIC",
12334   "fldcw",
12335   "fNstenvIC",
12336   "fNstcw",
12337   /* da */
12338   "fiadd{l|}",
12339   "fimul{l|}",
12340   "ficom{l|}",
12341   "ficomp{l|}",
12342   "fisub{l|}",
12343   "fisubr{l|}",
12344   "fidiv{l|}",
12345   "fidivr{l|}",
12346   /* db */
12347   "fild{l|}",
12348   "fisttp{l|}",
12349   "fist{l|}",
12350   "fistp{l|}",
12351   "(bad)",
12352   "fld{t||t|}",
12353   "(bad)",
12354   "fstp{t||t|}",
12355   /* dc */
12356   "fadd{l|}",
12357   "fmul{l|}",
12358   "fcom{l|}",
12359   "fcomp{l|}",
12360   "fsub{l|}",
12361   "fsubr{l|}",
12362   "fdiv{l|}",
12363   "fdivr{l|}",
12364   /* dd */
12365   "fld{l|}",
12366   "fisttp{ll|}",
12367   "fst{l||}",
12368   "fstp{l|}",
12369   "frstorIC",
12370   "(bad)",
12371   "fNsaveIC",
12372   "fNstsw",
12373   /* de */
12374   "fiadd{s|}",
12375   "fimul{s|}",
12376   "ficom{s|}",
12377   "ficomp{s|}",
12378   "fisub{s|}",
12379   "fisubr{s|}",
12380   "fidiv{s|}",
12381   "fidivr{s|}",
12382   /* df */
12383   "fild{s|}",
12384   "fisttp{s|}",
12385   "fist{s|}",
12386   "fistp{s|}",
12387   "fbld",
12388   "fild{ll|}",
12389   "fbstp",
12390   "fistp{ll|}",
12391 };
12392
12393 static const unsigned char float_mem_mode[] = {
12394   /* d8 */
12395   d_mode,
12396   d_mode,
12397   d_mode,
12398   d_mode,
12399   d_mode,
12400   d_mode,
12401   d_mode,
12402   d_mode,
12403   /* d9 */
12404   d_mode,
12405   0,
12406   d_mode,
12407   d_mode,
12408   0,
12409   w_mode,
12410   0,
12411   w_mode,
12412   /* da */
12413   d_mode,
12414   d_mode,
12415   d_mode,
12416   d_mode,
12417   d_mode,
12418   d_mode,
12419   d_mode,
12420   d_mode,
12421   /* db */
12422   d_mode,
12423   d_mode,
12424   d_mode,
12425   d_mode,
12426   0,
12427   t_mode,
12428   0,
12429   t_mode,
12430   /* dc */
12431   q_mode,
12432   q_mode,
12433   q_mode,
12434   q_mode,
12435   q_mode,
12436   q_mode,
12437   q_mode,
12438   q_mode,
12439   /* dd */
12440   q_mode,
12441   q_mode,
12442   q_mode,
12443   q_mode,
12444   0,
12445   0,
12446   0,
12447   w_mode,
12448   /* de */
12449   w_mode,
12450   w_mode,
12451   w_mode,
12452   w_mode,
12453   w_mode,
12454   w_mode,
12455   w_mode,
12456   w_mode,
12457   /* df */
12458   w_mode,
12459   w_mode,
12460   w_mode,
12461   w_mode,
12462   t_mode,
12463   q_mode,
12464   t_mode,
12465   q_mode
12466 };
12467
12468 #define ST { OP_ST, 0 }
12469 #define STi { OP_STi, 0 }
12470
12471 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
12472 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
12473 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
12474 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
12475 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
12476 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
12477 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
12478 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
12479 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
12480
12481 static const struct dis386 float_reg[][8] = {
12482   /* d8 */
12483   {
12484     { "fadd",   { ST, STi }, 0 },
12485     { "fmul",   { ST, STi }, 0 },
12486     { "fcom",   { STi }, 0 },
12487     { "fcomp",  { STi }, 0 },
12488     { "fsub",   { ST, STi }, 0 },
12489     { "fsubr",  { ST, STi }, 0 },
12490     { "fdiv",   { ST, STi }, 0 },
12491     { "fdivr",  { ST, STi }, 0 },
12492   },
12493   /* d9 */
12494   {
12495     { "fld",    { STi }, 0 },
12496     { "fxch",   { STi }, 0 },
12497     { FGRPd9_2 },
12498     { Bad_Opcode },
12499     { FGRPd9_4 },
12500     { FGRPd9_5 },
12501     { FGRPd9_6 },
12502     { FGRPd9_7 },
12503   },
12504   /* da */
12505   {
12506     { "fcmovb", { ST, STi }, 0 },
12507     { "fcmove", { ST, STi }, 0 },
12508     { "fcmovbe",{ ST, STi }, 0 },
12509     { "fcmovu", { ST, STi }, 0 },
12510     { Bad_Opcode },
12511     { FGRPda_5 },
12512     { Bad_Opcode },
12513     { Bad_Opcode },
12514   },
12515   /* db */
12516   {
12517     { "fcmovnb",{ ST, STi }, 0 },
12518     { "fcmovne",{ ST, STi }, 0 },
12519     { "fcmovnbe",{ ST, STi }, 0 },
12520     { "fcmovnu",{ ST, STi }, 0 },
12521     { FGRPdb_4 },
12522     { "fucomi", { ST, STi }, 0 },
12523     { "fcomi",  { ST, STi }, 0 },
12524     { Bad_Opcode },
12525   },
12526   /* dc */
12527   {
12528     { "fadd",   { STi, ST }, 0 },
12529     { "fmul",   { STi, ST }, 0 },
12530     { Bad_Opcode },
12531     { Bad_Opcode },
12532     { "fsub{!M|r}",     { STi, ST }, 0 },
12533     { "fsub{M|}",       { STi, ST }, 0 },
12534     { "fdiv{!M|r}",     { STi, ST }, 0 },
12535     { "fdiv{M|}",       { STi, ST }, 0 },
12536   },
12537   /* dd */
12538   {
12539     { "ffree",  { STi }, 0 },
12540     { Bad_Opcode },
12541     { "fst",    { STi }, 0 },
12542     { "fstp",   { STi }, 0 },
12543     { "fucom",  { STi }, 0 },
12544     { "fucomp", { STi }, 0 },
12545     { Bad_Opcode },
12546     { Bad_Opcode },
12547   },
12548   /* de */
12549   {
12550     { "faddp",  { STi, ST }, 0 },
12551     { "fmulp",  { STi, ST }, 0 },
12552     { Bad_Opcode },
12553     { FGRPde_3 },
12554     { "fsub{!M|r}p",    { STi, ST }, 0 },
12555     { "fsub{M|}p",      { STi, ST }, 0 },
12556     { "fdiv{!M|r}p",    { STi, ST }, 0 },
12557     { "fdiv{M|}p",      { STi, ST }, 0 },
12558   },
12559   /* df */
12560   {
12561     { "ffreep", { STi }, 0 },
12562     { Bad_Opcode },
12563     { Bad_Opcode },
12564     { Bad_Opcode },
12565     { FGRPdf_4 },
12566     { "fucomip", { ST, STi }, 0 },
12567     { "fcomip", { ST, STi }, 0 },
12568     { Bad_Opcode },
12569   },
12570 };
12571
12572 static char *fgrps[][8] = {
12573   /* Bad opcode 0 */
12574   {
12575     "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12576   },
12577
12578   /* d9_2  1 */
12579   {
12580     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12581   },
12582
12583   /* d9_4  2 */
12584   {
12585     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
12586   },
12587
12588   /* d9_5  3 */
12589   {
12590     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
12591   },
12592
12593   /* d9_6  4 */
12594   {
12595     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
12596   },
12597
12598   /* d9_7  5 */
12599   {
12600     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
12601   },
12602
12603   /* da_5  6 */
12604   {
12605     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12606   },
12607
12608   /* db_4  7 */
12609   {
12610     "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
12611     "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
12612   },
12613
12614   /* de_3  8 */
12615   {
12616     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12617   },
12618
12619   /* df_4  9 */
12620   {
12621     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
12622   },
12623 };
12624
12625 static void
12626 swap_operand (void)
12627 {
12628   mnemonicendp[0] = '.';
12629   mnemonicendp[1] = 's';
12630   mnemonicendp += 2;
12631 }
12632
12633 static void
12634 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
12635                int sizeflag ATTRIBUTE_UNUSED)
12636 {
12637   /* Skip mod/rm byte.  */
12638   MODRM_CHECK;
12639   codep++;
12640 }
12641
12642 static void
12643 dofloat (int sizeflag)
12644 {
12645   const struct dis386 *dp;
12646   unsigned char floatop;
12647
12648   floatop = codep[-1];
12649
12650   if (modrm.mod != 3)
12651     {
12652       int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
12653
12654       putop (float_mem[fp_indx], sizeflag);
12655       obufp = op_out[0];
12656       op_ad = 2;
12657       OP_E (float_mem_mode[fp_indx], sizeflag);
12658       return;
12659     }
12660   /* Skip mod/rm byte.  */
12661   MODRM_CHECK;
12662   codep++;
12663
12664   dp = &float_reg[floatop - 0xd8][modrm.reg];
12665   if (dp->name == NULL)
12666     {
12667       putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
12668
12669       /* Instruction fnstsw is only one with strange arg.  */
12670       if (floatop == 0xdf && codep[-1] == 0xe0)
12671         strcpy (op_out[0], names16[0]);
12672     }
12673   else
12674     {
12675       putop (dp->name, sizeflag);
12676
12677       obufp = op_out[0];
12678       op_ad = 2;
12679       if (dp->op[0].rtn)
12680         (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
12681
12682       obufp = op_out[1];
12683       op_ad = 1;
12684       if (dp->op[1].rtn)
12685         (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
12686     }
12687 }
12688
12689 /* Like oappend (below), but S is a string starting with '%'.
12690    In Intel syntax, the '%' is elided.  */
12691 static void
12692 oappend_maybe_intel (const char *s)
12693 {
12694   oappend (s + intel_syntax);
12695 }
12696
12697 static void
12698 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12699 {
12700   oappend_maybe_intel ("%st");
12701 }
12702
12703 static void
12704 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12705 {
12706   sprintf (scratchbuf, "%%st(%d)", modrm.rm);
12707   oappend_maybe_intel (scratchbuf);
12708 }
12709
12710 /* Capital letters in template are macros.  */
12711 static int
12712 putop (const char *in_template, int sizeflag)
12713 {
12714   const char *p;
12715   int alt = 0;
12716   int cond = 1;
12717   unsigned int l = 0, len = 1;
12718   char last[4];
12719
12720 #define SAVE_LAST(c)                    \
12721   if (l < len && l < sizeof (last))     \
12722     last[l++] = c;                      \
12723   else                                  \
12724     abort ();
12725
12726   for (p = in_template; *p; p++)
12727     {
12728       switch (*p)
12729         {
12730         default:
12731           *obufp++ = *p;
12732           break;
12733         case '%':
12734           len++;
12735           break;
12736         case '!':
12737           cond = 0;
12738           break;
12739         case '{':
12740           if (intel_syntax)
12741             {
12742               while (*++p != '|')
12743                 if (*p == '}' || *p == '\0')
12744                   abort ();
12745             }
12746           /* Fall through.  */
12747         case 'I':
12748           alt = 1;
12749           continue;
12750         case '|':
12751           while (*++p != '}')
12752             {
12753               if (*p == '\0')
12754                 abort ();
12755             }
12756           break;
12757         case '}':
12758           break;
12759         case 'A':
12760           if (intel_syntax)
12761             break;
12762           if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
12763             *obufp++ = 'b';
12764           break;
12765         case 'B':
12766           if (l == 0 && len == 1)
12767             {
12768 case_B:
12769               if (intel_syntax)
12770                 break;
12771               if (sizeflag & SUFFIX_ALWAYS)
12772                 *obufp++ = 'b';
12773             }
12774           else
12775             {
12776               if (l != 1
12777                   || len != 2
12778                   || last[0] != 'L')
12779                 {
12780                   SAVE_LAST (*p);
12781                   break;
12782                 }
12783
12784               if (address_mode == mode_64bit
12785                   && !(prefixes & PREFIX_ADDR))
12786                 {
12787                   *obufp++ = 'a';
12788                   *obufp++ = 'b';
12789                   *obufp++ = 's';
12790                 }
12791
12792               goto case_B;
12793             }
12794           break;
12795         case 'C':
12796           if (intel_syntax && !alt)
12797             break;
12798           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
12799             {
12800               if (sizeflag & DFLAG)
12801                 *obufp++ = intel_syntax ? 'd' : 'l';
12802               else
12803                 *obufp++ = intel_syntax ? 'w' : 's';
12804               used_prefixes |= (prefixes & PREFIX_DATA);
12805             }
12806           break;
12807         case 'D':
12808           if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
12809             break;
12810           USED_REX (REX_W);
12811           if (modrm.mod == 3)
12812             {
12813               if (rex & REX_W)
12814                 *obufp++ = 'q';
12815               else
12816                 {
12817                   if (sizeflag & DFLAG)
12818                     *obufp++ = intel_syntax ? 'd' : 'l';
12819                   else
12820                     *obufp++ = 'w';
12821                   used_prefixes |= (prefixes & PREFIX_DATA);
12822                 }
12823             }
12824           else
12825             *obufp++ = 'w';
12826           break;
12827         case 'E':               /* For jcxz/jecxz */
12828           if (address_mode == mode_64bit)
12829             {
12830               if (sizeflag & AFLAG)
12831                 *obufp++ = 'r';
12832               else
12833                 *obufp++ = 'e';
12834             }
12835           else
12836             if (sizeflag & AFLAG)
12837               *obufp++ = 'e';
12838           used_prefixes |= (prefixes & PREFIX_ADDR);
12839           break;
12840         case 'F':
12841           if (intel_syntax)
12842             break;
12843           if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
12844             {
12845               if (sizeflag & AFLAG)
12846                 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
12847               else
12848                 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
12849               used_prefixes |= (prefixes & PREFIX_ADDR);
12850             }
12851           break;
12852         case 'G':
12853           if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
12854             break;
12855           if ((rex & REX_W) || (sizeflag & DFLAG))
12856             *obufp++ = 'l';
12857           else
12858             *obufp++ = 'w';
12859           if (!(rex & REX_W))
12860             used_prefixes |= (prefixes & PREFIX_DATA);
12861           break;
12862         case 'H':
12863           if (intel_syntax)
12864             break;
12865           if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
12866               || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
12867             {
12868               used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
12869               *obufp++ = ',';
12870               *obufp++ = 'p';
12871               if (prefixes & PREFIX_DS)
12872                 *obufp++ = 't';
12873               else
12874                 *obufp++ = 'n';
12875             }
12876           break;
12877         case 'J':
12878           if (intel_syntax)
12879             break;
12880           *obufp++ = 'l';
12881           break;
12882         case 'K':
12883           USED_REX (REX_W);
12884           if (rex & REX_W)
12885             *obufp++ = 'q';
12886           else
12887             *obufp++ = 'd';
12888           break;
12889         case 'Z':
12890           if (l != 0 || len != 1)
12891             {
12892               if (l != 1 || len != 2 || last[0] != 'X')
12893                 {
12894                   SAVE_LAST (*p);
12895                   break;
12896                 }
12897               if (!need_vex || !vex.evex)
12898                 abort ();
12899               if (intel_syntax
12900                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
12901                 break;
12902               switch (vex.length)
12903                 {
12904                 case 128:
12905                   *obufp++ = 'x';
12906                   break;
12907                 case 256:
12908                   *obufp++ = 'y';
12909                   break;
12910                 case 512:
12911                   *obufp++ = 'z';
12912                   break;
12913                 default:
12914                   abort ();
12915                 }
12916               break;
12917             }
12918           if (intel_syntax)
12919             break;
12920           if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
12921             {
12922               *obufp++ = 'q';
12923               break;
12924             }
12925           /* Fall through.  */
12926           goto case_L;
12927         case 'L':
12928           if (l != 0 || len != 1)
12929             {
12930               SAVE_LAST (*p);
12931               break;
12932             }
12933 case_L:
12934           if (intel_syntax)
12935             break;
12936           if (sizeflag & SUFFIX_ALWAYS)
12937             *obufp++ = 'l';
12938           break;
12939         case 'M':
12940           if (intel_mnemonic != cond)
12941             *obufp++ = 'r';
12942           break;
12943         case 'N':
12944           if ((prefixes & PREFIX_FWAIT) == 0)
12945             *obufp++ = 'n';
12946           else
12947             used_prefixes |= PREFIX_FWAIT;
12948           break;
12949         case 'O':
12950           USED_REX (REX_W);
12951           if (rex & REX_W)
12952             *obufp++ = 'o';
12953           else if (intel_syntax && (sizeflag & DFLAG))
12954             *obufp++ = 'q';
12955           else
12956             *obufp++ = 'd';
12957           if (!(rex & REX_W))
12958             used_prefixes |= (prefixes & PREFIX_DATA);
12959           break;
12960         case '&':
12961           if (!intel_syntax
12962               && address_mode == mode_64bit
12963               && isa64 == intel64)
12964             {
12965               *obufp++ = 'q';
12966               break;
12967             }
12968           /* Fall through.  */
12969         case 'T':
12970           if (!intel_syntax
12971               && address_mode == mode_64bit
12972               && ((sizeflag & DFLAG) || (rex & REX_W)))
12973             {
12974               *obufp++ = 'q';
12975               break;
12976             }
12977           /* Fall through.  */
12978           goto case_P;
12979         case 'P':
12980           if (l == 0 && len == 1)
12981             {
12982 case_P:
12983               if (intel_syntax)
12984                 {
12985                   if ((rex & REX_W) == 0
12986                       && (prefixes & PREFIX_DATA))
12987                     {
12988                       if ((sizeflag & DFLAG) == 0)
12989                         *obufp++ = 'w';
12990                       used_prefixes |= (prefixes & PREFIX_DATA);
12991                     }
12992                   break;
12993                 }
12994               if ((prefixes & PREFIX_DATA)
12995                   || (rex & REX_W)
12996                   || (sizeflag & SUFFIX_ALWAYS))
12997                 {
12998                   USED_REX (REX_W);
12999                   if (rex & REX_W)
13000                     *obufp++ = 'q';
13001                   else
13002                     {
13003                       if (sizeflag & DFLAG)
13004                         *obufp++ = 'l';
13005                       else
13006                         *obufp++ = 'w';
13007                       used_prefixes |= (prefixes & PREFIX_DATA);
13008                     }
13009                 }
13010             }
13011           else
13012             {
13013               if (l != 1 || len != 2 || last[0] != 'L')
13014                 {
13015                   SAVE_LAST (*p);
13016                   break;
13017                 }
13018
13019               if ((prefixes & PREFIX_DATA)
13020                   || (rex & REX_W)
13021                   || (sizeflag & SUFFIX_ALWAYS))
13022                 {
13023                   USED_REX (REX_W);
13024                   if (rex & REX_W)
13025                     *obufp++ = 'q';
13026                   else
13027                     {
13028                       if (sizeflag & DFLAG)
13029                         *obufp++ = intel_syntax ? 'd' : 'l';
13030                       else
13031                         *obufp++ = 'w';
13032                       used_prefixes |= (prefixes & PREFIX_DATA);
13033                     }
13034                 }
13035             }
13036           break;
13037         case 'U':
13038           if (intel_syntax)
13039             break;
13040           if (address_mode == mode_64bit
13041               && ((sizeflag & DFLAG) || (rex & REX_W)))
13042             {
13043               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13044                 *obufp++ = 'q';
13045               break;
13046             }
13047           /* Fall through.  */
13048           goto case_Q;
13049         case 'Q':
13050           if (l == 0 && len == 1)
13051             {
13052 case_Q:
13053               if (intel_syntax && !alt)
13054                 break;
13055               USED_REX (REX_W);
13056               if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
13057                 {
13058                   if (rex & REX_W)
13059                     *obufp++ = 'q';
13060                   else
13061                     {
13062                       if (sizeflag & DFLAG)
13063                         *obufp++ = intel_syntax ? 'd' : 'l';
13064                       else
13065                         *obufp++ = 'w';
13066                       used_prefixes |= (prefixes & PREFIX_DATA);
13067                     }
13068                 }
13069             }
13070           else
13071             {
13072               if (l != 1 || len != 2 || last[0] != 'L')
13073                 {
13074                   SAVE_LAST (*p);
13075                   break;
13076                 }
13077               if (intel_syntax
13078                   || (modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)))
13079                 break;
13080               if ((rex & REX_W))
13081                 {
13082                   USED_REX (REX_W);
13083                   *obufp++ = 'q';
13084                 }
13085               else
13086                 *obufp++ = 'l';
13087             }
13088           break;
13089         case 'R':
13090           USED_REX (REX_W);
13091           if (rex & REX_W)
13092             *obufp++ = 'q';
13093           else if (sizeflag & DFLAG)
13094             {
13095               if (intel_syntax)
13096                   *obufp++ = 'd';
13097               else
13098                   *obufp++ = 'l';
13099             }
13100           else
13101             *obufp++ = 'w';
13102           if (intel_syntax && !p[1]
13103               && ((rex & REX_W) || (sizeflag & DFLAG)))
13104             *obufp++ = 'e';
13105           if (!(rex & REX_W))
13106             used_prefixes |= (prefixes & PREFIX_DATA);
13107           break;
13108         case 'V':
13109           if (l == 0 && len == 1)
13110             {
13111               if (intel_syntax)
13112                 break;
13113               if (address_mode == mode_64bit
13114                   && ((sizeflag & DFLAG) || (rex & REX_W)))
13115                 {
13116                   if (sizeflag & SUFFIX_ALWAYS)
13117                     *obufp++ = 'q';
13118                   break;
13119                 }
13120             }
13121           else
13122             {
13123               if (l != 1
13124                   || len != 2
13125                   || last[0] != 'L')
13126                 {
13127                   SAVE_LAST (*p);
13128                   break;
13129                 }
13130
13131               if (rex & REX_W)
13132                 {
13133                   *obufp++ = 'a';
13134                   *obufp++ = 'b';
13135                   *obufp++ = 's';
13136                 }
13137             }
13138           /* Fall through.  */
13139           goto case_S;
13140         case 'S':
13141           if (l == 0 && len == 1)
13142             {
13143 case_S:
13144               if (intel_syntax)
13145                 break;
13146               if (sizeflag & SUFFIX_ALWAYS)
13147                 {
13148                   if (rex & REX_W)
13149                     *obufp++ = 'q';
13150                   else
13151                     {
13152                       if (sizeflag & DFLAG)
13153                         *obufp++ = 'l';
13154                       else
13155                         *obufp++ = 'w';
13156                       used_prefixes |= (prefixes & PREFIX_DATA);
13157                     }
13158                 }
13159             }
13160           else
13161             {
13162               if (l != 1
13163                   || len != 2
13164                   || last[0] != 'L')
13165                 {
13166                   SAVE_LAST (*p);
13167                   break;
13168                 }
13169
13170               if (address_mode == mode_64bit
13171                   && !(prefixes & PREFIX_ADDR))
13172                 {
13173                   *obufp++ = 'a';
13174                   *obufp++ = 'b';
13175                   *obufp++ = 's';
13176                 }
13177
13178               goto case_S;
13179             }
13180           break;
13181         case 'X':
13182           if (l != 0 || len != 1)
13183             {
13184               SAVE_LAST (*p);
13185               break;
13186             }
13187           if (need_vex && vex.prefix)
13188             {
13189               if (vex.prefix == DATA_PREFIX_OPCODE)
13190                 *obufp++ = 'd';
13191               else
13192                 *obufp++ = 's';
13193             }
13194           else
13195             {
13196               if (prefixes & PREFIX_DATA)
13197                 *obufp++ = 'd';
13198               else
13199                 *obufp++ = 's';
13200               used_prefixes |= (prefixes & PREFIX_DATA);
13201             }
13202           break;
13203         case 'Y':
13204           if (l == 0 && len == 1)
13205             abort ();
13206           else
13207             {
13208               if (l != 1 || len != 2 || last[0] != 'X')
13209                 {
13210                   SAVE_LAST (*p);
13211                   break;
13212                 }
13213               if (!need_vex)
13214                 abort ();
13215               if (intel_syntax
13216                   || ((modrm.mod == 3 || vex.b) && !(sizeflag & SUFFIX_ALWAYS)))
13217                 break;
13218               switch (vex.length)
13219                 {
13220                 case 128:
13221                   *obufp++ = 'x';
13222                   break;
13223                 case 256:
13224                   *obufp++ = 'y';
13225                   break;
13226                 case 512:
13227                   if (!vex.evex)
13228                 default:
13229                     abort ();
13230                 }
13231             }
13232           break;
13233         case 'W':
13234           if (l == 0 && len == 1)
13235             {
13236               /* operand size flag for cwtl, cbtw */
13237               USED_REX (REX_W);
13238               if (rex & REX_W)
13239                 {
13240                   if (intel_syntax)
13241                     *obufp++ = 'd';
13242                   else
13243                     *obufp++ = 'l';
13244                 }
13245               else if (sizeflag & DFLAG)
13246                 *obufp++ = 'w';
13247               else
13248                 *obufp++ = 'b';
13249               if (!(rex & REX_W))
13250                 used_prefixes |= (prefixes & PREFIX_DATA);
13251             }
13252           else
13253             {
13254               if (l != 1
13255                   || len != 2
13256                   || (last[0] != 'X'
13257                       && last[0] != 'L'))
13258                 {
13259                   SAVE_LAST (*p);
13260                   break;
13261                 }
13262               if (!need_vex)
13263                 abort ();
13264               if (last[0] == 'X')
13265                 *obufp++ = vex.w ? 'd': 's';
13266               else
13267                 *obufp++ = vex.w ? 'q': 'd';
13268             }
13269           break;
13270         case '^':
13271           if (intel_syntax)
13272             break;
13273           if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
13274             {
13275               if (sizeflag & DFLAG)
13276                 *obufp++ = 'l';
13277               else
13278                 *obufp++ = 'w';
13279               used_prefixes |= (prefixes & PREFIX_DATA);
13280             }
13281           break;
13282         case '@':
13283           if (intel_syntax)
13284             break;
13285           if (address_mode == mode_64bit
13286               && (isa64 == intel64
13287                   || ((sizeflag & DFLAG) || (rex & REX_W))))
13288               *obufp++ = 'q';
13289           else if ((prefixes & PREFIX_DATA))
13290             {
13291               if (!(sizeflag & DFLAG))
13292                 *obufp++ = 'w';
13293               used_prefixes |= (prefixes & PREFIX_DATA);
13294             }
13295           break;
13296         }
13297       alt = 0;
13298     }
13299   *obufp = 0;
13300   mnemonicendp = obufp;
13301   return 0;
13302 }
13303
13304 static void
13305 oappend (const char *s)
13306 {
13307   obufp = stpcpy (obufp, s);
13308 }
13309
13310 static void
13311 append_seg (void)
13312 {
13313   /* Only print the active segment register.  */
13314   if (!active_seg_prefix)
13315     return;
13316
13317   used_prefixes |= active_seg_prefix;
13318   switch (active_seg_prefix)
13319     {
13320     case PREFIX_CS:
13321       oappend_maybe_intel ("%cs:");
13322       break;
13323     case PREFIX_DS:
13324       oappend_maybe_intel ("%ds:");
13325       break;
13326     case PREFIX_SS:
13327       oappend_maybe_intel ("%ss:");
13328       break;
13329     case PREFIX_ES:
13330       oappend_maybe_intel ("%es:");
13331       break;
13332     case PREFIX_FS:
13333       oappend_maybe_intel ("%fs:");
13334       break;
13335     case PREFIX_GS:
13336       oappend_maybe_intel ("%gs:");
13337       break;
13338     default:
13339       break;
13340     }
13341 }
13342
13343 static void
13344 OP_indirE (int bytemode, int sizeflag)
13345 {
13346   if (!intel_syntax)
13347     oappend ("*");
13348   OP_E (bytemode, sizeflag);
13349 }
13350
13351 static void
13352 print_operand_value (char *buf, int hex, bfd_vma disp)
13353 {
13354   if (address_mode == mode_64bit)
13355     {
13356       if (hex)
13357         {
13358           char tmp[30];
13359           int i;
13360           buf[0] = '0';
13361           buf[1] = 'x';
13362           sprintf_vma (tmp, disp);
13363           for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
13364           strcpy (buf + 2, tmp + i);
13365         }
13366       else
13367         {
13368           bfd_signed_vma v = disp;
13369           char tmp[30];
13370           int i;
13371           if (v < 0)
13372             {
13373               *(buf++) = '-';
13374               v = -disp;
13375               /* Check for possible overflow on 0x8000000000000000.  */
13376               if (v < 0)
13377                 {
13378                   strcpy (buf, "9223372036854775808");
13379                   return;
13380                 }
13381             }
13382           if (!v)
13383             {
13384               strcpy (buf, "0");
13385               return;
13386             }
13387
13388           i = 0;
13389           tmp[29] = 0;
13390           while (v)
13391             {
13392               tmp[28 - i] = (v % 10) + '0';
13393               v /= 10;
13394               i++;
13395             }
13396           strcpy (buf, tmp + 29 - i);
13397         }
13398     }
13399   else
13400     {
13401       if (hex)
13402         sprintf (buf, "0x%x", (unsigned int) disp);
13403       else
13404         sprintf (buf, "%d", (int) disp);
13405     }
13406 }
13407
13408 /* Put DISP in BUF as signed hex number.  */
13409
13410 static void
13411 print_displacement (char *buf, bfd_vma disp)
13412 {
13413   bfd_signed_vma val = disp;
13414   char tmp[30];
13415   int i, j = 0;
13416
13417   if (val < 0)
13418     {
13419       buf[j++] = '-';
13420       val = -disp;
13421
13422       /* Check for possible overflow.  */
13423       if (val < 0)
13424         {
13425           switch (address_mode)
13426             {
13427             case mode_64bit:
13428               strcpy (buf + j, "0x8000000000000000");
13429               break;
13430             case mode_32bit:
13431               strcpy (buf + j, "0x80000000");
13432               break;
13433             case mode_16bit:
13434               strcpy (buf + j, "0x8000");
13435               break;
13436             }
13437           return;
13438         }
13439     }
13440
13441   buf[j++] = '0';
13442   buf[j++] = 'x';
13443
13444   sprintf_vma (tmp, (bfd_vma) val);
13445   for (i = 0; tmp[i] == '0'; i++)
13446     continue;
13447   if (tmp[i] == '\0')
13448     i--;
13449   strcpy (buf + j, tmp + i);
13450 }
13451
13452 static void
13453 intel_operand_size (int bytemode, int sizeflag)
13454 {
13455   if (vex.evex
13456       && vex.b
13457       && (bytemode == x_mode
13458           || bytemode == evex_half_bcst_xmmq_mode))
13459     {
13460       if (vex.w)
13461         oappend ("QWORD PTR ");
13462       else
13463         oappend ("DWORD PTR ");
13464       return;
13465     }
13466   switch (bytemode)
13467     {
13468     case b_mode:
13469     case b_swap_mode:
13470     case dqb_mode:
13471     case db_mode:
13472       oappend ("BYTE PTR ");
13473       break;
13474     case w_mode:
13475     case dw_mode:
13476     case dqw_mode:
13477       oappend ("WORD PTR ");
13478       break;
13479     case indir_v_mode:
13480       if (address_mode == mode_64bit && isa64 == intel64)
13481         {
13482           oappend ("QWORD PTR ");
13483           break;
13484         }
13485       /* Fall through.  */
13486     case stack_v_mode:
13487       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13488         {
13489           oappend ("QWORD PTR ");
13490           break;
13491         }
13492       /* Fall through.  */
13493     case v_mode:
13494     case v_swap_mode:
13495     case dq_mode:
13496       USED_REX (REX_W);
13497       if (rex & REX_W)
13498         oappend ("QWORD PTR ");
13499       else
13500         {
13501           if ((sizeflag & DFLAG) || bytemode == dq_mode)
13502             oappend ("DWORD PTR ");
13503           else
13504             oappend ("WORD PTR ");
13505           used_prefixes |= (prefixes & PREFIX_DATA);
13506         }
13507       break;
13508     case z_mode:
13509       if ((rex & REX_W) || (sizeflag & DFLAG))
13510         *obufp++ = 'D';
13511       oappend ("WORD PTR ");
13512       if (!(rex & REX_W))
13513         used_prefixes |= (prefixes & PREFIX_DATA);
13514       break;
13515     case a_mode:
13516       if (sizeflag & DFLAG)
13517         oappend ("QWORD PTR ");
13518       else
13519         oappend ("DWORD PTR ");
13520       used_prefixes |= (prefixes & PREFIX_DATA);
13521       break;
13522     case d_mode:
13523     case d_scalar_mode:
13524     case d_scalar_swap_mode:
13525     case d_swap_mode:
13526     case dqd_mode:
13527       oappend ("DWORD PTR ");
13528       break;
13529     case q_mode:
13530     case q_scalar_mode:
13531     case q_scalar_swap_mode:
13532     case q_swap_mode:
13533       oappend ("QWORD PTR ");
13534       break;
13535     case dqa_mode:
13536     case m_mode:
13537       if (address_mode == mode_64bit)
13538         oappend ("QWORD PTR ");
13539       else
13540         oappend ("DWORD PTR ");
13541       break;
13542     case f_mode:
13543       if (sizeflag & DFLAG)
13544         oappend ("FWORD PTR ");
13545       else
13546         oappend ("DWORD PTR ");
13547       used_prefixes |= (prefixes & PREFIX_DATA);
13548       break;
13549     case t_mode:
13550       oappend ("TBYTE PTR ");
13551       break;
13552     case x_mode:
13553     case x_swap_mode:
13554     case evex_x_gscat_mode:
13555     case evex_x_nobcst_mode:
13556     case b_scalar_mode:
13557     case w_scalar_mode:
13558       if (need_vex)
13559         {
13560           switch (vex.length)
13561             {
13562             case 128:
13563               oappend ("XMMWORD PTR ");
13564               break;
13565             case 256:
13566               oappend ("YMMWORD PTR ");
13567               break;
13568             case 512:
13569               oappend ("ZMMWORD PTR ");
13570               break;
13571             default:
13572               abort ();
13573             }
13574         }
13575       else
13576         oappend ("XMMWORD PTR ");
13577       break;
13578     case xmm_mode:
13579       oappend ("XMMWORD PTR ");
13580       break;
13581     case ymm_mode:
13582       oappend ("YMMWORD PTR ");
13583       break;
13584     case xmmq_mode:
13585     case evex_half_bcst_xmmq_mode:
13586       if (!need_vex)
13587         abort ();
13588
13589       switch (vex.length)
13590         {
13591         case 128:
13592           oappend ("QWORD PTR ");
13593           break;
13594         case 256:
13595           oappend ("XMMWORD PTR ");
13596           break;
13597         case 512:
13598           oappend ("YMMWORD PTR ");
13599           break;
13600         default:
13601           abort ();
13602         }
13603       break;
13604     case xmm_mb_mode:
13605       if (!need_vex)
13606         abort ();
13607
13608       switch (vex.length)
13609         {
13610         case 128:
13611         case 256:
13612         case 512:
13613           oappend ("BYTE PTR ");
13614           break;
13615         default:
13616           abort ();
13617         }
13618       break;
13619     case xmm_mw_mode:
13620       if (!need_vex)
13621         abort ();
13622
13623       switch (vex.length)
13624         {
13625         case 128:
13626         case 256:
13627         case 512:
13628           oappend ("WORD PTR ");
13629           break;
13630         default:
13631           abort ();
13632         }
13633       break;
13634     case xmm_md_mode:
13635       if (!need_vex)
13636         abort ();
13637
13638       switch (vex.length)
13639         {
13640         case 128:
13641         case 256:
13642         case 512:
13643           oappend ("DWORD PTR ");
13644           break;
13645         default:
13646           abort ();
13647         }
13648       break;
13649     case xmm_mq_mode:
13650       if (!need_vex)
13651         abort ();
13652
13653       switch (vex.length)
13654         {
13655         case 128:
13656         case 256:
13657         case 512:
13658           oappend ("QWORD PTR ");
13659           break;
13660         default:
13661           abort ();
13662         }
13663       break;
13664     case xmmdw_mode:
13665       if (!need_vex)
13666         abort ();
13667
13668       switch (vex.length)
13669         {
13670         case 128:
13671           oappend ("WORD PTR ");
13672           break;
13673         case 256:
13674           oappend ("DWORD PTR ");
13675           break;
13676         case 512:
13677           oappend ("QWORD PTR ");
13678           break;
13679         default:
13680           abort ();
13681         }
13682       break;
13683     case xmmqd_mode:
13684       if (!need_vex)
13685         abort ();
13686
13687       switch (vex.length)
13688         {
13689         case 128:
13690           oappend ("DWORD PTR ");
13691           break;
13692         case 256:
13693           oappend ("QWORD PTR ");
13694           break;
13695         case 512:
13696           oappend ("XMMWORD PTR ");
13697           break;
13698         default:
13699           abort ();
13700         }
13701       break;
13702     case ymmq_mode:
13703       if (!need_vex)
13704         abort ();
13705
13706       switch (vex.length)
13707         {
13708         case 128:
13709           oappend ("QWORD PTR ");
13710           break;
13711         case 256:
13712           oappend ("YMMWORD PTR ");
13713           break;
13714         case 512:
13715           oappend ("ZMMWORD PTR ");
13716           break;
13717         default:
13718           abort ();
13719         }
13720       break;
13721     case ymmxmm_mode:
13722       if (!need_vex)
13723         abort ();
13724
13725       switch (vex.length)
13726         {
13727         case 128:
13728         case 256:
13729           oappend ("XMMWORD PTR ");
13730           break;
13731         default:
13732           abort ();
13733         }
13734       break;
13735     case o_mode:
13736       oappend ("OWORD PTR ");
13737       break;
13738     case xmm_mdq_mode:
13739     case vex_w_dq_mode:
13740     case vex_scalar_w_dq_mode:
13741       if (!need_vex)
13742         abort ();
13743
13744       if (vex.w)
13745         oappend ("QWORD PTR ");
13746       else
13747         oappend ("DWORD PTR ");
13748       break;
13749     case vex_vsib_d_w_dq_mode:
13750     case vex_vsib_q_w_dq_mode:
13751       if (!need_vex)
13752         abort ();
13753
13754       if (!vex.evex)
13755         {
13756           if (vex.w)
13757             oappend ("QWORD PTR ");
13758           else
13759             oappend ("DWORD PTR ");
13760         }
13761       else
13762         {
13763           switch (vex.length)
13764             {
13765             case 128:
13766               oappend ("XMMWORD PTR ");
13767               break;
13768             case 256:
13769               oappend ("YMMWORD PTR ");
13770               break;
13771             case 512:
13772               oappend ("ZMMWORD PTR ");
13773               break;
13774             default:
13775               abort ();
13776             }
13777         }
13778       break;
13779     case vex_vsib_q_w_d_mode:
13780     case vex_vsib_d_w_d_mode:
13781       if (!need_vex || !vex.evex)
13782         abort ();
13783
13784       switch (vex.length)
13785         {
13786         case 128:
13787           oappend ("QWORD PTR ");
13788           break;
13789         case 256:
13790           oappend ("XMMWORD PTR ");
13791           break;
13792         case 512:
13793           oappend ("YMMWORD PTR ");
13794           break;
13795         default:
13796           abort ();
13797         }
13798
13799       break;
13800     case mask_bd_mode:
13801       if (!need_vex || vex.length != 128)
13802         abort ();
13803       if (vex.w)
13804         oappend ("DWORD PTR ");
13805       else
13806         oappend ("BYTE PTR ");
13807       break;
13808     case mask_mode:
13809       if (!need_vex)
13810         abort ();
13811       if (vex.w)
13812         oappend ("QWORD PTR ");
13813       else
13814         oappend ("WORD PTR ");
13815       break;
13816     case v_bnd_mode:
13817     case v_bndmk_mode:
13818     default:
13819       break;
13820     }
13821 }
13822
13823 static void
13824 OP_E_register (int bytemode, int sizeflag)
13825 {
13826   int reg = modrm.rm;
13827   const char **names;
13828
13829   USED_REX (REX_B);
13830   if ((rex & REX_B))
13831     reg += 8;
13832
13833   if ((sizeflag & SUFFIX_ALWAYS)
13834       && (bytemode == b_swap_mode
13835           || bytemode == bnd_swap_mode
13836           || bytemode == v_swap_mode))
13837     swap_operand ();
13838
13839   switch (bytemode)
13840     {
13841     case b_mode:
13842     case b_swap_mode:
13843       USED_REX (0);
13844       if (rex)
13845         names = names8rex;
13846       else
13847         names = names8;
13848       break;
13849     case w_mode:
13850       names = names16;
13851       break;
13852     case d_mode:
13853     case dw_mode:
13854     case db_mode:
13855       names = names32;
13856       break;
13857     case q_mode:
13858       names = names64;
13859       break;
13860     case m_mode:
13861     case v_bnd_mode:
13862       names = address_mode == mode_64bit ? names64 : names32;
13863       break;
13864     case bnd_mode:
13865     case bnd_swap_mode:
13866       if (reg > 0x3)
13867         {
13868           oappend ("(bad)");
13869           return;
13870         }
13871       names = names_bnd;
13872       break;
13873     case indir_v_mode:
13874       if (address_mode == mode_64bit && isa64 == intel64)
13875         {
13876           names = names64;
13877           break;
13878         }
13879       /* Fall through.  */
13880     case stack_v_mode:
13881       if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
13882         {
13883           names = names64;
13884           break;
13885         }
13886       bytemode = v_mode;
13887       /* Fall through.  */
13888     case v_mode:
13889     case v_swap_mode:
13890     case dq_mode:
13891     case dqb_mode:
13892     case dqd_mode:
13893     case dqw_mode:
13894     case dqa_mode:
13895       USED_REX (REX_W);
13896       if (rex & REX_W)
13897         names = names64;
13898       else
13899         {
13900           if ((sizeflag & DFLAG)
13901               || (bytemode != v_mode
13902                   && bytemode != v_swap_mode))
13903             names = names32;
13904           else
13905             names = names16;
13906           used_prefixes |= (prefixes & PREFIX_DATA);
13907         }
13908       break;
13909     case va_mode:
13910       names = (address_mode == mode_64bit
13911                ? names64 : names32);
13912       if (!(prefixes & PREFIX_ADDR))
13913         names = (address_mode == mode_16bit
13914                      ? names16 : names);
13915       else
13916         {
13917           /* Remove "addr16/addr32".  */
13918           all_prefixes[last_addr_prefix] = 0;
13919           names = (address_mode != mode_32bit
13920                        ? names32 : names16);
13921           used_prefixes |= PREFIX_ADDR;
13922         }
13923       break;
13924     case mask_bd_mode:
13925     case mask_mode:
13926       if (reg > 0x7)
13927         {
13928           oappend ("(bad)");
13929           return;
13930         }
13931       names = names_mask;
13932       break;
13933     case 0:
13934       return;
13935     default:
13936       oappend (INTERNAL_DISASSEMBLER_ERROR);
13937       return;
13938     }
13939   oappend (names[reg]);
13940 }
13941
13942 static void
13943 OP_E_memory (int bytemode, int sizeflag)
13944 {
13945   bfd_vma disp = 0;
13946   int add = (rex & REX_B) ? 8 : 0;
13947   int riprel = 0;
13948   int shift;
13949
13950   if (vex.evex)
13951     {
13952       /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0.  */
13953       if (vex.b
13954           && bytemode != x_mode
13955           && bytemode != xmmq_mode
13956           && bytemode != evex_half_bcst_xmmq_mode)
13957         {
13958           BadOp ();
13959           return;
13960         }
13961       switch (bytemode)
13962         {
13963         case dqw_mode:
13964         case dw_mode:
13965           shift = 1;
13966           break;
13967         case dqb_mode:
13968         case db_mode:
13969           shift = 0;
13970           break;
13971         case dq_mode:
13972           if (address_mode != mode_64bit)
13973             {
13974               shift = 2;
13975               break;
13976             }
13977             /* fall through */
13978         case vex_vsib_d_w_dq_mode:
13979         case vex_vsib_d_w_d_mode:
13980         case vex_vsib_q_w_dq_mode:
13981         case vex_vsib_q_w_d_mode:
13982         case evex_x_gscat_mode:
13983         case xmm_mdq_mode:
13984           shift = vex.w ? 3 : 2;
13985           break;
13986         case x_mode:
13987         case evex_half_bcst_xmmq_mode:
13988         case xmmq_mode:
13989           if (vex.b)
13990             {
13991               shift = vex.w ? 3 : 2;
13992               break;
13993             }
13994           /* Fall through.  */
13995         case xmmqd_mode:
13996         case xmmdw_mode:
13997         case ymmq_mode:
13998         case evex_x_nobcst_mode:
13999         case x_swap_mode:
14000           switch (vex.length)
14001             {
14002             case 128:
14003               shift = 4;
14004               break;
14005             case 256:
14006               shift = 5;
14007               break;
14008             case 512:
14009               shift = 6;
14010               break;
14011             default:
14012               abort ();
14013             }
14014           break;
14015         case ymm_mode:
14016           shift = 5;
14017           break;
14018         case xmm_mode:
14019           shift = 4;
14020           break;
14021         case xmm_mq_mode:
14022         case q_mode:
14023         case q_scalar_mode:
14024         case q_swap_mode:
14025         case q_scalar_swap_mode:
14026           shift = 3;
14027           break;
14028         case dqd_mode:
14029         case xmm_md_mode:
14030         case d_mode:
14031         case d_scalar_mode:
14032         case d_swap_mode:
14033         case d_scalar_swap_mode:
14034           shift = 2;
14035           break;
14036         case w_scalar_mode:
14037         case xmm_mw_mode:
14038           shift = 1;
14039           break;
14040         case b_scalar_mode:
14041         case xmm_mb_mode:
14042           shift = 0;
14043           break;
14044         case dqa_mode:
14045           shift = address_mode == mode_64bit ? 3 : 2;
14046           break;
14047         default:
14048           abort ();
14049         }
14050       /* Make necessary corrections to shift for modes that need it.
14051          For these modes we currently have shift 4, 5 or 6 depending on
14052          vex.length (it corresponds to xmmword, ymmword or zmmword
14053          operand).  We might want to make it 3, 4 or 5 (e.g. for
14054          xmmq_mode).  In case of broadcast enabled the corrections
14055          aren't needed, as element size is always 32 or 64 bits.  */
14056       if (!vex.b
14057           && (bytemode == xmmq_mode
14058               || bytemode == evex_half_bcst_xmmq_mode))
14059         shift -= 1;
14060       else if (bytemode == xmmqd_mode)
14061         shift -= 2;
14062       else if (bytemode == xmmdw_mode)
14063         shift -= 3;
14064       else if (bytemode == ymmq_mode && vex.length == 128)
14065         shift -= 1;
14066     }
14067   else
14068     shift = 0;
14069
14070   USED_REX (REX_B);
14071   if (intel_syntax)
14072     intel_operand_size (bytemode, sizeflag);
14073   append_seg ();
14074
14075   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14076     {
14077       /* 32/64 bit address mode */
14078       int havedisp;
14079       int havesib;
14080       int havebase;
14081       int haveindex;
14082       int needindex;
14083       int needaddr32;
14084       int base, rbase;
14085       int vindex = 0;
14086       int scale = 0;
14087       int addr32flag = !((sizeflag & AFLAG)
14088                          || bytemode == v_bnd_mode
14089                          || bytemode == v_bndmk_mode
14090                          || bytemode == bnd_mode
14091                          || bytemode == bnd_swap_mode);
14092       const char **indexes64 = names64;
14093       const char **indexes32 = names32;
14094
14095       havesib = 0;
14096       havebase = 1;
14097       haveindex = 0;
14098       base = modrm.rm;
14099
14100       if (base == 4)
14101         {
14102           havesib = 1;
14103           vindex = sib.index;
14104           USED_REX (REX_X);
14105           if (rex & REX_X)
14106             vindex += 8;
14107           switch (bytemode)
14108             {
14109             case vex_vsib_d_w_dq_mode:
14110             case vex_vsib_d_w_d_mode:
14111             case vex_vsib_q_w_dq_mode:
14112             case vex_vsib_q_w_d_mode:
14113               if (!need_vex)
14114                 abort ();
14115               if (vex.evex)
14116                 {
14117                   if (!vex.v)
14118                     vindex += 16;
14119                 }
14120
14121               haveindex = 1;
14122               switch (vex.length)
14123                 {
14124                 case 128:
14125                   indexes64 = indexes32 = names_xmm;
14126                   break;
14127                 case 256:
14128                   if (!vex.w
14129                       || bytemode == vex_vsib_q_w_dq_mode
14130                       || bytemode == vex_vsib_q_w_d_mode)
14131                     indexes64 = indexes32 = names_ymm;
14132                   else
14133                     indexes64 = indexes32 = names_xmm;
14134                   break;
14135                 case 512:
14136                   if (!vex.w
14137                       || bytemode == vex_vsib_q_w_dq_mode
14138                       || bytemode == vex_vsib_q_w_d_mode)
14139                     indexes64 = indexes32 = names_zmm;
14140                   else
14141                     indexes64 = indexes32 = names_ymm;
14142                   break;
14143                 default:
14144                   abort ();
14145                 }
14146               break;
14147             default:
14148               haveindex = vindex != 4;
14149               break;
14150             }
14151           scale = sib.scale;
14152           base = sib.base;
14153           codep++;
14154         }
14155       rbase = base + add;
14156
14157       switch (modrm.mod)
14158         {
14159         case 0:
14160           if (base == 5)
14161             {
14162               havebase = 0;
14163               if (address_mode == mode_64bit && !havesib)
14164                 riprel = 1;
14165               disp = get32s ();
14166               if (riprel && bytemode == v_bndmk_mode)
14167                 {
14168                   oappend ("(bad)");
14169                   return;
14170                 }
14171             }
14172           break;
14173         case 1:
14174           FETCH_DATA (the_info, codep + 1);
14175           disp = *codep++;
14176           if ((disp & 0x80) != 0)
14177             disp -= 0x100;
14178           if (vex.evex && shift > 0)
14179             disp <<= shift;
14180           break;
14181         case 2:
14182           disp = get32s ();
14183           break;
14184         }
14185
14186       needindex = 0;
14187       needaddr32 = 0;
14188       if (havesib
14189           && !havebase
14190           && !haveindex
14191           && address_mode != mode_16bit)
14192         {
14193           if (address_mode == mode_64bit)
14194             {
14195               /* Display eiz instead of addr32.  */
14196               needindex = addr32flag;
14197               needaddr32 = 1;
14198             }
14199           else
14200             {
14201               /* In 32-bit mode, we need index register to tell [offset]
14202                  from [eiz*1 + offset].  */
14203               needindex = 1;
14204             }
14205         }
14206
14207       havedisp = (havebase
14208                   || needindex
14209                   || (havesib && (haveindex || scale != 0)));
14210
14211       if (!intel_syntax)
14212         if (modrm.mod != 0 || base == 5)
14213           {
14214             if (havedisp || riprel)
14215               print_displacement (scratchbuf, disp);
14216             else
14217               print_operand_value (scratchbuf, 1, disp);
14218             oappend (scratchbuf);
14219             if (riprel)
14220               {
14221                 set_op (disp, 1);
14222                 oappend (!addr32flag ? "(%rip)" : "(%eip)");
14223               }
14224           }
14225
14226       if ((havebase || haveindex || needaddr32 || riprel)
14227           && (bytemode != v_bnd_mode)
14228           && (bytemode != v_bndmk_mode)
14229           && (bytemode != bnd_mode)
14230           && (bytemode != bnd_swap_mode))
14231         used_prefixes |= PREFIX_ADDR;
14232
14233       if (havedisp || (intel_syntax && riprel))
14234         {
14235           *obufp++ = open_char;
14236           if (intel_syntax && riprel)
14237             {
14238               set_op (disp, 1);
14239               oappend (!addr32flag ? "rip" : "eip");
14240             }
14241           *obufp = '\0';
14242           if (havebase)
14243             oappend (address_mode == mode_64bit && !addr32flag
14244                      ? names64[rbase] : names32[rbase]);
14245           if (havesib)
14246             {
14247               /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
14248                  print index to tell base + index from base.  */
14249               if (scale != 0
14250                   || needindex
14251                   || haveindex
14252                   || (havebase && base != ESP_REG_NUM))
14253                 {
14254                   if (!intel_syntax || havebase)
14255                     {
14256                       *obufp++ = separator_char;
14257                       *obufp = '\0';
14258                     }
14259                   if (haveindex)
14260                     oappend (address_mode == mode_64bit && !addr32flag
14261                              ? indexes64[vindex] : indexes32[vindex]);
14262                   else
14263                     oappend (address_mode == mode_64bit && !addr32flag
14264                              ? index64 : index32);
14265
14266                   *obufp++ = scale_char;
14267                   *obufp = '\0';
14268                   sprintf (scratchbuf, "%d", 1 << scale);
14269                   oappend (scratchbuf);
14270                 }
14271             }
14272           if (intel_syntax
14273               && (disp || modrm.mod != 0 || base == 5))
14274             {
14275               if (!havedisp || (bfd_signed_vma) disp >= 0)
14276                 {
14277                   *obufp++ = '+';
14278                   *obufp = '\0';
14279                 }
14280               else if (modrm.mod != 1 && disp != -disp)
14281                 {
14282                   *obufp++ = '-';
14283                   *obufp = '\0';
14284                   disp = - (bfd_signed_vma) disp;
14285                 }
14286
14287               if (havedisp)
14288                 print_displacement (scratchbuf, disp);
14289               else
14290                 print_operand_value (scratchbuf, 1, disp);
14291               oappend (scratchbuf);
14292             }
14293
14294           *obufp++ = close_char;
14295           *obufp = '\0';
14296         }
14297       else if (intel_syntax)
14298         {
14299           if (modrm.mod != 0 || base == 5)
14300             {
14301               if (!active_seg_prefix)
14302                 {
14303                   oappend (names_seg[ds_reg - es_reg]);
14304                   oappend (":");
14305                 }
14306               print_operand_value (scratchbuf, 1, disp);
14307               oappend (scratchbuf);
14308             }
14309         }
14310     }
14311   else
14312     {
14313       /* 16 bit address mode */
14314       used_prefixes |= prefixes & PREFIX_ADDR;
14315       switch (modrm.mod)
14316         {
14317         case 0:
14318           if (modrm.rm == 6)
14319             {
14320               disp = get16 ();
14321               if ((disp & 0x8000) != 0)
14322                 disp -= 0x10000;
14323             }
14324           break;
14325         case 1:
14326           FETCH_DATA (the_info, codep + 1);
14327           disp = *codep++;
14328           if ((disp & 0x80) != 0)
14329             disp -= 0x100;
14330           if (vex.evex && shift > 0)
14331             disp <<= shift;
14332           break;
14333         case 2:
14334           disp = get16 ();
14335           if ((disp & 0x8000) != 0)
14336             disp -= 0x10000;
14337           break;
14338         }
14339
14340       if (!intel_syntax)
14341         if (modrm.mod != 0 || modrm.rm == 6)
14342           {
14343             print_displacement (scratchbuf, disp);
14344             oappend (scratchbuf);
14345           }
14346
14347       if (modrm.mod != 0 || modrm.rm != 6)
14348         {
14349           *obufp++ = open_char;
14350           *obufp = '\0';
14351           oappend (index16[modrm.rm]);
14352           if (intel_syntax
14353               && (disp || modrm.mod != 0 || modrm.rm == 6))
14354             {
14355               if ((bfd_signed_vma) disp >= 0)
14356                 {
14357                   *obufp++ = '+';
14358                   *obufp = '\0';
14359                 }
14360               else if (modrm.mod != 1)
14361                 {
14362                   *obufp++ = '-';
14363                   *obufp = '\0';
14364                   disp = - (bfd_signed_vma) disp;
14365                 }
14366
14367               print_displacement (scratchbuf, disp);
14368               oappend (scratchbuf);
14369             }
14370
14371           *obufp++ = close_char;
14372           *obufp = '\0';
14373         }
14374       else if (intel_syntax)
14375         {
14376           if (!active_seg_prefix)
14377             {
14378               oappend (names_seg[ds_reg - es_reg]);
14379               oappend (":");
14380             }
14381           print_operand_value (scratchbuf, 1, disp & 0xffff);
14382           oappend (scratchbuf);
14383         }
14384     }
14385   if (vex.evex && vex.b
14386       && (bytemode == x_mode
14387           || bytemode == xmmq_mode
14388           || bytemode == evex_half_bcst_xmmq_mode))
14389     {
14390       if (vex.w
14391           || bytemode == xmmq_mode
14392           || bytemode == evex_half_bcst_xmmq_mode)
14393         {
14394           switch (vex.length)
14395             {
14396             case 128:
14397               oappend ("{1to2}");
14398               break;
14399             case 256:
14400               oappend ("{1to4}");
14401               break;
14402             case 512:
14403               oappend ("{1to8}");
14404               break;
14405             default:
14406               abort ();
14407             }
14408         }
14409       else
14410         {
14411           switch (vex.length)
14412             {
14413             case 128:
14414               oappend ("{1to4}");
14415               break;
14416             case 256:
14417               oappend ("{1to8}");
14418               break;
14419             case 512:
14420               oappend ("{1to16}");
14421               break;
14422             default:
14423               abort ();
14424             }
14425         }
14426     }
14427 }
14428
14429 static void
14430 OP_E (int bytemode, int sizeflag)
14431 {
14432   /* Skip mod/rm byte.  */
14433   MODRM_CHECK;
14434   codep++;
14435
14436   if (modrm.mod == 3)
14437     OP_E_register (bytemode, sizeflag);
14438   else
14439     OP_E_memory (bytemode, sizeflag);
14440 }
14441
14442 static void
14443 OP_G (int bytemode, int sizeflag)
14444 {
14445   int add = 0;
14446   const char **names;
14447   USED_REX (REX_R);
14448   if (rex & REX_R)
14449     add += 8;
14450   switch (bytemode)
14451     {
14452     case b_mode:
14453       USED_REX (0);
14454       if (rex)
14455         oappend (names8rex[modrm.reg + add]);
14456       else
14457         oappend (names8[modrm.reg + add]);
14458       break;
14459     case w_mode:
14460       oappend (names16[modrm.reg + add]);
14461       break;
14462     case d_mode:
14463     case db_mode:
14464     case dw_mode:
14465       oappend (names32[modrm.reg + add]);
14466       break;
14467     case q_mode:
14468       oappend (names64[modrm.reg + add]);
14469       break;
14470     case bnd_mode:
14471       if (modrm.reg > 0x3)
14472         {
14473           oappend ("(bad)");
14474           return;
14475         }
14476       oappend (names_bnd[modrm.reg]);
14477       break;
14478     case v_mode:
14479     case dq_mode:
14480     case dqb_mode:
14481     case dqd_mode:
14482     case dqw_mode:
14483       USED_REX (REX_W);
14484       if (rex & REX_W)
14485         oappend (names64[modrm.reg + add]);
14486       else
14487         {
14488           if ((sizeflag & DFLAG) || bytemode != v_mode)
14489             oappend (names32[modrm.reg + add]);
14490           else
14491             oappend (names16[modrm.reg + add]);
14492           used_prefixes |= (prefixes & PREFIX_DATA);
14493         }
14494       break;
14495     case va_mode:
14496       names = (address_mode == mode_64bit
14497                ? names64 : names32);
14498       if (!(prefixes & PREFIX_ADDR))
14499         {
14500           if (address_mode == mode_16bit)
14501             names = names16;
14502         }
14503       else
14504         {
14505           /* Remove "addr16/addr32".  */
14506           all_prefixes[last_addr_prefix] = 0;
14507           names = (address_mode != mode_32bit
14508                        ? names32 : names16);
14509           used_prefixes |= PREFIX_ADDR;
14510         }
14511       oappend (names[modrm.reg + add]);
14512       break;
14513     case m_mode:
14514       if (address_mode == mode_64bit)
14515         oappend (names64[modrm.reg + add]);
14516       else
14517         oappend (names32[modrm.reg + add]);
14518       break;
14519     case mask_bd_mode:
14520     case mask_mode:
14521       if ((modrm.reg + add) > 0x7)
14522         {
14523           oappend ("(bad)");
14524           return;
14525         }
14526       oappend (names_mask[modrm.reg + add]);
14527       break;
14528     default:
14529       oappend (INTERNAL_DISASSEMBLER_ERROR);
14530       break;
14531     }
14532 }
14533
14534 static bfd_vma
14535 get64 (void)
14536 {
14537   bfd_vma x;
14538 #ifdef BFD64
14539   unsigned int a;
14540   unsigned int b;
14541
14542   FETCH_DATA (the_info, codep + 8);
14543   a = *codep++ & 0xff;
14544   a |= (*codep++ & 0xff) << 8;
14545   a |= (*codep++ & 0xff) << 16;
14546   a |= (*codep++ & 0xffu) << 24;
14547   b = *codep++ & 0xff;
14548   b |= (*codep++ & 0xff) << 8;
14549   b |= (*codep++ & 0xff) << 16;
14550   b |= (*codep++ & 0xffu) << 24;
14551   x = a + ((bfd_vma) b << 32);
14552 #else
14553   abort ();
14554   x = 0;
14555 #endif
14556   return x;
14557 }
14558
14559 static bfd_signed_vma
14560 get32 (void)
14561 {
14562   bfd_signed_vma x = 0;
14563
14564   FETCH_DATA (the_info, codep + 4);
14565   x = *codep++ & (bfd_signed_vma) 0xff;
14566   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14567   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14568   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14569   return x;
14570 }
14571
14572 static bfd_signed_vma
14573 get32s (void)
14574 {
14575   bfd_signed_vma x = 0;
14576
14577   FETCH_DATA (the_info, codep + 4);
14578   x = *codep++ & (bfd_signed_vma) 0xff;
14579   x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
14580   x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
14581   x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
14582
14583   x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
14584
14585   return x;
14586 }
14587
14588 static int
14589 get16 (void)
14590 {
14591   int x = 0;
14592
14593   FETCH_DATA (the_info, codep + 2);
14594   x = *codep++ & 0xff;
14595   x |= (*codep++ & 0xff) << 8;
14596   return x;
14597 }
14598
14599 static void
14600 set_op (bfd_vma op, int riprel)
14601 {
14602   op_index[op_ad] = op_ad;
14603   if (address_mode == mode_64bit)
14604     {
14605       op_address[op_ad] = op;
14606       op_riprel[op_ad] = riprel;
14607     }
14608   else
14609     {
14610       /* Mask to get a 32-bit address.  */
14611       op_address[op_ad] = op & 0xffffffff;
14612       op_riprel[op_ad] = riprel & 0xffffffff;
14613     }
14614 }
14615
14616 static void
14617 OP_REG (int code, int sizeflag)
14618 {
14619   const char *s;
14620   int add;
14621
14622   switch (code)
14623     {
14624     case es_reg: case ss_reg: case cs_reg:
14625     case ds_reg: case fs_reg: case gs_reg:
14626       oappend (names_seg[code - es_reg]);
14627       return;
14628     }
14629
14630   USED_REX (REX_B);
14631   if (rex & REX_B)
14632     add = 8;
14633   else
14634     add = 0;
14635
14636   switch (code)
14637     {
14638     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14639     case sp_reg: case bp_reg: case si_reg: case di_reg:
14640       s = names16[code - ax_reg + add];
14641       break;
14642     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14643     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14644       USED_REX (0);
14645       if (rex)
14646         s = names8rex[code - al_reg + add];
14647       else
14648         s = names8[code - al_reg];
14649       break;
14650     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
14651     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
14652       if (address_mode == mode_64bit
14653           && ((sizeflag & DFLAG) || (rex & REX_W)))
14654         {
14655           s = names64[code - rAX_reg + add];
14656           break;
14657         }
14658       code += eAX_reg - rAX_reg;
14659       /* Fall through.  */
14660     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14661     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14662       USED_REX (REX_W);
14663       if (rex & REX_W)
14664         s = names64[code - eAX_reg + add];
14665       else
14666         {
14667           if (sizeflag & DFLAG)
14668             s = names32[code - eAX_reg + add];
14669           else
14670             s = names16[code - eAX_reg + add];
14671           used_prefixes |= (prefixes & PREFIX_DATA);
14672         }
14673       break;
14674     default:
14675       s = INTERNAL_DISASSEMBLER_ERROR;
14676       break;
14677     }
14678   oappend (s);
14679 }
14680
14681 static void
14682 OP_IMREG (int code, int sizeflag)
14683 {
14684   const char *s;
14685
14686   switch (code)
14687     {
14688     case indir_dx_reg:
14689       if (intel_syntax)
14690         s = "dx";
14691       else
14692         s = "(%dx)";
14693       break;
14694     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
14695     case sp_reg: case bp_reg: case si_reg: case di_reg:
14696       s = names16[code - ax_reg];
14697       break;
14698     case es_reg: case ss_reg: case cs_reg:
14699     case ds_reg: case fs_reg: case gs_reg:
14700       s = names_seg[code - es_reg];
14701       break;
14702     case al_reg: case ah_reg: case cl_reg: case ch_reg:
14703     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
14704       USED_REX (0);
14705       if (rex)
14706         s = names8rex[code - al_reg];
14707       else
14708         s = names8[code - al_reg];
14709       break;
14710     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
14711     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
14712       USED_REX (REX_W);
14713       if (rex & REX_W)
14714         s = names64[code - eAX_reg];
14715       else
14716         {
14717           if (sizeflag & DFLAG)
14718             s = names32[code - eAX_reg];
14719           else
14720             s = names16[code - eAX_reg];
14721           used_prefixes |= (prefixes & PREFIX_DATA);
14722         }
14723       break;
14724     case z_mode_ax_reg:
14725       if ((rex & REX_W) || (sizeflag & DFLAG))
14726         s = *names32;
14727       else
14728         s = *names16;
14729       if (!(rex & REX_W))
14730         used_prefixes |= (prefixes & PREFIX_DATA);
14731       break;
14732     default:
14733       s = INTERNAL_DISASSEMBLER_ERROR;
14734       break;
14735     }
14736   oappend (s);
14737 }
14738
14739 static void
14740 OP_I (int bytemode, int sizeflag)
14741 {
14742   bfd_signed_vma op;
14743   bfd_signed_vma mask = -1;
14744
14745   switch (bytemode)
14746     {
14747     case b_mode:
14748       FETCH_DATA (the_info, codep + 1);
14749       op = *codep++;
14750       mask = 0xff;
14751       break;
14752     case q_mode:
14753       if (address_mode == mode_64bit)
14754         {
14755           op = get32s ();
14756           break;
14757         }
14758       /* Fall through.  */
14759     case v_mode:
14760       USED_REX (REX_W);
14761       if (rex & REX_W)
14762         op = get32s ();
14763       else
14764         {
14765           if (sizeflag & DFLAG)
14766             {
14767               op = get32 ();
14768               mask = 0xffffffff;
14769             }
14770           else
14771             {
14772               op = get16 ();
14773               mask = 0xfffff;
14774             }
14775           used_prefixes |= (prefixes & PREFIX_DATA);
14776         }
14777       break;
14778     case w_mode:
14779       mask = 0xfffff;
14780       op = get16 ();
14781       break;
14782     case const_1_mode:
14783       if (intel_syntax)
14784         oappend ("1");
14785       return;
14786     default:
14787       oappend (INTERNAL_DISASSEMBLER_ERROR);
14788       return;
14789     }
14790
14791   op &= mask;
14792   scratchbuf[0] = '$';
14793   print_operand_value (scratchbuf + 1, 1, op);
14794   oappend_maybe_intel (scratchbuf);
14795   scratchbuf[0] = '\0';
14796 }
14797
14798 static void
14799 OP_I64 (int bytemode, int sizeflag)
14800 {
14801   bfd_signed_vma op;
14802   bfd_signed_vma mask = -1;
14803
14804   if (address_mode != mode_64bit)
14805     {
14806       OP_I (bytemode, sizeflag);
14807       return;
14808     }
14809
14810   switch (bytemode)
14811     {
14812     case b_mode:
14813       FETCH_DATA (the_info, codep + 1);
14814       op = *codep++;
14815       mask = 0xff;
14816       break;
14817     case v_mode:
14818       USED_REX (REX_W);
14819       if (rex & REX_W)
14820         op = get64 ();
14821       else
14822         {
14823           if (sizeflag & DFLAG)
14824             {
14825               op = get32 ();
14826               mask = 0xffffffff;
14827             }
14828           else
14829             {
14830               op = get16 ();
14831               mask = 0xfffff;
14832             }
14833           used_prefixes |= (prefixes & PREFIX_DATA);
14834         }
14835       break;
14836     case w_mode:
14837       mask = 0xfffff;
14838       op = get16 ();
14839       break;
14840     default:
14841       oappend (INTERNAL_DISASSEMBLER_ERROR);
14842       return;
14843     }
14844
14845   op &= mask;
14846   scratchbuf[0] = '$';
14847   print_operand_value (scratchbuf + 1, 1, op);
14848   oappend_maybe_intel (scratchbuf);
14849   scratchbuf[0] = '\0';
14850 }
14851
14852 static void
14853 OP_sI (int bytemode, int sizeflag)
14854 {
14855   bfd_signed_vma op;
14856
14857   switch (bytemode)
14858     {
14859     case b_mode:
14860     case b_T_mode:
14861       FETCH_DATA (the_info, codep + 1);
14862       op = *codep++;
14863       if ((op & 0x80) != 0)
14864         op -= 0x100;
14865       if (bytemode == b_T_mode)
14866         {
14867           if (address_mode != mode_64bit
14868               || !((sizeflag & DFLAG) || (rex & REX_W)))
14869             {
14870               /* The operand-size prefix is overridden by a REX prefix.  */
14871               if ((sizeflag & DFLAG) || (rex & REX_W))
14872                 op &= 0xffffffff;
14873               else
14874                 op &= 0xffff;
14875           }
14876         }
14877       else
14878         {
14879           if (!(rex & REX_W))
14880             {
14881               if (sizeflag & DFLAG)
14882                 op &= 0xffffffff;
14883               else
14884                 op &= 0xffff;
14885             }
14886         }
14887       break;
14888     case v_mode:
14889       /* The operand-size prefix is overridden by a REX prefix.  */
14890       if ((sizeflag & DFLAG) || (rex & REX_W))
14891         op = get32s ();
14892       else
14893         op = get16 ();
14894       break;
14895     default:
14896       oappend (INTERNAL_DISASSEMBLER_ERROR);
14897       return;
14898     }
14899
14900   scratchbuf[0] = '$';
14901   print_operand_value (scratchbuf + 1, 1, op);
14902   oappend_maybe_intel (scratchbuf);
14903 }
14904
14905 static void
14906 OP_J (int bytemode, int sizeflag)
14907 {
14908   bfd_vma disp;
14909   bfd_vma mask = -1;
14910   bfd_vma segment = 0;
14911
14912   switch (bytemode)
14913     {
14914     case b_mode:
14915       FETCH_DATA (the_info, codep + 1);
14916       disp = *codep++;
14917       if ((disp & 0x80) != 0)
14918         disp -= 0x100;
14919       break;
14920     case v_mode:
14921       if (isa64 == amd64)
14922         USED_REX (REX_W);
14923       if ((sizeflag & DFLAG)
14924           || (address_mode == mode_64bit
14925               && (isa64 != amd64 || (rex & REX_W))))
14926         disp = get32s ();
14927       else
14928         {
14929           disp = get16 ();
14930           if ((disp & 0x8000) != 0)
14931             disp -= 0x10000;
14932           /* In 16bit mode, address is wrapped around at 64k within
14933              the same segment.  Otherwise, a data16 prefix on a jump
14934              instruction means that the pc is masked to 16 bits after
14935              the displacement is added!  */
14936           mask = 0xffff;
14937           if ((prefixes & PREFIX_DATA) == 0)
14938             segment = ((start_pc + (codep - start_codep))
14939                        & ~((bfd_vma) 0xffff));
14940         }
14941       if (address_mode != mode_64bit
14942           || (isa64 == amd64 && !(rex & REX_W)))
14943         used_prefixes |= (prefixes & PREFIX_DATA);
14944       break;
14945     default:
14946       oappend (INTERNAL_DISASSEMBLER_ERROR);
14947       return;
14948     }
14949   disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
14950   set_op (disp, 0);
14951   print_operand_value (scratchbuf, 1, disp);
14952   oappend (scratchbuf);
14953 }
14954
14955 static void
14956 OP_SEG (int bytemode, int sizeflag)
14957 {
14958   if (bytemode == w_mode)
14959     oappend (names_seg[modrm.reg]);
14960   else
14961     OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
14962 }
14963
14964 static void
14965 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
14966 {
14967   int seg, offset;
14968
14969   if (sizeflag & DFLAG)
14970     {
14971       offset = get32 ();
14972       seg = get16 ();
14973     }
14974   else
14975     {
14976       offset = get16 ();
14977       seg = get16 ();
14978     }
14979   used_prefixes |= (prefixes & PREFIX_DATA);
14980   if (intel_syntax)
14981     sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
14982   else
14983     sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
14984   oappend (scratchbuf);
14985 }
14986
14987 static void
14988 OP_OFF (int bytemode, int sizeflag)
14989 {
14990   bfd_vma off;
14991
14992   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
14993     intel_operand_size (bytemode, sizeflag);
14994   append_seg ();
14995
14996   if ((sizeflag & AFLAG) || address_mode == mode_64bit)
14997     off = get32 ();
14998   else
14999     off = get16 ();
15000
15001   if (intel_syntax)
15002     {
15003       if (!active_seg_prefix)
15004         {
15005           oappend (names_seg[ds_reg - es_reg]);
15006           oappend (":");
15007         }
15008     }
15009   print_operand_value (scratchbuf, 1, off);
15010   oappend (scratchbuf);
15011 }
15012
15013 static void
15014 OP_OFF64 (int bytemode, int sizeflag)
15015 {
15016   bfd_vma off;
15017
15018   if (address_mode != mode_64bit
15019       || (prefixes & PREFIX_ADDR))
15020     {
15021       OP_OFF (bytemode, sizeflag);
15022       return;
15023     }
15024
15025   if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
15026     intel_operand_size (bytemode, sizeflag);
15027   append_seg ();
15028
15029   off = get64 ();
15030
15031   if (intel_syntax)
15032     {
15033       if (!active_seg_prefix)
15034         {
15035           oappend (names_seg[ds_reg - es_reg]);
15036           oappend (":");
15037         }
15038     }
15039   print_operand_value (scratchbuf, 1, off);
15040   oappend (scratchbuf);
15041 }
15042
15043 static void
15044 ptr_reg (int code, int sizeflag)
15045 {
15046   const char *s;
15047
15048   *obufp++ = open_char;
15049   used_prefixes |= (prefixes & PREFIX_ADDR);
15050   if (address_mode == mode_64bit)
15051     {
15052       if (!(sizeflag & AFLAG))
15053         s = names32[code - eAX_reg];
15054       else
15055         s = names64[code - eAX_reg];
15056     }
15057   else if (sizeflag & AFLAG)
15058     s = names32[code - eAX_reg];
15059   else
15060     s = names16[code - eAX_reg];
15061   oappend (s);
15062   *obufp++ = close_char;
15063   *obufp = 0;
15064 }
15065
15066 static void
15067 OP_ESreg (int code, int sizeflag)
15068 {
15069   if (intel_syntax)
15070     {
15071       switch (codep[-1])
15072         {
15073         case 0x6d:      /* insw/insl */
15074           intel_operand_size (z_mode, sizeflag);
15075           break;
15076         case 0xa5:      /* movsw/movsl/movsq */
15077         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15078         case 0xab:      /* stosw/stosl */
15079         case 0xaf:      /* scasw/scasl */
15080           intel_operand_size (v_mode, sizeflag);
15081           break;
15082         default:
15083           intel_operand_size (b_mode, sizeflag);
15084         }
15085     }
15086   oappend_maybe_intel ("%es:");
15087   ptr_reg (code, sizeflag);
15088 }
15089
15090 static void
15091 OP_DSreg (int code, int sizeflag)
15092 {
15093   if (intel_syntax)
15094     {
15095       switch (codep[-1])
15096         {
15097         case 0x6f:      /* outsw/outsl */
15098           intel_operand_size (z_mode, sizeflag);
15099           break;
15100         case 0xa5:      /* movsw/movsl/movsq */
15101         case 0xa7:      /* cmpsw/cmpsl/cmpsq */
15102         case 0xad:      /* lodsw/lodsl/lodsq */
15103           intel_operand_size (v_mode, sizeflag);
15104           break;
15105         default:
15106           intel_operand_size (b_mode, sizeflag);
15107         }
15108     }
15109   /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
15110      default segment register DS is printed.  */
15111   if (!active_seg_prefix)
15112     active_seg_prefix = PREFIX_DS;
15113   append_seg ();
15114   ptr_reg (code, sizeflag);
15115 }
15116
15117 static void
15118 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15119 {
15120   int add;
15121   if (rex & REX_R)
15122     {
15123       USED_REX (REX_R);
15124       add = 8;
15125     }
15126   else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
15127     {
15128       all_prefixes[last_lock_prefix] = 0;
15129       used_prefixes |= PREFIX_LOCK;
15130       add = 8;
15131     }
15132   else
15133     add = 0;
15134   sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
15135   oappend_maybe_intel (scratchbuf);
15136 }
15137
15138 static void
15139 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15140 {
15141   int add;
15142   USED_REX (REX_R);
15143   if (rex & REX_R)
15144     add = 8;
15145   else
15146     add = 0;
15147   if (intel_syntax)
15148     sprintf (scratchbuf, "db%d", modrm.reg + add);
15149   else
15150     sprintf (scratchbuf, "%%db%d", modrm.reg + add);
15151   oappend (scratchbuf);
15152 }
15153
15154 static void
15155 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15156 {
15157   sprintf (scratchbuf, "%%tr%d", modrm.reg);
15158   oappend_maybe_intel (scratchbuf);
15159 }
15160
15161 static void
15162 OP_R (int bytemode, int sizeflag)
15163 {
15164   /* Skip mod/rm byte.  */
15165   MODRM_CHECK;
15166   codep++;
15167   OP_E_register (bytemode, sizeflag);
15168 }
15169
15170 static void
15171 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15172 {
15173   int reg = modrm.reg;
15174   const char **names;
15175
15176   used_prefixes |= (prefixes & PREFIX_DATA);
15177   if (prefixes & PREFIX_DATA)
15178     {
15179       names = names_xmm;
15180       USED_REX (REX_R);
15181       if (rex & REX_R)
15182         reg += 8;
15183     }
15184   else
15185     names = names_mm;
15186   oappend (names[reg]);
15187 }
15188
15189 static void
15190 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15191 {
15192   int reg = modrm.reg;
15193   const char **names;
15194
15195   USED_REX (REX_R);
15196   if (rex & REX_R)
15197     reg += 8;
15198   if (vex.evex)
15199     {
15200       if (!vex.r)
15201         reg += 16;
15202     }
15203
15204   if (need_vex
15205       && bytemode != xmm_mode
15206       && bytemode != xmmq_mode
15207       && bytemode != evex_half_bcst_xmmq_mode
15208       && bytemode != ymm_mode
15209       && bytemode != scalar_mode)
15210     {
15211       switch (vex.length)
15212         {
15213         case 128:
15214           names = names_xmm;
15215           break;
15216         case 256:
15217           if (vex.w
15218               || (bytemode != vex_vsib_q_w_dq_mode
15219                   && bytemode != vex_vsib_q_w_d_mode))
15220             names = names_ymm;
15221           else
15222             names = names_xmm;
15223           break;
15224         case 512:
15225           names = names_zmm;
15226           break;
15227         default:
15228           abort ();
15229         }
15230     }
15231   else if (bytemode == xmmq_mode
15232            || bytemode == evex_half_bcst_xmmq_mode)
15233     {
15234       switch (vex.length)
15235         {
15236         case 128:
15237         case 256:
15238           names = names_xmm;
15239           break;
15240         case 512:
15241           names = names_ymm;
15242           break;
15243         default:
15244           abort ();
15245         }
15246     }
15247   else if (bytemode == ymm_mode)
15248     names = names_ymm;
15249   else
15250     names = names_xmm;
15251   oappend (names[reg]);
15252 }
15253
15254 static void
15255 OP_EM (int bytemode, int sizeflag)
15256 {
15257   int reg;
15258   const char **names;
15259
15260   if (modrm.mod != 3)
15261     {
15262       if (intel_syntax
15263           && (bytemode == v_mode || bytemode == v_swap_mode))
15264         {
15265           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15266           used_prefixes |= (prefixes & PREFIX_DATA);
15267         }
15268       OP_E (bytemode, sizeflag);
15269       return;
15270     }
15271
15272   if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
15273     swap_operand ();
15274
15275   /* Skip mod/rm byte.  */
15276   MODRM_CHECK;
15277   codep++;
15278   used_prefixes |= (prefixes & PREFIX_DATA);
15279   reg = modrm.rm;
15280   if (prefixes & PREFIX_DATA)
15281     {
15282       names = names_xmm;
15283       USED_REX (REX_B);
15284       if (rex & REX_B)
15285         reg += 8;
15286     }
15287   else
15288     names = names_mm;
15289   oappend (names[reg]);
15290 }
15291
15292 /* cvt* are the only instructions in sse2 which have
15293    both SSE and MMX operands and also have 0x66 prefix
15294    in their opcode. 0x66 was originally used to differentiate
15295    between SSE and MMX instruction(operands). So we have to handle the
15296    cvt* separately using OP_EMC and OP_MXC */
15297 static void
15298 OP_EMC (int bytemode, int sizeflag)
15299 {
15300   if (modrm.mod != 3)
15301     {
15302       if (intel_syntax && bytemode == v_mode)
15303         {
15304           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
15305           used_prefixes |= (prefixes & PREFIX_DATA);
15306         }
15307       OP_E (bytemode, sizeflag);
15308       return;
15309     }
15310
15311   /* Skip mod/rm byte.  */
15312   MODRM_CHECK;
15313   codep++;
15314   used_prefixes |= (prefixes & PREFIX_DATA);
15315   oappend (names_mm[modrm.rm]);
15316 }
15317
15318 static void
15319 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15320 {
15321   used_prefixes |= (prefixes & PREFIX_DATA);
15322   oappend (names_mm[modrm.reg]);
15323 }
15324
15325 static void
15326 OP_EX (int bytemode, int sizeflag)
15327 {
15328   int reg;
15329   const char **names;
15330
15331   /* Skip mod/rm byte.  */
15332   MODRM_CHECK;
15333   codep++;
15334
15335   if (modrm.mod != 3)
15336     {
15337       OP_E_memory (bytemode, sizeflag);
15338       return;
15339     }
15340
15341   reg = modrm.rm;
15342   USED_REX (REX_B);
15343   if (rex & REX_B)
15344     reg += 8;
15345   if (vex.evex)
15346     {
15347       USED_REX (REX_X);
15348       if ((rex & REX_X))
15349         reg += 16;
15350     }
15351
15352   if ((sizeflag & SUFFIX_ALWAYS)
15353       && (bytemode == x_swap_mode
15354           || bytemode == d_swap_mode
15355           || bytemode == d_scalar_swap_mode
15356           || bytemode == q_swap_mode
15357           || bytemode == q_scalar_swap_mode))
15358     swap_operand ();
15359
15360   if (need_vex
15361       && bytemode != xmm_mode
15362       && bytemode != xmmdw_mode
15363       && bytemode != xmmqd_mode
15364       && bytemode != xmm_mb_mode
15365       && bytemode != xmm_mw_mode
15366       && bytemode != xmm_md_mode
15367       && bytemode != xmm_mq_mode
15368       && bytemode != xmm_mdq_mode
15369       && bytemode != xmmq_mode
15370       && bytemode != evex_half_bcst_xmmq_mode
15371       && bytemode != ymm_mode
15372       && bytemode != d_scalar_mode
15373       && bytemode != d_scalar_swap_mode
15374       && bytemode != q_scalar_mode
15375       && bytemode != q_scalar_swap_mode
15376       && bytemode != vex_scalar_w_dq_mode)
15377     {
15378       switch (vex.length)
15379         {
15380         case 128:
15381           names = names_xmm;
15382           break;
15383         case 256:
15384           names = names_ymm;
15385           break;
15386         case 512:
15387           names = names_zmm;
15388           break;
15389         default:
15390           abort ();
15391         }
15392     }
15393   else if (bytemode == xmmq_mode
15394            || bytemode == evex_half_bcst_xmmq_mode)
15395     {
15396       switch (vex.length)
15397         {
15398         case 128:
15399         case 256:
15400           names = names_xmm;
15401           break;
15402         case 512:
15403           names = names_ymm;
15404           break;
15405         default:
15406           abort ();
15407         }
15408     }
15409   else if (bytemode == ymm_mode)
15410     names = names_ymm;
15411   else
15412     names = names_xmm;
15413   oappend (names[reg]);
15414 }
15415
15416 static void
15417 OP_MS (int bytemode, int sizeflag)
15418 {
15419   if (modrm.mod == 3)
15420     OP_EM (bytemode, sizeflag);
15421   else
15422     BadOp ();
15423 }
15424
15425 static void
15426 OP_XS (int bytemode, int sizeflag)
15427 {
15428   if (modrm.mod == 3)
15429     OP_EX (bytemode, sizeflag);
15430   else
15431     BadOp ();
15432 }
15433
15434 static void
15435 OP_M (int bytemode, int sizeflag)
15436 {
15437   if (modrm.mod == 3)
15438     /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
15439     BadOp ();
15440   else
15441     OP_E (bytemode, sizeflag);
15442 }
15443
15444 static void
15445 OP_0f07 (int bytemode, int sizeflag)
15446 {
15447   if (modrm.mod != 3 || modrm.rm != 0)
15448     BadOp ();
15449   else
15450     OP_E (bytemode, sizeflag);
15451 }
15452
15453 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
15454    32bit mode and "xchg %rax,%rax" in 64bit mode.  */
15455
15456 static void
15457 NOP_Fixup1 (int bytemode, int sizeflag)
15458 {
15459   if ((prefixes & PREFIX_DATA) != 0
15460       || (rex != 0
15461           && rex != 0x48
15462           && address_mode == mode_64bit))
15463     OP_REG (bytemode, sizeflag);
15464   else
15465     strcpy (obuf, "nop");
15466 }
15467
15468 static void
15469 NOP_Fixup2 (int bytemode, int sizeflag)
15470 {
15471   if ((prefixes & PREFIX_DATA) != 0
15472       || (rex != 0
15473           && rex != 0x48
15474           && address_mode == mode_64bit))
15475     OP_IMREG (bytemode, sizeflag);
15476 }
15477
15478 static const char *const Suffix3DNow[] = {
15479 /* 00 */        NULL,           NULL,           NULL,           NULL,
15480 /* 04 */        NULL,           NULL,           NULL,           NULL,
15481 /* 08 */        NULL,           NULL,           NULL,           NULL,
15482 /* 0C */        "pi2fw",        "pi2fd",        NULL,           NULL,
15483 /* 10 */        NULL,           NULL,           NULL,           NULL,
15484 /* 14 */        NULL,           NULL,           NULL,           NULL,
15485 /* 18 */        NULL,           NULL,           NULL,           NULL,
15486 /* 1C */        "pf2iw",        "pf2id",        NULL,           NULL,
15487 /* 20 */        NULL,           NULL,           NULL,           NULL,
15488 /* 24 */        NULL,           NULL,           NULL,           NULL,
15489 /* 28 */        NULL,           NULL,           NULL,           NULL,
15490 /* 2C */        NULL,           NULL,           NULL,           NULL,
15491 /* 30 */        NULL,           NULL,           NULL,           NULL,
15492 /* 34 */        NULL,           NULL,           NULL,           NULL,
15493 /* 38 */        NULL,           NULL,           NULL,           NULL,
15494 /* 3C */        NULL,           NULL,           NULL,           NULL,
15495 /* 40 */        NULL,           NULL,           NULL,           NULL,
15496 /* 44 */        NULL,           NULL,           NULL,           NULL,
15497 /* 48 */        NULL,           NULL,           NULL,           NULL,
15498 /* 4C */        NULL,           NULL,           NULL,           NULL,
15499 /* 50 */        NULL,           NULL,           NULL,           NULL,
15500 /* 54 */        NULL,           NULL,           NULL,           NULL,
15501 /* 58 */        NULL,           NULL,           NULL,           NULL,
15502 /* 5C */        NULL,           NULL,           NULL,           NULL,
15503 /* 60 */        NULL,           NULL,           NULL,           NULL,
15504 /* 64 */        NULL,           NULL,           NULL,           NULL,
15505 /* 68 */        NULL,           NULL,           NULL,           NULL,
15506 /* 6C */        NULL,           NULL,           NULL,           NULL,
15507 /* 70 */        NULL,           NULL,           NULL,           NULL,
15508 /* 74 */        NULL,           NULL,           NULL,           NULL,
15509 /* 78 */        NULL,           NULL,           NULL,           NULL,
15510 /* 7C */        NULL,           NULL,           NULL,           NULL,
15511 /* 80 */        NULL,           NULL,           NULL,           NULL,
15512 /* 84 */        NULL,           NULL,           NULL,           NULL,
15513 /* 88 */        NULL,           NULL,           "pfnacc",       NULL,
15514 /* 8C */        NULL,           NULL,           "pfpnacc",      NULL,
15515 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
15516 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
15517 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
15518 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
15519 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
15520 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
15521 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
15522 /* AC */        NULL,           NULL,           "pfacc",        NULL,
15523 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
15524 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pmulhrw",
15525 /* B8 */        NULL,           NULL,           NULL,           "pswapd",
15526 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
15527 /* C0 */        NULL,           NULL,           NULL,           NULL,
15528 /* C4 */        NULL,           NULL,           NULL,           NULL,
15529 /* C8 */        NULL,           NULL,           NULL,           NULL,
15530 /* CC */        NULL,           NULL,           NULL,           NULL,
15531 /* D0 */        NULL,           NULL,           NULL,           NULL,
15532 /* D4 */        NULL,           NULL,           NULL,           NULL,
15533 /* D8 */        NULL,           NULL,           NULL,           NULL,
15534 /* DC */        NULL,           NULL,           NULL,           NULL,
15535 /* E0 */        NULL,           NULL,           NULL,           NULL,
15536 /* E4 */        NULL,           NULL,           NULL,           NULL,
15537 /* E8 */        NULL,           NULL,           NULL,           NULL,
15538 /* EC */        NULL,           NULL,           NULL,           NULL,
15539 /* F0 */        NULL,           NULL,           NULL,           NULL,
15540 /* F4 */        NULL,           NULL,           NULL,           NULL,
15541 /* F8 */        NULL,           NULL,           NULL,           NULL,
15542 /* FC */        NULL,           NULL,           NULL,           NULL,
15543 };
15544
15545 static void
15546 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15547 {
15548   const char *mnemonic;
15549
15550   FETCH_DATA (the_info, codep + 1);
15551   /* AMD 3DNow! instructions are specified by an opcode suffix in the
15552      place where an 8-bit immediate would normally go.  ie. the last
15553      byte of the instruction.  */
15554   obufp = mnemonicendp;
15555   mnemonic = Suffix3DNow[*codep++ & 0xff];
15556   if (mnemonic)
15557     oappend (mnemonic);
15558   else
15559     {
15560       /* Since a variable sized modrm/sib chunk is between the start
15561          of the opcode (0x0f0f) and the opcode suffix, we need to do
15562          all the modrm processing first, and don't know until now that
15563          we have a bad opcode.  This necessitates some cleaning up.  */
15564       op_out[0][0] = '\0';
15565       op_out[1][0] = '\0';
15566       BadOp ();
15567     }
15568   mnemonicendp = obufp;
15569 }
15570
15571 static struct op simd_cmp_op[] =
15572 {
15573   { STRING_COMMA_LEN ("eq") },
15574   { STRING_COMMA_LEN ("lt") },
15575   { STRING_COMMA_LEN ("le") },
15576   { STRING_COMMA_LEN ("unord") },
15577   { STRING_COMMA_LEN ("neq") },
15578   { STRING_COMMA_LEN ("nlt") },
15579   { STRING_COMMA_LEN ("nle") },
15580   { STRING_COMMA_LEN ("ord") }
15581 };
15582
15583 static void
15584 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15585 {
15586   unsigned int cmp_type;
15587
15588   FETCH_DATA (the_info, codep + 1);
15589   cmp_type = *codep++ & 0xff;
15590   if (cmp_type < ARRAY_SIZE (simd_cmp_op))
15591     {
15592       char suffix [3];
15593       char *p = mnemonicendp - 2;
15594       suffix[0] = p[0];
15595       suffix[1] = p[1];
15596       suffix[2] = '\0';
15597       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
15598       mnemonicendp += simd_cmp_op[cmp_type].len;
15599     }
15600   else
15601     {
15602       /* We have a reserved extension byte.  Output it directly.  */
15603       scratchbuf[0] = '$';
15604       print_operand_value (scratchbuf + 1, 1, cmp_type);
15605       oappend_maybe_intel (scratchbuf);
15606       scratchbuf[0] = '\0';
15607     }
15608 }
15609
15610 static void
15611 OP_Mwaitx (int bytemode ATTRIBUTE_UNUSED,
15612           int sizeflag ATTRIBUTE_UNUSED)
15613 {
15614   /* mwaitx %eax,%ecx,%ebx */
15615   if (!intel_syntax)
15616     {
15617       const char **names = (address_mode == mode_64bit
15618                             ? names64 : names32);
15619       strcpy (op_out[0], names[0]);
15620       strcpy (op_out[1], names[1]);
15621       strcpy (op_out[2], names[3]);
15622       two_source_ops = 1;
15623     }
15624   /* Skip mod/rm byte.  */
15625   MODRM_CHECK;
15626   codep++;
15627 }
15628
15629 static void
15630 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
15631           int sizeflag ATTRIBUTE_UNUSED)
15632 {
15633   /* mwait %eax,%ecx  */
15634   if (!intel_syntax)
15635     {
15636       const char **names = (address_mode == mode_64bit
15637                             ? names64 : names32);
15638       strcpy (op_out[0], names[0]);
15639       strcpy (op_out[1], names[1]);
15640       two_source_ops = 1;
15641     }
15642   /* Skip mod/rm byte.  */
15643   MODRM_CHECK;
15644   codep++;
15645 }
15646
15647 static void
15648 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
15649             int sizeflag ATTRIBUTE_UNUSED)
15650 {
15651   /* monitor %eax,%ecx,%edx"  */
15652   if (!intel_syntax)
15653     {
15654       const char **op1_names;
15655       const char **names = (address_mode == mode_64bit
15656                             ? names64 : names32);
15657
15658       if (!(prefixes & PREFIX_ADDR))
15659         op1_names = (address_mode == mode_16bit
15660                      ? names16 : names);
15661       else
15662         {
15663           /* Remove "addr16/addr32".  */
15664           all_prefixes[last_addr_prefix] = 0;
15665           op1_names = (address_mode != mode_32bit
15666                        ? names32 : names16);
15667           used_prefixes |= PREFIX_ADDR;
15668         }
15669       strcpy (op_out[0], op1_names[0]);
15670       strcpy (op_out[1], names[1]);
15671       strcpy (op_out[2], names[2]);
15672       two_source_ops = 1;
15673     }
15674   /* Skip mod/rm byte.  */
15675   MODRM_CHECK;
15676   codep++;
15677 }
15678
15679 static void
15680 BadOp (void)
15681 {
15682   /* Throw away prefixes and 1st. opcode byte.  */
15683   codep = insn_codep + 1;
15684   oappend ("(bad)");
15685 }
15686
15687 static void
15688 REP_Fixup (int bytemode, int sizeflag)
15689 {
15690   /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
15691      lods and stos.  */
15692   if (prefixes & PREFIX_REPZ)
15693     all_prefixes[last_repz_prefix] = REP_PREFIX;
15694
15695   switch (bytemode)
15696     {
15697     case al_reg:
15698     case eAX_reg:
15699     case indir_dx_reg:
15700       OP_IMREG (bytemode, sizeflag);
15701       break;
15702     case eDI_reg:
15703       OP_ESreg (bytemode, sizeflag);
15704       break;
15705     case eSI_reg:
15706       OP_DSreg (bytemode, sizeflag);
15707       break;
15708     default:
15709       abort ();
15710       break;
15711     }
15712 }
15713
15714 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
15715    "bnd".  */
15716
15717 static void
15718 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
15719 {
15720   if (prefixes & PREFIX_REPNZ)
15721     all_prefixes[last_repnz_prefix] = BND_PREFIX;
15722 }
15723
15724 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
15725    "notrack".  */
15726
15727 static void
15728 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
15729                int sizeflag ATTRIBUTE_UNUSED)
15730 {
15731   if (active_seg_prefix == PREFIX_DS
15732       && (address_mode != mode_64bit || last_data_prefix < 0))
15733     {
15734       /* NOTRACK prefix is only valid on indirect branch instructions.
15735          NB: DATA prefix is unsupported for Intel64.  */
15736       active_seg_prefix = 0;
15737       all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
15738     }
15739 }
15740
15741 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15742    "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
15743  */
15744
15745 static void
15746 HLE_Fixup1 (int bytemode, int sizeflag)
15747 {
15748   if (modrm.mod != 3
15749       && (prefixes & PREFIX_LOCK) != 0)
15750     {
15751       if (prefixes & PREFIX_REPZ)
15752         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15753       if (prefixes & PREFIX_REPNZ)
15754         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15755     }
15756
15757   OP_E (bytemode, sizeflag);
15758 }
15759
15760 /* Similar to OP_E.  But the 0xf2/0xf3 prefixes should be displayed as
15761    "xacquire"/"xrelease" for memory operand.  No check for LOCK prefix.
15762  */
15763
15764 static void
15765 HLE_Fixup2 (int bytemode, int sizeflag)
15766 {
15767   if (modrm.mod != 3)
15768     {
15769       if (prefixes & PREFIX_REPZ)
15770         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15771       if (prefixes & PREFIX_REPNZ)
15772         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15773     }
15774
15775   OP_E (bytemode, sizeflag);
15776 }
15777
15778 /* Similar to OP_E.  But the 0xf3 prefixes should be displayed as
15779    "xrelease" for memory operand.  No check for LOCK prefix.   */
15780
15781 static void
15782 HLE_Fixup3 (int bytemode, int sizeflag)
15783 {
15784   if (modrm.mod != 3
15785       && last_repz_prefix > last_repnz_prefix
15786       && (prefixes & PREFIX_REPZ) != 0)
15787     all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15788
15789   OP_E (bytemode, sizeflag);
15790 }
15791
15792 static void
15793 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
15794 {
15795   USED_REX (REX_W);
15796   if (rex & REX_W)
15797     {
15798       /* Change cmpxchg8b to cmpxchg16b.  */
15799       char *p = mnemonicendp - 2;
15800       mnemonicendp = stpcpy (p, "16b");
15801       bytemode = o_mode;
15802     }
15803   else if ((prefixes & PREFIX_LOCK) != 0)
15804     {
15805       if (prefixes & PREFIX_REPZ)
15806         all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
15807       if (prefixes & PREFIX_REPNZ)
15808         all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
15809     }
15810
15811   OP_M (bytemode, sizeflag);
15812 }
15813
15814 static void
15815 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
15816 {
15817   const char **names;
15818
15819   if (need_vex)
15820     {
15821       switch (vex.length)
15822         {
15823         case 128:
15824           names = names_xmm;
15825           break;
15826         case 256:
15827           names = names_ymm;
15828           break;
15829         default:
15830           abort ();
15831         }
15832     }
15833   else
15834     names = names_xmm;
15835   oappend (names[reg]);
15836 }
15837
15838 static void
15839 CRC32_Fixup (int bytemode, int sizeflag)
15840 {
15841   /* Add proper suffix to "crc32".  */
15842   char *p = mnemonicendp;
15843
15844   switch (bytemode)
15845     {
15846     case b_mode:
15847       if (intel_syntax)
15848         goto skip;
15849
15850       *p++ = 'b';
15851       break;
15852     case v_mode:
15853       if (intel_syntax)
15854         goto skip;
15855
15856       USED_REX (REX_W);
15857       if (rex & REX_W)
15858         *p++ = 'q';
15859       else
15860         {
15861           if (sizeflag & DFLAG)
15862             *p++ = 'l';
15863           else
15864             *p++ = 'w';
15865           used_prefixes |= (prefixes & PREFIX_DATA);
15866         }
15867       break;
15868     default:
15869       oappend (INTERNAL_DISASSEMBLER_ERROR);
15870       break;
15871     }
15872   mnemonicendp = p;
15873   *p = '\0';
15874
15875 skip:
15876   if (modrm.mod == 3)
15877     {
15878       int add;
15879
15880       /* Skip mod/rm byte.  */
15881       MODRM_CHECK;
15882       codep++;
15883
15884       USED_REX (REX_B);
15885       add = (rex & REX_B) ? 8 : 0;
15886       if (bytemode == b_mode)
15887         {
15888           USED_REX (0);
15889           if (rex)
15890             oappend (names8rex[modrm.rm + add]);
15891           else
15892             oappend (names8[modrm.rm + add]);
15893         }
15894       else
15895         {
15896           USED_REX (REX_W);
15897           if (rex & REX_W)
15898             oappend (names64[modrm.rm + add]);
15899           else if ((prefixes & PREFIX_DATA))
15900             oappend (names16[modrm.rm + add]);
15901           else
15902             oappend (names32[modrm.rm + add]);
15903         }
15904     }
15905   else
15906     OP_E (bytemode, sizeflag);
15907 }
15908
15909 static void
15910 FXSAVE_Fixup (int bytemode, int sizeflag)
15911 {
15912   /* Add proper suffix to "fxsave" and "fxrstor".  */
15913   USED_REX (REX_W);
15914   if (rex & REX_W)
15915     {
15916       char *p = mnemonicendp;
15917       *p++ = '6';
15918       *p++ = '4';
15919       *p = '\0';
15920       mnemonicendp = p;
15921     }
15922   OP_M (bytemode, sizeflag);
15923 }
15924
15925 static void
15926 PCMPESTR_Fixup (int bytemode, int sizeflag)
15927 {
15928   /* Add proper suffix to "{,v}pcmpestr{i,m}".  */
15929   if (!intel_syntax)
15930     {
15931       char *p = mnemonicendp;
15932
15933       USED_REX (REX_W);
15934       if (rex & REX_W)
15935         *p++ = 'q';
15936       else if (sizeflag & SUFFIX_ALWAYS)
15937         *p++ = 'l';
15938
15939       *p = '\0';
15940       mnemonicendp = p;
15941     }
15942
15943   OP_EX (bytemode, sizeflag);
15944 }
15945
15946 /* Display the destination register operand for instructions with
15947    VEX. */
15948
15949 static void
15950 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
15951 {
15952   int reg;
15953   const char **names;
15954
15955   if (!need_vex)
15956     abort ();
15957
15958   if (!need_vex_reg)
15959     return;
15960
15961   reg = vex.register_specifier;
15962   vex.register_specifier = 0;
15963   if (address_mode != mode_64bit)
15964     reg &= 7;
15965   else if (vex.evex && !vex.v)
15966     reg += 16;
15967
15968   if (bytemode == vex_scalar_mode)
15969     {
15970       oappend (names_xmm[reg]);
15971       return;
15972     }
15973
15974   switch (vex.length)
15975     {
15976     case 128:
15977       switch (bytemode)
15978         {
15979         case vex_mode:
15980         case vex128_mode:
15981         case vex_vsib_q_w_dq_mode:
15982         case vex_vsib_q_w_d_mode:
15983           names = names_xmm;
15984           break;
15985         case dq_mode:
15986           if (rex & REX_W)
15987             names = names64;
15988           else
15989             names = names32;
15990           break;
15991         case mask_bd_mode:
15992         case mask_mode:
15993           if (reg > 0x7)
15994             {
15995               oappend ("(bad)");
15996               return;
15997             }
15998           names = names_mask;
15999           break;
16000         default:
16001           abort ();
16002           return;
16003         }
16004       break;
16005     case 256:
16006       switch (bytemode)
16007         {
16008         case vex_mode:
16009         case vex256_mode:
16010           names = names_ymm;
16011           break;
16012         case vex_vsib_q_w_dq_mode:
16013         case vex_vsib_q_w_d_mode:
16014           names = vex.w ? names_ymm : names_xmm;
16015           break;
16016         case mask_bd_mode:
16017         case mask_mode:
16018           if (reg > 0x7)
16019             {
16020               oappend ("(bad)");
16021               return;
16022             }
16023           names = names_mask;
16024           break;
16025         default:
16026           /* See PR binutils/20893 for a reproducer.  */
16027           oappend ("(bad)");
16028           return;
16029         }
16030       break;
16031     case 512:
16032       names = names_zmm;
16033       break;
16034     default:
16035       abort ();
16036       break;
16037     }
16038   oappend (names[reg]);
16039 }
16040
16041 /* Get the VEX immediate byte without moving codep.  */
16042
16043 static unsigned char
16044 get_vex_imm8 (int sizeflag, int opnum)
16045 {
16046   int bytes_before_imm = 0;
16047
16048   if (modrm.mod != 3)
16049     {
16050       /* There are SIB/displacement bytes.  */
16051       if ((sizeflag & AFLAG) || address_mode == mode_64bit)
16052         {
16053           /* 32/64 bit address mode */
16054           int base = modrm.rm;
16055
16056           /* Check SIB byte.  */
16057           if (base == 4)
16058             {
16059               FETCH_DATA (the_info, codep + 1);
16060               base = *codep & 7;
16061               /* When decoding the third source, don't increase
16062                  bytes_before_imm as this has already been incremented
16063                  by one in OP_E_memory while decoding the second
16064                  source operand.  */
16065               if (opnum == 0)
16066                 bytes_before_imm++;
16067             }
16068
16069           /* Don't increase bytes_before_imm when decoding the third source,
16070              it has already been incremented by OP_E_memory while decoding
16071              the second source operand.  */
16072           if (opnum == 0)
16073             {
16074               switch (modrm.mod)
16075                 {
16076                   case 0:
16077                     /* When modrm.rm == 5 or modrm.rm == 4 and base in
16078                        SIB == 5, there is a 4 byte displacement.  */
16079                     if (base != 5)
16080                       /* No displacement. */
16081                       break;
16082                     /* Fall through.  */
16083                   case 2:
16084                     /* 4 byte displacement.  */
16085                     bytes_before_imm += 4;
16086                     break;
16087                   case 1:
16088                     /* 1 byte displacement.  */
16089                     bytes_before_imm++;
16090                     break;
16091                 }
16092             }
16093         }
16094       else
16095         {
16096           /* 16 bit address mode */
16097           /* Don't increase bytes_before_imm when decoding the third source,
16098              it has already been incremented by OP_E_memory while decoding
16099              the second source operand.  */
16100           if (opnum == 0)
16101             {
16102               switch (modrm.mod)
16103                 {
16104                 case 0:
16105                   /* When modrm.rm == 6, there is a 2 byte displacement.  */
16106                   if (modrm.rm != 6)
16107                     /* No displacement. */
16108                     break;
16109                   /* Fall through.  */
16110                 case 2:
16111                   /* 2 byte displacement.  */
16112                   bytes_before_imm += 2;
16113                   break;
16114                 case 1:
16115                   /* 1 byte displacement: when decoding the third source,
16116                      don't increase bytes_before_imm as this has already
16117                      been incremented by one in OP_E_memory while decoding
16118                      the second source operand.  */
16119                   if (opnum == 0)
16120                     bytes_before_imm++;
16121
16122                   break;
16123                 }
16124             }
16125         }
16126     }
16127
16128   FETCH_DATA (the_info, codep + bytes_before_imm + 1);
16129   return codep [bytes_before_imm];
16130 }
16131
16132 static void
16133 OP_EX_VexReg (int bytemode, int sizeflag, int reg)
16134 {
16135   const char **names;
16136
16137   if (reg == -1 && modrm.mod != 3)
16138     {
16139       OP_E_memory (bytemode, sizeflag);
16140       return;
16141     }
16142   else
16143     {
16144       if (reg == -1)
16145         {
16146           reg = modrm.rm;
16147           USED_REX (REX_B);
16148           if (rex & REX_B)
16149             reg += 8;
16150         }
16151       if (address_mode != mode_64bit)
16152         reg &= 7;
16153     }
16154
16155   switch (vex.length)
16156     {
16157     case 128:
16158       names = names_xmm;
16159       break;
16160     case 256:
16161       names = names_ymm;
16162       break;
16163     default:
16164       abort ();
16165     }
16166   oappend (names[reg]);
16167 }
16168
16169 static void
16170 OP_EX_VexImmW (int bytemode, int sizeflag)
16171 {
16172   int reg = -1;
16173   static unsigned char vex_imm8;
16174
16175   if (vex_w_done == 0)
16176     {
16177       vex_w_done = 1;
16178
16179       /* Skip mod/rm byte.  */
16180       MODRM_CHECK;
16181       codep++;
16182
16183       vex_imm8 = get_vex_imm8 (sizeflag, 0);
16184
16185       if (vex.w)
16186           reg = vex_imm8 >> 4;
16187
16188       OP_EX_VexReg (bytemode, sizeflag, reg);
16189     }
16190   else if (vex_w_done == 1)
16191     {
16192       vex_w_done = 2;
16193
16194       if (!vex.w)
16195           reg = vex_imm8 >> 4;
16196
16197       OP_EX_VexReg (bytemode, sizeflag, reg);
16198     }
16199   else
16200     {
16201       /* Output the imm8 directly.  */
16202       scratchbuf[0] = '$';
16203       print_operand_value (scratchbuf + 1, 1, vex_imm8 & 0xf);
16204       oappend_maybe_intel (scratchbuf);
16205       scratchbuf[0] = '\0';
16206       codep++;
16207     }
16208 }
16209
16210 static void
16211 OP_Vex_2src (int bytemode, int sizeflag)
16212 {
16213   if (modrm.mod == 3)
16214     {
16215       int reg = modrm.rm;
16216       USED_REX (REX_B);
16217       if (rex & REX_B)
16218         reg += 8;
16219       oappend (names_xmm[reg]);
16220     }
16221   else
16222     {
16223       if (intel_syntax
16224           && (bytemode == v_mode || bytemode == v_swap_mode))
16225         {
16226           bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
16227           used_prefixes |= (prefixes & PREFIX_DATA);
16228         }
16229       OP_E (bytemode, sizeflag);
16230     }
16231 }
16232
16233 static void
16234 OP_Vex_2src_1 (int bytemode, int sizeflag)
16235 {
16236   if (modrm.mod == 3)
16237     {
16238       /* Skip mod/rm byte.   */
16239       MODRM_CHECK;
16240       codep++;
16241     }
16242
16243   if (vex.w)
16244     {
16245       unsigned int reg = vex.register_specifier;
16246       vex.register_specifier = 0;
16247
16248       if (address_mode != mode_64bit)
16249         reg &= 7;
16250       oappend (names_xmm[reg]);
16251     }
16252   else
16253     OP_Vex_2src (bytemode, sizeflag);
16254 }
16255
16256 static void
16257 OP_Vex_2src_2 (int bytemode, int sizeflag)
16258 {
16259   if (vex.w)
16260     OP_Vex_2src (bytemode, sizeflag);
16261   else
16262     {
16263       unsigned int reg = vex.register_specifier;
16264       vex.register_specifier = 0;
16265
16266       if (address_mode != mode_64bit)
16267         reg &= 7;
16268       oappend (names_xmm[reg]);
16269     }
16270 }
16271
16272 static void
16273 OP_EX_VexW (int bytemode, int sizeflag)
16274 {
16275   int reg = -1;
16276
16277   if (!vex_w_done)
16278     {
16279       /* Skip mod/rm byte.  */
16280       MODRM_CHECK;
16281       codep++;
16282
16283       if (vex.w)
16284         reg = get_vex_imm8 (sizeflag, 0) >> 4;
16285     }
16286   else
16287     {
16288       if (!vex.w)
16289         reg = get_vex_imm8 (sizeflag, 1) >> 4;
16290     }
16291
16292   OP_EX_VexReg (bytemode, sizeflag, reg);
16293
16294   if (vex_w_done)
16295     codep++;
16296   vex_w_done = 1;
16297 }
16298
16299 static void
16300 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16301 {
16302   int reg;
16303   const char **names;
16304
16305   FETCH_DATA (the_info, codep + 1);
16306   reg = *codep++;
16307
16308   if (bytemode != x_mode)
16309     abort ();
16310
16311   reg >>= 4;
16312   if (address_mode != mode_64bit)
16313     reg &= 7;
16314
16315   switch (vex.length)
16316     {
16317     case 128:
16318       names = names_xmm;
16319       break;
16320     case 256:
16321       names = names_ymm;
16322       break;
16323     default:
16324       abort ();
16325     }
16326   oappend (names[reg]);
16327 }
16328
16329 static void
16330 OP_XMM_VexW (int bytemode, int sizeflag)
16331 {
16332   /* Turn off the REX.W bit since it is used for swapping operands
16333      now.  */
16334   rex &= ~REX_W;
16335   OP_XMM (bytemode, sizeflag);
16336 }
16337
16338 static void
16339 OP_EX_Vex (int bytemode, int sizeflag)
16340 {
16341   if (modrm.mod != 3)
16342     need_vex_reg = 0;
16343   OP_EX (bytemode, sizeflag);
16344 }
16345
16346 static void
16347 OP_XMM_Vex (int bytemode, int sizeflag)
16348 {
16349   if (modrm.mod != 3)
16350     need_vex_reg = 0;
16351   OP_XMM (bytemode, sizeflag);
16352 }
16353
16354 static struct op vex_cmp_op[] =
16355 {
16356   { STRING_COMMA_LEN ("eq") },
16357   { STRING_COMMA_LEN ("lt") },
16358   { STRING_COMMA_LEN ("le") },
16359   { STRING_COMMA_LEN ("unord") },
16360   { STRING_COMMA_LEN ("neq") },
16361   { STRING_COMMA_LEN ("nlt") },
16362   { STRING_COMMA_LEN ("nle") },
16363   { STRING_COMMA_LEN ("ord") },
16364   { STRING_COMMA_LEN ("eq_uq") },
16365   { STRING_COMMA_LEN ("nge") },
16366   { STRING_COMMA_LEN ("ngt") },
16367   { STRING_COMMA_LEN ("false") },
16368   { STRING_COMMA_LEN ("neq_oq") },
16369   { STRING_COMMA_LEN ("ge") },
16370   { STRING_COMMA_LEN ("gt") },
16371   { STRING_COMMA_LEN ("true") },
16372   { STRING_COMMA_LEN ("eq_os") },
16373   { STRING_COMMA_LEN ("lt_oq") },
16374   { STRING_COMMA_LEN ("le_oq") },
16375   { STRING_COMMA_LEN ("unord_s") },
16376   { STRING_COMMA_LEN ("neq_us") },
16377   { STRING_COMMA_LEN ("nlt_uq") },
16378   { STRING_COMMA_LEN ("nle_uq") },
16379   { STRING_COMMA_LEN ("ord_s") },
16380   { STRING_COMMA_LEN ("eq_us") },
16381   { STRING_COMMA_LEN ("nge_uq") },
16382   { STRING_COMMA_LEN ("ngt_uq") },
16383   { STRING_COMMA_LEN ("false_os") },
16384   { STRING_COMMA_LEN ("neq_os") },
16385   { STRING_COMMA_LEN ("ge_oq") },
16386   { STRING_COMMA_LEN ("gt_oq") },
16387   { STRING_COMMA_LEN ("true_us") },
16388 };
16389
16390 static void
16391 VCMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16392 {
16393   unsigned int cmp_type;
16394
16395   FETCH_DATA (the_info, codep + 1);
16396   cmp_type = *codep++ & 0xff;
16397   if (cmp_type < ARRAY_SIZE (vex_cmp_op))
16398     {
16399       char suffix [3];
16400       char *p = mnemonicendp - 2;
16401       suffix[0] = p[0];
16402       suffix[1] = p[1];
16403       suffix[2] = '\0';
16404       sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
16405       mnemonicendp += vex_cmp_op[cmp_type].len;
16406     }
16407   else
16408     {
16409       /* We have a reserved extension byte.  Output it directly.  */
16410       scratchbuf[0] = '$';
16411       print_operand_value (scratchbuf + 1, 1, cmp_type);
16412       oappend_maybe_intel (scratchbuf);
16413       scratchbuf[0] = '\0';
16414     }
16415 }
16416
16417 static void
16418 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
16419              int sizeflag ATTRIBUTE_UNUSED)
16420 {
16421   unsigned int cmp_type;
16422
16423   if (!vex.evex)
16424     abort ();
16425
16426   FETCH_DATA (the_info, codep + 1);
16427   cmp_type = *codep++ & 0xff;
16428   /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
16429      If it's the case, print suffix, otherwise - print the immediate.  */
16430   if (cmp_type < ARRAY_SIZE (simd_cmp_op)
16431       && cmp_type != 3
16432       && cmp_type != 7)
16433     {
16434       char suffix [3];
16435       char *p = mnemonicendp - 2;
16436
16437       /* vpcmp* can have both one- and two-lettered suffix.  */
16438       if (p[0] == 'p')
16439         {
16440           p++;
16441           suffix[0] = p[0];
16442           suffix[1] = '\0';
16443         }
16444       else
16445         {
16446           suffix[0] = p[0];
16447           suffix[1] = p[1];
16448           suffix[2] = '\0';
16449         }
16450
16451       sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
16452       mnemonicendp += simd_cmp_op[cmp_type].len;
16453     }
16454   else
16455     {
16456       /* We have a reserved extension byte.  Output it directly.  */
16457       scratchbuf[0] = '$';
16458       print_operand_value (scratchbuf + 1, 1, cmp_type);
16459       oappend_maybe_intel (scratchbuf);
16460       scratchbuf[0] = '\0';
16461     }
16462 }
16463
16464 static const struct op xop_cmp_op[] =
16465 {
16466   { STRING_COMMA_LEN ("lt") },
16467   { STRING_COMMA_LEN ("le") },
16468   { STRING_COMMA_LEN ("gt") },
16469   { STRING_COMMA_LEN ("ge") },
16470   { STRING_COMMA_LEN ("eq") },
16471   { STRING_COMMA_LEN ("neq") },
16472   { STRING_COMMA_LEN ("false") },
16473   { STRING_COMMA_LEN ("true") }
16474 };
16475
16476 static void
16477 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
16478              int sizeflag ATTRIBUTE_UNUSED)
16479 {
16480   unsigned int cmp_type;
16481
16482   FETCH_DATA (the_info, codep + 1);
16483   cmp_type = *codep++ & 0xff;
16484   if (cmp_type < ARRAY_SIZE (xop_cmp_op))
16485     {
16486       char suffix[3];
16487       char *p = mnemonicendp - 2;
16488
16489       /* vpcom* can have both one- and two-lettered suffix.  */
16490       if (p[0] == 'm')
16491         {
16492           p++;
16493           suffix[0] = p[0];
16494           suffix[1] = '\0';
16495         }
16496       else
16497         {
16498           suffix[0] = p[0];
16499           suffix[1] = p[1];
16500           suffix[2] = '\0';
16501         }
16502
16503       sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
16504       mnemonicendp += xop_cmp_op[cmp_type].len;
16505     }
16506   else
16507     {
16508       /* We have a reserved extension byte.  Output it directly.  */
16509       scratchbuf[0] = '$';
16510       print_operand_value (scratchbuf + 1, 1, cmp_type);
16511       oappend_maybe_intel (scratchbuf);
16512       scratchbuf[0] = '\0';
16513     }
16514 }
16515
16516 static const struct op pclmul_op[] =
16517 {
16518   { STRING_COMMA_LEN ("lql") },
16519   { STRING_COMMA_LEN ("hql") },
16520   { STRING_COMMA_LEN ("lqh") },
16521   { STRING_COMMA_LEN ("hqh") }
16522 };
16523
16524 static void
16525 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
16526               int sizeflag ATTRIBUTE_UNUSED)
16527 {
16528   unsigned int pclmul_type;
16529
16530   FETCH_DATA (the_info, codep + 1);
16531   pclmul_type = *codep++ & 0xff;
16532   switch (pclmul_type)
16533     {
16534     case 0x10:
16535       pclmul_type = 2;
16536       break;
16537     case 0x11:
16538       pclmul_type = 3;
16539       break;
16540     default:
16541       break;
16542     }
16543   if (pclmul_type < ARRAY_SIZE (pclmul_op))
16544     {
16545       char suffix [4];
16546       char *p = mnemonicendp - 3;
16547       suffix[0] = p[0];
16548       suffix[1] = p[1];
16549       suffix[2] = p[2];
16550       suffix[3] = '\0';
16551       sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
16552       mnemonicendp += pclmul_op[pclmul_type].len;
16553     }
16554   else
16555     {
16556       /* We have a reserved extension byte.  Output it directly.  */
16557       scratchbuf[0] = '$';
16558       print_operand_value (scratchbuf + 1, 1, pclmul_type);
16559       oappend_maybe_intel (scratchbuf);
16560       scratchbuf[0] = '\0';
16561     }
16562 }
16563
16564 static void
16565 MOVBE_Fixup (int bytemode, int sizeflag)
16566 {
16567   /* Add proper suffix to "movbe".  */
16568   char *p = mnemonicendp;
16569
16570   switch (bytemode)
16571     {
16572     case v_mode:
16573       if (intel_syntax)
16574         goto skip;
16575
16576       USED_REX (REX_W);
16577       if (sizeflag & SUFFIX_ALWAYS)
16578         {
16579           if (rex & REX_W)
16580             *p++ = 'q';
16581           else
16582             {
16583               if (sizeflag & DFLAG)
16584                 *p++ = 'l';
16585               else
16586                 *p++ = 'w';
16587               used_prefixes |= (prefixes & PREFIX_DATA);
16588             }
16589         }
16590       break;
16591     default:
16592       oappend (INTERNAL_DISASSEMBLER_ERROR);
16593       break;
16594     }
16595   mnemonicendp = p;
16596   *p = '\0';
16597
16598 skip:
16599   OP_M (bytemode, sizeflag);
16600 }
16601
16602 static void
16603 OP_LWPCB_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16604 {
16605   int reg;
16606   const char **names;
16607
16608   /* Skip mod/rm byte.  */
16609   MODRM_CHECK;
16610   codep++;
16611
16612   if (rex & REX_W)
16613     names = names64;
16614   else
16615     names = names32;
16616
16617   reg = modrm.rm;
16618   USED_REX (REX_B);
16619   if (rex & REX_B)
16620     reg += 8;
16621
16622   oappend (names[reg]);
16623 }
16624
16625 static void
16626 OP_LWP_E (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
16627 {
16628   const char **names;
16629   unsigned int reg = vex.register_specifier;
16630   vex.register_specifier = 0;
16631
16632   if (rex & REX_W)
16633     names = names64;
16634   else
16635     names = names32;
16636
16637   if (address_mode != mode_64bit)
16638     reg &= 7;
16639   oappend (names[reg]);
16640 }
16641
16642 static void
16643 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16644 {
16645   if (!vex.evex
16646       || (bytemode != mask_mode && bytemode != mask_bd_mode))
16647     abort ();
16648
16649   USED_REX (REX_R);
16650   if ((rex & REX_R) != 0 || !vex.r)
16651     {
16652       BadOp ();
16653       return;
16654     }
16655
16656   oappend (names_mask [modrm.reg]);
16657 }
16658
16659 static void
16660 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
16661 {
16662   if (!vex.evex
16663       || (bytemode != evex_rounding_mode
16664           && bytemode != evex_rounding_64_mode
16665           && bytemode != evex_sae_mode))
16666     abort ();
16667   if (modrm.mod == 3 && vex.b)
16668     switch (bytemode)
16669       {
16670       case evex_rounding_64_mode:
16671         if (address_mode != mode_64bit)
16672           {
16673             oappend ("(bad)");
16674             break;
16675           }
16676         /* Fall through.  */
16677       case evex_rounding_mode:
16678         oappend (names_rounding[vex.ll]);
16679         break;
16680       case evex_sae_mode:
16681         oappend ("{sae}");
16682         break;
16683       default:
16684         break;
16685       }
16686 }